diff --git a/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs b/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs index 105a8f9720..4ba60e9c3d 100644 --- a/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs +++ b/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs @@ -11,6 +11,7 @@ using Content.Shared.Ensnaring.Components; using Content.Shared.IdentityManagement; using Content.Shared.StepTrigger.Systems; using Content.Shared.Throwing; +using Content.Shared.Popups; namespace Content.Server.Ensnaring; @@ -151,9 +152,11 @@ public sealed partial class EnsnareableSystem Dirty(component.Ensnared.Value, ensnareable); component.Ensnared = null; + _popup.PopupEntity(Loc.GetString("ensnare-component-try-free-complete", ("ensnare", ensnare)), target, target, PopupType.Medium); // WD + UpdateAlert(target, ensnareable); var ev = new EnsnareRemoveEvent(component.WalkSpeed, component.SprintSpeed); - RaiseLocalEvent(ensnare, ev); + RaiseLocalEvent(target, ev); // WD fix from ensnare to target } /// diff --git a/Content.Server/Implants/SubdermalImplantSystem.cs b/Content.Server/Implants/SubdermalImplantSystem.cs index 92c5818030..28e2663e35 100644 --- a/Content.Server/Implants/SubdermalImplantSystem.cs +++ b/Content.Server/Implants/SubdermalImplantSystem.cs @@ -26,6 +26,9 @@ using Robust.Shared.Collections; using Robust.Shared.Enums; using Robust.Shared.GameObjects.Components.Localization; using Robust.Shared.Map.Components; +using Content.Server.Ensnaring; +using Content.Shared.Ensnaring.Components; +using System.Linq; using GrammarSystem = Content.Shared._Amour.GrammarSystem.GrammarSystem; namespace Content.Server.Implants; @@ -45,7 +48,8 @@ public sealed class SubdermalImplantSystem : SharedSubdermalImplantSystem [Dependency] private readonly EntityLookupSystem _lookupSystem = default!; [Dependency] private readonly SharedMapSystem _mapSystem = default!; [Dependency] private readonly IdentitySystem _identity = default!; // WD - [Dependency] private readonly GrammarSystem _grammar = default!; //Amour + [Dependency] private readonly EnsnareableSystem _ensnareable = default!; // WD + [Dependency] private readonly GrammarSystem _grammar = default!; // Amour private EntityQuery _physicsQuery; private HashSet> _targetGrids = []; @@ -90,11 +94,26 @@ public sealed class SubdermalImplantSystem : SharedSubdermalImplantSystem private void OnFreedomImplant(EntityUid uid, SubdermalImplantComponent component, UseFreedomImplantEvent args) { - if (!TryComp(component.ImplantedEntity, out var cuffs) || cuffs.Container.ContainedEntities.Count < 1) - return; + // WD EDIT START + var ensnareCheck = TryComp(component.ImplantedEntity, out var ensnareable) && ensnareable.Container.ContainedEntities.Count > 0; + if (ensnareCheck && ensnareable != null) + { + var ensnaringUid = ensnareable.Container.ContainedEntities.First(); + if (TryComp(ensnaringUid, out var ensnaringComp)) + _ensnareable.ForceFree(ensnaringUid, ensnaringComp); + } - _cuffable.Uncuff(component.ImplantedEntity.Value, cuffs.LastAddedCuffs, cuffs.LastAddedCuffs); - args.Handled = true; + var cuffCheck = TryComp(component.ImplantedEntity, out var cuffs) && cuffs.Container.ContainedEntities.Count > 0; + if (cuffCheck && cuffs != null && component.ImplantedEntity != null) + { + _cuffable.Uncuff(component.ImplantedEntity.Value, cuffs.LastAddedCuffs, cuffs.LastAddedCuffs); + } + + if (ensnareCheck || cuffCheck) + { + args.Handled = true; + } + // WD EDIT END } private void OnActivateImplantEvent(EntityUid uid, SubdermalImplantComponent component, ActivateImplantEvent args) @@ -230,7 +249,7 @@ public sealed class SubdermalImplantSystem : SharedSubdermalImplantSystem QueueDel(uid); } - //Amour Start + // Amour Start private void OnGenderSwapImplant(EntityUid uid, SubdermalImplantComponent component, UseGenderSwapImplantEvent args) { if (component.ImplantedEntity is not { } ent) @@ -266,5 +285,5 @@ public sealed class SubdermalImplantSystem : SharedSubdermalImplantSystem args.Handled = true; QueueDel(uid); } - //Amour End + // Amour End } diff --git a/Content.Shared/_White/Implants/NeuroControl/NeuroStabilizationSystem.cs b/Content.Shared/_White/Implants/NeuroControl/NeuroStabilizationSystem.cs index 411a82ab3f..51f3e23318 100644 --- a/Content.Shared/_White/Implants/NeuroControl/NeuroStabilizationSystem.cs +++ b/Content.Shared/_White/Implants/NeuroControl/NeuroStabilizationSystem.cs @@ -18,7 +18,7 @@ public sealed class NeuroStabilizationSystem : EntitySystem private void BeforeStaminaDamage(Entity ent, ref BeforeStaminaDamageEvent args) { args.Cancelled = true; - Electrocute(ent, (int) MathF.Round(args.Value * 2f / 3f)); + Electrocute(ent, (int) MathF.Round(args.Value * 2f / 4f)); } public void Electrocute(EntityUid uid, int damage, StatusEffectsComponent? status = null) diff --git a/Content.Shared/_White/Item/DelayedKnockdown/DelayedKnockdownOnHitSystem.cs b/Content.Shared/_White/Item/DelayedKnockdown/DelayedKnockdownOnHitSystem.cs index aeab3a49f4..bf6f1cdbb7 100644 --- a/Content.Shared/_White/Item/DelayedKnockdown/DelayedKnockdownOnHitSystem.cs +++ b/Content.Shared/_White/Item/DelayedKnockdown/DelayedKnockdownOnHitSystem.cs @@ -4,6 +4,8 @@ using Content.Shared.Speech.EntitySystems; using Content.Shared.Standing; using Content.Shared.StatusEffect; using Content.Shared.Stunnable; +using Content.Shared._White.Implants.NeuroControl; +using Content.Shared.Electrocution; using Robust.Shared.Timing; namespace Content.Shared._White.Item.DelayedKnockdown; @@ -14,6 +16,7 @@ public sealed class DelayedKnockdownOnHitSystem : EntitySystem [Dependency] private readonly SharedJitteringSystem _jitter = default!; [Dependency] private readonly SharedStutteringSystem _stutter = default!; [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly SharedElectrocutionSystem _electrocution = default!; public override void Initialize() { @@ -36,6 +39,12 @@ public sealed class DelayedKnockdownOnHitSystem : EntitySystem if (!TryComp(uid, out StandingStateComponent? standingState) || !standingState.CanLieDown) continue; + if (HasComp(uid)) + { + _electrocution.TryDoElectrocution(uid, null, 5, TimeSpan.FromSeconds(1), false, 0.5f, null, true); + continue; + } + if (jitterTime > TimeSpan.Zero) _jitter.DoJitter(uid, jitterTime, true, status: statusEffects); if (stutterTime > TimeSpan.Zero) diff --git a/Resources/Changelog/ChangelogWhite.yml b/Resources/Changelog/ChangelogWhite.yml index 4b27ecceba..8dd9890b95 100644 --- a/Resources/Changelog/ChangelogWhite.yml +++ b/Resources/Changelog/ChangelogWhite.yml @@ -1,43 +1,4 @@ Entries: -- author: HitPanda - changes: - - message: "\u041F\u0435\u0440\u0435\u0432\u043E\u0434 \u0430\u043F\u043B\u0438\u043D\ - \u043A\u0430." - type: Add - - message: "\u0414\u0440\u0443\u0433\u043E\u0435 \u043E\u0433\u0440\u043E\u043C\u043D\ - \u043E\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043F\ - \u0435\u0440\u0435\u0432\u043E\u0434\u0430 \u0441 \u0438\u0437\u043C\u0435\u043D\ - \u0435\u043D\u0438\u044F\u043C\u0438 \u0432 1500+ \u0444\u0430\u0439\u043B\u043E\ - \u0432." - type: Add - - message: "\u0424\u0438\u043A\u0441 \u0441\u043B\u043E\u043C\u0430\u043D\u043D\u044B\ - \u0445 \u043F\u0435\u0440\u0435\u0432\u043E\u0434\u043E\u0432 (\u0432\u0440\u043E\ - \u0434\u0435 \u0431\u044B)." - type: Fix - id: 115 - time: '2023-04-04T13:12:36.0000000+00:00' -- author: HitPanda - changes: - - message: "\u041F\u0435\u0440\u0435\u0432\u043E\u0434 \u043A\u043D\u0438\u0433" - type: Add - - message: "\u041F\u0435\u0440\u0435\u0432\u043E\u0434 \u0434\u0438\u0441\u043A\u043E\ - \u0440\u0434-\u0441\u0442\u0430\u0442\u0443\u0441\u0430" - type: Add - - message: "\u041F\u0435\u0440\u0435\u0432\u043E\u0434 \u0430\u0434\u043C\u0438\u043D\ - -\u043F\u0430\u043D\u0435\u043B\u0438" - type: Add - - message: "\u0414\u0440\u0443\u0433\u0438\u0435 \u043F\u0435\u0440\u0435\u0432\u043E\ - \u0434\u044B" - type: Add - id: 116 - time: '2023-04-05T12:32:32.0000000+00:00' -- author: HitPanda - changes: - - message: "\u041F\u0435\u0440\u0435\u0432\u043E\u0434 \u0438\u043A\u043E\u043D\u043E\ - \u043A \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430!" - type: Add - id: 117 - time: '2023-04-05T18:01:47.0000000+00:00' - author: Valtos changes: - message: "\u041D\u043E\u0432\u044B\u0439 \u0441\u0442\u0438\u043B\u044C \u0438\ @@ -8911,3 +8872,37 @@ id: 614 time: '2024-11-30T21:01:53.0000000+00:00' url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/795 +- author: BIG_Zi_348 + changes: + - message: "\u0418\u043C\u043F\u043B\u0430\u043D\u0442 \u043D\u0435\u0439\u0440\u043E\ + \u0441\u0442\u0430\u0431\u0438\u043B\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\ + \u0435\u043F\u0435\u0440\u044C \u043F\u043E\u043C\u043E\u0433\u0430\u0435\u0442\ + \ \u043E\u0442 \u0441\u0442\u0430\u043D\u0431\u0430\u0442\u043E\u043D\u0430\ + \ \u0438 \u043D\u0430\u043D\u043E\u0441\u0438\u0442 \u043C\u0435\u043D\u044C\ + \u0448\u0435 \u0443\u0440\u043E\u043D\u0430 \u0448\u043E\u043A\u043E\u043C." + type: Tweak + - message: "\u0418\u043C\u043F\u043B\u0430\u043D\u0442 \u0441\u0432\u043E\u0431\u043E\ + \u0434\u044B \u0442\u0435\u043F\u0435\u0440\u044C \u043E\u0441\u0432\u043E\u0431\ + \u043E\u0436\u0434\u0430\u0435\u0442 \u043E\u0442 \u0431\u043E\u043B\u044B." + type: Tweak + id: 615 + time: '2024-12-01T21:07:54.0000000+00:00' + url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/798 +- author: BIG_Zi_348 + changes: + - message: "\u0418\u0437\u043C\u0435\u043D\u0435\u043D \u043A\u0440\u0430\u0444\u0442\ + \ \u043C\u044F\u0441\u043D\u043E\u0433\u043E \u043A\u0440\u044E\u043A\u0430." + type: Tweak + id: 616 + time: '2024-12-01T21:08:19.0000000+00:00' + url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/797 +- author: BIG_Zi_348 + changes: + - message: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0430 \u0432\u044B\ + \u0434\u0430\u0447\u0430 \u0438\u043A\u043E\u043D\u043A\u0438 \u0438 \u043D\u0430\ + \u0437\u0432\u0430\u043D\u0438\u044F \u0432\u0435\u0442\u0435\u0440\u0430\u043D\ + \u0441\u043A\u0438\u043C \u0440\u043E\u043B\u044F\u043C." + type: Fix + id: 617 + time: '2024-12-01T21:08:39.0000000+00:00' + url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/799 diff --git a/Resources/Locale/ru-RU/locales-new/autotranslate-19.ftl b/Resources/Locale/ru-RU/locales-new/autotranslate-19.ftl index 3f1a6d711f..59f242f1fe 100644 --- a/Resources/Locale/ru-RU/locales-new/autotranslate-19.ftl +++ b/Resources/Locale/ru-RU/locales-new/autotranslate-19.ftl @@ -3,7 +3,7 @@ ent-SeniorResearcherPDA = ПДА ведущего исследователя ent-SeniorPhysicianPDA = ПДА медицинского офицера .desc = Слабо пахнет железом и химикатами. Имеет встроенный анализатор здоровья. ent-SeniorOfficerPDA = ПДА ветерана СБ - .desc = Избитые, потрепанные и сломанные, но едва пригодные для использования. + .desc = Избитый, потрепанный и сломанный, но едва пригодный для использования. ent-SeniorSalvagePDA = ПДА охотника карго .desc = Потрепанный и воняющий кровью с потом, но пригодный для использования. ent-PinpointerUniversal = универсальный пинпоинтер diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/meat_spike.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/meat_spike.ftl index b268aaa587..6224668ea6 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/meat_spike.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/structures/meat_spike.ftl @@ -1,2 +1,4 @@ ent-KitchenSpike = мясной крюк .desc = Крюк для снятия мяса с животных. +ent-KitchenSpikeFrame = каркас мясного крюка + .desc = Незаконченный мясной крюк, требуется ещё немного терпения. diff --git a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml index deddc0f44b..1b767f5765 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml @@ -904,7 +904,7 @@ - type: Unremoveable - type: entity - parent: EngineeringIDCard + parent: IDCardStandard id: SeniorEngineerIDCard name: senior engineer ID card components: @@ -912,9 +912,11 @@ layers: - state: default - state: idseniorengineer + - type: PresetIdCard + job: SeniorEngineer - type: entity - parent: ResearchIDCard + parent: IDCardStandard id: SeniorResearcherIDCard name: senior researcher ID card components: @@ -922,9 +924,11 @@ layers: - state: default - state: idseniorresearcher + - type: PresetIdCard + job: SeniorResearcher - type: entity - parent: MedicalIDCard + parent: IDCardStandard id: SeniorPhysicianIDCard name: senior physician ID card components: @@ -932,9 +936,11 @@ layers: - state: default - state: idseniorphysician + - type: PresetIdCard + job: SeniorPhysician - type: entity - parent: SecurityIDCard + parent: IDCardStandard id: SeniorOfficerIDCard name: senior officer ID card components: @@ -942,3 +948,5 @@ layers: - state: default - state: idseniorofficer + - type: PresetIdCard + job: SeniorOfficer diff --git a/Resources/Prototypes/Entities/Structures/meat_spike.yml b/Resources/Prototypes/Entities/Structures/meat_spike.yml index 16aa0f4210..b319e13af7 100644 --- a/Resources/Prototypes/Entities/Structures/meat_spike.yml +++ b/Resources/Prototypes/Entities/Structures/meat_spike.yml @@ -52,7 +52,7 @@ Empty: { state: spike } Bloody: { state: spikebloody } - type: Construction - graph: MeatSpike + graph: MeatSpikeWD # WD Edit node: MeatSpike - type: GuideHelp guides: diff --git a/Resources/Prototypes/Recipes/Construction/furniture.yml b/Resources/Prototypes/Recipes/Construction/furniture.yml index df21266e11..acea2d8b05 100644 --- a/Resources/Prototypes/Recipes/Construction/furniture.yml +++ b/Resources/Prototypes/Recipes/Construction/furniture.yml @@ -1017,7 +1017,7 @@ id: KitchenSpike name: meat spike description: A spike found in kitchens butchering animals. - graph: MeatSpike + graph: MeatSpikeWD # WD Edit startNode: start targetNode: MeatSpike category: construction-category-furniture diff --git a/Resources/Prototypes/Roles/Jobs/Security/senior_officer.yml b/Resources/Prototypes/Roles/Jobs/Security/senior_officer.yml index 1751206c53..9e46e53dad 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/senior_officer.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/senior_officer.yml @@ -30,7 +30,7 @@ - Maintenance - Service - External - - Medical + - Cryogenics special: - !type:AddImplantSpecial implants: [ MindShieldImplant ] diff --git a/Resources/Prototypes/_White/Construction/Graphs/furniture/meatspike.yml b/Resources/Prototypes/_White/Construction/Graphs/furniture/meatspike.yml new file mode 100644 index 0000000000..d050946f52 --- /dev/null +++ b/Resources/Prototypes/_White/Construction/Graphs/furniture/meatspike.yml @@ -0,0 +1,34 @@ +- type: constructionGraph + id: MeatSpikeWD + start: start + graph: + - node: start + actions: + - !type:DeleteEntity {} + edges: + - to: middle + completed: + - !type:SnapToGrid + southRotation: true + steps: + - material: Steel + amount: 15 + doAfter: 5 + - node: middle + entity: KitchenSpikeFrame + edges: + - to: MeatSpike + steps: + - tool: Welding + doAfter: 3 + - node: MeatSpike + entity: KitchenSpike + edges: + - to: start + completed: + - !type:SpawnPrototype + prototype: SheetSteel1 + amount: 15 + steps: + - tool: Screwing + doAfter: 5 diff --git a/Resources/Prototypes/_White/Entities/Structures/meat_spike.yml b/Resources/Prototypes/_White/Entities/Structures/meat_spike.yml new file mode 100644 index 0000000000..fd29b18d43 --- /dev/null +++ b/Resources/Prototypes/_White/Entities/Structures/meat_spike.yml @@ -0,0 +1,57 @@ +- type: entity + id: KitchenSpikeFrame + parent: BaseStructure + name: meat spike frame + description: Unfinished meat hook, needs a little more patience. + components: + - type: InteractionOutline + - type: Sprite + sprite: White/Structures/meat_spike.rsi + state: spike + layers: + - state: spike + map: ["base"] + - type: Damageable + damageContainer: StructuralInorganic + damageModifierSet: Metallic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 200 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] + - trigger: + !type:DamageTrigger + damage: 100 + behaviors: + - !type:DoActsBehavior + acts: ["Destruction"] + - !type:PlaySoundBehavior + sound: + collection: MetalBreak + params: + volume: -4 + - !type:SpawnEntitiesBehavior + spawn: + SheetSteel1: + min: 1 + max: 1 + - type: Transform + noRot: true + - type: Anchorable + - type: Pullable + - type: Appearance + - type: GenericVisualizer + visuals: + enum.KitchenSpikeVisuals.Status: + base: + Empty: { state: spike } + Bloody: { state: spikebloody } + - type: Construction + graph: MeatSpikeWD + node: middle + - type: GuideHelp + guides: + - Chef diff --git a/Resources/Textures/White/Structures/meat_spike.rsi/meta.json b/Resources/Textures/White/Structures/meat_spike.rsi/meta.json new file mode 100644 index 0000000000..90b32a6907 --- /dev/null +++ b/Resources/Textures/White/Structures/meat_spike.rsi/meta.json @@ -0,0 +1,20 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/discordia-space/CEV-Eris/blob/2b969adc2dfd3e9621bf3597c5cbffeb3ac8c9f0/icons/obj/kitchen.dmi", + "states": [ + { + "name": "spike", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + } + ] +} diff --git a/Resources/Textures/White/Structures/meat_spike.rsi/spike.png b/Resources/Textures/White/Structures/meat_spike.rsi/spike.png new file mode 100644 index 0000000000..4a7bc6d997 Binary files /dev/null and b/Resources/Textures/White/Structures/meat_spike.rsi/spike.png differ