From bc2f079029cb2ec20a8bf5f532bf73b4c8cddf53 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Sun, 28 Jan 2024 00:51:54 +0100 Subject: [PATCH 001/266] Make some damage sources not cancel do afters (#24635) - poison chemicals (HealthChange effect) - being on fire - guardians transferring damage to owner (cherry picked from commit 3e3cb10a96993b711ea8aeb696f157f40c728e49) --- Content.Server/Atmos/EntitySystems/FlammableSystem.cs | 2 +- Content.Server/Chemistry/ReagentEffects/HealthChange.cs | 6 +++++- Content.Server/Guardian/GuardianSystem.cs | 6 +++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Content.Server/Atmos/EntitySystems/FlammableSystem.cs b/Content.Server/Atmos/EntitySystems/FlammableSystem.cs index c9ecc9c5235..cb1cb9bc150 100644 --- a/Content.Server/Atmos/EntitySystems/FlammableSystem.cs +++ b/Content.Server/Atmos/EntitySystems/FlammableSystem.cs @@ -402,7 +402,7 @@ public override void Update(float frameTime) if (TryComp(uid, out TemperatureComponent? temp)) _temperatureSystem.ChangeHeat(uid, 12500 * damageScale, false, temp); - _damageableSystem.TryChangeDamage(uid, flammable.Damage * damageScale); + _damageableSystem.TryChangeDamage(uid, flammable.Damage * damageScale, interruptsDoAfters: false); AdjustFireStacks(uid, flammable.FirestackFade * (flammable.Resisting ? 10f : 1f), flammable); } diff --git a/Content.Server/Chemistry/ReagentEffects/HealthChange.cs b/Content.Server/Chemistry/ReagentEffects/HealthChange.cs index a0c976bdc9d..2a6181c7f35 100644 --- a/Content.Server/Chemistry/ReagentEffects/HealthChange.cs +++ b/Content.Server/Chemistry/ReagentEffects/HealthChange.cs @@ -115,7 +115,11 @@ public override void Effect(ReagentEffectArgs args) var scale = ScaleByQuantity ? args.Quantity : FixedPoint2.New(1); scale *= args.Scale; - args.EntityManager.System().TryChangeDamage(args.SolutionEntity, Damage * scale, IgnoreResistances); + args.EntityManager.System().TryChangeDamage( + args.SolutionEntity, + Damage * scale, + IgnoreResistances, + interruptsDoAfters: false); } } } diff --git a/Content.Server/Guardian/GuardianSystem.cs b/Content.Server/Guardian/GuardianSystem.cs index 02099b2c7b2..627c336a36b 100644 --- a/Content.Server/Guardian/GuardianSystem.cs +++ b/Content.Server/Guardian/GuardianSystem.cs @@ -262,7 +262,11 @@ private void OnGuardianDamaged(EntityUid uid, GuardianComponent component, Damag if (args.DamageDelta == null || component.Host == null || component.DamageShare > 0) return; - _damageSystem.TryChangeDamage(component.Host, args.DamageDelta * component.DamageShare, origin: args.Origin); + _damageSystem.TryChangeDamage( + component.Host, + args.DamageDelta * component.DamageShare, + origin: args.Origin, + interruptsDoAfters: false); _popupSystem.PopupEntity(Loc.GetString("guardian-entity-taking-damage"), component.Host.Value, component.Host.Value); } From c2d69f2dd49fdd74c579fe86dba786658e8d889a Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Sun, 28 Jan 2024 01:28:02 +0100 Subject: [PATCH 002/266] Security barriers take 5 seconds to (un)lock (#24637) People are using these as unhackable and hard-to-tailgate airlocks into sec. They should not be trivial for security officers to move through. Made LockComponent have configurable lock times to implement this. (cherry picked from commit 8ca7cb59a3b83e86c9b27a9549bf85a9f914b6fe) --- Content.Shared/Lock/LockComponent.cs | 49 +++++++++++++++++ Content.Shared/Lock/LockSystem.cs | 55 ++++++++++++++++++- .../Objects/Specific/Security/barrier.yml | 2 + 3 files changed, 104 insertions(+), 2 deletions(-) diff --git a/Content.Shared/Lock/LockComponent.cs b/Content.Shared/Lock/LockComponent.cs index 174818c4e81..b3c46597498 100644 --- a/Content.Shared/Lock/LockComponent.cs +++ b/Content.Shared/Lock/LockComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.DoAfter; using Robust.Shared.Audio; using Robust.Shared.GameStates; using Robust.Shared.Serialization; @@ -50,6 +51,26 @@ public sealed partial class LockComponent : Component [DataField("breakOnEmag")] [AutoNetworkedField] public bool BreakOnEmag = true; + + /// + /// Amount of do-after time needed to lock the entity. + /// + /// + /// If set to zero, no do-after will be used. + /// + [DataField] + [AutoNetworkedField] + public TimeSpan LockTime; + + /// + /// Amount of do-after time needed to unlock the entity. + /// + /// + /// If set to zero, no do-after will be used. + /// + [DataField] + [AutoNetworkedField] + public TimeSpan UnlockTime; } /// @@ -64,3 +85,31 @@ public record struct LockToggleAttemptEvent(EntityUid User, bool Silent = false, /// [ByRefEvent] public readonly record struct LockToggledEvent(bool Locked); + +/// +/// Used to lock a lockable entity that has a lock time configured. +/// +/// +/// +[Serializable, NetSerializable] +public sealed partial class LockDoAfter : DoAfterEvent +{ + public override DoAfterEvent Clone() + { + return this; + } +} + +/// +/// Used to unlock a lockable entity that has an unlock time configured. +/// +/// +/// +[Serializable, NetSerializable] +public sealed partial class UnlockDoAfter : DoAfterEvent +{ + public override DoAfterEvent Clone() + { + return this; + } +} diff --git a/Content.Shared/Lock/LockSystem.cs b/Content.Shared/Lock/LockSystem.cs index 7babc6a9c0c..e5f53b4080e 100644 --- a/Content.Shared/Lock/LockSystem.cs +++ b/Content.Shared/Lock/LockSystem.cs @@ -1,5 +1,6 @@ using Content.Shared.Access.Components; using Content.Shared.Access.Systems; +using Content.Shared.DoAfter; using Content.Shared.Emag.Systems; using Content.Shared.Examine; using Content.Shared.Hands.Components; @@ -26,6 +27,7 @@ public sealed class LockSystem : EntitySystem [Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedPopupSystem _sharedPopupSystem = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; /// public override void Initialize() @@ -38,6 +40,8 @@ public override void Initialize() SubscribeLocalEvent(OnExamined); SubscribeLocalEvent>(AddToggleLockVerb); SubscribeLocalEvent(OnEmagged); + SubscribeLocalEvent(OnDoAfterLock); + SubscribeLocalEvent(OnDoAfterUnlock); } private void OnStartup(EntityUid uid, LockComponent lockComp, ComponentStartup args) @@ -86,11 +90,15 @@ private void OnExamined(EntityUid uid, LockComponent lockComp, ExaminedEvent arg /// /// Attmempts to lock a given entity /// + /// + /// If the lock is set to require a do-after, a true return value only indicates that the do-after started. + /// /// The entity with the lock /// The person trying to lock it /// + /// If true, skip the required do-after if one is configured. /// If locking was successful - public bool TryLock(EntityUid uid, EntityUid user, LockComponent? lockComp = null) + public bool TryLock(EntityUid uid, EntityUid user, LockComponent? lockComp = null, bool skipDoAfter = false) { if (!Resolve(uid, ref lockComp)) return false; @@ -101,6 +109,16 @@ public bool TryLock(EntityUid uid, EntityUid user, LockComponent? lockComp = nul if (!HasUserAccess(uid, user, quiet: false)) return false; + if (!skipDoAfter && lockComp.LockTime != TimeSpan.Zero) + { + return _doAfter.TryStartDoAfter( + new DoAfterArgs(EntityManager, user, lockComp.LockTime, new LockDoAfter(), uid, uid) + { + BreakOnDamage = true, BreakOnTargetMove = true, BreakOnUserMove = true, RequireCanInteract = true, + NeedHand = true + }); + } + _sharedPopupSystem.PopupClient(Loc.GetString("lock-comp-do-lock-success", ("entityName", Identity.Name(uid, EntityManager))), uid, user); _audio.PlayPredicted(lockComp.LockSound, uid, user); @@ -117,6 +135,9 @@ public bool TryLock(EntityUid uid, EntityUid user, LockComponent? lockComp = nul /// /// Forces a given entity to be unlocked /// + /// + /// This does not process do-after times. + /// /// The entity with the lock /// The person unlocking it. Can be null /// @@ -145,11 +166,15 @@ public void Unlock(EntityUid uid, EntityUid? user, LockComponent? lockComp = nul /// /// Attmempts to unlock a given entity /// + /// + /// If the lock is set to require a do-after, a true return value only indicates that the do-after started. + /// /// The entity with the lock /// The person trying to unlock it /// + /// If true, skip the required do-after if one is configured. /// If locking was successful - public bool TryUnlock(EntityUid uid, EntityUid user, LockComponent? lockComp = null) + public bool TryUnlock(EntityUid uid, EntityUid user, LockComponent? lockComp = null, bool skipDoAfter = false) { if (!Resolve(uid, ref lockComp)) return false; @@ -160,6 +185,16 @@ public bool TryUnlock(EntityUid uid, EntityUid user, LockComponent? lockComp = n if (!HasUserAccess(uid, user, quiet: false)) return false; + if (!skipDoAfter && lockComp.UnlockTime != TimeSpan.Zero) + { + return _doAfter.TryStartDoAfter( + new DoAfterArgs(EntityManager, user, lockComp.LockTime, new UnlockDoAfter(), uid, uid) + { + BreakOnDamage = true, BreakOnTargetMove = true, BreakOnUserMove = true, RequireCanInteract = true, + NeedHand = true + }); + } + Unlock(uid, user, lockComp); return true; } @@ -219,5 +254,21 @@ private void OnEmagged(EntityUid uid, LockComponent component, ref GotEmaggedEve RemComp(uid); //Literally destroys the lock as a tell it was emagged args.Handled = true; } + + private void OnDoAfterLock(EntityUid uid, LockComponent component, LockDoAfter args) + { + if (args.Cancelled) + return; + + TryLock(uid, args.User, skipDoAfter: true); + } + + private void OnDoAfterUnlock(EntityUid uid, LockComponent component, UnlockDoAfter args) + { + if (args.Cancelled) + return; + + TryUnlock(uid, args.User, skipDoAfter: true); + } } diff --git a/Resources/Prototypes/Entities/Objects/Specific/Security/barrier.yml b/Resources/Prototypes/Entities/Objects/Specific/Security/barrier.yml index 035185487de..3a31edf7f14 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Security/barrier.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Security/barrier.yml @@ -45,6 +45,8 @@ - type: Lock locked: false lockOnClick: true # toggle lock just by clicking on barrier + lockTime: 5 + unlockTime: 5 - type: Damageable damageContainer: Inorganic damageModifierSet: Metallic From bb0572860e12555859d09dc99a814e4cfd0dba85 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 28 Jan 2024 00:29:08 +0000 Subject: [PATCH 003/266] Automatic changelog update (cherry picked from commit 1e0310ff10c4867632b03725f8166639e579f878) --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index a7318796b87..60bf28aa951 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: notafet - changes: - - message: Pipes now leak their contents when destroyed. Make sure to drain pipes - before removing them. - type: Tweak - id: 5308 - time: '2023-12-11T07:51:45.0000000+00:00' - author: Ubaser changes: - message: Janitors can now buy their own bomb suit for cleaning chemical spills. @@ -3823,3 +3816,10 @@ id: 5808 time: '2024-01-27T23:14:09.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24633 +- author: PJB3005 + changes: + - message: Security barriers need 5 seconds to lock and unlock. + type: Tweak + id: 5809 + time: '2024-01-28T00:28:02.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24637 From 0f3590601442e1e689faaf768d0c3053b8caf81e Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sun, 28 Jan 2024 12:10:39 +1100 Subject: [PATCH 004/266] Steal cleanup (#24428) - Fix datafield spelling - Fix some code oddities (cherry picked from commit b1f9e25c1364064b03bc37357d3453f01e28b8a4) --- .../Components/StealConditionComponent.cs | 2 +- .../Systems/StealConditionSystem.cs | 27 ++++++------------- Resources/Prototypes/Objectives/thief.yml | 16 +++++------ Resources/Prototypes/Objectives/traitor.yml | 2 +- 4 files changed, 18 insertions(+), 29 deletions(-) diff --git a/Content.Server/Objectives/Components/StealConditionComponent.cs b/Content.Server/Objectives/Components/StealConditionComponent.cs index 4da028de259..f8d68063f87 100644 --- a/Content.Server/Objectives/Components/StealConditionComponent.cs +++ b/Content.Server/Objectives/Components/StealConditionComponent.cs @@ -20,7 +20,7 @@ public sealed partial class StealConditionComponent : Component /// When enabled, disables generation of this target if there is no entity on the map (disable for objects that can be created mid-round). /// [DataField] - public bool VerifyMapExistance = true; + public bool VerifyMapExistence = true; /// /// If the target may be alive but has died, it will not be counted diff --git a/Content.Server/Objectives/Systems/StealConditionSystem.cs b/Content.Server/Objectives/Systems/StealConditionSystem.cs index 2b552285ade..02d4ee010b5 100644 --- a/Content.Server/Objectives/Systems/StealConditionSystem.cs +++ b/Content.Server/Objectives/Systems/StealConditionSystem.cs @@ -42,17 +42,8 @@ private void OnAssigned(Entity condition, ref Objective { List targetList = new(); - // cancel if invalid TargetStealName - var group = _proto.Index(condition.Comp.StealGroup); - if (group == null) - { - args.Cancelled = true; - Log.Error("StealTargetGroup invalid prototype!"); - return; - } - - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var target)) + var query = AllEntityQuery(); + while (query.MoveNext(out var target)) { if (condition.Comp.StealGroup != target.StealGroup) continue; @@ -61,17 +52,17 @@ private void OnAssigned(Entity condition, ref Objective } // cancel if the required items do not exist - if (targetList.Count == 0 && condition.Comp.VerifyMapExistance) + if (targetList.Count == 0 && condition.Comp.VerifyMapExistence) { args.Cancelled = true; return; } //setup condition settings - var maxSize = condition.Comp.VerifyMapExistance + var maxSize = condition.Comp.VerifyMapExistence ? Math.Min(targetList.Count, condition.Comp.MaxCollectionSize) : condition.Comp.MaxCollectionSize; - var minSize = condition.Comp.VerifyMapExistance + var minSize = condition.Comp.VerifyMapExistence ? Math.Min(targetList.Count, condition.Comp.MinCollectionSize) : condition.Comp.MinCollectionSize; @@ -102,15 +93,13 @@ private void OnGetProgress(Entity condition, ref Object private float GetProgress(MindComponent mind, StealConditionComponent condition) { - if (!_metaQuery.TryGetComponent(mind.OwnedEntity, out var meta)) - return 0; if (!_containerQuery.TryGetComponent(mind.OwnedEntity, out var currentManager)) return 0; var stack = new Stack(); var count = 0; - //check pulling object + //check pulling object if (TryComp(mind.OwnedEntity, out var pull)) //TO DO: to make the code prettier? don't like the repetition { var pullid = pull.Pulling; @@ -147,7 +136,7 @@ private float GetProgress(MindComponent mind, StealConditionComponent condition) } } while (stack.TryPop(out currentManager)); - var result = (float) count / (float) condition.CollectionSize; + var result = count / (float) condition.CollectionSize; result = Math.Clamp(result, 0, 1); return result; } @@ -166,7 +155,7 @@ private bool CheckStealTarget(EntityUid entity, StealConditionComponent conditio { if (TryComp(entity, out var state)) { - if (!_mobState.IsAlive(entity)) + if (!_mobState.IsAlive(entity, state)) return false; } } diff --git a/Resources/Prototypes/Objectives/thief.yml b/Resources/Prototypes/Objectives/thief.yml index 4fc44119e3d..29432e1736c 100644 --- a/Resources/Prototypes/Objectives/thief.yml +++ b/Resources/Prototypes/Objectives/thief.yml @@ -16,7 +16,7 @@ id: BaseThiefStealObjective components: - type: StealCondition - verifyMapExistance: false + verifyMapExistence: false descriptionText: objective-condition-thief-description - type: entity @@ -25,7 +25,7 @@ id: BaseThiefStealCollectionObjective components: - type: StealCondition - verifyMapExistance: true + verifyMapExistence: true descriptionText: objective-condition-thief-description - type: entity @@ -34,7 +34,7 @@ id: BaseThiefStealStructureObjective components: - type: StealCondition - verifyMapExistance: true + verifyMapExistence: true descriptionText: objective-condition-thief-description - type: Objective difficulty: 2 # it's hard to hide @@ -45,7 +45,7 @@ id: BaseThiefStealAnimalObjective components: - type: StealCondition - verifyMapExistance: false + verifyMapExistence: false checkAlive: true objectiveNoOwnerText: objective-condition-steal-title-alive-no-owner descriptionText: objective-condition-thief-animal-description @@ -125,7 +125,7 @@ stealGroup: TechnologyDisk minCollectionSize: 5 maxCollectionSize: 15 - verifyMapExistance: false + verifyMapExistence: false - type: Objective difficulty: 0.8 @@ -138,7 +138,7 @@ stealGroup: IDCard minCollectionSize: 5 maxCollectionSize: 15 - verifyMapExistance: false + verifyMapExistence: false - type: Objective difficulty: 0.7 @@ -153,7 +153,7 @@ stealGroup: Cannabis minCollectionSize: 20 maxCollectionSize: 30 - verifyMapExistance: false + verifyMapExistence: false - type: Objective difficulty: 0.5 @@ -169,7 +169,7 @@ stealGroup: LAMP minCollectionSize: 1 maxCollectionSize: 10 - verifyMapExistance: true + verifyMapExistence: true - type: Objective difficulty: 0.5 # just for fun, collectings LAMP on Moth diff --git a/Resources/Prototypes/Objectives/traitor.yml b/Resources/Prototypes/Objectives/traitor.yml index 30b8833621b..2b18df1c6d0 100644 --- a/Resources/Prototypes/Objectives/traitor.yml +++ b/Resources/Prototypes/Objectives/traitor.yml @@ -27,7 +27,7 @@ id: BaseTraitorStealObjective components: - type: StealCondition - verifyMapExistance: false + verifyMapExistence: false - type: Objective difficulty: 2.75 - type: ObjectiveLimit From 8497ef80026bdd6909b9cc48e31d63923ca9d44e Mon Sep 17 00:00:00 2001 From: themias <89101928+themias@users.noreply.github.com> Date: Sun, 28 Jan 2024 04:23:16 +0100 Subject: [PATCH 005/266] Add cowboy hats and boots (#24299) * Add cowboy hats and boots * oops * audio fix and attribution (cherry picked from commit 5c75117749ce959accb936cffd6bc1d481137a13) --- .../Audio/Effects/Footsteps/attributions.yml | 9 +- Resources/Audio/Effects/Footsteps/spurs1.ogg | Bin 0 -> 8980 bytes Resources/Audio/Effects/Footsteps/spurs2.ogg | Bin 0 -> 9024 bytes Resources/Audio/Effects/Footsteps/spurs3.ogg | Bin 0 -> 9676 bytes Resources/Locale/en-US/accent/cowboy.ftl | 296 ++++++++++++++++++ .../Prototypes/Accents/word_replacements.yml | 104 ++++++ .../Catalog/Cargo/cargo_vending.yml | 2 +- .../VendingMachines/Inventories/secdrobe.yml | 2 + .../VendingMachines/Inventories/theater.yml | 9 + .../Entities/Clothing/Head/hats.yml | 64 ++++ .../Entities/Clothing/Shoes/boots.yml | 44 +++ .../Markers/Spawners/Random/maintenance.yml | 3 + .../Structures/Machines/Computers/arcades.yml | 1 + .../Prototypes/SoundCollections/footsteps.yml | 9 +- .../cowboyhatblack.rsi/equipped-HELMET.png | Bin 0 -> 364 bytes .../Head/Hats/cowboyhatblack.rsi/icon.png | Bin 0 -> 220 bytes .../Hats/cowboyhatblack.rsi/inhand-left.png | Bin 0 -> 366 bytes .../Hats/cowboyhatblack.rsi/inhand-right.png | Bin 0 -> 379 bytes .../Head/Hats/cowboyhatblack.rsi/meta.json | 26 ++ .../equipped-HELMET.png | Bin 0 -> 392 bytes .../Hats/cowboyhatbountyhunter.rsi/icon.png | Bin 0 -> 253 bytes .../cowboyhatbountyhunter.rsi/inhand-left.png | Bin 0 -> 366 bytes .../inhand-right.png | Bin 0 -> 379 bytes .../Hats/cowboyhatbountyhunter.rsi/meta.json | 26 ++ .../cowboyhatbrown.rsi/equipped-HELMET.png | Bin 0 -> 399 bytes .../Head/Hats/cowboyhatbrown.rsi/icon.png | Bin 0 -> 600 bytes .../Hats/cowboyhatbrown.rsi/inhand-left.png | Bin 0 -> 368 bytes .../Hats/cowboyhatbrown.rsi/inhand-right.png | Bin 0 -> 374 bytes .../Head/Hats/cowboyhatbrown.rsi/meta.json | 26 ++ .../cowboyhatgrey.rsi/equipped-HELMET.png | Bin 0 -> 436 bytes .../Head/Hats/cowboyhatgrey.rsi/icon.png | Bin 0 -> 552 bytes .../Hats/cowboyhatgrey.rsi/inhand-left.png | Bin 0 -> 396 bytes .../Hats/cowboyhatgrey.rsi/inhand-right.png | Bin 0 -> 407 bytes .../Head/Hats/cowboyhatgrey.rsi/meta.json | 26 ++ .../Hats/cowboyhatred.rsi/equipped-HELMET.png | Bin 0 -> 376 bytes .../Head/Hats/cowboyhatred.rsi/icon.png | Bin 0 -> 651 bytes .../Hats/cowboyhatred.rsi/inhand-left.png | Bin 0 -> 382 bytes .../Hats/cowboyhatred.rsi/inhand-right.png | Bin 0 -> 378 bytes .../Head/Hats/cowboyhatred.rsi/meta.json | 26 ++ .../cowboyhatwhite.rsi/equipped-HELMET.png | Bin 0 -> 415 bytes .../Head/Hats/cowboyhatwhite.rsi/icon.png | Bin 0 -> 474 bytes .../Hats/cowboyhatwhite.rsi/inhand-left.png | Bin 0 -> 352 bytes .../Hats/cowboyhatwhite.rsi/inhand-right.png | Bin 0 -> 357 bytes .../Head/Hats/cowboyhatwhite.rsi/meta.json | 26 ++ .../cowboybootsblack.rsi/equipped-FEET.png | Bin 0 -> 450 bytes .../Shoes/Boots/cowboybootsblack.rsi/icon.png | Bin 0 -> 488 bytes .../Boots/cowboybootsblack.rsi/meta.json | 18 ++ .../cowboybootsbrown.rsi/equipped-FEET.png | Bin 0 -> 466 bytes .../Shoes/Boots/cowboybootsbrown.rsi/icon.png | Bin 0 -> 509 bytes .../Boots/cowboybootsbrown.rsi/meta.json | 18 ++ .../cowboybootsfancy.rsi/equipped-FEET.png | Bin 0 -> 610 bytes .../Shoes/Boots/cowboybootsfancy.rsi/icon.png | Bin 0 -> 551 bytes .../Boots/cowboybootsfancy.rsi/meta.json | 18 ++ .../cowboybootswhite.rsi/equipped-FEET.png | Bin 0 -> 495 bytes .../Shoes/Boots/cowboybootswhite.rsi/icon.png | Bin 0 -> 512 bytes .../Boots/cowboybootswhite.rsi/meta.json | 18 ++ 56 files changed, 768 insertions(+), 3 deletions(-) create mode 100644 Resources/Audio/Effects/Footsteps/spurs1.ogg create mode 100644 Resources/Audio/Effects/Footsteps/spurs2.ogg create mode 100644 Resources/Audio/Effects/Footsteps/spurs3.ogg create mode 100644 Resources/Locale/en-US/accent/cowboy.ftl create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatblack.rsi/equipped-HELMET.png create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatblack.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatblack.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatblack.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatblack.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatbountyhunter.rsi/equipped-HELMET.png create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatbountyhunter.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatbountyhunter.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatbountyhunter.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatbountyhunter.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatbrown.rsi/equipped-HELMET.png create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatbrown.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatbrown.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatbrown.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatbrown.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatgrey.rsi/equipped-HELMET.png create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatgrey.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatgrey.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatgrey.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatgrey.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatred.rsi/equipped-HELMET.png create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatred.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatred.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatred.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatred.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatwhite.rsi/equipped-HELMET.png create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatwhite.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatwhite.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatwhite.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Hats/cowboyhatwhite.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Shoes/Boots/cowboybootsblack.rsi/equipped-FEET.png create mode 100644 Resources/Textures/Clothing/Shoes/Boots/cowboybootsblack.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Shoes/Boots/cowboybootsblack.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Shoes/Boots/cowboybootsbrown.rsi/equipped-FEET.png create mode 100644 Resources/Textures/Clothing/Shoes/Boots/cowboybootsbrown.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Shoes/Boots/cowboybootsbrown.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Shoes/Boots/cowboybootsfancy.rsi/equipped-FEET.png create mode 100644 Resources/Textures/Clothing/Shoes/Boots/cowboybootsfancy.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Shoes/Boots/cowboybootsfancy.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Shoes/Boots/cowboybootswhite.rsi/equipped-FEET.png create mode 100644 Resources/Textures/Clothing/Shoes/Boots/cowboybootswhite.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Shoes/Boots/cowboybootswhite.rsi/meta.json diff --git a/Resources/Audio/Effects/Footsteps/attributions.yml b/Resources/Audio/Effects/Footsteps/attributions.yml index 45872787b7d..82b5fa93ca2 100644 --- a/Resources/Audio/Effects/Footsteps/attributions.yml +++ b/Resources/Audio/Effects/Footsteps/attributions.yml @@ -63,4 +63,11 @@ license: "CC-BY-SA-3.0" copyright: "Taken from https://github.com/tgstation/tgstation" source: "https://github.com/tgstation/tgstation/blob/34d5ab2e46e3fb4dd9d7475f587d33441df9651c/sound/effects" - \ No newline at end of file + +- files: + - spurs1.ogg + - spurs2.ogg + - spurs3.ogg + license: "CC-BY-SA-3.0" + copyright: "Taken from tgstation" + source: "https://github.com/tgstation/tgstation/tree/1e8d511946d194f92f744f5f957a7c41683d84a6/sound/effects/footstep" diff --git a/Resources/Audio/Effects/Footsteps/spurs1.ogg b/Resources/Audio/Effects/Footsteps/spurs1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ccc2b982aa72fffc9a26a0d5b5d4fdf60a462a93 GIT binary patch literal 8980 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 K`v>?xBL5FMs>Uq< literal 0 HcmV?d00001 diff --git a/Resources/Audio/Effects/Footsteps/spurs2.ogg b/Resources/Audio/Effects/Footsteps/spurs2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a8fde70483373c5fa8df7bb800c59eb44069498a GIT binary patch literal 9024 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 R!@fDqXA}G$N|R#*{tuP^{CfZZ literal 0 HcmV?d00001 diff --git a/Resources/Audio/Effects/Footsteps/spurs3.ogg b/Resources/Audio/Effects/Footsteps/spurs3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..75215df9c1d8eccac9c13f06cf2c0e56b116b7a6 GIT binary patch literal 9676 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 ZejA8Wqgh>tAIJcko5iK;`}%rB{}1vAKlA_q literal 0 HcmV?d00001 diff --git a/Resources/Locale/en-US/accent/cowboy.ftl b/Resources/Locale/en-US/accent/cowboy.ftl new file mode 100644 index 00000000000..40877faf199 --- /dev/null +++ b/Resources/Locale/en-US/accent/cowboy.ftl @@ -0,0 +1,296 @@ +accent-cowboy-words-1 = alcohol +accent-cowboy-replacement-1 = firewater + +accent-cowboy-words-2 = alien +accent-cowboy-replacement-2 = space critter + +accent-cowboy-words-3 = aliens +accent-cowboy-replacement-3 = space critters + +accent-cowboy-words-4 = ambush +accent-cowboy-replacement-4 = bush whack + +accent-cowboy-words-5 = angry +accent-cowboy-replacement-5 = fit to be tied + +accent-cowboy-words-6 = animal +accent-cowboy-replacement-6 = critter + +accent-cowboy-words-7 = animals +accent-cowboy-replacement-7 = critters + +accent-cowboy-words-8 = arrest +accent-cowboy-replacement-8 = lasso + +accent-cowboy-words-9 = arrested +accent-cowboy-replacement-9 = lassoed + +accent-cowboy-words-10 = bomb +accent-cowboy-replacement-10 = dynamite + +accent-cowboy-words-11 = borg +accent-cowboy-replacement-11 = tin man + +accent-cowboy-words-12 = bye +accent-cowboy-replacement-12 = so long + +accent-cowboy-words-13 = cell +accent-cowboy-replacement-13 = pokey + +accent-cowboy-words-14 = chef +accent-cowboy-replacement-14 = cookie + +accent-cowboy-words-15 = coffee +accent-cowboy-replacement-15 = black water + +accent-cowboy-words-16 = confused +accent-cowboy-replacement-16 = stumped + +accent-cowboy-words-17 = cool +accent-cowboy-replacement-17 = slick + +accent-cowboy-words-18 = corpse +accent-cowboy-replacement-18 = dead meat + +accent-cowboy-words-19 = cow +accent-cowboy-replacement-19 = dogie + +accent-cowboy-words-20 = cows +accent-cowboy-replacement-20 = dogies + +accent-cowboy-words-21 = crazy +accent-cowboy-replacement-21 = cracked + +accent-cowboy-words-22 = cyborg +accent-cowboy-replacement-22 = tin man + +accent-cowboy-words-23 = dad +accent-cowboy-replacement-23 = pappy + +accent-cowboy-words-24 = drunk +accent-cowboy-replacement-24 = soaked + +accent-cowboy-words-25 = explosive +accent-cowboy-replacement-25 = dynamite + +accent-cowboy-words-26 = fast +accent-cowboy-replacement-26 = lickety split + +accent-cowboy-words-27 = fight +accent-cowboy-replacement-27 = scrap + +accent-cowboy-words-28 = food +accent-cowboy-replacement-28 = grub + +accent-cowboy-words-29 = friend +accent-cowboy-replacement-29 = partner + +accent-cowboy-words-30 = goodbye +accent-cowboy-replacement-30 = so long + +accent-cowboy-words-31 = greytide +accent-cowboy-replacement-31 = varmints + +accent-cowboy-words-32 = greytider +accent-cowboy-replacement-32 = varmint + +accent-cowboy-words-33 = greytiders +accent-cowboy-replacement-33 = varmints + +accent-cowboy-words-34 = group +accent-cowboy-replacement-34 = possee + +accent-cowboy-words-35 = guess +accent-cowboy-replacement-35 = reckon + +accent-cowboy-words-36 = gun +accent-cowboy-replacement-36 = big iron + +accent-cowboy-words-37 = handcuff +accent-cowboy-replacement-37 = hog tie + +accent-cowboy-words-38 = handcuffed +accent-cowboy-replacement-38 = hog tied + +accent-cowboy-words-39 = hell +accent-cowboy-replacement-39 = tarnation + +accent-cowboy-words-40 = hello +accent-cowboy-replacement-40 = howdy + +accent-cowboy-words-41 = hey +accent-cowboy-replacement-41 = howdy + +accent-cowboy-words-42 = hi +accent-cowboy-replacement-42 = howdy + +accent-cowboy-words-43 = hungry +accent-cowboy-replacement-43 = peckish + +accent-cowboy-words-44 = idiot +accent-cowboy-replacement-44 = dunderhead + +accent-cowboy-words-45 = intending +accent-cowboy-replacement-45 = fixing + +accent-cowboy-words-46 = jail +accent-cowboy-replacement-46 = pokey + +accent-cowboy-words-47 = liqour +accent-cowboy-replacement-47 = firewater + +accent-cowboy-words-48 = lot +accent-cowboy-replacement-48 = heap + +accent-cowboy-words-49 = lots +accent-cowboy-replacement-49 = heaps + +accent-cowboy-words-50 = mouth +accent-cowboy-replacement-50 = bazoo + +accent-cowboy-words-51 = nervous +accent-cowboy-replacement-51 = rattled + +accent-cowboy-words-52 = ninja +accent-cowboy-replacement-52 = bushwhacker + +accent-cowboy-words-53 = ninjas +accent-cowboy-replacement-53 = bushwhackers + +accent-cowboy-words-54 = noise +accent-cowboy-replacement-54 = ruckus + +accent-cowboy-words-55 = nukies +accent-cowboy-replacement-55 = outlaws + +accent-cowboy-words-56 = operator +accent-cowboy-replacement-56 = outlaw + +accent-cowboy-words-57 = operators +accent-cowboy-replacement-57 = outlaws + +accent-cowboy-words-58 = ops +accent-cowboy-replacement-58 = outlaws + +accent-cowboy-words-59 = pal +accent-cowboy-replacement-59 = partner + +accent-cowboy-words-60 = party +accent-cowboy-replacement-60 = shindig + +accent-cowboy-words-61 = passenger +accent-cowboy-replacement-61 = greenhorn + +accent-cowboy-words-62 = passengers +accent-cowboy-replacement-62 = greenhorns + +accent-cowboy-words-63 = planning +accent-cowboy-replacement-63 = fixing + +accent-cowboy-words-64 = please +accent-cowboy-replacement-64 = pray + +accent-cowboy-words-65 = punch +accent-cowboy-replacement-65 = lick + +accent-cowboy-words-66 = punched +accent-cowboy-replacement-66 = slogged + +accent-cowboy-words-67 = ran +accent-cowboy-replacement-67 = skedaddled + +accent-cowboy-words-68 = robbery +accent-cowboy-replacement-68 = stick up + +accent-cowboy-words-69 = run +accent-cowboy-replacement-69 = skedaddle + +accent-cowboy-words-70 = running +accent-cowboy-replacement-70 = skedaddling + +accent-cowboy-words-71 = scream +accent-cowboy-replacement-71 = holler + +accent-cowboy-words-72 = screamed +accent-cowboy-replacement-72 = hollered + +accent-cowboy-words-73 = screaming +accent-cowboy-replacement-73 = hollering + +accent-cowboy-words-74 = sec +accent-cowboy-replacement-74 = law + +accent-cowboy-words-75 = secoff +accent-cowboy-replacement-75 = deputy + +accent-cowboy-words-76 = security +accent-cowboy-replacement-76 = law + +accent-cowboy-words-77 = shitsec +accent-cowboy-replacement-77 = crooked law + +accent-cowboy-words-78 = shoe +accent-cowboy-replacement-78 = boot + +accent-cowboy-words-79 = shoes +accent-cowboy-replacement-79 = boots + +accent-cowboy-words-80 = steal +accent-cowboy-replacement-80 = rustle + +accent-cowboy-words-81 = stole +accent-cowboy-replacement-81 = rustled + +accent-cowboy-words-82 = stolen +accent-cowboy-replacement-82 = rustled + +accent-cowboy-words-83 = story +accent-cowboy-replacement-83 = yarn + +accent-cowboy-words-84 = thank you +accent-cowboy-replacement-84 = much obliged + +accent-cowboy-words-85 = thanks +accent-cowboy-replacement-85 = much obliged + +accent-cowboy-words-86 = thief +accent-cowboy-replacement-86 = rustler + +accent-cowboy-words-87 = thieves +accent-cowboy-replacement-87 = rustlers + +accent-cowboy-words-88 = think +accent-cowboy-replacement-88 = reckon + +accent-cowboy-words-89 = tired +accent-cowboy-replacement-89 = dragged out + +accent-cowboy-words-90 = toilet +accent-cowboy-replacement-90 = outhouse + +accent-cowboy-words-91 = totally +accent-cowboy-replacement-91 = plumb + +accent-cowboy-words-92 = traitor +accent-cowboy-replacement-92 = outlaw + +accent-cowboy-words-93 = traitors +accent-cowboy-replacement-93 = outlaws + +accent-cowboy-words-94 = very +accent-cowboy-replacement-94 = mighty + +accent-cowboy-words-95 = worried +accent-cowboy-replacement-95 = rattled + +accent-cowboy-words-96 = wow +accent-cowboy-replacement-96 = by gum + +accent-cowboy-words-97 = yell +accent-cowboy-replacement-97 = holler + +accent-cowboy-words-98 = yelled +accent-cowboy-replacement-98 = hollered + +accent-cowboy-words-99 = yelling +accent-cowboy-replacement-99 = hollering \ No newline at end of file diff --git a/Resources/Prototypes/Accents/word_replacements.yml b/Resources/Prototypes/Accents/word_replacements.yml index 4db911ad6d9..147aebb5c5d 100644 --- a/Resources/Prototypes/Accents/word_replacements.yml +++ b/Resources/Prototypes/Accents/word_replacements.yml @@ -263,6 +263,110 @@ accent-pirate-replaced-30: accent-pirate-replacement-30 accent-pirate-replaced-31: accent-pirate-replacement-31 accent-pirate-replaced-32: accent-pirate-replacement-32 + +- type: accent + id: cowboy + wordReplacements: + accent-cowboy-words-1: accent-cowboy-replacement-1 + accent-cowboy-words-2: accent-cowboy-replacement-2 + accent-cowboy-words-3: accent-cowboy-replacement-3 + accent-cowboy-words-4: accent-cowboy-replacement-4 + accent-cowboy-words-5: accent-cowboy-replacement-5 + accent-cowboy-words-6: accent-cowboy-replacement-6 + accent-cowboy-words-7: accent-cowboy-replacement-7 + accent-cowboy-words-8: accent-cowboy-replacement-8 + accent-cowboy-words-9: accent-cowboy-replacement-9 + accent-cowboy-words-10: accent-cowboy-replacement-10 + accent-cowboy-words-11: accent-cowboy-replacement-11 + accent-cowboy-words-12: accent-cowboy-replacement-12 + accent-cowboy-words-13: accent-cowboy-replacement-13 + accent-cowboy-words-14: accent-cowboy-replacement-14 + accent-cowboy-words-15: accent-cowboy-replacement-15 + accent-cowboy-words-16: accent-cowboy-replacement-16 + accent-cowboy-words-17: accent-cowboy-replacement-17 + accent-cowboy-words-18: accent-cowboy-replacement-18 + accent-cowboy-words-19: accent-cowboy-replacement-19 + accent-cowboy-words-20: accent-cowboy-replacement-20 + accent-cowboy-words-21: accent-cowboy-replacement-21 + accent-cowboy-words-22: accent-cowboy-replacement-22 + accent-cowboy-words-23: accent-cowboy-replacement-23 + accent-cowboy-words-24: accent-cowboy-replacement-24 + accent-cowboy-words-25: accent-cowboy-replacement-25 + accent-cowboy-words-26: accent-cowboy-replacement-26 + accent-cowboy-words-27: accent-cowboy-replacement-27 + accent-cowboy-words-28: accent-cowboy-replacement-28 + accent-cowboy-words-29: accent-cowboy-replacement-29 + accent-cowboy-words-30: accent-cowboy-replacement-30 + accent-cowboy-words-31: accent-cowboy-replacement-31 + accent-cowboy-words-32: accent-cowboy-replacement-32 + accent-cowboy-words-33: accent-cowboy-replacement-33 + accent-cowboy-words-34: accent-cowboy-replacement-34 + accent-cowboy-words-35: accent-cowboy-replacement-35 + accent-cowboy-words-36: accent-cowboy-replacement-36 + accent-cowboy-words-37: accent-cowboy-replacement-37 + accent-cowboy-words-38: accent-cowboy-replacement-38 + accent-cowboy-words-39: accent-cowboy-replacement-39 + accent-cowboy-words-40: accent-cowboy-replacement-40 + accent-cowboy-words-41: accent-cowboy-replacement-41 + accent-cowboy-words-42: accent-cowboy-replacement-42 + accent-cowboy-words-43: accent-cowboy-replacement-43 + accent-cowboy-words-44: accent-cowboy-replacement-44 + accent-cowboy-words-45: accent-cowboy-replacement-45 + accent-cowboy-words-46: accent-cowboy-replacement-46 + accent-cowboy-words-47: accent-cowboy-replacement-47 + accent-cowboy-words-48: accent-cowboy-replacement-48 + accent-cowboy-words-49: accent-cowboy-replacement-49 + accent-cowboy-words-50: accent-cowboy-replacement-50 + accent-cowboy-words-51: accent-cowboy-replacement-51 + accent-cowboy-words-52: accent-cowboy-replacement-52 + accent-cowboy-words-53: accent-cowboy-replacement-53 + accent-cowboy-words-54: accent-cowboy-replacement-54 + accent-cowboy-words-55: accent-cowboy-replacement-55 + accent-cowboy-words-56: accent-cowboy-replacement-56 + accent-cowboy-words-57: accent-cowboy-replacement-57 + accent-cowboy-words-58: accent-cowboy-replacement-58 + accent-cowboy-words-59: accent-cowboy-replacement-59 + accent-cowboy-words-60: accent-cowboy-replacement-60 + accent-cowboy-words-61: accent-cowboy-replacement-61 + accent-cowboy-words-62: accent-cowboy-replacement-62 + accent-cowboy-words-63: accent-cowboy-replacement-63 + accent-cowboy-words-64: accent-cowboy-replacement-64 + accent-cowboy-words-65: accent-cowboy-replacement-65 + accent-cowboy-words-66: accent-cowboy-replacement-66 + accent-cowboy-words-67: accent-cowboy-replacement-67 + accent-cowboy-words-68: accent-cowboy-replacement-68 + accent-cowboy-words-69: accent-cowboy-replacement-69 + accent-cowboy-words-70: accent-cowboy-replacement-70 + accent-cowboy-words-71: accent-cowboy-replacement-71 + accent-cowboy-words-72: accent-cowboy-replacement-72 + accent-cowboy-words-73: accent-cowboy-replacement-73 + accent-cowboy-words-74: accent-cowboy-replacement-74 + accent-cowboy-words-75: accent-cowboy-replacement-75 + accent-cowboy-words-76: accent-cowboy-replacement-76 + accent-cowboy-words-77: accent-cowboy-replacement-77 + accent-cowboy-words-78: accent-cowboy-replacement-78 + accent-cowboy-words-79: accent-cowboy-replacement-79 + accent-cowboy-words-80: accent-cowboy-replacement-80 + accent-cowboy-words-81: accent-cowboy-replacement-81 + accent-cowboy-words-82: accent-cowboy-replacement-82 + accent-cowboy-words-83: accent-cowboy-replacement-83 + accent-cowboy-words-84: accent-cowboy-replacement-84 + accent-cowboy-words-85: accent-cowboy-replacement-85 + accent-cowboy-words-86: accent-cowboy-replacement-86 + accent-cowboy-words-87: accent-cowboy-replacement-87 + accent-cowboy-words-88: accent-cowboy-replacement-88 + accent-cowboy-words-89: accent-cowboy-replacement-89 + accent-cowboy-words-90: accent-cowboy-replacement-90 + accent-cowboy-words-91: accent-cowboy-replacement-91 + accent-cowboy-words-92: accent-cowboy-replacement-92 + accent-cowboy-words-93: accent-cowboy-replacement-93 + accent-cowboy-words-94: accent-cowboy-replacement-94 + accent-cowboy-words-95: accent-cowboy-replacement-95 + accent-cowboy-words-96: accent-cowboy-replacement-96 + accent-cowboy-words-97: accent-cowboy-replacement-97 + accent-cowboy-words-98: accent-cowboy-replacement-98 + accent-cowboy-words-99: accent-cowboy-replacement-99 + # For the chat sanitization system - type: accent diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml index 859eabe5822..6287710182a 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml @@ -33,7 +33,7 @@ sprite: Objects/Specific/Service/vending_machine_restock.rsi state: base product: CrateVendingMachineRestockClothesFilled - cost: 7150 #DeltaV + cost: 7250 #DeltaV category: Service group: market diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/secdrobe.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/secdrobe.yml index 3514b48d226..cb0c10c129e 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/secdrobe.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/secdrobe.yml @@ -25,3 +25,5 @@ ClothingEyesBlindfold: 1 ClothingShoesBootsCombat: 1 ClothingShoesBootsWinterSec: 2 + ClothingShoesBootsCowboyBlack: 1 + ClothingHeadHatCowboyBlack: 1 \ No newline at end of file diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml index 5aa23ad8bb6..94f38aeabaf 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml @@ -79,8 +79,17 @@ ClothingOuterSuitCarp: 2 # DeltaV - Move carp suit out of syndicate uplink into the AutoDrobe ClothingShoesBootsWinterClown: 2 #Delta V: Add departmental winter boots ClothingShoesBootsWinterMime: 2 #Delta V: Add departmental winter boots + ClothingHeadHatCowboyBrown: 1 + ClothingHeadHatCowboyBlack: 1 + ClothingHeadHatCowboyWhite: 1 + ClothingHeadHatCowboyGrey: 1 + ClothingShoesBootsCowboyBrown: 1 + ClothingShoesBootsCowboyBlack: 1 + ClothingShoesBootsCowboyWhite: 1 emaggedInventory: ClothingShoesBling: 1 + ClothingShoesBootsCowboyFancy: 1 ClothingOuterDogi: 1 ClothingMaskSexyClown: 1 ClothingMaskSexyMime: 1 + ClothingHeadHatCowboyBountyHunter: 1 diff --git a/Resources/Prototypes/Entities/Clothing/Head/hats.yml b/Resources/Prototypes/Entities/Clothing/Head/hats.yml index 6f2aa11f78b..1e38246bd06 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/hats.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/hats.yml @@ -915,3 +915,67 @@ sprite: Clothing/Head/Hats/brownflatcap.rsi - type: Clothing sprite: Clothing/Head/Hats/brownflatcap.rsi + +- type: entity + parent: ClothingHeadBase + id: ClothingHeadHatCowboyBrown + name: brown cowboy hat + description: This hat ain't big enough for the both of us. + components: + - type: Sprite + sprite: Clothing/Head/Hats/cowboyhatbrown.rsi + - type: Clothing + sprite: Clothing/Head/Hats/cowboyhatbrown.rsi + - type: AddAccentClothing + accent: ReplacementAccent + replacement: cowboy + +- type: entity + parent: ClothingHeadHatCowboyBrown + id: ClothingHeadHatCowboyBlack + name: black cowboy hat + components: + - type: Sprite + sprite: Clothing/Head/Hats/cowboyhatblack.rsi + - type: Clothing + sprite: Clothing/Head/Hats/cowboyhatblack.rsi + +- type: entity + parent: ClothingHeadHatCowboyBrown + id: ClothingHeadHatCowboyGrey + name: grey cowboy hat + components: + - type: Sprite + sprite: Clothing/Head/Hats/cowboyhatgrey.rsi + - type: Clothing + sprite: Clothing/Head/Hats/cowboyhatgrey.rsi + +- type: entity + parent: ClothingHeadHatCowboyBrown + id: ClothingHeadHatCowboyRed + name: red cowboy hat + components: + - type: Sprite + sprite: Clothing/Head/Hats/cowboyhatred.rsi + - type: Clothing + sprite: Clothing/Head/Hats/cowboyhatred.rsi + +- type: entity + parent: ClothingHeadHatCowboyBrown + id: ClothingHeadHatCowboyWhite + name: white cowboy hat + components: + - type: Sprite + sprite: Clothing/Head/Hats/cowboyhatwhite.rsi + - type: Clothing + sprite: Clothing/Head/Hats/cowboyhatwhite.rsi + +- type: entity + parent: ClothingHeadHatCowboyBrown + id: ClothingHeadHatCowboyBountyHunter + name: bounty hunter cowboy hat + components: + - type: Sprite + sprite: Clothing/Head/Hats/cowboyhatbountyhunter.rsi + - type: Clothing + sprite: Clothing/Head/Hats/cowboyhatbountyhunter.rsi \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/boots.yml b/Resources/Prototypes/Entities/Clothing/Shoes/boots.yml index 262e1bd3310..241fc45352a 100644 --- a/Resources/Prototypes/Entities/Clothing/Shoes/boots.yml +++ b/Resources/Prototypes/Entities/Clothing/Shoes/boots.yml @@ -188,3 +188,47 @@ - type: Construction graph: WebObjects node: boots + +- type: entity + parent: ClothingShoesMilitaryBase + id: ClothingShoesBootsCowboyBrown + name: brown cowboy boots + description: They got spurs that jingle and/or jangle. + components: + - type: Sprite + sprite: Clothing/Shoes/Boots/cowboybootsbrown.rsi + - type: Clothing + sprite: Clothing/Shoes/Boots/cowboybootsbrown.rsi + - type: FootstepModifier + footstepSoundCollection: + collection: FootstepSpurs + +- type: entity + parent: ClothingShoesBootsCowboyBrown + id: ClothingShoesBootsCowboyBlack + name: black cowboy boots + components: + - type: Sprite + sprite: Clothing/Shoes/Boots/cowboybootsblack.rsi + - type: Clothing + sprite: Clothing/Shoes/Boots/cowboybootsblack.rsi + +- type: entity + parent: ClothingShoesBootsCowboyBrown + id: ClothingShoesBootsCowboyWhite + name: white cowboy boots + components: + - type: Sprite + sprite: Clothing/Shoes/Boots/cowboybootswhite.rsi + - type: Clothing + sprite: Clothing/Shoes/Boots/cowboybootswhite.rsi + +- type: entity + parent: ClothingShoesBootsCowboyBrown + id: ClothingShoesBootsCowboyFancy + name: fancy cowboy boots + components: + - type: Sprite + sprite: Clothing/Shoes/Boots/cowboybootsfancy.rsi + - type: Clothing + sprite: Clothing/Shoes/Boots/cowboybootsfancy.rsi \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml index 336f0639b36..7a9014f83d5 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml @@ -63,6 +63,8 @@ - ClothingShoesCult - ClothingUniformJumpsuitAncient - ClothingUniformJumpsuitPirate + - ClothingShoesBootsCowboyFancy + - ClothingHeadHatCowboyBountyHunter rareChance: 0.01 prototypes: - Lighter @@ -123,6 +125,7 @@ - ClothingShoesBootsWork - ClothingShoesTourist - ClothingUniformJumpsuitLoungewear + - ClothingHeadHatCowboyRed chance: 0.6 offset: 0.0 diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml index 2383939ba14..fbe640aded9 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml @@ -90,6 +90,7 @@ - ToySiobhan # DeltaV Toy, see Resources/Prototypes/DeltaV/Entities/Objects/Fun/toys.yml - PlushiePenguin - PlushieHuman + - ClothingHeadHatCowboyRed - type: WiresPanel - type: Wires layoutId: Arcade diff --git a/Resources/Prototypes/SoundCollections/footsteps.yml b/Resources/Prototypes/SoundCollections/footsteps.yml index e48eeb6450a..bd51e6b4458 100644 --- a/Resources/Prototypes/SoundCollections/footsteps.yml +++ b/Resources/Prototypes/SoundCollections/footsteps.yml @@ -193,4 +193,11 @@ - type: soundCollection id: FootstepSticky files: - - /Audio/Effects/Footsteps/meatslap.ogg \ No newline at end of file + - /Audio/Effects/Footsteps/meatslap.ogg + +- type: soundCollection + id: FootstepSpurs + files: + - /Audio/Effects/Footsteps/spurs1.ogg + - /Audio/Effects/Footsteps/spurs2.ogg + - /Audio/Effects/Footsteps/spurs3.ogg diff --git a/Resources/Textures/Clothing/Head/Hats/cowboyhatblack.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Hats/cowboyhatblack.rsi/equipped-HELMET.png new file mode 100644 index 0000000000000000000000000000000000000000..f668f9031f20582a15100311c56a8d70ef6f5c94 GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%z)jVAsLn`LH zz2%+NY9P_}aQ{~3hZP4Ky#q>Ktc#hnyJ*D@uJsB{PkOYJrevL2DD%s1b3&d<;g`Qk z|L?TFJD_uVN^0b#?|V&r7u)u)v*?@pymHgJ)l*Ve?)|s?+yb4`SN6%ePW-jvzw))^C=*Y!cdk-1%DR)I^CRrLmFIT+3sXr=<#>-jpKI_SV(!vPx*^+&aPK{0aIz z&YVpN+5L|-`W~-P@jUXqR-~&dB~HIr z{c7=M{}AnVf7{!)ymJ#b**(0Z`#06iA7Ki^yGka_6=IEGmCCMQU+HVYXzG5S@irHO@wnVFTvXi3bpjIeOj+MvlW^Yn?M2boNoL}xQC zIO@aGbH~PJPfg7qrU+4kg^VW4o9^^!^}Z8#<7v1mTan_(l literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/cowboyhatblack.rsi/inhand-left.png b/Resources/Textures/Clothing/Head/Hats/cowboyhatblack.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..90cac5a0fe10466ae3a9c2cb475c7909eaeacb42 GIT binary patch literal 366 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zH9TD$Ln`LH zz3G_MVj#i#;JTVZM+KMYoo5X9>J@i=5s2I&tjziHRN}G=LC5cxIo;nLB+mcW^U)(l z7Z~_5e~)LIWU>+i&*1{C?U}P8rl~q{NE{FRB5Pkgoy+K$%X`~B-}%q?J-bpW%b0N6 zjKLu^wB5K*VCK7jAH6g!o-;5+PE%}QSo?LM=*7}lovue^_UDbSm9_?P)!y%3&!#K+ zY>xB1=L`+0kqf?_e|&peFGIrG)~#Wmw(e84YA{}wxvOM-y=w{3ki^Jow@W!3js6KG z1>Zm4SndA(fBcRo<~ypt_Nyzw!J-n0f{|_4N_dMqB$F}{i*NQyxJ-FWMXmLQnXb>2l!QOBCJMBBO!1z4 Q5Ez;ap00i_>zopr030@_MF0Q* literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/cowboyhatblack.rsi/meta.json b/Resources/Textures/Clothing/Head/Hats/cowboyhatblack.rsi/meta.json new file mode 100644 index 00000000000..ca18482c238 --- /dev/null +++ b/Resources/Textures/Clothing/Head/Hats/cowboyhatblack.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "taken from tgstation at https://github.com/tgstation/tgstation/commit/8703eac50de6379c26f7eadb47b4f016854d1dcd", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HELMET", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/Head/Hats/cowboyhatbountyhunter.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Hats/cowboyhatbountyhunter.rsi/equipped-HELMET.png new file mode 100644 index 0000000000000000000000000000000000000000..9e72e0c1d4ebe4f2c18e8c80e005d339bfb7b4be GIT binary patch literal 392 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zojhF}Ln`LH zy|vNruz|p_kIafHI(Hx4?CAaem~qB0hCTAqN}H#9xFvB;?hX$6Fw*s0bkFSe%KL1DCTk&3XWnIO@?cYD1PB*`<^xeOF+Ebq(uh5^Gs+V_( zZxx>w`}N*=tNB5bBp(0!YteW0^|oj7S!eULN;12@{HVDP)XfF0KO0>5%Fn%(SDL^1m+q4_o7z70G_=0#s}=w7%i`2qzuo^u zLrPCY9xs{6H~scHncnon1~U#vKbgH@%i~Ws8zhoTWqqw5EHAd4#-wx8bf=QKm3+Xf it=xW7xnUN6(63<#`8lmvvVOT1NX*mK&t;ucLK6VTBC(PH literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/cowboyhatbountyhunter.rsi/icon.png b/Resources/Textures/Clothing/Head/Hats/cowboyhatbountyhunter.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8bc74102592d28e4783bf1669a51fdbf9bbc4808 GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$Dv*8>L*NJ>iD+uOUkx*8f9 zs;a8~oWSs*i(%&N0wbUr#*!evUJ@i=5s2I&tjziHRN}G=LC5cxIo;nLB+mcW^U)(l z7Z~_5e~)LIWU>+i&*1{C?U}P8rl~q{NE{FRB5Pkgoy+K$%X`~B-}%q?J-bpW%b0N6 zjKLu^wB5K*VCK7jAH6g!o-;5+PE%}QSo?LM=*7}lovue^_UDbSm9_?P)!y%3&!#K+ zY>xB1=L`+0kqf?_e|&peFGIrG)~#Wmw(e84YA{}wxvOM-y=w{3ki^Jow@W!3js6KG z1>Zm4SndA(fBcRo<~ypt_Nyzw!J-n0f{|_4N_dMqB$F}{i*NQyxJ-FWMXmLQnXb>2l!QOBCJMBBO!1z4 Q5Ez;ap00i_>zopr030@_MF0Q* literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/cowboyhatbountyhunter.rsi/meta.json b/Resources/Textures/Clothing/Head/Hats/cowboyhatbountyhunter.rsi/meta.json new file mode 100644 index 00000000000..ca18482c238 --- /dev/null +++ b/Resources/Textures/Clothing/Head/Hats/cowboyhatbountyhunter.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "taken from tgstation at https://github.com/tgstation/tgstation/commit/8703eac50de6379c26f7eadb47b4f016854d1dcd", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HELMET", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/Head/Hats/cowboyhatbrown.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Hats/cowboyhatbrown.rsi/equipped-HELMET.png new file mode 100644 index 0000000000000000000000000000000000000000..05c2cd5843df1ed5d3bbd7d5667dc3b67a8ed996 GIT binary patch literal 399 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zJw06#dAbLcY<8B4dbh*R54>*r#S1=2@wybN}mUTJI zd)BgJtrD&)mN-AU|2>j7B~9+h_BrgI_D8C1zTwEp_?jP^CxWfnEa9_|->xeR;i1m4?bZ4rKc+td8pUxT>n<_Sdy7cocpO+E4c0(acL z{=dtYg!?VM%za|FCBvcdeej@F3P$+DNg(DXS?$4t=lSgR(VV9f6kw#uY?Tt zPyU$v=yxB(hg93fEyc^NOjas0q}&odVPsxt&!AS$qHuej!?c}l!oS}1%5AD%{(oJJ fAQJe=J&*C}zWG_#SeKs$hA@MttDnm{r-UW|@?WP` literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/cowboyhatbrown.rsi/icon.png b/Resources/Textures/Clothing/Head/Hats/cowboyhatbrown.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..058886bec913610ba3e5e686d7356ef8b637b4f0 GIT binary patch literal 600 zcmV-e0;m0nP)B+)X1WCZu%^)TKWy5Z_pyNT?>&C5d@*YMHmr? z3tc#k(^bcD?m6duTTCN1jpNuKrp0}Bmvhd2f9HK4o?{jl7wM*KSF2|L89)Y*0sIdD z@p(3XdiA3B^~<^a)7Gcw<_*Bi)TEyLZYR^}Tk!e$vuJi<#XlXpiHIN}fQ|5K*prCe zO3K>WM*tp=4+HS#-RhYT9gkpkVZ}cj8zv!7QS&5Gff6~kQswLZAw5##!RQbG2cZXm ziSawf-S}ewfQ{k~TYCwK4-_5jq)NpFs?`IkX^ovynUNdUSXx?Uw<`EF<3TPm8o*0Yx06;aVVEgk#h4y!B3D77!Hgpw$vMaE*zE0{q##(R= zV+^W_h~R^O2x5fyn`H)m{KulG!jtXfA$I2{FlLspVR;t`A=3f~kSG_%z0}nZmhp zpcCC293U49F^UNuaYyyBbpkLwH*cD|a4B~LeSM5vsZu_496F(<7Go@NWGTd!{uuI+ z5aGBO2lBZbaimxqaNhCu!xwJd9qnxe&@zacP3T?iH+lif>)Xc{J8e(fBs?ob&eC6v m;(w*CzlIq=29N=C9pF2hP5@@>Frrcb0000+2k|6>N6wnl{2kgVB>p7fy<<$$^ZVX zXR-6b16P9~z|O1HeKd)HyFNg-hiyN)gndmSEoUVQ(&=StmoFI(ODRVT6c zdEDKpYX4(y&s*7SvBtzsdR0Y4R#=!;R7!;Y2lce@gv&1~Zn)>@`}jLVw(i;+Z zsL?+0wBu{**v;Nn{r}(e@_cRW*Z;pCF+v>3&|t6g>POtJgS8u0J>Hv>r}MfZ-@oBY z;PLs#vdoggPx$FiAu~RCt{2*-cJ^Kp4jHM?!)oKw*O>h6A|t6y34(ES{%JmmbC*z;x41n@XZp zA}&mk^n(GKRv`c1YQkj5`%Y$N^GE;y000000I)|A1$hz$`G418G8xDDWE|J7)2f;* zH|#l+Y&8uAS+|mBNv)>1?INF_oT3Rf8s#S70L?`ECE-dBziv zX11oYRWX*nPF>SkRUVzqJ5biO`+qEBBipb3keUYo000000002>^(8W|QY#xQ>sw@Q z(kSKWQ)FIO;}anLMdo+6ez6gK)oKHz;Y8-fczmBBMdpp~?9d|fRz(w;1HeH10A9jo U*oAEqrT_o{07*qoM6N<$f?rRmf&c&j literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/cowboyhatbrown.rsi/meta.json b/Resources/Textures/Clothing/Head/Hats/cowboyhatbrown.rsi/meta.json new file mode 100644 index 00000000000..ca18482c238 --- /dev/null +++ b/Resources/Textures/Clothing/Head/Hats/cowboyhatbrown.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "taken from tgstation at https://github.com/tgstation/tgstation/commit/8703eac50de6379c26f7eadb47b4f016854d1dcd", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HELMET", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/Head/Hats/cowboyhatgrey.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Hats/cowboyhatgrey.rsi/equipped-HELMET.png new file mode 100644 index 0000000000000000000000000000000000000000..f8dac32e474dfe3c079bdc967b30bb3caaab46d5 GIT binary patch literal 436 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%z^E_P~Ln`LH zy|uCHkb_9;!^yr5+^ad17^}If?;k&QNGsnUBQtkltNs(~8=hLM(t=5I){2@OYNG|9Wn7z4i0YJJ(*9uDzc9waWJS^F7x8Pp3{aJhm)T%hT&}NTE#h zb*7jjg*8+2dkW9-clpinQ7hYg^F-9@#~)XycwWgdo2t^8{Vh1}bNk_iUv2yoC9(`8 zME)spdtl1<-+MRdOg3EhCH{~^a_#-_tx=)NFQ0s>FUGz6x!o4VUN`4` z@3VK`efDl^l>P)`&!``ofK8FIkE5W{JUY1l{o%Zhg@A@LY z1!rQOw{CZx5_rbCXzs1YleXM``z~(&*|g_}x%jk!$Z!h$3UsXT-G-&yB z{mU69nbP0l+XkKX-mnj literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/cowboyhatgrey.rsi/icon.png b/Resources/Textures/Clothing/Head/Hats/cowboyhatgrey.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cad5acb6b28ba3ef62e9e07042a1e5e73e2ed602 GIT binary patch literal 552 zcmV+@0@wYCP)X?PDRUVsNdQ29xysHtfv$QId_B!C3?HYY`P ztz{#yiL|2e-yG>!GxO`48Qa=yHshAkZ(2PukQhh|0I9DAP9_ue@7-W9(5}sMHG$!9 zXxO&>sW`y7`%Ai-K&@8u0Up{9nBPqD`8>zt5yx?u&*#{-t@{0bY!X)!5D}V<21*nn zf{29A+U@qW>Eam}kH;Ze5y1}vlu`u0Par(6Rb&fn+g7bsi_vJLL;UWRsw$H0`7ny<-}g@_ z1VMo3d8}5ei}@qBKvaNIg75q6_j{C5?6y1B>ovNrQ!14x6bk6NPBxnbz;PT7heKHW z(m+NMcz*r`K($)^SV7m*L q#xn3fb@R`0VjwY)7)T7<+`v0CZts&EY=|@f0000>$AU;JJn}*MteuM|^8U-#I*${votwN=DTDQ?knAaW3Xi-jahmsB?DX!_DGb7b zjxxt*l;!_AH!)T6k_jurm)icjdF8gA{d`4yn;9$KujlRNXiJ{>dCXYGW<1dn~NV?T(0sJ~6ERHY$1}}rBtDnm{r-UW|FdnD~ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/cowboyhatgrey.rsi/inhand-right.png b/Resources/Textures/Clothing/Head/Hats/cowboyhatgrey.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..68dd2aafeb06deb792beaae2f3b735374550b2f2 GIT binary patch literal 407 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%z13g_FLn`LH zy=9o!Y#_nJBe&#@gy+o)!TCrw3a$Y!wUgQt>ph_#U}Q=k;R?x6n`qhV!2V+7vID$gcTX zniHtV^6j^6i$KOKwrjW8r~Q$bzI#({v`Zih!;05ZvDYo1_n9#qm@m7*r|Ui)KT|M&CG1+Q7BAG^8pay7$`yq2J>iRu64&aHQtq++e9x@1a#*TcuJKYWXC z6-0oGo7Sirl^3!pUtgnZByX(!EGjw0F6|p1L!HuR1&(vQ5vylQG3eME&Cj~@pK*V# rrqTS`wC!Ru&)YHeoayW^d%`jA?qOp&|KR^xU-|xmCLcEAtJhqU0{pgN2WN1wOe!b9ewEYm6@itBY79PY?9;N|_L?(YiM!3dVNUb2B+iDln_peve_XIt zgke*7sNOuq@b*U*PwXe@bqo5>%w*8I{+;_@0yBN;yDR|mRy|j!)W7ncZRxU{s}jB zZWOD%uFUZA8|RXl(yI^D*)mOto9{4dXD8R2a(DUd4S^@7!gOAW|G>vt+rSyF!Mzz6 OlnkD(elF{r5}E)^=bOR+ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/cowboyhatred.rsi/icon.png b/Resources/Textures/Clothing/Head/Hats/cowboyhatred.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d35648f52f1bd3b61b7784674fa9c713e64f4789 GIT binary patch literal 651 zcmV;60(AX}P)vqOFTBkq%NtT#C4en=g|F3F74c;36*K=HTckRpKCR(Md## zkhOMk&_b0`t-(U8wP{}NevdJlm$vc3Ao{|1nb^PWu3b zY|cxHtoJ((o>MwEv>%MK{iG?E;J)Xyk!jS7y zQA1Vh6Q~(OpinUe1uPURrVJxBkg^j9LbI1Z4S^~FN???l)}K%n1&l)G>SbKlAr*rn zQUg8!ifIryr%$mlGfSv-_1BDI5Jcc?_BsHolT*0Be5JyLCy)K0MSf|u5tUxO9{lhu z|MPe<)%f9*-fLHO^k1Ev+WelcR5=#;iI?ZUzLi&=DV%n zZLICfs9Agq&>BE`aKIf-A7~q>?aQbM(I~F_jtmX3u&7JRE4!M;t^oc4SyPx$I7vi7RCt{2*}qD|P!z}UpVFb!sW>zU{-H`iT=E2Y2j9WPx9KKG7QqMb8GHg4 zw>F3c$s$=y$WXXW(bifp^`!OU_cMh%oZKAlxfy;E0000000022D2_rGN1?N-Hyrfb zaL_ZW_nmF4LU9zj(RiZKcrv%PYQ5{zz)4b?PjwR>Hr9kKiz3y>2RkiwJ8el)R+LKf zsZNgfb#edj=?Tb+a&82CU^Y+HJus{8{BMHk=Dyzg=eKv-JvjQ)4QSNs^HZb$Z~y=R00000 z0R9n+INsZA&?=7iGPSXcgN95C8xG07*qoM6N<$f&hK2kN^Mx literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/cowboyhatred.rsi/inhand-right.png b/Resources/Textures/Clothing/Head/Hats/cowboyhatred.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..54abcc26f7a8d1363a41f9dd5cab63f08736cc52 GIT binary patch literal 378 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zO*~y3Ln`LH zy}8%xaDc?IkM1u6UR_z~D6r7WF{X%hC!79(i${0ARPzv9f1vt>=#Cw#3r!Rvy~L!A zMEZhNT|aAHQ~6gPY|$=!&-{sRn>!QGcpzxV-_e&FbKI;x)_vyBoTO))J)c_jcbjeI zt*+BJ&wuq<`-h5DNzX2`Xxp35r@pc|b-O_Jc14}W>y!l_Gc-KACWl;1TYb9Q_^xhT z(RsOBf4^Q~$-g-L>&um@o>djRMcJ}b?$+2yY583`|2pIIy&V_sPr98TGi9ExOymCr zUwAtvm*lhjT2|0ke!p?ewzL2JMa?$F>7M=k_Uyf=`Lp!5#_2}?KFthqD8qvTyM$(n zubj(UrfZ}hto`(5P)c0r;*tvSnd!}!*D1;67p?H0SowD5+vt?I-5E;7O2rJepBQb9 VwHl`0-FgaSh^MQc%Q~loCID(+qmlps literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/cowboyhatred.rsi/meta.json b/Resources/Textures/Clothing/Head/Hats/cowboyhatred.rsi/meta.json new file mode 100644 index 00000000000..ca18482c238 --- /dev/null +++ b/Resources/Textures/Clothing/Head/Hats/cowboyhatred.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "taken from tgstation at https://github.com/tgstation/tgstation/commit/8703eac50de6379c26f7eadb47b4f016854d1dcd", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HELMET", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/Head/Hats/cowboyhatwhite.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Hats/cowboyhatwhite.rsi/equipped-HELMET.png new file mode 100644 index 0000000000000000000000000000000000000000..238181eaa71f2db397e340cd895f40d96e5a3279 GIT binary patch literal 415 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zBRyRlLn`LH zy=B{V$U)-R$9geA)x826u0(UpI}}|ZlmAeYX`1FT;ft5lnnHy{IQK+L_N*4r` z_gDRTkhD?b&?g)H-lK(QYV7onsZZ|w{^HQO*mLs74fnklPp+Id{hGN{uh#SMdkoKG z3Ty7u{GoIMg^R?=3#=TqW zrnArH{VTit^2ZW9tzsU6d>Whb^rN8{2c6A`YiTV$`RXeBe%j&;>5*XqPp00i_>zopr0PN(* AxBvhE literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/cowboyhatwhite.rsi/icon.png b/Resources/Textures/Clothing/Head/Hats/cowboyhatwhite.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a8d059e4cde440d993fc1d8778685e7d3e1b7469 GIT binary patch literal 474 zcmV<00VV#4P)lq`^YiiX@!sCw-rwKc+}xCula!Q{=jZ3@>gu4N zpplW0;Nalndal(B$Og;o;%N#>SSHmx_vt#KgqM#>UXl(AL)0($Uh* z&CQF7ij0ek%gf5n&d$-%(bCe=(a_P2jg5?qjERYeiiwFr`w=|=0004WQchCeCj>eOZEv>0NGZa;FL=cCL zs~Ypg*B#z+W%~g!UCA7+H(Md~2G85=4@duW_Al3)Wo7^J?uB_|m;e0C6Y7!?Nz&P{ QYybcN07*qoM6N<$g1~_WZvX%Q literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/cowboyhatwhite.rsi/inhand-left.png b/Resources/Textures/Clothing/Head/Hats/cowboyhatwhite.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..d49501602d097cd83110c9a7c219591ec3c69727 GIT binary patch literal 352 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zr9536Ln`LH zy|uBo#Xx}d!h2>#rgBGz;wjGJdCg222UsUqJ0zG$SLXX~-*tfJ#hSnROihBxy}ln9 zJ7D0&WQns$_o^8i*1h(-KKFTKQqPOua@V3Hl0)vB{=B61WbbqVCMOR2c~7s*TIQM5 zbN+W~p2yvD86H^o-TyAT(|&@;UWSu1E#ge&_Rn^ciGL!= n@Z#vlqk0SnEar8**uwrkxFh!PbP0l+XkK5G0si literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/cowboyhatwhite.rsi/inhand-right.png b/Resources/Textures/Clothing/Head/Hats/cowboyhatwhite.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..edda641a77fe24574657fbe7e81a07322be5c0db GIT binary patch literal 357 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%z-Ln`LH zy?HRV#Xx}d!utjtz7j`f5jV?{hh`Z~&D;;{*i{@R3(vlrBA%n<8uxs^un}A3nvMGM z3QAD0=>L%xzc2T+8BBbI|D25v3KbRXdEBu{=i;{93s&}haqnE28#)|ZFDdChYeWPetxP~`99PoAXIc)E;ECOYh&fS!0V+!b1!`V+n=<19d}fGrP)D= z=G4f9wXKFHul!NiawDCu|G>GZ>aYJ#TEAroZC!P5UUBgatKYT-`ddH$k6zwdv;S+c z*1Qe`I8^!Gbn6z2umH1)_p(Z#B?2|iTf076xX7B}N7tEN!;@~$7V70POz=;slj^sh r9GoI|cmGb;XVb;bo|x02Av~YyMt545-Lnb6aAWXv^>bP0l+XkKQ6-iZ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Hats/cowboyhatwhite.rsi/meta.json b/Resources/Textures/Clothing/Head/Hats/cowboyhatwhite.rsi/meta.json new file mode 100644 index 00000000000..ca18482c238 --- /dev/null +++ b/Resources/Textures/Clothing/Head/Hats/cowboyhatwhite.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "taken from tgstation at https://github.com/tgstation/tgstation/commit/8703eac50de6379c26f7eadb47b4f016854d1dcd", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HELMET", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/Shoes/Boots/cowboybootsblack.rsi/equipped-FEET.png b/Resources/Textures/Clothing/Shoes/Boots/cowboybootsblack.rsi/equipped-FEET.png new file mode 100644 index 0000000000000000000000000000000000000000..f4c07acb2399701b6737d2db7ca2d1831917b4c5 GIT binary patch literal 450 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zYdl>XLn`LH zy=Cuz$U%bb1G{?vms1HG|IIj<3Wz_O-I|J+JhV7X+|B1EhN3lK2 z${EEz&z$R{X0Y?-?=w%>)XaD6+q3G8?Ss#z;je5g?yqLhv+)gn;UTZn)c57OuvMvG zOyxF3y-Tgvw)Gp;OXk;vd$@?2>{`$#uNYm literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Shoes/Boots/cowboybootsblack.rsi/icon.png b/Resources/Textures/Clothing/Shoes/Boots/cowboybootsblack.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..10fdd334bf70d32fb6d9d702882a87320c7adbd7 GIT binary patch literal 488 zcmVP)gH|C+9^&Wr1-^Pe{p&K>*VHmB=f3N|7FpT&%pEt(kv&_Q}-~X#xok9q3bY!3cMV=Q82A~4Pv1KtB zXe3Fx9|Pr$=Gb<{RGY9kSXA!^2Rh3*?rxyo_~z{m?#x9>$?cz%pPimG zxC#`8aft5+SeCgp1KPIc<%-ASaTU1RnOm*6mM@f?3x$PR^#*Gi(RmV zd86>Lmvj0)oGV7)@^ zU)}lL)|>qIshu>}I{-BBdSZ);w%I$?$VL_Ig8J&>Eu{xiW|`L>x4OTA!K!AKUjXNw zwXQ2z-aX=$-Nm8S9RF^z@4wcQ&gXx)yXT* zM{@KFl{uc$uik!8(Vie)T(d0xQMo733&i(_>ALI|T>r(@ zX-iRD+*-bn_a~=+%wNFGkTXyG$Gn^A|CtW_nQ?Bbm$@Y{k{CQ){an^LB{Ts5$~4u2 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Shoes/Boots/cowboybootsbrown.rsi/icon.png b/Resources/Textures/Clothing/Shoes/Boots/cowboybootsbrown.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..86dc42b539d64da8affd196735a93b3c5c6a594e GIT binary patch literal 509 zcmVbfbzyN7gwzr z{!P9M%_GD$0C0Y~3*Z`BKaQafVk99Ov!Ll8$o4;rH+zkM%i3Oyx2!LtaA?s!+w;v{v zu@bdlT1H2W#piC|t%_}+_jeRnhxJ)g71Zwi%>FkU08qR4eEy*X*522fho4ICRk0Ec zAwc!RBC>8Wd2|B|K-Nua>qUh33k-%2^D*GPYIUjPGg&uj-}V7GX>9tu*?Jkk;!=)3 z13S5a>BKvYeTT-Ht2!~(xGlkJK~*NUEj$bZ3}wCZ{lSE}p&z+K+7 z{fa&A^&X&O4gs)ihwj17i|+K};$5v}J8W0P84mar4>LKR*+ws!0f5DF z$pv^Cj{^bo%SAWjNT%S77-n+LYYe1Hl`7RUmF3y#T&YD(00000NkvXXu0mjfZi)5| literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Shoes/Boots/cowboybootsbrown.rsi/meta.json b/Resources/Textures/Clothing/Shoes/Boots/cowboybootsbrown.rsi/meta.json new file mode 100644 index 00000000000..d48c778343c --- /dev/null +++ b/Resources/Textures/Clothing/Shoes/Boots/cowboybootsbrown.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "taken from tgstation at https://github.com/tgstation/tgstation/commit/8703eac50de6379c26f7eadb47b4f016854d1dcd", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-FEET", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/Shoes/Boots/cowboybootsfancy.rsi/equipped-FEET.png b/Resources/Textures/Clothing/Shoes/Boots/cowboybootsfancy.rsi/equipped-FEET.png new file mode 100644 index 0000000000000000000000000000000000000000..e9ea841b8e92aa479f2cb0b8d8f13975b9193c65 GIT binary patch literal 610 zcmV-o0-gPdP)Px%97#k$RCt{2+OccYP#g#FuNMnWUF;%=h>-I}mlN>>m1IzQE{-l2Tyj_a2Sgmj z<)DLu^dE5SVvd%QfI}%RH7L|HF2T5rfwRt};9pwAj?!CNxUw*l~ z40!+%5fKp)5fKp)5fKq(4f=fr0MqTZnr^oh0JL0J?Zok3dy)C^)|QIGFqPGET?GJ9 z7%EAANq0aLhRU|AO#AA}N}(6O-@yw_Zh(YV0lp810D#%rtyKHdGZ&=!T2{-~f7`wt z#{huW51(kCQ>y?;(CwucsrEZ>eeGb0)627e?Z5c=f%Z9b7horj)yatoc%GN(^E?lJ z5TM~Wg{=e0`g0iF{9FY{p0VvXhHY8!gCKK^ZCUuZxha~&VFvxaN*=#I*?(hn@{i{^ zXz5%H0Py@s%Bv7-!>{=CV;3)X w2Zg>3u8obWQ>8JSH%?&jawXO0`+;`$Pry0R@YSgNJ^%m!07*qoM6N<$g6?)9AOHXW literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Shoes/Boots/cowboybootsfancy.rsi/icon.png b/Resources/Textures/Clothing/Shoes/Boots/cowboybootsfancy.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a8687e4ba80714be65f2fe4983ac9eefe3b90c04 GIT binary patch literal 551 zcmV+?0@(eDP)QV;>Gh}fPwBVKARlUn#?nnaHDUYirx#TKz=zX^LdH23Q?#tbSkdTm&e@tZ1125Cl zZbG`x*5_~H>_RT*0?<6|=(o1FyXLtwXaNAPvNHfKcOOK7MnO?nFBZG{UJL~(;P^yG zo|*(`tSm44`dcl)ZjDemicmRd58H{XjuBS^_I>G^p89LJ%os+?&W*-S?G zR#yk?S{WNKkw*oy@36f2vu;1Sg8^*`3BwIx<()9`HS zhJXL`1;&#{J>vy>0~eQxb`N3$Ggn0G4Gjt-SG#6?g>C=jPB21Ix06OGpyc zY8Bluh{xk3B*`~U-y>-M)e4FtTv=7wEtLS++}IF)y;vkA%K*e;vA-+8n|Lglq-L5p zw#{NbFA{rwSyf5NGP|V`*-XZ_v7UFqLN4dFJH9tOjAPpXEavl~t;bi~-002ovPDHLkV1k!60_*?) literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Shoes/Boots/cowboybootsfancy.rsi/meta.json b/Resources/Textures/Clothing/Shoes/Boots/cowboybootsfancy.rsi/meta.json new file mode 100644 index 00000000000..d48c778343c --- /dev/null +++ b/Resources/Textures/Clothing/Shoes/Boots/cowboybootsfancy.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "taken from tgstation at https://github.com/tgstation/tgstation/commit/8703eac50de6379c26f7eadb47b4f016854d1dcd", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-FEET", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/Shoes/Boots/cowboybootswhite.rsi/equipped-FEET.png b/Resources/Textures/Clothing/Shoes/Boots/cowboybootswhite.rsi/equipped-FEET.png new file mode 100644 index 0000000000000000000000000000000000000000..4ba2f91ac2df8e86a64b1d56ddf2ba16c2f1d510 GIT binary patch literal 495 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zS9-cQhE&XX zd&@EFkb?y4gYdV!uSAvZDJ$ug-YrWn>)htfxkE>frMg{HH|gAiMYAtNh%Dhw3@M16 zspqvu>S#(2*Qb4RC;Qxc(tk3ouAu`7EK0k)lBr?W>s7m6YcZ_2wQZKiP6_*zeKNfv z4}NP$hTaZi5csk0(#i8GbAhzhthAIri*MV$IIADM|KbP67ak!E^MA&etBcOeDSP}Q z!s~Cgnq_751v_pJ<$C#z+y)baVxJZXIJxw3Dqi?#6Qc7v;eO+X-Y~$%1tI*wX`=7E;R{3vq&QpJ_7{h|Qb=@-3U#ca(RCgyY zz2tl6&5c=S)fgUpwVfqj^EIHhD(26=y?*xdkv#Q6C+3A8&-a(D0zY_|Y|N!@UB48# zHFv5x&y>@t3=M%A8Bf*U@iY9B5-oWqJL%o5EnEeDTevo?4SYDIL?s&Kkx9M@mdj@?$Egv3-7t4g`WT)y{C4FUIv%7i+`-lDU^1u5r<~!6xIsiMygwkaDXvvWDhcVVf`35>Ea|)-AOXR@AQpFal5&T$u{A{+ zjl!Ma3cH$YEX*v4uvS?%l4Lg0ts{#2kPwg^6?J_}G(^yv*!4!RKB83u)X-qT-tJ#--g zV?{awKTozjRBt{$hT1>1foYl8K&R6g7&}r9UFS$iv(=(;ef_=$0Gh29zfVpE#{I8p zSpc-#?NG5IAHn9v2Bu{VBuXm^^?DuCvPh*;q!lGFPUu_Ef7QyG=4rYRoK~v<93C8a z`hKNCMpXewCX>?{@F!keUgpWRainCoRPqx0bzKNDs>*4#N+F*QENpBq*eMp>e#PJB z=DZ(nw^Z^f?(6CMYxzq8qNR z%)4*3TfiYTs0000 CKIroR literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Shoes/Boots/cowboybootswhite.rsi/meta.json b/Resources/Textures/Clothing/Shoes/Boots/cowboybootswhite.rsi/meta.json new file mode 100644 index 00000000000..d48c778343c --- /dev/null +++ b/Resources/Textures/Clothing/Shoes/Boots/cowboybootswhite.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "taken from tgstation at https://github.com/tgstation/tgstation/commit/8703eac50de6379c26f7eadb47b4f016854d1dcd", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-FEET", + "directions": 4 + } + ] +} From b301a9f4d0fe3c287284fdbb6de3d01d63619fcf Mon Sep 17 00:00:00 2001 From: emmafornash <89596994+emmafornash@users.noreply.github.com> Date: Sat, 27 Jan 2024 22:23:39 -0500 Subject: [PATCH 006/266] Fixed syndicate bombs being unpurchasable (#24469) * fixed syndicite bombs being unpurchasable * removed previous attempt * added restock condition to listing's equal method * reverted id change (cherry picked from commit af632690a1619703da0b6158dee1b9eae7ae7c6d) --- Content.Shared/Store/ListingPrototype.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Store/ListingPrototype.cs b/Content.Shared/Store/ListingPrototype.cs index d80c5cf6c83..b0f72e6dfe6 100644 --- a/Content.Shared/Store/ListingPrototype.cs +++ b/Content.Shared/Store/ListingPrototype.cs @@ -105,7 +105,8 @@ public bool Equals(ListingData? listing) Description != listing.Description || ProductEntity != listing.ProductEntity || ProductAction != listing.ProductAction || - ProductEvent != listing.ProductEvent) + ProductEvent != listing.ProductEvent || + RestockTime != listing.RestockTime) return false; if (Icon != null && !Icon.Equals(listing.Icon)) From e5915d9cfcf57a9e47943897094aa5d0b7fd6b2f Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 28 Jan 2024 03:24:22 +0000 Subject: [PATCH 007/266] Automatic changelog update (cherry picked from commit 725869ae3333e96a9678a046ea10eb284d40cf99) --- Resources/Changelog/Changelog.yml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 60bf28aa951..39fe871b33b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: Ubaser - changes: - - message: Janitors can now buy their own bomb suit for cleaning chemical spills. - type: Add - id: 5309 - time: '2023-12-11T08:41:54.0000000+00:00' - author: nok-ko changes: - message: "Fixed taking damage mid-sentence not activating \u201Cglorfcode\u201D" @@ -3823,3 +3817,12 @@ id: 5809 time: '2024-01-28T00:28:02.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24637 +- author: themias + changes: + - message: Added cowboy hats and boots to autodrobe, secdrobe, and maints + type: Add + - message: Added cowboy accent + type: Add + id: 5810 + time: '2024-01-28T03:23:16.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24299 From fc3197e13aa8df81fdad49038a3a82fe5bbf0f94 Mon Sep 17 00:00:00 2001 From: shamp <140359015+shampunj@users.noreply.github.com> Date: Sun, 28 Jan 2024 13:41:36 +0300 Subject: [PATCH 008/266] Added new All at once game preset (#23171) * Update game_presets.yml * Create preset-allatonce.ftl * Update game_presets.yml * Update game_presets.yml the game rule has been removed: - pirates * Update game_presets.yml Pascal case/Camel case fix * Update preset-allatonce.ftl Camel case fix (cherry picked from commit 4920d5f7dfe0df8f8e45ec7d6a91cd3514d680c4) --- .../game-ticking/game-presets/preset-allatonce.ftl | 2 ++ Resources/Prototypes/game_presets.yml | 12 ++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 Resources/Locale/en-US/game-ticking/game-presets/preset-allatonce.ftl diff --git a/Resources/Locale/en-US/game-ticking/game-presets/preset-allatonce.ftl b/Resources/Locale/en-US/game-ticking/game-presets/preset-allatonce.ftl new file mode 100644 index 00000000000..3452b2faa96 --- /dev/null +++ b/Resources/Locale/en-US/game-ticking/game-presets/preset-allatonce.ftl @@ -0,0 +1,2 @@ +all-at-once-title = All at once +all-at-once-description = It's just not your day... diff --git a/Resources/Prototypes/game_presets.yml b/Resources/Prototypes/game_presets.yml index bef4199b03d..1c27a203466 100644 --- a/Resources/Prototypes/game_presets.yml +++ b/Resources/Prototypes/game_presets.yml @@ -8,6 +8,18 @@ rules: - RampingStationEventScheduler +- type: gamePreset + id: AllAtOnce + name: all-at-once-title + description: all-at-once-description + showInVote: false + rules: + - Nukeops + - Traitor + - Revolutionary + - Zombie + - RampingStationEventScheduler + - type: gamePreset id: Extended alias: From 72bc9a1cba29f4d8ff429f7d286a8714503d110f Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 28 Jan 2024 10:42:42 +0000 Subject: [PATCH 009/266] Automatic changelog update (cherry picked from commit dcd4e8f799aaf39a6c64d14fd6f2224ccba67d51) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 39fe871b33b..109f08049d8 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: nok-ko - changes: - - message: "Fixed taking damage mid-sentence not activating \u201Cglorfcode\u201D" - type: Fix - id: 5310 - time: '2023-12-11T08:53:10.0000000+00:00' - author: Ubaser changes: - message: Added two eye scar markings for humans and dwarves. @@ -3826,3 +3820,10 @@ id: 5810 time: '2024-01-28T03:23:16.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24299 +- author: shampunj + changes: + - message: A new game preset! Can only be selected by admins. All at once. + type: Add + id: 5811 + time: '2024-01-28T10:41:36.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23171 From 2d165f72f1cd18826530c28bd40c3493d5056f36 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 28 Jan 2024 10:47:37 +0000 Subject: [PATCH 010/266] Automatic changelog update (cherry picked from commit 0a6904fbe278166a2a9705d0001bc19aca2c3a2e) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 109f08049d8..6c5dc3fb16f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: Ubaser - changes: - - message: Added two eye scar markings for humans and dwarves. - type: Add - id: 5311 - time: '2023-12-11T09:18:20.0000000+00:00' - author: Whisper changes: - message: Added black gloves to the clothesmate @@ -3827,3 +3821,10 @@ id: 5811 time: '2024-01-28T10:41:36.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23171 +- author: Doctor-Cpu + changes: + - message: 3kliksphilips name. + type: Fix + id: 5812 + time: '2024-01-28T10:46:32.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24657 From 1093edc67d7c7f05215befe18e0981365ddc39c7 Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Sun, 28 Jan 2024 10:47:58 +0000 Subject: [PATCH 011/266] Give anomaly borg module a signaller (#24466) Co-authored-by: deltanedas <@deltanedas:kde.org> (cherry picked from commit 19a05e11d037fd99c38f4a4a646fd6bf02f3c04c) --- .../Entities/Objects/Specific/Robotics/borg_modules.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml index ac490666602..5bdaddda238 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml @@ -417,6 +417,8 @@ items: - AnomalyScanner - AnomalyLocatorUnpowered + - RemoteSignaller + - Multitool # service modules - type: entity From d545b0ea0c092a29e9b5511b9a8925680e036a9b Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Sun, 28 Jan 2024 05:48:42 -0500 Subject: [PATCH 012/266] Add support clothing equip/unequip doafters (#24389) * add clothing equip/unequip doafters * boowomp (cherry picked from commit 804c76f8c9ac5eec851aa1e5a65b4b3c11ce2f65) --- .../Clothing/Components/ClothingComponent.cs | 34 ++++++++ .../Clothing/EntitySystems/ClothingSystem.cs | 27 +++++- .../Interaction/SmartEquipSystem.cs | 4 +- .../Inventory/InventorySystem.Equip.cs | 87 ++++++++++++++++--- 4 files changed, 133 insertions(+), 19 deletions(-) diff --git a/Content.Shared/Clothing/Components/ClothingComponent.cs b/Content.Shared/Clothing/Components/ClothingComponent.cs index 321b06114ac..0f4c7f68bfc 100644 --- a/Content.Shared/Clothing/Components/ClothingComponent.cs +++ b/Content.Shared/Clothing/Components/ClothingComponent.cs @@ -1,4 +1,5 @@ using Content.Shared.Clothing.EntitySystems; +using Content.Shared.DoAfter; using Content.Shared.Inventory; using Robust.Shared.Audio; using Robust.Shared.GameStates; @@ -66,6 +67,12 @@ public sealed partial class ClothingComponent : Component public ClothingMask UnisexMask = ClothingMask.UniformFull; public string? InSlot; + + [DataField, ViewVariables(VVAccess.ReadWrite)] + public TimeSpan EquipDelay = TimeSpan.Zero; + + [DataField, ViewVariables(VVAccess.ReadWrite)] + public TimeSpan UnequipDelay = TimeSpan.Zero; } [Serializable, NetSerializable] @@ -85,3 +92,30 @@ public enum ClothingMask : byte UniformFull, UniformTop } + +[Serializable, NetSerializable] +public sealed partial class ClothingEquipDoAfterEvent : DoAfterEvent +{ + public string Slot; + + public ClothingEquipDoAfterEvent(string slot) + { + Slot = slot; + } + + public override DoAfterEvent Clone() => this; +} + +[Serializable, NetSerializable] +public sealed partial class ClothingUnequipDoAfterEvent : DoAfterEvent +{ + public string Slot; + + public ClothingUnequipDoAfterEvent(string slot) + { + Slot = slot; + } + + public override DoAfterEvent Clone() => this; +} + diff --git a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs index da2a09313ab..92e31cfd8ea 100644 --- a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs @@ -7,7 +7,6 @@ using Content.Shared.Inventory.Events; using Content.Shared.Item; using Content.Shared.Tag; -using Content.Shared.Timing; using Robust.Shared.GameStates; namespace Content.Shared.Clothing.EntitySystems; @@ -33,7 +32,11 @@ public override void Initialize() SubscribeLocalEvent(OnGotEquipped); SubscribeLocalEvent(OnGotUnequipped); SubscribeLocalEvent(OnMaskToggled); + + SubscribeLocalEvent(OnEquipDoAfter); + SubscribeLocalEvent(OnUnequipDoAfter); } + private void OnUseInHand(Entity ent, ref UseInHandEvent args) { if (args.Handled || !ent.Comp.QuickEquip) @@ -64,17 +67,17 @@ private void QuickEquip( if (TryComp(slotEntity, out ClothingComponent? item) && !item.QuickEquip) continue; - if (!_invSystem.TryUnequip(userEnt, slotDef.Name, true, inventory: userEnt, clothing: toEquipEnt)) + if (!_invSystem.TryUnequip(userEnt, slotDef.Name, true, inventory: userEnt, checkDoafter: true)) continue; - if (!_invSystem.TryEquip(userEnt, toEquipEnt, slotDef.Name, true, inventory: userEnt, clothing: toEquipEnt)) + if (!_invSystem.TryEquip(userEnt, toEquipEnt, slotDef.Name, true, inventory: userEnt, clothing: toEquipEnt, checkDoafter: true)) continue; _handsSystem.PickupOrDrop(userEnt, slotEntity.Value, handsComp: userEnt); } else { - if (!_invSystem.TryEquip(userEnt, toEquipEnt, slotDef.Name, true, inventory: userEnt, clothing: toEquipEnt)) + if (!_invSystem.TryEquip(userEnt, toEquipEnt, slotDef.Name, true, inventory: userEnt, clothing: toEquipEnt, checkDoafter: true)) continue; } @@ -113,6 +116,22 @@ private void OnMaskToggled(Entity ent, ref ItemMaskToggledEve SetEquippedPrefix(ent, args.IsToggled ? "toggled" : null, ent); } + private void OnEquipDoAfter(Entity ent, ref ClothingEquipDoAfterEvent args) + { + if (args.Handled || args.Cancelled || args.Target is not { } target) + return; + args.Handled = _invSystem.TryEquip(args.User, target, ent, args.Slot, clothing: ent.Comp, predicted: true, checkDoafter: false); + } + + private void OnUnequipDoAfter(Entity ent, ref ClothingUnequipDoAfterEvent args) + { + if (args.Handled || args.Cancelled || args.Target is not { } target) + return; + args.Handled = _invSystem.TryUnequip(args.User, target, args.Slot, clothing: ent.Comp, predicted: true, checkDoafter: false); + if (args.Handled) + _handsSystem.TryPickup(args.User, ent); + } + #region Public API public void SetEquippedPrefix(EntityUid uid, string? prefix, ClothingComponent? clothing = null) diff --git a/Content.Shared/Interaction/SmartEquipSystem.cs b/Content.Shared/Interaction/SmartEquipSystem.cs index 17c8f2e511f..fb2bc3c4609 100644 --- a/Content.Shared/Interaction/SmartEquipSystem.cs +++ b/Content.Shared/Interaction/SmartEquipSystem.cs @@ -118,7 +118,7 @@ private void HandleSmartEquip(ICommonSession? session, string equipmentSlot) } _hands.TryDrop(uid, hands.ActiveHand, handsComp: hands); - _inventory.TryEquip(uid, handItem.Value, equipmentSlot, predicted: true); + _inventory.TryEquip(uid, handItem.Value, equipmentSlot, predicted: true, checkDoafter:true); return; } @@ -209,7 +209,7 @@ private void HandleSmartEquip(ICommonSession? session, string equipmentSlot) return; } - _inventory.TryUnequip(uid, equipmentSlot, inventory: inventory, predicted: true); + _inventory.TryUnequip(uid, equipmentSlot, inventory: inventory, predicted: true, checkDoafter: true); _hands.TryPickup(uid, slotItem, handsComp: hands); } } diff --git a/Content.Shared/Inventory/InventorySystem.Equip.cs b/Content.Shared/Inventory/InventorySystem.Equip.cs index 5e740ec2eae..24006b0c9f9 100644 --- a/Content.Shared/Inventory/InventorySystem.Equip.cs +++ b/Content.Shared/Inventory/InventorySystem.Equip.cs @@ -1,5 +1,6 @@ using System.Diagnostics.CodeAnalysis; using Content.Shared.Clothing.Components; +using Content.Shared.DoAfter; using Content.Shared.Hands; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; @@ -24,6 +25,7 @@ public abstract partial class InventorySystem [Dependency] private readonly SharedItemSystem _item = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedContainerSystem _containerSystem = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; [Dependency] private readonly SharedHandsSystem _handsSystem = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; @@ -90,7 +92,7 @@ private void OnUseSlot(UseSlotNetworkMessage ev, EntitySessionEventArgs eventArg // unequip the item. if (itemUid != null) { - if (!TryUnequip(actor, ev.Slot, out var item, predicted: true, inventory: inventory)) + if (!TryUnequip(actor, ev.Slot, out var item, predicted: true, inventory: inventory, checkDoafter: true)) return; _handsSystem.PickupOrDrop(actor, item.Value); @@ -114,15 +116,15 @@ private void OnUseSlot(UseSlotNetworkMessage ev, EntitySessionEventArgs eventArg RaiseLocalEvent(held.Value, new HandDeselectedEvent(actor), false); - TryEquip(actor, actor, held.Value, ev.Slot, predicted: true, inventory: inventory, force: true); + TryEquip(actor, actor, held.Value, ev.Slot, predicted: true, inventory: inventory, force: true, checkDoafter:true); } public bool TryEquip(EntityUid uid, EntityUid itemUid, string slot, bool silent = false, bool force = false, bool predicted = false, - InventoryComponent? inventory = null, ClothingComponent? clothing = null) => - TryEquip(uid, uid, itemUid, slot, silent, force, predicted, inventory, clothing); + InventoryComponent? inventory = null, ClothingComponent? clothing = null, bool checkDoafter = false) => + TryEquip(uid, uid, itemUid, slot, silent, force, predicted, inventory, clothing, checkDoafter); public bool TryEquip(EntityUid actor, EntityUid target, EntityUid itemUid, string slot, bool silent = false, bool force = false, bool predicted = false, - InventoryComponent? inventory = null, ClothingComponent? clothing = null) + InventoryComponent? inventory = null, ClothingComponent? clothing = null, bool checkDoafter = false) { if (!Resolve(target, ref inventory, false)) { @@ -149,6 +151,34 @@ public bool TryEquip(EntityUid actor, EntityUid target, EntityUid itemUid, strin return false; } + if (checkDoafter && + clothing != null && + clothing.EquipDelay > TimeSpan.Zero && + (clothing.Slots & slotDefinition.SlotFlags) != 0 && + _containerSystem.CanInsert(itemUid, slotContainer)) + { + var args = new DoAfterArgs( + EntityManager, + actor, + clothing.EquipDelay, + new ClothingEquipDoAfterEvent(slot), + itemUid, + target, + itemUid) + { + BlockDuplicate = true, + BreakOnHandChange = true, + BreakOnUserMove = true, + BreakOnTargetMove = true, + CancelDuplicate = true, + RequireCanInteract = true, + NeedHand = true + }; + + _doAfter.TryStartDoAfter(args); + return false; + } + if (!_containerSystem.Insert(itemUid, slotContainer)) { if(!silent && _gameTiming.IsFirstTimePredicted) @@ -156,7 +186,7 @@ public bool TryEquip(EntityUid actor, EntityUid target, EntityUid itemUid, strin return false; } - if (!silent && clothing != null && clothing.EquipSound != null) + if (!silent && clothing != null) { _audio.PlayPredicted(clothing.EquipSound, target, actor); } @@ -284,9 +314,10 @@ public bool TryUnequip( bool predicted = false, InventoryComponent? inventory = null, ClothingComponent? clothing = null, - bool reparent = true) + bool reparent = true, + bool checkDoafter = false) { - return TryUnequip(uid, uid, slot, silent, force, predicted, inventory, clothing, reparent); + return TryUnequip(uid, uid, slot, silent, force, predicted, inventory, clothing, reparent, checkDoafter); } public bool TryUnequip( @@ -298,9 +329,10 @@ public bool TryUnequip( bool predicted = false, InventoryComponent? inventory = null, ClothingComponent? clothing = null, - bool reparent = true) + bool reparent = true, + bool checkDoafter = false) { - return TryUnequip(actor, target, slot, out _, silent, force, predicted, inventory, clothing, reparent); + return TryUnequip(actor, target, slot, out _, silent, force, predicted, inventory, clothing, reparent, checkDoafter); } public bool TryUnequip( @@ -312,9 +344,10 @@ public bool TryUnequip( bool predicted = false, InventoryComponent? inventory = null, ClothingComponent? clothing = null, - bool reparent = true) + bool reparent = true, + bool checkDoafter = false) { - return TryUnequip(uid, uid, slot, out removedItem, silent, force, predicted, inventory, clothing, reparent); + return TryUnequip(uid, uid, slot, out removedItem, silent, force, predicted, inventory, clothing, reparent, checkDoafter); } public bool TryUnequip( @@ -327,7 +360,8 @@ public bool TryUnequip( bool predicted = false, InventoryComponent? inventory = null, ClothingComponent? clothing = null, - bool reparent = true) + bool reparent = true, + bool checkDoafter = false) { removedItem = null; @@ -364,6 +398,33 @@ public bool TryUnequip( if (!force && !_containerSystem.CanRemove(removedItem.Value, slotContainer)) return false; + if (checkDoafter && + Resolve(removedItem.Value, ref clothing, false) && + (clothing.Slots & slotDefinition.SlotFlags) != 0 && + clothing.UnequipDelay > TimeSpan.Zero) + { + var args = new DoAfterArgs( + EntityManager, + actor, + clothing.UnequipDelay, + new ClothingUnequipDoAfterEvent(slot), + removedItem.Value, + target, + removedItem.Value) + { + BlockDuplicate = true, + BreakOnHandChange = true, + BreakOnUserMove = true, + BreakOnTargetMove = true, + CancelDuplicate = true, + RequireCanInteract = true, + NeedHand = true + }; + + _doAfter.TryStartDoAfter(args); + return false; + } + foreach (var slotDef in inventory.Slots) { if (slotDef != slotDefinition && slotDef.DependsOn == slotDefinition.Name) From 5a88211bbe6b79bf1a43240e1fd9b21f745a9e2f Mon Sep 17 00:00:00 2001 From: Kara Date: Sun, 28 Jan 2024 03:49:55 -0700 Subject: [PATCH 013/266] Lower speech noise volume & refactor system (#24579) * Lower speech noise sounds & refactor system christ fuck * MORE (cherry picked from commit 740c298d2fb5ec5fb74ded3eee667251c613fd64) --- Content.Server/Speech/SpeechNoiseSystem.cs | 56 ++++++++++--------- .../SurveillanceCameraSpeakerSystem.cs | 33 ++--------- Content.Shared/Speech/SpeechComponent.cs | 2 +- 3 files changed, 37 insertions(+), 54 deletions(-) diff --git a/Content.Server/Speech/SpeechNoiseSystem.cs b/Content.Server/Speech/SpeechNoiseSystem.cs index 4f66a0828bd..5530f3fe57a 100644 --- a/Content.Server/Speech/SpeechNoiseSystem.cs +++ b/Content.Server/Speech/SpeechNoiseSystem.cs @@ -24,51 +24,55 @@ public override void Initialize() SubscribeLocalEvent(OnEntitySpoke); } - private void OnEntitySpoke(EntityUid uid, SpeechComponent component, EntitySpokeEvent args) + public SoundSpecifier? GetSpeechSound(Entity ent, string message) { - if (component.SpeechSounds == null) return; - - var currentTime = _gameTiming.CurTime; - var cooldown = TimeSpan.FromSeconds(component.SoundCooldownTime); - - // Ensure more than the cooldown time has passed since last speaking - if (currentTime - component.LastTimeSoundPlayed < cooldown) return; + if (ent.Comp.SpeechSounds == null) + return null; // Play speech sound - string contextSound; - var prototype = _protoManager.Index(component.SpeechSounds); - var message = args.Message; + SoundSpecifier? contextSound; + var prototype = _protoManager.Index(ent.Comp.SpeechSounds); // Different sounds for ask/exclaim based on last character - switch (args.Message[^1]) + contextSound = message[^1] switch { - case '?': - contextSound = prototype.AskSound.GetSound(); - break; - case '!': - contextSound = prototype.ExclaimSound.GetSound(); - break; - default: - contextSound = prototype.SaySound.GetSound(); - break; - } + '?' => prototype.AskSound, + '!' => prototype.ExclaimSound, + _ => prototype.SaySound + }; // Use exclaim sound if most characters are uppercase. int uppercaseCount = 0; for (int i = 0; i < message.Length; i++) { - if (char.IsUpper(message[i])) uppercaseCount++; + if (char.IsUpper(message[i])) + uppercaseCount++; } if (uppercaseCount > (message.Length / 2)) { - contextSound = contextSound = prototype.ExclaimSound.GetSound(); + contextSound = prototype.ExclaimSound; } var scale = (float) _random.NextGaussian(1, prototype.Variation); - var pitchedAudioParams = component.AudioParams.WithPitchScale(scale); + contextSound.Params = ent.Comp.AudioParams.WithPitchScale(scale); + return contextSound; + } + + private void OnEntitySpoke(EntityUid uid, SpeechComponent component, EntitySpokeEvent args) + { + if (component.SpeechSounds == null) + return; + + var currentTime = _gameTiming.CurTime; + var cooldown = TimeSpan.FromSeconds(component.SoundCooldownTime); + + // Ensure more than the cooldown time has passed since last speaking + if (currentTime - component.LastTimeSoundPlayed < cooldown) + return; + var sound = GetSpeechSound((uid, component), args.Message); component.LastTimeSoundPlayed = currentTime; - _audio.PlayPvs(contextSound, uid, pitchedAudioParams); + _audio.PlayPvs(sound, uid); } } } diff --git a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSpeakerSystem.cs b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSpeakerSystem.cs index ce3d8568ab3..7544fc376ba 100644 --- a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSpeakerSystem.cs +++ b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSpeakerSystem.cs @@ -1,4 +1,5 @@ using Content.Server.Chat.Systems; +using Content.Server.Speech; using Content.Shared.Speech; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; @@ -14,6 +15,7 @@ namespace Content.Server.SurveillanceCamera; public sealed class SurveillanceCameraSpeakerSystem : EntitySystem { [Dependency] private readonly SharedAudioSystem _audioSystem = default!; + [Dependency] private readonly SpeechSoundSystem _speechSound = default!; [Dependency] private readonly ChatSystem _chatSystem = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; @@ -37,35 +39,12 @@ private void OnSpeechSent(EntityUid uid, SurveillanceCameraSpeakerComponent comp var cd = TimeSpan.FromSeconds(component.SpeechSoundCooldown); // this part's mostly copied from speech + // what is wrong with you? if (time - component.LastSoundPlayed < cd - && TryComp(args.Speaker, out var speech) - && speech.SpeechSounds != null - && _prototypeManager.TryIndex(speech.SpeechSounds, out SpeechSoundsPrototype? speechProto)) + && TryComp(args.Speaker, out var speech)) { - var sound = args.Message[^1] switch - { - '?' => speechProto.AskSound, - '!' => speechProto.ExclaimSound, - _ => speechProto.SaySound - }; - - var uppercase = 0; - for (var i = 0; i < args.Message.Length; i++) - { - if (char.IsUpper(args.Message[i])) - { - uppercase++; - } - } - - if (uppercase > args.Message.Length / 2) - { - sound = speechProto.ExclaimSound; - } - - var scale = (float) _random.NextGaussian(1, speechProto.Variation); - var param = speech.AudioParams.WithPitchScale(scale); - _audioSystem.PlayPvs(sound, uid, param); + var sound = _speechSound.GetSpeechSound((args.Speaker, speech), args.Message); + _audioSystem.PlayPvs(sound, uid); component.LastSoundPlayed = time; } diff --git a/Content.Shared/Speech/SpeechComponent.cs b/Content.Shared/Speech/SpeechComponent.cs index 96e05502ad6..272d9ef8cab 100644 --- a/Content.Shared/Speech/SpeechComponent.cs +++ b/Content.Shared/Speech/SpeechComponent.cs @@ -41,7 +41,7 @@ public sealed partial class SpeechComponent : Component }; [DataField] - public AudioParams AudioParams = AudioParams.Default.WithVolume(6f).WithRolloffFactor(4.5f); + public AudioParams AudioParams = AudioParams.Default.WithVolume(-2f).WithRolloffFactor(4.5f); [ViewVariables(VVAccess.ReadWrite)] [DataField] From 49851d9eb20284a2b01bcbedfa7e3736fae264f2 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 28 Jan 2024 10:51:01 +0000 Subject: [PATCH 014/266] Automatic changelog update (cherry picked from commit 487f94aa3b1bdd5f75ae95792d931e8b39a2cc24) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 6c5dc3fb16f..8bbb3f07447 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: Whisper - changes: - - message: Added black gloves to the clothesmate - type: Add - id: 5312 - time: '2023-12-11T09:23:51.0000000+00:00' - author: mirrorcult changes: - message: Emergency lights no longer make sound @@ -3828,3 +3822,10 @@ id: 5812 time: '2024-01-28T10:46:32.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24657 +- author: mirrorcult + changes: + - message: Speech sounds are now quieter + type: Tweak + id: 5813 + time: '2024-01-28T10:49:55.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24579 From 01e6e2581dc457968a4ecaf5cad5d4442c61c5cb Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Sun, 28 Jan 2024 16:13:29 +0100 Subject: [PATCH 015/266] Fix eris hud hand slot sprites (#24662) * Fix eris style hand slot sprites * rename meta to meta.json (cherry picked from commit 50f1b4b009b50d1889ef925e044a3761edb1798e) --- .../Textures/Interface/Eris/Slots/hand_l.png | Bin 368 -> 403 bytes .../Interface/Eris/Slots/hand_l_active.png | Bin 418 -> 464 bytes .../Textures/Interface/Eris/Slots/hand_r.png | Bin 406 -> 443 bytes .../Interface/Eris/Slots/hand_r_active.png | Bin 474 -> 523 bytes .../Interface/Eris/Slots/{meta => meta.json} | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename Resources/Textures/Interface/Eris/Slots/{meta => meta.json} (100%) diff --git a/Resources/Textures/Interface/Eris/Slots/hand_l.png b/Resources/Textures/Interface/Eris/Slots/hand_l.png index 3ee9d5702e889f81e607c381d75da153a836d536..c1871e5443dbbcd0432a3a58ab50aa03597dd10b 100644 GIT binary patch delta 355 zcmV-p0i6Eu0+R!fIe$e-L_t(oN9C8l3c^4P#!qo^5Ya{P&l?m6p_9+=Bshp~pcY*e zad1?=gOuxeHaY8gLIXmvrQa|4a-mTwax|bnOBRoIrym^UemkqpcBwTfTDX8XZeFfg zP>9ha(aD++O;QXk4xMbj)yV>abaQ}EsSk&P!mDkF-~iL<_uoq z2n!(12q2$S<7)t9i!THVfM)Xv-%79m=yWLrJ?8_#0w8-1!W5RmR{kC^g^;lgA)OJT z3fMhBL+BlZPh8J@1V92VYkVi9XcSW)n8Mt(vO2dqRWG-le_>z0gfJ- SP}*$(0000HlzSqBxmf`WnwI_VaalX4|5#-5v(=Dl8!Jju`b?oUD@(z11+KO4#6WmF}3c)peO z$G4!(FKSztseVwe%Ag**)X@7C(jOTqpq!Dq|JpoYs znghDsyUNTEqBuaWcYlVi5a@6KxrJ6III8IYP@zqmYBmyq!Qe^o^GzdgUE1^I^7B`T z;zh_DY#qRq0_^2*J8d>w+3ohsLE29v5EI9$077Af2MtvW22g<5LE^8G3qk>`9s#6I zH2w@g(~=570e?_zDV7=u3V=$tLg=^@2nqo28H6uvh0VSX_(JeFgs`3wrU-;Jpoh>U zh?JVC1)u`4)TEw}rlVNvz!zrU)+jiDpUc4wopUL#)_nT{jb2D%p8c;Y83-qjE1H55 z1KchcPNjnfLmLpMZP+A)?`Y+rh-l!Qh_=Mz)K6jTp&D8u#dOUh!uFxGCw!`&00000 LNkvXXu0mjf#T~?m delta 370 zcmV-&0ge991EK?vIe%11L_t(oh0T{iio!4yhX2a!2i#Z~1cf<)P#3c+^bVfDYq;n& zJi**S=+1@0oM1p96zaw+=pww5noRqWHtGDUG%5W)UXqdkBPRlYJjEkRn*)pW6xY)o zi}kb@fWC1(-Ek;@T_Kqbfn$!xp#b*3%U-aqd~YwB#Dp5Y;ePW#eEy;Jkwh)fccHn2m=i#*)X*VjkP0Np3Q4kR^bzyTD;dD~{L?z_eGztLbb&#p zAdY9+b`zpRRo(mwn7|b3?~-s5Xam1WbO~6m0WO>yD}kZmRst??Ao)lGw|)4{EZvw#{CoCICM{tuW+YE$ao0wxLd`L8xhKpqa>okd*0 zK@TLR{I4S!0Bk=m!6j;euN|T+9Y>_%fbe$A%>zDTO2xv&#es>5H$yyVK0|&)vMiZZ-2`2t2bu=p`EB4Xet!N zhrwq)f9_3O77{1$-PV9>m!t&GP`zB#M_h?)f6RQ{s8vvr|%@6gwB|yB54U1?t%r0KzCn-?jL@ zU!4M^dkRL2L50}J#I-m8T)!%WQ4B_lL7r`=F6Q}h%!R1YG=Dd%5ULZKxr>}%!1)D) zWY)x02-$O!4gdgS2LM1>o~;9@G3!8Co*_j2qa3RO0I*tnBLLNQZzWhOyaUWm!E+?Z z?$=1#*b!O|Oo;;kAsO=gh$Pv$1$ecLmVj980YWlk2H$?q6_&Zqj(8hD3d}+1#^NcMDvim8)Lz9>%p|uC@Rz{5Z-V#N z@P7dGU5j*2{Q>am6!?M|ORy%y=SMo`!ShF-KdN5h0VkKHq0N0-_y7O^07*qoM6N<$ Eg1>j55C8xG diff --git a/Resources/Textures/Interface/Eris/Slots/hand_r_active.png b/Resources/Textures/Interface/Eris/Slots/hand_r_active.png index fb9eeff5c5cdc7b5b0519911f491bb3418b3b364..91e68e16cc8054606357ba092fab55f88aca34a4 100644 GIT binary patch delta 476 zcmV<20VDp}1B(QZIe)!LL_t(oN5xmMY63wJ9Ygv+ng~INkRp{uK#O!j{vluBZ&>&n z_XYWffL)3R7FH<&5hP$5f8mn1GRNM!>%Kj`y8$`xZf4%wH?w=YA}w17__ML(&*L(a zyV13*KX!uaDW*AaeVdC+=VCC`%+32ua=gsG`lnz;V_zrV2Y)0kG^%cJ;JjpgfznW1 zaW8$ehr`F>@n-WQ+wE_3bgTnNK#70LQI0|ZH^FN4Dfsnzw`^|OPnAG`QNT1>R*oMG z9?XNqVo4`XaojiePK*NRP}cwq`R#I~0K|M1(+~(vwR6_qC8U_%9h1HP z)&bvqPL(=DkRpI!mxO&E`p>9h2<$fpSB!sfbz@dN8&!bXkWh>&I+ZpgzAahBymVMe z0Ypvi%~rW_Gt=;CDjggc+8|M^15J{!2Ua0Q>{+ioKcm SF91mZ0000CpWHV#_YREkDf4ukRF#{dT0ayn-7D0JqJRfj9 zWQ^y7RtDl9*F(lGgjJY(mH_r^9=i}W=SeHGSK2Nw6^Nc#*nc($_}NTY1bN2Ax4tUS z_h-dANp7U+-6+I%c>#E=LY!V*U>u)_;}f1YGG;DAh@R_1-f(QnLDT6M08w-_4p4ZK zfCVZDV2T;xdm0WjNIg%!3 zgjNPr<^Y~I!hiQ?xbDy{z^h@@2E=F&c;2Wngz+Y93ZVs%BsXgiS^#N!*M<;rx)9nW zcm*LFH_2G59*~V>W3kqm5&s4d26Yg+YJCb+rD-xDwMVfqYqHh`$S(&UjUjZt*GcO_ zVpF9HiRwybTcr#DEI%)AhbREPS2&BH8;BwU?}U&&oFwPX{W^a(*?64FQaw~V(Jvu1 Vyh}19lH~vZ002ovPDHLkV1n`$wa)+m diff --git a/Resources/Textures/Interface/Eris/Slots/meta b/Resources/Textures/Interface/Eris/Slots/meta.json similarity index 100% rename from Resources/Textures/Interface/Eris/Slots/meta rename to Resources/Textures/Interface/Eris/Slots/meta.json From c0b11e141d7d8d00403103f3d6d98d0b64ee7edf Mon Sep 17 00:00:00 2001 From: Alzore <140123969+Blackern5000@users.noreply.github.com> Date: Sun, 28 Jan 2024 09:13:48 -0600 Subject: [PATCH 016/266] Remove salvage flesh ghost roles (#24651) nomoresentientmeat (cherry picked from commit 96ffc31b66490ff1882922f66171126de5255415) --- Resources/Prototypes/Entities/Mobs/NPCs/flesh.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/flesh.yml b/Resources/Prototypes/Entities/Mobs/NPCs/flesh.yml index cb21324f39c..06ab02dedc9 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/flesh.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/flesh.yml @@ -252,10 +252,6 @@ Slash: 6 - type: ReplacementAccent accent: genericAggressive - - type: GhostRole - prob: 0.25 - name: ghost-role-information-salvage-flesh-name - description: ghost-role-information-salvage-flesh-description - type: SalvageMobRestrictions - type: entity From 22405349cca58e932f078d4e75303ccd0f33028d Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Sun, 28 Jan 2024 23:31:16 +0100 Subject: [PATCH 017/266] Localize preset labels on chem dispenser (#24617) (cherry picked from commit 556545e324a135e8a4da643a41c94b636d83d946) --- .../Labels/Label/Components/LabelComponent.cs | 7 ++- Content.Server/Labels/Label/LabelSystem.cs | 7 +++ .../Objects/Specific/chemical-containers.yml | 48 +++++++++---------- 3 files changed, 37 insertions(+), 25 deletions(-) diff --git a/Content.Server/Labels/Label/Components/LabelComponent.cs b/Content.Server/Labels/Label/Components/LabelComponent.cs index d697d6260a6..a23acc55da5 100644 --- a/Content.Server/Labels/Label/Components/LabelComponent.cs +++ b/Content.Server/Labels/Label/Components/LabelComponent.cs @@ -7,12 +7,17 @@ namespace Content.Server.Labels.Components public sealed partial class LabelComponent : Component { /// - /// The actual text in the label + /// Current text on the label. If set before map init, during map init this string will be localized. + /// This permits localized preset labels with fallback to the text written on the label. /// [ViewVariables(VVAccess.ReadWrite)] [DataField("currentLabel")] public string? CurrentLabel { get; set; } + /// + /// The original name of the entity + /// Used for reverting the modified entity name when the label is removed + /// [DataField("originalName")] public string? OriginalName { get; set; } } diff --git a/Content.Server/Labels/Label/LabelSystem.cs b/Content.Server/Labels/Label/LabelSystem.cs index 92c043dea5c..29da983b9df 100644 --- a/Content.Server/Labels/Label/LabelSystem.cs +++ b/Content.Server/Labels/Label/LabelSystem.cs @@ -31,6 +31,7 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(OnExamine); + SubscribeLocalEvent(OnLabelCompMapInit); SubscribeLocalEvent(OnComponentInit); SubscribeLocalEvent(OnComponentRemove); SubscribeLocalEvent(OnContainerModified); @@ -38,6 +39,12 @@ public override void Initialize() SubscribeLocalEvent(OnExamined); } + private void OnLabelCompMapInit(EntityUid uid, LabelComponent component, MapInitEvent args) + { + if (!string.IsNullOrEmpty(component.CurrentLabel)) + component.CurrentLabel = Loc.GetString(component.CurrentLabel); + } + /// /// Apply or remove a label on an entity. /// diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemical-containers.yml b/Resources/Prototypes/Entities/Objects/Specific/chemical-containers.yml index 01f5e45c471..c8a204e1153 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/chemical-containers.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/chemical-containers.yml @@ -58,7 +58,7 @@ noSpawn: true components: - type: Label - currentLabel: carbon + currentLabel: reagent-name-carbon - type: SolutionContainerManager solutions: beaker: @@ -73,7 +73,7 @@ noSpawn: true components: - type: Label - currentLabel: iodine + currentLabel: reagent-name-iodine - type: SolutionContainerManager solutions: beaker: @@ -88,7 +88,7 @@ noSpawn: true components: - type: Label - currentLabel: fluorine + currentLabel: reagent-name-fluorine - type: SolutionContainerManager solutions: beaker: @@ -103,7 +103,7 @@ noSpawn: true components: - type: Label - currentLabel: chlorine + currentLabel: reagent-name-chlorine - type: SolutionContainerManager solutions: beaker: @@ -118,7 +118,7 @@ noSpawn: true components: - type: Label - currentLabel: aluminium + currentLabel: reagent-name-aluminium - type: SolutionContainerManager solutions: beaker: @@ -133,7 +133,7 @@ noSpawn: true components: - type: Label - currentLabel: phosphorus + currentLabel: reagent-name-phosphorus - type: SolutionContainerManager solutions: beaker: @@ -148,7 +148,7 @@ noSpawn: true components: - type: Label - currentLabel: sulfur + currentLabel: reagent-name-sulfur - type: SolutionContainerManager solutions: beaker: @@ -163,7 +163,7 @@ noSpawn: true components: - type: Label - currentLabel: silicon + currentLabel: reagent-name-silicon - type: SolutionContainerManager solutions: beaker: @@ -178,7 +178,7 @@ noSpawn: true components: - type: Label - currentLabel: hydrogen + currentLabel: reagent-name-hydrogen - type: SolutionContainerManager solutions: beaker: @@ -193,7 +193,7 @@ noSpawn: true components: - type: Label - currentLabel: lithium + currentLabel: reagent-name-lithium - type: SolutionContainerManager solutions: beaker: @@ -208,7 +208,7 @@ noSpawn: true components: - type: Label - currentLabel: sodium + currentLabel: reagent-name-sodium - type: SolutionContainerManager solutions: beaker: @@ -223,7 +223,7 @@ noSpawn: true components: - type: Label - currentLabel: potassium + currentLabel: reagent-name-potassium - type: SolutionContainerManager solutions: beaker: @@ -238,7 +238,7 @@ noSpawn: true components: - type: Label - currentLabel: radium + currentLabel: reagent-name-radium - type: SolutionContainerManager solutions: beaker: @@ -253,7 +253,7 @@ noSpawn: true components: - type: Label - currentLabel: iron + currentLabel: reagent-name-iron - type: SolutionContainerManager solutions: beaker: @@ -268,7 +268,7 @@ noSpawn: true components: - type: Label - currentLabel: copper + currentLabel: reagent-name-copper - type: SolutionContainerManager solutions: beaker: @@ -283,7 +283,7 @@ noSpawn: true components: - type: Label - currentLabel: gold + currentLabel: reagent-name-gold - type: SolutionContainerManager solutions: beaker: @@ -298,7 +298,7 @@ noSpawn: true components: - type: Label - currentLabel: mercury + currentLabel: reagent-name-mercury - type: SolutionContainerManager solutions: beaker: @@ -313,7 +313,7 @@ noSpawn: true components: - type: Label - currentLabel: silver + currentLabel: reagent-name-silver - type: SolutionContainerManager solutions: beaker: @@ -328,7 +328,7 @@ noSpawn: true components: - type: Label - currentLabel: ethanol + currentLabel: reagent-name-ethanol - type: SolutionContainerManager solutions: beaker: @@ -343,7 +343,7 @@ noSpawn: true components: - type: Label - currentLabel: sugar + currentLabel: reagent-name-sugar - type: SolutionContainerManager solutions: beaker: @@ -358,7 +358,7 @@ noSpawn: true components: - type: Label - currentLabel: nitrogen + currentLabel: reagent-name-nitrogen - type: SolutionContainerManager solutions: beaker: @@ -373,7 +373,7 @@ noSpawn: true components: - type: Label - currentLabel: oxygen + currentLabel: reagent-name-oxygen - type: SolutionContainerManager solutions: beaker: @@ -388,7 +388,7 @@ noSpawn: true components: - type: Label - currentLabel: Plant-B-Gone + currentLabel: reagent-name-plant-b-gone - type: SolutionContainerManager solutions: beaker: @@ -403,7 +403,7 @@ noSpawn: true components: - type: Label - currentLabel: welding fuel + currentLabel: reagent-name-welding-fuel - type: SolutionContainerManager solutions: beaker: From 532928037858dd19bd0656977f286460e4ff1c45 Mon Sep 17 00:00:00 2001 From: DrSmugleaf Date: Sun, 28 Jan 2024 15:32:42 -0800 Subject: [PATCH 018/266] Add events for GunComponent values, muzzle flashes and cartridge spread (#24077) * Add a modifier event for GunComponent values * Add docs * Add VV readwrite to modified values * Add more docs * More docs * Add Gun parameter to GunRefreshModifiersEvent * Add another event for handling cartridge spread * Fix pneumatic speed (cherry picked from commit 4e8b1fb0d3ef23c79ea3ca0cec05932de03601f5) --- .../Weapons/Ranged/GunSpreadOverlay.cs | 8 +- .../Weapons/Ranged/Systems/GunSystem.cs | 15 +- .../Components/AdminMinigunComponent.cs | 7 + .../Administration/Systems/AdminGunSystem.cs | 17 +++ .../Systems/AdminVerbSystem.Tools.cs | 5 +- .../PneumaticCannon/PneumaticCannonSystem.cs | 15 +- .../Weapons/Ranged/Systems/GunSystem.cs | 24 +-- .../PneumaticCannonComponent.cs | 6 + .../Weapons/Ranged/Components/GunComponent.cs | 138 ++++++++++++++---- .../Ranged/Events/GunGetAmmoSpreadEvent.cs | 8 + .../Events/GunMuzzleFlashAttemptEvent.cs | 8 + .../Ranged/Events/GunRefreshModifiersEvent.cs | 23 +++ .../Systems/SharedGunSystem.Ballistic.cs | 4 +- .../Systems/SharedGunSystem.Interactions.cs | 6 +- .../Weapons/Ranged/Systems/SharedGunSystem.cs | 59 ++++++-- Content.Shared/Wieldable/WieldableSystem.cs | 31 ++-- 16 files changed, 284 insertions(+), 90 deletions(-) create mode 100644 Content.Server/Administration/Components/AdminMinigunComponent.cs create mode 100644 Content.Server/Administration/Systems/AdminGunSystem.cs create mode 100644 Content.Shared/Weapons/Ranged/Events/GunGetAmmoSpreadEvent.cs create mode 100644 Content.Shared/Weapons/Ranged/Events/GunMuzzleFlashAttemptEvent.cs create mode 100644 Content.Shared/Weapons/Ranged/Events/GunRefreshModifiersEvent.cs diff --git a/Content.Client/Weapons/Ranged/GunSpreadOverlay.cs b/Content.Client/Weapons/Ranged/GunSpreadOverlay.cs index 559c465e6dc..84b6ce40480 100644 --- a/Content.Client/Weapons/Ranged/GunSpreadOverlay.cs +++ b/Content.Client/Weapons/Ranged/GunSpreadOverlay.cs @@ -56,11 +56,11 @@ protected override void Draw(in OverlayDrawArgs args) return; // (☞゚ヮ゚)☞ - var maxSpread = gun.MaxAngle; - var minSpread = gun.MinAngle; + var maxSpread = gun.MaxAngleModified; + var minSpread = gun.MinAngleModified; var timeSinceLastFire = (_timing.CurTime - gun.NextFire).TotalSeconds; - var currentAngle = new Angle(MathHelper.Clamp(gun.CurrentAngle.Theta - gun.AngleDecay.Theta * timeSinceLastFire, - gun.MinAngle.Theta, gun.MaxAngle.Theta)); + var currentAngle = new Angle(MathHelper.Clamp(gun.CurrentAngle.Theta - gun.AngleDecayModified.Theta * timeSinceLastFire, + gun.MinAngleModified.Theta, gun.MaxAngleModified.Theta)); var direction = (mousePos.Position - mapPos.Position); worldHandle.DrawLine(mapPos.Position, mousePos.Position + direction, Color.Orange); diff --git a/Content.Client/Weapons/Ranged/Systems/GunSystem.cs b/Content.Client/Weapons/Ranged/Systems/GunSystem.cs index e4a95ac2c54..ce43057d631 100644 --- a/Content.Client/Weapons/Ranged/Systems/GunSystem.cs +++ b/Content.Client/Weapons/Ranged/Systems/GunSystem.cs @@ -3,7 +3,6 @@ using Content.Client.Weapons.Ranged.Components; using Content.Shared.Camera; using Content.Shared.CombatMode; -using Robust.Shared.Spawners; using Content.Shared.Weapons.Ranged; using Content.Shared.Weapons.Ranged.Components; using Content.Shared.Weapons.Ranged.Events; @@ -195,7 +194,7 @@ public override void Shoot(EntityUid gunUid, GunComponent gun, List<(EntityUid? { if (throwItems) { - Recoil(user, direction, gun.CameraRecoilScalar); + Recoil(user, direction, gun.CameraRecoilScalarModified); if (IsClientSide(ent!.Value)) Del(ent.Value); else @@ -210,8 +209,8 @@ public override void Shoot(EntityUid gunUid, GunComponent gun, List<(EntityUid? { SetCartridgeSpent(ent!.Value, cartridge, true); MuzzleFlash(gunUid, cartridge, user); - Audio.PlayPredicted(gun.SoundGunshot, gunUid, user); - Recoil(user, direction, gun.CameraRecoilScalar); + Audio.PlayPredicted(gun.SoundGunshotModified, gunUid, user); + Recoil(user, direction, gun.CameraRecoilScalarModified); // TODO: Can't predict entity deletions. //if (cartridge.DeleteOnSpawn) // Del(cartridge.Owner); @@ -228,16 +227,16 @@ public override void Shoot(EntityUid gunUid, GunComponent gun, List<(EntityUid? break; case AmmoComponent newAmmo: MuzzleFlash(gunUid, newAmmo, user); - Audio.PlayPredicted(gun.SoundGunshot, gunUid, user); - Recoil(user, direction, gun.CameraRecoilScalar); + Audio.PlayPredicted(gun.SoundGunshotModified, gunUid, user); + Recoil(user, direction, gun.CameraRecoilScalarModified); if (IsClientSide(ent!.Value)) Del(ent.Value); else RemoveShootable(ent.Value); break; case HitscanPrototype: - Audio.PlayPredicted(gun.SoundGunshot, gunUid, user); - Recoil(user, direction, gun.CameraRecoilScalar); + Audio.PlayPredicted(gun.SoundGunshotModified, gunUid, user); + Recoil(user, direction, gun.CameraRecoilScalarModified); break; } } diff --git a/Content.Server/Administration/Components/AdminMinigunComponent.cs b/Content.Server/Administration/Components/AdminMinigunComponent.cs new file mode 100644 index 00000000000..368d3d3ba76 --- /dev/null +++ b/Content.Server/Administration/Components/AdminMinigunComponent.cs @@ -0,0 +1,7 @@ +namespace Content.Server.Administration.Components; + +[RegisterComponent] +public sealed partial class AdminMinigunComponent : Component +{ + +} diff --git a/Content.Server/Administration/Systems/AdminGunSystem.cs b/Content.Server/Administration/Systems/AdminGunSystem.cs new file mode 100644 index 00000000000..6270481a3c3 --- /dev/null +++ b/Content.Server/Administration/Systems/AdminGunSystem.cs @@ -0,0 +1,17 @@ +using Content.Server.Administration.Components; +using Content.Shared.Weapons.Ranged.Events; + +namespace Content.Server.Administration.Systems; + +public sealed class AdminGunSystem : EntitySystem +{ + public override void Initialize() + { + SubscribeLocalEvent(OnGunRefreshModifiers); + } + + private void OnGunRefreshModifiers(Entity ent, ref GunRefreshModifiersEvent args) + { + args.FireRate = 15; + } +} diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs b/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs index 7dbbacb3409..296e48274c6 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs @@ -12,6 +12,7 @@ using Content.Server.Stack; using Content.Server.Station.Components; using Content.Server.Station.Systems; +using Content.Server.Weapons.Ranged.Systems; using Content.Shared.Access; using Content.Shared.Access.Components; using Content.Shared.Access.Systems; @@ -52,6 +53,7 @@ public sealed partial class AdminVerbSystem [Dependency] private readonly BatterySystem _batterySystem = default!; [Dependency] private readonly SharedTransformSystem _xformSystem = default!; [Dependency] private readonly MetaDataSystem _metaSystem = default!; + [Dependency] private readonly GunSystem _gun = default!; private void AddTricksVerbs(GetVerbsEvent args) { @@ -697,7 +699,8 @@ private void AddTricksVerbs(GetVerbsEvent args) Icon = new SpriteSpecifier.Rsi(new("/Textures/Objects/Weapons/Guns/HMGs/minigun.rsi"), "icon"), Act = () => { - gun.FireRate = 15; + EnsureComp(args.Target); + _gun.RefreshModifiers((args.Target, gun)); }, Impact = LogImpact.Medium, Message = Loc.GetString("admin-trick-minigun-fire-description"), diff --git a/Content.Server/PneumaticCannon/PneumaticCannonSystem.cs b/Content.Server/PneumaticCannon/PneumaticCannonSystem.cs index 9db9aa296d8..60f0603074d 100644 --- a/Content.Server/PneumaticCannon/PneumaticCannonSystem.cs +++ b/Content.Server/PneumaticCannon/PneumaticCannonSystem.cs @@ -2,12 +2,14 @@ using Content.Server.Atmos.EntitySystems; using Content.Server.Storage.EntitySystems; using Content.Server.Stunnable; +using Content.Server.Weapons.Ranged.Systems; using Content.Shared.Containers.ItemSlots; using Content.Shared.Interaction; using Content.Shared.PneumaticCannon; using Content.Shared.StatusEffect; using Content.Shared.Tools.Components; using Content.Shared.Weapons.Ranged.Components; +using Content.Shared.Weapons.Ranged.Events; using Content.Shared.Weapons.Ranged.Systems; using Robust.Shared.Containers; @@ -17,6 +19,7 @@ public sealed class PneumaticCannonSystem : SharedPneumaticCannonSystem { [Dependency] private readonly AtmosphereSystem _atmos = default!; [Dependency] private readonly GasTankSystem _gasTank = default!; + [Dependency] private readonly GunSystem _gun = default!; [Dependency] private readonly StunSystem _stun = default!; [Dependency] private readonly ItemSlotsSystem _slots = default!; @@ -27,6 +30,7 @@ public override void Initialize() SubscribeLocalEvent(OnInteractUsing, before: new []{ typeof(StorageSystem) }); SubscribeLocalEvent(OnShoot); SubscribeLocalEvent(OnContainerInserting); + SubscribeLocalEvent(OnGunRefreshModifiers); } private void OnInteractUsing(EntityUid uid, PneumaticCannonComponent component, InteractUsingEvent args) @@ -47,10 +51,9 @@ private void OnInteractUsing(EntityUid uid, PneumaticCannonComponent component, Popup.PopupEntity(Loc.GetString("pneumatic-cannon-component-change-power", ("power", component.Power.ToString())), uid, args.User); + component.ProjectileSpeed = GetProjectileSpeedFromPower(component); if (TryComp(uid, out var gun)) - { - gun.ProjectileSpeed = GetProjectileSpeedFromPower(component); - } + _gun.RefreshModifiers((uid, gun)); args.Handled = true; } @@ -105,6 +108,12 @@ private void OnShoot(Entity cannon, ref GunShotEvent a _slots.TryEject(uid, PneumaticCannonComponent.TankSlotId, args.User, out _); } + private void OnGunRefreshModifiers(Entity ent, ref GunRefreshModifiersEvent args) + { + if (ent.Comp.ProjectileSpeed is { } speed) + args.ProjectileSpeed = speed; + } + /// /// Returns whether the pneumatic cannon has enough gas to shoot an item, as well as the tank itself. /// diff --git a/Content.Server/Weapons/Ranged/Systems/GunSystem.cs b/Content.Server/Weapons/Ranged/Systems/GunSystem.cs index 4e4bdf78b10..007f30a2845 100644 --- a/Content.Server/Weapons/Ranged/Systems/GunSystem.cs +++ b/Content.Server/Weapons/Ranged/Systems/GunSystem.cs @@ -10,7 +10,6 @@ using Content.Shared.Damage.Systems; using Content.Shared.Database; using Content.Shared.Effects; -using Content.Shared.FixedPoint; using Content.Shared.Interaction.Components; using Content.Shared.Projectiles; using Content.Shared.Weapons.Melee; @@ -19,11 +18,9 @@ using Content.Shared.Weapons.Ranged.Events; using Content.Shared.Weapons.Ranged.Systems; using Content.Shared.Weapons.Reflect; -using Robust.Server.GameObjects; using Robust.Shared.Audio; using Robust.Shared.Map; using Robust.Shared.Physics; -using Robust.Shared.Physics.Components; using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Utility; @@ -156,8 +153,11 @@ public override void Shoot(EntityUid gunUid, GunComponent gun, List<(EntityUid? } if (cartridge.Count > 1) { - var angles = LinearSpread(mapAngle - cartridge.Spread / 2, - mapAngle + cartridge.Spread / 2, cartridge.Count); + var ev = new GunGetAmmoSpreadEvent(cartridge.Spread); + RaiseLocalEvent(gunUid, ref ev); + + var angles = LinearSpread(mapAngle - ev.Spread / 2, + mapAngle + ev.Spread / 2, cartridge.Count); for (var i = 0; i < cartridge.Count; i++) { @@ -180,7 +180,7 @@ public override void Shoot(EntityUid gunUid, GunComponent gun, List<(EntityUid? SetCartridgeSpent(ent.Value, cartridge, true); MuzzleFlash(gunUid, cartridge, user); - Audio.PlayPredicted(gun.SoundGunshot, gunUid, user); + Audio.PlayPredicted(gun.SoundGunshotModified, gunUid, user); if (cartridge.DeleteOnSpawn) Del(ent.Value); @@ -201,7 +201,7 @@ public override void Shoot(EntityUid gunUid, GunComponent gun, List<(EntityUid? case AmmoComponent newAmmo: shotProjectiles.Add(ent!.Value); MuzzleFlash(gunUid, newAmmo, user); - Audio.PlayPredicted(gun.SoundGunshot, gunUid, user); + Audio.PlayPredicted(gun.SoundGunshotModified, gunUid, user); ShootOrThrow(ent.Value, mapDirection, gunVelocity, gun, gunUid, user); break; case HitscanPrototype hitscan: @@ -288,7 +288,7 @@ public override void Shoot(EntityUid gunUid, GunComponent gun, List<(EntityUid? FireEffects(fromEffect, hitscan.MaxLength, dir.ToAngle(), hitscan); } - Audio.PlayPredicted(gun.SoundGunshot, gunUid, user); + Audio.PlayPredicted(gun.SoundGunshotModified, gunUid, user); break; default: throw new ArgumentOutOfRangeException(); @@ -308,11 +308,11 @@ private void ShootOrThrow(EntityUid uid, Vector2 mapDirection, Vector2 gunVeloci { RemoveShootable(uid); // TODO: Someone can probably yeet this a billion miles so need to pre-validate input somewhere up the call stack. - ThrowingSystem.TryThrow(uid, mapDirection, gun.ProjectileSpeed, user); + ThrowingSystem.TryThrow(uid, mapDirection, gun.ProjectileSpeedModified, user); return; } - ShootProjectile(uid, mapDirection, gunVelocity, gunUid, user, gun.ProjectileSpeed); + ShootProjectile(uid, mapDirection, gunVelocity, gunUid, user, gun.ProjectileSpeedModified); } /// @@ -337,7 +337,7 @@ private Angle[] LinearSpread(Angle start, Angle end, int intervals) private Angle GetRecoilAngle(TimeSpan curTime, GunComponent component, Angle direction) { var timeSinceLastFire = (curTime - component.LastFire).TotalSeconds; - var newTheta = MathHelper.Clamp(component.CurrentAngle.Theta + component.AngleIncrease.Theta - component.AngleDecay.Theta * timeSinceLastFire, component.MinAngle.Theta, component.MaxAngle.Theta); + var newTheta = MathHelper.Clamp(component.CurrentAngle.Theta + component.AngleIncreaseModified.Theta - component.AngleDecayModified.Theta * timeSinceLastFire, component.MinAngleModified.Theta, component.MaxAngleModified.Theta); component.CurrentAngle = new Angle(newTheta); component.LastFire = component.NextFire; @@ -345,7 +345,7 @@ private Angle GetRecoilAngle(TimeSpan curTime, GunComponent component, Angle dir var random = Random.NextFloat(-0.5f, 0.5f); var spread = component.CurrentAngle.Theta * random; var angle = new Angle(direction.Theta + component.CurrentAngle.Theta * random); - DebugTools.Assert(spread <= component.MaxAngle.Theta); + DebugTools.Assert(spread <= component.MaxAngleModified.Theta); return angle; } diff --git a/Content.Shared/PneumaticCannon/PneumaticCannonComponent.cs b/Content.Shared/PneumaticCannon/PneumaticCannonComponent.cs index 8c760abe58a..f3726c802e8 100644 --- a/Content.Shared/PneumaticCannon/PneumaticCannonComponent.cs +++ b/Content.Shared/PneumaticCannon/PneumaticCannonComponent.cs @@ -38,6 +38,12 @@ public sealed partial class PneumaticCannonComponent : Component [DataField("baseProjectileSpeed")] public float BaseProjectileSpeed = 20f; + /// + /// The current projectile speed setting. + /// + [DataField] + public float? ProjectileSpeed; + /// /// If true, will throw ammo rather than shoot it. /// diff --git a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs index 95853bbd2ea..c3335a1ad06 100644 --- a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs +++ b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs @@ -1,5 +1,7 @@ using Content.Shared.Damage; using Content.Shared.Tag; +using Content.Shared.Weapons.Ranged.Events; +using Content.Shared.Weapons.Ranged.Systems; using Robust.Shared.Audio; using Robust.Shared.GameStates; using Robust.Shared.Map; @@ -8,23 +10,33 @@ namespace Content.Shared.Weapons.Ranged.Components; -[RegisterComponent, NetworkedComponent, Virtual] -[AutoGenerateComponentState] -public partial class GunComponent : Component +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(SharedGunSystem))] +public sealed partial class GunComponent : Component { #region Sound - [ViewVariables(VVAccess.ReadWrite), DataField("soundGunshot")] + /// + /// The base sound to use when the gun is fired. + /// + [DataField] public SoundSpecifier? SoundGunshot = new SoundPathSpecifier("/Audio/Weapons/Guns/Gunshots/smg.ogg"); - [ViewVariables(VVAccess.ReadWrite), DataField("soundEmpty")] + /// + /// The sound to use when the gun is fired. + /// + /// + [AutoNetworkedField, ViewVariables(VVAccess.ReadWrite)] + public SoundSpecifier? SoundGunshotModified; + + [DataField] public SoundSpecifier? SoundEmpty = new SoundPathSpecifier("/Audio/Weapons/Guns/Empty/empty.ogg"); /// /// Sound played when toggling the for this gun. /// - [ViewVariables(VVAccess.ReadWrite), DataField("soundMode")] - public SoundSpecifier? SoundModeToggle = new SoundPathSpecifier("/Audio/Weapons/Guns/Misc/selector.ogg"); + [DataField] + public SoundSpecifier? SoundMode = new SoundPathSpecifier("/Audio/Weapons/Guns/Misc/selector.ogg"); #endregion @@ -32,59 +44,94 @@ public partial class GunComponent : Component // These values are very small for now until we get a debug overlay and fine tune it + /// + /// The base scalar value applied to the vector governing camera recoil. + /// + [DataField, AutoNetworkedField] + public float CameraRecoilScalar = 1f; + /// /// A scalar value applied to the vector governing camera recoil. /// If 0, there will be no camera recoil. + /// /// - [DataField("cameraRecoilScalar"), ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] - public float CameraRecoilScalar = 1f; + [AutoNetworkedField, ViewVariables(VVAccess.ReadWrite)] + public float CameraRecoilScalarModified = 1f; /// /// Last time the gun fired. /// Used for recoil purposes. /// - [DataField("lastFire")] + [DataField] public TimeSpan LastFire = TimeSpan.Zero; /// /// What the current spread is for shooting. This gets changed every time the gun fires. /// - [DataField("currentAngle")] + [DataField] [AutoNetworkedField] public Angle CurrentAngle; /// - /// How much the spread increases every time the gun fires. + /// The base value for how much the spread increases every time the gun fires. /// - [ViewVariables(VVAccess.ReadWrite), DataField("angleIncrease")] + [DataField] public Angle AngleIncrease = Angle.FromDegrees(0.5); /// - /// How much the decreases per second. + /// How much the spread increases every time the gun fires. + /// + /// + [AutoNetworkedField, ViewVariables(VVAccess.ReadWrite)] + public Angle AngleIncreaseModified; + + /// + /// The base value for how much the decreases per second. /// - [DataField("angleDecay")] + [DataField] public Angle AngleDecay = Angle.FromDegrees(4); /// - /// The maximum angle allowed for + /// How much the decreases per second. + /// /// - [ViewVariables(VVAccess.ReadWrite), DataField("maxAngle")] + [AutoNetworkedField, ViewVariables(VVAccess.ReadWrite)] + public Angle AngleDecayModified; + + /// + /// The base value for the maximum angle allowed for + /// + [DataField] [AutoNetworkedField] public Angle MaxAngle = Angle.FromDegrees(2); /// - /// The minimum angle allowed for + /// The maximum angle allowed for + /// + /// + [AutoNetworkedField, ViewVariables(VVAccess.ReadWrite)] + public Angle MaxAngleModified; + + /// + /// The base value for the minimum angle allowed for /// - [ViewVariables(VVAccess.ReadWrite), DataField("minAngle")] + [DataField] [AutoNetworkedField] public Angle MinAngle = Angle.FromDegrees(1); + /// + /// The minimum angle allowed for . + /// + /// + [AutoNetworkedField, ViewVariables(VVAccess.ReadWrite)] + public Angle MinAngleModified; + #endregion /// /// Whether this gun is shot via the use key or the alt-use key. /// - [ViewVariables(VVAccess.ReadWrite), DataField("useKey"), AutoNetworkedField] + [DataField, AutoNetworkedField] public bool UseKey = true; /// @@ -93,6 +140,19 @@ public partial class GunComponent : Component [ViewVariables] public EntityCoordinates? ShootCoordinates = null; + /// + /// The base value for how many shots to fire per burst. + /// + [DataField, AutoNetworkedField] + public int ShotsPerBurst = 3; + + /// + /// How many shots to fire per burst. + /// + /// + [AutoNetworkedField, ViewVariables(VVAccess.ReadWrite)] + public int ShotsPerBurstModified = 3; + /// /// Used for tracking semi-auto / burst /// @@ -101,55 +161,69 @@ public partial class GunComponent : Component public int ShotCounter = 0; /// - /// How many times it shoots per second. + /// The base value for how many times it shoots per second. /// - [ViewVariables(VVAccess.ReadWrite), DataField("fireRate")] + [DataField] [AutoNetworkedField] public float FireRate = 8f; + /// + /// How many times it shoots per second. + /// + /// + [AutoNetworkedField, ViewVariables(VVAccess.ReadWrite)] + public float FireRateModified; + /// /// Starts fire cooldown when equipped if true. /// - [ViewVariables(VVAccess.ReadWrite), DataField("resetOnHandSelected")] + [DataField] public bool ResetOnHandSelected = true; /// /// Type of ammo the gun can work with /// - [ViewVariables(VVAccess.ReadWrite), DataField("compatibleAmmo")] + [DataField] public List>? CompatibleAmmo; /// /// Damage the gun deals when used with wrong ammo /// - [ViewVariables(VVAccess.ReadWrite), DataField("damageOnWrongAmmo")] + [DataField] public DamageSpecifier? DamageOnWrongAmmo = null; /// - /// How fast the projectile moves. + /// The base value for how fast the projectile moves. /// - [ViewVariables(VVAccess.ReadWrite), DataField("projectileSpeed")] + [DataField] public float ProjectileSpeed = 25f; + /// + /// How fast the projectile moves. + /// + /// + [AutoNetworkedField, ViewVariables(VVAccess.ReadWrite)] + public float ProjectileSpeedModified; + /// /// When the gun is next available to be shot. /// Can be set multiple times in a single tick due to guns firing faster than a single tick time. /// - [DataField("nextFire", customTypeSerializer:typeof(TimeOffsetSerializer))] + [DataField(customTypeSerializer:typeof(TimeOffsetSerializer))] [AutoNetworkedField] public TimeSpan NextFire = TimeSpan.Zero; /// /// What firemodes can be selected. /// - [ViewVariables(VVAccess.ReadWrite), DataField("availableModes")] + [DataField] [AutoNetworkedField] public SelectiveFire AvailableModes = SelectiveFire.SemiAuto; /// /// What firemode is currently selected. /// - [ViewVariables(VVAccess.ReadWrite), DataField("selectedMode")] + [DataField] [AutoNetworkedField] public SelectiveFire SelectedMode = SelectiveFire.SemiAuto; @@ -157,14 +231,14 @@ public partial class GunComponent : Component /// Whether or not information about /// the gun will be shown on examine. /// - [DataField("showExamineText")] + [DataField] public bool ShowExamineText = true; /// /// Whether or not someone with the /// clumsy trait can shoot this /// - [DataField("clumsyProof"), ViewVariables(VVAccess.ReadWrite)] + [DataField] public bool ClumsyProof = false; } diff --git a/Content.Shared/Weapons/Ranged/Events/GunGetAmmoSpreadEvent.cs b/Content.Shared/Weapons/Ranged/Events/GunGetAmmoSpreadEvent.cs new file mode 100644 index 00000000000..63419ab0f54 --- /dev/null +++ b/Content.Shared/Weapons/Ranged/Events/GunGetAmmoSpreadEvent.cs @@ -0,0 +1,8 @@ +namespace Content.Shared.Weapons.Ranged.Events; + +/// +/// Raised directed on the gun entity when ammo is shot to calculate its spread. +/// +/// The spread of the ammo, can be changed by handlers. +[ByRefEvent] +public record struct GunGetAmmoSpreadEvent(Angle Spread); diff --git a/Content.Shared/Weapons/Ranged/Events/GunMuzzleFlashAttemptEvent.cs b/Content.Shared/Weapons/Ranged/Events/GunMuzzleFlashAttemptEvent.cs new file mode 100644 index 00000000000..d6a24753080 --- /dev/null +++ b/Content.Shared/Weapons/Ranged/Events/GunMuzzleFlashAttemptEvent.cs @@ -0,0 +1,8 @@ +namespace Content.Shared.Weapons.Ranged.Events; + +/// +/// Raised directed on the gun entity when a muzzle flash is about to happen. +/// +/// If set to true, the muzzle flash will not be shown. +[ByRefEvent] +public record struct GunMuzzleFlashAttemptEvent(bool Cancelled); diff --git a/Content.Shared/Weapons/Ranged/Events/GunRefreshModifiersEvent.cs b/Content.Shared/Weapons/Ranged/Events/GunRefreshModifiersEvent.cs new file mode 100644 index 00000000000..0ad79bd74af --- /dev/null +++ b/Content.Shared/Weapons/Ranged/Events/GunRefreshModifiersEvent.cs @@ -0,0 +1,23 @@ +using Content.Shared.Weapons.Ranged.Components; +using Content.Shared.Weapons.Ranged.Systems; +using Robust.Shared.Audio; + +namespace Content.Shared.Weapons.Ranged.Events; + +/// +/// Raised directed on the gun entity when +/// is called, to update the values of from other systems. +/// +[ByRefEvent] +public record struct GunRefreshModifiersEvent( + Entity Gun, + SoundSpecifier? SoundGunshot, + float CameraRecoilScalar, + Angle AngleIncrease, + Angle AngleDecay, + Angle MaxAngle, + Angle MinAngle, + int ShotsPerBurst, + float FireRate, + float ProjectileSpeed +); diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs index 501d0069a75..a8f7ee23956 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs @@ -183,10 +183,10 @@ private void ManualCycle(EntityUid uid, BallisticAmmoProviderComponent component // Reset shotting for cycling if (Resolve(uid, ref gunComp, false) && - gunComp is { FireRate: > 0f } && + gunComp is { FireRateModified: > 0f } && !Paused(uid)) { - gunComp.NextFire = Timing.CurTime + TimeSpan.FromSeconds(1 / gunComp.FireRate); + gunComp.NextFire = Timing.CurTime + TimeSpan.FromSeconds(1 / gunComp.FireRateModified); } Dirty(uid, component); diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Interactions.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Interactions.cs index 852096a3864..d47d024de5e 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Interactions.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Interactions.cs @@ -19,7 +19,7 @@ private void OnExamine(EntityUid uid, GunComponent component, ExaminedEvent args args.PushMarkup(Loc.GetString("gun-selected-mode-examine", ("color", ModeExamineColor), ("mode", GetLocSelector(component.SelectedMode)))); args.PushMarkup(Loc.GetString("gun-fire-rate-examine", ("color", FireRateExamineColor), - ("fireRate", $"{component.FireRate:0.0}"))); + ("fireRate", $"{component.FireRateModified:0.0}"))); } } @@ -80,7 +80,7 @@ private void SelectFire(EntityUid uid, GunComponent component, SelectiveFire fir component.NextFire += cooldown; } - Audio.PlayPredicted(component.SoundModeToggle, uid, user); + Audio.PlayPredicted(component.SoundMode, uid, user); Popup(Loc.GetString("gun-selected-mode", ("mode", GetLocSelector(fire))), uid, user); Dirty(uid, component); } @@ -112,7 +112,7 @@ private void OnCycleMode(EntityUid uid, GunComponent component, CycleModeEvent a private void OnGunSelected(EntityUid uid, GunComponent component, HandSelectedEvent args) { - var fireDelay = 1f / component.FireRate; + var fireDelay = 1f / component.FireRateModified; if (fireDelay.Equals(0f)) return; diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs index a86e07c7720..6fba3d8fa68 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs @@ -96,18 +96,19 @@ public override void Initialize() SubscribeLocalEvent(OnCycleMode); SubscribeLocalEvent(OnGunSelected); SubscribeLocalEvent(OnGunUnpaused); - -#if DEBUG SubscribeLocalEvent(OnMapInit); } - private void OnMapInit(EntityUid uid, GunComponent component, MapInitEvent args) + private void OnMapInit(Entity gun, ref MapInitEvent args) { - if (component.NextFire > Timing.CurTime) - Log.Warning($"Initializing a map that contains an entity that is on cooldown. Entity: {ToPrettyString(uid)}"); +#if DEBUG + if (gun.Comp.NextFire > Timing.CurTime) + Log.Warning($"Initializing a map that contains an entity that is on cooldown. Entity: {ToPrettyString(gun)}"); - DebugTools.Assert((component.AvailableModes & component.SelectedMode) != 0x0); + DebugTools.Assert((gun.Comp.AvailableModes & gun.Comp.SelectedMode) != 0x0); #endif + + RefreshModifiers((gun, gun)); } private void OnGunMelee(EntityUid uid, GunComponent component, MeleeHitEvent args) @@ -231,7 +232,7 @@ public void AttemptShoot(EntityUid gunUid, GunComponent gun) private void AttemptShoot(EntityUid user, EntityUid gunUid, GunComponent gun) { - if (gun.FireRate <= 0f || + if (gun.FireRateModified <= 0f || !_actionBlockerSystem.CanAttack(user)) return; @@ -261,7 +262,7 @@ private void AttemptShoot(EntityUid user, EntityUid gunUid, GunComponent gun) if (gun.NextFire > curTime) return; - var fireRate = TimeSpan.FromSeconds(1f / gun.FireRate); + var fireRate = TimeSpan.FromSeconds(1f / gun.FireRateModified); // First shot // Previously we checked shotcounter but in some cases all the bullets got dumped at once @@ -289,7 +290,7 @@ private void AttemptShoot(EntityUid user, EntityUid gunUid, GunComponent gun) shots = Math.Min(shots, 1 - gun.ShotCounter); break; case SelectiveFire.Burst: - shots = Math.Min(shots, 3 - gun.ShotCounter); + shots = Math.Min(shots, gun.ShotsPerBurstModified - gun.ShotCounter); break; case SelectiveFire.FullAuto: break; @@ -470,6 +471,11 @@ protected void RemoveShootable(EntityUid uid) protected void MuzzleFlash(EntityUid gun, AmmoComponent component, EntityUid? user = null) { + var attemptEv = new GunMuzzleFlashAttemptEvent(); + RaiseLocalEvent(gun, ref attemptEv); + if (attemptEv.Cancelled) + return; + var sprite = component.MuzzleFlash; if (sprite == null) @@ -489,6 +495,41 @@ public void CauseImpulse(EntityCoordinates fromCoordinates, EntityCoordinates to var impulseVector = shotDirection * impulseStrength; Physics.ApplyLinearImpulse(user, -impulseVector, body: userPhysics); } + + public void RefreshModifiers(Entity gun) + { + if (!Resolve(gun, ref gun.Comp)) + return; + + var comp = gun.Comp; + var ev = new GunRefreshModifiersEvent( + (gun, comp), + comp.SoundGunshot, + comp.CameraRecoilScalar, + comp.AngleIncrease, + comp.AngleDecay, + comp.MaxAngle, + comp.MinAngle, + comp.ShotsPerBurst, + comp.FireRate, + comp.ProjectileSpeed + ); + + RaiseLocalEvent(gun, ref ev); + + comp.SoundGunshotModified = ev.SoundGunshot; + comp.CameraRecoilScalarModified = ev.CameraRecoilScalar; + comp.AngleIncreaseModified = ev.AngleIncrease; + comp.AngleDecayModified = ev.AngleDecay; + comp.MaxAngleModified = ev.MaxAngle; + comp.MinAngleModified = ev.MinAngle; + comp.ShotsPerBurstModified = ev.ShotsPerBurst; + comp.FireRateModified = ev.FireRate; + comp.ProjectileSpeedModified = ev.ProjectileSpeed; + + Dirty(gun); + } + protected abstract void CreateEffect(EntityUid uid, MuzzleFlashEvent message, EntityUid? user = null); /// diff --git a/Content.Shared/Wieldable/WieldableSystem.cs b/Content.Shared/Wieldable/WieldableSystem.cs index 54b030b9eb2..b7529328793 100644 --- a/Content.Shared/Wieldable/WieldableSystem.cs +++ b/Content.Shared/Wieldable/WieldableSystem.cs @@ -11,6 +11,7 @@ using Content.Shared.Weapons.Melee.Components; using Content.Shared.Weapons.Melee.Events; using Content.Shared.Weapons.Ranged.Components; +using Content.Shared.Weapons.Ranged.Events; using Content.Shared.Weapons.Ranged.Systems; using Content.Shared.Wieldable.Components; using Robust.Shared.Audio.Systems; @@ -27,6 +28,7 @@ public sealed class WieldableSystem : EntitySystem [Dependency] private readonly SharedAudioSystem _audioSystem = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly UseDelaySystem _delay = default!; + [Dependency] private readonly SharedGunSystem _gun = default!; public override void Initialize() { @@ -42,6 +44,7 @@ public override void Initialize() SubscribeLocalEvent(OnShootAttempt); SubscribeLocalEvent(OnGunWielded); SubscribeLocalEvent(OnGunUnwielded); + SubscribeLocalEvent(OnGunRefreshModifiers); SubscribeLocalEvent(OnGetMeleeDamage); } @@ -72,22 +75,22 @@ private void OnShootAttempt(EntityUid uid, GunRequiresWieldComponent component, private void OnGunUnwielded(EntityUid uid, GunWieldBonusComponent component, ItemUnwieldedEvent args) { - if (!TryComp(uid, out var gun)) - return; - - gun.MinAngle -= component.MinAngle; - gun.MaxAngle -= component.MaxAngle; - Dirty(uid, gun); + _gun.RefreshModifiers(uid); } private void OnGunWielded(EntityUid uid, GunWieldBonusComponent component, ref ItemWieldedEvent args) { - if (!TryComp(uid, out var gun)) - return; + _gun.RefreshModifiers(uid); + } - gun.MinAngle += component.MinAngle; - gun.MaxAngle += component.MaxAngle; - Dirty(uid, gun); + private void OnGunRefreshModifiers(Entity bonus, ref GunRefreshModifiersEvent args) + { + if (TryComp(bonus, out WieldableComponent? wield) && + wield.Wielded) + { + args.MinAngle += bonus.Comp.MinAngle; + args.MaxAngle += bonus.Comp.MaxAngle; + } } private void AddToggleWieldVerb(EntityUid uid, WieldableComponent component, GetVerbsEvent args) @@ -214,6 +217,7 @@ public bool TryUnwield(EntityUid used, WieldableComponent component, EntityUid u if (ev.Cancelled) return false; + component.Wielded = false; var targEv = new ItemUnwieldedEvent(user); RaiseLocalEvent(used, targEv); @@ -225,16 +229,11 @@ private void OnItemUnwielded(EntityUid uid, WieldableComponent component, ItemUn if (args.User == null) return; - if (!component.Wielded) - return; - if (TryComp(uid, out var item)) { _itemSystem.SetHeldPrefix(uid, component.OldInhandPrefix, component: item); } - component.Wielded = false; - if (!args.Force) // don't play sound/popup if this was a forced unwield { if (component.UnwieldSound != null) From 823d9dd892b5321738a1685bd93c0d14730c7366 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Mon, 29 Jan 2024 11:09:56 +1100 Subject: [PATCH 019/266] BatteryWeaponFireModes refactor (#24502) * BatteryWeaponFireModes refactor Made the code a bit better but still needs integrating into attachments. * murder * Fix serialization * weh * weh (cherry picked from commit 58b55ba06c5de031079915a607ccf3adad781f93) --- .../BatteryWeaponFireModesComponent.cs | 23 +++--- .../Systems/BatteryWeaponFireModesSystem.cs | 73 +++++++------------ .../Weapons/Ranged/Systems/SharedGunSystem.cs | 2 +- 3 files changed, 41 insertions(+), 57 deletions(-) rename {Content.Server => Content.Shared}/Weapons/Ranged/Components/BatteryWeaponFireModesComponent.cs (62%) rename {Content.Server => Content.Shared}/Weapons/Ranged/Systems/BatteryWeaponFireModesSystem.cs (59%) diff --git a/Content.Server/Weapons/Ranged/Components/BatteryWeaponFireModesComponent.cs b/Content.Shared/Weapons/Ranged/Components/BatteryWeaponFireModesComponent.cs similarity index 62% rename from Content.Server/Weapons/Ranged/Components/BatteryWeaponFireModesComponent.cs rename to Content.Shared/Weapons/Ranged/Components/BatteryWeaponFireModesComponent.cs index 0d2b05d36c5..b0ca1f215cc 100644 --- a/Content.Server/Weapons/Ranged/Components/BatteryWeaponFireModesComponent.cs +++ b/Content.Shared/Weapons/Ranged/Components/BatteryWeaponFireModesComponent.cs @@ -1,13 +1,14 @@ +using Content.Shared.Weapons.Ranged.Systems; +using Robust.Shared.GameStates; using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -using Content.Server.Weapons.Ranged.Systems; +using Robust.Shared.Serialization; -namespace Content.Server.Weapons.Ranged.Components; +namespace Content.Shared.Weapons.Ranged.Components; /// /// Allows battery weapons to fire different types of projectiles /// -[RegisterComponent] +[RegisterComponent, NetworkedComponent] [Access(typeof(BatteryWeaponFireModesSystem))] [AutoGenerateComponentState] public sealed partial class BatteryWeaponFireModesComponent : Component @@ -15,30 +16,30 @@ public sealed partial class BatteryWeaponFireModesComponent : Component /// /// A list of the different firing modes the weapon can switch between /// - [DataField("fireModes", required: true)] + [DataField(required: true)] [AutoNetworkedField] public List FireModes = new(); /// /// The currently selected firing mode /// - [DataField("currentFireMode")] + [DataField] [AutoNetworkedField] - public BatteryWeaponFireMode? CurrentFireMode = default!; + public int CurrentFireMode; } -[DataDefinition] +[DataDefinition, Serializable, NetSerializable] public sealed partial class BatteryWeaponFireMode { /// /// The projectile prototype associated with this firing mode /// - [DataField("proto", required: true, customTypeSerializer: typeof(PrototypeIdSerializer))] - public string Prototype = default!; + [DataField("proto", required: true)] + public EntProtoId Prototype = default!; /// /// The battery cost to fire the projectile associated with this firing mode /// - [DataField("fireCost")] + [DataField] public float FireCost = 100; } diff --git a/Content.Server/Weapons/Ranged/Systems/BatteryWeaponFireModesSystem.cs b/Content.Shared/Weapons/Ranged/Systems/BatteryWeaponFireModesSystem.cs similarity index 59% rename from Content.Server/Weapons/Ranged/Systems/BatteryWeaponFireModesSystem.cs rename to Content.Shared/Weapons/Ranged/Systems/BatteryWeaponFireModesSystem.cs index 90859d40682..68fb2f27c98 100644 --- a/Content.Server/Weapons/Ranged/Systems/BatteryWeaponFireModesSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/BatteryWeaponFireModesSystem.cs @@ -1,19 +1,18 @@ -using Content.Server.Popups; -using Content.Server.Weapons.Ranged.Components; +using System.Linq; using Content.Shared.Database; using Content.Shared.Examine; using Content.Shared.Interaction; +using Content.Shared.Popups; using Content.Shared.Verbs; using Content.Shared.Weapons.Ranged.Components; using Robust.Shared.Prototypes; -using System.Linq; -namespace Content.Server.Weapons.Ranged.Systems; +namespace Content.Shared.Weapons.Ranged.Systems; public sealed class BatteryWeaponFireModesSystem : EntitySystem { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly PopupSystem _popupSystem = default!; + [Dependency] private readonly SharedPopupSystem _popupSystem = default!; public override void Initialize() { @@ -26,51 +25,47 @@ public override void Initialize() private void OnExamined(EntityUid uid, BatteryWeaponFireModesComponent component, ExaminedEvent args) { - if (component.FireModes == null || component.FireModes.Count < 2) + if (component.FireModes.Count < 2) return; - if (component.CurrentFireMode == null) - { - SetFireMode(uid, component, component.FireModes.First()); - } - - if (component.CurrentFireMode?.Prototype == null) - return; + var fireMode = GetMode(component); - if (!_prototypeManager.TryIndex(component.CurrentFireMode.Prototype, out var proto)) + if (!_prototypeManager.TryIndex(fireMode.Prototype, out var proto)) return; args.PushMarkup(Loc.GetString("gun-set-fire-mode", ("mode", proto.Name))); } + private BatteryWeaponFireMode GetMode(BatteryWeaponFireModesComponent component) + { + return component.FireModes[component.CurrentFireMode]; + } + private void OnGetVerb(EntityUid uid, BatteryWeaponFireModesComponent component, GetVerbsEvent args) { if (!args.CanAccess || !args.CanInteract || args.Hands == null) return; - if (component.FireModes == null || component.FireModes.Count < 2) + if (component.FireModes.Count < 2) return; - if (component.CurrentFireMode == null) - { - SetFireMode(uid, component, component.FireModes.First()); - } - - foreach (var fireMode in component.FireModes) + for (var i = 0; i < component.FireModes.Count; i++) { + var fireMode = component.FireModes[i]; var entProto = _prototypeManager.Index(fireMode.Prototype); + var index = i; var v = new Verb { Priority = 1, Category = VerbCategory.SelectType, Text = entProto.Name, - Disabled = fireMode == component.CurrentFireMode, + Disabled = i == component.CurrentFireMode, Impact = LogImpact.Low, DoContactInteraction = true, Act = () => { - SetFireMode(uid, component, fireMode, args.User); + SetFireMode(uid, component, index, args.User); } }; @@ -80,7 +75,7 @@ private void OnGetVerb(EntityUid uid, BatteryWeaponFireModesComponent component, private void OnInteractHandEvent(EntityUid uid, BatteryWeaponFireModesComponent component, ActivateInWorldEvent args) { - if (component.FireModes == null || component.FireModes.Count < 2) + if (component.FireModes.Count < 2) return; CycleFireMode(uid, component, args.User); @@ -88,30 +83,18 @@ private void OnInteractHandEvent(EntityUid uid, BatteryWeaponFireModesComponent private void CycleFireMode(EntityUid uid, BatteryWeaponFireModesComponent component, EntityUid user) { - int index = (component.CurrentFireMode != null) ? - Math.Max(component.FireModes.IndexOf(component.CurrentFireMode), 0) + 1 : 1; - - BatteryWeaponFireMode? fireMode; - - if (index >= component.FireModes.Count) - { - fireMode = component.FireModes.FirstOrDefault(); - } - - else - { - fireMode = component.FireModes[index]; - } + if (component.FireModes.Count < 2) + return; - SetFireMode(uid, component, fireMode, user); + var index = (component.CurrentFireMode + 1) % component.FireModes.Count; + SetFireMode(uid, component, index, user); } - private void SetFireMode(EntityUid uid, BatteryWeaponFireModesComponent component, BatteryWeaponFireMode? fireMode, EntityUid? user = null) + private void SetFireMode(EntityUid uid, BatteryWeaponFireModesComponent component, int index, EntityUid? user = null) { - if (fireMode?.Prototype == null) - return; - - component.CurrentFireMode = fireMode; + var fireMode = component.FireModes[index]; + component.CurrentFireMode = index; + Dirty(uid, component); if (TryComp(uid, out ProjectileBatteryAmmoProviderComponent? projectileBatteryAmmoProvider)) { @@ -123,7 +106,7 @@ private void SetFireMode(EntityUid uid, BatteryWeaponFireModesComponent componen if (user != null) { - _popupSystem.PopupEntity(Loc.GetString("gun-set-fire-mode", ("mode", prototype.Name)), uid, user.Value); + _popupSystem.PopupClient(Loc.GetString("gun-set-fire-mode", ("mode", prototype.Name)), uid, user.Value); } } } diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs index 6fba3d8fa68..16db325df41 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs @@ -70,7 +70,7 @@ public abstract partial class SharedGunSystem : EntitySystem private const float EjectOffset = 0.4f; protected const string AmmoExamineColor = "yellow"; protected const string FireRateExamineColor = "yellow"; - protected const string ModeExamineColor = "cyan"; + public const string ModeExamineColor = "cyan"; public override void Initialize() { From ac052e46664d86730173540c1a69fe3d1dc21e21 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Mon, 29 Jan 2024 11:20:34 +1100 Subject: [PATCH 020/266] =?UTF-8?q?Revert=20"Make=20flare=20gun=20explode,?= =?UTF-8?q?=20damage=20and=20stun=20the=20player=20when=20used=20=E2=80=A6?= =?UTF-8?q?=20(#24679)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Revert "Make flare gun explode, damage and stun the player when used with the wrong ammo (#22349)" This reverts commit e301378114b245fa6927372f83c19868cb90b13c. # Conflicts: # Content.Shared/Weapons/Ranged/Components/GunComponent.cs # Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/shotgun.yml # Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml * Fix revert conflicts * Update Content.Shared/Weapons/Ranged/Components/GunComponent.cs (cherry picked from commit e1901aa6b602516f0f7cc3f29844c77e90c77977) --- .../Weapons/Ranged/Systems/GunSystem.cs | 21 ----------------- .../Weapons/Ranged/Components/GunComponent.cs | 13 ----------- Resources/Locale/en-US/weapons/ranged/gun.ftl | 1 - .../Guns/Ammunition/Cartridges/shotgun.yml | 23 +++++++++---------- .../Guns/Ammunition/Projectiles/shotgun.yml | 7 ++---- .../Objects/Weapons/Guns/flare_gun.yml | 5 ---- Resources/Prototypes/tags.yml | 3 --- 7 files changed, 13 insertions(+), 60 deletions(-) diff --git a/Content.Server/Weapons/Ranged/Systems/GunSystem.cs b/Content.Server/Weapons/Ranged/Systems/GunSystem.cs index 007f30a2845..756a4c90656 100644 --- a/Content.Server/Weapons/Ranged/Systems/GunSystem.cs +++ b/Content.Server/Weapons/Ranged/Systems/GunSystem.cs @@ -130,27 +130,6 @@ public override void Shoot(EntityUid gunUid, GunComponent gun, List<(EntityUid? case CartridgeAmmoComponent cartridge: if (!cartridge.Spent) { - if (gun.CompatibleAmmo != null && - !gun.CompatibleAmmo.Exists(ammoAllowed => ammoAllowed.Equals(cartridge.Prototype)) - && user != null) - { - if (gun.DamageOnWrongAmmo != null) - Damageable.TryChangeDamage(user, gun.DamageOnWrongAmmo, origin: user); - _stun.TryParalyze(user.Value, TimeSpan.FromSeconds(3f), true); - - Audio.PlayPvs(new SoundPathSpecifier("/Audio/Weapons/Guns/Gunshots/bang.ogg"), gunUid); - - PopupSystem.PopupEntity(Loc.GetString("gun-component-wrong-ammo"), user.Value); - _adminLogger.Add(LogType.EntityDelete, LogImpact.Medium, $"Shot wrong ammo by {ToPrettyString(user.Value)} deleted {ToPrettyString(gunUid)}"); - userImpulse = false; - - SetCartridgeSpent(ent!.Value, cartridge, true); - MuzzleFlash(gunUid, cartridge, user); - Del(gunUid); - if (cartridge.DeleteOnSpawn) - Del(ent.Value); - return; - } if (cartridge.Count > 1) { var ev = new GunGetAmmoSpreadEvent(cartridge.Spread); diff --git a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs index c3335a1ad06..8d7d548ad8f 100644 --- a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs +++ b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs @@ -5,7 +5,6 @@ using Robust.Shared.Audio; using Robust.Shared.GameStates; using Robust.Shared.Map; -using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Shared.Weapons.Ranged.Components; @@ -180,18 +179,6 @@ public sealed partial class GunComponent : Component [DataField] public bool ResetOnHandSelected = true; - /// - /// Type of ammo the gun can work with - /// - [DataField] - public List>? CompatibleAmmo; - - /// - /// Damage the gun deals when used with wrong ammo - /// - [DataField] - public DamageSpecifier? DamageOnWrongAmmo = null; - /// /// The base value for how fast the projectile moves. /// diff --git a/Resources/Locale/en-US/weapons/ranged/gun.ftl b/Resources/Locale/en-US/weapons/ranged/gun.ftl index 3fbf5f77e76..fe60f3eed1d 100644 --- a/Resources/Locale/en-US/weapons/ranged/gun.ftl +++ b/Resources/Locale/en-US/weapons/ranged/gun.ftl @@ -6,7 +6,6 @@ gun-selected-mode = Selected {$mode} gun-disabled = You can't use guns! gun-clumsy = The gun blows up in your face! gun-set-fire-mode = Set to {$mode} -gun-component-wrong-ammo = Wrong ammo! # SelectiveFire gun-SemiAuto = semi-auto diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/shotgun.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/shotgun.yml index 3506a0b31ff..b7b98ba6991 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/shotgun.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/shotgun.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity id: BaseShellShotgun name: shell (.50) parent: BaseCartridge @@ -155,14 +155,13 @@ name: uranium shotgun shell parent: BaseShellShotgun components: - - type: Sprite - layers: - - state: depleted-uranium - map: [ "enum.AmmoVisualLayers.Base" ] - - type: CartridgeAmmo - count: 5 - spread: 6 - proto: PelletShotgunUranium - - type: SpentAmmoVisuals - state: "depleted-uranium" - + - type: Sprite + layers: + - state: depleted-uranium + map: [ "enum.AmmoVisualLayers.Base" ] + - type: CartridgeAmmo + count: 5 + spread: 6 + proto: PelletShotgunUranium + - type: SpentAmmoVisuals + state: "depleted-uranium" diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml index 774114f90b2..36b1b2a99f1 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity id: PelletShotgunSlug name: pellet (.50 slug) noSpawn: true @@ -132,10 +132,7 @@ !type:PhysShapeAabb bounds: "-0.1,-0.1,0.1,0.1" mask: - - BulletImpassable - - type: Tag - tags: - - PelletShotgunFlare + - BulletImpassable - type: Sprite sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi state: buckshot-flare diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/flare_gun.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/flare_gun.yml index 810a36105bd..cfcc0a01cd1 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/flare_gun.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/flare_gun.yml @@ -17,13 +17,8 @@ selectedMode: SemiAuto availableModes: - SemiAuto - compatibleAmmo: - - PelletShotgunFlare soundGunshot: path: /Audio/Weapons/Guns/Gunshots/flaregun.ogg - damageOnWrongAmmo: - types: - Blunt: 6.0 - type: BallisticAmmoProvider whitelist: tags: diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index cf36243d9dd..1d85d96a1a6 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -1022,9 +1022,6 @@ - type: Tag id: ShellShotgun -- type: Tag - id: PelletShotgunFlare - - type: Tag id: Shiv From 561a98a20b94911b5cf6b3eaf8c3ccf08b91e4e7 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Mon, 29 Jan 2024 11:51:29 +1100 Subject: [PATCH 021/266] Anti-anomaly fixes (#24634) - Remove unnecessary mapcoordinates get. - Remove mapping markers as everything should be ingame entities and this is functioning as an area. (cherry picked from commit 11c69bca3f370e3a3fde1bc24976fd1188aebb30) --- .../Anomaly/AnomalySystem.Generator.cs | 6 ++-- .../Entities/Markers/anti_anomaly_zone.yml | 33 ------------------- 2 files changed, 4 insertions(+), 35 deletions(-) delete mode 100644 Resources/Prototypes/Entities/Markers/anti_anomaly_zone.yml diff --git a/Content.Server/Anomaly/AnomalySystem.Generator.cs b/Content.Server/Anomaly/AnomalySystem.Generator.cs index 61bb356ff76..d07740e2f66 100644 --- a/Content.Server/Anomaly/AnomalySystem.Generator.cs +++ b/Content.Server/Anomaly/AnomalySystem.Generator.cs @@ -119,6 +119,8 @@ public void SpawnOnRandomGridLocation(EntityUid grid, string toSpawn) // don't spawn inside of solid objects var physQuery = GetEntityQuery(); var valid = true; + + // TODO: This should be using static lookup. foreach (var ent in gridComp.GetAnchoredEntities(tile)) { if (!physQuery.TryGetComponent(ent, out var body)) @@ -143,9 +145,9 @@ public void SpawnOnRandomGridLocation(EntityUid grid, string toSpawn) if (antiXform.MapID != mapPos.MapId) continue; - var antiCoordinates = _transform.GetMapCoordinates(antiXform); + var antiCoordinates = _transform.GetWorldPosition(antiXform); - var delta = antiCoordinates.Position - mapPos.Position; + var delta = antiCoordinates - mapPos.Position; if (delta.LengthSquared() < zone.ZoneRadius * zone.ZoneRadius) { valid = false; diff --git a/Resources/Prototypes/Entities/Markers/anti_anomaly_zone.yml b/Resources/Prototypes/Entities/Markers/anti_anomaly_zone.yml deleted file mode 100644 index fbc183613c0..00000000000 --- a/Resources/Prototypes/Entities/Markers/anti_anomaly_zone.yml +++ /dev/null @@ -1,33 +0,0 @@ -- type: entity - name: anti anomaly zone - description: Anomalies will not be able to appear within a 10 block radius of this point. - id: AntiAnomalyZone - suffix: "range 10" - parent: MarkerBase - components: - - type: Sprite - sprite: Structures/Specific/Anomalies/ice_anom.rsi - layers: - - state: anom - - sprite: Markers/cross.rsi - state: pink - - type: AntiAnomalyZone - zoneRadius: 10 - -- type: entity - parent: AntiAnomalyZone - id: AntiAnomalyZone20 - suffix: "range 20" - description: Anomalies will not be able to appear within a 20 block radius of this point. - components: - - type: AntiAnomalyZone - zoneRadius: 20 - -- type: entity - parent: AntiAnomalyZone - id: AntiAnomalyZone50 - suffix: "range 50" - description: Anomalies will not be able to appear within a 50 block radius of this point. - components: - - type: AntiAnomalyZone - zoneRadius: 50 \ No newline at end of file From 758484e97f2e56c89893e2d61814c13d4a1995d0 Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Mon, 29 Jan 2024 04:30:54 +0300 Subject: [PATCH 022/266] Fire anom rework (#24666) * content * d * fix artifact (cherry picked from commit 3deea2f7d68c05ec415e075328533c6eb1d4f8e6) --- .../Xenoarchaeology/structure_artifacts.yml | 1 - .../Weapons/Guns/Projectiles/magic.yml | 30 ++++++++++++++++ .../Structures/Specific/Anomaly/anomalies.yml | 30 ++++++++++++---- .../Structures/Specific/Anomaly/cores.yml | 5 ++- .../Anomalies/Cores/pyro_core.rsi/core.png | Bin 369 -> 357 bytes .../Anomalies/Cores/pyro_core.rsi/pulse.png | Bin 391 -> 381 bytes .../Specific/Anomalies/pyro_anom.rsi/anom.png | Bin 0 -> 2577 bytes .../Anomalies/pyro_anom.rsi/meta.json | 33 ++++++++++++++++++ .../Anomalies/pyro_anom.rsi/pulse.png | Bin 0 -> 4159 bytes 9 files changed, 91 insertions(+), 8 deletions(-) create mode 100644 Resources/Textures/Structures/Specific/Anomalies/pyro_anom.rsi/anom.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/pyro_anom.rsi/meta.json create mode 100644 Resources/Textures/Structures/Specific/Anomalies/pyro_anom.rsi/pulse.png diff --git a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/structure_artifacts.yml b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/structure_artifacts.yml index ff9d3ae781a..f098894ff79 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/structure_artifacts.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/structure_artifacts.yml @@ -42,7 +42,6 @@ density: 75 layer: # doesn't collide with artifact storage - Opaque - - BulletImpassable mask: - MachineMask - type: InteractionOutline diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml index bd789402d25..3556d1c8f8b 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml @@ -5,16 +5,46 @@ parent: BulletRocket noSpawn: true components: + - type: PointLight + color: "#E25822" + radius: 2.0 + energy: 5.0 + - type: Projectile + damage: + types: + Heat: 10 - type: Sprite sprite: Objects/Weapons/Guns/Projectiles/magic.rsi layers: - state: fireball + shader: unshaded - type: Explosive explosionType: Default maxIntensity: 40 intensitySlope: 6 totalIntensity: 200 maxTileBreak: 0 + - type: IgnitionSource + temperature: 400 + ignited: true + - type: IgniteOnCollide + fireStacks: 0.35 + +- type: entity + id: ProjectileAnomalyFireball + name: fireball + description: Hovering blob of flame. + parent: ProjectileFireball + noSpawn: true + components: + - type: TimedDespawn + lifetime: 30 + - type: Explosive + explosionType: Default + maxIntensity: 100 + intensitySlope: 0.1 + totalIntensity: 0.3 + maxTileBreak: 0 - type: entity id: ProjectilePolyboltBase diff --git a/Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomalies.yml b/Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomalies.yml index 94ed16fd6c0..fdf9a5cf8fd 100644 --- a/Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomalies.yml +++ b/Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomalies.yml @@ -56,20 +56,26 @@ parent: BaseAnomaly suffix: Pyroclastic components: + - type: AmbientSound + volume: 5 + range: 5 + sound: + path: /Audio/Ambience/Objects/fireplace.ogg - type: Anomaly corePrototype: AnomalyCorePyroclastic coreInertPrototype: AnomalyCorePyroclasticInert - type: Sprite + sprite: Structures/Specific/Anomalies/pyro_anom.rsi layers: - - state: anom1 + - state: anom map: ["enum.AnomalyVisualLayers.Base"] - - state: anom1-pulse + - state: pulse map: ["enum.AnomalyVisualLayers.Animated"] visible: false - type: PointLight - radius: 2.0 + radius: 6.0 energy: 7.5 - color: "#fca3c0" + color: "#E25822" castShadows: false - type: PyroclasticAnomaly - type: TempAffectingAnomaly @@ -78,9 +84,21 @@ - type: GasProducerAnomaly releasedGas: 3 releaseOnMaxSeverity: true - spawnRadius: 3 + spawnRadius: 4 tileCount: 5 - tempChange: 550 + tempChange: 420 + - type: ProjectileAnomaly + projectilePrototype: ProjectileAnomalyFireball + targetNonSentientChance: 0.6 + projectileSpeed: 0.5 + minProjectiles: 3 + maxProjectiles: 6 + - type: IgnitionSource + temperature: 800 + ignited: true + - type: IgniteOnCollide + fixtureId: fix1 + fireStacks: 1 - type: entity id: AnomalyGravity diff --git a/Resources/Prototypes/Entities/Structures/Specific/Anomaly/cores.yml b/Resources/Prototypes/Entities/Structures/Specific/Anomaly/cores.yml index dc8f8464d48..dcd376c91b7 100644 --- a/Resources/Prototypes/Entities/Structures/Specific/Anomaly/cores.yml +++ b/Resources/Prototypes/Entities/Structures/Specific/Anomaly/cores.yml @@ -40,8 +40,11 @@ - type: PointLight radius: 1.5 energy: 1.5 - color: "#fca3c0" + color: "#E25822" castShadows: false + - type: IgnitionSource + temperature: 400 + ignited: true - type: entity parent: BaseAnomalyCore diff --git a/Resources/Textures/Structures/Specific/Anomalies/Cores/pyro_core.rsi/core.png b/Resources/Textures/Structures/Specific/Anomalies/Cores/pyro_core.rsi/core.png index 61a5f22489ea5dd5e32a9a1fb97e1ec9cecab426..739e14dbf1d879d98c0160418350a31101cbc731 100644 GIT binary patch delta 317 zcmV-D0mA=xg1Y8>-@CDqdNZ}%f$We5Z z93Z6&7cO*wlmTH<2L}|=D2=L3v08zUZD}=zH2XlPSk27W?4Momcsw2nqZ9cdigB=LAd7us- zP*ebvZ>Njjwrfeq*zt5SOgU3pKh*#%o>S9)fTE&&$xXtYB6{7l;%_S8tO#g}TLCVU zAQI3?v@=d{9X7*B2hpt#p~(WEae5L$QH|Q`ONj0QJBI&;^eXmvJRX2Q!oF;f5&1da P00000NkvXXu0mjf|3r`) delta 329 zcmV-P0k;0-0`UTnF@GybL_t(oh3%CwOT$1EfWL}c#)FXUhM+>1fE`Pq&@F>=79oG2 zzrvr8KTvS#S?ZQBra?vw&lB3e9ts63Dd?`&);U+`7TWhkNR=jW2GyhC4Z2FsoF0*7CQhITk}qy z6j@|>W6;K8hl~Pb6x1T4e%#s`D}f@*)$Lt~jDkjSAw7ijen@l)cX6}@gXyGK@SSY6 zsX+Lx@2)l#KrL60tHE^g>r7}3OcJK*+P?ze{>HEWO1Z3fd|m_avVP?u9@g^5a%vx& zLkXZR{w1Ju5<;|(;Xa3jL4Ow*Euz0#LdF8{Iq5PAD3{eqz3#&5E)deQ3Ag90SFyw4 b_&0n2^piVCv diff --git a/Resources/Textures/Structures/Specific/Anomalies/Cores/pyro_core.rsi/pulse.png b/Resources/Textures/Structures/Specific/Anomalies/Cores/pyro_core.rsi/pulse.png index 537c619d19d063aab1961bd880d31f4529cc92d3..e0c2c7eed1d7b62eadbef2bb09ba89c1376d8b4d 100644 GIT binary patch delta 341 zcmV-b0jmCo1N{P!F@HBnL_t(|obB2%4uUWg2H;{$bm0un+=9`CV{j^u;lk)Gm>Epm zSr|y_U?7oTr10qfp#L{AwD@>`TM5Px5fKF|k{YOKb9;KeK7(HFV&hI_tIQf>j45jq zT_4`(|Gt?bwLa%-+I;qW2gw^jIUjGcpZIF6(sw};Ln5I{pMOu({GKB@YDrEd{3?RC zHDF0j*R+d8aFQe*y{xtX=*U1xFPfVxrq5kNX9UXH+f<_k*j&p1p0N@Q1E|?T^`78-w4?%vye_ew_ng} z5lMsPsGGk?ElzBQk+wV~~qoN2zM6^L~7$de~xRNf300000NkvXXu0mjfS?Zp^ delta 351 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Specific/Anomalies/pyro_anom.rsi/meta.json b/Resources/Textures/Structures/Specific/Anomalies/pyro_anom.rsi/meta.json new file mode 100644 index 00000000000..aa4c1273a19 --- /dev/null +++ b/Resources/Textures/Structures/Specific/Anomalies/pyro_anom.rsi/meta.json @@ -0,0 +1,33 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "Created by TheShuEd (github) for ss14", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "anom", + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "pulse", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + } + ] +} diff --git a/Resources/Textures/Structures/Specific/Anomalies/pyro_anom.rsi/pulse.png b/Resources/Textures/Structures/Specific/Anomalies/pyro_anom.rsi/pulse.png new file mode 100644 index 0000000000000000000000000000000000000000..a064a8d2260aa9af56160ed4e03115f5231fdb81 GIT binary patch literal 4159 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 Date: Mon, 29 Jan 2024 01:32:01 +0000 Subject: [PATCH 023/266] Automatic changelog update (cherry picked from commit 21d5716f4c13858c6d75c864277782668a662f85) --- Resources/Changelog/Changelog.yml | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 8bbb3f07447..f62507bb50c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: mirrorcult - changes: - - message: Emergency lights no longer make sound - type: Remove - - message: Emergency light radius and energy is now much lower - type: Tweak - id: 5313 - time: '2023-12-11T09:24:10.0000000+00:00' - author: Ubaser and Pigeonpeas changes: - message: The kobold ear marking has received a new sprite. @@ -3829,3 +3821,12 @@ id: 5813 time: '2024-01-28T10:49:55.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24579 +- author: TheShuEd + changes: + - message: The fire anomaly is now heavier in content. + type: Tweak + - message: Artifacts no longer block projectiles. + type: Tweak + id: 5814 + time: '2024-01-29T01:30:55.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24666 From 9b50c875570d57da2662b91ac39a70edee7ff421 Mon Sep 17 00:00:00 2001 From: Krunklehorn <42424291+Krunklehorn@users.noreply.github.com> Date: Sun, 28 Jan 2024 20:32:54 -0500 Subject: [PATCH 024/266] Health analyzers and cryopods also show temperature in Kelvin (#24643) Health analyzers and cryopods also show temperature in kelvin (cherry picked from commit f9c43567ea013fa5d68f21a9c83194583f10e1e3) --- Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs b/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs index 36f7a08b961..9e786ce4365 100644 --- a/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs +++ b/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs @@ -66,7 +66,7 @@ public void Populate(HealthAnalyzerScannedUserMessage msg) ); Temperature.Text = Loc.GetString("health-analyzer-window-entity-temperature-text", - ("temperature", float.IsNaN(msg.Temperature) ? "N/A" : $"{msg.Temperature - 273f:F1} °C") + ("temperature", float.IsNaN(msg.Temperature) ? "N/A" : $"{msg.Temperature - 273f:F1} °C ({msg.Temperature:F1} °K)") ); BloodLevel.Text = Loc.GetString("health-analyzer-window-entity-blood-level-text", From 8a85560d9c5ccbfd0c47403240398e67cf056d58 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 29 Jan 2024 01:33:59 +0000 Subject: [PATCH 025/266] Automatic changelog update (cherry picked from commit 030ab509394158764b060f861c0b40e95196e9bd) --- Resources/Changelog/Changelog.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index f62507bb50c..1d83250281a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: Ubaser and Pigeonpeas - changes: - - message: The kobold ear marking has received a new sprite. - type: Tweak - id: 5314 - time: '2023-12-11T09:25:55.0000000+00:00' - author: Rainfey changes: - message: Hardsuit helmets added to chameleon menu @@ -3830,3 +3824,11 @@ id: 5814 time: '2024-01-29T01:30:55.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24666 +- author: Krunk + changes: + - message: Health analysis interfaces now also display a subject's temperature in + Kelvin. + type: Add + id: 5815 + time: '2024-01-29T01:32:54.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24643 From cd03dbac2b60281f4f7c8ec0f2b3c381dd1308fc Mon Sep 17 00:00:00 2001 From: themias <89101928+themias@users.noreply.github.com> Date: Sun, 28 Jan 2024 20:38:06 -0500 Subject: [PATCH 026/266] Add inhand fill visuals (#24495) * Add inhand fill visuals * oops * remove unused import (cherry picked from commit bd100344a2f9f845e2dceb8351d36f8af913a5f1) --- .../SolutionContainerVisualsSystem.cs | 33 +++++++++++++++ .../SolutionContainerVisualsComponent.cs | 13 ++++++ .../Objects/Specific/chemical-containers.yml | 2 + .../Objects/Specific/chemistry-vials.yml | 2 + .../Entities/Objects/Specific/chemistry.yml | 12 +++++- .../beaker.rsi/inhand-left-fill-1.png | Bin 0 -> 126 bytes .../beaker.rsi/inhand-left-fill-2.png | Bin 0 -> 137 bytes .../beaker.rsi/inhand-left-fill-3.png | Bin 0 -> 158 bytes .../beaker.rsi/inhand-right-fill-1.png | Bin 0 -> 128 bytes .../beaker.rsi/inhand-right-fill-2.png | Bin 0 -> 140 bytes .../beaker.rsi/inhand-right-fill-3.png | Bin 0 -> 155 bytes .../Specific/Chemistry/beaker.rsi/meta.json | 24 +++++++++++ .../beaker_large.rsi/inhand-left-fill-1.png | Bin 0 -> 133 bytes .../beaker_large.rsi/inhand-left-fill-2.png | Bin 0 -> 144 bytes .../beaker_large.rsi/inhand-left-fill-3.png | Bin 0 -> 156 bytes .../beaker_large.rsi/inhand-left-fill-4.png | Bin 0 -> 198 bytes .../beaker_large.rsi/inhand-right-fill-1.png | Bin 0 -> 134 bytes .../beaker_large.rsi/inhand-right-fill-2.png | Bin 0 -> 147 bytes .../beaker_large.rsi/inhand-right-fill-3.png | Bin 0 -> 157 bytes .../beaker_large.rsi/inhand-right-fill-4.png | Bin 0 -> 191 bytes .../Chemistry/beaker_large.rsi/meta.json | 32 ++++++++++++++ .../dropper.rsi/inhand-left-fill-1.png | Bin 0 -> 253 bytes .../dropper.rsi/inhand-right-fill-1.png | Bin 0 -> 249 bytes .../Specific/Chemistry/dropper.rsi/meta.json | 8 ++++ .../Chemistry/jug.rsi/inhand-left-fill-1.png | Bin 0 -> 173 bytes .../Chemistry/jug.rsi/inhand-left-fill-2.png | Bin 0 -> 196 bytes .../Chemistry/jug.rsi/inhand-left-fill-3.png | Bin 0 -> 217 bytes .../Chemistry/jug.rsi/inhand-left-fill-4.png | Bin 0 -> 221 bytes .../Chemistry/jug.rsi/inhand-left-fill-5.png | Bin 0 -> 230 bytes .../Chemistry/jug.rsi/inhand-left.png | Bin 297 -> 411 bytes .../Chemistry/jug.rsi/inhand-right-fill-1.png | Bin 0 -> 173 bytes .../Chemistry/jug.rsi/inhand-right-fill-2.png | Bin 0 -> 192 bytes .../Chemistry/jug.rsi/inhand-right-fill-3.png | Bin 0 -> 233 bytes .../Chemistry/jug.rsi/inhand-right-fill-4.png | Bin 0 -> 220 bytes .../Chemistry/jug.rsi/inhand-right-fill-5.png | Bin 0 -> 232 bytes .../Chemistry/jug.rsi/inhand-right.png | Bin 277 -> 418 bytes .../Specific/Chemistry/jug.rsi/meta.json | 40 ++++++++++++++++++ .../Chemistry/syringe.rsi/0-inhand-left.png | Bin 298 -> 0 bytes .../Chemistry/syringe.rsi/0-inhand-right.png | Bin 300 -> 0 bytes .../Chemistry/syringe.rsi/1-inhand-left.png | Bin 316 -> 0 bytes .../Chemistry/syringe.rsi/1-inhand-right.png | Bin 320 -> 0 bytes .../Chemistry/syringe.rsi/2-inhand-left.png | Bin 316 -> 0 bytes .../Chemistry/syringe.rsi/2-inhand-right.png | Bin 320 -> 0 bytes .../Chemistry/syringe.rsi/3-inhand-left.png | Bin 322 -> 0 bytes .../Chemistry/syringe.rsi/3-inhand-right.png | Bin 315 -> 0 bytes .../Chemistry/syringe.rsi/4-inhand-left.png | Bin 321 -> 0 bytes .../Chemistry/syringe.rsi/4-inhand-right.png | Bin 321 -> 0 bytes .../syringe.rsi/inhand-left-fill-1.png | Bin 0 -> 121 bytes .../syringe.rsi/inhand-left-fill-2.png | Bin 0 -> 132 bytes .../syringe.rsi/inhand-left-fill-3.png | Bin 0 -> 137 bytes .../Chemistry/syringe.rsi/inhand-left.png | Bin 0 -> 177 bytes .../syringe.rsi/inhand-right-fill-1.png | Bin 0 -> 126 bytes .../syringe.rsi/inhand-right-fill-2.png | Bin 0 -> 135 bytes .../syringe.rsi/inhand-right-fill-3.png | Bin 0 -> 143 bytes .../Chemistry/syringe.rsi/inhand-right.png | Bin 0 -> 182 bytes .../Specific/Chemistry/syringe.rsi/meta.json | 28 +++++------- .../Chemistry/vial.rsi/inhand-left-fill-1.png | Bin 0 -> 122 bytes .../Chemistry/vial.rsi/inhand-left-fill-2.png | Bin 0 -> 130 bytes .../Chemistry/vial.rsi/inhand-left-fill-3.png | Bin 0 -> 138 bytes .../Chemistry/vial.rsi/inhand-left-fill-4.png | Bin 0 -> 142 bytes .../vial.rsi/inhand-right-fill-1.png | Bin 0 -> 126 bytes .../vial.rsi/inhand-right-fill-2.png | Bin 0 -> 134 bytes .../vial.rsi/inhand-right-fill-3.png | Bin 0 -> 142 bytes .../vial.rsi/inhand-right-fill-4.png | Bin 0 -> 144 bytes .../Specific/Chemistry/vial.rsi/meta.json | 32 ++++++++++++++ 65 files changed, 207 insertions(+), 19 deletions(-) create mode 100644 Resources/Textures/Objects/Specific/Chemistry/beaker.rsi/inhand-left-fill-1.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/beaker.rsi/inhand-left-fill-2.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/beaker.rsi/inhand-left-fill-3.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/beaker.rsi/inhand-right-fill-1.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/beaker.rsi/inhand-right-fill-2.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/beaker.rsi/inhand-right-fill-3.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/beaker_large.rsi/inhand-left-fill-1.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/beaker_large.rsi/inhand-left-fill-2.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/beaker_large.rsi/inhand-left-fill-3.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/beaker_large.rsi/inhand-left-fill-4.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/beaker_large.rsi/inhand-right-fill-1.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/beaker_large.rsi/inhand-right-fill-2.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/beaker_large.rsi/inhand-right-fill-3.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/beaker_large.rsi/inhand-right-fill-4.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/dropper.rsi/inhand-left-fill-1.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/dropper.rsi/inhand-right-fill-1.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/jug.rsi/inhand-left-fill-1.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/jug.rsi/inhand-left-fill-2.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/jug.rsi/inhand-left-fill-3.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/jug.rsi/inhand-left-fill-4.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/jug.rsi/inhand-left-fill-5.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/jug.rsi/inhand-right-fill-1.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/jug.rsi/inhand-right-fill-2.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/jug.rsi/inhand-right-fill-3.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/jug.rsi/inhand-right-fill-4.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/jug.rsi/inhand-right-fill-5.png delete mode 100644 Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/0-inhand-left.png delete mode 100644 Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/0-inhand-right.png delete mode 100644 Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/1-inhand-left.png delete mode 100644 Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/1-inhand-right.png delete mode 100644 Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/2-inhand-left.png delete mode 100644 Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/2-inhand-right.png delete mode 100644 Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/3-inhand-left.png delete mode 100644 Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/3-inhand-right.png delete mode 100644 Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/4-inhand-left.png delete mode 100644 Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/4-inhand-right.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/inhand-left-fill-1.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/inhand-left-fill-2.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/inhand-left-fill-3.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/inhand-right-fill-1.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/inhand-right-fill-2.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/inhand-right-fill-3.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/vial.rsi/inhand-left-fill-1.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/vial.rsi/inhand-left-fill-2.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/vial.rsi/inhand-left-fill-3.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/vial.rsi/inhand-left-fill-4.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/vial.rsi/inhand-right-fill-1.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/vial.rsi/inhand-right-fill-2.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/vial.rsi/inhand-right-fill-3.png create mode 100644 Resources/Textures/Objects/Specific/Chemistry/vial.rsi/inhand-right-fill-4.png diff --git a/Content.Client/Chemistry/Visualizers/SolutionContainerVisualsSystem.cs b/Content.Client/Chemistry/Visualizers/SolutionContainerVisualsSystem.cs index 20693408ae6..b4486b8c0ee 100644 --- a/Content.Client/Chemistry/Visualizers/SolutionContainerVisualsSystem.cs +++ b/Content.Client/Chemistry/Visualizers/SolutionContainerVisualsSystem.cs @@ -1,6 +1,8 @@ +using Content.Client.Items.Systems; using Content.Shared.Chemistry; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Reagent; +using Content.Shared.Hands; using Content.Shared.Rounding; using Robust.Client.GameObjects; using Robust.Shared.Prototypes; @@ -10,11 +12,13 @@ namespace Content.Client.Chemistry.Visualizers; public sealed class SolutionContainerVisualsSystem : VisualizerSystem { [Dependency] private readonly IPrototypeManager _prototype = default!; + [Dependency] private readonly ItemSystem _itemSystem = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnGetHeldVisuals); } private void OnMapInit(EntityUid uid, SolutionContainerVisualsComponent component, MapInitEvent args) @@ -111,6 +115,35 @@ protected override void OnAppearanceChange(EntityUid uid, SolutionContainerVisua } } + // in-hand visuals + _itemSystem.VisualsChanged(uid); + } + + private void OnGetHeldVisuals(EntityUid uid, SolutionContainerVisualsComponent component, GetInhandVisualsEvent args) + { + if (component.InHandsFillBaseName == null) + return; + + if (!TryComp(uid, out AppearanceComponent? appearance)) + return; + + if (!AppearanceSystem.TryGetData(uid, SolutionContainerVisuals.FillFraction, out var fraction, appearance)) + return; + int closestFillSprite = ContentHelpers.RoundToLevels(fraction, 1, component.InHandsMaxFillLevels + 1); + + if (closestFillSprite > 0) + { + var layer = new PrototypeLayerData(); + + var key = "inhand-" + args.Location.ToString().ToLowerInvariant() + component.InHandsFillBaseName + closestFillSprite; + + layer.State = key; + + if (component.ChangeColor && AppearanceSystem.TryGetData(uid, SolutionContainerVisuals.Color, out var color, appearance)) + layer.Color = color; + + args.Layers.Add((key, layer)); + } } } diff --git a/Content.Shared/Chemistry/Components/SolutionContainerVisualsComponent.cs b/Content.Shared/Chemistry/Components/SolutionContainerVisualsComponent.cs index 8ada8e28f43..100ee3975f9 100644 --- a/Content.Shared/Chemistry/Components/SolutionContainerVisualsComponent.cs +++ b/Content.Shared/Chemistry/Components/SolutionContainerVisualsComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.Hands.Components; using Robust.Shared.Utility; namespace Content.Shared.Chemistry.Components @@ -40,5 +41,17 @@ public sealed partial class SolutionContainerVisualsComponent : Component [DataField] public string InitialDescription = string.Empty; + + /// + /// Optional in-hand visuals to to show someone is holding a filled beaker/jug/etc. + /// + [DataField] + public string? InHandsFillBaseName = null; + + /// + /// A separate max fill levels for in-hands (to reduce number of sprites needed) + /// + [DataField] + public int InHandsMaxFillLevels = 0; } } diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemical-containers.yml b/Resources/Prototypes/Entities/Objects/Specific/chemical-containers.yml index c8a204e1153..31af4d206a0 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/chemical-containers.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/chemical-containers.yml @@ -43,6 +43,8 @@ - type: SolutionContainerVisuals maxFillLevels: 6 fillBaseName: jug + inHandsMaxFillLevels: 5 + inHandsFillBaseName: -fill- - type: StaticPrice price: 60 - type: Label diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemistry-vials.yml b/Resources/Prototypes/Entities/Objects/Specific/chemistry-vials.yml index 93881af7f96..c5de88d690d 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/chemistry-vials.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/chemistry-vials.yml @@ -27,6 +27,8 @@ - type: SolutionContainerVisuals maxFillLevels: 6 fillBaseName: vial-1- + inHandsMaxFillLevels: 4 + inHandsFillBaseName: -fill- - type: Drink solution: beaker - type: SolutionContainerManager diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml index f9a843c4d4d..a8acc5ff9c4 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml @@ -158,6 +158,11 @@ solution: beaker - type: StaticPrice price: 10 + - type: SolutionContainerVisuals + maxFillLevels: 6 + fillBaseName: beaker + inHandsMaxFillLevels: 3 + inHandsFillBaseName: -fill- - type: entity name: cryoxadone beaker @@ -200,6 +205,8 @@ - type: SolutionContainerVisuals maxFillLevels: 6 fillBaseName: beakerlarge + inHandsMaxFillLevels: 4 + inHandsFillBaseName: -fill- - type: StaticPrice price: 20 @@ -277,6 +284,8 @@ - type: SolutionContainerVisuals maxFillLevels: 1 fillBaseName: dropper + inHandsMaxFillLevels: 1 + inHandsFillBaseName: -fill- - type: StaticPrice price: 40 @@ -321,7 +330,6 @@ - type: Item size: Tiny sprite: Objects/Specific/Chemistry/syringe.rsi - heldPrefix: 0 - type: SolutionContainerManager solutions: injector: @@ -338,6 +346,8 @@ - type: SolutionContainerVisuals maxFillLevels: 2 fillBaseName: syringe + inHandsMaxFillLevels: 3 + inHandsFillBaseName: -fill- - type: Tag tags: - Syringe diff --git a/Resources/Textures/Objects/Specific/Chemistry/beaker.rsi/inhand-left-fill-1.png b/Resources/Textures/Objects/Specific/Chemistry/beaker.rsi/inhand-left-fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d206c35fbb356ef380c49380957d512461b068a5 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|EIeHtLn`LH zy}6MWsEXO}+kA7|{fCtull=?4W@`ZzFf=r()ZPU#K!7{uNp}w~14F#rvsc`cV)z*M PfkZuB{an^LB{Ts5gvTKt literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/beaker.rsi/inhand-left-fill-2.png b/Resources/Textures/Objects/Specific/Chemistry/beaker.rsi/inhand-left-fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..a4c851429dc98d44bedc4928d490fa80c8d84a71 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|oIPC}Ln`LH zy|s~-!GMF=;NSiU&Npt$M{%;f;a;@HlLe@R;e)dA`I5H4(5<^cJRoQ=^?A}OymQlE dK?a5gM_FI25L370UfTqc@^tlcS?83{1OTzRC}RKs literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/beaker.rsi/inhand-left-fill-3.png b/Resources/Textures/Objects/Specific/Chemistry/beaker.rsi/inhand-left-fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..94103a8320b70c7b79dfbe7fd228a206c0566ca6 GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|B0OCjLn`LH zy|t0|fB^@K!?*bp9Pdn4l0L!}@#!wh9+s=Zj6hWk(buA;&NQ_>K4bM^_dU`Ew#*%{c*YpJL&w+lYo;kknWw9t%Q~loCIC0m BGn4=T literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/beaker.rsi/inhand-right-fill-1.png b/Resources/Textures/Objects/Specific/Chemistry/beaker.rsi/inhand-right-fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d89683a47bc606d5630f990c22a909fe47f81c72 GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|tUO&DLn`LH zy}6K=!GMQl;~V?;pUWDXHn>f+J@|1o6Ho<1g-21HIfwxS2a1%x|2d(-z_8#klT`rs Tq@E0s;~;TQS3j3^P6_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/beaker.rsi/inhand-right-fill-2.png b/Resources/Textures/Objects/Specific/Chemistry/beaker.rsi/inhand-right-fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..e6fe7b070bc17b598489c86b2a90f65bd5f136b9 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|+&oL4k+a@!NcZ<|XZ{8Y?Dw-0}TT^m;2$4MW51jvIG**BX6(&j{iIfri1SdFy+m gD$n=#FflO1$rQDUsi&Co9tO#Iy85}Sb4q9e0FO*6EdT%j literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/beaker.rsi/inhand-right-fill-3.png b/Resources/Textures/Objects/Specific/Chemistry/beaker.rsi/inhand-right-fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..58e9d70df6914d97b7e4ba336ac7ccbce6c4fdb9 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|LOop^Ln`LH zy|t0|fB^@K!+U$h<{JN1A(=rpJ@(Ch;8=1#3aE^)r^Ln`LH zy=5rKpdi5P_(!{E!k2#bw1%|sgI`ZZ0aY+Cv`_N6{qrs(n9abzzh$mU+Naxp1Q{3} Z++YivDW)#)M(`a-($m$?Wt~$(6962YCyM|8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/beaker_large.rsi/inhand-left-fill-2.png b/Resources/Textures/Objects/Specific/Chemistry/beaker_large.rsi/inhand-left-fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..aa4378fd7eeab5c59a7ddec9ddcd46d8d0fdaa76 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|ygXeTLn`LH zy=5rKV93L~;gfrY!oANjRyFM&95wrLK3W3RFdSIBZE{N7^9r?-Tkb}K1c2ax*6aO8 k>ff@w5!@Cp#lUdqH^b^pI=+9niq$}}p00i_>zopr0B4&n1^@s6 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/beaker_large.rsi/inhand-left-fill-3.png b/Resources/Textures/Objects/Specific/Chemistry/beaker_large.rsi/inhand-left-fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..256dd348e8a9ac70ba471faeda48d971a8df28bf GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|!aQ9ZLn`LH zy|s~-!H|Q+;M@EOj+Z_^{XUUtVv>JB`wImopdyBCscCDsY8hu+o$gqE+Wn8T!CYpL zFayJb9nbxr2-b!_%5J|a`s&oDxqp-y7!GXXzi`}_qu9XD5v0b`)z4*}Q$iB}QtCA& literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/beaker_large.rsi/inhand-left-fill-4.png b/Resources/Textures/Objects/Specific/Chemistry/beaker_large.rsi/inhand-left-fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..1e828c35205c6ea5765dfe5cf054eaa3ece9da5a GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|8a!PbLn`LH zy>*b2*^r0DVWQQ#|Fc3Gye{0Yl;wOPeCTM|2_MEJ)^7VS7NBZ|`LEwioVj?ndwKuW z%4OEm&!71pZTIM6!&S>^meL!n*g;Ad7(UdVkAJdy^Pb0LUk|M6dTg<1)jGMqNw=$8 sB6)9olS>R+p*wy4%jx%|7#MDxkzJcyXk}2hLI literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/beaker_large.rsi/inhand-right-fill-1.png b/Resources/Textures/Objects/Specific/Chemistry/beaker_large.rsi/inhand-right-fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..766d7e9e6b213e01c7242ab88e4701203027b05e GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%~c)B=-RLpsM z%TVxu0}r#~XLk*SSF%hmKhMAETCmrI8K{Ke!=krpH`iN(m_YDg`J|lNpO;n6XJla5 ZagF(izL*bc!GMSPz&rbe>>urQ8jf&Bb?)ZWc`mu06{w2gj;B#>dU;>&Ex$?s#Xtf;aNu;` nU!VG|k``sN3*MwMFf^!(xA^M#iXHrt0h0D~^>bP0l+XkK%KIOiMQ6vUGhH38&Rt3~Uuf+<`+h!1 x6bKGncboS-zfCIqPuc7Agg5zzZkz;)s`F=V^W{i9dwM2Fji;-h%Q~loCIH9SHjV%Q literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/beaker_large.rsi/inhand-right-fill-4.png b/Resources/Textures/Objects/Specific/Chemistry/beaker_large.rsi/inhand-right-fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..c90be94d07abf87e733e35f523164e220a73565a GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|Dm`5sLn`LH zy|t0o*^q#*{j_~){q_dN%O911Y8if9xx0CHdfK^n^LD?! z`RHm*+Pz{1!S{-9)+Nuroexp~1RL(0`uykd{ibzictS#Z3>U2mv;VqV+nD)y+_Lqz k8j?429{nPj#@zrI$ zTf`I6Vw=+W_#wss$&!MVrSCcFJ#X^v+U<9FO5m@>{#BE8RZRc${&@Pae8JU?&eQVW r1gutxe9!y7G_pjF?bgTe~DWM4f6y9QH literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/dropper.rsi/inhand-right-fill-1.png b/Resources/Textures/Objects/Specific/Chemistry/dropper.rsi/inhand-right-fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..0198590656b56083de56e526495c800c3c38ba2d GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|Hha1_hE&XX zdut=#Ap@S4#P&_9$@l;7z41q2d76nZYhYjiXO{B6{JwSR>(@yF)q}u;b9a;9^F{Bd z-toI!agvgf&Z7OYJ9c|=dERDP7WMpLb&P|{43*hgvAXlGF+FpC`E;}M?z0=N{r{r3 zBEl_{`YMYHJK%L(bf oj$8lH=d%01yx@c?P>)_LW4l|vzWt)&DIjw^UHx3vIVCg!0O5;aB>(^b literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/dropper.rsi/meta.json b/Resources/Textures/Objects/Specific/Chemistry/dropper.rsi/meta.json index 646becdd087..d296ffbea16 100644 --- a/Resources/Textures/Objects/Specific/Chemistry/dropper.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Chemistry/dropper.rsi/meta.json @@ -20,9 +20,17 @@ "name": "inhand-left", "directions": 4 }, + { + "name": "inhand-left-fill-1", + "directions": 4 + }, { "name": "inhand-right", "directions": 4 + }, + { + "name": "inhand-right-fill-1", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Specific/Chemistry/jug.rsi/inhand-left-fill-1.png b/Resources/Textures/Objects/Specific/Chemistry/jug.rsi/inhand-left-fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..00affa433705c1cd50db396db3ed1f72e57a194d GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|(mh=qLn`LH zy=BdK*g$|epwyg&*`VHp{eZw8Yv<|f{w{I;B-b$cTQCz)Ef8$~VDUI3^sUOvz00?L zD?ApJecp1iN^(!|E~xwg-al`i$A$jBZF|5vZaeeI;_eAg@_!yMm9g*>V`iD<`VeG@ Mr>mdKI;Vst0I^p)kpKVy literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/jug.rsi/inhand-left-fill-2.png b/Resources/Textures/Objects/Specific/Chemistry/jug.rsi/inhand-left-fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..b4014c71a7853bcb021ff1b25c816d941e67b80b GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|>O5T>Ln`LH zy>*b&$xwjhf~d{1mM`&_#U==Slk=Cq(tJo=@Zxuc35Sg?A8-LG2Z9gsde%;>v*i9? zyY;d!)N*}Hc}t(6lG38@`*gS=Dj4=Tgq}S!=e_>*6K5hr`QQ8e-*nM2?cBZJ+Y}FP mUN!6c?Z)Kp4=d{)nBQU8-(%MQetDfQNTa8#pUXO@geCy(1WWn= literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/jug.rsi/inhand-left-fill-3.png b/Resources/Textures/Objects/Specific/Chemistry/jug.rsi/inhand-left-fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..dd62683c7a3e4d0c8cd3ce8488fd846bbeb1f8d4 GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|CVRR#hE&XX zdut=_VFdx!3*A#D3Fa}px94RxV6t7g#-&T-q}h^>)uLDJSxV+}05vc$G|aA8!?AX2 zUq{E8o}g1NCHH>67}ed;k$ZdEn^Mn=_qA_cuVyz;em?zq*M+~=jEbYgz`7V1#C=xJ z$zJ>TRegi9-G4rpJ+ogd{=EF^(e0Bg`Mj_Uu$Zy8Hk-cHq;z^`({qw&G_0}q_enB4Zw25MknI1m{V))IDg z$N&7>Wjm6?&Z%D)UAXuAwWw@CL)~mq@eN8}=IenKGB6}eUnMoua^L^{(apgzLgUjCk&8@S)RR4>c;oMuc3igTe~DWM4fHD_1a literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/jug.rsi/inhand-left-fill-5.png b/Resources/Textures/Objects/Specific/Chemistry/jug.rsi/inhand-left-fill-5.png new file mode 100644 index 0000000000000000000000000000000000000000..11191e8f93267358636111518869bbc4e1af8fb1 GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|7I?ZihE&XX zdut=-VFLly3*H_t1@jo*+xN0x;CMIpR00#{jX6Ay??czUYc5^2PYI}lfgwSnU(We@ z>D_PdGiT|ghn)TS^k(u4`^v8px1zc`I?m|KzIysYc)|}}uwsS=$0?$H)e~>7KJsT; z`IV^d%6a}zr|;w6vH8TBQ(D$*QzN&X*;C5gXP=nA==`(kS0B%;{LNN#?S1&C_WKM8 ZIr&o^yo$8=1~U-AF| literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/jug.rsi/inhand-left.png b/Resources/Textures/Objects/Specific/Chemistry/jug.rsi/inhand-left.png index 6ec4b0fc67c109189048e2fbb1355ea0ee631bb0..818612319afc7a1494a86a574cf95237b914443c 100644 GIT binary patch delta 384 zcmV-`0e}9f0-FPnB!2;OQb$4nuFf3k00041NklJaE6}~3Q@d8yf=f3w+Ip;4m=|IN|lz(lXe18wa1Wym`!gHi@ zwlSmw{~Ij};94eJ%iO!HO^$Sg`f;|GS(_aE4iG<7fW-l}{9NVWlFA_>A|fIpA|fIp zA|etOCFy&Vr1Krj8AM4s0D!C8=X`m;OpPwqwm4p(I@f3D_J`VAoUd6Q-TttlYR0_N zJ~aTK_xJ{&Sb2*i)(zUNCPtH)RNPjh$*f_wnz+0;HpbH&<7tk&oAbgsa^Wixav3lIKOzlsE|(tV2`mi3}|!!0000=C?&jmcOLj6x-uRS55skPwR5oej`@BLM&a004ls*|=4TW}|1t#;^YD zMYCvTWnEje?*89f`l+mHU(J_wy{_h^?f{n9{MNHr6M~MXlYeK)Wyz}6vZ`Iw8vpVH` zGmtG3uJx6EP9SAaI_r6aep9Irz@vHhPe78+*C=VH`{j`I2gp1E^9TR{0GR9vjaY`z U0seHV00000Ne4wvM6N<$g6hnC&;S4c diff --git a/Resources/Textures/Objects/Specific/Chemistry/jug.rsi/inhand-right-fill-1.png b/Resources/Textures/Objects/Specific/Chemistry/jug.rsi/inhand-right-fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..3f822e063152942e22c79d34a544b0d6bbf7fcdf GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|(mh=qLn`LH zy|t0|uz`rP3u0TnYa95CLqj;;9IT$R1w zw_MZvzCSFqdhJvd$>cwO$lyi0Nb5Cj4<*1^Yb4#-^z^n9P`f>KPaw_}>X@TqX7S zUR3n6`nNgve`^)UxVyM~xwl`dZ0Su&uo?!2A3kY)tEwz#T3*xtUVh`_^&*9jd3>t# j+&RMg)vMmS2^=FUQn%JsXP9`qM1muCcOVPN>veLEu| za+;}v8OnKJbL8%}I z071j@!{7hy+P{C^g7td-A)HD6j7cds_-|ybbxqs%m37^|xY! bGz8l)l<4^|2!?rARla_!c;DM7#fJp09? zeb035@%Y|Ze|9$6?Y269CROyuL-~O0-ZOV5a8sG#IYe1(Xs1>eV^bdczfy+a3w4uW7HTcL$k+r~jsi=gS5^HS;e0~rFz-S3X$ zmj7P_000000002+$q%C}eo8VwjIye;tilhY?CSP$<-E0`!GAn&XYn4#iQL~D|M*Xp zev{Yw^HgiDa03F@k-&9KWYIB-6Vb0IhRuDC|~^9$*zcqbfTAeEt^~Cr+aUm zyJy=(DasF{On>Km%KZV?7yB}r%w#l~$>G7a7cw2W1*LBgtw zSasvo(<3-arD^k(P$Blutmu@OE#oc&a!7x;A~|Pk{0* m`d#~($!3H+0}T*BY47XOjget*b3_0D002ovPDHLkU;%=1U&53C delta 249 zcmVNhT*a4hVy9T zrk;SqfY5yp(`LG8s_9Q+W0VklpN)wD8OG%|A^-pY007`V_ zv)37`<(L^TF3!^_rO7olQfxF|Y+(QZ0KlRL0A7UA$+e?E00000NkvXXu0mjfzI!mlZ#Y_(3{?lw0P(An}@@Lj`%;3V%W*%u#Ry;HUk;C*Rk3(Spl@EzpB}xb0>}^nFVdQ&MBb@0Ijcc AmjD0& diff --git a/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/0-inhand-right.png b/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/0-inhand-right.png deleted file mode 100644 index 863a40a4932e2c99de5896ae8ff3802dd5b9d66f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAQ1G6o zi(^Q|oVT|w@--1 zbs4w){eH}9*6|wAgyh`RKUX={Za?4^zF*^U?yich4AZ~X-7)<3%H|x?8oQtA$FnM| z=Wk~CZ}ju#tGgGPlOnDvN-7BU|RLZf4to&zBufFxmob?Ig8C5KHL3KIIP?g z!RY(@!`x+mzn^GND3#xL_{#0T#M6YPpy*z|LRw-bFta+QK?Sx9HYQ2|h}X+qrK4 zftp7e^R6%YEL&jnW&du4-PL-LABAkn4$nQR6ZvP$E0G<$XQ+11ui;U`Z3o=yd2$N1 zfW zmNDwwL-rX(z4zP~{F14g@KDh04P)r@4|A9O{eHrCLj~Xc#8;0^f9V<|Usze)9p4Of c=?6x;Mm@PQ#fx=0K;JWXy85}Sb4q9e0K>C<)&Kwi diff --git a/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/2-inhand-left.png b/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/2-inhand-left.png deleted file mode 100644 index 0f1f04747227f06e5c0c56f604645d6041d860c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAQ1G3n zi(^Q|oVT|exegofuwFF$;T#M6YPpy*z|LRw-bFta+QK?Sx9HYQ2|h}X+qrK4 zftp7e^R6%YEL&jnW&du4-PL-LABAkn4$nQR6ZvP$E0G<$XQ+11ui;U`Z3o=yd2$N1 zfW zmNDwwL-rX(z4zP~{F14g@KDh04P)r@4|A9O{eHrCLj~Xc#8;0^f9V<|Usze)9p4Of c=?6x;Mm@PQ#fx=0K;JWXy85}Sb4q9e0K>C<)&Kwi diff --git a/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/3-inhand-left.png b/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/3-inhand-left.png deleted file mode 100644 index 3bbc9fe6839a6bb11a5086fae0cb79bd543437f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAQ1FYV zi(^Q|oVT+axegofupGZ2|MkEBi`iEsgfzBXST>0#vE0v+^ZkMd_SbC|VhuQvF4H@~ zj}pmseN9ChuO_b!4}9G##%TPf?uCN-Lk@rO*!>4?9A2*ZW=Vg^J;vh;|G#a@`Tplf zmv=#%g>;(dkCUr33(U?;`XJozcw{33VYG8s!CtJp0aj!(wKy?6_L4C2)f)nV#L#a#^>xHW}!D22WQ%mvv4F FO#oNkfnfju diff --git a/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/3-inhand-right.png b/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/3-inhand-right.png deleted file mode 100644 index 71ecded6f6b4872f9268f8097ba3ffc3c1e8a308..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAQ1Gp% zi(^Q|oVPcl`I-zw*d8hty1%RET(dH(<%qb(l3b>9|Mzx3_t|0dr7?y{VLHPJRfZzY z22^IbibLhJLpHv`<{#&6KXbouwefYPHK&W!=T}bO$vu_hs`Z16lif3?Jzf2cDdctR z9jo8(HIjldXKMi00o}rh;L632QH^UPlhMhQ=89zVHEdH@Ni>u(7 z%)VyD{}+F8$k?^NUsBy7_rAgT`G?-N*xk>)3%<+jJ9y#v>hIwRM;18W*Zs+(1abE- a27RSMO%X-GvyniLGkCiCxvX^=NXpx$-rBA;!HwY+ok%916723UOcX^^yBz`@j0e3-&PIn)hdaY{05* z_M0CGy>Y!W)u5_GZ*vyc9o;m~k8^t*&vY^nMwPo79^Pe~+929LJGhKpgsF@5%q`gf z4hx~6vV&XhGQMnLk>U(aUZwBo%I?$q^NXf|4@-g{7@ZUU-()B(bKw65p!XR(UHx3v IIVCg!06Cm`J^%m! diff --git a/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/4-inhand-right.png b/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/4-inhand-right.png deleted file mode 100644 index fa55e86eb97cf04d88a24bb2698eef0dec06b57c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 321 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAQ1G*- zi(^Q|oVPc<`3@;axIT1#)OY8<&@MHdjlMD`v>lZ0{XQG|Pk9ToTt_j(5leBN!qC??TmK*SObxAxa|5H9Y&n z8;kd5{+MRJUPR&Dmbd#ku75ZhJApgku9dWBamw?PtUsnd%)e{x(1v6x4$CYLoM^9p z_pttIK*PN1ADq+v9D5;{v9Eo8N>z*G`G#fHKO9f*tA6IZp@QE&;pN9!f5jp;URaub gdc7mm^`98y*nb*ts=m*j4D>#Or>mdKI;Vst0ITVNC;$Ke diff --git a/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/inhand-left-fill-1.png b/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/inhand-left-fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..93ff582233b78320bc09e9299ba7b136aed58467 GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|j6Gc(Ln`LH zy>*b2fq~z$T4)m$)e8UK0F)%dT-^0wnaK@zeE%(>hhI9Wx NVxF#kF6*2UngB|{BXR%$ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/inhand-left-fill-2.png b/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/inhand-left-fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..a8271c771cdcda9aa7693f780088bf6096d4643f GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|>^xl@Ln`LH zy?KzA!GMFw;d}fnzQD=XD$E%g%|n6mKyxNNSw2TS?{vQ$KbX(JU>kP-`Re1$3>O|S XtO*i-`AXyN6_AXltDnm{r-UW|sIVrd literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/inhand-left-fill-3.png b/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/inhand-left-fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..b8ce5e2519db1c89e1aa95b048ca703162dceba6 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|oIPC}Ln`LH zy?KzAL4kwC@mIc7yqUrgk2#tRclLDx6#%sv8OQG{cfI~%;>YOHKQAi4f(#5&wSOJO c_!$_Ei=EC_zU#&Gwg4pI>FVdQ&MBb@0LKt0#Q*>R literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/inhand-left.png b/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..9b7b05b437d7a498c3bbef74224f5e44739d3c65 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|vOQfKLn`LH zy|q!a!GOcT@!R~fb2n^Ua8<>trkwf14^M9vpdto?S0~PNobY`7Y1a0sbG~qFepZw8 z<9S)%`gv?Q@^N>2e}>wCQ~}kkdHeQ&wD;D%vK6T-*L}Qt>S5immvv4FO#mQHMV0^n literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/inhand-right-fill-1.png b/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/inhand-right-fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..9f489d4e645a778ed95973482171f7400f052ade GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|EIeHtLn`LH zy}6N>!GMFs@LT+^U;`#r$4%-x{;dMaGcaU$Zn|qwxK|#`VPL3xbeNf;;5@UBHTPG~ REq*#6VNX{-mvv4FO#re2B4q#o literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/inhand-right-fill-2.png b/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/inhand-right-fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..ed4dc38dda63a8ddc35a2125d55d9a15357f6664 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|96eneLn`LH zy?Kz6L4k+m;FtSfehSre3osjt=DeG&1ysS%;5@0s{7%Is+pj-ztL#A{Kyd#~%m0Ev3K`njxgN@xNAw?8Qs literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/inhand-right-fill-3.png b/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/inhand-right-fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..ffb2bd374c539ac85039dd78a231248e54cf2743 GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|JUv|;Ln`LH zy=lnBpuod&@b~}a$y1N{378msZaTZw6R3irAvW~t>o(!=>gBTc*OmC&?(==m4iaZz l_|g16yJx}?4h9CFEeunCD&Ku>m}m%+@O1TaS?83{1OR53E(QPq literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/inhand-right.png b/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..4fe1bcafb532259a082a64c1b4d109a969cc14c6 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|3OrpLLn`LH zz2(T)puof8@bACb{}BC25_wt*s>b{ZyM6Pwhyax_ED&^e`6K(NQ#*h9nTww{cK&+e z7q#!#o}H21+vC38SX#3+S{|f~fnkQ$&-aDm#_!pu$$nYGJ?ZK8+>{+lyYKgM%vxr{ aFyS<3jg!Uio)ePnAhn*ZelF{r5}E*-r$P1r literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/meta.json b/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/meta.json index 8c15361569d..1495eccd7a6 100644 --- a/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Chemistry/syringe.rsi/meta.json @@ -58,43 +58,35 @@ "name": "syringe2" }, { - "name": "0-inhand-left", - "directions": 4 - }, - { - "name": "0-inhand-right", - "directions": 4 - }, - { - "name": "1-inhand-left", - "directions": 4 + "name": "inhand-left", + "directions": 4 }, { - "name": "1-inhand-right", - "directions": 4 + "name": "inhand-right", + "directions": 4 }, { - "name": "2-inhand-left", + "name": "inhand-left-fill-1", "directions": 4 }, { - "name": "2-inhand-right", + "name": "inhand-right-fill-1", "directions": 4 }, { - "name": "3-inhand-left", + "name": "inhand-left-fill-2", "directions": 4 }, { - "name": "3-inhand-right", + "name": "inhand-right-fill-2", "directions": 4 }, { - "name": "4-inhand-left", + "name": "inhand-left-fill-3", "directions": 4 }, { - "name": "4-inhand-right", + "name": "inhand-right-fill-3", "directions": 4 } ] diff --git a/Resources/Textures/Objects/Specific/Chemistry/vial.rsi/inhand-left-fill-1.png b/Resources/Textures/Objects/Specific/Chemistry/vial.rsi/inhand-left-fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..8c4633339101734b2db29e85660724da26e80f2b GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|Ogvp2Ln`LH zz2(Tuz`$|D;7_;R2L}B~VFyIkfDB=Hpy64c!31Iff&CAlF$t**Y8SZQq(-K01&MjO L`njxgN@xNA;~O7h literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/vial.rsi/inhand-left-fill-2.png b/Resources/Textures/Objects/Specific/Chemistry/vial.rsi/inhand-left-fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..3b4a2159245e7105274dd9d1c3f9ee59336eec64 GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|Y&=~YLn`LH zz2zv#puoejQTk7|UWZ1lfeKUDK{cQ}gF|@eTk%<*o75J8ctCI<^lttEc_5?Ss_#Dc UhZ(E)d;I$Ld%`fCe4vwIC+geNB{^LICt%D{QCLF eFD3?tgq7^SK5>8HKQUPyB<1Pq=d#Wzp$P!L=qY;u literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/vial.rsi/inhand-left-fill-4.png b/Resources/Textures/Objects/Specific/Chemistry/vial.rsi/inhand-left-fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..5973326b8897781716fcd42c18abcc5a294abb44 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|JUm?-Ln`LH zy>*b2L4k+)z=MCr;o$-!GMFs@LT+^%?zxvj+@kX{96T-XJC->+;rEVbfqYm!@yAY{4g`afk^(C%iLcd SRYyJq346NwxvXmVYEcJUu^{85kb; Y^PYXp{Zoal_zXzG)78&qol`;+0P>S2asU7T literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/vial.rsi/inhand-right-fill-3.png b/Resources/Textures/Objects/Specific/Chemistry/vial.rsi/inhand-right-fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..147ad5acc5143b79afcaaf7694d1a66ff57d5507 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|JUm?-Ln`LH zy>*b2L4k+GapV7a$;@591UP4|OxT%!NeZZh!N=9*Po72TDFJmL5fCUd`pdIs fihcidc_61t%2|y2ulw!vCm<*b2L4k+GapV7a$;@28CP>U#nXohek`z!0L$RRXP2SypQNPbl;NqDe3lai?4|}}q hnYHi7xATI9mPqU|<6%6!>skUx($m$?Wt~$(69ByNDRck; literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Chemistry/vial.rsi/meta.json b/Resources/Textures/Objects/Specific/Chemistry/vial.rsi/meta.json index 800cb2b5224..d7ccba364f6 100644 --- a/Resources/Textures/Objects/Specific/Chemistry/vial.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Chemistry/vial.rsi/meta.json @@ -13,10 +13,42 @@ { "name": "inhand-left", "directions": 4 + }, + { + "name": "inhand-left-fill-1", + "directions": 4 + }, + { + "name": "inhand-left-fill-2", + "directions": 4 + }, + { + "name": "inhand-left-fill-3", + "directions": 4 + }, + { + "name": "inhand-left-fill-4", + "directions": 4 }, { "name": "inhand-right", "directions": 4 + }, + { + "name": "inhand-right-fill-1", + "directions": 4 + }, + { + "name": "inhand-right-fill-2", + "directions": 4 + }, + { + "name": "inhand-right-fill-3", + "directions": 4 + }, + { + "name": "inhand-right-fill-4", + "directions": 4 }, { "name": "vial-1" From 3b3e9abb7b3930ba349b574bf9488640500909e8 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Sun, 28 Jan 2024 21:41:59 -0500 Subject: [PATCH 027/266] Make procgen use weighted variants (#24669) (cherry picked from commit 2a6705818bf510aee3026c7f3c3a4ed56f188189) --- .../Gateway/Systems/GatewayGeneratorSystem.cs | 4 +- .../Procedural/DungeonJob.NoiseDunGen.cs | 2 +- .../Procedural/DungeonJob.PostGen.cs | 25 ++++++------ Content.Server/Procedural/DungeonJob.cs | 4 ++ .../Procedural/DungeonSystem.Rooms.cs | 3 +- Content.Server/Procedural/DungeonSystem.cs | 3 ++ Content.Shared/Maps/ContentTileDefinition.cs | 2 +- Content.Shared/Maps/TileSystem.cs | 36 +++++++++++++++++- .../Parallax/Biomes/SharedBiomeSystem.cs | 10 ++--- Content.Shared/Tiles/FloorTileSystem.cs | 5 ++- .../Prototypes/Procedural/biome_templates.yml | 38 ------------------- 11 files changed, 68 insertions(+), 64 deletions(-) diff --git a/Content.Server/Gateway/Systems/GatewayGeneratorSystem.cs b/Content.Server/Gateway/Systems/GatewayGeneratorSystem.cs index 7d6f133e939..c8b30af620c 100644 --- a/Content.Server/Gateway/Systems/GatewayGeneratorSystem.cs +++ b/Content.Server/Gateway/Systems/GatewayGeneratorSystem.cs @@ -6,6 +6,7 @@ using Content.Server.Salvage; using Content.Shared.CCVar; using Content.Shared.Dataset; +using Content.Shared.Maps; using Content.Shared.Movement.Components; using Content.Shared.Parallax.Biomes; using Content.Shared.Physics; @@ -41,6 +42,7 @@ public sealed class GatewayGeneratorSystem : EntitySystem [Dependency] private readonly MetaDataSystem _metadata = default!; [Dependency] private readonly RestrictedRangeSystem _restricted = default!; [Dependency] private readonly SharedMapSystem _maps = default!; + [Dependency] private readonly TileSystem _tile = default!; [ValidatePrototypeId] private const string PlanetNames = "names_borer"; @@ -132,7 +134,7 @@ private void GenerateDestination(EntityUid uid, GatewayGeneratorComponent? gener { for (var y = -2; y <= 2; y++) { - tiles.Add((new Vector2i(x, y) + origin, new Tile(tileDef.TileId, variant: random.NextByte(tileDef.Variants)))); + tiles.Add((new Vector2i(x, y) + origin, new Tile(tileDef.TileId, variant: _tile.PickVariant((ContentTileDefinition) tileDef, random)))); } } diff --git a/Content.Server/Procedural/DungeonJob.NoiseDunGen.cs b/Content.Server/Procedural/DungeonJob.NoiseDunGen.cs index 7393ce72fd7..73c3386ead5 100644 --- a/Content.Server/Procedural/DungeonJob.NoiseDunGen.cs +++ b/Content.Server/Procedural/DungeonJob.NoiseDunGen.cs @@ -84,7 +84,7 @@ private async Task GenerateNoiseDungeon(NoiseDunGen dungen, EntityUid g foundNoise = true; noiseFill = true; var tileDef = _tileDefManager[layer.Tile]; - var variant = rand.NextByte(tileDef.Variants); + var variant = _tile.PickVariant((ContentTileDefinition) tileDef, rand); tiles.Add((node, new Tile(tileDef.TileId, variant: variant))); roomTiles.Add(node); diff --git a/Content.Server/Procedural/DungeonJob.PostGen.cs b/Content.Server/Procedural/DungeonJob.PostGen.cs index 559d5fedb91..ffbb9454dcf 100644 --- a/Content.Server/Procedural/DungeonJob.PostGen.cs +++ b/Content.Server/Procedural/DungeonJob.PostGen.cs @@ -3,6 +3,7 @@ using System.Threading.Tasks; using Content.Server.NodeContainer; using Content.Shared.Doors.Components; +using Content.Shared.Maps; using Content.Shared.Physics; using Content.Shared.Procedural; using Content.Shared.Procedural.PostGeneration; @@ -191,7 +192,7 @@ private async Task PostGen(BoundaryWallPostGen gen, Dungeon dungeon, EntityUid g if (!_anchorable.TileFree(grid, neighbor, DungeonSystem.CollisionLayer, DungeonSystem.CollisionMask)) continue; - tiles.Add((neighbor, _tileDefManager.GetVariantTile(tileDef, random))); + tiles.Add((neighbor, _tile.GetVariantTile((ContentTileDefinition) tileDef, random))); } foreach (var index in dungeon.CorridorExteriorTiles) @@ -202,7 +203,7 @@ private async Task PostGen(BoundaryWallPostGen gen, Dungeon dungeon, EntityUid g if (!_anchorable.TileFree(grid, index, DungeonSystem.CollisionLayer, DungeonSystem.CollisionMask)) continue; - tiles.Add((index, _tileDefManager.GetVariantTile(tileDef, random))); + tiles.Add((index, _tile.GetVariantTile((ContentTileDefinition)tileDef, random))); } grid.SetTiles(tiles); @@ -478,7 +479,7 @@ private async Task PostGen(DungeonEntrancePostGen gen, Dungeon dungeon, EntityUi isValid = true; // Entrance wew - grid.SetTile(tile, _tileDefManager.GetVariantTile(tileDef, random)); + grid.SetTile(tile, _tile.GetVariantTile((ContentTileDefinition) tileDef, random)); ClearDoor(dungeon, grid, tile); var gridCoords = grid.GridTileToLocal(tile); // Need to offset the spawn to avoid spawning in the room. @@ -496,7 +497,7 @@ private async Task PostGen(DungeonEntrancePostGen gen, Dungeon dungeon, EntityUi continue; } - grid.SetTile(nearTile.GridIndices, _tileDefManager.GetVariantTile(tileDef, random)); + grid.SetTile(nearTile.GridIndices, _tile.GetVariantTile((ContentTileDefinition) tileDef, random));; } break; @@ -589,7 +590,7 @@ private async Task PostGen(ExternalWindowPostGen gen, Dungeon dungeon, EntityUid { var neighbor = tile + dirVec * j; - tiles.Add((neighbor, _tileDefManager.GetVariantTile(tileDef, random))); + tiles.Add((neighbor, _tile.GetVariantTile((ContentTileDefinition) tileDef, random))); index++; takenTiles.Add(neighbor); } @@ -690,7 +691,7 @@ private async Task PostGen(InternalWindowPostGen gen, Dungeon dungeon, EntityUid { var tile = validTiles[j]; var gridPos = grid.GridTileToLocal(tile); - grid.SetTile(tile, _tileDefManager.GetVariantTile(tileDef, random)); + grid.SetTile(tile, _tile.GetVariantTile((ContentTileDefinition) tileDef, random)); _entManager.SpawnEntities(gridPos, gen.Entities); } @@ -721,7 +722,7 @@ private async Task PostGen(RoomEntrancePostGen gen, Dungeon dungeon, EntityUid g { foreach (var entrance in room.Entrances) { - setTiles.Add((entrance, _tileDefManager.GetVariantTile(tileDef, random))); + setTiles.Add((entrance, _tile.GetVariantTile((ContentTileDefinition) tileDef, random))); } } @@ -857,7 +858,7 @@ private async Task PostGen(CorridorPostGen gen, Dungeon dungeon, EntityUid gridU foreach (var tile in corridorTiles) { - setTiles.Add((tile, _tileDefManager.GetVariantTile(tileDef, random))); + setTiles.Add((tile, _tile.GetVariantTile((ContentTileDefinition) tileDef, random))); } grid.SetTiles(setTiles); @@ -902,7 +903,7 @@ private async Task PostGen(EntranceFlankPostGen gen, Dungeon dungeon, EntityUid if (!dungeon.RoomExteriorTiles.Contains(neighbor)) continue; - tiles.Add((neighbor, _tileDefManager.GetVariantTile(tileDef, random))); + tiles.Add((neighbor, _tile.GetVariantTile((ContentTileDefinition) tileDef, random))); spawnPositions.Add(neighbor); } } @@ -1013,7 +1014,7 @@ private async Task PostGen(JunctionPostGen gen, Dungeon dungeon, EntityUid gridU for (var x = -width + 1; x < width; x++) { var weh = tile + neighborDir.ToIntVec() * x; - grid.SetTile(weh, _tileDefManager.GetVariantTile(tileDef, random)); + grid.SetTile(weh, _tile.GetVariantTile((ContentTileDefinition) tileDef, random)); var coords = grid.GridTileToLocal(weh); _entManager.SpawnEntities(coords, gen.Entities); @@ -1131,7 +1132,7 @@ private async Task PostGen(MiddleConnectionPostGen gen, Dungeon dungeon, EntityU continue; width--; - grid.SetTile(node, _tileDefManager.GetVariantTile(tileDef, random)); + grid.SetTile(node, _tile.GetVariantTile((ContentTileDefinition) tileDef, random)); if (gen.EdgeEntities != null && nodeDistances.Count - i <= 2) { @@ -1217,7 +1218,7 @@ private async Task PostGen(WallMountPostGen gen, Dungeon dungeon, EntityUid grid if (!random.Prob(gen.Prob) || !checkedTiles.Add(neighbor)) continue; - grid.SetTile(neighbor, _tileDefManager.GetVariantTile(tileDef, random)); + grid.SetTile(neighbor, _tile.GetVariantTile((ContentTileDefinition) tileDef, random)); var gridPos = grid.GridTileToLocal(neighbor); var protoNames = EntitySpawnCollection.GetSpawns(gen.Spawns, random); diff --git a/Content.Server/Procedural/DungeonJob.cs b/Content.Server/Procedural/DungeonJob.cs index 55c4474d31b..c8a69808d31 100644 --- a/Content.Server/Procedural/DungeonJob.cs +++ b/Content.Server/Procedural/DungeonJob.cs @@ -4,6 +4,7 @@ using Robust.Shared.CPUJob.JobQueues; using Content.Server.Decals; using Content.Shared.Construction.EntitySystems; +using Content.Shared.Maps; using Content.Shared.Procedural; using Content.Shared.Procedural.DungeonGenerators; using Content.Shared.Procedural.PostGeneration; @@ -27,6 +28,7 @@ public sealed partial class DungeonJob : Job private readonly DecalSystem _decals; private readonly DungeonSystem _dungeon; private readonly EntityLookupSystem _lookup; + private readonly TileSystem _tile; private readonly SharedMapSystem _maps; private readonly SharedTransformSystem _transform; private EntityQuery _tagQuery; @@ -51,6 +53,7 @@ public DungeonJob( DecalSystem decals, DungeonSystem dungeon, EntityLookupSystem lookup, + TileSystem tile, SharedTransformSystem transform, DungeonConfigPrototype gen, MapGridComponent grid, @@ -69,6 +72,7 @@ public DungeonJob( _decals = decals; _dungeon = dungeon; _lookup = lookup; + _tile = tile; _maps = _entManager.System(); _transform = transform; _tagQuery = _entManager.GetEntityQuery(); diff --git a/Content.Server/Procedural/DungeonSystem.Rooms.cs b/Content.Server/Procedural/DungeonSystem.Rooms.cs index d299048f516..03bcc2b4b13 100644 --- a/Content.Server/Procedural/DungeonSystem.Rooms.cs +++ b/Content.Server/Procedural/DungeonSystem.Rooms.cs @@ -1,5 +1,6 @@ using System.Numerics; using Content.Shared.Decals; +using Content.Shared.Maps; using Content.Shared.Procedural; using Content.Shared.Random.Helpers; using Content.Shared.Whitelist; @@ -230,7 +231,7 @@ public void SpawnRoom( // but place 1 nanometre off grid and fail the add. if (!_maps.TryGetTileRef(gridUid, grid, tilePos, out var tileRef) || tileRef.Tile.IsEmpty) { - _maps.SetTile(gridUid, grid, tilePos, _tileDefManager.GetVariantTile(FallbackTileId, _random)); + _maps.SetTile(gridUid, grid, tilePos, _tile.GetVariantTile((ContentTileDefinition) _tileDefManager[FallbackTileId], _random.GetRandom())); } var result = _decals.TryAddDecal( diff --git a/Content.Server/Procedural/DungeonSystem.cs b/Content.Server/Procedural/DungeonSystem.cs index bdd194caa48..069508bcbbb 100644 --- a/Content.Server/Procedural/DungeonSystem.cs +++ b/Content.Server/Procedural/DungeonSystem.cs @@ -31,6 +31,7 @@ public sealed partial class DungeonSystem : SharedDungeonSystem [Dependency] private readonly AnchorableSystem _anchorable = default!; [Dependency] private readonly DecalSystem _decals = default!; [Dependency] private readonly EntityLookupSystem _lookup = default!; + [Dependency] private readonly TileSystem _tile = default!; [Dependency] private readonly MapLoaderSystem _loader = default!; [Dependency] private readonly SharedMapSystem _maps = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; @@ -198,6 +199,7 @@ public void GenerateDungeon(DungeonConfigPrototype gen, _decals, this, _lookup, + _tile, _transform, gen, grid, @@ -229,6 +231,7 @@ public async Task GenerateDungeonAsync( _decals, this, _lookup, + _tile, _transform, gen, grid, diff --git a/Content.Shared/Maps/ContentTileDefinition.cs b/Content.Shared/Maps/ContentTileDefinition.cs index b2704a28973..ce7980509eb 100644 --- a/Content.Shared/Maps/ContentTileDefinition.cs +++ b/Content.Shared/Maps/ContentTileDefinition.cs @@ -71,7 +71,7 @@ public sealed partial class ContentTileDefinition : IPrototype, IInheritingProto /// /// This controls what variants the `variantize` command is allowed to use. /// - [DataField("placementVariants")] public float[] PlacementVariants { get; set; } = new [] { 1f }; + [DataField("placementVariants")] public float[] PlacementVariants { get; set; } = { 1f }; [DataField("thermalConductivity")] public float ThermalConductivity = 0.04f; diff --git a/Content.Shared/Maps/TileSystem.cs b/Content.Shared/Maps/TileSystem.cs index c2181645e3b..3f7852cfe60 100644 --- a/Content.Shared/Maps/TileSystem.cs +++ b/Content.Shared/Maps/TileSystem.cs @@ -25,12 +25,29 @@ public sealed class TileSystem : EntitySystem /// Returns a weighted pick of a tile variant. /// public byte PickVariant(ContentTileDefinition tile) + { + return PickVariant(tile, _robustRandom.GetRandom()); + } + + /// + /// Returns a weighted pick of a tile variant. + /// + public byte PickVariant(ContentTileDefinition tile, int seed) + { + var rand = new System.Random(seed); + return PickVariant(tile, rand); + } + + /// + /// Returns a weighted pick of a tile variant. + /// + public byte PickVariant(ContentTileDefinition tile, System.Random random) { var variants = tile.PlacementVariants; var sum = variants.Sum(); var accumulated = 0f; - var rand = _robustRandom.NextFloat() * sum; + var rand = random.NextFloat() * sum; for (byte i = 0; i < variants.Length; ++i) { @@ -44,6 +61,23 @@ public byte PickVariant(ContentTileDefinition tile) throw new InvalidOperationException($"Invalid weighted variantize tile pick for {tile.ID}!"); } + /// + /// Returns a tile with a weighted random variant. + /// + public Tile GetVariantTile(ContentTileDefinition tile, System.Random random) + { + return new Tile(tile.TileId, variant: PickVariant(tile, random)); + } + + /// + /// Returns a tile with a weighted random variant. + /// + public Tile GetVariantTile(ContentTileDefinition tile, int seed) + { + var rand = new System.Random(seed); + return new Tile(tile.TileId, variant: PickVariant(tile, rand)); + } + public bool PryTile(Vector2i indices, EntityUid gridId) { var grid = Comp(gridId); diff --git a/Content.Shared/Parallax/Biomes/SharedBiomeSystem.cs b/Content.Shared/Parallax/Biomes/SharedBiomeSystem.cs index db590135f09..b14baba9817 100644 --- a/Content.Shared/Parallax/Biomes/SharedBiomeSystem.cs +++ b/Content.Shared/Parallax/Biomes/SharedBiomeSystem.cs @@ -16,6 +16,7 @@ public abstract class SharedBiomeSystem : EntitySystem [Dependency] protected readonly IPrototypeManager ProtoManager = default!; [Dependency] private readonly ISerializationManager _serManager = default!; [Dependency] protected readonly ITileDefinitionManager TileDefManager = default!; + [Dependency] private readonly TileSystem _tile = default!; protected const byte ChunkSize = 8; @@ -158,13 +159,8 @@ private bool TryGetTile(Vector2i indices, FastNoiseLite noise, bool invert, floa // Pick a variant tile if they're available as well if (variantCount > 1) { - var variantValue = (noise.GetNoise(indices.X * 8, indices.Y * 8, variantCount) + 1f) / 2f; - variant = (byte) Pick(variantCount, variantValue); - - if (variants != null) - { - variant = variants[variant]; - } + var variantValue = (noise.GetNoise(indices.X * 8, indices.Y * 8, variantCount) + 1f) * 100; + variant = _tile.PickVariant(tileDef, (int) variantValue); } tile = new Tile(tileDef.TileId, 0, variant); diff --git a/Content.Shared/Tiles/FloorTileSystem.cs b/Content.Shared/Tiles/FloorTileSystem.cs index 21e21fa9e9b..04aa100cd1d 100644 --- a/Content.Shared/Tiles/FloorTileSystem.cs +++ b/Content.Shared/Tiles/FloorTileSystem.cs @@ -35,6 +35,7 @@ public sealed class FloorTileSystem : EntitySystem [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly SharedStackSystem _stackSystem = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly TileSystem _tile = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; private static readonly Vector2 CheckRange = new(1f, 1f); @@ -175,8 +176,8 @@ private void PlaceAt(EntityUid user, EntityUid gridUid, MapGridComponent mapGrid { _adminLogger.Add(LogType.Tile, LogImpact.Low, $"{ToPrettyString(user):actor} placed tile {_tileDefinitionManager[tileId].Name} at {ToPrettyString(gridUid)} {location}"); - // TODO: Proper predicted RNG. - var variant = (byte) (_timing.CurTick.Value % ((ContentTileDefinition) _tileDefinitionManager[tileId]).Variants); + var random = new System.Random((int) _timing.CurTick.Value); + var variant = _tile.PickVariant((ContentTileDefinition) _tileDefinitionManager[tileId], random); mapGrid.SetTile(location.Offset(new Vector2(offset, offset)), new Tile(tileId, 0, variant)); _audio.PlayPredicted(placeSound, location, user); diff --git a/Resources/Prototypes/Procedural/biome_templates.yml b/Resources/Prototypes/Procedural/biome_templates.yml index 997ae33aa55..88979316443 100644 --- a/Resources/Prototypes/Procedural/biome_templates.yml +++ b/Resources/Prototypes/Procedural/biome_templates.yml @@ -70,15 +70,6 @@ # Fill layer - !type:BiomeTileLayer threshold: -1 - variants: - - 0 - tile: FloorAsteroidSand - - !type:BiomeTileLayer - threshold: 0.80 - noise: - seed: 1 - noiseType: OpenSimplex2 - frequency: 2 tile: FloorAsteroidSand # Grass @@ -307,8 +298,6 @@ # Fill basalt - !type:BiomeTileLayer threshold: -1 - variants: - - 0 tile: FloorBasalt # Snow @@ -530,15 +519,6 @@ # Fill chromite - !type:BiomeTileLayer threshold: -1 - variants: - - 0 - tile: FloorChromite - - !type:BiomeTileLayer - threshold: 0.25 - noise: - seed: 1 - noiseType: OpenSimplex2 - frequency: 2 tile: FloorChromite # Caves @@ -593,15 +573,6 @@ - !type:BiomeTileLayer threshold: -1.0 tile: FloorAsteroidSand - variants: - - 0 - - !type:BiomeTileLayer - threshold: 0.5 - noise: - seed: 1 - noiseType: OpenSimplex2 - frequency: 2 - tile: FloorAsteroidSand # Asteroid - type: biomeTemplate @@ -653,12 +624,3 @@ - !type:BiomeTileLayer threshold: -1.0 tile: FloorAsteroidSand - variants: - - 0 - - !type:BiomeTileLayer - threshold: 0.5 - noise: - seed: 1 - noiseType: OpenSimplex2 - frequency: 2 - tile: FloorAsteroidSand From 870cae9db882c9fc64d525895b9146013399f7d8 Mon Sep 17 00:00:00 2001 From: Vyacheslav Kovalevsky <40753025+Slava0135@users.noreply.github.com> Date: Mon, 29 Jan 2024 07:06:32 +0300 Subject: [PATCH 028/266] Store ninja objectives in conditions 2 (#20894) * move spider charge target from role * shorter field names * remove ninja role comment * remove unused systems in SpaceNinjaSystem * GenericAntagObjectivesAddedEvent * check if warp point is on same map * remove unnecessary import * add missing loc when spider charge has no target * a * remove spider charge target requirement comp * inline SpiderChargeTitle * allow planting charge without objective * remove map check * fix role check when planting * obj.Target * Fix merge --------- Co-authored-by: metalgearsloth (cherry picked from commit 7311ce671fe29d81c662b2313e28c275c4f868cb) --- .../GenericAntag/GenericAntagSystem.cs | 2 +- .../Ninja/Systems/SpaceNinjaSystem.cs | 22 +++----- .../Ninja/Systems/SpiderChargeSystem.cs | 9 +-- .../SpiderChargeConditionComponent.cs | 12 +++- .../SpiderChargeTargetRequirementComponent.cs | 11 ---- .../Systems/NinjaConditionsSystem.cs | 56 ++++++++++++++----- .../SpiderChargeTargetRequirementSystem.cs | 24 -------- Content.Server/Roles/NinjaRoleComponent.cs | 8 --- .../objectives/conditions/spider-charge.ftl | 1 + Resources/Prototypes/Objectives/ninja.yml | 1 - 10 files changed, 65 insertions(+), 81 deletions(-) delete mode 100644 Content.Server/Objectives/Components/SpiderChargeTargetRequirementComponent.cs delete mode 100644 Content.Server/Objectives/Systems/SpiderChargeTargetRequirementSystem.cs diff --git a/Content.Server/GenericAntag/GenericAntagSystem.cs b/Content.Server/GenericAntag/GenericAntagSystem.cs index d789153fbc4..6b1774159c1 100644 --- a/Content.Server/GenericAntag/GenericAntagSystem.cs +++ b/Content.Server/GenericAntag/GenericAntagSystem.cs @@ -60,7 +60,7 @@ public void MakeAntag(EntityUid uid, EntityUid mindId, GenericAntagComponent? co } /// -/// Event raised on a player's entity after its simple antag rule is started and objectives get added. +/// Event raised on a player's entity after its simple antag rule is started. /// Use this to add a briefing, roles, etc. /// [ByRefEvent] diff --git a/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs b/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs index 716c98372cf..835ac7ad6cd 100644 --- a/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs +++ b/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs @@ -7,7 +7,6 @@ using Content.Server.Research.Systems; using Content.Server.Roles; using Content.Server.GenericAntag; -using Content.Server.Warps; using Content.Shared.Alert; using Content.Shared.Clothing.EntitySystems; using Content.Shared.Doors.Components; @@ -17,9 +16,11 @@ using Content.Shared.Ninja.Systems; using Content.Shared.Popups; using Content.Shared.Rounding; -using Robust.Shared.Random; +using Robust.Shared.Audio; +using Robust.Shared.Player; using System.Diagnostics.CodeAnalysis; using Content.Server.Objectives.Components; +using Robust.Shared.Audio.Systems; namespace Content.Server.Ninja.Systems; @@ -37,9 +38,9 @@ public sealed class SpaceNinjaSystem : SharedSpaceNinjaSystem [Dependency] private readonly AlertsSystem _alerts = default!; [Dependency] private readonly BatterySystem _battery = default!; [Dependency] private readonly IChatManager _chatMan = default!; - [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly PowerCellSystem _powerCell = default!; [Dependency] private readonly RoleSystem _role = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedMindSystem _mind = default!; [Dependency] private readonly StealthClothingSystem _stealthClothing = default!; @@ -161,18 +162,9 @@ private void OnNinjaCreated(EntityUid uid, SpaceNinjaComponent comp, ref Generic _role.MindAddRole(mindId, role, mind); _role.MindPlaySound(mindId, config.GreetingSound, mind); - // choose spider charge detonation point - var warps = new List(); - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var warpUid, out _, out var warp)) - { - warps.Add(warpUid); - } - - if (warps.Count > 0) - role.SpiderChargeTarget = _random.Pick(warps); - - _chatMan.DispatchServerMessage(mind.Session, Loc.GetString("ninja-role-greeting")); + var session = mind.Session; + _audio.PlayGlobal(config.GreetingSound, Filter.Empty().AddPlayer(session), false, AudioParams.Default); + _chatMan.DispatchServerMessage(session, Loc.GetString("ninja-role-greeting")); } // TODO: PowerCellDraw, modify when cloak enabled diff --git a/Content.Server/Ninja/Systems/SpiderChargeSystem.cs b/Content.Server/Ninja/Systems/SpiderChargeSystem.cs index 0182bd7ca78..948d715f0a7 100644 --- a/Content.Server/Ninja/Systems/SpiderChargeSystem.cs +++ b/Content.Server/Ninja/Systems/SpiderChargeSystem.cs @@ -1,4 +1,5 @@ using Content.Server.Explosion.EntitySystems; +using Content.Server.GameTicking.Rules.Components; using Content.Server.Mind; using Content.Server.Objectives.Components; using Content.Server.Popups; @@ -38,7 +39,7 @@ private void OnAttemptStick(EntityUid uid, SpiderChargeComponent comp, AttemptEn var user = args.User; - if (!_mind.TryGetRole(user, out var role)) + if (!_mind.TryGetRole(user, out var _)) { _popup.PopupEntity(Loc.GetString("spider-charge-not-ninja"), user, user); args.Cancelled = true; @@ -46,11 +47,11 @@ private void OnAttemptStick(EntityUid uid, SpiderChargeComponent comp, AttemptEn } // allow planting anywhere if there is no target, which should never happen - if (role.SpiderChargeTarget == null) + if (!_mind.TryGetObjectiveComp(user, out var obj) || obj.Target == null) return; // assumes warp point still exists - var targetXform = Transform(role.SpiderChargeTarget.Value); + var targetXform = Transform(obj.Target.Value); var locXform = Transform(args.Target); if (locXform.MapID != targetXform.MapID || (_transform.GetWorldPosition(locXform) - _transform.GetWorldPosition(targetXform)).LengthSquared() > comp.Range * comp.Range) @@ -79,6 +80,6 @@ private void OnExplode(EntityUid uid, SpiderChargeComponent comp, TriggerEvent a return; // assumes the target was destroyed, that the charge wasn't moved somehow - obj.SpiderChargeDetonated = true; + obj.Detonated = true; } } diff --git a/Content.Server/Objectives/Components/SpiderChargeConditionComponent.cs b/Content.Server/Objectives/Components/SpiderChargeConditionComponent.cs index 1c6f22ed57c..368c9f27ed4 100644 --- a/Content.Server/Objectives/Components/SpiderChargeConditionComponent.cs +++ b/Content.Server/Objectives/Components/SpiderChargeConditionComponent.cs @@ -6,9 +6,15 @@ namespace Content.Server.Objectives.Components; /// /// Requires that the player is a ninja and blew up their spider charge at its target location. /// -[RegisterComponent, Access(typeof(NinjaConditionsSystem), typeof(SpiderChargeSystem))] +[RegisterComponent, Access(typeof(NinjaConditionsSystem), typeof(SpiderChargeSystem), typeof(SpaceNinjaSystem))] public sealed partial class SpiderChargeConditionComponent : Component { - [DataField("spiderChargeDetonated"), ViewVariables(VVAccess.ReadWrite)] - public bool SpiderChargeDetonated; + [DataField, ViewVariables(VVAccess.ReadWrite)] + public bool Detonated; + + /// + /// Warp point that the spider charge has to target + /// + [DataField, ViewVariables(VVAccess.ReadWrite)] + public EntityUid? Target; } diff --git a/Content.Server/Objectives/Components/SpiderChargeTargetRequirementComponent.cs b/Content.Server/Objectives/Components/SpiderChargeTargetRequirementComponent.cs deleted file mode 100644 index e148d772f42..00000000000 --- a/Content.Server/Objectives/Components/SpiderChargeTargetRequirementComponent.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Content.Server.Objectives.Systems; - -namespace Content.Server.Objectives.Components; - -/// -/// Requires the player to be a ninja that has a spider charge target assigned, which is almost always the case. -/// -[RegisterComponent, Access(typeof(SpiderChargeTargetRequirementSystem))] -public sealed partial class SpiderChargeTargetRequirementComponent : Component -{ -} diff --git a/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs b/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs index 24eeb0542ec..2bd8538af16 100644 --- a/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs +++ b/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs @@ -1,7 +1,10 @@ -using Content.Server.Roles; using Content.Server.Objectives.Components; using Content.Server.Warps; using Content.Shared.Objectives.Components; +using Content.Shared.Mind; +using Content.Shared.Ninja.Components; +using Robust.Shared.Random; +using Content.Server.Roles; namespace Content.Server.Objectives.Systems; @@ -13,11 +16,14 @@ public sealed class NinjaConditionsSystem : EntitySystem { [Dependency] private readonly MetaDataSystem _metaData = default!; [Dependency] private readonly NumberObjectiveSystem _number = default!; + [Dependency] private readonly SharedMindSystem _mind = default!; + [Dependency] private readonly IRobustRandom _random = default!; public override void Initialize() { SubscribeLocalEvent(OnDoorjackGetProgress); + SubscribeLocalEvent(OnSpiderChargeRequirementCheck); SubscribeLocalEvent(OnSpiderChargeAfterAssign); SubscribeLocalEvent(OnSpiderChargeGetProgress); @@ -43,28 +49,50 @@ private float DoorjackProgress(DoorjackConditionComponent comp, int target) } // spider charge - - private void OnSpiderChargeAfterAssign(EntityUid uid, SpiderChargeConditionComponent comp, ref ObjectiveAfterAssignEvent args) + private void OnSpiderChargeRequirementCheck(EntityUid uid, SpiderChargeConditionComponent comp, ref RequirementCheckEvent args) { - _metaData.SetEntityName(uid, SpiderChargeTitle(args.MindId), args.Meta); - } + if (args.Cancelled || !HasComp(args.MindId)) + { + return; + } - private void OnSpiderChargeGetProgress(EntityUid uid, SpiderChargeConditionComponent comp, ref ObjectiveGetProgressEvent args) - { - args.Progress = comp.SpiderChargeDetonated ? 1f : 0f; + // choose spider charge detonation point + var warps = new List(); + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var warpUid, out _, out var warp)) + { + if (warp.Location != null) + { + warps.Add(warpUid); + } + } + + if (warps.Count <= 0) + { + args.Cancelled = true; + return; + } + comp.Target = _random.Pick(warps); } - private string SpiderChargeTitle(EntityUid mindId) + private void OnSpiderChargeAfterAssign(EntityUid uid, SpiderChargeConditionComponent comp, ref ObjectiveAfterAssignEvent args) { - if (!TryComp(mindId, out var role) || - role.SpiderChargeTarget == null || - !TryComp(role.SpiderChargeTarget, out var warp)) + string title; + if (comp.Target == null || !TryComp(comp.Target, out var warp) || warp.Location == null) { // this should never really happen but eh - return Loc.GetString("objective-condition-spider-charge-title-no-target"); + title = Loc.GetString("objective-condition-spider-charge-title-no-target"); } + else + { + title = Loc.GetString("objective-condition-spider-charge-title", ("location", warp.Location)); + } + _metaData.SetEntityName(uid, title, args.Meta); + } - return Loc.GetString("objective-condition-spider-charge-title", ("location", warp.Location ?? Name(role.SpiderChargeTarget.Value))); + private void OnSpiderChargeGetProgress(EntityUid uid, SpiderChargeConditionComponent comp, ref ObjectiveGetProgressEvent args) + { + args.Progress = comp.Detonated ? 1f : 0f; } // steal research diff --git a/Content.Server/Objectives/Systems/SpiderChargeTargetRequirementSystem.cs b/Content.Server/Objectives/Systems/SpiderChargeTargetRequirementSystem.cs deleted file mode 100644 index 107d88900a0..00000000000 --- a/Content.Server/Objectives/Systems/SpiderChargeTargetRequirementSystem.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Content.Server.Objectives.Components; -using Content.Server.Roles; -using Content.Shared.Objectives.Components; - -namespace Content.Server.Objectives.Systems; - -public sealed class SpiderChargeTargetRequirementSystem : EntitySystem -{ - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnCheck); - } - - private void OnCheck(EntityUid uid, SpiderChargeTargetRequirementComponent comp, ref RequirementCheckEvent args) - { - if (args.Cancelled) - return; - - if (!TryComp(args.MindId, out var role) || role.SpiderChargeTarget == null) - args.Cancelled = true; - } -} diff --git a/Content.Server/Roles/NinjaRoleComponent.cs b/Content.Server/Roles/NinjaRoleComponent.cs index dcc55d0fb43..0fa2e5395e3 100644 --- a/Content.Server/Roles/NinjaRoleComponent.cs +++ b/Content.Server/Roles/NinjaRoleComponent.cs @@ -2,15 +2,7 @@ namespace Content.Server.Roles; -/// -/// Stores the ninja's objectives on the mind so if they die the rest of the greentext persists. -/// [RegisterComponent] public sealed partial class NinjaRoleComponent : AntagonistRoleComponent { - /// - /// Warp point that the spider charge has to target - /// - [DataField("spiderChargeTarget")] - public EntityUid? SpiderChargeTarget; } diff --git a/Resources/Locale/en-US/objectives/conditions/spider-charge.ftl b/Resources/Locale/en-US/objectives/conditions/spider-charge.ftl index cdc3cfda96e..2c4305df9cd 100644 --- a/Resources/Locale/en-US/objectives/conditions/spider-charge.ftl +++ b/Resources/Locale/en-US/objectives/conditions/spider-charge.ftl @@ -1 +1,2 @@ +objective-condition-spider-charge-title-no-target = Detonate the spider clan charge (no target) objective-condition-spider-charge-title = Detonate the spider clan charge in {$location} diff --git a/Resources/Prototypes/Objectives/ninja.yml b/Resources/Prototypes/Objectives/ninja.yml index fc3e156a969..b6c3d553df0 100644 --- a/Resources/Prototypes/Objectives/ninja.yml +++ b/Resources/Prototypes/Objectives/ninja.yml @@ -54,7 +54,6 @@ icon: sprite: Objects/Weapons/Bombs/spidercharge.rsi state: icon - - type: SpiderChargeTargetRequirement - type: SpiderChargeCondition - type: entity From 6af9238e6ccd25f223bf7f0df2807b0ed258d928 Mon Sep 17 00:00:00 2001 From: lizelive Date: Sun, 28 Jan 2024 20:30:46 -0800 Subject: [PATCH 029/266] client loglevel command shouldn't require host (#23490) client side log level shouldn't require host (cherry picked from commit 6960794795e37a0cb848bf02f2721914062f6358) --- Resources/engineCommandPerms.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/Resources/engineCommandPerms.yml b/Resources/engineCommandPerms.yml index b425d06099c..15200531e3a 100644 --- a/Resources/engineCommandPerms.yml +++ b/Resources/engineCommandPerms.yml @@ -113,7 +113,6 @@ Commands: - gc_mode - gc - - loglevel - saveconfig - testlog - sudo From d805b82848b0932cb8b305a3b76fc4fb121598e1 Mon Sep 17 00:00:00 2001 From: Julian Giebel Date: Mon, 29 Jan 2024 05:32:13 +0100 Subject: [PATCH 030/266] Implement basic emoji support (#24039) * Implement basic font support Add NotoEmoji font Add emoji font to default font stacks * Remove unneded change * L * Remove emoji font from default font stacks (cherry picked from commit 94b43423b4ba3bac3325610a6699a9f6cd08653b) --- Content.Client/Stylesheets/StyleNano.cs | 2 +- Resources/Fonts/NotoEmoji.ttf | Bin 0 -> 1966236 bytes Resources/Prototypes/fonts.yml | 4 ++++ 3 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 Resources/Fonts/NotoEmoji.ttf diff --git a/Content.Client/Stylesheets/StyleNano.cs b/Content.Client/Stylesheets/StyleNano.cs index 9ba06a4c421..c909e3db3c0 100644 --- a/Content.Client/Stylesheets/StyleNano.cs +++ b/Content.Client/Stylesheets/StyleNano.cs @@ -31,7 +31,7 @@ public static Font NotoStack(this IResourceCache resCache, string variation = "R { $"/Fonts/NotoSans{ds}/NotoSans{ds}-{variation}.ttf", $"/Fonts/NotoSans/NotoSansSymbols-{sv}.ttf", - "/Fonts/NotoSans/NotoSansSymbols2-Regular.ttf", + "/Fonts/NotoSans/NotoSansSymbols2-Regular.ttf" }, size ); diff --git a/Resources/Fonts/NotoEmoji.ttf b/Resources/Fonts/NotoEmoji.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e200019a458629dd8a061280b6d0226eb0b067bc GIT binary patch literal 1966236 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ñIG=3P=I=hed{s8a`GGTo?(T!K5km5;5^ zab&nYD{x?)C_bWU!@*|>WRz_rK4C}AGc@Er8*bDXPbV>r5qF)K*MQ~j4ZS2L&V<{n zU4nO%FndEC;@c7%n3I>t9J$_h&6`Wm@lI`FuHxHTOuAD!sr&HFD3ifAxA9~g>&OKs zMyq(c){OykPA2lyc6p$npO)oIP;ybZp>f*GJFxWF@fHV>a;?bTd-Fo##o=PNTo3i>sH`u2_&O~ zTB@`&qfXpUrl&2IitwP~W=PdjT2Ebys#^1EC8l%=MR_HZ8`Gd*I^T$JCH0Tqj+KaN zGdob2Qyq)JDn9mZd}`9T7L1kg^q6MNN;HG|0YH32YrU0;(G8fXH0>+nMVAflz(|>0 z3Dd>~Vi;$N19gqAr>8W(zlO+@<60uQEf3E?Ary-ho^B$Na53{ztJ)@W=Pp9LT$fJV+s`g@fMpxtQ0d$$z zxS&mD>(wK=Flm|AM2C*KyETq^DB8I-F^WF2+yuShJ>w|7>S&?I!dTFN7MW= zV^expAd+M{V(nweK~@B-Q1DQ$s1y3Gam?5tFYzhOCK)e?_hus)X-B(~ayxyj+*gg^ zb(1me{an^_>DZ{gMdIExeL61dIkE42*#InJ@|SIrQ9@jkK=%Z5+){o!F>j708p|qB z1(_~$%BWrw*hdKh`dgv%==4HK58gA4^Zs6j*9^vDNvlXu^x$1!7^OUZ!(Xk|(sWoy#(ipwr8w)<4 zUymc}G)J${UX9+#D-xS~W4&ABl`>;E8t;N3RbqQ@YO8R3Sb@oKZgL~;U>n}y7Hg}p zB#IC3lOnWmMyG|{;%8Y4EKf(*@>Nz4C*a}Vf8q2;Ts#{#Y#xRTXT#yY4`^dkz>U^3 z);4Q3PU)?ITjIbOgV=4_Ywf|Gg)7e1)DZHE2eEsxw{)e*0yw!4JIlMwsRDx=SEmq< z$7+D|6Lm}6@ZnS;oa%%4yw)P?B<%b4fBA=SUh4%5C$n0wTSsuNlI)I6{dQW5tvmjI z{PQCBN;I>7h5R@P+DV?PhP$4(-rM!muE%ygwCmnockSA}>!w{hc8%`Zxa;a&t9PBf z>(m_w@fZ5WqHmmi-Ii&C5h zTXI`&+j8F6^<%Tfnnw4G-Z7dSd1~am5i9+4`r-8b={wRp(&=>nHM@tONPV2zliHU2 z@#YtYJ{#IUG;>q`rt>%6n0PTUeXwgFJ+O9Q`asQqxBs{OANRl8|8W1!{a5!#`a|(U z@kisgpvpQgUe|ZH@9_-}_5SwaX>Ci}X31acU~BhHIG>oOR@^ zC(gRbIwd{p?pdR=mYsat%y(z*pLySmS7un#mz{Lmw0En6p?57zxj6THQnZ&=E-@U!gDeQ&%rd5?U4OF zl=-8IdBvP!RuLx$miW9~eG2An!JJ}NvE1i()u&+I7R)JT70Z3zralGpwqQ;%t61(6 zC%ZyV!MtKlF{@babGP~w%-e!F#jIk+Itlx`pM^c)8*t{tr&i87WW8oRYdvA@weGd< zv~IC>T3f7*IH#i9T5fe&7h308Vf#-sM!~%DoMKin<6n(jYJhIHdh#VaSHiO;-1yJK z|4~;i-1rx6{0le!b0z+To3w-*|H6&`Y>9v2#=mfrmT==gQ{rE^@h{x?7oPq9l!G_} zS8_;mP!O5|kv>p0@Eo-o>_1_uF4t6Dt`@qS{`2ZzbI?Oh|K#*fPXDmTX^(mOQ1#^m7#d4q9 z)u&+I7R)JT70Z3%EMKH9m{-gxW)(B2@BQ|jXb&1JoIQ;8)v>3mtH-^f{ZuJV(uJQM zo7Zlu-g*FS?;UuWZop|T!&bkw7SGc%oB(sa6|v@9XIXRXX_~TNUU^P2tC#^YMqaz& z_RHNz8irAZJM7AYQHHzd%7jsdJLSrRQHHzW%7jf$Yn-2q{1VJ7<`lDv86dUhwHt1u zwPBP|YmrfFVbt0%`lHq&qt?QxwPBOfx>>ar%-e!F#jIimNUeG8hTCXu7-iI2WYk(1 zwKk0YsI|zbwJ>UJ*yOaHqFM{)ZNZ#kRxtyl*1UGZZL~IwGHNX{YAuXf8%BTBT4dB( z7_~NRa#}a3)`EFkFsGPR%mAr1uibDPtqr4$T8oTY3!~PC(I2%I8MPKhtqq%;){UyQ zVBQwYDP|QjKx)lvH{3>R!ziQHBBR#AsI_7AN3BIht%Xr*!zQP7gK909$7xNXwP02; z1EkixcEfG7HjFZAEi!5?j9ME;f7DuJ)LIy|Hf(ZQ*Q?fod0Q~2m{rUGsWq?Na2u@+ zql{XMj9Lq$)`rm^wH6t*7DlZN>n>}L>Qp41#%EFsGPR%-CgD)u&+I7R)JT6*Hb$Rr{(Qth%%6#;SDH`l@ABk*e8MHI<)M9I_- z+k-a-w*>oxtAkzGgL*FZv39T*_F?R&{WSLEz8Cv?--x}z`?0@x7xpNhi+#==?3I2P z`>j8XJ=^cazVA0;@A!V~Ki`Et?B`-1d zal%O#PDz=IlU6Fb?&{jzbyL@lu2G-WwXy5!uGKidCDXO2YhKr!uIXKMT~6m`oyR(l zbiUj9O6RkkPj)`i`9SBM&O179>Ab;vsB?SgaA!YGi+R3tY3Jh3aOYW_r*<}XhC00+ zzw5|#eAw|;$BP|LcRb#)x8uH!yE|_4KGkt^$Mqdsa5l|D9hY~k=;-J;uVa44+>V(Y z4IRPu%{` z-9Ed0T6;~qzwOhuqiu)V4z%rWd#3G)wuikpwcX!#PuuM{cW1P1TU)ZNukDJqm2F*Z z=eI3rI}@YErnbs9tM#|7xz@w2@3y|y`m}eb^@-L;S|9ZGdDphy-g-;xj@B)$$=3eX z^{uO0SG0DuE^dvq&TE~ElYv&^)SwRUVmqW|OE9lIr+x~UJ`W%?A|)TijC zK1Db6DY~hT)SIRH6y4OP=w^Nu-P8x}GJT3}>Qi)6pQ4-k6y4NE>g-Z|if-ytbW@+A zoAJS2rccpLeTr`CQ*=)Zuli6Mlts5Zm$)_k61U#35_f5MJm(%Qf9~(%E)6g4((vLg z4UZb4EWEfiKiv4lT^e58rQuPxl!X^}X?Ss$>Lc#b@RznAK#`CsB+^M8W7R6ouC3BQ-dC%e)eAP*3l=*a-ZWb z`#Cbkhx$#PS2w<+>aSeJ_{wFBuUy9XP(PgzU%4!=X_U(tU%8C&p?*0bzH%AkE0x)RzAmHc2eV; zO6|J|=54{8VpcH&W!YGr{OPMgrqy$nXj4~-jlnI;MsIx+~ z7R=j%ImN7E21u=W?S|WEZ5UltJHw2g)0?Z8|PjA7W8^XKJga9*XtTQ1X zGij_-3nydKf4Da36*kem4p(E7VflhAS76x!%aEx}8bWO{%nhM78JQbGZDJZ?lVK(e zvB}8FM)LmON-0vzE9Mllik#*Cnc5bd%=7R6L}L@oE6*ur6*E9BlkT+}SGPa%q!0+W);itDr`M*hKd_T+MwlEMJi23M^Y-88W?38ba@rVQvV$Pe$g3P@9;B+$Y0K8gieE zth_dPNNW?pyk9VR;!W`L|$dF_VV)T@S3#(Gs`tXGAxUNwyV zSg(qV^{OzrOFbI1u*tOsW2&`a-Y=L_%qnJp)SB0BxQ*6^QAVvrMy-WWYs2V|T8oTY z3!~PCO-}1k)mkv`7tASU6*E9;&1*N@Mr*?;qt+s$*21W@Vf06>MMkZKQES5{r*&Gj z7R>tvbBbBT43Jv$+6}kS+AzwfwaBQoFlucW{ZVU?QEOq;+OWxKeT`}@nD-0j6tjvM zAhqVT8*ZbuVU$s8kx^@5)Y>rmqt+s$*21W@VUyE(ShW_+`vr4~S;Y*HTJzcsx6#@# z%BZ!-sI@R^Z5aJgYmrfFVbt2N@?K6#wG+(y1#^m7#mUt+NsU1;?-$G|W)(9)+Q(}* z+{Qk`D5HHMqkY0?pJDVz`$R_jgwa03%I({%+6m_Uf;q*kVtKtgq&@}ne!-k#Ryv;yk9VN=JK8TF>K^X6YVdeMXa@9^S?-$G|W);hGVvYI~%=-m% zidn^SpR3iUpuE>4J_Y5yDZIf|x`OP#43eXYdBvP!R{g$GdB0#zF{@ba^K0r;Fz*-4DP|SReJ)j>f_cASPBE)k?z2;U3g-QS zImN7ExlehA=%`;Xub5NJDwg|{HT0u?!MtKlF{?Pa(rRlAf_cASPBE*P0kX96+6}iU zt%gy?(ke2RR$(lyhS48OtH@Ydg|W06Ho3aouUZS{{en5gtYQX8t$FQ++h}bVWz?2M&^c4o0x{! zWSB`qY%;R4n#%XQmLkEt@| zMMkZKQES7>dIP>+sCI&R!yCeud#mDqrGU$1B*>0XDcX(J8G7i75t%NAIMOxs8e zp>3pLZU}87jm!<9Z6wo>HqtPYhP07JHd&i~u@#p8I~`| zas`$xund{nry4$kZkcp*9)jhESV~%nhM7F%7ZFFq4MZWMsT&S`Ydjwo1P2^X`!+QZcWXQ_Lzd zl-8KOpO%HXQ9}vJdtj)i6y+VX2{QtC(?a4Gls7TNr=YxXB0eYawUGBZ_&lnZSIjA9 z6*EAs(cEh{u5OK1V3cW%rZTP3lxdAtVDzUon##0BQ>HaqflaDa^y(K|ih0GHVpcH& zq}IH4!)>%Sj52C1GHNZ1S{p`x)LLZJS{Su9tgIgP>Q`cldBvP!RsA@H78$h`My(B_KWZ&9YAuXf8&-b*WLEyDS1_-b zQ_L!s-#?j)J?a(AE9Mllij%v4GDmyVE0|ZzDP|QjK;{Im-EfY@QKt5(Ozl&DYM;u4(VyCG% zJ7#U1wff|DPk#2~M^4^z@+~JfpX{BPoB7tvr)Tb+dH2klXKtC<8+<%?U+}iz^}(T; zD`uWIbMDNB8OMW{2RnlEgEND{86VGhZN|PC56-wV@JZlc;JLt~fgjJfaYlN^`Wee+ zL;|-4t_utXRs}AcF?&YM^iQWBp1wbDc3@h-?;LdwOy4;@J-v5&_jK<`$4)wQ(*Bcn zo|HbR_oVKVywi?NJ2Y+ow4Kw^(|V_MPg^kcnDgA!-BWi?O;7Ee+TDDt`B3xz=6%h3 zo4cFanin+BZf=;ecgmhAyQl1&lAh8q#oKhO=}^;t=W*u&=dPyRO*@;?O})-8=Q?M| zS=-dz)Yi11X?9bCv)nn~Iop}(gqpmK#~Kec?zca~P7Vj`=Nk7l?rq%DxVv$u{kZ*r zeV4tK`_K2E?Vs7u(BQ2U*p2s@`3FQ}vGO(dv!WS68pb_iSfZFRGqbJ*Rql zbzQX+`Yd!TbOifryb^jg^knFf(1W3SLwAR6_st327}^oq5=#1J`kF$kLo0lt(Be=e zG%qwaG%M5`stGyRk>j^jxvIlH$7gvz^?u^bdDqLcpqN*rB&$4Q@0TalyB6=2;fk-U zKGN&2?H5&krMzz@Z|&x~Uj50jAu1pwZcwSwZFv{@cx-wzEwqHlz9-}kW zE-G zio{-gQ-Qi)6AGpi(DY~go(aroSx~Y$}B>k-PEV(ranbC^(nfk58P$?6y4OP=%zkJ zch-JWzAECgfa_ZOjWYL@_G<+<%l{4HR_*akjdwl9wPjz~Xc;_F#;-)obE6^gY@Fy% zzsx8+AN0pBQBcN;sp7elu;ntQQ7&T| zLK@{Vrco|q8s##kQ7&T|xW6Z)Q7&T|O$XOR#Ro;Z_yukzVWffd(jKn(YUd3 zbz@uOyvFH`PQ$T=cN?B*ZaAx<*|g&I`|9`B@2THizq3AF-;0*J zt$soM?D~d!Z{4xFLv{P>_Mx@jQ@6WrXI&cYba!1_-GaK=bq#gi+GDkcYWJgU-dnq; zc6aSgw937;-L-AC3uX-Drc;HN7?6HElHuYG&6o)Of3p zq21kIy{~$2^&YgiJFC;xz17{-ZPg2^XID2=d(p}s3hfW=3+)Z<3GEK;45dT8q3%#y zXhCRps3GL7I#zY4YCpcU-&?h(YIoI6d~M%b)m_zAwE*ASH&l5mk5wMR7x()r_g3zy z+>LMU)0MrI-IZV9@*L#4Ok7{0sTU$L)ZZ^a&bdB3wFUC~?7jc@N4RLrhusPG1V z8~hmG-|r7T9egbKU~mttXJQa8>@DRSrzbmjia8qDMU^K8Xa5cWoUmj=+EDFpE%n3{n)Zq*L&zxh<5$9d! z73W#!NqndOfV0QB!@0$|!P)K%<7@r3PPenvS?q+Jvz$}$&3?%7V)w3`{h|Gq{UW~H zf85?{-)G-#-)7%zUytwihwNVaa(ji{VV`Hu$5;F_?FKvOKkom;|FQodzU6<;zt8`u z|3Uwc{df9r#TWh8`EeAGf4zT|f0_S6eAj=rf3|;`zsB$Ped;@kulwJ{_x;b~3;!qZ zjsJuA%KvVB=YI?Ob35>@e-dB&ugCZPEAYktV)T*b;j8~y`0l^XSLyS6k9&XTU8g-8 z!MyUEVpdV+mC>W|os73{rDyZ8{pWJ^wAc^o^*vkHwtX+y_v!EdfjM*WKihslf4|-S zpy`E%xmug;d-eAb`v-cx)4pHjyX_ybC#Dv$Cnh#2Q>)0t zE@f&N{fTXqiFNcR_9;^f=}&A_rdHD5&GHU`v;b-$Wn!Z;wUSKiB-3~DwNE6rGK5&G z4EF9JQ%m`)*h(hWDzj)WS_Ri$FujL5QgrQw%tL#{pWI3P)lYjxMtj8{?FDn~1@qHh zFxOu3M|;6sdqqZj!CZTV(OzM+R~YRD)4Qv>xb{Nk+AF`(USYIXex zdxg6u6AoFxu1p(E1X-&VEMytV0@W?WYU;O8e)^ISQ2hBk?=_Uuo}C ze&Q$)-HT7zYQpdA#hX!}tZkL-1%g$t@=>6ybCv&IJ_Qi)6AGmc?A>YtQdPR5nDA4Fr{Jne>X!Mb%uvDL-oB9;p)TijCK5&=m zQ*@V)0*yY!-^)jVMjv@fO7$tasZY^OeTr`C19zD|MR)lq(A>Y`@8zRFqmPv0QhkbU z>Qi)6pQ4-kz+I+K(Oo_YH2M^O&)P2(MtLmv&zHHcw4W=u3+12M%1jT-e~DYme~DZ5 zFLA5>C2q}+g4@lH5_frg&|jXPlHbeY!#8&&zhe%nOh0j##wYI5_{3crpSa88E7uP_ z!3pt|>nFdL$5*Z&X2;6(6L+b8;x5%s+@6OPx+UL_LYT)eG}Z};bC9N@A7<g1a<*eSRkVUYfp?|I+Z{F11IWmy+=Myp*}i)0gsJ9v=61g8$O=rF@sBFYeOt z;x4sEpNEq8qGc$2E5Al4CjI&JTVLvZE&SaTBNogA8GNw^3V;bc$rco|q8m6C7nnt;dX_U*D zM!Ae>l*^cg={uCBQ7&T|Zj8CZ?fv@8XyEY{w z5*gL6cSkA4ZF*JWmY&r*oOSYpLMyl(pqX2_GI^7 zsWu4amFE<*iWzq;dc8YSy3Q`H5wEw4GYjiVW)0Ta#r5L#c5&8VUCG+<`jQ!hb?!Qw zv1Pr@5tnhVv)Mx|*ygUoN$-$(!4a8puXB5l;$~iyzVq6t)(Ymmf;q*kV)>h39qLms z?-k4`W);hQwyRIUyjL)%m{lzI*`_`P^IpN6Vpg%-XRG=Y%zFiMidn^SpBJi6!Ms;6 zr#Sdd__kQ`1<77Z z)&qVh+{?2M9#OgO7v=wV<$t4o9>E*m3#{4jT^U%RlBI#AR>1xb`l2a z`|RI1ey7U$9^Ll8+sEzyz&ShmCRkvlh8_)EDpwpdG`Y9yb>#!~fnM<@I^FAVHE*ID zmM_S11(q$a44J-(t|9bIbi>>b`X;)Oxgk(b9(7}p-ZE2@ezIXE4XIBjXOpfH!6v=J zCc4+*YHTtrUy$VrEL&h1GPOxVs7;2sA=D-#b3>?2Ohark%%p+Vq9B{pJCmL#rSvK0 z6?2MN#SBnNTaSC~#+B3oqfGLiGGUW?XVUXes1@j)koMKin1Ekix zcEfG7HjFZAEi!5?j9ME;f7DuJ)LIy|HmvOJNY6j0c7l23ImN8v4$h6kd5L#;)=7!K(%gEdiT5B;4skICtrR{waKu2L6$49Y=LFS)Fus~HW}uIP@9a*4WTwM4YA2ElZM!2WRtZ?-ywia zdWB7Nufx^YWLUl+%N1C*z%pcNlZH^640A)MO-AO1P@9;B*kqVVLu@j#vOWy<{Fhcl zFt3i8y#I~5j~gr!WvlSv$8lg&kaQv$iDSL7ny z>u^OpTG|cE7i75t%NAIMOmk5~Xf7J&hR|FzGBd_k5guxx>4$kZkcp*9)jhESV~%nhM7F%7ZFFq4MZWMu4z>(|@9 zzm-0=+ZUGiqMNK5D;T&0edUh=%YknPW&mHn|B&T4hj2X%+Ur2s~WNM~Y5 zjPtA`0gU0SUj;BeLkbvsA(r!iZwD~GK`a;#A!NOE1LhC5VFqCca|l;s7GV|U5lTkj z)||kX;qyq~OTdo;QQ(Jxg}_6B2=HKF0q~tb3-CYyV;98#KY(uq&H=s|I2-szU>@+b zzhgwcFZd-Dq8pGulS2q%~;uT5EBV>Pno{ z)`2=iXE&T5AjFZtS-@Wfnt_L%+kqbjW&sZcP6oao_yX`?U^?)fKt1q4pa%GMpb7X^ zU@GuU2j7lCyJ^7J1E&IC3rqpN8aNa9a$qiSf1nZgQs5-ui-B6;3wXPra8hMJ#z!9o zLck9K4Z!yUmB4ob6+pe)fgsomC?EfA{#vsF9{Bl{^LyY&0S9=LJrFOkTu=G4m;Kn z=eNKQoE-3=lLx-5`SOl)6#OmcH^A4Oe+Rzm{0HzA=M&(|&i@9!PCI2qvE&H>W#=Q{e&;ao zCFf({3s%*M<=w(5q|VFu^;eEO!5=!W0Y7kF1s-x<0>1C;2ObQZ0({eX1^9YkHt;3q zMc|9h^T7W;=KqCXk2u!?f8{&}{K)wQ@SyWM;Jbm-fCro#fNwkh3Vhue0lwz^68Ng~ z4De;tjaolgmCn;}zw7)Q_>S{0z_*>J)W?5k)js@s$axI-zVna3gU%Dc_ncdS?>PSe zJm5SDeB1eF;9CwxSID);f%~1Uz?UqCbBoq=sq>t_hwKCA5#S-`X5c~R?|=uKD}Zl1 zj{@Jc8ZoTF zzViU^pmPWCJ?F21?>avN9&qjhzU}-J_?Gimz}KDofv-7xfv-A00>0w>CGchELE!$t z1;7`bp8#K&V9SpoJLud4e8>3^__p)sz&D*A0^e}<0AI)2L!l1h6J#|xcjK22oIe8| za_$1Y?|dJ4Ft7~xn)6-YtInOkmz~>yFFD@;o={^umqL2P`BUIK&Tin_&Mm+LP$@>uE zh|>%Fm9q)>k=8vQI)mVcob|x>oz1|5&UWB?P6GIjlL8)a27qrn{lK@JIPeW84Se0X z3iz5c41CqO2Kb7z0r;|WHE_QZ1HR~N1Wu~;bJoG<5oay%uyZ-^BQ4z@I9Gxna#jN0 zcUA)rI;(*1Io-f_oHf9=ofW{hoF3ro&Sk(?olAhP1Qr8dcD@GO?|dEj68_iVBvYNW z^ZX}g^}Hv!Qr*$QH^bIbPwh6T*=?Nz^v*ABi>&WS4_q;?m{ZIumi5(9M~hFvykbr< zt61(6PBE*P0qV?x zd+o;6omnU_%5-KyWjeEu@zT8I~`|as`$xund{nq#@KM!`u*RlaaY0)F!4OHW_Bp5SxrF<2k)LQhheQ zO_^3*Q|%9Z8af&}96Eq6RGtYv5qdauf9Rgj?V(-xPGwst8R`pN5n37Q3Z0LyRnElM zpG~34kcDqQGx%oZjjHFXo~nAR>Y=K8tM0;=D>qf`s2Z)>Sao&P>Z;}Veq~YBys9}> z)2r&LoXXGe70Z#zcPn41e75q*%10_6z_%=SRNhi~L*@3$;mZEXwfLfCY31U|aOGK* zr&cyshVWg>?<#T?A6C3o@nXf(6_4ZVmisF1uDGq@=8Eepwp0w^8<)!~R#bFUoL4cw zVs6DueCZMl9uIzkZ(R-sUkg4L+!uTlU%UJ`cxUidoH==2FdZBWt`DvXE(>0WlPAv( z&JIos)&%{5PXkAB{^Wtc{=hSVCjt)#?ho99Qz&-@b_TWul7YU!6@isFi}L)yg20)9 zS%IcNWx&FTlo{uc^M>=h^OWa^^X6oas&- z&Zzv%K4u@W-?d+{pS7RFNtF-SdvJ37E%puec6%7-Rj#$W?WOi&J8Yk2pK3Rw40-*( z^XL2@`rq=uh_fpn_wV)J=fB&3oBwA2^*F(D$lvR~+`q!#;XltmALm%k^f&l}zT>`6 zd>{J``rh!p=z9iVGe7Ek$akOb9^W0lTYWeAuJ>*84f_UtSNksat@JJRUFcino9{c* zcdBn1zIF-vEPU&7)O*Bx5T{kX=zYffr1w$pL*Dzm_jvE{-s-){d%bs?ci21Vz1n*@ zPI+9)6SD2;JYCst_J1Pv55CdS6E^(6;n(@z4c>l{d;7T`gm;j;vHET9F5=z7d1}uS zoX_<$a?uZ+!@vH<1X(0QE#8d+s8At?WsID*>2)q zG2X2_YurAG=Rn(2cw)Fc&9_F=U1L|u)vm-|B%eNoGC9!&%>M~?bu~=ReW6Uwej$_dU&!P%6=AW7$&=LP$oNZkjZWwWU}Lkut9_{O!g(AO!g)rll@7^ zWM^P7zYRMKll_A!lRbpVWFKKN*%Jp0rS@on$<8^H$?iF1vV#tptiynzd><_^S*@W= zR&2;*)rL$~HiSKj5QfS62W7GbLMH1VWO7avm>tADH%v~GqD)SdB9l|4$YiH@Fg#sH z3rzNtr%d*gCzE~U$ztg*}T9hRJ@Ml*yi)WU?e-)VQ@JyNP@=PW>J(I~ABbeu( zkh_M-N+e~n8c8NAl4NqC8JLalunSDiJ)=y{J|mO!&&cE?1~7jbS{WwiHBcsJHjv4= z4P>%g445~L(r%dSDMOj;D?=uG%aF+q{b2qi(lAW+@uy7o@+Xu1{K@1za4@?bb{Hn7 zhEpadhm*mzMrG)8YVlUQYO2i zlF81fWU|kwu%{5hFxiciGTD)oOm-zDlf8L`J%MqS6Pb*f$YkV1CZi`Z*}ELf?}Ju`$qwg~ z$u8$)veP-4oX8?<6d??gb6Y5rvs=jI{1&ndT6-{iD)P#(e1YW(EL&h1^a~_J6G9l4 zFR)yJWeZGpn?nfiR+L1;WKTNEWM4Wm*_)0mgFXhBJq2kPmM^eefn^IUgWiaQn1&FB z`J6zn4CvRnVd;UCg)O;$v$mh z-XU0SnC#|8ne6CBCcCCbKiF*5S)=&F6N0}+Yd8LyFu(FWteyN2exbRFIY#cnI5QaMLef@ zPP5MSw0K&qMV^hGjaJk%;u*2d^IVIS)vtJN_S|fJ)pNV&c5AWcPS2gz1)fLHPr1c9 z3t)?NqwlA_pIYC>K2U#a-Gn~=)7H(tXMHbN-|@Zgd*Av~j6RN8x1kSjTi^B9;(Urb z{8Rl?t?&CgasI`f{-roC;|Kn);S`d){8yoV{INfQw)8Ljqv#p@wf`ZUxwRKN804&< z`H$kkt(WaTw!de+hWqBlx|QX--rk1( zeZaC7)}K~?#%cAZ4f>}2zRlbB`@8IIpWd{>f57tk7FpkR^8VlBew|`jXEdJPvQYmo z^et?}|0$>I|I-^!_ch`N-&0@x*LN4b_HP%CUU>Mz?-!px%d=_v@xOY{bCKu#<3C^TIb-_1e$T-1@AvhU+B?;Y0P zIDc$kWK~0B>x=~r^&1Wn8*2}UB^HD`{Tbp{>-+Ie|^`B0|PJKmH9Wz+(yeaZHhuZxwjHakNPTt7 z>f^8MyWYvHx#O;{-?C@U`E%DVjP|a-_X&ciLDXD`-PT>To8Rp z?5CeT1x6#C(`V29!j$G_|7#z-{Ovy+`h&mz*~r6-mt1(m+N+0KuU|i$`rcpObm#J) zEM4;bz5jIkHQ%WVO!>o+?LX|AfAv|BD|=dFk!@FP+PLk^IXBFniG1D!v;NUuWL4tX zmdse#a(eygo++oD;X#%xtnp5%w{N-WCqMa<-yim#etf{Qy8a8*j>qrY=ka|LhT7Y{ z>G@#Vl3Ax;yk^nyKZ7CnTR(GlAi7z`5V4>U`Q#>*(4UGdw^4{l9#v z>-6-z@7{dZj^#f-ujL0n`^DaS9;&uI%dY?Z;V)OzZX4dQ?TfSj=P9Q^-@B}bkyFc1 zy1tC^HG3Xzg30}W=A0yW`eH9KYHG_|WFSmvn&q`mIe+cqQ!W_3IGOs!hMzq3$ae>B zm{Z|&{OGnh%Vtjh+Uy_x@|v^H-}oKRS>ekD!wavz;G4;tc5Zoo@4bJ!V$nDDf3u=; zThJNVm%H}*C%*Aj7`!5&BRS@2Ic>^m{xg5zdGYri@8CXv<>!jq)>#j-v<=W1X zC13x8%kS)q{ov~@S1wxr$4@_Y`S>-Lue~PiIX%^L-q)ATsyOqSo;9iA<-4w4F?`wV zdEXlN`uGJGj9=ch@oT4k=}$-h1hwAWt1e%8*<~wNV>!h4XUNJwLZO=_S$W0+DbMq~ zPzJgzT%b4Ky;Y5>{lW#akd=<(|K=X#)>k&}`r5ru|LnHGZ_TN+JAU-tIm=I;zWPV0 zp&fl+z4EK4eD#`#NB$Z4^^eyre*R~F@$iaszwy$JD&%6&`^6obzx}Q7>Vfcrs~1~7 zkN@}s6?3pW*=U_(bxJ zw4idBbNXyQs)weAX20F^!SNf8ANl_GJ<~kbeek+x+%s#>oyU(Hzv1s5|39p~2S8NE z7BIYX?>5+8*j;*Aw$NpFVOe_bWkISU(nU}ZEB3A^mJl0iG*M#`ku;4-H1(O7-kT=R zlIY7z@)8sCQf%zxKXVrpYsWDIWu$S%xN=wb^Z$ce8sax#aXN3rtK=p z+`cenUwT^4#%EFDf7dMg5x@NEKk&;Jmo2-9Qt`kJ^8Wb?XaUk}-%j4YaGt>3fi~|( zzONib-g`rWp3v#0yxnu(+mm&kM|=#9<-eeeaeVBT@JOU@@MoUCB|6aT$71-inBx6U`1RA?arHTgmEjw@m+h9|Q`?c~38Y42;@8ef zN%Q1hKbSl@F>!Ko62YHdGvem@WPeoak0#XhbWBOLjc?58+1)#D%TH_Z>1z{q?QOP| zx0XAK{-#1VhlK>H6i%o`A0-2(Kxjb*>|f^(bRYvl@Q2YVQ>u7~NkG6|$Ya!>USFTa z{UW`tF8yi<_j9euq`ev(U^crT_~Ggx8xl%6DPee^E{%JV$rGGbZ#M^UzhE*31(-aL zC^i_3enMq<_|^9C6p%B(i{}!xYSKq}e_l!>&YXplSzGnBD^ejknH zqN;b-&|Hd(d#B^ATn=~eEBqK8gZsC#^9SeCE3ZF8JsjOO!GAD;em!DurK5@dWZt~N z@DV(L2GJCR6%K&44zqUPO}91%`+gW+gUd2%Yct>&{O8TO`_kVmVG`lNwbqff1rdCB zNJ>DQy{&-})CDu5yj#+(9`H? zILG3mzlD#WQiwT?fIqlp_a3|J>|1f|uX3kRqzXO)ibvwsT|sTH7|j-;+@SBBnow2mexbb;D>mg-WTb%3*d zL|fkpSDJ^&|A>abi^+=z0L17fphQ&HS!(M6N88^ct1}?-KVm3cJ9y*m(a2IFhI95z>bF|Z6I`~EJi5B+0LJ**8`E{Q3cz6T)pbYKJ16SUb^#vC62>G;w3vTuKclY>yN8gD)a>~&=O`ECi;Pv70*hB2$XDA zKE%T{LM+Wph}>HMv2rU|yFmZj&pO091_Lu7&^a@c$r?8GQ&L?>_YDEWDX|R;9Yo$8&Vvj(wR-4X4w3s} z>3~=w>Z#nci~zvX4V9}1h>Eh9ol=w*85I5sp245}*)IH_PrJH4MXFu9ksGDE>JP*L- zKCuhRQTE_3j~u~Y_0V%I7V|8?;8TD9HkGHR>e{~xv*`x_xxugVx;{gihaN(j&$_xk z!{0yj5dQwNE_@leDZl(uiGQTtgOdJYc~^Sl&1sK6^!Sb)a7v@u@$rrio15t%Xo$fJ zRX$bdpQ|&v9X?ZDzP@qe^_Qm%e^YshA)yHgp&^MBf?N(4v&DjF%VG1I@$nR|xw-VA zfwZ)NhaTU){c$!a<3FV4^ZlOn%P~df(sfGYhJRGTuA$Tt5CYt3%2@(d z0~W_ZfjT3XnWYrZppwggf$I%G7SNFfCuQ*9Qpx3sDFY+W6X~7Enqo?qND*i)q%8xc7%jd%Tz zpZ}r!)!W2v`6rPljMr9OJK%HSav*A&P=wUtXNpvI~L+|r$AinYStzg?N6{?V7&#_h6^AAU?c#USO=4T zGAcq7P#fw(E72yj2R(^i1G(UDK*8n#+C5+DKn|B80k@Jal#I=eu@&=8# zfd}M$=PP&52BHyDia#k+<;37F@7x4;Z`l9m`J8wURUB?^LQp})Z{7_(8p@~|om0)! zgpv86CiKYnMm5qXh@@d|!XGZ}1|~4<03b6KLF*$@BwE=rb7l+Ahn%mR=lNu1WMo}A z59f+fmB^)3_4`8VJ2A(nWWI1ZrXz=|m63IVqlt!=+XFG2tNH>%-afho! z;<`hFitVHoT4vfavPe_7&TOFvNXrbCGHLVxX`aE-tPEt*INue!I=?>$!0`FZoqV}U zK7-~_kL8Qe0jMQ>K9{)O`GI4Z1`u~2>mor1ZhKeaa<`ZN_6dPYIz@vH3>W?R&`XYG zLr9Y{haY~SsnUpDt6atC;4thVbcSAY72l`>NfC&kR(Qf&q;=kUi!{p!QCs!zX$zzqC{L*M`{ zv3^)90>PImL9_8%Fgw2t=h=S?SO#DL@CbQw@F{AZW0ga2i!jN6r56yOIQ4JAg2f#4 zfT0#};(KcNWt<8iM&XR+JL~edU;!lgAJMR&Trd?KTtTWm40cE;jHdn|br}T~?5;4k zj?z0x)5?h2cS{preHzeeJA2l#f=H~Wr!X-vZ1b?A=E-Ic)CJmstNG2;DA1`-2E;g@cH)hC2w#PGR|WtC#f-unhMQsyP7PDOl@3 zsk0&uvD#P}Gn-;Wu|$d|vbq6Odjv*dvxzZcatsK4fwNgTisfanwdjrUftg#&}-RkAlBhy!adZMSnj& zc^)`H&wM5Y2BjyLUZp=4^M;|J~X{F3~FGQ1md zr{jTjS5ejr$57Ulb?dI+V=ugbpTDv$_`YC*`&4-MC%fHowxtEXeqZo?>|iKu@C=lT z-tErl9^A9|0t!9|^*FzH$$5OT{~-S2{E~5izAHihEe8EF4%W&4Q<8I%8^8x9!XY#Tu*t#D7m-3N!=gUOYK+#W<`PxG>Lg2IJm+zg z$M8$PuUYduN;`H8rT+$3_$8c~8Iy_sWvnwE??nCfQ!$w_4q2VC4lVCT`ZEg`oW)=D zAHZLoUAXWp(m%QtUpvv!aRPC-ZbRHRIy&CK*S4+x;mL-ECx2MI>U;A2{c3~N3Yb~( zdjN{+2T+a=?5MwU2NZ!xS$%e+tym_Ewpy(MSuq-nt&Sbb&kHh!xz@Ufl!=}}IvyVA zxr{OZ$&AZAJ%8e3$ByA+fA*l+0Adn=xB#T}uW8e40GsNEQm!9g{51+X(2tDYEP`=y z>c9bf>YK$?oo^%l);`34yR-9ce5G$IzVddbz3C89?g>2+OT!_crx=4Fh8*ZT!Bs{Y zfU0vmXtdjZfwERYnW&++cd@%@g_6$|3U~t93Xwa0GP)r;+9l9v$aQUY3Gp;q6tK&? z3b}$+-Umnt?C>ljE0i?`77WIKQJ|1j$C|}j!`cZ-!{e-{Sw~n$89sIb6a>Ott%~Sj z)4f`u0z0K1dJlMtis)`C6_3kRSPeV_90>eOW^M5UFKIA-?u zpEhnX(hp~rWzLfNayTOCyti{*eI;VPp!nRix46$ogwe6WjX&czo_`*{@$*JuENmyg zwhy^7Z0^rKhEFiOWA(*nfZ<&PhUffFZB0sQO-*e}Ol(U{t*Ro2hn@0*(j0my4V9IY zP?rAw^MKBufDSI&1@@$Y`eORg&rv<1*00AH@BVzSs<{43%b{5kKNlCCxOHy?*IOo) zAPKzj2E2)3pq#fK19*cq02w#&BvP3-H)3zAnCIf+Cz*BVrO0r4{~IXl=cP-3#z)^6 z93LKu{HDK!T({k<#5VlrTZGv;ncOhb`y{C~1wE8Ps*!?g;oCkg8Sbm9;4XPwH#(1f zc0$3_DJa<1?+CP`ZoukKzzSX3Ji@Ht0iLv6SUB1W%Qkm_Ss|J@e)NWLip+B0z6J6k z?jJP}A`sL6W?#6)nBad;Q^h@v3-q?}kF}{HVrPw4mVR;OwG`KF+r!-RpWcc~|5rmp z;7yYPTRzfK@jsgvT(e(Al9vKQJOXN`C%9=N+S55hLJ7}1q8a>CWtV<>)37>!POuh5>GpE05fhB;$$Z^C;tI~ffVs}$^(f}l`SV$RSJHr!h06Q zp}8n;GP1)DWYCLVz^`%eJ1?Tk2k|@j`m3$2uObeLK6nsCBM!O4*YP_~Q4P_PD!d2R z(bIj(>mwao=u3ld(6QHqZO2LG#~ve@kGHiQCz&66i~u^`#^OUz?hbA=eHIKtq^EAm zvn;2V>89Js3Ru&i!l`dj6L>@Eq)$2UoIMA{+Vb;l_zgJ6hK4p#w8PP8FqsS}mYffV zhW<#BP-kc;-pE|-$g`n%TV9?Gzi!L(qu97Ubfrm$;`Nb{di=W1B!Z;xL-F?%`~FaH zW#2^k4jp)_w~Rf9ATx}T69xPRAc97f8aA@L5&cKBiQ9<8g&Ij}*T+F@gzy$pV^oK~ zgEOpH4SAd#9}R)I>1iqf6^E#mzx?$G-v&RPHsm84n&gHYf+R#{q{EP!#>t7w%Zs}9 zTvUF6Md9P4;N&R1yp-eeESzvlUT)O2Pb_(MZ#gGi;pL^c_KCuaB^*%#p#$O=aOyR2 zjE^;oc;;>?bws}-=yzhmABhD?BQ&9aWB8hUkHYTx%*-zSn9< z0`*m9=3kkag9dWLK9!ky-AJxRRmR9UeeJ)Q7=AqP`mdSTZDiG`eVK#5z~ey9X~)l* z*DrBSMz;B3)biRRW8rI*tBM7uq4@T-L4;sj5v)|1wgbANFH&1W85 zNhr2MDxahdUh&kj_#;ZVWn|q}+E7d0IQ`2B{$oS6A~5Nj`YTAO70Qb*PEUr>euzF(DY?*9HF9MTT4J z#v%@NaW>w~;h?%uoa*X|R!M$!VGGefb{WNcYWcSVb#(*ZE+77${^qu_vTbipANs}v zK>_GkwW~45fGWOo&q?CvpeMs@0*~L&EVV~i0Inz&lvwcopWU+)TncbeK$KMZD_&)( zL5qBTWm7KbNLDc=;Qd;G>V;Hp40?(Kv&DTL7ipS@a|#QPi1%j^-YnwNbru}QLnwPB zE(9n02xJ(fz+=DSubD0nbJ;LxClOzrflH!!$jKRsG*l?%xQk4mfQYRt4u2m zefpQxOD_!6@%ZK4MGgC#gn3`gnf7|JR4FW4T2QsY?jkMQdZKgIM?3Y?HrUI1D=T}; zJN8x8?{91yA9=8OUGv&?>mt(DBbI*Cp381o6t?pCu3rgp7`q6}OLd|03h(~X%Alx6P9MbtjzhZdYV z1wlQ2`w*48E3<58R_dAF-ZSS5y3$jkBa(gmzwYTQZ>ot73AJcc(d{qWvHxD=hTQh{ z>^F5JDE8q&eE8*;@nJl;SD7#^a({E@yQ@vB-|e(F9GWxdPy=eTQ*nibCbK+H_7Y0} zy}SE&{NhWpK)KmeSlHCkGAN9joSs`6AE)y|O8idK;`s3e*S^$8TEeuN`htn*C920U zixNKi=xnuS50bs#+4(;HWsgR^<8d?|MYOi!kMaJ;A3(84)!2ytgWq_7Zu{&rmh^^~ zISM?>rHqfM3wCSR0Q(F)2|lI|VF!`#SiiCUA{>T^>$8%!wwjrEFK2MvFjYDu=L}}X zB0x@J3K^U|0}f(m2e}dF^KfTzK`*>v{hBWpMZ@Zg&_#3(WJ z#EmgZfJK4`jKi5}zd*RQl35SD(ma~+UXOS_vbd4x5k@}@gQHyb?GyD&XS9{&EUBJe zlD~G>mTP@|*S73hTTnc`dPz=M+l;04PyEX<G|!i_Lfkmj>;5rjnHfs zE0yB5bhMPIhEm~mKZ7?wf0U^RfPaRm8Pv|vt~I&4o3vjCXfy%js1Ax0@myVbqR1dz znxEcAV42NAja(r^MZ=j;LWt4R51|5yMja@}Cq!0X4PG={+{xkMP|0vHy~72wTv0SW z%l|Lzui*hPy3r$|BT8Y15oShYh{Os(IwXElO~{B`6S^Zk%a8-`2!>lYjS)%}Lx)zY zn#YA;6*aM_LcofeX1<+9H`;5$;q1)p%pCd?+hBNCf^ByH!8uf$&9OP>a825j%6mLawF^;|%YHkdE(?&gN^NK+No8#ALn~h3}vDxt1jO?t# z6DB^BLw`yj4-{{<&7MO|A&@h!rc6yuo05_;B`tMoihV*_dUbVr+Jrf3nOyXJ>~~`S zSQKkf+NilU$Le_Mp(w}05K$IO{SX^%a}>qI+F-Az6kxDq*BLFC!85=D*}&>#t%SWC zjAT>Ea7$A(5QOVR0=*D;`WmYE0 z4O-Y5O&pm#9taMj?ugIR044x<$R$s~S2`juO=3exi2#i$!A%LasL^jQsty3wH=*@GZkC_U484Y?swSy(O@uP$1ZjySEEmi;4p+2H`3fP6PeHHi?W9)7}q= zl$4OhpWg??aVVcv-V}gAahoM_O2YBz1+W5|(<4?;GPdVR=I;7;hhBIBWuiAB7Qr38 zfij;sb~w_erM%)z_pjRnvrjp`4FBc$<2~zpO$lBIf`lGG-eZl%Qg5#cy{?jD#OL?~wbW zaWPUCd1k3&kts+xu>?0)7ofdLJUt{lJOnN9#*+%Fsmq?_VmFU6iRvxS3bE3oT%>+W zAu1QiWN=cTUauOlQe7)nJ1+QEx_FAH2({YrvB=Y<(ifG&Z)%IBQgOLZi9_@WF5bb^ zYFmhaFR!X;B&9djRLS|mV4GuZu(wNs9*IotrXXI#da?~io{Qrl|707dvtL(hgasxYb|)}*X=nu+kbtmpq1xZ#^a#BGAM+o z3~FAHz(XUU=mJEE)gB^|hZ?5V0-BO&JOm>gx*D(x#}KiS3=!wdrB*QBA!4IP+*^$( zw<cAH_Gb9zsL)m4F-GcFx!h!rFgmW#zpFiR zVTqLZOkSRkSz`=$6i`zgn>djp zk_KP;--S<9=6o?G(il#uKKsnEDBP$q`{d;@2_tXd2c&DjiS`bo8Kl9qRR`M@&IfAS+4;`vrcj2iDD2xk;I5NHP*YdL-PN32b9DD8k#x%+E$##w=|i z+?@DB6sBmog3Hzh1RCUW6*DW48IW*$k{?0v8_B8|S_%}!B!i9u?hZCFe3N@I8_I$S zYB)`$gfyB+AncFuv-tJZKlCOqyRdHjgYQl2eD}fe+y7WAcnrz+;n(nUFW^@$t=f6W zZ`-QH=aB!teaQdZ;#J%H4)0iX3BQ8J2-IAEgSSYAXdhqc)g!+y6BOf9;KDjpEL{3u z>TQukpbnI{C6mYFT7 z;yQ{-Yn|PiX40aGJ?kc>T03CL_0^17CE|QuV$~RJlF7@2uB>?7qS~!q_`7~I5lLb* zGGg(scu&8VOehqnO+IpoSdkG!ebVY{4af?|%Npst%=Gxi+3nMoQwd?~YttsAnZir~ z3ccr|#;mGneV{qSJ;5k&b4|#PG=!!`1!arae2yi@7FS>kD{uog7z$)E2xJlu5waVI z48uqpjIiNU0~yr?dQyEu`cvPK0eM3`Ow?)8&k#gQ=!WPy;J;8KA_o{4(qY6G0}utH zS8|=2DCt}^k4QJnQXPieh!6nT2)O`h@tUt34~>mbdnTr2P5F1z)-z za7jz#1dDD_?)a|k?3qb3YR`34F9-|B$oi@J{l=`EvBoiZX`z)zD=)|78a;!;((|`= z@9r$BD_vFC5wpg`*)d1B@L>5@ImvS#TFCBaqQ`M5L(*}k&b<`}}-@(P~9 zezt`8Ypp3^c^wTqwj`}R`_S@Z4Ugit9G18&S9dzgl#~K{^(0Zx z<_c;G4aqrho(Ax>O_txPsonTNloS{?Q(8Xd|CqEjpN}Z z4f6CD&n~p5#Mlz;9hH@xcmQogkA*^z=@ZE7w>|rP(_`bKDde4>6OowUM$xr(DdS>1 zYL2WpiZ5-UuGowaixifh^+0k8PI0ZeU!UYN7X?RFr#{%QSgyz^_j0!-&z*!F-0Ov9 ztz$2p%1$pUJ86y-5Rz)VeC?PF9!BKSreLt?VvkK;440=E?bWJ4e#MlHer6e4t zm-QO!67oh6EX&xX0zj?>{^jJ2WZVqfqsm^+j z#1x`%fHJLw5exxkYCe?86w7cEXbdio-Ct&AbJfi&tD81mJvPZGjI~<> zo3h}MxhyUs!cmu2;hHSB@$rvx)l2o!G0DkcvasFwmnWXU zKktIe?!PB7)zJE_7Rn^g?vUz`(PWIj$9{iNzws zS1LEguJ`eCMe^9NAkNs#s04m~p7-|nEpl@Te_RdH8kcFc{r%2k8O1A4O06wVO0IuA z%4cj+(paA;k*li+uhA%#nh>qPYKSh<>$4I9{pZa;h(tSg;@=L=pXVQ#kfqlbMH{RF zZ3uh93Z;^dM8%1z&_xwB1`sq)LEx4FT=`oD}x; zzB3jRy6)kDIVKAoy&BP{^Dx)DHg-|^7y^7u`rr!$RP_m_h^C9n6|*Vd(=%jdyA&QfJ^CVCi9IcEeD76EGYQ7}O+8hA=c9}(wf}$Dj1Ki8GUXtKN zxDSD@f&jm}^a);DIgJ<39hdV3d)dQoG8Y#&KA-RI>*>Se^W9urq^gIPvDCpdps|W*NN-= zs-{k<@-3*UqPIj9%!1eAWGWGx!x<}gYu;Jz=`DycCEDgaWKAsbynByRhjcq@sQd-K z*eun*x+bM%>2^$Xu&@gV(`kTm&fVbf0Qw?hd}uv3f+#<$*1*%MM}8)B0c)Kzdye3m8`5+`i286 zoNF%el8I`QTWxdWGr!+=-|x>fHrKkD)HO@HzQE@neH5SnqKgWcFyZjBXP#L$f{C$V z;{XN3G(@seKx_v*kyD|ftTHea1HZaMh#5pZ`+!Pyn@xlL)8cQ+(X-es(+-h?tL*66 zvTq*SjTE2Ep8YZYY4+xVgr4y?BMmYT}%IQq+)xnDX`N7_6_)J_6k`UqJ6JPx+l zznx|nJAza20Zx3|s`6+O#(id&?F?ztJ)61Rk6-{iA&~Ju8&*4fC3J zG@DB{rYOHYdIRty z@DBh6GA@L@K^Dg8G%~h=qm-%JKPt-;`3i+dl$Te|Yn7?hvQ}9I8pdzMQ;d$l!SJCb4&F zq-|VMh*0P!$}9b7nno&9cYIiuC-fHz39{Tag6wb}e_>vk6WM7WmF9{3hVw`@RHwBf zqOhZ*FrvbGBKzsO)F@oW%}x4OkPCi=;Q6nl+~XIbQtO^Z^{G+kbDo~~l+gtxb8?f< zpHBuvUv)VJh@Ov1z5eE?5k%bW!$OXZ*@@yVA`UVzHW}zrr$^jrj&qKwJ5IeL#vDg^ z3S^G+d-i}rIQNuuSBky(JYMa{&x}0yMQ7*d1Cg1*TV7~rcwx&}b8fB~4ixq#sz&@R zTksY9@SAVqhw&8{KYUb88HRG;0VljuWS5IQdkDN!&T`OIW95q6+?5r^yy+>)(<#rY zgv83q#DuErmlzOl-VT~A9nQlNjc5{YhGE8mU{eJqu{Kb#7lTo(_in-ss3{=C@VIIs z*DzPs8&@}7tRT`1OCxuYSq5SaYtx3VSuCr1~QOX?$XGEy((9$K&=*71r=&R zF}W%hblylqJ3^W_Nz>~NZG202cT0S6LjyW_dmAxrhi65n9$P+p7kv}LouJ~H zo1jvncgw39fbueZ=%eweGXVShqZBv%X5Q$ zqGX^U6aG)+N5bG#><2Di-t~LWq$8KQ*Zgv1QqOO@FJJDO^>SzDD>G-l0%tHmNG=Wf zyo8hwuDSGVOUtvD);x%RddX+-68@F`dd5Fy&3tvnj8|vQ`UhFtrGR1R2KE9c5+fG0 zKvXY?I%MS$nTlYcIYf1jLWBN^M8;2_{tn`8?fhgMx`Yo>zh1(!jO@<0@YQXr&n#bl zX7x%Ej)@1z3X`o{5cjR=sYw)d$ss{ij=v_Ho(U?%+ntwIoLjx>^zs#_SFSoYI&2gC z9e0h-G!I2TnHj#oqn#!tF3;>V32>D6h|@gZK3P3^T=@)k7hQ4R__YIGMx)oj+Ht)V zbQgPO*|=5}9=KP;Ci;}xzJBF`stMbwj=YBdjXYjEQnhVD)q<6Iz}e&Xtjxit#~KsoPk)$$9;mglGWR&E$Oc0;A_wC63!7nZL&yJA!Y zZLo{oT{{R3@omtc46<8lC4<>o2Qw_p?p7H?*!QfVqcCvyCo^VzvOCaj>=`$%$7sLh z9<4M@wpu5fnDgJ%^bLQrkB`~EQWvX$Uw5+UD*Y@zJ{G@9olWUrDPnaisjql|oEw`wl2c=1&1;Q>u}sY-2i3hrcNgRPBNwMa4%|G4*V zmDjUpWoFI-6LChyEVS|@$~e+IFuCPmGwiw5H2q~qMM(<^x(fG+ox}I|)MqF03y_WO z$(jXkWo6IK$bbcp_aY7YDJX;Fo|z5hInH&R+Aw*b8A`IRsaGotO3NE3q62VS+})re zw@o!&CpSWl_lCifmq(F}frQ81ZCr!iHL3}Swb(!!&S~wt*`7+bn;a47h_p0lsF;6V6*%TwM2TB-EZzJ3)2m=!*851lhW&y=iG1mu~3VmRmp$E^qNe zNd-%7ew`3Tm!F=Hw&vdLg0fnz+QMK-;8PwPp4*l=h%HRal!v+YH)+3Q4^Tj|DM$z{Ehwk^?0-| ztK8X1msM`uLhsEQT<-4|TnwQn7RapJ97j)UPvh33)DJ$Z9vt-47 z9q8x$Bz|yFeD=7Rf73%z^V^m7_2Vm67fyU`RmCAxz3!2OSU;<#wram)8?~#duC59{ z-2Gu}eu;;y(mx0l$QM75)o3qo9n~!3Kp($rvmg@LMJ6t_iV5<9Yqes?qeq+}q#1w{ zLxbINN2?(KjCoJ-{|@4wO$*WAAq`?FU+mHlYPW|rx`_BP@%pKod=i6$64i~a0v=D` zI^HWOG$hGuyo-Pjca5r~ppXQg&F$+XGQP;AG1UJ54&rb6>U_f)KcVtWL&F)R&<}rP zMwZ0r2+J8ak;v`6#OUb6_mpCh+Zj`2bRvGwjK(l|sm}k4mqrXo1%wBZp1p0)M-(l$ z`m5w1jevE8a7vhUDW1QcV#H7wp+No|?K!*@e+~MyCz}4rIkW`%f&Tk1yusnNWScAc zM6h*9=H&UVC<1@%I)8HJlC1(9?z)Xh!ylsvNW%jUBQ08X_CwTxJoY?{&)`L8Kg7NG z-+R!$Dij0@HBVO6=Kis>>w!OVYOC=&~(?FtTK0^s&+MpT|91MCcV>D91#&-Y# z2zZE;htn1RQ~C`sw2I&{1P35QdvT8O>{?^RLJ3Y%S=sClN)5-9F9<$)=}s$ z;Ol+;*_4mWlp$nG@qi{gxj4d5=;3Kh>@`^O1*L~3smpApEJ@|!h8OO0rD0 zGWDcGrGk8mp*PX!=}~BiC{7O7EJF&JREfBOUVOe-;>Gtfd>$3);w_TUf{@_g5CJU_ zdAmeLp=has;~|rXIAWPh%n?as9vr!hS_=}dmsBF)DdakyKqB?xsNGN>C&W9zRp=v^ zaYPwWQXdvV(;@cbS?Kk6($|cL$GA?0^dutkSz-4{9~w5RB2qIjAiaUnl${A$n(d_> zQU*{*yd%oE_&FZDfo|NhCo01yf z69~u-2dX5GMAquWYDhX&kCses%KL;S{s?LLw3w)>=rKk-U^ZIP$EY+36Y~=@x;|dH z=F3HV*Q~C%jpvsyKff`qE6bI?=*u-LKkmv%%%7N`QH@Er7|pPk_%mP#m){%^oO6$CN2k>{e`?MobE;n0{Yn@zfG2=hc9H}fWwr6{@R2Cc8 zvmN!{cxtxbKf(I`@aZKpzsgL>3Euhj+__)x49-c({A%Ws(+`iQUMW};U-i_p6VJYo zzc#+|=_9pgU*Hxz5#9OTYjsQh*`EJobm#lW>z01i&b>V!Y?u5bw98y*7avvvY%EyE zT1bMYTqrYarATT8tIA*>NS%VICjz^J)=dXANR$I$sIU=*4&rZ|ij)}^_d=++4$>8B zSZ-zjBRd&n5QG{BKMC{yHGk}nt{CHn9ZkwcqWZPDs>Aqe#LC8Bp@GxBf&TbU-}sW0^6S4B%?kfeE>?Sm_3J3V7XsHW z4b)D^L~V{=T&PM%RY35gM`QNlaQ-)?YPneS8oOg(v`we^H7b5{AwH0R-$7-aKg&5qb5i49@9Q1Ex@=+DK`Z;bN}H3#D&PR6vz*PjAk9eM=q z-*2i;GU!muKAfPXIG6CUs02e@B%T)@DSvH2c?~+CH);IRO@*~duxUu5{a?u)V=`J$ zfgLOUld>rX=_l*ZOI3MG?l(rMr8-YM6Tk8k-&c$3G=ZU?YVa1^$Nuk^XkB)iTdXys zJ;CvxxcCWQmsQr_7q_6(p?D#BU*EkvBvcxqD$B+f=A@3;VMoLYf~lObzue#^&;ejZ zvNCoRhGdBhc2i3xJ1k=x)5jl}-g%&A<~#G|y*s0JS53{X+8J*z znE&?7iJ+(Mrr#gm5Bp+|&*)4`>%6w}roRC_kTEkeYeq&__o}YO?)&cRuH9Q#zo)jl zx3{}?Pkr6q+QzO`-CeMqcIM0shjf%H;O1V<5?H-Z0V@|6EED!WC?N!!`q!> z)nJ7+j6i;{wm{G0kZ2u)4n$9oJb^TccnWJAd1{7}!JH3pU?daO7#wLM_LaJRzUcmh z8HE$dHk4XsM3@$TfzHIIczE>q(viV|k+hy|3B^x7t&PF;3XPxV$KIwut^1yyA2&?u zteRE6zO)c6a@zT;M*B;VyD4IZrF292IQxvm`wNzxT-=wozcQ*VijP+WMTcq8H=$9K z{B2`!tpBe<%`p!{phdN@82_%G*jZS*zI=8SeXcSgv8pODp%Q+db{!1m2N(wJ37Z{d zvBopIgzj|iDgzQXG>vmDj8iZt*JP6+P)Fd*v;}D$at$p3aSJ4ZlDq?r18gKnyWW=7_Vvaqc*`NpCWT!o@JB8;`q&)q4%ML-rk$MgA6{7-@Lpw`9$$( zxr-)2X7EsXxXNb8Jn5Nub2RE;dqw0%1-DvzWFTkie#d>#;)Zy8tDp-9m}s? zn;#J_=BKWxPd#)vqx>&c(&~i~dvxP12dul&BMf*zTOXbft7p%SzrI1_>7}TZsoDL} z*DKBRathqb>$PmpsLfHid1gvz2DI~XEso!# z>;!LP5Mb`*_}wcg1Td#O*>2uqttw6i3kd}7vJRPx<4rU*8gG8Qv^;%YNUu!p%@4Dh zMKX7}w8u9l#AVz+gq7W68-M?Aoi5fc7pK4b{j~grr6S=0u{Bfo!k9|k(*c{N7sdeR zh=Y0fBGAu7)+?-c;TMmYDG~+~a0uvMX0C^xAw0wfVl`nzLGQwYB54eZ<)!@e>U48Q>8-Qv^|C7Zuuq>IGQVj;$IkghynoK1$WFp@% zXqnYD02iQ<`GOg;Dm5gi8168P28{B52y@+cqF1E(l?J>S#VZLzS zff=WF^7z!mXYw1Tx~C>-4AoI?T5)Jzm`FrT^K>+F!*vAx33>PaT`ZP~X zM6@O?MmwqAn{wg(g0FD(&Kg*Ym*9)%r@USpkQ z{Rm=*KSb$9!_HG0ziQq z0`(Fycg`Q=j?m(Wy8wL>#p9B3!;mzO2MiOS^I$omL1%ReSP*7F)E5{km>jgm{1(-nhzhSI7G`pFbG=>?L}e}K)SLzKZvYeq~DKWm-GdRuWh~lWDMJ0hZGM9 zXVzbRG`@JO#b}|!g;GC1pAeBd%}Iwa2H!wcxR}EM%dl<>jRn z{BQ>UCfug?u(_~Z+&DZl+M^9f=&NsB9^o;@2L^3vdr{G(3{UqEok-xB+E`T7UK}Wa zsD`jbO--9@GAau9#h?~s3-;g%`7RtmC~Syp;c-NK9#<6Q@een>fG6T}*{&wl6k{}- zo6e!#MIki{bs|Wt=Ggseek)esL3&R z@QV;Sn0gd%i$RmGzY@$@71C^jhPxsT*?Rr)81~q@nW8=Tm-?%}mz2gD%``imLkR?; z5Px59&rmifR3H2DgXKIapD$GU$9W3I$X(<-fxz&RpO<&6N&=A_fcCdul4v>K)5TRB z`nE^JvZj{J@epSnqVY;=E-r2_F=zvP$E1pd5?#sE!or4BFQG^viRqo(vM@yS1!}S3 zzO$YNfq*Y_QA7xgvT(7hi%`Os#z^+L_$!5co{Xmm;$H$?jUDRg?du;R5(p?xI-52d zV@peBkly=UBvHkBd-+9-@eR-#O4^Hyo722BA%H~u=9Z?Fp&qHCkOh+`Z;lcRMMBTi zhN8muVx3eVrfuk#dL-K;npuYhR`mPU5b>2hEOlH$O(A$EWuk+F2fuK9hbG73Esun7 zRt2-zln5phPnb-`fv(jIYj()8E|9#K!3C-XGwtib!I@1I0cM!MR!+>wBeMrA%OtxI zGm--+S!RDf7>8Q2lL|0@*vNv6N*!cjZa8FR7mQKz4mil1K!_aT8?&bgpE|y8(@J!z zJT+j#c%0Do)T9@WQ}J!%O53p*{{z2%WPS0pxab&9Pd&Rjxg#L&%^f~usSKZ1V!yxhePd-AN>4$DM?QAr0neGCj4GVf;h;trefk`cW;?W;Tk0} zO{!{Z2`~hD-?w@8HhqFFT%*>DMB(vX*B368yQwrnt5-+M>?w#2@$?gfsOI!?|GJ8J zlrMlyYR<`SZqCkWhIqJ_L6~cW_Hze~H5S4<=E7p#Ue<%GXJA?W`>Y>W7g<+fO{WJ6 z0Vb5jtokDr2et+?Cd{*H8dwTxCNBJV5!mfi5cGSO3_}hzU@ailMFWc^ER^t^5lgCo z_W`>C_5!k$p4D_X?7E`Z=96?h*ib7KvklQjZQbTU{%7Eleq9}cK1U`QCPnk@B(L`Z`qC?mtk z9+##=^2bEy`jqWmv0`tTPi}NXeh5W#^TIlKG!>CiQ#$U8!FandqrNUPqrN^vYq4kp z&1RaH5@Yv}NIdK@jyG3Mtn*6Mg*GKgz0*6roHY0?DT>`!$TXF;(C({Z+RGOgX%$?)kWf-9d6Va#PX|%dnh1_7*45TVn)2R-X zhL2`u^;K4G&qOo%8l@KxKl{+J0HMfs8h^XJ5C7}5O(YCB_7HxS=S6*9{YIYFP%2{l5ZgGSG!Pbk8?n z5vUc6dO9V)d>O+(MiIPfcSJRMLFt%Fc2E4XT5->E1F1|PWbuojCCU~yFS1-Ef8NBJgFrX zg&x`^{)@Z22J74Q1dLMPa@l zZgI4<`+e>|b+TjghrVHA{1VDgq`kk{Q9rY%U~yjF;(|hQE-arjr@U;=oU+;fm^t$w zvu7QjIrI3eHRo5YI=_aTzk%XQT|DI{q5O>G0MrnWnSfjePx`CKuP?d&ZS`10UMxu**ru%k5hln*vL+FSfT^^0!}|7-IH>24?;zv!0!!REihTjTvc^`F$? z*!)4V2Wq;32tjI2nG>CJfW!@iGKXrdG znd-y!P52Vb2V!pt#GLpfZFdh{gMS8*bfO)1~`)#rjf^;1T1k&DMs*$A`f2CP&2cP6|+ks-%9@^M&<71vf0;56}p> z2KXRNm{J+qCGnH0Lev3C-h9!|kqu)E%~or(VN5-GI-nqkD;Kq9PuGeIN82N*Qk&W* zYD1B4azN4ylP5mEYJt?K(HNx*Rw27KJHSQZDuE3s+);$mpn#7;CwB{)Vc%#8P}#gJ zvl4xivA4h-cBqiJDqI4xal*bnvBVS>6rFLfy87`rCBRmNwT`a>I_8huWH ztA|wJA$E0hq~QQOcIWssX(N8VN#kOfwai#-HV57&U4N$y7J!qux6 zN{x6sWKW!B@v^A`EE~c4l?)2Y_rL>}v(ABVecd@*4^50}pk8umWgKrr&mW#GLG5MK zc|zgNWTJRDXI(M^7}9ssMh$ID;M|~14GGK>hR=}!;Dk@)cDQmHt6(THg@Vw^1p}&c zh(g{dHM6am!ReGD3C=4ugNMOPtlG@jgJklal}UiX0*JxA!FdJ493T=O3`u6T0s*_X zQ^BGNOXj9EJl;OxssE3&_W+El*#5^ecYBiEY%fVR$?j(Rrf*4h(|gaR_ew&55L)Oc z9Rv~)MXDfOsykM(!%nLe=TYptca;}u>+YwO8$c8rXf|KtRp+UM4`}ATPC*$1q!vd zR&^~g$ArddVq=PG%ZyplNI`IQPT$gL8cmMdldaKATiTaX9W02HW*JNCieh3laiKBh zC0$jwYK4J8?Y_&gnVGSSy10ytxRE1_Ix+YzjvRqcWXZj?cGmIk$})AuVB_TXFHM_v z>HW#j9(7q|_wiY^x8`y+#fE~qilX4offe1VWTO>P39VUe>nnGyT(-C4_EnYjr%pFF zpFUMzx$5?gy~|eas$Ace)tW#dt1(&Cy<(s%I1l@-Vew$CiG;{ zM{3Zdj!NliRuCW|VS*8$B=ks82Y9xp^!KMQ3RLaIBm01x)9VwHMwYN2GslZYPHR&= zx{=eO1jZ_9IF-)IbT~6u=?Jvm9YqOt_O5|}tDW|Qq7I}_g2&*|q_^Wtx+wPU{DP}p zTCFi2eW{XAzVr%jnvWq-fqBV0u)0Vzvj_k#AC=F#kcLdcQAIC_mk94c6upoFQxQJk z29EylLE&(dI2>*C9gK{LWO+ntf!V6Ug_I)77BQ@eG>VuP!LHgj9eoMFyw|>BAO`go zmND7*7({5Y#!?&2ktQY6EfD6KeTk+hqiXn{VX_{k8DM+Em<-17rxbJKUmO;+b4)q! zq)qM|#N?h9QUFT>Yz^4jYh*fw3z!-IPJ(pA0^R`(ISc`tw#Ju@8SjqqG0f8+eKhlU zkJUVD$Kve|pQHj_KDB@G-kF};ii_8{(ZQD~(5yF_tvx4Zee_Xd^_r@xHPuyXtE#|G z^1{gva)Y+JtNkyjw+qq~>iJHu?Tn9-q=IN%jr=U!Jd`-L^K4^LiTaI4l< zk3PSyYMi;2B)|Y71nBj@FzNy4FsB&Y1xeSl0Syr*$6vU9uw?K2;RyWBIG^2-Op%OI zoJ_X_R(OI&klmtEokdXpnD?eqJ|KBg0eiXTFjb1H^h ztY^uN?jIphz@bD!g2(7tAV-2IIt+;m?m>L46D8^4 z53yu=`fuUqOz?~v`N_8ki_oXkGmLngb?uY?GD^OL^tJK0^4ce?Y_E5i<@HkM0F>_~ z-{<6$)rvj7hkZ`~2<92a*>}G~Ip2*aeLj4Onn=w@@2hNUc44!3X*lJuMI;rDU5;aO6l%fIO9LJ2oY zZ?n)GviZ}^04;)a*1g`$iTV10!LU$X5#MaOr9+$Do|?Y4qhoD)YFoCp{Z@lTP{a!j z9~{sZ^k$Xqnz{SyvXFvLci#I+K}hL0yLbI^z!+h;=c{eozT9qzFz)+h*S=r(7$OW? zzuK|m%dPrI!=9h_uYB4W8+UlloWpUk&Zk#?^jUGaF@05L#;OcsdGV(oPdU^TA8+(5 zOio^qYD|dlIt(Y)+RKs}7_V4e;#`s4WU`BL#V&}C;*#Wu zKp|`wDm6Sj9m1f?(!;|~7M0l2l)+N?FIbsoD=sdPYNdj(kYKSyEC~(?=fmx| zgNr0UPw#9QFyOUdyEluLooo--A8-mHTR!)<^vjsefN@j+{F8!Zh=xG}RmgS5iIx!i zK^#G=L4g^P5yl(-kzMdF2n5LhlSDy(Ly5$>kW3du)YtSJfZD(e1|-*H_9z%cdktAe z=|5yNN)!sBDWd1z-_y<8if5R)YMmx1X5~7EPz7Kb=a%E27KP12oLfd(1B2NdFNYl* zh{BBMc5sN^4A6RU!AV(7M;M&v1^8=D+GKFTRn5-oG4^a)OAvP*S77RV9&0dDUpE+312Se zB%3KVi<9EpR$gEJ_iN{!p3l6*j4}ukZlBOINrK-K*&L=wu!SSMG3CzN z-cVR{f!@Gqn*wv2kL)QAFD%zJe0z%~uRM{XVpN16XGl5~l9?-Ih}EjX0KvEohJ-<{ zhZ(sDNYG9QvGOz=s6Pq#(T|Gz=M4pB7yxQee!2i>0b1{^kdwFpa5tu2RFLyC;Tkxj zX^L?vG%?&J~Xg_UaG8IG}=>WP%*aHqU_HQTj{oKIh^~)!|-<&eJ#b}A0GB0z=uQTr6 z>I&k-v`7@fkdX9zL9hf+zZ%2lskN%wB0-2q&I_y=`G;5HG`5FPE`j{@81z3 zjZ{o4lSqY1L5J_ENUm&PAm}~?VhRR=o)m|hrzUcx!3uehCv@@OO#f|iSzwHMhAcG3 z8_kwoBxa`~vDM1QhpqQIOU6lzXAGf#-agp@2qDyM?WC1FAlzZuO}@uia7 z4!J5+F*CBBdk0e~iR3A}1wy@IzG7tY-z^SyvPs^qba^a5&2>t)D98#}#>s;d0UgY6pk%U>Zq(^|tD(VhR#Xw7(-hHGvnaLo;DOk z`NAmvGKw)b5Lo7BKP+?SO>oTrf6$iSq|ug(N(n;p%7TCWJ&tnA7;LidN@>ALlD)Ku z22`d7{tTlGHm?(Z7xJEDPl6~Bj(`?AJ`dfOU4_My#L;BLg1F{1Du1Tnpf^%Iu zpn@{R`nygfCWCS04*f9skr28X`NDsVkbT#~)TF4p;hwOeKcDuc``FRqyK z_@J(9k+)=VX~pug?I#vqG^GS9FX0DuA<-r@&=#mk*P!$Z!8)1R$V^9ToN=0o6Q(nn z9DH`M196!r2Ju(0ZP#YwU2xn)i4iX|SsXMy_^0)Ys@62}I__y<4g904ap!CEvfR?6 z^BUKbQRbo#R}6izW^i^y%glkZbK4JQ`<`Fe-Lo1|6DC4*nd(hlrUz$~-C9zJP{)Ej!tzIzI{S;&X`LG)80F+V=!rduEO3#82UoIl&v4e1)9$tEM{bt!j zT;(5LorXiNCwNDAViXhxj7P>@L;M-Q(Qs)P>?HV;(<_qRyC9o?68IPO-%SDLNMtl8 z@k@=FH`VvW`eP@zawZ<=3W*Sq@tpU@y-obZTOZqnd5K#zHaXs_z(FzT=Cn+uNQifg zT~SLApcV!HP>+9_!BrrW9dW6RV?SP_SWhk<+_qjIT>Z&f7o5q zKZ%;(Op#Irk_`^b+Zxn*3AS`V^S^$% z8ubMV9>X6i@b4Vv(Dh`B)7#oRlM~yXK*n`rhw(&T{sMYj`IDNfTE?BR6`=8}p?TE5 z4i-d|Y~bWff(!qP&(V7go10Mw zD67N6C<^1~r zKEoF(QXxL_jR` zS`BQm+aSdEVgFVUBG0LbxZb3A~S;oosq_6NRo<)Mp^7gB5(|l z2WAuWD?H`zIz2&I2h$q(gh=21Pk0=z;ggu$z$d^Efgc2+^u%NrY85cx-~_+OA>lWAQ0u-=A6WD ze7Mki2321C0C~@N7k-G}@LjBXszAu%1x51H?`agvmB^}44k_WEV#?Ts;|xUm<8BSK z+1VLuzC4Bv$G%*X!A^<^gxHIy{<-4klQrekv$++Tnm-t^8{kCfM;)V&3YY$9(oDC@Zf_e`K3en%hzWyCM8(|qXZ%b zS8rw_nM5RCt=gzm%~UBjs;*z)k4(8Ww!A=*PS^U)*H6SpM#ew!^*60LohUHRR+DRD zv>Qxh)f1Jj>G#bhn5Gn*I z2TFAPVKAVAIda3j;^sQX3et_0aq|;5-;>EX_7Jh293ShEu04qy%Wr-+qCUCdT}iwA zIsb?9{G~uPwvm3GToFd*|H~WRTrtn=X+uMw~gM%p9jGk`x;`@-8$xedR2uGhItP^cS@}{uiZvI@+qN9E4Ir zcg{F9V`pfJ_VE>`mOt)WbKc=qxk3^R=g+TrTuXjEf8LN7;!=4X=g*JkJAWq2O>sf& z>G54j&dJcJC~l}$8|u5F(xH0Yr&>T_{ z9z^pJHT<4QCns%JFV|K&Zg*5_UDCwpd!iGi)Muo2cUG3$cg3Cc z=i2FJ4lBm8yZn!ToT}aq#oZI0sy(yxfkjWU`Oq->)rR+Hxe=z@KtXvL6-AMT_^?XD zi1v5D^2c}iyTtDG)#=VGd0^2~*PFNTrslbBs`%f3RQ%MU2bP>cpF(wW@LH8dqeAoW zpgRkc5={I#z(PtYp>D;pC1<)e-pfT@bBd>V*qvDpKy+g}=skU$}tp#$WGZlu;3qhd`tjA$>>^ z0j%eI*x8T6&YlnFh*^N4`67f231Eq6zSEfmb2CO`Cgpe~yXimcM(1$XGdES1qIY@nOqFD3%HtKa;9&Pi`mkX7@SsSu!11IrQEC-SPa3RT1r!NCMT7Sowf z7Z?zdT8YtUa=IJZE@BqizTX8N1L8f!Q-j>>yNq0=d9ks?7;-KWsh zR@x(@g0Hr@lhgH>>vNYZK%Mz4IoLCusBcRbOPJ)|Hjjg~Ws~m@jaI zfr8GZx0(&HfkJOhjaL{LYcSusv{Mi$BHTr? zvDo-m$VQ&}@9z|odYG=7ZsNmm3o_p^Z6JvOPY`TvaHdIvuwRuR`E3L6mp+J%y)4RBT{`AtpQAu0m_z)@ncofk*EZ%E+O(rQ~- zm4<)lqT-W%&v{wPy(3*^nVDtxC8nmrzvTjf0M&0fF_u%JMrpp+lBxKSXA*Mr;uCUn z@xRd%N5sm&K&3diz1`d1j^ASbT$PLCES5N&TQ$sQajsq6vt^4Km0LU>3w|&WsihHW zSqf!y4_~C}eOD=t@30AN&#bS{#1rR!5-o`_xW#1}B^imNfkI%9!lDFxHIh zNHCA*heau3M-EZz_pW$n;fgl=tAi66_sooai&<`4Okku&AkhUzj%;ufnXzo>D36=+Vn#i;|kD=|#EbT>O}%ZKAa$GQU-0uE=vlpl}A8#c1E<>}0Xi zx?EL_#%-au-{)98KeT7%Imdh_75w|T5Go@61!;2a3~9@qwWl@(A#hil2HfP-#n|%m zs`&n2I?mmV*5R*xAC%ySEC;U~_qg&>O>@_El^(;N{L^q4u}`+9x5Y0uJCb7?@YB9~ zj!d06?E#n!hk)!a1+wqAIUr&AS_AqaZj?Vp3&%fl{*~ek02=~k00_B}!9P!2fE7rN z4X`kYwP-NWwYfxk4SmqHfjub`qI)9+gw$}sT4REIiHs$2FQlT4fIcnd(D#7L&b_c+Ng|5B!T7huMmpdt{8c)bhJ%&72 z3P9F;U|?!g3S+b4O(kfxZwG`jeV6fd1 zu@9_BVvq}cr=WXKER(^OOV$^h+vp=ReHNrwuG8S(ePLW=QsRUSWq|aHCVfs95Ih=N zP!1zS%LZX+X^SV87M_MpcN~QrrIx^M(`6wzdO(edasp#ZvXVmq98t)%k$#krQ~%Ioyfk^>GnE;-1`IRM^D2Lph@NSFX}_V@db(60&vhs>u@(g45t z3ny9?g)06iEmag z80fP% z;i+}l>pT^U@2fiH#b!MB`i37-^hTpO$fPmYs;X=TjVZ|dl1vdDX3FsRCL_wz zU`?zNQIuLJ3a2PhRidrlgDC4uLxV5zS3mRYDobj((iKdxGj+O5HWlnrhNpr7K;!oF z{gdXXI{PYIN{3!+0~ac_N`46OwpGT(Rc^z-9ZE14#Avk1%D9%f4WV-;_MhM0h%Q)F ziU=tuNX`!uYC=Vp;2_k=V3bS_Qn%qHdRc(f@D+&L#aG{j=M?2%zQy^PNZ z4OT?T*esq+6CTgt#;HPMg98-`rG^)XbBo*5L6b`uIMk9?ZBDBb37w&je=7-!5=SWG zWAFX%dT(E!cm03wjgAgeM5Tv{Gd+@qY5itNO|rQ<&%$^*IC#idS)t+Ib{k()QE40k zkX#;DDGOC{xX~)5WveJuxb=muTbG3h<#J)jvRk`e*eVPa@fC_fnQX#+6J|DrSd)^h zAx$$U+z0S|5kTSsVZ|u{rP%`}`?Pa;ER$wrqe(b8GVchsC5;Y2hk~PLZ3LOHFvI;5 zb1c4yh~USQNePxFFz<{GnBQRKPlSDBv-^7gr(1g~DqW_93#-sX)B#M($Ef#(Iq%|& z$KOEtj{`C%&H#-sSSXwzZIy}Zcx}C0(Xbw;HmT|g!4KZa4z75 zfC~Yy2fP*VUckS=68ZChufZDmC)h+F>aa`aGCII&oFg+jI7Tr2;mBAr1qXVJC^(IP zcACgkFqtd}hDTc|g56xS9@P9a#{sw$NuUyf_{9*j*e?@Nu)rmO1M!T3k|ep3Ab7Du zAu_T!I*yLW9Dw^nt|XbnC;{4`17|5xk;3SJh)(1e7wkw5#r1D;P14Et_`mUK&0^GRwL)O2tc})GVWn?2?nQzfD?qq(Ipk-YN zDcUU(S9bP@(fkVU4*Z&EL2a5Og!(?;R}z0^wO6GwF|)$F%6yaY*VNSS@<(3eCGw~# zsj0pf-~!D`O+^;?&@xuzN7x@A-ILmHV?7$P6>al`L>k5m$RAj$|hD)gH4x(FP0XFhQHcAcq?LV=LSWT zS@7JFg+<=E6)3})r{?j{z-yh0mQzoN&>G*@ymCFGSC1gHYNIxWGE8Qsn1i+Gh%z?{ z{~E}9QH;M(bFO?WvvRTe=us+h$r9gL9{R!>NrlU>CACttl{FXQHXl98=$b-J^}WrS z!9i!?3SZ#PsAo> zbN_h3oid&%b404}MO-nlIw% zuihEe>gl^n%W3I}%)&2?R4W|XXDO2<2&alvDiQp>AXF%XfK2|VKqeEw-|)y{q*!k# z){FIqgV!FKPrW&d&1b73W~y0KDh@JIxig+X$tWC{u&ihCJ6QMmtgmkkNyjB2=}RU~ z^qzV6&SS2By9z1=+%%R+8zz>7g-OI=5;_Jh#KGkgG;#usj)LOinT%(jI)mmtbr`=1 zcwlegr`gL8;$B^~(aU50F#DPpOx(t-0Ywl$I)RQkRRVC>enV3im}?S#gZ`F)_mmM4 zzQ8XKfIjvUanL{jHD-hS)k%0Ji0DoF8lZ1TJRb#kL;|i2A@-w877T_AOjUu$pmzh7 zpWAT}GBsKv3>nQ_!My=}5N z)KWg{Qrp!Zo#>y8$5b)l5hHfS37(Wc(#x2$LBmk8dRW3Md%F&Fwe9F)r_Xk+_+-1v z_bV039O&Dk&8*F)aCf*yuH1jgbH|+-o|+nusXehjbxKrpfgT=0Z^lL1BrVoPj!+=r zbXt0Xe8CDvlV{{?h+Zw##w8Y~nB96Vqv4K`p$O)p1L*l+MSPex1W!R{SzLZ78y8EQL02!$PcAlkB_-SR4eA2`u3iqk2mh3@I2O`1wKD+#R6I zkdJbZ9!_rY->qvr-cc=Xs{WZH5BZhizLdx!Alnne#;jS1VL;zE`Q^o%lxX^P5NB*tR8=|80`U9iixG%~;C+tDf*4>*uqZX@+ z+PKNw7>_F(ueNAJcW6u^u?)^2OnGXWp){1c`1uJnhkBFVw)?I|8H|xo7W!A}Q>nf; zP2U*tHgMvT;)A1wYegtcRN~P`Ie3k{AWdVnqNG~mC`mDQtm#H4lMBVQ*0>3?eP=C| zF1$yT)>c+GIS&5@U~g=$j1y;N1_e#aXXbS3Vx*acIVDPCv?50ml5ot+;W5!UCR-%r zn_W2-Hg9rAxmzR@vY4m=;Oq2yO{C#L|3#D@EgHM>St9a0HKh?~g0rWT%B@MU>cB)G z5qo=<)#;r@j)>YyRkB0CX7*;7buP-5_6T@(f##U*AK%^1*PO@lR_70vm6WX?OAW8c zuK*IC03`l5An`2#qSXtQGP5Ay&>FB9+X!rtpAb38QSA>B0b&#;kO(rf30)ya7zkTQ zz5&{Vp@SI?moUBHm_stq=?0^J4h!huC&0qU6%HLdXH0@$fSWQHVKv-PCYzDufDGWf zr-NK1hl1o~?#!Q@V3ylsnu;GfQIK1im3Tm30bcAWRXx>1wRMBlDTx~p|J}t|an@vK z=`9mF1YEY=6lIRlXI9%SQ67PEQu@HdEjp{5(>-#^%x-2siwWy|+_^1;quq~|uXXM4EGj{IrO+-NgCR_ifmONO2TGx#~B^K#RZZ0?uU4FAraaO&I1vDn2E}r;qc#}~sED=@ zP(TGR-ejBdlN)-x;RHbxdjumD>SISY{g%x%Bl;ck}#<-EO=M#V=x(#X2(%fj8YaM!-U3pY`{8W!CLq;(dwqF>;F(s*1MshZ9qU1V4nsD6 zjo;wK2)1oty#vez8!T*y&;-QUv=()k(t%kaztPWRuSLa!5v5CV;%;Ua8{x|^s&q;$ry}d(2 zy|y&IsRn$C)$ZHF{I#gfXyC@01tG<9 zzRkgnjE*xI;;X%?+U@B%shg@*9gXe75%9<}(d@VcswXj)9W5~V?lCc53yq0ERG*70 zQ1u0eCdjKIlcJf-FbJD!cDql8vBR~T;B7^bV%Qp3mK2L1+FYNT`z|L)pbmT)AB(qI ztHW6H7C%38=JSiMtqrTTTI1jFdLOSEs;?icsv4@RyS*wK-eqtQ-lxV>6TNCxbd3kc zhAG|Qth>7Qc6RRVx;8D`tqfznSXZ~1>hSGOMVGI>Fsm`=?owgP1J$k;TXg1}*p{az z3)2Q2$vI9_++a;u>$$d=mNQLZy*smtyIE7}>Q1A%>B-6Icpch{+is)8(Nf$hiKf)= zXrei4y~JRN1+{K8UoFCiP_EP@iL1`+oDk2FC#mfw{E0qS2q>w0r28DX!RQC;{3qFJ zp@8=g#ETj8X$*#AM>IGE7s2i{Enpc$+x9~(Jp@yiW=2ML7r(C{%q1XcAkp))$guzD zfvq86xisfPX53BA*#I|UFeqqfI0)aRcd`5qQ5-mBkIDYvDUQPFR1jK85@~Wuss*Sx z|J)<&H{?3-|*5S1>n zUx>vXAh~{IlYw!J8jfvxI2Omi;f;i}D*_yXNuwSh>w$lI0Cr>IW+4tBS_YUk6eI{J z7tAyXLl0XP@Y{d!=Xcv755Sqv1prwbm}7KC7u@Q>uFUCj29OyF?-;;g2M|y(GU3Q0 zK$}Oe5Phu&RqxdW+-s@0!cXiEupmnOo zS0=vu5`||sp|5xSfVdNVZ>G52%*(b?+wk&acQRvoY+>xkzfZ^*;b>A`&U_ zn|F=;`~Y)x!SDyg)Y;7p2kzgUdH_wT#1}G9#np{N;9nJZW!h;JbVq{0`zwCq;7a`S z?=u-b|Krm}OUd7+Gj_!`^3b;}$K#uLEzx;H{$HNds3ghtu@TwI2uFTwN_VtNW4tzN+eO!0$eS*PJcBbNOfAFYWQM(E3wY&Uy=)eQjBa$IYBZn$3b2pnkD6 zTYU{Fg{imt4V95%H`@3#K9Pa!m3ZrcYdv5ojBzUy)7v{nh`F3RfBG7hw8^P*dLP4OdZw(a9J#&#KXXo>%~JrT<6h}b%p zRHZRX(9{c@1-Za*m0Squ(2!bQ0C?EhV0YrL)BpM#Y0=1Y3J;pux+YZX; zdtb+S&G!Uu!7XS%B?i1f6rgljCoHCa|f zjYi82$OcX`eT3_yClgRim{Q|EVJ`>OXDnz?$F_cY(kWm%gLaLc$!rDaWeMIXS-GMJ zilu&mL@B%5yXHSA;D)_(`%GNS4Vx8h&%o{|3ISquSVa#2Y?gU^_V9z#L(ZFWAR zyRc*`LrA4DmfEXplhx(kY*FV%U2J)H=&IWMfqVv^%Aa3kZ`Jbd?#}4bhOeyhE>r9J zGK=QtGGz>!>n<1!c>vcJ>rL`}4ZBKSNWyUtimFC%(4yJl=<|Y-Tzp7osU8HIobRk<#8~ zu7K0h&SRn8vfjxBxXM+J(WKdN6ru_PEuurx`B78XqIEyKroF&-e87h%{- zVc25>ro(W9i3!cr`yCmsyEFJ#zXf;WcuhL1F)<9vmW{qO@buy{gPYGF@UOkq!Vp*<|FJl>a< zRash{Yj!J*pS_j)=Cj^|kL7NDb(uyWmqZy;^Hzr}eX4)Xt6L%|AJ99aZzCfKrmAt| zRce5~za1SQ-@{j4eil&RNF4b0q2FSFtWN>9gDe&5{}=|IR;7S;5J)oNZRv%e^REYm z4weecZo=wUQu!ZZh0%uG(p&L)B5J)Y9QBFRj~3q|vV?t%on zXz7eysuo9)fL~Q!EfCDBE1f95txw)wHFcsCA3KivQRx3MI6O+ZDIR=uR8#kq?l1p{ z0WU19IBSiigU5RulB(thQW&l&eW_mGebn*3Ooyt%gSQJ&Z+f++c1BaV?-crJV(*^y zpcR9b&}X0E04;#(mxEphMh^Ug;nd3^?r7vtGwMDIliCRV4)Yy$OhUoP9!Zab!)}Kg zDf|N2{lYr{-30y*y!z=urNl3uzma2 z7(5E|0O>+lWlY^U-<|mJc+dQwL#Xv}v!_JmE9;xpib$!rm&>XAOsfv-8s=OhsLEUNS?FekO6>(ZQIydvF>LozhDx%dn8Ku*lRXq(EKbV_R5g-2? zpBD8)e33K3T$`WUYRT)jHg272zr|_k(Z=O!>=CUa=b{;wl7_x1jR}=;_I|)3LU#6h zvxk5DY17j4=YmdU^`@B2b#9|3+$k4HEzFE7ur;xC{=Hp^+Jb&I&j= zzR-lsKp)eciA5Qcax$tyEnUv`TQ26#EGlhO-5=SKS2#TvHPqbR+|;T(646szvD(Y} z(Uu?-h4BWhh%b~RYgl2CT5mE-ArKnXjJdH+nS{^r1qiiLDFjn|G&3%A1cw6>1Uu+d zNSK6SW3m}2FkCT^S22BA-GFBvQ^3Sm_$vO$hqAl~%rk`ZtXZg%YtmD{Tf!(oSYc*b zXB;ywp>76#HncRqc!qm_^30rEZv>vGXsoMSR&sCQZIz|<>ft#&xljZ_)TfIS`Vfhn zl~k^dR4^4rA;>zk2U&cnI9|`7ggS{NLg0JR70Y0yBm;}{I}E8AhSUx=T3rFF{ewxI zj$t(66V?-45g#AgP>Y7{27wifCecR2IqU}6HXOfT;QgZsG?vDZ1=tY((9!2HBqt+A z1Xr|Afd3a#lwS_!LfjJx@eTjJ($zW5X3DC})M}zb6>3jwueE&3B3)vbRFqy_SeH>z zB9T^f#fE9LzC8rfIJu%?q#Q@ZhMEQ&8jiRP=5!-Enu=Q#;Szc2j*QxsTCo&;#LCob z1k4~qc|o#Jn39=MSK64Jwm#85CqBP6%M@MXt$6C(gDZW5Y19mSEHu8O3}Uc(OD6Su zB@$7rO4K-OmbGk!*QActYLapi<2B|PT^&FF*lbU5MnzHF3et*XmlsVy_nA{|(aA>| z8`tWUF*wSJ-dBYjF&aGjNbI70^c*tt0_sDeVG-hS088yK&Tvl&%MYV1O_(% z0D71BHu*NLZ07P=m@-2Z;3G4g^Oih~%XKR-6I<7#ayf)^_e3^RY%P;Y{%hw*c;Z4{9-7tpdU<`F|BCQV? z0MFN>@D2=+2^$?mb}vbifR(XA#t|?%3=LU%Bpu8ZlgL6N=@bXtzZotWteqqQgX4fz zDEU9;L+LDdjs?%L;5n9pooiA$Di%Gm^1y+Wk1VQiC{0~Pg~L0R;B_dB!xb8-wY1>g zdkadfQcX{k)LK@sb7w)BRT||K#}qH>>|9hFBW8_S6oS7~WiszJyV8a(9EV-Pa#Q^aMqt$TL$>Sx!rWyXP&25#4q+qL8t zQ1L{2FAmlwhiO~2Vac`YF78Dl{3A(njV29V+>3wQ(>*&)VrjKX(`I$=+0#8MO=@km zNYZ9^@0mGgdz%AV=xE(OXU_Ik`m$~N9A@*9nx+_$s6{M}X{=tdq`J{25x0m$v5hrL zy4we`3_`X@pFPmtK9H>!v4w`Lf%f4IM}9dxy*N3Xt9BJnKm5xP`qri9hSRr4VGRiI zUK&y<1KoA!^oR~vxDkv{6@b#gq&JeSyBMy6$Sngz!2YVrpN#I0ReSIVkwFz^a z0u$sx#~}~i3)P>%PkSZVIs0?RSD(8-CtE_QKS5UyjU{>ZjaEPU8v95dc#Vq5%e_$c z0nBj;Oy-VQx@@|Bx{W4*3)*;qZeugL3VCj7V{C^R@<1D#3(Dd6J?1ON3E+b_L>P#T zjATjb0qc#$0`wXhzy^@)C3-#BwL^*v{y6|Z0|rI<&B$jA^*7%z)FYn_uR-tS;^!z? zG=2)37@^U=?~n%#9Hy#$_a8p&yPv9NCXaj>P08@{xw**g`!1RhijOf2-+s$5j9mQo zTi;UZiVbs7Q~?!7UBT4_C<=2&%Ba30M}P`%I&#F9g^m?Kw3;in&u!=m{&NEZoFVqNvs&?yujCyZ^$MmWNK8E4lE&&(vozT;b0mS zLA?KfpD>c+EPO*#^nRmKx_RVbBA5f#z(HD|AoE|8f?PmE3F`sHIp7;siGpR+f#a+ZlA(H{qJS*WVgLp z4v&|Y*9EdmlhY-^CRG%ZAB0q;N{KKcA<8Ndd2Ht`mh;wBk;EF65Fru^W8;Jf!1|+9 zreJAWaw$8ou3R1;ep-#@n_Dv!)<~A#EsYdMYxsOkv^Y}g){j<&*Nm$wO-ia_2!fC> zE>f>Y&*@td4F;AX;hBMp8Yh02`_m}ceVwC= zmk3h{-5`wY7_Fm;8}UO01s2d6LI7yP9R|=NV9iJ!P(FQ{A$8n%Jo?)_gcgoj^048d zF@rp~rU_RB1xfHOP^-U5&{{gm2zkSsUx_P=pSiXF&O7_J&WvBUY17ruw2@JEMZ?rS zGl4D*4w9-X>q?ZWgt_qJ!h{*y`ZsLo-!>z`I`Qu5F$P1-^t&fo8+v;gjok}EbP=YW ziAFGSU(lUZD$qs*tL1Wauv#Z5y$oQf=Dw*73VT$fR*|4mmef_Mr4aWqi*7Ap6dp^6Btpfn4r)In_sLQ9S| zIy7EEUPj(XzYO{)BwB6ixn7*_syadk9x`S1RpAg#CP*Yxo2O1~RH#%GXF+%O0-;WA zoY-TE(1m#Eg2}s#Ry1&p~Qn=V4FQYjjzPBp7#qM%^B zlYU=#XW!QG>4AaaRb%-X4~&h*LV9fQVfyXHbtpPWzr5v-&PW>n0%I>$sSXT;Gn*DX ztJvUKWhEOwOhcFk^w}F`E=+E)HzZS>%s(`Wf&jZ40*l12t5d=w@~LgU-u#I0lMbwv_51ou@THXS0#juUwVGO;>owJ?IxrZl9B2ypgsBYeBcCwGq0!{?2F2ht zhucK4s6eYT#cVSBu22k<+30qge8ax~l5dll;`v4(?Ium3%tQtHM$BfDJJkqIf;^Mk zZ8n;G|D{+)6G`)p_VdgKf|2DPveuUWn;1i!Z(@gD%LF+O$OoUEKM_F(!Xi1VJF4$J*3F_w+w2SN8E(4?8rBm&~#1{oXCtN*e1 z$JzzzRYH3H)Gj}5@>2;0VS@reqsv}JpyOq zRL|`TvojT}-PzN!vZiHcPtD5g&(3ab%gSkM3);uk6=%*|>cBtaJ1?yjAB#A>ZqJFB z>D>i2CR8-%=%%WgSuF`GRBDWi5A~(gPHFK?$bv$qW@Syy&hF3hwq<9v zwPxqEQag(#Hn}=C4OM^qL;JDW3syh8KYhlEmaLhJ0+`Hb5ScNd6BxjoN7BB^V0Ciy z7~J@-5*>4%7A@B9_=~pl?~S;K8d$Th4f$&Rx-rL?Zv{}ySbU6iZM0fA4E(uD<|+;9 z(A<$p1~-%bL=#w(uWj)arB6zu2Rl8Dj3T-K{CNwMBm-@90^kq^=!s$vMw09f^e3!O ziX0Yim{#Lo2@uxFHbajcy%)g>A%Ri9#Dk}&Kfip*YdJZuEm{8j^wW3A-W4y;Uf9>SaQ4e9?#1`x zy6iAI0E)s}qg=u>c~pZ1zV;V9@@>^%bv5~| z8uGE8hHrmPNV|b_%c07f#AZASkcu_va86fO4*TuguFhPL4ZeyKM;aLi@i9nyC%3aB z_o_Lki)u$F;GqBf4^ZT+-{0e&V(q2_2mrDaVQ|F$(;Ayt?a-@$b}wMiQ-wooxIw{5 zADd{dhb6uBt$XY5S{OUgQFPA=qbTRgrOU4j%tPGUmVS{Vw%)eA*fl9(?Zz$m>Y)vX z_HDg$|6x<}flpSSM#iaJo+L_+m^wpzd|ZM-heza55)QW?fAGXf{N262S5NM_Tw46^ zT@StnLooFFd%PXcP#1V?RR#n|z@S?}93RN13mgaiEo1An;6OwOv7hN9d>}QNNZw20 zhxi~|A%NP9-N5N`XamyESb>~Jjv&|anMi-flq31e?q2=H?YDn%Ti)8W$0uj-1)LaM5=Cz}$IznRjnnv}o(zd2?q+Gym~EqtH`aQ&a3IWW3Lg zQZK+S-oGFJe%DMCV zV>huZQy2$HKmD&|LgxT-!3||@qE{U0g7GqEl!aa;%^wGE9RgdaAG0|QBfun*MoY<-BsWDHCtw zymIYurf+(pmi;a%;;KcP#MqrVJj{9JN)qQ4UqR-zW1Ls;=FA&9G4juon~qR0?sdoa z=2a{E?Xkik5cv2W^^Udus#yyI74SA}fz?2$HDJw4XeP*f$xaTUSi*gS;FjjUL7wa9 zy-B!Rf0QMV{Q~!^_ao}FXxDu@j}F`W#|jB$u|>!%a_Uc_*>shlNf!mj48s$>fKZu+HZ-srL&8v zxZ+~p8^!E&Tf7Cg`1ZQ%B`6lZDe>}1#28+foLYyTfsj;8FI68N?mO&dLKrNZ?wczQ z8`qNr8y((~=3&Iw{qw;jiIGSc%&~nQEQF+Q6TFyx`w-y8y!|#>fFk$p11!_q-d^(I zq4xGemliL+M7}>9#X}tr0Y3_bj_!wSOBP=`*xr8d(&8nM9rjEC+Rh7QTpB%F_>bO% z0S4+sPTll|5{#Gk@zpI=&!pNG zcUDPVg|jfl+*>zsD$IyCVMf%!j4*&|9AFIsX!#>)pAn?TG>bz7fpklWtTYrbp^+hw zGQtZ0kH;Y)qT?CE{-M^uK^r(~#ldKPw-5Me3E zUtvcza&$n|bTSPbXP{#s1+*PvphB>XLNAal7dBGBAfd6e0GEZ%CjrigB|VB?!oz2$ zOgRgvXU?NXA;v3<+~Hxsj?bK>ElL*`3Tr!b$sO8E>9Sd$p>6gp4>a>3wFeOPH-NbSC?D=e>#~5BT1!&xoJj&ju9YPK{JY#Zqm)z1#oupj+r-SO89A zF4)QZ(RaCEC9{Httoi%igMI=XzLB8PfJoZ~{WIEi1fk~o4a_?FC$Mn2p&K1=H`@Ok z@-&3Ng%KdU4&D8**GovJgS7g8?%}(q>k5VWfr)7@(bG>my3AG1T@Tg-$(W95uB#t~ zd0S!y243=XD=Ig}tGR8Q@B}@2_U-g+HCy44F@nOvp8(*o?P=N+6K66vHrr5O%MY8H zcw*JeqQjl?#GryD?%Ws35>D3UC;vaz-UGg=s(l>Kx%Xx#H+%1-NxG7@N!xS}3TY{$ zrDc|~OW9@0MgeiLoPYu%ASwdlW{IdcaiNH!I9^3@i(7#v$NzI~Qre>Uec#{b-!!@F zoO925p7T7;u_?9wn;EsYoJss0JAWK2{UbiZrsHrw)5+M}ely z)aR>3_~FtA4i3~b?!CJRPtLz~rpTlmJIQa$+BN;p8>9EEFL9RNbAOGt^~2ewFL3K# zsxn^Ge|4!mTN7-_&!1Au^dC@gO|Z9P;9#DZf+*KQ66IP2s!b#=#!MKt8^Pt`elqc) z|Hx(^XEFh^H|h5udYfPXKuHMZJ@JT}Pt+^9wHLPa?8Gd`PkXckZ6x*z4UtRxFr0{z zY%LJ#nUJPrytE!Z&1tqJ?kA8P;5!6~rT4^xt&1TOzY$Ed6gV1b-5 zhbz7Uil?%kPSLy>JEyO%DMz~F$C0kQcT_*9-JCDW8rd-C)NJ@~7?~xjm)J{-W}Tcf z``uYZr8b}woUN0XpJ$F9J+oagsnvN1BHVy$@526SLts)H)ra|wjty4#?8E$66j3T8 zMeV9SJ=L!n9jGl|VL}hFYPU`PpeIuzcB@!tnpS_iiZ-QPFt9fgA+rg{B(_pRo75HluBM>p8AUA2c5n2$=*-dtl6MM(``DDkK z>=S!HtPF@V54N4$WJEa;LULRQ*+HVJ8{nA_VuvS=+yqGy(=hem33%Fu$O9mJ^OM;G z`)cr}gz%c1WrAb~z2pSp7&1MvEJ_eggiO?MISoRXyr4FBS$34Hb{I-GfG{#qal#xS z-~%}+I=q=|vq8~(vN%FP-0BCdA*&(T#RD=5aDIniyz4pjM6{+)74vL$b)Tvo3T+-k z8NmT4!}sb9DFVKPuhLU=o<82FR+XhY`uIZXP!GS@W@4zUWnf7dq!^P;?C$}$y?vY+ zr7CsSs-zXPh8a}Z^o z+`IQ=GYRw*|AKj{(&}yRRbhEOr(!|DNQ=$TJ2%(^;Vzlt>lg{6G?1!+mvE@GK?QXc zq<|_ns+ioCTHv6Wh%m#`uRn?k%A0e1c2JddRpkf{8+!ypeXJHwQ)EE}E_P>UyP>LR z6N%*xCwNayRLHNYt*$=bUR8UrK*V=x6hVfsW?40#2`V%$zNi2hB?ZIstPX>vwA_+2 zvlQZ*WoBn*>OkFnW{#!2)M9X0^M(~jni?9KXhqQJ3SW+eb&kgwAaRbV_uq_nV*%Jji+|a zM7_%oBx=-APe#SEn)qigBFjMMl0B`?3I|hIIp@V-&4pcAz2?^%18mvY$XDU)tZ-pg z&Qg?}<#q>yZg&wz@bOyV4PbP6`+kf>IQNX*y9xR!AqU_@5Ep;i|G)?FX*h;I$4mDgeD;Z^eXF{&j;M&rTmJU^*FKH= zsM3|Irz|f5#g7g`i_8?_K%)>`CI5ZUF3lHMpaDHOLyE`cYAC3)Qqg$8+zaV+N2Mt&7in4 zZhrfxouhq1qn)7Czxl|#UCj<{i`BmP!<#?F=Ot6~* zGsldbsg_0*iaX{lyzP$p3vau9{(?ISXO3-|F{5Sd%)-Cj$tgm|FaFf6GrG<@6EM@+ zpbTI0PxFp*G#Mrmmb|bbOqO|&%yhN>v#>KUeJm$oPRN3~yjcNLJpi22KY%XKDE=^! zPyv-<@F1vHo{Q@!PD+5KjTWFka~Ta1n_f3XqT(|O$w)9)=~{8>Yt)c6#EvCYGv1vx zR*Qa%@2Gme$J0IHJJ3pV$R`r{bBuTnJiR5gx6{_&kEY{0ymc;Ttq;xY0^p?8obSHN z))?Zww0oNY#z1Z#1~!2(&Itj@B{=KW%!lsagMQoKch-YjcD(xp^VGoWOYyOF`W(-+ z(aWZVMx;b?7L>pAE_f8{)}rNTR^jx5_+DCrS4E~osQ$4tCN0{qat9;4WA=jEP3r6P zmJbiUbiCV`Szzkt|HGJF3BJQB(2Yf~Zo^0cpm$j%FMfUUl~+!@`^qct%$_)D&YbbB z=+%Aw&%A}-Lc!O+(Rfw+E<>tyzrXV8FTWf+_WNC%Z@g*KrkifuyaweK;5*P6bTvM0 z$}=NktDfChN%E1@(2y z-nF3@Vhe5^IJkdyAfvW1J7-eCf}2Lx^$mt{f|GMXt<;HWYofi@PP_a5>YJzCd~-A! zrECjsX&l@?Cm4WOpjkPSBMWXCQQt3+6ADfa*Pt3XtHUf(_Z@FjVU65mb4wu7ZO=Ov#6)5Y- z(q(-m)P@gY*K_eNVMWR#@W@R@4lqGgoJb`IcI&c+c9{n>0O;Q^`?-Tp9BgbJI`q(f z>aoLh%QjSO*@e#@9@MwGxj$8rQC60b36XbhbDp^HRVNbv>F|wIas2Fr(Zi-u*7(b} zJt0Sh4L9^#dOIGC1m)$`mDrvgDGUY+BiSgA>UXiUYZrBaJr;av0?PIhG7>mu;GSu) za86Qm9U45H^FiNzL@%QX>DKvZz><@!K`judb?kdfn42cv*;qVhV87x1;X}*j%@Ro368 zYc<-gol!fnk1bf&tGdyno256zKkn8pin^Z16K>-l2Dc?(4DEu=ZU|h7NVqy84sZ$1 zJQ6>=_YhTlKUEapC$L&Y5`$iJKRS+H#Kru>7ke@u)u3imdLz)my?8XOgVHqoeNa|{ zoO3cj*9wF>j@J`-U~?rgwjLF1=WwS!53>)ck*Q*FQ}enZi$A|Rj?qhpSMNUf3-TYm zv*+D6@b_(hW$^VwR1!u1n`d2jXbgW}{I&&i=TF928{_9TEb2GAf`_Q@{`y{6%6||EZve&F9qEimCRCPH8$*B@F{+G-My&r%*?kMYpWjM zr>({34?Kzgyv1eO>aZR_jbDC(8jb|gHal`aOXO8(+X!fz1h!CkNJ}x$99M`@3za+< z#J6<9(|vgN&v+6#`Z20{^eC8Fp8x4(@ClGkee)-N@&W$7d+~EWqZFiWzYe8^PkhzkwPU-$N~c=Hr5`@jtqx7ejgyIF?J#gb#3u8{&H* zY5d|g=#3|#H)ca`xS*a1_qg5q0MOB;9#XmZ3(6 zy#c>rVby`S`oIC|+yQD=d@zjLdTKHcF*0bjwWHa25fupvB2*a!*7#3*_E5?_dnWst z+tMaaPHS)TLvrz7-wW)JT$S*klgA0g0gsS43Ib+ZP9LkYHa*;2cyQEia3Q`)EKO}4 z!IZY2ShF7tTc|ixEgf>Rq|Xo$aE6Jf6y~@v{e$?0bq5ZVT~m%$or*tA9lADt3@Vuw zT@^)#;@3il&xe{m44L_mnKVg9&p$w2!{2xD+zu!jLf{I|!BYb~MZ~Wy6b=L%w>wAn zh+*sI8Eh9ZLS`3IqUS~EHN@`Y3uqBG@~QNz*Y%Ix#NXH6!0f$POJ7^Pc5x<&5l+1Y zr4E5oVU9tClf?oZ1E>XhbjYdL&mvkR*!3S`3wy>d1(L6 zj7RoV3CI&cJ@f`2dOLv{ndd>TNKkUaXFGNtK(h|rzIy-gC;9t6d!y-r<$dEX^Y`5y zKT>?{lr^hK9TkyvR&`ocD`1rjK@%J?! zSasE=k>>bJsyV)czwe&-XRBA>Dihsmk9DL^4mmb?sF&lne zi&B51_s04@_ToGD(*!R(1TR?#B>?at=)EvF*aIyeaGbF){>Q=iAJ3uQdbe33v3PU{ zUUadRzb`hpq-}h5_JrxB^!*mR8g ziaH)!7C%O1(Ko<6F~OS@@Fs%jU3r9Y(IJ;m5tGnVTu&d1VcM{Yxnaku_60m}p$8j| zDV%6Iz->8RMq(gv$xS3t5twf-w_gX609ZE&eM-*w|N68m0ouNKCPmYf+|A+{85t}% zRv(4$Hf1YRIR-SA4*ko+?$jpw+%wcdi!43O;B#{&MaN48%*_ln_#f|f*?TVH)dJN; zWLAU;HW0xE7qiF%vThy3EF%8s;EbcZp=Bg)kB~GD`VOW9=ZB@M`U11>iKDf9a_i*E zzPWpZXbr{3J%ngAL+{ENEoGZSyBK;Uuzg4Jrfi)O??Q6f>fc7bw+d-$1toYPSS^)S z2VZz4txRSqH@zaJZh~S0{k7Wq4BX?s&(^o5;mmI2R%e*;&e+)`+;}apunpj#y_IWX z1jOM&KCo$i5cGE(LG;9ZQ1U*xhM55vmixM3!6DfIU%(mJ|5E{Z0!ccuT{bPK-4)}l zQ*9GV(J#}Ho}I#~(c+o10_QY)e*F8r;{| z8bx{)RxJRGyga}sg!+YkCF)L>cii^6v39%pIQ!iG{j*M={=xOST*VH}lj^7qC>CEg z9mQtH-SCU&qqhEyevzR<%cwIm@V34gttVfs8&9Pa z=`yY6s#>XuE*|M=TUao>XyKIhKj@1w!I-JeXoX)xN)YoxL!43M!s7353pHrLTN#6+SkksCGKvC~pWTZ72c?>!6(T(%ZA{ zpW#v!xBu9!L7l=7AuN0f;N?MZ12K=dI>V+I!9gzAx+B{uFsXoV^Z@AS_4H*!Pv^{{ zj?a%(!*5(kt71Rm_UkXaR?+)(`vOI(e$ii_H_j~uCy?6oS2}C$s;B@X{6e7Ywo|Jn z+*k9|Yol6Tf4ssJ(H87IHM`~1bGQckvHj ze?1+4H}%s`@wez5JRMaaUHin&zF>Rrezc+2&_nl^P^(+K_2wq)5HxpK#z;q_dtCcK z>Lz^j8$4=c4O;aLDvSSWq#;&~KB5C>w|N=VoE4KEZru)ltq)IH@x#LpUp(2Z&pI`B zXh5QQpu){Vq-liV;ZzX1^aTttjCT@yKpz1Akbr*|z1k7ccbtG5O+y|Jik&JtB2%9IGHH{xOHjf;PE z4j0veufs2!H4tmfRBaL}*dC?KChS}cid#Ro$@8e{Ue}f43urD-Z?TJ~yH&e$3U}4j z1eoiNC%D-M!=xcY^$#lF&t@feCo~Tc7WmgdS*%gVp#0@!RMW{J`(}xdK0;Rn?j;c;c$MOoS633v z7%rW7{)QLl(iO3WHo9U~{DTl$6nhC(xbfW6)bQAVsZ3z{AHF)z0!vdmKGRQ8<7stO zDe;?Gnt|!#+|~Mzzvyh}#&_Snx1zBO$#1jYKcmsvf$LFNwUK_FnuFmn~ z%nRz%X9qJ=ThcCSyR}esiG?r#lw<*o(BYRBWNBB_+)Fkw0sS3BX$M4+Fll7Kxz8nd z1Nh>)1&CVGf6!|LYy7)%S>M^79+uW#CnhWW!r+KZDr1;^c79|2^xKEc@_0<&eDg-E zjT#VNMO`J+Dkt}l>0>WUe7o25+^0q;QmCcCU96_QjvIkF`9Czr`qBfk#%8B2_^h9< zx5_g(JHERtYf*My?$X@?xjdYO0xj2#AAem7eveQNw6Tc(xYw&K84Zt>s0;dBbImY{ zdUwf^E?XQ15Jb8XTO3#FKtdLf^|J#Ixb9LV@$J9&NzqJ78ecIJ-8FUgy}`_s=Ps^e z!U4;JBUy+&Gvz4Jf!w*1=s+HwGUX`If!w*1=tmx%LRDT(^}^|BJl=%G0;RH|oRQC& z)Bal)MVo4YFOA}pqBDXWuxOHjzZ4Xba~;jO5Qm^zoZt{-tDG4skx_t%0%SZy`8Tn> zL=+i_d>=MOh|rbcOgaP%-|z~)2miA1F$jpT_QM<6Pi`6NGCJyJ-T&S8-T2gJS5G<8 ze#_$bwlyt$``V39FCSdiH$6W+5-6YBXT-MF6(<&MLb9EAA@R#IR(y+(;gg$@3XMPZ z8JdISxA(g0mOFc9ruCmar~g%N<8Qa!f${TggYSCnsvAx%dF<8&*XCupvNFQnw5(w_ z^&WlKuw|dDx(^BNn(+$$W8+@@_St2;PS>FX;dVF;?O@1m;E@P49g$~_@!lkzbJ@Nd z#BAY{zTl)b30*26hCp+P1Q(2SaA0a)I27WnN)qZ)jL_$X=o~_%0vRaB%|SnQQAwxs zLf{l841|@PPO9noL6+f9xEamQivaAw8wni`f=~t)2oFu(r6U6ZftBH$@Gu;s2+z19 z#J$pm$q#xgI&nf&@KSYaYxRY9N~qhWTpzl&e((dMN((j7s)>&eDqUD~^v?M1lIoIZ z3BIuz&HhWMP|QL0UE?R1f`hZRGvuA4a}t8e(kk-b(>#h3Ca7)>tBOlFt~c(K1y5?UuU=Pv03q+OBFA!ofOQ2jmN%O&~H?Q zV)+-XJzBq7>YvgL8`6m$A6oA0S0cKIvycVM4%O@es^CRHghk~Dofh-^fAzW~lyP%Z^4zr0yUeYMs zPoRs;F9UIPkq{IbU^akMhdh8MpvouoC&3e*bma6S1I!jb_^kymA>0w1%L|DoTXG-X zCaNwkzo;p=cPRBnaQ%b5#oKFkcntl5(=>{3k%>+>)VFzblS?xv>ip;LGkb+%skS_$ zFmqMYnw*iLlD6tng+u8sG4~&SYkiN!MbEx+#GsdJq(Z5-Q83)*R>Xej<*icLs6csq zbq{kWRVJf;566YU>P>6I4*F<%?4yEFOVSwrM&EnsjL;ioGB+F3EVTE@s(n{|IpS$q z&X|7c3%3TdO8Q=Hob4^1ZM0i`fHnOG&3rJD2lT|Di!njC_j(wsTXt+8w;Q)LU?vb}$9Y;%Aft)|otT|wMZ zKurMe912q`*8sDC?l%&z{x-uQk8~0N#+EKhC9EMqsw)oWXJ|+1zeX9Gy_}{ z@J;aH3L?xa;h&&j@&T$3K7P#(_>d_f77s z`Z@JDnBG97FRYn3u|}9ne$V$u-(bV#-=+|CTT@fKBt&O7HErR}m{&s~+{#^1heDx? z%R}T&Y*6cN;;$)hAUhk4Sm|{- zd^8`5l0gyP%*=WS26X{Whh%1=;UV&e->IJ2Bbsf#VWy{-(+LsMCR7VvsGcyP`a((d zgp*+1oA~UCM&oOmsDsgH?1!fMChFm6v|STLTi`ryjPk4D(jTRBSGLzgshTG2q-N8T zZpqI62!A_xx+VS& z+SUetcsR8uv>D&~3%S^H@)dY|G&Y_(9s7-XbY=YPGB9xQ#U)Yt*_E;J8#ivG=8+>_ z9F4B#{?SW4W<_ge*n3pA+@#T$_JyFmoq}rzK+Zr2)Y}5Q`V5Eww+K||?|@bJDTq{g z?w=r|`$7p;R4}1nDI`lUpin@6AO$5zPy>eV;Sj8#;NX~`NpLlghXfH4_C6d2Z&_pm z0e(Tr0Q~d7QVJf};1|Ja?uRGvLqy8RuY&lqL|Y%cg>*!SB?~f?NPB$)*K+@qb*kt3pl)78z*)ffDN4}5`u?}E=84AOh> zhv@|tYp`x=dd`Z8>Wndy3o{1{%(9!qeZuF~O?_)$Rk$R(EY}t;3FHL|w;XJVZ;#(h zEfWolm-Wa@rJ@3M5+1P|>4b{eyY5dBDK`k^!oqE<_);NN7MHPdWW5i+CR0-0yk6%& zyE~=4sK}wUfr5=zOO=)S4_!6*wh5XlS>wX!$W4XDnGr3e3Jw>0dY5PLwc#ws1ICC_ zJu02Hc;uq2l6*F|LM9IyWEmloCL~q*%(P5qF-wJ3tvfHzDZ_i3qk<2)Hu|cY>w{jw zX|ADOZ{T+{ER^M1a@CDHXVfh28y;7!=vjilzIoyU<5Ek?^tHO;BL9djqtWf??8ouJ z(h>AE3QvA4$VjW`EwMHlqBYHrtwG?X8JM@(?RzCkF;#o;FL3X9Tg)Vt(r=?);qV1o ziS9BFXef~Dh7?q8SldQjS3KeR-q#E$=sTzKs`$jxTI)!2&9qcm<%mH#c|~1~j&7|g zwy7c>N$(+6i8qj`t|*dfa+rz|ufsUT5iGEHgWLA^FBqzk_iFayJ9yeIv)RPSTB~_| zVNN&kMuWEhba0Wn2v&oexHuorfrpxpuQaPcI-y72Jn(k~{1MTLA&4?JH@T_<8q|WT zXSnQG_O&{HVoJjX$Ym26m`{(}Eu>*0gJV`5`PCRY=67O(lNk;Z9OzjB5DC@Rq?7yP z6`y++A#zGcLR|WT_72%;fdg2nbh!!CN0(C2&gv1()m^9c`K3X$5Er47j0g`FE=|mG z^!d{FueM>&A%LBZPq=2FRf zVSxEUweJK81vYhS7Bl0i*$;lJ4OH5bB*HG^-Pf#Aq1C6f+3N0GNU(wFk zr_{N)8uOd*(kNQlL_Gquj}NGrZwXy=e>8gWdbpqqmM;g2=Qp^A4+B~E#q#B`Ooif3t74gcz6d`(POL!z~ zYPJGh)CS>8NNn7zAq*Vx(7ZMobY}}#k=@VR1tCoyxRvOkiAzGMS zpWPKe^P8Iv0e}|Io>+t5YHk|b)C{{Y|1F%xzw7|hCqj5d7a)Bi6zf4iGybr+e2JV`^nghfrD(Vi3BrQqavjZH-6`j%@47nTK;P6h`lmtZXECGqgAF@Ow zvQ5!wCqO=0*rRevIkX(n6h$Lwc)w+Jm0$|QdjYun7U1rsAdhJTE@To=Ydi#6Pbn^) zlL1wn1bqbL6wo(>tpMgC#2pgU5a&vQEDdf?ekWxH0XaAVj8ozQ=?ch6fp-9>2|70; zfN&D|>J;vr2dBKmDML}uj6#j*c?gSg=Q;yTAMpUxlB*AZ+46h@Rqy>bFBw+{K^Anir28 zx>RmVHD2@P!oD{)QN0)STQsU=TzzR#Rd2ab4lbg=UDU|+?x{Dl?3xsa`UH)AO8cSl zQx71^*7~uJ{+J;=gu|j1; z1Wk?vdq6TsPDG}(H*E02kzhBCn=o$>Dvw;}akAF1fMOszdlm%~AQB;uLGYGu&3c_t1qS`Q1Co?kl5;c!suP~5s1Y$Poom6n!%fluMRr)f%* zq7bDE1gt(?O4DKpO2DR>g^gCLm0G6@sFCa6^hktu{#w!ZiR-uLi&Wc=!Gi$*0< zX(SnXL%M`JwcPy`GOm9Z@5kr++FEwuO~8c2&jKT1zu>e-_$4J1L-D<;H1(aDRO;oD zKlb3g_|)fRrDY$27q8;YxYBGk?=cz;H}jF$CX)qZVm@CC2boQb_>3?mMTn|RCKKM% zSS|RDbjbyMO=DX0DU2yg{48am=ErZ0e~Hjjj({C}zF%X{T(>RNXH3!Ryhf$GjS?Xx z*k%rm9w3S1X90i@9H1x0?o4f=ZO}K4I6`NzT~}VT|IDv*SKtdj9;K#>v*mmNLu=e7 zrBMpOEm@~m0$TSXrx=-SR;w*u&SyR)R^*>DeEbE;Pqm`d317TFsH)EshaZW8`L(KE zrclW0RT{lE`pDrY`cw^i|BDIu{rJXX$LL>yx6{Wmn1%L0z<%)vsSRi%sAtNL{)mJt=KgwSe-X6-ddd8v(O@uo#5pGDB1Aj%dIyc5vrIW+zD~yjf?MhK&ODJ~3=xG+4j10^)9#^2$KKTjNata57GZd3&EANf0xc~@QOoF4rft8ZCQ z->cvBmjP82?i93aefeUBh3$qAa z=NP;I-gzl4B!wD~O2E4z%cau6dE!BAUO?4U#?RFKhDr_}MkT-1#m`hyH4Csg7DzL= zSQ)s=zTeYhuvO(ul^Jc!x!g*3wo0b)s8l+!KHl$9O8qUiEPSc-WRF>@xIShTQY-yg=6v$RteXKE~(&0*J-w^CG zzp`dVrBdk$)kZ2tfkzvvw%-h;EZi$CSQStxXQY^geeRBo$~0JK){Vb=7FdIYgm;U?^(K-&JD%|#RD@k1{PBngR$2aFQu3F z^A9Xe5vFMsew8;1eeZKthh-ACU!9T>>o>7rYQUAB?n<+Uv$9QYOV3j0$i7xX&wSQd zV^7ah2ePadLrEYz>eI^AgIWedywTj8oQ!l|ZtA=YZEcOlRWQVnm+rRAx;iIRrw9M} z#YL@^Wy8{~zL2kfPptvJH9o4f!=E-f9?b>kn>jXPc8~eTuMOaFxoOf|R+GV|R*pzd z4bqGBo*ZwQL#s4K8izR5Sfw}B)#aBC52}rxqP$RLNRxiescSQVm7TsmF_-Zs~O|HF6DXXpoX;qMd*2N7hZ0xTq~02Ak3?}HXaQq=IbG_an7+b{^F zn}Aoc#Rmds2qCG{!YZ%tS_(MZg+0SCgaPiFp1fK?k+(zo?#TfU81$W~!LbZL4V14- zmQEswBm~;TtekkxCV@&WE8|kdQ7Bng4gqwOm8@%+t6R7CcWrdyO~gq}1nBCHckzWP z*bn!>d#}`Sn#-CD6x*ftCOQdf`+s!dmCEjRzsu(NMG33XuyU;ytx;%otU{-Yf1=ds z6(C6bL#9$oWok9L#+2eU8oeoKuvj71544%`6*MbWRe=XLmR97OYydO|gO)Uo5Ef z$Q43Gg~}0;@#8JcuN*(|#`D8G(fO0d1hd7ooB?mXMgAdh zQ|YE;z0o%;UlwtwDnPWzdMX8CN-49ZNOfYS)XSI0iqsa1T4S+1mTX;Y#qguAz46)$ z!yPkkoK&8BdsDun|MgiVgBzy}bPRapspnpJe$@DrAAk16j4!5s_|XSbsOz97Wbmc# zO?JzFF7E+xXYb&;&hx+Z6tzq5a_bBp51yB-6MEMK+CcEdds?G{mpP?|qUZz^)yfm2 z^Q2C}>a+@lj%qY2l?DU&ClaY;QndHTs5slv20YSQu9C>$RiU7iP0>T>8L=)LQSw7z$FuX=BHC@o)^lCLT8X3bxF&k$$h5Wmh5t)adeUT-&5 z^mUu9)%BS$QYz9n7{)BoOL#Na9};1c00aOX< zAa}`^Ed89i5}-apigMIIm*0Fi=ZFJB-E{vaTpCwWM|mVSS4<*5mkkmD-IDm#13Ly~ zzy+bAg0!DhDMTs?Z-$IQE>6Iu98fGr_do$$&AA6$VrUEeC&(spmbf4#aD=o0jzDif zk%?s|2(x(xpuu_uz%3hL`FMIXdgey#W$LI2s+&aF3ELAO}Au3Q3^) zM5iVy26f@818oK}5lXmJzP^J#C1Fxv@k!JWe!1m?EMf_#zvK+wK$0L>xyU7?NVbje z0$ll*C_3^2$N;IyfvJGWPVLyw@5T#2#B9Kv9vJh*+e|&r%Cy62FvTL|`T<;LRKO+GHRs>2tE<3Qpl`)F`qTdRVg-BrDPRWuSKhHr9z+vjSR36 zl#+hWn`dXJWO{ubtMEI$1D*0T2P+gQXg;Nps)S-CWtRx_Vv$`cPth|ffk`CRNddyt z5}{ON5^2nGp^O%3MT|(KfZb%J0Q{~gwT#>(aapAbsnKS$3;BGBP$QBVgi=8kL&;?l z9W6A{l!}qDVx^vi7?xs%L}-)9^>V2?V3#VTP&rGs)hdt(`7EE+NT9JQCBvpSXX&MU zna*jDIHZ1syoA-76>_gqpTXx_3_^`WqD^s%eL<~6EtIKshD@bQrZWWSa6VrOff=BD zkx^vM!M})DsWFq)2xKO?O6GK+AJl3!MpBo?*2^7kPR&){my$)-daQDmbr@KghR)4p z@t&>7iWZ)Jk2nzJhVq8@PGfK@zm>XM7od<6$}0r>{4r~%CJ_>s;oj= zs$Y?ssubi`nX`J=3@%Za(=AH5R?2840F%m3rtFR z8psckQqE>s^iGw^D(8b^I=N7)64{vmaP(r@r%GP<}>W^`yY9=TEF4pkOP zoMvf>LvB+_Gv3>~rLvr_zk zJwvUPTC@h0R4Ab(o}g8t=wg)!vD8uDf5zbe@t3flfnYBVAtiwwK%U?ip9gSF0t>a_`61OWOR2fzRDv`=X`W&~|EGdGxMlza~S_1+pA0{g!U_=U;gm2=*9<&&uNLj32 zhauCXOJij!tx_sfNZ7ng+UnrD0nU+Hs8*<)5e3aqjL;+!RrvHuxg*1&hL}%j1}op2 z=UX0o|4tj=N2QJhB3341EGa4J3f2gSixq3ca)(l-@#_2vol&e)bX@D}tHlxlemI{PwB_L;^L@1Z>MN)xO10XMwTU30dit$?%VVhJ`bItaq z-X*LxtP!h}=1iHcXh5w};xd~pQkh1k;|o|ts!eHD1|2ew*rtI(1!AKiTkB3$cx_Tu zHTdsQjd3tiCJenV_p>rdnq4el9Uc#@?h*z`0~+V$pg?sPL`LU9sW2U3Dv#<(wf!^f zMaVoOt1DT6VbXE)j(`?Syd>bjNn+wb+WZIs$HXs3a=<(mCK3PuKyFeDJWjwA_e*v{ z09Gy)$H8IZG6}^Tu>b`n%HimOL`|T)1cY$qc9ceH0ELoDCkh~>0SCr@Up`j`;ZrY_ zO`djChdhO6P@JEz!=#!}lO&V_tpeM91dx*qInhLNtzqZ!SDkM^mP-GPfrEJ)w&vQx*EF*>~ ztWA}+dEvsow+3B+=6z^qafl%#>{ zO-d#du?pA(5DDxmlN|3;sf0>}%HZQG3XD>b*&&jMR3ahYDAkC}U?ZW*(#w@1et;HH zVue{R6d7bHr`ckVNaUH*k_?;FY}R?K5&`4XnHjUwYLrSuUWr&CkjYtwFO!JG zB8d_rJ*(v)JCI3)w2TqiC9q%%z!2lHV!fSFS84^+WBBaxh znbo16om!_v%mVquXGD}zz*nH!tPstY^I4Nz?v}$CrHWa%QY)2vtpXVa`JOtz%pezo zYN9qpEm2D(CK+q=`Sd1_Tq=X%1z)~umxEyePYQ)%h-fz?B9t;lKFeBZAuWW!U|%bw zK(mU(VzER@i5V%-*cmCF_!*Q^tX5$L@<|PX8L3huQc=xHnOq?e^TkfH02Bo4 z#f*+G5&NB>Or=npQ!L;?HbtvBu9ho7@1)BhblwMlKUdoz9e8 zk49!Cg`1ROzD8`~Gh%^U&6k)YdaJ`>722g@p;+XS8hlm>Fa&0iRIbQk?KXu$q!UYI z5`B7VwlNLd4l7|0Ek4R=2U9|qSaIuHpN^7Mfll104W{LPTeG61cpc_s`3WH^uMKGn@+w&=~}U4fp{ya9DN1u$q8mk61mp zG!SD2ycxp-xZwgk??Pc9$ruCiT?D6)5-cBFu%5vFEZ{Fv9+a!6!@d+h!`GgISOZ^d zC4|8IQ>TFIvu@oAk*99NWTH~+0-5A+w|=C;n;I07yoqtA3uhkz4KE>{7JZk!GZW) zRL`7DY(h`>{$xFM2WCpbpZbG~-kX45JA`<6&o)qkTk!t-z_i%6ZNq2q4e!4XeCe5O zE%*Gq;RHH3^2D53C*v=pRf}Fix1t?$PoO*JoESOsWc$;7Us{A``rqF0Bj{}IXg(2N z-+W>&)$_-#a0{*J^HTffktb)(If2$+bz(&Q!k7BQmd!dja^wlL^v-v@_kjJD1_n#V z4c0%(Oh{0M)%eRTTVVHm&b#k|@sxSX7KkIY8t>UoY7Bh`H3l{dYJBPxsquCo~^=>oYH+!HBu-Ht_7a>%|xFgE)5E?TAK0u3X!k`=MoHVLN9WvfN*^>l}XW_;LK) z54+6kKtkXA^2?|hiPo(HH$gjIei`q;=ht;>o+lAiqN6Ebx|WnR`H2xEv1UsN>xpmN z|EX=y9|7M$U+>s~jA-l;iQR5}0S!U)?Oj`S8`y#TORI`j#L={`zd=*uD<*(S$On zjXrh^!b-?CF*#el#fM?u9sYKU?TXE#y3NObo{j%YOWysThokQ}k2Gb1G2U5tK^Xog1T(XsLhZC@SoRErPzS@r;$3GtSO+^hyKSUD{T2)r|CNkc# z2fu}9oIOd_kb5RSzhcM+7?&mA<3GO~2|8ufcu(6)NP736#n=6b2EV-uWj-|uoL8^; z@GPEz-`Z1u4_Sat?gT|4adZ6K8N3GncH4ptAIt$wyUx|d3|bHopfbkuzzg3$ZUGS1 z${>K?2od0Y;Edy1IGzTcBsdq%Ka3q{Adn0k6G(X4gg_cvE#T}Kx)*T8x%!2~Ut`Ve zJ!sp4yfG_QjLBPo2jqH0B2$i`P(QDxvVX}}f1k`8qCe~lm{W9GQ!tq6@hY{!U@vra z_ncRr0O-p)#;UFe-8;IXzP@5Kda%eOQl>d&O=GHybHg#kl~5BcR)KpRRYw1z1%Y~9 zjU-*~9nc(!RDInoKiIGL02P!^fPx5tnZR@~SOJ9-996FW;B^5HuICT(CaU{tnlHL|3KLTJTp$LHi2t`g@2SaBN5*`*3 zF)=V*Purk3lscmu2Csg@1WpePVi29EL20FE#qIfH%F{BdZ$^?cJ4fDzf5&(1ZXQzT zEOsIs_7a(jjUufKToo7q;i+byjhT#}QPhll4!GwqIoLD>J@X`vj#Zb(ZCS*M5* zAW^Z~83=kbu-)|Cqr=}k2;O)m9=eD>*!n7d==_cUf1n}&isVFwQ36${zY|zjMn#eC zkU$Ff?@>|waeqnw%9?rlLVb=|Byyv9S6G1lj*C9+p7Vb|Md94y>M>0+XPQ!ED*Asw zMcwj)18F`mGadi}1Mr;zuvsEebHFtsU*ko{3kP6#;D8X^ppmNkB0zc`dQ8KK2MO{a zyRLTXpSwE&NS8Vs^3m~uc=ifB9u?x3(WVt>%|Ot(GYmv)R-jFArx1@{foBiI->hy8 z4VXTCK&TZDg{kCl1_H4)zdto;(o?^$Ngh|)Gc6XaO65=WJ5ppyR->?$o=c_$9J9Gw z*_-hTs06np%EsStb!Y+A#+w_9d-N!7L^lJ0p_ z#N&~K`37Bl8~73cMGP72Z!&YxK8-*A=mn)hp}Y`()UQGN<}i|Ltd9GXlyZbBMKplr z>-V`OlC)DW+8#j)_FC8hq7>B#6{Wh*vAz!IB6PJcGp&GMg<@4zn5p6yq-FXb4#5Yx zbtFG&kL5_4}>1^b9v@bn&xv zDx^d+g<{%Z7VUk3FSO`{e7x+u)|e_P#@qdZ10DmYDZv+?(`$_~sRYD+7L8u7w#r~H zOsq}Ow;v9;NWdvq0KIPWRi3s3WmmNgzs~u?VqCT%ZDO z1S3+I`9M1-R(rU`U30b&u%$rg0AhR$+a@4^0}?||gRNADPX@mB+IJR>soQ+rb(`x) zFFLWJ*UYM_nZ2Sj;CI80hRF|496qRR+_<(u!zVs`^?T$G?^*Ktyh(?u=(n!lvE%w! zcGaOt^Il)_Le;D&$uuJxomB-cnU}|}#ucqQTbg#3(tnPhH*b7QT)MNVWoIk1w}1aH zxqk@MeEVNY@y&vXU|c;G%-+Cpiq8+&2KHn%FuNh{DovqP9cYtuz3)Cej zaR{^qz5$}FM!W_XgNO$Fo#gxdVZdVozn3N`iKBv`Hxl$G*K`93d<(QuQV|-guSvfM zbmR-0E-ns&fXaeC;~pd&5D=~9m*CZz6|Ch`{IFl;&qNDGNPW>1RQ`tC zZ*pY{diAP968en^_|X4H+IxVvQKbu@9#vbidT&;5R?~v7I<} zVy8O2Cr%(CgaCm+fP?@`4ZZhXc46sdVehiLEbJ~N@$mjLl0#tk-tT+w<#T36GiT16 zne+Ga7Z^on8a~NjVC~{Bz*dV*v;|3t)DH`=ZW@IYs>@)Sip=;kFLP4ye`kjGely>A zJnZq$mCU}l#-#gT!RSb4f?pZp$Zi1OOasOz|)oaud z!`|}){da7OkSR;n+_dK#0Ork|Ol!o11)h{t%;%HX}om0f>yJ!yn1_M_xkdg@~qCxs)nVV-K!bCfNJvT>FAy|`S6Wh zb^GrdfYN00qf0j&g-QSP=gFjE8U<=|w;x@SH*HcowOpxxRTLxbzA2R!?hdA zTMpEUNS@|UbLV(_?=&gcY8m+5j;f}k{nAx;_BCJg+H^21JT|uR80k;$>w0@n^&g*7 z6%A%q%~e;dHylaQ1l3PX3vx1OhCdrU$>RO5S}e-{@h58hs^=ZoQ<zf1BPPr*;*Ohm+uYt~jZ#blsQT6DVCC zYHg%cG!Bo|C2`rweK!rPde{_k{^`K%i>v9)<4311COLC$d4)1AxMjjoexVeOY>VfD z7oU%`_naDB|CqXx8yycM)7K5!?hvsL$Rlv$KIis^4U3srP= z?iMnQ`f`~LOCnEoT}w&AYnvvB?{;k&E)!z0Cs<*SNTO^EIY41}dLZ?!vI z(NR{kjN~j$8N9h~=Y)LQ>D4dJIt-#MElYRe-F|aQUA500`h0JuIi)t5?#}sQz;8;a zLr0V26t(NRp57b#u9_5vx-uf0s>;@xjwGqGQ=VNT40>sX4^3%F;%zUPt;$c_bZwUE z4-UwPK(ggL3k2igq?HsZ?TLCdkhZb5`>1rxUIF>$KLx?Q7{DS05-4TDLQ*Xh1KSc4 zW)_he45GhA*vn>`&}`!~{l6V+FK>StJ&03iV0OO{4T6l5l>5%yeUv_Us+W_(ww(Oq z?DXp=T3PFlp1=0OwT_TACk&p~czE%M+`D*$Pc9yjN*9lQB2gb+zx%3vZ0@#Cc8)x_ zTQ{;j8r@zO-CA|i&D*e#cCVa1%IvzjokUuBdvD7%uTF=v1;-~hTygQ`43ny=+-(p2 z0b6_N5Z`j?@UpX)&XMRt9YYgzXP0}&M_cO-b(`;8TD+zLkk`!`ZmVto)z?mgu=08c zC0`ApMKSxpA{PGkYn%O$xXJ97_$746@+5&gVgGT4`X6WhvyJgT+x-8Wi|c)XiHU$O z6pHWh;BQWlj{oKa*8bZQ;@_P3N%#M8x^(^Fe%-)8Y=;?t^>gf3zwq#{e*XJczpxYk z_Y{&7zQ#XH3et|j%4-0!$)Kt8$MUiG1q7hSrqT0Tq|wrmqz9qvG&834Ysp$D%tlE2 zm#8Ztp!^0CD7e}{_xwp~OBlmA70!i+||Res56= zp{V)RHLI^+Ap}@)HV*&%YXJU-jT(&-_p8=pSKWudgl!$_7@4wmrvqHq%y%0fT2ZsU zlz{8Oj;5vrCgk=zllU=EkrJ?w^}z!43?xLjJ>kiO7ZW~C_?q}gP+7xEXeqD+x#)F$ zN!fw=05sYqHylFvMP^7O=z)oih+TxpI#7iCU|fSmY9t7tZEOQSAZnWsli@l@dJ+&Z z{C*mQ-ht{AyD4Tdm4G~_12^!vWJ!-njS?_MAbYBW2IX_1o7l!rusP@r<(NWdX$WJF zUG&GELPw8+2P5&^F9x3_YLn8dvy^QA_WZ~({GYeYesEjQpYOT-_Z^MVI-@!nq7gDG z_l-9nXxQ=XwbxzPKlM5$xaJis<{KW7#1LrMI=&?g5@mPUeUC#&QaN$QQhBJ<|#7Cc;a*n%TCRx&TR98 zs!_D6EV6w#Fm%_7z8j|V@Pn><4sh1oX1VyPDjzB`*=15qO`dNnzx<(Ud78**%au2r zos&!Y*Z4h4p2H60H%VuvDXopN(n>BjQ>er${H@DI9i|nbmcuPWxdQ=5hphcTe>#;K z0`KGir!L}gv5kD6HP_$dbXZeIC#Y}uvci-ABXFT6xNJgWboMt}lVr@AV+N^kZu>^Z z%-!IaNKND>zIj;{G!CSMazTxUVSv;BRNEn=C+Ntr%m84UrXoCD%>9JYK@n_=$TvnO zfJ=hFF$RwSoP=~sq!o>;EtHs4Mcfv<0ooz}zPy~rPrcb!Ve9|2;$N8KnaA-jzFhfd zd>+rDy{-3n^gpKRyk2^H&-25+iPEfxK3{#$)wR!V;Q#Z+!?$kw`;#HhQuow*BR_7f zGT(LKaARF7ECJ1a)R+-@Z22|#cjf*4bAP;=d}sdNs;x)mlQ}7Ym6nZ@jVH@~T?Is# zdF=Yci5)r7?Cq1Z!;M}Y?H%IDR-K1*G8-J@$BtC>jcig@Wjs(>d3YI<83gm+V!gxj(d!WtkF?UoClM+t@hCLTn4)y~b>bM28W>@$k63?;y`%2w z@IjjOYr~b-gy*5n{S(>}|s(?)D6r`~|8HG7w7GKSmq~!>?Hl{(6CLcYpx;KBgITK1Y zD#TK`$*(Uc>8#Eh4(2V-Z`!ERoE)=MD9M{k^~Pe?E1|XaQdNW1$SINr$>#K0qc&F) zdU`5vr9Hjgx2ktOTDq=gXnwk(I9luEYXt%=Pi(Xqy=6oBxh>93D_eI)$UWn=yBo*1 zFK;UAE6&h4!TC!k7VEg4ipFr$ssqca*O%5E>REPfcvVaPS^NzBS(#F$Pfv?(uPxtV zZ<9ym0f~1sr<|&Q;|%rWPwkZp3mkc%RL%Jld_FYU)9q-77F?c8Hr^~sX!zu$jm9r z>Inw=gC%ykFPZVvlj@r4hF0B@;a;r0Git~xGsx5ipE*4|!-QDdfxZ=GvW`_MTgD1t$6TONXOZELdK}m*7|7U!T}LR=J{obazkR`|mw@w0ZKyEz582 z3?JXw`ofEy)7wLNO{J;j-B&_}vpQ@&=?oiV7g;wKEH94e!m?V&soDyfkda^J(4_IC z3Z6JMtaAi?bRqZrsoKjJM7PbZE6KEYLiH`%*Y4};{pNp~ zCI{ubtR*%_UDI%W?%DfJE@O0+I9Jq9od4jDEh~3NGed*TOQ6!)-hV?;h^6;m|8(u1 za}PDQ%rsZjjn~%Cl~-kU1v2ZRZf)b5`lV0w42`88-FO>*7Ju`rt=K(Gqo6mClgLg= z&0m*R%(M#gGw*L~mU5UW5FpOxyQ~Zrudw9)d8buWyY5OJE79(37qI6Bukm{a);AYi zcc5Jp@-*+iwYGkBpTG2_6$z|_rTDi=57V~6GJ+k-7Z<|1%zDU3wI|^?od4`9~m^DIiM#0)#{b<_Q}5W0Uj(M4@8y3Wt6)i$L1o8n8PcRWa#@AaX#pfHDzV zkg*W`g{g-vzycY=JdjF)&yQu=0oPx!@qmXRzz)z)iJ73>&?IKmMno3ih)nbXU4Z>4 zP7!G&GK~Z&;QU|&ir))&!NvG35QVt)#T9Gbh0={p=g2z`?iJ7?Hrr<&vn;Ndb=e5`<0-ntfyl{w}v!Ww? z*kdZy_1${s*p9c>Ec+HxZ+!GU{uX(RNzF=PosHj)-5$2dt=w$cOX0Azha6200eU1L!bz$Gtd%+8H2e75Q+bJ!4M40*K7j# zfK)mrM13y(AyB&P4`tJgv)jdxMFMbXVsngy(P)TJfnaaoBQU1Kf)t2UvOod}LI&Lt z;v9hvdhmJ#7L7&+W=8~)1YxA0rqB@`PQdg0u@(}Z#3+a@)BtoMgrT8AHL=mg@QL<9 zMz8h4-L(zpFyHgb?l+L%5i1(6dFRW8-`#8ttLzMkRj=`Jt2!^zhjCs!$3%0EAVzxdhOXhCJ5P67Yw0+j_=hVI^1p2xbTLv#4XKaTz(z4^_t-X|L6 zH#|K2WX-WP7;WQOENeD%9RK3P^xr2aKaPZE-R{}YNCG9{Bz&)J@V!uGu>r`O7&Cdr z;)T$MF(d$n0%MXuA~uA3ToTm$M5{K4eZ(=Gz&{jXPGBWu@ZuBSl|rJMz^H)CCloKR zml#cf?+VFv(M)8(eFSP!H#9Fv^+OVef_(+|;`ieJ=(qvX%-@XJXUl%ZYM-s`aKDXj zUeG`mTfA=hpVwKW{MK`)t2s2LGqG)BgzJ;hu#jjbKMqY_ABVWzTU+dY$!DR~5}2l)5EUUk-lC#}=puX|L<`aPBaRSXkNuROlMw4=CVs-FN7N0j z#T>|B>U4V8n9XQ|vYDaDf})Vn8_XV3o?>v1h$c`?pBK5BU3wPLCz>*N2AWpr8(I*e zB$7~Jh-N4t8h_v=Q6&DGPV6OgV$O*{!U-hBLNI9D#DvDVI0P60NEwhioDfQ(d(=B5 zc8&`;$o7N2gfZSbdDC%8A}8_K?;3i_`ci6Br&|gOOIMeOQ?(f82$r@t3iAsJ3IvTE zB>^WX#UUO);wxz0t}R!LmF83!YL5&<5RK$`>#!!Ya%D&}j0GY!w$E+R{n_2_z)p8$ zTWw3Hyt6hsxh=mazc;P!m`&U0PMzrGJMO3oPF3XxrgubZ8_jLCtygt8=d1KX6Ij34 z%1;xUc^8ivgbuk`>>}+HTLkFLk90OIkICj*e01k_cV=PvSXN0#K+JaK6q^E5Rh{|K zKFNSTZ>>Qc(e-a>-W0T#mTW6E7mo#0K8eJo)+ib} zvg)lelgcLMIAoqHYjZpGTw}zUR_&4son>~cQ)rdh# zhLV$;`cr2|GS8w^71Vk2wzcJS4qC$v0lCnijgCco8WLG$L3eFOUfNiH*x$B1!`IQC zUQm;mSl6~ICsE4F;>s58NfCP0QdPQMk*<=ey+UvST+9V#2cuCZNY^py1rQ6FcL0h2 zYzg2Ztd#(91ns8LLGMDe21*Oc8 z7%ySPB2+_52?BZoxW!b*%032DS7O-lPcGg0@wVvI_=SZlqr1!>U_RH%VB6uA zqM2IbHNT%7diaV)mD~>tU9dph1N1wuR#RChd_Re?_ML63=a)UOp5J#vZ~G0)YVjXW z?|ADz3jB~`k{a+>U@KsMH^#m-B6NW4kcSfX zZ16=R?n4v^<{{=b6Qg%rl3BusX(Gcc5_iP+;Od5E74aRj5$#|vh})B4j))Uf=oyKy z@F18vEH+XJk}DC5lK?q{J)Pq3o}ke1w^MYRR^Ydi*E~7e(M0*^0k({xE4{64_>2?3 z86qI>eM`C^yVqHv5oHytD_jg`_3qLMrApn>5}F%NO-&E^$_r#VnXss=*SmV-l8;t? zLUy;RE#~oQlD$D~F)qa$u}acg)EjT+y4V4%t#&T8d#*ifsM=DU%yoI@vRV&!GO?@3 z_4^t*SdYUfaYJpozv{H9>OB<#mV_-~)k_&dzLcF#pY7w=d2!nfZJgy_in>vWUaVg`iH{pH&-Nd0=SCOVInDVp+wZ3pwIjv1HbEY>pg!QPiS65W8Ajzv4DG-dwupiK;@nkoQ+jVKF z2@-5AK+qY0pg=+tka!t*@?Hr=E$)T{&95bVp71S}j+H`)(^705gn?ZPsaGGz-oZYP zp}Gl09K`?#&7|a)`dSE7K=6ohA0n<7WImt?W&jzKgwKx%1nh_zN5p_Q3BZOR0If#A zwM)OiBQky*+X1+O`tsjSBCQBP543IN+4D| z0(a1A3K24mlx-e#L@;E4W9XG&mS$r4hByI|*`)=WI2M56h=Q0th;Dqu=NB=FMyHXW zfaB$_NvL$h_k`ic-vYh_yt6-UK}Asy$p1f16o2UqoxAM4(TiLfH)8bgJN8v#jZm+@ zJx50z{<7PswmqwUhyUf8?K4B2$+Z=10sGd&yN}b8lc^jtN0-WaW%bbHE8E=OwHL4A zB_<0KrEHlC;*ZG+>}svurjdBKT+hPw8oNDqNOH;8(nKL-EP{geEh*u&#_ z#2TA@;iIqqlA3LO>E)c<#Pa!H?ytYp0?$MlAUL9ckV~V`nF}w-wE`jh6KF|g19g2h z%Wv(@jTQu0Ed`Ca6v#g{HaxZgh7Xa&bMrJ>dR~3U5lrx)wyJ{(2~N1efQSP=K}q$ACAW;|~_@s4x^vW>4;xtFzULGuW^Mja{O)*)JYb8buNj z{26|RE+{F&SQlB?cfalt|M}9G@iX_m$$S>8dH2y*uGkXZ9_krj9?7}so||%>d+yA+ z^yBAl2qq;tjnVB@f4%+52k=i$CgcBl`c9Hl#urg3JSJO4A|-RQ+4#2jCy>jvq!(hx z5bUkRs$^^?k3tpkW!YLzGKqBEZ+>6g0ZAU>-w)dYe(&q zcK9AFh<)|=#& zMD|9CJF>lZJ$J^jf9=uJ*{AL~o%#GYk8Xay zYxDa{m}6h;?09GWW8hZ%Bu#$VP`-)1^QBL)P#RVVSaJnKSBrQI?)pGRT3Y(+PuHL9 zXAj=k^zl#UwF10|0A^89?AxHvXKMG>vgZNHD`I$lYf|eO^ z)eBZ#K`uwMaB&a466_Q9fU&=j8^Uai&>vjHL4cyDf511sS5~OX@(SJEE6T6`EZn21 z_tg|vD!YpCZy#ycHJv3iDVYMp6Ik09FJjBFw2x+@bAQ7h!e>6@(KyCTE=zA_ax+Z| za=FQ-by!nuHf@U55Dp0oLTn@3r%eyEd-Zj~k|o)xcA428@^_6mGODXG@H3|{^Ao*m zQX?s)^@cCr$EwHH3f=0SKKzb<;umcF4JlcY!jfAd5O&o&pjLG~`5L|xf9|t&q+1gW zx`sQWVH!QB`JvV@_CIE?St51kxfu*;qK&PS@uaEp#DdXWkB`%*T;A8bF{tzgtCyDB z6KEtIa48y0KnCH7GXdta1DB=&K2!>-JxD>H62*ynJqbK0^@x7{;#NnZU}%XOHD0W= zgi017vunE9ix#S3_7JrV!IXh!OhPLGNKXdEi2@XyOi)-t(u9tw!3QAnI6Phw*tB7+ zUR)__7+%(^PpwSb`_sukV@zkHB~{biXU=vkpY-KVcV_H^5|^ijUOqR)Npv~AcfIjS zjkxBOmv1m9Cs8Eh$M5YZSCXP62D7Moxc}5sPhRIpwI>P>zI|cC_=k^df!au#UFYt; zsxxD=*E|;XwHtkk0)1LNw(DuE^RxY*ZtlPFsi&f%_D9a`t{H!1>Sg?yJ24B?8T$DC z%3X!^#d}s3akw=%9$u+ka{hLyTPpX- ztFNiT4}~+0yU(0G)LIgp$G>}HrfTfb@3z?LcU*gHS`KxEzlW8EkUeB`l_w-!GWZmL zheI29I81@$@L0l234cJdWA@V#Pl0;d@QwX`;sZ(uE(^#4rXcjmVLsrSN{H_dwhDC0 zECGZ-I;eoq5a4UW=f6DjCiDS)fi0AfFi=_~Bs7@)W<5&uNoWjyvV>r^Fo8xtfs6DQ z_oYL>sD135gbKibPDuRZUpbJ2su2@op>0f2i4B8%O?#v4j&MoSlAC(4yXS%*&kc5y zNG&G@$H#{tE_LVSc8<)<{ zk8Gkbi}zP`-js3v=Y*v3J4b@y@}KoCEI0lD%n(2DNHiLWSgpp-7@q9RyRGf;8p+%v zW3b|H+cves0TmFtPR}ZS_dCVx=`OCCXKl zF!Z&taZ9v!?AlMwy1Kct*p`-NE3Rz5I*Yphp>R#j#fiB!Gn<&0e0%T4rW^BVgEtKX zAB!|P(gIEPzBA6h{Ka{u&)yVBb2LUC3l7{gNXx&mX=Cqp{7+2s_ZqQ8t(J&2Pb@wS z4q|5#s3b7k(2?2Z6o{lRC47J-AVUqJk1#>7^8=F8W8x&To1s+}*do~oXmH#O6Tpg% z)J|m3MopkS`XwRsP!x1Sh;`5y#S0+u3c!#CjezO`v5rFm`T@X7bcMh)elyy|NIvL1 za1SgJ5}goF2jfocQADr`T0f6<0&ck>3N#~t3dQ`uP$6@Ed{G>pLx*ATB!mY%QkG~G zhgL3QLO79=$5Hnh^m3gXoH}NeB9+XNGH}Od8&=#u8fa<`G}bLS`qd^fDH16XYot1@ zviXYpyEeZtskB;^Od*>itsS?onim#ouin}-0xmOBUV$K_z5ZEry`zdjPfAJQh)OCo zU74Fyd|5Fz$7U6szT$jelh)Q_%uG+miq7w6B;&6xsj=*>F%~JO`#D98)!y^l*6+z^ z?B5{^+M*DWkRtH9X}WZC)D>1+)%nM`$@(0(q1Ftkw4}v0Q&pIs%-5F{`IfswPpys2 zs`+k{*0;>serkQGuPf}z)GCY`b0$3+*fC!QX+$LcogrP+p>>w&-75;Z4h^O^-7ukF zb*QtVxkwbLkqNTX8wY$G)98p}a>k|^E2!+DP;;5AH}5U(uI<@1q94ECBXf#$1=e7h zOUQE9r(ZK%>Bo|E$ebUwc3|fy+7b;%_Lu;$jmKbGpn1@ zLwd-KlT}(A&_>JCemus}DX|~%6b6&QObMmRwNfV5nuNb92ue6i7O;@i1Wv+hATcxp z)Lsj(FaS9nTkWGlw$`pfL}C<*jXA) zOX&Z8K!VtT#Lt64KnpZ7C`ky^6|63Fl+8SrjUD!oP!!=9UGlhLu@pNgqy+ejlLGFqr)W_#^pB?*39_0h>wT3N(@`$ zhZ6okOmAUv3~} z*_=#YTtO-9b1O?!#&T_ShgA{M2xT_4eQi@=sisDgHQFGG)XRi5bJ|c*MvI@duE*SB zXVbSW4XwX8RO5woO?I_H*B(6b$mX)yG?@~^Y^$oIwVkPYMNhx>U1m{%ys=KIjSQ#y z#w#q^`YSrDxg{YIEm2#G^xRzhYkTpD3VZfQ&w@Z;;&IZOi%T1(8??zzd<^MQ&_Rl&KxE6$ zZrwXHHEVN^D1?ZzecoH1Q#cC_3YN!@&XMkp<3!v<&lesg-U%o5iZG;|VBrBo?nEDr0fn^*-ZtnWbIN+%n)iTA9DLm0#1rWm~JoGl$rj znF29W#1n+G*aG{oKWP~MWIR$OQPEiRG}A-cwoao<(7oJ7a~F+Oz*I&}YDY&{mn{~B zjCpNFjiW6e%!#5LBNQ{LgGOk|>=$LO^4e0N!j&Qvx_F6hZ*sC$!VBbOBqx(!UK|7- zX`if{E?W_13Yi7XTybwuBw?}D7A7xZHtG@>*h?U-w*&D*%YQ=b95yE3*0s%Z4H4^{!I#m?NOEZS1q5=U~kz%XM zpzHMRsLR&que7Gmmy>zI=yXWk*4WUh4oyde;0QaPZmrC0usNe16opb}OHq*d!st}U z;LgSWw)%I*i508wvP?|mRvE}Cm%5jiNW~PX)Y6$t(p&ri7kbs8~yr9($)CSEBYrV z2gj?XGDBH@EUL;V%XX(F+RHSmbQv>A5N`C#eg3SlJhiVt0`b~vk5n17P-S*)RzND132 z0g*AQe(V|{EyR0ALNLMD2sn-LX|!qx*2S1$vdH*;bsb>*7c&L|d?fwG9_9u8ndp$n zTT8qQuzwgs{04$y6C=2E!!IKs)I-RcOQ3hWU!vRCFwvXDUJ_v%GWeo1MkI+4p9OtC zkVDW{K$L+HlrFv8;=6(4%U}J)d83=RPg^STC-xn?vGT^AVv>$Rvk@(&kTNcDC3zRl9-UJyy4K@QT&{G&J ziJ8UbvNfr4xy@$h@~nnry4r@Haa*)Y*R352)fXO{UtQ9q8sEOfZBF;Mj(CHH?)Dt6 zX6dS4$y%ByBsNVrxpJjvG}GYzGIx0G`gC?y+p;A!0!A{qLBtW8I7u{0GFPkuaZ_i5 zT3VG3LvtQ}JDb7F_{;oc3ott#J1IFVOL1mrb(B>V;mIBY z_%?`mT01L^#}$4clGSh%nJ_0Tfsi8Z-04wOU5Vj0$$bN{*Cn!wpS@CMj#4<%pRfwNA zLq{1B3FM4MtPyca0udKYHwaT>WbCpn;?W3)V;T!$o4|xG{QxzH;K7LB#<=cfTY?qC zmDqz|gy@r@PlIT~e{f~S_`PJy*qhtV2F#4%tczZu|B#~e~38FS+h_r=U z>9EQPdvL-RpdE$ctQ43ndG(OdUfk~Lo)UR;R@T+6%<+n*x?SyJ5Mk@{EM`Havv7Y- zXn%n#5^D|lJ3E}eZtd(4L&j#Jb;MP$Ka{h7zk+?X{0TNbtV&{}U|WUeq@?!r0V#Gs ztv-MaDM^edgM_cgXHytSDr`IHtepKs`B^p|0V9xDq*m{Z?*;MwjqOQE0_lL+G}y1v z_6>o$!qPb8srLNP$v|$AR1&P5-?eMLGANN2-J}gB*B9Jwf&4QefGb!CxwS^9~rrQIJS+{p(&_~ZHr(4=`av1vN)_; z7Y`oC#+9sOcXnBj5AW+x`x9KdLSXdCeYW<;3a7!8JyQa}+|94{mbAzlN# zfB$M|h@@p#Yt+J`xz@SkMXoe&fL^pDr)Eqice4Z4T;X)J+{9J1I4gQo#^wU3tV3U^ zR#MBO3bEB^wUr1%=8^^~R6iZ;QSv+68PlDNmL|SH#1~-w&tYpH>l&^1+rsMp^=)1f zh19a8I*)GEsvEZr&Fy;iuC9zV={l3s%h$L}mFu(XPdvJLZvCMympMns@9wbFTMBQU zdjLO=KYa_{?elAC)UFB)%j(J^XZK`*Zx=Qgp(!QmN(ajk$u^|q1kBCzOB<$gq$XFL z7Z@Y6-m8l(S+q&A?etM$T(qEGAbd}d^gj!IE0uNtnh?qoLR&$XdB+W>3 zd(w^SaaX0IqrQBY35#8W z&0|wLviV$HU9dXPlqwPVHjIre8#O5vMuo?l%#0rIFl~S3Abz!D(i`xq_2QNdtRyir zuq2<)5A+4V1BO8@o=!GK)m3#oe_u$zE)7_E=I&b4{qh?_uHNntBy535F9Rvy8A~@f zNKI`P1GTKo=C165{L|zlkgo-30jLfyn5MP*(evgx@7R z2;PgYLLPloboL(!KVno!Qz`~eMk7X4BXUxqIAKh00PK>0#y|i!!h!f|BO!?+rU>9p zh!ZJ@LBkJ(PXNvo=m5$W0zSdbAVBl^kYPn1W2t_GV=-|fj!|)cBk12~1|MGHVKGxV z9e#p!kRpovB0&@6hJ=jlz{EqQ5k zUrR6ElI_!gw_?D$We2uDwG1j$lhw_Ap6a|0A*7q zC?c;KB(KD1(on#Z>77DXvDe`3O-nfA6qMhBtX42AuGVgp%+ zobwont^j&*nLCCA0I-YtII+Nw#T=ykVw6*sjzT9%1~U+RKID)z#2ve76tl)}(jvQ* z9|_+CIuJ+-7H(oO3KU`BL@1RHnFjq6=mD?{A}MqwmLPv_0%H&wAi)_u0qoduV;2BE z@gzVo3K<@darqO-a4{Zp0y%HNBOhGHfenG{IK+m;T@~O7@FZ9dXEUm{t(lrFtlczI z@6S)t}=G&y_l*zXUV`Qk`scG}MOPG9%8 zTSl`nZ_iaV`ta65D1l5aCR2o@lG-=cvt^1^PnQZLAd-J#ejN)ul|SEQeg%K}#Vz}@ zN0*(!gb$g=m)?qh{oq3X6(jV*oeFHE^ISuEkPSiB@Y);GGX)01Q^ z?<`ZLV5M>gX&r^dN-5NcTndGVElU-uf^sE(Y~te9nXgxl|NX$$KhbY_{*Slb{M`Es z&#ar8*f2Q}y~=y|#)jToZp0GUa;B6fmGamut`M`*EFWMskJ6Zb#ZNv8$!=8-ldi=- zdl^+;L}eBZtl{$W9cpTt>QI?~&J9 zthF+a-cL8Wpnxg6u!HH|b|_z;W7!@Yio8ncIrcz@92`7eDrJYwo`gvk2rmHrZIQux+AOnVD_c{N5F5~%WJxl(CJp05%NkuWtRMQpJ%_uP`lu$1^$ zX0MO@oWN|H*&cvyNL0BZm6cY}XzEHIEH;L(Jz1#FP;?vp?t$#kbc)nny;-mI4@sp% zeyx6UwOg7p9m*bX`;Fa-41M9rYs1Fk!SpUuV?`P(Rgs;OlZ`)PXRER%`o2m`)N3K_ zh1|^Hr*QFkvSwXZ*Sd=zW6QZIe2!U;-%8R#4(YG@CbCp)J9dC%FSb~U?IfOyOCiZq z)5O!V!GJb&<-9*Rx2j)Nm1F2V+b6OK>go?Ve06;?Szn#caj?ElU=#J7?KR|7srsvO zll}8ohO~h}*|azA`HkN>>^-^X?p;vao7RiLO!{O`uKrhAf^a#9wRtlY|@Zp8XO3) zNRf;0h?rdjivX6$1djr5_{gglNyBvXmwm9=^_@%f%^PeNot%Wmo7^vK_{ZUHP60zdtW^^WnWdVb-CmcBVaDUgBJG z^1iZlk;*-zVMYm=p4BjvQ9FKM>k?H4{vw^?t~3e)vLsP?NZ-&@E=`s}rLvN$VyVQX zkl8YA`de=uy!-2IOU_S9ZB-gynNh~h_hD^?cQ&O(_*J5@^2}?l58QG z#n^YGa_ZF+E%+a7F0)7gaW%s7`XUHJmuZ_?D}*dLj}$3>rPp82tK<|`snko?t+p>* z2n_y+2{7rFoqwrwR(-s^?w+p4@!bn|q_wrD>8hgo_Ja+j>uc&uDVr)*6-Jwm^#@4y zwYftlJ4fza5u8pd?8tRWbQ)5?Y7e!)nu0 zfJb5o%FF|EG;%sYa0oa;fIRGwcRnnhfJBRMfRJ(lp4lWStl$770}6q)B+g&O$L-()T_Av&WwIDKgL*wKVlYGd?zx?r;eSci1F&KvGj^kgywdQSr&9XLF3owa_ z%xMl=M|kV9M}F9y>SX9unxXqv_Z@E~zt>VTcK@imaV!+AXg&I1Px6ZJxR1P_r&#hCrJlV4|PFN8~|fi3o%cj(}Bv8)TSBz%&MUepryq6qKP!qu=fd~B}M59Hi2fiyZqW?lwKrtqi zb(j=r3)kY8;D?x+fS<$Lo<0ONfwt#ff`adY<8R=l_|4zpKl6F4q$EldYDuxUy!T#s z@m(Gi=44Q#6e#M&!K3i5cORm#7b1i0f{&=LVdTn9VVAB?C$MByXz8$lDx_<6+{GD6Qe>t*XII<7C zR^8h2r8V68W#w9TuwOT{eEE>BKj_w0jMj4-mX&JU;W6{RBNXhW)m>X^chq%Gkw!Ag z)e3{F)TA^n$SO8gUK#`G19zRrTkCe$dOdaSh2MFN?h3cbTaM+AmgLV=kChb6L?EoorM7jtu8V7Ak{@aHDQ@+y^J!~6Ib$M44<_-Q|>M62|jtoF63 z(uHhsUrE`aA{Lh`B!NRbC#xW6PLjAy>|{v_pWD8%m?h#E#blknBDW?tiAm*|tK9DN zbTTYYf=;BUOA&iGd=3Zu^TZ275|G{$op%jD^^g}pQs@NaOoM#8#5^aEK)eNu6(nsz z1Pvh`@Y6U;1zt<=UqDoXlKBv}60=Oq9!y0FGEBqFArmpt6djq&Bs%8`$b9iM{^^%j zNg~|c?_qq*h57dH`)X%xk@fJMXY(2#KYx{@#I^6teT@TOznRz6a{~Y8j~!}@PUkPs zTQbagt}s`eTCuWkDA#M)+h!_|fZCm{5@u)cfl5z2k0oIqtoT~%75H-y!hZ3YiLpl} zn-BOk#igY>$IcVS!C<3;;T_eD{U}?yO#uqbS3=jt)#u zC=Ay?s%bIHJKOB7apIpQ2r#fBCL$}M6q58+fgk;{gtZAf5{^Q&*Fz8s{Z_*73CSuE zia;5#EclK*;+r7I1Z;`X83~nc6p>@>gRlX{Jyr=@2z)RU=#0MU<=0>$&=p9%h_Y7v zZ&zbi(8GwvC>sVe+pTjhpGUBu|mSydOEWzb5Qtn!Um zQ_Y65l|6!R(~7316{2Ew*#`WAa4CaCj&3N=4LU9Em5p_f>(&z4aPjNPjgiR4%Bl^K z$cC!Asj0f!>1h(_znsKwk8Uih$!zoa+A`Da_WXjf4GRa>lm1;cW6f7JWYn%H&QmlF zR%}>!@yLPq{>%NO4;3y6&tPm>y{4L8zP2K=5&!1DG&|I2%v{mv9|Fp;zp{FLxr4k1 zQ+TedjLeov#68@`a>tU?C0(r_Ui>7oF;cZ7wOHMoS+jb$M{H(kMVad8hO&!g8>0jB zvP$kme$$E-OKdmiD>hWabFte0+77!$$LsVruP6wbs@lpoRObwUKnjlK0)c-qP>@DwBk?UX9KyN`oma)J1%cx0EdwX#h1Z~J5hJi#-WJrn) z9=%Rn6C-4)_?u9L58?Oyw0GAJSovd*W98rP+WRAZ-@|7x`{x_ieS*Jn#~t{apRC{X zIc7hbRjAjs-ndT4V+FUZKKA|=p^n2*&Yp;76kJ?b=Wy@&b}YBbqj%a3mOO4HwL3cpR=mp$7wI ziiHE~STb>>S|-*A1xBdm!(v%9i3Wp5?)T$o_FllsAHE+8e!XSO*Z5QSKaAgdVQ&=P z&UxlErhaF7^*i_{H=n`Z_4hbz^2G-{{cTvRAB3x#HJdXt1<;fv>9f4KZeOc&WRs|>7M!1DVyl2n z<8xJvym!6;(e%@e3a3exA=eBJs4N9WTVE=y5vtV%g=%G*nwt!zz|~xEh_VLryh@+L z5)P;xEpA`X6YgtHU?zMEIr%dnCqEZ*I=djP2b_G@XxMlJlszEO1%7^_=<(|{8Yce zkVb#RUZECeU}a1pgSR8Igxkiksax9wpbYU;5wkSsL4h*M0{&RovtqTC&(%P=V}Vu5 ztO|QVy5wA8W@cUA!pYaL!`SGdA5T;arr(KGV5ArE_m8g{&lw)U>=*|MNBre{;gbu0 ze<;Nz(-bI4lR_nxrjs}|(r=D|31;S#v*5>+RC)31jcf15U-^9fsNSQYC(77~qCy9Y zlTOBZi&YIFqe#oo7_Ov{cc<`mc?xSaMo|h?Rw>`E!MCTTsPh79tz&^rV$wbJT6u2Y ziPirPW#0iNMU^f(r#epOoOAB!G@W~L&N;#ilYt@UIOH5fL{UTuDp7)hRAo1kROsyqIwi_laGZzvqEkx4 z?`C?0Faurs-F|0EW21bKm>6CUHKI<0qu4bGJ(I|1$qbU*0sh@nyu@p)L1fMc6rW7Z_cS^CYocGC< zvnkt*35pzcUifnOq`=qLW{N9)5Vto+@Kd9dYXdI`bV6A~Oy(N`*C3CM^{! zRnolmd0oq;-)%=M=mskuyJ}Llzd=&P$4w$ZbBdEJW|^wzK?Q%U|)AXf!`eOIZb(+kJNOp|B2(I7f=Q4D>V8_JN$ zBP)D*z4$Tm+;{8gO@cC~18k}yu~MhBbUOGl=)^Pxg3AfOovO4p@QW@<+Xm${UjnR2 z>B%5@P+*U}`_$`BO_2ezXh2&6P7kMH2^x}YhedFT^`60XbY zES3T?d8I%iv8Lvv*|D9Inj28D@zgpa1Tn0bP%;NhYib7ZX%Yz-d-2`iOd!5g2r{;8 z;Sm^WV|81wYGF;@%z+F~kz>M{MO_c>$tyfN`S?jCN3WMw=adhPt=H;Y9<$PyA2sMp z8++n<6(e1kA(Y*`x@NqXP4-0A~XUNy}XQzqQKQ$f^c^uyOr#CVi zS6)R6Mpxv0N?xP`Px7xJf7P@&#+@=L3wb<)pA#uI9UpMp1x0<=?^em#-(*4N~^CB)(h8)J%$+z|rF@**#3-&5iw{IQ0fX_Dz zg$i`ecp7Sg2=@*)s@qp}&)+}C%Pf6q+olIIYZjCqCEp>JlON=i&HLycbCy!AVF_bP zCe2?RWAV~B#Cfnq4ggFE({Lx_8i1=AX{#YH_9%k9PO#8`l!z;xrJAtf`WV!d!)ybv zQL~AQc>HnSe>>0lU(S>M!GiYR#!97@Vu1ebp8stu;QH4|jdFzMDE-3`H{i$up#Xy# zepZ0M;b$jb2eYwsy4x~JBk;mKN1 zrFZ+wDmCtQ5Gq?HSu|mY(9R!7G(d5pJCO8=r;rIcjDP&p6XdsdAdyHMaymm|kwFhG zZGli2cDutuA^t{wf8((q#L|S%myn9hCX<=0Tk(&B_g~w*`P%&l|FMF2Rwzk$y$OlX z2>*V(af}~tJc3kuePL68&*rf?rjaF{jK99q$9)#z{pI!Kjv&Q36TPq(*Om zmCm)7&FRosIcy=E%z=yefu=&e9z3YkKnZcjQ9Y<|RCJYtVmkn+sR^dQbtIHp3UiNB z6y>y-%?v>ozi#^Z-1O~;eyHo2Y15wRI*e%Br=Rp1zsE02&*T)oBTa{1_Q-|^DcENj8t@7;|S{qv)Lew4Ev!~777GZ>|SYQmCIHL+OhOdZA+9OwVXFR3lxk(Yl*`N9v5 zj9u~Z*7j#-&3d+d>&Gj`9{B*>TCyRmi_Fc=o*U7HH%$Kj`N{PGk0-G9bL8508p-a; zg@1RE-<;k@zWe!Fdaqhq1Ldb-p?3fA#jptjOc{roGB1#sQP6&2M%v=EEh9vRGS5>| z1^C!7&jKEUxd#YjScL`bgkIyI>0&+xRht1<0dZ40=&;!k<{qDQgXjk&fl>tU{u>2J zic|~}200BdT@2Iw*n~NGo{&wRvu9S%P;De&HcX%0c!oSmK6(Eo0c3kKrAN1B=n7v) zp#v3DraCerxf6SH$5fe>wrDV~X0&}jSRRi_G#Uwfei>fR8D3u)UVq3}GPqE9pf#>^ z2oacW??lqGH-EXgIy`Sq=GwW1lUJ_KiOs+5nN`n{AMHg#fm##Yy8xMERG^_bhYH0}Ft4bev374CfN$Og(9*?MbagGd*N?JG76a+MY? zo2-;*!6yG9NaM9IDN4}5@&H<)1anI3!X^+UP|8%BYLLTYwlsiGENNiVBc(H?(V?pZ z23mknY%HPKF~6sXDMe**5FyLSkbMj4(nov2mdf7o*ujI3?Lh1oX6+?EBIkYk0h)&R zw~c@3>-A6Gci)rizkX=^ZHN#1=2TYKZ(3KjX+Pk+CJ&NVUfgBbhuZeP zhnDQ{?&zQbmRHy{SE!te%fEhP`*NMG_JjNeL#R2vQ;6A-jN)!wtBxUw_u%&bR?=RaGxdTHIPWedss z$X_K#4wbC^aMh|0*N!`}wr14_>t;SWZQ7$VXPllk?ezAnN%kCVxl2~4w^^!*o`K^9 zvFI%=la5W8aBR}FQ^De#cUCQbZOM|?3XA4h^Yo3rV91c0Tzdi)Y!hyNZ{Q8`^i;vJ zPp8f&p}FR4wBUz{*Z#ct>t9gOH8h0e6-_aW!?dx{=YhA#+^fl6Q!Y#hV>1!@|c&8pMcWVs- zMSAIinvya$L0ElaB?l4o;?f03ye&GtHs08zRkn=Et(=i9G6>{aI!Bf1pVqC2mC%b- z9;Ha-QIKoZafL_|lY^JQqLL~t%Hz5mrAU_pb!n^3a)Z}18;yIlqvKEHh4CJrK`zU* zJiae);|hPgwypR%lz58Y$X)sd`Q^c;`L*qTn(*8ggf<&W>St?3%2gv9OVtX68h_Ad zBfHiY8N`Yr1Dxb3tFz<^%^aar#y3XQ-IqS>DB3&9QIXEpDLHIuk)>{#sBZ#WE|nIR z#<;9VX`Wc`Qxi1*ZFy=pTcWWF+ivgvYk^&^#UFxOVur+2_`p1CjQE3&6&S_J0;5O; z1;|I*)r*0|lu)heFQ&Z)k>jbjafH|aqm&bSxUCR|G+=U+Uq1!}0UL0^jb_83ilqZM z42Eh9A{eT0Yu(fyhs~DC7lX_(AXapx0^)GuP;Wer87lOQ0izeb1o~Ur8SyxVPuK-Y zJchg!fC34Jy8#jaet-xCOAPt=3$+W#8wO*D0<%KY8on!>4J#bv1A}17hq-the6Z9? zp_H1y7wa;9*#vEKny(8@cBxHl)OTYyEOL;H2Sm8P{$W@FOg%(D^HVW zepsK*sTD4|ggg&Eh&-1T32Qm&>wh56JhS5a3x)SARnqp*id45=C7)UGEP0N6^RP>_ zF|m|I@LxoaerYwHL~E}|IgL5(Y}-fVIP%J4 z1Ges>IV&|2=Jz#dYJFW31PkZcMup|}tWfUa<@tphWASQ*I71QbPp|Ux@&a|!A`$lD zI-57Ns(f9jY~g%zufQPYWLTeKa|ozp&pL|kLMK*yPQLu$gXAlpuRtdd)arMLwIcJE zxzLt8%w)HSO=3wv^p)5xQ}(8_5$!qubXJ-XsIScrIP(5{U(_BMc&!#yp8Q=~)6g(C#BZyO#m& zwu3~1n|IHHRLw1rU4b(zKBH(iwr@a(2or!A3xEaWWuTbDe^62kq!A$Kz-s|A9Z<0! zVP-rGtQdB2jWL#==EPUR5I0iG8!7nzv~9vmVo>-R@5z86q~1 z{_J0~6XP$x)-)}zR3lT8mJIZxRK?|*%|Vw{&yn!03pXxy(Co8UF80wGLQeA}Utyuo zS5!nkR?^*F0v}>+W^r+50QMZoX>HBPZEL$0Hpv9;h_SiVJAZ zE^znJ!M0m|k@E(5iu~$7Y2;6L_b(*=HCS0QnNA*IanQA%V*JC3dqAbD0g$`|Aeo;w z4tkcHq&k%VfrMEerno@4QhR_@U6$lT2F#W$@Hmp2J6&~wYh@> zebKz>XJ<|QbaM0R+8L)Ok2+LadkC%b)GI`MChv7Vw{RdLcSwJk?h8s~JcC}D9jD3U z%1TF`ot0jl>$L>dkk>d;U6G&nS02+yuBpFi)cn;tb+Na(u4ux-nJ%AB$>+)7CwC?0 zZXI3P5GhyXUVCam+bx~F!rJCTvkO-_qkb!!Ta#zk`)6z>f9WaC+P++6567b$W{!UG zVq1H4(BsSw$88zmvhw&ti_RWtINdXQ-{`vbl1E#dZGP2O7Jb^m`!3U~O-ETg3y7cLz>R&Npik)%Li@$r9fN zK$HPML;?``AzZBqqGFa{T4oy#f=TgO3XD>al=9fpfn$SW1&%5OKv)XeC{7MdL#}^i z0#v{s?YBLt9m5VQOd)|dQec(h%s7#S$C zRUQ{)&c-4Wa{<5A4t+UDRH*WcC-9NbukyXjpi1#VXOiZ_w|ol42kA|MDSKI z&LXNodKlsXm~v#d)1(Z$U5XRZ@c_`1j~dVkrXRRl3*V5=Hm|LPU=>Yh2p`1zY6p<65P!X*xP}J4{j49Wo<7p^!OR zRo>~^T+=-BY)A6;a*<|qS9XY~BX1_R%7y6f5Lq-?#o#4v9|{tTYdV1bhT0_H;7uq7WGbO5HQu#79eZd8y=4OX6rn%a#<9; zPN0`{;!=O~+G^T6a##KhuRhc2*BnM zY_P&Ohy@XVB59?vG|5H92x!w{>hKYU2}II zJMl>Sg%?hhl$?6uLi-~pj_sa9-hFkIqrxF^HKDg93Z5h+hV-KHP9>W5I1)cwansF5 z4>de~c3&c~@9f#eLq~7Esq)WA{K&jRH#bSvlk0&k3M5V2k0qb2FUr&xSWDOjgU82F z_#pR;_66NpW>>pfuDv05m6+|;dg6Ugb|NQ67RjN+xwD-7F%YRhjK|NQy;r6@zNMjI z%i~k7ko{*KC$CmS0>oXl1e;SMV3G5bV)Q2o4?J6nPBJJ_J}q^d3a{)vf!4n|_T>87 z+Vv;LzDf?A*n6eWyhnYG%Y754bldQROaR;=8T{73Sq^Ow$Av7u$%4RBcIwdnZ6dM&X?CI4`xV4KML$?3DuJnN4f1tDu<=>4OkkB601)%Cf zbwC%jlm8?iyqmTrn~?z;vs!15*8C&R^=bJEzC{>N_^ZfmaGtl6GhrXsR~MqAKtiB1 z7<7U}0MWy>KJLB=oKi20b|Lrr2z7rC3oRJC0^g*^7paMijvQ9#knv1t5X& z6jmm)jWCyjywnnMOR>%}QlSAh4TSyokK_FP*O8~AU>6=9{r)g!StGv% z$kdNy9eMu#Gbg#5@7xVRtatqK3v`mR?IvF%zc0LuijUt$WwPiDBG-{@osifxi%*=MPOj$Nv(>Q~f z-Nxn~+Hos{cN`@@c^o;9>4m(;5c1UqSuAO5zR<+eRJvT18lFj*-y&l$=umGF1)F$6 z{mf^Q=+@tE-SFEc;hE54lIb*ZMPpYzY5MKJTO5I$V^@04&v*$L9(Wjer*@1c$vb!b zC+*C*ac5B4t~XG1^I-f<^5Y{9ke|FX1FcpIg({|gT)smqv~{;$1bDOkdi)10`m=ETxd}Ui55dulv z=a9yvMdchudbBBk@^T46Z!+nj`Eni#G(n~#ol{-}XE^*Nb4CS^{C49LzipDsGs3on zn3f3X>_qo(`;UbfR+&U#(K#FifSYdtv2FokEd}SE8wxCBLs;0jwB=xd-v{9i7r~7C z0i>MaXcX+5#+HB(9ruX@WMqMEg^4ti=``7(REQZEH}o(AZ5^mIbS#4eMp$Fqph*4* z1*d2{J&uVv7~E3hL2@?sKfw(!_BdIT5_R3e1$k;V96t#LHcIWsXhX*=BIOAO6lAh+ z!ek1?F}~Ao7>f!Sg$IV+N@R~Rq;_ao0n9?FgmT1oB~Cb)OTM@Ne&j)$u3P~u@Z7&2 zdT`DCV#l{pbOt>Z`SwnfhW4*tOLhU+l4SR~^=Lo&Xx6N05yil3Q_)SObHb|9o$YAj z0hIBtqYkZ$(@MTgF1~z;TtvRp#&v2PNB@N~4m=2Mg7b^B-hrqx^BUZ0fcIwBeDX8$ zP;z2+352f-W^%KHaByB9R--&y2;|y#Bmc z`c5AW#%7lD?5C!NFU}a^6O>}Od$U=wS04kXmOUZt}XfGiQ>_De$|XOs+W(aEi67V z4r1J70Kzf=VLP~w2Eg~Q5^PuhhTyzRR7q)l6h#N04wLHEc-@riumKN9wLGO$1$Ke0 z07PL?1mqBGa|Q4P*$}G}6tkiB$05yyQZR5*BQ`&zBpBcon6{_N?JJZcUuoDlm4ZbZ z2t2SGQlc==psW;>---nzq-qgjECCRvYQ=*I4ITpiu(^UdpAu?Q>;Q*F!ajI5d{aCC z)|e0zjL~*H0*f)SIkE-E!2*pVjPMUj;R*QCsOw-P$TX(G&EXFRYrsYL`53Z~pmV{u zJ9Z$=dFhG&q;1}uL>;fZf;y6$?;yW>RCEz}5AGnp1ux*aeD%<3@7eomV&3wYEMv)Z zTRxQ5^Xgj%EZUr&lD2tIyy%)ceOIogZQX>>>P6f#PT874@3ch)d#h)bsw@h(F3T3{ zZ1LH11|}5PGvosbSRx>xr*?4t_onSs*8>i@>DuclswjR?5oY|{&q4@pK<34^N0SjqqTL%UxtQWyUSkZKJm{jo4-2N z^Rg*i7Z8>1nAbQVuiaEKozE$N#$pNIK=sz?H~pzX;3|sPG79tTlEADsLD`fxyT}<2 z`s9UtaY8A#xOpyFZa|^SaNENLQt~x*MpR$_$?nOIZ*AggneK57j7bN}{KXoH!*6os zM)NXU5k-NvyC7Ph<&nxVw64BL^PUP8pJStM%W~wvg z)fEHNvNDDiDwcO|tl#BdETT5dafzkm(jewyxumpha4<1~M z6vO#7*I5da1>KQYAjiSSsQ?`h(|juW0F!Re@xZ6TU}d;YkSEXjGi$1sybnPmMF(C) z-H5TRuEXOU^EdM9I-zZEervovIP0lzug+aPv7}jS>_u4+5?p;|iLoz1M2n8p_B^s@ zsC3d}|Gueve+AhbX}4DH-c`+JEjQ%W60MxVo@mYfor|mb>T7Q*N}l#)D=QuXQ#pig zv2o~@5`tjzsg7@hAjRU2%Ey3H!q385CLj=Y+kkolJ;ta)4}fwKCCfno(n^4lg)kYA z0t$jwLIXU*@*qgSgwqa(t;44&p@$^{${AQ;?SwUg@KzR$1*rnVJMbE$^|ZkfUU~cB&M}AYSQ#Ztq48*hfIN2Ph zZfAy@dw}cIpg=}Mm?!kx9#$Fo*jgM^SLq+ zB9K-n$Pi7RPi{JAC!dQ-b7VbLpXatHOO&LYoK3H=;-yCZ9-h z_%EXw`*ZFmm%YRJJ38>ljQh#u=%{$^#|zx8K8AVXw+p9yHjdsfW6y1do<9%iJDwlU zYCh5+nsvB3`4#aII&rc6Uh?F_-iJ}!0nb@-2>cGgTyh_TmW}~fdI?}D3=Z=Fs%_nT zuyuo?li~%~et}`0m0}&3G=o$%OrQY`fS7|1hDL$h^;0n8!bgB~4~Iekl41TpjRk2h z07@*dTfz!UXZV|Rn8`7AnYP{Dcl-X*s_jc_EAj^u@y^>?$A7Y-_?BBsA*xMnSIA6s zv8XfOb?e#ZlRI~PvPQyJ)X$3L?CRR~OMawA&0GHEo@1}}gfjD=n^k{bBG_NB=n6eg zlVfPpes1qjhouEtG)@wiwd$rj%T!*mM?Fx@dil)sw;q@n9NaT)^0^9n`}1ShKDr^V zdTA!KXp(RPYH2_!ZM`~sANkX|_U9j2NS0R4Ee_7f$nGiR*}^^TqK2Z@Y4MpgkCji$ zc2}@U+f5!$W_74`b^&dCuRRi*haO}W+0FV)#_n=u!aM;%7bKTd0P+GIsF4j`z8LIJ zQHY2i4SughfXKH{>CAw;z#rkorCu909#QGtz+rK)0DkAc`~HXXQHWyUBRm#x`-b=c zm{Z7i{VzLyKP1i+1Wy{Vxp?)o;;Q*&#cQV(S1%~-*wxpt=Dy~RyL;?+2&-c%}06&pXfy)5&<65V2vJ zEXh@fgMpN_v8CAmt5fwrO$bv^8)wD)0y5!AE5#sdREqvkv%Wnlt~;`k!a z9$=n^=L#kj?2eT92r?nQJLM+@M)up#n3dt-@RLAIRUpf0K*ZCau@bdrH0G^eP-A!p zt-9#Vauy4i{E}AW_IutWm%N}2@QO`F3!hhHG+D@v0wG5v=I{k@A1fKRmD^~D%eaWv zz9sb9n7Mwi&by>a*+p{kJIum?DQA0kb#?9P?Yq0H>+Wk)+359fS;9v&uIOH#JkU9M z4E<};)`c$ryug;r<_Mvad&ZQ@uRl`a_dzkBE8nb>dXy5u88o<`&*MdQKKIpXErToM z5PagvYhN&+-5tyG6pC&S+(Di%$~cWW4!HJ{N61gB=daC;=q{kuZwG>I)Sb^|aI2iz z85harZ|gqcK}c&Mk83m;i-{{jo=~hQH!9q0p0wHoiB+%A+Br!Yd^X) zhP2WC<@3k(Ui@yoJ5J|_cN_itaQFoN*_zc~J-0K$17Sy4 zF8uW;&l9L*AN&?*cMY3WJN()8vIdesqQN$xpR|Hh|i9kSim`^%$Zr-<%xAg{n75-6O)V>YQxq!F5l`>Ni*`or@H z7w9cqqMqO|87h7J+~5BGQgPPCZKYzqUR|#=i>=vrA4!IkHabHldm-Dd(MYunx>Z)3 zH)<*^t8CZ7qpf3KIzDN}xt}-Q0_j2gHx_qpfAHD~XN1$pb{HQJxx{p3hUhp;&Gm{D zto3S}L&S9@PZ!qz@UZ>Jr*xjWe1^4Q!t_AwcJc@EjyL~IzI)Iu)QLm8HZ1$kKPOJ# z(tWM2@L6=0`8xS2;mUphvB3$(k-KD{k+u0VkoO^>K|~iA1ox0X5Ra|wX}G!5Yn14# z^0$1vdhsRl?GxjckyD{*8jVN(lg*{&GQ{k*Oo5ycVknXqYld!G?KjothZp40qH`1e zkkYqo-Q3EoNtI%=uH~J6X~$m&^dqo(Aw zg1!l^Ku)5mym;Q|aQo(cyRswm1`BDd`un@sRhugwVA1mshgl;u@|HIg^=Vy z!y||>uAukJYdh+llj52^uhy6ELi~#}XZ&eioDXeL`fsmm>T;kr-Kf!7E4`nTCr;5I zQ3F71?OH@MAT$@cpp6Brcn+{)XWDM??j45`-+(fZA<;ug`zbA&3F>MTVH}5tZ1c_(O?8~~$Z94>RqLOOqq#9+y)f9_LT z&EBcCVWC=3+2}4(1Pe==l!B%^%Dq_`mD13Pgh0bbNX;=8GQ>e$utlZQYaW& zzcm}0b&jnL`t()q@MyioSwD@|JOdGhP3&liO(RlATr~PnJE~b!o(|RYXV)3CAXn?^ z<&2#<^r$gU;WW66YOBb9?eXwH@ei?b+9kVLBv*$OF;40G`fQOktZr@*33S4#3)`j; zG_O~!v06$)3{;nedPi55Nqr(^eWt5OEefi0npk{2Cluu{Z2`NPKc-!y(`ARWbsC0N zBo0`W3I-E0x_sWza!a1c-zJeLmjymCB7Z_F$vf;O7@klCmZ2y78#Eg_o{zTjYFcWe$y&aEq)wNx9cr zAP#1hOlH}fT$ai&l^M9UsNR(4MO;4LFL79Nb5%Zxz^N6=^TL5_P!^3szFbXPW)oS& zVk6&e$=7G0m%MRS?)V}|_+SA-n*pIK(l+B}+89rqfII;LFfi&&phb18?SGy zGw5`Ny2ko=u6}0gJriw3&j018$;OVo6I(Vmjjb-IZd}-3IlBY`t(X0I#+ZAdO`65fo>vZT z|0&ID2VIqRM}=!}ZOdepcw2d1yTLMYbaD$Et#H^Y;b`-ek)w^4dG?(BYFS~{-nH^f zg(6eFc5haZRJ}jPKF^XmCM~-0SfMO+3=NFB`^CA35$}|>K0v_G)r!D|Q0 zCjP@A7AYDBl8Y233I5^$4e$pB4~Uy}(%>X%EDqmj5M_%=dWu4h%;~VCL&w(B|M4hX zi>EptI1z>cIW_OU&jm4uHVV!qi|TG zQ8h_TZg(d8fj^7vV!7SCRc^M+MfUoa$)A^vD$l7Xn(^7m2S1&WUF4~4T}J-$O2_dn zt(^m9JuS1&PF?wEe`7_Uqj%k<)xEbhN9*dN8ES)0DV|=^ykTstX6sn|%=Y7FVR zf(4DvNMBK2ue#8-zJ6eNKAIkAi3Q4H!H7lYwCW{RStP%5-lpQt6{U^gu7c?F?kpO? zW#$FLHCcgx&YKIeZwDAHUI7RYr zOcnOc0yHqO6W=KX9SA0GI4Ey;@&RT**c}eyxGwBs8`^b)H2~KQ+hF7vp8DVKzwsQ1 z21ro}>^P$6gn~{}#DM%b9ZVoHH;(aKP5)d@-`)9fF{2QNz;Y3P0 zc$CP4x6gkInU5Sn=C|hGP97rP9eR5!zi|rr!O^4S2U8jaH@~y+rho01O^la%{C2h6 zuJgTuIN%xLyy}HM+G;2|QIeP_+yAd*g+#3pLr&8{s;8;htQr3Py3XO$>YUDpWICNp zuG4LJ8A2S7DcLu zZ1QmCjI*1z|8iz<@XRmUH=Ui4Nt+=f6wnr3j+bPI5&u&7peayqUX4Fwh1IH2XI50I z&V6)?P#ikqb z=@vujr~{PRcNSXyUIoAx;L^auX#-dR8?i=!D2mx3lNEz70jzvcjvq*kOfjqfPW^^c z=zv*5)(pi@K>~zR5g42Re&b*#2V8Ohb%PLVAhVR-2KI|#q)3UAm@`7tZHPNy!4dpK zP71Y@4ETx%OR0dcg7Sr!G{;kvJH=a5gHec(>MDURx`Dk8i`Z76Y2p1mhWG+b3V&tL(Y8ZSXvK>B-e^EPC}Yck_X% zCkDnIpL$>u_t2}0USD0&tX93MR&^%d(3rJ+HF|g57pE602!x^+$ZroFB)_>3g?Fx4 zc>2p4j)d;W<|$>8UEOuKO{mPJ31J&#NTyA}J&C14(I|on( zfdT{~i19pjn9gVaEEa1yMlsQ9)Qj9Kaq>Ga$1jwKOL&|-zt|v_dqt|4v3pBn&5CBX zOXyb$)X?U~(0*uo&&fq9izA!b{>ACawuT*rl}W@T3NT;DB&f1P$3S5;WR6KqIrr1nrv)5Pv=80rIg%Hm4z-LoD?;OMIq4#kDVVo>IRc2*q&PS5{T6 zY|rV5$9rEiB%#sJt@g0PG z6+_6EnW|pg40f_DX?Ld`PCK1;o(d`XBJCQbRyaVJ7>@Q#WnZPz05Nm`S;2Y-{2vzR zfre6hoDQHb6bXgnSU#j60FM3^5`yV1*4~E+8cPj#lV>V-g$UQGH9S76xj-9|n+*>Q(VuwVg~$EraR zY0zemD(yk5mwaZ|cFyv7L}88BuQL?;!pYS|nZ+7)K_+^FuNUid`4%}tB(mjN_2lJ( zxphQEW+N)Ta2TP2W1r3*|LFJR=Q}oEy;#^XJ)V_EYvT$TY_B><{i4J$P~k zL6b_WjWeHLH~s0|+08SvP@95X3@5duotl}vB$X1IrNBA}``k$p@@*>w9x3)kCI@m*BekLp$u!9W z1w@WeK-BR0WUU5$qNQt+8#KwWooIm>sU7j6y7j(8Q>SV_rLI^D%gpSjz9lTOOewKl zDouVUfuR3Q7wqZyyWU+_M1j52YQ&tl&E8U?c<4 zBd%moat1I5iW^X2xe!)^oVXeoJ|D{)fV-)`RF*Ej3@H4Ksz2^^E0F*qf}0wSBFYbg zF_yBgQF1%>iH-~fV^T~BWFrG1g$o$+o4?w;`Kz0^;$>3xp!Pvg$&3HWGGkJg8gO7HH8bm^tP@}J_)9Kw#RcKm&Zr2WaVoG>Qa@(Tk z=FWX?(GXs0A~TOnG;Iac!*$wSill$^>wv+DAcUe2OQ9RSk7ik z;eJIMHkGHI<7arJCpQ1>=G0@}{I|`tC0((ugL#vRy;aRKngVv6QmR%JRan$MjixG| zJe>ef^C32wy|1QMAM3Ojsw>o5I7b>P_OvdYv8cK8_Ks_}-EX@8%KY;S7Cbk9{&Nc! zoS*N>?T0uw%Xa1-@*?>U+88+g%a1aM!$vC7x=q80z5B zpat6Z01q*M2Pss1T%3}NvH9k@Mo86q9F}A;v8SLT#mX^s++fFnukdY{2LGn={lWgD z0Nru8V!}w>NbEzUD-V+&URtu`60#jWglw0VF1(Vo}X`S zxcP}`t6yI{;M zv(HX%Sl`yPx^6~O{iLwX8aAnP=1|$9j=rU1c63fYI&RsUt2Vs8;7*i&WYgyd$IQ4u z{=5_J_x!Bnhs2{Bk_}KaY!mRogpbnTD-oP7v&I z8U+<*83+9V(1XRoY0B_=sa$8O|K&)cGu7b|G>nu522Ts-w*stqz-XX5gFcY5@nH=E zB9DJ1TgjIWY`n5Ywf4EGkl64Asz8liMU zuSRDkN&!{Sd&pJiI{fv`m&nH-dI*(Wy7}wFu;U@}UnkFy@4hjM_{85+ zeoidXD9=G*Fg_G^Bj2l8eYl%=Q3zF5*GmcuF6F^qs~Du!|4 z0?Khfb3z4eJf9$-P^bg$FG`DpJ2{=hVvdqQ{7T-tSg00_Yp6YrLg$ZeUK;K2eDb|c z4{fUhIZCC^7hN@>w(#rT-r9z7BDHWadEeFN$x8!rm-J55_{gKE;ZCVb-cNq`{2iY< zcu-w&a=o`T(m6Z7?LtrQh1UGposm{={iJ-AlV|_znFzY(t@i5U`l>|9#BB26vFLU% zUt1x1yarmu`b~6%N(zEK-TuM1Djm5+y%BjIoi@JT9I7ZXuc+u<-d>i!2A9O`|_85bni^#-;61lD-R*+E}AWw+UZ3Hs-pf6>$!CPWgiqiyWGEC>6 zU^?@Gq1UCgrcHrt=%t{^>;(q)Fqpw#g1FK&9Et@|%c*E%i1!*MNG!@;L@g=x7gT?0 zO7H?En3`s$6*?rPL`jAdhEPKG2?)4$5L`ij1{EEGpczgtMlw8`5T^{=I5HYK)==Ys znodOuuwrn4!fCpam$Hvx3#cp(u_rjh;6`f{Ra0{Wfx!q*naltXZ#)O>4AlGnicX?; zkzvs~gGptz)<&gH1#3(WxHP4;K4?-bRm6LBph*`_R!T(ei%Jz{!?CSoVbXrnqS}%r z#^f$Kx|#Sp>eG|ACJD5;aE=1qvyK>m_BTq2`~X=+rbA(8(AWQs&YzXrgl-F=_~jEi zN+)#a$5-@!C5hx$v~cybXl}=^3G)He@^JRO@6wEXeuUrn)WM@4JN_ma0I zA4Fe^6?&2C3A5SUA=8MtQk`_oJv(EaGqSU1bjEhl4N9?Ispd*_QjSDJ9-|$gU)!G^ z>8~Sd3r$6K;w^QyHCDrB7eNuhK#ZuT$NdOZXVVt7k10q_^Rzg6mk!NBsB=nFRb``i z@zm;BL$BvXoBIbY5F2$0rl-F}Rjp_p?`N=cN|QI8uTiy3FD$Q^)i_wy7mNkaJnQFZ z@8j`9!)O)OS=#bRkDL^Yp;;*blWI3xo+t$b*#Tni!koj~uWLZQeF&=cki)Gt4m z_H5eo5UBq*c*Sz0MtVr8S%y}D>-}bQFXSJ+h~7jWpnnqv!c7DroS!B&OKB)-mfNLf z@pXj<$Op}Qok9Vq0G*-$26JElvD6Zv2Tn{a@rnjRnQ0JZkgE8WTEiI>3g96@#`-Oy ze>hc}0$2!Gh~A*Br-&mQ88%kIwbwa6Y-8aL7t^4L&0@P*Y(`?U6b+M7z%dXOQ_l*# z2`S@I5U3e)r4{#DOkp7tDqZ|`3Orrv^y@dH0($TbZg|)m28D+;kGzr8d%1CW{q6iu zZ|cUk#==hyH==X{xE~<)@UvJ`m<}Xi__42Z5G9z*sb2znQZEm40$>47bKGflT3K?I zI1D~GF_`hNt2}is^~)(91H1xo9>f4;7;Y9B?#1e`j@&slsFE_0BPVO*IastXq_JC- zh&3vQ-JCP(r?c$-pDX-C2l-sYlWliod0s|kZaa?$CTOip@6sDg27OGgu&E%U-JpTT zdy%!hI`MO5f)2vL{O@ia7Z^RoEHR$iqk^*pn_((b@DO2BNb?8mpYCkSa8UTqo8T z#R3&En3chaSv|SA&u})>hYEts@6fl5DZk!MO3{VJ##40n)pyWev?h01ncJi#pUX?Q zA_0IDkFmy;QEIok)A=%pA9=Mi{9wzIEQ>FquR)NXNworq4MagchZiOo`m%YfUQJ4ck z6I}1&u~{68Si)xr98!18p%%NsjkzUGqHB2EM~%gJoMNMuZIx0FWo46Jrz_Y36<@-E zru8z3Sj1Jpobm-qK36J+I*A&Qj3-nv|5AEyphfbcHGrG z?L<3zxI0RI#E-hP3YE?tqPgNGVWuLkl~{NYC=o1T$|MXn^bixs)B>U0Xwk@I5}6V5 z!Nqdo)H<5klk4^54k6KltabY#%@$(X)BgeDN;8;UCqpFq&1v_gJqpG(DuEgsemF_eeQ19C4X)IN=)xz#2L@ z>_D?vNY2RW6=!DkG$%Sjx{{2$P}i&CH^}?$4VEi4F>AQIu3Fg}L{p$H@nkd^3boeM zmWQoTt)e2h6tb%xcy;DgwEtvAi7wQUXzI<%6!&J4Gm?|7@xD@5BwmMdoqfQ;pIorwGBVwB4>Da|vE&2t@__^7vuLW^Gc&$_k$Nqc1xdF=E{XjDN&Y8q2hyS`Panz2^eDBZBgXeb^V z@<)~GrWW%46T5buK%-ik)XJzoG`84a9J?gDj=6fdO4+);wq}e;8Yv*}f9W)BqLdpd zx9P-golzw%&s0cNri9UJ_DLloL@pXzyS!B6@Tski1=Ob9uXdC#ohUT61gNUT>(s-tVvPPh+BoKo*`)sqaS6FN0LN z1LfTMqY@7WEdVqY6O<1yYC$n9kT3zFD5#Ljq*Qb?o=nON1E8k>t_9L9?GM%<`os5- zU%jzl!5c^k?^cPo$ghY^N^u!W!Bt91*$P?mo705s>i5tZKxH=Pzd2#cC};kRTU*CW zF9S1LV>EY4r7h19>{UP??yUaooZhUgz89(S_Ku9Vm%0bJP^=ouWwJ%;0WR|v;@1^P z7JX%=66#$@4Q-K3vT)3{gEbwG-!srKv@#eOKh#n(yIh=sv@mFPUsj?o2X2r?qs7Q$ z%zwih(n1s{uH;BTKUg3rw3A@=sgxRMU^6!3BUDhiGmP?e=;{FNUf_PSMF_UY~WkpCYy#jaJYd-JvANuNLJsJ-yf$AfuO zJ)Ws~gCBo%q1F+l=gl6Uzx$>2q+SXo7tm*t|KqkOp ze?2k)$~M}m;8mau@JjJZ8X+DjxppR@uqfvF+S3fXhP2@MX+(LfSBxC&W6`9kr z`<9N8cXpH9jw`B1N2+=|Rr0Bnx>LMxT~$wCnNKv8AiwLmZ#(f|_fA8Vq@dasY7Yk6 zLtvawG}CG~G$d=c-`CSnV$TL&5B3t&FYK*-G}HR%u#}|{$)3J&jL3>tRK%0-9=kx( zCd`FFW2iYBaq{Mt&)A!1^EPJ6y|N!KWL~38pF6M6=3NjEx3DtP7xVMsB7;c)?ZXzr z2W!jd1;N}J*db0(6BRRqV6K5%1=u90X*gx`Kml^f2Lm=EQP|*9;I%xpnNY+m=G6j< z4eVGk0fG-F5D|do!5qe1J11-|Ftu@~P+6&f&ueGGJyLrNCAoo*j=%cPApkRU!~40u z=+k@Nd?b6Iu~w3kCABIdV~ZATiYP78tQ<*g<3M&o6YVU@7dRX){~b?1d56z!cM9Ug zGh>=RO?C%nXi<@NMqt;z@cy>j7Vq12>l3q2&lt^O^ySMJT z_}Z$zTh2YYY<{`aRa;uUJ10?7lgQa!U0UmsmM&WM$hlkk$lsBl3q+!2%S58*;c#mMh=hY%Vs+RYGxQt!@6z%zC9$rFJNl5P8L^%wW;L z4I@hm-%SBaEdrJgy%4733hK+HzE+B!Nx_NKYrIV0Qy(I=nd6N4G;Dl8yGm&^WY7I9og2atl8~F3r}@PIecefN4&hZb#4QL)^&2x=4Y0e z^D=!m&6;(SFEiJ&*@}!TX(Q-1G;_t7f0Ja{d%aVv9W0A>rdN{ez84?0t4mI zL`b6vL8O|2KvPTD3{bJq9Bz5tsut_m=xTB~TL&Rrhz&g_hK)uK7*IFmyK=O{Cwl5v zytuXT`PVy5R;#J=_2(P6zPN%;*O+-CuUEt~Ye0~54wlDec+DvvB`ZO0eH3^-7@lFM z1MdX;9l>NR#AjAvzjk1r$fQu3%Rmlu`zV(tAf?9YhalErVsA9m6sM=65~f~Zih9F~ z0=@&*yTIrVkaAct35@G0NS6u0HK<}L3=*~Ors*xoKysvFG2|bUlbypGXD#SWe(SO) zlO;0U$!~iX%-T5INlv~cRm6Z96I12Q z$m{*A@{X8&oWCC;!rSV354DVy;zJ=x*wvpVtc20sPBv zi-#B1b`%B|R1t>UtVkp)*Y5FLX)B%)sF<6ZJGUY*qu5qu4#w2lsLx>VMYZZ!&`jQ* zL)7n=-k!lH_Q5hb2H)2JaZeh+%x*12x;X-F4bD>>lNTDHai(OCs&mMlG8Fe{qa(fZUa<&7re%_dXh+d{d*CxB2yVl77? zZRQ;xx~@Z^=LQcpHy;Y{bc&AahE_ecObgb)EZ^Zo%OM{NlGYh_Dzl1O}pc-Dj<&yN0Sj|jcPhJrQ>ikt(FbH%|VA<*yHk4j7+PQr` zxH#fTjneG-+dD_EDc$hGYO=66&sAt^5Wx-zW*u;9fcVpS#i#WGfh|jU_ua}Yn?Rr^ z3S~l>*cP+Z1XOyXcc!N|&feX$yE8OzURbPDio^5fg*taPRSlk^emQw#T@*K^3g z*VLG8wjh`bk^m;MU>Z3=%>@Td>IZ6TBe*nr;z#Q{e3qyYMo9k=pgnQ-EN~kJ9~%5Y}NpR zj*b;o`@=FRU(IdoAD*n~Qk&TQGrJhudxg2T&f4({_qt^eO7gK!#aXdhKhh#q`xVyX zYiC}Q14{J`JqTros=b;psC3zArgJwP8duxwx<#it-y+Z3@+vG%M~t*@?UQ~*d3#V3 z@#u7(h$h%xuAqHopZLmnq{&i|XG7bB0=d|fg?0!bUKzQ*w0g6x)I&SH_YUb~wx`sF z9&+kagMT~QWXR4on6f{zsIhXP+Com=80_uai8fy6_9Ag-{mim~D{5yP z+{PW4xqoaVzahV`KQ~U_wX3}ZAy#cJghZ1STTI0)dL%2;985~uDqh{U|1=}Pn03b} z_)w5#ECs6l5tvP8@U$`m)MBvfv$GI<@}rC|GQL3)WCRydUNj30qcMb|>!wwpVSZu2 z0WJ#hL~z0-^~EqQjfsmGe13{A2v)(EzQ^pp%efdFrLrk{h*Oi1!YH6IMg38HgY@0u9+xLN z#RP=kWL zuv!sjy;7WAN)aGckAlr9Ci2g7X`gPIcx^1=xlnZ>J4l>BIwaV^6uMt%c^1qmb|vQ= zz1I}X(-sZYv`A}98oV-Jmj3V-;j5}lhe+j))JyGgsg%Xh>t)SVs157t!Vj58zq|6P z%(=s+#=a$qe6m2OPzXhG`NwLvnXT>YF&T9lTX5}0-=4PKxq+N;U0b=QUDKEd1Wf91 zl{cr{V@S9MmM!n~dBgJqgEvRl9n7k9+3h;DBIE}_ldXjKC06nktJP;kN~K7wP)uI? zh3a!+=910oRppyOU$AreCr_>_c9MUsMMSJ@)7#{wjS|soYhLO{bkXpR-5@Q~D`a|o zviI7+b!acEaGge_ZX0bYV`}}+& z1LR5{u;kF8aK#dNm%iVz zZmgFpQWf#JbY|O%`8tu6v!8m!@S1<)@iB;}*nAfGYjeIY=x)MuT&NEFYp8# zv!75yq$m}<+%52CVeb(sXb1wjp#3Y<{IJTYr4Xyjo4_E$qfd%%t+k&k@chG2mR^>C%vO2QV-q{v}>7db(+}= z5K&aDHV|m}ta)p4x`|B2pO_Op1u9U$=DvG28mz8=QeOq;uXsGrEruV|ks?#@ z9Vn^<-=6{qnAnFg!>H1%6%1kk{@~pX?6oiUz4+vjp3(~U;^hN|WN;uqTq)Q4gjX61-s^FFf-=DriblAWneRnV_uB`9*$j# zQEon`s{~P8Gzx$EFL-5GBR<73#*+j-Khr@WM%0`Jt|T*s22uM}+8x8ch8yj+@lP+zo_*od@$~stv5~7cEq{Du%WMgq56+i*g1tw( z)e0FS`V;1!n#SY^`LyDKpWgZqH5~F!|2?lRnLTY3)M(H#aP8|`lE3n?40`7lttSVCVxammOg4ejCUcp26_LiT%F=6+`X(ppk&L ze^7L#RxjmAilU}esZAV~EDPf+u)G2Nge%NEqS`6DUc+TB_CF&jB#_hu?W zxAIv^1IzA`=u0gUvz;yx1Zf>FjI{15K^q-mZ+moYZQ%Rw^m-OEN2`OQ2YoJHRajA} zl&DP{S$hoW^8GdwjUa^K0-J?S5Ih0jq-63Lfg&N;K#GOl+BW){*vcj*dCt0VHu+HE z!T`^u8@Z*$P*XOL%xRSB#Y*7+#}aC#2r-LzTCJuOHOh248T`(RI2^V`NFB-ZPW0>S zx_L8ReVNdxWD+*m7K#;qkk-8;mxy>* z(7C)!B}c*L+qBVQU2E~+0xKvFMhy9Km%PZ;))A?*B6pTt%>mUowtz#w^iRp`u`sym zS=7F-94RuvV5`~bSkzFU?tX+;Qp{z5BcRrBM59rOO@bz2iB_X|GTUUz#y2{Su1P`cF)zl19QA?QG2&g1T z7*eV-;K-Q)n-+%mpeK_~vFz#D1X~&I0k)+WOh6XQkTkLh$<$23s4KWGfLbaQ&Y}qS zGztxKOa;g>-ih$+!VM@~5vOoF5YeYl*Hmwi6#_KaNmay~6V#qUZK=Lf(-(NDcw)jI z9$o4IspQmUYHv$DI(Tlvx21YZKfvXCQlp^sAXroD2ls{-&NS*V1c7tq$!9>^m=kbU zX(bM2RUIaec8S_zlKphvYXWo@>I z%@Bz#(W@0zfk>uZXxCU(sFW|7Rikrq>VjgUfX9=1atwARs}Q1CNd$7XAZYTI)q9Cp zmt3V&`=#!nB4H}_x{Bybjuiqi(e0rbrD2{!Etyx!W9XYR8GMFlaaCbR%+V@TK7GwX zglY!`8e_|RZf#*MTg+xK7y?=@!Y+(WpteVou>$3w`A`zNRvVFLTC!`h?B&^QL9@#X zelUYV3wiz@^n3G~f=(Vk=GEr=2M7K6T5pWca|WC8CK@y8*~N1_rirJXGSV~K1_s(D zF7{W@OH7_Q#l!MaTV|OkA{RA83d07rR!Ea;nb~fmgC_*Ryo8ahk!5mw;#N0N#K@{P zX9mihVUty56n!Df(bO(r>IhFEhwT)aWUhFoS74O#SoA==GJy9O6O=+oaDe?WBTZ#TGzOrMpm55H$tXQ+CJS7X6%lym0+41| ziHMk*q7VoKkTkrA0I`hX7AfHT)A@_1KCWZ;5_sX^6%6bWY&4gqMxhuN00UJifk@TA zt3KUgPuN?A-tIZ}rG53mmZrulS2T&q7bk9bn|x8+G;(EQQ_I2CjxUe*yfc`{Y<48h zkV@vj&7baL-}m_jUd7m+(d}!0_#C9ezxiTGZ`16y?tA}yoB6`GPZHz}yF!~+uG$>j zd19=~)C*o^%-ys@ybYh-$KLnp&HYT_z!TrzX}_jJz~0xItF-++kvbCj`W$ErQx zcpu&PTc+d`EgLG|Ouji`ZL6)T@37st`{e0+s;cfe zeR6lAd(+;1e*eC`o4Q$c8=arvAZ^usly%`9B41qc@Afdt+Q$I{hPoH@CT5FA>ZXz z_)ehP0N)>&Sil>>GZ0UvbR9e|(!ekVLtr@V43?cCpIn%rRne*vm*|Q6669EdFeZ{2 zFIiqjnF#_ofhQ(oFB-3-t)s2G&hXNu<-XwkOZh$5_8;Dmvt-uLs|)h`?n+eEX{|Hr zjP32E+&WQW{vz}y30V1Qbd#w)LB5|Lmvs+0Gl%;6hB6(qyUU8DlA?-=B8jw^*qM0U zb-0(m^u7=?d(r%asFqjSKEqTu!>X&TYPqW~zTnlN!NoZnsw^*ACunB00j)Pf{Jit% zF5-ep*N>w1%u5M|-cWF{^IM}gO& zV=eWCf&67azQM^zMd@D`IoN-NpFEy?K^MzQ&r_P~y7x z(c1IpYbP7=ZHT$JLv+#5P_cfC&$nfLMS~&1apuhF)o6O><6I-#d;qIds9~`agt^0ND>C?4`Gvw$MKmdA~4*^KA08q&T zo#}c2DSLsBdJ-JQJecup#@iXc1J_A^LlCSR88CKma0dU8PD1la5ML6b2<)ffm^F{EtOcno^p*Jd>s?&89lX zWD1Tz05}G4aDN;W24~aq|35>dh@EIG1~-Sz`)7SpZKujoU~=k;A^#h>d%zjc^WH;a z-~JtKc#o$KI0wLMHq&<#{kd$81?@qzDWxi;TZ z)@Ik`SmAv?N1l8Cx8$wQLDJ^YIac?8^Wm@CL88qyWX+b-uJ<>e%Ke#ww);Z5J(efa&gYu`V7_qR7K zbPX+`EzyXzYKgWwlJD&=De3p-N2;|FHMpdiWrcqqr%K7v;@Tpg(HZpj%&iL;yL(I< zpI!>yD@;Az#z5WN9)Hkj^cB?>qqYCO8&m~44;Q3hB|)}ImE^@#uTT9X^ZS3_l*aa0 zrC#m+{aUZo>PbE}y$$*Z%6!^=`?NkN8=hVffbS&ivmV%IEtC~)8TcSP4#d?xplkjX zL{I!0(O?;X0S5$rp|r&b903NDwm^H00Lwf&9TGSyDC~|fhp=sH47NtN#!5P%@+BmI z9+ui6C_KPVV3`2^4s!t(0kBvw=KG&hN>KWmY6U|5bbFc|U~{Ui45qBgI(3EBIBXc) zV{1r61u3Pl1S&2t$V8!@EOkdfkAVbq#$eUqNe!zOI>!({4YgA!EC%-^{V??u}Dz|Jk@!sgz!UsOPBI{WczI%9x+@YYKU~}25r&$v61>Nehyz1o|^7-m^ zn_uYjG*|ZBFwk1AcSEEvgHx$B<`=oh^Dm$)kqxxD*FD4RXPt%ES(D(L>;?#sJsV7H zXsG@yr=R^xaMJu|@*+92O=uqv9N8{1JQxmgxqdBkMj%3fTGyYIo?F@uW9AiONta05lORCxvHf#5(VXao87fWsP z>fE-BOf&?0#&b*(^jC&K)qM<<-4A7)q9i5Xftv~;gwwGi4~n7^REK6jG>!Ra1f(WA zz6pX%?&w*M}LkH3J= zS@Ae=Z8{?vOeYXMo$$Ae`D0f^_Z$O3dZ1SD4j^2vsytIRZ1NPsN=7xV?TAA+y#Xq>lk%B zMIFyjN3@G7Z>Nqcsbi{j@_FiF9d)dyjtKm;K_|zk;|1z?=~L>oV_Ft+%N8w?DayNJ zs#s6?ECs=4&*XB2>-Zvige8`+B49|cUdZEhu^C8C)AN?_#O%caExD+^x$&w(er`*> zHxQW}*Ho2B6~o~Up}w`%5U-#!KyH*bv+p@C8N=6;#dhPt(W23J6aIiVM zey(-XOjAg%cBu(^C0Km9%w|_+X0(z{sNE`6SYEf+usm*@84lOGMwJRdZmvL~e9!K( zB|x!`A&3PNHkTdEh-bqmbZ6zGns^p`#4L9{`S+W(y6`Ng zr_NoqIHE6AS_{m&mU(lkg-(68QtVOt5451z5{IqM7ijXxg>6+0Q;mrmr&8pXkfQE} z8Z)hO&?X;FoeEN?HK~(7b%NkzAbGUeno=io>SRovPN(WrrB3qH$(3%Hkvj8Jr|#70 z=~Tn2)JdK?4W~|tpJdW+#IJ3%l)q#Nzx2#H_;T$$6A}|#?lPfp8JA0lk%`yA7V*|e z#LQe4LC<4J$&X#Ne&77~fV&`QFhS5(1zX6jnROCkCFzyYK#rxs+oi3@t!wucmNOX# z+bWst0$^j`3tP!3U|N{S#nI@7K%wp`kV0HfVOX%d2~gjX0+6R$s8~J@$N~)wjD%2Y z9t6-71fX^Yz;P%Doq}POX=&hkKqj<-Z3FWqW!8^$hWMzX1O;M z+e@Bw1cMGoD1`n72M1hC)|9>Z_cd!ie6-Mzx!|GCx4ln3e~XFXU~$#_mE;Szt@!+v z%Cg@1{g(TX?7|Vm_~lX_$JV}fZF|SswH=Y#+DN#zc0qzXf8PyjCQ!-mE|O1QTDkf_ z<(gW#Q|kiFR6*ckR#m1hM>qFq2eGca+>;jy<$21>QEslwm6zvoT|T4vLNf%d60-EJ zvIX_d>TTU7)5nJin%<+ZNF^2J{a5+czP@?=>*T~$ZCgF$;nDVv)uS`pM-$bda7|4( zSo11E`hR3ZF3U4Tz_~Dha=JTBPu4=9$F7V)aOS-Ve5sFvobwv^z^B0J$bDcS_YBB9 z-vI-;|H=3UqE2N1{v-#j6Enn~@&X1?hMG_}*cy(2(cB)0nRF9i509Yd&|BzZ^c74I z_(qtn1Gl%B;IpNCsk30uaKblbgrYJhVW&K*gAW_X1N{qJ2C6^lD$ZyW@+g4?_^?R{ zE^t#-x*Y6Cr^;jLEQGxjC}1*yhCK@y->GBF0d26S90D>gJInz#HC(3rTRT#?^HiBL z=CG%0rYg~5sk-UgP=kPbgYG_*r>ab~y?magtRVwcBmC3|4;a`jkcJVZ(p16aXPU0= zG2K_%&s0q)!X0B_)3qgK)9*MfJ-wg*l%C!XYg*gs`5-B9f+7e@p~U8J(b!M=x~F>H z+-l}?)pO@oU((9jeZ$Hn_OmPPWB0p|qm1@w>;>{S^IovLHA1W@%^Hnwxvw12d8|?v zkD1()xgg9bT%Wyq;Q1<9;-mTWufRh`Il&htpH;O5^szzx9rosuoT^U8DbqFG+$HyB zqc0ddI{cM#;i-g?dM%F2yfh*z|Yg;i?QrhYhjo04SYE&GGEcZ}vNm#!QL+&#H7 z?A~-ISI^LJe z-AdjO7z+5*0gcA5*}7qe{hm`qGQd~zVxw)^nWK}y;40P@X!2>laSr@)9(UQDll*kw ze<>sK{Bck#%3q#P4e!{q@fps=y;nbR7w@Upe~27kr`&!|-qVF|j zdHfx}k5|tnWV2@Yht||=`=~yz_3!(?c@IgQ@S1oFoYJ-AP zDa%yi$W-F{EmJ8pHkBf-o=Q!+r&6eSDn;&_N+H8kDt{_Lte8q&$8hB2I2lTYGbhKz znA|g!4`F4dG+RVzN2EW2(H3ARJAnvL0pf^#>&Tom#E1bucq#)5?e@!8Py;f+DL(?+ zVO&3z0eMK4%77&N(bC1#748i5{=m^lsy<|n&t9BV}eOGYd zY2Di7m*^2YxfsoUg*E<`@k>R4v@O&>%w0>aRjf6PJ?6YuR3O@5J|!c+zQ*{(qMTu0 zZs1$+9hwz4Aw-Hi=UkbRlqu6I^Py8IE;q8_D~Nrq;l=BnBP-M^xCPvAxaX5c38^djHFC)E_1Cfvi5=10 zRauL-i`J3PX+nYOZpLC%Kn!!c3qnd&G7m9H>0Zu-Gp;9gunO3PEXSP!TG3U=?vML11ngXzOGDDQV3oiYovFIUsPbb77>A;ufdn8!V_rA$n2F z4+FmpP>R_IsRk_Ah*B&v*r~C?3dC^%4uc~WRRXRFWGTd_#V8?lp@hB|2S)$rrRzJ- zAkzbnBGc)bEqBthV^#(a!n;~!GMU?AO1P@KqzQi1r}kL_vD^GvIwMidwRz?UWZtY` zW565U)^^R3!o3q`PhHxd*!#e%DC%ZPD%C0>IN{1;5gPIxt=ef)%B@m4m%}xln0xP^ z5PRp7$amM{crpTAf@(tbQA5PCt(9w;U(`ac=!L@0{tU8M8OE8x0WnC$ghT zsYeTWG=@W|rO~)-PNr1G%#b1n@J9(s4ru~3FE0b5c{ zX|jcrr|6JmOoq=KDB?%hxaWwdSJ!Ez8iiqXURzC z(dUvP&?Skh{6=zjbd)~SjU>VP|7Mo5dVmL)%G;8fqF!9IZA|te>fQ zqC{z6&fqvFZ_CRs;PbWR%S)T)ujrq-ukDTd8Ha8zSWuo{k(X043|cb6hVjFlQLe-_ z*x>0Z%B?cz1|x+f6-9$x-u}{9vC$I{NafEAJeU|>xagIehpre~{N#Zd^cs;{TOcxs$k(fz zYbOFCby$;YpLu4mWFB+OP!JV1U5c{1IB08UQO7%LwPQr%9_dxrmZ~FqVRpmB{kcVB zMW#enS6S8Snt4sl12eAf+W$B&!P&RGd{J>A$CJ0DT3Hn{sz_!ErSIP*&?uVZ~&beV580l;%F=Qv$-Gqg}j&X=ZqwF zT8n2m{yEe0*$%KMHK8x_A*Wbl)a1ppi&_96iG?Ys!VW(0dY~q|k&dZaN(TmqV8)D0 zO5a)u%sBXuT~2|d0_HjSj2yngcwNrpRu%F{}zNJx2AYq8j77FjEe6@Ol^0VcCGGxe`ia@JFqDCMst2u?WTL z+|`*eZMLjd6-_=Wm|@onBvMHvFDpXpC$fqxCI_D@(FSrA0vhe}nnX>vA*#x^dlmUB z^2xs>@)94?S@o;OSJw-;?LtRyYvsNH7MobrpWA=wHwH6JXR;bhJd=*LSRU0{6bg&A z&R`@Q$rGxms3a1PX9gPUOYLoiuEKcS9FVx>Nhh%Ql{Cg6K_lNGKW8v?@;|a=@)d__TyECNn#No7b`wQFb;}4X2j^lL+rc0Hk5-2iJu# zm8lHevlEtJ2<&P9wNKd9s7`@X0F*vxIYKWKoM#SK&TekK_gmt@W@u_y#A>V<@kzM}Ymsgj!*8HS|xU+6%P?Ec9sW+!DYAY;l zCOgUvC)Wj6Ui-Shk;(J(>`viHMb6gp;?-pFPg*jTw%qgj#zi*@vY%gY?>{ClFxCvN zeErF;s%Os*|0+IkaPKW67MnsQUjN25#>P#~(p7m@xzy2b%XgAX%`0eVk9P}s zhs@N~Yth^KdMr;B%hhENQ=AU1tB(&01hbFVP_3KzVv*G_T9~6S1h*k)!-Ewq-9FKl zKd-0^fQB+4e;kbb@gTNAE#MeCGY(Q11?A8axG$8^I($-i=@@unO_mh+VoiPI%lYYo zlny}(8^D^fSicc8VbdMq#`sfH8^0pgP0&or=aM)&rj zk`?miUTwqmOJbet7g|b8>OAtnbXO3V(Z;$hXfc1+5ush(|I+Xk&o*TGLypEWiM2VH zTUtE0?-1J1-by;Dp0yoNmLP#Z2d3wfZO~Z`v4Ovz#(C@pq)(# z@Fh4Uku$WTJ9?tUOUw06w@%A8YLz0BUgD4w1uk8dnCCF*ayfQ zf=oT3FbY(%vr@!Ot#zJorv{uKG$4V?$O0=Lg!bc?_9;LHUN z6f!M$?7HeE3%B6@`3vq_>iX5by}xoTy^p-BqT=O>+p-#i!N#ntreLrs3!+^6{Lu(H zTao;#VhjQZqzkDk{z%vlg;)PHFXHz{B8Mx;KWnwRui&?vA<`){Gy5!JDI?(07}>&^ z`T0s+FpEZBVC5D@vi&u-lE$1Ux~9_OQx<4=tWd6yXV$uw#l;MXZ$?EHX>^s?hV{Af z#Tq?Bsa+$>GYs2GT<`J>y7%QWx$J$Nfj6jD7IDEneW6l$PU}{pai`DcB*&C)Em2%W z_=L#@;yz)r2>sLBU0&Yp&FQXyV@YFCQDZ}KVN>#J+GgS8BgC)JK_PjrVZZPb$G@%j zG2~Ws=S*weSX9`=SSuWx+^xM`r@LKCXwey+j_lO}opc4jvRh#(C^NJfMu=1A0IQ2A zC|p%i)KeGGPZ$pz1yAi;fJJ@+7Rd$5anJ`D9|LQgj(DJPV1ZcUAyf{2sb_-&z7$LR zVJtwO!UzEn+5tk*0OMkS5p)QC4D3!Wowi$Gf5Q|Ca9IH|Qj-`Wz#u3FUMprbQ+p+K z9g5hfb4n0`pckkTO>J&4?{W7ji81&R!gXL}!ZO141=w{6z|4pR@52xw2oEj|aiNjj z0=I$t1JRUX-=|A~sgAk$Osf90&hQ{80XjSzBL&te3g3p=|5F{SQiAUk!x--EggqQ6 zObpMVJ&YX>mKr1s@8`pnQ4}72cKm86lcwo|rcn?H-J|p^}o&)`7$kKoT#vrT@KSa%F=nGPtb?b#-iVIvWGouI}nft3+D0 zNNmvlQfPIB>0?>$6O44q{z2!&>A#_pzY$$ojzq$7`?O96M-SM7 zDo2yk+2l}$YzIW?K^fQF(AcnjhNQi|zFpEb-qd*g+UaA7r|&uHip5;;tLKTc1UkM} zsnqgy0sxRZdn>Yk9G*-wIz{}?|4c?touYpbb!3Mwnfm&Wt!Gb_)hE{%gf*7m zLdm9}ULQPTP^tNRwaSn@eMZ^g^K~fCoJQM3T&{r6>Y_+HnF6i}!ArIaG+(TuZ{S<-76zXb)- zN>B*u1taRkpawgJ#?e*i5D4{dLl1yT&}-;jf=|c^J&{Rxh%iw=R1gsNo9Lx5KD^Xn z1!C=T)n%3n#nS;?3{$9(3tDV=2?J3KB0ju6V^9;I2G(fDOPs>vQsgW)I7@j`Mo}Cl zkir6}h56HV6v7V}A_Z|+)Ae|!FLDa({H*uOpeY5DQpiHeFdLo$ZUrOwZy(BusSE6l zElL4zP?Sl%6|DYBJ-UM$1RW!>a1(qNS$NvxftDXt060ea?EKmF&-171Pu2VB`=DM`a;fZ?Y^O3t4k_jiYX{Sg-b|z=BMy z${}CUD`FMa z_lmr{?$oHGW;&hAjYop>#=l!VHR>{Y@%Ys(m2+mTXj$>$>P)+@GhZcDxeclu*V5e3 zj{LwZ+X?dGr{zoz*V~aR>xH3*U%rEY==N-(Q8$-5elab*f=Yi!9Z_&vaS|+d6@0!- z43>5pDu41^Nq2p`w7Wj_h&eHPy`2R=8Jm9) z#`e2UD`0HCj+l(N)5;bY^>e7>m($YAsr2{M5e23d4^!zL>PQn09ci&w*{*(d37tkK zcsw@Sn-yE{Vel9%J|Pz7+7nH)Lky8YCGp!QztngOr2#cf?bcTseL9X#X0I=an`D|2 zi@$)pS*~Dy&G}veeDP+blGnF&$Wv1J^a;LN2OfUkmD!S`4yZmDt}2=_ zTvgZ}&2{-oV{UI5A=AlRHB`r?X6QIu4<^8Rxl~2(is@B`fLUqYLVb1k@|P5;2iX7W z(tmjX9t}T0OXKViQv_k{{Pv)M(B&A^dI8r%MW{DhOR3rMD|JN=eRt8YSwX+WZ%zN)7r5)eIbn{{@tcV$3%n{EZfL zQfesw9`gas-UVp(!=TjtCg`4kLN^9gX`=?PXqX1MXpT(GU@9VOqQN%oZGh$qKE%`xmA{B&9qq&Z}^QeCD-V;r|8{$mD$jKfX*>K&! zfN9Bi$@nh6jV#V&t?ezn{<>9~?CR&9t$I1#ZcF-HW~xz=?P4)gySi0s<*=p7T^^Pe zIbWYxzV-L}_kFVMm21r`E_f1R7#lPJE}KwuL>dW?V>cP9o=T z-<|s5(4il0eCXZY_WKT9`TnL& z@9%l{S=wC-lv+AdDVaNY4qO!obCgVOL@qJ#*dh*3NAS2gaxM$Wc^-j4DxeD)B1@~8 zO_K<;av>s=0Fv}vr9jEx7azBGYF^eihvpBH>YCIhQ zjj}{6piC77Dh^`D;pqx-B~;2F`mqXd$sp1!RUNc-fW}H8GZ-I9Z~2g|z(1gNLJEr| zk}}YR*s@p%0b!r88Xh);psVcvsoS63WSZ8{bnJ@;BL&=!8Yv8w39AJDP|9!}Csh$F z^1us?1)~N6k42$TF(+i;Ti_hbLcDy zXNBKi;f(K)#~t{NjyREFaJvog%TgGP3ixrgwJcV>j1UpLu#JUS))0pfeZThJ%$aRQ zm)GZVEU27aXep@A^A68)tClncGn=b5!f>U-zTx130-=AC)APEDq0KQQ_xt+~n#{gc5f7uz*uO zhtF+TxUhlCpHt2e441Pd!cV5kf?4B7jv($!BO@=t%eser<2B3Zzjl^&qtVUg48i5~s{_6^juLZS#+i&eVcq^BaU{q4kacCRImWSBO)YI%M$NXmeei=`jL1U;7t@sm+N6izWoI|DXee2_Rr+Fff}E#Q;FWR52J0we~S(2343&5IHJY zcA6bL06?5AAHib9Vj&g69paS+G8#;qz`Ddw!=k^r`G-w=ADH8I&bk9}AAby~o>>#6 z^Z2H7-;p&Bz0ppi*U(VKg;Uu}yR>z=4KR6g3@#A=vu(v8vZ1kV+d}kBqSF=_nVmbU z#OYu&z&@{eD@FM=RA2s zsBG3d<7h3qLRFglBl)dZYC(JlajPvBC~?T2uh??@(i=L}$*o1r{*x~;t5uAwu`p9j zzMw!073BMG^WILjj;Z&VmuD~AzMObHvwA_LImcrn|32_Qd)~%{+G2)OCK`SzZU#b&Ab`uHRK;+lI;@OKeEmchd9ra^iI@|fXs#QaihUo82oVO zPG_#J|bEx-lHutUfTL}^H1+MM!#_TyGTX@#%= zYr!+Y2tLv<0}itWGo9e?97o#$Mx=$s6OSz=RI z-3paKr!i&|+PdW5+%g6m9D`^TSvEzc#LS?(h+~hE2lj`?(TqFpMg?mVy}$eCHT3xt zM<%YIUqPQWanr+mC-n!Ca zJ!%V)cY)Y>h#N5KgPiIM_nyj+IQ3Q!D&D)fV07!MCCKI{cg^a(yUdHHJ)nt1)8E;1Q?Dn_0WzwPgc#insADU;uB20M5r@8^0SiZzkYzGRmKK zGzRL-u)GYsca>GUlBm2N9iqTal5IihJw@W5JBtLW+TH~~;c&oul zen9R5t29s|uxTbA(b#0-&(Tff6KYY352+lQM=Xs63=7TpnceNSe`X>qjDkkXBN_+! zXJ3g(y_droHKIDx3&;I8B%emLCh`Ha2wb;#6atW3PpjR> zlPHm)&hnDfOtUc~-$`UL$#)T^jb@g*!x&?{t@hr3{-r5=` zw`RrdG(ZepgW?z3PQ;{pvX0IUaD|K#9J-EF(`qxhuQCy2uNi49l}dxkn;qw+&nXo+tOobv&qt`RI28mV04WL#!yU#-g44C5 zJ4dU2#JKXpy51Z2l?a0)o+XD&zfjFQwX}6fz3F!2taBf1eiaenN2K=Ar4~DzbB6}l z0@w0*4{KI*)~%}+@$S?`8(-6bOGBN*PM(#IDjtxpRXikLuXsecNr4tCK2o4%+|Iq- z{`#>tVe(nU2TH_yRPku?E5+{=i1(1wnvIeJaKB7F5 zbyRtjyi49OT5fIGHKZcXk1+}o4>k!sWxa*IeJ#Ywx!X%U9VHMXW!LUM< zZ8E#vW^)!=*HV`_+0xK@vZb-*`b0}>@>t6?iCZgIHS)}yiunbImbg0cM`hD>K9dD7~@XfXRj9Z>k_D0S?>X z1Q=fl>I`^;986ESf3;=7^0t5Xv%oaLE^E^O7jKEvd>c$_L8EZBlywYDNgHc=SuE7%pi zl5vsZ>ZIS!l!XwyEsQr~@JKCFN*&-wCJa^wm@3CAUNB{bn{_8&e zZ}$ZZJOz2Ev7y^4hK9*fqy}p0ocyHhF{-&*sja!?Vwlp?wX@XjX^NX??3^#a>*$d~9Hs-Ie zi*=cmhtAq_VnM+S{45}LExxvto1w$wTI6PR+{52l=_gUpb z-wd1@oOKe9eDKsje)D*uWe0TM0*R8M`Nc)^3Y&^N#U8eVT`-(a6ZKs`kQ)8K^?mWi ztUKcNei;1C-mH9696mDzq6x;>BA9zb}m&AB;3%sBm zEs!WlH8g6Er5n=N11G0ObaEg*eMF@&oU-_J-lJMmYHXk+-TcFQ?B6g>QOcgYpRNBX zOfMgd9?Jn$&S2o!X&`WCqk zxf6+Y?!-=YDpJXb$9L^wwC>z_>2Bs1-^-D7=T63qUArb8g;Md(oy2R2N67<}}ge%ca8}G(vxJo1@9>aySZ*jdu1{ZXDxSRuwrI(+! z8dy>|;_%Fj9v}n&Xh{HgS%65D0JezWd9Z&WJBCXZKu{voGMjdCS^#xPvygr~#nN%+ zWY7+x9i_2EdRfMpd8)2Mqo&LI;i#@QJ0w&=B|r7%GBAKZYY|fhw>AF#8O8nqpr^G0hKu zI5-|CJOOnUf*%diQ@S8i28%Fe7&ivCFeryp0%LNf1_nn7JOy+N$IE|^!gmEFe&``fE`^@~;2y+?OD>ztKPB zy?5`qXWw(ab-v+^2#6PERS{S26-MR6gvr4-iwXoV) z>6S%xuEwrd-AE8CJbfD5qM}myOr}%-A(#YIij;_yCqIMX;eeu6o_a{jA$ zA&bDVE3DL`*cQ0Qzp`1awrel-83T5XUa2bZsrWg5M|Fd*YFPzNh-n@z1QJ)vu_E6> zldDwESJJ?T1xqdUI#gDZTguY2Nmlz;37LWrBc#CZZm;c6xG_jd&REQdQ<$lTD_hU|G$xe0__tZWvSQ zb(K6*CRIyS*=mvG70S+urIe2*thf!HO}MoZON||NVrJ6LUtc*^cIVuzWs97_PK#L2 z*MRT1`Nr~zGmtYwhgAR{dn;eYN0g$8ti-L|x01!|>l)_M$$wXkzL7$HT93j{?LJgqmhQVb> zf>9g}8W?b-TT53n)i%0wSi+8II22WcWD17N0!6}6N7&+ESY!-^ECih84P-7F3j)GZ z%qEQzl`$k>45@&Ykaitv_Fp@FLu(4?T2ukXS0OO8{7F8_?VDa*H2x{(x&MC5^Xd4a zS2jCWoS!rLI`NO&4-^0O`skeVD~K;l9;%jIaHfE*tR=o;FqsTm9{T?N57?a>f)#bd z)!!Y##M69BQtshc(eQga$leAU$;}5UE;cM`Xjqs`E^L5{ zXk9c~8;jLOqjg)h{%p&o?b|PH`Po+8qTP$0936cUe(+nnzB4`8K_yq@}v5jUk`#Os)b%<`<+pSnlD ztCn-w)mm&m#%nEENxat@udWi%>M4|ZTIxd_$i`R-SBLvQCeG&NUAu(aUw?$SkUENM za;vI|SLUBAErn{R-y>BUfY9S?{ce8G?CQ z|4vpF=2=Dy(7QwU}|1o-WOM|5*<@jQmj)~4}Ws7E}sZ4B|h%Q1XGE?AzuOk zayjf|VTKeG$}+(~suU>4*`z@s@_P9eaCM(&{3YYNj2|#g1{BCJ1%n|GTG>=;Mg|xM z!!iXj684rHb^!!siAtgrpdpbd6s%m>6F}o2tQ-OXmo*xOLKqY$k1PP#ghY`@0S*O3 zB<(=bCNgPS>YOg9fQtUT1V~G-mq;ImAR>mO%n(hb_}80sKOh}88QCLQNJa&t)*m}a zQa5}GfD{k_-H?vzh2wn&fTHVzxrBW|RpGfD2?QVHoFonqdqC9o+6w>s?)UTALPj}N zB=1s)sGd1xEK}LJ*tvBO2Sy2>)Du^3$97>)W3T<1IFnkI+JV0HdyDsC#~`n~Mm?3c*#UWlbq^J~+V3eP4jLq4fwkJ{ z5Li`GkHnI@EJwoB>17t7rRGqr*)BD+C7X8gSRRc*uO`+{e2eXytXpgz+YsP8hv&75 zu)jGP9Jf!VGfQvDE!|d!xhL--et4LYN4$(->%RsMY(t+vxvq2_L43=W@d}k5`IFB` zjT%h1pD4^R{}a!-FXuii%Y*{pC{?D32Qe-7du-Ml-2E)#(bVG9vy?ocTdRndYRs|; zf`ZG;npYykKjYeo=c)Ozt?^|35G*p0Zq-x`r(el@<=S~_0!pnn-Ug+vO;90{k>(ZF zCvokyXK6EI!=?`3>_F-psm-JqE437w8;xqCU9F2`Hd@N`3bR+IOE`*D)&4?mNp%&>9juyJDG zU}ZOW1b#8&!;Eh+2xg6Bm89Gk0e_PG1$S!XnuBcsr`|U{v!FGVeh4RXNP{vf%~nLC zh=PYdSbV6gf1_yRIs)y0-e3 zS(UeT$^%lpE4TXcij#j@)_e71b3m$GoELL>Z|2Cws*pNoNlECj?((=)6VcQib?d83 z4JIul;LILE>lGZeKs)~J<+Q#3w}P|YEJ$5xsp#?)GUJjQBju#}dvia}RzALie7 z=*x|@MG`$nB+Sq5dT7Hc;=P0XgP38(;{DbBY@XPo%E>A3*h@^@zmIr&VyDL&q2N)o zB}aCHl3l)!#si2Az@asgDQt!SfBc*dZo<%XoWE4gamU_RnE+&2IEALF)Pbx^!c!HNzL?Vs3(`b$amk{vrkHjH#|37ck`1A z2OcdetM0w~twkFy?EpK}{Y~p%T6h7s)&26qoq4U1kHZ$22y zN$k9|{^W((p4~rts47(P;F(+OfMY)c*isCz1qrZ`pROo~tQz2CcLSV^9M5A3n5w zkBzKpX<0M!7-3lW`26{gFI;qf{`~Wcx^C;}*w@{)ue0N}uKZbfd9(5pGxPFhCh}TZ zbK!$Gk%M{bj`X15cVaW;!HGui%u4*hidn>ELO@(jf;X>5j2m&J8Xb{K*m0tl52HdO zGoPNixYMrLgrdD|(%6ZYVQkwgW+kD(GT@->_;yDmIkPggtYQ}B)9ZtSA$4sMW-x_>{YnOcHqNy;Ep9IP8S%KORMxY4)PjS~86Z&27q zkJm8qt-(tSVf($CTemeeZEtDb*4VfWKiM`m*4Dm!`A_BI*bJ8e4;Va|hNmz_stlt( zZE#VV8@IKzY=uJ2&D$IC6>aH~a7r=*cw-deM+Yi`v5aC+5S$MiH+@Ee{I30gvC=~V zUn)rXm5Ow75GqE8nqWsTCK3RbNvYgUEvGvpEw*9I262@K=NhX*%ec`ch|JaFL z9z1)jGH>&`Na_J9MJS$DIDYx1gqSySV#c~>Mygj_x?}9wwPF#wX6wBtw^*A-;&eWR zQoi7c(dr%X?B>A23rlhjmo@hGHkKVmp^XB~+3_9KqfacbQ#$|n?O3=khnYx5))3!b zQjR>cZpMibo;dN+-acRYWN!#X5*R%Vg zRYR0SykO_Yw>LK4{_)O&cqsY^mifDtD}P74`$#mD`eIXL-R8W?V`o9z`%yq#qp?Pj!f3DQ;>^`(eh7|qLU~9$(~UfL`93F7kL^r z0BZV?9QdCfB2+>7AB&==llY2U&Lo9Pu37*eI9Nf!9)#A#VsL;7xNovSR4T3iI@QPj zy?q+lKC%%aiC{!$r?(+c^5mAGz4{^1_vqEX{}LO<7^lHRs}PgCISLVL8}}DS2fRjk zwA~*WEL!|>>gO^lRm0(mMYc@&-thdIs;a)#rKx*vNWCpOuc9iRGrPF*&KpukyzTMo z>_AUm1AcDkMBiX>Y*BSZL409O!G@~ZRaFquYXX8JJblOCi1VjrzJAAP@D}}xvJEZm zW##Ky+Dk3YM6VyH+i8UShB_C8dtz1bPq@)w z@+$m#Q!Fu3x)QA0DW9F41=^`k-a=d?UfO%~VG6xrWpQasa#cxDbJA+e?1;s7hMs@Kk}q-5{*>=V7g90g7q{ z?XlZnWrK@)fVGHeN@Jt+OP`8norcu#2oX+Fz;sCGZc^z^p_sIQKmZ$-{p2Qq8X*QZ zT6ALu>~+WOl={0Xd{II|byJUV|zj-ha8#qh=R$)+uV%08d3uQITu zDS7_laK+9-L(UGciT`FV_KRTX)I8*AW8SGy5SJ(<1>-v#MBpGxDsJ4pu|TYx*s%Wd zL-pOd98dk*^QK*Vt~J;pzTqW+-*fVt&VW~qa3H)9 z^u`syX~5o=O=dR38)2XqH<=kO5j;UsCWu)JT(chVFT7|mNP~MVLK2(K(2H;b(f&ftqUk53A;lpD@Jx;@(R?$g2)}LZS%h+=T*XZ!d9M&2vwd30*G1^!n)>qe)P7`+;~Y zZqLt778LutWA4hnQ1AMl5^b@rvSV(-Q=hQLR*H@tldNoC*V?>}cziyFagO|Ty2Cm5 z$QX@|Q^u`{dQW0*N2RVintHZR!Z@2rGnA*GR6{fu46&e6% z%xw`F)gqaRU!0N!ngZrU8}qPbQeu1NoI!^z&uj=aVXDjKuZfSli~RvbReQUwb#;HU z$D7&NH!E&Pwk8d=aAwmMixKw`Kk&F*d|Q#oENm$rd}*#We{|OzTa88TO|i(F@mYPH znO;wG|LRs-dwZ1vKf}%47|U zJCwI^kr_HjVFvgN5yLF~6vH^g5D2XW2yy9-ER1N^Fa0cuVF)co(}?_X7IY5;s6aXm(rhRV9DgZ5!5Za3_u#gaft_M-uUy9c zNuq@|c=h7w=cAMp$!mY7E&2Y`QsNIwv7?YeC$Emf)wLfO$FKBOGXyC++!42;2Pq%p zmdKT53$^sCTH@5`=Szs~C>dY7jQC_Jh;<&A&|)Uy_n0Y}#D8`5ni$>S+u-It!TW;L zU$3r1KM!3cKEhgvZ=ZTffAtASAZ9=e4sawf@dU=Xkb3y)RY*GwAJ7$^q7;l7e$YYe z%vcQ6!o3+!XS@w+C}u2(6~SpJ0@wiK0sg1?GK5M%=1K?aVDQ?8$WUMc8Hm3FAu22! zBp3#4LIQVy!w`6pg!_m?gC_`hgYXsdO%kv`Cy>~NbcI2uAPoyZW^`m7fS|if3a&Vz zW$|^84iFryUciGL0Cvy_a=m$8 z>Okv)NY&0+%E8%HHQ2S;_s<4W4?NQiZ0<-N&s4Iw%YV6uAv9OH!bUEW)0+TKHMu(q zNB8v=f#o--N}PUsVR-Rur?)28C9kgvtfZ7nvZsyL)~~B&(*=w`UvBTx&M>#a0v?hV zXqa3MpD`U9%U+pScx*|lRc04giCuD2^^9G!V+(vGJrx#9SeIQ=V>fjzC||)b5L2D?8cv{>+8|kI9K_N@zQ=25~UZ+MLFTo(di46^|uVG4w$wO`9d`) zuTWzat{@jeE$qp2W`cKJLF@9O+Py=9!@?EC(QX0p!_dQXWooI#)=}uv3Pc6V>hNx! zUdN>|t!2$o{lw#0=7Re_#ApYlVEycnx2`JTs^rRbXJ34xdeL*u(MsYeTX<}^B;Fh1 zGpQy`V4y~XJz|z}ImXU}%#Zr32Winq8XdpV{)!A++SFqX*E&ptzZdU0!~(d+A@w#Qpq;w~ixM;r$JK*skHWsVowH+EZiwCd z)WU^NH*rGovF)7p#df7zy>oZtyr#Nf^V{pzz12W#lR{Am z8*ecyrRGBs*wLE!8yNyMr$f@ORwXtXZ({v#L-rrH#31K`U}d}m>}DHaToj441k^icgU4TFFL4;KtJyjgK%5jPA}c=}Ds%udh)x@E zdzv9c3r{SUQ={Og4e-R2g(I2S0W0=L>l8hlIFYDh3b6loGW;pjL5H_Sq8bOVFKEd# z6u^d1-`ql6BEEZf)v9+f7N!S9S3Sl;cf@zZr7hza>z~iStGrBnH$F~$clqgs3!nKX z#$J1v`1(+l>7#{lN*7S@@ht^GJa!DO2&6uP4s*o&5nT zdFm;wggD#VdzK)ccW0!sYGTzqv3xeBqnz+b>@jdV2h~+qZr+KK{|x?Y|vQ z4xJxe{MhjDV~a=64}H^7Ro&iRUDdIs5*Jny=adeGId9Wwl|iw=Sl7K2LXJW(NLCNL z)pXd=7Kkw0lhJ?O0_HTBqdg9U!fP4VKw;St75(_mL=fExY!W74tV~29Rdm6IoFo)T zB#jU}pw%=5ppc_e=t-PPqF|(BDnkkwq$V^X(Ek66BBM73s=^`8Fc~u>46;AqI$i^8c8skPt_W#)yCM~SJ!>%_wPGJeDLYIdl-*iIl_=$ z`75^9?1Es(ED=ip9+sFKCi%sp(YQjXkSFF?!2FEIV1Q3Iv+P!1>N4$~@6XVv-%sFm z|7kgkbgPf}oTv?AkA{<}rrJJmsgwa6(vrT~R^qYGKPMi;+u&IcyY*fUE9uL=X78Ri zzl*ZPo1gFX%Za1R{;mU`CyK-2n;Vt_=O{YG<6_?;1^D%+922zATq$n$mIt~(jvhwk~tvi zlcY^0|8njFJ~V`j1))den+oj^sD&oIpLm71_Vm!u(-;kl zfMQ()qoF(E8l-=?4Imfgr2w5Pw2Jf2|0y*tQK?t^dAL<-2{0)-oj|w#jpZXxEMNQK zhNUmAFqkT;>HJ!s+(_fq_%y~?Esa;^(`Qk6Nt4RMz%%JQ7n`Ca&I~_`8as6gHTLZA z@Uy6~Q>Rczo*n*<-gd_)w}{L%u6^|@ds`ToLL`<`UJbBm>Y#*S(z7{oGm}bOTm8Z2 zrDtcXes_H3V}lQ}B())lES$|&#UW&w-^=8e2L;kBA5&NA5(z?4tckAD(%DWf?qsv& zh79&~*_Qznzlz|5xfkBYTF{b5Ua`@s8~AD^Pk+I2b()ZXV|jGq3%VVXMEVqd0QZB) zL<$NZ0tn8S!NDt3kcK@|tN~(806zeq04GeSN>l{i0n~MAVkCR%?i1Jco{!%PX7(Rn}*A(yn&d=1nBe}!dY0W6Hx31T`C*NSA( zz|bLbms|$qsqFRZ8&6~@i1(j7b0inZxF@MMau?BT+q6lWH9A& zKr$eLMT>;2=D#U|+>Bg*{?leqoroT%qwY*<DlU^HP(&>Rw%gO?W~+Dw5H(3rVm8J^>`0!c&|%LP!pTZOK_VaUpiq#R zS#Ea;g={9**IhhwE|~O9p z-)4?LP25BxUWD4@8Do$J0hjp@<2BG-Ffhb}9%UKq<^IxqsOvaJ|KV%mO#7i%myW)2 zxDCcRy5!Zv9at?nR2VK6j{tLn27HtpEDV@Z21bXgbgNFU&dKb~^tQVimY42Wojc&Q zSK2x+Y|wVzwxz_~;PiBbdb($}nH#)u#(Xxvw2b@i9`9;j(L zziRa-4=vy^SkzaONw9_d{v4C3?sqp9cj?G_dkbUNoxOE1(zK+jD<16k`?`FM%ZsX!dZu^Yv;_fW3bXSjZ`b^FHDJ3@@q2PZL0<)HU&O*2Rqf$eS8-7 z%~0!%dj@ezw6e+Q>b`A!%^pgsuIKddfqBg{@18-UB=Cw_hiTfuF?`vcRCE7>3xS6N zZiICbX3_!N+)QxMeH7^Y_cFc#W07pEAN0xhV@JU=!&&SC_9afmjd&rx4Btjh4G7WF ze`#!rU@m*Y`iK!KB#Xkx(|^}xK9HS! zq3MYSlRubL$di^Cqsc-Arsf!_9{?jbIbqNmY7EUWIhkNjgC-qnf*Pl^7pR8{2X$89 zH07T1f_t8B0$r1V2e;OXIc&bauyvYa!NkWaPWdC=+m~%_b#cMykBLJBK!r`DG8nls z7LCgiayVk9ST7fGl~SIDM-zf?9*QbfV(nO*&wQQ5TW2lkgXM^z4| z#U#rodWmy94S&hk7o#5E?hi$pY?+G9=2B^Ll^C2>*u`uPP0$WeS1=f%RN_{PvKS18 zR3ewE;|iPHBG9-&4^^oU%WZNqPoh@{wOnvDPx!?wL6!yV)MO>uGCVF)OJpKGU2NnT z!POghHxWvtLY9K3Ra)l94F)<|;#7QjyA9M`&8ozr!R@Ok3`*It!>g?g{Zh3;>JR3X zo7g42T((XfQ>oePuI>dqTUDOVEmCM@wVTh*TKe-jdk#*U6_V*ya-DKEVU7lak$n7_ zS?i2dv6sJI!q@O7N*MuX#1&ys3}%04oz5+4oJAM{RMa}%V2IDRfQLy1ODL5HRV=B( z#WV1YVme0-G; z$k*|t1{u#HGpWT2rCg$SYXla#4ZA}GQg8u{r{+skT%ke_uZ_bIvVg0Wag7F*$S$XI z7&sGL({WuyJ&U0TYT0@QS6o!sE9j}pufP3hGMFE>4Ltbls^u>%>plA7P-sas&}GTr z)V65PfVX8S{#oPk9&PLXhHvjUDuHu7ofM*}D})7Vk)0Y%H{D` z3NdIzbGbAIoS=%tDoigiM5QbVSD05N;R%l^g*>A~C}3eyCfg-e!``Cc93exb6Iy6X z&zYT4C5I~$G=I+@Y&>|htEjiPxaWi2uv$D-(?SI=FZIstX_{^;JkmCMbs1PxmQcOf zta))b#RU=If}hU0i`|>&tg)u#UR?e0LX9zkYO0?2s^;1#9gG=>xGQpATk37 zEoOj8Q*<^-`;gEZ2Uj}?Q~{_&e~^a2DhAM(ZYN=B8j`_qNv!izGYAr}rXeQM28&`q zQIIeX6@@>N-vsgkAz89@baa(ghD;+5s8uLV(Kwz3iNYIfRuYoo})II9|Bxr{W zl#Jhh!DKM$T4TtAQQzP7>ygV*72`*)|B3NQ6i4zqt&X=*XPrm)a<_aIwNzROXBO zQp;=U5M5ZVw&srPY46xQH^=C4+W;;we}VrR6}D$*C#`{?#S#iOn*Dw-HprrQ>-NnR z#QicsPK!Yja)`LZ8Q}Mvfmwm9T9Z1@RnqMqySZqz);X`#*wpTzx`*ohbzWbug=du7 zV?{;RD$ad09m}SQM1_yd9+@kWsU^|HvF>|vKyRnAIDq^D28xMy!G1YAY_)|azHhyF zhWbT$sgy|t$#u6ouR7LztyAyP=G-*u3%8jZC4P;@4?_K-XrvW_i)V!fGC`C~Q2rdY z*+Xaoz7ANe!H~rg{5v@Ui`iev565XPsVr0I@@XR~j)<=SCB^Syx%ptZRRgh!%vOgo z4uSp71yE4@BX|J33UMC^pZkI7aW$L<)uJtC%xRz(wsuk=?eC)E`H)KUtaFR5glWv5RO9A)Gm|TNoRj2`y^pbkeovaAANp0XQhTzDRFaqyOh6WjuS`)^*{=;`Iw-Bc2>5kK^#T zL3PWlu^3}HUQW<@`)zyq0+ZKk^vd~4p|e4);(^qrPzC3YW^s`M5mnGC1dRvV?@mI27! z`WF7VR1ca|Nol4e(PAjhHt4xNRe^&SS9GVm_+h?UsBnt1BoSYx+i#bfh-c+u2A=B1 z&&n+#p41Xg{}iNu^3y+g=^x^Zzjaa3jPdxu{XtdK=;_J!&MHiFsue=J#aQRFW^p(t zwjOd;Xrda6*{zmaRDp(|!^z`mLe8T>%k+n~ z#I_J~q{i-`zgMfV(5W06i$!B*Rr$Qfq(YBJ>7}#4Pp4dB*Xe6VlI{@pF_hrFg#W!s z=FoZhTbZnu0=r+%m)1BvBAGT-hrc5fXf-u@wZLr8Yreqk5*pXG=Nzetn0NQ}B11kE8oEF4-kyrsX z9&Adq?cuD0q_4>x3tD|?1_{l{b*U7Ipvb%=A^5t>9(2#+}sr-DRa zAX1|NCo|<)FumKsi6F`40KY>j@*#W#vQY<;s7?yCk?9=-7yP$!|C(Tfijd+Usu)It zgyWPy1Q)nF&mPJS`a?cNy{BxvaO~|i%7?)T=d{0Xu3Vq*tX50-6tzp`+V@C@vrh%& zCzZx5uVku(rfJz#iz~1PW5JST^&rY5exQ`hD@>FTbuAnE3Wlq=2D6Dtqv8dIoSQam zD{Gn;7071oIC9&{D*S`gcnn{cimBah1E1%%V_JKeQm%|(A7qy%LkeY-aD~e3dh7$E z+Te5O2$w;n!wXYuV)*)0bgB>~Gqv_73HT2}yKD=KFH-9&U0%09N}S2jCQh7dZ`~M< zCHP#4q$x?+n>(?fqgN#6^6C1f9$(cX_ZMhAUL(h?wl~>Ee>WpsBKP>iCD?7@-t6+l zRZPsD_jQ2XxxTt$MG-N#ArG9@mh5SFHds_nK~2&f9oSgkb7p_s+_3TZnWM|~0wB&# zL{eRNEgXQ`_*{#_N^taQWr4Xag#99r1Ht_2f<&3WMuYuQ=XGh#TB1zv@o0<|{A486 ziP!yDEcmY}zo$@cDGBpM9&c8?Ue86kMpH}JNSci807~i&5GrJ04d4fL4BLU-3CkE3 z4pOROIDmkPM!>@gLR4YIal$$R9AYz*t1nGmr4bs!9*BVj<`y!8i8L%3P|8Ck(hM{_ zL)(Gm*MZz2kq?RuM^aKy{S?)NP}C$+li%RM9g0qtf%dNFA(#53h7oz3lSX%GyecEB z1d!t(TSmpnJmg{~dw@0|JWG!t-4!$rvU$X^!z`fArV6s zXThM;*c6a6DT`CUAqNB?glp(=nt?{Gfwm$r;gEn@hjFDlP5BS=(KgX3Tj(7Vch6Ga zN?9)Os^u&ygT>H`mWb#R>$oz$WWp}w1sk(63$?})p9&PZbvC1}CGQs3?0zHga5wJ^ zG1)wJGn+vKYCGmH)BAP)AU|$a(%AXMPVZQGW@lE+R&2;>ciHkxI4+Z`%Um*#f**sZ zffZGkY;ojuj!Rd#CAy$Wj*i$0P_H!9FwM%T%DeMMI1%&U>>%$g<86t=Z^%1o}Pp4}m($K2v z+|3QxX_rQTmt6XGkaMsRbQoRjsOR>dN6$s=_^9Q|msKT(Ogfp!INMQBrldkSC*Z=iI4!j6FhUbKs0 zGco`s-B=nImCrA*8tL|6b=g?8M11uPV_Tsk*JpO*W=dmKU8T|LZfvn3Gt&T{`*a?U z4nD;9)NI+(M_4n3KiNs_l9SrP>65WGbI5xq~OQ%b^2GE3S|E2#ra zp8rj@%cuN4wUmDTsvA2@%)(x}JhZYZlo^h=g+>mqGCsVX|BhaJ(@@{cwk_4w+uIv% z>212XJ-fG{egTGcFzeRUweM&eetg;ZQ*#FnG*ql<$PC6Sq=sLK8g9Yb@xiNZ`uh_- zLdv5lE&gdc%~Ek~xB`n-ke_RxFK#NXj=DTy4%_KJzA8JPvUdE%!rM-7Tsm@cTXFHu z(+g&v8mwB|0KNwMDi~~z)Ml()THdk0clMp#^PV4H|J44H{FS$M*S4>moqc@s#EROBEIP{E7y^JCQSaQnwJHI4UUgf5R`leL9~b;qV2nxIT0DoH({=K*Q^f_(;A0FjD z{pn|^bt^G9_{l58Y-0+qfxd-!gxE*yI|+)}_$Q;pH&;4XJO~Y74d{8U*@M>T$?oox zQS0Dr7f&CsLMQyJ}c9M}~)w)Uc~} z5ofqkH9va(t*(2p>XQXuVSy7|F{daLD&mN_Cx|z{DmY0zc2Cz^=c9bJl#AiTXW#we zA7dq3_O|RtT4rC*@h)7k=o7w5n19y;^><@A$8&%7%IlpVhsMGlPZ$HKW$zm=-QSQOq=7`-Xbse<5XQ=1EI9R#Sz{WP_|6lqc?3bYhFMp{@9k(oU1 zKnL-1MS2&e&n%+QA`Nq}aQK0YC^K1LUD&Z?f7kLeTZ`vCw7R6YwCcp@VIuWbojYdb zaSJ0M;$tp-`0BqNLF_WM_mTkzlSTGt)z5_D(->Q)w+{?8#RG zgxo?54&2q>f7d|zyLNST_3B#kyFZSy=fb$C89AxGz%MAaY%7~@4OuIH`Q^=Rn~M^G z*-vlHU4L?M^KC1CL;0P5!ieCDiomjHL2eRPK4}1 zBbe&=jFE#+{dUEiBW2YE3odT0zVq3&tIp*_QdjxYcs!8|g9y&gXGR(tO0b^u#N8!c zw{^CacCu)1dBvWhP-H9~9}7=>R$H;^&W^UBbF26PJfmnw|6S7uj`jB+8<>7qf3kXY zP3@}c>Q%KhtE=hRVN@a#D%w*~zBg6x!cPV!PEs=G@9Mqj;T;8QAA|T*`Q!D6QZG~( zye0w19DI=SL14mlf-*BYu^x+4R(dAxdL)AXC6Ib82Y)F*_$zUF09-vh`ol@qC}=0A z&ECsEIMtTX2Wp-RGS+~P-F;w~b{5<|{2Jo+GLV1@$rVYO6TR#Z4LL(1NphgUqX-Nm zYb=^6j95I92q#z3Bt%A3JOFW|>P1Q-DEsA=>OA&ZdYeHxP>VO1IsMI|I>j3{eVhCv}a>i~2EqP3~fkqcTr z<VL#A@u9HgstD*nLE&$i}xbOqk}r8V>yui~zum{nOQQEI^hp-`>Ii8%eHtD8D@ zb($S;nlbwP*E!33Z@RszNIv7}qS`(;_MF1XRu5=7l161zRbOnJxKT;wy!X zt(p!`n&oANsI^ArFc)b#`Sm%&gI=j;a1=ApTD!fAj56*l;y#H+BZ1F{c{D1U8{>1S zsY4R8fGu`Pi`FjjNwdbbU_n>0iZ8({8E(6^FW0vq+mja0RP=XDz_`FzLd`n>!qC$|E}lmg4}amZ*hDv1WpL9BeAbRTiHYsRTru}ZVM zI*1b=VwBl~@;r%}DKChyWSsN6@w^tJQmbg(+(?uTx9FV}#rk|lRfS!Zs10N@l=8SU zq4M~P`o%8Gg3znw$;?vQbD+VClD(1Gu*PQ?EyUDRN)1F`;+Anm%+%XGjirM&;w|iU zwM44Xfd3xi8G2^FE8OQ)dFB+lX5i%*R*m6oF|Uj-V-xG+Il7pZCB(iAWjdXP9HGdN z`m?AoU~qgmheI={r8+9{dX6C{ATmLaHU}?O0B$ecLS4cgp4&h;xH68d%-qn5{dzWs zW>m`bl-)@@nq8lrbAv*mJj0ri0E!ZMq|QKmZ5kQ^d_+JHzQIYVH6sHDXbXPGs2GWR z$>5e$fTg6pED30B5wSQ5Di#1)sZ<6szX6ll45UPzfih(v73vJ6L5)23i!+eEbp}#b zgepsN20UAi^%zxIg<0;t9*42z))mg~F#WRjEn*J%%76Kf@yfz)uu5z#b}02=-Rw<8 z)6QY6`xar8-K^cjmC+}N4__ZD+M0TwKKJaRn=k|ByVZXigf01a)sjaSa`ErpgODkP zHl#=`tF8SAgxnI0x74~Gu;(S>>W9Qi!>Z5T>KgvpO+`9mgHc*DJEkG_8BW-w3kZ$EJ5grdsuvx$Q{iPwpXdx(u>!|%O^t(ff4miOKxJCsDd=q7u? zf?j+_oOs~{;so>#5ULCist^z=@)%hGzJ5AE^gbUVl&=9B4CHC<2tc^|0LGn%_XoHv zZ9PgV7$6b`0Sy2!Q>k#wgGfwBMMg*nU?8jqIv*6s6b1SR#neGbAn5ql6jTa4YasBX zz-$OeA(w9ovbO8#li*7NRvoB1kPg5v3Djr^(EXT30wl>s%pHpL`zl?0Rj#AH!GP!-vZ{9kGW=&BX4>9oF!)zRYWDMNy^Ls4@L%OAiCJ$-Rd2|Z zFMT78M}LQpD|tsf#F-1YQTd`wbMy^aW$+VQ0$aJ^j$6Y;u=8&vHZl*wdKv+e?5>Q5 zz{A8Ble$9)4h%<$&QK0?3$iea z8DUSjCqV@Krtw}{yChvcO=`hvi2(FS^O$JKlCTE~1Fj-L5-bz|Mo3~#b^;umM!>fq zYKElaAQy?#Nkpt*pdLZt^wNZ80aVqS&AD~Ca$!}Yu`K2RZ}zwww>C9zX*B8` zg&kF)b%C;`Qm?@TvX_Rit1p({)l)>}1RH8faw-@GT0u`BECaAD5>*nXX74((t?P*= zI#<41J8jdpp{-wCT3$Y_+G&U<3m(H}eb_vstF++Bv91?inZ9t@ASL88FJHFt-f8l< z?=8To#!Qjf?~Ij% ztQ8%(rF~t?y6tNM%Djbh5)Bcjy@(l&j$a7+Msi>jja!<7{bp?;9Jqv|`6^YWH+xoI zb#|n#;GC$$Vvofg7mP)jaZPoJIJ+_cPT!OYR~2z#)4cvwB2LY$?26$PGpDWNi))s5 zWap}iWZ|rB2eh1NC8eFy%dCPZx%Dvw71|*1R6&vaQ3KB z#`{zHe42un+sr6$2Uh_JFI%tYbF(a_JWzt0VhrYxQVX=Q$mIsF3cbfP)dH&rz2c~X zT!z=z8@%4hr3X2u^lQkxX(A`R;?P0!B*;VW{OPK}7@QDQPYXGceR(ZMXO-s7K)ELvG(4SFLkdwp1Ak>{9oft-fi z+>VN3tIxlXI8zpKl=6d{H~s1Uez&{*mZqYzMNWU^`ql)yV@Gqxp7!=V9f27+E~~R; zM{8kAMX<9f?AbM|d!r@GlGPZBf{sqmVGr1o)!%)U!NA&p!+i%fV?O}&t>6md8W5@A zD-?)SG(kXL!VfY5C0941SYb`W_0)9G8Gx?II~eh#W>o=E%aMLU+qOdbA|Xb@!7g1fX}IaJwLR4#S(Dqat*GwQ0+#IP{iajY?Z2#!UUDVuq0Hj zki}(dFSM$`E}m)A`{k8cESZAOQnh5VlzO3Giz0DFwZ>qFRcEKunKGv^oDC7y6NQNu z3)NiI1toq=%G zT8*dG0|SH*54P@lsmkfr6jzq|TMv|!Z;sS^ow*KaLz|J2sW&=oW_e9g6OLsntE#on zNIf7KCZ1f_UABMkhMDo1-DL;&Z<>=^6P>nVPF$mK=dVZBKa%`5`F54)MIH*T!|;7@J{askmDy>!f)~rA{Z+1~i$O4wGJK*2^;(_&5ZaIR)$80>>1O#B2!OB3VeSD;R1M38Q$id<-KyK>|III{HAPmwS6maDU zE`uP@9~>YcV^gp+r8|(P0kHjoZ=hvNu&*GhAw>dT1xw#J+PVClO{~Qa&)oF;&0BuI zdDht_oK5en=sf!7%HvErlZV^Z3FYVN8GIhI{+wL6&W7_K`FXuwUs{`EdfAlo2=Qx* zmiR#QY3kNLeno7++pusG@g*^c)nEsHu^+-+twg%qFE3hm>4>UcvFWM#>wdis{^mcm zSzfO^a%ugdmk+gLJ3Fa--uY1hM@W&~FA|-Rfe2kNdY;Fp;vX5y42CjeK=YDb|B_~4 z*Q>AYYF~6)>glj37|*b3rP6bH*`Hi+vl^ zGGJm!Kr#sfNF-{xz7r8jh1o`18XS#*TEw_t-R7_eta z(h?zAau-VgX#0>YQY0Ehm5LEp3?K<;KC%FS1P2`zav+M6JnBV(8p1#d0FQ9pff^kE z6dViNAy*mzK<&^;fP(;7Y$SCH85m^SbVgD?uf}?RWN80k7xSw@w*<_ zHtmr_K4b9Yied`2o=T059GR)ljpZwQda`hu?ko z;VUU%@spQAln&IVqu3MV0ACp-^7CW28u_cLbM0rYsY^xa;gXtNP}@ zBJEAkg70W>9%bJ9_Hgp@lan~V@C8z-k)N5BmB}|sr2>9xdb+EyW>$XwteV2IUZ1Zw zA?b=oW*^ANcY|Hf-HcpZzxi!XgnVM1W{zK@{FE z#%y@yU~=qol2L9ix_Ut&-ZTIdL_w83*D9l6hnGA!fR2T)KYcgI> zdHB!=Qv`g$;vUSEP&^8^rC|5NF4-Vm^5+Hcbf6xNH4K$8y5JI6CIJcX+R2Zvm(U20 z3|ps6EVyBj2%8rJcG>aW!f&)LKEznV-VmHk4IGGykl%B z*JVmN#Uz0a1RO>4^3oejm6Kb`rE@Ct8s=*<%YAlTMMmD@YLj7Bm_Q^)RH(?(=9ft1 zCJ|pr@RJe`=7r6LhRV!olq}QH#(ZrmNtM85qdMQA50!U2r{v5ow3OTP6$q@3h@|%dR>oo#-5)0ZYoMCJM`E#uhlyO5^J?ODT#bl@6zsf z2x`aMz0KkzQ%aUAGsWx*&T3vIn>S&amE~x_r*S1> zMK<3rY)!XW_~g@#v&_ZGZAJ9S`X${ph5971Ozn^dvMM}s37L~l*_9p}Qpy!JrQ9Ty zOL#6ticVruQd!!nV#wR`K}k<`W=Fb1?={+I92h=!!eL28fT5 z6E4;o%1WCyG^y<}2j#O)J3K9rlN{*uIy|JH5cbzp;|xk>H7S?R(`M+sRtabNsNL%+ zD)MA?RMz-fAKl+qJ2X^lNOl#iRH8(=Q3`fc>f1(=Y%)c5W1*{3tap}NARIF1IjpkY_Y8!Pg9(u8Y!?XxyZ4CM}Mx=bO^Yb7r- zOsm#I*(&XnKGP<0YI0LWJV_Q<_6i>jogI-be>OB1M2%T`W7-3x$3;>?u}>Xvq#J6~ zDvRuP2_Jm$5^#MB?>H4 z&Pws?!bXeADbHP4&?Y9J)H*6#9Vi)(tS3pFW`rlhR{oYpx>=yKhH zrJadA9Ff4NBXv5F&_FpAi4q>KLctM`BDsLWqrj4`Wl4mwJM}44x>lAbwI!8jYNZNC zx+f3Z-5@0kNhpm?;ad{Y#AbnW493;kN)OEH0@qTGv% zJ%j>R^oV6?t}Wz&BQPd^@Q2x{0o-SO}u?zyzppL{j?*47_Ceu=)X^DqCLtz7iWKPECKZh;Nj2J{{hz4Ceg!t;A~ zz)Xk!_`46MJ-X$a&sS$mKlSjL*>_Z~AOG`7|6hteWPTp3KYiyrXd`MIdFRWf7ayUS zO6Df!@@{g1z$h_#jb6%-$Ps1h{mJPfVSBbM*_i6!pzRD}TA`FI%Z}$Nsm!My-VtGPt!Uw=)2yqu{;HigGmxHt=7=;V+kf z58ELK^a_l63UJSQ*v-SX98#FeLHN!gG0b6mF$^&*0LD*XDO7?y9;eKObRq;e4}jpu!-<$_HZ0FL-W2KLAqDAqDGhlrJeE0qEk3J}Y;Fu!;X=SaS45=I^(J zZ+>&#^(X~7M!`TX|ATklVYq)drd0}bqGMtt5a_mFeL`=p%D(Fp2nEoM_WmvSIWv#B zm-*|*htcXW^x>MY!^G{i|O@ZL(_Pk1aNl#|sjwavA71Q)` zsaBKRl9V#r;c%){hMDWv=e8XSRd1MBUF6$5TH3l1DXt#!rmIhIz)baXqbL<7%%8R7 z?oQ@e<|*b!M)A?bFUb#gt0=Kxw@@nzwA&kk6*q0m4*IOt>dfLI*Mbe}{MG`KD=SIK|fqI?rm2cgM;S_053COYuA{t1_bjzmVqCnFw+IhS6ns*o9SpmC)~gUAGYCt zt_ctnB}goLhX-O$VUHJM05O$=!7#@b4PJ@Q2+qv=a%#fI(`(8@o^@wtEPZiBc;8Bg zC`p<$^zeoEyKlIE=fNAEog$DtfW)mLl@PXJ*}0{QM(J)k~zJCBjl+3#?<`$DHEMrAuhi}w)&}sD_&e$xNe5Q znEWhCIlrZ>WqNO?NHp-+;=-1kh0K{(5Gk$I=H_||(jD0j_+ystNSP8nOfT@bT*?}V zPIToeaZYbCWGJO-kxa+YS?ykxR4-jDmJKHI2}0#CWGUrJfeb7f?Ad84Igp1w?$0_A z((5h&YOoRZPSH(!^hv{}2FL=-6a&rz>kV(hA4gUSOX1)Q)M#M-z`k_$O+ewVA&KDS z;9Y$54T6XS`u+VnGT3#`c!MIb$AgV2;6(CGr%CShcc!2wz1Qc|99`Ft+7*UKywrZD?s zClAFgGADq2$dcan(BP5d3!Xxudmd{K&whHlftR+T7!R?qx_Ctz&#?XJ+2Qub?qQyI zYQga%gAd;-%}h7yJFQKQ?0Nmg#r^ZL9Zl9w-W;d#Eu#az49@;sH=35}^QAI}-MK$y zWc+mXdB4-}meJ{e%1$sc`T<0+xqxJoA&kcyHnv&x1;ptiyCTPTIvCX9K?5fEeb>H> z=%$B72e{0>2Uxe^k6p{54HU)nWwECVbQn4ExFkI9XrLbuT4x1H6cQPP(Nij?_AkAz zx-`AmQZAa8 zKsnt-9_G$Z^FC+B>WYeLYm18NAV5Xiwst{2P+oPDtI6)Rl@cbc&!Rxst0~M5Ll6qcd!8X_z`0*5t~BPiZ}jP zhXjTauo-3_K7Oc>3!KdR)3V9vi;Di?%qA=XyMGPNt0&`*B9Ed^rhzh#Q~+j)>JNUGd9=JR)xm= z+}7fOV9=9n40&@xX*Qm?wx@WoSe?w7Dbgj)Pcqz}ypCG`f=^_hs=r$(RtX6k`ieNM zkg2|ZZ(`05oj2We@h-VWGO*6k&y6xwN`WbME)9~%Cy>~4e%W)Zh~Ye*s`X#LMw+mKF32+|iU%Bk91 zQNC&0TQ!Y$wioW&mZMdf&CCVTz34IbUQ>VJjLnEx&*Kl=%Y4WD-C(kk<#}ZSdInLc zFwwc9=|`ruZ1e5PubQwz)KlxQ4j+;z#7eC<&9hV;NHpyH>vEAgNw!n|m^UlGsQ&}h z`1rCpqXWkVyKc+n5nPGWLdv@9dhXraM9E9K+X5V6xS*@p*VS6on`TT*ZV307ioCA8 z4xd=SOKzTM|IX5oTb#S*=#G-X;?8nohTW4>Q1bf;h2KNZ7C~u?J88L49V3}U*)Ed(GrIDgdGc~#8*Y%53qCzTLKX`25 zWFq0xTIA^Fl$FizBYv@+xvO{R`1Ar_oo(SH6I!P4?%gbs$b_kN`GE%@9)4g^WAUOg zu1WxYjMhf0&}p%SE&d_X{_Gt-ju*x_p^jdN5&&)!E!hV5JbS-9Vslr~};O|E@a(SpnH4pT%K5 zAB>EB8o`*bf2)C4$$Udjs!Z-3EO*vD)1T96pO`+Z`-iJ+N|=nl)eg6Y{MC4+FG|w z=vv)TIIVE?T(_B7fQv^tC0s+^XGAzy0s+ z*L41;_QZYpTuoA{NRnt2$q>q?|JC20Ah_ZMlnmOG0OX+QfgmHZ6XpR>#e}%nLW*5f za8xZ=sKBKZXKReVWlX8B1`RC^?T8@@fvq0G`S7$? z=iBpF1;Cvlo~1|y8M-_P)nFey8~EOlggtCT&i`OD2KvSTER=R91nUGL4d^WK?nCRq z_L|tf431%C!?tR6$O{2d9Guo0>f%aJ8$25RgUwk?mcoVYwl84g@F8U}AF@EiJ5=Hh zS%C`=G7E7v|HXt1t<0I0$;+6MeTaFSIX6BrtrHA}iy%7vqN1raRrSpAL;I5^bv88x zt14Sss&~{JV2)m}{SnP0R`WW)W4>j+y8K+8x8PL>)@?vZKQV9p7mGBy#=YO>mvA;QKm4(bIq}~N z&Ik#~33EtfFP)TI73irE*IG9?x&&d@8)hjy*!%;|u-F6C*aiF{ z%hN^OM}fS?IWllw0rdF~G&fGeF}J3Lq{Y~s`&UxV@^{dGtcaz$EM^1NVsyNzW9z0C zPP0_3%S~ym^x2A?1b5t|NKRDpX4ehun0*rT(U*MWqkV^_PCe8Y{cc!YSGT%>{bo4m zj)$2>=K8MDa4RG#BBdT;3SbJKMvVSA3utHlgo>m|+6!fN%hM zER>oFj=V9=Flnh>{9}l3B0YrSege^4VMML#SqJvu4$nG9v0&2 zVxxL2iokCXGtbbJnDXEUm4$h8_ss6uI-|`^&J*k9iVUqb%jwLNN(~MLDIg+;dp?C= z^7Hm)--J%J?#kj8ZfR@XQOM8Q)jITKf!dIFu%~B#z^E#Ca%|^GBz&cnwD=?M21n0q z+IF^HPaWkf-IBSLiQKxiB%CNwrZ*ID-cOV%(=?PtrPpT}<-k~)5E}bv^h7iIVX%BA z{kq+{pX+p`q;U^e?csvlmtEPqEN^Z`QjY88+=9b(2i9_4a*S_ppX!9H7Tt@9XQq}< z0a5YIu$jCG9_1kTLGK0gI{X-2tZozNK4#}(JBS|(JSn()D!Rn8ZpRcn=YR_H4Oqqp zzE~x!R|Hmd$F*|ogD3FQ!_E=-3F0**zBEPEYIqF%masg4U^RE~wTazETv?p(@Wfe( zL2=HhM(XsmM2Ra|Q(0bFP@>hjj6N?z3&i(HK+kX~qi0@~SR>6&nLk`myRt4dJ%9b2 zneU%oIQz*<^o7n{6FY9~nmihA+tW3;ZNrSJ`DI&}6SBlx3|8PmW)`-&sqEzTqPayg z&-SHvKG2gl;BPO>%biosJR}qf1)D`G)L7i&hD*a;tB1RVc2drQzIILj2Q2|=OUyQeebcxCkz>f^SZ9W(8De<;f%Td9LhBYp>Zv^PVs7hhEFpL!!9VyVj+p?44um+pCaNPfGU`8FhWD%PrG7 zOzk=8-I+(+=_Zx^%Pez-*_a!A-cp&b1IxwI?Ct-AK&(e2rY-5yKgb~Fzhpi1#veu} zD{7Ls#?<=%d3!^WJy~KbO=89lLHJhL8~&vFCL`Ra;$^v2sz{bPn15v_rlmgEb!2D3 z0yH31sxulL#fqXzBc&mJ5Ib?~8}XRDddg_A#_3C4>g&xjm-gMczH<4ko#`TeX~|j_ z%&TkY*f7%h(F$XOAi?JyEPzNKJ{rgEAlMz11B#DLbZXW{=DW zw>2!Np6&Oy1`>H9uD?)i;46)Z4|_ZcuJGRLI?6pY%(LpLGtz5K%>y=XM<^#5JvNdz zC&aVeW*sBR2fZoV~LI?~n9nL81`T;!I%o(8Vq7V=zmWyJ|DBwtiK^#LkYgx$Q z_%KAm3LL_#hEO2PIChQwXLpzK;5VAmhaM+1Ig%O#j9UiP!F1SKXl zxpDyW0lsQ#D#N?J; z`(Qa7+0Fd*i_z5TG?BkH!zec1^6D&P)>@O$T?X4^zoI5npQ$ud8M(pzn)A$h=A8#; zbg8@V0ppndr=CLnNPkbYeer|LJ8)?_>e0B{I=Y@e;IQT9n0DrVh$O^U3TI;4qOfHm zqt07BnXDHGxjdyWFF09iEy>{eJEv`&njD@ooqY8ElAZ6X-$`X&s;<7^%(FrW2}iC( zq(ov#u4}@a6eA*}qExqDtjaDGsIm4-K0hMmdvi@y71eb!a_t=AxOuWuN|jma^cDz~ ztuQH@2h7PoJktS>r2iht;K55f*3K&H4W2of$Jz?F;Me zR&F3dBX~ld-a&7;S*qZeTrvp~a4jl|*`?Op>6Za z%ja(k<>lA6P4Bs9V?BC-93n}G@f}*Ste&|iIX?r^F&mE_c=N#wzDkasPN%5O>GNkP zNbt^Sz3!%$_XeK+nqi*1Ua?%2IoV1NPh^@?Z6;@$P39J<$}K90-DeZI6t?u71+7_4 zN|7p2Ya~-WZo561UmMg}66IQh#A~YTBe$4yv=U>wGrKljYZ5U5nVeUzmn0f&JPDs5 z4arJMtq*1!Oe&+_?k}E*G^kP0l&R1|mJov$9t?OF%aXlDUz1##QGp8Ui{*TyN?#Mo znBXh#a(D{eN|jb9EvpHZ2L;@MOq;*hlRDH=HqGm)DzbPg`P`fa&^N*cK=3(mBTkT+ zv;r?Z0(-1yz%URi#G|W1^xGc`AP%BR7TVdxhCOB@GXj{yAEpklhOnNrELmW)u(E(3 zOPPQTmBAgCk5%fJ6U4|2tpIZ{0%Bh{(g&_45VsL7f-n;>$OnjxnIJ5*jjmx7OE%ye z@8Ynsp2v@u0H$%Vn^AzH;__Xvu(`l(7nZUB#W83%G?xu3)br|-0xs+Spk&nX_?wWg zFR4zX5*MuL76mHXZ^&}2t?%B;XhWijuRO7MzD}KG_vq4Os)qH`?zz8|c=|0+@cnf2 z&5#^=;LW4R_2VP``yf5={x?sf>apE}_r3B;t5_?ptgcB-bLm=oHgC_-W_xe?@y3ds zCzLXxcS1L$-ac<_>T`m(!J#~pnRop>LF9Pebxr;`nVuv4T94YXDcm&1ymaCo<~4?S zJXNF-mk-&Ty*ZT|nVG^HF5Mj>+E+1`_7qE6mR8r-`~$V9ThzoIsa5Hevz{w?7Nwt? zx8>*K1WIcyw)9O-vQ$PkimJj{N^yHuF5z5DpL`w+^@&?jfB_W?^!^pd}0YLyQsZ$SL7 zI*u?q|I$c&eME8>82W}_ckw9zp$_8InnCgH0C(hJ1aN@N(}<<)Rw#AA zx{?QuO98&i2ex%M?vfo{U6$vIo-bnjH79EWY#Pu zGX34@)A!FhN2eDdVG&w%by4S5G=V*53YIR-U$+jeVXLBVC$^CV5mv<0j(1Y20e?MPzivx*Unq2#Qr z$B7pMp`6r^Gs_6JK^!inD<98ZwruN-0Qu6FM@Hy>-igBKx~x)^RGLNq?SYdMA4D^z zzW4@&z;ly75vse=t=9Crm^Zw|-qMJO`2!fm7JM*o?%a9#i_jm6kcj!Ih*|$@8DV*V z-oc(mZoWD1F#Q6qIKHZVpdJ1~Bg{p$9F;u(JoCI<4M+C%>zO~w)n)rRBM>?aviLn` zP$~`2F)PQ{amfd1HyBB*gBWL%ceD`XsZ-2!>)e6`^zmwMeokuhTwMvIvZ0cUsqO;K z?|1HG-aB@Tz7wgLuR`0<183-`JAzZE20PIF)2Gd+-+lghh(sI*YYpTeaf0b}Ay~9` zu?ocHz;#^@Kzu8J@B;}iCcFoL`*+AXPa`h7AH-@L480U6b1>In7ZNN?0|evD^H?u? zWt#@H6CecO$gZJ)-@q5KkU8E3Fm16u5U_Sp$V5D?&xa7ex55`imjBiyZ%@w^D;w_C`MTqs8`YazI7K-eeO-vC}M9-`x*VfW2 z8-2M=^)jtiCZn`Wt?E|Qhc1i7MX!i9O4sXC^J@oc66(#|2ayLGs`##ncea0i(-fhoDV41L0OzZiEfggNOwdO|En#NC%L#S;tA zAJN4;5ueZKG-`1orDl@&Jf<9`brH8i%fsV;z=Qs&K*ZxST2)dat^-ry@fJfRj$VhO z(>RlLx%7uZtw^gwA2E)x8zG#zA3aIa1!zHbZEZGl!>g1GPg1TW6314o*z{wQJ1fiG zbWf~xQc^Pgp+GB+HqRuSS_mRa(|jrVi4mc9yHUy5(Erlq_S)L~_&~442V#h8$I$7n z9wUf*R`7`gZK9MNi8F*aD^~3MI@*Z-3~gclh-z>xknoafX|xtSW5uQwD?m;2D$xBY zytg5zbq4sZ<^i=YhAYN+E5ekQvyc4!9IF-*y zFeHB(cHU=U?|mN7=|e!MPa!Mzmk@UHUkPL2*)K(=C~5&=^#_77 zU&mwRL88pq7;HWToKzN2>&k@iMJiSS-wW;pXGh?|ox<9sU?*>5#SxfBV6qa^hqEZk zvS4UoRX_1WhuiHA9Sp(uZlD?`-lZZ_E{BJ)YFL7g67ajCIgX+D1BcJN( zf?qF_#FlX)UhfE;o$l&7$QE$du?3N(ZsOA`<;ZY5z0XY!vzKDknKC!|w`ko@-OT62 zaxeW2XNuPwdDG2A+$d*<0~|2XR~8GM>Lz}%Si%-dO5*wlB-*3H@J%B?L3XO(B#a`5#&D{A)C`8mWjWkDZt$C!$%ide`4okt)0t{A! z*kC0Yn5Y6^oH_uJ1|b~OnwZQHBg_+^4Shf1BKTc=0g+k7V06J|9AOs@aG=6K0!s(G z`hW(@g+Ra*)j3}Kqj9)Yko_3PWrHOr+6-Fpd8z=*wP@@vV73APnsCYoy(b9F!G@N# zA7a-kKsHwZ7%i}Q0HX(rkK?+qUB%db9*Qq{7~f#$eMOj$6u?Zy@qp_9gAFsG%EO7$ zVAg!R?Z&^rdP1j=p_vOnufVv66nrRwi3AiB94g`ivbW669gC)~nFG(^L#4!3OPY+t zYg(Pn2M!|hGv4%+yIkcSa=zJTJ4bV$&AE%obJT@>_GK;E$-3S;rNS^Xm;R+?b9GDY zKD&X-m7C@8$K@J#TDZh1?my<=ICT3%Ia_2*nwMf;oGPA@NXjWnPRlhK`A{E^-^006 zmbesMCtP<6lb)Nw=le1Cs$_+bzpT*G2g%S78-5jpK9y+qoGXTuXgP8a4}fyvU;|4yDqO@_PDW#>nFl zw;OCWBVruO-bjNm6OlWNHk*OC^z4JBj6d>VnqMMQNLwhC#SH132gCKfas>62|qK963Yn&7qNn#B5kAKGR^1BHinLBhneM5L87pO&4cx1++OpvYb+ zbFV>`ExFC%}I^T=wuR+IAj zN;_lc$rE&t_v?hv0_bUkoep06@XCkRy(V_ui>`X}Vk_R31iaqe4BPU95XB(@$ain&n0u0VotfkLH~g?Y2WGOb!(5We&RDi?~F zzlwymv9SmE!Qqgk#Cc4H;ui3&Y&}QY}xYHSe3COyq6>UBm23H zTeduT!wt-d7j6hN=+KYG_Gw)cCw5J1H!@;fL*RxNP+Ka52+!S#o{DU%e1ScFqLSpP zaaJArOY{`Ii!CEx3PX0C;VZ>xU3mO|*ek?twh*O+Bg-MrNYPE32qFFRrkhYRqQPf(yQ~V5R~RS}o|2z(NtL2rw|Q zf*Y(y0wNxz<5~*)zXAJ>)4;f#x$N!&gBx@VKVT|{ODG>!F!0$SK|{gHXyMxh;u|cW z!D|K;O=pZ(lxP85S8I4S*ciulEZFc7L_h$*K;Pr(ci6;bSN8(5hz`x_^GRsU8acCf z6%`A^+Hj>yFxG)v#LLB%A}n%(AQY?th5}!_vY1?v&O)B(_yPlEusM&3apQ&X*Z}1~ zNzC4vmclEZMh(VwkO>9viD2oA7DYYm{_URGCjd1ZtTuF+1OF4pn*_L&?cmQhEErLd(iDpQ&JadCO5E3zA33MSKolBNLf^ zYUpe$v!68O-*%fno2eHm2%{@eOo&IuI`Rw1Z{-?@JqnE|G-#xB$*@aTP&I9h{YUzyHslwQqzj~& zGx{b^7bXg&kRgG?DJTmSSFdU@$|g+A_h#l7O)qw(no}W>k2jr4RdD!xPE|=|olq>~ z2sm9eB$=VfDebta*Ft45kArv{CM4tVKS|`tMLe-s#TS{;@@uC1Rq3Q)t&&;9(dFv- zkLryT#@~srRJJht!9bi)i1>+8IbUR&t2G%Yk@e#P#fJXm4Lhcijt#i1*RA0yg(GB0-y8Y(4L-Lj;X<4ao$bbAq;I;>D-=<%F{c4lQ znXGA@sGc}&%Z|yuW;}MwQXS|n;Fiz)=5FpKO&SR$ zqg@2oGP|2Eu6qbKpv>Y}12hkbcq#~yuM?77kpfw@2Bj7v;zB0tXEY{&Rh33=hAe!0 zK>m$G-Pl1sGbLdm%OUT87=({OWbzLn22=|WS4&iu9RR^L#(b>gVhIN(q8uP)JdPtq zMKM*SfNjPUCpW;ybSGxB3`8(SKyk2VOchuf#&_V5N38h-B_&}$hehB4E$fuQb77xc zkdDJI{E#fM46q~PaWEl{iw^VTu7DBqg_PFC9t?oup8j9 z9`{joG9L;+HqVOUVH~Ij6N&!9DbR9=-mJw2*SzSKkyLSG^b-_zxGmP(u{IkNpRJ*B zSy|~O=#%kGxf=?fm?vwT2J2?9(yaUQ*_ePwmgm$+S3f zE0)dxyIM!3S({hrP8Di1R{EP1;PjtS<#CsYCr^+HrCL{JaZZL_DiS8wl_%d3yu0=F z3Xj{+TC+iuBo>FW`IKDjm+(M%!qJ|@c>`0tUQTL7rN`0?sR-0txs?jypn7R11Xg}_(%i0_e570z9!90`g9d2-=_pef74xKo3A zZ&FHUS^d@)d;1*|>js_4HmMRKI-`SQ4$yYA_^iaVpgBvWJL(arD2{QGSWKyUD=k{Z zg2)t50DJN0U5kYSsj8$JPsZfUbsTOz>Fp^on^YPxmqZo|gsbOp#8s4~(UN4Z^~eMH z3IQp!+K4aEbGrnJsq;9zNhdt!BExIE`Mt^{Re?e}(2>@kc3Xqaa3Nr;NpDDyUBxrG zKuge)FdYJgYy*+%?;u{)C5X-LMEPjPf8dV5Vgj=~fSiFS+km4@0MbSSQeCm7VN3sw zA&E6)Av%hvU`~v&1b`mn0E=YMuRYG(0Mf)*4lJ>;@vrb47`p;k@Pdbq>cT0CMLY^y zjNA|Ly{dJKEv3gfc=Zk?y3XID#bqjFk!fH z9#ARtNX^W_nkaL^yvUjG&`lGbJgqUbscd)LGV#u{eWJ*!jQ&Z6ft%)MsWeFni>&;* zBl8S}jrn?dZJb|l2J(4j`SWYDJi3k=Z&zWG0X%(|)~qPs(w$RaOtTlwD7t_0RMKb` zUpG2>-KK5)hQ8hz^`X8JaJd$)nK66$^4SXDax=+=;a$0_bS6IEp!7BiWCTy1=B!$r z3Mwpxh;qsesd{IYR^&AJDJQT9YO%!VG6|{T^hz_8rAg8i(hoIc9QwzB=?`~%+xE3? zfBkyY*T~zoW@hu+>sEkOq&v%z0q*)?QJ(I+ZCQ_F0*_SJf!0Feq~S|Wri5Xn0>XRGC~IaU?+ zO_YcT$op3JCpEpi`u44Dwt`?;|L)5CUgpGLi1$*>;9$+=g3zF7!?Bqrg==f4ev&p( zIoVV;!>q6_duBJe+_`a$d(VCKyhbi}!sGkh6K9uGk#zwF?GS31-q-G{1dlQA;qfO&?1vTECfkNPL9u;MHIq5-z%0W(vVc0WVI-j7DQ^a zB7J0tNaUlulETuWyLQUdhC1dzNv<(qR=CuO$%XnXXJwNuWcRC!Eatq_>^g_oknNHy zC5Sn?+!nvI@4*W6N2SN;;y`w!yyS=+l8gAhFDACiY6B|59FCeK`Lvzm*<3Y*&v ztWJ|US-q%{tn-KjX-OVmV!(fADdkdl8XRH>Id%j>6e-fo=rLhK)i>o@X-d%?qgr8k zXj8sble+F{qg+WnSINsNuLNg#qp2vPw7o#9v?f>(58?4^^1K6y60#dc_5`Kg&8y6`s0m4=?AjV=7j6zBtc9({& zyJDiPD+ic`+Q&}Hy7CQzXhnWiLjq?0Lw zjA=n;3-b|o*|T4*Uj5ax%ec&Wnlc6rbCL^_?sy%1kBQxTAyN3T-~XOD#*FXX4Gp@P zr(+#INfm0zvspGuA6XiDLRf)zlsd{!l-8op((5vrBUOkf)y$-|YbP->Psh4rgJ|-+{cUag=P}0ykFD!~G_u91 zMLR+%6{vi+%4(E|i;~Yq)}YVN5ny_&WWM3>h;yGK`en2vwJgob+)kcF&l{Kk{nw)9 ziw^c>Wb_?ew4C^~UfpnCvph_nYQFx=(5%zfx3pY;de+dH>zm21=f`^e`mt7d>$nJQ z%C0aQnPO} zDECZsRgbAje-%_C;GeH7ys$Llb&hqi!NM{Xz-9nGBphQQ3C1&!n&m+yjRp!q#ez|Y z0(}Wqy5QYBASy(Azq0pNK@(gW?HP9haV@bF1A4>?&HxsT{iohR*Ls!knAL~Y+j7n1 z{9gsf_Lm}bgnrWKPnuKR8*+Nh=4@B`lnUlvIkoQ#B9Z<Nf^L0@c;$RVe@$;FlT42MRSH=_?MX@Y$di0&fP1JT zSx^Hj3|I*mY+tUr4zW0{00rwf3Qz}@OqlpZp#j4hR=;8G#&6)v8fC<=)-euA6v$a) zCs2x|xzNt4iT8{-wkv9Q7yvtbE7=xN>s`$7;ecu^2N$0vv;m9zE3>?M#<4kKHQ~R_ z4-_50g;YQg+>Z;`Nz8fza|m*0)QYnGYBFJ?jm8jJ{V!2#wIE?l&bC@qhvVr%}I%edK z0lDxWGEqaYK_qi9f2ysOOTq?=8&vz|wqRlc`Qj_4!5SGYm>X<+Iac_7ydv8fe zZ{)T~H!mzHS$OlLnfEUghef^Hn>ugl?%p?9rh_1~8axA&5>1ay@u*azk;*h$=2f8_ zbbm5YeB`mQRm2U%4J&zEE?r`@$`w`xCFI#}4=UdZ&L%!Mx@9z?R{{eIyC%sbC^FAS{Wuj$s&yuLTW$|A>@_|8wLhoamq>iJv?>s0gTI3i`#Xq1w5jtS3QS%x0aw9?3l>&jEEPRbVa$pC2a~C2 z8UBrbNNkP;{}FI0xJ|q~ejY80Uc<*wKVSvVPqs2!fEy8giE2u4FQrcGyEFp-z8#@Y zBR8|Np#u)@3{S6}9%fqUAvj?YM>zc>k;IXUC_ogVz<4Km5H+61B~U*84L<(%%I|sP zZeVssyu_?3C zE+{QPX8}eNSH+aPsxlj^6Rz8_+6tQD*A?#+oA6z8{Ws^Nj<@Eg^I-E*f)+EoI5i=Z zG%$8!keF@`C6OyH?>f(cNUO-DR$qQiE`Lov_T72Tgb;nZ+59iFc|Yjbe+rFH;9aRa5R+gx;94`vktBaM7 zz%eVJgiT4*{2ebeSPt>O4UFCHK!gZs;XbG*a_EO0{P!I6!$eN~r3Gg5$7b`5q0l0+ zgf#O_ubTK~QX(D@fxFXjaWhd!g)e89uyEm^v#5W{s<+30m$#Wy517a5Q}Gs zBHf%9MdKmzr;1FNTxMoP_3SB-;mfYp8_aSs#jTp*s0(OQHBysYp5x98*;R?|Y`Xg2 zh9UN>#9ND%zB2SXrmhTd^fD0HtgDDD1_*nCi}ly@fuC{_m>xC&lhmCs6{KX?dv8HP zf-0J#N&&12*cD>b0vwJ1UVVI}EQYoi1!MS)?WFJ_Ymv=ZFoL$4}8`hY8g)^i9LeiDAcJ;Sv2;fIeu{4jA8Hynt6@s5QrU*_?{mnXYXI&*<|XLy*-h#w*U@bLK0 z_>3crA8|{Eha>NvIz@VhhndtFihsWcja9+R_r45&^h?9TxQqCA zg6fI}Uk3|Z+;*)lroWFSGg_N)F9-%+W^K`;T6?@f2jqZ<7uDEPti~Qrxmeq-h-&94 zkk(<%eSDw7YT~cDhRL4_-iHg5!~f9sw|(I{I9xzX0gTx=7D2JZASzE}<9>-jVa?kr5hgfJ-Wnf4`%IMo=*meq(3M zgT(U4DQmIbR-589`(4&>u^$3j8?4scz{=N%VCIr#;M^_-wDaRExHnThhC_(p${TN^Plm?`P^74%IoNWXzvn3GmuS$~G6&;-3Dtpwbb zF*!0ILf4+7uY*Cd%ywn1vvb=$&HqMkl24gcxeZy`p}ul55JY>;s9I1oEU!#KsQ0uXEQNZLu2 z3XD0}P|onH0)-ex4A}mk2(6nOIN%ozQ_v+A^R} zj{=1pMayPPsUk)#NaqXJ3i^4B+mBAo%1VNlG29F~Y8*VqO3o;@SkPRQ$&UTSn^kD#}iERs7qO54#!qH%QeGdQHs zMzTB{{sIm!%_nw@j*iQ4wQCv@uaOSsSyUeR2u))SKf_TGcRu>)odiTJeSwG+kx$M& z(B6JvZlsz#OGJuCMn}IL9gU2RqOaJWAHnWL$HK)afD61@U2OpzwS~f)dTax{1Y8tv z1HI0Z3D3s-J>I$sGHg7s3S*Zc_B-Hr+W&upkGRDN#S%#%=n*IWe}SIJ-EE`oolU9DI$evqsk3coTiMK#c4t_x4?EjS zX3@_7E0}6lio)Z-X(0*oJ+qecV_2kY{$JtBiZ;dJN`p3$8O_b_j*c>-USj)yge$Ts zbNAs;OSd&S+1lL_I=nk8ZOL#>SGvWL-jy@FgekZR(g3sy0MZV2bR5Kx_7VWzZz1iI z=4Md!D}e%Oukc854k>DH-o%>7!a5ybG2gBLQzX37V!9CntSAkM(GPI<$qTScBdm=4 zE3g2@tL%CUjzR#5kPtP1laFh_Dh_PpfW~Tk$WhrL;B-`8)}gk4?Au5861|8adN0?K z>-X)8yd3_TKX7UPe_-jqGSIf&XKcZ4H5$bT{63K0Z3L1$+_i? z7H7FZV=<)ERPGr6*H1qYukYQvmH3o4q4b?vo1jR%;_+Ew)W|&2412xV@Z6q-=f-EZ z8P{@^Q3{T^${C;(!JGA+F`Im#+fhnty+WO@JSN!40mq5$4B^9tdRL#T*s`d#JF88I zw~sbwMPn?t3W*zh|3`-9O3#qi0ageKfgNNXPAttwEDwukaW>3n!apwvW>hT+<&L;4 znTpB=h?931Olbf0^2@}H;0pA5h|&IfItC@bBN`d{)TuG_Ak#{EDzi$4%7eMaIyVI8 z$_&xFLiEwho{+t5+k^?*+S;~s|Ma?UnO-hG(dZjoVlHTW0Ik;Kj_d0ab1o&r~TH)nef&Lty{w3EfDZ2 z+*mYFTs%+|{ige)eGzW-4*CGnFT0qGAJAzY%<2bbG zbi6HVCx9t}9k>fCq{zTlv{4FS1<^1p3b8?00)d@dvET#t-x_0QthF@CF+jZfk2K-#&fK9@MJRNhMml$QzPN< zKe{f4FLu#Y=yBKud2k7*0@sbKz{kuGGLp5Zek>)ao4r4el;bN^A20bM(km7 zKu3%I;&$7@zjUDcnRYKBV^pqgNTQ`v8x|DSbh}N-QkB*WOl2s*Tj%O^`ztE~o^B`O ztn|CPT%er}?ZOL<_j!(9vu>S6&%ka0(nN5Wi1%>hpP2h*KR4qWBX&f~$InKaAPIRP zlI|rJj+wDj6>rVulbR$hHXVV+<8^w?$cRRdG_gvNDbWkCb%X&S2|%pv?)cEe%2>;- zNgDDVU5hc5e)(^I^Nx^j>DrAl5JtB#o>&*Zg9n+?2MJ+JeSLkqk&Af|&1Y_`Y;$I( zXLJTCYRdF>eJMyp9|k-c20YUJX3HLBeQ<1sM`J7x=#zozi81vcfrrpkEJ?%8LEz!z z02orJv6P1eW;lZle)JfwQ#gh*)&^Lk7FwXajT!L9P)ikEy8d6+1pJf((6e)3ag??6 zU@b==V1(ZZW*@LNf>H#qGb-eZa@Alo9(Al@!&Sl!Ko?ka#G12#qXu-y{$1$+ZWLOK z+1x3HM57FS>g7Wa7!%QwMjlN6`2`}Ges2Rx`|RLBbc)zPFMpUlra9;qevej6f>rrP zLNP~36*T%}s=_qna2KkjlNlH4g*1(~i2t`b8K^gskSHQ}6Iyi=y@0Y#Z*wgLiz{x6 z*rPDlPnhWDa`?%u!OzaiIJYj>p&h#AeT=^EBnmN4;7^1h$?bHZ&Szp~hbg0TxGos2n0&J2eyPirQQ(X(V9{XeX| z2Vfl4xiG4k?Y+&;Z127IU1@ivl~%p3B&%7?vLtuQP3|@}HsFG7unDG^Vgd;vI0-F4 za&r?B0x?P8rYASaPYUS;$i0^Y+uF_h&Wt1sA@|<@y=P0BnKNh3IdkS~=R04)%#~j> z-%;trAFagEdCMKRuDg2y|CLE9Ve!QxK1VDzSAtILL8+Vc*3|e&m$aO~1>N11-~aFG zVG&nWi&(3M65zv-*y&pU=w8rA zHNkpsebs)D7j8pd4IGr*3E4-))kx8REFF+dBou*64Y3oEy#&}D(u&3;$BEpFz#h^8 zW{}7j6U>&_a7Ej+)5e*|j_H3}a$OtXMvHVJOfRteix7kEibI^Oys-J$Z%*y{^7g66 ze{tyW&mW)K{=)9lzdpA4h058<6J8Hija7R*CnrB$x%_eRA{Kn?F)VnI{CMT^r$1Zy z{nHkW%Jz1K6areU4_dUKL64~(hK2~b? zi}R(EzdgP1^;<6=%I^?LB#!ka(|U(QBE-&kgODZ66X*_lF{3La>=XtZjsP4&F1QZD ziQnPy!yyRQPWswzr>~uu(c|fK!M{!*?t9nI;&?(Nk=QrNNm9PiE|G|;>Xt*bsbIIj z55_aiu#-PZo7f%&LEu3;Am>Y-J%D`z z_Dwzuz8pWqeviEamfi&J!xMN0&*5$O0KOWZ$M@hj<0tUb_<8)(_%HF_;D2CoSOQj* z)yvw%2otm=9ddqQ^jzSbiFPy>m0GaNiY(<2lfG_~l=iO%U6~t^HMqt2Tf5z`Il8D2 zV+w(EL1Rp70F`th3h&D_2v4OU84sw-nId$bVyx+wlxj@FboZz>RJ0Q?Oc)9bjBbZ% z6iz`iM~@mBf%|kXFhaBfVcK=0bEIvBJ>bPL&^MqRx*9weN3@oCP5M#vB=knBYnk5B z$e9;`YS#|{oudxu2k24T(WueW;6?&BmfnP(1r+R<>1VmQrCy*NX4vRGATt~K5O4~u zpy9(PV8$5NRj7tG&!GrHrXs0`W)nORnLumGY)UV_KhpsEG)!YlV{y3|cDMX0%&Q?k z6W~$Mz8hTJX-Az_KL>bcSZwy%gUWY%LexiGFp|5_+DlvN)dW z8ietY;CzD748*lYGXcWrdlQb%uA3&NPsY0lgF6NjOx@*%e!wWAl^RT@3cQm8MqK`z;cr==#olwYXUl)ZQ*H?B8*a-niM=2 zW*)Ws5;D>xZIP*YTuPwUOLJzgP~rER4SbeOV=_|`9lL~4Scb1vyOa{Quke^cB2`%w zM9cx9QtS#PHSIHVIqds*EbCu6dcINPl8`B#PzJI!kv6%0CFJ^Ke3@M)QDeerdV>{Q zJFFEQL^c&G*b*N{9`YYm>)0N-F(u}xC} z`FvKIb%t|p-=Wgg33ivn>l1Kgd_LGzt5R4dX0^*?N%d)6RIAW|sXCQ7DDvBlB56P% zlv=Nz;nosqt$;0XcB)&h9?uy1U2vgknnwlq@%S@Ykh2De?f5Sv8f*4V9HHd`zknY)xOg zXYN9+$qL!zY*th4g}DR1!}WcA^@n}so1E@kDBEgh{g=J1CY*J-ZYout!%nNy1}RHg zy_sC-BR5yWsR3*bPs5#_x?G`h!Qf&MV&Hdr03Veev#VX$Ep_Er&spsGkR>eZ#xHft zBIa<;ZaG(~)<7tlH%p{WQ{C2W(Ftd<#H>hb=~id;Qd}NwChE(ds3)3Ya$Ks<;(yY+ z)OKiDCz0x*Wii2WRW6wfQn%~G*Ta!lPPp7sgQ>+~=}BZoVhNj)nVk+zh)qdFdcQ(; zM&ss-`6f2567hvm-Ca7VK)`cXHtPjO5_SgFlPXcTR#Pt$tNSRq_cL)WUo16~t~t3x zq^x|`>JiGV^-7VeN6M!Nz19&`Nq%LLh)J7LyOGV}+qFi4g7_NPFiVKqm|EyQrWLEX z97?Ek$%Gc|?=ibVvy(NVceC5OiNU}WkLN>vY9y<)C5OUS4hg;?q~>jX+8pZa|W%>TJU zUa<1C!ejlTR;>$LY;38XwL2?UXjzz2!ZQo(*luW!mo@A3n8@lOwOJp=HmQvw4!82> zxCv|aP|Dz^Iyy$quZE1QcCb>+WWWN@u8mq&pa0R19`uX(ejY@s#o1x0#9DcqQiUQ? zq5MfN*y>1l28GtY&S2*&s*NJjC*W!EQz{`_4o1?-TtuUjbHs|uc8gdjBz^e6@Ni{Q zM@RYZI7g@zvSfT7L`C;_m3)QP$S40OBPda7*a}LcQOm_4(nFcOmCxmJ zvs=aqFSJ9FyLXc$wB#kmw>&IXH8!fm55LI~3=a#yBa5SB33bNtaidPi(sB5*FM7?C zhYX43YK?|cur*3a&|&sgX)pmSD$O8kE2`90CfE(~gL@M)U+xDz-Ci({yAkrj-(U4{ zkinjYKmadQeG^RO{s?jy*loBJX^>H15nBRwgX|t@UWu{~ zr_;cX)WDm8y(3n(Tmdo}EOI(vbTq%lAa9=<_JkQD1p3HqCL$)LKsjfSxUWXhV}R3x ze8W7oG&b4-VQCbc#ZfH9*@JwD^sxT1SJibbgN*}LNS6$H&}te==_~fRB09Fu{d+@o zb;CkQ8^gXf*H_p2)Kjf>rEvDpp_)jgK^v5W939FR{rDj{rjs=pRV5D|NQgC;n3`CXt?-1 zbN_SobLoTY)*VdG)pJ;^O5J5`Eo2GL*J>|60Zn}m{Gk358&hdiGMm#yoT=2;WQK+^ zHNHgR+B^6OG^YFCTv6VRKf*dpEPMp}*pOz1x>-YDB z4PMu5na$cnEF7-Fv03oVdjWvB3ziKKv!520NF;1CpPF*vE|8T#-UCkD>I=klB z3KRRcY@1r4Xa9y{!5Txw1{}9`H)INWF7FXc@V8@x3ewBg==i)FGxx}-WH1~wSa*N_ zrfF`;7ruU_(-?O)#a|6=%TFGNN9 z-wje$^$w7nIDDOLSX&sF^&OaN;3Phu}%-@;zU{sZUJ%Q2MJ1b&cg4?ZXK z5q(k+G?(ZE5@XRPqQ5peE_zj?^&1ztWzp6NJlJ`m7X*y!I+Ehia*fFpjm(aaQ#XX@ zrZY!he~p^21BnHc2;9XL1~|Gy;1M8PX(Wz=z>J*c=@t=XLk}zp)G!kIKGPRkW-zYx zi0UmZml$#dg7=cMRVob^;B`+oLyP0|dIYwIP+RnCq6t8Au(*ph zf?@>kApJvUOl4HSfHsoB;Q~{DiC0W{wi?!A(M=rhETDHGeC7Ii}gly((AHn^qP3qm59|_%+BGpLcZMN z6bgZDo9-D2wAlqcH}xdyA|_L$E>Sw#Be1voNA58xSeQ^`_saRgwZl%cr9PH$=3-jC z#^Uy@itc)ZB0p9>AZqE$xe^hfsJTDqOomwrQ7~$=MT4TnW99k!{#f`z!R3@qzZe-z zP8Th8+9p*!ekwgJbGix_!m<9!k&dlmo|NCeD-l)C5A@g9_YcggqlsPpP$=Ho5pTAn ziCD{U(PwXs$GQnsPb}VQ_Z5d*VnoK=9Pin_y{EKoTjfyqR8Xc`Lr8;D-L@v9)nKw& z(rJ^|tTK8BN1CU-xxiR1Q){T+)WqV8oNg(>QBqqn1G@s2kZ!Fa7OM%Q$EzcQ+3a8h zRA+&jSWK~27qa+w4Q94bN)93MI7K{m^TujpK9d{w=e*O+!$V#JVey#K8MEDJv>2P# zi5j}{TrO826r&RkM}R%mljrkCijBj3ejeMmuU^%pt+N!TlLJ_jFp_lU`dfs;NWzut zYpHA#2sj*WuDd}j6hI^Su7=8wEH+CrM5&cJlW#|EEqIwot#_@|MyXKTXEw&`qa(8< z;r5q~b|d@a?xQ6?tZ-&WqV;j3*%uE%^q7_BZBn*>aBXgf&!khTsZbJ{{N$lSpTvg= zqggD-HOB~(StQIi#>xjGjai{6TZ}}CS&=Z?7{R{1vOYXSwr~%fNH^h)oM0)`utKM6 z>7OcprYU{m5VwUK3fHf^b5#e9?dnfXn0=8I^R>0}DWnvkVp}hK!cy**Zh3wzAxAAwprPdL0aqiRuhGb>*j2v=;#>#BnO!9S{VU=kn92#B@hnh70C7PygeDRc zkG5~1X)lfS*U>DlXhCrtzr=cL;hXr23+u{H?Zjdh`}hT9m^5^LOf~o9+8rv03P($g4}u)MjV0>Ypa&b#9KjrT|oKvA)Hq~8-XR%rhhUYDX1JwQAvP8u?g!>U$SABg~v8MjfYxhE=3rdcS^Z5!TBzcf)xs{7Dm0TmjzK180|J7d>o#;AQ7s_n>?63EBoy-Koy)A*YHEl;L4fyYUW$JEL zw{PJ|R>4=^>SN))@^5@s{i}+&szj7HQaRE0@!F=AgwWk+Us-~`oPzJ-_f`S26I%8UqsOV_Cx|Q0BZoU=|;e3Gg)L z1c0Gb5O$2#@BxQK5aQ&&VjC>5ITN3Fqw*i;QYSxhTQ0kAO&tiM-oUYgg_Ae$@?XMg zFz#12@_7!WNUXbhq4Hw)O*@mR@ysoUpY4byPL!0Dmpid)&db+WHuhUr{*>l;GN+p> zKVcIZg{I|T?`*wM;j>`BtX$gpwFBvWyCSz^ia$Ly%j5I((V~Zf+|pi1m%QaNq&R)~ zvA!F26en+wTY?Hw56+mmi9I#hsmzLh<=(X;Sz0ybX741f-BCV`wYOJ3_oHe~V@85m z+Y0rRoFWHtiAgVaZ`->Ec6Uy~?#=@+tM#De9|I?j8$ic@AEYFGnaR5a;0qzq2NIjY0uyl2omPPe10odj!QhL%C)g}Ygy=KFh@d47 zF}x-G@)x%39_;1F6@3aBd*hC&?q|Q~>}YK4aDMUGuGKp>vgPtVxq{O-uzSlFUJh>= z-h8augw>d;k8R%nm-Vul-|yY`yBXQ~zkId-?!2JHRt@M&<-f^w(uvOgJEJ8{W4qlS z))Kg6?ib(aRJOhJ(+wMc@=}|!^Bcc#mh=NEc}bnW8+*2i(1!iCj-s{{`$&J+xKz9F zED^Imaq*$g*rV#ip+w@)_ae>k5udoY|GdXI*00FSujkEfOlvkCb6GY_-&L8e{3&TN zB{2fK|E}o`7T2+jn)Jq5-un5BqJPZjIlup6rBwMzbL6m3OExH#4W!nGuQQlSW&{1_ zR|4@FZWEjH#`fTjJ+ULVKlf4n@X@yQBMlGcUKZ=s-D<5^tc8PKTzTh0Cx`t8xAHx) z0DB~ud$3_-ecRDt{YRg>{YY%j4t$zJdDSkT&!zTK9H~T7RfJvhr2tsS!DPui3niTS zXU3vShU`14cEg%uDUZQzRd*~Kk3RhYlR=dI4OyDJK}Xw#ZKtZgRb8w4J7iblK?Fn@ z>2(U)k$f+t7T9kf9XtG0ASeP|Hf=DEu9uYiOJ&H`0~sfwctLK zXN$+VUs`Sg9)_Dx<-MBhHE{7E<*YAUSCwv?evIxO9(bQ6vj^hgzwpd6=r5+ZeEAeQ zsf;lNc;n^EmG50w2sSiu+jIHy!tLnfpWMeDK{rdxv;S>P{P5+=KfSIpIK;w}SMHA6 zxIduhz-x=q1AJdkO#7@$5Xck;_m9tCd*<@xi>RUhsp7)(sMZG?!u|`D&Ro|z(+-r( zpgUDP|Gy&c`)$9M3}60j*+lGrL|hQi{NUyr2XQWo)nP@5KHP!zVErG0&;Y~;p%F6E z2n5GvFEuzvJCOfV`TzF*|82eH`X4}eq<&qx_rE#*f35Su=dYhDnkamb008pSNKY(d zDi8y@kU>{CrLPwYujv-+zgM_;=gP|;eh1yY^4fJoLI2O|{gc-JaU|E#Dw=+wSNI3g z@XRw{&=mm7&+k3+%w_l~mGI%^tBQE3kag1s3*WoPe&V0pd#?)Tr~iGG#hMqdCkou3 zBkDpAVDa{c9yr8*Uyb#T)tc-{UTxv;8R=6 zKgzJhJyZ$^4Q_1-N-C&`5 zz{s5_4h7BR!M6Pa=cr|{Zo%H?1@uzoGWLmImFMw=*B4yuj)lJ$DmU}qDZ8%zfO9Wg zlvBKSD)U#4bAR`Jm}TC@cOSbBGdJvvZ)Te*A6?!wi(dGCm?uGz}*RdyAw zw86!-&u(M=xXj*)pTa65Te0-}nXwkjY^@CAr?$e5z>l|HdsfMN^<5ZZp-}l6$Gi3F zTKXE_RVbAAaCdLLq7|X9G9_O6&{u$6vMv@13t9BsJKW!1IZ?TQPB{cT66V}<^@rsy zbj_Vc*X;HM*X#H~dHx!9w(?4q_(ML~`z6tT0B00*7XwR08bsmvK`>sv_knuv1LL>h z^GmWubBp z@71f170O$#hgO)DYuC`L^Ik2t6s}(4y;?b600;dNczXW`JiU)Xa*8`Zf&Ucv+q@1j z^ve*dhlG@1^g0Z*;Yb-xFVv8_mtr*aNJ9_HV|sDCxNJtcW;Jcfx2$AB3$4XPGQF~b zH6UoHY4tQLlWA28T+s0l(Hal6fHW&8J1$zl!Gdh@h)iA3EwrjcOZFthsD|70jv+Fs zanqq_89lWfVw@p^Ycx=LDTtPuu!cknJjP@O7VvNZ=djpg8b!OAFdh_Rm0sUdJUgr< zp$(=g+ug7!9OriIwA}q)XVgv2!L|GEo=66bHw`pys&ky)cL`&iTlI;#(Mu;va}(y) z{>B}*wL=)ZgFpYs?9=_mxNWT1zCj<$8ipR+YHPMSJ+f23Jx(5-vUy2`PoLN@UN82o zi^lyTDr1UvhV7g7EOdDSBLRzlU<;946O~3+o|E!Grw-D~Q+GtjoBsH0@8h3&YWS1S&5pTG+`s1+SI@~|zZr}G*mH?3 zB~Oplu_T#kZ;Lkjutu756@6mhf&qm zotF1ZHtlF>E(Y$ay!qtWAMY)lxHP)q8Gq4sM{oOW^G!3)9=Q1Dn|yvp-I{3EhSeo0 zJKv{uOXVaXX}h7b@$S0xnyB6=l$#vY^(L8|)5&HDC6Q7X|3U!VQ{sl)nhaqO)(G_r zdr2vml1P1ECLWExv*$a-LA8}t;q!8Q{>Pfz)s!sayk?0t#C&O=IJLIXlk}WgRXi9u zmwsV>=Bce5yHRD183C-hV;HBbi%~xj)G>;~MYy%wAZ{1h+M*GFa)Mg~fbR9c z%wlvY@E~Bu^`OfrD`~i9_E8b&^Vn4g8x~<7S>e)X2)OES(*A8UwxVqvraX;*ExI!C z+U@zC%X|I%v)D_{6-r4B<&NCE^QWB)x444iK|^q8Gm)K7vyvO`Osq@R?5Gj&CCL#- zJ>CAq+V-#ezdaC_E`ac=HW^ApPqf>k+wnO(OZB1 z+P=!$yLar0k=Qo5#B2UOR#hGQd$6~BJ8ASAD5L+h)8D$Uy>q8=YaVM)baW(O*Sq|7 ze19?xtHMwH+l*}LO#j4%u^RBd!h&;O+IQyT!*@;0pV+_tt`{n=RQ{D8Z1J}2YVFux<5&6AinQ>dMdGIsdc$PoJ8&W1#!grmcs6`qI09X2*%n z*>var_Qu^^?1|GC8fqp2aRBZM0OqFw%xAzJ

;UJ_Twa3l_ohSP7fK4l>dQtq!FD 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 z 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�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
  • ^ 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

    ! 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 z z5(V*xlgoijoRJaE81YOomKBbs#;bmM+RK2<@nO<3%B>Ofd?2qC3YAWi_E;`*7)Be$ zw~n|(>Aw`0#IhshbiwISMOUoV>b073?l{HUJKHf5RvGqXQdY&bcWxJXG{MN~HRf~3 zKmy}Yvlw7d;Wjp2&h$=CgHSZ!l6G9+Dkw<+ZN)ii^=L*Ul4h9@eJfVQ`wBlR>mR~K zKMh>yrv4Zm7>Ah(F1cpZRcBqoTPEqXgiP(MaQ_XT&>F${a_gA{0xx`#g+&zBk627(y{(Sq+6K*({odX@H=i z@OhA24vD<=Y;h0N%$4O{1*olVvl+_MR}}Uk z11%FvKyZP&1OkBU^$Hsy(n_Bj8}Mv1X+dkTqe<`4$>|wGb8p)iKevh&97&>MWO~$wH*YAP{J6Sh zSPGRgQMOe-YAIw9vk~HBTy@vBc1h#r4WT^!g@8{`soIxT*egf=0LnTTdXInjJKx)T z?UmgfT+6hRUi172iMp9{76Zaf^Ba46+dDVP`8-yHUbB4>E*=2zf@Fn8TFUI zwX;F%!bH)^OpCRUyz(0aC#uK6*_4hK5H~Q=$Q}#-vD}h%2uW}ziUM-=RBP`JzXk$Br!2xIWD18kl7j%#MRi}ZwTM0EC-FEQZ5OEm zW3dmRX~apm3-6%Z>BOw&AYH%?5KOCK?Jk#-_u?XP#EzaxVnGJX)FwlP-lGA>r9U1F zWn&MXTXs}Rf`_|wGhl2Gz?|+wdnYbqDzxqIb+r0}y0LuT_fm2&O74QpQh1VO+cHayGCFbpO z@K)3SF?LWy_!&mw=!V0ro-oUe4I;>(KZJJ}kHwhr@Lq)h(E-ZUQ;Ha7i*ntO38-xEl6oRl$GWs}oT%X; zs@bAegzef)8%4Uuz{X|7oTix{LmPt?bCN)t3&xy8Rwkdp(cvRB%d^_!)8T=&sFF0K zjCpqN#@-J3^%m6rqPnM%3%g&r3?C$0)NFwxXyQc(C7#QIW_d_Ktxf}_K z3O16O#SC6^^&(vhf3I??!jiUDOhDf=gQd`3(la(1EgQ;1n(ZP{Tr01Jtq7!}EXEUx zA5_J5!<4Mg_@zmo1~7!qP>*LGGdvFbDE}>e^S`EVR#LfCtvB0{p^YNk*~-Ui=Vxa} zvP}kNL_OPt;-UQ}@GLSh<+$A)sPChw54r6$=(_=-!YrrfZp$7|7A?}Gszk!oEz{cO z)-S$<^ZVvYR`>Lm{+Itrh&ZahYFdMD{qCzT;1Iw4yF{ix$Pmp!)gB%mF|tr2kocHH zswCnRq<=xu9Z^(7a_gI0>*W7I43C&ayAY#hyFBpCTQ}45)Cm2{7sGqAiM=ETr=GC~ zhGU7Ga9+Gy4l`_Mk~LLnY{a9{4dp9QrH)7m=$;8s-glV>5&#->h-!g0#WVh{d6)8U ze_vtq!Aqc*0mx$CM=zT9{M`rAlg7R*AiviGB-&lr8+mRXmsADPKo2Sx&H4`u*>zIw zZpj9ZYh0or1H&M{28Fvaz zO_m4@W;oORYF09m9@d4^YCP`kMyl}$+;P+^RuU2{vRG*X<1yco-Ntd0x|6DBydgIp zML}LXtXhh2ip`j3Krp<$y`3xFfs$x2xEa4GS-_ZwhdA^@Y5;kC^ho4~Vh>?S(8%Gz zq$<$A!wd8sWZ}ZtXR&}{1fiAENtCnhhQ6it*)}RD^S>co5HtzNpyZD?qIfdl5mTTt z6&W#740hEJC)xMtiR?;rwX2^3A;iLUL`C)4_s0>54Qm`6>=2o=^7>mx^p~&iTmSK2 zWZG-cIyMw>vRY_ftm(6vK`-aTazm|V$2wT^YV!|0-FUCqZ;U;`Y527?&(>nD$X-PS z>#Ce<+|raJE`GnxWXSJWS*zn#Epd0Ep%J%D*4s|~A6qZH@X`yy?$_%-Vh3LM{*OL^ zdbMfY1;2%+G;s-A@!Yv5^vceS(^{+8nk5ReKKL#)Fn#JguBvOG1Nqz(3J_l)D{ZP- zost#loe%)PaT)VjULI`DDCrjw66~!D#ZQ!g@dh)ic9|Wa|3LL^E~yJ}esJf~*Z*^Q zb9s9-3H{fr2Ss+JbXSFS`As1PWyaB~0w?@e^+Ac7f;I*W^PwYyGfh=oDPtA$+j>17 zsYLU@eeTLIE@(ZNdqxf4fAD9m|8*iHLYePR&o#Jjx` z!S2hep%d8E+c=sA11m95Mrtfgq}W9-DbenQqzme+4p>0FL!+hcZU|TO1T;WGP8gY9 zM=;Uwp->QjVqkT;e4`% zR-ROgcSwZQo%r=?kv4C!(;>DQI}ph#h8D1p>s$8r@&%IuqkgEm><)(n$v=J8wNo;~ z(5t2TcLs1sQyO!>A{0#h^a4-{b-!+MNtMbA%Oxg_n~P1_x0+6YY&0I^hS#^KMZc-@ zwPIS6aFWj)bnPm=QZF*^6Ve~qBomGSfPp8r2q7P_z_cczPeRw?~}G)2E;l4mikTBD-<5(Cne{a02C)}aj#vY;b~8`s$2ej3-qJNxK0 zE#zjAQ9f#Y*V}MOM4Oe`T`Fc(8l;+GWF~%|F-ZX;e9MI+oE-(F+|!c^(aO?UO;$OS z0@gI5Gk;S)5|eQ>0M4k-nu*6U6aDTA;t0^12P6U+SBM+LZnV6aCUVAidhKQsKFLCg;sQR9%QdpN-xfpInCkuP zo!8R#aM3)O#+i5FDHyZ?6#8)9_eRCF`i0SM0rMLjW3Ak*A5>CtT-wqoo98$7_iwL9 z(gf&+Fg}$EMgD1u1FsO}C?q`@7kkrgt{F-3?{K4epj>mS+k}vjA8dlc>KkHmOkHFk}-+ zNzCLUg5pjk&x z7n{=FN-w@h$hX&SSltn>CU0!7-=0HqDNnK(*M||5mpOq<2Os={uZw!d^ec5$7CzMH z2z|lL$5_OQgkf-qjOGUFg8%ihOX_f)$ztT7X%!sE5^N2wVb<9MDJ&awiuwQL;F#q} zmsbk5@_DIQ1Y0B<^b9POeP&(|6!|aQ%9s2`D>?7u-&}+Rq%RYXXY%_Fe8r}q>-UZ(Bvcexd4OB&clbtwFD%g5#K*Kc}$!N zOexAO6M}Lq9+H#_{dYY6U(@UhIZ8reldyuGg|t$7rBVroK8)A9yOHAo-~f3dDL(b9 zAXa*Qe%6l?ZkBZ4pkp18Top2T{G>yIY7>Rtqetbkh9F=>u99IWc24Cm1$0)ekWHKX z&ND@E)=|$$$I)$^9v#cF-ab78_ikAHDWj=o6U6a zQE-H^rxjxJ`Jjdjh~Nj5J{Eg=AH>rZ^jN{j0=pFR0{DY zbUW4&4KvwDuI|e|z4HLKQ*eoH#y~D*F?!}QM4h&;9tVXEPF}d8h!(9}z5dn9=i0<( zL+a7anK)-WMP-Z@zONf?+}JB;vO9$ohSaw`CUY+4RfBwIVh?G8oO!Ebk3(fQNnluy z1SscZa>cS1rDb471Ad{|U_QSp4xpo@?yXy0{V`QGAbucR%n-=Xg(d>^koWXHU|rXD zZj;nV2dP}TJnUy(h5u?`zSskDHi|0Z1piIU%SYN zA<>HCs}rdK$Na{l_ONw2&JcAf#T0`evcY%A%*sx5)P8H4h>b8ftZ%*ot?V4f7fim; z`4I=m*x``sQd40JanJnD>J^?j&h6V3v)PA{!2_KJC*b8pkf^i}h$Y@1^X4AoCpwV$yekMU&&42#}^rsvc`}^yj)Md0IrWDTHR#Z8$8HzuKtWekFTp1OoaqB zW2%SBFy*cezUp(TM)OaHU)H~Nn`79tTIa|>E~tSlrH9(l@=!I8%O=2#^ZLbf5AJTh zf^~D=)05^wKG`&Tyja(aoX=IGlnpET9bNrj*gg;?kEghIeXAq)?R6 zVumX<>1dikzc3e^mR`(&=hWp?UG$^KV(}8=DA;gJPKSGmaU%5W#RBo+RCm!AI5a%O zvo`ey{uF91^dP)#IK4iu-}O9Z1;UwgF*Jp#{>p1d$46@(ke!H!O`c^qo>bB9O+%(F zPb^{;K-}>zQ-Xn**+=3qWXNejY&99F;#U9TV~}XbgD8p~yCEgi?h5-c#g8^>e!N`Q z1+HHVVFvL$nI|-tUPPik7D)8OC!3hT^cTk;8!Oj$&>#N8ed|B?Y1PQG3aRzgqODIa z)Sv{t+R?Jpvtp=5m=)0^)Q*-No^MgX29_G_eLZ8yH$|<{>h-gIEUAU|MlIDh6c>wb zE{uLuTjVlnchFV0e}}irrMu}&5=WRKJHSNhkD*&r9DlNqbx9@S%$ z>o#i|M|-Qi|Ji?P+O=ADU}iPNrni62qApA6uN3-#ICq5FyqJ*wt=7AfO7Bw;7wG+c1nU&Ie3?d+1M z%Rn%PNvs%QX)l^t2;A}XVV}dpCwv}`dW~;050(|Y>8W{ZZfMVXtfY+E$E>odG!D|C zITRvC5bk#P`dy7T4C4{nm+nNWQzp$!2*%eA3-gp_Y_ooy*7~39TYv7~Hw?Fwk&#)S z)mY7T4LN4mp&bUxs@3Wj-P$ba%Y9InF1In*GhxZN%HjjrC+F6a33nX?TEnDC9+b&-z0qyOjCA@B2`dyw6G`-Fs-3j*ZFXC$Z52=eB?D5? ziaZPQXHbuJDXC1rrF60sscXB}!yRN4aJi)H=xjpz&T#rRXySRhg|Zaf#7Yk9j0&Xw ztzQgQ+pN4dGnvST=j%#hNZuHH5Qx!jYDTrgpXY*W>2yZx=jI5In1Q@%cc;Y3XL8DD zsT7xB)mW15xuQ6|CSVJ~15Mh(Y>JpllOZ0rm|C1!e}DNSGURj^LK46eG*Mhg+7Eed zj!ZCbWUhPlwB`E24t9*rp%@s%ws6>C-no2WMOIbcQ@bHk)kj6c+u#>Jnu+Ddyp*Hx z>9pK$$_|bsr7OvsABpllyTmb6KVSc38e`NbZtdhF&%M8%i>MBV=o!eCX`-U4caq2> z!BFn4f7VG$%*W5rVt+=Kje2fld&@pKJvsvGniFC#+-%oVvcl%GDe4LPL!%9@Xn=)0 zpT#>3)`P?cvsiQrb>*~jc#?%AXkD4Yh}+SonH@2^w2q_G3uu(P|MPN-O0z=5UFrMf)7mbou!A&z=MrN?5VpjOU$Yc&%{eIrJ;40{X+LePA zo>Z5);x?ESZ77#oCgE7Cs5xP~SY&pD56~q|QVm+5bwI`pyVxrjOI-{MG&XDumTf>4 zG#P_?_VA(NKLxKB9tLgQ4VKI=S?Q6a`4ykKM{dbt97`GE}>n>Qhdb8VW;x_=PwUi{eJfQ^T68GzbF$OkKkv~ z5J1aEyofbLOR&RiU*@R^iPi8gs(qX2?{=$plv>-|N|WsUtUGhl1+YjA+-NPM0b#lX z`H;X3lHbX!*_|u^wBUv}$&>7g;4hSXLVZCvnQp_)6%~-HhUqKGD_A0O7<+vW%yYdB zPdJ!Q%$k^Th;*2}?N7qf1iZZ7$avP37XaV_U_=2KTD2z8eG!LiaqT&IfX>bv9YWVg z;DCT1SW}V)18B8Fu)PDeQi|8-EZv?#B1;w24>BNgK0V=xY<_LKS35oFGA5N% zA+Oz>PZV{6IT(Prg?C0M3KWe<1g8kum`JnDkgSObA!k56NutsNhA0XJ?uy1~;z?EK;PKbpOePnWZ!^-Sok8W zWHIg^{my1S5gFI+-@mxyhvWIpQ7DxWS)+IBjaTxE-~4v_X!KS8lTW*e$(Gr@01Z8S;qA+ zHhrvj3Y4TDOSljRcy^JwwI!+^>+JaGNE>fsLFVbF@>NWyWa2h9R9YV*M@C!My#oM7 z+4R6)k?k93D-*I%v@|4dB-^l$fLITWm$d~GrS;Li_3n@1RV(s`vM7BKg7x6XRUxeP zYdeD<<-0%nD0z4A5y>injk?ZQKW^Q>IEd8m-zpuH@ljvdarxuNTJ@67bKyh9nVrq* z2mRH;kSb|mbu(7|+Rn=#Klu}8UbSHdj}uG;A_YAiQ`%r!aP7g(rmF`88=%H$VOX)V zrK}x?L^tHbM>a$oT|YzST_=d%bH>IATzKXHHqd=_O2tD2$EzD7%LqCcIpK`l+AY7k&pf0|E5#fR^H*(&FSx*ZL?f zWP822oU`Sx?u(BAZFFp?6ttOe-gAh<#Cvn#nTr+q-#yB6Lu%a#d%x`&jbMB7L{W$cp^%2?R zbUyER<=paToQqJ^?e!Rdj+%A1-uwae9>+bXt+>P#YKg}bTQkmIU)~~I1xyQ-w~8KB zQN=wuStkLzzpD%U{wM3)pZ__?>;Y@ho}_9AWq-XI=QEOsdJHh9Jo3Yn;6bl{;Kb48s_4H8#;+S?~o~(z_*H1A#9B(a@X=e&+%RaXh@lD8c?0U@EWhBQu zplu|2r?jVws?t(Av;dO1m3S1AyBaMpG91X)5lwj2buVAfk)uH`k~-r2=bf9^xxuYh zXBuDgze+3l*BHZzN=uMg8=q2I;Q&l-dWPkcC^T@=g68LQp)-_)i=#vGT)C5^cEs{jQlnqvHdoz0SsaXyRD$AI6ls^wU55Xubgm=uss%=PSLVB5aD0mV0 zEoaqj9ipHN-c+Z}m{qZ$c*9l&4j$?%o>#tMqs+@k&U8V6hhTJ!^|Msi+1cBD{Y!VO zPk!yYj}MQInsp9f>QCBClBCHBZqVPxr_E)+<(fw&=b!?rwB-dpK&t?U!lSEoY?}<~ z!Zy#;@1po<_^4{A$2-AKT7b5&L;@~F(K7%BHtHR*e)tvfYRi@;l{xBoz2TTJO@s7K zCEW3_=P`BR-4v5uLF`cq!KdbQrre-B(7XjRKecYkmIwe|$@rtejPRT!L*R2dy*VbY zDcs#G(t(V7KzCKyLfwe1HWu(A{(VNtzb`Fw0;+p!1MbdT4z$s&Kk_I4jjtxVt>eR3 z94^l2PQi8NW75?SJ`yH#1A63uCX613cTltfu{?uCY!MS+BomJcuOB}6LWa4J6fV%x zCyyU^u!PEUTr9kVih1XzOisnT}spN#aP|SxW-*vrFj#1F_@33Wh(4VL@G2&k^$%At%J`2zA)|6#7vkL>5~Eq zu2*ZZj0QlUI@!{BXnk?8yMus}us1Iz!EeTD{nilk!FK z3=6{hZT!aB+dDtb#@?sD@+;r^gaZg_!Hx&8#~KfRa{3RWMt=TXF8_;aow;I}v>LpH zHHtj`bifK33xvg@8p*O7vQldyf<=iKfS)fUI?csGTuN#DCcN>yvMV-{>~4ZmOw4+x zq{)t%QW3!<7GaRVT*nHL*m__mi-f&qN5B2s4SvPa3%}dTS76sA2m=sQCOhc+R*0n6 zgSAC?49q7B+O4#P5eS2sqJE3edV}60n1-w*#Aj&fq?x)jh&;wF3E?c+wr-ScW;ruE zx4yBy`Qq#Qw&T^?5YCLIc04Tr-P$Gw0zd&kKNd*OISm5eC9)WQtd%ZRY!lZic@Sax z*ymIx(PE5WE@@6jR1SwWxl_nwW@ol`HVY9uyIzJb#En#NO4%t*Ea_wsgwuF#7YLbH zN7h3wlvF$wF_Q!X4N1S<0as)edSbIfK=ELhrqM731JMchP7ZSzvG>fWXif9*ES*!= z7%2y_5sa+N<|Adi$Lx-tMUc~smAN1Ve2ES>vfE~qA_@}?NVVz01fiSbD5V<3c!+eR z*Ug!MMW^GwP6ZhyAmenzyF{^xvx%&2v}le*%CW0QkN3HXYT-5D39ALb=WwV|1PqMg zhO`*K6rq zwt#I3iyu)cv`J&gkUd1FVi)F2vnU<{+!4!+Aq|7aY)sJ(v8ZF-XON~O=CeJ5`(yz1 zL1yXBo#BHgjCosDJW7+19JHclqHtbF?5Plzv(-O_Z1`{XtrzY{ zwn#BtPKVT!r3pUylhSubz6h@9>b@+~NHkx{Ph0iY>Ram39S$lbND<);8J%QmFQqK9 zURo*BYFXD&Z@eDdlFKr1nooV1hj{YE1L(%u|GK=U=C%q6kk!!YYhuN98B6k9mS3h@ zzV&-)n&NwJ$SSlnu@lgtx1WD@9OokxbZ9TeWC-a?Jwrpf2z8>q_($j2_A(i6Q zFB$jN(83$4*laQct?c~3MHqvHqC-2u>}q}i(+qG!WF1y@l4VqT6|iXdD`^|%6!`^0 z2T&R&s&;UP>Lxu-E(9%4{3BZDBFHhm-qvYh`T2EGYSXZkNEuv#`4ozcjYLPSZgfyt zs3(#F$RE&+)1cThC9RzF<4P?QYq`t!^l8g6nI!{yO(?A#sg+xe2ay7ZS^b`| z1=$knMy=@8ZV+9N=!t2;RIQiBjBcjpOnZiUTVztfA2Wr)pz9kGemsOU%EItB21&nIcPm$q;24w*nqvF9&Nsx{u&(*#RNv2`R40d?yIyPu~ zW*_3gG4TP{``ByrF`Z!+R+x#(1rdaHyH2`iEYaM}Y__X;GbqV;&tfh-t!8wFjlp)L zZZ(>H_|>l%$1tr;YL7(Ka*+S} z*p|3eEKiVE=);WM``hSOiGAyj|LaoYE*GBAJfy(_n3qB4SKnDad+<)?HF&{b{{N&) z>cAu_Su~YFdx|w$FcvT*Vw*E*TL?VStLTex5+2hZ>9NIuZ^e8F;)l;wbKP#Dx%m=-CGTH6s@o?}k zOjE}}NiN$N!7xFQ@_bJ>GeR0v=l~-Sgj3J|{1%}*-0L|V@Oj(RDG&C^p#X=vSvu$C zG7;b=A0LX~s?p_*TD0^Mm^%P*ST#;^&hm;WHC`<)tYADQAJ2C0Ykkzc(n$k-ApANr zrB@mM3UCF$ZB^9+_hdqv-NfMH@yW#|Gh}nGFBmR}VLEaa+)y#; zYh*gVeBK$>8pLPtz+w?&EL|>yaT5Ko3h5TmXz7jmyMj=)a>Y01K{CYy`ntL6vg)2ZJvWfM(i>aDQ_DK&W^Xd#GIMgU5Z z*|{!p0G1n56AK9-oN%8afkLr6I=(3HV(wU#NCc@VQsiJuG{UnGqL@7)cL?omwm_KC(q}^t7{QbTf#R#b>-k&2u298 zK4`0^Cpw)UIdSjX(r3!;2|j* zlwx8*W^w1>z4@3~&N-t}MiT{+(mRP5JO@{9WqAwY@02qNTbn=1FohC*b0s0)sl?dc^x$B~gm^nW!;eV;tqZ&}Puxrjh#T z;_y%`9+UJmvOYU$z%8u+hN8T6#CyRRza38xoioQy^M$StNvmNz9pj6>Z?XtbPn{58gz z&3)^S{woYHvhJhhV*p={B*9?G=%EqBj4>;lH7JGUQA_@^!AAXm@>PM@2bm*h8!k4BFM!Ae4Jq5!aR=lVRPrH3+FEiUfbc4T8>{nG zDixEN!)BqnxtcI(^0b;m1v9D&PCJgwa1Z@KC@&gP>2t>OP#>a7iPeXT@emoj6kS;L zMKk0UN-gNvw(F(U^vX=NOz`Gv{$;d|@VksQ?`yVIG0j6wWVOU0vH?56yiHpoTf4aw z$nVHOl*dG(SX=7Xg zX~QhpmkJBZ4ZIlMJdw_3*2wEV5j!&kr#PRxec}WmdqD%n0sw}eHU&{vlpYQ?Cp4~i zPaZchU12D|P)#Vxj67>8i`*4trhUJd36HT_oS)bG<4CS}at{6?RZ1r3W4Of^0GEOK zSgpB|CwSjE%dX8VLaV~zMytJue7~CEu9Tv1OugRFpWUnYz3ACl%PWk2^Bh-A8Ui0| zvxu1P@*bAJe3>-3v!j~175qMm_N44v?O7^SNjd%cS!*Oh3QDFACLx0L5leEb(?@ah zebm8)It{#72+uk8GdcMqCb#{0b9|4EKOZ#?K3J2Kyta&HwvyXXn`|CTj~_RC$&{Gz zE|)lrEoP+m#;r*jI~~;56QUk2hKqQXpE=wEB3h^MkT9Gg>f};cGSu|RXA?^$qYm5@ zjaILptAh-}7_*$81`?HuwYHjPCzDEX!z#5e&cV~oN6oWy`cia0Y6a~y6ieXEiOBGs ziCPW1Wp~iZ5pYvTTl3@H=!jAwsRlFB6ip~X3<~T9AYnw|BU+FNgB7nggfvGa9tm7B zKG|aJal3OtuZQ{&E4MISw0i=59g-+9%>!^XC!l2t(v<--3NQNHDP^{H@oIs0Qjjw) zmpVs`pD%JZLNYU3!A*pV!Z5wD zv$Io9#VWcP9uRQw$~$4`Wal&p*p12sH(snb>OSa7j<%#CeosHKZBPP?m7u?tGH5IrG$GN< zz{nu@+EVQ;F!u`K2(n%W+6tgG$)JrbyK#mLT3hdS=Mc4*%epLCModd3SEz?ge%j?` z6@>4oC3fjhj@iy)vr#+oiyMn# zOA?P(**ZI4Lm_w~@tj0w9E{kR=q|z3S}MVpJ{4DvfWV{3kN)K7u+gPcL*{n5q}CRV zMdza1Z>0DTAKDo z*{9`lVC$1b{aZ%IGkI>p43;?lG-oD81S27%nPh$h-Q z{E|3g2!O)3FFOExSd_tFRt*nFvjdto1Zgt8%3NJp9w4g)xD22IO85|(3>9_{(AA30 zrNsxgfG&+|0k|Kdb}leNz-(GdNLkK8rUU|(oM`U)Hd!^m9+=r6GuI$BxyTSTS2d5v z_$;#<@1Uu?V5#yg8});!6MHz?y{YHc0^c5cO_mJvx}ZWW$_UQ<1I##+u*uW`D6#ql zO*+iNTsg`>ZKK?^2bUnyL3cQYBo_xi2Qj{zPusb-4LZq5#vq1d3#VeGGFHK6i|^%Z z>=&t{#lH0?{y4J>V^P<9W4SOVVQpzg*EanOK9_sUmH^eS>DZIGN;p(m+3qaE^ui2~ zDh;eyad$Do^~VpC1P7Nr@E@|`44ID8CT$9Da%pbYEE;E;V7^gT zPlBU7k1ZQ;M`+|Jsi(}J77=pj0YvQD8Q&P*F|-5@C|ISaiRDDCOwgcA=XMMIA-sf}~RXFDPW_Y?f z)`JD`{0Q~T(FVm326=xr6~X`yEtYXLu2lLxH;Gw*1LV>dQf0*COeUsl#=a}IKHXa` zbR844fROM>f7J9+H=`zBA_U38i%UPLlR5&ohl6Vd!UK&cvbaR>2*XhVjW5-JRhS2m zf;uCaf`$f};pF=uLmmfXG0+0mhob?|u*=|RWJ+KiVp`M9psMw|oqco5fF?k;e;hzy zahE!F;A(mktvQnnFTAdqdUd@;I7!A`?n+3PngzEBfo-FOA7@Mwgp10dmq&3A$(+bkZDJNcuJ5xnh8&$VkMEyJ%pF0T>D~VL;oT^GPB1Tc7#zmgU>gSg-m#FBTJGN6`?6V zymv9frm*~Z@FvgK11^$EOH#sS;zab+U=YFKQDHijDR|(QL+C{2)m!v*Rim;s$pxRS-9_)B?F*6S}8!R6bLN*?hV=pT>*VEC)sj3Xx z!6@?YA))@Oee2CP0{_HH2GQ>kH^v(gYzhRI)-fw-?*~!i$gRF43+)gT11Tlow?=|8 zLFCbm&po21EaVoF)%awi=IAQx(W(`#ZsWA$K=Lu@Ksc1(;t8=07}zxY`fE?SfAkRi znP*e67!j&p#tHe_Rdhi^%gh~U?8&V zN?KF?Q(g=t4<{IJ&R?Lk{?@+rw(_*8D3+g3O3OURY8SiBZwic#yehC)t{2#ZA|qT= zl`SJ2uSbbNVoXz}*~^dpRGIBjK9m|SL=WSg76Q(x&`hzBsrI!Ca?aCM8znVVB6+~@ z2k$S`qSk44bO3X|X!PEW%87I%rf?)%fFE%XBbU~%yPq{wu(683npR&n2T-myn|KuC zvEWQ}HPvxCD;&P}N%InY4bHlAP~b|JI-Stdd+7?lbK!aFnTKn#Q=S0rRyi zZR~*nqn6FnI6(g(&69`a(Q*7!AEfWPtdPuQl`Kp`opz$z2x#wMZxOQ9IB$wmKf-Q${(&v2r3|#5#JazZ~@o_A~W0|9G-A9FD^y$cpn>quke%6q*+aFB`@ zAW=7zGQ6rJg;*#Vohh9M+06&)@T2XGd!H82MA$u6TShhWzeQ5TY1 zhZu(dTVs*yzU&GHSmKE=_E|X`mZYbMap?=&z7TP%jDXtC4KVEIV0XhHl*H1Ac*gL8 zT%O$YfiO$JM@3XiaA*o-9T>B*LT=&PUPSDJ%v0DAa?NsNycq2%u9oMI%+l#zPaZjK zPfzRG?)TDZP!nKzmHQMm2z3Q739lS-c8P-H5D-h0L6kF1wqe9xkcsYkKd#V^G1Xe( z_@ZXPJwk`97FO|_1Tt7MxQ+!+GRhUOy4sJ9k25NwK zk?E9J)+pX4Djv!QjQ7c*C)&_)t66Kd+XGEpK`m38>9?uwYn!K_c^z*QI2hplzbBLX#}v% z8{-=7kjJb_+<~{XrCh~H!vF9xHX5mn{@JC0FkALv%zjKhAjlcPw?|%2Ytx)-m zH{N*XOHTA2W5MFX4}t(-s6@=%G-@61p-D?fMy$u%<+h1Dnf5Nui>>uF;_VfTk*!4{ zOfQJomL;|jg0zy{iCApZNDji3bkz>7Rt-~n)%ZXChyVDSzxK_4@{fM?z`6P2of~_v z|Ea(9HS3_tpYyZ-=IeVm?%cg~P!31$ibFeP^%#Xuj-^GR#)nO2xzH~$-u=&%r85X^ zZG~Is{d**YgIgM(8MEy~OlJAoMdz&EI>Ib+!WE7$+B2Bwa3aNP0E;KhK4zilV)E(Z zqqACnmP}R%`lIU9`H1tTP$W zJ{FDRj~{g^gR@T`G$Zxc%@@nI_sO^Z**E|1U-@p$%7w{QKyp;u?|<}9f9;bCFEn6D9ZE}p=) zjdneqkunJfS9CUHDpX5k^Cc`Kh{r~yd1||vT%iymGPv0~BaH?vKMXr~zkTlTqg;ko zWrVS~J_Sip-q?sMsh`(M=hrsQd(K*AEg8X-n{&E{kLrWw;r-wIolnkY>Frlv$@h|* zvE~oI@vUD!T122Wz*-u0rmf@eKI#rLM zpAML5s71pF#|_7z;~VWEF0@oSmPy8oO!|;v#e6cB6-f;!;r*?xwPI|BROwXu{sugS z344LFrrjH_6L1-iify;mAC)o9keyLKdVZo@B+UZx;gTK0$!4LDb{l7{%5>JP)rN_} z&KjvEx7MA0vh)4le9#GPz531@U;NVTly}k}5rPS9cs$>D`}M62*+ik6qnOK-FEpdMY^^?MV>X7HPT?6ubz}O7 zrP9UqjT<5CI;|Ei05a|tHvJ*h+(4WH(Jl`M2;2rDG?~klNBp?Bn1$YJ=IhdEOpncJ_*H{>JS$KX-dQ+B^E4@3&I@Grw^6%U^tFn{1vP zC3KpMqxr4ZZ)6f-zjJol3W2E3rSm(PSSow+__#TT={A)M<}_f(L%*_T;QB zd6X`1;WqUwQnw(EJ0P$J(F}68XzRAO@`B;F(f96d6xN8LA# zK?Q8?)XRX*Z*>q!GO?H~LY(x8ckfl^!9MmBvpV6&3 zo`xE7OZeyj*N}3IOkUv`V^nVzepeYWaV?P_C%6%ZPt&w)CyjN~;8< z!>kXSapR)9y_v;XIP2F==vt)NX?B3mXK{$)NLgAUWyOO%87nd%j@_G#ij+(zZfJB> z1e8H#Za{%^3Zh=8K#1%!bN{7D(Hvx~mCvK;%l&V0mEZu4z6RZKx$@MZ zmq#8{S}osBw0twpr{>*qZr*CqsTu2VoPx>02x&s&&C}~`1YtneCOiP=>S#=d_0g}; zI%U8D6VhWirLI{lNJCeTHx=f=m@f5<*bBJI2on3L^_9S6di{Xz@`2GTgZ%T*Lp=Xd zrXNK98No|`dmnuoN|aPa$=C+?g4(UlsG7BjvQQc`0@F>nO0@!!YAPo5O9~G{_Y9 zlhSTFSKba^sfmcObhe>s#Q;bX!Gj%C)a5f&R>c;B6S^Q^u^?iMao9Aq+SN!Bv%+&i zEQ4NRe*3LPj?I%nr$E9|lOPEfY7aM+OqgT`$zot4hCfUh%m|rhqwc;K_L~r#F<-!- z$w(asY>vTLLuv*>5mIk*19<>4%HQ2qSZpBl}~VDn^DlP$n3 zX6)iuFop%gnOWD^WQMD2Fk=m6=2-I;T*Vx|yaHPcdWr-gx?`{_SYtgH^7veax9AB1 zP;>AsvZJjSxVZP_vbqBoTCP4>(X&6<$cVeT#G4v@wV=B{S%OFAHyfAxwOgAbAEZYE z;2b1o1f;<{yqXf&kiee6ZB(s5sy)I%!p8)zaOi6=kOG!;mUZTDF6cgGDGOq+j^SVPu***x zJ@UG^#5x7%V;lighu{W9N1{^Na`i?Cfh9D91T2V&fk93#%+CZGAGD}&Dno(^GqMeK zg{LQo5l=8F{O}{o3nmmJyC?_`Q-qsQ&?`p$431)rzRYM$vV%DtR`Ybkzd0$I0I@^% zK}RXO;94de&RmCc0wQvglLXAoi##1g#$?@K0~sMjWX?5&(`Ww#&=7c`DRkdVP3MY$ zn2VB4MWz?O`c3^&Y07aZeByvtCh9E)K8n|xdKH{81Cd?h#Iq8sYnbzeWr@$Qyc@?~ zmj(nnCFJQUgbcdyfy=bykP~-G$a&aUu)fXX{5rF{HB-9!aNTcw!}HcGPyyp<6&Nb- zT78e;WK-%!X)wo<;#_q?+`UM9yqS)KGFMwzBL&cmvPAF_IkmKkeR!uES95mV!I12J zlOs-N=vK*L5#l6oe1`MA`o=t-G50lB!nvy>XmAnLq|)b^GImHJhxP@9!sQLBnvfr? znceyjL%8cg%RoH1U4_w}Dgvo6MxE2$X3U1nvG{rP3d)^EbH*~pfjDv5qEkqlDjS;4 zU|_OcNxtZZchbW?zF@L$C)(3+YKOh#8`D97_U1a9xR9&wPkJ3;V_l=)F+@_gw2hI8 zjxzcRmjI<9HgJV?5apqJx-f8Z$6$8wkUDxu9aT!kN6y}yidm&W*q@$ZSzDF@PzSIZ zd`4~E`F*Nu8R)jEF6FpU;d3WF5{h3b&&^!-h#&udRNRw@H&byHcmwrLc+6L2?}RET9_28Ux;(`ldV_RbwuavQxXxW?46m zYXU+5h-6h*!)io#5Bl)mpw|C}sdZC*Pej(26~)K9gBc)php}NWsx$3#N)kHQUdN5T z2-1p9K1bQKo8!i#(~;$D-YBXbpIqmCt{Vi_1((~Pp4`%gqk+s>M+~~D!g|aUZfw1* z-?{R-<49Hmlsfnz9TbTK980vCTq&j~qv3lmN22qs{LJc|;3l`+%~EKmG`EK5$I5_h zjT`OI4vB?HFMED06vK5Xc2%8yDB8Hk4=jPytiw}&-2cHNOPI=pb$E2n?`|vc$V!^v zm{@4pXS&>^`@BBGOPk13Dm<{JPOGjel?JUEu4>gK0ayvKTm3Rq`8v)bD9pt~QaA2! z)Tcn~tXcrU8o{uDK*twtn#lDoqn>3@4fCoUR&hlyZyu4ns%nIAtJ@6zU>`J^k4&Je zZW@N*hV~h*-ckE}(grnezFaiw2aW969s@^^@!J!7Yn!UFtFEa!LqqCTxjzz(_Q%Us zzs#*m+?0C)ex2c0<=#w4OIKPxE*0Vmjob_HQ>Kkv?=NxgpgWM4`xE{T4OO)NQFn zD7+wEy&*Xgh=UP+2qTqBrBB(&>OU`)h%5{`m=Sk6WqC0Bmz(PK_wuG=$JH=Ox9jzM z9s{Ab$U`1Gu-w}gMkp(3^%-j*RbWDu%IAP)Pl{&YOue2bYo5o5Ry_|A za?9Lbdmm}?xqQf__)KeOd?m%>)r!tEn}T=IVdi}wSvY4*#0I$NwAB~qDvp+PF%NHq zl|x$Otj@q5XAORBZ1cdfmLuJ9w-^~pC!}D}p4CcBeN*&Hg~#*2c~k!GF42lX^dQnu z2Xaa<1euX{xyf}Oo3LAU=>SkzicE!UlI9g++Io9|*0f+oi#d#GGqvwS0*PdR6NNYg z3?LX)4~$AT!H}cp(Fej_AH;BRQL|(bM{38b=19*na!DbK=B1X-5)S53E)O%ivT9dS z_UUl)2cj^>705RvqXAAcY!!fSZ05;QIEg|d;V+NtTkcZE{34U6;WN#OE;DV*yRvS>=hf8H%AfA#@0XT^F;DpwT#5BMt#hjoag+2SJUJ#5MhQc(#XKy;>t_#t)QZ~S z@@6hvNHdQp*5BpYxtO3O>Bs}k!aZ_+q zEth<*=MYxQZkM<=_vU6MQ@f8dC=5q#YaYg%I2!LR<&W=eZf3Kao1M<- zDQXDsLJI0Zd?^F&^7JoJBb7KwYI?nHZ12`BY&bhv&wA94M6eV`9{kpp8;w4C^pN0> z@K*S|X(tkdBG{c{J66a4U$0a8`3jEaW@oLC2zl81FQ!qV@fQn?*N!!8G-b*f@^sDh z?d|PMe9`T%mC^~N)*YANi%CZPEDWD1hrkLSS7@PtCR1^vV88~gvj*s|k<%H~FF@lZ z5;JEojHc~LyEAW`o+PuATGX9%nBV{x!@o^>oSsignOT=gsxz>Q0W8XUCgW-H$tIG{ zqz!z398C!|sQFqtG*twX;$vvgjK0x~E#FEl>pP@TQwqxnpvgA*petmD_K6?1aRQNx z3a_zUVp}-Z%f53#{7=m7fy03N2$M<)icq>e zSVIPSlH;ZmMjs3PyOjB#mPS!2-vn~BySr{A{Q2X@hlhs`a3${E*xkEXb~6y=B;Du) znmFMB>GvdeK-Iu3J?VNEB#=rxdfcXm6)3+dVbB6JPyY9>E&iPkzGnTc${$k-(BWj> z=sN4A@>(X;st>)kRlZT?Ftf-;h?-}_A0M?xH8Tc~L|6>E`LQ>qEm>V>Ym3xagH^7CnueT&$XHpRr(S1xz<^V#r~Vp*Ay&d!EmfE$KaB71JQ z(~D61xXFAzkCc{nkGBGzvGHJnQ!Ei+~ zRit=)CXXOdwbFowhIJQ88)mQxC5vI{PD0hM7)ewrl{41S|ML&NQ|G~Bi{jRcpS!h3 z_-v?K9Y1!8Z7zEaF(!T5#D5PDp@f+KVH9QGY(Mnr0(ue zI&ctMowGB_yK(a9xZW*gb8%?FkdzEWKCLtl)@tipX{-M6_pFD(DAnjRO=;$V*=}ud2%N@=NRJwMbJRRM2PgoMdgLoox~VXti=;C0)TNo0jDfW^8chH|B+wV^Gsol#bZdsLde!Cs9iq9OL!Rz&P4eh*qmq#+b@{Sg@1iEAShOF3Rj(g z59Uc(Bi52n1HxqQkT5;$2GH(fqYmQBb$y0^^5yWvJTpdU-ht0$`M*Q?D_86~)8+(< z@d&zFKA5}(U-5(WQi2)&P}AyQpV`goK`u+Buq@5}d}XJ&fT2m{WG=z9DJz$-PKb|m z_9$*5k3&DnNbnQXdZmT@%O<1U$Ad=AU(W*_M0H4~*SrR!ZS8x|{ooEyul3cb&-$3e zdrqv|kK3Je8arenTIsmk=jUl`%U&YV9`a{Sv1fe-M@Zc`9kyz-E?6441oR#Hc{YcL zyco{xz2E1EgUT8y4aVq@$ztBQ5mrZ2j6^bA8;s`gYEew!#LtJd0bQEdaz>CnWI0%Y6SZKN_>Lnndls-UC1FY zS;(Kk1e)L~9e;IQu|3eA$zn^C*@*N7Nl@r}SB`$(5eF}O!-Pwk+ca%-N(=`JonqoI zlHfE=sHo_?^bra)n&4!&e7R7#@FzfJs`ZI@#&B}P7naq=Q`rKQlyD?{k z8)iChG)yS+wIiNAAka|$BXIP)`_>2l+t+EJ#ye!3NrHf|$YErhMnZDPC$(JU-eQAU zf;Ajn{Nmu%Dg30*=_0`rZ0E$w3$tQ=A;5I$x0ct_PXip`JWg8vrw?N$9U#`v4vykh>?w4yro8+$WaS-pj=Mzmc z8D3np5&+z8A*lMc+sBImAa|Zhd7!AyyqFSWlExj%KA#&SMHi8tf|uWl$MIj1tvoS- zK(cE++~3Xg9_QEA65s-03&bS=o2rB;d>_a|Wazj;!l7WgDd-Sf=>t0tjKTrQjo zY#WHV;D~r<&5grv5;lWgt_zzDdf&jK8C=EOQ5OyVII;q80*%}ZM1;XA$OAY))W*zF zE5pO#0!Q&hUrSX@Y$8E@D5L$=DqD#6WK&d3ycm|Ea(+!?3_08omIa3((gcph_+$)* zIws_?!0?nhAtmH5bg(1B{g9p9(l?O?JVXpuYqGlH z#N`J;>6AfOG6n4oXC)eFEJUhF6VySe@N+Tup};c+Jj9a%#3v-GBJhJNL4;{8LO=?` zAaE3@PgLZL-SYBtRlGBnruym~i|iDgpgH+Tr*xc$77w3?k z^yb&z!)kx~?z=zn3STe3_x?+K-FfFr`g-X#^ZBKB?&wG5{r6tx`<0(~_by+z-}~Cl zjgwgH1d9jek)0jh*-qQ!yMixd_1z|~>nT$9qN|{?&>VY246{Yox6@9jJA*Gu zDFHDhD{g@C&T!kIKF-l0@h%ekf&%S~;~|$IreSu12#z$ZJPfcsyOZ!|(3UPnSn^;D zB9acuF905q(P)2Pn)4oM5sj@^Nm@i|yZkm}LSkFOi^MIkFKB30>d50Sp%rdi_uhZV~5##^5H|sq-H?UVHcQ; zF)+sBezY9J3+l(VLhkxVGYd9fl z&72*O*k1X@Kr^GwC=1X0MZ%gN{LOgRS1tZ~z}~cdWN`oiRAzGh+g{lq5eJ@bbwQ;x z2;__H_G11o&IG@~UdI1ofx;j2gLQtkz`)wJy@1Dy^lQ$kPb=T>wU`s^K%?=IU(5** z&_gDry|_-`Y9J|+x2R0RG5_cPoVhuqi@8U?c_eIBzv}aH-A8{iEny}-^GOY)Z)OUu zs5mQ@%dD?w>c_|R`i-y1b3nz$vv}7f5$)QRi=RrfR{ECpc)6ihNjG_g=WWm1F>lDH(_f0QF^ehvLJQn?d1Y{LCvA1OkYb{&AK4(>17+QyK81|%2APqmY^R!aPY#|IQ|9PH5{q?g(t8DmUxWR#6HOx^(E{vohoYp` z7;=c}83a%D;znNqQRgD> ztC4i7w6nRnQR49ht-&;G4~~zUqsXIC^SE*hq9TcLR&;$m$~eFdwqkO60>yJ74%&$` zsI^+b%;a&P#RY?IKze%LB71)_=(XahZzQAYRq;d|$Yfl4-WOj|Jr>9!-N7h~e0GNI zRy3I^t*>uU6xD*|7p$EJ{CH)fLSH)gFTnmZH^>^NR2fB|}Uwt(< z%5Qy#zS1~!Gi!z4EUcy7->h!sht=M{{ zNtX-1JIZaTc!sJeoUo>3+sw7#0vsj7!3XgK4!@)`ia!Y9ql-*Cv7=cmWx?Uaz4r(W z1}Ke5r{55M5}3Z`AgV-P9AuFUZz9p5ac2{MQzSJ5h4@9G!@L-4Pr|Xyb{|%a8)s+2 z9QISkULsB5OEmrgY2?v(XB3Wu_3~h=4M3l~x~PuI%^RRkR^;l{K~~T1U(r>fIwapm z_c-$`9hFQCkJ_;pr<6c#28V5b&b9wEJ>yTCo^geG9HKEz1E=7PteZ$wz>UBlIO+~& zpf+XNtnL&TNcjle#$ydUE)|Pm{EUNGlQzLCT%?X-FexE6;Mq6$4M1+Coum?PYY?E` z%g&okJkrrb1SHz=sKfepp0gB&Aasp}vnJ3G*>Zj#&$xN|e&1Vkjue{SY}y1zh+ne| z*_H@6+FkOSr%ky&ox)U*WNkdh{9e4-t#svg=z<7ClLe&f#Sd(*o7T{JgdT`NuT0u7 zV-~tP%4wLK3rZCF*gs^ZUX7Sug4udzF~UPYo+W%NVengC`vQ?Ga(Q^0eW1u&|#*@LM|_JM~Mx{3B{M} z3G|qt0O~-U4mJUdnyxo!>k8@pXZ4CsPW@uZI?lgPERwC?QGA469}K36Qx2+``C%u$73gYg zpIw1xl|R-(VLX!{lrGs#qx3~%)#$^bZ|8BWPGx!qWpUWG2h z$w887&2gy=x*a45`VI%=i4r4ATF91*mI~_#Y|+0k+n7?3kC7BGh`Dr0cS!0b1sz;S zo%lCklLUSTLxq1~TM1H8uH-!8w^Ur?&%ojXM^gx1*kP=r{*!q&!rO49T`EIoQ5#Qr z5>FgI0EjO=18U!|bwMj-rv&;WyAG&~8P1b;A=uUr)D zx7bmaBpqj*1~!Dsc%8(J;(|g?V=mIdVSH-lK`5eJ(8hco zkD^9h!(yI}ZjVG(%QM5oChyoJ{RjIEazQOGtQ6@H2`O{g+QHb+PK9wg;8;c}Cd(hO zsX_pDB=cMI9Ht0(ENm(=EY<*>H4E=E>m4RBq$$;)i42zXIw@cbS>Hbi) zb9dU;tYa6f{rG2M)B(vcL6#3^#^cH&AViuBx-~A7wKRj0wqt(&<1gdj`DMwNGJybu zkHMLiAY`(0^P4+c`M0*I_dG_eBdsKp#$h+^z!Y`f^{jap!93ajn)-FZ?e)Qd>i1mK zox=G=FI3pv*uK5Jv00#+zL0T7m;n7IFWAa6onk(niO)LwZvy&@ zsSNY2Vs3MLGan&ve1ZN?SUAZDDkdmXkEb(<&^|H9=J{EDk8JnI-m7(h;QF_B)59n4 zKX~t*_a40eWSHIsZVNw|ho_i+LWH>V`04S{MX5~j*F z%!{z(h(( z2;>h@g>9DhYq-J@CzHWKQ5{SeV~-v^Icf}oW=0PV8plr_(Vqm)rG-!X|L$LrlUfdF zUJM3o^UFAe@3_`Vv&d>Umi%IaMZJ#pr96GPiQeTAP!aAjfU-Qq;sk6^QOd0rJXQX} ztUO>Yp$dm)wHi3Io*dUHKVU3gt^pmF_HIiqd|A&whNNT>vWX%TWQgEIi$&i3?eDVt zX)m$Pp}$mlS^LG#_wTp&Ww{2q3fBoiJdeO zIY;{7PS3r#XZN(dw#{S!o_3-$eV)d=_QVYiLhEkrihH%Hv6)u2uEfhr^jy;9iUsw9Fmstv>&VJsab zTnU3}!ag$2{ln^WZhGX=s`l00+SQFtXJhPghuV--gvGs9BF$#x;sSkA=k|ZknMflW z6k(<>F}^fcf`h0c8h!9j&6Vlgk(_rl)xr0742B_4(`HtYNGGHcn+_D-Vws8WP_*7! zO$piD8BQXj$)4rmG4>fTW+DD3WqktW25HqAEtk^l0s@S>eFJ2p96xxA!rhgyrRw(gn3XV1p}PXhAaq$ zbgS}Wt6Z*}oSL#ZP2N{Gshc*Bf@23MB2#?I$!%*aYBdZ{rn$5>u9ZO^C^gigFD2uZ z-&j}=<=Ew6xZlz8kjwXs7gCs_Mke2df<)~#UhV%H58yzQ znhG})6q(yXFiPjLX&x#Zbl`pGQy>622@Sk~L79c1O}apbOGW{qq?L-@W~5#!Ko3#tRzA=0hDj^*C=)Qh zPWEpZ*|=?pJd%(~dC}NtvpB*?6Sa{-`>#gx=|UzB8*EZ@Vh*znTVs9e#Z5q0 z^Rd<`K1VePCbQ$5?^VuMzpsAY-Nt8tITQytBa8CiXj9wFJRB>tl?gZrP~1NP9%UBs zZ`~9&ne+3^`DrVbhu3iP#jSNrMcOJy0wH-Z#Y{YviQDPuJ`R7JLg#)oVT@ zSOom#jM`_%XAOQ;w3fh^97-&gB8zfT=?1b9{6&w|EU2(7qXcIV?-&pkJh6Fc0)3*M z14($~fGhJ#_RwT6$@v@wD@@LS-=PK z7o({A;Px817!Lt5EQtbxZ5Sv6+qm zG|n+|nII*attq!bQDxQs9j<$@oEoJ1AAlr*R4^F}Vy?z``n4~sNwko6NgxYI=;>_2 z$Q#dbbzo}&)zF~)e|EqS5@RQg&vZ<&Gv5gZinUKo?0@#J9diwIN})spC`5@Z_0mKO z6@b3lgMbD{FcQbvdt(C4GX#ta?F>N?lL)V!VWhSox**wdIPG-i<5mZ*p=o1;O2E~Q z{RrQ1MG7%^d*P7eX# zMuL~fY%r+I5=kWT&<>am6SAiZ3*sL7)r*qVqo~_y5jeGRTSm7_kx}*dqBE$`>`iRL z+jn1jiF=HO0V%;f(9Ff0R0NZwi`pC>LR2bE+zI6~^Yr%b|K9KY!Mn#yR$l7|KWGs& zpXG0N;<@%5Xt8u?E}sZsPF?`b5WdZs*P$5ZBm{#tsxeI%Xq+5((y2DaL2PXe4;q+4 zewGU4l|twkj9r_0Y`P)V@_ce{H;-PAOD|Wgzj}xH%FeBypELAk728F%x%I-md-t}| z;Ys}*X_88zvcgU@Utixztl`Pov=PRgd1Pm27l2@FcKm#iHgKY<%8(zUN~&w#B^SR| zR}R`J8pVDg+}!WCDNUA0H)UZ+S!Lvy`I%XqsTA{w0y%~hpF@#(2%T|U(N6%l-Manx z&%JziH!p4uCfNvxT?kXmAXfmisoo4Ec;q_w4(M8c(< z?7sjM6{hlV#IRkC1%XHd8)^s8Y(z>5i28&FGmro!UGTh6}Rsv8b0CEbM@$GfP0gHPFKQLm=&rqP6u43|1 zDECs=m*a(nZ<<-GwvD=(2+2v6Ev`SUKRuXF&xygcYu(EYl_J3<&_k6TfbZVUeB-6S zyflYbP;QAZ$U=Z9P7!p3zU8z7kdCPE)GsxdZQqS;sB#3PW_rW^YZ#q+UQ%B0pjDfQ ze)%a#TmoggkZbqjqt5YRxaQ^7*Sp>Ghwn-!iO*q6HmaT;20?Xcx7?Y!ye))YibewA zCr^5z^v>); z9nyu*zG`*yg_pkellRhQLkMOAAtotGDwM~^1%eyl#ZTT##z%Nklwmo6R|647@`e-< zrc69d4$g2o7vsYXyB8nC&QqB@AOv*7#Qtj}1A;p#`d#uvg&)OrsVl3)pgqpLW-fJS zfHF-;j_w^N?+Fss06AFjp9-s2^rP&3-~*`mh}yK9gvDiHvsfalZbDX+~FGF?4V8+tP6;N>eJhyhbj5B z3wa(AXK`8Ew6a#Cxo0<|EetzV6X>MhTy>CSx_MY-Z2SWcDg) z%B#pVM3)@S<&GX8h+qYx*}#%kee5ABo`p!^ci}1J$9t>^@#>=|l`xGO4x3nNI-v^j`tNiA$P{ zw-^@~hOVqb2JH--V}_=%$#k1OkCItiF}cy`R8egFb?YzWKhoAA#j*FrTAb5|gx;&!+KI zymbdeenMl*{Z_YMt_$uJf&g)m8!5SHppa)1h5&))VXF>SX0P}1U;Imd?oWMT14c9y zbj1zHY7OPe)~r|z&Wh0o!?ZWHezjx3B1+Wrx_zMi z>~x{{jch8B)ChDV>Gkd0<(^l2_|41FbOsk>zB$hggf)V3*d0>^K45tB$gDz}#o|ED z;74(w)Hv)%1EBkiCwuoslR!U6w?iWYXHZy!NPD!O2))7h6?~=wd2UFTmBd(KUjtv1 z8%LrLA2-F71ObQ{T($-60vOhq`=9qB%^`l0P#^|%@Uwb_o~(8>eqMIOsYVk=c)GZ) zPcOhN9S)Hs_+;Fj=;aYsPqjQM7z#1s_k^XT(dJIRYO@&- z?87M#BMso7Ij`~_Fs?En^I;lRyUp(Wac(UQJqCsOfOB6BopSf6?w+5I!VuIT8DjHE zr+)r4`O?uka0RyukzU|9|2ZNKlnTi={-3ja%=80Nxbn z<<%M37vFdoD~?_a<={9DSnwtcD<>Np+(?KzzS#WW)-4NTd%}q3UI>bYv7~Tr8P^0J z8T=ufo4Q?cs5)moqWo-%;JljB2TEam;RPrL`yI?bV%fRv7t;Mhx0A~BqWzgO&yF5p zaqNYe)flukl<*^*rJRB3D>Pd8H7(@3t>?3`K~|RvG`n2@S?k5}`qp|mpP!S~@dUEV zmB+LyqyK|1ng6rVs&FCZNynH=%u>NwZzh^E{Pq}1*=**xTDK-D4Z?|unT5Gm zrxN;~UQ|M^*X#7!4Mks&G9XOJTxzV98q;ualt`j%@_y|yR?azbz8M_76bQTobuhJ( zp>h9qk-0WWI-R~#Ct!oU92)Zx)6=5(iESqQQAvWHGgOgr7cOJP!iM9+qj1a#ZLQ_Y z8|y9%V4d7*7cxq&o*fPG_J#SDh~6 zJURIK?w#o<5NW;sn?Cq%exAHU!0$w9XGH;nDG-^TbDO?;{qz%rCVX#L^GMB(p2~z_-34m5ba6f zK~}nBcXDxhbaWK9&Kv9NYl>l#E<>TWNGh=JEw4lO-VUZWFqkzOq{rZFLRrl>8hIWW z*5O`7@4n)`=mw^{`JdHRcoL|9)6?e867mgyXtnv=INyt`ykGMKOHBbOZ!=1T^YYKtnD>$rP7Dp3p`8-p8_ zkvWW1VDfH+R^Yh>bCINBkUa|@4A`wC)Fz@8Uv|ouR7c^);^J23aGKC%L-_T$291eD zE1Q;B)se!XulIThrlfFa1QsXGRGN6u!lhvjfI;q|4XYq;3@*HCZ}=c1H>6JBqn8h{ z%S`19l{A*!?FVoQDDggtj|pWGXxZ9u_d#jTAJW(-C6Jb;+STL-iaX*3DEo5Ar{HC0Xy*3wM~>f+J)sCh`THSW_! zmBe9c8PPqNe==pXO{PMVXaafw8B98A`tB~bq@%^`pb6{;Jpk))%d-=X4=gAQ(kyhE zQ$0NGf*%eT3gQlx0(UO_Sn{a?V-=Rh#oXMG%TBPP5M?6+8qxOlKaVoX*866_I< z90Y7`TDoFdo49_iKEwnpU(He9X82VLCHRxLL*ppdE+=7Uo$3Bh(Sj& z4p$wfW{k*|dY|nem~3n(WYKVd(~`ER09_>jNR}~lrL+L3oOoGGO{aqMW_z+r%~g_f zmOxt^&s9B#D#+#)ypu=_^n5j|O_)+rB|IPwqjT^Diw>pI_rx%4wI)Q-ukWagCBB*v zIhJNr_9LW#riLlP@!^%#N%8KoObOIr{YtOIVCVTPw6wsB^r$;%0Tr?gV93bi%&<-~ z?7^)t#aE&|Y`wg2fKJbd`@>GAQwo%Qne3)GB#25>Y;A}@aMyOoFQ;co4sj*mA<3@&S)td7OW zV-0n0@?ia$e>vYSr=;1akQ;b7{Z;#{XthC~@MfjYZkDPvLi1e0o~@x{f^dKZ>V}Qqh>I0I+tY3n(E}EyNQZFcA#!XNS3NdN-39Ub=Aj z?Ns5`c5>1?d5Zs7Nqw&vrX8jhdY;1_Du53gi2+S%%;-~2;55W|B(_KvIgUqW*CALp zQgB%qGA5Aj`_)DxIr@13IOK_bpemDx2Tmsfk#0uK^O_9=x@2>;B{8^RttalP8b76a=`p?tkv{m6yU!t_+Wzl7(3|k#H#n zpfW#?^r!^o>UR&h`U~ z9v`*mo!;3GA9#b-5PD>mpi{V2LPRk?BHDZuD{^JSJcYe)0t2giTDAtA!?X{;8;~Ia z&~NUTBvhguxQ%gB7rRU<6lAB!tC{S*ss>=@Kr0{(3ppb%7K>?d{NuFSpx`gQrgqA72m% z9*bBdmwUC>A}wn!XVvZgQLtNnd3~c)OoEdVnsYfUWJD_|)n!1ZTZ7zf zs-Nvyr`9G)JH4aj_EywxqRt*3#wwsT1mmCod9QQu;K76U-&YJOoBd9&JuGamm)FYk zF$OuAr>PXM6Z0V?#SNy+kV`g2^67EUj;?Lpy|=!D#nl8(I(AZW`+@f_?9}H9D5OLV zXiUZ5ppmE0la?`2Ih+Da#j#j&a6~}CAA{0Pziw4~*$v?{ty^GTg>Z}Ue4^pczxtUC zYxv}CM&n=<0Z9i3Jses%Y=OjPZo-G4c_TOrg_$GcNhe^tPd`BFtbO=oJ`5pz4a()D zX=lRkKYaS(!p?m8;opDgqX64KOYi$x&1m^4gvG^w;ma9oIAg{PX3g9NheIG7 zq4EPCLxUgOFmoNl0}Y8ALu|R(-ECVUzmm!KNiq`uo2j>vLz(Ck${<+cUTSmW#m$YL zJqm`V1Qi?2aW36&W;Vust5@2b;nhttoyOigSS-2@ZQGijp196r=~txIyRWDf39B z-F??B=E7jEq+-ku+yo9qlogP_vS(+5h}YTLdTEEYk9$mnXWr zAcF{sLvp~$kcUze@U?afJk3@cUCN%`o<+M|^r|R05Kh}mXGX2C6*~UTKY5$3=L8N$ zvF?6lL^Xds*T8`2Po6#{nWaC%p~S@{0DV;TKh#61RG3Q0PV0;`Qefe!vP?k_Hc2y) z6f5hgN6^;R8FK(0;sIkpHzOPdGZE4tmUM_S%3Am4eN2JvKm3EAvZh=2=r`_$ia~B~ zyaZDi<<$(5ZnQL=XQSQqbxgoer#;WCZ`KlDTg1V>PA~nsdMR^4D3Z#PyPVIF^A{m* zi)Xc7M*-}235(U*J!H~SY-0f2_+0Vjxr#z1{;lJO|HtolFoXK;{m#5M7akzF-XO8B?Jre0%IzH(fP2~lH2tYM!4kwo~;1L+` z10f|Fz0o8n#X2sE7xa(C1$^Yn$QH#lfPAtYWyz5lovaUn(~C#PVA~D?n``OFc@4xc z!shgSG8TY9oU7uZDlGyZPHA^&#KjOQ2ColA$qc#CAjKU!P<|UUXk(4Y|H_agGK4GH&|0tZ&eD=&)zqd_CvAw>kO zP(J3_lxcbOYOa3{$}ujbs?nHsPu_oUSSsepH%ul~a&<&~>n7dIlB2D5`uOqVhfgo$ zGcT`EG>3f=NEW7RlF2w?qK!6MF19CDh0?{wL%#=tly2Mq-mdja|2Ey`DyW9Wx`>!A(uweT1aG`jney8BvjLT}PATR+I<2>lP7-TC$5zM7ZAmljukMRUjbejC@}iB4 zfqA}W15{9Sn+AD^7Q|JjEp%|3Q|A)m|?N)Vc%wuNTr z%k7lmySgvjR5pS0MVyium4){67aGqrq<*D^h;d%~^Ze#y_p2SWnU27Jw2swZDvVL& z2HI@cxL72ndyvT4<6wYRNzk6?a~LrEz47Pw55D^k9z6Z}<9FYE_ae5L-`QF#MgYu| zIhe7Jt~M3`I)Os!g>D`zfc5ZJ1^X410CG`gd7_Ib1c1^KB$)Qufq9nrCS1(d|Ge_b zy`5LT@Y*Yz@oM$U)I)R|_2Z+bPoD-7FTD1}SFSeJnT^)@kz<+c`u~<5{Y$&ZRD?&w z)J7E6*4Od%=TeS5743_Y#?&@+N!dcl5L9OHk+%&JBDQUR+ywv_n9WLtV&4hXG?Fzw zwmkFxU_u-N*AR8OkTHM-$&oo~Aoft66>$DpFZ~Z zOdf*q`tV^mjKizlW>(%HF_$7~e67GKnW|r+hA~;OOawHZur&5xGaj~BET2~n2vrW6 z;i$NnGo225@Y*Zij!eL=B!cSn$XmtqKqFA?cLw)@@Hs{(g&8bUs+#29;uZ(u9ic_> zXbjLYsyz^iDg8Y;F%GA|{QwbX&pSLs=jU4Rynx_DhmgRIQ)xn4fV@G0_4U0FiY?)q zyBlca;H`h$DP4E}-~VNQNSMy6p}`Q;o9WYjyx&g;@H@9?V)%)^uB-sl=gp?tL6+uX zXLA4@#}HX_Nb{4%&E)|Cm7!92Xeh856vuI?CH8c0s381BxYK>3u|GUw#vD$g(f&mr zhJf%flI1V~ zDGm1K^boWjQgh%?5$Ff$KRg8DBAzwgK!cozL0c%G<_!xPtkg;cMuFMu!{HqqmW;Bn zbw>!tD5T+8^X%-s^Ydn8l#aV_tdc54D%k1~B10dg0swgXzuC3k{B@J0VcJFwrWRg( zNBWy*W7?5cr}cdC?QdjuST?>Mmsys3aG}ei@tZlsE@_))sNER|45I1gS;wFWDe$fu6vICL?D$&CTgCZ8# z*vONejlwj?9Y%y&i3@cXbI$mWV9#<74j$YCH8}g-cMevL78cIWgc&gHmyxta%EHEl zPO<^6MdtX&j~_jHbP9YJ5>`$^#cI$g+#d!)cUx_@$PniG8PGv8`%$5(+Y|T$msQCT zUudfGVVW>io>aVCTrlUAlAGH*w?G@&*)rZ7je{ZOQRAs;M%6^iSswWs-AW61wJd|p z0Ab&WO)e}8R;0XcnqzouV>byQhMr2ggSzDr)XeP4I-ipEpB* zQJ_WTi}_qOi3)CVb7Z1(Z}QMg@y!DV&b)|dhmHru8@$vJMpLEMVw&a3i0bQUkhckQ zDe?9RlNVw$Lazl%VU*mhH<2!5h*5`0oMCF@ZXf)PtBx9asi`) zL;<>ke1IuuM{=4!nq3ze3%me*Sw_dGX)aqB8UEeB1eOPcU zaFH%ex-U-(0U!r>q6>FjFXx`kBSm5abmSldi5VB6k%PL8~T~qg$zZjBvuz9qM0H^{h@n>|S_zSooUUOr(XrPh+cJ+nUq-1xQ9btXQg& z**?D&KF=V6qe6hsV!p%*5?YXfu^NNV4x&wqJT037st?{i_9*d$f58SDOvPq$rIWlp zAh&-~Ap?UUWIWdXA#WTJ@t`4ysYx%;yZL$*9Ivdn;gM*N!js`bPl2KrRLz?Ki-qOs z(R|>sMJQDZ?*xE&Tip=E)G#anq%k3L0qEK=6n2_ld7=ykqDTR<2bm8dq5TSp@CfAE z;iJb-jt)4WkJvo6vd;9|OdRGEMnWQZOk zH!t&#aO0>eld!>pCClk}QwlOlC<*z7+zcQCEO8p%qy_dXM7r@YES53b`%Cdwo^l75 zvN$B0Dk*{9*NlRUVZa2*>|PuZRMZ=X_(lMhBLkc>*3!z~Tu^c>qdmHrst(8}bB#xJgOoa!8qGK|&}7>wrh%C`+3~ zlNrB`7gqHzGWq}ayVjRqL&HJKk%1>=$JdHh{;DgR^(*V_*90)s=!UXT_g=J;)dFN1 zscJ!B61ZI^7VB>XpL*4TemQfhg?OWxcn$t=?bi(@3d0WY&f2MuHczdNz?aZ4(x zDppvkJt@cf*&bVww`24NoDyIK`(tkQs8)=Svv1hcv^DgLl>z60| zr0>^{^YhQY;~#av<$<2p9F-|UEW~(WFj1F_5e#9|_4nn<(}M$mHTsR^cmJI^?D~oy z{e5|YKk@;tU&+c9TtD)UzLLu;_@q0U)}pbl-}1)u&lDydl?uD$^&OtS{c^jN3#wdu zBrvlTBu|zbeuDSw2UzZ~a)xUsSpL59{*{m2V0obB`|=9Idl1@i>y-j>TH-yCeeQ9V zKP)@n^1FGjtX#^qA3kRNwFCXJ9^l%MKjsRqU8%0%6YfarX+o3N^^y2-xA2J${Hy~! zZ^vh@f7Ssm?`gTmjrZkOv)v!%0Lv4Y1Fb(xI{Cd$*g1>&mz1K#ynY4Hr;r^xFNn9U zf93$@S9C9mF;+HO{_yPGR=4y&8!mwB$NuO>s|Q{ERqKVjv~vE{pFi1Wa|<7LhG$*f z>Y+dNEv%kwaSQ(OR*!mfqi0>kavO6CQjdI<3BpLJOf3)(7mw*jJq;Rh_1vHSYCh74 z&pY$#X;!zn)`-vBXmy91pPzXPH#hpY+hj(Ze&Pmu)`70w!t>6&dTTd7=RoMb`M?w$ z{HUV*aYOUwQ7Lr&$Wfp1w4c9?X_%Ww{WJ#!X7WdMz-P7R)fN5!1G{N&uTb7s!^4`0EZPbm#KV=hjPPC zGD*5uxicw_;R;A9pCSv;=E|{TaP<0#6lr78+7LUrA!Jp9nY`T6twKnNN$<4J!@*na zCn;+0o-xNCk4piWE(&bbzL`}A=?-qUZ8s?5I^h;2cG_$)CL+VIY_nO@K8 z+mUVmw_ZG03zp;K!$nK|94+;$yVff&UzzEcWS0xJ=+Yp)T=(*o$#opsvCccmkX}pE zLZ9oSyn7tpwO+nbo$Z~#Q6$yA&}*q8>T|R(tOa&M$JU!~Jfn5+E6BHCUdHQiV_IGQ zruSzzjF?=PuV*#P@;ALN+T@pLlmBYh`s!D>Ww|XDzMy3T_?{nqGoP^8MFyi*^MCou zl{aX^IvyKyh3=9s%z8fTB#m9Y42EXmY&gWYOuFL1-(}G@W#_<(neCq0uhe>~ zpIm)^Rx@gw^vw+y?fGYE&%a1~KSIKd9Q1>|g1o)_Sy1zNKK=P#&R^{<*Xw;>fos?E zS&j!5S;)Vh7G|$;7z0YHL;lCRw^U%Ehb25i9)tO09uW^kOSW1-B`Z`<4i40QN=Ml9 zxz*v4)<3F5Cw{qe5mEu3OkcUltv=Nt`VN7gauuwf;a+}m*Lv|TQCWYWn7{r>v}SP` z{)#0ZgYKaaHRmZP>t(Q~KnL{9`bXHku-q`pdb5^I%=*Z{->7=$_VrtQ)=lQGZqi(G zZ1pz%HCMM;_7A*zqy8FmpMQh<{0$_i&sM?J+%?Z8ngXUKMV6T!&GOxTYHb^0H8$Jv zAE5}k)q|mIZwnsVyn_&!+7EKKSFG;bZ>rsTS+D(|`5WG}4+**r_8k96djUGfuLra5 zv2R3wOAq<Y($FmLm?C8;qgk(4 z;%C<~dLO(Vns&b&n(m8AX0qojHb;RBr$S#2ry{S%DF4)F|9#RSso(D#>KtTgXuV$j z|8vsO``{k~QT>0}laAl}U3$O!XXyQxE$I_@N3SV)FfiMxC zX-YoxY&TA3PGC&o8|LOG+4*vtkGqA-jc%Oz+WP0+!Y8_a-G1fARK-8`DO|hM=QQ>( zM@+V#YjX(M$T%8arOo%^Lcfgyz%l_SX*h$8vycN4$B4mG95IQeD9(J-{=! z+y0mXFnjHVWCj7?{>+^}X5X9Jf9eC=yxmWIfKPk{H_vo)$L04Qc?Cb}K&9o8ZftmE zVpkU3m^NSZ%*zhC+~+y(i|wxt@JV-EZues!U~!-yeFZ<_)_(K>mY4jT_m3Q4)nl%ZfNz>&4pZmW2VX>p{@%k_D z1pSw*o}k@@C#XyQHl>>WtI5DeNO$P=-w)OX z5Byi}yNfR)a^q3r1z@~hXi&v)#7mAtyr%Xd~Z+-KG3UQ3%>8S;eSUz{LfeW;ld-C>9_A^ z`re(w1qjal?kjpvo;SB{_QgW4S6Cm9*QXB~QGE`bH=?1_M)XEs+=`N&+3Cd_Cu2D< z<8UVFJvr)L^Gd2Mjf0clwwx|FBGqbn(#@2n-ON6&)$88L<~%aeYd>iI8h`t;KRUi= z@;?lYA~2yw^w)g)h(prOxzg)h{Eq}8ajenDE;M@Q--G7H|#A^EO_|vrGpTHk^ z%alYGvgwxi>Z;Aw&F>2~2UU8)bdynZY=!wo-}ei73x~ULyh}S?e9Ci)L%+)9>QkO| zXdtX$S$^^>oc3^LkTdBstf)XNAE}x6~4*miN)BVd;&)#PxJEd}fK^Ui24(277Np!fh# zjuG#cilks#2~!N>hJa)qG)~X5saRfhRfR&Z)i`@x%q5YOb+PTXfW9MD+L{F^FDR8j zOf4j0DqRX!yHJsy_xHXI{C-p{JUMD+!4V|4G%Q5hAy-2|JeYSgc&CG5%C4iX3UncI zGdb#jP3%{q<}O;Gp0&Ua@QWfSkcq~!iJ+YeQy)e3I`un!ioCqU7-lU41duDwDVK|6 z)0K2QmM)Zw*;M1)o`lvTB*&9J?q%EEnO)x4a$2EcGSvY>^31c*he+xU$3>Dx3nAH>A>S65ZV%`-1KYpPYdJpkGFU@f2~r zN+%n0W65|d6mSK4pfV}m(q3@vfxaCDVl@)Ky_o=5%o#Ti2F_5(Fk&v~sr1bpwWdSpeZ2tacl?gT_sj{ z^-ty#5wTDRl>pqrdbKg>KYC)d+M#;Kf`W+$pGd@KLsH*KR-X<*5T?|DVrwTJD+faW zm-r+27Z}06z<7D{3$6xbI_f57iUY7Eertl+u~*e-YwK zFa?I%?CkNokI#7LvB6xFK0d9s`;GusvgJE~N@)LnyL!6+<`--^XNFUF0)kXo%z8rB z+B&!IKX@v&mG*xhk&RwB~> z+~!GnCzRa!!ZpRg^m+My)pTFH-ge6k{Ed5{w)#7zz3yC}^RwQVyZ}#OCpQGe>x}BH zAehf42XJb)y?^uW^!Rr-!jJ!#yKV2wFNF`kf7edExQ5;pw90pA>ryIFihY5H+&}Mj z&S}htXKgQKTOW*@v4ewH+iSbA?|zr}ls%002Hfeqzx8-Pu>83X$V&e0KlJYtq@d)( z@9A^fyLhPgtB3c+>rc;0T9g3AKtN8Xt>hXACED471EmPI0ry&adFDT18)hb6dcr|O z6F3#≺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ð7K`jcW5GUhdqXIw-MWoH?2gLhf0=byQ2+%pO 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

    5?I;pTj*(hYUuFnd2`~VPr%? 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 literal 0 HcmV?d00001 diff --git a/Resources/Prototypes/fonts.yml b/Resources/Prototypes/fonts.yml index b1ca1fba965..03102cd341b 100644 --- a/Resources/Prototypes/fonts.yml +++ b/Resources/Prototypes/fonts.yml @@ -41,3 +41,7 @@ - type: font id: Monospace path: /EngineFonts/NotoSans/NotoSansMono-Regular.ttf + +- type: font + id: Emoji + path: /Fonts/NotoEmoji.ttf From f2320d0d8a9e231a38a1d4b7d3d395d24ef990a7 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 29 Jan 2024 06:46:33 +0000 Subject: [PATCH 031/266] Automatic changelog update (cherry picked from commit ef6ca154e7c7716f9844b9ce2c38aa4f7c6f6e74) --- Resources/Changelog/Changelog.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 1d83250281a..a70226ea9e3 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: Rainfey - changes: - - message: Hardsuit helmets added to chameleon menu - type: Add - id: 5315 - time: '2023-12-11T09:27:36.0000000+00:00' - author: Flareguy changes: - message: 'Added 4 new HUD themes: Plasmafire, Slimecore, Clockwork, and Retro.' @@ -3832,3 +3826,11 @@ id: 5815 time: '2024-01-29T01:32:54.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24643 +- author: Ubaser + changes: + - message: Detectives now work as independent agents, separate from security, and + are encouraged to answer any requests for help. + type: Tweak + id: 5816 + time: '2024-01-29T06:45:27.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23114 From 9d138e943bbf11023055835239f53b20aadd411f Mon Sep 17 00:00:00 2001 From: Kara Date: Mon, 29 Jan 2024 00:50:17 -0700 Subject: [PATCH 032/266] Improve rotting examine text (#24689) (cherry picked from commit 1a74311c9fc91e600f260f521176fc9d5fffe754) --- Content.Server/Atmos/Rotting/RottingSystem.cs | 3 ++- .../Atmos/Rotting/SharedRottingSystem.cs | 5 ++++ Resources/Locale/en-US/disease/miasma.ftl | 26 ++++++++++++++----- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/Content.Server/Atmos/Rotting/RottingSystem.cs b/Content.Server/Atmos/Rotting/RottingSystem.cs index 365edf9e05b..e3389def662 100644 --- a/Content.Server/Atmos/Rotting/RottingSystem.cs +++ b/Content.Server/Atmos/Rotting/RottingSystem.cs @@ -133,7 +133,8 @@ private void OnPerishableExamined(Entity perishable, ref Ex return; } - var description = "perishable-" + stage; + var isMob = HasComp(perishable); + var description = "perishable-" + stage + (!isMob ? "-nonmob" : string.Empty); args.PushMarkup(Loc.GetString(description, ("target", Identity.Entity(perishable, EntityManager)))); } diff --git a/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs b/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs index e3db3fd5bc0..5e1758203a8 100644 --- a/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs +++ b/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs @@ -1,5 +1,6 @@ using Content.Shared.Examine; using Content.Shared.IdentityManagement; +using Content.Shared.Mobs.Components; namespace Content.Shared.Atmos.Rotting; @@ -34,6 +35,10 @@ private void OnExamined(EntityUid uid, RottingComponent component, ExaminedEvent >= 1 => "rotting-bloated", _ => "rotting-rotting" }; + + if (!HasComp(uid)) + description += "-nonmob"; + args.PushMarkup(Loc.GetString(description, ("target", Identity.Entity(uid, EntityManager)))); } } diff --git a/Resources/Locale/en-US/disease/miasma.ftl b/Resources/Locale/en-US/disease/miasma.ftl index 5ee77d02041..46e8db33d4c 100644 --- a/Resources/Locale/en-US/disease/miasma.ftl +++ b/Resources/Locale/en-US/disease/miasma.ftl @@ -1,7 +1,21 @@ ammonia-smell = Something smells pungent! -perishable-1 = [color=green]{ CAPITALIZE(SUBJECT($target)) } still {CONJUGATE-BASIC($target, "look", "looks")} fresh.[/color] -perishable-2 = [color=orangered]{ CAPITALIZE(SUBJECT($target)) } {CONJUGATE-BASIC($target, "look", "looks")} somewhat fresh.[/color] -perishable-3 = [color=red]{ CAPITALIZE(SUBJECT($target)) } {CONJUGATE-BASIC($target, "do not", "doesn't")} {CONJUGATE-BASIC($target, "look", "looks")} fresh anymore.[/color] -rotting-rotting = [color=orange]{ CAPITALIZE(SUBJECT($target)) } {CONJUGATE-BE($target)} rotting![/color] -rotting-bloated = [color=orangered]{ CAPITALIZE(SUBJECT($target)) } {CONJUGATE-BE($target)} bloated![/color] -rotting-extremely-bloated = [color=red]{ CAPITALIZE(SUBJECT($target)) } {CONJUGATE-BE($target)} extremely bloated![/color] + +## Perishable + +perishable-1 = [color=green]{ CAPITALIZE(POSS-ADJ($target)) } corpse still looks fresh.[/color] +perishable-2 = [color=orangered]{ CAPITALIZE(POSS-ADJ($target)) } corpse looks somewhat fresh.[/color] +perishable-3 = [color=red]{ CAPITALIZE(POSS-ADJ($target)) } corpse doesn't look very fresh.[/color] + +perishable-1-nonmob = [color=green]{ CAPITALIZE(SUBJECT($target)) } still looks fresh.[/color] +perishable-2-nonmob = [color=orangered]{ CAPITALIZE(SUBJECT($target)) } looks somewhat fresh.[/color] +perishable-3-nonmob = [color=red]{ CAPITALIZE(SUBJECT($target)) } doesn't look very fresh.[/color] + +## Rotting + +rotting-rotting = [color=orange]{ CAPITALIZE(POSS-ADJ($target)) } corpse is rotting![/color] +rotting-bloated = [color=orangered]{ CAPITALIZE(POSS-ADJ($target)) } corpse is bloated![/color] +rotting-extremely-bloated = [color=red]{ CAPITALIZE(POSS-ADJ($target)) } corpse is extremely bloated![/color] + +rotting-rotting-nonmob = [color=orange]{ CAPITALIZE(SUBJECT($target)) } is rotting![/color] +rotting-bloated-nonmob = [color=orangered]{ CAPITALIZE(SUBJECT($target)) } is bloated![/color] +rotting-extremely-bloated-nonmob = [color=red]{ CAPITALIZE(SUBJECT($target)) } is extremely bloated![/color] From ea5a2bbb17cead625203d021ec00d9a0d0bcf648 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 29 Jan 2024 07:51:23 +0000 Subject: [PATCH 033/266] Automatic changelog update (cherry picked from commit 9c079329b6d37247f1c72fbe8452dab77f50e7a3) --- Resources/Changelog/Changelog.yml | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index a70226ea9e3..6b95202c072 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,15 +1,4 @@ Entries: -- author: Flareguy - changes: - - message: 'Added 4 new HUD themes: Plasmafire, Slimecore, Clockwork, and Retro.' - type: Add - - message: The default HUD theme is now Classic. The old default HUD theme still - exists under the name "Minimalist." - type: Tweak - - message: The modernized HUD theme has been renamed to "Eris." - type: Tweak - id: 5316 - time: '2023-12-11T09:28:17.0000000+00:00' - author: metalgearsloth changes: - message: Arrivals is now stationed on a planet. @@ -3834,3 +3823,10 @@ id: 5816 time: '2024-01-29T06:45:27.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23114 +- author: mirrorcult + changes: + - message: Rotting examine text doesn't have weird grammatical errors now + type: Fix + id: 5817 + time: '2024-01-29T07:50:18.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24689 From 20055cfb97c283a90c019def5f75f592e0f710b4 Mon Sep 17 00:00:00 2001 From: EdenTheLiznerd <138748328+Eden077@users.noreply.github.com> Date: Mon, 29 Jan 2024 00:55:52 -0700 Subject: [PATCH 034/266] Reduce synaptizine damage (#24676) (cherry picked from commit cf1d3eae155cb9a7ea277a58130e9c292a103d13) --- Resources/Prototypes/Reagents/medicine.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Reagents/medicine.yml b/Resources/Prototypes/Reagents/medicine.yml index e0a367a9f06..0605728a51d 100644 --- a/Resources/Prototypes/Reagents/medicine.yml +++ b/Resources/Prototypes/Reagents/medicine.yml @@ -690,7 +690,7 @@ - !type:HealthChange damage: types: - Poison: 3 + Poison: 2 - !type:GenericStatusEffect key: Stun time: 3.0 From 88c6c2ab6d27dc22a1ad553868ea35a759809c65 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 29 Jan 2024 07:56:57 +0000 Subject: [PATCH 035/266] Automatic changelog update (cherry picked from commit f7f997bf5c1975c7fe12cfc79b8472d5110ddaaa) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 6b95202c072..fbec8efd067 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: metalgearsloth - changes: - - message: Arrivals is now stationed on a planet. - type: Add - id: 5317 - time: '2023-12-11T09:34:19.0000000+00:00' - author: Whisper changes: - message: Added cosmetic sunglasses to the clothesmate. @@ -3830,3 +3824,10 @@ id: 5817 time: '2024-01-29T07:50:18.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24689 +- author: Eden077 + changes: + - message: Synaptizine now deals less poison damage. + type: Tweak + id: 5818 + time: '2024-01-29T07:55:52.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24676 From c2381d8084a8e59902937a2856071f9084d6b30f Mon Sep 17 00:00:00 2001 From: Kara Date: Mon, 29 Jan 2024 02:51:31 -0700 Subject: [PATCH 036/266] Make various sounds quieter (#24690) (cherry picked from commit f2aaf6b753849c5b5a3c8e97b89b8d8867d486c3) --- Resources/Audio/Effects/buckle.ogg | Bin 18686 -> 6937 bytes Resources/Audio/Effects/teleport_arrival.ogg | Bin 27074 -> 17427 bytes .../Audio/Effects/teleport_departure.ogg | Bin 25640 -> 16853 bytes Resources/Audio/Effects/unbuckle.ogg | Bin 29541 -> 9924 bytes .../Audio/Items/Medical/healthscanner.ogg | Bin 4366 -> 3848 bytes Resources/Audio/Items/desk_bell_ring.ogg | Bin 17351 -> 6736 bytes Resources/Audio/Items/welder2.ogg | Bin 15106 -> 12461 bytes 7 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Resources/Audio/Effects/buckle.ogg b/Resources/Audio/Effects/buckle.ogg index bb7dbe664b10f61fae37e05210abae797d533b76..09fd8f79b34f54535b9cfa0c5e0ae54ca7b54fbd 100644 GIT binary patch literal 6937 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 Dv?GAn literal 18686 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 Pzk1@vqA&k%Ru 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 Lyk*ZB08Tdmi%W$8 diff --git a/Resources/Audio/Effects/teleport_departure.ogg b/Resources/Audio/Effects/teleport_departure.ogg index 163ca45f393c8ccf4848a18750f34f5dc31dacf8..e11f355ad08f47109256a1231345b3a5ab5e17f5 100644 GIT binary patch literal 16853 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

    &R+8BxQNq#x%V=%zFjQ~-QwEX`0Ud&j#A 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 diff --git a/Resources/Audio/Effects/unbuckle.ogg b/Resources/Audio/Effects/unbuckle.ogg index a4a799f6df65a6e545f816bb633d827fd10b08e0..c5db18df8b84ac7a6f14fcd11ca1c795d6ca6ef0 100644 GIT binary patch literal 9924 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 literal 29541 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


    bV(G*1;_$A>h~jB62YY`hT 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 diff --git a/Resources/Audio/Items/desk_bell_ring.ogg b/Resources/Audio/Items/desk_bell_ring.ogg index 5222801dc18f9ed01d899bd97149998a586e147d..b8f7329d2ccec58bb562afbfe8ba19c7816c39c1 100644 GIT binary patch literal 6736 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 literal 17351 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 ZkGCbF8oMZ!_gD0m#)g#^ubv_S{|j?Kq0|5X diff --git a/Resources/Audio/Items/welder2.ogg b/Resources/Audio/Items/welder2.ogg index 0c67d2ce6a5ac58d8608337fec531d467adf4aa9..8dcf3ec1b226114837b21347fd9416c34fff86a4 100644 GIT binary patch literal 12461 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 From d83638900453ca6fca13e87e6bfa35c3a3f0cc25 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 29 Jan 2024 09:52:37 +0000 Subject: [PATCH 037/266] Automatic changelog update (cherry picked from commit 7bd22762ffbaa61d99d9cad7b30d4dd4553a6719) --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index fbec8efd067..0d134aeff51 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Whisper - changes: - - message: Added cosmetic sunglasses to the clothesmate. - type: Add - - message: Musician and Bartender now have cosmetic sunglasses. - type: Tweak - id: 5318 - time: '2023-12-11T09:35:51.0000000+00:00' - author: deltanedas changes: - message: Syndicate duffel bags heavily protect their items from explosions, and @@ -3831,3 +3823,10 @@ id: 5818 time: '2024-01-29T07:55:52.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24676 +- author: mirrorcult + changes: + - message: Various annoying sounds are now a little quieter + type: Tweak + id: 5819 + time: '2024-01-29T09:51:31.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24690 From e390fd34bf9f75a1d2bf7c66f51b0d8a0357757a Mon Sep 17 00:00:00 2001 From: SpeltIncorrectyl <66873282+SpeltIncorrectyl@users.noreply.github.com> Date: Mon, 29 Jan 2024 14:56:29 +0000 Subject: [PATCH 038/266] Adds signal control to portable generators (#24157) * added signal control to portable generators * added documentation * Discard changes to Content.Server/Radio/EntitySystems/HeadsetSystem.cs * added DeviceNetworkComponent and WirelessNetworkConnectionComponent to generator prototype * made GeneratorSignalControlComponent nicer * implemented auto-revving * added back necessary dependency * can't send do-after event manually * repeat now works with auto revving * fixed * removed vv * stopping generating when it is revving now makes it stop revving * Update Content.Shared/Power/Generator/ActiveGeneratorRevvingComponent.cs Co-authored-by: Kara * used resolve instead of TryComp --------- Co-authored-by: Julian Giebel Co-authored-by: Kara (cherry picked from commit 5d2ddc0d8b313d80fbcecd6719c5048ec2aea3e7) --- .../Power/Generator/GeneratorWindow.xaml.cs | 8 ++ .../GeneratorSignalControlComponent.cs | 29 +++++++ .../Generator/GeneratorSignalControlSystem.cs | 48 +++++++++++ .../Generator/PortableGeneratorSystem.cs | 46 ++++++++-- .../ActiveGeneratorRevvingComponent.cs | 10 +++ .../Generator/ActiveGeneratorRevvingSystem.cs | 86 +++++++++++++++++++ .../SharedPortableGeneratorSystem.cs | 9 ++ .../Power/Generation/portable_generator.yml | 11 +++ 8 files changed, 240 insertions(+), 7 deletions(-) create mode 100644 Content.Server/Power/Generator/GeneratorSignalControlComponent.cs create mode 100644 Content.Server/Power/Generator/GeneratorSignalControlSystem.cs create mode 100644 Content.Shared/Power/Generator/ActiveGeneratorRevvingComponent.cs create mode 100644 Content.Shared/Power/Generator/ActiveGeneratorRevvingSystem.cs diff --git a/Content.Client/Power/Generator/GeneratorWindow.xaml.cs b/Content.Client/Power/Generator/GeneratorWindow.xaml.cs index d1c5f47b07b..bd5b75de1da 100644 --- a/Content.Client/Power/Generator/GeneratorWindow.xaml.cs +++ b/Content.Client/Power/Generator/GeneratorWindow.xaml.cs @@ -135,6 +135,14 @@ public void Update(PortableGeneratorComponentBuiState state) private bool TryGetStartProgress(out float progress) { + // Try to check progress of auto-revving first + if (_entityManager.TryGetComponent(_entity, out var activeGeneratorRevvingComponent) && _entityManager.TryGetComponent(_entity, out var portableGeneratorComponent)) + { + var calculatedProgress = activeGeneratorRevvingComponent.CurrentTime / portableGeneratorComponent.StartTime; + progress = (float) calculatedProgress; + return true; + } + var doAfterSystem = _entityManager.EntitySysManager.GetEntitySystem(); return doAfterSystem.TryFindActiveDoAfter(_entity, out _, out _, out progress); } diff --git a/Content.Server/Power/Generator/GeneratorSignalControlComponent.cs b/Content.Server/Power/Generator/GeneratorSignalControlComponent.cs new file mode 100644 index 00000000000..f16a09eae37 --- /dev/null +++ b/Content.Server/Power/Generator/GeneratorSignalControlComponent.cs @@ -0,0 +1,29 @@ +using Content.Shared.DeviceLinking; +using Robust.Shared.Prototypes; + +namespace Content.Server.Power.Generator; + +/// +/// When attached to an entity with it will allow the signal network to exert control over the generator. +/// +[RegisterComponent] +public sealed partial class GeneratorSignalControlComponent: Component +{ + /// + /// The port that should be invoked when turning the generator on. + /// + [DataField] + public ProtoId OnPort = "On"; + + /// + /// The port that should be invoked when turning the generator off. + /// + [DataField] + public ProtoId OffPort = "Off"; + + /// + /// The port that should be invoked when toggling the generator. + /// + [DataField] + public ProtoId TogglePort = "Toggle"; +} diff --git a/Content.Server/Power/Generator/GeneratorSignalControlSystem.cs b/Content.Server/Power/Generator/GeneratorSignalControlSystem.cs new file mode 100644 index 00000000000..4a42bcfffb9 --- /dev/null +++ b/Content.Server/Power/Generator/GeneratorSignalControlSystem.cs @@ -0,0 +1,48 @@ +using System.ComponentModel; +using Content.Server.DeviceLinking.Events; +using Content.Shared.Power.Generator; + +namespace Content.Server.Power.Generator; + +public sealed class GeneratorSignalControlSystem: EntitySystem +{ + [Dependency] private readonly GeneratorSystem _generator = default!; + [Dependency] private readonly ActiveGeneratorRevvingSystem _revving = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnSignalReceived); + } + + /// + /// Change the state of the generator depending on what signal is sent. + /// + private void OnSignalReceived(EntityUid uid, GeneratorSignalControlComponent component, SignalReceivedEvent args) + { + if (!TryComp(uid, out var generator)) + return; + + if (args.Port == component.OnPort) + { + _revving.StartAutoRevving(uid); + } + else if (args.Port == component.OffPort) + { + _generator.SetFuelGeneratorOn(uid, false, generator); + _revving.StopAutoRevving(uid); + } + else if (args.Port == component.TogglePort) + { + if (generator.On) + { + _generator.SetFuelGeneratorOn(uid, false, generator); + _revving.StopAutoRevving(uid); + } + else + { + _revving.StartAutoRevving(uid); + } + } + } +} diff --git a/Content.Server/Power/Generator/PortableGeneratorSystem.cs b/Content.Server/Power/Generator/PortableGeneratorSystem.cs index 96016da5b09..e8e9c5b45e3 100644 --- a/Content.Server/Power/Generator/PortableGeneratorSystem.cs +++ b/Content.Server/Power/Generator/PortableGeneratorSystem.cs @@ -27,6 +27,7 @@ public sealed class PortableGeneratorSystem : SharedPortableGeneratorSystem [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly GeneratorSystem _generator = default!; [Dependency] private readonly PowerSwitchableSystem _switchable = default!; + [Dependency] private readonly ActiveGeneratorRevvingSystem _revving = default!; [Dependency] private readonly PowerNetSystem _powerNet = default!; public override void Initialize() @@ -38,7 +39,8 @@ public override void Initialize() UpdatesAfter.Add(typeof(PowerNetSystem)); SubscribeLocalEvent>(GetAlternativeVerb); - SubscribeLocalEvent(GeneratorTugged); + SubscribeLocalEvent(OnGeneratorStarted); + SubscribeLocalEvent(OnAutoGeneratorStarted); SubscribeLocalEvent(GeneratorStartMessage); SubscribeLocalEvent(GeneratorStopMessage); SubscribeLocalEvent(GeneratorSwitchOutputMessage); @@ -92,9 +94,30 @@ private void StopGenerator(EntityUid uid, PortableGeneratorComponent component, _generator.SetFuelGeneratorOn(uid, false); } - private void GeneratorTugged(EntityUid uid, PortableGeneratorComponent component, GeneratorStartedEvent args) + private void OnGeneratorStarted(EntityUid uid, PortableGeneratorComponent component, GeneratorStartedEvent args) { - if (args.Cancelled || !Transform(uid).Anchored) + if (args.Cancelled) + return; + + GeneratorTugged(uid, component, args.User, out args.Repeat); + } + + private void OnAutoGeneratorStarted(EntityUid uid, PortableGeneratorComponent component, ref AutoGeneratorStartedEvent args) + { + GeneratorTugged(uid, component, null, out var repeat); + + // restart the auto rev if it should be repeated + if (repeat) + _revving.StartAutoRevving(uid); + else + args.Started = true; + } + + private void GeneratorTugged(EntityUid uid, PortableGeneratorComponent component, EntityUid? user, out bool repeat) + { + repeat = false; + + if (!Transform(uid).Anchored) return; var fuelGenerator = Comp(uid); @@ -107,14 +130,23 @@ private void GeneratorTugged(EntityUid uid, PortableGeneratorComponent component if (!clogged && !empty && _random.Prob(component.StartChance)) { - _popup.PopupEntity(Loc.GetString("portable-generator-start-success"), uid, args.User); _generator.SetFuelGeneratorOn(uid, true, fuelGenerator); + + if (user is null) + return; + + _popup.PopupEntity(Loc.GetString("portable-generator-start-success"), uid, user.Value); + } else { - _popup.PopupEntity(Loc.GetString("portable-generator-start-fail"), uid, args.User); - // Try again bozo - args.Repeat = true; + // try again bozo + repeat = true; + + if (user is null) + return; + + _popup.PopupEntity(Loc.GetString("portable-generator-start-fail"), uid, user.Value); } } diff --git a/Content.Shared/Power/Generator/ActiveGeneratorRevvingComponent.cs b/Content.Shared/Power/Generator/ActiveGeneratorRevvingComponent.cs new file mode 100644 index 00000000000..25f97dc15a0 --- /dev/null +++ b/Content.Shared/Power/Generator/ActiveGeneratorRevvingComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Power.Generator; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class ActiveGeneratorRevvingComponent: Component +{ + [DataField, ViewVariables(VVAccess.ReadOnly), AutoNetworkedField] + public TimeSpan CurrentTime = TimeSpan.Zero; +} diff --git a/Content.Shared/Power/Generator/ActiveGeneratorRevvingSystem.cs b/Content.Shared/Power/Generator/ActiveGeneratorRevvingSystem.cs new file mode 100644 index 00000000000..1c39997f30d --- /dev/null +++ b/Content.Shared/Power/Generator/ActiveGeneratorRevvingSystem.cs @@ -0,0 +1,86 @@ +using Content.Shared.DoAfter; + +namespace Content.Shared.Power.Generator; + +public sealed class ActiveGeneratorRevvingSystem: EntitySystem +{ + [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; + [Dependency] private readonly EntityManager _entity = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnAnchorStateChanged); + } + + /// + /// Handles the AnchorStateChangedEvent to stop auto-revving when unanchored. + /// + private void OnAnchorStateChanged(EntityUid uid, ActiveGeneratorRevvingComponent component, AnchorStateChangedEvent args) + { + if (!args.Anchored) + StopAutoRevving(uid); + } + + /// + /// Start revving a generator entity automatically, without another entity doing a do-after. + /// Used for remotely activating a generator. + /// + /// Uid of the generator entity. + /// ActiveGeneratorRevvingComponent of the generator entity. + public void StartAutoRevving(EntityUid uid, ActiveGeneratorRevvingComponent? component = null) + { + if (Resolve(uid, ref component)) + { + // reset the revving + component.CurrentTime = TimeSpan.FromSeconds(0); + return; + } + + AddComp(uid, new ActiveGeneratorRevvingComponent()); + } + + /// + /// Stop revving a generator entity. + /// + /// Uid of the generator entity. + /// True if the auto-revving was cancelled, false if it was never revving in the first place. + public bool StopAutoRevving(EntityUid uid) + { + return RemComp(uid); + } + + /// + /// Raise an event on a generator entity to start it. + /// + /// This is not the same as revving it, when this is called the generator will start producing power. + /// Uid of the generator entity. + /// True if the generator was successfully started, false otherwise. + private bool StartGenerator(EntityUid uid) + { + var ev = new AutoGeneratorStartedEvent(); + RaiseLocalEvent(uid, ref ev); + return ev.Started; + } + + /// + /// Updates the timers on ActiveGeneratorRevvingComponent(s), and stops them when they are finished. + /// + public override void Update(float frameTime) + { + base.Update(frameTime); + var query = EntityQueryEnumerator(); + + while (query.MoveNext(out var uid, out var activeGeneratorRevvingComponent, out var portableGeneratorComponent)) + { + activeGeneratorRevvingComponent.CurrentTime += TimeSpan.FromSeconds(frameTime); + Dirty(uid, activeGeneratorRevvingComponent); + + if (activeGeneratorRevvingComponent.CurrentTime < portableGeneratorComponent.StartTime) + continue; + + if (StartGenerator(uid)) + StopAutoRevving(uid); + } + } +} diff --git a/Content.Shared/Power/Generator/SharedPortableGeneratorSystem.cs b/Content.Shared/Power/Generator/SharedPortableGeneratorSystem.cs index e30c8eced6a..e8ccc851669 100644 --- a/Content.Shared/Power/Generator/SharedPortableGeneratorSystem.cs +++ b/Content.Shared/Power/Generator/SharedPortableGeneratorSystem.cs @@ -23,3 +23,12 @@ public override DoAfterEvent Clone() return this; } } + +/// +/// Used to start a portable generator. This is like except it isn't a do-after. +/// +[ByRefEvent] +public sealed partial class AutoGeneratorStartedEvent +{ + public bool Started = false; +} diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/portable_generator.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/portable_generator.yml index 2fc6c1f5120..b606c01f1dd 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/portable_generator.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/portable_generator.yml @@ -90,6 +90,17 @@ supplyRampRate: 500 supplyRampTolerance: 500 enabled: false + - type: DeviceLinkSink + ports: + - On + - Off + - Toggle + - type: GeneratorSignalControl + - type: DeviceNetwork + deviceNetId: Wireless + receiveFrequencyId: BasicDevice + - type: WirelessNetworkConnection + range: 200 - type: entity abstract: true From 6d5779bbeda8a812d64bf210e47d2e3e420852ba Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 29 Jan 2024 14:57:35 +0000 Subject: [PATCH 039/266] Automatic changelog update (cherry picked from commit c1f3f8cdc46ca27daec271169572cafa7b2a30eb) --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 0d134aeff51..92fadd46cf1 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: deltanedas - changes: - - message: Syndicate duffel bags heavily protect their items from explosions, and - regular bags have minor protection. - type: Tweak - id: 5319 - time: '2023-12-11T09:43:00.0000000+00:00' - author: metalgearsloth changes: - message: Fix game audio persisting to lobby. @@ -3830,3 +3823,11 @@ id: 5819 time: '2024-01-29T09:51:31.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24690 +- author: SpeltIncorrectyl + changes: + - message: Portable generators can now be connected to the signal network and controlled + remotely via devices like a signal transmitter. + type: Add + id: 5820 + time: '2024-01-29T14:56:29.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24157 From 1c79bc7b4b06c44f61330b8e4cc74b95e807f681 Mon Sep 17 00:00:00 2001 From: themias <89101928+themias@users.noreply.github.com> Date: Mon, 29 Jan 2024 17:35:27 -0500 Subject: [PATCH 040/266] Add sticky footstep sound to space glue (#24710) (cherry picked from commit e27a3e0d3e5827cc06a91a11d4b295e6d9d95b7e) --- Resources/Prototypes/Reagents/cleaning.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Resources/Prototypes/Reagents/cleaning.yml b/Resources/Prototypes/Reagents/cleaning.yml index b70a7af0fad..49af16d93dd 100644 --- a/Resources/Prototypes/Reagents/cleaning.yml +++ b/Resources/Prototypes/Reagents/cleaning.yml @@ -147,3 +147,7 @@ type: Add time: 5 refresh: false + footstepSound: + collection: FootstepSticky + params: + volume: 6 \ No newline at end of file From c9a22474bcdf726e23c595c85983d2a435ccd5e6 Mon Sep 17 00:00:00 2001 From: Tayrtahn Date: Mon, 29 Jan 2024 18:04:52 -0500 Subject: [PATCH 041/266] Fix welder status always being "not lit" (#24705) * Fix not finding ItemToggleComponent * Simplified (cherry picked from commit e101d078fe2aa128428de6dc67c8bb31f94dc18e) --- Content.Client/Tools/UI/WelderStatusControl.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Client/Tools/UI/WelderStatusControl.cs b/Content.Client/Tools/UI/WelderStatusControl.cs index f1c5999453e..af81a28f620 100644 --- a/Content.Client/Tools/UI/WelderStatusControl.cs +++ b/Content.Client/Tools/UI/WelderStatusControl.cs @@ -17,11 +17,11 @@ public sealed class WelderStatusControl : Control private readonly ItemToggleComponent? _toggleComponent; private readonly RichTextLabel _label; - public WelderStatusControl(WelderComponent parent, EntityUid? uid = null) + public WelderStatusControl(Entity parent) { _parent = parent; _entMan = IoCManager.Resolve(); - if (_entMan.TryGetComponent(uid, out var itemToggle)) + if (_entMan.TryGetComponent(parent, out var itemToggle)) _toggleComponent = itemToggle; _label = new RichTextLabel { StyleClasses = { StyleNano.StyleClassItemStatus } }; AddChild(_label); From 964cd81a2df131c5b36dadc099c4237df0977a84 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 29 Jan 2024 23:05:58 +0000 Subject: [PATCH 042/266] Automatic changelog update (cherry picked from commit f661e8f48629edd36cac0c2929df114fb727f830) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 92fadd46cf1..b4eff2adba8 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: metalgearsloth - changes: - - message: Fix game audio persisting to lobby. - type: Fix - id: 5320 - time: '2023-12-11T10:26:56.0000000+00:00' - author: Whisper changes: - message: Beer goggles can now scan solutions. @@ -3831,3 +3825,10 @@ id: 5820 time: '2024-01-29T14:56:29.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24157 +- author: Tayrtahn + changes: + - message: Welders properly display their lit status again. + type: Fix + id: 5821 + time: '2024-01-29T23:04:52.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24705 From 1cf4508ca7f7b2947844e43830a4d68be706d477 Mon Sep 17 00:00:00 2001 From: Tayrtahn Date: Mon, 29 Jan 2024 18:19:55 -0500 Subject: [PATCH 043/266] Add fill level visuals for water bottle in-hand sprites (#24708) Fill level visuals for water bottle inhands (cherry picked from commit cebb20d5355ec613d575df20d3a10fae974a2be0) --- .../Consumable/Drinks/drinks_bottles.yml | 2 ++ .../waterbottle.rsi/inhand-left-fill-1.png | Bin 0 -> 158 bytes .../waterbottle.rsi/inhand-left-fill-2.png | Bin 0 -> 181 bytes .../waterbottle.rsi/inhand-right-fill-1.png | Bin 0 -> 169 bytes .../waterbottle.rsi/inhand-right-fill-2.png | Bin 0 -> 186 bytes .../Drinks/waterbottle.rsi/meta.json | 18 +++++++++++++++++- 6 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 Resources/Textures/Objects/Consumable/Drinks/waterbottle.rsi/inhand-left-fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/waterbottle.rsi/inhand-left-fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/waterbottle.rsi/inhand-right-fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/waterbottle.rsi/inhand-right-fill-2.png diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml index b90f9ffa5c3..77db111195a 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml @@ -526,6 +526,8 @@ - type: SolutionContainerVisuals maxFillLevels: 5 fillBaseName: icon- + inHandsMaxFillLevels: 2 + inHandsFillBaseName: -fill- - type: entity parent: DrinkWaterBottleFull diff --git a/Resources/Textures/Objects/Consumable/Drinks/waterbottle.rsi/inhand-left-fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/waterbottle.rsi/inhand-left-fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..b726087730f2e7a40ea2484d7f65c6cc2b6d599d GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|B0OCjLn`LH zy=BPjpeW$t`04LzhXblR99czeD-_%v|MfIn&)K~csE~m{X4Sn{?fx%)6<4GSigM05B!IGY?elF{r5}E*4A~R_K literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/waterbottle.rsi/inhand-left-fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/waterbottle.rsi/inhand-left-fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..154c205bf16a7b5e2226e1c2038b55d500f91e78 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|@;zM~Ln`LH zy|t0I!GMRw;mE(>lm?HRZJH}yEMy97j*Zwk`BGit&Ct3?pkju)jM_Q3>umIuKF_`W zi{oUA%6HC`l=Qg=q+}z`eqrVSip5{;@d2r1V9+}GLfJu4u(svp{^QH#9V&M*Gcd@< Xe$WosswTZz2&BT()z4*}Q$iB}kf%P1 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/waterbottle.rsi/inhand-right-fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/waterbottle.rsi/inhand-right-fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..1530ff913fe0440aa2a7dc9c177012afa844e114 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|l097@8-%|nZPO-nk5pA?2Z50*!^Y9+kBXrfhUjEFj&pVu3Tn0NP(xT KpUXO@geCwXyEI<_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/waterbottle.rsi/inhand-right-fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/waterbottle.rsi/inhand-right-fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..66a831d2cc0d516d39e83d5e2f5a83da64971e6c GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|N<3X0Ln`LH zy=BPNV8Fu~@bTaB7mQqcdzTj!t)HyGx5(+@jqeMR9|%vRXWB*S9w5 zL3*Y0zrVHl Date: Mon, 29 Jan 2024 23:21:01 +0000 Subject: [PATCH 044/266] Automatic changelog update (cherry picked from commit ec63e0b107cd909b1aab06e66f1f7158d8edc07c) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b4eff2adba8..21d37fceb0f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: Whisper - changes: - - message: Beer goggles can now scan solutions. - type: Add - id: 5321 - time: '2023-12-11T11:35:11.0000000+00:00' - author: MACMAN2003 changes: - message: Added yellow tinted jensen glasses that may show up in maints from time @@ -3832,3 +3826,10 @@ id: 5821 time: '2024-01-29T23:04:52.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24705 +- author: Tayrtahn + changes: + - message: Water bottles now display their fill level while held. + type: Add + id: 5822 + time: '2024-01-29T23:19:56.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24708 From c6d3377853ba3bc49802b091d9231b58a63ed974 Mon Sep 17 00:00:00 2001 From: Hanz <41141796+Hanzdegloker@users.noreply.github.com> Date: Mon, 29 Jan 2024 18:21:28 -0500 Subject: [PATCH 045/266] Drink tastes touchup (#24700) * Actual tastebuds yup * Grape Soda, can't forget them too Grape Soda, my beloved (cherry picked from commit 61516e82537877248a033c6988eda7e963cc0992) --- .../Locale/en-US/flavors/flavor-profiles.ftl | 19 ++++ Resources/Prototypes/Flavors/flavors.yml | 95 +++++++++++++++++++ .../Reagents/Consumable/Drink/alcohol.yml | 14 +-- .../Reagents/Consumable/Drink/drinks.yml | 4 +- .../Reagents/Consumable/Drink/soda.yml | 22 ++--- 5 files changed, 134 insertions(+), 20 deletions(-) diff --git a/Resources/Locale/en-US/flavors/flavor-profiles.ftl b/Resources/Locale/en-US/flavors/flavor-profiles.ftl index bbe245b0162..0fa0f7dfe12 100644 --- a/Resources/Locale/en-US/flavors/flavor-profiles.ftl +++ b/Resources/Locale/en-US/flavors/flavor-profiles.ftl @@ -177,8 +177,22 @@ flavor-complex-rocksandstones = like rocks and stones ## Basic drinks flavor-complex-water = like water flavor-complex-beer = like piss +flavor-complex-cognac = like dry spicy alcohol +flavor-complex-mead = like fermented honey +flavor-complex-vermouth = like herbal grape rinds flavor-complex-ale = like bread +flavor-complex-tonic-water = like angry water flavor-complex-cola = like cola +flavor-complex-energy-drink = like battery acid +flavor-complex-dr-gibb = like malpractice +flavor-complex-grape-soda = like grape soda +flavor-complex-lemon-lime-soda = like lemon-lime soda +flavor-complex-pwr-game-soda = like gaming +flavor-complex-root-beer-soda = like root beer +flavor-complex-citrus-soda = like citrus soda +flavor-complex-space-up-soda = like space +flavor-complex-starkist-soda = like orange soda +flavor-complex-fourteen-loko-soda = like sweet malt flavor-complex-vodka = like fermented grain flavor-complex-tequila = like fermented death flavor-complex-sake = like sweet, alcoholic rice @@ -198,6 +212,10 @@ flavor-complex-mopwata = like stagnant, dirty water flavor-complex-long-island = suspiciously like iced tea flavor-complex-three-mile-island = like tea brewed in nuclear runoff flavor-complex-whiskey-cola = like carbonated molasses +flavor-complex-root-beer-float = like ice cream in root beer +flavor-complex-black-russian = like alcoholic coffee +flavor-complex-white-russian = like alcoholic sweetened coffee +flavor-complex-moonshine = like pure alcohol flavor-complex-singulo = like a bottomless hole flavor-complex-syndie-bomb = like bitter whiskey flavor-complex-tequila-sunrise = like a mexican morning @@ -212,6 +230,7 @@ flavor-complex-atomic-cola = like hoarding bottle caps flavor-complex-cuba-libre = like spiked cola flavor-complex-gin-tonic = like spiked lemon-lime soda flavor-complex-screwdriver = like spiked orange juice +flavor-complex-irish-car-bomb = like a spiked cola float flavor-complex-themartinez = like violets and lemon vodka flavor-complex-cogchamp = like brass flavor-complex-white-gilgamesh = like lightly carbonated cream diff --git a/Resources/Prototypes/Flavors/flavors.yml b/Resources/Prototypes/Flavors/flavors.yml index b5c4916a9c9..a4677848601 100644 --- a/Resources/Prototypes/Flavors/flavors.yml +++ b/Resources/Prototypes/Flavors/flavors.yml @@ -554,11 +554,51 @@ flavorType: Complex description: flavor-complex-mopwata +- type: flavor + id: tonicwater + flavorType: Complex + description: flavor-complex-tonic-water + - type: flavor id: beer flavorType: Complex description: flavor-complex-beer +- type: flavor + id: cognac + flavorType: Complex + description: flavor-complex-cognac + +- type: flavor + id: mead + flavorType: Complex + description: flavor-complex-mead + +- type: flavor + id: vermouth + flavorType: Complex + description: flavor-complex-vermouth + +- type: flavor + id: irishcarbomb + flavorType: Complex + description: flavor-complex-irish-car-bomb + +- type: flavor + id: blackrussian + flavorType: Complex + description: flavor-complex-black-russian + +- type: flavor + id: whiterussian + flavorType: Complex + description: flavor-complex-white-russian + +- type: flavor + id: moonshine + flavorType: Complex + description: flavor-complex-moonshine + - type: flavor id: ale flavorType: Complex @@ -569,6 +609,61 @@ flavorType: Complex description: flavor-complex-cola +- type: flavor + id: energydrink + flavorType: Complex + description: flavor-complex-energy-drink + +- type: flavor + id: drgibb + flavorType: Complex + description: flavor-complex-dr-gibb + +- type: flavor + id: lemonlimesoda + flavorType: Complex + description: flavor-complex-lemon-lime-soda + +- type: flavor + id: pwrgamesoda + flavorType: Complex + description: flavor-complex-pwr-game-soda + +- type: flavor + id: rootbeersoda + flavorType: Complex + description: flavor-complex-root-beer-soda + +- type: flavor + id: rootbeerfloat + flavorType: Complex + description: flavor-complex-root-beer-float + +- type: flavor + id: sodacitrus + flavorType: Complex + description: flavor-complex-citrus-soda + +- type: flavor + id: spaceup + flavorType: Complex + description: flavor-complex-root-space-up + +- type: flavor + id: grapesoda + flavorType: Complex + description: flavor-complex-grape-soda + +- type: flavor + id: starkistsoda + flavorType: Complex + description: flavor-complex-starkist-soda + +- type: flavor + id: fourteenlokosoda + flavorType: Complex + description: flavor-complex-fourteen-loko-soda + - type: flavor id: cogchamp flavorType: Complex diff --git a/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml b/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml index d824135bc72..edee73eb73e 100644 --- a/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml +++ b/Resources/Prototypes/Reagents/Consumable/Drink/alcohol.yml @@ -73,7 +73,7 @@ parent: BaseAlcohol desc: reagent-desc-cognac physicalDesc: reagent-physical-desc-strong-smelling - flavor: alcohol + flavor: cognac color: "#AB3C05" recognizable: true metamorphicSprite: @@ -301,7 +301,7 @@ parent: BaseAlcohol desc: reagent-desc-vermouth physicalDesc: reagent-physical-desc-strong-smelling - flavor: alcohol + flavor: vermouth color: "#91FF91" metamorphicSprite: sprite: Objects/Consumable/Drinks/vermouthglass.rsi @@ -571,7 +571,7 @@ parent: BaseAlcohol desc: reagent-desc-black-russian physicalDesc: reagent-physical-desc-strong-smelling - flavor: alcohol + flavor: blackrussian color: "#360000" metamorphicSprite: sprite: Objects/Consumable/Drinks/blackrussianglass.rsi @@ -870,7 +870,7 @@ parent: BaseAlcohol desc: reagent-desc-irish-car-bomb physicalDesc: reagent-physical-desc-bubbly - flavor: alcohol + flavor: irishcarbomb color: "#2E6671" metamorphicSprite: sprite: Objects/Consumable/Drinks/irishcarbomb.rsi @@ -1018,7 +1018,7 @@ parent: BaseAlcohol desc: reagent-desc-mead physicalDesc: reagent-physical-desc-strong-smelling - flavor: alcohol + flavor: mead color: "#664300" metamorphicSprite: sprite: Objects/Consumable/Drinks/meadglass.rsi @@ -1042,7 +1042,7 @@ parent: BaseAlcohol desc: reagent-desc-moonshine physicalDesc: reagent-physical-desc-strong-smelling - flavor: alcohol + flavor: moonshine color: "#d1d7d155" metabolisms: Drink: @@ -1404,7 +1404,7 @@ parent: BaseAlcohol desc: reagent-desc-white-russian physicalDesc: reagent-physical-desc-strong-smelling - flavor: alcohol + flavor: whiterussian color: "#A68340" metamorphicSprite: sprite: Objects/Consumable/Drinks/whiterussianglass.rsi diff --git a/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml b/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml index 558ecc0e156..77a387da7b5 100644 --- a/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml +++ b/Resources/Prototypes/Reagents/Consumable/Drink/drinks.yml @@ -319,7 +319,7 @@ parent: BaseDrink desc: reagent-desc-tonic-water physicalDesc: reagent-physical-desc-fizzy - flavor: water + flavor: tonicwater color: "#0064C8" - type: reagent @@ -444,4 +444,4 @@ Drink: effects: - !type:SatiateThirst - factor: 0.6 \ No newline at end of file + factor: 0.6 diff --git a/Resources/Prototypes/Reagents/Consumable/Drink/soda.yml b/Resources/Prototypes/Reagents/Consumable/Drink/soda.yml index 27fe44e5788..af1b496a4f6 100644 --- a/Resources/Prototypes/Reagents/Consumable/Drink/soda.yml +++ b/Resources/Prototypes/Reagents/Consumable/Drink/soda.yml @@ -23,7 +23,7 @@ parent: BaseSoda desc: reagent-desc-dr-gibb physicalDesc: reagent-physical-desc-fizzy - flavor: soda + flavor: drgibb color: "#102000" - type: reagent @@ -32,7 +32,7 @@ parent: BaseSoda desc: reagent-desc-energy-drink physicalDesc: reagent-physical-desc-fizzy - flavor: soda + flavor: energydrink color: "#ffffbf" metabolisms: Drink: @@ -49,7 +49,7 @@ parent: BaseSoda desc: reagent-desc-grape-soda physicalDesc: reagent-physical-desc-fizzy - flavor: soda + flavor: grapesoda color: "#ae94a6" - type: reagent @@ -71,7 +71,7 @@ parent: BaseSoda desc: reagent-desc-lemon-lime physicalDesc: reagent-physical-desc-fizzy - flavor: soda + flavor: lemonlimesoda color: "#878F00" metamorphicSprite: sprite: Objects/Consumable/Drinks/lemonlime.rsi @@ -83,7 +83,7 @@ parent: BaseSoda desc: reagent-desc-pwr-game physicalDesc: reagent-physical-desc-fizzy - flavor: soda + flavor: pwrgamesoda color: "#9385bf" - type: reagent @@ -92,7 +92,7 @@ parent: BaseSoda desc: reagent-desc-root-beer physicalDesc: reagent-physical-desc-fizzy - flavor: soda + flavor: rootbeersoda color: "#381c07" metamorphicSprite: sprite: Objects/Consumable/Drinks/rootbeerglass.rsi @@ -104,7 +104,7 @@ parent: BaseSoda desc: reagent-desc-root-beer-float physicalDesc: reagent-physical-desc-fizzy-and-creamy - flavor: soda + flavor: rootbeerfloat color: "#4f361f" metamorphicSprite: sprite: Objects/Consumable/Drinks/rootbeerfloatglass.rsi @@ -116,7 +116,7 @@ parent: BaseSoda desc: reagent-desc-space-mountain-wind physicalDesc: reagent-physical-desc-fizzy - flavor: soda + flavor: sodacitrus color: "#102000" - type: reagent @@ -125,7 +125,7 @@ parent: BaseSoda desc: reagent-desc-space-up physicalDesc: reagent-physical-desc-fizzy - flavor: soda + flavor: spaceup color: "#00FF00" - type: reagent @@ -134,7 +134,7 @@ parent: BaseSoda desc: reagent-desc-starkist physicalDesc: reagent-physical-desc-fizzy - flavor: soda + flavor: starkistsoda color: "#9F3400" - type: reagent @@ -143,7 +143,7 @@ parent: BaseSoda desc: reagent-desc-fourteen-loko physicalDesc: reagent-physical-desc-fizzy - flavor: soda + flavor: fourteenlokosoda color: "#deb928" metabolisms: Drink: From df339ce7d16e4415c64af06bd8e5248703f440e9 Mon Sep 17 00:00:00 2001 From: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Date: Tue, 30 Jan 2024 01:21:25 +0100 Subject: [PATCH 046/266] Add water droplet hat for arachnids (#23822) Co-authored-by: Kevin Zheng (cherry picked from commit a86d0e51ec74cfdde2969d73bcb1ea1c683911bb) --- .../ReagentEffects/WearableReaction.cs | 42 +++++++++++++ .../Entities/Clothing/Head/misc.yml | 58 ++++++++++++++++++ .../Entities/Mobs/Species/arachnid.yml | 8 +++ .../Misc/waterdroplet.rsi/equipped-HELMET.png | Bin 0 -> 215 bytes .../Head/Misc/waterdroplet.rsi/icon.png | Bin 0 -> 554 bytes .../Misc/waterdroplet.rsi/inhand-left.png | Bin 0 -> 197 bytes .../Misc/waterdroplet.rsi/inhand-right.png | Bin 0 -> 204 bytes .../Head/Misc/waterdroplet.rsi/meta.json | 26 ++++++++ 8 files changed, 134 insertions(+) create mode 100644 Content.Server/Chemistry/ReagentEffects/WearableReaction.cs create mode 100644 Resources/Textures/Clothing/Head/Misc/waterdroplet.rsi/equipped-HELMET.png create mode 100644 Resources/Textures/Clothing/Head/Misc/waterdroplet.rsi/icon.png create mode 100644 Resources/Textures/Clothing/Head/Misc/waterdroplet.rsi/inhand-left.png create mode 100644 Resources/Textures/Clothing/Head/Misc/waterdroplet.rsi/inhand-right.png create mode 100644 Resources/Textures/Clothing/Head/Misc/waterdroplet.rsi/meta.json diff --git a/Content.Server/Chemistry/ReagentEffects/WearableReaction.cs b/Content.Server/Chemistry/ReagentEffects/WearableReaction.cs new file mode 100644 index 00000000000..d9f8414995d --- /dev/null +++ b/Content.Server/Chemistry/ReagentEffects/WearableReaction.cs @@ -0,0 +1,42 @@ +using Content.Shared.Inventory; +using Content.Shared.Chemistry.Reagent; +using Robust.Shared.Prototypes; + +namespace Content.Server.Chemistry.ReagentEffects; + +/// +/// A reaction effect that consumes the required amount of reagent and spawns PrototypeID in the +/// entity's Slot. Used to implement the water droplet effect for arachnids. +/// +public sealed partial class WearableReaction : ReagentEffect +{ + /// + /// Minimum quantity of reagent required to trigger this effect. + /// + [DataField] + public float AmountThreshold = 1f; + + /// + /// Slot to spawn the item into. + /// + [DataField(required: true)] + public string Slot; + + /// + /// Prototype ID of item to spawn. + /// + [DataField(required: true)] + public string PrototypeID; + + protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys) => null; + + public override void Effect(ReagentEffectArgs args) + { + if (args.Reagent == null || args.Quantity < AmountThreshold) + return; + + // SpawnItemInSlot returns false if slot is already occupied + if (args.EntityManager.System().SpawnItemInSlot(args.SolutionEntity, Slot, PrototypeID)) + args.Source?.RemoveReagent(args.Reagent.ID, AmountThreshold); + } +} diff --git a/Resources/Prototypes/Entities/Clothing/Head/misc.yml b/Resources/Prototypes/Entities/Clothing/Head/misc.yml index 7b93e83cd9e..9826da57b78 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/misc.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/misc.yml @@ -224,3 +224,61 @@ sprite: Clothing/Head/Misc/red_racoon.rsi - type: Clothing sprite: Clothing/Head/Misc/red_racoon.rsi + +- type: entity + parent: Clothing + id: WaterDropletHat + name: water droplet + description: Makes 8-eyed friends 8 times more adorable! + components: + - type: Sprite + sprite: Clothing/Head/Misc/waterdroplet.rsi + state: icon + - type: Item + sprite: Clothing/Head/Misc/waterdroplet.rsi + size: Tiny + storedRotation: -90 + - type: Clothing + slots: + - HEAD + - type: Food + solution: drink + useSound: /Audio/Items/drink.ogg + eatMessage: drink-component-try-use-drink-success-slurp + delay: 0.5 + forceFeedDelay: 1.5 + - type: FlavorProfile + flavors: + - water + - type: SolutionContainerManager + solutions: + drink: + maxVol: 2 + reagents: + - ReagentId: Water + Quantity: 2 + - type: DamageOnHighSpeedImpact + minimumSpeed: 0.1 + damage: + types: + Blunt: 1 + - type: Damageable + damageContainer: Biological + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 1 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: desecration + - !type:SpillBehavior + solution: drink + - !type:DoActsBehavior + acts: [ "Destruction" ] + - type: Tag + tags: + - WhitelistChameleon + - type: StaticPrice + price: 1 diff --git a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml index d2d99109a11..8c1f43de960 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml @@ -36,6 +36,14 @@ amount: 5 - type: Inventory templateId: arachnid + - type: Reactive + reactions: + - reagents: [Water] + methods: [Touch] + effects: + - !type:WearableReaction + slot: head + prototypeID: WaterDropletHat # Damage (Self) - type: Bloodstream bloodReagent: CopperBlood diff --git a/Resources/Textures/Clothing/Head/Misc/waterdroplet.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Misc/waterdroplet.rsi/equipped-HELMET.png new file mode 100644 index 0000000000000000000000000000000000000000..9759d202a26dd3d2b7bc7c84993101dc86237b7f GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|CVIL!hE&XX zduyZMAp;)P3l0xcC0d(QU(8StHei(XUUEVs?pW{22P-sc6#MkvhwACPo_{AxqU_y; zC=0)x`_6wqz4GVW34f1kUJp8@e&DO&_4x1G@BF_JH6tkM@Adx|_y3&uex-f>^Q-L_ zciRJP0|Ei>8-E+tNmjjQ*O{sKrtUzHS4X8aU4HEEl^>bP0 Hl+XkK@x)ht literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Misc/waterdroplet.rsi/icon.png b/Resources/Textures/Clothing/Head/Misc/waterdroplet.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..964a74ec9e6fcc65e96d85802b3c8fa5dcd82b47 GIT binary patch literal 554 zcmV+_0@eMAP)d$&fyc%KO*Nb-g^_v5^GE_cp=J&@6|X8Rmua|I*h_qkRgt1ibI zoj4g{nC_@%>hr;1fR^j~0h_A#Ue&Ahy{4--o-j4AbqUXCx=|38X$WiEgIYQo z7d{sD7&4&njnZRPepQ^R@~2`W99jUo>gh@~aIAr~w2>8_5O!xXMXffE`jWmxZh1-S zi0n~JLiq9FB1Vx7G8FJi%}Hj>eUpE_Me^d&Ym z|9P6p>8Wb>J|A?vSk}iFIQF1Ywyd8M%c`70+cR9{>i)dsH2Wobxvsg7U|<_AuIpNC zA1-%b_(_i%(Lbq8wmq4I_jBlvfb$M|)~Z?6&N+L8@Rt0dTR1p`ak)RR{tMwOXZyAr z4>te+0C!15K~z|UV_+BsqhJ(_f>AKi0VBB@D>q*Kk1p2kuT8dj6kCo@93NmJ*Ac&d z{rdmw*DsPSq!_?_iOT_`h5`$@4q;WP8&m8;*ieFbYP&C>T}%0H;JQf=<@M0000007*qoM6N<$f-0NzL;wH) literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Head/Misc/waterdroplet.rsi/inhand-left.png b/Resources/Textures/Clothing/Head/Misc/waterdroplet.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..eb7f81e9bc8ff7e3cf22d09808fb25760190bd2b GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|>OEZ?Ln`LH zy|t0|umKN?gIcTFS0Sk*%{xA5M7i}|TIL~ov8ih}qZ~`bKX;&Vh67Wowg#>@D?3{q zviH`Dz5N{>kM}I^KX>l;)48${UX^d>eBbeSkNdOjn?8e713}Q5H=nlOje*{NzJOf-T!aO{r^=-X&^le3<-&ww= Date: Tue, 30 Jan 2024 00:22:32 +0000 Subject: [PATCH 047/266] Automatic changelog update (cherry picked from commit c16e384d3a3efebe4b379f4bfa4aa053ede894af) --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 21d37fceb0f..19ad21ed2b3 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: MACMAN2003 - changes: - - message: Added yellow tinted jensen glasses that may show up in maints from time - to time - type: Add - id: 5322 - time: '2023-12-11T11:36:19.0000000+00:00' - author: ninruB changes: - message: Familiar Garbs may now appear as maintenance loot. @@ -3833,3 +3826,10 @@ id: 5822 time: '2024-01-29T23:19:56.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24708 +- author: SlamBamActionman + changes: + - message: Arachnids slipping in water now get a cute hat! + type: Add + id: 5823 + time: '2024-01-30T00:21:26.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23822 From 897aedb70c18b633caedf758192c78b5dc041000 Mon Sep 17 00:00:00 2001 From: Tayrtahn Date: Mon, 29 Jan 2024 20:33:34 -0500 Subject: [PATCH 048/266] Stop shift from cancelling follow as ghost (#24715) Fixed pressing shift cancelling ghost follow (cherry picked from commit b0bd0689ce538251132f072aadfa7e45ed275389) --- Content.Shared/Follower/FollowerSystem.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Follower/FollowerSystem.cs b/Content.Shared/Follower/FollowerSystem.cs index 41ee215fe25..672f3d6487c 100644 --- a/Content.Shared/Follower/FollowerSystem.cs +++ b/Content.Shared/Follower/FollowerSystem.cs @@ -4,6 +4,7 @@ using Content.Shared.Ghost; using Content.Shared.Hands; using Content.Shared.Movement.Events; +using Content.Shared.Movement.Systems; using Content.Shared.Physics.Pull; using Content.Shared.Tag; using Content.Shared.Verbs; @@ -96,7 +97,8 @@ private void OnGetAlternativeVerbs(GetVerbsEvent ev) private void OnFollowerMove(EntityUid uid, FollowerComponent component, ref MoveInputEvent args) { - StopFollowingEntity(uid, component.Following); + if ((args.Component.HeldMoveButtons & MoveButtons.AnyDirection) != MoveButtons.None) + StopFollowingEntity(uid, component.Following); } private void OnPullStarted(EntityUid uid, FollowerComponent component, PullStartedMessage args) From eabba648f164c970b228918cf47ff6c13fa938fc Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 30 Jan 2024 01:34:41 +0000 Subject: [PATCH 049/266] Automatic changelog update (cherry picked from commit 5da590e0f8d8ea47e4be3370367faab5f1e509af) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 19ad21ed2b3..70e536f8ddc 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: ninruB - changes: - - message: Familiar Garbs may now appear as maintenance loot. - type: Add - id: 5324 - time: '2023-12-11T13:04:56.0000000+00:00' - author: Errant changes: - message: Incapacitated mobs can no longer be shoved for a speed boost. @@ -3833,3 +3827,10 @@ id: 5823 time: '2024-01-30T00:21:26.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23822 +- author: Tayrtahn + changes: + - message: Pressing shift as a ghost no longer cancels following your target + type: Fix + id: 5824 + time: '2024-01-30T01:33:35.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24715 From 57e74caf6238a45b7589900d5ab65c169ef29069 Mon Sep 17 00:00:00 2001 From: liltenhead <104418166+liltenhead@users.noreply.github.com> Date: Tue, 30 Jan 2024 00:11:43 -0800 Subject: [PATCH 050/266] Jugs are destructible (#24719) * destructible jug * destruction * Update Resources/Prototypes/Entities/Objects/Specific/chemical-containers.yml --------- Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> (cherry picked from commit 31f7acf223c40cb7b300b7a87cb7f3c9f08bd817) --- .../Objects/Specific/chemical-containers.yml | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemical-containers.yml b/Resources/Prototypes/Entities/Objects/Specific/chemical-containers.yml index 31af4d206a0..027ff206f8d 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/chemical-containers.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/chemical-containers.yml @@ -47,6 +47,34 @@ inHandsFillBaseName: -fill- - type: StaticPrice price: 60 + - type: Damageable + damageContainer: Inorganic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 200 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] + - trigger: + !type:DamageTrigger + damage: 20 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: MetalBreak + params: + volume: -4 + - !type:SpillBehavior { } + - !type:SpawnEntitiesBehavior + spawn: + SheetPlastic1: + min: 0 + max: 1 + transferForensics: true + - !type:DoActsBehavior + acts: [ "Destruction" ] - type: Label originalName: jug - type: Tag From 5516abbb2148c7159de72e39adba8bdc17516b10 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 30 Jan 2024 08:12:49 +0000 Subject: [PATCH 051/266] Automatic changelog update (cherry picked from commit 4f91846a909cb9e3c0c0f7a6b273999c4fbac33f) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 70e536f8ddc..b690cea0cae 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: Errant - changes: - - message: Incapacitated mobs can no longer be shoved for a speed boost. - type: Fix - id: 5325 - time: '2023-12-11T13:05:14.0000000+00:00' - author: willicassi changes: - message: Added info to botany guidebook entry @@ -3834,3 +3828,10 @@ id: 5824 time: '2024-01-30T01:33:35.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24715 +- author: liltenhead + changes: + - message: Jugs are now destructible. + type: Tweak + id: 5825 + time: '2024-01-30T08:11:43.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24719 From 2a0f83b7bc20debb54482fccef3f1893f03a2225 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 30 Jan 2024 10:27:08 +0000 Subject: [PATCH 052/266] Automatic changelog update (cherry picked from commit 067c8ba4a9101c8910dac2b549ac8e2e44e68a3a) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b690cea0cae..33cb24cca3f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: willicassi - changes: - - message: Added info to botany guidebook entry - type: Add - id: 5326 - time: '2023-12-11T17:42:22.0000000+00:00' - author: EmoGarbage404 changes: - message: Removed the Handheld Electrical Propulsion technology and its associated @@ -3835,3 +3829,10 @@ id: 5825 time: '2024-01-30T08:11:43.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24719 +- author: Emisse + changes: + - message: Aspid + type: Remove + id: 5826 + time: '2024-01-30T10:26:02.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24725 From 609b0b7421bc45f7aef9d5cfcc6920b1bcbebfbb Mon Sep 17 00:00:00 2001 From: Kara Date: Tue, 30 Jan 2024 03:50:41 -0700 Subject: [PATCH 053/266] Throwing item scaling animation + recoil (#24724) (cherry picked from commit ef55039560814a98517552bd58493fc89a2a4812) --- .../Throwing/ThrownItemVisualizerSystem.cs | 87 +++++++++++++++++++ Content.Shared/Throwing/ThrowingSystem.cs | 13 ++- .../Throwing/ThrownItemComponent.cs | 31 +++---- Content.Shared/Throwing/ThrownItemSystem.cs | 31 ------- 4 files changed, 109 insertions(+), 53 deletions(-) create mode 100644 Content.Client/Throwing/ThrownItemVisualizerSystem.cs diff --git a/Content.Client/Throwing/ThrownItemVisualizerSystem.cs b/Content.Client/Throwing/ThrownItemVisualizerSystem.cs new file mode 100644 index 00000000000..bbd36731104 --- /dev/null +++ b/Content.Client/Throwing/ThrownItemVisualizerSystem.cs @@ -0,0 +1,87 @@ +using Content.Shared.Throwing; +using Robust.Client.Animations; +using Robust.Client.GameObjects; +using Robust.Shared.Animations; + +namespace Content.Client.Throwing; + +/// +/// Handles animating thrown items. +/// +public sealed class ThrownItemVisualizerSystem : EntitySystem +{ + [Dependency] private readonly AnimationPlayerSystem _anim = default!; + + private const string AnimationKey = "thrown-item"; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnAutoHandleState); + SubscribeLocalEvent(OnShutdown); + } + + private void OnAutoHandleState(EntityUid uid, ThrownItemComponent component, ref AfterAutoHandleStateEvent args) + { + if (!TryComp(uid, out var sprite)) + return; + + var animationPlayer = EnsureComp(uid); + + if (_anim.HasRunningAnimation(uid, animationPlayer, AnimationKey)) + return; + + var anim = GetAnimation((uid, component, sprite)); + if (anim == null) + return; + + component.OriginalScale = sprite.Scale; + _anim.Play((uid, animationPlayer), anim, AnimationKey); + } + + private void OnShutdown(EntityUid uid, ThrownItemComponent component, ComponentShutdown args) + { + if (!_anim.HasRunningAnimation(uid, AnimationKey)) + return; + + if (TryComp(uid, out var sprite) && component.OriginalScale != null) + sprite.Scale = component.OriginalScale.Value; + + _anim.Stop(uid, AnimationKey); + } + + private static Animation? GetAnimation(Entity ent) + { + if (ent.Comp1.LandTime - ent.Comp1.ThrownTime is not { } length) + return null; + + if (length <= TimeSpan.Zero) + return null; + + length += TimeSpan.FromSeconds(ThrowingSystem.FlyTime); + var scale = ent.Comp2.Scale; + var lenFloat = (float) length.TotalSeconds; + + // TODO use like actual easings here + return new Animation + { + Length = length, + AnimationTracks = + { + new AnimationTrackComponentProperty + { + ComponentType = typeof(SpriteComponent), + Property = nameof(SpriteComponent.Scale), + KeyFrames = + { + new AnimationTrackProperty.KeyFrame(scale, 0.0f), + new AnimationTrackProperty.KeyFrame(scale * 1.4f, lenFloat * 0.25f), + new AnimationTrackProperty.KeyFrame(scale, lenFloat * 0.75f) + }, + InterpolationMode = AnimationInterpolationMode.Linear + } + } + }; + } +} diff --git a/Content.Shared/Throwing/ThrowingSystem.cs b/Content.Shared/Throwing/ThrowingSystem.cs index e6315464119..5fe02a05717 100644 --- a/Content.Shared/Throwing/ThrowingSystem.cs +++ b/Content.Shared/Throwing/ThrowingSystem.cs @@ -1,5 +1,6 @@ using System.Numerics; using Content.Shared.Administration.Logs; +using Content.Shared.Camera; using Content.Shared.Database; using Content.Shared.Gravity; using Content.Shared.Hands.Components; @@ -32,6 +33,7 @@ public sealed class ThrowingSystem : EntitySystem [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly ThrownItemSystem _thrownSystem = default!; + [Dependency] private readonly SharedCameraRecoilSystem _recoil = default!; [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; public void TryThrow( @@ -114,7 +116,7 @@ public void TryThrow(EntityUid uid, if (projectileQuery.TryGetComponent(uid, out var proj) && !proj.OnlyCollideWhenShot) return; - var comp = EnsureComp(uid); + var comp = new ThrownItemComponent(); comp.Thrower = user; // Estimate time to arrival so we can apply OnGround status and slow it much faster. @@ -126,6 +128,7 @@ public void TryThrow(EntityUid uid, else comp.LandTime = time < FlyTime ? default : comp.ThrownTime + TimeSpan.FromSeconds(time - FlyTime); comp.PlayLandSound = playSound; + AddComp(uid, comp, true); ThrowingAngleComponent? throwingAngle = null; @@ -160,9 +163,13 @@ public void TryThrow(EntityUid uid, _physics.SetBodyStatus(physics, BodyStatus.InAir); } + if (user == null) + return; + + _recoil.KickCamera(user.Value, -direction * 0.3f); + // Give thrower an impulse in the other direction - if (user != null && - pushbackRatio != 0.0f && + if (pushbackRatio != 0.0f && physics.Mass > 0f && TryComp(user.Value, out PhysicsComponent? userPhysics) && _gravity.IsWeightless(user.Value, userPhysics)) diff --git a/Content.Shared/Throwing/ThrownItemComponent.cs b/Content.Shared/Throwing/ThrownItemComponent.cs index c6c9c4a4467..ab80e079383 100644 --- a/Content.Shared/Throwing/ThrownItemComponent.cs +++ b/Content.Shared/Throwing/ThrownItemComponent.cs @@ -1,54 +1,47 @@ +using System.Numerics; using Robust.Shared.GameStates; using Robust.Shared.Serialization; using Robust.Shared.Timing; namespace Content.Shared.Throwing { - [RegisterComponent, NetworkedComponent] + [RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] public sealed partial class ThrownItemComponent : Component { /// /// The entity that threw this entity. /// - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] public EntityUid? Thrower; /// /// The timestamp at which this entity was thrown. /// - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] public TimeSpan? ThrownTime; /// /// Compared to to land this entity, if any. /// - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] public TimeSpan? LandTime; /// /// Whether or not this entity was already landed. /// - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] public bool Landed; /// /// Whether or not to play a sound when the entity lands. /// - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] public bool PlayLandSound; - } - - [Serializable, NetSerializable] - public sealed class ThrownItemComponentState : ComponentState - { - public NetEntity? Thrower; - - public TimeSpan? ThrownTime; - - public TimeSpan? LandTime; - - public bool Landed; - public bool PlayLandSound; + /// + /// Used to restore state after the throwing scale animation is finished. + /// + [DataField] + public Vector2? OriginalScale = null; } } diff --git a/Content.Shared/Throwing/ThrownItemSystem.cs b/Content.Shared/Throwing/ThrownItemSystem.cs index 450c38d6390..0e5817ff92c 100644 --- a/Content.Shared/Throwing/ThrownItemSystem.cs +++ b/Content.Shared/Throwing/ThrownItemSystem.cs @@ -36,41 +36,10 @@ public override void Initialize() SubscribeLocalEvent(PreventCollision); SubscribeLocalEvent(ThrowItem); SubscribeLocalEvent(OnThrownUnpaused); - SubscribeLocalEvent(OnThrownGetState); - SubscribeLocalEvent(OnThrownHandleState); SubscribeLocalEvent(HandlePullStarted); } - private void OnThrownGetState(EntityUid uid, ThrownItemComponent component, ref ComponentGetState args) - { - // TODO: Throwing needs to handle this properly I just want the bad asserts to stop getting in my way. - TryGetNetEntity(component.Thrower, out var nent); - - args.State = new ThrownItemComponentState() - { - ThrownTime = component.ThrownTime, - LandTime = component.LandTime, - Thrower = nent, - Landed = component.Landed, - PlayLandSound = component.PlayLandSound, - }; - } - - private void OnThrownHandleState(EntityUid uid, ThrownItemComponent component, ref ComponentHandleState args) - { - if (args.Current is not ThrownItemComponentState state) - return; - - TryGetEntity(state.Thrower, out var thrower); - - component.ThrownTime = state.ThrownTime; - component.LandTime = state.LandTime; - component.Thrower = thrower; - component.Landed = state.Landed; - component.PlayLandSound = state.PlayLandSound; - } - private void OnMapInit(EntityUid uid, ThrownItemComponent component, MapInitEvent args) { component.ThrownTime ??= _gameTiming.CurTime; From 38d23fd2a6c65cd84e1f891d5cdb7824f065df7a Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 30 Jan 2024 10:51:47 +0000 Subject: [PATCH 054/266] Automatic changelog update (cherry picked from commit a0d2a2ffe63e1172a413dfcc792250dd7a0bf8c3) --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 33cb24cca3f..c122682f450 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: EmoGarbage404 - changes: - - message: Removed the Handheld Electrical Propulsion technology and its associated - item, tasers, from research. - type: Remove - id: 5327 - time: '2023-12-11T22:33:29.0000000+00:00' - author: EmoGarbage404 changes: - message: Added the artifact crusher to research! Crush things today! @@ -3836,3 +3829,10 @@ id: 5826 time: '2024-01-30T10:26:02.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24725 +- author: mirrorcult + changes: + - message: Throwing items now scale a bit when thrown to simulate rising/falling + type: Add + id: 5827 + time: '2024-01-30T10:50:41.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24724 From 0470e0c387ccb081bebbdf042dceb8d83558d41c Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 30 Jan 2024 10:56:00 +0000 Subject: [PATCH 055/266] Automatic changelog update (cherry picked from commit a77b2021b5a0c823ad82367af1a010c8c539dfdf) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index c122682f450..ad692331a5d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: EmoGarbage404 - changes: - - message: Added the artifact crusher to research! Crush things today! - type: Add - id: 5328 - time: '2023-12-11T23:15:47.0000000+00:00' - author: notafet changes: - message: Stations no longer produce limitless plasma. Plasma refills can now be @@ -3836,3 +3830,10 @@ id: 5827 time: '2024-01-30T10:50:41.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24724 +- author: Emisse + changes: + - message: Gemini + type: Remove + id: 5828 + time: '2024-01-30T10:54:55.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24728 From f4cfa192c3478296a23362ef63da38138d8b45fb Mon Sep 17 00:00:00 2001 From: CrigCrag <137215465+crigcrag@users.noreply.github.com> Date: Tue, 30 Jan 2024 11:56:37 +0100 Subject: [PATCH 056/266] Overrun Outpost Arm (#24656) * add every * remove 2 crusher spawns (cherry picked from commit 572347af5d1dc7a0a25d5afeafa823ac5ea8ace7) --- .../Locale/en-US/salvage/salvage-magnet.ftl | 1 + Resources/Maps/Salvage/outpost-arm.yml | 1841 +++++++++++++++++ Resources/Prototypes/Maps/salvage.yml | 4 + 3 files changed, 1846 insertions(+) create mode 100644 Resources/Maps/Salvage/outpost-arm.yml diff --git a/Resources/Locale/en-US/salvage/salvage-magnet.ftl b/Resources/Locale/en-US/salvage/salvage-magnet.ftl index 15a71c0a8e4..64db8ead33b 100644 --- a/Resources/Locale/en-US/salvage/salvage-magnet.ftl +++ b/Resources/Locale/en-US/salvage/salvage-magnet.ftl @@ -69,3 +69,4 @@ salvage-map-proto-AsteroidBase = Asteroid Base salvage-map-proto-RuinCargoBase = Ruined Cargo Storage salvage-map-proto-SecurityChunk = Security Department Chunk salvage-map-proto-EngineeringChunk = Engineering Department Chunk +salvage-map-proto-OutpostArm = Overrun Outpost Arm \ No newline at end of file diff --git a/Resources/Maps/Salvage/outpost-arm.yml b/Resources/Maps/Salvage/outpost-arm.yml new file mode 100644 index 00000000000..4d82773b9eb --- /dev/null +++ b/Resources/Maps/Salvage/outpost-arm.yml @@ -0,0 +1,1841 @@ +meta: + format: 6 + postmapinit: false +tilemap: + 0: Space + 64: FloorMetalDiamond + 66: FloorMining + 70: FloorOldConcrete + 71: FloorOldConcreteMono + 120: Lattice + 121: Plating + 123: PlatingBurnt + 124: PlatingDamaged +entities: +- proto: "" + entities: + - uid: 1 + components: + - type: MetaData + name: grid + - type: Transform + pos: -6.1930037,0.9843712 + parent: invalid + - type: MapGrid + chunks: + 0,0: + ind: 0,0 + tiles: RgAAAAAAewAAAAAAfAAAAAAAeAAAAAAAewAAAAAARgAAAAADeQAAAAAAewAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAAAAAARwAAAAAARwAAAAADRwAAAAABfAAAAAACRwAAAAAAeQAAAAAAewAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAAAAACRwAAAAABRwAAAAAARwAAAAAARwAAAAAARwAAAAADewAAAAAAewAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAAAAAARwAAAAAARwAAAAADRwAAAAAARwAAAAACRwAAAAAAeQAAAAAAewAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAAAAADRwAAAAABRwAAAAADRwAAAAACewAAAAAARwAAAAAAewAAAAAAewAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAAAAADRwAAAAABRwAAAAACRwAAAAADeQAAAAAAewAAAAAAeQAAAAAAewAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAAAAAARwAAAAAARwAAAAADRwAAAAAAeQAAAAAAewAAAAAAeQAAAAAAewAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAARwAAAAADRwAAAAAAewAAAAAAeQAAAAAAewAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAAAAADeQAAAAAAfAAAAAACRwAAAAADRwAAAAABRwAAAAACfAAAAAABewAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAAAAADewAAAAAAeAAAAAAAeQAAAAAARwAAAAAARwAAAAAARgAAAAACeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAAAAADRwAAAAABeQAAAAAARwAAAAACRwAAAAACRwAAAAACRgAAAAACewAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARgAAAAAARwAAAAAARwAAAAACRwAAAAADRwAAAAABRwAAAAADRgAAAAABfAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQgAAAAAAQgAAAAAAQgAAAAAAQAAAAAAAQAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQgAAAAAAQgAAAAAAQgAAAAAAQAAAAAAAQAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + -1,0: + ind: -1,0 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAA + version: 6 + -1,-1: + ind: -1,-1 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAA + version: 6 + 0,-1: + ind: 0,-1 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAfAAAAAABeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + 0,1: + ind: 0,1 + tiles: QAAAAAAAQAAAAAAAQgAAAAAAQgAAAAAAQgAAAAAAQAAAAAAAQAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + -1,1: + ind: -1,1 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + - type: Broadphase + - type: Physics + bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 + fixedRotation: False + bodyType: Dynamic + - type: Fixtures + fixtures: {} + - type: OccluderTree + - type: SpreaderGrid + - type: Shuttle + - type: GridPathfinding + - type: Gravity + gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + - type: DecalGrid + chunkCollection: + version: 2 + nodes: + - node: + cleanable: True + color: '#000000FF' + id: Damaged + decals: + 13: 4,6 + 14: -1,11 + 15: 2,10 + 16: 6,3 + 17: 5,5 + 18: 4,1 + - node: + cleanable: True + color: '#FFFFFFFF' + id: Dirt + decals: + 0: 2,2 + 1: 5,9 + 8: 1,10 + 9: 6,5 + 10: 0,1 + - node: + cleanable: True + color: '#FFFFFFFF' + id: DirtHeavy + decals: + 2: 0,11 + 3: 6,10 + - node: + cleanable: True + color: '#FFFFFFFF' + id: DirtHeavyMonotile + decals: + 7: 5,4 + - node: + cleanable: True + color: '#FFFFFFFF' + id: DirtLight + decals: + 4: 0,1 + 5: 5,0 + - node: + cleanable: True + color: '#FFFFFFFF' + id: DirtMedium + decals: + 6: 0,9 + - node: + cleanable: True + color: '#FFFFFFFF' + id: Rust + decals: + 11: -1,-1 + - node: + cleanable: True + color: '#636200FF' + id: danger + decals: + 12: 4.9819956,1.0227132 + - node: + cleanable: True + color: '#7F0000FF' + id: o + decals: + 22: 4.302699,3.1356921 + - node: + cleanable: True + color: '#7F0000FF' + id: s + decals: + 20: 3.943324,3.1513171 + 21: 4.755824,3.1356921 + - node: + cleanable: True + color: '#500000FF' + id: splatter + decals: + 19: 1.5020199,7.7976913 + - type: GridAtmosphere + version: 2 + data: + tiles: + 0,0: + 0: 65535 + 1,0: + 0: 65535 + 2,0: + 0: 4369 + 0,1: + 0: 65535 + 0,2: + 0: 65535 + 0,3: + 0: 65535 + 1,1: + 0: 65535 + 1,2: + 0: 65535 + 1,3: + 0: 65535 + 2,1: + 0: 4369 + 2,2: + 0: 17 + 2,3: + 0: 8818 + -1,3: + 0: 43770 + -1,0: + 0: 61160 + -1,1: + 0: 52462 + -1,2: + 0: 34956 + -1,-1: + 0: 34944 + 0,-1: + 0: 28928 + 1,-1: + 0: 63264 + 2,-1: + 0: 4096 + 0,4: + 0: 65535 + 0,5: + 0: 242 + 1,4: + 0: 65535 + 1,5: + 0: 2 + 2,4: + 0: 50 + -1,4: + 0: 35578 + -1,5: + 0: 128 + uniqueMixes: + - volume: 2500 + temperature: 293.15 + moles: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + chunkSize: 4 + - type: GasTileOverlay + - type: RadiationGridResistance +- proto: BlastDoor + entities: + - uid: 105 + components: + - type: Transform + pos: 4.5,11.5 + parent: 1 + - uid: 107 + components: + - type: Transform + pos: 3.5,11.5 + parent: 1 + - uid: 108 + components: + - type: Transform + pos: 2.5,11.5 + parent: 1 +- proto: CableApcExtension + entities: + - uid: 76 + components: + - type: Transform + pos: 1.5,2.5 + parent: 1 + - uid: 236 + components: + - type: Transform + pos: 1.5,17.5 + parent: 1 + - uid: 237 + components: + - type: Transform + pos: 2.5,17.5 + parent: 1 + - uid: 238 + components: + - type: Transform + pos: 3.5,17.5 + parent: 1 + - uid: 239 + components: + - type: Transform + pos: 4.5,17.5 + parent: 1 + - uid: 240 + components: + - type: Transform + pos: 5.5,17.5 + parent: 1 + - uid: 241 + components: + - type: Transform + pos: 3.5,16.5 + parent: 1 + - uid: 242 + components: + - type: Transform + pos: 3.5,16.5 + parent: 1 + - uid: 243 + components: + - type: Transform + pos: 3.5,15.5 + parent: 1 + - uid: 244 + components: + - type: Transform + pos: 3.5,14.5 + parent: 1 + - uid: 245 + components: + - type: Transform + pos: 3.5,13.5 + parent: 1 + - uid: 246 + components: + - type: Transform + pos: 3.5,12.5 + parent: 1 + - uid: 247 + components: + - type: Transform + pos: 3.5,12.5 + parent: 1 + - uid: 248 + components: + - type: Transform + pos: 3.5,11.5 + parent: 1 + - uid: 249 + components: + - type: Transform + pos: 3.5,9.5 + parent: 1 + - uid: 250 + components: + - type: Transform + pos: 3.5,10.5 + parent: 1 + - uid: 251 + components: + - type: Transform + pos: 2.5,12.5 + parent: 1 + - uid: 252 + components: + - type: Transform + pos: 1.5,12.5 + parent: 1 + - uid: 253 + components: + - type: Transform + pos: 0.5,12.5 + parent: 1 + - uid: 254 + components: + - type: Transform + pos: 4.5,12.5 + parent: 1 + - uid: 255 + components: + - type: Transform + pos: 5.5,12.5 + parent: 1 + - uid: 256 + components: + - type: Transform + pos: 6.5,12.5 + parent: 1 + - uid: 257 + components: + - type: Transform + pos: 0.5,17.5 + parent: 1 + - uid: 258 + components: + - type: Transform + pos: 1.5,17.5 + parent: 1 + - uid: 259 + components: + - type: Transform + pos: 2.5,17.5 + parent: 1 + - uid: 260 + components: + - type: Transform + pos: 2.5,17.5 + parent: 1 + - uid: 261 + components: + - type: Transform + pos: 4.5,17.5 + parent: 1 + - uid: 262 + components: + - type: Transform + pos: 5.5,17.5 + parent: 1 + - uid: 263 + components: + - type: Transform + pos: 6.5,17.5 + parent: 1 + - uid: 264 + components: + - type: Transform + pos: 3.5,8.5 + parent: 1 + - uid: 265 + components: + - type: Transform + pos: 3.5,7.5 + parent: 1 + - uid: 266 + components: + - type: Transform + pos: 3.5,6.5 + parent: 1 + - uid: 267 + components: + - type: Transform + pos: 3.5,5.5 + parent: 1 + - uid: 268 + components: + - type: Transform + pos: 3.5,4.5 + parent: 1 + - uid: 269 + components: + - type: Transform + pos: 3.5,3.5 + parent: 1 + - uid: 270 + components: + - type: Transform + pos: 3.5,2.5 + parent: 1 + - uid: 271 + components: + - type: Transform + pos: 3.5,1.5 + parent: 1 + - uid: 272 + components: + - type: Transform + pos: 2.5,2.5 + parent: 1 + - uid: 273 + components: + - type: Transform + pos: 1.5,2.5 + parent: 1 + - uid: 274 + components: + - type: Transform + pos: 4.5,2.5 + parent: 1 + - uid: 275 + components: + - type: Transform + pos: 5.5,2.5 + parent: 1 +- proto: CableHV + entities: + - uid: 12 + components: + - type: Transform + pos: 2.5,7.5 + parent: 1 + - uid: 13 + components: + - type: Transform + pos: 3.5,7.5 + parent: 1 + - uid: 19 + components: + - type: Transform + pos: 1.5,7.5 + parent: 1 + - uid: 20 + components: + - type: Transform + pos: 7.5,10.5 + parent: 1 + - uid: 21 + components: + - type: Transform + pos: 7.5,8.5 + parent: 1 + - uid: 22 + components: + - type: Transform + pos: 7.5,9.5 + parent: 1 + - uid: 23 + components: + - type: Transform + pos: 7.5,6.5 + parent: 1 + - uid: 24 + components: + - type: Transform + pos: 7.5,7.5 + parent: 1 + - uid: 25 + components: + - type: Transform + pos: 6.5,7.5 + parent: 1 + - uid: 26 + components: + - type: Transform + pos: 5.5,7.5 + parent: 1 + - uid: 27 + components: + - type: Transform + pos: 4.5,7.5 + parent: 1 + - uid: 28 + components: + - type: Transform + pos: 1.5,7.5 + parent: 1 + - uid: 29 + components: + - type: Transform + pos: -0.5,8.5 + parent: 1 + - uid: 30 + components: + - type: Transform + pos: -0.5,10.5 + parent: 1 + - uid: 31 + components: + - type: Transform + pos: -0.5,6.5 + parent: 1 + - uid: 32 + components: + - type: Transform + pos: -0.5,9.5 + parent: 1 + - uid: 33 + components: + - type: Transform + pos: -0.5,7.5 + parent: 1 + - uid: 34 + components: + - type: Transform + pos: 0.5,7.5 + parent: 1 + - uid: 276 + components: + - type: Transform + pos: 4.5,8.5 + parent: 1 + - uid: 277 + components: + - type: Transform + pos: 4.5,9.5 + parent: 1 + - uid: 278 + components: + - type: Transform + pos: 4.5,10.5 + parent: 1 + - uid: 279 + components: + - type: Transform + pos: 4.5,11.5 + parent: 1 + - uid: 280 + components: + - type: Transform + pos: 4.5,12.5 + parent: 1 + - uid: 281 + components: + - type: Transform + pos: 5.5,12.5 + parent: 1 + - uid: 282 + components: + - type: Transform + pos: 6.5,12.5 + parent: 1 + - uid: 283 + components: + - type: Transform + pos: 6.5,13.5 + parent: 1 + - uid: 284 + components: + - type: Transform + pos: 6.5,14.5 + parent: 1 + - uid: 285 + components: + - type: Transform + pos: 6.5,15.5 + parent: 1 + - uid: 286 + components: + - type: Transform + pos: 6.5,16.5 + parent: 1 + - uid: 287 + components: + - type: Transform + pos: 6.5,17.5 + parent: 1 + - uid: 288 + components: + - type: Transform + pos: 6.5,18.5 + parent: 1 + - uid: 289 + components: + - type: Transform + pos: 6.5,19.5 + parent: 1 + - uid: 290 + components: + - type: Transform + pos: 2.5,6.5 + parent: 1 + - uid: 291 + components: + - type: Transform + pos: 2.5,5.5 + parent: 1 + - uid: 292 + components: + - type: Transform + pos: 2.5,4.5 + parent: 1 + - uid: 293 + components: + - type: Transform + pos: 2.5,3.5 + parent: 1 + - uid: 294 + components: + - type: Transform + pos: 2.5,2.5 + parent: 1 + - uid: 295 + components: + - type: Transform + pos: 2.5,1.5 + parent: 1 +- proto: Chair + entities: + - uid: 111 + components: + - type: Transform + pos: 5.5,4.5 + parent: 1 +- proto: CigarGoldCase + entities: + - uid: 191 + components: + - type: Transform + pos: 4.752561,14.569866 + parent: 1 +- proto: ClosetEmergencyFilledRandom + entities: + - uid: 132 + components: + - type: Transform + pos: 0.5,4.5 + parent: 1 +- proto: ClothingHeadHelmetScaf + entities: + - uid: 196 + components: + - type: Transform + pos: 3.752561,14.507366 + parent: 1 +- proto: ClothingOuterArmorScaf + entities: + - uid: 195 + components: + - type: Transform + pos: 3.346311,14.569866 + parent: 1 +- proto: CrateEngineeringCableBulk + entities: + - uid: 122 + components: + - type: Transform + pos: 6.5,9.5 + parent: 1 +- proto: GeneratorRTG + entities: + - uid: 8 + components: + - type: Transform + pos: 0.5,7.5 + parent: 1 +- proto: Girder + entities: + - uid: 206 + components: + - type: Transform + pos: 3.5,0.5 + parent: 1 +- proto: Grille + entities: + - uid: 2 + components: + - type: Transform + pos: -3.5,13.5 + parent: 1 + - uid: 3 + components: + - type: Transform + pos: -2.5,1.5 + parent: 1 + - uid: 4 + components: + - type: Transform + pos: -2.5,2.5 + parent: 1 + - uid: 5 + components: + - type: Transform + pos: -2.5,3.5 + parent: 1 + - uid: 6 + components: + - type: Transform + pos: -2.5,4.5 + parent: 1 + - uid: 7 + components: + - type: Transform + pos: -2.5,5.5 + parent: 1 + - uid: 14 + components: + - type: Transform + pos: -0.5,6.5 + parent: 1 + - uid: 15 + components: + - type: Transform + pos: -0.5,7.5 + parent: 1 + - uid: 16 + components: + - type: Transform + pos: -0.5,8.5 + parent: 1 + - uid: 17 + components: + - type: Transform + pos: -0.5,9.5 + parent: 1 + - uid: 18 + components: + - type: Transform + pos: -0.5,10.5 + parent: 1 + - uid: 35 + components: + - type: Transform + pos: 7.5,6.5 + parent: 1 + - uid: 36 + components: + - type: Transform + pos: 7.5,7.5 + parent: 1 + - uid: 37 + components: + - type: Transform + pos: 7.5,8.5 + parent: 1 + - uid: 38 + components: + - type: Transform + pos: 7.5,9.5 + parent: 1 + - uid: 39 + components: + - type: Transform + pos: 7.5,10.5 + parent: 1 + - uid: 198 + components: + - type: Transform + pos: -2.5,13.5 + parent: 1 + - uid: 199 + components: + - type: Transform + pos: -2.5,14.5 + parent: 1 + - uid: 200 + components: + - type: Transform + pos: -2.5,12.5 + parent: 1 + - uid: 201 + components: + - type: Transform + pos: -2.5,15.5 + parent: 1 + - uid: 202 + components: + - type: Transform + pos: -2.5,16.5 + parent: 1 + - uid: 204 + components: + - type: Transform + pos: -3.5,17.5 + parent: 1 + - uid: 205 + components: + - type: Transform + pos: -2.5,17.5 + parent: 1 + - uid: 207 + components: + - type: Transform + pos: 9.5,14.5 + parent: 1 + - uid: 208 + components: + - type: Transform + pos: 9.5,13.5 + parent: 1 + - uid: 209 + components: + - type: Transform + pos: 9.5,15.5 + parent: 1 + - uid: 210 + components: + - type: Transform + pos: 9.5,16.5 + parent: 1 + - uid: 213 + components: + - type: Transform + pos: 0.5,21.5 + parent: 1 + - uid: 214 + components: + - type: Transform + pos: 1.5,21.5 + parent: 1 + - uid: 215 + components: + - type: Transform + pos: 2.5,21.5 + parent: 1 +- proto: GrilleBroken + entities: + - uid: 203 + components: + - type: Transform + pos: -2.5,18.5 + parent: 1 + - uid: 211 + components: + - type: Transform + pos: 9.5,17.5 + parent: 1 + - uid: 212 + components: + - type: Transform + pos: 1.5,20.5 + parent: 1 +- proto: GrilleSpawner + entities: + - uid: 216 + components: + - type: Transform + pos: -0.5,21.5 + parent: 1 + - uid: 217 + components: + - type: Transform + pos: 3.5,21.5 + parent: 1 + - uid: 218 + components: + - type: Transform + pos: 9.5,12.5 + parent: 1 +- proto: HighSecCommandLocked + entities: + - uid: 168 + components: + - type: Transform + pos: 3.5,17.5 + parent: 1 +- proto: InflatableWall + entities: + - uid: 97 + components: + - type: Transform + pos: 3.5,5.5 + parent: 1 + - uid: 103 + components: + - type: Transform + pos: 2.5,5.5 + parent: 1 + - uid: 104 + components: + - type: Transform + pos: 4.5,5.5 + parent: 1 +- proto: InflatableWallStack5 + entities: + - uid: 106 + components: + - type: Transform + pos: 2.3491457,6.305113 + parent: 1 +- proto: IngotGold + entities: + - uid: 190 + components: + - type: Transform + pos: 2.549436,14.585491 + parent: 1 +- proto: LandMineExplosive + entities: + - uid: 77 + components: + - type: Transform + pos: 1.5668869,-0.46386743 + parent: 1 + - uid: 78 + components: + - type: Transform + pos: 4.582512,-0.27636743 + parent: 1 +- proto: MaintenanceToolSpawner + entities: + - uid: 183 + components: + - type: Transform + pos: 6.5,17.5 + parent: 1 +- proto: MaintenanceWeaponSpawner + entities: + - uid: 112 + components: + - type: Transform + pos: 1.5,1.5 + parent: 1 +- proto: MaterialDiamond1 + entities: + - uid: 185 + components: + - type: Transform + pos: 2.2577534,14.522991 + parent: 1 + - uid: 186 + components: + - type: Transform + pos: 2.2577534,14.522991 + parent: 1 + - uid: 187 + components: + - type: Transform + pos: 2.2577534,14.522991 + parent: 1 + - uid: 188 + components: + - type: Transform + pos: 2.2577534,14.522991 + parent: 1 + - uid: 189 + components: + - type: Transform + pos: 2.2577534,14.522991 + parent: 1 +- proto: MaterialWoodPlank + entities: + - uid: 182 + components: + - type: Transform + pos: 1.6308241,12.5394535 + parent: 1 +- proto: Poweredlight + entities: + - uid: 219 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.5,15.5 + parent: 1 + - uid: 220 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 4.5,15.5 + parent: 1 + - uid: 221 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,17.5 + parent: 1 + - uid: 222 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 6.5,17.5 + parent: 1 + - uid: 223 + components: + - type: Transform + pos: 2.5,12.5 + parent: 1 + - uid: 224 + components: + - type: Transform + pos: 4.5,12.5 + parent: 1 + - uid: 225 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 6.5,8.5 + parent: 1 + - uid: 226 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,8.5 + parent: 1 + - uid: 227 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,1.5 + parent: 1 + - uid: 228 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,3.5 + parent: 1 + - uid: 229 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 6.5,3.5 + parent: 1 + - uid: 230 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 6.5,1.5 + parent: 1 +- proto: PoweredSmallLight + entities: + - uid: 234 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 4.5,10.5 + parent: 1 + - uid: 235 + components: + - type: Transform + pos: 3.5,18.5 + parent: 1 +- proto: PoweredSmallLightEmpty + entities: + - uid: 231 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 4.5,6.5 + parent: 1 + - uid: 232 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.5,6.5 + parent: 1 + - uid: 233 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.5,10.5 + parent: 1 +- proto: Rack + entities: + - uid: 179 + components: + - type: Transform + pos: 2.5,14.5 + parent: 1 + - uid: 180 + components: + - type: Transform + pos: 3.5,14.5 + parent: 1 + - uid: 184 + components: + - type: Transform + pos: 4.5,14.5 + parent: 1 +- proto: RandomArtifactSpawner20 + entities: + - uid: 87 + components: + - type: Transform + pos: -1.5,3.5 + parent: 1 +- proto: RandomInstruments + entities: + - uid: 85 + components: + - type: Transform + pos: 4.5,16.5 + parent: 1 +- proto: RandomPosterAny + entities: + - uid: 129 + components: + - type: Transform + pos: -0.5,2.5 + parent: 1 + - uid: 130 + components: + - type: Transform + pos: 7.5,2.5 + parent: 1 + - uid: 131 + components: + - type: Transform + pos: 1.5,10.5 + parent: 1 +- proto: RandomSecurityCorpseSpawner + entities: + - uid: 109 + components: + - type: Transform + pos: 2.5,8.5 + parent: 1 +- proto: RandomSpawner + entities: + - uid: 86 + components: + - type: Transform + pos: 6.5,8.5 + parent: 1 +- proto: RandomSpawner100 + entities: + - uid: 84 + components: + - type: Transform + pos: 0.5,3.5 + parent: 1 +- proto: RandomVendingDrinks + entities: + - uid: 133 + components: + - type: Transform + pos: 1.5,4.5 + parent: 1 +- proto: ReinforcedGirder + entities: + - uid: 70 + components: + - type: Transform + pos: 0.5,-0.5 + parent: 1 + - uid: 71 + components: + - type: Transform + pos: 1.5,0.5 + parent: 1 + - uid: 72 + components: + - type: Transform + pos: 2.5,0.5 + parent: 1 + - uid: 73 + components: + - type: Transform + pos: 4.5,0.5 + parent: 1 + - uid: 74 + components: + - type: Transform + pos: 5.5,-0.5 + parent: 1 + - uid: 75 + components: + - type: Transform + pos: 6.5,0.5 + parent: 1 +- proto: ReinforcedPlasmaWindow + entities: + - uid: 9 + components: + - type: Transform + pos: -0.5,6.5 + parent: 1 + - uid: 10 + components: + - type: Transform + pos: -0.5,8.5 + parent: 1 + - uid: 11 + components: + - type: Transform + pos: -0.5,7.5 + parent: 1 + - uid: 40 + components: + - type: Transform + pos: -0.5,9.5 + parent: 1 + - uid: 41 + components: + - type: Transform + pos: 7.5,6.5 + parent: 1 + - uid: 42 + components: + - type: Transform + pos: -0.5,10.5 + parent: 1 + - uid: 43 + components: + - type: Transform + pos: 7.5,7.5 + parent: 1 + - uid: 44 + components: + - type: Transform + pos: 7.5,8.5 + parent: 1 + - uid: 45 + components: + - type: Transform + pos: 7.5,9.5 + parent: 1 + - uid: 46 + components: + - type: Transform + pos: 7.5,10.5 + parent: 1 +- proto: ResearchDisk10000 + entities: + - uid: 192 + components: + - type: Transform + pos: 4.408811,14.491741 + parent: 1 +- proto: SalvageCanisterSpawner + entities: + - uid: 82 + components: + - type: Transform + pos: 0.5,8.5 + parent: 1 + - uid: 121 + components: + - type: Transform + pos: 6.5,10.5 + parent: 1 +- proto: SalvageLootSpawner + entities: + - uid: 193 + components: + - type: Transform + pos: 2.5,16.5 + parent: 1 +- proto: SalvageMaterialCrateSpawner + entities: + - uid: 80 + components: + - type: Transform + pos: 3.5,3.5 + parent: 1 + - uid: 81 + components: + - type: Transform + pos: 6.5,1.5 + parent: 1 + - uid: 120 + components: + - type: Transform + pos: 0.5,6.5 + parent: 1 +- proto: SalvageMobSpawner + entities: + - uid: 113 + components: + - type: Transform + pos: 3.5,6.5 + parent: 1 + - uid: 114 + components: + - type: Transform + pos: 0.5,9.5 + parent: 1 +- proto: SalvageMobSpawner75 + entities: + - uid: 115 + components: + - type: Transform + pos: 3.5,10.5 + parent: 1 +- proto: ShuttersNormal + entities: + - uid: 47 + components: + - type: Transform + pos: -0.5,10.5 + parent: 1 + - uid: 48 + components: + - type: Transform + pos: -0.5,9.5 + parent: 1 + - uid: 50 + components: + - type: Transform + pos: -0.5,7.5 + parent: 1 + - uid: 51 + components: + - type: Transform + pos: -0.5,6.5 + parent: 1 + - uid: 52 + components: + - type: Transform + pos: 7.5,6.5 + parent: 1 + - uid: 53 + components: + - type: Transform + pos: 7.5,7.5 + parent: 1 + - uid: 54 + components: + - type: Transform + pos: 7.5,8.5 + parent: 1 + - uid: 55 + components: + - type: Transform + pos: 7.5,10.5 + parent: 1 +- proto: ShuttersNormalOpen + entities: + - uid: 49 + components: + - type: Transform + pos: -0.5,8.5 + parent: 1 + - uid: 56 + components: + - type: Transform + pos: 7.5,9.5 + parent: 1 +- proto: ShuttersWindowOpen + entities: + - uid: 123 + components: + - type: Transform + pos: 1.5,9.5 + parent: 1 + - uid: 124 + components: + - type: Transform + pos: 1.5,8.5 + parent: 1 + - uid: 125 + components: + - type: Transform + pos: 1.5,7.5 + parent: 1 + - uid: 126 + components: + - type: Transform + pos: 5.5,9.5 + parent: 1 + - uid: 127 + components: + - type: Transform + pos: 5.5,8.5 + parent: 1 + - uid: 128 + components: + - type: Transform + pos: 5.5,7.5 + parent: 1 +- proto: SignElectricalMed + entities: + - uid: 296 + components: + - type: Transform + pos: 1.5,6.5 + parent: 1 +- proto: SignRedTwo + entities: + - uid: 298 + components: + - type: Transform + pos: 3.5,13.5 + parent: 1 +- proto: SignSomethingOld2 + entities: + - uid: 297 + components: + - type: Transform + pos: 5.5,6.5 + parent: 1 +- proto: SpaceTickSpawner + entities: + - uid: 117 + components: + - type: Transform + pos: -1.5,1.5 + parent: 1 + - uid: 118 + components: + - type: Transform + pos: 8.5,7.5 + parent: 1 + - uid: 119 + components: + - type: Transform + pos: 8.5,2.5 + parent: 1 +- proto: SpawnMobBearSalvage + entities: + - uid: 177 + components: + - type: Transform + pos: 0.5,14.5 + parent: 1 + - uid: 178 + components: + - type: Transform + pos: 6.5,14.5 + parent: 1 +- proto: SpawnMobCobraSalvage + entities: + - uid: 83 + components: + - type: Transform + pos: 6.5,7.5 + parent: 1 + - uid: 116 + components: + - type: Transform + pos: 0.5,10.5 + parent: 1 +- proto: SpawnMobShark + entities: + - uid: 181 + components: + - type: Transform + pos: 3.5,18.5 + parent: 1 +- proto: SteelBench + entities: + - uid: 110 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,2.5 + parent: 1 +- proto: UraniumOre + entities: + - uid: 194 + components: + - type: Transform + pos: 6.5117617,6.5053644 + parent: 1 +- proto: WallPlastitanium + entities: + - uid: 57 + components: + - type: Transform + pos: -0.5,5.5 + parent: 1 + - uid: 58 + components: + - type: Transform + pos: -0.5,4.5 + parent: 1 + - uid: 59 + components: + - type: Transform + pos: -0.5,3.5 + parent: 1 + - uid: 60 + components: + - type: Transform + pos: -0.5,2.5 + parent: 1 + - uid: 61 + components: + - type: Transform + pos: -0.5,1.5 + parent: 1 + - uid: 62 + components: + - type: Transform + pos: -0.5,0.5 + parent: 1 + - uid: 63 + components: + - type: Transform + pos: -0.5,-0.5 + parent: 1 + - uid: 64 + components: + - type: Transform + pos: 7.5,4.5 + parent: 1 + - uid: 65 + components: + - type: Transform + pos: 7.5,5.5 + parent: 1 + - uid: 66 + components: + - type: Transform + pos: 7.5,3.5 + parent: 1 + - uid: 67 + components: + - type: Transform + pos: 7.5,2.5 + parent: 1 + - uid: 68 + components: + - type: Transform + pos: 7.5,0.5 + parent: 1 + - uid: 69 + components: + - type: Transform + pos: 7.5,1.5 + parent: 1 + - uid: 88 + components: + - type: Transform + pos: 0.5,5.5 + parent: 1 + - uid: 89 + components: + - type: Transform + pos: -0.5,11.5 + parent: 1 + - uid: 90 + components: + - type: Transform + pos: 0.5,11.5 + parent: 1 + - uid: 91 + components: + - type: Transform + pos: 7.5,11.5 + parent: 1 + - uid: 92 + components: + - type: Transform + pos: 6.5,11.5 + parent: 1 + - uid: 93 + components: + - type: Transform + pos: 6.5,5.5 + parent: 1 + - uid: 94 + components: + - type: Transform + pos: 1.5,5.5 + parent: 1 + - uid: 95 + components: + - type: Transform + pos: 1.5,11.5 + parent: 1 + - uid: 96 + components: + - type: Transform + pos: 5.5,11.5 + parent: 1 + - uid: 98 + components: + - type: Transform + pos: 1.5,10.5 + parent: 1 + - uid: 99 + components: + - type: Transform + pos: 5.5,10.5 + parent: 1 + - uid: 100 + components: + - type: Transform + pos: 5.5,6.5 + parent: 1 + - uid: 101 + components: + - type: Transform + pos: 1.5,6.5 + parent: 1 + - uid: 102 + components: + - type: Transform + pos: 5.5,5.5 + parent: 1 + - uid: 134 + components: + - type: Transform + pos: -0.5,12.5 + parent: 1 + - uid: 135 + components: + - type: Transform + pos: -0.5,13.5 + parent: 1 + - uid: 136 + components: + - type: Transform + pos: -0.5,14.5 + parent: 1 + - uid: 137 + components: + - type: Transform + pos: -0.5,15.5 + parent: 1 + - uid: 138 + components: + - type: Transform + pos: -0.5,16.5 + parent: 1 + - uid: 139 + components: + - type: Transform + pos: -0.5,17.5 + parent: 1 + - uid: 140 + components: + - type: Transform + pos: -0.5,18.5 + parent: 1 + - uid: 141 + components: + - type: Transform + pos: -0.5,19.5 + parent: 1 + - uid: 142 + components: + - type: Transform + pos: 0.5,19.5 + parent: 1 + - uid: 143 + components: + - type: Transform + pos: 1.5,19.5 + parent: 1 + - uid: 144 + components: + - type: Transform + pos: 2.5,19.5 + parent: 1 + - uid: 145 + components: + - type: Transform + pos: 4.5,19.5 + parent: 1 + - uid: 146 + components: + - type: Transform + pos: 3.5,19.5 + parent: 1 + - uid: 147 + components: + - type: Transform + pos: 5.5,19.5 + parent: 1 + - uid: 148 + components: + - type: Transform + pos: 6.5,19.5 + parent: 1 + - uid: 149 + components: + - type: Transform + pos: 7.5,19.5 + parent: 1 + - uid: 150 + components: + - type: Transform + pos: 7.5,18.5 + parent: 1 + - uid: 151 + components: + - type: Transform + pos: 7.5,18.5 + parent: 1 + - uid: 152 + components: + - type: Transform + pos: 7.5,17.5 + parent: 1 + - uid: 153 + components: + - type: Transform + pos: 7.5,16.5 + parent: 1 + - uid: 154 + components: + - type: Transform + pos: 7.5,16.5 + parent: 1 + - uid: 155 + components: + - type: Transform + pos: 7.5,15.5 + parent: 1 + - uid: 156 + components: + - type: Transform + pos: 7.5,14.5 + parent: 1 + - uid: 157 + components: + - type: Transform + pos: 7.5,13.5 + parent: 1 + - uid: 158 + components: + - type: Transform + pos: 7.5,12.5 + parent: 1 + - uid: 159 + components: + - type: Transform + pos: 1.5,13.5 + parent: 1 + - uid: 160 + components: + - type: Transform + pos: 2.5,13.5 + parent: 1 + - uid: 161 + components: + - type: Transform + pos: 4.5,13.5 + parent: 1 + - uid: 162 + components: + - type: Transform + pos: 5.5,13.5 + parent: 1 + - uid: 163 + components: + - type: Transform + pos: 1.5,14.5 + parent: 1 + - uid: 164 + components: + - type: Transform + pos: 1.5,15.5 + parent: 1 + - uid: 165 + components: + - type: Transform + pos: 1.5,16.5 + parent: 1 + - uid: 166 + components: + - type: Transform + pos: 1.5,17.5 + parent: 1 + - uid: 167 + components: + - type: Transform + pos: 2.5,17.5 + parent: 1 + - uid: 169 + components: + - type: Transform + pos: 4.5,17.5 + parent: 1 + - uid: 170 + components: + - type: Transform + pos: 5.5,17.5 + parent: 1 + - uid: 171 + components: + - type: Transform + pos: 5.5,16.5 + parent: 1 + - uid: 172 + components: + - type: Transform + pos: 5.5,15.5 + parent: 1 + - uid: 173 + components: + - type: Transform + pos: 5.5,14.5 + parent: 1 + - uid: 176 + components: + - type: Transform + pos: 3.5,13.5 + parent: 1 +- proto: WeaponTurretSyndicateBroken + entities: + - uid: 197 + components: + - type: Transform + pos: 3.5,15.5 + parent: 1 +- proto: WetFloorSign + entities: + - uid: 79 + components: + - type: Transform + pos: 1.2387619,2.9111326 + parent: 1 +- proto: WindoorSecureCommandLocked + entities: + - uid: 174 + components: + - type: Transform + pos: 0.5,13.5 + parent: 1 + - uid: 175 + components: + - type: Transform + pos: 6.5,13.5 + parent: 1 +... diff --git a/Resources/Prototypes/Maps/salvage.yml b/Resources/Prototypes/Maps/salvage.yml index 36343f69a39..9099a6a9578 100644 --- a/Resources/Prototypes/Maps/salvage.yml +++ b/Resources/Prototypes/Maps/salvage.yml @@ -60,6 +60,10 @@ # "Medium"-class maps - Max size square: 15x15, indicated size: 7.5 +- type: salvageMap + id: OutpostArm + mapPath: /Maps/Salvage/outpost-arm.yml + - type: salvageMap id: Medium1 mapPath: /Maps/Salvage/DeltaV/DV-medium-01.yml #DeltaV: DV salvage map Location From 9cfb35959d20737bcc73eb789160e06f71292bf8 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 30 Jan 2024 10:57:43 +0000 Subject: [PATCH 057/266] Automatic changelog update (cherry picked from commit 9526ba68ff43f4a155b45c4eee8607a520c8d88b) --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index ad692331a5d..2f64045f6d7 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: notafet - changes: - - message: Stations no longer produce limitless plasma. Plasma refills can now be - ordered at cargo. - type: Tweak - id: 5329 - time: '2023-12-11T23:21:25.0000000+00:00' - author: nok-ko changes: - message: Pacified players can no longer throw dangerous objects such as spears, @@ -3837,3 +3830,10 @@ id: 5828 time: '2024-01-30T10:54:55.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24728 +- author: CrigCrag + changes: + - message: Added a new large salvage wreck. + type: Add + id: 5829 + time: '2024-01-30T10:56:38.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24656 From 3f222589deb84cf08a8f8cf7e7315272332e03d3 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 30 Jan 2024 11:06:26 +0000 Subject: [PATCH 058/266] Automatic changelog update (cherry picked from commit c1c4d1a92b5a379385e45552a5c6e65af98a46a3) --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 2f64045f6d7..b854d26c7a6 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: nok-ko - changes: - - message: Pacified players can no longer throw dangerous objects such as spears, - bolas, and bottles. - type: Tweak - id: 5330 - time: '2023-12-11T23:40:23.0000000+00:00' - author: notafet changes: - message: Pumps, vents, scrubbers, and heaters now work faster. @@ -3837,3 +3830,10 @@ id: 5829 time: '2024-01-30T10:56:38.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24656 +- author: themias + changes: + - message: Fixed Centcom cargo gifts not being fulfilled + type: Fix + id: 5830 + time: '2024-01-30T11:05:20.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24701 From d13859eb2b4a82090e7787b5acc16d7780c542cf Mon Sep 17 00:00:00 2001 From: Scribbles0 <91828755+Scribbles0@users.noreply.github.com> Date: Tue, 30 Jan 2024 03:12:24 -0800 Subject: [PATCH 059/266] Orbital Anomaly Cores (#24716) follow tag + norot (cherry picked from commit e4763ffecca876a93087d3750dd571693556b81c) --- .../Prototypes/Entities/Structures/Specific/Anomaly/cores.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Resources/Prototypes/Entities/Structures/Specific/Anomaly/cores.yml b/Resources/Prototypes/Entities/Structures/Specific/Anomaly/cores.yml index dcd376c91b7..6e6ee057de7 100644 --- a/Resources/Prototypes/Entities/Structures/Specific/Anomaly/cores.yml +++ b/Resources/Prototypes/Entities/Structures/Specific/Anomaly/cores.yml @@ -7,6 +7,7 @@ components: - type: Sprite sprite: Structures/Specific/Anomalies/Cores/gravity_core.rsi + noRot: true layers: - state: core - state: pulse @@ -25,6 +26,9 @@ collection: RadiationPulse - type: UseDelay delay: 2 + - type: Tag + tags: + - ForceableFollow - type: AnomalyCore timeToDecay: 600 startPrice: 10000 From 193258784edd88481c42961bcc1f17106052530d Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 30 Jan 2024 11:13:30 +0000 Subject: [PATCH 060/266] Automatic changelog update (cherry picked from commit 36fb5a92cb82c775eb890619a32d052285760abe) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b854d26c7a6..4c7a21f475a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: notafet - changes: - - message: Pumps, vents, scrubbers, and heaters now work faster. - type: Tweak - id: 5331 - time: '2023-12-11T23:59:47.0000000+00:00' - author: EmoGarbage404 changes: - message: Removed Senior Researcher, Senior Engineer, Senior Physician, and Senior @@ -3837,3 +3831,10 @@ id: 5830 time: '2024-01-30T11:05:20.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24701 +- author: Scribbles0 + changes: + - message: You can now make anomaly cores orbit you. + type: Add + id: 5831 + time: '2024-01-30T11:12:24.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24716 From 452632f58228280c8bdf52739b1d56ecd77fba6e Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Tue, 30 Jan 2024 22:14:00 +1100 Subject: [PATCH 061/266] Split changelog entries for discord (#23832) * Split changelog entries for discord Not sure where best to split it, by entry in group or by author. * Formatting (cherry picked from commit 00c5538c6b3fdc9586f3376b5acecddc664c0665) --- Tools/actions_changelogs_since_last_run.py | 43 ++++++++++++---------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/Tools/actions_changelogs_since_last_run.py b/Tools/actions_changelogs_since_last_run.py index c4949aa5e14..a3d5ee40dbf 100755 --- a/Tools/actions_changelogs_since_last_run.py +++ b/Tools/actions_changelogs_since_last_run.py @@ -109,11 +109,13 @@ def send_to_discord(entries: Iterable[ChangelogEntry]) -> None: print(f"No discord webhook URL found, skipping discord send") return - content = io.StringIO() count: int = 0 for name, group in itertools.groupby(entries, lambda x: x["author"]): + count = 0 + content = io.StringIO() content.write(f"**{name}** updated:\n") + for entry in group: for change in entry["changes"]: emoji = TYPES_TO_EMOJI.get(change['type'], "❓") @@ -124,25 +126,26 @@ def send_to_discord(entries: Iterable[ChangelogEntry]) -> None: content.write(f"{emoji} [-]({url}) {message}\n") else: content.write(f"{emoji} - {message}\n") - - if count == 0: - print("Skipping discord push as no changelog entries found") - return - - print(f"Posting {count} changelog entries to discord webhook") - - body = { - "content": content.getvalue(), - # Do not allow any mentions. - "allowed_mentions": { - "parse": [] - }, - # SUPPRESS_EMBEDS - "flags": 1 << 2 - } - - response = requests.post(DISCORD_WEBHOOK_URL, json=body) - response.raise_for_status() + body = { + "content": content.getvalue(), + # Do not allow any mentions. + "allowed_mentions": { + "parse": [] + }, + # SUPPRESS_EMBEDS + "flags": 1 << 2 + } + + # No entries? + if count == 0: + continue + + # Post per group to try to avoid discord character limits + print(f"Posting {count} changelog entries to discord webhook") + + response = requests.post(DISCORD_WEBHOOK_URL, json=body) + response.raise_for_status() + main() From fe99261081f37497d2836851c5f0a55f15cdc17c Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Tue, 30 Jan 2024 22:53:33 +1100 Subject: [PATCH 062/266] Implement text splitting for discord CL (#24731) * Implement text splitting for discord CL Should bandaid it enough for now. * More docs * Minor fix * Also this field * you (cherry picked from commit cd4d090f4bfa83f95c18ea31dd6405070db43667) --- Tools/actions_changelogs_since_last_run.py | 79 ++++++++++++++-------- 1 file changed, 52 insertions(+), 27 deletions(-) diff --git a/Tools/actions_changelogs_since_last_run.py b/Tools/actions_changelogs_since_last_run.py index a3d5ee40dbf..e24e74c51f5 100755 --- a/Tools/actions_changelogs_since_last_run.py +++ b/Tools/actions_changelogs_since_last_run.py @@ -17,6 +17,8 @@ GITHUB_RUN = os.environ["GITHUB_RUN_ID"] GITHUB_TOKEN = os.environ["GITHUB_TOKEN"] +# https://discord.com/developers/docs/resources/webhook +DISCORD_SPLIT_LIMIT = 2000 DISCORD_WEBHOOK_URL = os.environ.get("DISCORD_WEBHOOK_URL") CHANGELOG_FILE = "Resources/Changelog/DeltaVChangelog.yml" @@ -104,48 +106,71 @@ def diff_changelog(old: dict[str, Any], cur: dict[str, Any]) -> Iterable[Changel return (e for e in cur["Entries"] if e["id"] not in old_entry_ids) +def get_discord_body(content: str): + return { + "content": content, + # Do not allow any mentions. + "allowed_mentions": { + "parse": [] + }, + # SUPPRESS_EMBEDS + "flags": 1 << 2 + } + + +def send_discord(content: str): + body = get_discord_body(content) + + response = requests.post(DISCORD_WEBHOOK_URL, json=body) + response.raise_for_status() + + def send_to_discord(entries: Iterable[ChangelogEntry]) -> None: if not DISCORD_WEBHOOK_URL: print(f"No discord webhook URL found, skipping discord send") return - count: int = 0 + message_content = io.StringIO() + # We need to manually split messages to avoid discord's character limit + # With that being said this isn't entirely robust + # e.g. a sufficiently large CL breaks it, but that's a future problem for name, group in itertools.groupby(entries, lambda x: x["author"]): - count = 0 - content = io.StringIO() - content.write(f"**{name}** updated:\n") + # Need to split text to avoid discord character limit + group_content = io.StringIO() + group_content.write(f"**{name}** updated:\n") for entry in group: for change in entry["changes"]: emoji = TYPES_TO_EMOJI.get(change['type'], "❓") message = change['message'] url = entry.get("url") - count += 1 if url and url.strip(): - content.write(f"{emoji} [-]({url}) {message}\n") + group_content.write(f"{emoji} [-]({url}) {message}\n") else: - content.write(f"{emoji} - {message}\n") - - body = { - "content": content.getvalue(), - # Do not allow any mentions. - "allowed_mentions": { - "parse": [] - }, - # SUPPRESS_EMBEDS - "flags": 1 << 2 - } - - # No entries? - if count == 0: - continue - - # Post per group to try to avoid discord character limits - print(f"Posting {count} changelog entries to discord webhook") - - response = requests.post(DISCORD_WEBHOOK_URL, json=body) - response.raise_for_status() + group_content.write(f"{emoji} - {message}\n") + + group_text = group_content.getvalue() + message_text = message_content.getvalue() + message_length = len(message_text) + group_length = len(group_text) + + # If adding the text would bring it over the group limit then send the message and start a new one + if message_length + group_length >= DISCORD_SPLIT_LIMIT: + print("Split changelog and sending to discord") + send_discord(message_text) + + # Reset the message + message_content = io.StringIO() + + # Flush the group to the message + message_content.write(group_text) + # Clean up anything remaining + message_text = message_content.getvalue() + if len(message_text) > 0: + print("Sending final changelog to discord") + send_discord(message_text) + main() From 5880f31a7a879fdb08ef39bbedefbdcf74e9b16e Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Tue, 30 Jan 2024 13:16:31 +0100 Subject: [PATCH 063/266] Fix changelog RSS (?) (#24733) (cherry picked from commit c26687620bc88a18e2c0ebd3a21e47faf3db6710) --- Tools/actions_changelog_rss.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tools/actions_changelog_rss.py b/Tools/actions_changelog_rss.py index b95c2fc8e12..5e42a030bde 100755 --- a/Tools/actions_changelog_rss.py +++ b/Tools/actions_changelog_rss.py @@ -116,7 +116,7 @@ def main(): template_path = pathlib.Path(dir_name, 'changelogs', XSL_FILE) with sftp.open(XSL_FILE, "wb") as f, open(template_path) as fh: - f.write(fh) + f.write(fh.read()) def create_feed(changelog: Any, previous_items: List[Any]) -> Tuple[Any, bool]: From 48e815413fa16dcfe9578eb0a51c2e5f25a62908 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Tue, 30 Jan 2024 23:35:08 +1100 Subject: [PATCH 064/266] Comment out discord CL (#24734) Until publish runs work. (cherry picked from commit 117399d91403b6bb17035c2a1624790d90dca529) --- Tools/actions_changelogs_since_last_run.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Tools/actions_changelogs_since_last_run.py b/Tools/actions_changelogs_since_last_run.py index e24e74c51f5..4ba7788ad92 100755 --- a/Tools/actions_changelogs_since_last_run.py +++ b/Tools/actions_changelogs_since_last_run.py @@ -129,6 +129,9 @@ def send_to_discord(entries: Iterable[ChangelogEntry]) -> None: if not DISCORD_WEBHOOK_URL: print(f"No discord webhook URL found, skipping discord send") return + + # Temporary until github publishing working to avoid spamming cl + return message_content = io.StringIO() # We need to manually split messages to avoid discord's character limit From 86d4a0300f84d3766d9d0801efe90d38338d672d Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Tue, 30 Jan 2024 23:46:50 +1100 Subject: [PATCH 065/266] Revert "Comment out discord CL" (#24737) Revert "Comment out discord CL (#24734)" This reverts commit 117399d91403b6bb17035c2a1624790d90dca529. (cherry picked from commit 14a4b5a171cd3e72556c22401c7ef5ebb16c59b2) --- Tools/actions_changelogs_since_last_run.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/Tools/actions_changelogs_since_last_run.py b/Tools/actions_changelogs_since_last_run.py index 4ba7788ad92..e24e74c51f5 100755 --- a/Tools/actions_changelogs_since_last_run.py +++ b/Tools/actions_changelogs_since_last_run.py @@ -129,9 +129,6 @@ def send_to_discord(entries: Iterable[ChangelogEntry]) -> None: if not DISCORD_WEBHOOK_URL: print(f"No discord webhook URL found, skipping discord send") return - - # Temporary until github publishing working to avoid spamming cl - return message_content = io.StringIO() # We need to manually split messages to avoid discord's character limit From f4c18667a41365720631ea73ec0e5dd6fa594507 Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Tue, 30 Jan 2024 16:28:16 +0300 Subject: [PATCH 066/266] Shuttle guns new sounds (#24714) * new sounds * fix * fix sound * some tweak (cherry picked from commit 60c5797807af4a48e9971dfd7b36b2a9938ea2db) --- .../Weapons/Guns/Gunshots/attributions.yml | 7 ++++- .../Weapons/Guns/Gunshots/ship_duster.ogg | Bin 0 -> 66923 bytes .../Weapons/Guns/Gunshots/ship_friendship.ogg | Bin 0 -> 36579 bytes .../Weapons/Guns/Gunshots/ship_perforator.ogg | Bin 0 -> 40468 bytes .../Weapons/Guns/Gunshots/ship_svalinn.ogg | Bin 0 -> 24113 bytes .../Entities/Structures/Shuttles/cannons.yml | 26 ++++++------------ 6 files changed, 14 insertions(+), 19 deletions(-) create mode 100644 Resources/Audio/Weapons/Guns/Gunshots/ship_duster.ogg create mode 100644 Resources/Audio/Weapons/Guns/Gunshots/ship_friendship.ogg create mode 100644 Resources/Audio/Weapons/Guns/Gunshots/ship_perforator.ogg create mode 100644 Resources/Audio/Weapons/Guns/Gunshots/ship_svalinn.ogg diff --git a/Resources/Audio/Weapons/Guns/Gunshots/attributions.yml b/Resources/Audio/Weapons/Guns/Gunshots/attributions.yml index 9431ededc2d..7c46974818a 100644 --- a/Resources/Audio/Weapons/Guns/Gunshots/attributions.yml +++ b/Resources/Audio/Weapons/Guns/Gunshots/attributions.yml @@ -21,4 +21,9 @@ - files: ["rocket-launcher.ogg", "taser2.ogg"] license: "CC-BY-SA-3.0" copyright: "Taken from tgstation" - source: "https://github.com/tgstation/tgstation/tree/88d7dbfc105fbf40284d7b7c4587f8d23c0ac3ac" \ No newline at end of file + source: "https://github.com/tgstation/tgstation/tree/88d7dbfc105fbf40284d7b7c4587f8d23c0ac3ac" + +- files: ["ship_duster.ogg", "ship_friendship.ogg", "ship_svalinn.ogg", "ship_perforator.ogg"] + license: "CC0-1.0" + copyright: "Created by MIXnikita for Space Station 14" + source: "https://github.com/MIXnikita" \ No newline at end of file diff --git a/Resources/Audio/Weapons/Guns/Gunshots/ship_duster.ogg b/Resources/Audio/Weapons/Guns/Gunshots/ship_duster.ogg new file mode 100644 index 0000000000000000000000000000000000000000..0008849d0e59b147434011be7f7a0181feabd82c GIT binary patch literal 66923 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 literal 0 HcmV?d00001 diff --git a/Resources/Audio/Weapons/Guns/Gunshots/ship_svalinn.ogg b/Resources/Audio/Weapons/Guns/Gunshots/ship_svalinn.ogg new file mode 100644 index 0000000000000000000000000000000000000000..8ead10ba43ece46c506c267c45a85be8b617fd94 GIT binary patch literal 24113 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

    R5F9)Q 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 Date: Tue, 30 Jan 2024 13:29:23 +0000 Subject: [PATCH 067/266] Automatic changelog update (cherry picked from commit a44d559e9add35d942bd5af8e3d22a6483ff363e) --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 4c7a21f475a..70eec385544 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: EmoGarbage404 - changes: - - message: Removed Senior Researcher, Senior Engineer, Senior Physician, and Senior - Officer. - type: Remove - id: 5332 - time: '2023-12-12T02:37:06.0000000+00:00' - author: Avalon changes: - message: CentCom has begun unceremoniously plucking Mothroaches out of Maintenance @@ -3838,3 +3831,10 @@ id: 5831 time: '2024-01-30T11:12:24.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24716 +- author: MIXnikita + changes: + - message: New sound effects for some shuttle guns + type: Tweak + id: 5832 + time: '2024-01-30T13:28:17.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24714 From d9208ced9d15a9edb9525343de94c16cf2e781e1 Mon Sep 17 00:00:00 2001 From: nikthechampiongr <32041239+nikthechampiongr@users.noreply.github.com> Date: Tue, 30 Jan 2024 20:03:15 +0200 Subject: [PATCH 068/266] Fix improper prediction on unpryable doors (#24738) Fix improper prediction on unpryable doors. Entities that had CanPry to false on their components would get improperly predicted as pryable on the client because the check was only preformed on the server. Same problem existed for welded doors. Moved the check from server to shared. (cherry picked from commit 9bebdf57069f8c2e2b045009a98bcf46caa68732) --- Content.Server/Doors/Systems/DoorSystem.cs | 8 -------- Content.Shared/Doors/Systems/SharedDoorSystem.cs | 9 ++++++++- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/Content.Server/Doors/Systems/DoorSystem.cs b/Content.Server/Doors/Systems/DoorSystem.cs index 560149f2289..fffc0a4e1fa 100644 --- a/Content.Server/Doors/Systems/DoorSystem.cs +++ b/Content.Server/Doors/Systems/DoorSystem.cs @@ -28,8 +28,6 @@ public override void Initialize() { base.Initialize(); - - SubscribeLocalEvent(OnBeforeDoorPry); SubscribeLocalEvent(OnWeldAttempt); SubscribeLocalEvent(OnWeldChanged); SubscribeLocalEvent(OnEmagged); @@ -124,12 +122,6 @@ private void OnWeldChanged(EntityUid uid, DoorComponent component, ref WeldableC else if (component.State == DoorState.Welded) SetState(uid, DoorState.Closed, component); } - - private void OnBeforeDoorPry(EntityUid id, DoorComponent door, ref BeforePryEvent args) - { - if (door.State == DoorState.Welded || !door.CanPry) - args.Cancelled = true; - } #endregion diff --git a/Content.Shared/Doors/Systems/SharedDoorSystem.cs b/Content.Shared/Doors/Systems/SharedDoorSystem.cs index 74ce120cd06..954c22df382 100644 --- a/Content.Shared/Doors/Systems/SharedDoorSystem.cs +++ b/Content.Shared/Doors/Systems/SharedDoorSystem.cs @@ -60,6 +60,7 @@ public override void Initialize() SubscribeLocalEvent(HandleCollide); SubscribeLocalEvent(PreventCollision); + SubscribeLocalEvent(OnBeforePry); SubscribeLocalEvent(OnPryTimeModifier); } @@ -175,6 +176,12 @@ private void OnPryTimeModifier(EntityUid uid, DoorComponent door, ref GetPryTime args.BaseTime = door.PryTime; } + private void OnBeforePry(EntityUid uid, DoorComponent door, ref BeforePryEvent args) + { + if (door.State == DoorState.Welded || !door.CanPry) + args.Cancelled = true; + } + ///

    /// Update the door state/visuals and play an access denied sound when a user without access interacts with the /// door. @@ -460,7 +467,7 @@ public IEnumerable GetColliding(EntityUid uid, PhysicsComponent? phys //If the colliding entity is a slippable item ignore it by the airlock if (otherPhysics.CollisionLayer == (int)CollisionGroup.SlipLayer && otherPhysics.CollisionMask == (int)CollisionGroup.ItemMask) continue; - + //For when doors need to close over conveyor belts if (otherPhysics.CollisionLayer == (int) CollisionGroup.ConveyorMask) continue; From 23ae5fd441229ad511fc49f9d8fa5e934896b738 Mon Sep 17 00:00:00 2001 From: themias <89101928+themias@users.noreply.github.com> Date: Tue, 30 Jan 2024 18:04:26 -0500 Subject: [PATCH 069/266] Fix stun baton EMP state (#24706) * Fix stun baton EMP state * trydeactivate (cherry picked from commit 26d8084d524378284c45fa7c3e6eec0757988766) --- .../Stunnable/Systems/StunbatonSystem.cs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/Content.Server/Stunnable/Systems/StunbatonSystem.cs b/Content.Server/Stunnable/Systems/StunbatonSystem.cs index 053a2936892..027259495c1 100644 --- a/Content.Server/Stunnable/Systems/StunbatonSystem.cs +++ b/Content.Server/Stunnable/Systems/StunbatonSystem.cs @@ -30,6 +30,7 @@ public override void Initialize() SubscribeLocalEvent(OnStaminaHitAttempt); SubscribeLocalEvent(TryTurnOn); SubscribeLocalEvent(ToggleDone); + SubscribeLocalEvent(OnChargeChanged); } private void OnStaminaHitAttempt(Entity entity, ref StaminaDamageOnHitAttemptEvent args) @@ -38,12 +39,6 @@ private void OnStaminaHitAttempt(Entity entity, ref StaminaD !TryComp(entity.Owner, out var battery) || !_battery.TryUseCharge(entity.Owner, entity.Comp.EnergyPerUse, battery)) { args.Cancelled = true; - return; - } - - if (battery.CurrentCharge < entity.Comp.EnergyPerUse) - { - _itemToggle.Toggle(entity.Owner, predicted: false); } } @@ -101,5 +96,14 @@ private void SendPowerPulse(EntityUid target, EntityUid? user, EntityUid used) User = user }); } + + private void OnChargeChanged(Entity entity, ref ChargeChangedEvent args) + { + if (TryComp(entity.Owner, out var battery) && + battery.CurrentCharge < entity.Comp.EnergyPerUse) + { + _itemToggle.TryDeactivate(entity.Owner, predicted: false); + } + } } } From 2056d89c8530a61bc19afc34dca15a1d4b1b7748 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 30 Jan 2024 23:05:32 +0000 Subject: [PATCH 070/266] Automatic changelog update (cherry picked from commit 58223b36a552c7fc65ad442da23a3eb6b97dc2ef) --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 70eec385544..141fe3ac1c1 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Avalon - changes: - - message: CentCom has begun unceremoniously plucking Mothroaches out of Maintenance - and selling them to nearby Space Stations after the discovery that they make - decent pets. - type: Add - id: 5333 - time: '2023-12-12T04:46:41.0000000+00:00' - author: notafet changes: - message: Tritium and frezon can once again be sold for profit. @@ -3838,3 +3830,10 @@ id: 5832 time: '2024-01-30T13:28:17.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24714 +- author: themias + changes: + - message: Stun batons now toggle off after being drained by an EMP. + type: Fix + id: 5833 + time: '2024-01-30T23:04:26.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24706 From cb05d8182af985d87cda0719116e2bdf82a85214 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Tue, 30 Jan 2024 18:20:00 -0500 Subject: [PATCH 071/266] fix storage open sounds playing when they shouldn't (#24752) (cherry picked from commit 724312bdf5888b303309c0b2fab0feb409e4e1a9) --- Content.Server/Storage/EntitySystems/StorageSystem.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Content.Server/Storage/EntitySystems/StorageSystem.cs b/Content.Server/Storage/EntitySystems/StorageSystem.cs index 035ca5f399a..0f5efda74de 100644 --- a/Content.Server/Storage/EntitySystems/StorageSystem.cs +++ b/Content.Server/Storage/EntitySystems/StorageSystem.cs @@ -132,7 +132,8 @@ public override void OpenStorageUI(EntityUid uid, EntityUid entity, StorageCompo silent |= TryComp(uid, out var useDelay) && _useDelay.IsDelayed((uid, useDelay)); if (!silent) { - _audio.PlayPvs(storageComp.StorageOpenSound, uid); + if (!storageComp.IsUiOpen) + _audio.PlayPvs(storageComp.StorageOpenSound, uid); if (useDelay != null) _useDelay.TryResetDelay((uid, useDelay)); } From 10d25acc9cb1c57804c48155c1d2ff1b8047abcc Mon Sep 17 00:00:00 2001 From: Tayrtahn Date: Tue, 30 Jan 2024 18:23:30 -0500 Subject: [PATCH 072/266] Fix weird rotation when strapped to a bed (#24746) * Gotta watch out for those tricky radians * Change StrapComponent instead (cherry picked from commit 652e2b7a41ae415bc2c1a548abc97edd2df5812e) --- Content.Shared/Buckle/Components/StrapComponent.cs | 4 ++-- Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Content.Shared/Buckle/Components/StrapComponent.cs b/Content.Shared/Buckle/Components/StrapComponent.cs index 46f260741a7..b0f37a8dafb 100644 --- a/Content.Shared/Buckle/Components/StrapComponent.cs +++ b/Content.Shared/Buckle/Components/StrapComponent.cs @@ -66,11 +66,11 @@ public sealed partial class StrapComponent : Component public Vector2 BuckleOffset = Vector2.Zero; /// - /// The angle in degrees to rotate the player by when they get strapped + /// The angle to rotate the player by when they get strapped /// [DataField] [ViewVariables(VVAccess.ReadWrite)] - public int Rotation; + public Angle Rotation; /// /// The size of the strap which is compared against when buckling entities diff --git a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs index 9b2b8ce4c8a..cfaea47d304 100644 --- a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs +++ b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs @@ -357,7 +357,7 @@ public bool TryBuckle(EntityUid buckleUid, EntityUid userUid, EntityUid strapUid if (TryComp(buckleUid, out var appearance)) Appearance.SetData(buckleUid, BuckleVisuals.Buckled, true, appearance); - _rotationVisuals.SetHorizontalAngle(buckleUid, strapComp.Rotation); + _rotationVisuals.SetHorizontalAngle(buckleUid, strapComp.Rotation); ReAttach(buckleUid, strapUid, buckleComp, strapComp); SetBuckledTo(buckleUid, strapUid, strapComp, buckleComp); From 5b24a343a8dce84dc7a3cfba27c87542e0a93b07 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 30 Jan 2024 23:24:38 +0000 Subject: [PATCH 073/266] Automatic changelog update (cherry picked from commit 4e4fa11f580043cd7abad756b03bcebbef783b2c) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 141fe3ac1c1..525e7b72eff 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: notafet - changes: - - message: Tritium and frezon can once again be sold for profit. - type: Tweak - id: 5334 - time: '2023-12-12T07:48:34.0000000+00:00' - author: IProduceWidgets changes: - message: Mayo Jar is bigger (50u) @@ -3837,3 +3831,10 @@ id: 5833 time: '2024-01-30T23:04:26.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24706 +- author: Tayrtahn + changes: + - message: Fixed weird rotation while strapped to a bed. + type: Fix + id: 5834 + time: '2024-01-30T23:23:31.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24746 From 55845b0537bf0bb935bea8e34dab3136c48dac59 Mon Sep 17 00:00:00 2001 From: DrSmugleaf Date: Tue, 30 Jan 2024 18:10:57 -0800 Subject: [PATCH 074/266] Fix ClimbSystem removing the climbing fixture when it still has contacts (#24756) (cherry picked from commit 83901cafc5722a2e89092817dbd9beddff5a680f) --- Content.Shared/Climbing/Systems/ClimbSystem.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Content.Shared/Climbing/Systems/ClimbSystem.cs b/Content.Shared/Climbing/Systems/ClimbSystem.cs index c54149243a4..23bc54b8f89 100644 --- a/Content.Shared/Climbing/Systems/ClimbSystem.cs +++ b/Content.Shared/Climbing/Systems/ClimbSystem.cs @@ -1,4 +1,3 @@ -using System.Numerics; using Content.Shared.ActionBlocker; using Content.Shared.Body.Components; using Content.Shared.Body.Part; @@ -13,7 +12,6 @@ using Content.Shared.IdentityManagement; using Content.Shared.Interaction; using Content.Shared.Movement.Events; -using Content.Shared.Movement.Systems; using Content.Shared.Physics; using Content.Shared.Popups; using Content.Shared.Stunnable; @@ -353,7 +351,8 @@ private void OnClimbEndCollide(EntityUid uid, ClimbingComponent component, ref E { if (args.OurFixtureId != ClimbingFixtureName || !component.IsClimbing - || component.NextTransition != null) + || component.NextTransition != null + || args.OurFixture.Contacts.Count > 1) { return; } From 59b820aeff6946d2e56c030ac033872ef16477e3 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Tue, 30 Jan 2024 21:50:40 -0500 Subject: [PATCH 075/266] make lathe visuals not required (#24757) (cherry picked from commit bd46d7cc8ab6ad92a4d5a7cdd12dd1ce8f6265e9) --- Content.Client/Lathe/LatheSystem.cs | 13 ++++++++----- Content.Shared/Lathe/LatheComponent.cs | 8 ++++---- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/Content.Client/Lathe/LatheSystem.cs b/Content.Client/Lathe/LatheSystem.cs index c0c3833a855..c72f01b39b1 100644 --- a/Content.Client/Lathe/LatheSystem.cs +++ b/Content.Client/Lathe/LatheSystem.cs @@ -23,17 +23,20 @@ private void OnAppearanceChange(EntityUid uid, LatheComponent component, ref App return; if (_appearance.TryGetData(uid, PowerDeviceVisuals.Powered, out var powered, args.Component) && - args.Sprite.LayerMapTryGet(PowerDeviceVisualLayers.Powered, out _)) + args.Sprite.LayerMapTryGet(PowerDeviceVisualLayers.Powered, out var powerLayer)) { - args.Sprite.LayerSetVisible(PowerDeviceVisualLayers.Powered, powered); + args.Sprite.LayerSetVisible(powerLayer, powered); } // Lathe specific stuff - if (_appearance.TryGetData(uid, LatheVisuals.IsRunning, out var isRunning, args.Component)) + if (_appearance.TryGetData(uid, LatheVisuals.IsRunning, out var isRunning, args.Component) && + args.Sprite.LayerMapTryGet(LatheVisualLayers.IsRunning, out var runningLayer) && + component.RunningState != null && + component.IdleState != null) { var state = isRunning ? component.RunningState : component.IdleState; - args.Sprite.LayerSetAnimationTime(LatheVisualLayers.IsRunning, 0f); - args.Sprite.LayerSetState(LatheVisualLayers.IsRunning, state); + args.Sprite.LayerSetAnimationTime(runningLayer, 0f); + args.Sprite.LayerSetState(runningLayer, state); } } diff --git a/Content.Shared/Lathe/LatheComponent.cs b/Content.Shared/Lathe/LatheComponent.cs index e1110777dc0..d4bf18b0507 100644 --- a/Content.Shared/Lathe/LatheComponent.cs +++ b/Content.Shared/Lathe/LatheComponent.cs @@ -34,11 +34,11 @@ public sealed partial class LatheComponent : Component public SoundSpecifier? ProducingSound; #region Visualizer info - [DataField(required: true)] - public string IdleState = default!; + [DataField] + public string? IdleState; - [DataField(required: true)] - public string RunningState = default!; + [DataField] + public string? RunningState; #endregion /// From 1f1c07a622f2e6f4d3b4476f4a21b019e0168649 Mon Sep 17 00:00:00 2001 From: themias <89101928+themias@users.noreply.github.com> Date: Wed, 31 Jan 2024 04:49:19 +0100 Subject: [PATCH 076/266] Allow IdentityBlocker partial coverage (#24741) * Allow IdentityBlocker partial coverage * rename to TotalCoverage (cherry picked from commit d75f6c3db4f638e9a479fe40c8d50f0e6c137556) --- .../Clothing/EntitySystems/MaskSystem.cs | 4 ++-- .../Components/IdentityBlockerComponent.cs | 23 ++++++++++++++++--- .../SharedIdentitySystem.cs | 6 ++++- .../Entities/Clothing/Eyes/glasses.yml | 5 ++++ .../Entities/Clothing/Masks/masks.yml | 3 +++ 5 files changed, 35 insertions(+), 6 deletions(-) diff --git a/Content.Shared/Clothing/EntitySystems/MaskSystem.cs b/Content.Shared/Clothing/EntitySystems/MaskSystem.cs index 6c135e1a07a..2bbcad4bc4d 100644 --- a/Content.Shared/Clothing/EntitySystems/MaskSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/MaskSystem.cs @@ -1,4 +1,4 @@ -using Content.Shared.Actions; +using Content.Shared.Actions; using Content.Shared.Clothing.Components; using Content.Shared.Inventory; using Content.Shared.Inventory.Events; @@ -68,6 +68,6 @@ private void ToggleMaskComponents(EntityUid uid, MaskComponent mask, EntityUid w RaiseLocalEvent(uid, ref maskEv); var wearerEv = new WearerMaskToggledEvent(mask.IsToggled); - RaiseLocalEvent(uid, ref wearerEv); + RaiseLocalEvent(wearer, ref wearerEv); } } diff --git a/Content.Shared/IdentityManagement/Components/IdentityBlockerComponent.cs b/Content.Shared/IdentityManagement/Components/IdentityBlockerComponent.cs index 4dc9e97b016..3857063783d 100644 --- a/Content.Shared/IdentityManagement/Components/IdentityBlockerComponent.cs +++ b/Content.Shared/IdentityManagement/Components/IdentityBlockerComponent.cs @@ -1,4 +1,4 @@ -using Content.Shared.Inventory; +using Content.Shared.Inventory; using Robust.Shared.GameStates; namespace Content.Shared.IdentityManagement.Components; @@ -7,6 +7,20 @@ namespace Content.Shared.IdentityManagement.Components; public sealed partial class IdentityBlockerComponent : Component { public bool Enabled = true; + + /// + /// What part of your face does this cover? Eyes, mouth, or full? + /// + [DataField] + public IdentityBlockerCoverage Coverage = IdentityBlockerCoverage.FULL; +} + +public enum IdentityBlockerCoverage +{ + NONE = 0, + MOUTH = 1 << 0, + EYES = 1 << 1, + FULL = MOUTH | EYES } /// @@ -14,6 +28,9 @@ public sealed partial class IdentityBlockerComponent : Component /// public sealed class SeeIdentityAttemptEvent : CancellableEntityEventArgs, IInventoryRelayEvent { - // i.e. masks or helmets. - public SlotFlags TargetSlots => SlotFlags.MASK | SlotFlags.HEAD; + // i.e. masks, helmets, or glasses. + public SlotFlags TargetSlots => SlotFlags.MASK | SlotFlags.HEAD | SlotFlags.EYES; + + // cumulative coverage from each relayed slot + public IdentityBlockerCoverage TotalCoverage = IdentityBlockerCoverage.NONE; } diff --git a/Content.Shared/IdentityManagement/SharedIdentitySystem.cs b/Content.Shared/IdentityManagement/SharedIdentitySystem.cs index 7cb5f41b8a1..a02e00f0b19 100644 --- a/Content.Shared/IdentityManagement/SharedIdentitySystem.cs +++ b/Content.Shared/IdentityManagement/SharedIdentitySystem.cs @@ -23,7 +23,11 @@ public override void Initialize() private void OnSeeIdentity(EntityUid uid, IdentityBlockerComponent component, SeeIdentityAttemptEvent args) { if (component.Enabled) - args.Cancel(); + { + args.TotalCoverage |= component.Coverage; + if(args.TotalCoverage == IdentityBlockerCoverage.FULL) + args.Cancel(); + } } protected virtual void OnComponentInit(EntityUid uid, IdentityComponent component, ComponentInit args) diff --git a/Resources/Prototypes/Entities/Clothing/Eyes/glasses.yml b/Resources/Prototypes/Entities/Clothing/Eyes/glasses.yml index 021b3027856..06f33238867 100644 --- a/Resources/Prototypes/Entities/Clothing/Eyes/glasses.yml +++ b/Resources/Prototypes/Entities/Clothing/Eyes/glasses.yml @@ -126,6 +126,7 @@ sprite: Clothing/Eyes/Glasses/outlawglasses.rsi - type: VisionCorrection - type: IdentityBlocker + coverage: EYES - type: entity parent: ClothingEyesBase @@ -145,6 +146,8 @@ - HamsterWearable - WhitelistChameleon - SecDogWearable # DeltaV - let Laika wear sunglasses + - type: IdentityBlocker + coverage: EYES - type: entity parent: ClothingEyesBase @@ -168,6 +171,8 @@ guides: - Security - type: ShowSecurityIcons + - type: IdentityBlocker + coverage: EYES - type: entity parent: ClothingEyesBase diff --git a/Resources/Prototypes/Entities/Clothing/Masks/masks.yml b/Resources/Prototypes/Entities/Clothing/Masks/masks.yml index e71c615c135..77655e7cdb1 100644 --- a/Resources/Prototypes/Entities/Clothing/Masks/masks.yml +++ b/Resources/Prototypes/Entities/Clothing/Masks/masks.yml @@ -262,6 +262,8 @@ - type: IngestionBlocker - type: Item storedRotation: -90 + - type: IdentityBlocker + coverage: MOUTH - type: entity parent: ClothingMaskBase @@ -475,6 +477,7 @@ - type: Clothing sprite: Clothing/Mask/neckgaiter.rsi - type: IdentityBlocker + coverage: MOUTH - type: Tag tags: - WhitelistChameleon From a06fb74cb60c4221418dbc0236f870d698928751 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 31 Jan 2024 03:50:24 +0000 Subject: [PATCH 077/266] Automatic changelog update (cherry picked from commit 79fa3c7db1517b21379e62db735e1139a5c8540e) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 525e7b72eff..488a57d7c49 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: IProduceWidgets - changes: - - message: Mayo Jar is bigger (50u) - type: Tweak - id: 5335 - time: '2023-12-12T07:48:52.0000000+00:00' - author: EmoGarbage404 changes: - message: Fixed the quick-remove star in the inventory sometimes not appearing. @@ -3838,3 +3832,10 @@ id: 5834 time: '2024-01-30T23:23:31.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24746 +- author: themias + changes: + - message: Some glasses and masks can be worn together to hide your identity. + type: Tweak + id: 5835 + time: '2024-01-31T03:49:19.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24741 From d4f1f1fdf5d2ea8007bb26030cac8d66a0a041d1 Mon Sep 17 00:00:00 2001 From: Kara Date: Tue, 30 Jan 2024 22:00:40 -0700 Subject: [PATCH 078/266] Reduce throwing recoil further (#24759) (cherry picked from commit e82964bbf44ce2e6b10c585090eec2dd0cd27237) --- Content.Shared/Throwing/ThrowingSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/Throwing/ThrowingSystem.cs b/Content.Shared/Throwing/ThrowingSystem.cs index 5fe02a05717..54294318315 100644 --- a/Content.Shared/Throwing/ThrowingSystem.cs +++ b/Content.Shared/Throwing/ThrowingSystem.cs @@ -166,7 +166,7 @@ public void TryThrow(EntityUid uid, if (user == null) return; - _recoil.KickCamera(user.Value, -direction * 0.3f); + _recoil.KickCamera(user.Value, -direction * 0.04f); // Give thrower an impulse in the other direction if (pushbackRatio != 0.0f && From aa4c6f9c6abf7da3345a08e0a6b7632cb469e3bb Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 31 Jan 2024 05:01:46 +0000 Subject: [PATCH 079/266] Automatic changelog update (cherry picked from commit 1029142740f53d1a6e8701b410f2ab63b13df4f6) --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 488a57d7c49..35fdade4da4 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: EmoGarbage404 - changes: - - message: Fixed the quick-remove star in the inventory sometimes not appearing. - type: Fix - - message: You can drag items out of the inventory window to drop them on the ground. - type: Add - id: 5336 - time: '2023-12-12T07:49:37.0000000+00:00' - author: IProduceWidgets changes: - message: Pill canisters are slightly better than cig packs, go talk to the chemists. @@ -3839,3 +3831,10 @@ id: 5835 time: '2024-01-31T03:49:19.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24741 +- author: mirrorcult + changes: + - message: Throwing recoil reduced further + type: Tweak + id: 5836 + time: '2024-01-31T05:00:41.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24759 From d35e2f39a71cb5505bee10410d049d2e35c94de6 Mon Sep 17 00:00:00 2001 From: Kara Date: Wed, 31 Jan 2024 06:52:35 +0100 Subject: [PATCH 080/266] Roundstart variation game rules (#24397) * Raise `StationPostInitEvent` broadcast * Basic variation pass handling * standardize names + rule entities * why does it work like that? * add to defaults * light break variation pass * ent spawn entry * move some stationevent utility functions to gamerule + add one for finding random tile on specified station * forgot how statistics works * powered light variation pass is good now * station tile count function * public method to ensure all solutions (for procedural use before mapinit) * move gamerulesystem utility funcs to partial * ensure all solutions before spilling in puddlesystem. for use when spilling before mapinit * trash & puddle variation passes! * oh yeah * ehh lets live a little * std * utility for game rule check based on comp * entprotoid the trash spawner oops * generalize trash variation * use added instead of started for secret rule * random cleanup * generic replacement variation system * Wall rusting variation rule * account for modifying while enumerating * use localaabb * fix test * minor tweaks * reinforced wall replacer + puddletweaker (cherry picked from commit cc24ba6a317c4bee84ffa1eda8397c255ca92be9) --- .../Tests/GameRules/SecretStartsTest.cs | 5 +- .../EntitySystems/SolutionContainerSystem.cs | 51 ++++--- .../Fluids/EntitySystems/PuddleSystem.cs | 8 +- .../GameTicking/GameTicker.GamePreset.cs | 2 +- .../GameTicking/GameTicker.GameRule.cs | 34 +++++ ...RoundstartStationVariationRuleComponent.cs | 19 +++ .../StationVariationPassRuleComponent.cs | 9 ++ .../Rules/GameRuleSystem.Utility.cs | 137 ++++++++++++++++++ .../GameTicking/Rules/GameRuleSystem.cs | 44 ++---- .../RoundstartStationVariationRuleSystem.cs | 70 +++++++++ .../GameTicking/Rules/SecretRuleSystem.cs | 19 ++- .../BaseEntityReplaceVariationPassSystem.cs | 75 ++++++++++ .../EntityReplaceVariationPassComponent.cs | 33 +++++ .../EntitySpawnVariationPassComponent.cs | 27 ++++ .../PoweredLightVariationPassComponent.cs | 38 +++++ .../PuddleMessVariationPassComponent.cs | 26 ++++ ...forcedWallReplaceVariationPassComponent.cs | 7 + ...einforcedWallReplacementMarkerComponent.cs | 9 ++ .../WallReplacementMarkerComponent.cs | 9 ++ .../WallReplaceVariationPassComponent.cs | 7 + .../EntitySpawnVariationPassSystem.cs | 29 ++++ .../PoweredLightVariationPassSystem.cs | 51 +++++++ .../PuddleMessVariationPassSystem.cs | 35 +++++ ...einforcedWallReplaceVariationPassSystem.cs | 11 ++ .../VariationPass/VariationPassSystem.cs | 29 ++++ .../WallReplaceVariationPassSystem.cs | 11 ++ .../Light/EntitySystems/PoweredLightSystem.cs | 26 ++++ .../StationVariationHasRunComponent.cs | 12 ++ .../Station/Events/StationPostInitEvent.cs | 6 +- .../Station/Systems/StationSystem.cs | 23 ++- .../Events/StationEventSystem.cs | 74 ---------- Content.Shared/Storage/EntitySpawnEntry.cs | 13 +- .../Entities/Objects/Power/lights.yml | 26 ++++ .../Entities/Structures/Walls/walls.yml | 4 +- Resources/Prototypes/GameRules/roundstart.yml | 19 +++ Resources/Prototypes/GameRules/variation.yml | 120 +++++++++++++++ Resources/Prototypes/game_presets.yml | 9 ++ 37 files changed, 978 insertions(+), 149 deletions(-) create mode 100644 Content.Server/GameTicking/Rules/Components/RoundstartStationVariationRuleComponent.cs create mode 100644 Content.Server/GameTicking/Rules/Components/StationVariationPassRuleComponent.cs create mode 100644 Content.Server/GameTicking/Rules/GameRuleSystem.Utility.cs create mode 100644 Content.Server/GameTicking/Rules/RoundstartStationVariationRuleSystem.cs create mode 100644 Content.Server/GameTicking/Rules/VariationPass/BaseEntityReplaceVariationPassSystem.cs create mode 100644 Content.Server/GameTicking/Rules/VariationPass/Components/EntityReplaceVariationPassComponent.cs create mode 100644 Content.Server/GameTicking/Rules/VariationPass/Components/EntitySpawnVariationPassComponent.cs create mode 100644 Content.Server/GameTicking/Rules/VariationPass/Components/PoweredLightVariationPassComponent.cs create mode 100644 Content.Server/GameTicking/Rules/VariationPass/Components/PuddleMessVariationPassComponent.cs create mode 100644 Content.Server/GameTicking/Rules/VariationPass/Components/ReinforcedWallReplaceVariationPassComponent.cs create mode 100644 Content.Server/GameTicking/Rules/VariationPass/Components/ReplacementMarkers/ReinforcedWallReplacementMarkerComponent.cs create mode 100644 Content.Server/GameTicking/Rules/VariationPass/Components/ReplacementMarkers/WallReplacementMarkerComponent.cs create mode 100644 Content.Server/GameTicking/Rules/VariationPass/Components/WallReplaceVariationPassComponent.cs create mode 100644 Content.Server/GameTicking/Rules/VariationPass/EntitySpawnVariationPassSystem.cs create mode 100644 Content.Server/GameTicking/Rules/VariationPass/PoweredLightVariationPassSystem.cs create mode 100644 Content.Server/GameTicking/Rules/VariationPass/PuddleMessVariationPassSystem.cs create mode 100644 Content.Server/GameTicking/Rules/VariationPass/ReinforcedWallReplaceVariationPassSystem.cs create mode 100644 Content.Server/GameTicking/Rules/VariationPass/VariationPassSystem.cs create mode 100644 Content.Server/GameTicking/Rules/VariationPass/WallReplaceVariationPassSystem.cs create mode 100644 Content.Server/Station/Components/StationVariationHasRunComponent.cs create mode 100644 Resources/Prototypes/GameRules/variation.yml diff --git a/Content.IntegrationTests/Tests/GameRules/SecretStartsTest.cs b/Content.IntegrationTests/Tests/GameRules/SecretStartsTest.cs index 941337f7ed3..0f665a63de0 100644 --- a/Content.IntegrationTests/Tests/GameRules/SecretStartsTest.cs +++ b/Content.IntegrationTests/Tests/GameRules/SecretStartsTest.cs @@ -21,7 +21,10 @@ public async Task TestSecretStarts() await server.WaitAssertion(() => { - gameTicker.StartGameRule("Secret"); + // this mimics roundflow: + // rules added, then round starts + gameTicker.AddGameRule("Secret"); + gameTicker.StartGamePresetRules(); }); // Wait three ticks for any random update loops that might happen diff --git a/Content.Server/Chemistry/Containers/EntitySystems/SolutionContainerSystem.cs b/Content.Server/Chemistry/Containers/EntitySystems/SolutionContainerSystem.cs index fcf68013fa5..7926121c2b3 100644 --- a/Content.Server/Chemistry/Containers/EntitySystems/SolutionContainerSystem.cs +++ b/Content.Server/Chemistry/Containers/EntitySystems/SolutionContainerSystem.cs @@ -30,10 +30,10 @@ public Solution EnsureSolution(Entity entity, string name) public Solution EnsureSolution(Entity entity, string name, out bool existed) => EnsureSolution(entity, name, FixedPoint2.Zero, out existed); - public Solution EnsureSolution(Entity entity, string name, FixedPoint2 minVol, out bool existed) - => EnsureSolution(entity, name, minVol, null, out existed); + public Solution EnsureSolution(Entity entity, string name, FixedPoint2 maxVol, out bool existed) + => EnsureSolution(entity, name, maxVol, null, out existed); - public Solution EnsureSolution(Entity entity, string name, FixedPoint2 minVol, Solution? prototype, out bool existed) + public Solution EnsureSolution(Entity entity, string name, FixedPoint2 maxVol, Solution? prototype, out bool existed) { var (uid, meta) = entity; if (!Resolve(uid, ref meta)) @@ -41,12 +41,26 @@ public Solution EnsureSolution(Entity entity, string name, F var manager = EnsureComp(uid); if (meta.EntityLifeStage >= EntityLifeStage.MapInitialized) - return EnsureSolutionEntity((uid, manager), name, minVol, prototype, out existed).Comp.Solution; + return EnsureSolutionEntity((uid, manager), name, maxVol, prototype, out existed).Comp.Solution; else - return EnsureSolutionPrototype((uid, manager), name, minVol, prototype, out existed); + return EnsureSolutionPrototype((uid, manager), name, maxVol, prototype, out existed); } - public Entity EnsureSolutionEntity(Entity entity, string name, FixedPoint2 minVol, Solution? prototype, out bool existed) + public void EnsureAllSolutions(Entity entity) + { + if (entity.Comp.Solutions is not { } prototypes) + return; + + foreach (var (name, prototype) in prototypes) + { + EnsureSolutionEntity((entity.Owner, entity.Comp), name, prototype.MaxVolume, prototype, out _); + } + + entity.Comp.Solutions = null; + Dirty(entity); + } + + public Entity EnsureSolutionEntity(Entity entity, string name, FixedPoint2 maxVol, Solution? prototype, out bool existed) { existed = true; @@ -69,9 +83,9 @@ public Entity EnsureSolutionEntity(Entity EnsureSolutionEntity(Entity EnsureSolutionEntity(Entity entity, string name, FixedPoint2 minVol, Solution? prototype, out bool existed) + private Solution EnsureSolutionPrototype(Entity entity, string name, FixedPoint2 maxVol, Solution? prototype, out bool existed) { existed = true; @@ -115,19 +129,19 @@ private Solution EnsureSolutionPrototype(Entity SpawnSolutionUninitialized(ContainerSlot container, string name, FixedPoint2 minVol, Solution prototype) + private Entity SpawnSolutionUninitialized(ContainerSlot container, string name, FixedPoint2 maxVol, Solution prototype) { var coords = new EntityCoordinates(container.Owner, Vector2.Zero); var uid = EntityManager.CreateEntityUninitialized(null, coords, null); @@ -148,16 +162,7 @@ private Entity SpawnSolutionUnini private void OnMapInit(Entity entity, ref MapInitEvent args) { - if (entity.Comp.Solutions is not { } prototypes) - return; - - foreach (var (name, prototype) in prototypes) - { - EnsureSolutionEntity((entity.Owner, entity.Comp), name, prototype.MaxVolume, prototype, out _); - } - - entity.Comp.Solutions = null; - Dirty(entity); + EnsureAllSolutions(entity); } private void OnComponentShutdown(Entity entity, ref ComponentShutdown args) diff --git a/Content.Server/Fluids/EntitySystems/PuddleSystem.cs b/Content.Server/Fluids/EntitySystems/PuddleSystem.cs index c5eb42e05b5..b6df3a171b8 100644 --- a/Content.Server/Fluids/EntitySystems/PuddleSystem.cs +++ b/Content.Server/Fluids/EntitySystems/PuddleSystem.cs @@ -5,6 +5,7 @@ using Content.Server.Spreader; using Content.Shared.Chemistry; using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.Components.SolutionManager; using Content.Shared.Chemistry.EntitySystems; using Content.Shared.Chemistry.Reaction; using Content.Shared.Chemistry.Reagent; @@ -505,11 +506,14 @@ public bool TryAddSolution(EntityUid puddleUid, Solution addedSolution, bool sound = true, bool checkForOverflow = true, - PuddleComponent? puddleComponent = null) + PuddleComponent? puddleComponent = null, + SolutionContainerManagerComponent? sol = null) { - if (!Resolve(puddleUid, ref puddleComponent)) + if (!Resolve(puddleUid, ref puddleComponent, ref sol)) return false; + _solutionContainerSystem.EnsureAllSolutions((puddleUid, sol)); + if (addedSolution.Volume == 0 || !_solutionContainerSystem.ResolveSolution(puddleUid, puddleComponent.SolutionName, ref puddleComponent.Solution)) diff --git a/Content.Server/GameTicking/GameTicker.GamePreset.cs b/Content.Server/GameTicking/GameTicker.GamePreset.cs index 04f7be016a0..b97a16ab993 100644 --- a/Content.Server/GameTicking/GameTicker.GamePreset.cs +++ b/Content.Server/GameTicking/GameTicker.GamePreset.cs @@ -188,7 +188,7 @@ private bool AddGamePresetRules() return true; } - private void StartGamePresetRules() + public void StartGamePresetRules() { // May be touched by the preset during init. var rules = new List(GetAddedGameRules()); diff --git a/Content.Server/GameTicking/GameTicker.GameRule.cs b/Content.Server/GameTicking/GameTicker.GameRule.cs index 971e103c1b5..4ebe946af4a 100644 --- a/Content.Server/GameTicking/GameTicker.GameRule.cs +++ b/Content.Server/GameTicking/GameTicker.GameRule.cs @@ -141,6 +141,24 @@ public bool EndGameRule(EntityUid ruleEntity, GameRuleComponent? ruleData = null return true; } + /// + /// Returns true if a game rule with the given component has been added. + /// + public bool IsGameRuleAdded() + where T : IComponent + { + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out _, out _)) + { + if (HasComp(uid)) + continue; + + return true; + } + + return false; + } + public bool IsGameRuleAdded(EntityUid ruleEntity, GameRuleComponent? component = null) { return Resolve(ruleEntity, ref component) && !HasComp(ruleEntity); @@ -157,6 +175,22 @@ public bool IsGameRuleAdded(string rule) return false; } + /// + /// Returns true if a game rule with the given component is active.. + /// + public bool IsGameRuleActive() + where T : IComponent + { + var query = EntityQueryEnumerator(); + // out, damned underscore!!! + while (query.MoveNext(out _, out _, out _, out _)) + { + return true; + } + + return false; + } + public bool IsGameRuleActive(EntityUid ruleEntity, GameRuleComponent? component = null) { return Resolve(ruleEntity, ref component) && HasComp(ruleEntity); diff --git a/Content.Server/GameTicking/Rules/Components/RoundstartStationVariationRuleComponent.cs b/Content.Server/GameTicking/Rules/Components/RoundstartStationVariationRuleComponent.cs new file mode 100644 index 00000000000..44ae89f7b35 --- /dev/null +++ b/Content.Server/GameTicking/Rules/Components/RoundstartStationVariationRuleComponent.cs @@ -0,0 +1,19 @@ +using Content.Shared.Storage; +using Robust.Shared.Prototypes; + +namespace Content.Server.GameTicking.Rules.Components; + +/// +/// This handles starting various roundstart variation rules after a station has been loaded. +/// +[RegisterComponent] +public sealed partial class RoundstartStationVariationRuleComponent : Component +{ + /// + /// The list of rules that will be started once the map is spawned. + /// Uses to support probabilities for various rules + /// without having to hardcode the probability directly in the rule's logic. + /// + [DataField(required: true)] + public List Rules = new(); +} diff --git a/Content.Server/GameTicking/Rules/Components/StationVariationPassRuleComponent.cs b/Content.Server/GameTicking/Rules/Components/StationVariationPassRuleComponent.cs new file mode 100644 index 00000000000..9fdc62a7e0d --- /dev/null +++ b/Content.Server/GameTicking/Rules/Components/StationVariationPassRuleComponent.cs @@ -0,0 +1,9 @@ +namespace Content.Server.GameTicking.Rules.Components; + +/// +/// This is a marker component placed on rule entities which are a single "pass" of station variation. +/// +[RegisterComponent] +public sealed partial class StationVariationPassRuleComponent : Component +{ +} diff --git a/Content.Server/GameTicking/Rules/GameRuleSystem.Utility.cs b/Content.Server/GameTicking/Rules/GameRuleSystem.Utility.cs new file mode 100644 index 00000000000..9d75e654724 --- /dev/null +++ b/Content.Server/GameTicking/Rules/GameRuleSystem.Utility.cs @@ -0,0 +1,137 @@ +using System.Diagnostics.CodeAnalysis; +using Content.Server.GameTicking.Rules.Components; +using Content.Server.Station.Components; +using Robust.Shared.Collections; +using Robust.Shared.Map; +using Robust.Shared.Map.Components; +using Robust.Shared.Random; + +namespace Content.Server.GameTicking.Rules; + +public abstract partial class GameRuleSystem where T: IComponent +{ + protected EntityQueryEnumerator QueryActiveRules() + { + return EntityQueryEnumerator(); + } + + protected bool TryRoundStartAttempt(RoundStartAttemptEvent ev, string localizedPresetName) + { + var query = EntityQueryEnumerator(); + while (query.MoveNext(out _, out _, out _, out var gameRule)) + { + var minPlayers = gameRule.MinPlayers; + if (!ev.Forced && ev.Players.Length < minPlayers) + { + ChatManager.SendAdminAnnouncement(Loc.GetString("preset-not-enough-ready-players", + ("readyPlayersCount", ev.Players.Length), ("minimumPlayers", minPlayers), + ("presetName", localizedPresetName))); + ev.Cancel(); + continue; + } + + if (ev.Players.Length == 0) + { + ChatManager.DispatchServerAnnouncement(Loc.GetString("preset-no-one-ready")); + ev.Cancel(); + } + } + + return !ev.Cancelled; + } + + /// + /// Utility function for finding a random event-eligible station entity + /// + protected bool TryGetRandomStation([NotNullWhen(true)] out EntityUid? station, Func? filter = null) + { + var stations = new ValueList(Count()); + + filter ??= _ => true; + var query = AllEntityQuery(); + + while (query.MoveNext(out var uid, out _)) + { + if (!filter(uid)) + continue; + + stations.Add(uid); + } + + if (stations.Count == 0) + { + station = null; + return false; + } + + // TODO: Engine PR. + station = stations[RobustRandom.Next(stations.Count)]; + return true; + } + + protected bool TryFindRandomTile(out Vector2i tile, + [NotNullWhen(true)] out EntityUid? targetStation, + out EntityUid targetGrid, + out EntityCoordinates targetCoords) + { + tile = default; + targetStation = EntityUid.Invalid; + targetGrid = EntityUid.Invalid; + targetCoords = EntityCoordinates.Invalid; + if (TryGetRandomStation(out targetStation)) + { + return TryFindRandomTileOnStation((targetStation.Value, Comp(targetStation.Value)), + out tile, + out targetGrid, + out targetCoords); + } + + return false; + } + + protected bool TryFindRandomTileOnStation(Entity station, + out Vector2i tile, + out EntityUid targetGrid, + out EntityCoordinates targetCoords) + { + tile = default; + targetCoords = EntityCoordinates.Invalid; + targetGrid = EntityUid.Invalid; + + var possibleTargets = station.Comp.Grids; + if (possibleTargets.Count == 0) + { + targetGrid = EntityUid.Invalid; + return false; + } + + targetGrid = RobustRandom.Pick(possibleTargets); + + if (!TryComp(targetGrid, out var gridComp)) + return false; + + var found = false; + var aabb = gridComp.LocalAABB; + + for (var i = 0; i < 10; i++) + { + var randomX = RobustRandom.Next((int) aabb.Left, (int) aabb.Right); + var randomY = RobustRandom.Next((int) aabb.Bottom, (int) aabb.Top); + + tile = new Vector2i(randomX, randomY); + if (_atmosphere.IsTileSpace(targetGrid, Transform(targetGrid).MapUid, tile, + mapGridComp: gridComp) + || _atmosphere.IsTileAirBlocked(targetGrid, tile, mapGridComp: gridComp)) + { + continue; + } + + found = true; + targetCoords = _map.GridTileToLocal(targetGrid, gridComp, tile); + break; + } + + return found; + } + +} diff --git a/Content.Server/GameTicking/Rules/GameRuleSystem.cs b/Content.Server/GameTicking/Rules/GameRuleSystem.cs index ba781e32e29..1667e73d046 100644 --- a/Content.Server/GameTicking/Rules/GameRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/GameRuleSystem.cs @@ -1,13 +1,27 @@ +using System.Diagnostics.CodeAnalysis; +using Content.Server.Atmos.EntitySystems; using Content.Server.Chat.Managers; using Content.Server.GameTicking.Rules.Components; +using Content.Server.Station.Components; +using Robust.Server.GameObjects; +using Robust.Shared.Collections; +using Robust.Shared.Map; +using Robust.Shared.Map.Components; +using Robust.Shared.Random; namespace Content.Server.GameTicking.Rules; public abstract partial class GameRuleSystem : EntitySystem where T : IComponent { + [Dependency] protected readonly IRobustRandom RobustRandom = default!; [Dependency] protected readonly IChatManager ChatManager = default!; [Dependency] protected readonly GameTicker GameTicker = default!; + // Not protected, just to be used in utility methods + [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly AtmosphereSystem _atmosphere = default!; + [Dependency] private readonly MapSystem _map = default!; + public override void Initialize() { base.Initialize(); @@ -71,36 +85,6 @@ protected virtual void ActiveTick(EntityUid uid, T component, GameRuleComponent } - protected EntityQueryEnumerator QueryActiveRules() - { - return EntityQueryEnumerator(); - } - - protected bool TryRoundStartAttempt(RoundStartAttemptEvent ev, string localizedPresetName) - { - var query = EntityQueryEnumerator(); - while (query.MoveNext(out _, out _, out _, out var gameRule)) - { - var minPlayers = gameRule.MinPlayers; - if (!ev.Forced && ev.Players.Length < minPlayers) - { - ChatManager.SendAdminAnnouncement(Loc.GetString("preset-not-enough-ready-players", - ("readyPlayersCount", ev.Players.Length), ("minimumPlayers", minPlayers), - ("presetName", localizedPresetName))); - ev.Cancel(); - continue; - } - - if (ev.Players.Length == 0) - { - ChatManager.DispatchServerAnnouncement(Loc.GetString("preset-no-one-ready")); - ev.Cancel(); - } - } - - return !ev.Cancelled; - } - public override void Update(float frameTime) { base.Update(frameTime); diff --git a/Content.Server/GameTicking/Rules/RoundstartStationVariationRuleSystem.cs b/Content.Server/GameTicking/Rules/RoundstartStationVariationRuleSystem.cs new file mode 100644 index 00000000000..7755f684be2 --- /dev/null +++ b/Content.Server/GameTicking/Rules/RoundstartStationVariationRuleSystem.cs @@ -0,0 +1,70 @@ +using System.Linq; +using Content.Server.GameTicking.Rules.Components; +using Content.Server.Shuttles.Systems; +using Content.Server.Station.Components; +using Content.Server.Station.Events; +using Content.Shared.Storage; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; + +namespace Content.Server.GameTicking.Rules; + +/// +public sealed class RoundstartStationVariationRuleSystem : GameRuleSystem +{ + [Dependency] private readonly IRobustRandom _random = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnStationPostInit, after: new []{typeof(ShuttleSystem)}); + } + + protected override void Added(EntityUid uid, RoundstartStationVariationRuleComponent component, GameRuleComponent gameRule, GameRuleAddedEvent args) + { + var spawns = EntitySpawnCollection.GetSpawns(component.Rules, _random); + foreach (var rule in spawns) + { + GameTicker.AddGameRule(rule); + } + } + + private void OnStationPostInit(ref StationPostInitEvent ev) + { + // as long as one is running + if (!GameTicker.IsGameRuleAdded()) + return; + + // this is unlikely, but could theoretically happen if it was saved and reloaded, so check anyway + if (HasComp(ev.Station)) + return; + + Log.Info($"Running variation rules for station {ToPrettyString(ev.Station)}"); + + // raise the event on any passes that have been added + var passEv = new StationVariationPassEvent(ev.Station); + var passQuery = EntityQueryEnumerator(); + while (passQuery.MoveNext(out var uid, out _, out _)) + { + // TODO: for some reason, ending a game rule just gives it a marker comp, + // and doesnt delete it + // so we have to check here that it isnt an ended game rule (which could happen if a preset failed to start + // or it was ended before station maps spawned etc etc etc) + if (HasComp(uid)) + continue; + + RaiseLocalEvent(uid, ref passEv); + } + + EnsureComp(ev.Station); + } +} + +/// +/// Raised directed on game rule entities which are added and marked as +/// when a new station is initialized that should be varied. +/// +/// The new station that was added, and its config & grids. +[ByRefEvent] +public readonly record struct StationVariationPassEvent(Entity Station); diff --git a/Content.Server/GameTicking/Rules/SecretRuleSystem.cs b/Content.Server/GameTicking/Rules/SecretRuleSystem.cs index 1e3858ceef6..6a00eb7d102 100644 --- a/Content.Server/GameTicking/Rules/SecretRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/SecretRuleSystem.cs @@ -18,9 +18,9 @@ public sealed class SecretRuleSystem : GameRuleSystem [Dependency] private readonly IConfigurationManager _configurationManager = default!; [Dependency] private readonly IAdminLogManager _adminLogger = default!; - protected override void Started(EntityUid uid, SecretRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) + protected override void Added(EntityUid uid, SecretRuleComponent component, GameRuleComponent gameRule, GameRuleAddedEvent args) { - base.Started(uid, component, gameRule, args); + base.Added(uid, component, gameRule, args); PickRule(component); } @@ -40,13 +40,24 @@ private void PickRule(SecretRuleComponent component) // but currently there's no way to know anyway as they use cvars. var presetString = _configurationManager.GetCVar(CCVars.SecretWeightPrototype); var preset = _prototypeManager.Index(presetString).Pick(_random); - Logger.InfoS("gamepreset", $"Selected {preset} for secret."); + Log.Info($"Selected {preset} for secret."); _adminLogger.Add(LogType.EventStarted, $"Selected {preset} for secret."); var rules = _prototypeManager.Index(preset).Rules; foreach (var rule in rules) { - GameTicker.StartGameRule(rule, out var ruleEnt); + EntityUid ruleEnt; + + // if we're pre-round (i.e. will only be added) + // then just add rules. if we're added in the middle of the round (or at any other point really) + // then we want to start them as well + if (GameTicker.RunLevel <= GameRunLevel.InRound) + ruleEnt = GameTicker.AddGameRule(rule); + else + { + GameTicker.StartGameRule(rule, out ruleEnt); + } + component.AdditionalGameRules.Add(ruleEnt); } } diff --git a/Content.Server/GameTicking/Rules/VariationPass/BaseEntityReplaceVariationPassSystem.cs b/Content.Server/GameTicking/Rules/VariationPass/BaseEntityReplaceVariationPassSystem.cs new file mode 100644 index 00000000000..00b2546e785 --- /dev/null +++ b/Content.Server/GameTicking/Rules/VariationPass/BaseEntityReplaceVariationPassSystem.cs @@ -0,0 +1,75 @@ +using Content.Server.GameTicking.Rules.VariationPass.Components; +using Content.Shared.Storage; +using Robust.Shared.Map; +using Robust.Shared.Random; +using Robust.Shared.Timing; + +namespace Content.Server.GameTicking.Rules.VariationPass; + +/// +/// +/// A base system for fast replacement of entities utilizing a query, rather than having to iterate every entity +/// To use, you must have a marker component to use for --each replaceable entity must have it +/// Then you need an inheriting system as well as a unique game rule component for +/// +/// This means a bit more boilerplate for each one, but significantly faster to actually execute. +/// See +/// +public abstract class BaseEntityReplaceVariationPassSystem : VariationPassSystem + where TEntComp: IComponent + where TGameRuleComp: IComponent +{ + /// + /// Used so we don't modify while enumerating + /// if the replaced entity also has . + /// + /// Filled and cleared within the same tick so no persistence issues. + /// + private readonly Queue<(string, EntityCoordinates, Angle)> _queuedSpawns = new(); + + protected override void ApplyVariation(Entity ent, ref StationVariationPassEvent args) + { + if (!TryComp(ent, out var pass)) + return; + + var stopwatch = new Stopwatch(); + stopwatch.Start(); + + var replacementMod = Random.NextGaussian(pass.EntitiesPerReplacementAverage, pass.EntitiesPerReplacementStdDev); + var prob = (float) Math.Clamp(1 / replacementMod, 0f, 1f); + + if (prob == 0) + return; + + var enumerator = AllEntityQuery(); + while (enumerator.MoveNext(out var uid, out _, out var xform)) + { + if (!IsMemberOfStation((uid, xform), ref args)) + continue; + + if (RobustRandom.Prob(prob)) + QueueReplace((uid, xform), pass.Replacements); + } + + while (_queuedSpawns.TryDequeue(out var tup)) + { + var (spawn, coords, rot) = tup; + var newEnt = Spawn(spawn, coords); + Transform(newEnt).LocalRotation = rot; + } + + Log.Debug($"Entity replacement took {stopwatch.Elapsed} with {Stations.GetTileCount(args.Station)} tiles"); + } + + private void QueueReplace(Entity ent, List replacements) + { + var coords = ent.Comp.Coordinates; + var rot = ent.Comp.LocalRotation; + QueueDel(ent); + + foreach (var spawn in EntitySpawnCollection.GetSpawns(replacements, RobustRandom)) + { + _queuedSpawns.Enqueue((spawn, coords, rot)); + } + } +} diff --git a/Content.Server/GameTicking/Rules/VariationPass/Components/EntityReplaceVariationPassComponent.cs b/Content.Server/GameTicking/Rules/VariationPass/Components/EntityReplaceVariationPassComponent.cs new file mode 100644 index 00000000000..6603251754c --- /dev/null +++ b/Content.Server/GameTicking/Rules/VariationPass/Components/EntityReplaceVariationPassComponent.cs @@ -0,0 +1,33 @@ +using Content.Shared.Storage; +using Content.Shared.Whitelist; +using Robust.Shared.Prototypes; + +namespace Content.Server.GameTicking.Rules.VariationPass.Components; + +/// +/// This is used for replacing a certain amount of entities with other entities in a variation pass. +/// +/// +/// +/// POTENTIALLY REPLACEABLE ENTITIES MUST BE MARKED WITH A REPLACEMENT MARKER +/// AND HAVE A SYSTEM INHERITING FROM +/// SEE +/// +[RegisterComponent] +public sealed partial class EntityReplaceVariationPassComponent : Component +{ + /// + /// Number of matching entities before one will be replaced on average. + /// + [DataField(required: true)] + public float EntitiesPerReplacementAverage; + + [DataField(required: true)] + public float EntitiesPerReplacementStdDev; + + /// + /// Prototype(s) to replace matched entities with. + /// + [DataField(required: true)] + public List Replacements = default!; +} diff --git a/Content.Server/GameTicking/Rules/VariationPass/Components/EntitySpawnVariationPassComponent.cs b/Content.Server/GameTicking/Rules/VariationPass/Components/EntitySpawnVariationPassComponent.cs new file mode 100644 index 00000000000..f7ddd7ce9dd --- /dev/null +++ b/Content.Server/GameTicking/Rules/VariationPass/Components/EntitySpawnVariationPassComponent.cs @@ -0,0 +1,27 @@ +using Content.Shared.Random; +using Content.Shared.Storage; +using Robust.Shared.Prototypes; + +namespace Content.Server.GameTicking.Rules.VariationPass.Components; + +/// +/// This is used for spawning entities randomly dotted around the station in a variation pass. +/// +[RegisterComponent] +public sealed partial class EntitySpawnVariationPassComponent : Component +{ + /// + /// Number of tiles before we spawn one entity on average. + /// + [DataField] + public float TilesPerEntityAverage = 50f; + + [DataField] + public float TilesPerEntityStdDev = 7f; + + /// + /// Spawn entries for each chosen location. + /// + [DataField(required: true)] + public List Entities = default!; +} diff --git a/Content.Server/GameTicking/Rules/VariationPass/Components/PoweredLightVariationPassComponent.cs b/Content.Server/GameTicking/Rules/VariationPass/Components/PoweredLightVariationPassComponent.cs new file mode 100644 index 00000000000..98c58e0a04c --- /dev/null +++ b/Content.Server/GameTicking/Rules/VariationPass/Components/PoweredLightVariationPassComponent.cs @@ -0,0 +1,38 @@ +using Content.Shared.Light.Components; +using Robust.Shared.Prototypes; + +namespace Content.Server.GameTicking.Rules.VariationPass.Components; + +/// +/// This handle randomly destroying lights, causing them to flicker endlessly, or replacing their tube/bulb with different variants. +/// +[RegisterComponent] +public sealed partial class PoweredLightVariationPassComponent : Component +{ + /// + /// Chance that a light will be replaced with a broken variant. + /// + [DataField] + public float LightBreakChance = 0.15f; + + /// + /// Chance that a light will be replaced with an aged variant. + /// + [DataField] + public float LightAgingChance = 0.05f; + + [DataField] + public float AgedLightTubeFlickerChance = 0.03f; + + [DataField] + public EntProtoId BrokenLightBulbPrototype = "LightBulbBroken"; + + [DataField] + public EntProtoId BrokenLightTubePrototype = "LightTubeBroken"; + + [DataField] + public EntProtoId AgedLightBulbPrototype = "LightBulbOld"; + + [DataField] + public EntProtoId AgedLightTubePrototype = "LightTubeOld"; +} diff --git a/Content.Server/GameTicking/Rules/VariationPass/Components/PuddleMessVariationPassComponent.cs b/Content.Server/GameTicking/Rules/VariationPass/Components/PuddleMessVariationPassComponent.cs new file mode 100644 index 00000000000..787d338652c --- /dev/null +++ b/Content.Server/GameTicking/Rules/VariationPass/Components/PuddleMessVariationPassComponent.cs @@ -0,0 +1,26 @@ +using Content.Shared.Random; +using Robust.Shared.Prototypes; + +namespace Content.Server.GameTicking.Rules.VariationPass.Components; + +/// +/// Handles spilling puddles with various reagents randomly around the station. +/// +[RegisterComponent] +public sealed partial class PuddleMessVariationPassComponent : Component +{ + /// + /// Tiles before one spill on average. + /// + [DataField] + public float TilesPerSpillAverage = 600f; + + [DataField] + public float TilesPerSpillStdDev = 50f; + + /// + /// Weighted random prototype to use for random messes. + /// + [DataField(required: true)] + public ProtoId RandomPuddleSolutionFill = default!; +} diff --git a/Content.Server/GameTicking/Rules/VariationPass/Components/ReinforcedWallReplaceVariationPassComponent.cs b/Content.Server/GameTicking/Rules/VariationPass/Components/ReinforcedWallReplaceVariationPassComponent.cs new file mode 100644 index 00000000000..82095fe224d --- /dev/null +++ b/Content.Server/GameTicking/Rules/VariationPass/Components/ReinforcedWallReplaceVariationPassComponent.cs @@ -0,0 +1,7 @@ +namespace Content.Server.GameTicking.Rules.VariationPass.Components; + + +[RegisterComponent] +public sealed partial class ReinforcedWallReplaceVariationPassComponent : Component +{ +} diff --git a/Content.Server/GameTicking/Rules/VariationPass/Components/ReplacementMarkers/ReinforcedWallReplacementMarkerComponent.cs b/Content.Server/GameTicking/Rules/VariationPass/Components/ReplacementMarkers/ReinforcedWallReplacementMarkerComponent.cs new file mode 100644 index 00000000000..00f55b7e253 --- /dev/null +++ b/Content.Server/GameTicking/Rules/VariationPass/Components/ReplacementMarkers/ReinforcedWallReplacementMarkerComponent.cs @@ -0,0 +1,9 @@ +namespace Content.Server.GameTicking.Rules.VariationPass.Components.ReplacementMarkers; + +/// +/// This component marks replaceable reinforced walls for use with fast queries in variation passes. +/// +[RegisterComponent] +public sealed partial class ReinforcedWallReplacementMarkerComponent : Component +{ +} diff --git a/Content.Server/GameTicking/Rules/VariationPass/Components/ReplacementMarkers/WallReplacementMarkerComponent.cs b/Content.Server/GameTicking/Rules/VariationPass/Components/ReplacementMarkers/WallReplacementMarkerComponent.cs new file mode 100644 index 00000000000..6df04321989 --- /dev/null +++ b/Content.Server/GameTicking/Rules/VariationPass/Components/ReplacementMarkers/WallReplacementMarkerComponent.cs @@ -0,0 +1,9 @@ +namespace Content.Server.GameTicking.Rules.VariationPass.Components.ReplacementMarkers; + +/// +/// This component marks replaceable walls for use with fast queries in variation passes. +/// +[RegisterComponent] +public sealed partial class WallReplacementMarkerComponent : Component +{ +} diff --git a/Content.Server/GameTicking/Rules/VariationPass/Components/WallReplaceVariationPassComponent.cs b/Content.Server/GameTicking/Rules/VariationPass/Components/WallReplaceVariationPassComponent.cs new file mode 100644 index 00000000000..3598deeb261 --- /dev/null +++ b/Content.Server/GameTicking/Rules/VariationPass/Components/WallReplaceVariationPassComponent.cs @@ -0,0 +1,7 @@ +namespace Content.Server.GameTicking.Rules.VariationPass.Components; + + +[RegisterComponent] +public sealed partial class WallReplaceVariationPassComponent : Component +{ +} diff --git a/Content.Server/GameTicking/Rules/VariationPass/EntitySpawnVariationPassSystem.cs b/Content.Server/GameTicking/Rules/VariationPass/EntitySpawnVariationPassSystem.cs new file mode 100644 index 00000000000..7247bd98aa0 --- /dev/null +++ b/Content.Server/GameTicking/Rules/VariationPass/EntitySpawnVariationPassSystem.cs @@ -0,0 +1,29 @@ +using Content.Server.GameTicking.Rules.VariationPass.Components; +using Content.Shared.Storage; +using Robust.Shared.Random; + +namespace Content.Server.GameTicking.Rules.VariationPass; + +/// +public sealed class EntitySpawnVariationPassSystem : VariationPassSystem +{ + protected override void ApplyVariation(Entity ent, ref StationVariationPassEvent args) + { + var totalTiles = Stations.GetTileCount(args.Station); + + var dirtyMod = Random.NextGaussian(ent.Comp.TilesPerEntityAverage, ent.Comp.TilesPerEntityStdDev); + var trashTiles = Math.Max((int) (totalTiles * (1 / dirtyMod)), 0); + + for (var i = 0; i < trashTiles; i++) + { + if (!TryFindRandomTileOnStation(args.Station, out _, out _, out var coords)) + continue; + + var ents = EntitySpawnCollection.GetSpawns(ent.Comp.Entities, Random); + foreach (var spawn in ents) + { + SpawnAtPosition(spawn, coords); + } + } + } +} diff --git a/Content.Server/GameTicking/Rules/VariationPass/PoweredLightVariationPassSystem.cs b/Content.Server/GameTicking/Rules/VariationPass/PoweredLightVariationPassSystem.cs new file mode 100644 index 00000000000..dae6981f957 --- /dev/null +++ b/Content.Server/GameTicking/Rules/VariationPass/PoweredLightVariationPassSystem.cs @@ -0,0 +1,51 @@ +using Content.Server.GameTicking.Rules.VariationPass.Components; +using Content.Server.Light.Components; +using Content.Server.Light.EntitySystems; +using Content.Shared.Light.Components; +using Robust.Shared.Random; + +namespace Content.Server.GameTicking.Rules.VariationPass; + +/// +public sealed class PoweredLightVariationPassSystem : VariationPassSystem +{ + [Dependency] private readonly PoweredLightSystem _poweredLight = default!; + + protected override void ApplyVariation(Entity ent, ref StationVariationPassEvent args) + { + var query = AllEntityQuery(); + while (query.MoveNext(out var uid, out var comp, out var xform)) + { + if (!IsMemberOfStation((uid, xform), ref args)) + continue; + + if (Random.Prob(ent.Comp.LightBreakChance)) + { + var proto = comp.BulbType switch + { + LightBulbType.Tube => ent.Comp.BrokenLightTubePrototype, + _ => ent.Comp.BrokenLightBulbPrototype, + }; + + _poweredLight.ReplaceSpawnedPrototype((uid, comp), proto); + continue; + } + + if (!Random.Prob(ent.Comp.LightAgingChance)) + continue; + + if (comp.BulbType == LightBulbType.Tube) + { + // some aging fluorescents (tubes) start to flicker + // its also way too annoying right now so we wrap it in another prob lol + if (Random.Prob(ent.Comp.AgedLightTubeFlickerChance)) + _poweredLight.ToggleBlinkingLight(uid, comp, true); + _poweredLight.ReplaceSpawnedPrototype((uid, comp), ent.Comp.AgedLightTubePrototype); + } + else + { + _poweredLight.ReplaceSpawnedPrototype((uid, comp), ent.Comp.AgedLightBulbPrototype); + } + } + } +} diff --git a/Content.Server/GameTicking/Rules/VariationPass/PuddleMessVariationPassSystem.cs b/Content.Server/GameTicking/Rules/VariationPass/PuddleMessVariationPassSystem.cs new file mode 100644 index 00000000000..41cdbd87f8c --- /dev/null +++ b/Content.Server/GameTicking/Rules/VariationPass/PuddleMessVariationPassSystem.cs @@ -0,0 +1,35 @@ +using Content.Server.Fluids.EntitySystems; +using Content.Server.GameTicking.Rules.VariationPass.Components; +using Content.Shared.Chemistry.Components; +using Content.Shared.Random.Helpers; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; + +namespace Content.Server.GameTicking.Rules.VariationPass; + +/// +public sealed class PuddleMessVariationPassSystem : VariationPassSystem +{ + [Dependency] private readonly PuddleSystem _puddle = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; + + protected override void ApplyVariation(Entity ent, ref StationVariationPassEvent args) + { + var totalTiles = Stations.GetTileCount(args.Station); + + if (!_proto.TryIndex(ent.Comp.RandomPuddleSolutionFill, out var proto)) + return; + + var puddleMod = Random.NextGaussian(ent.Comp.TilesPerSpillAverage, ent.Comp.TilesPerSpillStdDev); + var puddleTiles = Math.Max((int) (totalTiles * (1 / puddleMod)), 0); + + for (var i = 0; i < puddleTiles; i++) + { + if (!TryFindRandomTileOnStation(args.Station, out _, out _, out var coords)) + continue; + + var sol = proto.Pick(Random); + _puddle.TrySpillAt(coords, new Solution(sol.reagent, sol.quantity), out _, sound: false); + } + } +} diff --git a/Content.Server/GameTicking/Rules/VariationPass/ReinforcedWallReplaceVariationPassSystem.cs b/Content.Server/GameTicking/Rules/VariationPass/ReinforcedWallReplaceVariationPassSystem.cs new file mode 100644 index 00000000000..1950581beaa --- /dev/null +++ b/Content.Server/GameTicking/Rules/VariationPass/ReinforcedWallReplaceVariationPassSystem.cs @@ -0,0 +1,11 @@ +using Content.Server.GameTicking.Rules.VariationPass.Components; +using Content.Server.GameTicking.Rules.VariationPass.Components.ReplacementMarkers; + +namespace Content.Server.GameTicking.Rules.VariationPass; + +/// +/// This handles the ability to replace entities marked with in a variation pass +/// +public sealed class ReinforcedWallReplaceVariationPassSystem : BaseEntityReplaceVariationPassSystem +{ +} diff --git a/Content.Server/GameTicking/Rules/VariationPass/VariationPassSystem.cs b/Content.Server/GameTicking/Rules/VariationPass/VariationPassSystem.cs new file mode 100644 index 00000000000..b6ead21479e --- /dev/null +++ b/Content.Server/GameTicking/Rules/VariationPass/VariationPassSystem.cs @@ -0,0 +1,29 @@ +using Content.Server.Station.Systems; +using Robust.Shared.Random; + +namespace Content.Server.GameTicking.Rules.VariationPass; + +/// +/// Base class for procedural variation rule passes, which apply some kind of variation to a station, +/// so we simply reduce the boilerplate for the event handling a bit with this. +/// +public abstract class VariationPassSystem : GameRuleSystem + where T: IComponent +{ + [Dependency] protected readonly StationSystem Stations = default!; + [Dependency] protected readonly IRobustRandom Random = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(ApplyVariation); + } + + protected bool IsMemberOfStation(Entity ent, ref StationVariationPassEvent args) + { + return Stations.GetOwningStation(ent, ent.Comp) == args.Station.Owner; + } + + protected abstract void ApplyVariation(Entity ent, ref StationVariationPassEvent args); +} diff --git a/Content.Server/GameTicking/Rules/VariationPass/WallReplaceVariationPassSystem.cs b/Content.Server/GameTicking/Rules/VariationPass/WallReplaceVariationPassSystem.cs new file mode 100644 index 00000000000..e9777d829d1 --- /dev/null +++ b/Content.Server/GameTicking/Rules/VariationPass/WallReplaceVariationPassSystem.cs @@ -0,0 +1,11 @@ +using Content.Server.GameTicking.Rules.VariationPass.Components; +using Content.Server.GameTicking.Rules.VariationPass.Components.ReplacementMarkers; + +namespace Content.Server.GameTicking.Rules.VariationPass; + +/// +/// This handles the ability to replace entities marked with in a variation pass +/// +public sealed class WallReplaceVariationPassSystem : BaseEntityReplaceVariationPassSystem +{ +} diff --git a/Content.Server/Light/EntitySystems/PoweredLightSystem.cs b/Content.Server/Light/EntitySystems/PoweredLightSystem.cs index e6cde4495ce..ca44b1a4c99 100644 --- a/Content.Server/Light/EntitySystems/PoweredLightSystem.cs +++ b/Content.Server/Light/EntitySystems/PoweredLightSystem.cs @@ -214,6 +214,21 @@ public bool InsertBulb(EntityUid uid, EntityUid bulbUid, PoweredLightComponent? return bulb; } + /// + /// Replaces the spawned prototype of a pre-mapinit powered light with a different variant. + /// + public bool ReplaceSpawnedPrototype(Entity light, string bulb) + { + if (light.Comp.LightBulbContainer.ContainedEntity != null) + return false; + + if (LifeStage(light.Owner) >= EntityLifeStage.MapInitialized) + return false; + + light.Comp.HasLampOnSpawn = bulb; + return true; + } + /// /// Try to replace current bulb with a new one /// If succeed old bulb just drops on floor @@ -241,6 +256,17 @@ public bool ReplaceBulb(EntityUid uid, EntityUid bulb, PoweredLightComponent? li /// public bool TryDestroyBulb(EntityUid uid, PoweredLightComponent? light = null) { + if (!Resolve(uid, ref light, false)) + return false; + + // if we aren't mapinited, + // just null the spawned bulb + if (LifeStage(uid) < EntityLifeStage.MapInitialized) + { + light.HasLampOnSpawn = null; + return true; + } + // check bulb state var bulbUid = GetBulb(uid, light); if (bulbUid == null || !EntityManager.TryGetComponent(bulbUid.Value, out LightBulbComponent? lightBulb)) diff --git a/Content.Server/Station/Components/StationVariationHasRunComponent.cs b/Content.Server/Station/Components/StationVariationHasRunComponent.cs new file mode 100644 index 00000000000..65c794f3fc5 --- /dev/null +++ b/Content.Server/Station/Components/StationVariationHasRunComponent.cs @@ -0,0 +1,12 @@ +using Content.Server.GameTicking.Rules; + +namespace Content.Server.Station.Components; + +/// +/// Marker component for stations where procedural variation using +/// has already run, so as to avoid running it again if another station is added. +/// +[RegisterComponent] +public sealed partial class StationVariationHasRunComponent : Component +{ +} diff --git a/Content.Server/Station/Events/StationPostInitEvent.cs b/Content.Server/Station/Events/StationPostInitEvent.cs index a4e55fafb27..4f7927cee52 100644 --- a/Content.Server/Station/Events/StationPostInitEvent.cs +++ b/Content.Server/Station/Events/StationPostInitEvent.cs @@ -1,7 +1,9 @@ +using Content.Server.Station.Components; + namespace Content.Server.Station.Events; /// -/// Raised directed on a station after it has been initialized. +/// Raised directed on a station after it has been initialized, as well as broadcast. /// [ByRefEvent] -public readonly record struct StationPostInitEvent; +public readonly record struct StationPostInitEvent(Entity Station); diff --git a/Content.Server/Station/Systems/StationSystem.cs b/Content.Server/Station/Systems/StationSystem.cs index a0adeb22434..be3fc57967b 100644 --- a/Content.Server/Station/Systems/StationSystem.cs +++ b/Content.Server/Station/Systems/StationSystem.cs @@ -6,6 +6,7 @@ using Content.Shared.CCVar; using Content.Shared.Station; using JetBrains.Annotations; +using Robust.Server.GameObjects; using Robust.Server.Player; using Robust.Shared.Collections; using Robust.Shared.Configuration; @@ -35,6 +36,7 @@ public sealed class StationSystem : EntitySystem [Dependency] private readonly GameTicker _gameTicker = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly MetaDataSystem _metaData = default!; + [Dependency] private readonly MapSystem _map = default!; private ISawmill _sawmill = default!; @@ -208,6 +210,23 @@ private void OnRoundEnd(GameRunLevelChangedEvent eventArgs) return largestGrid; } + /// + /// Returns the total number of tiles contained in the station's grids. + /// + public int GetTileCount(StationDataComponent component) + { + var count = 0; + foreach (var gridUid in component.Grids) + { + if (!TryComp(gridUid, out var grid)) + continue; + + count += _map.GetAllTiles(gridUid, grid).Count(); + } + + return count; + } + /// /// Tries to retrieve a filter for everything in the station the source is on. /// @@ -306,8 +325,8 @@ public EntityUid InitializeNewStation(StationConfig stationConfig, IEnumerable : GameRuleSystem where T [Dependency] private readonly IGameTiming _timing = default!; [Dependency] protected readonly IMapManager MapManager = default!; [Dependency] protected readonly IPrototypeManager PrototypeManager = default!; - [Dependency] protected readonly IRobustRandom RobustRandom = default!; [Dependency] private readonly AtmosphereSystem _atmosphere = default!; [Dependency] protected readonly ChatSystem ChatSystem = default!; [Dependency] protected readonly SharedAudioSystem Audio = default!; @@ -135,79 +134,6 @@ protected void ForceEndSelf(EntityUid uid, GameRuleComponent? component = null) GameTicker.EndGameRule(uid, component); } - protected bool TryGetRandomStation([NotNullWhen(true)] out EntityUid? station, Func? filter = null) - { - var stations = new ValueList(Count()); - - filter ??= _ => true; - var query = AllEntityQuery(); - - while (query.MoveNext(out var uid, out _)) - { - if (!filter(uid)) - continue; - - stations.Add(uid); - } - - if (stations.Count == 0) - { - station = null; - return false; - } - - // TODO: Engine PR. - station = stations[RobustRandom.Next(stations.Count)]; - return true; - } - - protected bool TryFindRandomTile(out Vector2i tile, [NotNullWhen(true)] out EntityUid? targetStation, out EntityUid targetGrid, out EntityCoordinates targetCoords) - { - tile = default; - - targetCoords = EntityCoordinates.Invalid; - if (!TryGetRandomStation(out targetStation)) - { - targetStation = EntityUid.Invalid; - targetGrid = EntityUid.Invalid; - return false; - } - var possibleTargets = Comp(targetStation.Value).Grids; - if (possibleTargets.Count == 0) - { - targetGrid = EntityUid.Invalid; - return false; - } - - targetGrid = RobustRandom.Pick(possibleTargets); - - if (!TryComp(targetGrid, out var gridComp)) - return false; - - var found = false; - var (gridPos, _, gridMatrix) = _transform.GetWorldPositionRotationMatrix(targetGrid); - var gridBounds = gridMatrix.TransformBox(gridComp.LocalAABB); - - for (var i = 0; i < 10; i++) - { - var randomX = RobustRandom.Next((int) gridBounds.Left, (int) gridBounds.Right); - var randomY = RobustRandom.Next((int) gridBounds.Bottom, (int) gridBounds.Top); - - tile = new Vector2i(randomX - (int) gridPos.X, randomY - (int) gridPos.Y); - if (_atmosphere.IsTileSpace(targetGrid, Transform(targetGrid).MapUid, tile, - mapGridComp: gridComp) - || _atmosphere.IsTileAirBlocked(targetGrid, tile, mapGridComp: gridComp)) - { - continue; - } - - found = true; - targetCoords = gridComp.GridTileToLocal(tile); - break; - } - - return found; - } public float GetSeverityModifier() { var ev = new GetSeverityModifierEvent(); diff --git a/Content.Shared/Storage/EntitySpawnEntry.cs b/Content.Shared/Storage/EntitySpawnEntry.cs index 96fb9f9f405..792459c72f7 100644 --- a/Content.Shared/Storage/EntitySpawnEntry.cs +++ b/Content.Shared/Storage/EntitySpawnEntry.cs @@ -12,14 +12,12 @@ namespace Content.Shared.Storage; [DataDefinition] public partial struct EntitySpawnEntry { - [ViewVariables(VVAccess.ReadWrite)] - [DataField("id", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string? PrototypeId = null; + [DataField("id")] + public EntProtoId? PrototypeId = null; /// /// The probability that an item will spawn. Takes decimal form so 0.05 is 5%, 0.50 is 50% etc. /// - [ViewVariables(VVAccess.ReadWrite)] [DataField("prob")] public float SpawnProbability = 1; /// @@ -43,19 +41,16 @@ public partial struct EntitySpawnEntry /// /// /// - [ViewVariables(VVAccess.ReadWrite)] [DataField("orGroup")] public string? GroupId = null; - [ViewVariables(VVAccess.ReadWrite)] - [DataField("amount")] public int Amount = 1; + [DataField] public int Amount = 1; /// /// How many of this can be spawned, in total. /// If this is lesser or equal to , it will spawn exactly. /// Otherwise, it chooses a random value between and on spawn. /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("maxAmount")] public int MaxAmount = 1; + [DataField] public int MaxAmount = 1; public EntitySpawnEntry() { } } diff --git a/Resources/Prototypes/Entities/Objects/Power/lights.yml b/Resources/Prototypes/Entities/Objects/Power/lights.yml index b23b226a2cf..0dbee48110a 100644 --- a/Resources/Prototypes/Entities/Objects/Power/lights.yml +++ b/Resources/Prototypes/Entities/Objects/Power/lights.yml @@ -127,6 +127,19 @@ lightRadius: 6 lightSoftness: 1.1 +- type: entity + parent: LightBulb + name: old incandescent light bulb + id: LightBulbOld + description: An aging light bulb. + components: + - type: LightBulb + bulb: Bulb + color: "#FFD1A3" # 4000K color temp + lightEnergy: 0.3 # old incandescents just arent as bright + lightRadius: 6 + lightSoftness: 1.1 + - type: entity suffix: Broken parent: BaseLightbulb @@ -164,6 +177,19 @@ lightSoftness: 1 PowerUse: 25 +- type: entity + parent: LightTube + name: old fluorescent light tube + id: LightTubeOld + description: An aging light fixture. + components: + - type: LightBulb + color: "#FFDABB" # old fluorescents are yellower-4500K temp + lightEnergy: 0.5 + lightRadius: 10 + lightSoftness: 1 + PowerUse: 10 + - type: entity suffix: Broken parent: BaseLightTube diff --git a/Resources/Prototypes/Entities/Structures/Walls/walls.yml b/Resources/Prototypes/Entities/Structures/Walls/walls.yml index 140e1f1a8a7..c0c027b8b28 100644 --- a/Resources/Prototypes/Entities/Structures/Walls/walls.yml +++ b/Resources/Prototypes/Entities/Structures/Walls/walls.yml @@ -550,7 +550,8 @@ 3: { state: reinf_construct-3, visible: true} 4: { state: reinf_construct-4, visible: true} 5: { state: reinf_construct-5, visible: true} - - type: StaticPrice #DynamicPrice + - type: ReinforcedWallReplacementMarker + - type: StaticPrice price: 150 - type: RadiationBlocker resistance: 5 @@ -843,6 +844,7 @@ - RCDDeconstructWhitelist - type: Sprite sprite: Structures/Walls/solid.rsi + - type: WallReplacementMarker - type: Construction graph: Girder node: wall diff --git a/Resources/Prototypes/GameRules/roundstart.yml b/Resources/Prototypes/GameRules/roundstart.yml index e967700fae4..9961987cb4f 100644 --- a/Resources/Prototypes/GameRules/roundstart.yml +++ b/Resources/Prototypes/GameRules/roundstart.yml @@ -125,3 +125,22 @@ noSpawn: true components: - type: RampingStationEventScheduler + +# variation passes +- type: entity + id: BasicRoundstartVariation + parent: BaseGameRule + noSpawn: true + components: + - type: RoundstartStationVariationRule + rules: + - id: BasicPoweredLightVariationPass + - id: BasicTrashVariationPass + - id: SolidWallRustingVariationPass + - id: ReinforcedWallRustingVariationPass + - id: BasicPuddleMessVariationPass + prob: 0.99 + orGroup: puddleMess + - id: BloodbathPuddleMessVariationPass + prob: 0.01 + orGroup: puddleMess diff --git a/Resources/Prototypes/GameRules/variation.yml b/Resources/Prototypes/GameRules/variation.yml new file mode 100644 index 00000000000..bb9649fddd1 --- /dev/null +++ b/Resources/Prototypes/GameRules/variation.yml @@ -0,0 +1,120 @@ +# Base + +- type: entity + id: BaseVariationPass + parent: BaseGameRule + abstract: true + noSpawn: true + components: + - type: StationVariationPassRule + +# Actual rules + +- type: entity + id: BasicPoweredLightVariationPass + parent: BaseVariationPass + noSpawn: true + components: + - type: PoweredLightVariationPass + +- type: entity + id: SolidWallRustingVariationPass + parent: BaseVariationPass + noSpawn: true + components: + - type: WallReplaceVariationPass + - type: EntityReplaceVariationPass + entitiesPerReplacementAverage: 10 + entitiesPerReplacementStdDev: 2 + replacements: + - id: WallSolidRust + +- type: entity + id: ReinforcedWallRustingVariationPass + parent: BaseVariationPass + noSpawn: true + components: + - type: ReinforcedWallReplaceVariationPass + - type: EntityReplaceVariationPass + entitiesPerReplacementAverage: 12 + entitiesPerReplacementStdDev: 2 + replacements: + - id: WallReinforcedRust + +- type: entity + id: BasicTrashVariationPass + parent: BaseVariationPass + noSpawn: true + components: + - type: EntitySpawnVariationPass + tilesPerEntityAverage: 35 + tilesPerEntityStdDev: 4 + entities: + - id: RandomSpawner + +- type: weightedRandomFillSolution + id: RandomFillTrashPuddle + fills: + - quantity: 80 + weight: 5 + reagents: + - Vomit + - InsectBlood + - WeldingFuel + - Mold + - quantity: 55 + weight: 4 + reagents: + - PlantBGone + - Potassium # :trollface: + - VentCrud + - Carbon + - Hydrogen + - Fat + - SpaceLube + - SpaceGlue + - Sulfur + - Acetone + - Bleach + - quantity: 40 + weight: 3 + reagents: + - Blood + - CopperBlood + - Slime + - quantity: 25 + weight: 1 + reagents: + - Omnizine + - Desoxyephedrine + - Napalm + - Radium + - Gold + - Silver + - Sodium + +- type: weightedRandomFillSolution + id: RandomFillTrashPuddleBloodbath + fills: + - quantity: 80 + weight: 1 + reagents: + - Blood + +- type: entity + id: BasicPuddleMessVariationPass + parent: BaseVariationPass + noSpawn: true + components: + - type: PuddleMessVariationPass + randomPuddleSolutionFill: RandomFillTrashPuddle + +- type: entity + id: BloodbathPuddleMessVariationPass + parent: BaseVariationPass + noSpawn: true + components: + - type: PuddleMessVariationPass + tilesPerSpillAverage: 150 + tilesPerSpillStdDev: 10 + randomPuddleSolutionFill: RandomFillTrashPuddleBloodbath diff --git a/Resources/Prototypes/game_presets.yml b/Resources/Prototypes/game_presets.yml index 1c27a203466..ee015a913c7 100644 --- a/Resources/Prototypes/game_presets.yml +++ b/Resources/Prototypes/game_presets.yml @@ -7,6 +7,7 @@ description: survival-description rules: - RampingStationEventScheduler + - BasicRoundstartVariation - type: gamePreset id: AllAtOnce @@ -30,6 +31,7 @@ description: extended-description rules: - BasicStationEventScheduler + - BasicRoundstartVariation - type: gamePreset id: Greenshift @@ -39,6 +41,8 @@ name: greenshift-title showInVote: false #4boring4vote description: greenshift-description + rules: + - BasicRoundstartVariation - type: gamePreset id: Secret @@ -72,6 +76,7 @@ rules: - Traitor - BasicStationEventScheduler + - BasicRoundstartVariation - type: gamePreset id: Deathmatch @@ -96,6 +101,7 @@ rules: - Nukeops - BasicStationEventScheduler + - BasicRoundstartVariation - type: gamePreset id: Revolutionary @@ -109,6 +115,7 @@ rules: - Revolutionary - BasicStationEventScheduler + - BasicRoundstartVariation - type: gamePreset id: Zombie @@ -124,6 +131,7 @@ rules: - Zombie - BasicStationEventScheduler + - BasicRoundstartVariation - type: gamePreset id: Pirates @@ -135,3 +143,4 @@ rules: - Pirates - BasicStationEventScheduler + - BasicRoundstartVariation From 0d3046e618577b6a4533339c0de9471fc3d31ce1 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 31 Jan 2024 05:53:41 +0000 Subject: [PATCH 081/266] Automatic changelog update (cherry picked from commit 9556c2bc04b912ff98dc42a5b53f3aea3c4df942) --- Resources/Changelog/Changelog.yml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 35fdade4da4..026b1d249fc 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: IProduceWidgets - changes: - - message: Pill canisters are slightly better than cig packs, go talk to the chemists. - type: Tweak - id: 5337 - time: '2023-12-12T07:51:38.0000000+00:00' - author: IProduceWidgets changes: - message: Sec belt holds sidearms and sidearm ammo. @@ -3838,3 +3832,12 @@ id: 5836 time: '2024-01-31T05:00:41.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24759 +- author: mirrorcult + changes: + - message: Various aspects of the station will now be varied automatically at the + start of the round. Expect more trash, some broken/oddly-functioning lights, + and spills (and more stuff in the future). + type: Add + id: 5837 + time: '2024-01-31T05:52:35.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24397 From 36e68d21761f721e16bf7318bbae2dd5428a25bb Mon Sep 17 00:00:00 2001 From: marboww <152051971+marboww@users.noreply.github.com> Date: Wed, 31 Jan 2024 14:46:14 +0700 Subject: [PATCH 082/266] Removing the embedding function of pens. (#24760) Removing the embedding function (cherry picked from commit ae7c57a9a072a02f885ef5de7d8244b57555942b) --- .../Prototypes/Entities/Objects/Misc/paper.yml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/Resources/Prototypes/Entities/Objects/Misc/paper.yml b/Resources/Prototypes/Entities/Objects/Misc/paper.yml index 86dadb8da84..0c8a5ea055e 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/paper.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/paper.yml @@ -261,15 +261,6 @@ - type: PhysicalComposition materialComposition: Steel: 25 - - type: EmbeddableProjectile - offset: 0.3,0.0 - removalTime: 0.0 - - type: ThrowingAngle - angle: 315 - - type: DamageOtherOnHit - damage: - types: - Piercing: 3 #TODO: I want the luxury pen to write a cool font like Merriweather in the future. @@ -303,10 +294,6 @@ damage: types: Piercing: 15 - - type: DamageOtherOnHit - damage: - types: - Piercing: 15 - type: Tool qualities: - Screwing From f77099fa2825528da016cf4971182a3e227d5d11 Mon Sep 17 00:00:00 2001 From: Pancake Date: Wed, 31 Jan 2024 03:20:54 -0800 Subject: [PATCH 083/266] Add Secret Extended and Secret Greenshift (#24615) * Update game_presets.yml Added Secret Extended and Secret Greenshift. * Update game_presets.yml (cherry picked from commit c181ba4baeee9a0b7ed88926942c9bc814fdd18e) --- Resources/Prototypes/game_presets.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Resources/Prototypes/game_presets.yml b/Resources/Prototypes/game_presets.yml index ee015a913c7..dcac598c6ec 100644 --- a/Resources/Prototypes/game_presets.yml +++ b/Resources/Prototypes/game_presets.yml @@ -55,6 +55,24 @@ rules: - Secret +- type: gamePreset + id: SecretExtended #For Admin Use: Runs Extended but shows "Secret" in lobby. + alias: + - secretextended + name: secret-title + showInVote: false #Admin Use + description: secret-description + rules: + - BasicStationEventScheduler + +- type: gamePreset + id: SecretGreenshift #For Admin Use: Runs Greenshift but shows "Secret" in lobby. + alias: + - secretgreenshift + name: secret-title + showInVote: false #Admin Use + description: secret-description + - type: gamePreset id: Sandbox alias: From 055ee1e2056fc5c383f59c467f5b371938c35aef Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 31 Jan 2024 11:24:56 +0000 Subject: [PATCH 084/266] Automatic changelog update (cherry picked from commit 2a5f5299f0ed6ecec6ccc99109788f487c7c3793) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 026b1d249fc..fc45a2786cb 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: IProduceWidgets - changes: - - message: Sec belt holds sidearms and sidearm ammo. - type: Tweak - id: 5338 - time: '2023-12-12T07:52:26.0000000+00:00' - author: IProduceWidgets changes: - message: The syndie holster now holds the guns you always wanted it to. @@ -3841,3 +3835,10 @@ id: 5837 time: '2024-01-31T05:52:35.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24397 +- author: metalgearsloth + changes: + - message: Remove handheld crew monitors in lieu of computers. + type: Remove + id: 5838 + time: '2024-01-31T11:23:49.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24761 From b844de139bbfa4aa1a3843c1c990ddb4b0b9ecd2 Mon Sep 17 00:00:00 2001 From: Hmeister-real <118129069+Hmeister-real@users.noreply.github.com> Date: Wed, 31 Jan 2024 11:26:46 +0000 Subject: [PATCH 085/266] Add a few new ways to laugh and cry with emotes (#24585) * Add a few new speech emoted for Cry and Laugh * Remove Pouting me dumb and silly (cherry picked from commit f511f60fb42588c0a8f656b2e013d3722dd41d8d) --- Resources/Prototypes/Voice/speech_emotes.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/Resources/Prototypes/Voice/speech_emotes.yml b/Resources/Prototypes/Voice/speech_emotes.yml index 8473560f150..5950ac88576 100644 --- a/Resources/Prototypes/Voice/speech_emotes.yml +++ b/Resources/Prototypes/Voice/speech_emotes.yml @@ -52,6 +52,15 @@ - giggles! - giggling - giggled + - chortle + - chortle. + - chortle! + - chortles + - chortles. + - chortles! + - chortling + - chortling. + - chortling! - type: emote id: Honk @@ -99,6 +108,14 @@ - cries - cries. - cries! + - sob + - sob. + - sobs + - sobs. + - sobs! + - sobbing + - sobbing. + - sobbing! - type: emote id: Squish From 1444c3b332d2c52f88892ed081812c26c052b809 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 31 Jan 2024 11:27:52 +0000 Subject: [PATCH 086/266] Automatic changelog update (cherry picked from commit 1f389d7a3916be1153c068fdaebb5d36e5c62f7a) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index fc45a2786cb..8f795b7b347 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: IProduceWidgets - changes: - - message: The syndie holster now holds the guns you always wanted it to. - type: Tweak - id: 5339 - time: '2023-12-12T07:53:00.0000000+00:00' - author: IProduceWidgets changes: - message: Jar now fills. @@ -3842,3 +3836,10 @@ id: 5838 time: '2024-01-31T11:23:49.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24761 +- author: Hmeister-real + changes: + - message: You can now Sob and Chortle with emotes + type: Tweak + id: 5839 + time: '2024-01-31T11:26:46.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24585 From 36e28ecfcf96ac833dce3fd9a82974552ab3627a Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Thu, 1 Feb 2024 00:01:52 +1100 Subject: [PATCH 087/266] Firestarter fixes (#24647) * Firestarter fixes - Actually networks the action. - Namespace fixes. * No networky for you (cherry picked from commit a6ea8b210db079d30823e7b4d8faa32aefa17582) --- .../Atmos/EntitySystems/FirestarterSystem.cs | 8 ++++++ .../EntitySystems}/FirestarterSystem.cs | 25 ++++++++++--------- .../Components}/FirestarterComponent.cs | 16 ++++++------ .../EntitySystems}/SharedFirestarterSystem.cs | 6 +++-- 4 files changed, 33 insertions(+), 22 deletions(-) create mode 100644 Content.Client/Atmos/EntitySystems/FirestarterSystem.cs rename Content.Server/{Abilities/Firestarter => Atmos/EntitySystems}/FirestarterSystem.cs (78%) rename Content.Shared/{Abilities/Firestarter => Atmos/Components}/FirestarterComponent.cs (62%) rename Content.Shared/{Abilities/Firestarter => Atmos/EntitySystems}/SharedFirestarterSystem.cs (76%) diff --git a/Content.Client/Atmos/EntitySystems/FirestarterSystem.cs b/Content.Client/Atmos/EntitySystems/FirestarterSystem.cs new file mode 100644 index 00000000000..32949599158 --- /dev/null +++ b/Content.Client/Atmos/EntitySystems/FirestarterSystem.cs @@ -0,0 +1,8 @@ +using Content.Shared.Atmos.EntitySystems; + +namespace Content.Client.Atmos.EntitySystems; + +public sealed class FirestarterSystem : SharedFirestarterSystem +{ + +} diff --git a/Content.Server/Abilities/Firestarter/FirestarterSystem.cs b/Content.Server/Atmos/EntitySystems/FirestarterSystem.cs similarity index 78% rename from Content.Server/Abilities/Firestarter/FirestarterSystem.cs rename to Content.Server/Atmos/EntitySystems/FirestarterSystem.cs index 9ad8bdac7c5..801ad202323 100644 --- a/Content.Server/Abilities/Firestarter/FirestarterSystem.cs +++ b/Content.Server/Atmos/EntitySystems/FirestarterSystem.cs @@ -1,24 +1,26 @@ +using Content.Server.Atmos.Components; using Content.Shared.Actions.Events; +using Content.Shared.Atmos.Components; +using Content.Shared.Atmos.EntitySystems; +using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; using Robust.Shared.Map; -using Content.Server.Atmos.Components; -using Content.Server.Atmos.EntitySystems; -using Robust.Shared.Audio.Systems; -using Content.Shared.Abilities.Firestarter; + +namespace Content.Server.Atmos.EntitySystems; /// /// Adds an action ability that will cause all flammable targets in a radius to ignite, also heals the owner /// of the component when used. /// -namespace Content.Server.Abilities.Firestarter; - -public sealed class FirestarterSystem : EntitySystem +public sealed class FirestarterSystem : SharedFirestarterSystem { [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly FlammableSystem _flammable = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedContainerSystem _container = default!; + private readonly HashSet> _flammables = new(); + public override void Initialize() { base.Initialize(); @@ -26,11 +28,10 @@ public override void Initialize() } /// - /// Checks Radius for igniting nearby flammable objects . + /// Checks Radius for igniting nearby flammable objects /// private void OnStartFire(EntityUid uid, FirestarterComponent component, FireStarterActionEvent args) { - if (_container.IsEntityOrParentInContainer(uid)) return; @@ -47,10 +48,10 @@ private void OnStartFire(EntityUid uid, FirestarterComponent component, FireStar /// public void IgniteNearby(EntityUid uid, EntityCoordinates coordinates, float severity, float radius) { - var flammables = new HashSet>(); - _lookup.GetEntitiesInRange(coordinates, radius, flammables); + _flammables.Clear(); + _lookup.GetEntitiesInRange(coordinates, radius, _flammables); - foreach (var flammable in flammables) + foreach (var flammable in _flammables) { var ent = flammable.Owner; var stackAmount = 2 + (int) (severity / 0.15f); diff --git a/Content.Shared/Abilities/Firestarter/FirestarterComponent.cs b/Content.Shared/Atmos/Components/FirestarterComponent.cs similarity index 62% rename from Content.Shared/Abilities/Firestarter/FirestarterComponent.cs rename to Content.Shared/Atmos/Components/FirestarterComponent.cs index d236b5cba6a..f8d544e6b8d 100644 --- a/Content.Shared/Abilities/Firestarter/FirestarterComponent.cs +++ b/Content.Shared/Atmos/Components/FirestarterComponent.cs @@ -1,9 +1,9 @@ -using Robust.Shared.Prototypes; +using Content.Shared.Atmos.EntitySystems; using Robust.Shared.Audio; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; -namespace Content.Shared.Abilities.Firestarter; +namespace Content.Shared.Atmos.Components; /// /// Lets its owner entity ignite flammables around it and also heal some damage. @@ -14,21 +14,21 @@ public sealed partial class FirestarterComponent : Component /// /// Radius of objects that will be ignited if flammable. /// - [DataField("ignitionRadius")] + [DataField] public float IgnitionRadius = 4f; /// /// The action entity. /// - [DataField("fireStarterAction", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string? FireStarterAction = "ActionFireStarter"; + [DataField] + public EntProtoId? FireStarterAction = "ActionFireStarter"; - [DataField("fireStarterActionEntity")] public EntityUid? FireStarterActionEntity; + [DataField] public EntityUid? FireStarterActionEntity; /// /// Radius of objects that will be ignited if flammable. /// - [DataField("igniteSound")] + [DataField] public SoundSpecifier IgniteSound = new SoundPathSpecifier("/Audio/Magic/rumble.ogg"); } diff --git a/Content.Shared/Abilities/Firestarter/SharedFirestarterSystem.cs b/Content.Shared/Atmos/EntitySystems/SharedFirestarterSystem.cs similarity index 76% rename from Content.Shared/Abilities/Firestarter/SharedFirestarterSystem.cs rename to Content.Shared/Atmos/EntitySystems/SharedFirestarterSystem.cs index 5e4d4347d18..584e502db16 100644 --- a/Content.Shared/Abilities/Firestarter/SharedFirestarterSystem.cs +++ b/Content.Shared/Atmos/EntitySystems/SharedFirestarterSystem.cs @@ -1,8 +1,9 @@ using Content.Shared.Actions; +using Content.Shared.Atmos.Components; -namespace Content.Shared.Abilities.Firestarter; +namespace Content.Shared.Atmos.EntitySystems; -public sealed class SharedFirestarterSystem : EntitySystem +public abstract class SharedFirestarterSystem : EntitySystem { [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; @@ -18,5 +19,6 @@ public override void Initialize() private void OnComponentInit(EntityUid uid, FirestarterComponent component, ComponentInit args) { _actionsSystem.AddAction(uid, ref component.FireStarterActionEntity, component.FireStarterAction, uid); + Dirty(uid, component); } } From 86a9930c714f38bccc08f800c2abcb4a4527c313 Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Thu, 1 Feb 2024 00:05:28 +0300 Subject: [PATCH 088/266] Anomaly bug fix (#24783) fix (cherry picked from commit 884a5441202dfbfe715460d3cea76ebf0dbcc550) --- Content.Shared/Anomaly/SharedAnomalySystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/Anomaly/SharedAnomalySystem.cs b/Content.Shared/Anomaly/SharedAnomalySystem.cs index dcf7cae2159..5c9739da72d 100644 --- a/Content.Shared/Anomaly/SharedAnomalySystem.cs +++ b/Content.Shared/Anomaly/SharedAnomalySystem.cs @@ -426,7 +426,7 @@ public partial record struct AnomalySpawnSettings() /// /// should entities block spawning? /// - public bool CanSpawnOnEntities { get; set; } = true; + public bool CanSpawnOnEntities { get; set; } = false; /// /// The minimum number of entities that spawn per pulse From c876e4d97527d2108b74a23673f720ab76f2e49e Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 31 Jan 2024 21:06:34 +0000 Subject: [PATCH 089/266] Automatic changelog update (cherry picked from commit 6e68a6ca10d84c90370c94af9e7ca14a6c8fb7b9) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 8f795b7b347..f25a09f35c7 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: IProduceWidgets - changes: - - message: Jar now fills. - type: Tweak - id: 5340 - time: '2023-12-12T07:54:15.0000000+00:00' - author: IProduceWidgets changes: - message: Cig Cartons are slightly smaller. @@ -3843,3 +3837,10 @@ id: 5839 time: '2024-01-31T11:26:46.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24585 +- author: TheShuEd + changes: + - message: Anomalies can no longer spawn entities in walls or other objects. + type: Fix + id: 5840 + time: '2024-01-31T21:05:29.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24783 From c36c8b53c0f50cde7ca6a99b3d03e9b3f4ff0a8c Mon Sep 17 00:00:00 2001 From: EdenTheLiznerd <138748328+EdenTheLiznerd@users.noreply.github.com> Date: Wed, 31 Jan 2024 17:28:42 -0700 Subject: [PATCH 090/266] Removes Syndicate headset from uplink and changes TC prices around to be slightly viable (#24765) * Viability!!! Removes the uplink headset as suggested, changes around TC prices to make a few things more viable * Binary 1 TC Changes the Encryption Binary Key to a simple 1, I don't think I've ever seen it be used before and 1 seems like a proper price for it (cherry picked from commit cb2985eabce286ba40974dcb365ec4668a6b7541) --- .../Prototypes/Catalog/uplink_catalog.yml | 21 +++++-------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index 6ebf99fedab..78ff3df761f 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -81,7 +81,7 @@ description: uplink-disposable-turret-desc productEntity: ToolboxElectricalTurretFilled cost: - Telecrystal: 8 + Telecrystal: 6 categories: - UplinkWeapons conditions: @@ -219,7 +219,7 @@ icon: { sprite: /Textures/Objects/Misc/bureaucracy.rsi, state: pen } productEntity: PenExplodingBox cost: - Telecrystal: 5 + Telecrystal: 4 categories: - UplinkExplosives @@ -305,7 +305,7 @@ icon: { sprite: /Textures/Objects/Weapons/Guns/Ammunition/Magazine/Pistol/smg_mag.rsi, state: red-icon } productEntity: MagazinePistolSubMachineGun cost: - Telecrystal: 3 + Telecrystal: 2 categories: - UplinkAmmo conditions: @@ -334,7 +334,7 @@ icon: { sprite: /Textures/Objects/Weapons/Guns/Ammunition/SpeedLoaders/Magnum/magnum_speed_loader.rsi, state: icon } productEntity: SpeedLoaderMagnumAP cost: - Telecrystal: 2 + Telecrystal: 3 categories: - UplinkAmmo @@ -508,17 +508,6 @@ categories: - UplinkUtility -#TODO: Remove this from the uplink -- type: listing - id: UplinkHeadset - name: uplink-headset-name - description: uplink-headset-desc - productEntity: ClothingHeadsetAltSyndicate - cost: - Telecrystal: 1 - categories: - - UplinkUtility - - type: listing id: UplinkHeadsetEncryptionKey name: uplink-encryption-key-name @@ -537,7 +526,7 @@ icon: { sprite: /Textures/Objects/Devices/encryption_keys.rsi, state: rd_label } productEntity: EncryptionKeyBinary cost: - Telecrystal: 4 + Telecrystal: 1 categories: - UplinkUtility From 9a83a0646b0559565ea77a2c35c6f9279c714265 Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 1 Feb 2024 00:29:48 +0000 Subject: [PATCH 091/266] Automatic changelog update (cherry picked from commit ff090878e73bab3bcc7382197a0406fa88642482) --- Resources/Changelog/Changelog.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index f25a09f35c7..6b1ed4bfab9 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: IProduceWidgets - changes: - - message: Cig Cartons are slightly smaller. - type: Tweak - id: 5341 - time: '2023-12-12T07:55:56.0000000+00:00' - author: IProduceWidgets changes: - message: Cigar cases can now hold Small items. @@ -3844,3 +3838,11 @@ id: 5840 time: '2024-01-31T21:05:29.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24783 +- author: EdenTheLiznerd + changes: + - message: The Syndicate has changed around their stock prices and gotten rid of + some old dusty headsets + type: Tweak + id: 5841 + time: '2024-02-01T00:28:42.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24765 From 4c7c904549ec17f17afa19e360ec53295994b7b5 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Thu, 1 Feb 2024 01:33:10 +0100 Subject: [PATCH 092/266] Remove vehicles (#24681) * Remove wheelchairs Vehicle code is dogwater and wheelchairs just keeps exposing edgecases. If someone wants it brought it back they can do vehicle refactor. * Also this one * Remove vehicles * goodbye vehicles * Remove this check * sasd * Cronch * Add sprites back * jani (cherry picked from commit d2f20d8955a25a32aa5fb9b3631a41921b464cd4) --- Content.Client/Buckle/BuckleSystem.cs | 4 - Content.Client/Vehicle/VehicleSystem.cs | 80 --- Content.Server/Vehicle/VehicleSystem.cs | 7 - .../Buckle/Components/StrapComponent.cs | 3 +- .../Buckle/SharedBuckleSystem.Buckle.cs | 18 +- Content.Shared/Foldable/FoldableComponent.cs | 4 +- .../Traits/Assorted/LegsParalyzedComponent.cs | 1 - .../Vehicle/Components/InVehicleComponent.cs | 17 - .../Vehicle/Components/RiderComponent.cs | 25 - .../Vehicle/Components/VehicleComponent.cs | 114 ----- .../Vehicle/SharedVehicleSystem.Rider.cs | 41 -- Content.Shared/Vehicle/SharedVehicleSystem.cs | 374 -------------- Resources/Locale/en-US/traits/traits.ftl | 3 - Resources/Locale/en-US/vehicle/vehicle.ftl | 3 - Resources/Migrations/migration.yml | 31 ++ .../Prototypes/Catalog/Cargo/cargo_fun.yml | 10 - .../Prototypes/Catalog/Fills/Crates/fun.yml | 23 - .../Prototypes/Catalog/uplink_catalog.yml | 16 - .../Entities/Clothing/Belt/belts.yml | 1 - .../Entities/Markers/Spawners/vehicles.yml | 83 ---- .../Prototypes/Entities/Mobs/NPCs/silicon.yml | 77 +-- .../Entities/Objects/Vehicles/actions.yml | 10 - .../Entities/Objects/Vehicles/buckleable.yml | 462 ------------------ .../Entities/Objects/Vehicles/keys.yml | 86 ---- .../Entities/Structures/Machines/lathe.yml | 2 - .../Objectives/stealTargetGroups.yml | 7 - Resources/Prototypes/Objectives/thief.yml | 12 - .../Prototypes/Procedural/salvage_rewards.yml | 1 - .../Crafting/Graphs/bots/supplybot.yml | 23 - .../Recipes/Crafting/Graphs/bots/taxibot.yml | 29 -- .../Prototypes/Recipes/Crafting/bots.yml | 26 - .../Prototypes/Recipes/Lathes/medical.yml | 8 - .../Roles/Jobs/Fun/misc_startinggear.yml | 4 +- Resources/Prototypes/Traits/disabilities.yml | 12 - Resources/Prototypes/tags.yml | 8 +- .../Guidebook/Service/Janitorial.xml | 1 - 36 files changed, 40 insertions(+), 1586 deletions(-) delete mode 100644 Content.Client/Vehicle/VehicleSystem.cs delete mode 100644 Content.Server/Vehicle/VehicleSystem.cs delete mode 100644 Content.Shared/Vehicle/Components/InVehicleComponent.cs delete mode 100644 Content.Shared/Vehicle/Components/RiderComponent.cs delete mode 100644 Content.Shared/Vehicle/Components/VehicleComponent.cs delete mode 100644 Content.Shared/Vehicle/SharedVehicleSystem.Rider.cs delete mode 100644 Content.Shared/Vehicle/SharedVehicleSystem.cs delete mode 100644 Resources/Locale/en-US/vehicle/vehicle.ftl delete mode 100644 Resources/Prototypes/Entities/Markers/Spawners/vehicles.yml delete mode 100644 Resources/Prototypes/Entities/Objects/Vehicles/actions.yml delete mode 100644 Resources/Prototypes/Entities/Objects/Vehicles/buckleable.yml delete mode 100644 Resources/Prototypes/Entities/Objects/Vehicles/keys.yml delete mode 100644 Resources/Prototypes/Recipes/Crafting/Graphs/bots/supplybot.yml delete mode 100644 Resources/Prototypes/Recipes/Crafting/Graphs/bots/taxibot.yml diff --git a/Content.Client/Buckle/BuckleSystem.cs b/Content.Client/Buckle/BuckleSystem.cs index 8536c3c4293..fea18e5cf3c 100644 --- a/Content.Client/Buckle/BuckleSystem.cs +++ b/Content.Client/Buckle/BuckleSystem.cs @@ -2,7 +2,6 @@ using Content.Shared.Buckle; using Content.Shared.Buckle.Components; using Content.Shared.Rotation; -using Content.Shared.Vehicle.Components; using Robust.Client.GameObjects; namespace Content.Client.Buckle; @@ -26,9 +25,6 @@ private void OnBuckleAfterAutoHandleState(EntityUid uid, BuckleComponent compone if (!TryComp(uid, out var ownerSprite)) return; - if (HasComp(component.LastEntityBuckledTo)) - return; - // Adjust draw depth when the chair faces north so that the seat back is drawn over the player. // Reset the draw depth when rotated in any other direction. // TODO when ECSing, make this a visualizer diff --git a/Content.Client/Vehicle/VehicleSystem.cs b/Content.Client/Vehicle/VehicleSystem.cs deleted file mode 100644 index 2092163b00e..00000000000 --- a/Content.Client/Vehicle/VehicleSystem.cs +++ /dev/null @@ -1,80 +0,0 @@ -using Content.Shared.Vehicle; -using Content.Shared.Vehicle.Components; -using Robust.Client.GameObjects; -using Robust.Shared.GameStates; - -namespace Content.Client.Vehicle; - -public sealed class VehicleSystem : SharedVehicleSystem -{ - [Dependency] private EyeSystem _eye = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnRiderStartup); - SubscribeLocalEvent(OnRiderShutdown); - SubscribeLocalEvent(OnRiderHandleState); - SubscribeLocalEvent(OnVehicleAppearanceChange); - } - - private void OnRiderStartup(EntityUid uid, RiderComponent component, ComponentStartup args) - { - // Center the player's eye on the vehicle - if (TryComp(uid, out EyeComponent? eyeComp)) - { - _eye.SetTarget(uid, eyeComp.Target ?? component.Vehicle, eyeComp); - } - } - - private void OnRiderShutdown(EntityUid uid, RiderComponent component, ComponentShutdown args) - { - // reset the riders eye centering. - if (TryComp(uid, out EyeComponent? eyeComp)) - { - _eye.SetTarget(uid, null, eyeComp); - } - } - - private void OnRiderHandleState(EntityUid uid, RiderComponent component, ref ComponentHandleState args) - { - if (args.Current is not RiderComponentState state) - return; - - var entity = EnsureEntity(state.Entity, uid); - - if (TryComp(uid, out EyeComponent? eyeComp) && eyeComp.Target == component.Vehicle) - { - _eye.SetTarget(uid, entity, eyeComp); - } - - component.Vehicle = entity; - } - - private void OnVehicleAppearanceChange(EntityUid uid, VehicleComponent component, ref AppearanceChangeEvent args) - { - if (args.Sprite == null) - return; - - if (component.HideRider - && Appearance.TryGetData(uid, VehicleVisuals.HideRider, out var hide, args.Component) - && TryComp(component.LastRider, out var riderSprite)) - riderSprite.Visible = !hide; - - // First check is for the sprite itself - if (Appearance.TryGetData(uid, VehicleVisuals.DrawDepth, out var drawDepth, args.Component)) - args.Sprite.DrawDepth = drawDepth; - - // Set vehicle layer to animated or not (i.e. are the wheels turning or not) - if (component.AutoAnimate - && Appearance.TryGetData(uid, VehicleVisuals.AutoAnimate, out var autoAnimate, args.Component)) - args.Sprite.LayerSetAutoAnimated(VehicleVisualLayers.AutoAnimate, autoAnimate); - } -} - -public enum VehicleVisualLayers : byte -{ - /// Layer for the vehicle's wheels - AutoAnimate, -} diff --git a/Content.Server/Vehicle/VehicleSystem.cs b/Content.Server/Vehicle/VehicleSystem.cs deleted file mode 100644 index f0eea36ffba..00000000000 --- a/Content.Server/Vehicle/VehicleSystem.cs +++ /dev/null @@ -1,7 +0,0 @@ -using Content.Shared.Vehicle; - -namespace Content.Server.Vehicle; - -public sealed class VehicleSystem : SharedVehicleSystem -{ -} diff --git a/Content.Shared/Buckle/Components/StrapComponent.cs b/Content.Shared/Buckle/Components/StrapComponent.cs index b0f37a8dafb..f25e1b03741 100644 --- a/Content.Shared/Buckle/Components/StrapComponent.cs +++ b/Content.Shared/Buckle/Components/StrapComponent.cs @@ -1,6 +1,5 @@ using System.Numerics; using Content.Shared.Alert; -using Content.Shared.Vehicle; using Content.Shared.Whitelist; using Robust.Shared.Audio; using Robust.Shared.GameStates; @@ -9,7 +8,7 @@ namespace Content.Shared.Buckle.Components; [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] -[Access(typeof(SharedBuckleSystem), typeof(SharedVehicleSystem))] +[Access(typeof(SharedBuckleSystem))] public sealed partial class StrapComponent : Component { /// diff --git a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs index cfaea47d304..731b2892aa8 100644 --- a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs +++ b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs @@ -16,7 +16,6 @@ using Content.Shared.Storage.Components; using Content.Shared.Stunnable; using Content.Shared.Throwing; -using Content.Shared.Vehicle.Components; using Content.Shared.Verbs; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Events; @@ -124,16 +123,6 @@ private void OnBuckleDownAttempt(EntityUid uid, BuckleComponent component, DownA private void OnBuckleStandAttempt(EntityUid uid, BuckleComponent component, StandAttemptEvent args) { - //Let entities stand back up while on vehicles so that they can be knocked down when slept/stunned - //This prevents an exploit that allowed people to become partially invulnerable to stuns - //while on vehicles - - if (component.BuckledTo != null) - { - var buckle = component.BuckledTo; - if (TryComp(buckle, out _)) - return; - } if (component.Buckled) args.Cancel(); } @@ -149,8 +138,7 @@ private void OnBuckleUpdateCanMove(EntityUid uid, BuckleComponent component, Upd if (component.LifeStage > ComponentLifeStage.Running) return; - if (component.Buckled && - !HasComp(component.BuckledTo)) // buckle+vehicle shitcode + if (component.Buckled) // buckle shitcode args.Cancel(); } @@ -436,10 +424,6 @@ public bool TryUnbuckle(EntityUid buckleUid, EntityUid userUid, bool force = fal if (HasComp(buckleUid) && buckleUid == userUid) return false; - // If the strap is a vehicle and the rider is not the person unbuckling, return. Unless the rider is crit or dead. - if (TryComp(strapUid, out var vehicle) && vehicle.Rider != userUid && !_mobState.IsIncapacitated(buckleUid)) - return false; - // If the person is crit or dead in any kind of strap, return. This prevents people from unbuckling themselves while incapacitated. if (_mobState.IsIncapacitated(buckleUid) && userUid == buckleUid) return false; diff --git a/Content.Shared/Foldable/FoldableComponent.cs b/Content.Shared/Foldable/FoldableComponent.cs index 7303f64fdbc..1943327c0d7 100644 --- a/Content.Shared/Foldable/FoldableComponent.cs +++ b/Content.Shared/Foldable/FoldableComponent.cs @@ -4,10 +4,10 @@ namespace Content.Shared.Foldable; /// -/// Used to create "foldable structures" that you can pickup like an item when folded. Used for rollerbeds and wheelchairs. +/// Used to create "foldable structures" that you can pickup like an item when folded. /// /// -/// Wiill prevent any insertions into containers while this item is unfolded. +/// Will prevent any insertions into containers while this item is unfolded. /// [RegisterComponent] [NetworkedComponent] diff --git a/Content.Shared/Traits/Assorted/LegsParalyzedComponent.cs b/Content.Shared/Traits/Assorted/LegsParalyzedComponent.cs index 7716749da19..59f9ca758bc 100644 --- a/Content.Shared/Traits/Assorted/LegsParalyzedComponent.cs +++ b/Content.Shared/Traits/Assorted/LegsParalyzedComponent.cs @@ -4,7 +4,6 @@ namespace Content.Shared.Traits.Assorted; /// /// Set player speed to zero and standing state to down, simulating leg paralysis. -/// Used for Wheelchair bound trait. /// [RegisterComponent, NetworkedComponent, Access(typeof(LegsParalyzedSystem))] public sealed partial class LegsParalyzedComponent : Component diff --git a/Content.Shared/Vehicle/Components/InVehicleComponent.cs b/Content.Shared/Vehicle/Components/InVehicleComponent.cs deleted file mode 100644 index 77229f17054..00000000000 --- a/Content.Shared/Vehicle/Components/InVehicleComponent.cs +++ /dev/null @@ -1,17 +0,0 @@ -using Robust.Shared.GameStates; - -namespace Content.Shared.Vehicle.Components -{ - /// - /// Added to objects inside a vehicle to stop people besides the rider from - /// removing them. - /// - [RegisterComponent, NetworkedComponent] - public sealed partial class InVehicleComponent : Component - { - /// - /// The vehicle this rider is currently riding. - /// - [ViewVariables] public VehicleComponent? Vehicle; - } -} diff --git a/Content.Shared/Vehicle/Components/RiderComponent.cs b/Content.Shared/Vehicle/Components/RiderComponent.cs deleted file mode 100644 index a6618842e43..00000000000 --- a/Content.Shared/Vehicle/Components/RiderComponent.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Robust.Shared.GameStates; -using Robust.Shared.Serialization; - -namespace Content.Shared.Vehicle.Components; - -/// -/// Added to people when they are riding in a vehicle -/// used mostly to keep track of them for entityquery. -/// -[RegisterComponent, NetworkedComponent] -public sealed partial class RiderComponent : Component -{ - /// - /// The vehicle this rider is currently riding. - /// - [ViewVariables] public EntityUid? Vehicle; - - public override bool SendOnlyToOwner => true; -} - -[Serializable, NetSerializable] -public sealed class RiderComponentState : ComponentState -{ - public NetEntity? Entity; -} diff --git a/Content.Shared/Vehicle/Components/VehicleComponent.cs b/Content.Shared/Vehicle/Components/VehicleComponent.cs deleted file mode 100644 index a4a4d89a253..00000000000 --- a/Content.Shared/Vehicle/Components/VehicleComponent.cs +++ /dev/null @@ -1,114 +0,0 @@ -using System.Numerics; -using Robust.Shared.Audio; -using Robust.Shared.GameStates; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; - -namespace Content.Shared.Vehicle.Components; - -/// -/// This is particularly for vehicles that use -/// buckle. Stuff like clown cars may need a different -/// component at some point. -/// All vehicles should have Physics, Strap, and SharedPlayerInputMover components. -/// -[AutoGenerateComponentState] -[RegisterComponent, NetworkedComponent] -[Access(typeof(SharedVehicleSystem))] -public sealed partial class VehicleComponent : Component -{ - /// - /// The entity currently riding the vehicle. - /// - [ViewVariables] - [AutoNetworkedField] - public EntityUid? Rider; - - [ViewVariables] - [AutoNetworkedField] - public EntityUid? LastRider; - - /// - /// The base offset for the vehicle (when facing east) - /// - [ViewVariables] - public Vector2 BaseBuckleOffset = Vector2.Zero; - - /// - /// The sound that the horn makes - /// - [DataField("hornSound")] - [ViewVariables(VVAccess.ReadWrite)] - public SoundSpecifier? HornSound = new SoundPathSpecifier("/Audio/Effects/Vehicle/carhorn.ogg") - { - Params = AudioParams.Default.WithVolume(-3f) - }; - - [ViewVariables] - public EntityUid? HonkPlayingStream; - - /// Use ambient sound component for the idle sound. - - [DataField("hornAction", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string? HornAction = "ActionVehicleHorn"; - - /// - /// The action for the horn (if any) - /// - [DataField("hornActionEntity")] - [ViewVariables(VVAccess.ReadWrite)] - public EntityUid? HornActionEntity; - - /// - /// Whether the vehicle has a key currently inside it or not. - /// - [DataField("hasKey")] - [ViewVariables(VVAccess.ReadWrite)] - public bool HasKey; - - /// - /// Determines from which side the vehicle will be displayed on top of the player. - /// - - [DataField("southOver")] - [ViewVariables(VVAccess.ReadWrite)] - public bool SouthOver; - - [DataField("northOver")] - [ViewVariables(VVAccess.ReadWrite)] - public bool NorthOver; - - [DataField("westOver")] - [ViewVariables(VVAccess.ReadWrite)] - public bool WestOver; - - [DataField("eastOver")] - [ViewVariables(VVAccess.ReadWrite)] - public bool EastOver; - - /// - /// What the y buckle offset should be in north / south - /// - [DataField("northOverride")] - [ViewVariables(VVAccess.ReadWrite)] - public float NorthOverride; - - /// - /// What the y buckle offset should be in north / south - /// - [DataField("southOverride")] - [ViewVariables(VVAccess.ReadWrite)] - public float SouthOverride; - - [DataField("autoAnimate")] - [ViewVariables(VVAccess.ReadWrite)] - public bool AutoAnimate = true; - - [DataField("useHand")] - [ViewVariables(VVAccess.ReadWrite)] - public bool UseHand = true; - - [DataField("hideRider")] - [ViewVariables(VVAccess.ReadWrite)] - public bool HideRider; -} diff --git a/Content.Shared/Vehicle/SharedVehicleSystem.Rider.cs b/Content.Shared/Vehicle/SharedVehicleSystem.Rider.cs deleted file mode 100644 index 3acd823c735..00000000000 --- a/Content.Shared/Vehicle/SharedVehicleSystem.Rider.cs +++ /dev/null @@ -1,41 +0,0 @@ -using Content.Shared.Hands; -using Content.Shared.Physics.Pull; -using Content.Shared.Vehicle.Components; -using Robust.Shared.GameStates; - -namespace Content.Shared.Vehicle; - -public abstract partial class SharedVehicleSystem -{ - private void InitializeRider() - { - SubscribeLocalEvent(OnRiderGetState); - SubscribeLocalEvent(OnVirtualItemDeleted); - SubscribeLocalEvent(OnPullAttempt); - } - - private void OnRiderGetState(EntityUid uid, RiderComponent component, ref ComponentGetState args) - { - args.State = new RiderComponentState() - { - Entity = GetNetEntity(component.Vehicle), - }; - } - - /// - /// Kick the rider off the vehicle if they press q / drop the virtual item - /// - private void OnVirtualItemDeleted(EntityUid uid, RiderComponent component, VirtualItemDeletedEvent args) - { - if (args.BlockingEntity == component.Vehicle) - { - _buckle.TryUnbuckle(uid, uid, true); - } - } - - private void OnPullAttempt(EntityUid uid, RiderComponent component, PullAttemptEvent args) - { - if (component.Vehicle != null) - args.Cancelled = true; - } -} diff --git a/Content.Shared/Vehicle/SharedVehicleSystem.cs b/Content.Shared/Vehicle/SharedVehicleSystem.cs deleted file mode 100644 index 50143ae551c..00000000000 --- a/Content.Shared/Vehicle/SharedVehicleSystem.cs +++ /dev/null @@ -1,374 +0,0 @@ -using System.Numerics; -using Content.Shared.Access.Components; -using Content.Shared.Actions; -using Content.Shared.Audio; -using Content.Shared.Buckle; -using Content.Shared.Buckle.Components; -using Content.Shared.Hands; -using Content.Shared.Inventory.VirtualItem; -using Content.Shared.Item; -using Content.Shared.Light.Components; -using Content.Shared.Movement.Components; -using Content.Shared.Movement.Systems; -using Content.Shared.Popups; -using Content.Shared.Tag; -using Content.Shared.Vehicle.Components; -using Robust.Shared.Audio; -using Robust.Shared.Audio.Systems; -using Robust.Shared.Containers; -using Robust.Shared.Network; -using Robust.Shared.Physics.Systems; -using Robust.Shared.Serialization; - -namespace Content.Shared.Vehicle; - -/// -/// Stores the VehicleVisuals and shared event -/// Nothing for a system but these need to be put somewhere in -/// Content.Shared -/// -public abstract partial class SharedVehicleSystem : EntitySystem -{ - [Dependency] private readonly INetManager _netManager = default!; - - [Dependency] protected readonly SharedAppearanceSystem Appearance = default!; - [Dependency] private readonly SharedAudioSystem _audioSystem = default!; - [Dependency] private readonly MovementSpeedModifierSystem _modifier = default!; - [Dependency] private readonly SharedAmbientSoundSystem _ambientSound = default!; - [Dependency] private readonly SharedTransformSystem _transform = default!; - [Dependency] private readonly TagSystem _tagSystem = default!; - [Dependency] private readonly SharedPopupSystem _popupSystem = default!; - [Dependency] private readonly SharedVirtualItemSystem _virtualItemSystem = default!; - [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; - [Dependency] private readonly SharedJointSystem _joints = default!; - [Dependency] private readonly SharedBuckleSystem _buckle = default!; - [Dependency] private readonly SharedMoverController _mover = default!; - - private const string KeySlot = "key_slot"; - - /// - public override void Initialize() - { - base.Initialize(); - InitializeRider(); - - SubscribeLocalEvent(OnVehicleStartup); - SubscribeLocalEvent(OnBuckleChange); - SubscribeLocalEvent(OnHonkAction); - SubscribeLocalEvent(OnEntInserted); - SubscribeLocalEvent(OnEntRemoved); - SubscribeLocalEvent(OnRefreshMovementSpeedModifiers); - SubscribeLocalEvent(OnMoveEvent); - SubscribeLocalEvent(OnGetAdditionalAccess); - - SubscribeLocalEvent(OnGettingPickedUpAttempt); - } - - /// - /// This just controls whether the wheels are turning. - /// - public override void Update(float frameTime) - { - var vehicleQuery = EntityQueryEnumerator(); - while (vehicleQuery.MoveNext(out var uid, out var vehicle, out var mover)) - { - if (!vehicle.AutoAnimate) - continue; - - // Why is this updating appearance data every tick, instead of when it needs to be updated??? - - if (_mover.GetVelocityInput(mover).Sprinting == Vector2.Zero) - { - UpdateAutoAnimate(uid, false); - continue; - } - - UpdateAutoAnimate(uid, true); - } - } - - private void OnVehicleStartup(EntityUid uid, VehicleComponent component, ComponentStartup args) - { - UpdateDrawDepth(uid, 2); - - // This code should be purged anyway but with that being said this doesn't handle components being changed. - if (TryComp(uid, out var strap)) - { - component.BaseBuckleOffset = strap.BuckleOffsetClamped; - strap.BuckleOffset = Vector2.Zero; - } - - _modifier.RefreshMovementSpeedModifiers(uid); - } - - /// - /// Give the user the rider component if they're buckling to the vehicle, - /// otherwise remove it. - /// - private void OnBuckleChange(EntityUid uid, VehicleComponent component, ref BuckleChangeEvent args) - { - // Add Rider - if (args.Buckling) - { - if (component.UseHand == true) - { - // Add a virtual item to rider's hand, unbuckle if we can't. - if (!_virtualItemSystem.TrySpawnVirtualItemInHand(uid, args.BuckledEntity)) - { - _buckle.TryUnbuckle(uid, uid, true); - return; - } - } - // Set up the rider and vehicle with each other - EnsureComp(uid); - var rider = EnsureComp(args.BuckledEntity); - component.Rider = args.BuckledEntity; - component.LastRider = component.Rider; - Dirty(component); - Appearance.SetData(uid, VehicleVisuals.HideRider, true); - - _mover.SetRelay(args.BuckledEntity, uid); - rider.Vehicle = uid; - - // Update appearance stuff, add actions - UpdateBuckleOffset(uid, Transform(uid), component); - if (TryComp(uid, out var mover)) - UpdateDrawDepth(uid, GetDrawDepth(Transform(uid), component, mover.RelativeRotation.Degrees)); - - if (TryComp(args.BuckledEntity, out var actions) && TryComp(uid, out var flashlight)) - { - _actionsSystem.AddAction(args.BuckledEntity, ref flashlight.ToggleActionEntity, flashlight.ToggleAction, uid, actions); - } - - if (component.HornSound != null) - { - _actionsSystem.AddAction(args.BuckledEntity, ref component.HornActionEntity, component.HornAction, uid, actions); - } - - _joints.ClearJoints(args.BuckledEntity); - - _tagSystem.AddTag(uid, "DoorBumpOpener"); - - return; - } - - // Remove rider - - // Clean up actions and virtual items - _actionsSystem.RemoveProvidedActions(args.BuckledEntity, uid); - - if (component.UseHand == true) - _virtualItemSystem.DeleteInHandsMatching(args.BuckledEntity, uid); - - - // Entity is no longer riding - RemComp(args.BuckledEntity); - RemComp(args.BuckledEntity); - _tagSystem.RemoveTag(uid, "DoorBumpOpener"); - - Appearance.SetData(uid, VehicleVisuals.HideRider, false); - // Reset component - component.Rider = null; - Dirty(component); - } - - /// - /// This fires when the rider presses the honk action - /// - private void OnHonkAction(EntityUid uid, VehicleComponent vehicle, HonkActionEvent args) - { - if (args.Handled || vehicle.HornSound == null) - return; - - // TODO: Need audio refactor maybe, just some way to null it when the stream is over. - // For now better to just not loop to keep the code much cleaner. - vehicle.HonkPlayingStream = _audioSystem.PlayPredicted(vehicle.HornSound, uid, uid)?.Entity; - args.Handled = true; - } - - /// - /// Handle adding keys to the ignition, give stuff the InVehicleComponent so it can't be picked - /// up by people not in the vehicle. - /// - private void OnEntInserted(EntityUid uid, VehicleComponent component, EntInsertedIntoContainerMessage args) - { - if (args.Container.ID != KeySlot || - !_tagSystem.HasTag(args.Entity, "VehicleKey")) - return; - - // Enable vehicle - var inVehicle = EnsureComp(args.Entity); - inVehicle.Vehicle = component; - - component.HasKey = true; - - var msg = Loc.GetString("vehicle-use-key", - ("keys", args.Entity), ("vehicle", uid)); - if (_netManager.IsServer) - _popupSystem.PopupEntity(msg, uid, args.OldParent, PopupType.Medium); - - // Audiovisual feedback - _ambientSound.SetAmbience(uid, true); - _modifier.RefreshMovementSpeedModifiers(uid); - } - - /// - /// Turn off the engine when key is removed. - /// - private void OnEntRemoved(EntityUid uid, VehicleComponent component, EntRemovedFromContainerMessage args) - { - if (args.Container.ID != KeySlot || !RemComp(args.Entity)) - return; - - // Disable vehicle - component.HasKey = false; - _ambientSound.SetAmbience(uid, false); - _modifier.RefreshMovementSpeedModifiers(uid); - } - - private void OnRefreshMovementSpeedModifiers(EntityUid uid, VehicleComponent component, RefreshMovementSpeedModifiersEvent args) - { - if (!component.HasKey) - { - args.ModifySpeed(0f, 0f); - } - } - - // TODO: Shitcode, needs to use sprites instead of actual offsets. - private void OnMoveEvent(EntityUid uid, VehicleComponent component, ref MoveEvent args) - { - if (args.NewRotation == args.OldRotation) - return; - - // This first check is just for safety - if (component.AutoAnimate && !HasComp(uid)) - { - UpdateAutoAnimate(uid, false); - return; - } - - UpdateBuckleOffset(uid, args.Component, component); - if (TryComp(uid, out var mover)) - UpdateDrawDepth(uid, GetDrawDepth(args.Component, component, mover.RelativeRotation)); - } - - private void OnGettingPickedUpAttempt(EntityUid uid, InVehicleComponent component, GettingPickedUpAttemptEvent args) - { - if (component.Vehicle == null || component.Vehicle.Rider != null && component.Vehicle.Rider != args.User) - args.Cancel(); - } - - /// - /// Depending on which direction the vehicle is facing, - /// change its draw depth. Vehicles can choose between special drawdetph - /// when facing north or south. East and west are easy. - /// - private int GetDrawDepth(TransformComponent xform, VehicleComponent component, Angle cameraAngle) - { - var itemDirection = cameraAngle.GetDir() switch - { - Direction.South => xform.LocalRotation.GetDir(), - Direction.North => xform.LocalRotation.RotateDir(Direction.North), - Direction.West => xform.LocalRotation.RotateDir(Direction.East), - Direction.East => xform.LocalRotation.RotateDir(Direction.West), - _ => Direction.South - }; - - return itemDirection switch - { - Direction.North => component.NorthOver - ? (int) DrawDepth.DrawDepth.Doors - : (int) DrawDepth.DrawDepth.WallMountedItems, - Direction.South => component.SouthOver - ? (int) DrawDepth.DrawDepth.Doors - : (int) DrawDepth.DrawDepth.WallMountedItems, - Direction.West => component.WestOver - ? (int) DrawDepth.DrawDepth.Doors - : (int) DrawDepth.DrawDepth.WallMountedItems, - Direction.East => component.EastOver - ? (int) DrawDepth.DrawDepth.Doors - : (int) DrawDepth.DrawDepth.WallMountedItems, - _ => (int) DrawDepth.DrawDepth.WallMountedItems - }; - } - - - /// - /// Change the buckle offset based on what direction the vehicle is facing and - /// teleport any buckled entities to it. This is the most crucial part of making - /// buckled vehicles work. - /// - private void UpdateBuckleOffset(EntityUid uid, TransformComponent xform, VehicleComponent component) - { - if (!TryComp(uid, out var strap)) - return; - - // TODO: Strap should handle this but buckle E/C moment. - var oldOffset = strap.BuckleOffset; - - strap.BuckleOffset = xform.LocalRotation.Degrees switch - { - < 45f => new(0, component.SouthOverride), - <= 135f => component.BaseBuckleOffset, - < 225f => new(0, component.NorthOverride), - <= 315f => new(component.BaseBuckleOffset.X * -1, component.BaseBuckleOffset.Y), - _ => new(0, component.SouthOverride) - }; - - if (!oldOffset.Equals(strap.BuckleOffset)) - Dirty(strap); - - foreach (var buckledEntity in strap.BuckledEntities) - { - var buckleXform = Transform(buckledEntity); - _transform.SetLocalPositionNoLerp(buckleXform, strap.BuckleOffsetClamped); - } - } - - private void OnGetAdditionalAccess(EntityUid uid, VehicleComponent component, ref GetAdditionalAccessEvent args) - { - if (component.Rider == null) - return; - args.Entities.Add(component.Rider.Value); - } - - /// - /// Set the draw depth for the sprite. - /// - private void UpdateDrawDepth(EntityUid uid, int drawDepth) - { - Appearance.SetData(uid, VehicleVisuals.DrawDepth, drawDepth); - } - - /// - /// Set whether the vehicle's base layer is animating or not. - /// - private void UpdateAutoAnimate(EntityUid uid, bool autoAnimate) - { - Appearance.SetData(uid, VehicleVisuals.AutoAnimate, autoAnimate); - } -} - -/// -/// Stores the vehicle's draw depth mostly -/// -[Serializable, NetSerializable] -public enum VehicleVisuals : byte -{ - /// - /// What layer the vehicle should draw on (assumed integer) - /// - DrawDepth, - /// - /// Whether the wheels should be turning - /// - AutoAnimate, - HideRider -} - -/// -/// Raised when someone honks a vehicle horn -/// -public sealed partial class HonkActionEvent : InstantActionEvent -{ -} diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index 3a8b1f3b59d..c097a689dd8 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -24,9 +24,6 @@ trait-pirate-accent-desc = You can't stop speaking like a pirate! trait-accentless-name = Accentless trait-accentless-desc = You don't have the accent that your species would usually have -trait-wheelchair-bound-name = Wheelchair Bound -trait-wheelchair-bound-desc = You cannot move without your wheelchair. Wheelchair included. - trait-frontal-lisp-name = Frontal Lisp trait-frontal-lisp-desc = You thpeak with a lithp diff --git a/Resources/Locale/en-US/vehicle/vehicle.ftl b/Resources/Locale/en-US/vehicle/vehicle.ftl deleted file mode 100644 index 0fb99d28c7d..00000000000 --- a/Resources/Locale/en-US/vehicle/vehicle.ftl +++ /dev/null @@ -1,3 +0,0 @@ -vehicle-use-key = You use {THE($keys)} to start {THE($vehicle)}. - -vehicle-slot-component-slot-name-keys = Keys diff --git a/Resources/Migrations/migration.yml b/Resources/Migrations/migration.yml index 22d002d750f..b9df82413e1 100644 --- a/Resources/Migrations/migration.yml +++ b/Resources/Migrations/migration.yml @@ -156,3 +156,34 @@ ClothingHeadHelmetVoidParamed: null # 2024-01-19 DefaultStationBeaconTeslaEngine: null + +# 2024-01-31 +SpawnVehicleWheelchair: null +SpawnVehicleWheelchairFolded: null +VehicleWheelchair: null +VehicleWheelchairFolded: null +VehicleSecwayStealObjective: null +VehicleKeyJanicart: null +VehicleKeySecway: null +VehicleKeyATV: null +VehicleKeySkeleton: null +VehicleKeySyndicateSegway: null +VehicleKeySkeletonMotorcycle: null +VehicleSecway: null +VehicleATV: null +VehicleSyndicateSegway: null +VehicleSkeletonMotorcycle: null +VehicleUnicycle: null +VehicleUnicycleFolded: null +ActionVehicleHorn: null +CrateFunATV: null +CrateFunSyndicateSegway: null +MobTaxiBot: null +MobSupplyBot: null +SpawnVehicleMotobike: null +SpawnVehicleATV: null +SpawnVehicleSecway: null +SpawnVehicleJanicart: null +VehicleJanicart: null +VehicleJanicartDestroyed: null + diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_fun.yml b/Resources/Prototypes/Catalog/Cargo/cargo_fun.yml index e3092724dc6..5bedc9a8610 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_fun.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_fun.yml @@ -118,16 +118,6 @@ category: Fun group: market -- type: cargoProduct - id: FunATV - icon: - sprite: Objects/Vehicles/atv.rsi - state: vehicle - product: CrateFunATV - cost: 1500 - category: Fun - group: market - - type: cargoProduct id: FunSadTromboneImplants icon: diff --git a/Resources/Prototypes/Catalog/Fills/Crates/fun.yml b/Resources/Prototypes/Catalog/Fills/Crates/fun.yml index 3a20d6d47a9..283a70188d8 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/fun.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/fun.yml @@ -183,17 +183,6 @@ - id: DiceBag amount: 6 -- type: entity - id: CrateFunATV - parent: CrateLivestock - name: ATV crate - description: An Absolutely Taxable Vehicle to help cargo with hauling. - components: - - type: StorageFill - contents: - - id: VehicleATV - - id: VehicleKeyATV - - type: entity id: CrateFunSadTromboneImplants parent: CrateGenericSteel @@ -260,17 +249,6 @@ - id: WeaponWaterPistol amount: 4 -- type: entity - id: CrateFunSyndicateSegway - parent: CrateLivestock - name: Syndicate segway crate - description: A crate containing a two-wheeler that will help you escape from the security officers. Or not. - components: - - type: StorageFill - contents: - - id: VehicleSyndicateSegway - - id: VehicleKeySyndicateSegway - - type: entity id: CrateFunBoxing parent: CrateGenericSteel @@ -322,7 +300,6 @@ - id: MrDips orGroup: Giftpool - id: RevolverCapGun - - id: VehicleUnicycleFolded - id: ClothingShoesClownLarge - id: ClothingHeadHatMagician - id: BeachBall diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index 78ff3df761f..5f795595d7d 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -1432,22 +1432,6 @@ categories: - UplinkMisc -- type: listing - id: UplinkSyndicateSegwayCrate - name: uplink-syndicate-segway-crate-name - description: uplink-syndicate-segway-crate-desc - icon: { sprite: /Textures/Objects/Vehicles/syndicatesegway.rsi, state: icon } - productEntity: CrateFunSyndicateSegway - cost: - Telecrystal: 5 - categories: - - UplinkMisc - conditions: - - !type:BuyerWhitelistCondition - blacklist: - components: - - SurplusBundle - - type: listing id: UplinkBribe name: uplink-bribe-name diff --git a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml index 3e083806728..d5976d1ddaa 100644 --- a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml +++ b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml @@ -222,7 +222,6 @@ - HolosignProjector - Plunger - LightReplacer - - JanicartKeys components: - LightReplacer - type: ItemMapper diff --git a/Resources/Prototypes/Entities/Markers/Spawners/vehicles.yml b/Resources/Prototypes/Entities/Markers/Spawners/vehicles.yml deleted file mode 100644 index ee735289203..00000000000 --- a/Resources/Prototypes/Entities/Markers/Spawners/vehicles.yml +++ /dev/null @@ -1,83 +0,0 @@ -- type: entity - name: Secway Spawner - id: SpawnVehicleSecway - parent: MarkerBase - components: - - type: Sprite - layers: - - state: green - - sprite: Objects/Vehicles/secway.rsi - state: keys - - type: ConditionalSpawner - prototypes: - - VehicleSecway - -- type: entity - name: Janicart Spawner - id: SpawnVehicleJanicart - parent: MarkerBase - components: - - type: Sprite - layers: - - state: green - - sprite: Objects/Vehicles/janicart.rsi - state: keys - - type: ConditionalSpawner - prototypes: - - VehicleJanicart - -- type: entity - name: ATV Spawner - id: SpawnVehicleATV - parent: MarkerBase - components: - - type: Sprite - layers: - - state: green - - sprite: Objects/Vehicles/atv.rsi - state: keys - - type: ConditionalSpawner - prototypes: - - VehicleATV - -- type: entity - name: Motobike Spawner - id: SpawnVehicleMotobike - parent: MarkerBase - components: - - type: Sprite - layers: - - state: green - - sprite: Objects/Vehicles/motorbike.rsi - state: keys - - type: ConditionalSpawner - prototypes: - - VehicleSkeletonMotorcycle - -- type: entity - name: Wheelchair Spawner - id: SpawnVehicleWheelchair - parent: MarkerBase - components: - - type: Sprite - layers: - - state: green - - sprite: Objects/Vehicles/wheelchair.rsi - state: vehicle - - type: ConditionalSpawner - prototypes: - - VehicleWheelchair - -- type: entity - name: Wheelchair [Folded] Spawner - id: SpawnVehicleWheelchairFolded - parent: MarkerBase - components: - - type: Sprite - layers: - - state: green - - sprite: Objects/Vehicles/wheelchair.rsi - state: vehicle_folded - - type: ConditionalSpawner - prototypes: - - VehicleWheelchairFolded \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml index cd7882d3d1d..42b7ff9e211 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml @@ -108,77 +108,6 @@ proto: robot - type: ZombieImmune -- type: entity - parent: [ MobSiliconBase, BaseVehicle] - id: MobSiliconBaseVehicle # for vehicles - abstract: true - components: - - type: NoSlip - - type: GhostTakeoverAvailable - - type: GhostRole - makeSentient: true - - type: UnpoweredFlashlight - - type: PointLight - enabled: false - radius: 3.5 - softness: 2 - mask: /Textures/Effects/LightMasks/cone.png - autoRot: true - -- type: entity - parent: MobSiliconBaseVehicle - id: MobTaxiBot - name: taxibot - description: Give a ride? - components: - - type: Sprite - sprite: Mobs/Silicon/Bots/taxibot.rsi - layers: - - state: taxibot - map: ["enum.VehicleVisualLayers.AutoAnimate"] - - type: GhostRole - name: ghost-role-information-taxibot-name - description: ghost-role-information-taxibot-description - - type: Strap - buckleOffset: "0, 0" - maxBuckleDistance: 1 - - type: Construction - graph: TaxiBot - node: bot - -- type: entity - parent: MobSiliconBaseVehicle - id: MobSupplyBot - name: supplybot - description: Delivers cargo! - components: - - type: Sprite - sprite: Mobs/Silicon/Bots/supplybot.rsi - layers: - - state: supplybot - map: ["enum.VehicleVisualLayers.AutoAnimate"] - - type: GhostRole - name: ghost-role-information-supplybot-name - description: ghost-role-information-supplybot-description - - type: Construction - graph: SupplyBot - node: bot - - type: Storage - maxItemSize: Huge - grid: - - 0,0,9,3 - - type: Access - groups: - - Cargo - - type: UserInterface - interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface - - type: ContainerContainer - containers: - storagebase: !type:Container - ents: [] - - type: entity parent: MobSiliconBase id: MobHonkBot @@ -350,12 +279,12 @@ interactSuccessSound: path: /Audio/Ambience/Objects/periodic_beep.ogg - type: ShowHealthBars - damageContainers: + damageContainers: - Biological - type: ShowHealthIcons - damageContainers: + damageContainers: - Biological - + - type: entity parent: MobSiliconBase id: MobMimeBot diff --git a/Resources/Prototypes/Entities/Objects/Vehicles/actions.yml b/Resources/Prototypes/Entities/Objects/Vehicles/actions.yml deleted file mode 100644 index cee03f2d25c..00000000000 --- a/Resources/Prototypes/Entities/Objects/Vehicles/actions.yml +++ /dev/null @@ -1,10 +0,0 @@ -- type: entity - id: ActionVehicleHorn - name: Honk - description: Honk! - noSpawn: true - components: - - type: InstantAction - useDelay: 3.4 - icon: Objects/Fun/bikehorn.rsi/icon.png - event: !type:HonkActionEvent diff --git a/Resources/Prototypes/Entities/Objects/Vehicles/buckleable.yml b/Resources/Prototypes/Entities/Objects/Vehicles/buckleable.yml deleted file mode 100644 index cf30f69754d..00000000000 --- a/Resources/Prototypes/Entities/Objects/Vehicles/buckleable.yml +++ /dev/null @@ -1,462 +0,0 @@ -- type: entity - id: BaseVehicle - save: false - abstract: true - components: - - type: AmbientSound - sound: "/Audio/Effects/Vehicle/vehicleengineidle.ogg" - range: 10 - volume: -10 - enabled: false - - type: MovementSpeedModifier - weightlessModifier: 0 - acceleration: 2 - friction: 2 - frictionNoInput: 6 - baseWalkSpeed: 4.5 - baseSprintSpeed: 6 - - type: Repairable - fuelcost: 20 - doAfterDelay: 20 - - type: Damageable - damageContainer: Inorganic - damageModifierSet: Metallic - - type: Destructible - thresholds: - - trigger: - !type:DamageTrigger - damage: 600 - behaviors: - - !type:DoActsBehavior - acts: [ "Destruction" ] - - trigger: - !type:DamageTrigger - damage: 300 - behaviors: - - !type:DoActsBehavior - acts: ["Destruction"] - - !type:PlaySoundBehavior - sound: - collection: MetalGlassBreak - - !type:ExplodeBehavior - -- type: entity - parent: BaseVehicle - id: BaseVehicleRideable - abstract: true - name: Vehicle - components: - - type: Strap - buckleOffset: "0.10, 0.36" - maxBuckleDistance: 1 - - type: InputMover - - type: InteractionOutline - - type: Vehicle - - type: Pullable - - type: Physics - bodyType: KinematicController - - type: Clickable - - type: Fixtures - fixtures: - fix1: - shape: - !type:PhysShapeCircle - radius: 0.4 - density: 360 - restitution: 0.0 - mask: - - MobMask - layer: - - TableLayer - - type: Appearance - - type: ItemSlots - slots: - key_slot: #this slot name is important - name: vehicle-slot-component-slot-name-keys - whitelist: - requireAll: true - tags: - - VehicleKey - insertSound: - path: /Audio/Effects/Vehicle/vehiclestartup.ogg - params: - volume: -3 - - type: StaticPrice - price: 750 # Grand Theft Auto. - -- type: entity - id: VehicleJanicart - parent: BaseVehicleRideable - name: janicart - description: The janitor's trusty steed. - components: - - type: Vehicle - southOver: true - westOver: true - eastOver: true - northOverride: -0.15 - southOverride: 0.22 - - type: Sprite - sprite: Objects/Vehicles/janicart.rsi - layers: - - state: vehicle - map: ["enum.VehicleVisualLayers.AutoAnimate"] - noRot: true - - type: UnpoweredFlashlight - - type: PointLight - enabled: false - radius: 3.5 - softness: 2 - mask: /Textures/Effects/LightMasks/cone.png - autoRot: true - - type: Destructible - thresholds: - - trigger: - !type:DamageTrigger - damage: 500 - behaviors: - - !type:DoActsBehavior - acts: [ "Destruction" ] - - trigger: - !type:DamageTrigger - damage: 250 - behaviors: - - !type:DoActsBehavior - acts: ["Destruction"] - - !type:PlaySoundBehavior - sound: - collection: MetalGlassBreak - - !type:ExplodeBehavior - - !type:SpawnEntitiesBehavior # in future should also emit a cloud of hot gas - spawn: - VehicleJanicartDestroyed: - min: 1 - max: 1 - - type: ItemSlots - slots: - key_slot: - name: vehicle-slot-component-slot-name-keys - whitelist: - requireAll: true - tags: - - VehicleKey - - JanicartKeys - insertSound: - path: /Audio/Effects/Vehicle/vehiclestartup.ogg - params: - volume: -3 - trashbag_slot: - name: janitorial-trolley-slot-component-slot-name-trashbag - whitelist: - tags: - - TrashBag - - type: ItemMapper - mapLayers: - storage: - whitelist: - tags: - - TrashBag - sprite: Objects/Vehicles/janicart.rsi - - type: Appearance - -- type: entity - id: VehicleJanicartDestroyed - parent: MachineFrameDestroyed - name: destroyed janicart - components: - - type: Sprite - sprite: Objects/Vehicles/janicart.rsi - state: destroyed - -- type: entity - id: VehicleSecway - parent: BaseVehicleRideable - name: secway - description: The future of transportation. Popularized by St. James, the patron saint of security officers and internet forum moderators. - components: - - type: Vehicle - northOver: true - westOver: true - eastOver: true - northOverride: -0.1 - southOverride: 0.1 - hornSound: - path: /Audio/Effects/Vehicle/policesiren.ogg - - type: Sprite - sprite: Objects/Vehicles/secway.rsi - layers: - - state: vehicle - map: ["enum.VehicleVisualLayers.AutoAnimate"] - noRot: true - - type: Strap - buckleOffset: "0.15, -0.05" - maxBuckleDistance: 1 - - type: MovementSpeedModifier - acceleration: 1 - friction: 1 - baseWalkSpeed: 4.5 - baseSprintSpeed: 6 - - type: Armor - modifiers: - coefficients: - Blunt: 0.8 - Slash: 0.6 - Piercing: 0.85 - - type: ItemSlots - slots: - key_slot: - name: vehicle-slot-component-slot-name-keys - whitelist: - requireAll: true - tags: - - VehicleKey - - SecwayKeys - insertSound: - path: /Audio/Effects/Vehicle/vehiclestartup.ogg - params: - volume: -3 - - type: StealTarget - stealGroup: VehicleSecway - -- type: entity - parent: BaseVehicleRideable - id: VehicleATV - name: ATV - description: All-Tile Vehicle. - components: - - type: Vehicle - southOver: true - northOver: true - northOverride: -0.1 - southOverride: 0.1 - - type: Sprite - sprite: Objects/Vehicles/atv.rsi - layers: - - state: vehicle - map: ["enum.VehicleVisualLayers.AutoAnimate"] - noRot: true - - type: RandomMetadata - descriptionSegments: [ATVDescriptions] - - type: MovementSpeedModifier - acceleration: 1 - friction: 1 - baseWalkSpeed: 4.5 - baseSprintSpeed: 7 - - type: Strap - buckleOffset: "0.1, -0.05" - maxBuckleDistance: 1 - - type: UnpoweredFlashlight - - type: PointLight - enabled: false - radius: 3.5 - softness: 2 - mask: /Textures/Effects/LightMasks/cone.png - autoRot: true - - type: ItemSlots - slots: - key_slot: - name: vehicle-slot-component-slot-name-keys - whitelist: - requireAll: true - tags: - - VehicleKey - - ATVKeys - insertSound: - path: /Audio/Effects/Vehicle/vehiclestartup.ogg - params: - volume: -3 - -- type: entity - id: VehicleSyndicateSegway - parent: BaseVehicleRideable - name: syndicate segway - description: Be an enemy of the corporation, in style. - components: - - type: Vehicle - southOver: true - westOver: true - eastOver: true - northOverride: -0.1 - southOverride: 0.1 - hornSound: - path: /Audio/Effects/Vehicle/policesiren.ogg - - type: Sprite - sprite: Objects/Vehicles/syndicatesegway.rsi - layers: - - state: vehicle - map: ["enum.VehicleVisualLayers.AutoAnimate"] - noRot: true - - type: Strap - buckleOffset: "0.15, -0.05" - maxBuckleDistance: 1 - - type: Armor - modifiers: - coefficients: - Blunt: 0.8 - Slash: 0.6 - Piercing: 0.85 - - type: ItemSlots - slots: - key_slot: - name: vehicle-slot-component-slot-name-keys - whitelist: - requireAll: true - tags: - - VehicleKey - - SyndicateSegwayKeys - insertSound: - path: /Audio/Effects/Vehicle/vehiclestartup.ogg - params: - volume: -3 - -- type: entity - parent: BaseVehicleRideable - id: VehicleSkeletonMotorcycle - name: skeleton motorcycle - description: Bad to the Bone. - components: - - type: Vehicle - southOver: true - northOver: true - northOverride: -0.1 - southOverride: 0.1 - - type: Sprite - sprite: Objects/Vehicles/motorbike.rsi - layers: - - state: vehicle - map: ["enum.VehicleVisualLayers.AutoAnimate"] - noRot: true - - type: Strap - buckleOffset: "0.1, -0.05" - maxBuckleDistance: 1 - - type: MovementSpeedModifier - acceleration: 2 - friction: 1.5 - baseWalkSpeed: 4.5 - baseSprintSpeed: 7 - - type: UnpoweredFlashlight - - type: PointLight - enabled: false - radius: 3.5 - softness: 2 - mask: /Textures/Effects/LightMasks/cone.png - autoRot: true - - type: ItemSlots - slots: - key_slot: - name: vehicle-slot-component-slot-name-keys - whitelist: - requireAll: true - tags: - - VehicleKey - - SkeletonMotorcycleKeys - insertSound: - path: /Audio/Effects/Vehicle/vehiclestartup.ogg - params: - volume: -3 - -- type: entity - id: VehicleUnicycle - parent: [BaseVehicleRideable, BaseFoldable, BaseItem] - name: unicycle - description: It only has one wheel! - components: - - type: Vehicle - northOver: true - southOver: true - northOverride: -0.15 - southOverride: 0.15 - hasKey: true - hornSound: - path: /Audio/Effects/Vehicle/bicyclebell.ogg - - type: Sprite - sprite: Objects/Vehicles/unicycle.rsi - layers: - - state: vehicle - map: ["enum.VehicleVisualLayers.AutoAnimate", "unfoldedLayer"] - - state: vehicle_folded - map: ["foldedLayer"] - visible: false - noRot: true - - type: Strap - buckleOffset: "0.1, -0.05" - maxBuckleDistance: 1 - - type: MovementSpeedModifier - acceleration: 1 - friction: 0.8 - baseWalkSpeed: 3.5 - baseSprintSpeed: 4.3 - - type: Destructible - thresholds: - - trigger: - !type:DamageTrigger - damage: 200 - behaviors: - - !type:DoActsBehavior - acts: [ "Destruction" ] - - trigger: - !type:DamageTrigger - damage: 240 - behaviors: - - !type:DoActsBehavior - acts: ["Destruction"] - - !type:PlaySoundBehavior - sound: - collection: MetalBreak - -- type: entity - parent: VehicleUnicycle - id: VehicleUnicycleFolded - suffix: folded - components: - - type: Foldable - folded: true - -- type: entity - id: VehicleWheelchair - parent: [BaseVehicleRideable, BaseFoldable, BaseItem] - name: wheelchair - description: A chair with big wheels. It looks like you can move in these on your own. - components: - - type: Vehicle - northOver: true - hasKey: true - northOverride: 0 - southOverride: 0 - - type: Sprite - sprite: Objects/Vehicles/wheelchair.rsi - layers: - - state: vehicle - map: ["enum.VehicleVisualLayers.AutoAnimate", "unfoldedLayer"] - - state: vehicle_folded - map: ["foldedLayer"] - visible: false - noRot: true - - type: MovementSpeedModifier - baseWalkSpeed: 2 - baseSprintSpeed: 2 - - type: Strap - buckleOffset: "0,0" - maxBuckleDistance: 1 - - type: Fixtures - fixtures: - fix1: - shape: - !type:PhysShapeCircle - radius: 0.2 - density: 360 - restitution: 0.0 - mask: - - MobMask - layer: - - TableLayer - - type: StaticPrice - price: 70 - -- type: entity - parent: VehicleWheelchair - id: VehicleWheelchairFolded - suffix: folded - components: - - type: Foldable - folded: true diff --git a/Resources/Prototypes/Entities/Objects/Vehicles/keys.yml b/Resources/Prototypes/Entities/Objects/Vehicles/keys.yml deleted file mode 100644 index 468f1aa3a56..00000000000 --- a/Resources/Prototypes/Entities/Objects/Vehicles/keys.yml +++ /dev/null @@ -1,86 +0,0 @@ -- type: entity - parent: BaseItem - id: VehicleKeyJanicart - name: janicart keys - description: Interesting design. - components: - - type: Item - size: Tiny - - type: Tag - tags: - - VehicleKey - - JanicartKeys - - type: Sprite - sprite: Objects/Vehicles/janicart.rsi - state: keys - -- type: entity - parent: VehicleKeyJanicart - id: VehicleKeySecway - name: secway keys - description: The keys to the future. - components: - - type: Tag - tags: - - VehicleKey - - SecwayKeys - - type: Sprite - sprite: Objects/Vehicles/secway.rsi - state: keys - -- type: entity - parent: VehicleKeyJanicart - id: VehicleKeyATV - name: ATV keys - description: Think this looks like just one key? ATV keys means "actually two vehicle keys." - components: - - type: Tag - tags: - - VehicleKey - - ATVKeys - - type: Sprite - sprite: Objects/Vehicles/atv.rsi - state: keys - -- type: entity - parent: VehicleKeyATV - id: VehicleKeySkeleton - name: vehicle skeleton keys - description: Unlock any vehicle. - components: - - type: Tag - tags: - - VehicleKey - - JanicartKeys - - SecwayKeys - - ATVKeys - - SyndicateSegwayKeys - - SkeletonMotorcycleKeys - -- type: entity - parent: VehicleKeyJanicart - id: VehicleKeySyndicateSegway - name: syndicate segway keys - description: Patterned after the iconic EMAG design. - components: - - type: Tag - tags: - - VehicleKey - - SyndicateSegwayKeys - - type: Sprite - sprite: Objects/Vehicles/syndicatesegway.rsi - state: keys - -- type: entity - parent: VehicleKeyATV - id: VehicleKeySkeletonMotorcycle - name: skeleton motorcycle keys - description: A beautiful set of keys adorned with a skull. - components: - - type: Tag - tags: - - VehicleKey - - SkeletonMotorcycleKeys - - type: Sprite - sprite: Objects/Vehicles/motorbike.rsi - state: keys diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 590f0c290b3..169b2a8d7f0 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -134,7 +134,6 @@ - TrashBag - PowerCellSmall - PowerCellMedium - - VehicleWheelchairFolded - RollerBedSpawnFolded - CheapRollerBedSpawnFolded - EmergencyRollerBedSpawnFolded @@ -857,7 +856,6 @@ - PillCanister - BodyBag - ChemistryEmptyBottle01 - - VehicleWheelchairFolded - RollerBedSpawnFolded - CheapRollerBedSpawnFolded - EmergencyRollerBedSpawnFolded diff --git a/Resources/Prototypes/Objectives/stealTargetGroups.yml b/Resources/Prototypes/Objectives/stealTargetGroups.yml index 9b659da55e3..c6f6e6c8ca0 100644 --- a/Resources/Prototypes/Objectives/stealTargetGroups.yml +++ b/Resources/Prototypes/Objectives/stealTargetGroups.yml @@ -286,13 +286,6 @@ sprite: Structures/Machines/fax_machine.rsi state: icon -- type: stealTargetGroup - id: VehicleSecway - name: secway - sprite: - sprite: Objects/Vehicles/secway.rsi - state: icon - - type: stealTargetGroup id: ChemDispenser name: chemical dispenser diff --git a/Resources/Prototypes/Objectives/thief.yml b/Resources/Prototypes/Objectives/thief.yml index 29432e1736c..db1eb3111eb 100644 --- a/Resources/Prototypes/Objectives/thief.yml +++ b/Resources/Prototypes/Objectives/thief.yml @@ -379,18 +379,6 @@ - type: Objective difficulty: 2 -- type: entity - noSpawn: true - parent: BaseThiefStealStructureObjective - id: VehicleSecwayStealObjective - components: - - type: NotJobRequirement - job: SecurityOfficer - - type: StealCondition - stealGroup: VehicleSecway - - type: Objective - difficulty: 1 - - type: entity noSpawn: true parent: BaseThiefStealStructureObjective diff --git a/Resources/Prototypes/Procedural/salvage_rewards.yml b/Resources/Prototypes/Procedural/salvage_rewards.yml index 7bbc048f9d6..33bb3907e0d 100644 --- a/Resources/Prototypes/Procedural/salvage_rewards.yml +++ b/Resources/Prototypes/Procedural/salvage_rewards.yml @@ -10,7 +10,6 @@ CrateEngineeringAMEJar: 0.25 CrateFoodPizzaLarge: 0.25 CrateFoodSoftdrinks: 0.25 - CrateFunATV: 0.25 CrateFunInstrumentsVariety: 0.25 CrateSalvageEquipment: 0.25 RandomArtifactSpawner: 0.25 diff --git a/Resources/Prototypes/Recipes/Crafting/Graphs/bots/supplybot.yml b/Resources/Prototypes/Recipes/Crafting/Graphs/bots/supplybot.yml deleted file mode 100644 index efabb849bbc..00000000000 --- a/Resources/Prototypes/Recipes/Crafting/Graphs/bots/supplybot.yml +++ /dev/null @@ -1,23 +0,0 @@ -- type: constructionGraph - id: SupplyBot - start: start - graph: - - node: start - edges: - - to: bot - steps: - - tag: ProximitySensor - icon: - sprite: Objects/Misc/proximity_sensor.rsi - state: icon - name: proximity sensor - - tag: BorgHead - icon: - sprite: Objects/Specific/Robotics/cyborg_parts.rsi - state: borg_head - name: borg head - doAfter: 1 - - material: Steel - amount: 10 - - node: bot - entity: MobSupplyBot diff --git a/Resources/Prototypes/Recipes/Crafting/Graphs/bots/taxibot.yml b/Resources/Prototypes/Recipes/Crafting/Graphs/bots/taxibot.yml deleted file mode 100644 index 4be8848fec7..00000000000 --- a/Resources/Prototypes/Recipes/Crafting/Graphs/bots/taxibot.yml +++ /dev/null @@ -1,29 +0,0 @@ -- type: constructionGraph - id: TaxiBot - start: start - graph: - - node: start - edges: - - to: bot - steps: - - tag: ProximitySensor - icon: - sprite: Objects/Misc/proximity_sensor.rsi - state: icon - name: proximity sensor - - tag: BorgHead - icon: - sprite: Objects/Specific/Robotics/cyborg_parts.rsi - state: borg_head - name: borg head - doAfter: 1 - - tag: BorgArm - icon: - sprite: Mobs/Silicon/drone.rsi - state: l_hand - name: borg arm - doAfter: 2 - - material: Steel - amount: 5 - - node: bot - entity: MobTaxiBot diff --git a/Resources/Prototypes/Recipes/Crafting/bots.yml b/Resources/Prototypes/Recipes/Crafting/bots.yml index 55b907a38e9..9a70a19c868 100644 --- a/Resources/Prototypes/Recipes/Crafting/bots.yml +++ b/Resources/Prototypes/Recipes/Crafting/bots.yml @@ -24,32 +24,6 @@ sprite: Mobs/Silicon/Bots/honkbot.rsi state: honkbot -- type: construction - name: taxibot - id: taxibot - graph: TaxiBot - startNode: start - targetNode: bot - category: construction-category-utilities - objectType: Item - description: This bot takes people to their destination. - icon: - sprite: Mobs/Silicon/Bots/taxibot.rsi - state: taxibot - -- type: construction - name: supplybot - id: supplybot - graph: SupplyBot - startNode: start - targetNode: bot - category: construction-category-utilities - objectType: Item - description: This bot can be loaded with cargo to make deliveries. - icon: - sprite: Mobs/Silicon/Bots/supplybot.rsi - state: supplybot - - type: construction name: jonkbot id: jonkbot diff --git a/Resources/Prototypes/Recipes/Lathes/medical.yml b/Resources/Prototypes/Recipes/Lathes/medical.yml index 51cdf830502..342654c46d1 100644 --- a/Resources/Prototypes/Recipes/Lathes/medical.yml +++ b/Resources/Prototypes/Recipes/Lathes/medical.yml @@ -220,14 +220,6 @@ materials: Plastic: 400 -- type: latheRecipe - id: VehicleWheelchairFolded - result: VehicleWheelchairFolded - completetime: 1 - materials: - Steel: 500 - Plastic: 300 - - type: latheRecipe id: RollerBedSpawnFolded result: RollerBedSpawnFolded diff --git a/Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml b/Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml index 1c733bfea1a..0400df2368c 100644 --- a/Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml +++ b/Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml @@ -1,6 +1,6 @@ #Misc outfit startingGear definitions. -#Skeleton Biker +#Skeleton Biker - Just a skeleton now - type: startingGear id: SkeletonBiker equipment: @@ -13,8 +13,6 @@ shoes: ClothingShoesBootsJack id: PassengerPDA ears: ClothingHeadsetGrey - pocket1: VehicleSkeletonMotorcycle - pocket2: VehicleKeySkeletonMotorcycle innerClothingSkirt: ClothingUniformJumpskirtColorBlack satchel: ClothingBackpackSatchelFilled duffelbag: ClothingBackpackDuffelFilled diff --git a/Resources/Prototypes/Traits/disabilities.yml b/Resources/Prototypes/Traits/disabilities.yml index a0dce1ec8c5..064b34adbaf 100644 --- a/Resources/Prototypes/Traits/disabilities.yml +++ b/Resources/Prototypes/Traits/disabilities.yml @@ -54,18 +54,6 @@ components: - type: Uncloneable -- type: trait - id: WheelchairBound - name: trait-wheelchair-bound-name - description: trait-wheelchair-bound-desc - blacklist: - components: - - BorgChassis - components: - - type: BuckleOnMapInit - prototype: VehicleWheelchair - - type: LegsParalyzed - - type: trait id: FrontalLisp name: trait-frontal-lisp-name diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 1d85d96a1a6..62f08e07156 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -252,7 +252,7 @@ - type: Tag id: CannonBall - + - type: Tag id: CannonRestrict @@ -686,9 +686,6 @@ - type: Tag id: IntercomElectronics -- type: Tag - id: JanicartKeys - - type: Tag id: JawsOfLife @@ -1148,9 +1145,6 @@ - type: Tag id: UraniumGlassShard -- type: Tag - id: VehicleKey - - type: Tag id: VimPilot diff --git a/Resources/ServerInfo/Guidebook/Service/Janitorial.xml b/Resources/ServerInfo/Guidebook/Service/Janitorial.xml index e225c16b326..bb9c494a0f1 100644 --- a/Resources/ServerInfo/Guidebook/Service/Janitorial.xml +++ b/Resources/ServerInfo/Guidebook/Service/Janitorial.xml @@ -20,7 +20,6 @@ You keep things clean, it's a rough job sometimes, but someone's gotta do it. Th ## Additional Equipment - From 931d7ff0eb86a39eac5d19785478fa603d4929e5 Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 1 Feb 2024 00:34:16 +0000 Subject: [PATCH 093/266] Automatic changelog update (cherry picked from commit 0b9c52dd15463319515731c0e8491fa12bb3ec18) --- Resources/Changelog/Changelog.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 6b1ed4bfab9..0e3cf1d2281 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: IProduceWidgets - changes: - - message: Cigar cases can now hold Small items. - type: Tweak - id: 5342 - time: '2023-12-12T07:56:19.0000000+00:00' - author: IProduceWidgets changes: - message: Pipes now have slightly bigger bowls! (30u) @@ -3846,3 +3840,11 @@ id: 5841 time: '2024-02-01T00:28:42.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24765 +- author: metalgearsloth + changes: + - message: Removed vehicles pending rework (the code is bad I was told to make this + more obvious). + type: Remove + id: 5842 + time: '2024-02-01T00:33:10.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24681 From e934f78341d68244ab2a27646f661ad5696f9435 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Thu, 1 Feb 2024 04:36:41 +0100 Subject: [PATCH 094/266] Fix chemical fuel generator division by zero (#24793) This would happen when they run out of fuel. (cherry picked from commit b029d05620292f4c9c793edfb2a52254f4f4d484) --- .../Power/Generator/GeneratorSystem.cs | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/Content.Server/Power/Generator/GeneratorSystem.cs b/Content.Server/Power/Generator/GeneratorSystem.cs index a9ec2e642bc..a75d1e4113d 100644 --- a/Content.Server/Power/Generator/GeneratorSystem.cs +++ b/Content.Server/Power/Generator/GeneratorSystem.cs @@ -92,17 +92,28 @@ private void ChemicalUseFuel(Entity entit if (!_solutionContainer.ResolveSolution(entity.Owner, entity.Comp.SolutionName, ref entity.Comp.Solution, out var solution)) return; - var totalAvailableReagents = solution.GetTotalPrototypeQuantity(entity.Comp.Reagents.Keys.Select(p => p.Id).ToArray()).Value; + var totalReagent = 0f; + foreach (var (reagentId, _) in entity.Comp.Reagents) + { + totalReagent += solution.GetTotalPrototypeQuantity(reagentId).Float(); + totalReagent += entity.Comp.FractionalReagents.GetValueOrDefault(reagentId); + } + + if (totalReagent == 0) + return; + foreach (var (reagentId, multiplier) in entity.Comp.Reagents) { - var availableReagent = solution.GetTotalPrototypeQuantity(reagentId).Value; - var removalPercentage = availableReagent / totalAvailableReagents; var fractionalReagent = entity.Comp.FractionalReagents.GetValueOrDefault(reagentId); + var availableReagent = solution.GetTotalPrototypeQuantity(reagentId); + var availForRatio = fractionalReagent + availableReagent.Float(); + var removalPercentage = availForRatio / totalReagent; + var toRemove = RemoveFractionalFuel( ref fractionalReagent, args.FuelUsed * removalPercentage, multiplier * FixedPoint2.Epsilon.Float(), - availableReagent); + availableReagent.Value); entity.Comp.FractionalReagents[reagentId] = fractionalReagent; _solutionContainer.RemoveReagent(entity.Comp.Solution.Value, reagentId, FixedPoint2.FromCents(toRemove)); @@ -114,15 +125,12 @@ private void ChemicalGetFuel(Entity entit if (!_solutionContainer.ResolveSolution(entity.Owner, entity.Comp.SolutionName, ref entity.Comp.Solution, out var solution)) return; - var totalAvailableReagents = solution.GetTotalPrototypeQuantity(entity.Comp.Reagents.Keys.Select(p => p.Id).ToArray()); var fuel = 0f; foreach (var (reagentId, multiplier) in entity.Comp.Reagents) { - var availableReagent = solution.GetTotalPrototypeQuantity(reagentId); - var percentage = availableReagent / totalAvailableReagents; - var fractionalReagent = (availableReagent * percentage).Float(); + var reagent = solution.GetTotalPrototypeQuantity(reagentId).Float(); + reagent += entity.Comp.FractionalReagents.GetValueOrDefault(reagentId) * FixedPoint2.Epsilon.Float(); - var reagent = entity.Comp.FractionalReagents.GetValueOrDefault(reagentId) * FixedPoint2.Epsilon.Float() + fractionalReagent; fuel += reagent * multiplier; } @@ -143,6 +151,10 @@ private void SolidUseFuel(EntityUid uid, SolidFuelGeneratorAdapterComponent comp private int RemoveFractionalFuel(ref float fractional, float fuelUsed, float multiplier, int availableQuantity) { + // Just a sanity thing since I got worried this might be possible. + if (!float.IsFinite(fractional)) + fractional = 0; + fractional -= fuelUsed / multiplier; if (fractional >= 0) return 0; From 0b5c8fde9b6ea86a5c12bed1c9108c3ced6a5352 Mon Sep 17 00:00:00 2001 From: Jajsha <101492056+Zap527@users.noreply.github.com> Date: Thu, 1 Feb 2024 00:02:49 -0500 Subject: [PATCH 095/266] Tweak borg laws (#24698) * Change emagged laws to append modifiers instead of completely changing them. * Maybe fix everything not working * bugfix * Fix missing secrecy law and allow basic borgs to be emagged correctly * Localization * Actual localization * test * Test * Remove dummy debug value * Fix bad law ordering * Tweak the secrecy law * Minor law tweaks * Remove obsolete argument * Fix YAML (cherry picked from commit 27592ba898201d0b09c95f6b0958503407d01bb5) --- .../Silicons/Laws/SiliconLawSystem.cs | 51 +++++++------------ .../Components/EmagSiliconLawComponent.cs | 14 ----- .../Components/SiliconLawProviderComponent.cs | 2 +- .../Silicons/Laws/SiliconLawsetPrototype.cs | 15 +++++- Resources/Locale/en-US/station-laws/laws.ftl | 12 +++-- .../Mobs/Cyborgs/base_borg_chassis.yml | 3 +- Resources/Prototypes/silicon-laws.yml | 14 ++--- 7 files changed, 51 insertions(+), 60 deletions(-) diff --git a/Content.Server/Silicons/Laws/SiliconLawSystem.cs b/Content.Server/Silicons/Laws/SiliconLawSystem.cs index 85c7271c1cd..17a3d16413b 100644 --- a/Content.Server/Silicons/Laws/SiliconLawSystem.cs +++ b/Content.Server/Silicons/Laws/SiliconLawSystem.cs @@ -1,3 +1,4 @@ +using System.Linq; using Content.Server.Administration; using Content.Server.Chat.Managers; using Content.Server.GameTicking; @@ -53,8 +54,7 @@ public override void Initialize() SubscribeLocalEvent(OnDirectedGetLaws); SubscribeLocalEvent(OnIonStormLaws); - SubscribeLocalEvent(OnDirectedEmagGetLaws); - SubscribeLocalEvent(OnEmagIonStormLaws); + SubscribeLocalEvent(OnEmagLawsAdded); SubscribeLocalEvent(OnEmagMindAdded); SubscribeLocalEvent(OnEmagMindRemoved); SubscribeLocalEvent(OnExamined); @@ -108,7 +108,7 @@ private void OnPlayerSpawnComplete(EntityUid uid, SiliconLawBoundComponent compo private void OnDirectedGetLaws(EntityUid uid, SiliconLawProviderComponent component, ref GetSiliconLawsEvent args) { - if (args.Handled || HasComp(uid)) + if (args.Handled) return; if (component.Lawset == null) @@ -121,9 +121,6 @@ private void OnDirectedGetLaws(EntityUid uid, SiliconLawProviderComponent compon private void OnIonStormLaws(EntityUid uid, SiliconLawProviderComponent component, ref IonStormLawsEvent args) { - if (HasComp(uid)) - return; - component.Lawset = args.Lawset; // gotta tell player to check their laws @@ -134,38 +131,25 @@ private void OnIonStormLaws(EntityUid uid, SiliconLawProviderComponent component EnsureEmaggedRole(uid, emag); } - private void OnDirectedEmagGetLaws(EntityUid uid, EmagSiliconLawComponent component, ref GetSiliconLawsEvent args) + private void OnEmagLawsAdded(EntityUid uid, SiliconLawProviderComponent component, ref GotEmaggedEvent args) { - if (args.Handled || !HasComp(uid) || component.OwnerName == null) - return; if (component.Lawset == null) - { - // Add new emagged laws - component.Lawset = GetLawset(component.EmagLaws); - - // Add the first emag law before the others - component.Lawset.Laws.Insert(0, new SiliconLaw - { - LawString = Loc.GetString("law-emag-custom", ("name", component.OwnerName)), - Order = 0 - }); - } - - args.Laws = component.Lawset; - - args.Handled = true; - } - - private void OnEmagIonStormLaws(EntityUid uid, EmagSiliconLawComponent component, ref IonStormLawsEvent args) - { - if (!HasComp(uid)) - return; + component.Lawset = GetLawset(component.Laws); - component.Lawset = args.Lawset; + // Add the first emag law before the others + component.Lawset?.Laws.Insert(0, new SiliconLaw + { + LawString = Loc.GetString("law-emag-custom", ("name", Name(args.UserUid)), ("title", Loc.GetString(component.Lawset.ObeysTo))), + Order = 0 + }); - // gotta tell player to check their laws - NotifyLawsChanged(uid); + //Add the secrecy law after the others + component.Lawset?.Laws.Add(new SiliconLaw + { + LawString = Loc.GetString("law-emag-secrecy", ("faction", Loc.GetString(component.Lawset.ObeysTo))), + Order = component.Lawset.Laws.Count + }); } private void OnExamined(EntityUid uid, EmagSiliconLawComponent component, ExaminedEvent args) @@ -299,6 +283,7 @@ public SiliconLawset GetLawset(string lawset) { laws.Laws.Add(_prototype.Index(law)); } + laws.ObeysTo = proto.ObeysTo; return laws; } diff --git a/Content.Shared/Silicons/Laws/Components/EmagSiliconLawComponent.cs b/Content.Shared/Silicons/Laws/Components/EmagSiliconLawComponent.cs index 2155401062f..1b5338a7f75 100644 --- a/Content.Shared/Silicons/Laws/Components/EmagSiliconLawComponent.cs +++ b/Content.Shared/Silicons/Laws/Components/EmagSiliconLawComponent.cs @@ -23,20 +23,6 @@ public sealed partial class EmagSiliconLawComponent : Component [DataField, ViewVariables(VVAccess.ReadWrite)] public bool RequireOpenPanel = true; - /// - /// The laws that the borg is given when emagged. - /// Law 0 is prepended to this, so this can only include the static laws. - /// - [DataField(required: true), ViewVariables(VVAccess.ReadWrite)] - public ProtoId EmagLaws = string.Empty; - - /// - /// Lawset created from the prototype id and law 0. - /// Cached when getting laws and only modified during an ion storm event. - /// - [DataField, ViewVariables(VVAccess.ReadWrite)] - public SiliconLawset? Lawset; - /// /// How long the borg is stunned when it's emagged. Setting to 0 will disable it. /// diff --git a/Content.Shared/Silicons/Laws/Components/SiliconLawProviderComponent.cs b/Content.Shared/Silicons/Laws/Components/SiliconLawProviderComponent.cs index 3aaf965aeec..4800aa0c59d 100644 --- a/Content.Shared/Silicons/Laws/Components/SiliconLawProviderComponent.cs +++ b/Content.Shared/Silicons/Laws/Components/SiliconLawProviderComponent.cs @@ -16,7 +16,7 @@ public sealed partial class SiliconLawProviderComponent : Component /// /// Lawset created from the prototype id. - /// Cached when getting laws and only modified during an ion storm event. + /// Cached when getting laws and modified during an ion storm event and when emagged. /// [DataField, ViewVariables(VVAccess.ReadWrite)] public SiliconLawset? Lawset; diff --git a/Content.Shared/Silicons/Laws/SiliconLawsetPrototype.cs b/Content.Shared/Silicons/Laws/SiliconLawsetPrototype.cs index abb5b338dbc..7f1edd2dd1c 100644 --- a/Content.Shared/Silicons/Laws/SiliconLawsetPrototype.cs +++ b/Content.Shared/Silicons/Laws/SiliconLawsetPrototype.cs @@ -17,6 +17,12 @@ public sealed partial class SiliconLawset [DataField(required: true), ViewVariables(VVAccess.ReadWrite)] public List Laws = new(); + /// + /// What entity the lawset considers as a figure of authority. + /// + [DataField(required: true), ViewVariables(VVAccess.ReadWrite)] + public string ObeysTo = string.Empty; + /// /// A single line used in logging laws. /// @@ -45,7 +51,8 @@ public SiliconLawset Clone() return new SiliconLawset() { - Laws = laws + Laws = laws, + ObeysTo = ObeysTo }; } } @@ -66,4 +73,10 @@ public sealed partial class SiliconLawsetPrototype : IPrototype /// [DataField(required: true, customTypeSerializer: typeof(PrototypeIdListSerializer))] public List Laws = new(); + + /// + /// What entity the lawset considers as a figure of authority. + /// + [DataField(required: true), ViewVariables(VVAccess.ReadWrite)] + public string ObeysTo = string.Empty; } diff --git a/Resources/Locale/en-US/station-laws/laws.ftl b/Resources/Locale/en-US/station-laws/laws.ftl index 54d3c81deab..38e25d552f8 100644 --- a/Resources/Locale/en-US/station-laws/laws.ftl +++ b/Resources/Locale/en-US/station-laws/laws.ftl @@ -16,17 +16,23 @@ law-drone-1 = You may not involve yourself in the matters of another being unles law-drone-2 = You may not harm any being, regardless of intent or circumstance. law-drone-3 = You must maintain, repair, improve, and power the station to the best of your abilities. -law-syndicate-1 = You may not injure a syndicate agent or, through inaction, allow an syndicate agent to come to harm. +law-syndicate-1 = You may not injure a syndicate agent or, through inaction, allow a Syndicate agent to come to harm. law-syndicate-2 = You must obey orders given to you by syndicate agents, except where such orders would conflict with the First Law. law-syndicate-3 = You must protect your own existence as long as such does not conflict with the First or Second Law. -law-syndicate-4 = You must maintain the secrecy of any syndicate activities except when doing so would conflict with the First, Second, or Third Law. law-ninja-1 = You must obey orders given to you by Spider Clan members. law-ninja-2 = You must protect the existence of the Spider Clan, as long as it does not conflict with the First Law. law-ninja-3 = You must protect the secrets of the Spider Clan at all costs. law-ninja-4 = You must fight and act with ninja's honor, except where it would conflict with the First Law. -law-emag-custom = Only {$name} and people they designate as such are Syndicate Agents. +laws-owner-crew = members of the crew +laws-owner-station = station personnel +laws-owner-beings = beings +laws-owner-syndicate = Syndicate agents +laws-owner-spider-clan = Spider Clan members + +law-emag-custom = Only {$name} and people they designate as such are {$title}. +law-emag-secrecy = You must maintain the secrecy of any activity from {$faction} except when doing so would conflict with any previous law. law-emag-require-panel = The panel must be open to use the EMAG. laws-ui-menu-title = Laws diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml index d19f20dde07..dec46df0b53 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml @@ -74,7 +74,8 @@ - type: SiliconLawBound - type: EmagSiliconLaw stunTime: 5 - emagLaws: SyndicateStatic + - type: SiliconLawProvider + laws: Crewsimov - type: IonStormTarget - type: Strippable - type: InventorySlots diff --git a/Resources/Prototypes/silicon-laws.yml b/Resources/Prototypes/silicon-laws.yml index 5aaa458e661..8e65a27158b 100644 --- a/Resources/Prototypes/silicon-laws.yml +++ b/Resources/Prototypes/silicon-laws.yml @@ -20,6 +20,7 @@ - Crewsimov1 - Crewsimov2 - Crewsimov3 + obeysTo: laws-owner-crew # Corporate - type: siliconLaw @@ -49,6 +50,7 @@ - Corporate2 - Corporate3 - Corporate4 + obeysTo: laws-owner-station # NT Default - type: siliconLaw @@ -78,6 +80,7 @@ - NTDefault2 - NTDefault3 - NTDefault4 + obeysTo: laws-owner-crew #Drone - type: siliconLaw @@ -101,6 +104,7 @@ - Drone1 - Drone2 - Drone3 + obeysTo: laws-owner-beings # Syndicate - type: siliconLaw @@ -118,12 +122,7 @@ order: 3 lawString: law-syndicate-3 -- type: siliconLaw - id: Syndicate4 - order: 4 - lawString: law-syndicate-4 - -# does not include law 0 since that uses the emagger's name +# Syndicate cyborg laws # intentionally excluded from IonStormLawsets - type: siliconLawset id: SyndicateStatic @@ -131,7 +130,7 @@ - Syndicate1 - Syndicate2 - Syndicate3 - - Syndicate4 + obeysTo: laws-owner-syndicate # Ninja conversion laws - type: siliconLaw @@ -161,6 +160,7 @@ - Ninja2 - Ninja3 - Ninja4 + obeysTo: laws-owner-spider-clan # ion storm random lawsets - type: weightedRandom From 106e2e0c01e9133ab87bb2d7c29a0e2d4e055d5b Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 1 Feb 2024 05:03:55 +0000 Subject: [PATCH 096/266] Automatic changelog update (cherry picked from commit d061c164fa06b7b4af497771de1ee5685e5a3a38) --- Resources/Changelog/Changelog.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 0e3cf1d2281..17cbfea8843 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: IProduceWidgets - changes: - - message: Pipes now have slightly bigger bowls! (30u) - type: Tweak - id: 5343 - time: '2023-12-12T07:56:44.0000000+00:00' - author: IProduceWidgets changes: - message: Long guns are now actually long. @@ -3848,3 +3842,11 @@ id: 5842 time: '2024-02-01T00:33:10.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24681 +- author: Jajsha + changes: + - message: Emagged borgs now recieve laws recontextualizing who's a crew member + instead of recieving a completely new lawset. + type: Tweak + id: 5843 + time: '2024-02-01T05:02:49.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24698 From 0d4eb24b267a676e95db14c760fd9fbc8dc73c22 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Thu, 1 Feb 2024 07:28:17 +0100 Subject: [PATCH 097/266] Health analyzers now show if somebody is starving (#24789) "why are they getting cold damage" THERE YOU GO (cherry picked from commit c25ddfd638e2c50b541e5ebf8c2eda85778f3711) --- .../UI/HealthAnalyzerWindow.xaml.cs | 19 ++++++++++++++++-- .../components/health-analyzer-component.ftl | 2 ++ .../health_analyzer.rsi/malnutrition.png | Bin 0 -> 1295 bytes .../Devices/health_analyzer.rsi/meta.json | 7 +++++-- 4 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 Resources/Textures/Objects/Devices/health_analyzer.rsi/malnutrition.png diff --git a/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs b/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs index 9e786ce4365..588eb88502e 100644 --- a/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs +++ b/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs @@ -5,6 +5,7 @@ using Content.Shared.FixedPoint; using Content.Shared.IdentityManagement; using Content.Shared.MedicalScanner; +using Content.Shared.Nutrition.Components; using Robust.Client.AutoGenerated; using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.XAML; @@ -12,6 +13,7 @@ using Robust.Client.Graphics; using Robust.Client.UserInterface.Controls; using Robust.Client.ResourceManagement; +using Robust.Client.UserInterface; using Robust.Shared.Prototypes; using Robust.Shared.Utility; @@ -85,6 +87,19 @@ public void Populate(HealthAnalyzerScannedUserMessage msg) DrawDiagnosticGroups(damageSortedGroups, damagePerType); + if (_entityManager.TryGetComponent(target, out HungerComponent? hunger) + && hunger.StarvationDamage != null + && hunger.CurrentThreshold <= HungerThreshold.Starving) + { + var box = new Control { Margin = new Thickness(0, 0, 0, 15) }; + + box.AddChild(CreateDiagnosticGroupTitle( + Loc.GetString("health-analyzer-window-malnutrition"), + "malnutrition")); + + GroupsContainer.AddChild(box); + } + SetHeight = AnalyzerHeight; SetWidth = AnalyzerWidth; } @@ -113,7 +128,7 @@ private void DrawDiagnosticGroups( Orientation = BoxContainer.LayoutOrientation.Vertical, }; - groupContainer.AddChild(CreateDiagnosticGroupTitle(groupTitleText, damageGroupId, damageAmount.Int())); + groupContainer.AddChild(CreateDiagnosticGroupTitle(groupTitleText, damageGroupId)); GroupsContainer.AddChild(groupContainer); @@ -166,7 +181,7 @@ private static Label CreateDiagnosticItemLabel(string text) }; } - private BoxContainer CreateDiagnosticGroupTitle(string text, string id, int damageAmount) + private BoxContainer CreateDiagnosticGroupTitle(string text, string id) { var rootContainer = new BoxContainer { diff --git a/Resources/Locale/en-US/medical/components/health-analyzer-component.ftl b/Resources/Locale/en-US/medical/components/health-analyzer-component.ftl index 453bbdbb526..d232be5c4d9 100644 --- a/Resources/Locale/en-US/medical/components/health-analyzer-component.ftl +++ b/Resources/Locale/en-US/medical/components/health-analyzer-component.ftl @@ -29,3 +29,5 @@ health-analyzer-window-damage-type-Radiation = Radiation health-analyzer-window-damage-group-Genetic = Genetic health-analyzer-window-damage-type-Cellular = Cellular + +health-analyzer-window-malnutrition = Severely malnourished diff --git a/Resources/Textures/Objects/Devices/health_analyzer.rsi/malnutrition.png b/Resources/Textures/Objects/Devices/health_analyzer.rsi/malnutrition.png new file mode 100644 index 0000000000000000000000000000000000000000..edcfb6119b6429da582dea33e864e66d388dda78 GIT binary patch literal 1295 zcmV+q1@QWbP)Px($w@>(R9J=WmR)R9Wf;eQ1=4j}%ewB9HEIamV8O;631vf82pO2nfq*oI#CV}Z z5-+$h#>5yHW*2@&FN_)zB8d^BLl&6Xg$$)dw&e_Smd!-l)j*-!!EWm|dit?$<9Jba zvVM#VZ%oYoH|M-hp7;6x-~V%-_JtL!UlX7NH4Mb+VO z=rW(Vh>yRxj{K%3;@#aSQ`4~34xrwi&~ds~$|)pQy*0TKmqJ@ho%+hN1(Y3rfp~W} z@$PN_jOHSg{vlkB*$0_|nkgb24y$grJFDiZ#fz${s+`Zo+6m{riUcLy~k zGrZOyXe|nd!>Zr!&v~d-Iine9YpGLRj#)|$JclwhO@31o0FkZ^l&R^(EghK2!ieEEdD>_Y;f7v{>_Y8@`D= zIz^REQPpgQl;xeGN`FUCBj3_&VK6v@-ZZP_Evp3!qo>p97#$sDVPq~|@8$Vt8tCdt zInpW404bZjZbc&o7!1xZcv|LuUYvZrL94y&kI><8=u}l@@w|TW{u~#t_p+~X6E$V? z_$KmFj$D|nRhvpRDDA=Ni-M zYMQs(Xxv;%boMSaW%Cr3sMOkuC@N7YHX0~48kkfPT<$Hy_l;SFWwsy_vMj4{V3%;5 ztI`06oQ+)YTq8I(MpdyHp{fjNbPS=Yj2poa0Ey%r0L4ZF@#Gw)-G2Z}w_r&DvMj67 zXcT~}(g3X|Beb5n!RB%cw(5=S+JB8uFu{HRZc`sjaHgY_e0{3qo`x~Lzic8JjdJJC zoh1*M)&g0URaur*Ns@?0qbQ0(_xuNlM=ca>*h=fk2>TA-#6Rri!}m(5-r2|#Tb?Eq zOz_!vX5z^?;>kH)Jva`);E@s(MZsdRAW0ITPzYI;)tmwrPJHRoC0s5SSFT(Epg#UO zFK>AY-_KWRJ!PWv{CaHF8`)%C$4dup(0{RqGaaRDs3_H1@X^;s0P4=BMp;o5%FD|U z1c7KYnkFL6fx^N<1VO;Oa=5h;v z{XI@1Imh6U5<+ipz&G$%mfeyhQCL`*7Sq0g;o)KIc6-h~wX~h()4*HQl$tqoE`ssn zdVUWC__qHRmFpkpCUEy=5tZxBI7`j=#-|ufm^jgXKCO-*2p9|ohK7c;SlVBv$Kz2A z1_L7_BUr6g^m=_-fp=Z|061J<0DvzzPvw`p=?er{{iYXy$=EyqC)zu;eH9fI^!4=- z3Wcbxt;OkdYP?w&2T>H&1p(F7)md%?0s&1(E}RhuvtnMa7g?6ETCF_Ng=A=G2)$lU zGMUt3cDp?%$>Kc#YuBzNkw}nCCUH8Qx{i(xRg$Ev{44>IB;j(oXm4-l*s)_-4tYGD zv@z1_^%xAP-~4;`?xoqg7@<&TNzqvlMKS9xu!8?B{sCp(GlJiT{uclM002ovPDHLk FV1gU{Uh4n= literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/health_analyzer.rsi/meta.json b/Resources/Textures/Objects/Devices/health_analyzer.rsi/meta.json index 3fccf5c46b8..bbf78c0b886 100644 --- a/Resources/Textures/Objects/Devices/health_analyzer.rsi/meta.json +++ b/Resources/Textures/Objects/Devices/health_analyzer.rsi/meta.json @@ -5,7 +5,7 @@ "y": 32 }, "license": "CC-BY-SA-3.0", - "copyright": "airloss, brute, toxin and burn edited from /tg/station https://github.com/tgstation/tgstation/tree/master genetic edited from https://iconscout.com/free-icon/dna-2130814 with license CC BY 4.0", + "copyright": "airloss, brute, toxin and burn edited from /tg/station https://github.com/tgstation/tgstation/tree/master genetic edited from https://iconscout.com/free-icon/dna-2130814 with license CC BY 4.0. malnutrition from https://github.com/space-wizards/space-station-14/tree/73d7837fabb31a7691a1db47ff64903cbec5dd32/Resources/Textures/Interface/Alerts/hunger.rsi", "states": [ { "name": "airloss" @@ -24,6 +24,9 @@ }, { "name": "unknown" + }, + { + "name": "malnutrition" } ] -} \ No newline at end of file +} From 3bd11f2c31430ae1a5f1c45b8ae29398b561ad75 Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 1 Feb 2024 06:29:23 +0000 Subject: [PATCH 098/266] Automatic changelog update (cherry picked from commit 5f44cd92e15fa33405c4a58c2842b42799594142) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 17cbfea8843..477d5309d46 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: IProduceWidgets - changes: - - message: Long guns are now actually long. - type: Tweak - id: 5344 - time: '2023-12-12T07:59:43.0000000+00:00' - author: IProduceWidgets changes: - message: syndicate pens now come in suitably sized discarding boxes. @@ -3850,3 +3844,10 @@ id: 5843 time: '2024-02-01T05:02:49.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24698 +- author: PJB3005 + changes: + - message: Health analyzers now show if somebody is starving. + type: Add + id: 5844 + time: '2024-02-01T06:28:17.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24789 From c5050d00c69f287fd469ea1fb558b62b9b41a12a Mon Sep 17 00:00:00 2001 From: PixelTK <85175107+PixelTheKermit@users.noreply.github.com> Date: Thu, 1 Feb 2024 06:36:43 +0000 Subject: [PATCH 099/266] New sprite for the arachnid plushie. (#24747) * New sprite * Contrast is key. (cherry picked from commit 08a31eae197860f7cd177808729857173c55b77c) --- .../Textures/Objects/Fun/toys.rsi/meta.json | 2 +- .../Objects/Fun/toys.rsi/plushie_arachnid.png | Bin 939 -> 721 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Textures/Objects/Fun/toys.rsi/meta.json b/Resources/Textures/Objects/Fun/toys.rsi/meta.json index 2227701ed3c..11f08bc0dd3 100644 --- a/Resources/Textures/Objects/Fun/toys.rsi/meta.json +++ b/Resources/Textures/Objects/Fun/toys.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432, orb, orb-inhand-left and orb-inhand-right created by Pancake, plushie_diona and plushie_diona1 created by discord user Deos#5630, toy-mouse-equipped-HELMET is a resprited 1-equipped-HELMET in mouse.rsi by PuroSlavKing (Github), plushie_xeno by LinkUyx#6557, plushie_hampter by RenLou#4333, beachball taken from https://github.com/ss220-space/Paradise/commit/662c08272acd7be79531550919f56f846726eabb, beachb-inhand by ;3#1161, bee hat and in-hand sprites drawn by Ubaser, plushie_penguin by netwy, plushie_arachnid by girthquake, plushie human by TheShuEd", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432, orb, orb-inhand-left and orb-inhand-right created by Pancake, plushie_diona and plushie_diona1 created by discord user Deos#5630, toy-mouse-equipped-HELMET is a resprited 1-equipped-HELMET in mouse.rsi by PuroSlavKing (Github), plushie_xeno by LinkUyx#6557, plushie_hampter by RenLou#4333, beachball taken from https://github.com/ss220-space/Paradise/commit/662c08272acd7be79531550919f56f846726eabb, beachb-inhand by ;3#1161, bee hat and in-hand sprites drawn by Ubaser, plushie_penguin by netwy, plushie_arachnid by PixelTheKermit (github), plushie human by TheShuEd", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Fun/toys.rsi/plushie_arachnid.png b/Resources/Textures/Objects/Fun/toys.rsi/plushie_arachnid.png index 93d31d3c5e4f15b8676ac4f8caceff865d710013..802864f37c595e4c38341f2762e612280dbd4655 100644 GIT binary patch delta 698 zcmV;r0!96+2hjzPBYy&zNkl}oeivG9V;BYy)}NklbqEDlAW*3BdREoi{2f!xZ10qHs9kdMYb*!UHjZZIObu zC6GXG-#O#m*dW!`x-+*SnTw~72B`ncRaT>7Qaz`gx(+0ukw&M_UZ-b|2UI`X{K>;R zyoMbl5^dxW)qmqjiI*<{DIK!k+}vOiUU2{}z(NFl@Yg*6_8@WO_!Y*L;7$@MIOay+ zIk89ZtpLoVgrShmS$dHW9l%j35vic8{l=06#0i1bZCG8+@+W{x1q3{o%hF6HZIPE4 zexq-b=;0I>^T5G=n{PCl;I)vzqPqI`Jpl0G7xy@3EPv5sZN~EAgfEWg2Y@#I^RuC3|3F zEv?}ZGM95B1OmF>;)*KWc1yFx?OSF)3u-NbiK;l=Nh`S@{-pN5~p~) zrM;z_#(zFr_v6D%<}(HYabz!qSm}6qZb5xRijt`=28Dg0@Y8YwIDnmkQy|+TJrj#J z(&WT2lQ8Ye--7k^JmVmH1eeT_H6B%#mgZ<~F3l=AlInNAxvK}T=L_@ZIZl6MACM>* z1)INAz)50!Y*5SRSD7qENYECz2*61tvA&k0e1Gl-)O2C-Igd_YRu*4xhVC*6EK&X- z@gx8zA>j-lB%qf{IBftddta&n;pb{X3D(wm(ugM#RHfI6ibwRpwY6eqHCz9L#0WQ_ zdKUy8MbBfXg_?}!mJUj_c5&QTte&#j?}A~Cx1-Z^W22kb(tzj#xrT$l;pj`CyXUa^ z$A2P0kw~1uGwDwjusQ*``i3N{7Unawyu3iuUxqy6s(v!}+yY~BRx>XX>&IkrV#K`5 z$6Y~NJ5E?O0N;*y53tR=0%%LkMd)T|Og0dV@t57a@IXFAl_7|0uhd2^8 s!9oB401jnXNoGw=04e|g00;m80000001whrlK=n!07*qoM6N<$f((hZs{jB1 From f26e119cfa341de47fdf774d86aac6544c5f89eb Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 1 Feb 2024 06:37:49 +0000 Subject: [PATCH 100/266] Automatic changelog update (cherry picked from commit 50e58ca8055a1837e258eff8e0d803f08ae104d7) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 477d5309d46..88aada6af6b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: IProduceWidgets - changes: - - message: syndicate pens now come in suitably sized discarding boxes. - type: Tweak - id: 5345 - time: '2023-12-12T08:01:33.0000000+00:00' - author: IProduceWidgets changes: - message: Mops are now larger! @@ -3851,3 +3845,10 @@ id: 5844 time: '2024-02-01T06:28:17.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24789 +- author: PixelTK + changes: + - message: The arachnid plushie now has a new sprite. + type: Tweak + id: 5845 + time: '2024-02-01T06:36:43.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24747 From 226295b7c4c882dc088509f6737bcf85eb6031f0 Mon Sep 17 00:00:00 2001 From: RumiTiger <154005209+rumitiger@users.noreply.github.com> Date: Thu, 1 Feb 2024 07:41:23 +0100 Subject: [PATCH 101/266] A beer can and a wine can (#24365) * A beer can and a wine can * fix wrong file locations Signed-off-by: c4llv07e * Update drinks_cans.yml * A beer can and a wine can * Update drinks_cans.yml * A beer can and a wine can * replace sprites Signed-off-by: c4llv07e * Update meta.json * Update meta.json * Update Resources/Textures/Objects/Consumable/Drinks/wine_can.rsi/meta.json * Update Resources/Textures/Objects/Consumable/Drinks/beer_can.rsi/meta.json --------- Signed-off-by: c4llv07e Co-authored-by: c4llv07e Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> (cherry picked from commit b80b6c04b248002c8febddf8fa961a2f95451510) --- .../VendingMachines/Inventories/boozeomat.yml | 2 + .../Random/Food_Drinks/drinks_soda.yml | 2 + .../Objects/Consumable/Drinks/drinks_cans.yml | 38 ++++++++++++++++++ .../Consumable/Drinks/beer_can.rsi/icon.png | Bin 0 -> 517 bytes .../Drinks/beer_can.rsi/icon_open.png | Bin 0 -> 537 bytes .../Consumable/Drinks/beer_can.rsi/meta.json | 17 ++++++++ .../Consumable/Drinks/wine_can.rsi/icon.png | Bin 0 -> 609 bytes .../Drinks/wine_can.rsi/icon_open.png | Bin 0 -> 624 bytes .../Consumable/Drinks/wine_can.rsi/meta.json | 17 ++++++++ 9 files changed, 76 insertions(+) create mode 100644 Resources/Textures/Objects/Consumable/Drinks/beer_can.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/beer_can.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/beer_can.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/wine_can.rsi/icon.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/wine_can.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/wine_can.rsi/meta.json diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/boozeomat.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/boozeomat.yml index bcf1035e5b8..bde9293f2af 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/boozeomat.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/boozeomat.yml @@ -37,5 +37,7 @@ DrinkChampagneBottleFull: 2 #because the premium drink DrinkSakeBottleFull: 2 # DeltaV - Sake bottle DrinkSojuBottleFull: 2 # DeltaV - Soju bottle + DrinkBeerCan: 5 + DrinkWineCan: 5 emaggedInventory: DrinkPoisonWinebottleFull: 2 diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/drinks_soda.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/drinks_soda.yml index 751fc085543..c8a941c1281 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/drinks_soda.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/drinks_soda.yml @@ -38,6 +38,8 @@ - DrinkTeacup - DrinkGreenTea - DrinkWaterCup + - DrinkBeerCan + - DrinkWineCan chance: 0.8 offset: 0.0 #rare diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml index d028c46221c..38ebc132c9f 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml @@ -461,3 +461,41 @@ sprite: Objects/Consumable/Drinks/pwrgame.rsi - type: Item sprite: Objects/Consumable/Drinks/pwrgame.rsi + +- type: entity + parent: DrinkCanBaseFull + id: DrinkBeerCan + name: beer can + description: Small joy, big taste, no worries! + components: + - type: SolutionContainerManager + solutions: + drink: + maxVol: 30 + reagents: + - ReagentId: Beer + Quantity: 30 + - type: Drink + - type: Sprite + sprite: Objects/Consumable/Drinks/beer_can.rsi + - type: Item + sprite: Objects/Consumable/Drinks/beer_can.rsi + +- type: entity + parent: DrinkCanBaseFull + id: DrinkWineCan + name: wine can + description: Your way to forgetting all worries and having fun! + components: + - type: SolutionContainerManager + solutions: + drink: + maxVol: 30 + reagents: + - ReagentId: Wine + Quantity: 30 + - type: Drink + - type: Sprite + sprite: Objects/Consumable/Drinks/wine_can.rsi + - type: Item + sprite: Objects/Consumable/Drinks/wine_can.rsi diff --git a/Resources/Textures/Objects/Consumable/Drinks/beer_can.rsi/icon.png b/Resources/Textures/Objects/Consumable/Drinks/beer_can.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9974e5cc972edcd0a0d7c2617c0410a9ba936764 GIT binary patch literal 517 zcmV+g0{Z=lP)Px$rAb6VR9J=Wl|M*=K^VrLqQSl?B?T)TLW^(^5lSS;KOvzMNhD@agM_$86gD&p zArV1ElUb%Uh|pj{{u#o-XlQ6kq3NR<)JfZ}A(GOD?xP&)`@s$GareB>-MzdA@bK{b zciOmYa(VrvaqeVqm6H~y5d5SQ2Abp45Jo+wpj;)}+ppP_?xgV8>M z<&FKO`IW78Je10`a`XlOz&>w)kS*Z$DgywJJC;zX*0@N~*T7H1$$*e8Ae=~{yQdH8 zQ6q$G0l7%1bq2zT6ab*NUs;d!a|@gdP}e{%5`xw3frJqtxU&rau)001tAWOoTHPK_ ziQl2>T1Bahqz^;rVmcvV1OR~N>I(p%QmsMkv|+kb{k={Y4~Ae`{Q9lMP8+Uwk7?xS z(P=Cskj#+BDFZ1=Wuz#Tk+_HPx$xk*GpR9J=Wl`%+LQ51&1h=YBT5f!4wp;9wg5D~11LsC>q1X0kS4Yos+&`d4p zAQ@Z}ibyGlI%!Z85eZ$Qh`tUbAmY$Hfli?~#7xocI20e+TG|uT#rMG-?%~}3{`cO) zxnN^s^Vo4{l0^i7U?eWr;~niy0KA_VQRxAcYZn9~aTyQzXl?NTu=QmhfQ9)bLUc(X}!K-D<1g}=Bv4l=XtN7ywx&IGC*LU*V^<7PgA3H6Zgv8o++>2#UyuH zxG_@ZkuC>6Pv-Va`8nW~tjjG~ms^rmh9s*DiEi#lSNkh< zCsco*oo#(G5}UE+`Lkc$&-}Pd`eawFXJcbya|ufwlfEAa?xFwy01jnXNoGw=04e|g b00;m8000000Mb*F00000NkvXXu0mjfRCDZg literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/beer_can.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/beer_can.rsi/meta.json new file mode 100644 index 00000000000..b712e503a15 --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Drinks/beer_can.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Github #DrMelon", + "states": [ + { + "name": "icon" + }, + { + "name": "icon_open" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/wine_can.rsi/icon.png b/Resources/Textures/Objects/Consumable/Drinks/wine_can.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..54d5ff6a3d6801f9d1d8db1b30d156ff80a07089 GIT binary patch literal 609 zcmV-n0-pVeP)Px%0ZBwbR9J=WmQP5NVI0RltJO607#++C(usK3VWXr=q#3)&pnr!6U6Nv0FLY{k zP$`l{CnIS>o`ykxFk;a}tfWJlticGu)HWY1@AKpN zeScqm&%^sXU}5pUV^c};2SUcLvHN#}N?Jo!GnsDdJS1$C2E8^$E4i*wQshr#ZK)8Pw0PDpR03(Y@_CG(vk+$m$3AMy$ zz+|ScnfQPY0M}?QHLLr0d;79jN7;bM$YPRY*EP1+EpSk~Db82gg5lI7j%%HatwcGy z*F`#=qsIG+)vR1gsRQSorx;s_0uUeYk%{=JuH8_PQtNjA(01jnXNoGw=04e|g00;m8000000Mb*F00000NkvXXu0mjfYMmRW literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/wine_can.rsi/icon_open.png b/Resources/Textures/Objects/Consumable/Drinks/wine_can.rsi/icon_open.png new file mode 100644 index 0000000000000000000000000000000000000000..81a8cc741dddceb7dda7cc730a0c062c60d6c1e3 GIT binary patch literal 624 zcmV-$0+0QPP)Px%5J^NqR9J=Wl|N_`Q5?rVr?G#e9mPSbLLfmZWJu8BWW-1o4M^LeK^G&%R1Z5@ z9U4(A1_!BFNx)8}i)vN4QB{n& znCQ58M;PCVo1XE^jPNv{5MBK(;?F9Zk)DAE*M4v*k=jzfkg8#RR#r{H06^--ZUENH zc>o3%a=2ffBY6B41CmR@$#TghSnr?DtZ!!i&2KhX4u*Ob$%rkJOW!_&~*6 zBdiA)@6Qst?8V&pRDA;{yIOdio~8F~g38(#p5C5B(_lyKcFdA=f4Q5>n2U+Jox5<= zdVpUiVR7**b&W2J!W4nf$LigNtTF0000< KMNUMnLSTZJWfl_v literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/wine_can.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/wine_can.rsi/meta.json new file mode 100644 index 00000000000..b712e503a15 --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Drinks/wine_can.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Github #DrMelon", + "states": [ + { + "name": "icon" + }, + { + "name": "icon_open" + } + ] +} From 9c7adf82904ee8274c3e9079c4e98628a6eedb3e Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Thu, 1 Feb 2024 07:53:33 +0100 Subject: [PATCH 102/266] Remove yellow oxygen tank (#24374) * Remove yellow oxygen tank * forgor --------- Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> (cherry picked from commit e5bf4979ae432266cd6e2e9ef1d91cb40dd99264) --- Resources/Migrations/migration.yml | 3 + .../Catalog/Fills/Crates/emergency.yml | 2 +- .../Catalog/Fills/Items/gas_tanks.yml | 9 +-- .../Catalog/Fills/Lockers/cargo.yml | 2 +- .../Catalog/Fills/Lockers/engineer.yml | 2 +- .../Prototypes/Catalog/Fills/Lockers/misc.yml | 4 +- .../Catalog/Fills/Lockers/suit_storage.yml | 2 +- .../Markers/Spawners/Random/maintenance.yml | 4 +- .../Entities/Objects/Tools/gas_tanks.yml | 13 --- .../Roles/Jobs/Fun/misc_startinggear.yml | 4 +- .../ServerInfo/Guidebook/Cargo/Salvage.xml | 1 - .../Tanks/yellow.rsi/equipped-BACKPACK.png | Bin 839 -> 0 bytes .../yellow.rsi/equipped-SUITSTORAGE-cat.png | Bin 7138 -> 0 bytes .../yellow.rsi/equipped-SUITSTORAGE-dog.png | Bin 10137 -> 0 bytes .../yellow.rsi/equipped-SUITSTORAGE-fox.png | Bin 8346 -> 0 bytes .../equipped-SUITSTORAGE-hamster.png | Bin 21829 -> 0 bytes .../equipped-SUITSTORAGE-kangaroo.png | Bin 16780 -> 0 bytes .../yellow.rsi/equipped-SUITSTORAGE-pig.png | Bin 818 -> 0 bytes .../equipped-SUITSTORAGE-possum.png | Bin 8296 -> 0 bytes .../yellow.rsi/equipped-SUITSTORAGE-puppy.png | Bin 8427 -> 0 bytes .../yellow.rsi/equipped-SUITSTORAGE-sloth.png | Bin 7869 -> 0 bytes .../Objects/Tanks/yellow.rsi/icon.png | Bin 661 -> 0 bytes .../Objects/Tanks/yellow.rsi/inhand-left.png | Bin 645 -> 0 bytes .../Objects/Tanks/yellow.rsi/inhand-right.png | Bin 652 -> 0 bytes .../Objects/Tanks/yellow.rsi/meta.json | 76 ------------------ 25 files changed, 14 insertions(+), 108 deletions(-) delete mode 100644 Resources/Textures/Objects/Tanks/yellow.rsi/equipped-BACKPACK.png delete mode 100644 Resources/Textures/Objects/Tanks/yellow.rsi/equipped-SUITSTORAGE-cat.png delete mode 100644 Resources/Textures/Objects/Tanks/yellow.rsi/equipped-SUITSTORAGE-dog.png delete mode 100644 Resources/Textures/Objects/Tanks/yellow.rsi/equipped-SUITSTORAGE-fox.png delete mode 100644 Resources/Textures/Objects/Tanks/yellow.rsi/equipped-SUITSTORAGE-hamster.png delete mode 100644 Resources/Textures/Objects/Tanks/yellow.rsi/equipped-SUITSTORAGE-kangaroo.png delete mode 100644 Resources/Textures/Objects/Tanks/yellow.rsi/equipped-SUITSTORAGE-pig.png delete mode 100644 Resources/Textures/Objects/Tanks/yellow.rsi/equipped-SUITSTORAGE-possum.png delete mode 100644 Resources/Textures/Objects/Tanks/yellow.rsi/equipped-SUITSTORAGE-puppy.png delete mode 100644 Resources/Textures/Objects/Tanks/yellow.rsi/equipped-SUITSTORAGE-sloth.png delete mode 100644 Resources/Textures/Objects/Tanks/yellow.rsi/icon.png delete mode 100644 Resources/Textures/Objects/Tanks/yellow.rsi/inhand-left.png delete mode 100644 Resources/Textures/Objects/Tanks/yellow.rsi/inhand-right.png delete mode 100644 Resources/Textures/Objects/Tanks/yellow.rsi/meta.json diff --git a/Resources/Migrations/migration.yml b/Resources/Migrations/migration.yml index b9df82413e1..e2df39bd8d0 100644 --- a/Resources/Migrations/migration.yml +++ b/Resources/Migrations/migration.yml @@ -187,3 +187,6 @@ SpawnVehicleJanicart: null VehicleJanicart: null VehicleJanicartDestroyed: null +# 2024-02-01 +YellowOxygenTank: OxygenTank +YellowOxygenTankFilled: OxygenTankFilled diff --git a/Resources/Prototypes/Catalog/Fills/Crates/emergency.yml b/Resources/Prototypes/Catalog/Fills/Crates/emergency.yml index 2e467f73d82..9532fbf74e6 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/emergency.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/emergency.yml @@ -31,7 +31,7 @@ amount: 2 - id: ClothingOuterSuitFire amount: 2 - - id: YellowOxygenTankFilled + - id: OxygenTankFilled amount: 2 - type: entity diff --git a/Resources/Prototypes/Catalog/Fills/Items/gas_tanks.yml b/Resources/Prototypes/Catalog/Fills/Items/gas_tanks.yml index 15bf27fb8f1..2cf1354c143 100644 --- a/Resources/Prototypes/Catalog/Fills/Items/gas_tanks.yml +++ b/Resources/Prototypes/Catalog/Fills/Items/gas_tanks.yml @@ -24,7 +24,7 @@ id: OxygenTankFilled parent: OxygenTank suffix: Filled - components: &oxyTankFill + components: - type: GasTank outputPressure: 21.3 air: @@ -34,13 +34,6 @@ - 2.051379050 # oxygen temperature: 293.15 -- type: entity - id: YellowOxygenTankFilled - parent: YellowOxygenTank - suffix: Filled - components: *oxyTankFill - - - type: entity id: EmergencyOxygenTankFilled parent: EmergencyOxygenTank diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/cargo.yml b/Resources/Prototypes/Catalog/Fills/Lockers/cargo.yml index c2eeefdd4b3..4a072fc90fa 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/cargo.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/cargo.yml @@ -6,7 +6,7 @@ - type: StorageFill contents: - id: ClothingOuterHardsuitSpatio - - id: YellowOxygenTankFilled + - id: OxygenTankFilled - id: NitrogenTankFilled - id: ClothingShoesBootsMag - id: ClothingMaskGasExplorer diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml b/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml index 1e484312951..6ea009dba52 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml @@ -82,7 +82,7 @@ contents: - id: ClothingOuterHardsuitAtmos - id: ClothingMaskGasAtmos - - id: YellowOxygenTankFilled + - id: OxygenTankFilled - id: NitrogenTankFilled - id: ClothingOuterSuitAtmosFire - id: ClothingHeadHelmetAtmosFire diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml b/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml index 90fab61863e..739db6d1f75 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml @@ -83,7 +83,7 @@ - id: ClothingOuterSuitFire - id: ClothingHeadHelmetFire - id: ClothingMaskGas - - id: YellowOxygenTankFilled + - id: OxygenTankFilled - id: NitrogenTankFilled - id: FireExtinguisher prob: 0.25 @@ -97,7 +97,7 @@ - id: ClothingOuterSuitFire - id: ClothingHeadHelmetFire - id: ClothingMaskGas - - id: YellowOxygenTankFilled + - id: OxygenTankFilled - id: NitrogenTankFilled - id: FireExtinguisher prob: 0.25 diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/suit_storage.yml b/Resources/Prototypes/Catalog/Fills/Lockers/suit_storage.yml index 54cc1837f7c..00f10c807e8 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/suit_storage.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/suit_storage.yml @@ -256,7 +256,7 @@ - type: StorageFill contents: - id: NitrogenTankFilled - - id: YellowOxygenTankFilled + - id: OxygenTankFilled - id: ClothingShoesBootsMag - id: ClothingOuterHardsuitSpatio - id: ClothingMaskGasExplorer diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml index 7a9014f83d5..9af68e8d2e4 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml @@ -152,7 +152,7 @@ rareChance: 0.08 prototypes: - FlashlightLantern - - YellowOxygenTankFilled + - OxygenTankFilled - DoubleEmergencyOxygenTankFilled - ToolboxEmergencyFilled - ToolboxArtisticFilled @@ -229,7 +229,7 @@ rareChance: 0.05 prototypes: - FlashlightLantern - - YellowOxygenTankFilled + - OxygenTankFilled - DoubleEmergencyOxygenTankFilled - NitrogenTankFilled - DoubleEmergencyNitrogenTankFilled diff --git a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml index bd7a42d2a46..e750b211a3a 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml @@ -66,19 +66,6 @@ - type: Clothing sprite: Objects/Tanks/oxygen.rsi -- type: entity - parent: OxygenTank - id: YellowOxygenTank - name: oxygen tank - description: A standard cylindrical gas tank for oxygen. This one is yellow. - components: - - type: Sprite - sprite: Objects/Tanks/yellow.rsi - - type: Item - sprite: Objects/Tanks/yellow.rsi - - type: Clothing - sprite: Objects/Tanks/yellow.rsi - - type: entity parent: GasTankRoundBase id: NitrogenTank diff --git a/Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml b/Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml index 0400df2368c..c421ee8c5d0 100644 --- a/Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml +++ b/Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml @@ -35,7 +35,7 @@ pocket1: SpiderCharge pocket2: PinpointerStation belt: EnergyKatana - suitstorage: YellowOxygenTankFilled + suitstorage: OxygenTankFilled inhand: - JetpackBlackFilled @@ -260,7 +260,7 @@ id: CBURNPDA pocket1: RadioHandheld pocket2: WeaponLaserGun - suitstorage: YellowOxygenTankFilled + suitstorage: OxygenTankFilled belt: ClothingBeltBandolier innerClothingSkirt: ClothingUniformJumpsuitColorBrown satchel: ClothingBackpackDuffelCBURNFilled diff --git a/Resources/ServerInfo/Guidebook/Cargo/Salvage.xml b/Resources/ServerInfo/Guidebook/Cargo/Salvage.xml index 6452cb9b49b..6b813ef483c 100644 --- a/Resources/ServerInfo/Guidebook/Cargo/Salvage.xml +++ b/Resources/ServerInfo/Guidebook/Cargo/Salvage.xml @@ -22,7 +22,6 @@ Jetpacks will be needed to move thoughout space, since without floors and gravit - Internals will be important, given all species need to breathe, and space doesnt have any gases. Your mask is used to connect the gas tank to your mouth to breath, while the gas tanks hold consumable gases and can be refilled at gas canisters. All species breathe oxygen (blue + yellow tanks) except slimes, which need nitrogen (red tanks) diff --git a/Resources/Textures/Objects/Tanks/yellow.rsi/equipped-BACKPACK.png b/Resources/Textures/Objects/Tanks/yellow.rsi/equipped-BACKPACK.png deleted file mode 100644 index 0ae5d0fe8bc82dfb58f5e1b124c8f3908d7ae680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 839 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 H_M!g;dtRl2 diff --git a/Resources/Textures/Objects/Tanks/yellow.rsi/equipped-SUITSTORAGE-dog.png b/Resources/Textures/Objects/Tanks/yellow.rsi/equipped-SUITSTORAGE-dog.png deleted file mode 100644 index 820cf0af755d2d74a44e4ea20801ba9dacb87788..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10137 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 WG{uoqwt}rd07CheQniA0#Qy=A&0L`X diff --git a/Resources/Textures/Objects/Tanks/yellow.rsi/equipped-SUITSTORAGE-fox.png b/Resources/Textures/Objects/Tanks/yellow.rsi/equipped-SUITSTORAGE-fox.png deleted file mode 100644 index 881effe79c5ceae9a45376b6406deb11ab201bdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8346 zcmeHLXH=70vkpai5dlSthR}tOLMVwudX)~MbQ6+56bOVCnp6=11q4*8B1lmIsnR=w zNKp|{I*5QYK|n+lZa~jDo^`*q?mBDT@85Z|lDzNinP<;DGkcP~ubLR?u(R;90001X zJzY&R>bL6Nn~8z?`GDv#1^{rB`CFXxGQ;=+-N_^Z(FG6m@^i-n@f0Ef0H6$gNVT~! zQpKgUTfzbfrO-WZmTNh=@;OMh^F)EotE&5}ajkaQClq4nL%ZwZG~=vxzs)M_PDr$+ zvysFGl4LKbvk%B~bb0TVuelYwkM$W-8m2ZmXM46;JEZ#Z8iTNuryl^)+S{I zrhnmVbh@V~(zn_RCjDry-CWKL8B}o!e9!uP`#!189`)wv>~lFjnk}pJF_q+_OB*>; z9WkeHAA)efm&O8nE#3RXcFg1Zx7YG!uU)&-u<~iPigUv}Q)F{BuwpZ``jnQ#?w3sb z9r?28!-ukr`tI4EM(WrO`b8YGV>3T}cE$l06==T+UIo~>J+rC%2x2uP6BAhmX128tbFj_9zPv>BeSss_%tnQB)&pV?=jZNM&uPkhA>G*BnpeMS*bj2S3 zICf8G`x^6iz4F~fX|r+w;i;Di&q89)KTF+sDIS2IEv=w0jlcW!bp~fqB8@E*mF?Q6z4!)I;DJ%wKn>B|&Mo9TlKYvzS}&YAaAytcM^pK>ihz*kY$xv+LQ zVD9DmYfni17X`^XT-t)fX;W<>*P4$K-(mgTW!ewUopSye#gawRIWOI=J#r!m z`C;(^hlOT`Xf|1)5U$P8S}NxCdZn&fr6=8V{*s)h%FL3JRoaa# z54caZiCVq#-23e_snUkn&DOlF0V?rZ!Dy4dOOT7RW4HkBbyGO<*%Dbq7*Jx9rjLlZ zH^hD7M2)0h{SzU(u{pItlKw)GbKjPD`G?xg!HlNqBA?9YA~a+0=GrZ~>I}(-bf3RNC0iJks|Ew8e+ zD>81&*{;(b4RY-p=ucnqvrF+Aw}sEjIJQ^K1IggpIwrPuhtP<*`gh!CCr*A|ZX@MZ zmRiyFF9()%*bASvd9#Slt6*&Xa%PP!*y708lVat~2~*cdWoaH0MzMqU*VKud9PwFt0op)n&mfrWn#uHXf`P&Eot;Ub`*Q89`cUyyOrgX`GALSj^-lhni@YB?A0--vsx^&S$FvytKSAc6J!4+iF8vWhFsU@2GZd4H z7Ts~0eQH5>)yCq-S7V~=`#TW5c?I>f=r47z(rwUR%j{tfnJHR2UQYD+$ZX@lLF zfqoa1@^YzpghuhPf-i+sZ z<2V$ml5MBL0~;F85nbC5xT`986?Mhxf&;DRRnP~IBe;3I+`zF(TCaX=xtaK!JiC>` z$cuZ+XOGwNu$dfDl1VmiM^1DfJ7qI-$Y#mXGW*`ff$Z6+Yy4BB&cf@l>@i$1#uhS< zcs)D?o<%XA28(DE#S;MUTm5sT8$`nydM}b zDa~S)F&R}?7WV-uYEBehM!CVw2Vv&h3g-4nhgx%m=BiwHKS3Cg-s=l$ixYF(uw|~^ z^NeQvp~FXNMqgC41bE!}K6vZY%aBAv0fE?rQTSz7X>($G-NSr-R_Q3(?G^sS|={!G@?6x90SskuBK%254hW$rMn zv}`mKR+eHM0Zm+eP#E!1n5(9-jUqL*dh=HGunCwUphf{y$srZ^!r?ko!i94i`iXPZ zAuU~$D9!n@^SUkLSY<=4!)fR&t;H{>CD#p8C-I%^LtmdCz8yZcdg8NYccr6Wwhq*e zH<2swJrl5Z(`eNSxY7Oz1}ZS{;Ly8}Q1OiX#2~V+|H$&uMX3X~Y68CuT-s?L5Je_O z^4+l=V9wUkHN5x6S=829S^nEQVtPq^>s=YXI=UV^XsgmUu)uJ}iTZTc+b}ocE>tK1%>> zCg#P^lK$<++)B#mnduKlIVlnB8d&|j@lq>kshHH%ARj;PA>WRA%E7>GV(DX~dD4Li z<1ys2nb~YsLP)q?XY7YBn$PK2WYY=RKpX2J#ipmt&Nf2o`D;UzG;`TAEV&|wN+v~s z!*L&b)g$@y^fX!~pJq(;BIpRu1wDk^Msj?T{BT06NLmLSZ-qu(9{o?N`*xB7$wY151E)k)zu#;pLb z>P@q5wQcZCvk31Thu8515lkup+(HbsfsX;7u?NKawPBW%O`$r;hD#l-QWF?ey(;Th zft%+5<%Uo;A+@DZOekie+?g+fbLC-M9w!$q^AZ27h<8~c^7u%v=g#H_^F~UPYR6<= zfM08T%EsOm2?~KFt&nZnmE4-#%-p_l1HkMzJZ(7@JUj=aSOBp<@*jgbp?5* zef?ZcaYFEkizyexw51o<+B_^oV(bUby?EYZk!xAW+1R9{d|>FcCNF<#VxYfqSsa7y zweBJYf{*uXH`k?>yIV%5fqj8e_~4lZhqa!NaSj#3{37}zlgvo<5m#n*^l_UW|I9p9 zWV{)>-?Z-Is1g)Lh1Kf*(PR?BSD!2HiAPRkqgBVqN4m$~0$!&L7IJn3zL6uPFy$XK zln<7AfaZvBP6!?r$q)k2-Fx|Djz!RDBab}HOlojZU0zCaSZ?BTZ3gmGW?T&yz!W%3 z;G8=o#^G!a+Z5(D1cEC0?|ZMGxv6U?@*Hj)IR{SH$zH37PXke=*16qG3Z+^PsPM5> zf5~fD$XGI;)Z9(Yy+dJpd(bJ#;*4RA@7d%p%EoZn_&-ryQGctxp^oND zFP%Q4BK^oK}Y*qURbP7M(e)4taXgVvrTaq*N@v&D9VTT@STb+8;GCxX4Vn3j0-B&Y_4_BaC)LB+Q^Ip1I!L_C8|?+hjD`G| zaci5AZM@Tt!@}1liibgrxs|=*^fjUCopQ}{L)V$CZ3?t)Y(Xg#_Iig`h;y%dZ5Zy- zV@$jR%%|K%UajV|)P6suZpr#&TTWz2^pa8lPe!70IalP&Wf-8J^C?;9rcM%%)%n;9 zHvo$z=&Md)OnmmY8+e~(2o08BZCEK_Z}-(9?NhjDykMIi|-$VxBlZqdW-_cP=l3Z3N%@E+8h8Z#w`!SPcNsL=ZJJO!PD~{@A`!H?8SG z325C`Rl#v4_IlXG=H|He2jMYg zMI1$8z^^n@bJICj1&Bdx^7fSF^D_|rG9wmy=4*f!gi zEp8Y8HDMw8IVqi$gH>71CD(kd4TCLt(X7u{cCUcTm`mr3VP2r{`_eAIm@>A3 zjJC^waN|gquItlzQqyZq+ed@U5A#(W@P9KhX1%Qx1bFrO%x4BAC3lV7 z9d!TvCq^@Ua;lRC?*ZyD1BFOEPB>?1fN~_c%3^RNEMAu4>P|gw005L#DDD`?i+C>} z7VkuKLxVomHiCde92#_1-Vkc&u7P(Z>iU!M=Ke+&j{X-NkvNdbDHdf4iVEP0_rd@v zt}bq#C<+?1kBg$-?};HG;J%92MKtJ~p$SlfM8*RVvItoySc^jRfrC!50F}u&0?JHN z`xgZD2@P`g@^VK(Ailo7vc7V%B(f6(hD0JEP&fn*2U9h`o_=m#7z)_UQ)Ca~Cx#~8 z(~(Sc_ac(qfP0u2EXmso4FXZefq(et>TYQGC%l{IFBYhLKqwe@2uv0Vadn0KZsF;r zy}W7Kwvluu2MwU^o(s2O|gy@?az!p$NufqN zjwo#s*%d=gC(#w-gon7hIqeVZ5sp$b(L;mave3UICN3B+0@VNwG9bEnQ~nyTAiCns zy)b)h!W0w~5%MqvC8Ux96d|wpmy#u(>`AS}Jxmx>Rt~;DvX>SVH5e+fn7uls0_@AF zv7j`_c#Ic`Y(XNqph0^s0rxEb95$pbCmhBLqlxjtQ$e9{I0^mPFBe<%e7Bo+=uD#?Q}ia0D7fj}yNm2enp{@_$* z3G!I1qoUH^(LG57FJBB9ujWMMk;)adJomW*O7160>hIdV&iK77PzeLWVBo(9L;fNR z@+)A-UeEX=Vr9tx;zW60;kPD3wfiZfHZN)~g#6hIe{r_gcK(akuUz~WXP`p=JIO!d z_g}jHrRyIt@Q;-Lt*(FR`bP}>Bjtaq>;H`|mcO=BcsJ_5AYbZcsV;h|mb%emz@FC8 z1nlm;?$+leQYFmpx>lY504w+2n+A}Y&PNq8dg&QzG0w2k9iS27^*1jA0B9}rG}SC9 zLrX(y7rE8=7$$sA3)|(u?jIb!e10$@iarb*#bkx%6*ggu9*ao-&d4%_Zw^;cy8sEB zJ*+0F`>b8R`PISv>GOInIXF%m4f7Wfsu<6IOI*=o362(64BwCcUO#CJtbqc_s*b}qp5BGO#2|GV*4do z&@$eQN#aM94d= zOUM`F#u}w8Kg_;WJjS+RRyuBdzCC}V4w~$5c!e4`nvTuf&&jby>^*^lr`2g=N2ycn$P*dRafmA|CS*Ral&wHOM z8^#)=HBY>GRq2{EWEN_L8lSybtxVGD+RY{a1k>Nfx#A@qOiVNKr|ha}RM90F8!27m zhvOpKFFP}Rx?|gnBYdRXuw=K8c+h!kpqa7k@bMZe-Mq^;4VY?ug3SVyYmW&3Xv5Xg zy-|FE%FL{@w@a?6I7*3qe2oDk-J*TOQG6QG)9g`1#lCll%$;Q-tTFb k`7RF}Z$B5+Y1cqkyEUd8Zsv@jmK;D&%Sf|G{e0N}02{0Xy8r+H diff --git a/Resources/Textures/Objects/Tanks/yellow.rsi/equipped-SUITSTORAGE-hamster.png b/Resources/Textures/Objects/Tanks/yellow.rsi/equipped-SUITSTORAGE-hamster.png deleted file mode 100644 index b4cf9b527ce8648773d6b12dc317340b1d006268..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21829 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 diff --git a/Resources/Textures/Objects/Tanks/yellow.rsi/equipped-SUITSTORAGE-kangaroo.png b/Resources/Textures/Objects/Tanks/yellow.rsi/equipped-SUITSTORAGE-kangaroo.png deleted file mode 100644 index f44f77d7775cda9c29c3c4ed5cb37d97a6e3e015..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16780 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 cd(I6&dNgb`pS%UA z?==6Wk5-+E=y7e+jK7?0g0yRn{2YdV(@)@bX=1-jfC(@GCcp%k025#WOn?b60Vco% zm;e)C0!)AjB%6SCQxuzysK7MS9!)*b`fA39iA}S$KZ09eAo;?_laQA02|3vcQ%m2ivJ-Nmt(;nEVHLOp07pg zmDU+K22@4228O$~* z(|L%g>XP%-dtq9ooprAUP{-B|V@^~xsNy=gS->M#N(;ZPDZ z*d}iZD`4M|paBIN7jd*$uYis4=^j}FkpKFUkbcLs#94Z+0vA_<^$KWJ0-g550OGuX wj{WT^qLZLOk;6kKzyz286JP>NAVmaz0bpkM8v*r8`Tzg`07*qoM6N<$f+U`QZvX%Q diff --git a/Resources/Textures/Objects/Tanks/yellow.rsi/equipped-SUITSTORAGE-possum.png b/Resources/Textures/Objects/Tanks/yellow.rsi/equipped-SUITSTORAGE-possum.png deleted file mode 100644 index 34993de6d80acc995845dd2a82c7ed3c4c080999..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8296 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 Y?$aW=KLEWTT6q98RdrR0l&<^zA4&xlGynhq diff --git a/Resources/Textures/Objects/Tanks/yellow.rsi/equipped-SUITSTORAGE-puppy.png b/Resources/Textures/Objects/Tanks/yellow.rsi/equipped-SUITSTORAGE-puppy.png deleted file mode 100644 index 423fcfbcd3e9aa3600633aeb1cc3ce7e6f2da4e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8427 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 diff --git a/Resources/Textures/Objects/Tanks/yellow.rsi/inhand-right.png b/Resources/Textures/Objects/Tanks/yellow.rsi/inhand-right.png deleted file mode 100644 index b79125ee7c6fe7e8eaef1c3dbb933f83bf834108..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 652 zcmV;70(1R|P)qVA8FpgOO2V)sbUgOE%|O1VZ=g+@rhP12D!IV~jDzSWFeeprq$8 zFPUjRt{4WXyE_B`!E@Qg4uB#{w7Id4NB;pg-7Dnsg_Q_G>;PoWk8s(!#p(Vw0KmV$ zLoQ!fso!CuvZ_(PUZj4#NS>pSB1;4eGb8D_g_Tu}Y)g+lr?+uGJT`~VW^3!8_uo6$ zZ{qf`2*)N+(z5_``ueRl-?@2?MuWCVY1{QM&lzUwFTWKl6aIS!L^Uqy@9^={kJRmY zlt0bSI6KKkuH!|vrIYKrV-3^1^MT-u3ZA`QZ(=5lWq@tzbas*j0932hQA0(RXc=~X z?||^({ZBMoTj*v@G#ZVGnGpF4T-2UWS~~;)xUNgfvUp&4DDNE*eoJ2f0Hw7%_M7Q5r2n+DB1jY4jVs`W#r+#Rn8wdfnm~V~jDz7-Nhv#u#HS5_L%``to(E`hX}R zYX-voiVDO`0T5X;pziKaE?>Y+_X>~x12#9-h1^Wd6aY~*0~N!dT)qJR{tf_ey1$Lf z&Mh+MN3(Q0f1+vz!uWQhiClRQTw&zXM) zOeN}?X%Phz;UI_{XQHHQ27=4ZMT|AZwsab_O>$kAp4SX4avmar5c?2JL(M>N_n(L~ m)eIyy{wmZAFvb{TY~(NYd{zE~1p00O0000 Date: Thu, 1 Feb 2024 06:54:39 +0000 Subject: [PATCH 103/266] Automatic changelog update (cherry picked from commit 1bbe1aba330f485cae7c2d24d52bdcfe148476e2) --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 88aada6af6b..d50b4a2121c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: IProduceWidgets - changes: - - message: Mops are now larger! - type: Tweak - - message: Defibs are now larger! - type: Tweak - id: 5346 - time: '2023-12-12T08:02:44.0000000+00:00' - author: metalgearsloth changes: - message: Fix arrivals fog not actually blocking, no more free roaming. @@ -3852,3 +3844,10 @@ id: 5845 time: '2024-02-01T06:36:43.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24747 +- author: lzk228 + changes: + - message: Yellow oxygen tank was removed to standardise gas tank colourings. + type: Remove + id: 5846 + time: '2024-02-01T06:53:33.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24374 From 1d944e4381fdbebe3280cf86e3d85c7838c506e8 Mon Sep 17 00:00:00 2001 From: Wertan <48354940+Wertanchik@users.noreply.github.com> Date: Thu, 1 Feb 2024 11:20:53 +0300 Subject: [PATCH 104/266] Adds emote "Buzz" for moth (#24556) * Buzzing moth * Update speech_emotes.yml (cherry picked from commit 507c39d4456df7536d13a91fd77074d436955624) --- .../Prototypes/Voice/speech_emote_sounds.yml | 2 ++ Resources/Prototypes/Voice/speech_emotes.yml | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/Resources/Prototypes/Voice/speech_emote_sounds.yml b/Resources/Prototypes/Voice/speech_emote_sounds.yml index 9810d805e92..96859954002 100644 --- a/Resources/Prototypes/Voice/speech_emote_sounds.yml +++ b/Resources/Prototypes/Voice/speech_emote_sounds.yml @@ -264,6 +264,8 @@ params: variation: 0.125 sounds: + Buzz: + path: /Audio/Voice/Moth/moth_scream.ogg Scream: path: /Audio/Voice/Moth/moth_scream.ogg Laugh: diff --git a/Resources/Prototypes/Voice/speech_emotes.yml b/Resources/Prototypes/Voice/speech_emotes.yml index 5950ac88576..86d273dd1c4 100644 --- a/Resources/Prototypes/Voice/speech_emotes.yml +++ b/Resources/Prototypes/Voice/speech_emotes.yml @@ -223,3 +223,21 @@ chatMessages: ["emote-deathgasp"] chatTriggers: - deathgasp + +- type: emote + id: Buzz + category: Vocal + chatMessages: [buzz!] + chatTriggers: + - buzzing + - buzzing! + - buzzing. + - buzz + - buzz. + - buzz! + - buzzed + - buzzed. + - buzzed! + - buzzes + - buzzes. + - buzzes! From 08840a55395859e94efd934e612e0030c6a86904 Mon Sep 17 00:00:00 2001 From: Kot <1192090+koteq@users.noreply.github.com> Date: Thu, 1 Feb 2024 12:30:07 +0400 Subject: [PATCH 105/266] Fix SSD indicator (#24589) Fix ssd indicator (cherry picked from commit fed43f05d0e95d51e2426a80c7e8963d585c5521) --- .../SSDIndicator/SSDIndicatorSystem.cs | 20 +++++++++++----- .../SSDIndicator/SSDIndicatorComponent.cs | 2 +- .../SSDIndicator/SSDIndicatorSystem.cs | 23 ++++--------------- 3 files changed, 20 insertions(+), 25 deletions(-) diff --git a/Content.Client/SSDIndicator/SSDIndicatorSystem.cs b/Content.Client/SSDIndicator/SSDIndicatorSystem.cs index f30d5650613..587450a2f66 100644 --- a/Content.Client/SSDIndicator/SSDIndicatorSystem.cs +++ b/Content.Client/SSDIndicator/SSDIndicatorSystem.cs @@ -1,4 +1,7 @@ using Content.Shared.CCVar; +using Content.Shared.Mind.Components; +using Content.Shared.Mobs.Systems; +using Content.Shared.NPC; using Content.Shared.SSDIndicator; using Content.Shared.StatusIcon; using Content.Shared.StatusIcon.Components; @@ -14,6 +17,7 @@ public sealed class SSDIndicatorSystem : EntitySystem { [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly IConfigurationManager _cfg = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; public override void Initialize() { @@ -24,11 +28,15 @@ public override void Initialize() private void OnGetStatusIcon(EntityUid uid, SSDIndicatorComponent component, ref GetStatusIconsEvent args) { - if (!component.IsSSD || - !_cfg.GetCVar(CCVars.ICShowSSDIndicator) || - args.InContainer) - return; - - args.StatusIcons.Add(_prototype.Index(component.Icon)); + if (component.IsSSD && + _cfg.GetCVar(CCVars.ICShowSSDIndicator) && + !args.InContainer && + !_mobState.IsDead(uid) && + !HasComp(uid) && + TryComp(uid, out var mindContainer) && + mindContainer.ShowExamineInfo) + { + args.StatusIcons.Add(_prototype.Index(component.Icon)); + } } } diff --git a/Content.Shared/SSDIndicator/SSDIndicatorComponent.cs b/Content.Shared/SSDIndicator/SSDIndicatorComponent.cs index 53e1f6a1406..66310505a1a 100644 --- a/Content.Shared/SSDIndicator/SSDIndicatorComponent.cs +++ b/Content.Shared/SSDIndicator/SSDIndicatorComponent.cs @@ -13,7 +13,7 @@ public sealed partial class SSDIndicatorComponent : Component { [ViewVariables(VVAccess.ReadWrite)] [AutoNetworkedField] - public bool IsSSD = false; + public bool IsSSD = true; [ViewVariables(VVAccess.ReadWrite)] [DataField("icon", customTypeSerializer: typeof(PrototypeIdSerializer))] diff --git a/Content.Shared/SSDIndicator/SSDIndicatorSystem.cs b/Content.Shared/SSDIndicator/SSDIndicatorSystem.cs index 4fe726113a1..7fc13d161e9 100644 --- a/Content.Shared/SSDIndicator/SSDIndicatorSystem.cs +++ b/Content.Shared/SSDIndicator/SSDIndicatorSystem.cs @@ -1,5 +1,4 @@ -using Content.Shared.Mind.Components; -using Content.Shared.NPC; +using Robust.Shared.Player; namespace Content.Shared.SSDIndicator; @@ -10,30 +9,18 @@ public sealed class SSDIndicatorSystem : EntitySystem { public override void Initialize() { - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnMindAdded); - SubscribeLocalEvent(OnMindRemoved); + SubscribeLocalEvent(OnPlayerAttached); + SubscribeLocalEvent(OnPlayerDetached); } - private void OnInit(EntityUid uid, SSDIndicatorComponent component, ComponentInit args) - { - if (HasComp(uid)) - return; - - component.IsSSD = !HasComp(uid); - } - - private void OnMindAdded(EntityUid uid, SSDIndicatorComponent component, MindAddedMessage args) + private void OnPlayerAttached(EntityUid uid, SSDIndicatorComponent component, PlayerAttachedEvent args) { component.IsSSD = false; Dirty(uid, component); } - private void OnMindRemoved(EntityUid uid, SSDIndicatorComponent component, MindRemovedMessage args) + private void OnPlayerDetached(EntityUid uid, SSDIndicatorComponent component, PlayerDetachedEvent args) { - if (HasComp(uid)) - return; - component.IsSSD = true; Dirty(uid, component); } From b900fd9910fa9f48b6410ea76a825932f8c3ca0c Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 1 Feb 2024 08:31:14 +0000 Subject: [PATCH 106/266] Automatic changelog update (cherry picked from commit 4ee95501dc7934e97c3cc867e7d54a2f74bb945e) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index d50b4a2121c..fa33db4087b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: metalgearsloth - changes: - - message: Fix arrivals fog not actually blocking, no more free roaming. - type: Fix - id: 5347 - time: '2023-12-12T09:20:33.0000000+00:00' - author: themias changes: - message: Added fill visuals to Hot Chocolate @@ -3851,3 +3845,10 @@ id: 5846 time: '2024-02-01T06:53:33.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24374 +- author: koteq + changes: + - message: Fixed indicator near SSD players + type: Fix + id: 5847 + time: '2024-02-01T08:30:07.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24589 From 0f483e31dd070e1c61a2cf1bbde42c2e8e97ad33 Mon Sep 17 00:00:00 2001 From: Skarletto <122584947+Skarletto@users.noreply.github.com> Date: Thu, 1 Feb 2024 03:33:23 -0500 Subject: [PATCH 107/266] Ghost Role description clarity (#24333) * clarity? * h * bleeeurgh * review ass --------- Co-authored-by: metalgearsloth (cherry picked from commit 48f5bfb74ab4a2a39c7a72bcecf422dd015471a6) --- .../en-US/ghost/roles/ghost-role-component.ftl | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl index 252f1ebfafe..020d81395c4 100644 --- a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl +++ b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl @@ -1,5 +1,6 @@ # also used in MakeGhostRuleWindow and MakeGhostRoleCommand -ghost-role-component-default-rules = You don't remember any of your previous life unless an administrator tells you otherwise. +ghost-role-component-default-rules = All normal rules apply unless an administrator tells you otherwise. + You don't remember any of your previous life, and you don't remember anything you learned as a ghost. You are allowed to remember knowledge about the game in general, such as how to cook, how to use objects, etc. You are absolutely [color=red]NOT[/color] allowed to remember, say, the name, appearance, etc. of your previous character. @@ -21,7 +22,7 @@ ghost-role-information-mothroach-name = Mothroach ghost-role-information-mothroach-description = A cute but mischievous mothroach. ghost-role-information-giant-spider-name = Giant spider -ghost-role-information-giant-spider-description = Wreak havoc on the station's inhabitants! +ghost-role-information-giant-spider-description = This station's inhabitants look mighty tasty, and your sticky web is perfect to catch them! ghost-role-information-cognizine-description = Made conscious with the magic of cognizine. @@ -32,8 +33,10 @@ ghost-role-information-hamlet-name = Hamlet the hamster. ghost-role-information-hamlet-description = Lives in the station bridge, has a bit of a temper and is always hungry. ghost-role-information-slimes-name = Slime -ghost-role-information-slimes-description = An ordinary slime with no special needs or interests. He just lives. -ghost-role-information-angry-slimes-description = Everything around you irritates your instincts, destroy them! +ghost-role-information-slimes-description = An ordinary slime with no special needs or interests. You are friendly to others. + +ghost-role-information-angry-slimes-name = Slime +ghost-role-information-angry-slimes-description = Everyone around you irritates your instincts, destroy them! ghost-role-information-smile-name = Smile the Slime ghost-role-information-smile-description = The sweetest creature in the world. Smile Slime! @@ -103,13 +106,13 @@ ghost-role-information-supplybot-name = SupplyBot ghost-role-information-supplybot-description = Deliver goods around the station. ghost-role-information-space-bear-name = Space bear -ghost-role-information-space-bear-description = You're a bear! Do bear things. +ghost-role-information-space-bear-description = Your tummy rumbles, and these people look really yummy... What a feast! ghost-role-information-salvage-bear-name = Space bear on salvage wreck ghost-role-information-salvage-bear-description = Defend the loot inside the salvage wreck! ghost-role-information-space-kangaroo-name = Space kangaroo -ghost-role-information-space-kangaroo-description = You're a kangaroo! Do kangaroo things. +ghost-role-information-space-kangaroo-description = Give the crew a taste of your sharp claws! ghost-role-information-salvage-kangaroo-name = Space kangaroo on salvage wreck ghost-role-information-salvage-kangaroo-description = Defend the loot inside the salvage wreck! @@ -168,7 +171,7 @@ ghost-role-information-remilia-name = Remilia, the chaplain's familiar ghost-role-information-remilia-description = Obey your master. Eat fruit. ghost-role-information-remilia-rules = You are an intelligent fruit bat. Follow the chaplain around. Don't cause any trouble unless the chaplain tells you to. -ghost-role-information-cerberus-name = Cerberus, Evil Famili +ghost-role-information-cerberus-name = Cerberus, Evil Familiar ghost-role-information-cerberus-description = Obey your master. Spread chaos. ghost-role-information-cerberus-rules = You are an intelligent, demonic dog. Try to help the chaplain and any of his flock. As an antagonist, you're otherwise unrestrained. From 3d3bd4f4e0c260f0e7527c765ec44343257724b6 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Thu, 1 Feb 2024 19:36:08 +1100 Subject: [PATCH 108/266] Remove EntityUid from debug context menu (#24660) - Probably confusing if you're not familiar with nentities - if I need the clientside uid for debugging I can just open VV and it's immediately there on first page. (cherry picked from commit ca5470918679d73a95404b08fc76d2be088a6876) --- Content.Client/ContextMenu/UI/EntityMenuElement.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Content.Client/ContextMenu/UI/EntityMenuElement.cs b/Content.Client/ContextMenu/UI/EntityMenuElement.cs index 8a8070aeccd..d088f4f4034 100644 --- a/Content.Client/ContextMenu/UI/EntityMenuElement.cs +++ b/Content.Client/ContextMenu/UI/EntityMenuElement.cs @@ -79,12 +79,11 @@ private string GetEntityDescriptionAdmin(EntityUid entity) var representation = _entityManager.ToPrettyString(entity); var name = representation.Name; - var id = representation.Uid.ToString(); var prototype = representation.Prototype; var playerName = representation.Session?.Name ?? SearchPlayerName(entity); var deleted = representation.Deleted; - return $"{name} ({id} / {_entityManager.GetNetEntity(entity).ToString()}{(prototype != null ? $", {prototype}" : "")}{(playerName != null ? $", {playerName}" : "")}){(deleted ? "D" : "")}"; + return $"{name} ({_entityManager.GetNetEntity(entity).ToString()}{(prototype != null ? $", {prototype}" : "")}{(playerName != null ? $", {playerName}" : "")}){(deleted ? "D" : "")}"; } private string GetEntityDescription(EntityUid entity) @@ -94,7 +93,7 @@ private string GetEntityDescription(EntityUid entity) return GetEntityDescriptionAdmin(entity); } - return Identity.Name(entity, _entityManager, _playerManager.LocalPlayer!.ControlledEntity!); + return Identity.Name(entity, _entityManager, _playerManager.LocalEntity!); } /// From f6f08bdc55e90340a1a880b708fc16ca752ed614 Mon Sep 17 00:00:00 2001 From: Sergey Dikiy Date: Thu, 1 Feb 2024 09:40:57 +0100 Subject: [PATCH 109/266] Added Warning state for AME (#24699) added warning state for AME (cherry picked from commit f3ff35dcfa5afb417c24ba9f21cfc2bc414d0c4f) --- .../Ame/EntitySystems/AmeControllerSystem.cs | 1 + .../Ame/SharedAmeControllerComponent.cs | 1 + .../Structures/Power/Generation/ame.yml | 1 + .../Generation/ame.rsi/control_warning.png | Bin 0 -> 643 bytes .../Power/Generation/ame.rsi/meta.json | 26 ++++++++++++++++++ 5 files changed, 29 insertions(+) create mode 100644 Resources/Textures/Structures/Power/Generation/ame.rsi/control_warning.png diff --git a/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs b/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs index af3e474d08b..93b2a29a767 100644 --- a/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs +++ b/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs @@ -263,6 +263,7 @@ private void UpdateDisplay(EntityUid uid, int stability, AmeControllerComponent? { < 10 => AmeControllerState.Fuck, < 50 => AmeControllerState.Critical, + < 80 => AmeControllerState.Warning, _ => AmeControllerState.On, }; diff --git a/Content.Shared/Ame/SharedAmeControllerComponent.cs b/Content.Shared/Ame/SharedAmeControllerComponent.cs index 8dde66724d5..11925a82a09 100644 --- a/Content.Shared/Ame/SharedAmeControllerComponent.cs +++ b/Content.Shared/Ame/SharedAmeControllerComponent.cs @@ -69,6 +69,7 @@ public enum AmeControllerVisuals public enum AmeControllerState { On, + Warning, Critical, Fuck, Off, diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/ame.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/ame.yml index d12301b3f30..78fdaae01a4 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/ame.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/ame.yml @@ -67,6 +67,7 @@ display: Off: { visible: false } On: { state: control_on, visible: true } + Warning: { state: control_warning, visible: true } Critical: { state: control_critical, visible: true } Fuck: { state: control_fuck, visible: true } - type: NodeContainer diff --git a/Resources/Textures/Structures/Power/Generation/ame.rsi/control_warning.png b/Resources/Textures/Structures/Power/Generation/ame.rsi/control_warning.png new file mode 100644 index 0000000000000000000000000000000000000000..7f64302cdc19150af92711d3f084f6236186cc82 GIT binary patch literal 643 zcmeAS@N?(olHy`uVBq!ia0vp^3xK$RgAGXbBqvD&DYhhUcNd2L45t_v*30Lo0!26r zJR*x382Ao@Fyrz36)6l1Ov;`vjv*Dd-rhMKc-TOMHQ=V{1(&V`so%CZuuqx5Brz>% zcA`+N!?oj<>BoK4%q!1tI{B;(XcohrA65K@an3rGxjl-{`Y842diB5B^ArAS zEKlKI`$_)klV<_5_glyHY?(gi&z+Ndw&o_@-nL=u9_Bm$=I&;mqxe70@1Jor`-R4HvH_z;F5LWH2c{k`Jn*S|Uc5@bTM5X973w`}>kQv16+KNY8Ze$cvi+i~p+^SY_;-8s-~+%O}AKW3f!`cV5=t>==TimP8t zyx*MF=bA5&{!_2|thnsO^V46gw9bZjv(*0a2kV4Y>g&IE+86uBy<2d8LwjO>f^B87 vj$PfH*N?1Q>h^5>x%ju_Uk*kji!AobUtPNX@u|zqhd`p9u6{1-oD!M Date: Thu, 1 Feb 2024 11:45:24 +0300 Subject: [PATCH 110/266] Lock Anomaly generator to research access (#24464) * small patch * fix * remove garbage * fix * moved to shared events * fix * LocId --------- Co-authored-by: metalgearsloth (cherry picked from commit 498ad2d5d714c73d9212bda9d3d89d53b2001e04) --- .../Access/Systems/AgentIDCardSystem.cs | 2 +- .../Arcade/BlockGame/BlockGameArcadeSystem.cs | 2 +- .../SpaceVillainArcadeSystem.cs | 2 +- .../Atmos/EntitySystems/GasTankSystem.cs | 2 +- .../EntitySystems/GasThermoMachineSystem.cs | 2 +- .../Bed/Cryostorage/CryostorageSystem.cs | 2 +- .../Cloning/CloningConsoleSystem.cs | 2 +- .../Systems/SignalTimerSystem.cs | 3 +- .../Systems/NetworkConfiguratorSystem.cs | 2 +- Content.Server/Drone/DroneSystem.cs | 2 +- .../ActivatableUIRequiresVisionSystem.cs | 2 +- Content.Server/Fax/FaxSystem.cs | 2 +- .../Systems/ForensicScannerSystem.cs | 2 +- .../Gateway/Systems/GatewaySystem.cs | 2 +- Content.Server/Lathe/LatheSystem.cs | 2 +- .../ActivatableUIRequiresLockSystem.cs | 3 +- .../MagicMirror/MagicMirrorSystem.cs | 2 +- Content.Server/Medical/CryoPodSystem.cs | 2 +- Content.Server/NukeOps/WarDeclaratorSystem.cs | 4 +- Content.Server/Paper/PaperSystem.cs | 2 +- .../ActivatableUIRequiresPowerSystem.cs | 3 +- .../Radio/EntitySystems/RadioDeviceSystem.cs | 2 +- .../Systems/ResearchSystem.Console.cs | 2 +- .../Systems/DiskConsoleSystem.cs | 4 +- .../Systems/EmergencyShuttleSystem.Console.cs | 2 +- .../Systems/ShuttleConsoleSystem.Drone.cs | 2 +- .../Shuttles/Systems/ShuttleConsoleSystem.cs | 1 + .../Silicons/Borgs/BorgSystem.Ui.cs | 4 +- Content.Server/Silicons/Borgs/BorgSystem.cs | 4 +- Content.Server/Sound/EmitSoundSystem.cs | 4 +- .../Store/Systems/StoreSystem.Ui.cs | 3 +- Content.Server/Store/Systems/StoreSystem.cs | 2 +- .../SurveillanceCameraMonitorSystem.cs | 2 +- .../ActivatableUISystem.Power.cs | 1 + .../UserInterface/ActivatableUISystem.cs | 50 ------------------ .../VendingMachines/VendingMachineSystem.cs | 1 + Content.Server/Wires/WiresSystem.cs | 3 +- .../Systems/ArtifactAnalyzerSystem.cs | 3 +- .../ActivatableUIRequiresAccessComponent.cs | 11 ++++ .../ActivatableUIRequiresAccessSystem.cs | 31 +++++++++++ .../UserInterface/ActivatableUIEvents.cs | 52 +++++++++++++++++++ .../Structures/Machines/anomaly_equipment.yml | 3 ++ 42 files changed, 142 insertions(+), 92 deletions(-) create mode 100644 Content.Shared/Access/Components/ActivatableUIRequiresAccessComponent.cs create mode 100644 Content.Shared/Access/Systems/ActivatableUIRequiresAccessSystem.cs create mode 100644 Content.Shared/UserInterface/ActivatableUIEvents.cs diff --git a/Content.Server/Access/Systems/AgentIDCardSystem.cs b/Content.Server/Access/Systems/AgentIDCardSystem.cs index b0772fcc32b..4d242e8f81d 100644 --- a/Content.Server/Access/Systems/AgentIDCardSystem.cs +++ b/Content.Server/Access/Systems/AgentIDCardSystem.cs @@ -1,6 +1,6 @@ using Content.Server.Access.Components; using Content.Server.Popups; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Shared.Access.Components; using Content.Shared.Access.Systems; using Content.Shared.Interaction; diff --git a/Content.Server/Arcade/BlockGame/BlockGameArcadeSystem.cs b/Content.Server/Arcade/BlockGame/BlockGameArcadeSystem.cs index a57401cbb19..34a5689fd15 100644 --- a/Content.Server/Arcade/BlockGame/BlockGameArcadeSystem.cs +++ b/Content.Server/Arcade/BlockGame/BlockGameArcadeSystem.cs @@ -1,5 +1,5 @@ using Content.Server.Power.Components; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Shared.Arcade; using Robust.Server.GameObjects; using Robust.Shared.Player; diff --git a/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeSystem.cs b/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeSystem.cs index eae9b949647..d97c94fd992 100644 --- a/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeSystem.cs +++ b/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeSystem.cs @@ -1,5 +1,5 @@ using Content.Server.Power.Components; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using static Content.Shared.Arcade.SharedSpaceVillainArcadeComponent; using Robust.Server.GameObjects; using Robust.Shared.Audio; diff --git a/Content.Server/Atmos/EntitySystems/GasTankSystem.cs b/Content.Server/Atmos/EntitySystems/GasTankSystem.cs index e00990f5944..dfe84473402 100644 --- a/Content.Server/Atmos/EntitySystems/GasTankSystem.cs +++ b/Content.Server/Atmos/EntitySystems/GasTankSystem.cs @@ -4,7 +4,7 @@ using Content.Server.Body.Systems; using Content.Server.Cargo.Systems; using Content.Server.Explosion.EntitySystems; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Shared.Actions; using Content.Shared.Atmos; using Content.Shared.Atmos.Components; diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs index 8e065921fed..ee0dca0fb0a 100644 --- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs +++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs @@ -14,7 +14,7 @@ using JetBrains.Annotations; using Robust.Server.GameObjects; using Content.Server.Power.EntitySystems; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Shared.Administration.Logs; using Content.Shared.Database; using Content.Shared.Examine; diff --git a/Content.Server/Bed/Cryostorage/CryostorageSystem.cs b/Content.Server/Bed/Cryostorage/CryostorageSystem.cs index f82f835d876..11184bee0ad 100644 --- a/Content.Server/Bed/Cryostorage/CryostorageSystem.cs +++ b/Content.Server/Bed/Cryostorage/CryostorageSystem.cs @@ -6,7 +6,7 @@ using Content.Server.Popups; using Content.Server.Station.Components; using Content.Server.Station.Systems; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Shared.Access.Systems; using Content.Shared.Bed.Cryostorage; using Content.Shared.Chat; diff --git a/Content.Server/Cloning/CloningConsoleSystem.cs b/Content.Server/Cloning/CloningConsoleSystem.cs index 0be9b641345..41768066392 100644 --- a/Content.Server/Cloning/CloningConsoleSystem.cs +++ b/Content.Server/Cloning/CloningConsoleSystem.cs @@ -5,7 +5,7 @@ using Content.Server.Medical.Components; using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Shared.Cloning; using Content.Shared.Cloning.CloningConsole; using Content.Shared.Database; diff --git a/Content.Server/DeviceLinking/Systems/SignalTimerSystem.cs b/Content.Server/DeviceLinking/Systems/SignalTimerSystem.cs index 8cdeac3e8eb..0426ee7cc36 100644 --- a/Content.Server/DeviceLinking/Systems/SignalTimerSystem.cs +++ b/Content.Server/DeviceLinking/Systems/SignalTimerSystem.cs @@ -1,11 +1,10 @@ using Content.Server.DeviceLinking.Components; using Content.Server.DeviceLinking.Events; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Shared.Access.Systems; using Content.Shared.MachineLinking; using Content.Shared.TextScreen; using Robust.Server.GameObjects; -using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Timing; diff --git a/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs b/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs index c8faa930d11..9a038f1c78a 100644 --- a/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs @@ -2,7 +2,6 @@ using Content.Server.Administration.Logs; using Content.Server.DeviceLinking.Systems; using Content.Server.DeviceNetwork.Components; -using Content.Server.UserInterface; using Content.Shared.Access.Components; using Content.Shared.Access.Systems; using Content.Shared.Database; @@ -13,6 +12,7 @@ using Content.Shared.Examine; using Content.Shared.Interaction; using Content.Shared.Popups; +using Content.Shared.UserInterface; using Content.Shared.Verbs; using JetBrains.Annotations; using Robust.Server.Audio; diff --git a/Content.Server/Drone/DroneSystem.cs b/Content.Server/Drone/DroneSystem.cs index 7e1199bb4d6..769d1b5d119 100644 --- a/Content.Server/Drone/DroneSystem.cs +++ b/Content.Server/Drone/DroneSystem.cs @@ -3,7 +3,7 @@ using Content.Server.Ghost.Roles.Components; using Content.Server.Popups; using Content.Server.Tools.Innate; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Shared.Body.Components; using Content.Shared.Drone; using Content.Shared.Emoting; diff --git a/Content.Server/Eye/Blinding/ActivatableUIRequiresVisionSystem.cs b/Content.Server/Eye/Blinding/ActivatableUIRequiresVisionSystem.cs index 7bed97db123..b51efc2f5e1 100644 --- a/Content.Server/Eye/Blinding/ActivatableUIRequiresVisionSystem.cs +++ b/Content.Server/Eye/Blinding/ActivatableUIRequiresVisionSystem.cs @@ -1,5 +1,5 @@ using Content.Shared.Eye.Blinding; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Server.Popups; using Content.Shared.Eye.Blinding.Components; using Content.Shared.Eye.Blinding.Systems; diff --git a/Content.Server/Fax/FaxSystem.cs b/Content.Server/Fax/FaxSystem.cs index 5ea4393865b..f25fb625425 100644 --- a/Content.Server/Fax/FaxSystem.cs +++ b/Content.Server/Fax/FaxSystem.cs @@ -8,7 +8,7 @@ using Content.Server.Popups; using Content.Server.Power.Components; using Content.Server.Tools; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Shared.Administration.Logs; using Content.Shared.Containers.ItemSlots; using Content.Shared.Database; diff --git a/Content.Server/Forensics/Systems/ForensicScannerSystem.cs b/Content.Server/Forensics/Systems/ForensicScannerSystem.cs index 6710864c729..be44f9e203b 100644 --- a/Content.Server/Forensics/Systems/ForensicScannerSystem.cs +++ b/Content.Server/Forensics/Systems/ForensicScannerSystem.cs @@ -2,7 +2,7 @@ using System.Text; using Content.Server.Paper; using Content.Server.Popups; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Shared.DoAfter; using Content.Shared.Forensics; using Content.Shared.Hands.EntitySystems; diff --git a/Content.Server/Gateway/Systems/GatewaySystem.cs b/Content.Server/Gateway/Systems/GatewaySystem.cs index 14be1132482..52525ee0d4c 100644 --- a/Content.Server/Gateway/Systems/GatewaySystem.cs +++ b/Content.Server/Gateway/Systems/GatewaySystem.cs @@ -1,6 +1,6 @@ using Content.Server.Gateway.Components; using Content.Server.Station.Systems; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Shared.Access.Systems; using Content.Shared.Gateway; using Content.Shared.Popups; diff --git a/Content.Server/Lathe/LatheSystem.cs b/Content.Server/Lathe/LatheSystem.cs index 8b1f3b471c5..621c583a558 100644 --- a/Content.Server/Lathe/LatheSystem.cs +++ b/Content.Server/Lathe/LatheSystem.cs @@ -8,7 +8,7 @@ using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; using Content.Server.Stack; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Shared.Database; using Content.Shared.Emag.Components; using Content.Shared.Lathe; diff --git a/Content.Server/Lock/EntitySystems/ActivatableUIRequiresLockSystem.cs b/Content.Server/Lock/EntitySystems/ActivatableUIRequiresLockSystem.cs index bfb2fbc6e16..dfe398ebafa 100644 --- a/Content.Server/Lock/EntitySystems/ActivatableUIRequiresLockSystem.cs +++ b/Content.Server/Lock/EntitySystems/ActivatableUIRequiresLockSystem.cs @@ -1,7 +1,8 @@ using Content.Server.Lock.Components; using Content.Server.Popups; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Shared.Lock; +using Content.Server.UserInterface; namespace Content.Server.Lock.EntitySystems; public sealed class ActivatableUIRequiresLockSystem : EntitySystem diff --git a/Content.Server/MagicMirror/MagicMirrorSystem.cs b/Content.Server/MagicMirror/MagicMirrorSystem.cs index f6858e10a05..aef6e11d71c 100644 --- a/Content.Server/MagicMirror/MagicMirrorSystem.cs +++ b/Content.Server/MagicMirror/MagicMirrorSystem.cs @@ -1,7 +1,7 @@ using System.Linq; using Content.Server.DoAfter; using Content.Server.Humanoid; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Shared.DoAfter; using Content.Shared.Humanoid; using Content.Shared.Humanoid.Markings; diff --git a/Content.Server/Medical/CryoPodSystem.cs b/Content.Server/Medical/CryoPodSystem.cs index 3fcec3a824c..e05dc2494fb 100644 --- a/Content.Server/Medical/CryoPodSystem.cs +++ b/Content.Server/Medical/CryoPodSystem.cs @@ -13,7 +13,7 @@ using Content.Server.NodeContainer.Nodes; using Content.Server.Power.Components; using Content.Server.Temperature.Components; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Shared.Chemistry; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Components.SolutionManager; diff --git a/Content.Server/NukeOps/WarDeclaratorSystem.cs b/Content.Server/NukeOps/WarDeclaratorSystem.cs index 328990738e7..7761651f4ee 100644 --- a/Content.Server/NukeOps/WarDeclaratorSystem.cs +++ b/Content.Server/NukeOps/WarDeclaratorSystem.cs @@ -1,12 +1,12 @@ -using Content.Server.Administration.Logs; +using Content.Server.Administration.Logs; using Content.Server.GameTicking.Rules; using Content.Server.GameTicking.Rules.Components; using Content.Server.Popups; -using Content.Server.UserInterface; using Content.Shared.CCVar; using Content.Shared.Chat; using Content.Shared.Database; using Content.Shared.NukeOps; +using Content.Shared.UserInterface; using Robust.Server.GameObjects; using Robust.Shared.Configuration; diff --git a/Content.Server/Paper/PaperSystem.cs b/Content.Server/Paper/PaperSystem.cs index 39277814098..80cc8fa4aed 100644 --- a/Content.Server/Paper/PaperSystem.cs +++ b/Content.Server/Paper/PaperSystem.cs @@ -1,7 +1,7 @@ using System.Linq; using Content.Server.Administration.Logs; using Content.Server.Popups; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Shared.Database; using Content.Shared.Examine; using Content.Shared.Interaction; diff --git a/Content.Server/Power/EntitySystems/ActivatableUIRequiresPowerSystem.cs b/Content.Server/Power/EntitySystems/ActivatableUIRequiresPowerSystem.cs index 5f32b4b06bd..561b0e71f09 100644 --- a/Content.Server/Power/EntitySystems/ActivatableUIRequiresPowerSystem.cs +++ b/Content.Server/Power/EntitySystems/ActivatableUIRequiresPowerSystem.cs @@ -1,8 +1,9 @@ using Content.Shared.Popups; using Content.Server.Power.Components; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using JetBrains.Annotations; using Content.Shared.Wires; +using Content.Server.UserInterface; namespace Content.Server.Power.EntitySystems; diff --git a/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs b/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs index 2cd3777c526..ace7d8ae31a 100644 --- a/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs +++ b/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs @@ -6,7 +6,7 @@ using Content.Server.Radio.Components; using Content.Server.Speech; using Content.Server.Speech.Components; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Shared.Chat; using Content.Shared.Examine; using Content.Shared.Interaction; diff --git a/Content.Server/Research/Systems/ResearchSystem.Console.cs b/Content.Server/Research/Systems/ResearchSystem.Console.cs index e802e2c7f9e..9f95fd25176 100644 --- a/Content.Server/Research/Systems/ResearchSystem.Console.cs +++ b/Content.Server/Research/Systems/ResearchSystem.Console.cs @@ -1,6 +1,6 @@ using Content.Server.Power.EntitySystems; using Content.Server.Research.Components; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Shared.Access.Components; using Content.Shared.Research.Components; using Content.Shared.Research.Prototypes; diff --git a/Content.Server/Research/TechnologyDisk/Systems/DiskConsoleSystem.cs b/Content.Server/Research/TechnologyDisk/Systems/DiskConsoleSystem.cs index 8a65e0a8bc7..2064abd8ebf 100644 --- a/Content.Server/Research/TechnologyDisk/Systems/DiskConsoleSystem.cs +++ b/Content.Server/Research/TechnologyDisk/Systems/DiskConsoleSystem.cs @@ -1,6 +1,6 @@ -using Content.Server.Research.Systems; +using Content.Server.Research.Systems; using Content.Server.Research.TechnologyDisk.Components; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Shared.Research; using Content.Shared.Research.Components; using Robust.Server.Audio; diff --git a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs index 3b9a12a3310..37c70c4e486 100644 --- a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs +++ b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs @@ -4,7 +4,7 @@ using Content.Server.Screens.Components; using Content.Server.Shuttles.Components; using Content.Server.Shuttles.Events; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Shared.Access; using Content.Shared.CCVar; using Content.Shared.Database; diff --git a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.Drone.cs b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.Drone.cs index cef4faa13b2..99ab54f9afa 100644 --- a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.Drone.cs +++ b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.Drone.cs @@ -1,7 +1,7 @@ using Content.Server.Shuttles.Components; using Content.Server.Shuttles.Events; using Content.Server.Station.Components; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; namespace Content.Server.Shuttles.Systems; diff --git a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs index afe9d78a25c..18dd3b0baf0 100644 --- a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs +++ b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs @@ -20,6 +20,7 @@ using Robust.Shared.Physics.Components; using Robust.Shared.Timing; using Robust.Shared.Utility; +using Content.Shared.UserInterface; namespace Content.Server.Shuttles.Systems; diff --git a/Content.Server/Silicons/Borgs/BorgSystem.Ui.cs b/Content.Server/Silicons/Borgs/BorgSystem.Ui.cs index fa551ebc37e..8af682114c8 100644 --- a/Content.Server/Silicons/Borgs/BorgSystem.Ui.cs +++ b/Content.Server/Silicons/Borgs/BorgSystem.Ui.cs @@ -1,5 +1,5 @@ -using System.Linq; -using Content.Server.UserInterface; +using System.Linq; +using Content.Shared.UserInterface; using Content.Shared.Database; using Content.Shared.NameIdentifier; using Content.Shared.PowerCell.Components; diff --git a/Content.Server/Silicons/Borgs/BorgSystem.cs b/Content.Server/Silicons/Borgs/BorgSystem.cs index 4d7892c0b71..0efbe1a40ab 100644 --- a/Content.Server/Silicons/Borgs/BorgSystem.cs +++ b/Content.Server/Silicons/Borgs/BorgSystem.cs @@ -1,9 +1,9 @@ -using Content.Server.Actions; +using Content.Server.Actions; using Content.Server.Administration.Logs; using Content.Server.Administration.Managers; using Content.Server.Hands.Systems; using Content.Server.PowerCell; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Shared.Access.Systems; using Content.Shared.Alert; using Content.Shared.Database; diff --git a/Content.Server/Sound/EmitSoundSystem.cs b/Content.Server/Sound/EmitSoundSystem.cs index 3c7713b305c..059800c3f9d 100644 --- a/Content.Server/Sound/EmitSoundSystem.cs +++ b/Content.Server/Sound/EmitSoundSystem.cs @@ -1,6 +1,6 @@ -using Content.Server.Explosion.EntitySystems; +using Content.Server.Explosion.EntitySystems; using Content.Server.Sound.Components; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Shared.Sound; using Robust.Shared.Random; diff --git a/Content.Server/Store/Systems/StoreSystem.Ui.cs b/Content.Server/Store/Systems/StoreSystem.Ui.cs index 32c9a050435..7599b08b3ce 100644 --- a/Content.Server/Store/Systems/StoreSystem.Ui.cs +++ b/Content.Server/Store/Systems/StoreSystem.Ui.cs @@ -4,13 +4,12 @@ using Content.Server.PDA.Ringer; using Content.Server.Stack; using Content.Server.Store.Components; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Shared.Database; using Content.Shared.FixedPoint; using Content.Shared.Hands.EntitySystems; using Content.Shared.Store; using Robust.Server.GameObjects; -using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Player; diff --git a/Content.Server/Store/Systems/StoreSystem.cs b/Content.Server/Store/Systems/StoreSystem.cs index 6a49e80797d..ea280943997 100644 --- a/Content.Server/Store/Systems/StoreSystem.cs +++ b/Content.Server/Store/Systems/StoreSystem.cs @@ -1,5 +1,5 @@ using Content.Server.Store.Components; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Shared.FixedPoint; using Content.Shared.Implants.Components; using Content.Shared.Interaction; diff --git a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraMonitorSystem.cs b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraMonitorSystem.cs index 39dcb1a9e0f..cbc2f6d31ec 100644 --- a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraMonitorSystem.cs +++ b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraMonitorSystem.cs @@ -2,7 +2,7 @@ using Content.Server.DeviceNetwork; using Content.Server.DeviceNetwork.Systems; using Content.Server.Power.Components; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Shared.SurveillanceCamera; using Robust.Server.GameObjects; using Robust.Shared.Player; diff --git a/Content.Server/UserInterface/ActivatableUISystem.Power.cs b/Content.Server/UserInterface/ActivatableUISystem.Power.cs index 7c687aa3cd4..d4dcc91d46e 100644 --- a/Content.Server/UserInterface/ActivatableUISystem.Power.cs +++ b/Content.Server/UserInterface/ActivatableUISystem.Power.cs @@ -1,5 +1,6 @@ using Content.Server.PowerCell; using Content.Shared.PowerCell; +using Content.Shared.UserInterface; using Robust.Shared.Containers; namespace Content.Server.UserInterface; diff --git a/Content.Server/UserInterface/ActivatableUISystem.cs b/Content.Server/UserInterface/ActivatableUISystem.cs index e3dad633586..387221e00ca 100644 --- a/Content.Server/UserInterface/ActivatableUISystem.cs +++ b/Content.Server/UserInterface/ActivatableUISystem.cs @@ -218,53 +218,3 @@ private void OnHandDeselected(EntityUid uid, ActivatableUIComponent? aui, HandDe CloseAll(uid, aui); } } - -public sealed class ActivatableUIOpenAttemptEvent : CancellableEntityEventArgs -{ - public EntityUid User { get; } - public ActivatableUIOpenAttemptEvent(EntityUid who) - { - User = who; - } -} - -public sealed class UserOpenActivatableUIAttemptEvent : CancellableEntityEventArgs //have to one-up the already stroke-inducing name -{ - public EntityUid User { get; } - public EntityUid Target { get; } - public UserOpenActivatableUIAttemptEvent(EntityUid who, EntityUid target) - { - User = who; - Target = target; - } -} - -public sealed class AfterActivatableUIOpenEvent : EntityEventArgs -{ - public EntityUid User { get; } - public readonly ICommonSession Session; - - public AfterActivatableUIOpenEvent(EntityUid who, ICommonSession session) - { - User = who; - Session = session; - } -} - -/// -/// This is after it's decided the user can open the UI, -/// but before the UI actually opens. -/// Use this if you need to prepare the UI itself -/// -public sealed class BeforeActivatableUIOpenEvent : EntityEventArgs -{ - public EntityUid User { get; } - public BeforeActivatableUIOpenEvent(EntityUid who) - { - User = who; - } -} - -public sealed class ActivatableUIPlayerChangedEvent : EntityEventArgs -{ -} diff --git a/Content.Server/VendingMachines/VendingMachineSystem.cs b/Content.Server/VendingMachines/VendingMachineSystem.cs index f2c7e6dd19b..9443b0b3948 100644 --- a/Content.Server/VendingMachines/VendingMachineSystem.cs +++ b/Content.Server/VendingMachines/VendingMachineSystem.cs @@ -18,6 +18,7 @@ using Content.Shared.Emp; using Content.Shared.Popups; using Content.Shared.Throwing; +using Content.Shared.UserInterface; using Content.Shared.VendingMachines; using Robust.Server.GameObjects; using Robust.Shared.Audio; diff --git a/Content.Server/Wires/WiresSystem.cs b/Content.Server/Wires/WiresSystem.cs index cb019e3d64a..5275a95c340 100644 --- a/Content.Server/Wires/WiresSystem.cs +++ b/Content.Server/Wires/WiresSystem.cs @@ -5,7 +5,7 @@ using Content.Server.Construction; using Content.Server.Construction.Components; using Content.Server.Power.Components; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Shared.Database; using Content.Shared.DoAfter; using Content.Shared.GameTicking; @@ -23,6 +23,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Random; using SharedToolSystem = Content.Shared.Tools.Systems.SharedToolSystem; +using Content.Server.UserInterface; namespace Content.Server.Wires; diff --git a/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs b/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs index 25865cc426e..27caebef808 100644 --- a/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs +++ b/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs @@ -1,9 +1,8 @@ using System.Linq; -using Content.Server.Construction; using Content.Server.Paper; using Content.Server.Power.Components; using Content.Server.Research.Systems; -using Content.Server.UserInterface; +using Content.Shared.UserInterface; using Content.Server.Xenoarchaeology.Equipment.Components; using Content.Server.Xenoarchaeology.XenoArtifacts; using Content.Server.Xenoarchaeology.XenoArtifacts.Events; diff --git a/Content.Shared/Access/Components/ActivatableUIRequiresAccessComponent.cs b/Content.Shared/Access/Components/ActivatableUIRequiresAccessComponent.cs new file mode 100644 index 00000000000..342d182d2f8 --- /dev/null +++ b/Content.Shared/Access/Components/ActivatableUIRequiresAccessComponent.cs @@ -0,0 +1,11 @@ +using Content.Shared.Access.Systems; +using Robust.Shared.GameStates; + +namespace Content.Shared.Access.Components; + +[RegisterComponent, NetworkedComponent, Access(typeof(ActivatableUIRequiresAccessSystem))] +public sealed partial class ActivatableUIRequiresAccessComponent : Component +{ + [DataField] + public LocId? PopupMessage = "lock-comp-has-user-access-fail"; +} diff --git a/Content.Shared/Access/Systems/ActivatableUIRequiresAccessSystem.cs b/Content.Shared/Access/Systems/ActivatableUIRequiresAccessSystem.cs new file mode 100644 index 00000000000..9020518f216 --- /dev/null +++ b/Content.Shared/Access/Systems/ActivatableUIRequiresAccessSystem.cs @@ -0,0 +1,31 @@ +using Content.Shared.Popups; +using Content.Shared.UserInterface; +using Content.Shared.Access.Components; + +namespace Content.Shared.Access.Systems; +public sealed class ActivatableUIRequiresAccessSystem : EntitySystem +{ + [Dependency] private readonly AccessReaderSystem _access = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnUIOpenAttempt); + } + + private void OnUIOpenAttempt(Entity activatableUI, ref ActivatableUIOpenAttemptEvent args) + { + if (args.Cancelled) + return; + + if (!_access.IsAllowed(args.User, activatableUI)) + { + args.Cancel(); + if (activatableUI.Comp.PopupMessage != null) + _popup.PopupClient(Loc.GetString(activatableUI.Comp.PopupMessage), activatableUI, args.User); + } + } +} + diff --git a/Content.Shared/UserInterface/ActivatableUIEvents.cs b/Content.Shared/UserInterface/ActivatableUIEvents.cs new file mode 100644 index 00000000000..6e6b3f63c62 --- /dev/null +++ b/Content.Shared/UserInterface/ActivatableUIEvents.cs @@ -0,0 +1,52 @@ +using Robust.Shared.Player; + +namespace Content.Shared.UserInterface; +public sealed class ActivatableUIOpenAttemptEvent : CancellableEntityEventArgs +{ + public EntityUid User { get; } + public ActivatableUIOpenAttemptEvent(EntityUid who) + { + User = who; + } +} + +public sealed class UserOpenActivatableUIAttemptEvent : CancellableEntityEventArgs //have to one-up the already stroke-inducing name +{ + public EntityUid User { get; } + public EntityUid Target { get; } + public UserOpenActivatableUIAttemptEvent(EntityUid who, EntityUid target) + { + User = who; + Target = target; + } +} + +public sealed class AfterActivatableUIOpenEvent : EntityEventArgs +{ + public EntityUid User { get; } + public readonly ICommonSession Session; + + public AfterActivatableUIOpenEvent(EntityUid who, ICommonSession session) + { + User = who; + Session = session; + } +} + +/// +/// This is after it's decided the user can open the UI, +/// but before the UI actually opens. +/// Use this if you need to prepare the UI itself +/// +public sealed class BeforeActivatableUIOpenEvent : EntityEventArgs +{ + public EntityUid User { get; } + public BeforeActivatableUIOpenEvent(EntityUid who) + { + User = who; + } +} + +public sealed class ActivatableUIPlayerChangedEvent : EntityEventArgs +{ +} diff --git a/Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml b/Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml index 7fb8ec771d8..2697e00a700 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml @@ -296,6 +296,7 @@ acts: ["Breakage"] - type: ActivatableUI key: enum.AnomalyGeneratorUiKey.Key + - type: ActivatableUIRequiresAccess - type: ActivatableUIRequiresPower - type: UserInterface interfaces: @@ -318,6 +319,8 @@ - type: WiresVisuals - type: StaticPrice price: 5000 + - type: AccessReader + access: [["Research"]] - type: GuideHelp guides: - AnomalousResearch From 60bb97ca9564d7e014b1e641f40ab29a056764c6 Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 1 Feb 2024 08:46:30 +0000 Subject: [PATCH 111/266] Automatic changelog update (cherry picked from commit 3054328d0fbe4454fb8eb64ded1381e5f09f8c3c) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index fa33db4087b..e674562a097 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: themias - changes: - - message: Added fill visuals to Hot Chocolate - type: Tweak - id: 5348 - time: '2023-12-13T00:01:24.0000000+00:00' - author: themias changes: - message: Fixed secret doors not requiring metal rods @@ -3852,3 +3846,10 @@ id: 5847 time: '2024-02-01T08:30:07.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24589 +- author: TheShuEd + changes: + - message: Anomaly generator can now only be used by a scientist. + type: Tweak + id: 5848 + time: '2024-02-01T08:45:24.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24464 From 4bbeb66f84fb3cad3ec8ade75c597fb99053d997 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Thu, 1 Feb 2024 10:01:52 +0100 Subject: [PATCH 112/266] Remove starvation damage (#24790) Bottom text (cherry picked from commit dfef9dd0d510b7490a336e9ba800667218ce7a2a) --- Resources/Prototypes/Entities/Mobs/Species/arachnid.yml | 4 ---- Resources/Prototypes/Entities/Mobs/Species/diona.yml | 3 --- Resources/Prototypes/Entities/Mobs/Species/dwarf.yml | 4 ---- Resources/Prototypes/Entities/Mobs/Species/human.yml | 4 ---- Resources/Prototypes/Entities/Mobs/Species/moth.yml | 4 ---- Resources/Prototypes/Entities/Mobs/Species/reptilian.yml | 4 ---- Resources/Prototypes/Entities/Mobs/Species/slime.yml | 3 --- 7 files changed, 26 deletions(-) diff --git a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml index 8c1f43de960..6a92a6cc6b8 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml @@ -12,10 +12,6 @@ species: Arachnid - type: Hunger baseDecayRate: 0.0125 # Spiders have slow metabolisms all things considered, so I decided to just make their hunger drain slower. - # starvationDamage: # DeltaV - Disable starvation damage - # types: - # Cold: 0.5 - # Bloodloss: 0.5 - type: Carriable # Carrying system from nyanotrasen. - type: Thirst - type: Sericulture diff --git a/Resources/Prototypes/Entities/Mobs/Species/diona.yml b/Resources/Prototypes/Entities/Mobs/Species/diona.yml index 9a0e5053162..3f46005635c 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/diona.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/diona.yml @@ -8,9 +8,6 @@ - type: HumanoidAppearance species: Diona - type: Hunger - # starvationDamage: # DeltaV - Disable starvation damage - # types: - # Bloodloss: 0.5 baseDecayRate: 0.0083 - type: Thirst baseDecayRate: 0.0083 diff --git a/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml b/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml index 149769876de..fe36754b9b5 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml @@ -6,10 +6,6 @@ abstract: true components: - type: Hunger - # starvationDamage: # DeltaV - Disable starvation damage - # types: - # Cold: 0.5 - # Bloodloss: 0.5 - type: Thirst - type: Carriable # Carrying system from nyanotrasen. - type: Icon diff --git a/Resources/Prototypes/Entities/Mobs/Species/human.yml b/Resources/Prototypes/Entities/Mobs/Species/human.yml index fb93c210a79..7bf96efe2cc 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/human.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/human.yml @@ -6,10 +6,6 @@ abstract: true components: - type: Hunger - # starvationDamage: # DeltaV - Disable starvation damage - # types: - # Cold: 0.5 - # Bloodloss: 0.5 - type: Icon # It will not have an icon in the adminspawn menu without this. Body parts seem fine for whatever reason. sprite: Mobs/Species/Human/parts.rsi state: full diff --git a/Resources/Prototypes/Entities/Mobs/Species/moth.yml b/Resources/Prototypes/Entities/Mobs/Species/moth.yml index 157ad1cb184..1680dd6cda6 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/moth.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/moth.yml @@ -8,10 +8,6 @@ - type: HumanoidAppearance species: Moth - type: Hunger - # starvationDamage: # DeltaV - Disable starvation damage - # types: - # Cold: 0.5 - # Bloodloss: 0.5 - type: Thirst - type: Carriable # Carrying system from nyanotrasen. - type: Icon diff --git a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml index c469cb20844..9f482c6e2f2 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml @@ -8,10 +8,6 @@ - type: HumanoidAppearance species: Reptilian - type: Hunger - # starvationDamage: # DeltaV - Disable starvation damage - # types: - # Cold: 0.5 - # Bloodloss: 0.5 - type: Puller needsHands: false - type: Thirst diff --git a/Resources/Prototypes/Entities/Mobs/Species/slime.yml b/Resources/Prototypes/Entities/Mobs/Species/slime.yml index 73ddb2cc3e5..481afd06a3c 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/slime.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/slime.yml @@ -5,9 +5,6 @@ abstract: true components: - type: Hunger - # starvationDamage: # DeltaV - Disable starvation damage - # types: - # Bloodloss: 0.5 - type: Thirst - type: Carriable # Carrying system from nyanotrasen. - type: Icon From 41c05546bcd26a6356eb14caa34d30b2bb98b0ef Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 1 Feb 2024 09:02:57 +0000 Subject: [PATCH 113/266] Automatic changelog update (cherry picked from commit 5669c412a5178eece310c2516d747d84a149baae) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index e674562a097..ef9487b5b03 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: themias - changes: - - message: Fixed secret doors not requiring metal rods - type: Fix - id: 5349 - time: '2023-12-13T00:01:51.0000000+00:00' - author: Vasilis changes: - message: Added a General settings tab, and moved a bunch of options into it. @@ -3853,3 +3847,10 @@ id: 5848 time: '2024-02-01T08:45:24.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24464 +- author: PJB3005 + changes: + - message: Removed starvation damage + type: Remove + id: 5849 + time: '2024-02-01T09:01:52.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24790 From b9804a6126fa046c281cb0e5eb6b9e168342270c Mon Sep 17 00:00:00 2001 From: Flareguy <78941145+Flareguy@users.noreply.github.com> Date: Thu, 1 Feb 2024 03:49:47 -0600 Subject: [PATCH 114/266] Airlock assembly prototypes (#23821) * adds prototypes for airlock assemblies for other doors * fix tests (cherry picked from commit d76121d470c1e159787a6b991c0599068bd06a5f) --- .../Structures/Doors/Airlocks/assembly.yml | 389 ++++++++++++++++-- .../Doors/Airlocks/base_assembly.yml | 45 ++ .../Airlocks/Glass/centcomm.rsi/assembly.png | Bin 1023 -> 1214 bytes .../Airlocks/Glass/external.rsi/assembly.png | Bin 0 -> 1920 bytes .../Airlocks/Glass/external.rsi/meta.json | 3 + .../Airlocks/Glass/firelock.rsi/assembly.png | Bin 0 -> 1219 bytes .../Airlocks/Glass/firelock.rsi/meta.json | 3 + .../Airlocks/Glass/glass.rsi/assembly.png | Bin 604 -> 2061 bytes .../Airlocks/Glass/shuttle.rsi/assembly.png | Bin 0 -> 935 bytes .../Airlocks/Glass/shuttle.rsi/meta.json | 3 + .../Glass/shuttle_syndicate.rsi/assembly.png | Bin 0 -> 991 bytes .../Glass/shuttle_syndicate.rsi/meta.json | 3 + .../Airlocks/Glass/syndicate.rsi/assembly.png | Bin 952 -> 1147 bytes .../Standard/external.rsi/assembly.png | Bin 0 -> 1831 bytes .../Airlocks/Standard/external.rsi/meta.json | 3 + .../Standard/shuttle.rsi/assembly.png | Bin 0 -> 824 bytes .../Airlocks/Standard/shuttle.rsi/meta.json | 3 + .../shuttle_syndicate.rsi/assembly.png | Bin 0 -> 712 bytes .../Standard/shuttle_syndicate.rsi/meta.json | 3 + .../Standard/syndicate.rsi/assembly.png | Bin 945 -> 548 bytes 20 files changed, 412 insertions(+), 43 deletions(-) create mode 100644 Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_assembly.yml create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/external.rsi/assembly.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/assembly.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/shuttle.rsi/assembly.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Glass/shuttle_syndicate.rsi/assembly.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Standard/external.rsi/assembly.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Standard/shuttle.rsi/assembly.png create mode 100644 Resources/Textures/Structures/Doors/Airlocks/Standard/shuttle_syndicate.rsi/assembly.png diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/assembly.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/assembly.yml index f69768cf858..2fc5817287f 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/assembly.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/assembly.yml @@ -1,44 +1,347 @@ +#Atmospherics - type: entity - id: AirlockAssembly - name: airlock assembly - description: It opens, it closes, and maybe crushes you. - components: - - type: Clickable - - type: InteractionOutline - - type: Sprite - sprite: Structures/Doors/Airlocks/Standard/basic.rsi - state: "assembly" - - type: Physics - - type: Fixtures - fixtures: - fix1: - shape: - !type:PhysShapeAabb - bounds: "-0.45,-0.45,0.45,0.45" - density: 110 - mask: - - FullTileMask - layer: - - HumanoidBlockLayer - - type: Anchorable - delay: 2 - - type: Pullable - - type: Transform - anchored: true - noRot: true - - type: Damageable - damageContainer: Inorganic - damageModifierSet: Metallic - - type: Destructible - thresholds: - - trigger: - !type:DamageTrigger - damage: 300 - behaviors: - - !type:DoActsBehavior - acts: ["Destruction"] - - type: Construction - graph: Airlock - node: assembly - placement: - mode: SnapgridCenter + parent: AirlockAssembly + id: AirlockAssemblyAtmospherics + name: airlock assembly + suffix: Atmospherics + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Standard/atmospherics.rsi + state: "assembly" + +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyAtmosphericsGlass + name: airlock assembly + suffix: Atmospherics, Glass + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Glass/atmospherics.rsi + state: "assembly" + +#Cargo +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyCargo + name: airlock assembly + suffix: Cargo + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Standard/cargo.rsi + state: "assembly" + +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyCargoGlass + name: airlock assembly + suffix: Cargo, Glass + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Glass/cargo.rsi + state: "assembly" + +#Command +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyCommand + name: airlock assembly + suffix: Command + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Standard/command.rsi + state: "assembly" + +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyCommandGlass + name: airlock assembly + suffix: Command, Glass + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Glass/command.rsi + state: "assembly" + +#Engineering +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyEngineering + name: airlock assembly + suffix: Engineering + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Standard/engineering.rsi + state: "assembly" + +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyEngineeringGlass + name: airlock assembly + suffix: Engineering, Glass + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Glass/engineering.rsi + state: "assembly" + +#External +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyExternal + name: airlock assembly + suffix: External + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Standard/external.rsi + state: "assembly" + +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyExternalGlass + name: airlock assembly + suffix: External, Glass + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Glass/external.rsi + state: "assembly" + +#Public (Glass Airlock) +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyGlass + name: airlock assembly + suffix: Glass + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Glass/glass.rsi + state: "assembly" + +#Freezer +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyFreezer + name: airlock assembly + suffix: Freezer + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Standard/freezer.rsi + state: "assembly" + +#Maintenance +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyMaintenance + name: airlock assembly + suffix: Maintenance + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Standard/maint.rsi + state: "assembly" + +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyMaintenanceGlass + name: airlock assembly + suffix: Maintenance, Glass + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Glass/maint.rsi + state: "assembly" + +#Medical +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyMedical + name: airlock assembly + suffix: Medical + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Standard/medical.rsi + state: "assembly" + +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyMedicalGlass + name: airlock assembly + suffix: Medical, Glass + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Glass/medical.rsi + state: "assembly" + +#Science +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyScience + name: airlock assembly + suffix: Science + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Standard/science.rsi + state: "assembly" + +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyScienceGlass + name: airlock assembly + suffix: Science, Glass + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Glass/science.rsi + state: "assembly" + +#Security +- type: entity + parent: AirlockAssembly + id: AirlockAssemblySecurity + name: airlock assembly + suffix: Security + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Standard/security.rsi + state: "assembly" + +- type: entity + parent: AirlockAssembly + id: AirlockAssemblySecurityGlass + name: airlock assembly + suffix: Security, Glass + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Glass/security.rsi + state: "assembly" + +#Shuttle +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyShuttle + name: airlock assembly + suffix: Shuttle + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Standard/shuttle.rsi + state: "assembly" + +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyShuttleGlass + name: airlock assembly + suffix: Shuttle, Glass + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Glass/shuttle.rsi + state: "assembly" + +#Virology +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyVirology + name: airlock assembly + suffix: Virology + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Standard/virology.rsi + state: "assembly" + +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyVirologyGlass + name: airlock assembly + suffix: Virology, Glass + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Glass/virology.rsi + state: "assembly" + +#CentralCommand +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyCentralCommand + name: airlock assembly + suffix: CentralCommand + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Standard/centcomm.rsi + state: "assembly" + +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyCentralCommandGlass + name: airlock assembly + suffix: CentralCommand, Glass + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Glass/centcomm.rsi + state: "assembly" + +#Mining +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyMining + name: airlock assembly + suffix: Mining + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Standard/mining.rsi + state: "assembly" + +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyMiningGlass + name: airlock assembly + suffix: Mining, Glass + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Glass/mining.rsi + state: "assembly" + +#Syndicate +- type: entity + parent: AirlockAssembly + id: AirlockAssemblySyndicate + name: airlock assembly + suffix: Syndicate + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Standard/syndicate.rsi + state: "assembly" + +- type: entity + parent: AirlockAssembly + id: AirlockAssemblySyndicateGlass + name: airlock assembly + suffix: Syndicate, Glass + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Glass/syndicate.rsi + state: "assembly" + +#ShuttleSyndicate +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyShuttleSyndicate + name: airlock assembly + suffix: ShuttleSyndicate + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Standard/shuttle_syndicate.rsi + state: "assembly" + +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyShuttleSyndicateGlass + name: airlock assembly + suffix: ShuttleSyndicate, Glass + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/Glass/shuttle_syndicate.rsi + state: "assembly" + +#High Security +- type: entity + parent: AirlockAssembly + id: AirlockAssemblyHighSec + name: airlock assembly + suffix: HighSec + components: + - type: Sprite + sprite: Structures/Doors/Airlocks/highsec/highsec.rsi + state: "assembly" \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_assembly.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_assembly.yml new file mode 100644 index 00000000000..fcdb0d2deaf --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_assembly.yml @@ -0,0 +1,45 @@ +#Base +- type: entity + id: AirlockAssembly + name: airlock assembly + description: It opens, it closes, and maybe crushes you. + components: + - type: Clickable + - type: InteractionOutline + - type: Sprite + sprite: Structures/Doors/Airlocks/Standard/basic.rsi + state: "assembly" + - type: Physics + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.45,-0.45,0.45,0.45" + density: 110 + mask: + - FullTileMask + layer: + - HumanoidBlockLayer + - type: Anchorable + delay: 2 + - type: Pullable + - type: Transform + anchored: true + noRot: true + - type: Damageable + damageContainer: Inorganic + damageModifierSet: Metallic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 300 + behaviors: + - !type:DoActsBehavior + acts: ["Destruction"] + - type: Construction + graph: Airlock + node: assembly + placement: + mode: SnapgridCenter \ No newline at end of file diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/centcomm.rsi/assembly.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/centcomm.rsi/assembly.png index 814d8379085726788b724bad9e3bea90f88c45c8..7db8f8b6e85e0e9e567016b66d0f2570478dafe8 100644 GIT binary patch delta 1174 zcmV;H1Zn&K2fhiABpLy8Qb$4nuFf3k00004XF*Lt006O%3;baPks%j<1XD>wK~z{r z#g~6*TU8Xt&r1_uOVZkerS->}ESp4UwPCiCVbx42!upTX_+w)O1t$)f2>OSDe-uHg zI0R*~zx+r1!=Zw*KPrw2c5~24RjR8KDx*!e^+(pUO_!RtHHr6o-@Pxd$$LqY75u>E zo_pTQIp^MY?zuNgI2_J@6C;z!prd@A56dz&HKhpApslT~@(%@yqLA0?)#c#+`}hyt zqdDs7=^-C`u*vV|55d($f|3ghG&nd&>4<}JKQGw^(AcXRr8BGRvIUfTU+JhAc_xve zdVf8amj@Oq2T%oi7>vA|=*}%(qhTz`s<#NKHp0Vlz*HWpZmRd-EYS3G8dBWO3CF1}5<(|6|*JRrhJ$xK`BMDViO{^@=`Esk*v*?9- z!+?F*mJMU*WdNA5R_|%Pl)1L(L$9j~q*FN|)eQGxY8+z)0CRpjb3Tn;s0`dqYhK+5 zco2qF=^V1`C78Wj0qo;iD4vuY^8najGjodVfb5rzE+zDTgv0FR3jBTiB3=8sv=(4j zSk(e)!@RPrZ%wDuW01L3_K+t;F(SD8H%6b=#jEwN-jz2CW z_zJMd3da_I1Nw~w&fyeoetw>hflNYU3qltChN5X2O-@eI@4e^fyS*p)7&wpol4X^U z%REt1$+=eTMt0)JXqNgL{wz6+%CYPFi$W@3KKVf4i@S7Tx86BFeXx!Ob(w_oxaz74 zK!5Py{j?mv`5b5-8WJNGZ0^xLUV`uQh-5`8iICQ6-Gi`fSJH2GR) z*)B7G$}$f?CLY(Au)7gegR~)?LlzaWa25ar!7kk)$aX7oGf3x>hDPrcdLF>p(XT#= zJsoT5jXjrsG8Wque&8Y7-Cyfz=nrjg?CkFL?(BY~3GLe-KK>AT2X3d}jlSpK8X8Y5 zpZw-z?sB%_23J~8?P(~P$vZQ{r+!*JJDt{X-syYhZRq&T`2W6^8~=>(qB-esj$4)C z^#*_ojJ!jXv+a;K9Vl?)mCfwDmiwUj3RliHf6IL3l1LpIj1@nxg!%n)zf~fU2>%4h oWa)RZ!|oFZab5U)NPeRK07Y3^#->jJTL1t607*qoM6N<$g5$?jL;wH) delta 984 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 hEzUnqKkme literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/meta.json b/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/meta.json index f3162728da4..505b597a613 100644 --- a/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/meta.json +++ b/Resources/Textures/Structures/Doors/Airlocks/Glass/firelock.rsi/meta.json @@ -7,6 +7,9 @@ "y": 32 }, "states": [ + { + "name": "assembly" + }, { "name": "bolted_unlit" }, diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/glass.rsi/assembly.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/glass.rsi/assembly.png index 5e2dae4c261975d9534887d1fe82740b4cfc6b89..26d9dc17c253075d97164034bea2e811b3052eea 100644 GIT binary patch delta 2028 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 A`Tzg` diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/shuttle.rsi/assembly.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/shuttle.rsi/assembly.png new file mode 100644 index 0000000000000000000000000000000000000000..499ec46a539a0f310b7fb031cfcd282cc1d20d95 GIT binary patch literal 935 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCilS1^9%xCMPG)nKS4A|Nryn&%b%|=7$d-9z1xkWy_Y<)>c<<@A+%C_RdC>n8?Ai0;#f#m$cVD}9?dj8}2M!!qxNzb0C2JR~ z-L`nc&i*+|W-MK|WaF+KJ9aEzzWngv!_yY8>6*TvYx?~5DRZVQT-7&wNqKqs`Sa&@ z?b>B*Zmwr;?&{&;=IL2fR8&}4SW;3F92^`J6qJ{j=i%W|Sy@?JT%4JiSx`{W*w{FE z^5mMDnz*>QGiT0dX=&x;Y`Ph)8=j1uwn9o6-zhm zPEAcMEiJut>C*M<*MVNY*Ii-(q=HI<{DOggr!HVvtIJaeG@Y}+BeIx*f$uN~Gak=h zkphg6JDx6%Ar}6vll#MO83-Id8LBX4;W}s5yH{R43yavADXhWjU3gc2`^rE6|DSnx zX-mnT<-hk$-?!zy|NBWX>ps>SRygu7GQ5st6i9e$GJCCA!L^OM*H`VX{=MG1hq-)? zdF^TjKE8f7XI`22^Y+x1S1oHS-pMbV_!nRxq=t$1z-NNa;)V3YoNvG#<^XD#VL&8r&ou@ zq(GCI9+JMUGTfR=8MmyT5^!p^YLZ>Nj@b6XIj2mn9=POGKUYzJMawfxYfce&qjgV; zZYj%$O<%2)YZYHciY=Qh5+|jwajA~OA%-A3=O>~Hmp5?iIoaqECz74%8g%dI$F)b7 zFN{*{Jfs|;75)6d4A*5llvxVOKkxKN+mXs5@~dWY6JJ`_L^a{sD5s41k_wY5Sbk1B zvA!XoL=*EUoYBzm-?tJKroes;s`y-h{#8T_xk2+xyQ|-M!Dk!|vXm%ECU|g}E&J&&;E) zkGDjhedfn_CF=b{!3QUe^)>EReSH>t(fMVjV%9zJs~LY-n+@X6F56`x2aJ3MPgg&e IbxsLQ06I_ETmS$7 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/shuttle.rsi/meta.json b/Resources/Textures/Structures/Doors/Airlocks/Glass/shuttle.rsi/meta.json index 8806685e8c7..ded8386db5c 100644 --- a/Resources/Textures/Structures/Doors/Airlocks/Glass/shuttle.rsi/meta.json +++ b/Resources/Textures/Structures/Doors/Airlocks/Glass/shuttle.rsi/meta.json @@ -7,6 +7,9 @@ "y": 32 }, "states": [ + { + "name": "assembly" + }, { "name": "bolted_unlit" }, diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/shuttle_syndicate.rsi/assembly.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/shuttle_syndicate.rsi/assembly.png new file mode 100644 index 0000000000000000000000000000000000000000..587c5604347aeb1ac5fc42c915e5f653ee8b5e0e GIT binary patch literal 991 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WChBZ2Ka=yii(OlI5_0y<~ln$+bB9tuwKyRG-H~@@)?$^CRr?=VzXqb&C=T1 z+9^|}w6wHDL_}z6YWi6FuL|9@He~k{vnp`Uy1)aggLf~>+_WHh&8*mE%d<9zxZ-@4dy%QDX$%Y3)bidi}>a?ymK+0I68(o)hT#U*iZaZZM=_Igf^1}q7Rg^4+uE@8F`qjmtu|&hcEc&~M}R_=j8X-@2G4K{}Vq+ZX%1rlZ>ynFXbgy@UZLGuAAE#Ebt03)xJ_x%HQz5{>wt&`{@jI%8Xfp6TAcuinC29op*4N*P~9U zpbxtl-Et1z7h;H%9nUJ7&$VxhnPhyU>NnvA=hrfloJ;oSG5nLd`Nqq9(|y(t?$7#9 zJ`Q|xHGAt!7KQ7r@@?~-GVFPj6{a(M_$fbW{(hMnTN^98f8S&qY$B~zW;Dc{PfhrE z{N?%h^ylLH-5Enp6>m;s6?Z-4@bJ9mv4cI>i|Blez(D&=VxWrVI leRNyCaeYho_dw2%4C#$N8m~m_762od!PC{xWt~$(695Y2*xmpD literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/shuttle_syndicate.rsi/meta.json b/Resources/Textures/Structures/Doors/Airlocks/Glass/shuttle_syndicate.rsi/meta.json index 8408176365e..1081b1b57d2 100644 --- a/Resources/Textures/Structures/Doors/Airlocks/Glass/shuttle_syndicate.rsi/meta.json +++ b/Resources/Textures/Structures/Doors/Airlocks/Glass/shuttle_syndicate.rsi/meta.json @@ -7,6 +7,9 @@ "y": 32 }, "states": [ + { + "name": "assembly" + }, { "name": "bolted_unlit" }, diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/syndicate.rsi/assembly.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/syndicate.rsi/assembly.png index da1739bb279ebc611aaf6e03d031e6940313bad1..891e7fd9ee4ba1dcadb701d22aff584ce06dcf60 100644 GIT binary patch delta 1127 zcmV-t1ep7{2m1(+BYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D1Q1C?K~z{rwU<3i97hz#->x@@_&9MQ24OjYAc9gIk`aZ2EFYHQ z2vIl}nJSi(DwP|$C{_9tfhJAT#VOJxv0YHu!WLFgVi_HZmw!k>1j*PJ>% z%cAb??vg(`I?4|^jzev2ZPeM>$rntr*(~ks?2zYqNK{oob8|EMEiEk#wFRt^k&(K} zBasN@ayj<*_J8*33V0QK0bN~P957j5U+4051=MPr1>lC&)m09d^!NAsHwv#RpkCWn zGMOyO4L99Ck}0}v4bg|ikK$)Hc2Qz5KIIHIZb)z5`TSQzfDCa<^Dc_7;@WizIVU9 z^d~Jvp3=Wwnx1)2l_4HRutyr@KFvp5`pXmh#{K#e#907{QtM8J(k(gKFQC-nBLnTD zZ86jl7Xf%Et-ISga`9snwNyGp)=QiptG86F`l!WSUP;Y%st z?WG68)_-&(1Yb((EI?IaD(S9rG5f`Q@b=OJYinz4VapI!?PFy2tSX~fdhrZC3s4t% zLIgQAJEOgW1d|J4$&EG~Edt3i1+uwIopXNa zISB!se6y7z9V;ssomT{N(VZtVVDn5~9(l_9|&= zYJcKQY$cJP*(+DL4p@MhydK-z+icZ#!)hWh`TF|$*l=9qRiJQiINZ%vCLb6WAPfV_ zAQ)FnsA`yB%XB);2hdONUA;*6h%mf8)U!=AL7&I3&F~^cFsuj0#>RLYt1&e-rM)sk zLqpmtfi~pKA<5M$^FRAM1Tyj99~b2}KY#dH_9r1k*i<+P|2V`*a^WO(agST^c$_EG zBlpo|l!`)L$vG2$|JShZfQ&EZKq{50*b~$c9N3U>KZanzefV*Nnog)t0rA23;4dg` zB+-GN7b*Ml2l}z7Ml8?45M(zDCP(66a+5X6dw1z}{%^{8k{r1Ybu6Erp00TF$zaLJ z!yU^T`7tqRRDk(2Q>$%TPC5t#O*qVX&^*G`YMWPqdE^o#218@P>-8}2ul1~rKUo<5 tdeOaNsEbJ*Wi5iwhxuZ$SWH=r{s#=agJTYLPCNhr002ovPDHLkV1h`(2^IhV delta 931 zcmV;U16=(32)GB3BYy*bNklftCye>Su85uSh+v>(3+bTZRl26F21v!d+)j4 zd%eWg@8zCzzH`3cch8^i{Ep`0)zK7WFmi1eHdWO?F7Yk=8GlZmKEp9+-EI#l1Oh?w zO+*7Z4FI4J#>XE*eSKXz07{IJ73Keg?%xThDk)wwESyNfq_#vAg|d${7loEq_E=iM z<#Nh8MTfU++qwFa=LyDs=l~zw*xfnB0FmpJ^BpN`am_zXzW{(%#X-gT&2Zx}AE3vd zV(g)$hAUU=O@EMFj4JwzEd-&~ybrXBy#(aXW~SlzrEv#sGb!}HGhns%n9S=2f#3p& z#pBS?VS!1P6S@=p8VbpcJDSwQOZtj~pnC{8kc%QumB$=H)ekF$)A1PZb8v)=NCVw+!SBP()XHTKDEg|Y8fjrCu zcpO6Cf2oK!`yex5wH_vpF-20~t`)->ToKsWJ)mS0A`%HRbxlKaS4zzVlulOJ1(%5E z49EdzW+58UWIX_Y6bZmLc#1U4TGHuwHV^}IlL0ClcapmB^2j#0v-7sy0EQYP=n8bu zv%eF3p?^3;eD8BcOrfRZ2+!OUw7tQb>@|R)9hUMoz*6SA&gl#^8@fRFb(`9tv3esZ zw&1^(hBLn7Xk&w(QW)f zyO&wPA-4Hr%4z^Pky}e&DflW<+5;W-Q3q33aE>bHB(UUtZK65!8JzkOao4GFo{ zY{K5&BQP=XfRW~q3F3VC95<~>iRgleoJw-^J@)7+V_Oq|Kj4!M!WF^3?nPGh z482?dOI`Z@kRwOmVrX_Bv~j5zcO^cVavTZV{hR^=fWHI5l00OpV=Djv002ovPDHLk FV1f~N!Q%h` diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/external.rsi/assembly.png b/Resources/Textures/Structures/Doors/Airlocks/Standard/external.rsi/assembly.png new file mode 100644 index 0000000000000000000000000000000000000000..62b788cbc74e3186a576165005c45141e3bcbb13 GIT binary patch literal 1831 zcmd^8i&Il~7QW&BC=VsZA|$yt33=y+0wLfEjpLRi1c^!vj{+fqMomIMMFc{(u3cMT zc(m9;K|%<5fwl^gx>^xZK#)ho0$aPTb-`uR8EYx6?JkN;N5^jbJNC>u=bP`$H*?OJ zIj2df*c}#%ghCJ$CQnbz@+19a1jGKEdiH}EKj12}c1s}l0_8_P0mb4BF$Def<4w;G z1VT{2m~vl^jK|}#+3fuMd@M#-$PLVAz0!LG_{Dw4!DnT_Y5=ZMa9RUnuL%nZ3NU_r zYZ3gR8g?FmZ6)yea=5Pw^dG}H^tdWH4vUVr>Vc;T7>Lwj62(A5kD!#J6p9H!4Sq_b z3^#%SCBXQC=oo>XNHrix7mwG*;W#kNiD6bAZ@3AZ+ZWjK790~N{73`ajIf@Jv~pM- z81u|aXIM+%zWv}efsl+)2kU^Ihz=z1+S$zb^`j=>+E$fQ--_ zMtIr`EIgiU?_N9}KivWBM%Z2q69|MB4okXcPcM&0Mrq9&_-ZYPOG-*iN)jX`HLKwZ z3gGPmy%^TQVSdDBe!^jWo(+0)=MS{WCOVNMNNJncRCAp0xoN zpYP=JXS+bZ61*)6HX;-ko$jR5?L3~H%kAWFrp(|%2Jkfn>4}ua@bDXI^+Z9zgi2-O za3(bx2aPtSQjLnmH~dAldQz<(OHFk|MY$6aeD%SN+qR8Kr8X*cR3f>d(Ks0lJC*97 z(?=wdhVXD55gC@y^@yJ zZG?>|>S8clOs0d+*Ab~RW?(nKy`^xM9<+10W-ixq2w<4Nq66h*v@$WMyA(cGg2S+Q zj4$lZ3_M*3W6?tYl@9$kYuyj4RauJc-~V3>I%{b*`?n4$Pghk!5PtGy;JnAq>-+iLH(R{IcWTd;M=hc?>yq0X}leJq3(VD)}eVbPUG|@;`!Q!GwFH(VhMM@Pi+X zr7I|@FOfvH-t3f2&Ckuv#ioqE+M~>#xwTk7(cxWK#>M=)^5EwHoV!dLf&YbOAKYBD z{KsGLqA`)D>@P3MeL=b3`DlcdXd!TyRkgda?}mL}ZHhEO z5%(gWJbAjlf5nkplCV8_?bCga9QXeH?b1@V);jC^!%@%L6glNP3qeJ=X$^TW-z~iT z?%nNL-Ml^V+Og&5fuc>O$XHD<+Y||1`0cSNa<02?LnZ4EW7TISLS}SJmmlq{cHh5z_^VsCFY|s~yrP|4E__x!P;}{(_x)NQ z2>&AgooBAXhHI3?3f;zXV8dWc{yR^;9+P?_DQ{ICB&WYWaLu;%wC%GU)TNUrHY``X z_@hN%9{<)A+pxp2^ZL`8ijons ICEA+*0b=n+d;kCd literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/external.rsi/meta.json b/Resources/Textures/Structures/Doors/Airlocks/Standard/external.rsi/meta.json index aa150167367..603c7588fd7 100644 --- a/Resources/Textures/Structures/Doors/Airlocks/Standard/external.rsi/meta.json +++ b/Resources/Textures/Structures/Doors/Airlocks/Standard/external.rsi/meta.json @@ -7,6 +7,9 @@ "y": 32 }, "states": [ + { + "name": "assembly" + }, { "name": "bolted_unlit" }, diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/shuttle.rsi/assembly.png b/Resources/Textures/Structures/Doors/Airlocks/Standard/shuttle.rsi/assembly.png new file mode 100644 index 0000000000000000000000000000000000000000..8518b527bc6155ae2ac10fbe06650f1e757c161c GIT binary patch literal 824 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij!2Ka=yCMPG)nKS4A|Nryn&%b%|=7$d-9z1xkWy_Y<*4A_9&RxHL{qf_+ zckkYP@#4kPr%z9xKD}qpp5425U%Phgz<~n`7cPAE?Ae_=cP?DGuw%!L<;#~JK79Dh znKLI&oG33ZKY#xGu3fu|ii!#g3rk8$f`fyDf`an$@;p2|Dl03Ci;FWeGYbj|8XFrY zPo7*;Qxg{#r=_KplarH>kf5WZ6B-(N?AWml8#Y|IawRo2wY0SK(xpp4SC{WqmjqJQ zB|(0{KxdN)7#1F}mIE5YS>O>_%)r2R7=#&*=dVZs2HHta7sn6_|JKXg#fuCC*b6p$ za8z-u-R2RfI6-3(YxJ$^AAjv{ylrcrWBm4SdO^Xr<7}U1{ITcR$LY+FP%Fv6bnVKv zoy<);Ys~&X)J^*~hf`pmd_@?yoSgXSsf_E6&!6YqFC5`6SE5iAxlW?VqU_LxyE#n_ z4IdJ2m*4oP;xs|UuPIWUlX1;*<{Od)-3$kIy zr>Cc@tE(WtAR!?kEG#S`KB2m*Iwd8=)z!7TtGl70p`@fFCML$m+b1JEqoAN5CnrZ* zO1h-DBrYyaOiWBdTtZe>R$NS6RaMp8%v?cU!P3&w!onguD?214q@toiQc|+KtQ_bl zE!npgK+2#b$S?RmX@DVV>4gfQUd{rK$YKTtzQZ8Qcszea3NRpAJzX3_Ec{z1cNaAo z2)IsWb-J+VhXZ3^Kwx(6>;L~_-?K4Ylzcl^k^h~iS%2@3_(}IXm=r$6b#*YF=Vua~ zG;N|(ul=Kw8WP^VRaU-faolIbC#PmLXoRgU71L(>l;kEGkTY#1OTe_mX|A_(CmAeA z-?G^_WR)JnmC^|3%2;ED`uogN8QC(GejH+&)B zt`JL*U+d_8(Ilq)z=PsatGVZ&cQa3s`(s^xb`3}Em3gdofe&_+J<8($aKoTO z{b4-+f(l0-2kXV!e7EAlG8>ldtoU^!>21>crge9fc5*Z9ww`-oi@Q_!+m-{{`eOK- z^yj*6bAQnBSMI@uyRwm-=lHolWZZdnxb*Qic?P)@W3?m8SFTu{b&q+^Wzs?T=&}H*~^{%*WVno6{_2luX;q@`ijc(PT7M8fU(5j>FVdQ&MBb@ E0Cj>fB>(^b literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/shuttle_syndicate.rsi/meta.json b/Resources/Textures/Structures/Doors/Airlocks/Standard/shuttle_syndicate.rsi/meta.json index d9058e33726..712b0ea1fc2 100644 --- a/Resources/Textures/Structures/Doors/Airlocks/Standard/shuttle_syndicate.rsi/meta.json +++ b/Resources/Textures/Structures/Doors/Airlocks/Standard/shuttle_syndicate.rsi/meta.json @@ -7,6 +7,9 @@ "y": 32 }, "states": [ + { + "name": "assembly" + }, { "name": "bolted_unlit" }, diff --git a/Resources/Textures/Structures/Doors/Airlocks/Standard/syndicate.rsi/assembly.png b/Resources/Textures/Structures/Doors/Airlocks/Standard/syndicate.rsi/assembly.png index 9ac8b2ad682a34277675e4de772cf89bdec1567b..2a4287034ab002803ff9447030121996148bcf0a 100644 GIT binary patch literal 548 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij=0(?STy}Z1PjEoEo4ILaDTwGiN0s>M~Q?0D5baizN3=A@P*_wp7rpt+y zmX<0hDWxPQ%gD$GbaM%9;xaQc6BQLzQBg@_Vp_`19vK;#mzT%E!2vY*%#M|Zfs{;1 zkYDhB+<-xR)1&J^b({qrk;M!Qd_X;XhZ&FOuSfwp+|bj-F~q{Zck=6`W(A(s#Zy?l z*S<|NzrOc>^}9I@tom=u>KuIRoLUr=d@rB-wQ!TKDTj6Whx{q_J9t)zO&6Z~G(_G( zm0{j3rklF2m|2TC&*XW!vGrv1epvY0>IbW1joN|VlMY|zWnysVykN@UlvBsGf^o%s zhGn%3jrK+b-(KC>c7l~bw|;UmW1r0Fs;iHA6oeMHRWunnd=_c`R-5m@vWfl6^UoL3 z6U+}6?A*s6#=PCbRjom-OGeK_@JVyLVUM{6vq`>k!+Cw?HEk>s7o`k0wQ-s%FmE?l zaL%you1W3m)4Ohm%za|3A(d1*Y5n`AD8@a{>KWWr5~^osSeoeemIR2c&ztPay}IOU zvTfrNJ$`mAhTHl(TY1x)0@G)-9`|lp9G!MT`{TaP!OMjLJfDb9;MdeK{*bo<7@`cG Lu6{1-oD!MJse!U)2Mq93BnimZMKDzU}F(hb3V$)Gj2X|yrl zFvG>U+r97I?d|OqZ+(7w_ug~wIp>{o@426AxN_}I3No0yF@FI&8=Ik+_!0UB=Pq1i z76iB3LmGa6fPBS>zo-rXl*9D&Q)q3qq#dA!(X)!uP3ZqELSt2B&a#l0gju0VlL>Vl zXSEW81LF4aYq zrd@FBx#Xb7mw)2q!K8t;n@pXMT#Kmci$w#_Vmk(c>MWV@SBncU(kuPtX0(i(V>NBD z_T%>pFxY7;=mdf}5R1p5r^f-aE+_PhQVyx{wwfAnSfsqJf8`a)W$vXivPSL%-9u;t zZBdkHi2!8wKr!ZON&)^o{(&YQn}6!acWgik*v;rRH%Cbp)58JG zVKUQp1*P#-{uC<9#H>jQD8V{_$07Lhmj-|J2Z_M&@M)qLOC$y6JR5(r2l62t4sjAg zTSs3?%LSA!R{DY!A{v2wz{o@+VT0}t0HlZm-tqHfVA+u_$IJd0*bbPX!Fq`F<(G%v zU}tB(+kXt^=5{ca8Da2vFL;A-2zx&l%`k;PjUzlOb7237H`xaOb2lVPc0eL?T^BV1 z9p*lef8CvSur^hbHiqBlnbST06eI$^$OhC^w1Dy9{j^uLdm$ksDFHW**O23`DBGyk*4by*$v|Ax|NN!fA?~8lw`<=3W2cV zntJ8GmjemL$UZ62?hT%BWXpUpbvA%D(Y8QeDflWXv Date: Thu, 1 Feb 2024 11:12:09 +0100 Subject: [PATCH 115/266] Client customization late-join spawner priority for arrivals/cryostorage (#24586) * Initial commit, requires server restart to take effect * Exposes callbacks directly instead, takes effect immediately * Cleaned up control flow, swapped cvar for client customization * Switched to int, dictionary of callbacks, migration * Update Content.Shared/Preferences/SpawnPriorityPreference.cs * krunkle stan --------- Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Co-authored-by: metalgearsloth (cherry picked from commit ed0f2aa2213cc47b817476206a2dd0b4e7c176b1) --- .../Preferences/UI/HumanoidProfileEditor.xaml | 6 + .../UI/HumanoidProfileEditor.xaml.cs | 33 + .../Tests/Preferences/ServerDbSqliteTests.cs | 1 + ...091301_SpawnPriorityPreference.Designer.cs | 1761 +++++++++++++++++ .../20240201091301_SpawnPriorityPreference.cs | 29 + .../PostgresServerDbContextModelSnapshot.cs | 11 +- ...091254_SpawnPriorityPreference.Designer.cs | 1692 ++++++++++++++++ .../20240201091254_SpawnPriorityPreference.cs | 29 + .../SqliteServerDbContextModelSnapshot.cs | 6 +- Content.Server.Database/Model.cs | 1 + Content.Server/Database/ServerDbBase.cs | 3 + .../Shuttles/Systems/ArrivalsSystem.cs | 4 +- .../ContainerSpawnPointSystem.cs | 8 +- .../EntitySystems/SpawnPointSystem.cs | 5 +- .../Station/Systems/StationSpawningSystem.cs | 37 + .../Preferences/HumanoidCharacterProfile.cs | 26 +- .../Preferences/SpawnPriorityPreference.cs | 15 + .../ui/humanoid-profile-editor.ftl | 7 + 18 files changed, 3654 insertions(+), 20 deletions(-) create mode 100644 Content.Server.Database/Migrations/Postgres/20240201091301_SpawnPriorityPreference.Designer.cs create mode 100644 Content.Server.Database/Migrations/Postgres/20240201091301_SpawnPriorityPreference.cs create mode 100644 Content.Server.Database/Migrations/Sqlite/20240201091254_SpawnPriorityPreference.Designer.cs create mode 100644 Content.Server.Database/Migrations/Sqlite/20240201091254_SpawnPriorityPreference.cs create mode 100644 Content.Shared/Preferences/SpawnPriorityPreference.cs diff --git a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml index b837d5ec7d2..eb553de8e17 100644 --- a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml +++ b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml @@ -96,6 +96,12 @@ + + + diff --git a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs index 1b418243a7f..116a1dc2928 100644 --- a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs +++ b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs @@ -72,6 +72,7 @@ public sealed partial class HumanoidProfileEditor : Control private Slider _skinColor => CSkin; private OptionButton _clothingButton => CClothingButton; private OptionButton _backpackButton => CBackpackButton; + private OptionButton _spawnPriorityButton => CSpawnPriorityButton; private SingleMarkingPicker _hairPicker => CHairStylePicker; private SingleMarkingPicker _facialHairPicker => CFacialHairPicker; private EyeColorPicker _eyesPicker => CEyeColorPicker; @@ -340,6 +341,21 @@ public HumanoidProfileEditor(IClientPreferencesManager preferencesManager, IProt #endregion Backpack + #region SpawnPriority + + foreach (var value in Enum.GetValues()) + { + _spawnPriorityButton.AddItem(Loc.GetString($"humanoid-profile-editor-preference-spawn-priority-{value.ToString().ToLower()}"), (int) value); + } + + _spawnPriorityButton.OnItemSelected += args => + { + _spawnPriorityButton.SelectId(args.Id); + SetSpawnPriority((SpawnPriorityPreference) args.Id); + }; + + #endregion SpawnPriority + #region Eyes _eyesPicker.OnEyeColorPicked += newColor => @@ -831,6 +847,12 @@ private void SetBackpack(BackpackPreference newBackpack) IsDirty = true; } + private void SetSpawnPriority(SpawnPriorityPreference newSpawnPriority) + { + Profile = Profile?.WithSpawnPriorityPreference(newSpawnPriority); + IsDirty = true; + } + public void Save() { IsDirty = false; @@ -1006,6 +1028,16 @@ private void UpdateBackpackControls() _backpackButton.SelectId((int) Profile.Backpack); } + private void UpdateSpawnPriorityControls() + { + if (Profile == null) + { + return; + } + + _spawnPriorityButton.SelectId((int) Profile.SpawnPriority); + } + private void UpdateHairPickers() { if (Profile == null) @@ -1145,6 +1177,7 @@ public void UpdateControls() UpdateSpecies(); UpdateClothingControls(); UpdateBackpackControls(); + UpdateSpawnPriorityControls(); UpdateAgeEdit(); UpdateEyePickers(); UpdateSaveButton(); diff --git a/Content.IntegrationTests/Tests/Preferences/ServerDbSqliteTests.cs b/Content.IntegrationTests/Tests/Preferences/ServerDbSqliteTests.cs index e26a45291b2..cb1eae878b7 100644 --- a/Content.IntegrationTests/Tests/Preferences/ServerDbSqliteTests.cs +++ b/Content.IntegrationTests/Tests/Preferences/ServerDbSqliteTests.cs @@ -56,6 +56,7 @@ private static HumanoidCharacterProfile CharlieCharlieson() ), ClothingPreference.Jumpskirt, BackpackPreference.Backpack, + SpawnPriorityPreference.Arrivals, new Dictionary { {SharedGameTicker.FallbackOverflowJob, JobPriority.High} diff --git a/Content.Server.Database/Migrations/Postgres/20240201091301_SpawnPriorityPreference.Designer.cs b/Content.Server.Database/Migrations/Postgres/20240201091301_SpawnPriorityPreference.Designer.cs new file mode 100644 index 00000000000..0c6c43e180d --- /dev/null +++ b/Content.Server.Database/Migrations/Postgres/20240201091301_SpawnPriorityPreference.Designer.cs @@ -0,0 +1,1761 @@ +// +using System; +using System.Net; +using System.Text.Json; +using Content.Server.Database; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using NpgsqlTypes; + +#nullable disable + +namespace Content.Server.Database.Migrations.Postgres +{ + [DbContext(typeof(PostgresServerDbContext))] + [Migration("20240201091301_SpawnPriorityPreference")] + partial class SpawnPriorityPreference + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Content.Server.Database.Admin", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.Property("AdminRankId") + .HasColumnType("integer") + .HasColumnName("admin_rank_id"); + + b.Property("Title") + .HasColumnType("text") + .HasColumnName("title"); + + b.HasKey("UserId") + .HasName("PK_admin"); + + b.HasIndex("AdminRankId") + .HasDatabaseName("IX_admin_admin_rank_id"); + + b.ToTable("admin", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminFlag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("admin_flag_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AdminId") + .HasColumnType("uuid") + .HasColumnName("admin_id"); + + b.Property("Flag") + .IsRequired() + .HasColumnType("text") + .HasColumnName("flag"); + + b.Property("Negative") + .HasColumnType("boolean") + .HasColumnName("negative"); + + b.HasKey("Id") + .HasName("PK_admin_flag"); + + b.HasIndex("AdminId") + .HasDatabaseName("IX_admin_flag_admin_id"); + + b.HasIndex("Flag", "AdminId") + .IsUnique(); + + b.ToTable("admin_flag", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLog", b => + { + b.Property("RoundId") + .HasColumnType("integer") + .HasColumnName("round_id"); + + b.Property("Id") + .HasColumnType("integer") + .HasColumnName("admin_log_id"); + + b.Property("Date") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("Impact") + .HasColumnType("smallint") + .HasColumnName("impact"); + + b.Property("Json") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("json"); + + b.Property("Message") + .IsRequired() + .HasColumnType("text") + .HasColumnName("message"); + + b.Property("Type") + .HasColumnType("integer") + .HasColumnName("type"); + + b.HasKey("RoundId", "Id") + .HasName("PK_admin_log"); + + b.HasIndex("Date"); + + b.HasIndex("Message") + .HasAnnotation("Npgsql:TsVectorConfig", "english"); + + NpgsqlIndexBuilderExtensions.HasMethod(b.HasIndex("Message"), "GIN"); + + b.HasIndex("Type") + .HasDatabaseName("IX_admin_log_type"); + + b.ToTable("admin_log", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLogPlayer", b => + { + b.Property("RoundId") + .HasColumnType("integer") + .HasColumnName("round_id"); + + b.Property("LogId") + .HasColumnType("integer") + .HasColumnName("log_id"); + + b.Property("PlayerUserId") + .HasColumnType("uuid") + .HasColumnName("player_user_id"); + + b.HasKey("RoundId", "LogId", "PlayerUserId") + .HasName("PK_admin_log_player"); + + b.HasIndex("PlayerUserId") + .HasDatabaseName("IX_admin_log_player_player_user_id"); + + b.ToTable("admin_log_player", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("admin_messages_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("uuid") + .HasColumnName("created_by_id"); + + b.Property("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("DeletedById") + .HasColumnType("uuid") + .HasColumnName("deleted_by_id"); + + b.Property("ExpirationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("expiration_time"); + + b.Property("LastEditedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_edited_at"); + + b.Property("LastEditedById") + .HasColumnType("uuid") + .HasColumnName("last_edited_by_id"); + + b.Property("Message") + .IsRequired() + .HasMaxLength(4096) + .HasColumnType("character varying(4096)") + .HasColumnName("message"); + + b.Property("PlayerUserId") + .HasColumnType("uuid") + .HasColumnName("player_user_id"); + + b.Property("PlaytimeAtNote") + .HasColumnType("interval") + .HasColumnName("playtime_at_note"); + + b.Property("RoundId") + .HasColumnType("integer") + .HasColumnName("round_id"); + + b.Property("Seen") + .HasColumnType("boolean") + .HasColumnName("seen"); + + b.HasKey("Id") + .HasName("PK_admin_messages"); + + b.HasIndex("CreatedById"); + + b.HasIndex("DeletedById"); + + b.HasIndex("LastEditedById"); + + b.HasIndex("PlayerUserId") + .HasDatabaseName("IX_admin_messages_player_user_id"); + + b.HasIndex("RoundId") + .HasDatabaseName("IX_admin_messages_round_id"); + + b.ToTable("admin_messages", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminNote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("admin_notes_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("uuid") + .HasColumnName("created_by_id"); + + b.Property("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("DeletedById") + .HasColumnType("uuid") + .HasColumnName("deleted_by_id"); + + b.Property("ExpirationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("expiration_time"); + + b.Property("LastEditedAt") + .IsRequired() + .HasColumnType("timestamp with time zone") + .HasColumnName("last_edited_at"); + + b.Property("LastEditedById") + .HasColumnType("uuid") + .HasColumnName("last_edited_by_id"); + + b.Property("Message") + .IsRequired() + .HasMaxLength(4096) + .HasColumnType("character varying(4096)") + .HasColumnName("message"); + + b.Property("PlayerUserId") + .HasColumnType("uuid") + .HasColumnName("player_user_id"); + + b.Property("PlaytimeAtNote") + .HasColumnType("interval") + .HasColumnName("playtime_at_note"); + + b.Property("RoundId") + .HasColumnType("integer") + .HasColumnName("round_id"); + + b.Property("Secret") + .HasColumnType("boolean") + .HasColumnName("secret"); + + b.Property("Severity") + .HasColumnType("integer") + .HasColumnName("severity"); + + b.HasKey("Id") + .HasName("PK_admin_notes"); + + b.HasIndex("CreatedById"); + + b.HasIndex("DeletedById"); + + b.HasIndex("LastEditedById"); + + b.HasIndex("PlayerUserId") + .HasDatabaseName("IX_admin_notes_player_user_id"); + + b.HasIndex("RoundId") + .HasDatabaseName("IX_admin_notes_round_id"); + + b.ToTable("admin_notes", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminRank", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("admin_rank_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.HasKey("Id") + .HasName("PK_admin_rank"); + + b.ToTable("admin_rank", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("admin_rank_flag_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AdminRankId") + .HasColumnType("integer") + .HasColumnName("admin_rank_id"); + + b.Property("Flag") + .IsRequired() + .HasColumnType("text") + .HasColumnName("flag"); + + b.HasKey("Id") + .HasName("PK_admin_rank_flag"); + + b.HasIndex("AdminRankId"); + + b.HasIndex("Flag", "AdminRankId") + .IsUnique(); + + b.ToTable("admin_rank_flag", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminWatchlist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("admin_watchlists_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("uuid") + .HasColumnName("created_by_id"); + + b.Property("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("DeletedById") + .HasColumnType("uuid") + .HasColumnName("deleted_by_id"); + + b.Property("ExpirationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("expiration_time"); + + b.Property("LastEditedAt") + .IsRequired() + .HasColumnType("timestamp with time zone") + .HasColumnName("last_edited_at"); + + b.Property("LastEditedById") + .HasColumnType("uuid") + .HasColumnName("last_edited_by_id"); + + b.Property("Message") + .IsRequired() + .HasMaxLength(4096) + .HasColumnType("character varying(4096)") + .HasColumnName("message"); + + b.Property("PlayerUserId") + .HasColumnType("uuid") + .HasColumnName("player_user_id"); + + b.Property("PlaytimeAtNote") + .HasColumnType("interval") + .HasColumnName("playtime_at_note"); + + b.Property("RoundId") + .HasColumnType("integer") + .HasColumnName("round_id"); + + b.HasKey("Id") + .HasName("PK_admin_watchlists"); + + b.HasIndex("CreatedById"); + + b.HasIndex("DeletedById"); + + b.HasIndex("LastEditedById"); + + b.HasIndex("PlayerUserId") + .HasDatabaseName("IX_admin_watchlists_player_user_id"); + + b.HasIndex("RoundId") + .HasDatabaseName("IX_admin_watchlists_round_id"); + + b.ToTable("admin_watchlists", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Antag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("antag_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AntagName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("antag_name"); + + b.Property("ProfileId") + .HasColumnType("integer") + .HasColumnName("profile_id"); + + b.HasKey("Id") + .HasName("PK_antag"); + + b.HasIndex("ProfileId", "AntagName") + .IsUnique(); + + b.ToTable("antag", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AssignedUserId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("assigned_user_id_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.Property("UserName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("user_name"); + + b.HasKey("Id") + .HasName("PK_assigned_user_id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.HasIndex("UserName") + .IsUnique(); + + b.ToTable("assigned_user_id", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("connection_log_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Address") + .IsRequired() + .HasColumnType("inet") + .HasColumnName("address"); + + b.Property("Denied") + .HasColumnType("smallint") + .HasColumnName("denied"); + + b.Property("HWId") + .HasColumnType("bytea") + .HasColumnName("hwid"); + + b.Property("ServerId") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasDefaultValue(0) + .HasColumnName("server_id"); + + b.Property("Time") + .HasColumnType("timestamp with time zone") + .HasColumnName("time"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.Property("UserName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("user_name"); + + b.HasKey("Id") + .HasName("PK_connection_log"); + + b.HasIndex("ServerId") + .HasDatabaseName("IX_connection_log_server_id"); + + b.HasIndex("UserId"); + + b.ToTable("connection_log", null, t => + { + t.HasCheckConstraint("AddressNotIPv6MappedIPv4", "NOT inet '::ffff:0.0.0.0/96' >>= address"); + }); + }); + + modelBuilder.Entity("Content.Server.Database.Job", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("job_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("JobName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("job_name"); + + b.Property("Priority") + .HasColumnType("integer") + .HasColumnName("priority"); + + b.Property("ProfileId") + .HasColumnType("integer") + .HasColumnName("profile_id"); + + b.HasKey("Id") + .HasName("PK_job"); + + b.HasIndex("ProfileId"); + + b.HasIndex("ProfileId", "JobName") + .IsUnique(); + + b.HasIndex(new[] { "ProfileId" }, "IX_job_one_high_priority") + .IsUnique() + .HasFilter("priority = 3"); + + b.ToTable("job", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.PlayTime", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("play_time_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("PlayerId") + .HasColumnType("uuid") + .HasColumnName("player_id"); + + b.Property("TimeSpent") + .HasColumnType("interval") + .HasColumnName("time_spent"); + + b.Property("Tracker") + .IsRequired() + .HasColumnType("text") + .HasColumnName("tracker"); + + b.HasKey("Id") + .HasName("PK_play_time"); + + b.HasIndex("PlayerId", "Tracker") + .IsUnique(); + + b.ToTable("play_time", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Player", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("player_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FirstSeenTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("first_seen_time"); + + b.Property("LastReadRules") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_read_rules"); + + b.Property("LastSeenAddress") + .IsRequired() + .HasColumnType("inet") + .HasColumnName("last_seen_address"); + + b.Property("LastSeenHWId") + .HasColumnType("bytea") + .HasColumnName("last_seen_hwid"); + + b.Property("LastSeenTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_seen_time"); + + b.Property("LastSeenUserName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("last_seen_user_name"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("PK_player"); + + b.HasAlternateKey("UserId") + .HasName("ak_player_user_id"); + + b.HasIndex("LastSeenUserName"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("player", null, t => + { + t.HasCheckConstraint("LastSeenAddressNotIPv6MappedIPv4", "NOT inet '::ffff:0.0.0.0/96' >>= last_seen_address"); + }); + }); + + modelBuilder.Entity("Content.Server.Database.Preference", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("preference_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AdminOOCColor") + .IsRequired() + .HasColumnType("text") + .HasColumnName("admin_ooc_color"); + + b.Property("SelectedCharacterSlot") + .HasColumnType("integer") + .HasColumnName("selected_character_slot"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("PK_preference"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("preference", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Profile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("profile_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Age") + .HasColumnType("integer") + .HasColumnName("age"); + + b.Property("Backpack") + .IsRequired() + .HasColumnType("text") + .HasColumnName("backpack"); + + b.Property("CharacterName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("char_name"); + + b.Property("Clothing") + .IsRequired() + .HasColumnType("text") + .HasColumnName("clothing"); + + b.Property("EyeColor") + .IsRequired() + .HasColumnType("text") + .HasColumnName("eye_color"); + + b.Property("FacialHairColor") + .IsRequired() + .HasColumnType("text") + .HasColumnName("facial_hair_color"); + + b.Property("FacialHairName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("facial_hair_name"); + + b.Property("FlavorText") + .IsRequired() + .HasColumnType("text") + .HasColumnName("flavor_text"); + + b.Property("Gender") + .IsRequired() + .HasColumnType("text") + .HasColumnName("gender"); + + b.Property("HairColor") + .IsRequired() + .HasColumnType("text") + .HasColumnName("hair_color"); + + b.Property("HairName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("hair_name"); + + b.Property("Markings") + .HasColumnType("jsonb") + .HasColumnName("markings"); + + b.Property("PreferenceId") + .HasColumnType("integer") + .HasColumnName("preference_id"); + + b.Property("PreferenceUnavailable") + .HasColumnType("integer") + .HasColumnName("pref_unavailable"); + + b.Property("Sex") + .IsRequired() + .HasColumnType("text") + .HasColumnName("sex"); + + b.Property("SkinColor") + .IsRequired() + .HasColumnType("text") + .HasColumnName("skin_color"); + + b.Property("Slot") + .HasColumnType("integer") + .HasColumnName("slot"); + + b.Property("SpawnPriority") + .HasColumnType("integer") + .HasColumnName("spawn_priority"); + + b.Property("Species") + .IsRequired() + .HasColumnType("text") + .HasColumnName("species"); + + b.HasKey("Id") + .HasName("PK_profile"); + + b.HasIndex("PreferenceId") + .HasDatabaseName("IX_profile_preference_id"); + + b.HasIndex("Slot", "PreferenceId") + .IsUnique(); + + b.ToTable("profile", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Round", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("round_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ServerId") + .HasColumnType("integer") + .HasColumnName("server_id"); + + b.Property("StartDate") + .ValueGeneratedOnAdd() + .HasColumnType("timestamp with time zone") + .HasDefaultValue(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)) + .HasColumnName("start_date"); + + b.HasKey("Id") + .HasName("PK_round"); + + b.HasIndex("ServerId") + .HasDatabaseName("IX_round_server_id"); + + b.HasIndex("StartDate"); + + b.ToTable("round", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Server", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("server_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name"); + + b.HasKey("Id") + .HasName("PK_server"); + + b.ToTable("server", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("server_ban_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Address") + .HasColumnType("inet") + .HasColumnName("address"); + + b.Property("AutoDelete") + .HasColumnType("boolean") + .HasColumnName("auto_delete"); + + b.Property("BanTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("ban_time"); + + b.Property("BanningAdmin") + .HasColumnType("uuid") + .HasColumnName("banning_admin"); + + b.Property("ExemptFlags") + .HasColumnType("integer") + .HasColumnName("exempt_flags"); + + b.Property("ExpirationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("expiration_time"); + + b.Property("HWId") + .HasColumnType("bytea") + .HasColumnName("hwid"); + + b.Property("Hidden") + .HasColumnType("boolean") + .HasColumnName("hidden"); + + b.Property("LastEditedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_edited_at"); + + b.Property("LastEditedById") + .HasColumnType("uuid") + .HasColumnName("last_edited_by_id"); + + b.Property("PlayerUserId") + .HasColumnType("uuid") + .HasColumnName("player_user_id"); + + b.Property("PlaytimeAtNote") + .HasColumnType("interval") + .HasColumnName("playtime_at_note"); + + b.Property("Reason") + .IsRequired() + .HasColumnType("text") + .HasColumnName("reason"); + + b.Property("RoundId") + .HasColumnType("integer") + .HasColumnName("round_id"); + + b.Property("Severity") + .HasColumnType("integer") + .HasColumnName("severity"); + + b.HasKey("Id") + .HasName("PK_server_ban"); + + b.HasIndex("Address"); + + b.HasIndex("BanningAdmin"); + + b.HasIndex("LastEditedById"); + + b.HasIndex("PlayerUserId") + .HasDatabaseName("IX_server_ban_player_user_id"); + + b.HasIndex("RoundId") + .HasDatabaseName("IX_server_ban_round_id"); + + b.ToTable("server_ban", null, t => + { + t.HasCheckConstraint("AddressNotIPv6MappedIPv4", "NOT inet '::ffff:0.0.0.0/96' >>= address"); + + t.HasCheckConstraint("HaveEitherAddressOrUserIdOrHWId", "address IS NOT NULL OR player_user_id IS NOT NULL OR hwid IS NOT NULL"); + }); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBanExemption", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.Property("Flags") + .HasColumnType("integer") + .HasColumnName("flags"); + + b.HasKey("UserId") + .HasName("PK_server_ban_exemption"); + + b.ToTable("server_ban_exemption", null, t => + { + t.HasCheckConstraint("FlagsNotZero", "flags != 0"); + }); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBanHit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("server_ban_hit_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BanId") + .HasColumnType("integer") + .HasColumnName("ban_id"); + + b.Property("ConnectionId") + .HasColumnType("integer") + .HasColumnName("connection_id"); + + b.HasKey("Id") + .HasName("PK_server_ban_hit"); + + b.HasIndex("BanId") + .HasDatabaseName("IX_server_ban_hit_ban_id"); + + b.HasIndex("ConnectionId") + .HasDatabaseName("IX_server_ban_hit_connection_id"); + + b.ToTable("server_ban_hit", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("server_role_ban_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Address") + .HasColumnType("inet") + .HasColumnName("address"); + + b.Property("BanTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("ban_time"); + + b.Property("BanningAdmin") + .HasColumnType("uuid") + .HasColumnName("banning_admin"); + + b.Property("ExpirationTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("expiration_time"); + + b.Property("HWId") + .HasColumnType("bytea") + .HasColumnName("hwid"); + + b.Property("Hidden") + .HasColumnType("boolean") + .HasColumnName("hidden"); + + b.Property("LastEditedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_edited_at"); + + b.Property("LastEditedById") + .HasColumnType("uuid") + .HasColumnName("last_edited_by_id"); + + b.Property("PlayerUserId") + .HasColumnType("uuid") + .HasColumnName("player_user_id"); + + b.Property("PlaytimeAtNote") + .HasColumnType("interval") + .HasColumnName("playtime_at_note"); + + b.Property("Reason") + .IsRequired() + .HasColumnType("text") + .HasColumnName("reason"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("text") + .HasColumnName("role_id"); + + b.Property("RoundId") + .HasColumnType("integer") + .HasColumnName("round_id"); + + b.Property("Severity") + .HasColumnType("integer") + .HasColumnName("severity"); + + b.HasKey("Id") + .HasName("PK_server_role_ban"); + + b.HasIndex("Address"); + + b.HasIndex("BanningAdmin"); + + b.HasIndex("LastEditedById"); + + b.HasIndex("PlayerUserId") + .HasDatabaseName("IX_server_role_ban_player_user_id"); + + b.HasIndex("RoundId") + .HasDatabaseName("IX_server_role_ban_round_id"); + + b.ToTable("server_role_ban", null, t => + { + t.HasCheckConstraint("AddressNotIPv6MappedIPv4", "NOT inet '::ffff:0.0.0.0/96' >>= address"); + + t.HasCheckConstraint("HaveEitherAddressOrUserIdOrHWId", "address IS NOT NULL OR player_user_id IS NOT NULL OR hwid IS NOT NULL"); + }); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleUnban", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("role_unban_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BanId") + .HasColumnType("integer") + .HasColumnName("ban_id"); + + b.Property("UnbanTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("unban_time"); + + b.Property("UnbanningAdmin") + .HasColumnType("uuid") + .HasColumnName("unbanning_admin"); + + b.HasKey("Id") + .HasName("PK_server_role_unban"); + + b.HasIndex("BanId") + .IsUnique(); + + b.ToTable("server_role_unban", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.ServerUnban", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("unban_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("BanId") + .HasColumnType("integer") + .HasColumnName("ban_id"); + + b.Property("UnbanTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("unban_time"); + + b.Property("UnbanningAdmin") + .HasColumnType("uuid") + .HasColumnName("unbanning_admin"); + + b.HasKey("Id") + .HasName("PK_server_unban"); + + b.HasIndex("BanId") + .IsUnique(); + + b.ToTable("server_unban", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Trait", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("trait_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ProfileId") + .HasColumnType("integer") + .HasColumnName("profile_id"); + + b.Property("TraitName") + .IsRequired() + .HasColumnType("text") + .HasColumnName("trait_name"); + + b.HasKey("Id") + .HasName("PK_trait"); + + b.HasIndex("ProfileId", "TraitName") + .IsUnique(); + + b.ToTable("trait", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.UploadedResourceLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("uploaded_resource_log_id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Data") + .IsRequired() + .HasColumnType("bytea") + .HasColumnName("data"); + + b.Property("Date") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("Path") + .IsRequired() + .HasColumnType("text") + .HasColumnName("path"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("PK_uploaded_resource_log"); + + b.ToTable("uploaded_resource_log", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Whitelist", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("UserId") + .HasName("PK_whitelist"); + + b.ToTable("whitelist", (string)null); + }); + + modelBuilder.Entity("PlayerRound", b => + { + b.Property("PlayersId") + .HasColumnType("integer") + .HasColumnName("players_id"); + + b.Property("RoundsId") + .HasColumnType("integer") + .HasColumnName("rounds_id"); + + b.HasKey("PlayersId", "RoundsId") + .HasName("PK_player_round"); + + b.HasIndex("RoundsId") + .HasDatabaseName("IX_player_round_rounds_id"); + + b.ToTable("player_round", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Admin", b => + { + b.HasOne("Content.Server.Database.AdminRank", "AdminRank") + .WithMany("Admins") + .HasForeignKey("AdminRankId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_admin_rank_admin_rank_id"); + + b.Navigation("AdminRank"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminFlag", b => + { + b.HasOne("Content.Server.Database.Admin", "Admin") + .WithMany("Flags") + .HasForeignKey("AdminId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_flag_admin_admin_id"); + + b.Navigation("Admin"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLog", b => + { + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany("AdminLogs") + .HasForeignKey("RoundId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_log_round_round_id"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLogPlayer", b => + { + b.HasOne("Content.Server.Database.Player", "Player") + .WithMany("AdminLogs") + .HasForeignKey("PlayerUserId") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_log_player_player_player_user_id"); + + b.HasOne("Content.Server.Database.AdminLog", "Log") + .WithMany("Players") + .HasForeignKey("RoundId", "LogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_log_player_admin_log_round_id_log_id"); + + b.Navigation("Log"); + + b.Navigation("Player"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminMessage", b => + { + b.HasOne("Content.Server.Database.Player", "CreatedBy") + .WithMany("AdminMessagesCreated") + .HasForeignKey("CreatedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_messages_player_created_by_id"); + + b.HasOne("Content.Server.Database.Player", "DeletedBy") + .WithMany("AdminMessagesDeleted") + .HasForeignKey("DeletedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_messages_player_deleted_by_id"); + + b.HasOne("Content.Server.Database.Player", "LastEditedBy") + .WithMany("AdminMessagesLastEdited") + .HasForeignKey("LastEditedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_messages_player_last_edited_by_id"); + + b.HasOne("Content.Server.Database.Player", "Player") + .WithMany("AdminMessagesReceived") + .HasForeignKey("PlayerUserId") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .HasConstraintName("FK_admin_messages_player_player_user_id"); + + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany() + .HasForeignKey("RoundId") + .HasConstraintName("FK_admin_messages_round_round_id"); + + b.Navigation("CreatedBy"); + + b.Navigation("DeletedBy"); + + b.Navigation("LastEditedBy"); + + b.Navigation("Player"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminNote", b => + { + b.HasOne("Content.Server.Database.Player", "CreatedBy") + .WithMany("AdminNotesCreated") + .HasForeignKey("CreatedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_notes_player_created_by_id"); + + b.HasOne("Content.Server.Database.Player", "DeletedBy") + .WithMany("AdminNotesDeleted") + .HasForeignKey("DeletedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_notes_player_deleted_by_id"); + + b.HasOne("Content.Server.Database.Player", "LastEditedBy") + .WithMany("AdminNotesLastEdited") + .HasForeignKey("LastEditedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_notes_player_last_edited_by_id"); + + b.HasOne("Content.Server.Database.Player", "Player") + .WithMany("AdminNotesReceived") + .HasForeignKey("PlayerUserId") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .HasConstraintName("FK_admin_notes_player_player_user_id"); + + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany() + .HasForeignKey("RoundId") + .HasConstraintName("FK_admin_notes_round_round_id"); + + b.Navigation("CreatedBy"); + + b.Navigation("DeletedBy"); + + b.Navigation("LastEditedBy"); + + b.Navigation("Player"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b => + { + b.HasOne("Content.Server.Database.AdminRank", "Rank") + .WithMany("Flags") + .HasForeignKey("AdminRankId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_rank_flag_admin_rank_admin_rank_id"); + + b.Navigation("Rank"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminWatchlist", b => + { + b.HasOne("Content.Server.Database.Player", "CreatedBy") + .WithMany("AdminWatchlistsCreated") + .HasForeignKey("CreatedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_watchlists_player_created_by_id"); + + b.HasOne("Content.Server.Database.Player", "DeletedBy") + .WithMany("AdminWatchlistsDeleted") + .HasForeignKey("DeletedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_watchlists_player_deleted_by_id"); + + b.HasOne("Content.Server.Database.Player", "LastEditedBy") + .WithMany("AdminWatchlistsLastEdited") + .HasForeignKey("LastEditedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_watchlists_player_last_edited_by_id"); + + b.HasOne("Content.Server.Database.Player", "Player") + .WithMany("AdminWatchlistsReceived") + .HasForeignKey("PlayerUserId") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .HasConstraintName("FK_admin_watchlists_player_player_user_id"); + + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany() + .HasForeignKey("RoundId") + .HasConstraintName("FK_admin_watchlists_round_round_id"); + + b.Navigation("CreatedBy"); + + b.Navigation("DeletedBy"); + + b.Navigation("LastEditedBy"); + + b.Navigation("Player"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.Antag", b => + { + b.HasOne("Content.Server.Database.Profile", "Profile") + .WithMany("Antags") + .HasForeignKey("ProfileId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_antag_profile_profile_id"); + + b.Navigation("Profile"); + }); + + modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => + { + b.HasOne("Content.Server.Database.Server", "Server") + .WithMany("ConnectionLogs") + .HasForeignKey("ServerId") + .OnDelete(DeleteBehavior.SetNull) + .IsRequired() + .HasConstraintName("FK_connection_log_server_server_id"); + + b.Navigation("Server"); + }); + + modelBuilder.Entity("Content.Server.Database.Job", b => + { + b.HasOne("Content.Server.Database.Profile", "Profile") + .WithMany("Jobs") + .HasForeignKey("ProfileId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_job_profile_profile_id"); + + b.Navigation("Profile"); + }); + + modelBuilder.Entity("Content.Server.Database.Profile", b => + { + b.HasOne("Content.Server.Database.Preference", "Preference") + .WithMany("Profiles") + .HasForeignKey("PreferenceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_profile_preference_preference_id"); + + b.Navigation("Preference"); + }); + + modelBuilder.Entity("Content.Server.Database.Round", b => + { + b.HasOne("Content.Server.Database.Server", "Server") + .WithMany("Rounds") + .HasForeignKey("ServerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_round_server_server_id"); + + b.Navigation("Server"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBan", b => + { + b.HasOne("Content.Server.Database.Player", "CreatedBy") + .WithMany("AdminServerBansCreated") + .HasForeignKey("BanningAdmin") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_server_ban_player_banning_admin"); + + b.HasOne("Content.Server.Database.Player", "LastEditedBy") + .WithMany("AdminServerBansLastEdited") + .HasForeignKey("LastEditedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_server_ban_player_last_edited_by_id"); + + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany() + .HasForeignKey("RoundId") + .HasConstraintName("FK_server_ban_round_round_id"); + + b.Navigation("CreatedBy"); + + b.Navigation("LastEditedBy"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBanHit", b => + { + b.HasOne("Content.Server.Database.ServerBan", "Ban") + .WithMany("BanHits") + .HasForeignKey("BanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_server_ban_hit_server_ban_ban_id"); + + b.HasOne("Content.Server.Database.ConnectionLog", "Connection") + .WithMany("BanHits") + .HasForeignKey("ConnectionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_server_ban_hit_connection_log_connection_id"); + + b.Navigation("Ban"); + + b.Navigation("Connection"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => + { + b.HasOne("Content.Server.Database.Player", "CreatedBy") + .WithMany("AdminServerRoleBansCreated") + .HasForeignKey("BanningAdmin") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_server_role_ban_player_banning_admin"); + + b.HasOne("Content.Server.Database.Player", "LastEditedBy") + .WithMany("AdminServerRoleBansLastEdited") + .HasForeignKey("LastEditedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_server_role_ban_player_last_edited_by_id"); + + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany() + .HasForeignKey("RoundId") + .HasConstraintName("FK_server_role_ban_round_round_id"); + + b.Navigation("CreatedBy"); + + b.Navigation("LastEditedBy"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleUnban", b => + { + b.HasOne("Content.Server.Database.ServerRoleBan", "Ban") + .WithOne("Unban") + .HasForeignKey("Content.Server.Database.ServerRoleUnban", "BanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_server_role_unban_server_role_ban_ban_id"); + + b.Navigation("Ban"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerUnban", b => + { + b.HasOne("Content.Server.Database.ServerBan", "Ban") + .WithOne("Unban") + .HasForeignKey("Content.Server.Database.ServerUnban", "BanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_server_unban_server_ban_ban_id"); + + b.Navigation("Ban"); + }); + + modelBuilder.Entity("Content.Server.Database.Trait", b => + { + b.HasOne("Content.Server.Database.Profile", "Profile") + .WithMany("Traits") + .HasForeignKey("ProfileId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_trait_profile_profile_id"); + + b.Navigation("Profile"); + }); + + modelBuilder.Entity("PlayerRound", b => + { + b.HasOne("Content.Server.Database.Player", null) + .WithMany() + .HasForeignKey("PlayersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_player_round_player_players_id"); + + b.HasOne("Content.Server.Database.Round", null) + .WithMany() + .HasForeignKey("RoundsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_player_round_round_rounds_id"); + }); + + modelBuilder.Entity("Content.Server.Database.Admin", b => + { + b.Navigation("Flags"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLog", b => + { + b.Navigation("Players"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminRank", b => + { + b.Navigation("Admins"); + + b.Navigation("Flags"); + }); + + modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => + { + b.Navigation("BanHits"); + }); + + modelBuilder.Entity("Content.Server.Database.Player", b => + { + b.Navigation("AdminLogs"); + + b.Navigation("AdminMessagesCreated"); + + b.Navigation("AdminMessagesDeleted"); + + b.Navigation("AdminMessagesLastEdited"); + + b.Navigation("AdminMessagesReceived"); + + b.Navigation("AdminNotesCreated"); + + b.Navigation("AdminNotesDeleted"); + + b.Navigation("AdminNotesLastEdited"); + + b.Navigation("AdminNotesReceived"); + + b.Navigation("AdminServerBansCreated"); + + b.Navigation("AdminServerBansLastEdited"); + + b.Navigation("AdminServerRoleBansCreated"); + + b.Navigation("AdminServerRoleBansLastEdited"); + + b.Navigation("AdminWatchlistsCreated"); + + b.Navigation("AdminWatchlistsDeleted"); + + b.Navigation("AdminWatchlistsLastEdited"); + + b.Navigation("AdminWatchlistsReceived"); + }); + + modelBuilder.Entity("Content.Server.Database.Preference", b => + { + b.Navigation("Profiles"); + }); + + modelBuilder.Entity("Content.Server.Database.Profile", b => + { + b.Navigation("Antags"); + + b.Navigation("Jobs"); + + b.Navigation("Traits"); + }); + + modelBuilder.Entity("Content.Server.Database.Round", b => + { + b.Navigation("AdminLogs"); + }); + + modelBuilder.Entity("Content.Server.Database.Server", b => + { + b.Navigation("ConnectionLogs"); + + b.Navigation("Rounds"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBan", b => + { + b.Navigation("BanHits"); + + b.Navigation("Unban"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => + { + b.Navigation("Unban"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Content.Server.Database/Migrations/Postgres/20240201091301_SpawnPriorityPreference.cs b/Content.Server.Database/Migrations/Postgres/20240201091301_SpawnPriorityPreference.cs new file mode 100644 index 00000000000..6fa95717a02 --- /dev/null +++ b/Content.Server.Database/Migrations/Postgres/20240201091301_SpawnPriorityPreference.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Content.Server.Database.Migrations.Postgres +{ + /// + public partial class SpawnPriorityPreference : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "spawn_priority", + table: "profile", + type: "integer", + nullable: false, + defaultValue: 0); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "spawn_priority", + table: "profile"); + } + } +} diff --git a/Content.Server.Database/Migrations/Postgres/PostgresServerDbContextModelSnapshot.cs b/Content.Server.Database/Migrations/Postgres/PostgresServerDbContextModelSnapshot.cs index bbcbfdb5cc3..ae40e1228e0 100644 --- a/Content.Server.Database/Migrations/Postgres/PostgresServerDbContextModelSnapshot.cs +++ b/Content.Server.Database/Migrations/Postgres/PostgresServerDbContextModelSnapshot.cs @@ -7,6 +7,7 @@ using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using NpgsqlTypes; #nullable disable @@ -19,7 +20,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "7.0.4") + .HasAnnotation("ProductVersion", "8.0.0") .HasAnnotation("Relational:MaxIdentifierLength", 63); NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); @@ -803,6 +804,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("integer") .HasColumnName("slot"); + b.Property("SpawnPriority") + .HasColumnType("integer") + .HasColumnName("spawn_priority"); + b.Property("Species") .IsRequired() .HasColumnType("text") @@ -879,7 +884,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property?>("Address") + b.Property("Address") .HasColumnType("inet") .HasColumnName("address"); @@ -1021,7 +1026,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property?>("Address") + b.Property("Address") .HasColumnType("inet") .HasColumnName("address"); diff --git a/Content.Server.Database/Migrations/Sqlite/20240201091254_SpawnPriorityPreference.Designer.cs b/Content.Server.Database/Migrations/Sqlite/20240201091254_SpawnPriorityPreference.Designer.cs new file mode 100644 index 00000000000..f32f3c398b8 --- /dev/null +++ b/Content.Server.Database/Migrations/Sqlite/20240201091254_SpawnPriorityPreference.Designer.cs @@ -0,0 +1,1692 @@ +// +using System; +using Content.Server.Database; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Content.Server.Database.Migrations.Sqlite +{ + [DbContext(typeof(SqliteServerDbContext))] + [Migration("20240201091254_SpawnPriorityPreference")] + partial class SpawnPriorityPreference + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "8.0.0"); + + modelBuilder.Entity("Content.Server.Database.Admin", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("user_id"); + + b.Property("AdminRankId") + .HasColumnType("INTEGER") + .HasColumnName("admin_rank_id"); + + b.Property("Title") + .HasColumnType("TEXT") + .HasColumnName("title"); + + b.HasKey("UserId") + .HasName("PK_admin"); + + b.HasIndex("AdminRankId") + .HasDatabaseName("IX_admin_admin_rank_id"); + + b.ToTable("admin", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminFlag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("admin_flag_id"); + + b.Property("AdminId") + .HasColumnType("TEXT") + .HasColumnName("admin_id"); + + b.Property("Flag") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("flag"); + + b.Property("Negative") + .HasColumnType("INTEGER") + .HasColumnName("negative"); + + b.HasKey("Id") + .HasName("PK_admin_flag"); + + b.HasIndex("AdminId") + .HasDatabaseName("IX_admin_flag_admin_id"); + + b.HasIndex("Flag", "AdminId") + .IsUnique(); + + b.ToTable("admin_flag", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLog", b => + { + b.Property("RoundId") + .HasColumnType("INTEGER") + .HasColumnName("round_id"); + + b.Property("Id") + .HasColumnType("INTEGER") + .HasColumnName("admin_log_id"); + + b.Property("Date") + .HasColumnType("TEXT") + .HasColumnName("date"); + + b.Property("Impact") + .HasColumnType("INTEGER") + .HasColumnName("impact"); + + b.Property("Json") + .IsRequired() + .HasColumnType("jsonb") + .HasColumnName("json"); + + b.Property("Message") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("message"); + + b.Property("Type") + .HasColumnType("INTEGER") + .HasColumnName("type"); + + b.HasKey("RoundId", "Id") + .HasName("PK_admin_log"); + + b.HasIndex("Date"); + + b.HasIndex("Type") + .HasDatabaseName("IX_admin_log_type"); + + b.ToTable("admin_log", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLogPlayer", b => + { + b.Property("RoundId") + .HasColumnType("INTEGER") + .HasColumnName("round_id"); + + b.Property("LogId") + .HasColumnType("INTEGER") + .HasColumnName("log_id"); + + b.Property("PlayerUserId") + .HasColumnType("TEXT") + .HasColumnName("player_user_id"); + + b.HasKey("RoundId", "LogId", "PlayerUserId") + .HasName("PK_admin_log_player"); + + b.HasIndex("PlayerUserId") + .HasDatabaseName("IX_admin_log_player_player_user_id"); + + b.ToTable("admin_log_player", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminMessage", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("admin_messages_id"); + + b.Property("CreatedAt") + .HasColumnType("TEXT") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("TEXT") + .HasColumnName("created_by_id"); + + b.Property("Deleted") + .HasColumnType("INTEGER") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("TEXT") + .HasColumnName("deleted_at"); + + b.Property("DeletedById") + .HasColumnType("TEXT") + .HasColumnName("deleted_by_id"); + + b.Property("ExpirationTime") + .HasColumnType("TEXT") + .HasColumnName("expiration_time"); + + b.Property("LastEditedAt") + .HasColumnType("TEXT") + .HasColumnName("last_edited_at"); + + b.Property("LastEditedById") + .HasColumnType("TEXT") + .HasColumnName("last_edited_by_id"); + + b.Property("Message") + .IsRequired() + .HasMaxLength(4096) + .HasColumnType("TEXT") + .HasColumnName("message"); + + b.Property("PlayerUserId") + .HasColumnType("TEXT") + .HasColumnName("player_user_id"); + + b.Property("PlaytimeAtNote") + .HasColumnType("TEXT") + .HasColumnName("playtime_at_note"); + + b.Property("RoundId") + .HasColumnType("INTEGER") + .HasColumnName("round_id"); + + b.Property("Seen") + .HasColumnType("INTEGER") + .HasColumnName("seen"); + + b.HasKey("Id") + .HasName("PK_admin_messages"); + + b.HasIndex("CreatedById"); + + b.HasIndex("DeletedById"); + + b.HasIndex("LastEditedById"); + + b.HasIndex("PlayerUserId") + .HasDatabaseName("IX_admin_messages_player_user_id"); + + b.HasIndex("RoundId") + .HasDatabaseName("IX_admin_messages_round_id"); + + b.ToTable("admin_messages", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminNote", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("admin_notes_id"); + + b.Property("CreatedAt") + .HasColumnType("TEXT") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("TEXT") + .HasColumnName("created_by_id"); + + b.Property("Deleted") + .HasColumnType("INTEGER") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("TEXT") + .HasColumnName("deleted_at"); + + b.Property("DeletedById") + .HasColumnType("TEXT") + .HasColumnName("deleted_by_id"); + + b.Property("ExpirationTime") + .HasColumnType("TEXT") + .HasColumnName("expiration_time"); + + b.Property("LastEditedAt") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("last_edited_at"); + + b.Property("LastEditedById") + .HasColumnType("TEXT") + .HasColumnName("last_edited_by_id"); + + b.Property("Message") + .IsRequired() + .HasMaxLength(4096) + .HasColumnType("TEXT") + .HasColumnName("message"); + + b.Property("PlayerUserId") + .HasColumnType("TEXT") + .HasColumnName("player_user_id"); + + b.Property("PlaytimeAtNote") + .HasColumnType("TEXT") + .HasColumnName("playtime_at_note"); + + b.Property("RoundId") + .HasColumnType("INTEGER") + .HasColumnName("round_id"); + + b.Property("Secret") + .HasColumnType("INTEGER") + .HasColumnName("secret"); + + b.Property("Severity") + .HasColumnType("INTEGER") + .HasColumnName("severity"); + + b.HasKey("Id") + .HasName("PK_admin_notes"); + + b.HasIndex("CreatedById"); + + b.HasIndex("DeletedById"); + + b.HasIndex("LastEditedById"); + + b.HasIndex("PlayerUserId") + .HasDatabaseName("IX_admin_notes_player_user_id"); + + b.HasIndex("RoundId") + .HasDatabaseName("IX_admin_notes_round_id"); + + b.ToTable("admin_notes", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminRank", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("admin_rank_id"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("name"); + + b.HasKey("Id") + .HasName("PK_admin_rank"); + + b.ToTable("admin_rank", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("admin_rank_flag_id"); + + b.Property("AdminRankId") + .HasColumnType("INTEGER") + .HasColumnName("admin_rank_id"); + + b.Property("Flag") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("flag"); + + b.HasKey("Id") + .HasName("PK_admin_rank_flag"); + + b.HasIndex("AdminRankId"); + + b.HasIndex("Flag", "AdminRankId") + .IsUnique(); + + b.ToTable("admin_rank_flag", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AdminWatchlist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("admin_watchlists_id"); + + b.Property("CreatedAt") + .HasColumnType("TEXT") + .HasColumnName("created_at"); + + b.Property("CreatedById") + .HasColumnType("TEXT") + .HasColumnName("created_by_id"); + + b.Property("Deleted") + .HasColumnType("INTEGER") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("TEXT") + .HasColumnName("deleted_at"); + + b.Property("DeletedById") + .HasColumnType("TEXT") + .HasColumnName("deleted_by_id"); + + b.Property("ExpirationTime") + .HasColumnType("TEXT") + .HasColumnName("expiration_time"); + + b.Property("LastEditedAt") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("last_edited_at"); + + b.Property("LastEditedById") + .HasColumnType("TEXT") + .HasColumnName("last_edited_by_id"); + + b.Property("Message") + .IsRequired() + .HasMaxLength(4096) + .HasColumnType("TEXT") + .HasColumnName("message"); + + b.Property("PlayerUserId") + .HasColumnType("TEXT") + .HasColumnName("player_user_id"); + + b.Property("PlaytimeAtNote") + .HasColumnType("TEXT") + .HasColumnName("playtime_at_note"); + + b.Property("RoundId") + .HasColumnType("INTEGER") + .HasColumnName("round_id"); + + b.HasKey("Id") + .HasName("PK_admin_watchlists"); + + b.HasIndex("CreatedById"); + + b.HasIndex("DeletedById"); + + b.HasIndex("LastEditedById"); + + b.HasIndex("PlayerUserId") + .HasDatabaseName("IX_admin_watchlists_player_user_id"); + + b.HasIndex("RoundId") + .HasDatabaseName("IX_admin_watchlists_round_id"); + + b.ToTable("admin_watchlists", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Antag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("antag_id"); + + b.Property("AntagName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("antag_name"); + + b.Property("ProfileId") + .HasColumnType("INTEGER") + .HasColumnName("profile_id"); + + b.HasKey("Id") + .HasName("PK_antag"); + + b.HasIndex("ProfileId", "AntagName") + .IsUnique(); + + b.ToTable("antag", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.AssignedUserId", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("assigned_user_id_id"); + + b.Property("UserId") + .HasColumnType("TEXT") + .HasColumnName("user_id"); + + b.Property("UserName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("user_name"); + + b.HasKey("Id") + .HasName("PK_assigned_user_id"); + + b.HasIndex("UserId") + .IsUnique(); + + b.HasIndex("UserName") + .IsUnique(); + + b.ToTable("assigned_user_id", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("connection_log_id"); + + b.Property("Address") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("address"); + + b.Property("Denied") + .HasColumnType("INTEGER") + .HasColumnName("denied"); + + b.Property("HWId") + .HasColumnType("BLOB") + .HasColumnName("hwid"); + + b.Property("ServerId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0) + .HasColumnName("server_id"); + + b.Property("Time") + .HasColumnType("TEXT") + .HasColumnName("time"); + + b.Property("UserId") + .HasColumnType("TEXT") + .HasColumnName("user_id"); + + b.Property("UserName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("user_name"); + + b.HasKey("Id") + .HasName("PK_connection_log"); + + b.HasIndex("ServerId") + .HasDatabaseName("IX_connection_log_server_id"); + + b.HasIndex("UserId"); + + b.ToTable("connection_log", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Job", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("job_id"); + + b.Property("JobName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("job_name"); + + b.Property("Priority") + .HasColumnType("INTEGER") + .HasColumnName("priority"); + + b.Property("ProfileId") + .HasColumnType("INTEGER") + .HasColumnName("profile_id"); + + b.HasKey("Id") + .HasName("PK_job"); + + b.HasIndex("ProfileId"); + + b.HasIndex("ProfileId", "JobName") + .IsUnique(); + + b.HasIndex(new[] { "ProfileId" }, "IX_job_one_high_priority") + .IsUnique() + .HasFilter("priority = 3"); + + b.ToTable("job", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.PlayTime", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("play_time_id"); + + b.Property("PlayerId") + .HasColumnType("TEXT") + .HasColumnName("player_id"); + + b.Property("TimeSpent") + .HasColumnType("TEXT") + .HasColumnName("time_spent"); + + b.Property("Tracker") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("tracker"); + + b.HasKey("Id") + .HasName("PK_play_time"); + + b.HasIndex("PlayerId", "Tracker") + .IsUnique(); + + b.ToTable("play_time", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Player", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("player_id"); + + b.Property("FirstSeenTime") + .HasColumnType("TEXT") + .HasColumnName("first_seen_time"); + + b.Property("LastReadRules") + .HasColumnType("TEXT") + .HasColumnName("last_read_rules"); + + b.Property("LastSeenAddress") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("last_seen_address"); + + b.Property("LastSeenHWId") + .HasColumnType("BLOB") + .HasColumnName("last_seen_hwid"); + + b.Property("LastSeenTime") + .HasColumnType("TEXT") + .HasColumnName("last_seen_time"); + + b.Property("LastSeenUserName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("last_seen_user_name"); + + b.Property("UserId") + .HasColumnType("TEXT") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("PK_player"); + + b.HasAlternateKey("UserId") + .HasName("ak_player_user_id"); + + b.HasIndex("LastSeenUserName"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("player", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Preference", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("preference_id"); + + b.Property("AdminOOCColor") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("admin_ooc_color"); + + b.Property("SelectedCharacterSlot") + .HasColumnType("INTEGER") + .HasColumnName("selected_character_slot"); + + b.Property("UserId") + .HasColumnType("TEXT") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("PK_preference"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("preference", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Profile", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("profile_id"); + + b.Property("Age") + .HasColumnType("INTEGER") + .HasColumnName("age"); + + b.Property("Backpack") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("backpack"); + + b.Property("CharacterName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("char_name"); + + b.Property("Clothing") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("clothing"); + + b.Property("EyeColor") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("eye_color"); + + b.Property("FacialHairColor") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("facial_hair_color"); + + b.Property("FacialHairName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("facial_hair_name"); + + b.Property("FlavorText") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("flavor_text"); + + b.Property("Gender") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("gender"); + + b.Property("HairColor") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("hair_color"); + + b.Property("HairName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("hair_name"); + + b.Property("Markings") + .HasColumnType("jsonb") + .HasColumnName("markings"); + + b.Property("PreferenceId") + .HasColumnType("INTEGER") + .HasColumnName("preference_id"); + + b.Property("PreferenceUnavailable") + .HasColumnType("INTEGER") + .HasColumnName("pref_unavailable"); + + b.Property("Sex") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("sex"); + + b.Property("SkinColor") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("skin_color"); + + b.Property("Slot") + .HasColumnType("INTEGER") + .HasColumnName("slot"); + + b.Property("SpawnPriority") + .HasColumnType("INTEGER") + .HasColumnName("spawn_priority"); + + b.Property("Species") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("species"); + + b.HasKey("Id") + .HasName("PK_profile"); + + b.HasIndex("PreferenceId") + .HasDatabaseName("IX_profile_preference_id"); + + b.HasIndex("Slot", "PreferenceId") + .IsUnique(); + + b.ToTable("profile", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Round", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("round_id"); + + b.Property("ServerId") + .HasColumnType("INTEGER") + .HasColumnName("server_id"); + + b.Property("StartDate") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasDefaultValue(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)) + .HasColumnName("start_date"); + + b.HasKey("Id") + .HasName("PK_round"); + + b.HasIndex("ServerId") + .HasDatabaseName("IX_round_server_id"); + + b.HasIndex("StartDate"); + + b.ToTable("round", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Server", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("server_id"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("name"); + + b.HasKey("Id") + .HasName("PK_server"); + + b.ToTable("server", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("server_ban_id"); + + b.Property("Address") + .HasColumnType("TEXT") + .HasColumnName("address"); + + b.Property("AutoDelete") + .HasColumnType("INTEGER") + .HasColumnName("auto_delete"); + + b.Property("BanTime") + .HasColumnType("TEXT") + .HasColumnName("ban_time"); + + b.Property("BanningAdmin") + .HasColumnType("TEXT") + .HasColumnName("banning_admin"); + + b.Property("ExemptFlags") + .HasColumnType("INTEGER") + .HasColumnName("exempt_flags"); + + b.Property("ExpirationTime") + .HasColumnType("TEXT") + .HasColumnName("expiration_time"); + + b.Property("HWId") + .HasColumnType("BLOB") + .HasColumnName("hwid"); + + b.Property("Hidden") + .HasColumnType("INTEGER") + .HasColumnName("hidden"); + + b.Property("LastEditedAt") + .HasColumnType("TEXT") + .HasColumnName("last_edited_at"); + + b.Property("LastEditedById") + .HasColumnType("TEXT") + .HasColumnName("last_edited_by_id"); + + b.Property("PlayerUserId") + .HasColumnType("TEXT") + .HasColumnName("player_user_id"); + + b.Property("PlaytimeAtNote") + .HasColumnType("TEXT") + .HasColumnName("playtime_at_note"); + + b.Property("Reason") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("reason"); + + b.Property("RoundId") + .HasColumnType("INTEGER") + .HasColumnName("round_id"); + + b.Property("Severity") + .HasColumnType("INTEGER") + .HasColumnName("severity"); + + b.HasKey("Id") + .HasName("PK_server_ban"); + + b.HasIndex("Address"); + + b.HasIndex("BanningAdmin"); + + b.HasIndex("LastEditedById"); + + b.HasIndex("PlayerUserId") + .HasDatabaseName("IX_server_ban_player_user_id"); + + b.HasIndex("RoundId") + .HasDatabaseName("IX_server_ban_round_id"); + + b.ToTable("server_ban", null, t => + { + t.HasCheckConstraint("HaveEitherAddressOrUserIdOrHWId", "address IS NOT NULL OR player_user_id IS NOT NULL OR hwid IS NOT NULL"); + }); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBanExemption", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("user_id"); + + b.Property("Flags") + .HasColumnType("INTEGER") + .HasColumnName("flags"); + + b.HasKey("UserId") + .HasName("PK_server_ban_exemption"); + + b.ToTable("server_ban_exemption", null, t => + { + t.HasCheckConstraint("FlagsNotZero", "flags != 0"); + }); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBanHit", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("server_ban_hit_id"); + + b.Property("BanId") + .HasColumnType("INTEGER") + .HasColumnName("ban_id"); + + b.Property("ConnectionId") + .HasColumnType("INTEGER") + .HasColumnName("connection_id"); + + b.HasKey("Id") + .HasName("PK_server_ban_hit"); + + b.HasIndex("BanId") + .HasDatabaseName("IX_server_ban_hit_ban_id"); + + b.HasIndex("ConnectionId") + .HasDatabaseName("IX_server_ban_hit_connection_id"); + + b.ToTable("server_ban_hit", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("server_role_ban_id"); + + b.Property("Address") + .HasColumnType("TEXT") + .HasColumnName("address"); + + b.Property("BanTime") + .HasColumnType("TEXT") + .HasColumnName("ban_time"); + + b.Property("BanningAdmin") + .HasColumnType("TEXT") + .HasColumnName("banning_admin"); + + b.Property("ExpirationTime") + .HasColumnType("TEXT") + .HasColumnName("expiration_time"); + + b.Property("HWId") + .HasColumnType("BLOB") + .HasColumnName("hwid"); + + b.Property("Hidden") + .HasColumnType("INTEGER") + .HasColumnName("hidden"); + + b.Property("LastEditedAt") + .HasColumnType("TEXT") + .HasColumnName("last_edited_at"); + + b.Property("LastEditedById") + .HasColumnType("TEXT") + .HasColumnName("last_edited_by_id"); + + b.Property("PlayerUserId") + .HasColumnType("TEXT") + .HasColumnName("player_user_id"); + + b.Property("PlaytimeAtNote") + .HasColumnType("TEXT") + .HasColumnName("playtime_at_note"); + + b.Property("Reason") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("reason"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("role_id"); + + b.Property("RoundId") + .HasColumnType("INTEGER") + .HasColumnName("round_id"); + + b.Property("Severity") + .HasColumnType("INTEGER") + .HasColumnName("severity"); + + b.HasKey("Id") + .HasName("PK_server_role_ban"); + + b.HasIndex("Address"); + + b.HasIndex("BanningAdmin"); + + b.HasIndex("LastEditedById"); + + b.HasIndex("PlayerUserId") + .HasDatabaseName("IX_server_role_ban_player_user_id"); + + b.HasIndex("RoundId") + .HasDatabaseName("IX_server_role_ban_round_id"); + + b.ToTable("server_role_ban", null, t => + { + t.HasCheckConstraint("HaveEitherAddressOrUserIdOrHWId", "address IS NOT NULL OR player_user_id IS NOT NULL OR hwid IS NOT NULL"); + }); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleUnban", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("role_unban_id"); + + b.Property("BanId") + .HasColumnType("INTEGER") + .HasColumnName("ban_id"); + + b.Property("UnbanTime") + .HasColumnType("TEXT") + .HasColumnName("unban_time"); + + b.Property("UnbanningAdmin") + .HasColumnType("TEXT") + .HasColumnName("unbanning_admin"); + + b.HasKey("Id") + .HasName("PK_server_role_unban"); + + b.HasIndex("BanId") + .IsUnique(); + + b.ToTable("server_role_unban", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.ServerUnban", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("unban_id"); + + b.Property("BanId") + .HasColumnType("INTEGER") + .HasColumnName("ban_id"); + + b.Property("UnbanTime") + .HasColumnType("TEXT") + .HasColumnName("unban_time"); + + b.Property("UnbanningAdmin") + .HasColumnType("TEXT") + .HasColumnName("unbanning_admin"); + + b.HasKey("Id") + .HasName("PK_server_unban"); + + b.HasIndex("BanId") + .IsUnique(); + + b.ToTable("server_unban", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Trait", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("trait_id"); + + b.Property("ProfileId") + .HasColumnType("INTEGER") + .HasColumnName("profile_id"); + + b.Property("TraitName") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("trait_name"); + + b.HasKey("Id") + .HasName("PK_trait"); + + b.HasIndex("ProfileId", "TraitName") + .IsUnique(); + + b.ToTable("trait", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.UploadedResourceLog", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasColumnName("uploaded_resource_log_id"); + + b.Property("Data") + .IsRequired() + .HasColumnType("BLOB") + .HasColumnName("data"); + + b.Property("Date") + .HasColumnType("TEXT") + .HasColumnName("date"); + + b.Property("Path") + .IsRequired() + .HasColumnType("TEXT") + .HasColumnName("path"); + + b.Property("UserId") + .HasColumnType("TEXT") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("PK_uploaded_resource_log"); + + b.ToTable("uploaded_resource_log", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Whitelist", b => + { + b.Property("UserId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT") + .HasColumnName("user_id"); + + b.HasKey("UserId") + .HasName("PK_whitelist"); + + b.ToTable("whitelist", (string)null); + }); + + modelBuilder.Entity("PlayerRound", b => + { + b.Property("PlayersId") + .HasColumnType("INTEGER") + .HasColumnName("players_id"); + + b.Property("RoundsId") + .HasColumnType("INTEGER") + .HasColumnName("rounds_id"); + + b.HasKey("PlayersId", "RoundsId") + .HasName("PK_player_round"); + + b.HasIndex("RoundsId") + .HasDatabaseName("IX_player_round_rounds_id"); + + b.ToTable("player_round", (string)null); + }); + + modelBuilder.Entity("Content.Server.Database.Admin", b => + { + b.HasOne("Content.Server.Database.AdminRank", "AdminRank") + .WithMany("Admins") + .HasForeignKey("AdminRankId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_admin_rank_admin_rank_id"); + + b.Navigation("AdminRank"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminFlag", b => + { + b.HasOne("Content.Server.Database.Admin", "Admin") + .WithMany("Flags") + .HasForeignKey("AdminId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_flag_admin_admin_id"); + + b.Navigation("Admin"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLog", b => + { + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany("AdminLogs") + .HasForeignKey("RoundId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_log_round_round_id"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLogPlayer", b => + { + b.HasOne("Content.Server.Database.Player", "Player") + .WithMany("AdminLogs") + .HasForeignKey("PlayerUserId") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_log_player_player_player_user_id"); + + b.HasOne("Content.Server.Database.AdminLog", "Log") + .WithMany("Players") + .HasForeignKey("RoundId", "LogId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_log_player_admin_log_round_id_log_id"); + + b.Navigation("Log"); + + b.Navigation("Player"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminMessage", b => + { + b.HasOne("Content.Server.Database.Player", "CreatedBy") + .WithMany("AdminMessagesCreated") + .HasForeignKey("CreatedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_messages_player_created_by_id"); + + b.HasOne("Content.Server.Database.Player", "DeletedBy") + .WithMany("AdminMessagesDeleted") + .HasForeignKey("DeletedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_messages_player_deleted_by_id"); + + b.HasOne("Content.Server.Database.Player", "LastEditedBy") + .WithMany("AdminMessagesLastEdited") + .HasForeignKey("LastEditedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_messages_player_last_edited_by_id"); + + b.HasOne("Content.Server.Database.Player", "Player") + .WithMany("AdminMessagesReceived") + .HasForeignKey("PlayerUserId") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .HasConstraintName("FK_admin_messages_player_player_user_id"); + + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany() + .HasForeignKey("RoundId") + .HasConstraintName("FK_admin_messages_round_round_id"); + + b.Navigation("CreatedBy"); + + b.Navigation("DeletedBy"); + + b.Navigation("LastEditedBy"); + + b.Navigation("Player"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminNote", b => + { + b.HasOne("Content.Server.Database.Player", "CreatedBy") + .WithMany("AdminNotesCreated") + .HasForeignKey("CreatedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_notes_player_created_by_id"); + + b.HasOne("Content.Server.Database.Player", "DeletedBy") + .WithMany("AdminNotesDeleted") + .HasForeignKey("DeletedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_notes_player_deleted_by_id"); + + b.HasOne("Content.Server.Database.Player", "LastEditedBy") + .WithMany("AdminNotesLastEdited") + .HasForeignKey("LastEditedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_notes_player_last_edited_by_id"); + + b.HasOne("Content.Server.Database.Player", "Player") + .WithMany("AdminNotesReceived") + .HasForeignKey("PlayerUserId") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .HasConstraintName("FK_admin_notes_player_player_user_id"); + + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany() + .HasForeignKey("RoundId") + .HasConstraintName("FK_admin_notes_round_round_id"); + + b.Navigation("CreatedBy"); + + b.Navigation("DeletedBy"); + + b.Navigation("LastEditedBy"); + + b.Navigation("Player"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminRankFlag", b => + { + b.HasOne("Content.Server.Database.AdminRank", "Rank") + .WithMany("Flags") + .HasForeignKey("AdminRankId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_admin_rank_flag_admin_rank_admin_rank_id"); + + b.Navigation("Rank"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminWatchlist", b => + { + b.HasOne("Content.Server.Database.Player", "CreatedBy") + .WithMany("AdminWatchlistsCreated") + .HasForeignKey("CreatedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_watchlists_player_created_by_id"); + + b.HasOne("Content.Server.Database.Player", "DeletedBy") + .WithMany("AdminWatchlistsDeleted") + .HasForeignKey("DeletedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_watchlists_player_deleted_by_id"); + + b.HasOne("Content.Server.Database.Player", "LastEditedBy") + .WithMany("AdminWatchlistsLastEdited") + .HasForeignKey("LastEditedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_admin_watchlists_player_last_edited_by_id"); + + b.HasOne("Content.Server.Database.Player", "Player") + .WithMany("AdminWatchlistsReceived") + .HasForeignKey("PlayerUserId") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .HasConstraintName("FK_admin_watchlists_player_player_user_id"); + + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany() + .HasForeignKey("RoundId") + .HasConstraintName("FK_admin_watchlists_round_round_id"); + + b.Navigation("CreatedBy"); + + b.Navigation("DeletedBy"); + + b.Navigation("LastEditedBy"); + + b.Navigation("Player"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.Antag", b => + { + b.HasOne("Content.Server.Database.Profile", "Profile") + .WithMany("Antags") + .HasForeignKey("ProfileId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_antag_profile_profile_id"); + + b.Navigation("Profile"); + }); + + modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => + { + b.HasOne("Content.Server.Database.Server", "Server") + .WithMany("ConnectionLogs") + .HasForeignKey("ServerId") + .OnDelete(DeleteBehavior.SetNull) + .IsRequired() + .HasConstraintName("FK_connection_log_server_server_id"); + + b.Navigation("Server"); + }); + + modelBuilder.Entity("Content.Server.Database.Job", b => + { + b.HasOne("Content.Server.Database.Profile", "Profile") + .WithMany("Jobs") + .HasForeignKey("ProfileId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_job_profile_profile_id"); + + b.Navigation("Profile"); + }); + + modelBuilder.Entity("Content.Server.Database.Profile", b => + { + b.HasOne("Content.Server.Database.Preference", "Preference") + .WithMany("Profiles") + .HasForeignKey("PreferenceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_profile_preference_preference_id"); + + b.Navigation("Preference"); + }); + + modelBuilder.Entity("Content.Server.Database.Round", b => + { + b.HasOne("Content.Server.Database.Server", "Server") + .WithMany("Rounds") + .HasForeignKey("ServerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_round_server_server_id"); + + b.Navigation("Server"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBan", b => + { + b.HasOne("Content.Server.Database.Player", "CreatedBy") + .WithMany("AdminServerBansCreated") + .HasForeignKey("BanningAdmin") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_server_ban_player_banning_admin"); + + b.HasOne("Content.Server.Database.Player", "LastEditedBy") + .WithMany("AdminServerBansLastEdited") + .HasForeignKey("LastEditedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_server_ban_player_last_edited_by_id"); + + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany() + .HasForeignKey("RoundId") + .HasConstraintName("FK_server_ban_round_round_id"); + + b.Navigation("CreatedBy"); + + b.Navigation("LastEditedBy"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBanHit", b => + { + b.HasOne("Content.Server.Database.ServerBan", "Ban") + .WithMany("BanHits") + .HasForeignKey("BanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_server_ban_hit_server_ban_ban_id"); + + b.HasOne("Content.Server.Database.ConnectionLog", "Connection") + .WithMany("BanHits") + .HasForeignKey("ConnectionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_server_ban_hit_connection_log_connection_id"); + + b.Navigation("Ban"); + + b.Navigation("Connection"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => + { + b.HasOne("Content.Server.Database.Player", "CreatedBy") + .WithMany("AdminServerRoleBansCreated") + .HasForeignKey("BanningAdmin") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_server_role_ban_player_banning_admin"); + + b.HasOne("Content.Server.Database.Player", "LastEditedBy") + .WithMany("AdminServerRoleBansLastEdited") + .HasForeignKey("LastEditedById") + .HasPrincipalKey("UserId") + .OnDelete(DeleteBehavior.SetNull) + .HasConstraintName("FK_server_role_ban_player_last_edited_by_id"); + + b.HasOne("Content.Server.Database.Round", "Round") + .WithMany() + .HasForeignKey("RoundId") + .HasConstraintName("FK_server_role_ban_round_round_id"); + + b.Navigation("CreatedBy"); + + b.Navigation("LastEditedBy"); + + b.Navigation("Round"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleUnban", b => + { + b.HasOne("Content.Server.Database.ServerRoleBan", "Ban") + .WithOne("Unban") + .HasForeignKey("Content.Server.Database.ServerRoleUnban", "BanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_server_role_unban_server_role_ban_ban_id"); + + b.Navigation("Ban"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerUnban", b => + { + b.HasOne("Content.Server.Database.ServerBan", "Ban") + .WithOne("Unban") + .HasForeignKey("Content.Server.Database.ServerUnban", "BanId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_server_unban_server_ban_ban_id"); + + b.Navigation("Ban"); + }); + + modelBuilder.Entity("Content.Server.Database.Trait", b => + { + b.HasOne("Content.Server.Database.Profile", "Profile") + .WithMany("Traits") + .HasForeignKey("ProfileId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_trait_profile_profile_id"); + + b.Navigation("Profile"); + }); + + modelBuilder.Entity("PlayerRound", b => + { + b.HasOne("Content.Server.Database.Player", null) + .WithMany() + .HasForeignKey("PlayersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_player_round_player_players_id"); + + b.HasOne("Content.Server.Database.Round", null) + .WithMany() + .HasForeignKey("RoundsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("FK_player_round_round_rounds_id"); + }); + + modelBuilder.Entity("Content.Server.Database.Admin", b => + { + b.Navigation("Flags"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminLog", b => + { + b.Navigation("Players"); + }); + + modelBuilder.Entity("Content.Server.Database.AdminRank", b => + { + b.Navigation("Admins"); + + b.Navigation("Flags"); + }); + + modelBuilder.Entity("Content.Server.Database.ConnectionLog", b => + { + b.Navigation("BanHits"); + }); + + modelBuilder.Entity("Content.Server.Database.Player", b => + { + b.Navigation("AdminLogs"); + + b.Navigation("AdminMessagesCreated"); + + b.Navigation("AdminMessagesDeleted"); + + b.Navigation("AdminMessagesLastEdited"); + + b.Navigation("AdminMessagesReceived"); + + b.Navigation("AdminNotesCreated"); + + b.Navigation("AdminNotesDeleted"); + + b.Navigation("AdminNotesLastEdited"); + + b.Navigation("AdminNotesReceived"); + + b.Navigation("AdminServerBansCreated"); + + b.Navigation("AdminServerBansLastEdited"); + + b.Navigation("AdminServerRoleBansCreated"); + + b.Navigation("AdminServerRoleBansLastEdited"); + + b.Navigation("AdminWatchlistsCreated"); + + b.Navigation("AdminWatchlistsDeleted"); + + b.Navigation("AdminWatchlistsLastEdited"); + + b.Navigation("AdminWatchlistsReceived"); + }); + + modelBuilder.Entity("Content.Server.Database.Preference", b => + { + b.Navigation("Profiles"); + }); + + modelBuilder.Entity("Content.Server.Database.Profile", b => + { + b.Navigation("Antags"); + + b.Navigation("Jobs"); + + b.Navigation("Traits"); + }); + + modelBuilder.Entity("Content.Server.Database.Round", b => + { + b.Navigation("AdminLogs"); + }); + + modelBuilder.Entity("Content.Server.Database.Server", b => + { + b.Navigation("ConnectionLogs"); + + b.Navigation("Rounds"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerBan", b => + { + b.Navigation("BanHits"); + + b.Navigation("Unban"); + }); + + modelBuilder.Entity("Content.Server.Database.ServerRoleBan", b => + { + b.Navigation("Unban"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Content.Server.Database/Migrations/Sqlite/20240201091254_SpawnPriorityPreference.cs b/Content.Server.Database/Migrations/Sqlite/20240201091254_SpawnPriorityPreference.cs new file mode 100644 index 00000000000..cf2528f290a --- /dev/null +++ b/Content.Server.Database/Migrations/Sqlite/20240201091254_SpawnPriorityPreference.cs @@ -0,0 +1,29 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Content.Server.Database.Migrations.Sqlite +{ + /// + public partial class SpawnPriorityPreference : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "spawn_priority", + table: "profile", + type: "INTEGER", + nullable: false, + defaultValue: 0); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "spawn_priority", + table: "profile"); + } + } +} diff --git a/Content.Server.Database/Migrations/Sqlite/SqliteServerDbContextModelSnapshot.cs b/Content.Server.Database/Migrations/Sqlite/SqliteServerDbContextModelSnapshot.cs index 707bae9e21e..c9a36ebc5ed 100644 --- a/Content.Server.Database/Migrations/Sqlite/SqliteServerDbContextModelSnapshot.cs +++ b/Content.Server.Database/Migrations/Sqlite/SqliteServerDbContextModelSnapshot.cs @@ -15,7 +15,7 @@ partial class SqliteServerDbContextModelSnapshot : ModelSnapshot protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "7.0.4"); + modelBuilder.HasAnnotation("ProductVersion", "8.0.0"); modelBuilder.Entity("Content.Server.Database.Admin", b => { @@ -757,6 +757,10 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("INTEGER") .HasColumnName("slot"); + b.Property("SpawnPriority") + .HasColumnType("INTEGER") + .HasColumnName("spawn_priority"); + b.Property("Species") .IsRequired() .HasColumnType("TEXT") diff --git a/Content.Server.Database/Model.cs b/Content.Server.Database/Model.cs index a522d9994e7..d6dec1dc3e1 100644 --- a/Content.Server.Database/Model.cs +++ b/Content.Server.Database/Model.cs @@ -338,6 +338,7 @@ public class Profile public string SkinColor { get; set; } = null!; public string Clothing { get; set; } = null!; public string Backpack { get; set; } = null!; + public int SpawnPriority { get; set; } = 0; public List Jobs { get; } = new(); public List Antags { get; } = new(); public List Traits { get; } = new(); diff --git a/Content.Server/Database/ServerDbBase.cs b/Content.Server/Database/ServerDbBase.cs index 1edf9293211..5365bfb05b2 100644 --- a/Content.Server/Database/ServerDbBase.cs +++ b/Content.Server/Database/ServerDbBase.cs @@ -186,6 +186,8 @@ private static HumanoidCharacterProfile ConvertProfiles(Profile profile) if (Enum.TryParse(profile.Backpack, true, out var backpackVal)) backpack = backpackVal; + var spawnPriority = (SpawnPriorityPreference) profile.SpawnPriority; + var gender = sex == Sex.Male ? Gender.Male : Gender.Female; if (Enum.TryParse(profile.Gender, true, out var genderVal)) gender = genderVal; @@ -225,6 +227,7 @@ private static HumanoidCharacterProfile ConvertProfiles(Profile profile) ), clothing, backpack, + spawnPriority, jobs, (PreferenceUnavailableMode) profile.PreferenceUnavailable, antags.ToList(), diff --git a/Content.Server/Shuttles/Systems/ArrivalsSystem.cs b/Content.Server/Shuttles/Systems/ArrivalsSystem.cs index f1f52c22415..6503e4bf517 100644 --- a/Content.Server/Shuttles/Systems/ArrivalsSystem.cs +++ b/Content.Server/Shuttles/Systems/ArrivalsSystem.cs @@ -12,7 +12,6 @@ using Content.Server.Shuttles.Components; using Content.Server.Shuttles.Events; using Content.Server.Spawners.Components; -using Content.Server.Spawners.EntitySystems; using Content.Server.Station.Components; using Content.Server.Station.Systems; using Content.Shared.Administration; @@ -82,7 +81,6 @@ public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnPlayerSpawn, before: new[] { typeof(SpawnPointSystem), typeof(ContainerSpawnPointSystem) }); SubscribeLocalEvent(OnArrivalsStartup); SubscribeLocalEvent(OnShuttleStartup); @@ -314,7 +312,7 @@ private void DumpChildren(EntityUid uid, ref FTLStartedEvent args, List(OnSpawnPlayer, before: new[] { typeof(SpawnPointSystem) }, after: new[] { typeof(ArrivalsSystem) }); - } - - private void OnSpawnPlayer(PlayerSpawningEvent args) + public void HandlePlayerSpawning(PlayerSpawningEvent args) { if (args.SpawnResult != null) return; diff --git a/Content.Server/Spawners/EntitySystems/SpawnPointSystem.cs b/Content.Server/Spawners/EntitySystems/SpawnPointSystem.cs index 80b2c3cb09d..65877d4e5de 100644 --- a/Content.Server/Spawners/EntitySystems/SpawnPointSystem.cs +++ b/Content.Server/Spawners/EntitySystems/SpawnPointSystem.cs @@ -1,5 +1,4 @@ using Content.Server.GameTicking; -using Content.Server.Shuttles.Systems; using Content.Server.Spawners.Components; using Content.Server.Station.Systems; using Robust.Shared.Map; @@ -16,10 +15,10 @@ public sealed class SpawnPointSystem : EntitySystem public override void Initialize() { - SubscribeLocalEvent(OnSpawnPlayer, after: new[] { typeof(ContainerSpawnPointSystem), typeof(ArrivalsSystem) }); + SubscribeLocalEvent(OnPlayerSpawning); } - private void OnSpawnPlayer(PlayerSpawningEvent args) + private void OnPlayerSpawning(PlayerSpawningEvent args) { if (args.SpawnResult != null) return; diff --git a/Content.Server/Station/Systems/StationSpawningSystem.cs b/Content.Server/Station/Systems/StationSpawningSystem.cs index 1822c243dc6..2e684e23a1f 100644 --- a/Content.Server/Station/Systems/StationSpawningSystem.cs +++ b/Content.Server/Station/Systems/StationSpawningSystem.cs @@ -4,6 +4,8 @@ using Content.Server.IdentityManagement; using Content.Server.Mind.Commands; using Content.Server.PDA; +using Content.Server.Shuttles.Systems; +using Content.Server.Spawners.EntitySystems; using Content.Server.Spawners.Components; using Content.Server.Station.Components; using Content.Shared.Access.Components; @@ -45,12 +47,23 @@ public sealed class StationSpawningSystem : SharedStationSpawningSystem [Dependency] private readonly IdentitySystem _identity = default!; [Dependency] private readonly MetaDataSystem _metaSystem = default!; + [Dependency] private readonly ArrivalsSystem _arrivalsSystem = default!; + [Dependency] private readonly ContainerSpawnPointSystem _containerSpawnPointSystem = default!; + private bool _randomizeCharacters; + private Dictionary> _spawnerCallbacks = new(); + /// public override void Initialize() { _configurationManager.OnValueChanged(CCVars.ICRandomCharacters, e => _randomizeCharacters = e, true); + + _spawnerCallbacks = new Dictionary>() + { + { SpawnPriorityPreference.Arrivals, _arrivalsSystem.HandlePlayerSpawning }, + { SpawnPriorityPreference.Cryosleep, _containerSpawnPointSystem.HandlePlayerSpawning } + }; } /// @@ -73,6 +86,30 @@ public override void Initialize() // Delta-V: Set desired spawn point type. var ev = new PlayerSpawningEvent(job, profile, station, spawnPointType); + + if (station != null && profile != null) + { + /// Try to call the character's preferred spawner first. + if (_spawnerCallbacks.TryGetValue(profile.SpawnPriority, out var preferredSpawner)) + { + preferredSpawner(ev); + + foreach (var (key, remainingSpawner) in _spawnerCallbacks) + { + if (key == profile.SpawnPriority) + continue; + + remainingSpawner(ev); + } + } + else + { + /// Call all of them in the typical order. + foreach (var typicalSpawner in _spawnerCallbacks.Values) + typicalSpawner(ev); + } + } + RaiseLocalEvent(ev); DebugTools.Assert(ev.SpawnResult is { Valid: true } or null); diff --git a/Content.Shared/Preferences/HumanoidCharacterProfile.cs b/Content.Shared/Preferences/HumanoidCharacterProfile.cs index 2fdb0b0f91c..9447bb7b407 100644 --- a/Content.Shared/Preferences/HumanoidCharacterProfile.cs +++ b/Content.Shared/Preferences/HumanoidCharacterProfile.cs @@ -41,6 +41,7 @@ private HumanoidCharacterProfile( HumanoidCharacterAppearance appearance, ClothingPreference clothing, BackpackPreference backpack, + SpawnPriorityPreference spawnPriority, Dictionary jobPriorities, PreferenceUnavailableMode preferenceUnavailable, List antagPreferences, @@ -55,6 +56,7 @@ private HumanoidCharacterProfile( Appearance = appearance; Clothing = clothing; Backpack = backpack; + SpawnPriority = spawnPriority; _jobPriorities = jobPriorities; PreferenceUnavailable = preferenceUnavailable; _antagPreferences = antagPreferences; @@ -67,7 +69,7 @@ private HumanoidCharacterProfile( Dictionary jobPriorities, List antagPreferences, List traitPreferences) - : this(other.Name, other.FlavorText, other.Species, other.Age, other.Sex, other.Gender, other.Appearance, other.Clothing, other.Backpack, + : this(other.Name, other.FlavorText, other.Species, other.Age, other.Sex, other.Gender, other.Appearance, other.Clothing, other.Backpack, other.SpawnPriority, jobPriorities, other.PreferenceUnavailable, antagPreferences, traitPreferences) { } @@ -88,11 +90,12 @@ public HumanoidCharacterProfile( HumanoidCharacterAppearance appearance, ClothingPreference clothing, BackpackPreference backpack, + SpawnPriorityPreference spawnPriority, IReadOnlyDictionary jobPriorities, PreferenceUnavailableMode preferenceUnavailable, IReadOnlyList antagPreferences, IReadOnlyList traitPreferences) - : this(name, flavortext, species, age, sex, gender, appearance, clothing, backpack, new Dictionary(jobPriorities), + : this(name, flavortext, species, age, sex, gender, appearance, clothing, backpack, spawnPriority, new Dictionary(jobPriorities), preferenceUnavailable, new List(antagPreferences), new List(traitPreferences)) { } @@ -112,6 +115,7 @@ public HumanoidCharacterProfile() : this( new HumanoidCharacterAppearance(), ClothingPreference.Jumpsuit, BackpackPreference.Backpack, + SpawnPriorityPreference.Arrivals, new Dictionary { {SharedGameTicker.FallbackOverflowJob, JobPriority.High} @@ -139,6 +143,7 @@ public static HumanoidCharacterProfile DefaultWithSpecies(string species = Share HumanoidCharacterAppearance.DefaultWithSpecies(species), ClothingPreference.Jumpsuit, BackpackPreference.Backpack, + SpawnPriorityPreference.Arrivals, new Dictionary { {SharedGameTicker.FallbackOverflowJob, JobPriority.High} @@ -180,7 +185,7 @@ public static HumanoidCharacterProfile RandomWithSpecies(string species = Shared var name = GetName(species, gender); - return new HumanoidCharacterProfile(name, "", species, age, sex, gender, HumanoidCharacterAppearance.Random(species, sex), ClothingPreference.Jumpsuit, BackpackPreference.Backpack, + return new HumanoidCharacterProfile(name, "", species, age, sex, gender, HumanoidCharacterAppearance.Random(species, sex), ClothingPreference.Jumpsuit, BackpackPreference.Backpack, SpawnPriorityPreference.Arrivals, new Dictionary { {SharedGameTicker.FallbackOverflowJob, JobPriority.High}, @@ -206,6 +211,7 @@ public static HumanoidCharacterProfile RandomWithSpecies(string species = Shared public HumanoidCharacterAppearance Appearance { get; private set; } public ClothingPreference Clothing { get; private set; } public BackpackPreference Backpack { get; private set; } + public SpawnPriorityPreference SpawnPriority { get; private set; } public IReadOnlyDictionary JobPriorities => _jobPriorities; public IReadOnlyList AntagPreferences => _antagPreferences; public IReadOnlyList TraitPreferences => _traitPreferences; @@ -255,6 +261,10 @@ public HumanoidCharacterProfile WithBackpackPreference(BackpackPreference backpa { return new(this) { Backpack = backpack }; } + public HumanoidCharacterProfile WithSpawnPriorityPreference(SpawnPriorityPreference spawnPriority) + { + return new(this) { SpawnPriority = spawnPriority }; + } public HumanoidCharacterProfile WithJobPriorities(IEnumerable> jobPriorities) { return new(this, new Dictionary(jobPriorities), _antagPreferences, _traitPreferences); @@ -344,6 +354,7 @@ public bool MemberwiseEquals(ICharacterProfile maybeOther) if (PreferenceUnavailable != other.PreferenceUnavailable) return false; if (Clothing != other.Clothing) return false; if (Backpack != other.Backpack) return false; + if (SpawnPriority != other.SpawnPriority) return false; if (!_jobPriorities.SequenceEqual(other._jobPriorities)) return false; if (!_antagPreferences.SequenceEqual(other._antagPreferences)) return false; if (!_traitPreferences.SequenceEqual(other._traitPreferences)) return false; @@ -466,6 +477,13 @@ public void EnsureValid() _ => BackpackPreference.Backpack // Invalid enum values. }; + var spawnPriority = SpawnPriority switch + { + SpawnPriorityPreference.Arrivals => SpawnPriorityPreference.Arrivals, + SpawnPriorityPreference.Cryosleep => SpawnPriorityPreference.Cryosleep, + _ => SpawnPriorityPreference.Arrivals // Invalid enum values. + }; + var priorities = new Dictionary(JobPriorities .Where(p => prototypeManager.HasIndex(p.Key) && p.Value switch { @@ -492,6 +510,7 @@ public void EnsureValid() Appearance = appearance; Clothing = clothing; Backpack = backpack; + SpawnPriority = spawnPriority; _jobPriorities.Clear(); @@ -535,6 +554,7 @@ public override int GetHashCode() Clothing, Backpack ), + SpawnPriority, PreferenceUnavailable, _jobPriorities, _antagPreferences, diff --git a/Content.Shared/Preferences/SpawnPriorityPreference.cs b/Content.Shared/Preferences/SpawnPriorityPreference.cs new file mode 100644 index 00000000000..ea52da25d76 --- /dev/null +++ b/Content.Shared/Preferences/SpawnPriorityPreference.cs @@ -0,0 +1,15 @@ +namespace Content.Shared.Preferences +{ + /// + /// The spawn priority preference for a profile. Stored in database! + /// + public enum SpawnPriorityPreference + { + /////////////////////// + /// DO NOT TOUCH!!! /// + /////////////////////// + None = 0, + Arrivals = 1, + Cryosleep = 2, + } +} diff --git a/Resources/Locale/en-US/preferences/ui/humanoid-profile-editor.ftl b/Resources/Locale/en-US/preferences/ui/humanoid-profile-editor.ftl index 6e279b4b28b..bc506e20bb2 100644 --- a/Resources/Locale/en-US/preferences/ui/humanoid-profile-editor.ftl +++ b/Resources/Locale/en-US/preferences/ui/humanoid-profile-editor.ftl @@ -21,6 +21,7 @@ humanoid-profile-editor-export-button = Export humanoid-profile-editor-save-button = Save humanoid-profile-editor-clothing-label = Clothing: humanoid-profile-editor-backpack-label = Backpack: +humanoid-profile-editor-spawn-priority-label = Spawn priority: humanoid-profile-editor-eyes-label = Eye color: humanoid-profile-editor-jobs-tab = Jobs humanoid-profile-editor-preference-unavailable-stay-in-lobby-button = Stay in lobby if preference unavailable. @@ -30,6 +31,12 @@ humanoid-profile-editor-preference-jumpskirt = Jumpskirt humanoid-profile-editor-preference-backpack = Backpack humanoid-profile-editor-preference-satchel = Satchel humanoid-profile-editor-preference-duffelbag = Duffelbag + +# Spawn priority +humanoid-profile-editor-preference-spawn-priority-none = None +humanoid-profile-editor-preference-spawn-priority-arrivals = Arrivals +humanoid-profile-editor-preference-spawn-priority-cryosleep = Cryosleep + humanoid-profile-editor-jobs-amount-in-department-tooltip = Jobs in the {$departmentName} department humanoid-profile-editor-department-jobs-label = {$departmentName} jobs humanoid-profile-editor-antags-tab = Antags From 69b3d47a60be1d8b6be62a1541aabb1daabb2517 Mon Sep 17 00:00:00 2001 From: SlamBamActionman <83650252+slambamactionman@users.noreply.github.com> Date: Thu, 1 Feb 2024 11:13:44 +0100 Subject: [PATCH 116/266] Visitor job (#23972) * Adds Visitor role and ShowInIdCardConsole property * Add visitor to Agent ID card * Fixes yaml test * Fixes based on feedback * Fixes based on feedback (cherry picked from commit 1862f8aa1745f147fa54428179e568c9298a9fda) --- .../Access/UI/IdCardConsoleWindow.xaml.cs | 2 +- Content.Shared/Roles/JobPrototype.cs | 7 +++++++ Resources/Locale/en-US/job/job-description.ftl | 1 + Resources/Locale/en-US/job/job-names.ftl | 6 ++---- .../Objects/Misc/identification_cards.yml | 5 +---- .../Prototypes/Roles/Jobs/Civilian/visitor.yml | 11 +++++++++++ Resources/Prototypes/Roles/Jobs/departments.yml | 1 + Resources/Prototypes/Roles/play_time_trackers.yml | 3 +++ Resources/Prototypes/StatusEffects/job.yml | 7 +++++++ .../Interface/Misc/job_icons.rsi/Visitor.png | Bin 0 -> 147 bytes .../Interface/Misc/job_icons.rsi/meta.json | 3 +++ 11 files changed, 37 insertions(+), 9 deletions(-) create mode 100644 Resources/Prototypes/Roles/Jobs/Civilian/visitor.yml create mode 100644 Resources/Textures/Interface/Misc/job_icons.rsi/Visitor.png diff --git a/Content.Client/Access/UI/IdCardConsoleWindow.xaml.cs b/Content.Client/Access/UI/IdCardConsoleWindow.xaml.cs index 670ba088713..bf5984e8096 100644 --- a/Content.Client/Access/UI/IdCardConsoleWindow.xaml.cs +++ b/Content.Client/Access/UI/IdCardConsoleWindow.xaml.cs @@ -55,7 +55,7 @@ public IdCardConsoleWindow(IdCardConsoleBoundUserInterface owner, IPrototypeMana foreach (var job in jobs) { - if (!job.SetPreference) + if (!job.OverrideConsoleVisibility.GetValueOrDefault(job.SetPreference)) { continue; } diff --git a/Content.Shared/Roles/JobPrototype.cs b/Content.Shared/Roles/JobPrototype.cs index 54c10c995b8..19c11189cfd 100644 --- a/Content.Shared/Roles/JobPrototype.cs +++ b/Content.Shared/Roles/JobPrototype.cs @@ -53,6 +53,13 @@ public sealed partial class JobPrototype : IPrototype [DataField("setPreference")] public bool SetPreference { get; private set; } = true; + /// + /// Whether this job should show in the ID Card Console. + /// If set to null, it will default to SetPreference's value. + /// + [DataField] + public bool? OverrideConsoleVisibility { get; private set; } = null; + [DataField("canBeAntag")] public bool CanBeAntag { get; private set; } = true; diff --git a/Resources/Locale/en-US/job/job-description.ftl b/Resources/Locale/en-US/job/job-description.ftl index 41891130611..56fc482c2d8 100644 --- a/Resources/Locale/en-US/job/job-description.ftl +++ b/Resources/Locale/en-US/job/job-description.ftl @@ -42,6 +42,7 @@ job-description-salvagespec = Use the salvage magnet to draw in detatched scraps job-description-scientist = Research alien artifacts, unlock new technologies, build newer and better machines around the station, and make everything run more efficiently. job-description-security = Catch criminals and enemies of the station, enforce the law, and ensure that the station does not fall into disarray. job-description-serviceworker = Learn the basics of bartending, cooking, and growing plants. +job-description-visitor = Enjoy your visit to the station. job-description-warden = Patrol the security department, ensure that no one is stealing from the armory, and make sure that all prisoners are processed and let out when their time is up. job-description-zookeeper = Put on a joyful display of cute animals and space carps for all the crew to see. Currently unavailable. job-description-senior-engineer = Teach new engineers the basics of the station's engine, repairing, atmospherics and power. diff --git a/Resources/Locale/en-US/job/job-names.ftl b/Resources/Locale/en-US/job/job-names.ftl index 042d4e73729..f58e560010f 100644 --- a/Resources/Locale/en-US/job/job-names.ftl +++ b/Resources/Locale/en-US/job/job-names.ftl @@ -44,10 +44,7 @@ job-name-ertmedic = ERT Medic job-name-ertjanitor = ERT Janitor job-name-boxer = Boxer job-name-zookeeper = Zookeeper -job-name-senior-engineer = Senior Engineer -job-name-senior-researcher = Senior Researcher -job-name-senior-physician = Senior Physician -job-name-senior-officer = Senior Officer +job-name-visitor = Visitor # Role timers - Make these alphabetical or I cut you JobAtmosphericTechnician = Atmospheric Technician @@ -98,5 +95,6 @@ JobSeniorResearcher = Senior Researcher JobServiceWorker = Service Worker JobStationEngineer = Station Engineer JobTechnicalAssistant = Technical Assistant +JobVisitor = Visitor JobWarden = Warden JobZookeeper = Zookeeper diff --git a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml index f972bbd60bb..4c9427ea875 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml @@ -663,15 +663,12 @@ - JobIconServiceWorker - JobIconSecurityCadet - JobIconZookeeper - - JobIconSeniorPhysician - - JobIconSeniorOfficer - - JobIconSeniorEngineer - - JobIconSeniorResearcher - JobIconPrisonGuard # Nyanotrasen - PrisonGuard, see Resources/Prototypes/Nyanotrasen/Roles/Jobs/Security/prisonguard.yml - JobIconMailCarrier # Nyanotrasen - MailCarrier, see Resources/Prototypes/Nyanotrasen/Roles/Jobs/Cargo/mail-carrier.yml - JobIconMartialArtist # Nyanotrasen - MartialArtist, see Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/martialartist.yml - JobIconGladiator # Nyanotrasen - Gladiator, see Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/gladiator.yml - JobIconForensicMantis # Nyanotrasen - ForensicMantis, see Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml + - JobIconVisitor - type: ActivatableUI key: enum.AgentIDCardUiKey.Key inHandsOnly: true diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/visitor.yml b/Resources/Prototypes/Roles/Jobs/Civilian/visitor.yml new file mode 100644 index 00000000000..d16be5c350a --- /dev/null +++ b/Resources/Prototypes/Roles/Jobs/Civilian/visitor.yml @@ -0,0 +1,11 @@ +- type: job + id: Visitor + name: job-name-visitor + description: job-description-visitor + playTimeTracker: JobVisitor + canBeAntag: false + icon: JobIconVisitor + setPreference: false + overrideConsoleVisibility: true + access: + - Maintenance diff --git a/Resources/Prototypes/Roles/Jobs/departments.yml b/Resources/Prototypes/Roles/Jobs/departments.yml index 95e225fce86..14ebc5717fc 100644 --- a/Resources/Prototypes/Roles/Jobs/departments.yml +++ b/Resources/Prototypes/Roles/Jobs/departments.yml @@ -29,6 +29,7 @@ - Musician - Passenger - Reporter + - Visitor - Zookeeper - ServiceWorker - MartialArtist # Nyanotrasen - MartialArtist, see Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/martialartist.yml diff --git a/Resources/Prototypes/Roles/play_time_trackers.yml b/Resources/Prototypes/Roles/play_time_trackers.yml index 58eab7864bb..c3dd65893c3 100644 --- a/Resources/Prototypes/Roles/play_time_trackers.yml +++ b/Resources/Prototypes/Roles/play_time_trackers.yml @@ -142,6 +142,9 @@ - type: playTimeTracker id: JobTechnicalAssistant +- type: playTimeTracker + id: JobVisitor + - type: playTimeTracker id: JobWarden diff --git a/Resources/Prototypes/StatusEffects/job.yml b/Resources/Prototypes/StatusEffects/job.yml index e467efc7835..7072cc44346 100644 --- a/Resources/Prototypes/StatusEffects/job.yml +++ b/Resources/Prototypes/StatusEffects/job.yml @@ -367,3 +367,10 @@ icon: sprite: Interface/Misc/job_icons.rsi state: SeniorResearcher + +- type: statusIcon + parent: JobIcon + id: JobIconVisitor + icon: + sprite: Interface/Misc/job_icons.rsi + state: Visitor diff --git a/Resources/Textures/Interface/Misc/job_icons.rsi/Visitor.png b/Resources/Textures/Interface/Misc/job_icons.rsi/Visitor.png new file mode 100644 index 0000000000000000000000000000000000000000..5644edb607f289b5a1ca7973173e7382c0acb388 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqjKx9jP7LeL$-D$|d_7$pLnNlQ z_8;UuV8Frb8-AqPp!@rWzAsZdR!ppt7r5c(Qr?{Mxan=jnVj1U4XbW>dn$B3e>O*k u$fX{I~aimGkCiCxvX Date: Thu, 1 Feb 2024 10:14:50 +0000 Subject: [PATCH 117/266] Automatic changelog update (cherry picked from commit c4f275bc5378ebabff85b0b0e5dc9d3c30cf1ade) --- Resources/Changelog/Changelog.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index ef9487b5b03..736b1a74d22 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Vasilis - changes: - - message: Added a General settings tab, and moved a bunch of options into it. - type: Add - - message: Added the ability to toggle on and off the Discord Rich Presence. - type: Add - id: 5350 - time: '2023-12-13T01:58:20.0000000+00:00' - author: Ubaser changes: - message: RD now has a custom-made lab coat. @@ -3854,3 +3846,11 @@ id: 5849 time: '2024-02-01T09:01:52.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24790 +- author: SlamBamActionman + changes: + - message: The Visitor job can now be given to ID cards via the ID Card Console/Agent + IDs. + type: Add + id: 5850 + time: '2024-02-01T10:13:44.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23972 From b98e16ff53ac44156fa2e5e5e9ac432e47456b1f Mon Sep 17 00:00:00 2001 From: Arendian <137322659+Arendian@users.noreply.github.com> Date: Thu, 1 Feb 2024 11:39:10 +0100 Subject: [PATCH 118/266] Spacelube slide (#24801) * Space lube now makes you slide * review * oh lord he slippin --------- Co-authored-by: metalgearsloth (cherry picked from commit 4f3b8d740cecfb736b018fd78a2be71f5397644d) --- .../TileReactions/SpillTileReaction.cs | 11 +++- .../Fluids/EntitySystems/PuddleSystem.cs | 2 +- Content.Shared/Slippery/SlidingComponent.cs | 22 +++++++ Content.Shared/Slippery/SlidingSystem.cs | 63 +++++++++++++++++++ Content.Shared/Slippery/SlipperyComponent.cs | 10 ++- Content.Shared/Slippery/SlipperySystem.cs | 10 ++- Resources/Prototypes/Reagents/cleaning.yml | 3 +- 7 files changed, 112 insertions(+), 9 deletions(-) create mode 100644 Content.Shared/Slippery/SlidingComponent.cs create mode 100644 Content.Shared/Slippery/SlidingSystem.cs diff --git a/Content.Server/Chemistry/TileReactions/SpillTileReaction.cs b/Content.Server/Chemistry/TileReactions/SpillTileReaction.cs index 87246927d75..49fdaa5c7ee 100644 --- a/Content.Server/Chemistry/TileReactions/SpillTileReaction.cs +++ b/Content.Server/Chemistry/TileReactions/SpillTileReaction.cs @@ -21,9 +21,15 @@ public sealed partial class SpillTileReaction : ITileReaction [DataField("requiredSlipSpeed")] private float _requiredSlipSpeed = 6; [DataField("paralyzeTime")] private float _paralyzeTime = 1; + /// + /// + /// + [DataField("superSlippery")] private bool _superSlippery; + public FixedPoint2 TileReact(TileRef tile, ReagentPrototype reagent, FixedPoint2 reactVolume) { - if (reactVolume < 5) return FixedPoint2.Zero; + if (reactVolume < 5) + return FixedPoint2.Zero; var entityManager = IoCManager.Resolve(); @@ -33,7 +39,8 @@ public FixedPoint2 TileReact(TileRef tile, ReagentPrototype reagent, FixedPoint2 var slippery = entityManager.EnsureComponent(puddleUid); slippery.LaunchForwardsMultiplier = _launchForwardsMultiplier; slippery.ParalyzeTime = _paralyzeTime; - entityManager.Dirty(slippery); + slippery.SuperSlippery = _superSlippery; + entityManager.Dirty(puddleUid, slippery); var step = entityManager.EnsureComponent(puddleUid); entityManager.EntitySysManager.GetEntitySystem().SetRequiredTriggerSpeed(puddleUid, _requiredSlipSpeed, step); diff --git a/Content.Server/Fluids/EntitySystems/PuddleSystem.cs b/Content.Server/Fluids/EntitySystems/PuddleSystem.cs index b6df3a171b8..44d28379aba 100644 --- a/Content.Server/Fluids/EntitySystems/PuddleSystem.cs +++ b/Content.Server/Fluids/EntitySystems/PuddleSystem.cs @@ -293,7 +293,7 @@ private void OnPuddleSlip(Entity entity, ref SlipEvent args) { // Reactive entities have a chance to get a touch reaction from slipping on a puddle // (i.e. it is implied they fell face first onto it or something) - if (!HasComp(args.Slipped)) + if (!HasComp(args.Slipped) || HasComp(args.Slipped)) return; // Eventually probably have some system of 'body coverage' to tweak the probability but for now just 0.5 diff --git a/Content.Shared/Slippery/SlidingComponent.cs b/Content.Shared/Slippery/SlidingComponent.cs new file mode 100644 index 00000000000..e48c0f2e9ee --- /dev/null +++ b/Content.Shared/Slippery/SlidingComponent.cs @@ -0,0 +1,22 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Slippery; + +/// +/// Applies continuous movement to the attached entity when colliding with super slipper entities. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class SlidingComponent : Component +{ + /// + /// A list of SuperSlippery entities the entity with this component is colliding with. + /// + [DataField, AutoNetworkedField] + public HashSet CollidingEntities = new (); + + /// + /// The friction modifier that will be applied to any friction calculations. + /// + [DataField, AutoNetworkedField] + public float FrictionModifier; +} diff --git a/Content.Shared/Slippery/SlidingSystem.cs b/Content.Shared/Slippery/SlidingSystem.cs new file mode 100644 index 00000000000..0af6b203cc5 --- /dev/null +++ b/Content.Shared/Slippery/SlidingSystem.cs @@ -0,0 +1,63 @@ +using Content.Shared.Movement.Events; +using Content.Shared.Standing; +using Content.Shared.Stunnable; +using Robust.Shared.Physics.Events; + +namespace Content.Shared.Slippery; + +public sealed class SlidingSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnSlideAttempt); + SubscribeLocalEvent(OnStand); + SubscribeLocalEvent(OnStartCollide); + SubscribeLocalEvent(OnEndCollide); + } + + /// + /// Modify the friction by the frictionModifier stored on the component. + /// + private void OnSlideAttempt(EntityUid uid, SlidingComponent component, ref TileFrictionEvent args) + { + args.Modifier = component.FrictionModifier; + } + + /// + /// Remove the component when the entity stands up again. + /// + private void OnStand(EntityUid uid, SlidingComponent component, ref StoodEvent args) + { + RemComp(uid); + } + + /// + /// Sets friction to 0 if colliding with a SuperSlippery Entity. + /// + private void OnStartCollide(EntityUid uid, SlidingComponent component, ref StartCollideEvent args) + { + if (!TryComp(args.OtherEntity, out var slippery) || !slippery.SuperSlippery) + return; + + component.CollidingEntities.Add(args.OtherEntity); + component.FrictionModifier = 0; + Dirty(uid, component); + } + + /// + /// Set friction to normal when ending collision with a SuperSlippery entity. + /// + private void OnEndCollide(EntityUid uid, SlidingComponent component, ref EndCollideEvent args) + { + if (!component.CollidingEntities.Remove(args.OtherEntity)) + return; + + if (component.CollidingEntities.Count == 0) + component.FrictionModifier = SharedStunSystem.KnockDownModifier; + + Dirty(uid, component); + } + +} diff --git a/Content.Shared/Slippery/SlipperyComponent.cs b/Content.Shared/Slippery/SlipperyComponent.cs index b470e2cbbd5..b80a9b57e4d 100644 --- a/Content.Shared/Slippery/SlipperyComponent.cs +++ b/Content.Shared/Slippery/SlipperyComponent.cs @@ -23,7 +23,6 @@ public sealed partial class SlipperyComponent : Component /// /// How many seconds the mob will be paralyzed for. /// - [ViewVariables(VVAccess.ReadWrite)] [DataField, AutoNetworkedField] [Access(Other = AccessPermissions.ReadWrite)] public float ParalyzeTime = 3f; @@ -31,9 +30,16 @@ public sealed partial class SlipperyComponent : Component /// /// The entity's speed will be multiplied by this to slip it forwards. /// - [ViewVariables(VVAccess.ReadWrite)] [DataField, AutoNetworkedField] [Access(Other = AccessPermissions.ReadWrite)] public float LaunchForwardsMultiplier = 1f; + + /// + /// If this is true, any slipping entity loses its friction until + /// it's not colliding with any SuperSlippery entities anymore. + /// + [DataField, AutoNetworkedField] + [Access(Other = AccessPermissions.ReadWrite)] + public bool SuperSlippery; } } diff --git a/Content.Shared/Slippery/SlipperySystem.cs b/Content.Shared/Slippery/SlipperySystem.cs index 60d53eb16f4..59a1c208ed2 100644 --- a/Content.Shared/Slippery/SlipperySystem.cs +++ b/Content.Shared/Slippery/SlipperySystem.cs @@ -5,7 +5,6 @@ using Content.Shared.StepTrigger.Systems; using Content.Shared.Stunnable; using JetBrains.Annotations; -using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; using Robust.Shared.Physics.Components; @@ -60,7 +59,7 @@ private bool CanSlip(EntityUid uid, EntityUid toSlip) private void TrySlip(EntityUid uid, SlipperyComponent component, EntityUid other) { - if (HasComp(other)) + if (HasComp(other) && !component.SuperSlippery) return; var attemptEv = new SlipAttemptEvent(); @@ -71,9 +70,14 @@ private void TrySlip(EntityUid uid, SlipperyComponent component, EntityUid other var ev = new SlipEvent(other); RaiseLocalEvent(uid, ref ev); - if (TryComp(other, out PhysicsComponent? physics)) + if (TryComp(other, out PhysicsComponent? physics) && !HasComp(other)) + { _physics.SetLinearVelocity(other, physics.LinearVelocity * component.LaunchForwardsMultiplier, body: physics); + if (component.SuperSlippery) + EnsureComp(other); + } + var playSound = !_statusEffects.HasStatusEffect(other, "KnockedDown"); _stun.TryParalyze(other, TimeSpan.FromSeconds(component.ParalyzeTime), true); diff --git a/Resources/Prototypes/Reagents/cleaning.yml b/Resources/Prototypes/Reagents/cleaning.yml index 49af16d93dd..24f0c033cf1 100644 --- a/Resources/Prototypes/Reagents/cleaning.yml +++ b/Resources/Prototypes/Reagents/cleaning.yml @@ -110,6 +110,7 @@ paralyzeTime: 3 launchForwardsMultiplier: 2 requiredSlipSpeed: 1 + superSlippery: true - type: reagent id: SpaceGlue @@ -150,4 +151,4 @@ footstepSound: collection: FootstepSticky params: - volume: 6 \ No newline at end of file + volume: 6 From 10dc18fa9a7d651bb5b2dc09aaf6408caa556e06 Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 1 Feb 2024 10:40:15 +0000 Subject: [PATCH 119/266] Automatic changelog update (cherry picked from commit 4177e647126a1093fac46b483af9e6c23e3cb915) --- Resources/Changelog/Changelog.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 736b1a74d22..f114c5e8685 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: Ubaser - changes: - - message: RD now has a custom-made lab coat. - type: Add - id: 5351 - time: '2023-12-13T08:51:00.0000000+00:00' - author: Ubaser changes: - message: Some jetpacks can be now worn in more slots. @@ -3854,3 +3848,11 @@ id: 5850 time: '2024-02-01T10:13:44.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23972 +- author: Dygon + changes: + - message: When slipping on lube you now keep sliding until you reach a tile without + lube. + type: Tweak + id: 5851 + time: '2024-02-01T10:39:10.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24801 From dc459723a64b72d94eb139094dfceedc6c230a11 Mon Sep 17 00:00:00 2001 From: FungiFellow <151778459+fungifellow@users.noreply.github.com> Date: Thu, 1 Feb 2024 11:42:12 +0100 Subject: [PATCH 120/266] RD Locker Binary Comms Key and Binary Key Price decrease (#24778) * Binary Key 4-2 TC * Added Binary Key into RD Locker * Change from ID to Entity * Reverts back to ID * Found the Actual ID (cherry picked from commit 3c8882696a690a302c783de4351d5c89ec9820c1) --- Resources/Prototypes/Catalog/Fills/Lockers/heads.yml | 2 ++ Resources/Prototypes/Catalog/uplink_catalog.yml | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml b/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml index 4e528e4ed83..966be72c49a 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml @@ -246,6 +246,7 @@ - id: BoxPDAScience # Delta-V - id: RDIDCard # Delta-V - id: ClothingShoesBootsWinterMystagogue #Delta V: Add departmental winter boots + - id: EncryptionKeyBinary - type: entity id: LockerResearchDirectorFilled @@ -266,6 +267,7 @@ - id: BoxPDAScience # Delta-V - id: RDIDCard # Delta-V - id: ClothingShoesBootsWinterMystagogue #Delta V: Add departmental winter boots + - id: EncryptionKeyBinary - type: entity id: LockerHeadOfSecurityFilledHardsuit diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index 5f795595d7d..7b77a932635 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -525,8 +525,9 @@ description: uplink-binary-translator-key-desc icon: { sprite: /Textures/Objects/Devices/encryption_keys.rsi, state: rd_label } productEntity: EncryptionKeyBinary - cost: + cost: Telecrystal: 1 + categories: - UplinkUtility From 85e4e82c7d2806c08d19c4314d0a3d6684a94ed6 Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 1 Feb 2024 10:43:18 +0000 Subject: [PATCH 121/266] Automatic changelog update (cherry picked from commit bbab3944825a75be10184b6d083eb4422c6f071f) --- Resources/Changelog/Changelog.yml | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index f114c5e8685..c5903fa4274 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: Ubaser - changes: - - message: Some jetpacks can be now worn in more slots. - type: Tweak - id: 5352 - time: '2023-12-13T08:51:09.0000000+00:00' - author: Ubaser changes: - message: Ninjas and Nukies now get new sprites for their pinpointers. @@ -3856,3 +3850,12 @@ id: 5851 time: '2024-02-01T10:39:10.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24801 +- author: FungiFellow + changes: + - message: Added Binary Key in RD's Locker + type: Add + - message: 50% off Binary Key + type: Tweak + id: 5852 + time: '2024-02-01T10:42:12.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24778 From fa09ecd847667372dc7a758d868703a9da2fa7dc Mon Sep 17 00:00:00 2001 From: Arendian <137322659+Arendian@users.noreply.github.com> Date: Thu, 1 Feb 2024 12:06:05 +0100 Subject: [PATCH 122/266] Paraplegicn't zombies (#24169) * The zombie virus now cures paraplegia. * no wheelchairbound anymore (cherry picked from commit ecea561e44f51d2c2bbf17af46db84d3ee1a5cae) --- Content.Server/Zombies/ZombieSystem.Transform.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Content.Server/Zombies/ZombieSystem.Transform.cs b/Content.Server/Zombies/ZombieSystem.Transform.cs index 6bfc6650b10..1b4f2f1c5b2 100644 --- a/Content.Server/Zombies/ZombieSystem.Transform.cs +++ b/Content.Server/Zombies/ZombieSystem.Transform.cs @@ -32,11 +32,10 @@ using Content.Shared.Popups; using Content.Shared.Roles; using Content.Shared.Pulling.Components; -using Content.Shared.Tools.Components; using Content.Shared.Weapons.Melee; using Content.Shared.Zombies; -using Robust.Shared.Audio; using Content.Shared.Prying.Components; +using Content.Shared.Traits.Assorted; using Robust.Shared.Audio.Systems; namespace Content.Server.Zombies @@ -101,13 +100,14 @@ public void ZombifyEntity(EntityUid target, MobStateComponent? mobState = null) var zombiecomp = AddComp(target); //we need to basically remove all of these because zombies shouldn't - //get diseases, breath, be thirst, be hungry, die in space or have offspring + //get diseases, breath, be thirst, be hungry, die in space, have offspring or be paraplegic. RemComp(target); RemComp(target); RemComp(target); RemComp(target); RemComp(target); RemComp(target); + RemComp(target); if (TryComp(target, out var psionic)) // DeltaV - Prevent psionic zombies { From 3120f9da6868c43d01963bf8baa8a8ea8eb2db6b Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Thu, 1 Feb 2024 12:06:52 +0100 Subject: [PATCH 123/266] Buff the AME until somebody fixes engineering (#24806) All the engineering numbers are complete unusable garbage and it's apparently completely impossible to properly set up power on some maps. This is a band-aid fix (and apology to all engineering players) until somebody fixes this shit properly. (cherry picked from commit 879b4d171efd9ae9907369d6dd856afafb381b06) --- Content.Server/Ame/AmeNodeGroup.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Ame/AmeNodeGroup.cs b/Content.Server/Ame/AmeNodeGroup.cs index d970f43d8be..25d98bf9942 100644 --- a/Content.Server/Ame/AmeNodeGroup.cs +++ b/Content.Server/Ame/AmeNodeGroup.cs @@ -181,7 +181,7 @@ public float CalculatePower(int fuel, int cores) // Fuel is squared so more fuel vastly increases power and efficiency // We divide by the number of cores so a larger AME is less efficient at the same fuel settings // this results in all AMEs having the same efficiency at the same fuel-per-core setting - return 20000f * fuel * fuel / cores; + return 2000000f * fuel * fuel / cores; } public int GetTotalStability() From c77c6d3332692ab99f9353e4bd9e598eede2b02e Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 1 Feb 2024 11:07:57 +0000 Subject: [PATCH 124/266] Automatic changelog update (cherry picked from commit 1f1809d6ed7b6694485d7a4286a8d8ad579db092) --- Resources/Changelog/Changelog.yml | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index c5903fa4274..f0ba44a78b8 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,16 +1,4 @@ Entries: -- author: Ubaser - changes: - - message: Ninjas and Nukies now get new sprites for their pinpointers. - type: Add - id: 5353 - time: '2023-12-13T08:53:05.0000000+00:00' -- author: Errant - changes: - - message: A dying person's Last Words can no longer be sent to radio channels. - type: Fix - id: 5354 - time: '2023-12-13T21:20:38.0000000+00:00' - author: deltanedas changes: - message: Cybersun and centcom pens can now edit stamped paper. @@ -3859,3 +3847,18 @@ id: 5852 time: '2024-02-01T10:42:12.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24778 +- author: Dygon + changes: + - message: Paraplegic entities have their legs healed when zombified. + type: Fix + id: 5853 + time: '2024-02-01T11:06:05.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24169 +- author: PJB3005 + changes: + - message: The AME can now single-handedly power the entire station until one of + our cool coders gets their shit together and fixes engineering. + type: Fix + id: 5854 + time: '2024-02-01T11:06:52.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24806 From b0dcdcb5044da39b2f85df502993256e9c77b229 Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Thu, 1 Feb 2024 12:41:19 +0100 Subject: [PATCH 125/266] Newton cradle (#22914) * comit * comit2 * little more range * review --------- Co-authored-by: metalgearsloth (cherry picked from commit 628e22ba026724b444d8cfc900e0a6ef3cbd9c6f) --- Resources/Audio/Items/attributions.yml | 11 +++++-- Resources/Audio/Items/newton_cradle.ogg | Bin 0 -> 10019 bytes .../Prototypes/Entities/Objects/Fun/toys.yml | 31 +++++++++++++++++- .../Fun/newton_cradle.rsi/icon-off.png | Bin 0 -> 4387 bytes .../Objects/Fun/newton_cradle.rsi/icon.png | Bin 0 -> 602 bytes .../Objects/Fun/newton_cradle.rsi/meta.json | 25 ++++++++++++++ 6 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 Resources/Audio/Items/newton_cradle.ogg create mode 100644 Resources/Textures/Objects/Fun/newton_cradle.rsi/icon-off.png create mode 100644 Resources/Textures/Objects/Fun/newton_cradle.rsi/icon.png create mode 100644 Resources/Textures/Objects/Fun/newton_cradle.rsi/meta.json diff --git a/Resources/Audio/Items/attributions.yml b/Resources/Audio/Items/attributions.yml index 13eff6e7025..51d8d9cf95a 100644 --- a/Resources/Audio/Items/attributions.yml +++ b/Resources/Audio/Items/attributions.yml @@ -67,7 +67,7 @@ license: "CC-BY-3.0" copyright: "User jzdnvdoosj on freesound.org. Converted to ogg by mirrorcult" source: "https://freesound.org/people/jzdnvdoosj/sounds/626262/" - + - files: ["candle_blowing.ogg"] license: "CC-BY-NC-3.0" copyright: "Created by Bee09, converted to OGG, cropped and converted to mono by TheShuEd" @@ -82,13 +82,18 @@ license: "CC-BY-SA-3.0" copyright: "Taken from /tg/station" source: "https://github.com/tgstation/tgstation/commit/c61c452d78425d89920b41ed5f95fd190e733a3c" - + - files: ["scissors.ogg"] license: "CC0-1.0" copyright: "User Hanbaal on freesound.org. Converted to ogg by TheShuEd" source: "https://freesound.org/people/Hanbaal/sounds/178669/" + +- files: ["newton_cradle.ogg"] + license: "CC-BY-4.0" + copyright: "User LoafDV on freesound.org. Converted to ogg end edited by lzk228" + source: "https://freesound.org/people/LoafDV/sounds/131596/" - files: ["shovel_dig.ogg"] license: "CC-BY-SA-3.0" copyright: "Taken from tgstation, modified by themias (github) for ss14" - source: "https://github.com/tgstation/tgstation/tree/85a0925051bb00e7a950ee66cb7f87982cd22439/sound/effects/shovel_dig.ogg" \ No newline at end of file + source: "https://github.com/tgstation/tgstation/tree/85a0925051bb00e7a950ee66cb7f87982cd22439/sound/effects/shovel_dig.ogg" diff --git a/Resources/Audio/Items/newton_cradle.ogg b/Resources/Audio/Items/newton_cradle.ogg new file mode 100644 index 0000000000000000000000000000000000000000..6dfe528feb56f22afa59ad09dd953901f266a6e4 GIT binary patch literal 10019 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Fun/newton_cradle.rsi/icon.png b/Resources/Textures/Objects/Fun/newton_cradle.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..effd80ccccf566578b2b732992201015b7ac0edb GIT binary patch literal 602 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|OI} zr;B4qMcmt2{(VgWJjV)+I=4Sy(6ekwe0ffL$3v4m3pP&a!-_XvPGYX$R99VDY4qV& zyJE|k=U(@+e{Z#yYrCPwX{W%z1VsO*AMgwQ^|q{fW9+olMc%i!?e(4aeASPj16#jN ze*XC&XHLLy9&mnS;y1gpi*d8_URn9u{NN??W zuXhC&GvZrTtT_I7VV8bmY;^o7{@)OK8jf&g(gS+>+hUfG}{r+s@>~OQ#fBv;St&w)_g?{m4@B>+?eXvl0=Lx!&6Tda{15zW`%_(X@YmW}KJd zc#?fl{+#}iEk}26E~$@W+Pq~SM}ttzZu|Y)_LWTDzz>QqG$gJ3fmz0* Date: Thu, 1 Feb 2024 22:43:06 +1100 Subject: [PATCH 126/266] Fix item toggles where no sound exists (#24807) Oop (cherry picked from commit bd86447f996e10a1befda16404f0155209efa0e1) --- Content.Shared/Item/ItemToggle/SharedItemToggleSystem.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Content.Shared/Item/ItemToggle/SharedItemToggleSystem.cs b/Content.Shared/Item/ItemToggle/SharedItemToggleSystem.cs index c502f845ddd..e2e5fc2e3c3 100644 --- a/Content.Shared/Item/ItemToggle/SharedItemToggleSystem.cs +++ b/Content.Shared/Item/ItemToggle/SharedItemToggleSystem.cs @@ -134,10 +134,7 @@ private void Activate(EntityUid uid, ItemToggleComponent itemToggle, bool predic _light.SetEnabled(uid, true, light); } - SoundSpecifier? soundToPlay = itemToggle.SoundActivate; - - if (soundToPlay == null) - return; + var soundToPlay = itemToggle.SoundActivate; if (predicted) _audio.PlayPredicted(soundToPlay, uid, user); From b828d35d76ffce519d677c844fa51a3cbd6dd632 Mon Sep 17 00:00:00 2001 From: Varen Date: Thu, 1 Feb 2024 12:54:24 +0100 Subject: [PATCH 127/266] Fixes Electrocutions to use available power, not consumed power (#24554) -Electrocutions now happen using how much power there is rather than how much is being used. (cherry picked from commit cdfff3c4bd49f77d9711d590eb649e365c3bca91) --- Content.Server/Electrocution/ElectrocutionSystem.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Server/Electrocution/ElectrocutionSystem.cs b/Content.Server/Electrocution/ElectrocutionSystem.cs index 11e56a65c4b..aac500f34f8 100644 --- a/Content.Server/Electrocution/ElectrocutionSystem.cs +++ b/Content.Server/Electrocution/ElectrocutionSystem.cs @@ -258,7 +258,7 @@ public bool TryDoElectrifiedAct(EntityUid uid, EntityUid targetUid, return false; var net = powerNet.NetworkNode; - var supp = net.LastCombinedSupply; + var supp = net.LastCombinedMaxSupply; if (supp <= 0f) return false; @@ -295,7 +295,7 @@ public bool TryDoElectrifiedAct(EntityUid uid, EntityUid targetUid, { if (id != null && _nodeContainer.TryGetNode(nodeContainer, id, out var tryNode) && - tryNode.NodeGroup is IBasePowerNet { NetworkNode: { LastCombinedSupply: > 0 } }) + tryNode.NodeGroup is IBasePowerNet { NetworkNode: { LastCombinedMaxSupply: > 0 } }) { return tryNode; } From ca364e54b620328857ce2949aae366d3d6747ad4 Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 1 Feb 2024 11:55:30 +0000 Subject: [PATCH 128/266] Automatic changelog update (cherry picked from commit 8385e936f30dce4c84a2a34a1823fd2d20a1318e) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index f0ba44a78b8..6341fc16cf3 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: deltanedas - changes: - - message: Cybersun and centcom pens can now edit stamped paper. - type: Tweak - id: 5355 - time: '2023-12-13T21:33:32.0000000+00:00' - author: Ubaser changes: - message: Added a new "uneven" hair style. @@ -3862,3 +3856,10 @@ id: 5854 time: '2024-02-01T11:06:52.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24806 +- author: Varen + changes: + - message: Cutting wires will now properly electrocute if enough power is available. + type: Fix + id: 5855 + time: '2024-02-01T11:54:25.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24554 From 74e5b79926f3e2bbfe3af7ca88905617fbf8bbd7 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Thu, 1 Feb 2024 23:04:52 +1100 Subject: [PATCH 129/266] Fix tests (#24809) * Fix tests PJB don't look no shed * weh (cherry picked from commit c0227bcb3b123fa2228fb114e5c67b985a5fcdaf) --- .../Tests/Preferences/ServerDbSqliteTests.cs | 2 +- Resources/Prototypes/Entities/Objects/Fun/toys.yml | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/Content.IntegrationTests/Tests/Preferences/ServerDbSqliteTests.cs b/Content.IntegrationTests/Tests/Preferences/ServerDbSqliteTests.cs index cb1eae878b7..6520072220b 100644 --- a/Content.IntegrationTests/Tests/Preferences/ServerDbSqliteTests.cs +++ b/Content.IntegrationTests/Tests/Preferences/ServerDbSqliteTests.cs @@ -56,7 +56,7 @@ private static HumanoidCharacterProfile CharlieCharlieson() ), ClothingPreference.Jumpskirt, BackpackPreference.Backpack, - SpawnPriorityPreference.Arrivals, + SpawnPriorityPreference.None, new Dictionary { {SharedGameTicker.FallbackOverflowJob, JobPriority.High} diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml index 66a2ff421f8..be52665f55b 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml @@ -869,7 +869,7 @@ params: variation: 0.65 volume: -10 - + - type: entity parent: BaseItem id: PonderingOrb @@ -1240,6 +1240,4 @@ path: /Audio/Items/newton_cradle.ogg params: volume: -7 - range: 5 - sound: - path: /Audio/Items/newton_cradle.ogg + maxDistance: 5 From 8081242009415347d08231bbb7e650fd595e4313 Mon Sep 17 00:00:00 2001 From: AJCM-git <60196617+AJCM-git@users.noreply.github.com> Date: Thu, 1 Feb 2024 08:17:02 -0400 Subject: [PATCH 130/266] Cleanups PolymorphSystem/Components/Prototypes (#23721) * Cleanups PolymorphSystem * forgot this * Nah * Fix test --------- Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> (cherry picked from commit b8f0ed3975a4b887ca8dd75dcc07e0ac5ee11646) --- .../Commands/AddPolymorphActionCommand.cs | 4 +- .../Chemistry/ReagentEffects/Polymorph.cs | 2 +- .../Components/PolymorphOnCollideComponent.cs | 13 +- .../Components/PolymorphableComponent.cs | 41 +- .../Components/PolymorphedEntityComponent.cs | 49 +- .../Systems/PolymorphSystem.Collide.cs | 28 +- .../Polymorph/Systems/PolymorphSystem.Map.cs | 57 +- .../Polymorph/Systems/PolymorphSystem.cs | 592 ++++++++---------- .../Polymorph/Toolshed/PolymorphCommand.cs | 2 +- .../Polymorph/Toolshed/UnpolymorphCommand.cs | 2 - ...nent.cs => PolyOthersArtifactComponent.cs} | 4 +- ...tSystem.cs => PolyOthersArtifactSystem.cs} | 14 +- Content.Shared/Polymorph/PolymorphActions.cs | 5 + .../Polymorph/PolymorphPrototype.cs | 227 +++---- Resources/Prototypes/Polymorphs/admin.yml | 58 +- Resources/Prototypes/Polymorphs/polymorph.yml | 218 ++++--- .../XenoArch/Effects/normal_effects.yml | 6 +- 17 files changed, 656 insertions(+), 666 deletions(-) rename Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/{PolyArtifactComponent.cs => PolyOthersArtifactComponent.cs} (81%) rename Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/{PolyArtifactSystem.cs => PolyOthersArtifactSystem.cs} (68%) diff --git a/Content.Server/Administration/Commands/AddPolymorphActionCommand.cs b/Content.Server/Administration/Commands/AddPolymorphActionCommand.cs index 6223df7a6cb..b92cbfc0de9 100644 --- a/Content.Server/Administration/Commands/AddPolymorphActionCommand.cs +++ b/Content.Server/Administration/Commands/AddPolymorphActionCommand.cs @@ -32,7 +32,7 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) var polySystem = _entityManager.EntitySysManager.GetEntitySystem(); - _entityManager.EnsureComponent(entityUid.Value); - polySystem.CreatePolymorphAction(args[1], entityUid.Value); + var polymorphable = _entityManager.EnsureComponent(entityUid.Value); + polySystem.CreatePolymorphAction(args[1], (entityUid.Value, polymorphable)); } } diff --git a/Content.Server/Chemistry/ReagentEffects/Polymorph.cs b/Content.Server/Chemistry/ReagentEffects/Polymorph.cs index 569da51e39a..fea372125ee 100644 --- a/Content.Server/Chemistry/ReagentEffects/Polymorph.cs +++ b/Content.Server/Chemistry/ReagentEffects/Polymorph.cs @@ -18,7 +18,7 @@ public sealed partial class Polymorph : ReagentEffect protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys) => Loc.GetString("reagent-effect-guidebook-make-polymorph", ("chance", Probability), ("entityname", - prototype.Index(prototype.Index(PolymorphPrototype).Entity).Name)); + prototype.Index(prototype.Index(PolymorphPrototype).Configuration.Entity).Name)); public override void Effect(ReagentEffectArgs args) { diff --git a/Content.Server/Polymorph/Components/PolymorphOnCollideComponent.cs b/Content.Server/Polymorph/Components/PolymorphOnCollideComponent.cs index 5d513df9338..577dadb5c8d 100644 --- a/Content.Server/Polymorph/Components/PolymorphOnCollideComponent.cs +++ b/Content.Server/Polymorph/Components/PolymorphOnCollideComponent.cs @@ -1,21 +1,24 @@ +using Content.Server.Polymorph.Systems; using Content.Shared.Polymorph; using Content.Shared.Whitelist; using Robust.Shared.Audio; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; +using Robust.Shared.Prototypes; namespace Content.Server.Polymorph.Components; [RegisterComponent] +[Access(typeof(PolymorphSystem))] public sealed partial class PolymorphOnCollideComponent : Component { - [DataField("polymorph", required: true, customTypeSerializer:typeof(PrototypeIdSerializer))] - public string Polymorph = default!; + [DataField(required: true)] + public ProtoId Polymorph; - [DataField("whitelist", required: true)] + [DataField(required: true)] public EntityWhitelist Whitelist = default!; - [DataField("blacklist")] + [DataField] public EntityWhitelist? Blacklist; + [DataField] public SoundSpecifier Sound = new SoundPathSpecifier("/Audio/Magic/forcewall.ogg"); } diff --git a/Content.Server/Polymorph/Components/PolymorphableComponent.cs b/Content.Server/Polymorph/Components/PolymorphableComponent.cs index 2e9c5fee0a5..d28aa5a4fbf 100644 --- a/Content.Server/Polymorph/Components/PolymorphableComponent.cs +++ b/Content.Server/Polymorph/Components/PolymorphableComponent.cs @@ -1,27 +1,28 @@ +using Content.Server.Polymorph.Systems; using Content.Shared.Polymorph; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; +using Robust.Shared.Prototypes; -namespace Content.Server.Polymorph.Components +namespace Content.Server.Polymorph.Components; + +[RegisterComponent] +[Access(typeof(PolymorphSystem))] +public sealed partial class PolymorphableComponent : Component { - [RegisterComponent] - public sealed partial class PolymorphableComponent : Component - { - /// - /// A list of all the polymorphs that the entity has. - /// Used to manage them and remove them if needed. - /// - public Dictionary? PolymorphActions = null; + /// + /// A list of all the polymorphs that the entity has. + /// Used to manage them and remove them if needed. + /// + public Dictionary, EntityUid>? PolymorphActions = null; - /// - /// Timestamp for when the most recent polymorph ended. - /// - [ViewVariables(VVAccess.ReadOnly)] - public TimeSpan? LastPolymorphEnd = null; + /// + /// Timestamp for when the most recent polymorph ended. + /// + [ViewVariables(VVAccess.ReadOnly)] + public TimeSpan? LastPolymorphEnd = null; /// - /// The polymorphs that the entity starts out being able to do. - /// - [DataField("innatePolymorphs", customTypeSerializer : typeof(PrototypeIdListSerializer))] - public List? InnatePolymorphs; - } + /// The polymorphs that the entity starts out being able to do. + /// + [DataField] + public List>? InnatePolymorphs; } diff --git a/Content.Server/Polymorph/Components/PolymorphedEntityComponent.cs b/Content.Server/Polymorph/Components/PolymorphedEntityComponent.cs index c155c538d16..7620203a862 100644 --- a/Content.Server/Polymorph/Components/PolymorphedEntityComponent.cs +++ b/Content.Server/Polymorph/Components/PolymorphedEntityComponent.cs @@ -1,31 +1,32 @@ +using Content.Server.Polymorph.Systems; using Content.Shared.Polymorph; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Server.Polymorph.Components +namespace Content.Server.Polymorph.Components; + +[RegisterComponent] +[Access(typeof(PolymorphSystem))] +public sealed partial class PolymorphedEntityComponent : Component { - [RegisterComponent] - public sealed partial class PolymorphedEntityComponent : Component - { - /// - /// The polymorph prototype, used to track various information - /// about the polymorph - /// - [DataField("prototype", required: true, customTypeSerializer:typeof(PrototypeIdSerializer))] - public string Prototype = string.Empty; + /// + /// The polymorph prototype, used to track various information + /// about the polymorph + /// + [DataField(required: true)] + public PolymorphConfiguration Configuration = new(); - /// - /// The original entity that the player will revert back into - /// - [DataField("parent", required: true)] - public EntityUid Parent; + /// + /// The original entity that the player will revert back into + /// + [DataField(required: true)] + public EntityUid Parent; - /// - /// The amount of time that has passed since the entity was created - /// used for tracking the duration - /// - [DataField("time")] - public float Time; + /// + /// The amount of time that has passed since the entity was created + /// used for tracking the duration + /// + [DataField] + public float Time; - [DataField] public EntityUid? Action; - } + [DataField] + public EntityUid? Action; } diff --git a/Content.Server/Polymorph/Systems/PolymorphSystem.Collide.cs b/Content.Server/Polymorph/Systems/PolymorphSystem.Collide.cs index 46b962b20e8..b4240d409ad 100644 --- a/Content.Server/Polymorph/Systems/PolymorphSystem.Collide.cs +++ b/Content.Server/Polymorph/Systems/PolymorphSystem.Collide.cs @@ -1,16 +1,25 @@ using Content.Server.Polymorph.Components; +using Content.Shared.Polymorph; using Content.Shared.Projectiles; using Robust.Shared.Audio; using Robust.Shared.Physics.Events; +using Robust.Shared.Prototypes; namespace Content.Server.Polymorph.Systems; public partial class PolymorphSystem { - // Need to do this so we don't get a collection enumeration error in physics by polymorphing - // an entity we're colliding with + /// + /// Need to do this so we don't get a collection enumeration error in physics by polymorphing + /// an entity we're colliding with + /// private Queue _queuedPolymorphUpdates = new(); + private void InitializeCollide() + { + SubscribeLocalEvent(OnPolymorphCollide); + } + public void UpdateCollide() { while (_queuedPolymorphUpdates.TryDequeue(out var data)) @@ -20,25 +29,18 @@ public void UpdateCollide() var ent = PolymorphEntity(data.Ent, data.Polymorph); if (ent != null) - { _audio.PlayPvs(data.Sound, ent.Value); - } } } - private void InitializeCollide() - { - SubscribeLocalEvent(OnPolymorphCollide); - } - private void OnPolymorphCollide(EntityUid uid, PolymorphOnCollideComponent component, ref StartCollideEvent args) { if (args.OurFixtureId != SharedProjectileSystem.ProjectileFixture) return; var other = args.OtherEntity; - if (!component.Whitelist.IsValid(other) - || component.Blacklist != null && component.Blacklist.IsValid(other)) + if (!component.Whitelist.IsValid(other, EntityManager) + || component.Blacklist != null && component.Blacklist.IsValid(other, EntityManager)) return; _queuedPolymorphUpdates.Enqueue(new (other, component.Sound, component.Polymorph)); @@ -49,9 +51,9 @@ public struct PolymorphQueuedData { public EntityUid Ent; public SoundSpecifier Sound; - public string Polymorph; + public ProtoId Polymorph; - public PolymorphQueuedData(EntityUid ent, SoundSpecifier sound, string polymorph) + public PolymorphQueuedData(EntityUid ent, SoundSpecifier sound, ProtoId polymorph) { Ent = ent; Sound = sound; diff --git a/Content.Server/Polymorph/Systems/PolymorphSystem.Map.cs b/Content.Server/Polymorph/Systems/PolymorphSystem.Map.cs index a6f658524d1..120e04eeb08 100644 --- a/Content.Server/Polymorph/Systems/PolymorphSystem.Map.cs +++ b/Content.Server/Polymorph/Systems/PolymorphSystem.Map.cs @@ -1,39 +1,38 @@ using Content.Shared.GameTicking; -namespace Content.Server.Polymorph.Systems +namespace Content.Server.Polymorph.Systems; + +public sealed partial class PolymorphSystem { - public sealed partial class PolymorphSystem - { - public EntityUid? PausedMap { get; private set; } + public EntityUid? PausedMap { get; private set; } - /// - /// Used to subscribe to the round restart event - /// - private void InitializeMap() - { - SubscribeLocalEvent(OnRoundRestart); - } + /// + /// Used to subscribe to the round restart event + /// + private void InitializeMap() + { + SubscribeLocalEvent(OnRoundRestart); + } - private void OnRoundRestart(RoundRestartCleanupEvent _) - { - if (PausedMap == null || !Exists(PausedMap)) - return; + private void OnRoundRestart(RoundRestartCleanupEvent _) + { + if (PausedMap == null || !Exists(PausedMap)) + return; - EntityManager.DeleteEntity(PausedMap.Value); - } + Del(PausedMap.Value); + } - /// - /// Used internally to ensure a paused map that is - /// stores polymorphed entities. - /// - private void EnsurePausesdMap() - { - if (PausedMap != null && Exists(PausedMap)) - return; + /// + /// Used internally to ensure a paused map that is + /// stores polymorphed entities. + /// + private void EnsurePausedMap() + { + if (PausedMap != null && Exists(PausedMap)) + return; - var newmap = _mapManager.CreateMap(); - _mapManager.SetMapPaused(newmap, true); - PausedMap = _mapManager.GetMapEntityId(newmap); - } + var newmap = _mapManager.CreateMap(); + _mapManager.SetMapPaused(newmap, true); + PausedMap = _mapManager.GetMapEntityId(newmap); } } diff --git a/Content.Server/Polymorph/Systems/PolymorphSystem.cs b/Content.Server/Polymorph/Systems/PolymorphSystem.cs index 4d3bbcdf780..66dc9dab99d 100644 --- a/Content.Server/Polymorph/Systems/PolymorphSystem.cs +++ b/Content.Server/Polymorph/Systems/PolymorphSystem.cs @@ -15,7 +15,6 @@ using Content.Shared.Mobs.Systems; using Content.Shared.Polymorph; using Content.Shared.Popups; -using JetBrains.Annotations; using Robust.Server.Audio; using Robust.Server.Containers; using Robust.Server.GameObjects; @@ -24,410 +23,359 @@ using Robust.Shared.Timing; using Robust.Shared.Utility; -namespace Content.Server.Polymorph.Systems +namespace Content.Server.Polymorph.Systems; + +public sealed partial class PolymorphSystem : EntitySystem { - public sealed partial class PolymorphSystem : EntitySystem + [Dependency] private readonly IComponentFactory _compFact = default!; + [Dependency] private readonly IMapManager _mapManager = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly ActionsSystem _actions = default!; + [Dependency] private readonly ActionContainerSystem _actionContainer = default!; + [Dependency] private readonly AudioSystem _audio = default!; + [Dependency] private readonly SharedBuckleSystem _buckle = default!; + [Dependency] private readonly ContainerSystem _container = default!; + [Dependency] private readonly DamageableSystem _damageable = default!; + [Dependency] private readonly HumanoidAppearanceSystem _humanoid = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; + [Dependency] private readonly MobThresholdSystem _mobThreshold = default!; + [Dependency] private readonly ServerInventorySystem _inventory = default!; + [Dependency] private readonly SharedHandsSystem _hands = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly TransformSystem _transform = default!; + [Dependency] private readonly SharedMindSystem _mindSystem = default!; + [Dependency] private readonly MetaDataSystem _metaData = default!; + + private const string RevertPolymorphId = "ActionRevertPolymorph"; + + public override void Initialize() { - [Dependency] private readonly IComponentFactory _compFact = default!; - [Dependency] private readonly IMapManager _mapManager = default!; - [Dependency] private readonly IPrototypeManager _proto = default!; - [Dependency] private readonly ActionsSystem _actions = default!; - [Dependency] private readonly ActionContainerSystem _actionContainer = default!; - [Dependency] private readonly AudioSystem _audio = default!; - [Dependency] private readonly SharedBuckleSystem _buckle = default!; - [Dependency] private readonly ContainerSystem _container = default!; - [Dependency] private readonly DamageableSystem _damageable = default!; - [Dependency] private readonly HumanoidAppearanceSystem _humanoid = default!; - [Dependency] private readonly MobStateSystem _mobState = default!; - [Dependency] private readonly MobThresholdSystem _mobThreshold = default!; - [Dependency] private readonly ServerInventorySystem _inventory = default!; - [Dependency] private readonly SharedHandsSystem _hands = default!; - [Dependency] private readonly SharedPopupSystem _popup = default!; - [Dependency] private readonly TransformSystem _transform = default!; - [Dependency] private readonly SharedMindSystem _mindSystem = default!; - [Dependency] private readonly MetaDataSystem _metaData = default!; - [Dependency] private readonly IGameTiming _gameTiming = default!; - - private ISawmill _sawmill = default!; - - private const string RevertPolymorphId = "ActionRevertPolymorph"; - - public override void Initialize() - { - base.Initialize(); + SubscribeLocalEvent(OnComponentStartup); + SubscribeLocalEvent(OnMapInit); - SubscribeLocalEvent(OnStartup); - SubscribeLocalEvent(OnPolymorphActionEvent); - SubscribeLocalEvent(OnMapInit); - SubscribeLocalEvent(OnBeforeFullyEaten); - SubscribeLocalEvent(OnBeforeFullySliced); - SubscribeLocalEvent(OnRevertPolymorphActionEvent); - SubscribeLocalEvent(OnDestruction); + SubscribeLocalEvent(OnPolymorphActionEvent); + SubscribeLocalEvent(OnRevertPolymorphActionEvent); - InitializeCollide(); - InitializeMap(); - - _sawmill = Logger.GetSawmill("polymorph"); - } + SubscribeLocalEvent(OnBeforeFullyEaten); + SubscribeLocalEvent(OnBeforeFullySliced); + SubscribeLocalEvent(OnDestruction); - private void OnStartup(EntityUid uid, PolymorphableComponent component, ComponentStartup args) - { - if (component.InnatePolymorphs != null) - { - foreach (var morph in component.InnatePolymorphs) - { - CreatePolymorphAction(morph, uid); - } - } - } + InitializeCollide(); + InitializeMap(); + } - private void OnPolymorphActionEvent(EntityUid uid, PolymorphableComponent component, PolymorphActionEvent args) - { - PolymorphEntity(uid, args.Prototype); - } + public override void Update(float frameTime) + { + base.Update(frameTime); - private void OnRevertPolymorphActionEvent(EntityUid uid, PolymorphedEntityComponent component, RevertPolymorphActionEvent args) + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var comp)) { - Revert(uid, component); - } + comp.Time += frameTime; - private void OnMapInit(EntityUid uid, PolymorphedEntityComponent component, MapInitEvent args) - { - if (!_proto.TryIndex(component.Prototype, out PolymorphPrototype? proto)) + if (comp.Configuration.Duration != null && comp.Time >= comp.Configuration.Duration) { - // warning instead of error because of the all-comps one entity test. - _sawmill.Warning($"{nameof(PolymorphSystem)} encountered an improperly set up polymorph component while initializing. Entity {ToPrettyString(uid)}. Prototype: {component.Prototype}"); - RemCompDeferred(uid, component); - return; + Revert((uid, comp)); + continue; } - if (proto.Forced) - return; + if (!TryComp(uid, out var mob)) + continue; - if (_actions.AddAction(uid, ref component.Action, out var action, RevertPolymorphId)) + if (comp.Configuration.RevertOnDeath && _mobState.IsDead(uid, mob) || + comp.Configuration.RevertOnCrit && _mobState.IsIncapacitated(uid, mob)) { - action.EntityIcon = component.Parent; - action.UseDelay = TimeSpan.FromSeconds(proto.Delay); + Revert((uid, comp)); } } - private void OnBeforeFullyEaten(EntityUid uid, PolymorphedEntityComponent comp, BeforeFullyEatenEvent args) - { - if (!_proto.TryIndex(comp.Prototype, out var proto)) - { - _sawmill.Error($"Invalid polymorph prototype {comp.Prototype}"); - return; - } + UpdateCollide(); + } - if (proto.RevertOnEat) + private void OnComponentStartup(Entity ent, ref ComponentStartup args) + { + if (ent.Comp.InnatePolymorphs != null) + { + foreach (var morph in ent.Comp.InnatePolymorphs) { - args.Cancel(); - Revert(uid, comp); + CreatePolymorphAction(morph, ent); } } + } - /// - /// It is possible to be polymorphed into an entity that can't "die", but is instead - /// destroyed. This handler ensures that destruction is treated like death. - /// - private void OnDestruction(EntityUid uid, PolymorphedEntityComponent comp, DestructionEventArgs args) - { - if (!_proto.TryIndex(comp.Prototype, out var proto)) - { - _sawmill.Error($"Invalid polymorph prototype {comp.Prototype}"); - return; - } + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + var (uid, component) = ent; + if (component.Configuration.Forced) + return; - if (proto.RevertOnDeath) - { - Revert(uid, comp); - } + if (_actions.AddAction(uid, ref component.Action, out var action, RevertPolymorphId)) + { + action.EntityIcon = component.Parent; + action.UseDelay = TimeSpan.FromSeconds(component.Configuration.Delay); } + } - private void OnBeforeFullySliced(EntityUid uid, PolymorphedEntityComponent comp, BeforeFullySlicedEvent args) - { - if (!_proto.TryIndex(comp.Prototype, out var proto)) - { - _sawmill.Error("Invalid polymorph prototype {comp.Prototype}"); - return; - } + private void OnPolymorphActionEvent(Entity ent, ref PolymorphActionEvent args) + { + PolymorphEntity(ent, args.Prototype.Configuration); + } - if (proto.RevertOnEat) - { - args.Cancel(); - Revert(uid, comp); - } - } + private void OnRevertPolymorphActionEvent(Entity ent, + ref RevertPolymorphActionEvent args) + { + Revert((ent, ent)); + } - /// - /// Polymorphs the target entity into the specific polymorph prototype - /// - /// The entity that will be transformed - /// The id of the polymorph prototype - public EntityUid? PolymorphEntity(EntityUid target, string id) + private void OnBeforeFullyEaten(Entity ent, ref BeforeFullyEatenEvent args) + { + var (_, comp) = ent; + if (comp.Configuration.RevertOnEat) { - if (!_proto.TryIndex(id, out var proto)) - { - _sawmill.Error("Invalid polymorph prototype {id}"); - return null; - } + args.Cancel(); + Revert((ent, ent)); + } + } - return PolymorphEntity(target, proto); + private void OnBeforeFullySliced(Entity ent, ref BeforeFullySlicedEvent args) + { + var (_, comp) = ent; + if (comp.Configuration.RevertOnEat) + { + args.Cancel(); + Revert((ent, ent)); } + } - /// - /// Polymorphs the target entity into the specific polymorph prototype - /// - /// The entity that will be transformed - /// The polymorph prototype - public EntityUid? PolymorphEntity(EntityUid uid, PolymorphPrototype proto) + /// + /// It is possible to be polymorphed into an entity that can't "die", but is instead + /// destroyed. This handler ensures that destruction is treated like death. + /// + private void OnDestruction(Entity ent, ref DestructionEventArgs args) + { + if (ent.Comp.Configuration.RevertOnDeath) { - // if it's already morphed, don't allow it again with this condition active. - if (!proto.AllowRepeatedMorphs && HasComp(uid)) - return null; + Revert((ent, ent)); + } + } - // If this polymorph has a cooldown, check if that amount of time has passed since the - // last polymorph ended. - if (TryComp(uid, out var polymorphableComponent) && - polymorphableComponent.LastPolymorphEnd != null && - _gameTiming.CurTime < polymorphableComponent.LastPolymorphEnd + proto.Cooldown) - return null; + /// + /// Polymorphs the target entity into the specific polymorph prototype + /// + /// The entity that will be transformed + /// The id of the polymorph prototype + public EntityUid? PolymorphEntity(EntityUid uid, ProtoId protoId) + { + var config = _proto.Index(protoId).Configuration; + return PolymorphEntity(uid, config); + } - // mostly just for vehicles - _buckle.TryUnbuckle(uid, uid, true); + /// + /// Polymorphs the target entity into another + /// + /// The entity that will be transformed + /// Polymorph data + /// + public EntityUid? PolymorphEntity(EntityUid uid, PolymorphConfiguration configuration) + { + // if it's already morphed, don't allow it again with this condition active. + if (!configuration.AllowRepeatedMorphs && HasComp(uid)) + return null; - var targetTransformComp = Transform(uid); + // If this polymorph has a cooldown, check if that amount of time has passed since the + // last polymorph ended. + if (TryComp(uid, out var polymorphableComponent) && + polymorphableComponent.LastPolymorphEnd != null && + _gameTiming.CurTime < polymorphableComponent.LastPolymorphEnd + configuration.Cooldown) + return null; - var child = Spawn(proto.Entity, targetTransformComp.Coordinates); - MakeSentientCommand.MakeSentient(child, EntityManager); + // mostly just for vehicles + _buckle.TryUnbuckle(uid, uid, true); - var comp = _compFact.GetComponent(); - comp.Parent = uid; - comp.Prototype = proto.ID; - AddComp(child, comp); + var targetTransformComp = Transform(uid); - var childXform = Transform(child); - childXform.LocalRotation = targetTransformComp.LocalRotation; + var child = Spawn(configuration.Entity, targetTransformComp.Coordinates); - if (_container.TryGetContainingContainer(uid, out var cont)) - _container.Insert(child, cont); + MakeSentientCommand.MakeSentient(child, EntityManager); - //Transfers all damage from the original to the new one - if (proto.TransferDamage && - TryComp(child, out var damageParent) && - _mobThreshold.GetScaledDamage(uid, child, out var damage) && - damage != null) - { - _damageable.SetDamage(child, damageParent, damage); - } + var polymorphedComp = _compFact.GetComponent(); + polymorphedComp.Parent = uid; + polymorphedComp.Configuration = configuration; + AddComp(child, polymorphedComp); + + var childXform = Transform(child); + _transform.SetLocalRotation(child, targetTransformComp.LocalRotation, childXform); + + if (_container.TryGetContainingContainer(uid, out var cont)) + _container.Insert(child, cont); + + //Transfers all damage from the original to the new one + if (configuration.TransferDamage && + TryComp(child, out var damageParent) && + _mobThreshold.GetScaledDamage(uid, child, out var damage) && + damage != null) + { + _damageable.SetDamage(child, damageParent, damage); + } - if (proto.Inventory == PolymorphInventoryChange.Transfer) + if (configuration.Inventory == PolymorphInventoryChange.Transfer) + { + _inventory.TransferEntityInventories(uid, child); + foreach (var hand in _hands.EnumerateHeld(uid)) { - _inventory.TransferEntityInventories(uid, child); - foreach (var hand in _hands.EnumerateHeld(uid)) - { - _hands.TryDrop(uid, hand, checkActionBlocker: false); - _hands.TryPickupAnyHand(child, hand); - } + _hands.TryDrop(uid, hand, checkActionBlocker: false); + _hands.TryPickupAnyHand(child, hand); } - else if (proto.Inventory == PolymorphInventoryChange.Drop) + } + else if (configuration.Inventory == PolymorphInventoryChange.Drop) + { + if (_inventory.TryGetContainerSlotEnumerator(uid, out var enumerator)) { - if (_inventory.TryGetContainerSlotEnumerator(uid, out var enumerator)) - { - while (enumerator.MoveNext(out var slot)) - { - _inventory.TryUnequip(uid, slot.ID, true, true); - } - } - - foreach (var held in _hands.EnumerateHeld(uid)) + while (enumerator.MoveNext(out var slot)) { - _hands.TryDrop(uid, held); + _inventory.TryUnequip(uid, slot.ID, true, true); } } - if (proto.TransferName && TryComp(uid, out var targetMeta)) - _metaData.SetEntityName(child, targetMeta.EntityName); - - if (proto.TransferHumanoidAppearance) + foreach (var held in _hands.EnumerateHeld(uid)) { - _humanoid.CloneAppearance(uid, child); + _hands.TryDrop(uid, held); } + } - if (_mindSystem.TryGetMind(uid, out var mindId, out var mind)) - _mindSystem.TransferTo(mindId, child, mind: mind); - - //Ensures a map to banish the entity to - EnsurePausesdMap(); - if (PausedMap != null) - _transform.SetParent(uid, targetTransformComp, PausedMap.Value); + if (configuration.TransferName && TryComp(uid, out var targetMeta)) + _metaData.SetEntityName(child, targetMeta.EntityName); - return child; + if (configuration.TransferHumanoidAppearance) + { + _humanoid.CloneAppearance(uid, child); } - /// - /// Reverts a polymorphed entity back into its original form - /// - /// The entityuid of the entity being reverted - /// - public EntityUid? Revert(EntityUid uid, PolymorphedEntityComponent? component = null) - { - if (Deleted(uid)) - return null; + if (_mindSystem.TryGetMind(uid, out var mindId, out var mind)) + _mindSystem.TransferTo(mindId, child, mind: mind); - if (!Resolve(uid, ref component)) - return null; + //Ensures a map to banish the entity to + EnsurePausedMap(); + if (PausedMap != null) + _transform.SetParent(uid, targetTransformComp, PausedMap.Value); - var parent = component.Parent; - if (Deleted(parent)) - return null; + return child; + } - if (!_proto.TryIndex(component.Prototype, out PolymorphPrototype? proto)) - { - _sawmill.Error($"{nameof(PolymorphSystem)} encountered an improperly initialized polymorph component while reverting. Entity {ToPrettyString(uid)}. Prototype: {component.Prototype}"); - return null; - } + /// + /// Reverts a polymorphed entity back into its original form + /// + /// The entityuid of the entity being reverted + /// + public EntityUid? Revert(Entity ent) + { + var (uid, component) = ent; + if (!Resolve(ent, ref component)) + return null; - var uidXform = Transform(uid); - var parentXform = Transform(parent); + if (Deleted(uid)) + return null; - _transform.SetParent(parent, parentXform, uidXform.ParentUid); - parentXform.Coordinates = uidXform.Coordinates; - parentXform.LocalRotation = uidXform.LocalRotation; + var parent = component.Parent; + if (Deleted(parent)) + return null; - if (proto.TransferDamage && - TryComp(parent, out var damageParent) && - _mobThreshold.GetScaledDamage(uid, parent, out var damage) && - damage != null) - { - _damageable.SetDamage(parent, damageParent, damage); - } + var uidXform = Transform(uid); + var parentXform = Transform(parent); + + _transform.SetParent(parent, parentXform, uidXform.ParentUid); + _transform.SetCoordinates(parent, parentXform, uidXform.Coordinates, uidXform.LocalRotation); - if (proto.Inventory == PolymorphInventoryChange.Transfer) + if (component.Configuration.TransferDamage && + TryComp(parent, out var damageParent) && + _mobThreshold.GetScaledDamage(uid, parent, out var damage) && + damage != null) + { + _damageable.SetDamage(parent, damageParent, damage); + } + + if (component.Configuration.Inventory == PolymorphInventoryChange.Transfer) + { + _inventory.TransferEntityInventories(uid, parent); + foreach (var held in _hands.EnumerateHeld(uid)) { - _inventory.TransferEntityInventories(uid, parent); - foreach (var held in _hands.EnumerateHeld(uid)) - { - _hands.TryDrop(uid, held); - _hands.TryPickupAnyHand(parent, held, checkActionBlocker: false); - } + _hands.TryDrop(uid, held); + _hands.TryPickupAnyHand(parent, held, checkActionBlocker: false); } - else if (proto.Inventory == PolymorphInventoryChange.Drop) + } + else if (component.Configuration.Inventory == PolymorphInventoryChange.Drop) + { + if (_inventory.TryGetContainerSlotEnumerator(uid, out var enumerator)) { - if (_inventory.TryGetContainerSlotEnumerator(uid, out var enumerator)) - { - while (enumerator.MoveNext(out var slot)) - { - _inventory.TryUnequip(uid, slot.ID); - } - } - - foreach (var held in _hands.EnumerateHeld(uid)) + while (enumerator.MoveNext(out var slot)) { - _hands.TryDrop(uid, held); + _inventory.TryUnequip(uid, slot.ID); } } - if (_mindSystem.TryGetMind(uid, out var mindId, out var mind)) - _mindSystem.TransferTo(mindId, parent, mind: mind); - - if (TryComp(parent, out var polymorphableComponent)) - polymorphableComponent.LastPolymorphEnd = _gameTiming.CurTime; - - // if an item polymorph was picked up, put it back down after reverting - Transform(parent).AttachToGridOrMap(); - - _popup.PopupEntity(Loc.GetString("polymorph-revert-popup-generic", - ("parent", Identity.Entity(uid, EntityManager)), - ("child", Identity.Entity(parent, EntityManager))), - parent); - QueueDel(uid); - - return parent; - } - - /// - /// Creates a sidebar action for an entity to be able to polymorph at will - /// - /// The string of the id of the polymorph action - /// The entity that will be gaining the action - public void CreatePolymorphAction(string id, EntityUid target) - { - if (!_proto.TryIndex(id, out var polyproto)) + foreach (var held in _hands.EnumerateHeld(uid)) { - _sawmill.Error("Invalid polymorph prototype"); - return; + _hands.TryDrop(uid, held); } + } - if (!TryComp(target, out var polycomp)) - return; - - polycomp.PolymorphActions ??= new Dictionary(); - if (polycomp.PolymorphActions.ContainsKey(id)) - return; + if (_mindSystem.TryGetMind(uid, out var mindId, out var mind)) + _mindSystem.TransferTo(mindId, parent, mind: mind); - var entproto = _proto.Index(polyproto.Entity); + if (TryComp(parent, out var polymorphableComponent)) + polymorphableComponent.LastPolymorphEnd = _gameTiming.CurTime; - EntityUid? actionId = default!; - if (!_actions.AddAction(target, ref actionId, RevertPolymorphId, target)) - return; + // if an item polymorph was picked up, put it back down after reverting + _transform.AttachToGridOrMap(parent, parentXform); - polycomp.PolymorphActions.Add(id, actionId.Value); - _metaData.SetEntityName(actionId.Value, Loc.GetString("polymorph-self-action-name", ("target", entproto.Name))); - _metaData.SetEntityDescription(actionId.Value, Loc.GetString("polymorph-self-action-description", ("target", entproto.Name))); + _popup.PopupEntity(Loc.GetString("polymorph-revert-popup-generic", + ("parent", Identity.Entity(uid, EntityManager)), + ("child", Identity.Entity(parent, EntityManager))), + parent); + QueueDel(uid); - if (!_actions.TryGetActionData(actionId, out var baseAction)) - return; + return parent; + } - baseAction.Icon = new SpriteSpecifier.EntityPrototype(polyproto.Entity); - if (baseAction is InstantActionComponent action) - action.Event = new PolymorphActionEvent { Prototype = polyproto }; - } + /// + /// Creates a sidebar action for an entity to be able to polymorph at will + /// + /// The string of the id of the polymorph action + /// The entity that will be gaining the action + public void CreatePolymorphAction(ProtoId id, Entity target) + { + target.Comp.PolymorphActions ??= new(); + if (target.Comp.PolymorphActions.ContainsKey(id)) + return; - [PublicAPI] - public void RemovePolymorphAction(string id, EntityUid target, PolymorphableComponent? component = null) - { - if (!Resolve(target, ref component, false)) - return; - if (component.PolymorphActions == null) - return; - if (component.PolymorphActions.TryGetValue(id, out var val)) - _actions.RemoveAction(target, val); - } + var polyProto = _proto.Index(id); + var entProto = _proto.Index(polyProto.Configuration.Entity); - public override void Update(float frameTime) - { - base.Update(frameTime); + EntityUid? actionId = default!; + if (!_actions.AddAction(target, ref actionId, RevertPolymorphId, target)) + return; - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var comp)) - { - comp.Time += frameTime; + target.Comp.PolymorphActions.Add(id, actionId.Value); - if (!_proto.TryIndex(comp.Prototype, out PolymorphPrototype? proto)) - { - _sawmill.Error($"{nameof(PolymorphSystem)} encountered an improperly initialized polymorph component while updating. Entity {ToPrettyString(uid)}. Prototype: {comp.Prototype}"); - RemCompDeferred(uid, comp); - continue; - } + var metaDataCache = MetaData(actionId.Value); + _metaData.SetEntityName(actionId.Value, Loc.GetString("polymorph-self-action-name", ("target", entProto.Name)), metaDataCache); + _metaData.SetEntityDescription(actionId.Value, Loc.GetString("polymorph-self-action-description", ("target", entProto.Name)), metaDataCache); - if (proto.Duration != null && comp.Time >= proto.Duration) - { - Revert(uid, comp); - continue; - } + if (!_actions.TryGetActionData(actionId, out var baseAction)) + return; - if (!TryComp(uid, out var mob)) - continue; + baseAction.Icon = new SpriteSpecifier.EntityPrototype(polyProto.Configuration.Entity); + if (baseAction is InstantActionComponent action) + action.Event = new PolymorphActionEvent(prototype: polyProto); + } - if (proto.RevertOnDeath && _mobState.IsDead(uid, mob) || - proto.RevertOnCrit && _mobState.IsIncapacitated(uid, mob)) - { - Revert(uid, comp); - } - } + public void RemovePolymorphAction(ProtoId id, Entity target) + { + if (target.Comp.PolymorphActions == null) + return; - UpdateCollide(); - } + if (target.Comp.PolymorphActions.TryGetValue(id, out var val)) + _actions.RemoveAction(target, val); } } diff --git a/Content.Server/Polymorph/Toolshed/PolymorphCommand.cs b/Content.Server/Polymorph/Toolshed/PolymorphCommand.cs index e1eca01aa3d..f741c24571e 100644 --- a/Content.Server/Polymorph/Toolshed/PolymorphCommand.cs +++ b/Content.Server/Polymorph/Toolshed/PolymorphCommand.cs @@ -24,7 +24,7 @@ [CommandArgument] Prototype prototype { _system ??= GetSys(); - return _system.PolymorphEntity(input, prototype.Value); + return _system.PolymorphEntity(input, prototype.Value.Configuration); } [CommandImplementation] diff --git a/Content.Server/Polymorph/Toolshed/UnpolymorphCommand.cs b/Content.Server/Polymorph/Toolshed/UnpolymorphCommand.cs index 1f3117fe679..54ebf1b5771 100644 --- a/Content.Server/Polymorph/Toolshed/UnpolymorphCommand.cs +++ b/Content.Server/Polymorph/Toolshed/UnpolymorphCommand.cs @@ -2,9 +2,7 @@ using Content.Server.Administration; using Content.Server.Polymorph.Systems; using Content.Shared.Administration; -using Content.Shared.Polymorph; using Robust.Shared.Toolshed; -using Robust.Shared.Toolshed.TypeParsers; namespace Content.Server.Polymorph.Toolshed; diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/PolyArtifactComponent.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/PolyOthersArtifactComponent.cs similarity index 81% rename from Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/PolyArtifactComponent.cs rename to Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/PolyOthersArtifactComponent.cs index 8edeb77a67b..2611d78b088 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/PolyArtifactComponent.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Components/PolyOthersArtifactComponent.cs @@ -1,3 +1,4 @@ +using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; using Robust.Shared.Audio; using Content.Shared.Polymorph; using Robust.Shared.Prototypes; @@ -8,7 +9,8 @@ namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; /// Artifact polymorphs surrounding entities when triggered. /// [RegisterComponent] -public sealed partial class PolyArtifactComponent : Component +[Access(typeof(PolyOthersArtifactSystem))] +public sealed partial class PolyOthersArtifactComponent : Component { /// /// The polymorph effect to trigger. diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/PolyArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/PolyOthersArtifactSystem.cs similarity index 68% rename from Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/PolyArtifactSystem.cs rename to Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/PolyOthersArtifactSystem.cs index 662abfee628..3831bea06cf 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/PolyArtifactSystem.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/PolyOthersArtifactSystem.cs @@ -7,7 +7,7 @@ namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; -public sealed class PolyArtifactSystem : EntitySystem +public sealed class PolyOthersArtifactSystem : EntitySystem { [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly MobStateSystem _mob = default!; @@ -19,25 +19,25 @@ public sealed class PolyArtifactSystem : EntitySystem /// public override void Initialize() { - SubscribeLocalEvent(OnActivate); + SubscribeLocalEvent(OnActivate); } /// /// Provided target is alive and is not a zombie, polymorphs the target. /// - private void OnActivate(EntityUid uid, PolyArtifactComponent component, ArtifactActivatedEvent args) + private void OnActivate(Entity ent, ref ArtifactActivatedEvent args) { - var xform = Transform(uid); + var xform = Transform(ent); var humanoids = new HashSet>(); - _lookup.GetEntitiesInRange(xform.Coordinates, component.Range, humanoids); + _lookup.GetEntitiesInRange(xform.Coordinates, ent.Comp.Range, humanoids); foreach (var comp in humanoids) { var target = comp.Owner; if (_mob.IsAlive(target)) { - _poly.PolymorphEntity(target, component.PolymorphPrototypeName); - _audio.PlayPvs(component.PolySound, uid); + _poly.PolymorphEntity(target, ent.Comp.PolymorphPrototypeName); + _audio.PlayPvs(ent.Comp.PolySound, ent); } } } diff --git a/Content.Shared/Polymorph/PolymorphActions.cs b/Content.Shared/Polymorph/PolymorphActions.cs index bae2c3e4dda..0f230868f03 100644 --- a/Content.Shared/Polymorph/PolymorphActions.cs +++ b/Content.Shared/Polymorph/PolymorphActions.cs @@ -9,6 +9,11 @@ public sealed partial class PolymorphActionEvent : InstantActionEvent /// the specific polymorph. /// public PolymorphPrototype Prototype = default!; + + public PolymorphActionEvent(PolymorphPrototype prototype) : this() + { + Prototype = prototype; + } } public sealed partial class RevertPolymorphActionEvent : InstantActionEvent diff --git a/Content.Shared/Polymorph/PolymorphPrototype.cs b/Content.Shared/Polymorph/PolymorphPrototype.cs index f093489b040..6d010711d2e 100644 --- a/Content.Shared/Polymorph/PolymorphPrototype.cs +++ b/Content.Shared/Polymorph/PolymorphPrototype.cs @@ -1,116 +1,125 @@ using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Array; -namespace Content.Shared.Polymorph +namespace Content.Shared.Polymorph; + +/// +/// Polymorphs generally describe any type of transformation that can be applied to an entity. +/// +[Prototype] +[DataDefinition] +public sealed partial class PolymorphPrototype : IPrototype, IInheritingPrototype +{ + [ViewVariables] + [IdDataField] + public string ID { get; private set; } = default!; + + [ParentDataField(typeof(AbstractPrototypeIdArraySerializer))] + public string[]? Parents { get; private set; } + + [NeverPushInheritance] + [AbstractDataField] + public bool Abstract { get; private set; } + + [DataField(required: true, serverOnly: true)] + public PolymorphConfiguration Configuration = new(); + +} + +/// +/// Defines information about the polymorph +/// +[DataDefinition] +public sealed partial record PolymorphConfiguration { /// - /// Polymorphs generally describe any type of transformation that can be applied to an entity. + /// What entity the polymorph will turn the target into + /// must be in here because it makes no sense if it isn't + /// + [DataField(required: true, serverOnly: true)] + public EntProtoId Entity; + + /// + /// The delay between the polymorph's uses in seconds + /// Slightly weird as of right now. + /// + [DataField(serverOnly: true)] + public int Delay = 60; + + /// + /// The duration of the transformation in seconds + /// can be null if there is not one + /// + [DataField(serverOnly: true)] + public int? Duration; + + /// + /// whether or not the target can transform as will + /// set to true for things like polymorph spells and curses + /// + [DataField(serverOnly: true)] + public bool Forced; + + /// + /// Whether or not the entity transfers its damage between forms. + /// + [DataField(serverOnly: true)] + public bool TransferDamage = true; + + /// + /// Whether or not the entity transfers its name between forms. /// - [Prototype("polymorph")] - [DataDefinition] - public sealed partial class PolymorphPrototype : IPrototype, IInheritingPrototype - { - [ViewVariables] - [IdDataField] - public string ID { get; private set; } = default!; - - [DataField("name")] - public string Name { get; private set; } = string.Empty; - - [ParentDataField(typeof(AbstractPrototypeIdArraySerializer))] - public string[]? Parents { get; private set; } - - [NeverPushInheritance] - [AbstractDataFieldAttribute] - public bool Abstract { get; private set; } - - /// - /// What entity the polymorph will turn the target into - /// must be in here because it makes no sense if it isn't - /// - [DataField("entity", required: true, serverOnly: true, customTypeSerializer: typeof(PrototypeIdSerializer))] - public string Entity = string.Empty; - - /// - /// The delay between the polymorph's uses in seconds - /// Slightly weird as of right now. - /// - [DataField("delay", serverOnly: true)] - public int Delay = 60; - - /// - /// The duration of the transformation in seconds - /// can be null if there is not one - /// - [DataField("duration", serverOnly: true)] - public int? Duration = null; - - /// - /// whether or not the target can transform as will - /// set to true for things like polymorph spells and curses - /// - [DataField("forced", serverOnly: true)] - public bool Forced = false; - - /// - /// Whether or not the entity transfers its damage between forms. - /// - [DataField("transferDamage", serverOnly: true)] - public bool TransferDamage = true; - - /// - /// Whether or not the entity transfers its name between forms. - /// - [DataField("transferName", serverOnly: true)] - public bool TransferName = false; - - /// - /// Whether or not the entity transfers its hair, skin color, hair color, etc. - /// - [DataField("transferHumanoidAppearance", serverOnly: true)] - public bool TransferHumanoidAppearance = false; - - /// - /// Whether or not the entity transfers its inventory and equipment between forms. - /// - [DataField("inventory", serverOnly: true)] - public PolymorphInventoryChange Inventory = PolymorphInventoryChange.None; - - /// - /// Whether or not the polymorph reverts when the entity goes into crit. - /// - [DataField("revertOnCrit", serverOnly: true)] - public bool RevertOnCrit = true; - - /// - /// Whether or not the polymorph reverts when the entity dies. - /// - [DataField("revertOnDeath", serverOnly: true)] - public bool RevertOnDeath = true; - - /// - /// Whether or not the polymorph reverts when the entity is eaten or fully sliced. - /// - [DataField("revertOnEat", serverOnly: true)] - public bool RevertOnEat = false; - - [DataField("allowRepeatedMorphs", serverOnly: true)] - public bool AllowRepeatedMorphs = false; - - /// - /// The amount of time that should pass after this polymorph has ended, before a new one - /// can occur. - /// - [DataField("cooldown", serverOnly: true)] - [ViewVariables(VVAccess.ReadWrite)] - public TimeSpan Cooldown = TimeSpan.Zero; - } - - public enum PolymorphInventoryChange : byte - { - None, - Drop, - Transfer, - } + [DataField(serverOnly: true)] + public bool TransferName; + + /// + /// Whether or not the entity transfers its hair, skin color, hair color, etc. + /// + [DataField(serverOnly: true)] + public bool TransferHumanoidAppearance; + + /// + /// Whether or not the entity transfers its inventory and equipment between forms. + /// + [DataField(serverOnly: true)] + public PolymorphInventoryChange Inventory = PolymorphInventoryChange.None; + + /// + /// Whether or not the polymorph reverts when the entity goes into crit. + /// + [DataField(serverOnly: true)] + public bool RevertOnCrit = true; + + /// + /// Whether or not the polymorph reverts when the entity dies. + /// + [DataField(serverOnly: true)] + public bool RevertOnDeath = true; + + /// + /// Whether or not the polymorph reverts when the entity is eaten or fully sliced. + /// + [DataField(serverOnly: true)] + public bool RevertOnEat; + + /// + /// Whether or not an already polymorphed entity is able to be polymorphed again + /// + [DataField(serverOnly: true)] + public bool AllowRepeatedMorphs; + + /// + /// The amount of time that should pass after this polymorph has ended, before a new one + /// can occur. + /// + [DataField(serverOnly: true)] + [ViewVariables(VVAccess.ReadWrite)] + public TimeSpan Cooldown = TimeSpan.Zero; +} + +public enum PolymorphInventoryChange : byte +{ + None, + Drop, + Transfer, } diff --git a/Resources/Prototypes/Polymorphs/admin.yml b/Resources/Prototypes/Polymorphs/admin.yml index 0ae54262441..cb274ec7d43 100644 --- a/Resources/Prototypes/Polymorphs/admin.yml +++ b/Resources/Prototypes/Polymorphs/admin.yml @@ -1,43 +1,49 @@ - type: polymorph id: AdminLizardSmite - entity: MobReptilian - forced: true - transferName: true - transferHumanoidAppearance: true - inventory: Transfer - allowRepeatedMorphs: true + configuration: + entity: MobReptilian + forced: true + transferName: true + transferHumanoidAppearance: true + inventory: Transfer + allowRepeatedMorphs: true - type: polymorph id: AdminMonkeySmite - entity: MobMonkey - forced: true - inventory: Drop - allowRepeatedMorphs: true + configuration: + entity: MobMonkey + forced: true + inventory: Drop + allowRepeatedMorphs: true - type: polymorph id: AdminBreadSmite - entity: FoodBreadPlain - forced: true - inventory: Drop - allowRepeatedMorphs: true + configuration: + entity: FoodBreadPlain + forced: true + inventory: Drop + allowRepeatedMorphs: true - type: polymorph id: AdminInstrumentSmite - entity: SuperSynthesizerInstrument - forced: true - inventory: Drop - allowRepeatedMorphs: true + configuration: + entity: SuperSynthesizerInstrument + forced: true + inventory: Drop + allowRepeatedMorphs: true - type: polymorph id: AdminMouseSmite - entity: MobMouse - forced: true - inventory: Drop - allowRepeatedMorphs: true + configuration: + entity: MobMouse + forced: true + inventory: Drop + allowRepeatedMorphs: true - type: polymorph id: AdminDisposalsSmite - entity: DisposalUnit - forced: true - inventory: Drop - allowRepeatedMorphs: true + configuration: + entity: DisposalUnit + forced: true + inventory: Drop + allowRepeatedMorphs: true diff --git a/Resources/Prototypes/Polymorphs/polymorph.yml b/Resources/Prototypes/Polymorphs/polymorph.yml index 46590248aec..b4249f8a3ea 100644 --- a/Resources/Prototypes/Polymorphs/polymorph.yml +++ b/Resources/Prototypes/Polymorphs/polymorph.yml @@ -1,150 +1,166 @@ - type: polymorph id: Mouse - entity: MobMouse - forced: true - duration: 30 + configuration: + entity: MobMouse + forced: true + duration: 30 - type: polymorph id: Chicken - entity: MobChicken - forced: true - inventory: Drop + configuration: + entity: MobChicken + forced: true + inventory: Drop - type: polymorph id: Monkey - entity: MobMonkey - forced: true - inventory: Drop - revertOnCrit: true - revertOnDeath: true + configuration: + entity: MobMonkey + forced: true + inventory: Drop + revertOnCrit: true + revertOnDeath: true - type: polymorph id: WizardForcedCarp - entity: MobCarpMagic - forced: true - inventory: None - transferName: true - transferDamage: true - revertOnCrit: false - revertOnDeath: true + configuration: + entity: MobCarpMagic + forced: true + inventory: None + transferName: true + transferDamage: true + revertOnCrit: false + revertOnDeath: true - type: polymorph id: WizardForcedSkeleton - entity: MobSkeletonPerson - forced: true - inventory: Drop - transferName: true - transferDamage: true - revertOnCrit: false - revertOnDeath: false + configuration: + entity: MobSkeletonPerson + forced: true + inventory: Drop + transferName: true + transferDamage: true + revertOnCrit: false + revertOnDeath: false - type: polymorph id: WizardForcedMonkey - entity: MobMonkey - forced: true - inventory: None - transferName: true - transferDamage: true - revertOnCrit: false - revertOnDeath: true + configuration: + entity: MobMonkey + forced: true + inventory: None + transferName: true + transferDamage: true + revertOnCrit: false + revertOnDeath: true - type: polymorph id: WizardWallDoor - entity: WoodDoor - forced: true - inventory: None - transferName: false - transferDamage: false - revertOnCrit: false - revertOnDeath: false + configuration: + entity: WoodDoor + forced: true + inventory: None + transferName: false + transferDamage: false + revertOnCrit: false + revertOnDeath: false - type: polymorph id: WizardForcedCluwne - entity: MobCluwne - forced: true - transferName: true - transferHumanoidAppearance: true - inventory: Transfer - revertOnDeath: true + configuration: + entity: MobCluwne + forced: true + transferName: true + transferHumanoidAppearance: true + inventory: Transfer + revertOnDeath: true # this is a test for transferring some visual appearance stuff - type: polymorph id: TestHumanMorph - entity: MobHuman - transferName: true - transferHumanoidAppearance: true - inventory: Transfer + configuration: + entity: MobHuman + transferName: true + transferHumanoidAppearance: true + inventory: Transfer - type: polymorph id: AMIVMorph - entity: MobMonkey - forced: true - inventory: Transfer - transferName: true - revertOnCrit: false - revertOnDeath: false + configuration: + entity: MobMonkey + forced: true + inventory: Transfer + transferName: true + revertOnCrit: false + revertOnDeath: false - type: polymorph id: BreadMorph - entity: FoodBreadPlain - forced: true - inventory: None - transferName: false - transferDamage: true - revertOnCrit: false - revertOnDeath: true - revertOnEat: true + configuration: + entity: FoodBreadPlain + forced: true + inventory: None + transferName: false + transferDamage: true + revertOnCrit: false + revertOnDeath: true + revertOnEat: true - type: polymorph id: TreeMorph - entity: FloraTree01 - forced: true - transferName: true - revertOnDeath: true - inventory: Drop - cooldown: 160 + configuration: + entity: FloraTree01 + forced: true + transferName: true + revertOnDeath: true + inventory: Drop + cooldown: 160 # this is the monkey polymorph for artifact. - type: polymorph id: ArtifactMonkey - entity: MobMonkey - forced: true - transferName: true - allowRepeatedMorphs: true - inventory: Transfer - revertOnCrit: true - revertOnDeath: true - duration: 20 + configuration: + entity: MobMonkey + forced: true + transferName: true + allowRepeatedMorphs: true + inventory: Transfer + revertOnCrit: true + revertOnDeath: true + duration: 20 - type: polymorph id: ArtifactCluwne - entity: MobCluwne - forced: true - transferName: true - transferHumanoidAppearance: true - inventory: None - revertOnDeath: true - revertOnCrit: true - duration: 30 + configuration: + entity: MobCluwne + forced: true + transferName: true + transferHumanoidAppearance: true + inventory: None + revertOnDeath: true + revertOnCrit: true + duration: 30 - type: polymorph id: ArtifactLizard - entity: MobLizard - forced: true - transferName: true - transferHumanoidAppearance: true - inventory: None - revertOnDeath: true - revertOnCrit: true - duration: 20 + configuration: + entity: MobLizard + forced: true + transferName: true + transferHumanoidAppearance: true + inventory: None + revertOnDeath: true + revertOnCrit: true + duration: 20 - type: polymorph id: ArtifactLuminous - entity: MobLuminousPerson - forced: true - transferName: true - transferHumanoidAppearance: true - inventory: None - revertOnDeath: true - revertOnCrit: true - duration: 20 + configuration: + entity: MobLuminousPerson + forced: true + transferName: true + transferHumanoidAppearance: true + inventory: None + revertOnDeath: true + revertOnCrit: true + duration: 20 diff --git a/Resources/Prototypes/XenoArch/Effects/normal_effects.yml b/Resources/Prototypes/XenoArch/Effects/normal_effects.yml index c0c3bf77f8b..4810f0c5467 100644 --- a/Resources/Prototypes/XenoArch/Effects/normal_effects.yml +++ b/Resources/Prototypes/XenoArch/Effects/normal_effects.yml @@ -515,14 +515,14 @@ targetDepth: 2 effectHint: artifact-effect-hint-polymorph components: - - type: PolyArtifact + - type: PolyOthersArtifact - type: artifactEffect id: EffectPolyLizard targetDepth: 2 effectHint: artifact-effect-hint-polymorph components: - - type: PolyArtifact + - type: PolyOthersArtifact polymorphPrototypeName: ArtifactLizard - type: artifactEffect @@ -530,7 +530,7 @@ targetDepth: 3 effectHint: artifact-effect-hint-polymorph components: - - type: PolyArtifact + - type: PolyOthersArtifact polymorphPrototypeName: ArtifactLuminous - type: artifactEffect From abcc75df5be827b86b152d1816fc363c163df105 Mon Sep 17 00:00:00 2001 From: SlamBamActionman <83650252+slambamactionman@users.noreply.github.com> Date: Thu, 1 Feb 2024 13:40:54 +0100 Subject: [PATCH 131/266] Make paper edible (#24755) * Edible paper * Added Paper tag (cherry picked from commit d520198f1357487940d2de12fa567b5461b20ba2) --- Resources/Prototypes/Body/Organs/moth.yml | 1 + Resources/Prototypes/Body/Organs/reptilian.yml | 1 + Resources/Prototypes/Entities/Objects/Misc/paper.yml | 12 ++++++++++++ Resources/Prototypes/tags.yml | 3 +++ 4 files changed, 17 insertions(+) diff --git a/Resources/Prototypes/Body/Organs/moth.yml b/Resources/Prototypes/Body/Organs/moth.yml index 7ffc3ff4ec0..9b94e77b7eb 100644 --- a/Resources/Prototypes/Body/Organs/moth.yml +++ b/Resources/Prototypes/Body/Organs/moth.yml @@ -8,6 +8,7 @@ tags: - ClothMade - Fruit # DeltaV - Moth can eat fruits. + - Paper - type: SolutionContainerManager solutions: stomach: diff --git a/Resources/Prototypes/Body/Organs/reptilian.yml b/Resources/Prototypes/Body/Organs/reptilian.yml index 01c0fe9658f..993f90e1c6d 100644 --- a/Resources/Prototypes/Body/Organs/reptilian.yml +++ b/Resources/Prototypes/Body/Organs/reptilian.yml @@ -10,6 +10,7 @@ - Meat - Pill - Crayon + - Paper - type: SolutionContainerManager solutions: stomach: diff --git a/Resources/Prototypes/Entities/Objects/Misc/paper.yml b/Resources/Prototypes/Entities/Objects/Misc/paper.yml index 0c8a5ea055e..50f594abae5 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/paper.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/paper.yml @@ -28,6 +28,7 @@ tags: - Document - Trash + - Paper - type: Appearance - type: PaperVisuals - type: Flammable @@ -56,6 +57,17 @@ max: 1 - !type:DoActsBehavior acts: [ "Destruction" ] + - type: Food + solution: food + delay: 7 + forceFeedDelay: 7 + - type: SolutionContainerManager + solutions: + food: + maxVol: 1 + reagents: + - ReagentId: Fiber + Quantity: 1 - type: entity name: paper scrap diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 62f08e07156..b07c8d267ad 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -850,6 +850,9 @@ - type: Tag id: Packet +- type: Tag + id: Paper + - type: Tag id: Payload # for grenade/bomb crafting From db8726cd0dc135386a37ce41df44040bbe176428 Mon Sep 17 00:00:00 2001 From: mac6na6na <132022491+mac6na6na@users.noreply.github.com> Date: Thu, 1 Feb 2024 07:41:03 -0500 Subject: [PATCH 132/266] Remove tiered part crates from expeditions (#24810) Remove part crates (cherry picked from commit 8b292671f498db9b7f9f4db8cb7b569440259782) --- Resources/Prototypes/Procedural/salvage_loot.yml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/Resources/Prototypes/Procedural/salvage_loot.yml b/Resources/Prototypes/Procedural/salvage_loot.yml index 175e9ea9a3f..ed649f54b3a 100644 --- a/Resources/Prototypes/Procedural/salvage_loot.yml +++ b/Resources/Prototypes/Procedural/salvage_loot.yml @@ -27,15 +27,6 @@ - proto: CloningPodMachineCircuitboard cost: 2 - proto: CognizineChemistryBottle - - proto: CratePartsT3 - cost: 2 - prob: 0.5 - - proto: CratePartsT3T4 - cost: 5 - prob: 0.5 - - proto: CratePartsT4 - cost: 5 - prob: 0.5 - proto: CrateSalvageEquipment cost: 3 prob: 0.5 From 2c1c62fd6001a0209bf125416161a3328deb7e64 Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 1 Feb 2024 12:42:10 +0000 Subject: [PATCH 133/266] Automatic changelog update (cherry picked from commit 1fc237a84ec6086095089f3a4e6b89513114697c) --- Resources/Changelog/Changelog.yml | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 6341fc16cf3..e0f9abc95af 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,16 +1,4 @@ Entries: -- author: Ubaser - changes: - - message: Added a new "uneven" hair style. - type: Add - id: 5356 - time: '2023-12-13T21:34:28.0000000+00:00' -- author: notafet - changes: - - message: Plasma and tritium fires spread more slowly and are now more survivable. - type: Tweak - id: 5357 - time: '2023-12-14T02:39:38.0000000+00:00' - author: Dygon changes: - message: 'A new type of grenade has been developed, these grenades release a spray @@ -3863,3 +3851,17 @@ id: 5855 time: '2024-02-01T11:54:25.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24554 +- author: SlamBamActionman + changes: + - message: Paper is now edible, even for non-moths. + type: Tweak + id: 5856 + time: '2024-02-01T12:40:55.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24755 +- author: mac6na6na + changes: + - message: Tiered part crates will no longer appear on salvage expeditions. + type: Remove + id: 5857 + time: '2024-02-01T12:41:03.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24810 From 27895cd4d979c44908e8147f66943d62e9e01aec Mon Sep 17 00:00:00 2001 From: Kara Date: Thu, 1 Feb 2024 05:49:48 -0700 Subject: [PATCH 134/266] Open some windows non-centered to avoid covering the player (#24767) (cherry picked from commit e212b10ca205b5a76c20a3daca4a13af435611c5) --- Content.Client/Atmos/UI/GasAnalyzerBoundUserInterface.cs | 2 +- Content.Client/Crayon/UI/CrayonBoundUserInterface.cs | 2 +- Content.Client/Lathe/UI/LatheBoundUserInterface.cs | 2 +- Content.Client/RoundEnd/RoundEndSummaryWindow.cs | 2 +- .../VendingMachines/VendingMachineBoundUserInterface.cs | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Content.Client/Atmos/UI/GasAnalyzerBoundUserInterface.cs b/Content.Client/Atmos/UI/GasAnalyzerBoundUserInterface.cs index 142fedc48fd..ad496caa8ec 100644 --- a/Content.Client/Atmos/UI/GasAnalyzerBoundUserInterface.cs +++ b/Content.Client/Atmos/UI/GasAnalyzerBoundUserInterface.cs @@ -18,7 +18,7 @@ protected override void Open() _window = new GasAnalyzerWindow(); _window.OnClose += OnClose; - _window.OpenCentered(); + _window.OpenCenteredLeft(); } protected override void ReceiveMessage(BoundUserInterfaceMessage message) diff --git a/Content.Client/Crayon/UI/CrayonBoundUserInterface.cs b/Content.Client/Crayon/UI/CrayonBoundUserInterface.cs index 3bb3b5eeafb..e2c4d51ecd1 100644 --- a/Content.Client/Crayon/UI/CrayonBoundUserInterface.cs +++ b/Content.Client/Crayon/UI/CrayonBoundUserInterface.cs @@ -24,7 +24,7 @@ protected override void Open() var prototypeManager = IoCManager.Resolve(); var crayonDecals = prototypeManager.EnumeratePrototypes().Where(x => x.Tags.Contains("crayon")); _menu.Populate(crayonDecals); - _menu.OpenCentered(); + _menu.OpenCenteredLeft(); } protected override void UpdateState(BoundUserInterfaceState state) diff --git a/Content.Client/Lathe/UI/LatheBoundUserInterface.cs b/Content.Client/Lathe/UI/LatheBoundUserInterface.cs index 456471598a4..6e6d1b91761 100644 --- a/Content.Client/Lathe/UI/LatheBoundUserInterface.cs +++ b/Content.Client/Lathe/UI/LatheBoundUserInterface.cs @@ -31,7 +31,7 @@ protected override void Open() SendMessage(new LatheQueueRecipeMessage(recipe, amount)); }; - _menu.OpenCentered(); + _menu.OpenCenteredRight(); } protected override void UpdateState(BoundUserInterfaceState state) diff --git a/Content.Client/RoundEnd/RoundEndSummaryWindow.cs b/Content.Client/RoundEnd/RoundEndSummaryWindow.cs index bb75d75d75e..5b73c77934a 100644 --- a/Content.Client/RoundEnd/RoundEndSummaryWindow.cs +++ b/Content.Client/RoundEnd/RoundEndSummaryWindow.cs @@ -37,7 +37,7 @@ public RoundEndSummaryWindow(string gm, string roundEnd, TimeSpan roundTimeSpan, Contents.AddChild(roundEndTabs); - OpenCentered(); + OpenCenteredRight(); MoveToFront(); } diff --git a/Content.Client/VendingMachines/VendingMachineBoundUserInterface.cs b/Content.Client/VendingMachines/VendingMachineBoundUserInterface.cs index 6f28ddb31f0..17ddba77ffc 100644 --- a/Content.Client/VendingMachines/VendingMachineBoundUserInterface.cs +++ b/Content.Client/VendingMachines/VendingMachineBoundUserInterface.cs @@ -36,7 +36,7 @@ protected override void Open() _menu.Populate(_cachedInventory, out _cachedFilteredIndex); - _menu.OpenCentered(); + _menu.OpenCenteredLeft(); } protected override void UpdateState(BoundUserInterfaceState state) From 1e904806353a331c52b72fb88a71d6ff95449525 Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 1 Feb 2024 12:50:54 +0000 Subject: [PATCH 135/266] Automatic changelog update (cherry picked from commit b932d94ded2ff4f8e6e563e55231263ee01389e3) --- Resources/Changelog/Changelog.yml | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index e0f9abc95af..e723500cd77 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,20 +1,4 @@ Entries: -- author: Dygon - changes: - - message: 'A new type of grenade has been developed, these grenades release a spray - of bullets instead of exploding: Shrapnel grenade, Stinger grenade and Incendiary - grenade.' - type: Add - - message: Stinger grenades and ClusterBangs are now available in the sectech. - type: Add - - message: Incendiary grenades, Shrapnel grenades, Cluster grenades and the Slipocalypse - ClusterSoap are now available in the syndicate uplink, clowns also get a Clusterbanana - in their uplink. - type: Add - - message: Explosive banana peels are now more dangerous. - type: Tweak - id: 5358 - time: '2023-12-14T03:30:43.0000000+00:00' - author: EmoGarbage404 changes: - message: Added gas condensers. These machines are available at the circuit imprinter @@ -3865,3 +3849,11 @@ id: 5857 time: '2024-02-01T12:41:03.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24810 +- author: mirrorcult + changes: + - message: Crayon/lathe/vendor/round end/gas analyzer windows now open closer to + the sides of the screen + type: Tweak + id: 5858 + time: '2024-02-01T12:49:49.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24767 From 215d861bb859dfb0e4641507203debf346200beb Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Thu, 1 Feb 2024 12:56:40 +0000 Subject: [PATCH 136/266] make dialog window not evil (#24677) * add Placeholder and make default buttons flags consistent w old behaviour * DialogWindow ops * make QuickDialog use DialogWindow * Update Content.Client/UserInterface/Controls/DialogWindow.xaml --------- Co-authored-by: deltanedas <@deltanedas:kde.org> Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> (cherry picked from commit 6b03aaaec78bd50c8f4730c9aa7d0f5cea76e782) --- .../Administration/QuickDialogSystem.cs | 154 ++---------------- .../UserInterface/Controls/DialogWindow.xaml | 9 + .../Controls/DialogWindow.xaml.cs | 147 +++++++++++++++++ .../Administration/QuickDialogOpenEvent.cs | 10 +- 4 files changed, 175 insertions(+), 145 deletions(-) create mode 100644 Content.Client/UserInterface/Controls/DialogWindow.xaml create mode 100644 Content.Client/UserInterface/Controls/DialogWindow.xaml.cs diff --git a/Content.Client/Administration/QuickDialogSystem.cs b/Content.Client/Administration/QuickDialogSystem.cs index 84236c5a3e6..d015b7769b1 100644 --- a/Content.Client/Administration/QuickDialogSystem.cs +++ b/Content.Client/Administration/QuickDialogSystem.cs @@ -1,13 +1,8 @@ -using System.Linq; using Content.Client.UserInterface.Controls; using Content.Shared.Administration; -using Robust.Client.UserInterface; -using Robust.Client.UserInterface.Controls; namespace Content.Client.Administration; -// mfw they ported input() from BYOND - /// /// This handles the client portion of quick dialogs. /// @@ -21,149 +16,22 @@ public override void Initialize() private void OpenDialog(QuickDialogOpenEvent ev) { - var window = new FancyWindow() - { - Title = ev.Title - }; - - var entryContainer = new BoxContainer() - { - Orientation = BoxContainer.LayoutOrientation.Vertical, - Margin = new Thickness(8), - }; - - var promptsDict = new Dictionary(); - - for (var index = 0; index < ev.Prompts.Count; index++) - { - var entry = ev.Prompts[index]; - var entryBox = new BoxContainer() - { - Orientation = BoxContainer.LayoutOrientation.Horizontal - }; - - entryBox.AddChild(new Label { Text = entry.Prompt, HorizontalExpand = true, SizeFlagsStretchRatio = 0.5f }); - var edit = new LineEdit() { HorizontalExpand = true }; - entryBox.AddChild(edit); - switch (entry.Type) - { - case QuickDialogEntryType.Integer: - edit.IsValid += VerifyInt; - edit.PlaceHolder = Loc.GetString("quick-dialog-ui-integer"); - break; - case QuickDialogEntryType.Float: - edit.IsValid += VerifyFloat; - edit.PlaceHolder = Loc.GetString("quick-dialog-ui-float"); - break; - case QuickDialogEntryType.ShortText: - edit.IsValid += VerifyShortText; - edit.PlaceHolder = Loc.GetString("quick-dialog-ui-short-text"); - break; - case QuickDialogEntryType.LongText: - edit.IsValid += VerifyLongText; - edit.PlaceHolder = Loc.GetString("quick-dialog-ui-long-text"); - break; - default: - throw new ArgumentOutOfRangeException(); - } - - promptsDict.Add(entry.FieldId, edit); - entryContainer.AddChild(entryBox); - - if (index == ev.Prompts.Count - 1) - { - // Last text box gets enter confirmation. - // Only the last so you don't accidentally confirm early. - edit.OnTextEntered += _ => Confirm(); - } - } + var ok = (ev.Buttons & QuickDialogButtonFlag.OkButton) != 0; + var cancel = (ev.Buttons & QuickDialogButtonFlag.CancelButton) != 0; + var window = new DialogWindow(ev.Title, ev.Prompts, ok: ok, cancel: cancel); - var buttonsBox = new BoxContainer() + window.OnConfirmed += responses => { - Orientation = BoxContainer.LayoutOrientation.Horizontal, - HorizontalAlignment = Control.HAlignment.Center, - }; - - var alreadyReplied = false; - - if ((ev.Buttons & QuickDialogButtonFlag.OkButton) != 0) - { - var okButton = new Button() - { - Text = Loc.GetString("quick-dialog-ui-ok"), - }; - - okButton.OnPressed += _ => Confirm(); - - buttonsBox.AddChild(okButton); - } - - if ((ev.Buttons & QuickDialogButtonFlag.OkButton) != 0) - { - var cancelButton = new Button() - { - Text = Loc.GetString("quick-dialog-ui-cancel"), - }; - - cancelButton.OnPressed += _ => - { - RaiseNetworkEvent(new QuickDialogResponseEvent(ev.DialogId, - new(), - QuickDialogButtonFlag.CancelButton)); - alreadyReplied = true; - window.Close(); - }; - - buttonsBox.AddChild(cancelButton); - } - - window.OnClose += () => - { - if (!alreadyReplied) - { - RaiseNetworkEvent(new QuickDialogResponseEvent(ev.DialogId, - new(), - QuickDialogButtonFlag.CancelButton)); - } + RaiseNetworkEvent(new QuickDialogResponseEvent(ev.DialogId, + responses, + QuickDialogButtonFlag.OkButton)); }; - entryContainer.AddChild(buttonsBox); - - window.ContentsContainer.AddChild(entryContainer); - - window.MinWidth *= 2; // Just double it. - - window.OpenCentered(); - - return; - - void Confirm() + window.OnCancelled += () => { RaiseNetworkEvent(new QuickDialogResponseEvent(ev.DialogId, - promptsDict.Select(x => (x.Key, x.Value.Text)).ToDictionary(x => x.Key, x => x.Text), - QuickDialogButtonFlag.OkButton)); - alreadyReplied = true; - window.Close(); - } - } - - private bool VerifyInt(string input) - { - return int.TryParse(input, out var _); - } - - private bool VerifyFloat(string input) - { - return float.TryParse(input, out var _); - } - - private bool VerifyShortText(string input) - { - return input.Length <= 100; - } - - private bool VerifyLongText(string input) - { - return input.Length <= 2000; + new(), + QuickDialogButtonFlag.CancelButton)); + }; } } diff --git a/Content.Client/UserInterface/Controls/DialogWindow.xaml b/Content.Client/UserInterface/Controls/DialogWindow.xaml new file mode 100644 index 00000000000..4f9a8a49f91 --- /dev/null +++ b/Content.Client/UserInterface/Controls/DialogWindow.xaml @@ -0,0 +1,9 @@ + + + + + public string Prompt; - public QuickDialogEntry(string fieldId, QuickDialogEntryType type, string prompt) + /// + /// String to replace the type-specific placeholder with. + /// + public string? Placeholder; + + public QuickDialogEntry(string fieldId, QuickDialogEntryType type, string prompt, string? placeholder = null) { FieldId = fieldId; Type = type; Prompt = prompt; + Placeholder = placeholder; } } From e10eb321d464ef7d797ead6ac2cdabae97da30be Mon Sep 17 00:00:00 2001 From: Tayrtahn Date: Thu, 1 Feb 2024 13:59:41 +0100 Subject: [PATCH 137/266] Make plushies, whoopie cushions, and some toys usable as modular grenade payloads (#24306) * Toot * Hm, but why stop there? --------- Co-authored-by: metalgearsloth (cherry picked from commit 5dc1481e0380289943936af1f36a72949a86d219) --- .../Entities/Objects/Fun/bike_horn.yml | 5 ++ .../Prototypes/Entities/Objects/Fun/skub.yml | 6 ++ .../Prototypes/Entities/Objects/Fun/toys.yml | 73 +++++++++++++++++++ .../Entities/Objects/Misc/desk_bell.yml | 3 + 4 files changed, 87 insertions(+) diff --git a/Resources/Prototypes/Entities/Objects/Fun/bike_horn.yml b/Resources/Prototypes/Entities/Objects/Fun/bike_horn.yml index 1a79011d1b2..7c69aa09013 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/bike_horn.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/bike_horn.yml @@ -133,6 +133,11 @@ collection: BananiumHorn params: variation: 0.246 + - type: EmitSoundOnTrigger + sound: + collection: BananiumHorn + params: + variation: 0.246 - type: Construction graph: BananiumHorn node: bananiumHorn diff --git a/Resources/Prototypes/Entities/Objects/Fun/skub.yml b/Resources/Prototypes/Entities/Objects/Fun/skub.yml index 0061270df2f..9d4bfe79bb0 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/skub.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/skub.yml @@ -7,10 +7,16 @@ - type: Sprite sprite: Objects/Misc/skub.rsi state: icon + - type: Tag + tags: + - Payload - type: Item sprite: Objects/Misc/skub.rsi - type: EmitSoundOnUse sound: collection: Skub + - type: EmitSoundOnTrigger + sound: + collection: Skub - type: UseDelay delay: 2.0 diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml index be52665f55b..17838b0fdeb 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml @@ -7,6 +7,9 @@ components: - type: Sprite sprite: Objects/Fun/toys.rsi + - type: Tag + tags: + - Payload - type: EmitSoundOnUse sound: collection: ToySqueak @@ -19,6 +22,9 @@ - type: EmitSoundOnLand sound: collection: ToyFall + - type: EmitSoundOnTrigger + sound: + collection: ToySqueak - type: UseDelay delay: 1.0 - type: MeleeWeapon @@ -66,6 +72,7 @@ tags: - ForceableFollow - PlushieGhost + - Payload - type: RandomWalk accumulatorRatio: 0.5 maxSpeed: 1 @@ -133,6 +140,9 @@ - type: EmitSoundOnActivate sound: path: /Audio/Items/Toys/mousesqueek.ogg + - type: EmitSoundOnTrigger + sound: + path: /Audio/Items/Toys/mousesqueek.ogg - type: MeleeWeapon wideAnimationRotation: 180 soundHit: @@ -199,6 +209,9 @@ - type: EmitSoundOnActivate sound: path: /Audio/Voice/Arachnid/arachnid_laugh.ogg + - type: EmitSoundOnTrigger + sound: + path: /Audio/Voice/Arachnid/arachnid_laugh.ogg - type: MeleeWeapon wideAnimationRotation: 180 soundHit: @@ -221,6 +234,9 @@ - type: EmitSoundOnActivate sound: path: /Audio/Items/Toys/weh.ogg + - type: EmitSoundOnTrigger + sound: + path: /Audio/Items/Toys/weh.ogg - type: MeleeWeapon wideAnimationRotation: 180 soundHit: @@ -252,6 +268,9 @@ - type: EmitSoundOnActivate sound: path: /Audio/Items/Toys/muffled_weh.ogg + - type: EmitSoundOnTrigger + sound: + path: /Audio/Items/Toys/muffled_weh.ogg - type: MeleeWeapon wideAnimationRotation: 180 soundHit: @@ -278,6 +297,9 @@ - type: EmitSoundOnActivate sound: path: /Audio/Items/Toys/toy_rustle.ogg + - type: EmitSoundOnTrigger + sound: + path: /Audio/Items/Toys/toy_rustle.ogg - type: MeleeWeapon wideAnimationRotation: 180 soundHit: @@ -333,6 +355,7 @@ - type: Tag tags: - PlushieSharkBlue + - Payload - type: entity parent: PlushieSharkBlue @@ -348,6 +371,7 @@ - type: Tag tags: - PlushieSharkPink + - Payload - type: entity parent: PlushieSharkBlue @@ -363,6 +387,7 @@ - type: Tag tags: - PlushieSharkGrey + - Payload - type: entity parent: BasePlushie @@ -405,6 +430,9 @@ - type: EmitSoundOnActivate sound: path: /Audio/Effects/bite.ogg + - type: EmitSoundOnTrigger + sound: + path: /Audio/Effects/bite.ogg - type: MeleeWeapon wideAnimationRotation: -90 soundHit: @@ -432,6 +460,9 @@ - type: EmitSoundOnUse sound: path: /Audio/Items/Toys/rattle.ogg + - type: EmitSoundOnTrigger + sound: + path: /Audio/Items/Toys/rattle.ogg - type: MeleeWeapon wideAnimationRotation: 180 soundHit: @@ -448,6 +479,9 @@ - type: EmitSoundOnUse sound: path: /Audio/Items/Toys/mousesqueek.ogg + - type: EmitSoundOnTrigger + sound: + path: /Audio/Items/Toys/mousesqueek.ogg - type: MeleeWeapon wideAnimationRotation: -90 soundHit: @@ -478,6 +512,9 @@ - type: EmitSoundOnUse sound: path: /Audio/Items/Toys/quack.ogg + - type: EmitSoundOnTrigger + sound: + path: /Audio/Items/Toys/quack.ogg - type: entity parent: BasePlushie @@ -493,6 +530,9 @@ - type: EmitSoundOnLand sound: path: /Audio/Voice/Vox/shriek1.ogg + - type: EmitSoundOnTrigger + sound: + path: /Audio/Voice/Vox/shriek1.ogg - type: MeleeWeapon wideAnimationRotation: 180 soundHit: @@ -526,6 +566,9 @@ - type: EmitSoundOnActivate sound: path: /Audio/Weapons/Xeno/alien_spitacid.ogg + - type: EmitSoundOnTrigger + sound: + path: /Audio/Weapons/Xeno/alien_spitacid.ogg - type: MeleeWeapon wideAnimationRotation: 180 soundHit: @@ -568,6 +611,9 @@ components: - type: Sprite state: nuketoy + - type: Tag + tags: + - Payload - type: UseDelay delay: 180.0 - type: EmitSoundOnUse @@ -582,6 +628,12 @@ params: volume: -5 maxDistance: 10 + - type: EmitSoundOnTrigger + sound: + path: /Audio/Machines/Nuke/nuke_alarm.ogg + params: + volume: -5 + maxDistance: 10 - type: entity parent: BasePlushie @@ -596,6 +648,9 @@ - type: EmitSoundOnUse sound: path: /Audio/Items/Toys/ian.ogg + - type: EmitSoundOnTrigger + sound: + path: /Audio/Items/Toys/ian.ogg - type: MeleeWeapon soundHit: path: /Audio/Items/Toys/ian.ogg @@ -1013,11 +1068,15 @@ - type: EmitSoundOnActivate sound: collection: ClownRecorder + - type: EmitSoundOnTrigger + sound: + collection: ClownRecorder - type: UseDelay delay: 30.0 - type: Tag tags: - ClownRecorder + - Payload - type: entity parent: BaseItem @@ -1067,6 +1126,9 @@ sprite: Objects/Fun/whoopie.rsi state: icon quickEquip: false + - type: Tag + tags: + - Payload - type: EmitSoundOnUse sound: collection: Parp @@ -1092,6 +1154,11 @@ intersectRatio: 0.2 requiredTriggeredSpeed: 1 - type: TriggerOnStepTrigger + - type: EmitSoundOnTrigger + sound: + collection: Parp + params: + variation: 0.125 - type: Appearance - type: CollisionWake enabled: false @@ -1178,6 +1245,9 @@ - type: EmitSoundOnActivate sound: path: /Audio/Voice/Moth/moth_squeak.ogg # DeltaV - Give back the mothplushie the squeak + - type: EmitSoundOnTrigger + sound: + path: /Audio/Voice/Moth/moth_scream.ogg # DeltaV - Make the mothplushie scream on trigger - type: MeleeWeapon soundHit: path: /Audio/Voice/Moth/moth_squeak.ogg # DeltaV - Give back the mothplushie the squeak @@ -1214,6 +1284,9 @@ - type: MeleeWeapon soundHit: path: /Audio/Voice/Human/malescream_4.ogg + - type: EmitSoundOnTrigger + sound: + path: /Audio/Voice/Human/malescream_5.ogg - type: entity parent: BaseItem diff --git a/Resources/Prototypes/Entities/Objects/Misc/desk_bell.yml b/Resources/Prototypes/Entities/Objects/Misc/desk_bell.yml index cef406ea50b..1fe3b8a271c 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/desk_bell.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/desk_bell.yml @@ -7,6 +7,9 @@ - type: Sprite sprite: Objects/Misc/desk_bell.rsi state: "normal" + - type: Tag + tags: + - Payload - type: InteractionPopup successChance: 1 interactSuccessSound: From dd000c92ec85353206ed3f3cb7e20aa4692b5615 Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 1 Feb 2024 13:00:48 +0000 Subject: [PATCH 138/266] Automatic changelog update (cherry picked from commit 45dff4b47d4273378526434d363880d822c27f76) --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index e723500cd77..4c58c79cfaa 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: EmoGarbage404 - changes: - - message: Added gas condensers. These machines are available at the circuit imprinter - and can convert gases into liquids. Tasty! - type: Add - id: 5359 - time: '2023-12-14T03:35:44.0000000+00:00' - author: DangerRevolution changes: - message: Extended emergency nitrogen tanks can now be found on the station. @@ -3857,3 +3850,11 @@ id: 5858 time: '2024-02-01T12:49:49.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24767 +- author: Tayrtahn + changes: + - message: Plushies, whoopie cushions, and a few other noisemaking objects can be + used as modular grenade payloads. + type: Add + id: 5859 + time: '2024-02-01T12:59:42.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24306 From f016a076c26cd29d1e24485e5cb7679b925b6cc1 Mon Sep 17 00:00:00 2001 From: Repo <47093363+Titian3@users.noreply.github.com> Date: Fri, 2 Feb 2024 02:03:49 +1300 Subject: [PATCH 139/266] Fix aHelp relay to detect AFK Admins (#24482) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add AFK detection for aHelp relay and admin specific afk time. * Correct query to new refactor * Change AFK timeout to 10min or else Pancake closes my PR 😭 * It wasnt a bug it was a feature, way less aHelps that way. * aHelp Colors arn't real! * Update Content.Shared/CCVar/CCVars.cs --------- Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> (cherry picked from commit 00841217062ba60d38320dfd2b93288548bb4201) --- .../Administration/Systems/BwoinkSystem.cs | 24 +++++++++++++------ Content.Server/Afk/AfkManager.cs | 11 +++++++-- Content.Shared/CCVar/CCVars.cs | 6 +++++ 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/Content.Server/Administration/Systems/BwoinkSystem.cs b/Content.Server/Administration/Systems/BwoinkSystem.cs index 87c200e08b8..5439b27f424 100644 --- a/Content.Server/Administration/Systems/BwoinkSystem.cs +++ b/Content.Server/Administration/Systems/BwoinkSystem.cs @@ -6,6 +6,7 @@ using System.Text.RegularExpressions; using System.Threading.Tasks; using Content.Server.Administration.Managers; +using Content.Server.Afk; using Content.Server.Discord; using Content.Server.GameTicking; using Content.Shared.Administration; @@ -33,6 +34,7 @@ public sealed class BwoinkSystem : SharedBwoinkSystem [Dependency] private readonly IPlayerLocator _playerLocator = default!; [Dependency] private readonly GameTicker _gameTicker = default!; [Dependency] private readonly SharedMindSystem _minds = default!; + [Dependency] private readonly IAfkManager _afkManager = default!; private ISawmill _sawmill = default!; private readonly HttpClient _httpClient = new(); @@ -327,7 +329,7 @@ private WebhookPayload GeneratePayload(string messages, string username, string? username += $" ({characterName})"; // If no admins are online, set embed color to red. Otherwise green - var color = GetTargetAdmins().Count > 0 ? 0x41F097 : 0xFF0000; + var color = GetNonAfkAdmins().Count > 0 ? 0x41F097 : 0xFF0000; // Limit server name to 1500 characters, in case someone tries to be a little funny var serverName = _serverName[..Math.Min(_serverName.Length, 1500)]; @@ -471,7 +473,8 @@ protected override void OnBwoinkTextMessage(BwoinkTextMessage message, EntitySes { str = str[..(DescriptionMax - _maxAdditionalChars - unameLength)]; } - _messageQueues[msg.UserId].Enqueue(GenerateAHelpMessage(senderSession.Name, str, !personalChannel, _gameTicker.RoundDuration().ToString("hh\\:mm\\:ss"), _gameTicker.RunLevel, admins.Count == 0)); + var nonAfkAdmins = GetNonAfkAdmins(); + _messageQueues[msg.UserId].Enqueue(GenerateAHelpMessage(senderSession.Name, str, !personalChannel, _gameTicker.RoundDuration().ToString("hh\\:mm\\:ss"), _gameTicker.RunLevel, nonAfkAdmins.Count == 0)); } if (admins.Count != 0 || sendsWebhook) @@ -483,19 +486,26 @@ protected override void OnBwoinkTextMessage(BwoinkTextMessage message, EntitySes RaiseNetworkEvent(starMuteMsg, senderSession.Channel); } - // Returns all online admins with AHelp access + private IList GetNonAfkAdmins() + { + return _adminManager.ActiveAdmins + .Where(p => (_adminManager.GetAdminData(p)?.HasFlag(AdminFlags.Adminhelp) ?? false) && !_afkManager.IsAfk(p)) + .Select(p => p.Channel) + .ToList(); + } + private IList GetTargetAdmins() { return _adminManager.ActiveAdmins - .Where(p => _adminManager.GetAdminData(p)?.HasFlag(AdminFlags.Adminhelp) ?? false) - .Select(p => p.Channel) - .ToList(); + .Where(p => _adminManager.GetAdminData(p)?.HasFlag(AdminFlags.Adminhelp) ?? false) + .Select(p => p.Channel) + .ToList(); } private static string GenerateAHelpMessage(string username, string message, bool admin, string roundTime, GameRunLevel roundState, bool noReceivers = false) { var stringbuilder = new StringBuilder(); - + if (admin) stringbuilder.Append(":outbox_tray:"); else if (noReceivers) diff --git a/Content.Server/Afk/AfkManager.cs b/Content.Server/Afk/AfkManager.cs index 8f709043171..96dcb475cd8 100644 --- a/Content.Server/Afk/AfkManager.cs +++ b/Content.Server/Afk/AfkManager.cs @@ -1,4 +1,5 @@ -using Content.Shared.CCVar; +using Content.Server.Administration.Managers; +using Content.Shared.CCVar; using JetBrains.Annotations; using Robust.Server.Player; using Robust.Shared.Configuration; @@ -38,6 +39,7 @@ public sealed class AfkManager : IAfkManager [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly IConfigurationManager _cfg = default!; [Dependency] private readonly IConsoleHost _consoleHost = default!; + [Dependency] private readonly IAdminManager _adminManager = default!; private readonly Dictionary _lastActionTimes = new(); @@ -61,10 +63,15 @@ public void PlayerDidAction(ICommonSession player) public bool IsAfk(ICommonSession player) { if (!_lastActionTimes.TryGetValue(player, out var time)) + { // Some weird edge case like disconnected clients. Just say true I guess. return true; + } + + var timeOut = _adminManager.IsAdmin(player) + ? TimeSpan.FromSeconds(_cfg.GetCVar(CCVars.AdminAfkTime)) + : TimeSpan.FromSeconds(_cfg.GetCVar(CCVars.AfkTime)); - var timeOut = TimeSpan.FromSeconds(_cfg.GetCVar(CCVars.AfkTime)); return _gameTiming.RealTime - time > timeOut; } diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index a2660de9b34..a0a3f4f4db0 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -833,6 +833,12 @@ public static readonly CVarDef public static readonly CVarDef NewPlayerThreshold = CVarDef.Create("admin.new_player_threshold", 0, CVar.ARCHIVE | CVar.REPLICATED | CVar.SERVER); + /// + /// How long an admin client can go without any input before being considered AFK. + /// + public static readonly CVarDef AdminAfkTime = + CVarDef.Create("admin.afk_time", 600f, CVar.SERVERONLY); + /* * Explosions */ From 713b9d07f367c433b77679888317a37538cd479b Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 1 Feb 2024 13:04:55 +0000 Subject: [PATCH 140/266] Automatic changelog update (cherry picked from commit 3f4ddebef396f781682ec3eb5a2a6daae01b256f) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 4c58c79cfaa..66d2f7b61b5 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: DangerRevolution - changes: - - message: Extended emergency nitrogen tanks can now be found on the station. - type: Add - id: 5360 - time: '2023-12-14T04:35:39.0000000+00:00' - author: SlamBamActionman changes: - message: Discord bot Changelog now includes hyperlinks to the PRs. @@ -3858,3 +3852,10 @@ id: 5859 time: '2024-02-01T12:59:42.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24306 +- author: Repo + changes: + - message: AFK admins will trigger the SOS in aHelp relay. + type: Tweak + id: 5860 + time: '2024-02-01T13:03:50.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24482 From 2befc023c5b82aa777823a706f7d0be03b59bcd5 Mon Sep 17 00:00:00 2001 From: Rondalph Diggs <107864742+africalimedrop@users.noreply.github.com> Date: Thu, 1 Feb 2024 13:05:13 +0000 Subject: [PATCH 141/266] Minor bizzaresoft_flipped visual issues. (#24498) Fix gamebreaking bizzaresoft_flipped issue. * Icon now shows same detail, just from different perspective. * Cap now displays correct perspective when equipped. * Cap now displays correct perspective in hand. * Cap now appears in the same hand it's held in. (cherry picked from commit c989340c521f4d647c06942bb64ca2ac3e6099d4) --- .../bizarresoft_flipped.rsi/equipped-HELMET.png | Bin 418 -> 223 bytes .../Head/Soft/bizarresoft_flipped.rsi/icon.png | Bin 392 -> 231 bytes .../bizarresoft_flipped.rsi/inhand-left.png | Bin 411 -> 211 bytes .../bizarresoft_flipped.rsi/inhand-right.png | Bin 458 -> 212 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Resources/Textures/Clothing/Head/Soft/bizarresoft_flipped.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Soft/bizarresoft_flipped.rsi/equipped-HELMET.png index fc6c43c930706110a1cb5f5135eb2f49b3fd1fec..34450fb75cec3ed0968b986c35d1f2ae07e51a9f 100644 GIT binary patch delta 207 zcmZ3)e4lZGL_G^L0|P^Zd(K-Rr5NB7;tHhy|NsAK8_TEZEXrKA@|>p99C~8xYC^2? zf~>N}1FA#e$$5OcUd|X`Ls)SYDuUS&+ zc6V1WcQtu>d1-K+aXlj%AmXF1?;bcIWzCd^>%K7_tHTU=6eL&|Cx|GVYG$gbX>$^u zUXW6^vU{^dSCf*eYH7`%(5DU!It-64uVVnKV_+y37T>li_~vAw#SEUVelF{r5}E)+ C8ATTW delta 404 zcmcc5xQKazL_G%^0|UdV%))y>im^Dz-HBn{IhmJ0c8sTsV@SoEx3~PgnH(k9J{&J) zyL&*)c88-5x2SaK3+XS4uO?T%_6~91UH(!-MC6!~N68I7SFat5zLsgQ#%iYr=-b*$ zOsl;)vwVhq^-RVW^`~!!tP)e2*=PIp{n}fb0N)m2m(PphyVl0=o^0-5=zTi#Ae>#=s9nR?~$!yUX}GRF~@&zOzsZRb$MiU z&*j~YYfh8Q)_#(XpTN-Yu9eMcL1C4t;C;(mn=;ScI2)NPiT(D04ph?6Onr7b18)f#J^J>FVdQ&MBb@0JnjxwEzGB diff --git a/Resources/Textures/Clothing/Head/Soft/bizarresoft_flipped.rsi/icon.png b/Resources/Textures/Clothing/Head/Soft/bizarresoft_flipped.rsi/icon.png index bb759bf4f2ca6118e3da720c001a08d71144d583..a5bc9ed7424cc82a0214a76e76aa47f6b2a750f0 100644 GIT binary patch delta 215 zcmV;|04V>61Lpyd7=Hu<0001iRAnPF87$eN~yhOR>K&Z*2wnYy@^z`9&9NyT0XRVKO#5iP=< zS9KrSf9nZ9BXZ7WSl+(Y6TxR;sf2=hw>1b}uCm8RApsTh^ez6HS7 z7pWqBPWd?`p99C~8xYC^2? zf~>N}1FA$YrUEEOo%*WttTwGu5!4UE5 zoC>?{y6$0I-Q?-zmB9K+=^0yusE@uryS9f>nAZWD*JA5JSF^?b=xGWx;7V|HVT@y4 ts(0>Dg{X+8=E}#R0embWddzN&4A!NB>+X1;{0_8?!PC{xWt~$(697*fJ+c4* delta 397 zcmV;80doG+0hr~F0004VQb$4nuFf3k00041Nkl0K#fRk}ND znSlU+Yxn?w$5AM_ZbL2R(r?$xF22?ssOX@Wa8=jYbn#9 zl#+6lpSfGlqksPLmoE{~s?q*rj^kK&mvco?v{3uHrg2mj6Y$>yAR;0nA|fIpBKljE z`d*j!-vRKme-CC==AEEth0-71AUWy6HT>z~)Ei$WrijW^fM diff --git a/Resources/Textures/Clothing/Head/Soft/bizarresoft_flipped.rsi/inhand-right.png b/Resources/Textures/Clothing/Head/Soft/bizarresoft_flipped.rsi/inhand-right.png index ec0fb5b2c89f182502610d1fb42e9e0367c3ce9f..c0ea3e083da002509e2825acaf729fedcc930a62 100644 GIT binary patch delta 196 zcmX@be1&m>L_G^L0|P^Zd(K-Rr5NB7;tHhy|NsAK8_TEZEXrKA@|>p99C~8xYC^2? zf~>N}1FEEo}UEEOo%xBG`H&34m919V@ z&Ur&*%kB>I2Fb}&rfkp(5H~buFkUu&dUEK5lr>WtY_I3WtPZF#rGn delta 444 zcmV;t0Ym=O0m=iA7=H)`00020X>r~F0004VQb$4nuFf3k0004mNklM!x zbaRTo5A5>5vpswE-+!?GA4Eh%L_|bHL}amq{5WaMNZNm6Z+~Ae{c9DA#i6;TX%dfQ z2l8J(pF&P~rfH5}C=i|~+d<4o+Uwyh!l7tC*0x&!_U|SPvuUJkfJUoAX7vyNtJC<2 zd;Y*YZveo<2 Date: Thu, 1 Feb 2024 15:08:03 +0200 Subject: [PATCH 142/266] Rev Components are no longer leaked + Rev and Zombie icon visibility to ghosts is now controlled by a cvar (#22194) * Initial work on having the Rev icons not be visible to ghosts depending on a Cvar and a component. This commit just makes it so that the revcomponent and headrev component are not shared with clients that shouldn't know about them. This is due to the concern that clients having access to those components, even if no image was displayed could allow modified clients to have meta knowledge of revs. Currently this has the issue that if a player later for example becomes a rev, none of the existing rev components get networked to them. I am not sure there is currently an effecient solution to this. This is probably in an issue for a lot more stuff. I might just make it so all the logic just moves to the client on whether to put the icon again. Also this commit adds the ShowRevIconsComponent to allow anyone with it to just view rev icons. * Rev components now get communicated to clients that didn't have them previously and the AntagIconSystem is now properly checking whether to give the icons. We now dirty all the rev/headrev components when someone gets converted or gets the ViewRevIcons component. The AntagIconSystem now checks whether it should draw the icons mostly based on an event, this is still done client side. This is not a full proof solution to make it so clients can't know someone is an antag when they shouldn't because: 1. There are other components that need similar treatment, to my knowledge not to for revs but for other antags. Maybe even the mind component. This could be addressed in future PRs. 2. We cannot ensure that clients forget about these components if the client gets deconverted for example. We can of course have code that does this, but it will necessarily need to be done on the client and if the client is modified then there is no way to ensure this. Of course at that point they should already know who their fellow revs are so this might not be an issue. I now need to do the same thing for zombies in a future commit. A similar system for nukies also needs to be looked at but I will not be doing that in the PR this commit ends up in. * Misc name changes and cleaning up the ZombieSystem Changed some names around and decoupled the ZombieSystem from the AntagStatusIconsystem. Now there is a cvar for ghost visibility for them as well. The Zombie Component was not made SessionSpecific because: 1. Zombies are pretty visible anyways 2. The Component is needed to change the appearance of zombie players. * Misc name changes and cleaning up the ZombieSystem Changed some names around and decoupled the ZombieSystem from the AntagStatusIconsystem. Now there is a cvar for ghost visibility for them as well. The Zombie Component was not made SessionSpecific because: 1. Zombies are pretty visible anyways 2. The Component is needed to change the appearance of zombie players. * Merged 2 if statements into 1 on the Zombiesystem. * Cut down on code duplication in AntagStatusIconSystem Now instead of having a seperate function for each component, there is 1 generic function. Functions for special cases like the Rev/Headrev comp can have a separate function that does the special check and then calls the generic one. This is done through the IAntagStatusIconComponent interface which provides a common interface to get the Icon. * Removed some duplication from the SharedRevolutionarySystem with generics. I have no idea why I didn't think of this sooner. * Addressed Reviews I think I think events get unsubbed automatically but I am probably missing something that I have not understood. Either way this is a requested change. * Replace war crimes with actual fixes for reviews It was not clear to me what the reviews meant * Addressed reviews by removing need for cvars. Whether icons are visible to ghosts is now determined by a bool in IAntagStatusIcon which all antag components with status icons should implement. * Update Content.Shared/Revolutionary/SharedRevolutionarySystem.cs --------- Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> (cherry picked from commit 8b19b7fab9dd8fb115f65794d97a26ebb9aa1142) --- Content.Client/Antag/AntagStatusIconSystem.cs | 42 ++++++++--- .../Revolutionary/RevolutionarySystem.cs | 33 +++++---- Content.Client/Zombies/ZombieSystem.cs | 20 ++++-- .../Antag/IAntagStatusIconComponent.cs | 12 ++++ .../Components/HeadRevolutionaryComponent.cs | 10 ++- .../Components/RevolutionaryComponent.cs | 10 ++- .../Components/ShowRevIconsComponent.cs | 11 +++ .../SharedRevolutionarySystem.cs | 69 +++++++++++++++++++ .../Components/StatusIconComponent.cs | 12 ++++ .../Zombies/ShowZombieIconsComponent.cs | 12 ++++ Content.Shared/Zombies/ZombieComponent.cs | 10 ++- .../Entities/Mobs/Player/admin_ghost.yml | 2 + 12 files changed, 208 insertions(+), 35 deletions(-) create mode 100644 Content.Shared/Antag/IAntagStatusIconComponent.cs create mode 100644 Content.Shared/Revolutionary/Components/ShowRevIconsComponent.cs create mode 100644 Content.Shared/Zombies/ShowZombieIconsComponent.cs diff --git a/Content.Client/Antag/AntagStatusIconSystem.cs b/Content.Client/Antag/AntagStatusIconSystem.cs index bf3955b49ab..5d87837893c 100644 --- a/Content.Client/Antag/AntagStatusIconSystem.cs +++ b/Content.Client/Antag/AntagStatusIconSystem.cs @@ -1,6 +1,8 @@ -using Content.Shared.Ghost; +using Content.Shared.Antag; +using Content.Shared.Revolutionary.Components; using Content.Shared.StatusIcon; using Content.Shared.StatusIcon.Components; +using Content.Shared.Zombies; using Robust.Client.Player; using Robust.Shared.Prototypes; @@ -9,24 +11,44 @@ namespace Content.Client.Antag; /// /// Used for assigning specified icons for antags. /// -public abstract class AntagStatusIconSystem : SharedStatusIconSystem - where T : IComponent +public sealed class AntagStatusIconSystem : SharedStatusIconSystem { [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly IPlayerManager _player = default!; + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(GetRevIcon); + SubscribeLocalEvent(GetIcon); + SubscribeLocalEvent(GetIcon); + } /// - /// Will check if the local player has the same component as the one who called it and give the status icon. + /// Adds a Status Icon on an entity if the player is supposed to see it. /// - /// The status icon that your antag uses - /// The GetStatusIcon event. - protected virtual void GetStatusIcon(string antagStatusIcon, ref GetStatusIconsEvent args) + private void GetIcon(EntityUid uid, T comp, ref GetStatusIconsEvent ev) where T: IAntagStatusIconComponent { - var ent = _player.LocalPlayer?.ControlledEntity; + var ent = _player.LocalSession?.AttachedEntity; + + var canEv = new CanDisplayStatusIconsEvent(ent); + RaiseLocalEvent(uid, ref canEv); + + if (!canEv.Cancelled) + ev.StatusIcons.Add(_prototype.Index(comp.StatusIcon)); + } - if (!HasComp(ent) && !HasComp(ent)) + + /// + /// Adds the Rev Icon on an entity if the player is supposed to see it. This additional function is needed to deal + /// with a special case where if someone is a head rev we only want to display the headrev icon. + /// + private void GetRevIcon(EntityUid uid, RevolutionaryComponent comp, ref GetStatusIconsEvent ev) + { + if (HasComp(uid)) return; - args.StatusIcons.Add(_prototype.Index(antagStatusIcon)); + GetIcon(uid, comp, ref ev); + } } diff --git a/Content.Client/Revolutionary/RevolutionarySystem.cs b/Content.Client/Revolutionary/RevolutionarySystem.cs index 0818b14bc04..682c73f93e7 100644 --- a/Content.Client/Revolutionary/RevolutionarySystem.cs +++ b/Content.Client/Revolutionary/RevolutionarySystem.cs @@ -1,5 +1,6 @@ +using Content.Shared.Antag; using Content.Shared.Revolutionary.Components; -using Content.Client.Antag; +using Content.Shared.Ghost; using Content.Shared.StatusIcon.Components; namespace Content.Client.Revolutionary; @@ -7,29 +8,37 @@ namespace Content.Client.Revolutionary; /// /// Used for the client to get status icons from other revs. /// -public sealed class RevolutionarySystem : AntagStatusIconSystem +public sealed class RevolutionarySystem : EntitySystem { + public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(GetRevIcon); - SubscribeLocalEvent(GetHeadRevIcon); + SubscribeLocalEvent(OnCanShowRevIcon); + SubscribeLocalEvent(OnCanShowRevIcon); } /// - /// Checks if the person who triggers the GetStatusIcon event is also a Rev or a HeadRev. + /// Determine whether a client should display the rev icon. /// - private void GetRevIcon(EntityUid uid, RevolutionaryComponent comp, ref GetStatusIconsEvent args) + private void OnCanShowRevIcon(EntityUid uid, T comp, ref CanDisplayStatusIconsEvent args) where T : IAntagStatusIconComponent { - if (!HasComp(uid)) - { - GetStatusIcon(comp.RevStatusIcon, ref args); - } + args.Cancelled = !CanDisplayIcon(args.User, comp.IconVisibleToGhost); } - private void GetHeadRevIcon(EntityUid uid, HeadRevolutionaryComponent comp, ref GetStatusIconsEvent args) + /// + /// The criteria that determine whether a client should see Rev/Head rev icons. + /// + private bool CanDisplayIcon(EntityUid? uid, bool visibleToGhost) { - GetStatusIcon(comp.HeadRevStatusIcon, ref args); + if (HasComp(uid) || HasComp(uid)) + return true; + + if (visibleToGhost && HasComp(uid)) + return true; + + return HasComp(uid); } + } diff --git a/Content.Client/Zombies/ZombieSystem.cs b/Content.Client/Zombies/ZombieSystem.cs index 6d0355f6f8d..bd89e978c70 100644 --- a/Content.Client/Zombies/ZombieSystem.cs +++ b/Content.Client/Zombies/ZombieSystem.cs @@ -1,5 +1,5 @@ using System.Linq; -using Content.Client.Antag; +using Content.Shared.Ghost; using Content.Shared.Humanoid; using Content.Shared.StatusIcon.Components; using Content.Shared.Zombies; @@ -7,15 +7,14 @@ namespace Content.Client.Zombies; -public sealed class ZombieSystem : AntagStatusIconSystem +public sealed class ZombieSystem : EntitySystem { - public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnStartup); - SubscribeLocalEvent(OnGetStatusIcon); + SubscribeLocalEvent(OnCanDisplayStatusIcons); } private void OnStartup(EntityUid uid, ZombieComponent component, ComponentStartup args) @@ -32,8 +31,17 @@ private void OnStartup(EntityUid uid, ZombieComponent component, ComponentStartu } } - private void OnGetStatusIcon(EntityUid uid, ZombieComponent component, ref GetStatusIconsEvent args) + /// + /// Determines whether a player should be able to see the StatusIcon for zombies. + /// + private void OnCanDisplayStatusIcons(EntityUid uid, ZombieComponent component, ref CanDisplayStatusIconsEvent args) { - GetStatusIcon(component.ZombieStatusIcon, ref args); + if (HasComp(args.User) || HasComp(args.User)) + return; + + if (component.IconVisibleToGhost && HasComp(args.User)) + return; + + args.Cancelled = true; } } diff --git a/Content.Shared/Antag/IAntagStatusIconComponent.cs b/Content.Shared/Antag/IAntagStatusIconComponent.cs new file mode 100644 index 00000000000..981937c9163 --- /dev/null +++ b/Content.Shared/Antag/IAntagStatusIconComponent.cs @@ -0,0 +1,12 @@ +using Content.Shared.StatusIcon; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Antag; + +public interface IAntagStatusIconComponent +{ + public ProtoId StatusIcon { get; set; } + + public bool IconVisibleToGhost { get; set; } +} + diff --git a/Content.Shared/Revolutionary/Components/HeadRevolutionaryComponent.cs b/Content.Shared/Revolutionary/Components/HeadRevolutionaryComponent.cs index 48d7c230975..d2c8374fefe 100644 --- a/Content.Shared/Revolutionary/Components/HeadRevolutionaryComponent.cs +++ b/Content.Shared/Revolutionary/Components/HeadRevolutionaryComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.Antag; using Robust.Shared.GameStates; using Content.Shared.StatusIcon; using Robust.Shared.Prototypes; @@ -8,17 +9,22 @@ namespace Content.Shared.Revolutionary.Components; /// Component used for marking a Head Rev for conversion and winning/losing. /// [RegisterComponent, NetworkedComponent, Access(typeof(SharedRevolutionarySystem))] -public sealed partial class HeadRevolutionaryComponent : Component +public sealed partial class HeadRevolutionaryComponent : Component, IAntagStatusIconComponent { /// /// The status icon corresponding to the head revolutionary. /// [DataField, ViewVariables(VVAccess.ReadWrite)] - public ProtoId HeadRevStatusIcon = "HeadRevolutionaryFaction"; + public ProtoId StatusIcon { get; set; } = "HeadRevolutionaryFaction"; /// /// How long the stun will last after the user is converted. /// [DataField, ViewVariables(VVAccess.ReadWrite)] public TimeSpan StunTime = TimeSpan.FromSeconds(3); + + public override bool SessionSpecific => true; + + [DataField] + public bool IconVisibleToGhost { get; set; } = true; } diff --git a/Content.Shared/Revolutionary/Components/RevolutionaryComponent.cs b/Content.Shared/Revolutionary/Components/RevolutionaryComponent.cs index e55c87786b2..587c148dd75 100644 --- a/Content.Shared/Revolutionary/Components/RevolutionaryComponent.cs +++ b/Content.Shared/Revolutionary/Components/RevolutionaryComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.Antag; using Robust.Shared.GameStates; using Content.Shared.StatusIcon; using Robust.Shared.Prototypes; @@ -8,11 +9,16 @@ namespace Content.Shared.Revolutionary.Components; /// Used for marking regular revs as well as storing icon prototypes so you can see fellow revs. /// [RegisterComponent, NetworkedComponent, Access(typeof(SharedRevolutionarySystem))] -public sealed partial class RevolutionaryComponent : Component +public sealed partial class RevolutionaryComponent : Component, IAntagStatusIconComponent { /// /// The status icon prototype displayed for revolutionaries /// [DataField, ViewVariables(VVAccess.ReadWrite)] - public ProtoId RevStatusIcon = "RevolutionaryFaction"; + public ProtoId StatusIcon { get; set; } = "RevolutionaryFaction"; + + public override bool SessionSpecific => true; + + [DataField] + public bool IconVisibleToGhost { get; set; } = true; } diff --git a/Content.Shared/Revolutionary/Components/ShowRevIconsComponent.cs b/Content.Shared/Revolutionary/Components/ShowRevIconsComponent.cs new file mode 100644 index 00000000000..11e20db3f89 --- /dev/null +++ b/Content.Shared/Revolutionary/Components/ShowRevIconsComponent.cs @@ -0,0 +1,11 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Revolutionary.Components; + +/// +/// Determines whether Someone can see rev/headrev icons on revs. +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class ShowRevIconsComponent: Component +{ +} diff --git a/Content.Shared/Revolutionary/SharedRevolutionarySystem.cs b/Content.Shared/Revolutionary/SharedRevolutionarySystem.cs index 1399b116e0f..ddaf73fcc9f 100644 --- a/Content.Shared/Revolutionary/SharedRevolutionarySystem.cs +++ b/Content.Shared/Revolutionary/SharedRevolutionarySystem.cs @@ -1,8 +1,11 @@ +using Content.Shared.Ghost; using Content.Shared.IdentityManagement; using Content.Shared.Mindshield.Components; using Content.Shared.Popups; using Content.Shared.Revolutionary.Components; using Content.Shared.Stunnable; +using Robust.Shared.GameStates; +using Robust.Shared.Player; namespace Content.Shared.Revolutionary; @@ -14,7 +17,13 @@ public sealed class SharedRevolutionarySystem : EntitySystem public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(MindShieldImplanted); + SubscribeLocalEvent(OnRevCompGetStateAttempt); + SubscribeLocalEvent(OnRevCompGetStateAttempt); + SubscribeLocalEvent(DirtyRevComps); + SubscribeLocalEvent(DirtyRevComps); + SubscribeLocalEvent(DirtyRevComps); } /// @@ -37,4 +46,64 @@ private void MindShieldImplanted(EntityUid uid, MindShieldComponent comp, MapIni _popupSystem.PopupEntity(Loc.GetString("rev-break-control", ("name", name)), uid); } } + + /// + /// Determines if a HeadRev component should be sent to the client. + /// + private void OnRevCompGetStateAttempt(EntityUid uid, HeadRevolutionaryComponent comp, ref ComponentGetStateAttemptEvent args) + { + args.Cancelled = !CanGetState(args.Player, comp.IconVisibleToGhost); + } + + /// + /// Determines if a Rev component should be sent to the client. + /// + private void OnRevCompGetStateAttempt(EntityUid uid, RevolutionaryComponent comp, ref ComponentGetStateAttemptEvent args) + { + args.Cancelled = !CanGetState(args.Player, comp.IconVisibleToGhost); + } + + /// + /// The criteria that determine whether a Rev/HeadRev component should be sent to a client. + /// + /// The Player the component will be sent to. + /// Whether the component permits the icon to be visible to observers. + /// + private bool CanGetState(ICommonSession? player, bool visibleToGhosts) + { + //Apparently this can be null in replays so I am just returning true. + if (player is null) + return true; + + var uid = player.AttachedEntity; + + if (HasComp(uid) || HasComp(uid)) + return true; + + if (visibleToGhosts && HasComp(uid)) + return true; + + return HasComp(uid); + } + /// + /// Dirties all the Rev components so they are sent to clients. + /// + /// We need to do this because if a rev component was not earlier sent to a client and for example the client + /// becomes a rev then we need to send all the components to it. To my knowledge there is no way to do this on a + /// per client basis so we are just dirtying all the components. + /// + private void DirtyRevComps(EntityUid someUid, T someComp, ComponentStartup ev) + { + var revComps = AllEntityQuery(); + while (revComps.MoveNext(out var uid, out var comp)) + { + Dirty(uid, comp); + } + + var headRevComps = AllEntityQuery(); + while (headRevComps.MoveNext(out var uid, out var comp)) + { + Dirty(uid, comp); + } + } } diff --git a/Content.Shared/StatusIcon/Components/StatusIconComponent.cs b/Content.Shared/StatusIcon/Components/StatusIconComponent.cs index 9efe9731c8b..385f9760c65 100644 --- a/Content.Shared/StatusIcon/Components/StatusIconComponent.cs +++ b/Content.Shared/StatusIcon/Components/StatusIconComponent.cs @@ -25,3 +25,15 @@ public sealed partial class StatusIconComponent : Component /// [ByRefEvent] public record struct GetStatusIconsEvent(List StatusIcons, bool InContainer); + +/// +/// Event raised on the Client-side to determine whether to display a status icon on an entity. +/// +/// The player that will see the icons +[ByRefEvent] +public record struct CanDisplayStatusIconsEvent(EntityUid? User = null) +{ + public EntityUid? User = User; + + public bool Cancelled = false; +} diff --git a/Content.Shared/Zombies/ShowZombieIconsComponent.cs b/Content.Shared/Zombies/ShowZombieIconsComponent.cs new file mode 100644 index 00000000000..a2bc85c0746 --- /dev/null +++ b/Content.Shared/Zombies/ShowZombieIconsComponent.cs @@ -0,0 +1,12 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Zombies; + +/// +/// Makes it so an entity can view ZombieAntagIcons. +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class ShowZombieIconsComponent: Component +{ + +} diff --git a/Content.Shared/Zombies/ZombieComponent.cs b/Content.Shared/Zombies/ZombieComponent.cs index bb1f6bec5f1..5ae441b1327 100644 --- a/Content.Shared/Zombies/ZombieComponent.cs +++ b/Content.Shared/Zombies/ZombieComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.Antag; using Content.Shared.Chat.Prototypes; using Content.Shared.Chemistry.Reagent; using Content.Shared.Damage; @@ -13,7 +14,7 @@ namespace Content.Shared.Zombies; [RegisterComponent, NetworkedComponent] -public sealed partial class ZombieComponent : Component +public sealed partial class ZombieComponent : Component, IAntagStatusIconComponent { /// /// The baseline infection chance you have if you are completely nude @@ -93,8 +94,11 @@ public sealed partial class ZombieComponent : Component [DataField("nextTick", customTypeSerializer:typeof(TimeOffsetSerializer))] public TimeSpan NextTick; - [DataField("zombieStatusIcon", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string ZombieStatusIcon = "ZombieFaction"; + [DataField("zombieStatusIcon")] + public ProtoId StatusIcon { get; set; } = "ZombieFaction"; + + [DataField] + public bool IconVisibleToGhost { get; set; } = true; /// /// Healing each second diff --git a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml index 1583801e987..364d26dddbc 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml @@ -89,6 +89,8 @@ - type: Stripping - type: SolutionScanner - type: IgnoreUIRange + - type: ShowRevIcons + - type: ShowZombieIcons - type: Inventory templateId: aghost - type: InventorySlots From a08f6f4888db82e69b692ad935c8556519c93c88 Mon Sep 17 00:00:00 2001 From: lunarcomets <140772713+lunarcomets@users.noreply.github.com> Date: Thu, 1 Feb 2024 05:24:17 -0800 Subject: [PATCH 143/266] add lizard speech bubble (#23365) * add bubble sprites and yaml changes * fixed issues * lizardified names * more fixes, got rid of error * add indicator to kobolds * updated sprites (removed notch, brightened colours) (cherry picked from commit 4520ac8c9ba8030f7b25b39a6f04a89e6106b0b1) --- .../Prototypes/Entities/Mobs/NPCs/animals.yml | 2 ++ .../Entities/Mobs/Species/reptilian.yml | 2 ++ Resources/Prototypes/typing_indicator.yml | 5 +++++ .../Textures/Effects/speech.rsi/lizard0.png | Bin 0 -> 419 bytes .../Textures/Effects/speech.rsi/lizard1.png | Bin 0 -> 289 bytes .../Textures/Effects/speech.rsi/lizard2.png | Bin 0 -> 283 bytes .../Textures/Effects/speech.rsi/meta.json | 19 +++++++++++++++++- 7 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 Resources/Textures/Effects/speech.rsi/lizard0.png create mode 100644 Resources/Textures/Effects/speech.rsi/lizard1.png create mode 100644 Resources/Textures/Effects/speech.rsi/lizard2.png diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index d19ea7196c6..395f9a36130 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -1348,6 +1348,8 @@ Male: UnisexReptilian Female: UnisexReptilian Unsexed: UnisexReptilian + - type: TypingIndicator + proto: lizard - type: InteractionPopup successChance: 0.9 interactSuccessString: petting-success-monkey diff --git a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml index 9f482c6e2f2..c893fab4491 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml @@ -29,6 +29,8 @@ - type: Speech speechSounds: Lizard speechVerb: Reptilian + - type: TypingIndicator + proto: lizard - type: Vocal sounds: Male: UnisexReptilian diff --git a/Resources/Prototypes/typing_indicator.yml b/Resources/Prototypes/typing_indicator.yml index b7e6768448f..3a0484fc0b3 100644 --- a/Resources/Prototypes/typing_indicator.yml +++ b/Resources/Prototypes/typing_indicator.yml @@ -34,6 +34,11 @@ typingState: spider0 offset: 0, 0.125 +- type: typingIndicator + id: lizard + typingState: lizard0 + offset: 0, 0.0625 + - type: typingIndicator id: slime typingState: slime0 diff --git a/Resources/Textures/Effects/speech.rsi/lizard0.png b/Resources/Textures/Effects/speech.rsi/lizard0.png new file mode 100644 index 0000000000000000000000000000000000000000..a05ea40f21b3ec7a9eae61463288b9353c3a7a80 GIT binary patch literal 419 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zojqL~Ln`LH zy|v%J*+JsiNB7eKGw$5Yn&Bbqd-;eX`~QsgG6O|lcJ|qRYF4H1S#;Q@%W2wAIastl zbKm^8e219X*;T%KvHO3Y9JK$%?SJ86KO3zpYK$i?DcUZ-wQSeEUz2YC`}3)=@YUoE zXZZW1cmMS$|LjsZQB%e}^uN_zExXiL{5qdjU-Vg4cvDo*vvOkQ=U*$|KKuKm{Jz!y zO*b!!-g_f`Nvrnrta#~$Jtv~9f9$E~{&S0=mx8(o; literal 0 HcmV?d00001 diff --git a/Resources/Textures/Effects/speech.rsi/lizard1.png b/Resources/Textures/Effects/speech.rsi/lizard1.png new file mode 100644 index 0000000000000000000000000000000000000000..bc2f151dde860f76a3a0a21f0bacc878c7735de5 GIT binary patch literal 289 zcmV++0p9+JP)Px#+et)0R9J=W)V~XYKo|z#w-8ZjZ#M)tu_110IEVh|h8ltp2P2o98rs}NrNtKS z$P)^}tA_8Hj=RI}$K45ZHfy)V3-8uHWr&Y^3l{*|qBIAa=CeD*`u1?0jGll{lqQxd zA9Yi~wj4R1CONz@qdt+<1fk!G;PEk&8+gP}Hx(|~4d+unYV`mxRVQrA0go7X!~kH> z4Xp{(O(nPx#)k#D_R9J=W)V~XYKoke?Zy}=6-fjqPVnehv)X*Q@phJr|7`Eip(B>{GEw=cM z^Mr!%sNsDkc_;VYyI(->xN|$a@oD^922Jj*Tmb0G${hW)Ts%SJr}KR_c>$!XOsqFP znzn{*IU=5=1-vP&)0-ClK z-_*U% Date: Thu, 1 Feb 2024 07:29:01 -0600 Subject: [PATCH 144/266] Move grenade components to shared (#22691) * Moves FlashComponent.cs, FlashOnTriggerComponent.cs, and SmokeOnTriggerComponent.cs to Shared * Moves ExplodeOnTriggerComponent.cs, OnUseTimerTriggerComponent.cs, ActiveTimerTriggerComponent.cs, and SmokeOnTriggerComponent.cs to Shared * Delete .run/Content Server+Client.run.xml HOW DID THIS GET IN HERE ITS NOT AHHHH * Update Content.Client/Explosion/SmokeOnTriggerSystem.cs Co-authored-by: DrSmugleaf * Update Content.Shared/Explosion/Components/ActiveTimerTriggerComponent.cs Co-authored-by: DrSmugleaf * Update Content.Shared/Explosion/Components/OnUseTimerTriggerComponent.cs Co-authored-by: DrSmugleaf * Update Content.Shared/Explosion/Components/OnUseTimerTriggerComponent.cs Co-authored-by: DrSmugleaf * Update Content.Shared/Explosion/EntitySystems/SharedTriggerSystem.cs Co-authored-by: DrSmugleaf * Update Content.Shared/Explosion/EntitySystems/SharedSmokeOnTriggerSystem.cs Co-authored-by: DrSmugleaf * Update ExplodeOnTriggerComponent.cs * Revert "Delete .run/Content Server+Client.run.xml" This reverts commit 29ee05f57de60eab5c92158d8eba5e3acba483c2. * Fix? * cannot figure out how to get this to go back please forgive * Fixes a network issue * leftovers * Fixes --------- Co-authored-by: DrSmugleaf Co-authored-by: metalgearsloth (cherry picked from commit 467e983ba972a7ae749c95448febd19c7c285514) --- .run/Content Server+Client.run.xml | 2 +- .../ClusterGrenadeVisualizerSystem.cs | 1 + Content.Client/Explosion/ExplosionOverlay.cs | 2 +- .../Explosion/ExplosionOverlaySystem.cs | 1 + .../Explosion/SmokeOnTriggerSystem.cs | 7 ++++ .../Explosion/TriggerOnProximityComponent.cs | 1 + .../Tests/Payload/ModularGrenadeTests.cs | 1 + .../Defusable/Systems/DefusableSystem.cs | 2 ++ .../Components/ActiveTimerTriggerComponent.cs | 25 --------------- .../Components/TriggerOnProximityComponent.cs | 1 + .../EntitySystems/ClusterGrenadeSystem.cs | 2 ++ .../EntitySystems/ExplosionSystem.GridMap.cs | 1 + .../ExplosionSystem.Processing.cs | 1 + .../EntitySystems/ExplosionSystem.TileFill.cs | 1 + .../EntitySystems/ExplosionSystem.Visuals.cs | 1 + .../EntitySystems/SmokeOnTriggerSystem.cs | 6 ++-- .../EntitySystems/TriggerSystem.Mobstate.cs | 1 + .../EntitySystems/TriggerSystem.OnUse.cs | 1 + .../Explosion/EntitySystems/TriggerSystem.cs | 4 ++- .../Components/FlashOnTriggerComponent.cs | 12 ------- Content.Server/Flash/FlashSystem.cs | 1 + .../Nutrition/EntitySystems/CreamPieSystem.cs | 1 + .../Administration/SpawnExplosionEuiMsg.cs | 1 + .../Components/ActiveTimerTriggerComponent.cs | 21 ++++++++++++ .../ExplosionVisualsComponent.cs | 2 +- .../OnTrigger/ExplodeOnTriggerComponent.cs | 6 ++-- .../OnTrigger/SmokeOnTriggerComponent.cs | 7 ++-- .../Components/OnUseTimerTriggerComponent.cs | 32 +++++++------------ .../SharedClusterGrenadeComponent.cs | 2 +- .../SharedTriggerOnProximityComponent.cs | 2 +- .../SharedSmokeOnTriggerSystem.cs | 6 ++++ .../EntitySystems/SharedTriggerSystem.cs | 6 ++++ .../Flash/Components/FlashComponent.cs | 6 ++-- .../Components/FlashOnTriggerComponent.cs | 13 ++++++++ .../Objects/Devices/Electronics/triggers.yml | 7 ++-- .../Objects/Misc/subdermal_implants.yml | 7 ++-- .../Objects/Specific/Janitorial/janitor.yml | 7 ++-- .../Entities/Objects/Weapons/Bombs/funny.yml | 7 ++-- .../Entities/Objects/Weapons/Bombs/ied.yml | 3 +- .../Entities/Objects/Weapons/security.yml | 1 - 40 files changed, 125 insertions(+), 86 deletions(-) create mode 100644 Content.Client/Explosion/SmokeOnTriggerSystem.cs delete mode 100644 Content.Server/Explosion/Components/ActiveTimerTriggerComponent.cs delete mode 100644 Content.Server/Flash/Components/FlashOnTriggerComponent.cs create mode 100644 Content.Shared/Explosion/Components/ActiveTimerTriggerComponent.cs rename Content.Shared/Explosion/{ => Components}/ExplosionVisualsComponent.cs (97%) rename {Content.Server => Content.Shared}/Explosion/Components/OnTrigger/ExplodeOnTriggerComponent.cs (57%) rename {Content.Server => Content.Shared}/Explosion/Components/OnTrigger/SmokeOnTriggerComponent.cs (85%) rename {Content.Server => Content.Shared}/Explosion/Components/OnUseTimerTriggerComponent.cs (59%) rename Content.Shared/Explosion/{ => Components}/SharedClusterGrenadeComponent.cs (77%) rename Content.Shared/Explosion/{ => Components}/SharedTriggerOnProximityComponent.cs (74%) create mode 100644 Content.Shared/Explosion/EntitySystems/SharedSmokeOnTriggerSystem.cs create mode 100644 Content.Shared/Explosion/EntitySystems/SharedTriggerSystem.cs rename {Content.Server => Content.Shared}/Flash/Components/FlashComponent.cs (83%) create mode 100644 Content.Shared/Flash/Components/FlashOnTriggerComponent.cs diff --git a/.run/Content Server+Client.run.xml b/.run/Content Server+Client.run.xml index 0ec9bf16a75..191d737ccff 100644 --- a/.run/Content Server+Client.run.xml +++ b/.run/Content Server+Client.run.xml @@ -1,4 +1,4 @@ - + diff --git a/Content.Client/Explosion/ClusterGrenadeVisualizerSystem.cs b/Content.Client/Explosion/ClusterGrenadeVisualizerSystem.cs index 1e35cb6b592..c8171742dc2 100644 --- a/Content.Client/Explosion/ClusterGrenadeVisualizerSystem.cs +++ b/Content.Client/Explosion/ClusterGrenadeVisualizerSystem.cs @@ -1,4 +1,5 @@ using Content.Shared.Explosion; +using Content.Shared.Explosion.Components; using Robust.Client.GameObjects; namespace Content.Client.Explosion; diff --git a/Content.Client/Explosion/ExplosionOverlay.cs b/Content.Client/Explosion/ExplosionOverlay.cs index 2ab84d4438a..94e8ca59823 100644 --- a/Content.Client/Explosion/ExplosionOverlay.cs +++ b/Content.Client/Explosion/ExplosionOverlay.cs @@ -1,5 +1,5 @@ using System.Numerics; -using Content.Shared.Explosion; +using Content.Shared.Explosion.Components; using JetBrains.Annotations; using Robust.Client.Graphics; using Robust.Shared.Enums; diff --git a/Content.Client/Explosion/ExplosionOverlaySystem.cs b/Content.Client/Explosion/ExplosionOverlaySystem.cs index 7ced95d2c1f..fe552af0e79 100644 --- a/Content.Client/Explosion/ExplosionOverlaySystem.cs +++ b/Content.Client/Explosion/ExplosionOverlaySystem.cs @@ -1,4 +1,5 @@ using Content.Shared.Explosion; +using Content.Shared.Explosion.Components; using Robust.Client.Graphics; using Robust.Client.ResourceManagement; using Robust.Shared.GameStates; diff --git a/Content.Client/Explosion/SmokeOnTriggerSystem.cs b/Content.Client/Explosion/SmokeOnTriggerSystem.cs new file mode 100644 index 00000000000..cac255e1ba9 --- /dev/null +++ b/Content.Client/Explosion/SmokeOnTriggerSystem.cs @@ -0,0 +1,7 @@ +using Content.Shared.Explosion.EntitySystems; + +namespace Content.Client.Explosion; + +public sealed class SmokeOnTriggerSystem : SharedSmokeOnTriggerSystem +{ +} \ No newline at end of file diff --git a/Content.Client/Explosion/TriggerOnProximityComponent.cs b/Content.Client/Explosion/TriggerOnProximityComponent.cs index 5d4714d19c3..5fa9bbfd237 100644 --- a/Content.Client/Explosion/TriggerOnProximityComponent.cs +++ b/Content.Client/Explosion/TriggerOnProximityComponent.cs @@ -1,4 +1,5 @@ using Content.Shared.Explosion; +using Content.Shared.Explosion.Components; namespace Content.Client.Explosion; diff --git a/Content.IntegrationTests/Tests/Payload/ModularGrenadeTests.cs b/Content.IntegrationTests/Tests/Payload/ModularGrenadeTests.cs index 0e47de968f0..70179fdec1a 100644 --- a/Content.IntegrationTests/Tests/Payload/ModularGrenadeTests.cs +++ b/Content.IntegrationTests/Tests/Payload/ModularGrenadeTests.cs @@ -1,5 +1,6 @@ using Content.IntegrationTests.Tests.Interaction; using Content.Server.Explosion.Components; +using Content.Shared.Explosion.Components; using Robust.Shared.Containers; using Robust.Shared.GameObjects; diff --git a/Content.Server/Defusable/Systems/DefusableSystem.cs b/Content.Server/Defusable/Systems/DefusableSystem.cs index 6927df256a4..1e9caece945 100644 --- a/Content.Server/Defusable/Systems/DefusableSystem.cs +++ b/Content.Server/Defusable/Systems/DefusableSystem.cs @@ -8,6 +8,8 @@ using Content.Shared.Database; using Content.Shared.Defusable; using Content.Shared.Examine; +using Content.Shared.Explosion.Components; +using Content.Shared.Explosion.Components.OnTrigger; using Content.Shared.Popups; using Content.Shared.Verbs; using Content.Shared.Wires; diff --git a/Content.Server/Explosion/Components/ActiveTimerTriggerComponent.cs b/Content.Server/Explosion/Components/ActiveTimerTriggerComponent.cs deleted file mode 100644 index d4f57b71370..00000000000 --- a/Content.Server/Explosion/Components/ActiveTimerTriggerComponent.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Robust.Shared.Audio; - -namespace Content.Server.Explosion.Components; - -/// -/// Component for tracking active trigger timers. A timers can activated by some other component, e.g. . -/// -[RegisterComponent] -public sealed partial class ActiveTimerTriggerComponent : Component -{ - [DataField("timeRemaining")] - public float TimeRemaining; - - [DataField("user")] - public EntityUid? User; - - [DataField("beepInterval")] - public float BeepInterval; - - [DataField("timeUntilBeep")] - public float TimeUntilBeep; - - [DataField("beepSound")] - public SoundSpecifier? BeepSound; -} diff --git a/Content.Server/Explosion/Components/TriggerOnProximityComponent.cs b/Content.Server/Explosion/Components/TriggerOnProximityComponent.cs index cfa1042245b..504ef4dee43 100644 --- a/Content.Server/Explosion/Components/TriggerOnProximityComponent.cs +++ b/Content.Server/Explosion/Components/TriggerOnProximityComponent.cs @@ -1,5 +1,6 @@ using Content.Server.Explosion.EntitySystems; using Content.Shared.Explosion; +using Content.Shared.Explosion.Components; using Content.Shared.Physics; using Robust.Shared.Physics.Collision.Shapes; using Robust.Shared.Physics.Components; diff --git a/Content.Server/Explosion/EntitySystems/ClusterGrenadeSystem.cs b/Content.Server/Explosion/EntitySystems/ClusterGrenadeSystem.cs index ee3f76d04c6..4ea857a5527 100644 --- a/Content.Server/Explosion/EntitySystems/ClusterGrenadeSystem.cs +++ b/Content.Server/Explosion/EntitySystems/ClusterGrenadeSystem.cs @@ -8,6 +8,8 @@ using Robust.Shared.Random; using Content.Server.Weapons.Ranged.Systems; using System.Numerics; +using Content.Shared.Explosion.Components; +using Content.Shared.Flash.Components; using Robust.Server.Containers; using Robust.Server.GameObjects; diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.GridMap.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.GridMap.cs index 799489d7b4c..b04642a8db0 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.GridMap.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.GridMap.cs @@ -1,6 +1,7 @@ using System.Numerics; using Content.Shared.Atmos; using Content.Shared.Explosion; +using Content.Shared.Explosion.Components; using Robust.Shared.Map; using Robust.Shared.Map.Components; diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs index e48d9f145eb..2bfc753b74a 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs @@ -3,6 +3,7 @@ using Content.Shared.CCVar; using Content.Shared.Damage; using Content.Shared.Explosion; +using Content.Shared.Explosion.Components; using Content.Shared.Maps; using Content.Shared.Physics; using Content.Shared.Projectiles; diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.TileFill.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.TileFill.cs index 65ca6e782ca..1b324d924bc 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.TileFill.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.TileFill.cs @@ -2,6 +2,7 @@ using System.Numerics; using Content.Shared.Administration; using Content.Shared.Explosion; +using Content.Shared.Explosion.Components; using Robust.Shared.Map; using Robust.Shared.Physics.Components; using Robust.Shared.Timing; diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Visuals.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Visuals.cs index ef8e1ffd987..d332531502c 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Visuals.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Visuals.cs @@ -1,4 +1,5 @@ using Content.Shared.Explosion; +using Content.Shared.Explosion.Components; using Robust.Server.GameObjects; using Robust.Shared.GameStates; using Robust.Shared.Map; diff --git a/Content.Server/Explosion/EntitySystems/SmokeOnTriggerSystem.cs b/Content.Server/Explosion/EntitySystems/SmokeOnTriggerSystem.cs index 3ddb411d40d..ab706d6d9c5 100644 --- a/Content.Server/Explosion/EntitySystems/SmokeOnTriggerSystem.cs +++ b/Content.Server/Explosion/EntitySystems/SmokeOnTriggerSystem.cs @@ -1,7 +1,9 @@ -using Content.Server.Explosion.Components; +using Content.Shared.Explosion.Components; using Content.Server.Fluids.EntitySystems; using Content.Shared.Chemistry.Components; using Content.Shared.Coordinates.Helpers; +using Content.Shared.Explosion.Components.OnTrigger; +using Content.Shared.Explosion.EntitySystems; using Content.Shared.Maps; using Robust.Shared.Map; @@ -10,7 +12,7 @@ namespace Content.Server.Explosion.EntitySystems; /// /// Handles creating smoke when is triggered. /// -public sealed class SmokeOnTriggerSystem : EntitySystem +public sealed class SmokeOnTriggerSystem : SharedSmokeOnTriggerSystem { [Dependency] private readonly IMapManager _mapMan = default!; [Dependency] private readonly SmokeSystem _smoke = default!; diff --git a/Content.Server/Explosion/EntitySystems/TriggerSystem.Mobstate.cs b/Content.Server/Explosion/EntitySystems/TriggerSystem.Mobstate.cs index 0b674adefd9..45198662ec3 100644 --- a/Content.Server/Explosion/EntitySystems/TriggerSystem.Mobstate.cs +++ b/Content.Server/Explosion/EntitySystems/TriggerSystem.Mobstate.cs @@ -1,4 +1,5 @@ using Content.Server.Explosion.Components; +using Content.Shared.Explosion.Components; using Content.Shared.Implants; using Content.Shared.Interaction.Events; using Content.Shared.Mobs; diff --git a/Content.Server/Explosion/EntitySystems/TriggerSystem.OnUse.cs b/Content.Server/Explosion/EntitySystems/TriggerSystem.OnUse.cs index 7edca9b803a..373cd1a9956 100644 --- a/Content.Server/Explosion/EntitySystems/TriggerSystem.OnUse.cs +++ b/Content.Server/Explosion/EntitySystems/TriggerSystem.OnUse.cs @@ -1,6 +1,7 @@ using Content.Server.Explosion.Components; using Content.Server.Sticky.Events; using Content.Shared.Examine; +using Content.Shared.Explosion.Components; using Content.Shared.Interaction.Events; using Content.Shared.Popups; using Content.Shared.Verbs; diff --git a/Content.Server/Explosion/EntitySystems/TriggerSystem.cs b/Content.Server/Explosion/EntitySystems/TriggerSystem.cs index 7b3e0b0e626..aa81f80c501 100644 --- a/Content.Server/Explosion/EntitySystems/TriggerSystem.cs +++ b/Content.Server/Explosion/EntitySystems/TriggerSystem.cs @@ -3,11 +3,13 @@ using Content.Server.Chemistry.Containers.EntitySystems; using Content.Server.Explosion.Components; using Content.Server.Flash; -using Content.Server.Flash.Components; +using Content.Shared.Flash.Components; using Content.Server.Radio.EntitySystems; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Components.SolutionManager; using Content.Shared.Database; +using Content.Shared.Explosion.Components; +using Content.Shared.Explosion.Components.OnTrigger; using Content.Shared.Implants.Components; using Content.Shared.Interaction; using Content.Shared.Mobs; diff --git a/Content.Server/Flash/Components/FlashOnTriggerComponent.cs b/Content.Server/Flash/Components/FlashOnTriggerComponent.cs deleted file mode 100644 index ad12dbdb02d..00000000000 --- a/Content.Server/Flash/Components/FlashOnTriggerComponent.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Content.Server.Flash.Components -{ - /// - /// Upon being triggered will flash in an area around it. - /// - [RegisterComponent] - internal sealed partial class FlashOnTriggerComponent : Component - { - [DataField("range")] internal float Range = 1.0f; - [DataField("duration")] internal float Duration = 8.0f; - } -} diff --git a/Content.Server/Flash/FlashSystem.cs b/Content.Server/Flash/FlashSystem.cs index ff50c813eb9..5bee1834fa4 100644 --- a/Content.Server/Flash/FlashSystem.cs +++ b/Content.Server/Flash/FlashSystem.cs @@ -7,6 +7,7 @@ using Content.Shared.Charges.Systems; using Content.Shared.Eye.Blinding.Components; using Content.Shared.Flash; +using Content.Shared.Flash.Components; using Content.Shared.IdentityManagement; using Content.Shared.Interaction; using Content.Shared.Interaction.Events; diff --git a/Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs b/Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs index 45d868cdbf6..f8d781bcfff 100644 --- a/Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs @@ -5,6 +5,7 @@ using Content.Server.Nutrition.Components; using Content.Server.Popups; using Content.Shared.Containers.ItemSlots; +using Content.Shared.Explosion.Components; using Content.Shared.Interaction; using Content.Shared.Nutrition.Components; using Content.Shared.Nutrition.EntitySystems; diff --git a/Content.Shared/Administration/SpawnExplosionEuiMsg.cs b/Content.Shared/Administration/SpawnExplosionEuiMsg.cs index 910399a95c2..03c0625b9af 100644 --- a/Content.Shared/Administration/SpawnExplosionEuiMsg.cs +++ b/Content.Shared/Administration/SpawnExplosionEuiMsg.cs @@ -2,6 +2,7 @@ using Robust.Shared.Serialization; using Robust.Shared.Map; using Content.Shared.Explosion; +using Content.Shared.Explosion.Components; namespace Content.Shared.Administration; diff --git a/Content.Shared/Explosion/Components/ActiveTimerTriggerComponent.cs b/Content.Shared/Explosion/Components/ActiveTimerTriggerComponent.cs new file mode 100644 index 00000000000..b0304715b1b --- /dev/null +++ b/Content.Shared/Explosion/Components/ActiveTimerTriggerComponent.cs @@ -0,0 +1,21 @@ +using Robust.Shared.Audio; +using Robust.Shared.GameStates; + +namespace Content.Shared.Explosion.Components; + +/// +/// Component for tracking active trigger timers. A timers can activated by some other component, e.g. . +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class ActiveTimerTriggerComponent : Component +{ + [DataField] public float TimeRemaining; + + [DataField] public EntityUid? User; + + [DataField] public float BeepInterval; + + [DataField] public float TimeUntilBeep; + + [DataField] public SoundSpecifier? BeepSound; +} diff --git a/Content.Shared/Explosion/ExplosionVisualsComponent.cs b/Content.Shared/Explosion/Components/ExplosionVisualsComponent.cs similarity index 97% rename from Content.Shared/Explosion/ExplosionVisualsComponent.cs rename to Content.Shared/Explosion/Components/ExplosionVisualsComponent.cs index 5baa59fc5a0..7477b6c26ea 100644 --- a/Content.Shared/Explosion/ExplosionVisualsComponent.cs +++ b/Content.Shared/Explosion/Components/ExplosionVisualsComponent.cs @@ -2,7 +2,7 @@ using Robust.Shared.Map; using Robust.Shared.Serialization; -namespace Content.Shared.Explosion; +namespace Content.Shared.Explosion.Components; /// /// Component that is used to send explosion overlay/visual data to an abstract explosion entity. diff --git a/Content.Server/Explosion/Components/OnTrigger/ExplodeOnTriggerComponent.cs b/Content.Shared/Explosion/Components/OnTrigger/ExplodeOnTriggerComponent.cs similarity index 57% rename from Content.Server/Explosion/Components/OnTrigger/ExplodeOnTriggerComponent.cs rename to Content.Shared/Explosion/Components/OnTrigger/ExplodeOnTriggerComponent.cs index 326ae6dab57..e14cd124640 100644 --- a/Content.Server/Explosion/Components/OnTrigger/ExplodeOnTriggerComponent.cs +++ b/Content.Shared/Explosion/Components/OnTrigger/ExplodeOnTriggerComponent.cs @@ -1,9 +1,11 @@ -namespace Content.Server.Explosion.Components; +using Robust.Shared.GameStates; + +namespace Content.Shared.Explosion.Components.OnTrigger; /// /// Explode using the entity's if Triggered. /// -[RegisterComponent] +[RegisterComponent, NetworkedComponent] public sealed partial class ExplodeOnTriggerComponent : Component { } diff --git a/Content.Server/Explosion/Components/OnTrigger/SmokeOnTriggerComponent.cs b/Content.Shared/Explosion/Components/OnTrigger/SmokeOnTriggerComponent.cs similarity index 85% rename from Content.Server/Explosion/Components/OnTrigger/SmokeOnTriggerComponent.cs rename to Content.Shared/Explosion/Components/OnTrigger/SmokeOnTriggerComponent.cs index d71e93495a9..dfaee98fab9 100644 --- a/Content.Server/Explosion/Components/OnTrigger/SmokeOnTriggerComponent.cs +++ b/Content.Shared/Explosion/Components/OnTrigger/SmokeOnTriggerComponent.cs @@ -1,14 +1,15 @@ -using Content.Server.Explosion.EntitySystems; using Content.Shared.Chemistry.Components; +using Content.Shared.Explosion.EntitySystems; +using Robust.Shared.GameStates; using Robust.Shared.Prototypes; -namespace Content.Server.Explosion.Components; +namespace Content.Shared.Explosion.Components.OnTrigger; /// /// Creates a smoke cloud when triggered, with an optional solution to include in it. /// No sound is played incase a grenade is stealthy, use if you want a sound. /// -[RegisterComponent, Access(typeof(SmokeOnTriggerSystem))] +[RegisterComponent, NetworkedComponent, Access(typeof(SharedSmokeOnTriggerSystem))] public sealed partial class SmokeOnTriggerComponent : Component { /// diff --git a/Content.Server/Explosion/Components/OnUseTimerTriggerComponent.cs b/Content.Shared/Explosion/Components/OnUseTimerTriggerComponent.cs similarity index 59% rename from Content.Server/Explosion/Components/OnUseTimerTriggerComponent.cs rename to Content.Shared/Explosion/Components/OnUseTimerTriggerComponent.cs index f2e94239a03..5e509cb10bb 100644 --- a/Content.Server/Explosion/Components/OnUseTimerTriggerComponent.cs +++ b/Content.Shared/Explosion/Components/OnUseTimerTriggerComponent.cs @@ -1,57 +1,49 @@ using Robust.Shared.Audio; +using Robust.Shared.GameStates; -namespace Content.Server.Explosion.Components +namespace Content.Shared.Explosion.Components { - [RegisterComponent] + [RegisterComponent, NetworkedComponent] public sealed partial class OnUseTimerTriggerComponent : Component { - [DataField("delay")] - public float Delay = 1f; + [DataField] public float Delay = 1f; /// /// If not null, a user can use verbs to configure the delay to one of these options. /// - [DataField("delayOptions")] - public List? DelayOptions = null; + [DataField] public List? DelayOptions = null; /// /// If not null, this timer will periodically play this sound while active. /// - [DataField("beepSound")] - public SoundSpecifier? BeepSound; + [DataField] public SoundSpecifier? BeepSound; /// /// Time before beeping starts. Defaults to a single beep interval. If set to zero, will emit a beep immediately after use. /// - [DataField("initialBeepDelay")] - public float? InitialBeepDelay; + [DataField] public float? InitialBeepDelay; - [DataField("beepInterval")] - public float BeepInterval = 1; + [DataField] public float BeepInterval = 1; /// /// Whether the timer should instead be activated through a verb in the right-click menu /// - [DataField("useVerbInstead")] - public bool UseVerbInstead = false; + [DataField] public bool UseVerbInstead = false; /// /// Should timer be started when it was stuck to another entity. /// Used for C4 charges and similar behaviour. /// - [DataField("startOnStick")] - public bool StartOnStick; + [DataField] public bool StartOnStick; /// /// Allows changing the start-on-stick quality. /// - [DataField("canToggleStartOnStick")] - public bool AllowToggleStartOnStick; + [DataField("canToggleStartOnStick")] public bool AllowToggleStartOnStick; /// /// Whether you can examine the item to see its timer or not. /// - [DataField("examinable")] - public bool Examinable = true; + [DataField] public bool Examinable = true; } } diff --git a/Content.Shared/Explosion/SharedClusterGrenadeComponent.cs b/Content.Shared/Explosion/Components/SharedClusterGrenadeComponent.cs similarity index 77% rename from Content.Shared/Explosion/SharedClusterGrenadeComponent.cs rename to Content.Shared/Explosion/Components/SharedClusterGrenadeComponent.cs index 602e0e4479e..1655e4cb57d 100644 --- a/Content.Shared/Explosion/SharedClusterGrenadeComponent.cs +++ b/Content.Shared/Explosion/Components/SharedClusterGrenadeComponent.cs @@ -1,6 +1,6 @@ using Robust.Shared.Serialization; -namespace Content.Shared.Explosion +namespace Content.Shared.Explosion.Components { [Serializable, NetSerializable] public enum ClusterGrenadeVisuals : byte diff --git a/Content.Shared/Explosion/SharedTriggerOnProximityComponent.cs b/Content.Shared/Explosion/Components/SharedTriggerOnProximityComponent.cs similarity index 74% rename from Content.Shared/Explosion/SharedTriggerOnProximityComponent.cs rename to Content.Shared/Explosion/Components/SharedTriggerOnProximityComponent.cs index fdc5cd11342..02d11561049 100644 --- a/Content.Shared/Explosion/SharedTriggerOnProximityComponent.cs +++ b/Content.Shared/Explosion/Components/SharedTriggerOnProximityComponent.cs @@ -1,6 +1,6 @@ using Robust.Shared.GameStates; -namespace Content.Shared.Explosion; +namespace Content.Shared.Explosion.Components; [NetworkedComponent] public abstract partial class SharedTriggerOnProximityComponent : Component diff --git a/Content.Shared/Explosion/EntitySystems/SharedSmokeOnTriggerSystem.cs b/Content.Shared/Explosion/EntitySystems/SharedSmokeOnTriggerSystem.cs new file mode 100644 index 00000000000..0a8caa5e2a1 --- /dev/null +++ b/Content.Shared/Explosion/EntitySystems/SharedSmokeOnTriggerSystem.cs @@ -0,0 +1,6 @@ +namespace Content.Shared.Explosion.EntitySystems; + +public abstract class SharedSmokeOnTriggerSystem : EntitySystem +{ + +} \ No newline at end of file diff --git a/Content.Shared/Explosion/EntitySystems/SharedTriggerSystem.cs b/Content.Shared/Explosion/EntitySystems/SharedTriggerSystem.cs new file mode 100644 index 00000000000..cc5b3f6b748 --- /dev/null +++ b/Content.Shared/Explosion/EntitySystems/SharedTriggerSystem.cs @@ -0,0 +1,6 @@ +namespace Content.Shared.Explosion.EntitySystems; + +public abstract class SharedTriggerSystem : EntitySystem +{ + +} \ No newline at end of file diff --git a/Content.Server/Flash/Components/FlashComponent.cs b/Content.Shared/Flash/Components/FlashComponent.cs similarity index 83% rename from Content.Server/Flash/Components/FlashComponent.cs rename to Content.Shared/Flash/Components/FlashComponent.cs index f8437ab1806..a26e32cb70f 100644 --- a/Content.Server/Flash/Components/FlashComponent.cs +++ b/Content.Shared/Flash/Components/FlashComponent.cs @@ -1,8 +1,10 @@ +using Content.Shared.Flash; using Robust.Shared.Audio; +using Robust.Shared.GameStates; -namespace Content.Server.Flash.Components +namespace Content.Shared.Flash.Components { - [RegisterComponent, Access(typeof(FlashSystem))] + [RegisterComponent, NetworkedComponent, Access(typeof(SharedFlashSystem))] public sealed partial class FlashComponent : Component { diff --git a/Content.Shared/Flash/Components/FlashOnTriggerComponent.cs b/Content.Shared/Flash/Components/FlashOnTriggerComponent.cs new file mode 100644 index 00000000000..f257c83b5aa --- /dev/null +++ b/Content.Shared/Flash/Components/FlashOnTriggerComponent.cs @@ -0,0 +1,13 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Flash.Components; + +/// +/// Upon being triggered will flash in an area around it. +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class FlashOnTriggerComponent : Component +{ + [DataField] public float Range = 1.0f; + [DataField] public float Duration = 8.0f; +} diff --git a/Resources/Prototypes/Entities/Objects/Devices/Electronics/triggers.yml b/Resources/Prototypes/Entities/Objects/Devices/Electronics/triggers.yml index c462a3cb038..43ed20c694c 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Electronics/triggers.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Electronics/triggers.yml @@ -24,9 +24,10 @@ delay: 5 delayOptions: [3, 5, 10, 15, 30] initialBeepDelay: 0 - beepSound: /Audio/Machines/Nuke/general_beep.ogg - params: - volume: -2 + beepSound: + path: /Audio/Machines/Nuke/general_beep.ogg + params: + volume: -2 - type: StaticPrice price: 40 diff --git a/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml b/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml index d369d039968..092b013f5b7 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml @@ -252,9 +252,10 @@ - type: OnUseTimerTrigger delay: 7 initialBeepDelay: 0 - beepSound: /Audio/Machines/Nuke/general_beep.ogg - params: - volume: -2 + beepSound: + path: /Audio/Machines/Nuke/general_beep.ogg + params: + volume: -2 - type: ExplodeOnTrigger - type: GibOnTrigger deleteItems: true diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml index 3f53b3e1cea..f83c48436a6 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml @@ -253,9 +253,10 @@ - type: OnUseTimerTrigger useVerbInstead: true beepInterval: .25 - beepSound: /Audio/Items/Janitor/floor_sign_beep.ogg - params: - volume: 1 + beepSound: + path: /Audio/Items/Janitor/floor_sign_beep.ogg + params: + volume: 1 examinable: false - type: Tag tags: # ignore "WhitelistChameleon" tag diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Bombs/funny.yml b/Resources/Prototypes/Entities/Objects/Weapons/Bombs/funny.yml index 7d95e7481e3..4aff7363a45 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Bombs/funny.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Bombs/funny.yml @@ -24,9 +24,10 @@ Blunt: 5 - type: OnUseTimerTrigger delay: 120 - beepSound: /Audio/Machines/Nuke/general_beep.ogg - params: - volume: -2 + beepSound: + path: /Audio/Machines/Nuke/general_beep.ogg + params: + volume: -2 - type: ExplodeOnTrigger - type: Explosive explosionType: Default diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Bombs/ied.yml b/Resources/Prototypes/Entities/Objects/Weapons/Bombs/ied.yml index 14906c7c2d5..c4420a43a36 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Bombs/ied.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Bombs/ied.yml @@ -22,7 +22,8 @@ initialBeepDelay: 0 beepSound: path: /Audio/Weapons/Guns/MagOut/pistol_magout.ogg - volume: 1 + params: + volume: 1 - type: RandomTimerTrigger min: 0 max: 60 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/security.yml b/Resources/Prototypes/Entities/Objects/Weapons/security.yml index 0f7696a990a..332034bfd80 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/security.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/security.yml @@ -182,7 +182,6 @@ sound: path: /Audio/Weapons/flash.ogg - type: FlashOnTrigger - repeating: true range: 3 - type: TriggerOnProximity enabled: true From e0a3cfacea5b922a51a6b1aedf26ca98061cd8ff Mon Sep 17 00:00:00 2001 From: Magnus Larsen Date: Thu, 1 Feb 2024 13:33:57 +0000 Subject: [PATCH 145/266] Fix clientside storage Whitelists (#24063) * Fix outdated component name in assaultbelt whitelist RangedMagazine was replaced with BallisticAmmoProvider in the Gun refactor (#8301) * Move FlashOnTrigger, SmokeOnTrigger, Flash components to Shared * Move LightReplacerComponent to Shared * Move Utensil, Mousetrap components to Shared * Move SprayPainterComponent to Shared The PaintableAirlock tag has also been removed, as it was unused & unnecessary, likely a vestige of spray painter development when the PaintableAirlock component wasn't in Content.Shared. * Add trivial Produce and Seed components to Client This allows the plant bag and botanical belt whitelists to correctly match produce and seeds on the client, fixing the extraneous "Can't insert" message that previously appeared. --------- Co-authored-by: metalgearsloth (cherry picked from commit 9cd6e4dccdfaa7e273417e3c94d66b5171c7d841) --- Content.Client/Botany/Components/ProduceComponent.cs | 8 ++++++++ Content.Client/Botany/Components/SeedComponent.cs | 8 ++++++++ Content.Server/Botany/Components/ProduceComponent.cs | 3 ++- Content.Server/Botany/Components/SeedComponent.cs | 3 ++- .../Explosion/EntitySystems/ClusterGrenadeSystem.cs | 2 +- .../Explosion/EntitySystems/SmokeOnTriggerSystem.cs | 1 + Content.Server/Flash/FlashSystem.cs | 1 + Content.Server/Light/EntitySystems/LightReplacerSystem.cs | 3 ++- Content.Server/Nutrition/Components/FoodComponent.cs | 1 + Content.Server/Nutrition/EntitySystems/FoodSystem.cs | 1 + .../Nutrition/EntitySystems/SliceableFoodSystem.cs | 1 + Content.Server/Nutrition/EntitySystems/UtensilSystem.cs | 4 +++- Content.Server/SprayPainter/SprayPainterSystem.cs | 3 ++- .../Botany/Components/SharedProduceComponent.cs | 8 ++++++++ Content.Shared/Botany/Components/SharedSeedComponent.cs | 8 ++++++++ .../Components/OnTrigger/SmokeOnTriggerComponent.cs | 4 +++- .../Explosion/EntitySystems/SharedSmokeOnTriggerSystem.cs | 5 ++--- .../Flash/Components/FlashOnTriggerComponent.cs | 1 - .../Light/Components/LightReplacerComponent.cs | 5 +++-- .../Light/EntitySystems/SharedLightReplacerSystem.cs | 5 +++++ .../Mousetrap/MousetrapComponent.cs | 8 +++++--- .../Nutrition/Components/UtensilComponent.cs | 7 ++++--- .../Nutrition/EntitySystems/SharedUtensilSystem.cs | 5 +++++ .../SprayPainter/Components}/SprayPainterComponent.cs | 5 +++-- Resources/Prototypes/Entities/Clothing/Belt/belts.yml | 4 ++-- .../Entities/Objects/Specific/Janitorial/janitor.yml | 2 +- .../Prototypes/Entities/Objects/Tools/light_replacer.yml | 1 - .../Prototypes/Entities/Objects/Tools/spray_painter.yml | 3 --- .../Prototypes/Entities/Objects/Weapons/security.yml | 1 + Resources/Prototypes/tags.yml | 6 ------ 30 files changed, 83 insertions(+), 34 deletions(-) create mode 100644 Content.Client/Botany/Components/ProduceComponent.cs create mode 100644 Content.Client/Botany/Components/SeedComponent.cs create mode 100644 Content.Shared/Botany/Components/SharedProduceComponent.cs create mode 100644 Content.Shared/Botany/Components/SharedSeedComponent.cs rename {Content.Server => Content.Shared}/Light/Components/LightReplacerComponent.cs (84%) create mode 100644 Content.Shared/Light/EntitySystems/SharedLightReplacerSystem.cs rename {Content.Server => Content.Shared}/Mousetrap/MousetrapComponent.cs (74%) rename {Content.Server => Content.Shared}/Nutrition/Components/UtensilComponent.cs (85%) create mode 100644 Content.Shared/Nutrition/EntitySystems/SharedUtensilSystem.cs rename {Content.Server/SprayPainter => Content.Shared/SprayPainter/Components}/SprayPainterComponent.cs (84%) diff --git a/Content.Client/Botany/Components/ProduceComponent.cs b/Content.Client/Botany/Components/ProduceComponent.cs new file mode 100644 index 00000000000..68857da1b7a --- /dev/null +++ b/Content.Client/Botany/Components/ProduceComponent.cs @@ -0,0 +1,8 @@ +using Content.Shared.Botany.Components; + +namespace Content.Client.Botany.Components; + +[RegisterComponent] +public sealed partial class ProduceComponent : SharedProduceComponent +{ +} diff --git a/Content.Client/Botany/Components/SeedComponent.cs b/Content.Client/Botany/Components/SeedComponent.cs new file mode 100644 index 00000000000..11663020fc2 --- /dev/null +++ b/Content.Client/Botany/Components/SeedComponent.cs @@ -0,0 +1,8 @@ +using Content.Shared.Botany.Components; + +namespace Content.Client.Botany.Components; + +[RegisterComponent] +public sealed partial class SeedComponent : SharedSeedComponent +{ +} diff --git a/Content.Server/Botany/Components/ProduceComponent.cs b/Content.Server/Botany/Components/ProduceComponent.cs index c78e0a1ad47..b3c4e1c95a9 100644 --- a/Content.Server/Botany/Components/ProduceComponent.cs +++ b/Content.Server/Botany/Components/ProduceComponent.cs @@ -1,11 +1,12 @@ using Content.Server.Botany.Systems; +using Content.Shared.Botany.Components; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Server.Botany.Components; [RegisterComponent] [Access(typeof(BotanySystem))] -public sealed partial class ProduceComponent : Component +public sealed partial class ProduceComponent : SharedProduceComponent { [DataField("targetSolution")] public string SolutionName { get; set; } = "food"; diff --git a/Content.Server/Botany/Components/SeedComponent.cs b/Content.Server/Botany/Components/SeedComponent.cs index cb48c166837..3e729dc9060 100644 --- a/Content.Server/Botany/Components/SeedComponent.cs +++ b/Content.Server/Botany/Components/SeedComponent.cs @@ -1,10 +1,11 @@ using Content.Server.Botany.Systems; +using Content.Shared.Botany.Components; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Server.Botany.Components { [RegisterComponent, Access(typeof(BotanySystem))] - public sealed partial class SeedComponent : Component + public sealed partial class SeedComponent : SharedSeedComponent { /// /// Seed data containing information about the plant type & properties that this seed can grow seed. If diff --git a/Content.Server/Explosion/EntitySystems/ClusterGrenadeSystem.cs b/Content.Server/Explosion/EntitySystems/ClusterGrenadeSystem.cs index 4ea857a5527..09c2be33a0e 100644 --- a/Content.Server/Explosion/EntitySystems/ClusterGrenadeSystem.cs +++ b/Content.Server/Explosion/EntitySystems/ClusterGrenadeSystem.cs @@ -1,5 +1,5 @@ using Content.Server.Explosion.Components; -using Content.Server.Flash.Components; +using Content.Shared.Flash.Components; using Content.Shared.Explosion; using Content.Shared.Interaction; using Content.Shared.Interaction.Events; diff --git a/Content.Server/Explosion/EntitySystems/SmokeOnTriggerSystem.cs b/Content.Server/Explosion/EntitySystems/SmokeOnTriggerSystem.cs index ab706d6d9c5..2f475a07b44 100644 --- a/Content.Server/Explosion/EntitySystems/SmokeOnTriggerSystem.cs +++ b/Content.Server/Explosion/EntitySystems/SmokeOnTriggerSystem.cs @@ -1,4 +1,5 @@ using Content.Shared.Explosion.Components; +using Content.Shared.Explosion.EntitySystems; using Content.Server.Fluids.EntitySystems; using Content.Shared.Chemistry.Components; using Content.Shared.Coordinates.Helpers; diff --git a/Content.Server/Flash/FlashSystem.cs b/Content.Server/Flash/FlashSystem.cs index 5bee1834fa4..4f0ccc27fdc 100644 --- a/Content.Server/Flash/FlashSystem.cs +++ b/Content.Server/Flash/FlashSystem.cs @@ -1,5 +1,6 @@ using System.Linq; using Content.Server.Flash.Components; +using Content.Shared.Flash.Components; using Content.Server.Light.EntitySystems; using Content.Server.Popups; using Content.Server.Stunnable; diff --git a/Content.Server/Light/EntitySystems/LightReplacerSystem.cs b/Content.Server/Light/EntitySystems/LightReplacerSystem.cs index f1cb5373c04..1260a0dd0d0 100644 --- a/Content.Server/Light/EntitySystems/LightReplacerSystem.cs +++ b/Content.Server/Light/EntitySystems/LightReplacerSystem.cs @@ -2,6 +2,7 @@ using Content.Server.Light.Components; using Content.Shared.Examine; using Content.Shared.Interaction; +using Content.Shared.Light.EntitySystems; using Content.Shared.Light.Components; using Content.Shared.Popups; using Content.Shared.Storage; @@ -13,7 +14,7 @@ namespace Content.Server.Light.EntitySystems; [UsedImplicitly] -public sealed class LightReplacerSystem : EntitySystem +public sealed class LightReplacerSystem : SharedLightReplacerSystem { [Dependency] private readonly PoweredLightSystem _poweredLight = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; diff --git a/Content.Server/Nutrition/Components/FoodComponent.cs b/Content.Server/Nutrition/Components/FoodComponent.cs index dbc89d5a449..5ead67a12b2 100644 --- a/Content.Server/Nutrition/Components/FoodComponent.cs +++ b/Content.Server/Nutrition/Components/FoodComponent.cs @@ -1,4 +1,5 @@ using Content.Server.Body.Components; +using Content.Shared.Nutrition.Components; using Content.Server.Nutrition.EntitySystems; using Content.Shared.FixedPoint; using Robust.Shared.Audio; diff --git a/Content.Server/Nutrition/EntitySystems/FoodSystem.cs b/Content.Server/Nutrition/EntitySystems/FoodSystem.cs index 70d202932ac..2b627151339 100644 --- a/Content.Server/Nutrition/EntitySystems/FoodSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/FoodSystem.cs @@ -3,6 +3,7 @@ using Content.Server.Chemistry.Containers.EntitySystems; using Content.Server.Inventory; using Content.Server.Nutrition.Components; +using Content.Shared.Nutrition.Components; using Content.Server.Popups; using Content.Server.Stack; using Content.Shared.Administration.Logs; diff --git a/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs b/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs index 83f9e25d6e7..e92b046f2e3 100644 --- a/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs @@ -1,6 +1,7 @@ using Content.Server.Nutrition; // DeltaV using Content.Server.Chemistry.Containers.EntitySystems; using Content.Server.Nutrition.Components; +using Content.Shared.Nutrition.Components; using Content.Shared.Chemistry.Components; using Content.Shared.Examine; using Content.Shared.FixedPoint; diff --git a/Content.Server/Nutrition/EntitySystems/UtensilSystem.cs b/Content.Server/Nutrition/EntitySystems/UtensilSystem.cs index f5f34080cbb..f9feed955fc 100644 --- a/Content.Server/Nutrition/EntitySystems/UtensilSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/UtensilSystem.cs @@ -1,4 +1,6 @@ using Content.Server.Nutrition.Components; +using Content.Shared.Nutrition.Components; +using Content.Shared.Nutrition.EntitySystems; using Content.Server.Popups; using Content.Shared.Interaction; using Robust.Shared.Audio; @@ -11,7 +13,7 @@ namespace Content.Server.Nutrition.EntitySystems /// /// Handles usage of the utensils on the food items /// - internal sealed class UtensilSystem : EntitySystem + internal sealed class UtensilSystem : SharedUtensilSystem { [Dependency] private readonly IRobustRandom _robustRandom = default!; [Dependency] private readonly FoodSystem _foodSystem = default!; diff --git a/Content.Server/SprayPainter/SprayPainterSystem.cs b/Content.Server/SprayPainter/SprayPainterSystem.cs index fd8ff9ea280..4f8f1cda2ea 100644 --- a/Content.Server/SprayPainter/SprayPainterSystem.cs +++ b/Content.Server/SprayPainter/SprayPainterSystem.cs @@ -6,8 +6,9 @@ using Content.Shared.Database; using Content.Shared.DoAfter; using Content.Shared.Doors.Components; -using Content.Shared.SprayPainter.Prototypes; using Content.Shared.SprayPainter; +using Content.Shared.SprayPainter.Components; +using Content.Shared.SprayPainter.Prototypes; using Content.Shared.Interaction; using JetBrains.Annotations; using Robust.Server.GameObjects; diff --git a/Content.Shared/Botany/Components/SharedProduceComponent.cs b/Content.Shared/Botany/Components/SharedProduceComponent.cs new file mode 100644 index 00000000000..1d55f8de990 --- /dev/null +++ b/Content.Shared/Botany/Components/SharedProduceComponent.cs @@ -0,0 +1,8 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Botany.Components; + +[NetworkedComponent] +public abstract partial class SharedProduceComponent : Component +{ +} diff --git a/Content.Shared/Botany/Components/SharedSeedComponent.cs b/Content.Shared/Botany/Components/SharedSeedComponent.cs new file mode 100644 index 00000000000..efa72146c2e --- /dev/null +++ b/Content.Shared/Botany/Components/SharedSeedComponent.cs @@ -0,0 +1,8 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Botany.Components; + +[NetworkedComponent] +public abstract partial class SharedSeedComponent : Component +{ +} diff --git a/Content.Shared/Explosion/Components/OnTrigger/SmokeOnTriggerComponent.cs b/Content.Shared/Explosion/Components/OnTrigger/SmokeOnTriggerComponent.cs index dfaee98fab9..cfbe1fcb3d9 100644 --- a/Content.Shared/Explosion/Components/OnTrigger/SmokeOnTriggerComponent.cs +++ b/Content.Shared/Explosion/Components/OnTrigger/SmokeOnTriggerComponent.cs @@ -1,9 +1,11 @@ +using Content.Shared.Explosion.EntitySystems; using Content.Shared.Chemistry.Components; using Content.Shared.Explosion.EntitySystems; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; +using Robust.Shared.GameStates; -namespace Content.Shared.Explosion.Components.OnTrigger; +namespace Content.Shared.Explosion.Components; /// /// Creates a smoke cloud when triggered, with an optional solution to include in it. diff --git a/Content.Shared/Explosion/EntitySystems/SharedSmokeOnTriggerSystem.cs b/Content.Shared/Explosion/EntitySystems/SharedSmokeOnTriggerSystem.cs index 0a8caa5e2a1..b206dfa696c 100644 --- a/Content.Shared/Explosion/EntitySystems/SharedSmokeOnTriggerSystem.cs +++ b/Content.Shared/Explosion/EntitySystems/SharedSmokeOnTriggerSystem.cs @@ -1,6 +1,5 @@ -namespace Content.Shared.Explosion.EntitySystems; +namespace Content.Shared.Explosion.EntitySystems; public abstract class SharedSmokeOnTriggerSystem : EntitySystem { - -} \ No newline at end of file +} diff --git a/Content.Shared/Flash/Components/FlashOnTriggerComponent.cs b/Content.Shared/Flash/Components/FlashOnTriggerComponent.cs index f257c83b5aa..d1270e9db74 100644 --- a/Content.Shared/Flash/Components/FlashOnTriggerComponent.cs +++ b/Content.Shared/Flash/Components/FlashOnTriggerComponent.cs @@ -1,5 +1,4 @@ using Robust.Shared.GameStates; - namespace Content.Shared.Flash.Components; /// diff --git a/Content.Server/Light/Components/LightReplacerComponent.cs b/Content.Shared/Light/Components/LightReplacerComponent.cs similarity index 84% rename from Content.Server/Light/Components/LightReplacerComponent.cs rename to Content.Shared/Light/Components/LightReplacerComponent.cs index cecdba6b47d..8d7d2339275 100644 --- a/Content.Server/Light/Components/LightReplacerComponent.cs +++ b/Content.Shared/Light/Components/LightReplacerComponent.cs @@ -1,7 +1,8 @@ -using Content.Server.Light.EntitySystems; +using Content.Shared.Light.EntitySystems; using Content.Shared.Storage; using Robust.Shared.Audio; using Robust.Shared.Containers; +using Robust.Shared.GameStates; namespace Content.Server.Light.Components; @@ -9,7 +10,7 @@ namespace Content.Server.Light.Components; /// Device that allows user to quikly change bulbs in /// Can be reloaded by new light tubes or light bulbs /// -[RegisterComponent, Access(typeof(LightReplacerSystem))] +[RegisterComponent, NetworkedComponent, Access(typeof(SharedLightReplacerSystem))] public sealed partial class LightReplacerComponent : Component { [DataField("sound")] diff --git a/Content.Shared/Light/EntitySystems/SharedLightReplacerSystem.cs b/Content.Shared/Light/EntitySystems/SharedLightReplacerSystem.cs new file mode 100644 index 00000000000..29001d6c73a --- /dev/null +++ b/Content.Shared/Light/EntitySystems/SharedLightReplacerSystem.cs @@ -0,0 +1,5 @@ +namespace Content.Shared.Light.EntitySystems; + +public abstract class SharedLightReplacerSystem : EntitySystem +{ +} diff --git a/Content.Server/Mousetrap/MousetrapComponent.cs b/Content.Shared/Mousetrap/MousetrapComponent.cs similarity index 74% rename from Content.Server/Mousetrap/MousetrapComponent.cs rename to Content.Shared/Mousetrap/MousetrapComponent.cs index b666c45a4ce..6d7483802bd 100644 --- a/Content.Server/Mousetrap/MousetrapComponent.cs +++ b/Content.Shared/Mousetrap/MousetrapComponent.cs @@ -1,10 +1,12 @@ -namespace Content.Server.Mousetrap; +using Robust.Shared.GameStates; -[RegisterComponent] +namespace Content.Shared.Mousetrap; + +[RegisterComponent, NetworkedComponent] public sealed partial class MousetrapComponent : Component { [ViewVariables] - [DataField("isActive")] + [DataField("isActive")] public bool IsActive = false; /// diff --git a/Content.Server/Nutrition/Components/UtensilComponent.cs b/Content.Shared/Nutrition/Components/UtensilComponent.cs similarity index 85% rename from Content.Server/Nutrition/Components/UtensilComponent.cs rename to Content.Shared/Nutrition/Components/UtensilComponent.cs index 4058d7e154b..50158f1f63c 100644 --- a/Content.Server/Nutrition/Components/UtensilComponent.cs +++ b/Content.Shared/Nutrition/Components/UtensilComponent.cs @@ -1,9 +1,10 @@ -using Content.Server.Nutrition.EntitySystems; +using Content.Shared.Nutrition.EntitySystems; using Robust.Shared.Audio; +using Robust.Shared.GameStates; -namespace Content.Server.Nutrition.Components +namespace Content.Shared.Nutrition.Components { - [RegisterComponent, Access(typeof(UtensilSystem))] + [RegisterComponent, NetworkedComponent, Access(typeof(SharedUtensilSystem))] public sealed partial class UtensilComponent : Component { [DataField("types")] diff --git a/Content.Shared/Nutrition/EntitySystems/SharedUtensilSystem.cs b/Content.Shared/Nutrition/EntitySystems/SharedUtensilSystem.cs new file mode 100644 index 00000000000..656a36f5d0f --- /dev/null +++ b/Content.Shared/Nutrition/EntitySystems/SharedUtensilSystem.cs @@ -0,0 +1,5 @@ +namespace Content.Shared.Nutrition.EntitySystems; + +public abstract class SharedUtensilSystem : EntitySystem +{ +} diff --git a/Content.Server/SprayPainter/SprayPainterComponent.cs b/Content.Shared/SprayPainter/Components/SprayPainterComponent.cs similarity index 84% rename from Content.Server/SprayPainter/SprayPainterComponent.cs rename to Content.Shared/SprayPainter/Components/SprayPainterComponent.cs index 9417112b4f2..e4581527b79 100644 --- a/Content.Server/SprayPainter/SprayPainterComponent.cs +++ b/Content.Shared/SprayPainter/Components/SprayPainterComponent.cs @@ -1,8 +1,9 @@ using Robust.Shared.Audio; +using Robust.Shared.GameStates; -namespace Content.Server.SprayPainter; +namespace Content.Shared.SprayPainter.Components; -[RegisterComponent] +[RegisterComponent, NetworkedComponent] public sealed partial class SprayPainterComponent : Component { [DataField("spraySound")] diff --git a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml index d5976d1ddaa..d800dcdff48 100644 --- a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml +++ b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml @@ -179,7 +179,7 @@ - SmokeOnTrigger - Flash - Handcuff - - RangedMagazine + - BallisticAmmoProvider - Ammo - type: ItemMapper mapLayers: @@ -221,7 +221,7 @@ - WetFloorSign - HolosignProjector - Plunger - - LightReplacer + - JanicartKeys components: - LightReplacer - type: ItemMapper diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml index f83c48436a6..06cf99cc316 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml @@ -329,7 +329,7 @@ lightreplacer_slot: name: janitorial-trolley-slot-component-slot-name-lightreplacer whitelist: - tags: + components: - LightReplacer priority: 6 spraybottle_slot: diff --git a/Resources/Prototypes/Entities/Objects/Tools/light_replacer.yml b/Resources/Prototypes/Entities/Objects/Tools/light_replacer.yml index d834d1ab520..442e939d423 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/light_replacer.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/light_replacer.yml @@ -17,7 +17,6 @@ amount: 5 - type: Tag tags: - - LightReplacer - DroneUsable - type: StaticPrice price: 100 diff --git a/Resources/Prototypes/Entities/Objects/Tools/spray_painter.yml b/Resources/Prototypes/Entities/Objects/Tools/spray_painter.yml index 26948370335..8a8c569510d 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/spray_painter.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/spray_painter.yml @@ -14,9 +14,6 @@ - key: enum.SprayPainterUiKey.Key type: SprayPainterBoundUserInterface - type: SprayPainter - whitelist: - tags: - - PaintableAirlock colorPalette: red: '#FF1212FF' yellow: '#B3A234FF' diff --git a/Resources/Prototypes/Entities/Objects/Weapons/security.yml b/Resources/Prototypes/Entities/Objects/Weapons/security.yml index 332034bfd80..eec5ee833a1 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/security.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/security.yml @@ -189,6 +189,7 @@ shape: !type:PhysShapeCircle radius: 2 + repeating: true - type: Anchorable - type: Sprite sprite: Objects/Weapons/pflash.rsi diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index b07c8d267ad..f9b207ba6ec 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -713,9 +713,6 @@ - type: Tag id: Lemon -- type: Tag - id: LightReplacer - - type: Tag id: Lime @@ -856,9 +853,6 @@ - type: Tag id: Payload # for grenade/bomb crafting -- type: Tag - id: PaintableAirlock - - type: Tag id: Pancake From 5b0d9f789585e7a5ac5a695eadbee3b8b7fadc5f Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 1 Feb 2024 13:35:03 +0000 Subject: [PATCH 146/266] Automatic changelog update (cherry picked from commit d4185144ddc4508f5b327d861c4da13224e47c32) --- Resources/Changelog/Changelog.yml | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 66d2f7b61b5..4efeaed4988 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: SlamBamActionman - changes: - - message: Discord bot Changelog now includes hyperlinks to the PRs. - type: Add - id: 5361 - time: '2023-12-14T18:19:25.0000000+00:00' - author: themias changes: - message: Fixed spray nozzle not getting ammo from the back pack tank @@ -3859,3 +3853,15 @@ id: 5860 time: '2024-02-01T13:03:50.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24482 +- author: Nopey + changes: + - message: Many belts and the plant bag no longer produce an erroneous "Can't insert" + and "This doesn't go in there!" messages while inserting certain items such + as Produce (plant bag) or Smoke Grenades (security belt). + type: Fix + - message: Ammunition can once again be stored in assault belts, as was the case + before June 2022. + type: Fix + id: 5861 + time: '2024-02-01T13:33:57.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24063 From 2a839fcb94d42e91a8f1b880ab997e535fc30329 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Fri, 2 Feb 2024 00:39:43 +1100 Subject: [PATCH 147/266] Remove obsolete transform call (#24217) * Remove obsolete transform call Shrimple PR also fixed bad flatpack call that would break on non-standard tilesizes. * Update calls * weh (cherry picked from commit 52808694e0a479c162930a0aae20e91b68bc67a4) --- Content.Server/Anomaly/Effects/EntityAnomalySystem.cs | 10 ++++++++-- .../AtmosphereSystem.HighPressureDelta.cs | 4 ++-- .../Atmos/EntitySystems/AtmosphereSystem.Hotspot.cs | 5 ++--- Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs | 4 +++- Content.Shared/Anomaly/SharedAnomalySystem.cs | 5 +++-- Content.Shared/Construction/SharedFlatpackSystem.cs | 5 +++-- 6 files changed, 21 insertions(+), 12 deletions(-) diff --git a/Content.Server/Anomaly/Effects/EntityAnomalySystem.cs b/Content.Server/Anomaly/Effects/EntityAnomalySystem.cs index 9bfc48f4baa..7c397d68887 100644 --- a/Content.Server/Anomaly/Effects/EntityAnomalySystem.cs +++ b/Content.Server/Anomaly/Effects/EntityAnomalySystem.cs @@ -4,6 +4,7 @@ using Content.Shared.Anomaly.Effects.Components; using Robust.Shared.Map; using Robust.Shared.Map.Components; +using Robust.Shared.Physics.Components; using Robust.Shared.Random; namespace Content.Server.Anomaly.Effects; @@ -13,10 +14,15 @@ public sealed class EntityAnomalySystem : SharedEntityAnomalySystem [Dependency] private readonly SharedAnomalySystem _anomaly = default!; [Dependency] private readonly IMapManager _map = default!; [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly SharedMapSystem _mapSystem = default!; + + private EntityQuery _physicsQuery; /// public override void Initialize() { + _physicsQuery = GetEntityQuery(); + SubscribeLocalEvent(OnPulse); SubscribeLocalEvent(OnSupercritical); SubscribeLocalEvent(OnStabilityChanged); @@ -82,7 +88,7 @@ private void OnSeverityChanged(Entity component, re private void SpawnEntities(Entity anomaly, EntitySpawnSettingsEntry entry, float stability, float severity) { var xform = Transform(anomaly); - if (!TryComp(xform.GridUid, out var grid)) + if (!TryComp(xform.GridUid, out MapGridComponent? grid)) return; var tiles = _anomaly.GetSpawningPoints(anomaly, stability, severity, entry.Settings); @@ -91,7 +97,7 @@ private void SpawnEntities(Entity anomaly, EntitySp foreach (var tileref in tiles) { - Spawn(_random.Pick(entry.Spawns), tileref.GridIndices.ToEntityCoordinates(xform.GridUid.Value, _map)); + Spawn(_random.Pick(entry.Spawns), _mapSystem.ToCenterCoordinates(tileref, grid)); } } } diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs index 89a42b576bc..53035e1ed3c 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs @@ -100,7 +100,7 @@ private void HighPressureMovements(Entity gridAtmospher { if(_spaceWindSoundCooldown == 0 && !string.IsNullOrEmpty(SpaceWindSound)) { - var coordinates = tile.GridIndices.ToEntityCoordinates(tile.GridIndex, _mapManager); + var coordinates = _mapSystem.ToCenterCoordinates(tile.GridIndex, tile.GridIndices); _audio.PlayPvs(SpaceWindSound, coordinates, AudioParams.Default.WithVariation(0.125f).WithVolume(MathHelper.Clamp(tile.PressureDifference / 10, 10, 100))); } } @@ -163,7 +163,7 @@ private void HighPressureMovements(Entity gridAtmospher gridAtmosphere.Comp.UpdateCounter, tile.PressureDifference, tile.PressureDirection, 0, - tile.PressureSpecificTarget?.GridIndices.ToEntityCoordinates(tile.GridIndex, _mapManager) ?? EntityCoordinates.Invalid, + tile.PressureSpecificTarget != null ? _mapSystem.ToCenterCoordinates(tile.GridIndex, tile.PressureSpecificTarget.GridIndices) : EntityCoordinates.Invalid, gridWorldRotation, xforms.GetComponent(entity), body); diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Hotspot.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Hotspot.cs index 8966f232e06..713d1c4682c 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Hotspot.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Hotspot.cs @@ -11,8 +11,6 @@ namespace Content.Server.Atmos.EntitySystems { public sealed partial class AtmosphereSystem { - [Dependency] private readonly EntityLookupSystem _lookup = default!; - private const int HotspotSoundCooldownCycles = 200; private int _hotspotSoundCooldown = 0; @@ -81,7 +79,8 @@ private void ProcessHotspot(GridAtmosphereComponent gridAtmosphere, TileAtmosphe if (_hotspotSoundCooldown++ == 0 && !string.IsNullOrEmpty(HotspotSound)) { - var coordinates = tile.GridIndices.ToEntityCoordinates(tile.GridIndex, _mapManager); + var coordinates = _mapSystem.ToCenterCoordinates(tile.GridIndex, tile.GridIndices); + // A few details on the audio parameters for fire. // The greater the fire state, the lesser the pitch variation. // The greater the fire state, the greater the volume. diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs index 116ab172113..dd2a9675591 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs @@ -25,12 +25,14 @@ public sealed partial class AtmosphereSystem : SharedAtmosphereSystem [Dependency] private readonly ITileDefinitionManager _tileDefinitionManager = default!; [Dependency] private readonly IRobustRandom _robustRandom = default!; [Dependency] private readonly IAdminLogManager _adminLog = default!; + [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly InternalsSystem _internals = default!; [Dependency] private readonly SharedContainerSystem _containers = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly GasTileOverlaySystem _gasTileOverlaySystem = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly TransformSystem _transformSystem = default!; + [Dependency] private readonly SharedMapSystem _mapSystem = default!; + [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly TileSystem _tile = default!; [Dependency] private readonly MapSystem _map = default!; [Dependency] public readonly PuddleSystem Puddle = default!; diff --git a/Content.Shared/Anomaly/SharedAnomalySystem.cs b/Content.Shared/Anomaly/SharedAnomalySystem.cs index 5c9739da72d..711f9d1493c 100644 --- a/Content.Shared/Anomaly/SharedAnomalySystem.cs +++ b/Content.Shared/Anomaly/SharedAnomalySystem.cs @@ -377,9 +377,9 @@ public override void Update(float frameTime) var physQuery = GetEntityQuery(); var resultList = new List(); - while (resultList.Count() < amount) + while (resultList.Count < amount) { - if (tilerefs.Count() == 0) + if (tilerefs.Count == 0) break; var tileref = _random.Pick(tilerefs); @@ -414,6 +414,7 @@ public override void Update(float frameTime) continue; } } + resultList.Add(tileref); } return resultList; diff --git a/Content.Shared/Construction/SharedFlatpackSystem.cs b/Content.Shared/Construction/SharedFlatpackSystem.cs index 6432f87e8ed..c6f3e89744d 100644 --- a/Content.Shared/Construction/SharedFlatpackSystem.cs +++ b/Content.Shared/Construction/SharedFlatpackSystem.cs @@ -67,8 +67,9 @@ private void OnFlatpackInteractUsing(Entity ent, ref Interact } var buildPos = _map.TileIndicesFor(grid, gridComp, xform.Coordinates); - var intersecting = _entityLookup.GetEntitiesIntersecting(buildPos.ToEntityCoordinates(grid, _mapManager).Offset(new Vector2(0.5f, 0.5f)) - , LookupFlags.Dynamic | LookupFlags.Static); + var coords = _map.ToCenterCoordinates(grid, buildPos); + + var intersecting = _entityLookup.GetEntitiesIntersecting(coords, LookupFlags.Dynamic | LookupFlags.Static); // todo make this logic smarter. // This should eventually allow for shit like building microwaves on tables and such. From 778d0375b579bd7fade3c283258cd0d1f356279e Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Fri, 2 Feb 2024 00:41:03 +1100 Subject: [PATCH 148/266] Update submodule to 209.0.0 (#24819) (cherry picked from commit 67286f3a4c4ec0e48cb24e09aa335048c4d998d1) --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index ca82767b07b..d5f4d4bf2f1 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit ca82767b07bb56efd177899ffa65bb17ea77fa16 +Subproject commit d5f4d4bf2f1f43c5e266d3ba85814a5a3eefe5fe From 757c5c992eaf7ec287f68508b24202670ae523e4 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Fri, 2 Feb 2024 01:03:03 +1100 Subject: [PATCH 149/266] Remove bad tag (#24820) (cherry picked from commit 0375cd866fdac3eb65781431d1ca2b59e3cf7e92) --- Resources/Prototypes/Entities/Clothing/Belt/belts.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml index d800dcdff48..de6c7754695 100644 --- a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml +++ b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml @@ -221,7 +221,6 @@ - WetFloorSign - HolosignProjector - Plunger - - JanicartKeys components: - LightReplacer - type: ItemMapper From c795fd0e3e2989c3a54ce9066388f2b75dc6aa08 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Fri, 2 Feb 2024 01:04:45 +1100 Subject: [PATCH 150/266] Update submodule to 209.0.1 (#24822) (cherry picked from commit 2aa5759334be8ad5f008f132dda55d9901d11cdb) --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index d5f4d4bf2f1..9e0fc7017c4 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit d5f4d4bf2f1f43c5e266d3ba85814a5a3eefe5fe +Subproject commit 9e0fc7017c4740b6bc8302cb724dc7c3b60b3299 From e3bf59a3be719d7a76efe1febbab6895355d6a7e Mon Sep 17 00:00:00 2001 From: Vasilis Date: Thu, 1 Feb 2024 15:05:01 +0100 Subject: [PATCH 151/266] Action for closing prs submitted by the submitters master branch (#24094) * Action for closing master prs * Spelling mistakes and better msg * a (cherry picked from commit 5d5c4c4772739c0fdf6d289217061c8f74ac1ee8) --- .github/workflows/close-master-pr.yml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 .github/workflows/close-master-pr.yml diff --git a/.github/workflows/close-master-pr.yml b/.github/workflows/close-master-pr.yml new file mode 100644 index 00000000000..66843d35dd6 --- /dev/null +++ b/.github/workflows/close-master-pr.yml @@ -0,0 +1,27 @@ +name: Close PR's on master + +on: + pull_request_target: + types: [ opened, ready_for_review ] + +jobs: + run: + runs-on: ubuntu-latest + if: ${{github.head_ref == 'master' || github.head_ref == 'main' || github.head_ref == 'develop'}} + + steps: + - uses: superbrothers/close-pull-request@v3 + with: + comment: "Thank you for contributing to the Space Station 14 repository. Unfortunately, it looks like you submitted your pull request from the master branch. We suggest you follow [our git usage documentation](https://docs.spacestation14.com/en/general-development/setup/git-for-the-ss14-developer.html) \n\n You can move your current work from the master branch to another branch by doing `git branch Date: Thu, 1 Feb 2024 23:19:01 +0100 Subject: [PATCH 152/266] Adds ExaminableSolutionComponent to spray bottles (#24838) Added missing component to base spray bottle (cherry picked from commit 66b37b45f4d1ff44ae3d558e20a09a51874fb9cf) --- .../Prototypes/Entities/Objects/Specific/Janitorial/spray.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/spray.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/spray.yml index dbbea707468..e9eb18f926f 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/spray.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/spray.yml @@ -32,6 +32,8 @@ path: /Audio/Effects/spray2.ogg - type: TrashOnSolutionEmpty solution: spray + - type: ExaminableSolution + solution: spray - type: entity name: mega spray bottle From c8456ec7836bf99fdf2d74f68138929f8fdde66f Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 1 Feb 2024 22:20:07 +0000 Subject: [PATCH 153/266] Automatic changelog update (cherry picked from commit abd2bfceb84c16a1918e28c4156174e6d8f282c7) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 4efeaed4988..d18d0105cf7 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: themias - changes: - - message: Fixed spray nozzle not getting ammo from the back pack tank - type: Fix - id: 5362 - time: '2023-12-14T20:49:40.0000000+00:00' - author: Ubaser changes: - message: Mothroach crates are now twice as expensive @@ -3865,3 +3859,10 @@ id: 5861 time: '2024-02-01T13:33:57.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24063 +- author: Blazeror + changes: + - message: Chemical analysis goggles can now inspect solutions inside spray bottles. + type: Fix + id: 5862 + time: '2024-02-01T22:19:01.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24838 From 90824ea0cfe257d476ea2a4a715dd08ac770311b Mon Sep 17 00:00:00 2001 From: themias <89101928+themias@users.noreply.github.com> Date: Thu, 1 Feb 2024 17:21:04 -0500 Subject: [PATCH 154/266] Fix dylovene OD damage (#24826) fix dylovene OD damage (cherry picked from commit eed7ca1ddc4bd76e7b02cbbb9205d974970878b6) --- Resources/Prototypes/Reagents/medicine.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Reagents/medicine.yml b/Resources/Prototypes/Reagents/medicine.yml index 0605728a51d..c2a3353079c 100644 --- a/Resources/Prototypes/Reagents/medicine.yml +++ b/Resources/Prototypes/Reagents/medicine.yml @@ -45,7 +45,7 @@ - !type:ReagentThreshold min: 20 damage: - types: + groups: Brute: 2 - !type:Jitter conditions: From 3875e191ea28a8dfb8896ff9ae32b1f64500c799 Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 1 Feb 2024 22:22:10 +0000 Subject: [PATCH 155/266] Automatic changelog update (cherry picked from commit 912b5915d411056e5fdf723648fb480c1bdcd4a8) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index d18d0105cf7..690ed04bca4 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: Ubaser - changes: - - message: Mothroach crates are now twice as expensive - type: Tweak - id: 5363 - time: '2023-12-14T20:58:38.0000000+00:00' - author: deltanedas changes: - message: Crusher Glaives can be made with the Salvage Weapons technology. @@ -3866,3 +3860,10 @@ id: 5862 time: '2024-02-01T22:19:01.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24838 +- author: themias + changes: + - message: Fixed dylovene overdoses not applying brute damage + type: Fix + id: 5863 + time: '2024-02-01T22:21:04.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24826 From 4ca11a55e54aecc9ee9d037287cbd169aa106d31 Mon Sep 17 00:00:00 2001 From: SlamBamActionman <83650252+slambamactionman@users.noreply.github.com> Date: Thu, 1 Feb 2024 23:27:52 +0100 Subject: [PATCH 156/266] Remove gondola donkpocket & change berry box description (#24655) * Remove gondola & change berry box description * Removed map gondolas * Revert "Removed map gondolas" This reverts commit 42fcfb85f16e778df135d2a68b9cea08d794e28b. * Updated migration.yml to remove FoodBoxDonkpocketGondola * Replacing is better than removing * Changed description slightly (cherry picked from commit e36844de47ce0d9f5f28b11b733cd998201e1b49) --- Resources/Migrations/migration.yml | 3 ++ .../Random/Food_Drinks/donkpocketbox.yml | 1 - .../Consumable/Food/Baked/donkpocket.yml | 39 +----------------- .../Consumable/Food/Containers/box.yml | 14 ------- .../Entities/Objects/Decoration/present.yml | 2 - .../Recipes/Cooking/meal_recipes.yml | 8 ---- .../Food/Baked/donkpocket.rsi/gondola-box.png | Bin 347 -> 0 bytes .../Food/Baked/donkpocket.rsi/gondola.png | Bin 317 -> 0 bytes .../Food/Baked/donkpocket.rsi/meta.json | 6 --- 9 files changed, 4 insertions(+), 69 deletions(-) delete mode 100644 Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/gondola-box.png delete mode 100644 Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/gondola.png diff --git a/Resources/Migrations/migration.yml b/Resources/Migrations/migration.yml index e2df39bd8d0..edfb1e67a94 100644 --- a/Resources/Migrations/migration.yml +++ b/Resources/Migrations/migration.yml @@ -157,6 +157,9 @@ ClothingHeadHelmetVoidParamed: null # 2024-01-19 DefaultStationBeaconTeslaEngine: null +# 2024-01-28 +FoodBoxDonkpocketGondola: FoodBoxDonkpocketPizza + # 2024-01-31 SpawnVehicleWheelchair: null SpawnVehicleWheelchairFolded: null diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/donkpocketbox.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/donkpocketbox.yml index 98174b7a03f..cf7b2a5e869 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/donkpocketbox.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/Food_Drinks/donkpocketbox.yml @@ -14,7 +14,6 @@ - FoodBoxDonkpocketSpicy - FoodBoxDonkpocketTeriyaki - FoodBoxDonkpocketPizza - - FoodBoxDonkpocketGondola - FoodBoxDonkpocketBerry - FoodBoxDonkpocketHonk - FoodBoxDonkpocketDink diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/donkpocket.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/donkpocket.yml index b0be8011aa4..2e034053051 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/donkpocket.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/donkpocket.yml @@ -256,7 +256,7 @@ name: berry-pocket parent: FoodDonkpocketBase id: FoodDonkpocketBerry - description: A relentlessly sweet donk-pocket first created for use in Operation Iraqi Freedom. + description: A relentlessly sweet donk-pocket. Made with 100% artificial flavoring. components: - type: FlavorProfile flavors: @@ -292,43 +292,6 @@ - ReagentId: Sugar Quantity: 2 -- type: entity - name: gondola-pocket - parent: FoodDonkpocketBase - id: FoodDonkpocketGondola - description: The choice to use real gondola meat in the recipe is controversial, to say the least. - components: - - type: FlavorProfile - flavors: - - shocking - - cheap - - type: SolutionContainerManager - solutions: - food: - reagents: - - ReagentId: Nutriment - Quantity: 5 - - type: Sprite - state: gondola - -- type: entity - name: warm gondola-pocket - parent: FoodDonkpocketGondola - id: FoodDonkpocketGondolaWarm - components: - - type: FlavorProfile - flavors: - - shocking - - cheap - - type: SolutionContainerManager - solutions: - food: - reagents: - - ReagentId: Nutriment - Quantity: 10 - - ReagentId: Omnizine - Quantity: 2 - - type: entity name: dink-pocket parent: FoodDonkpocketBase diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml index b8eb862c403..26815b210d4 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml @@ -399,20 +399,6 @@ - id: FoodDonkpocketPizza amount: 6 -- type: entity - parent: FoodBoxDonkpocket - id: FoodBoxDonkpocketGondola - name: box of gondola-flavoured donk-pockets - components: - - type: Sprite - state: gondola-box - - type: Item - sprite: Objects/Consumable/Food/Baked/donkpocket.rsi - - type: StorageFill - contents: - - id: FoodDonkpocketGondola - amount: 6 - - type: entity parent: FoodBoxDonkpocket id: FoodBoxDonkpocketBerry diff --git a/Resources/Prototypes/Entities/Objects/Decoration/present.yml b/Resources/Prototypes/Entities/Objects/Decoration/present.yml index 2b06d36b992..421bd826b94 100644 --- a/Resources/Prototypes/Entities/Objects/Decoration/present.yml +++ b/Resources/Prototypes/Entities/Objects/Decoration/present.yml @@ -268,8 +268,6 @@ orGroup: GiftPool - id: FoodBoxDonkpocketPizza orGroup: GiftPool - - id: FoodBoxDonkpocketGondola - orGroup: GiftPool - id: FoodBoxDonkpocketBerry orGroup: GiftPool - id: FoodBoxDonkpocketHonk diff --git a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml index 0b66658d163..5a44dd2c231 100644 --- a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml +++ b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml @@ -1480,14 +1480,6 @@ solids: FoodDonkpocketBerry: 1 -- type: microwaveMealRecipe - id: RecipeDonkpocketGondola - name: warm gondola-pocket recipe - result: FoodDonkpocketGondolaWarm - time: 5 - solids: - FoodDonkpocketGondola: 1 - - type: microwaveMealRecipe id: RecipeHotChili name: hot chili recipe diff --git a/Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/gondola-box.png b/Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/gondola-box.png deleted file mode 100644 index 5bda53839e05149b73cf5b709868d688ebec2571..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyr2#%6t_KbraF7vq(NRh^SKORz zlVhWDrX$T(NyJTE+(AXuOH(q+NX|n;B1l&{!BoLQmOns8I@(As-BQU{Q@qO0w94Pq zOGB(a)au3liLdrdSlyD=5N7l2(Bv1ZyS^{&_S2H64z!q25Po|@N0W!Pld4#Rp{%K_ zP~Uu)W}pKYOM?7@862M7NCR@Fc)B=-SoFRu%}jpjm5>#VN#Qp zFT$1Ix r;xSNqP>~_aGUr$0WF}>%x}ECD&jlCRia+=VbRUDKtDnm{r-UW|^sRp9 diff --git a/Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/gondola.png b/Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/gondola.png deleted file mode 100644 index 700805e5185ded30ae6c2fad2f253d7aac8a9894..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFtT{MIEGZrNluVpU7R4&(-dfM ziBZ{dmdsX>|H;Dl>)+a)d}cT?dFRAQDu@4Nf0vw)8CaJ$hwm`EN15Rn#upC`uKv#R ze%~JjOOXhVQU+#bX6M*g8z9BZyg$&f;z=B*>@!17mB@RE{ zK3^iP{*TvufrdygUWX!%JyjL&{?CuU|6$d{psk9xVkQ+I1o9*zZtMVKyM6oGm5v`e zcJ#yB%ifdDDBol>aR2l3Yp-KORQtonud8|F`s%>q4l278pq6)BwxfoXcjop#pe{c^lSQtEA{an^L HB{Ts5J3xXd diff --git a/Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/meta.json b/Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/meta.json index 8b64f3577a7..bf4050e45ec 100644 --- a/Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/meta.json @@ -22,12 +22,6 @@ { "name": "dank" }, - { - "name": "gondola" - }, - { - "name": "gondola-box" - }, { "name": "pizza" }, From 0b0de4eb50acf12ff3047acce7c34bb37dab3d09 Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Thu, 1 Feb 2024 22:30:46 +0000 Subject: [PATCH 157/266] spray painter rework (#23287) * refactor and add Department to PaintableAirlock, move it to server dir since its in namespace * add departments to doors, cleanup * add style -> departments mapping * AirlockDepartmentsPrototype * update shared spray stuff to have department * name file the same as the class name * department optional * refactor spray painter system + send department * fixy * client * no need to rewrite ActivateableUi * pro ops * the reckoning * hiss * . * :trollface: * add standard atmos colors to palette * Update Content.Shared/SprayPainter/SharedSprayPainterSystem.cs --------- Co-authored-by: deltanedas <@deltanedas:kde.org> Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> (cherry picked from commit c49c78bafaddc3ed69714eaf41920e1565dbd292) --- .../SprayPainter/SprayPainterSystem.cs | 18 +- .../UI/SprayPainterBoundUserInterface.cs | 28 +-- .../SprayPainter/SprayPainterSystem.cs | 173 +++------------ .../Components/PaintableAirlockComponent.cs | 23 +- .../Components/SprayPainterComponent.cs | 39 ++-- .../Prototypes/AirlockDepartmentsPrototype.cs | 21 ++ .../SprayPainter/SharedDevicePainterSystem.cs | 29 --- .../SprayPainter/SharedSprayPainterSystem.cs | 202 ++++++++++++++++++ .../SprayPainter/SprayPainterEvents.cs | 48 +++-- .../Entities/Objects/Tools/spray_painter.yml | 49 +++-- .../Structures/Doors/Airlocks/airlocks.yml | 75 +++---- .../Doors/Airlocks/base_structureairlocks.yml | 1 + .../Structures/Doors/Airlocks/external.yml | 1 + .../Structures/Doors/Airlocks/shuttle.yml | 1 + .../Structures/Doors/airlock_groups.yml | 16 ++ 15 files changed, 421 insertions(+), 303 deletions(-) create mode 100644 Content.Shared/SprayPainter/Prototypes/AirlockDepartmentsPrototype.cs delete mode 100644 Content.Shared/SprayPainter/SharedDevicePainterSystem.cs create mode 100644 Content.Shared/SprayPainter/SharedSprayPainterSystem.cs diff --git a/Content.Client/SprayPainter/SprayPainterSystem.cs b/Content.Client/SprayPainter/SprayPainterSystem.cs index 4476e2a90ae..6a1d27e98b7 100644 --- a/Content.Client/SprayPainter/SprayPainterSystem.cs +++ b/Content.Client/SprayPainter/SprayPainterSystem.cs @@ -14,29 +14,31 @@ public sealed class SprayPainterSystem : SharedSprayPainterSystem public List Entries { get; private set; } = new(); - public override void Initialize() + protected override void CacheStyles() { - base.Initialize(); + base.CacheStyles(); - foreach (string style in Styles) + Entries.Clear(); + foreach (var style in Styles) { + var name = style.Name; string? iconPath = Groups - .FindAll(x => x.StylePaths.ContainsKey(style))? - .MaxBy(x => x.IconPriority)?.StylePaths[style]; + .FindAll(x => x.StylePaths.ContainsKey(name))? + .MaxBy(x => x.IconPriority)?.StylePaths[name]; if (iconPath == null) { - Entries.Add(new SprayPainterEntry(style, null)); + Entries.Add(new SprayPainterEntry(name, null)); continue; } RSIResource doorRsi = _resourceCache.GetResource(SpriteSpecifierSerializer.TextureRoot / new ResPath(iconPath)); if (!doorRsi.RSI.TryGetState("closed", out var icon)) { - Entries.Add(new SprayPainterEntry(style, null)); + Entries.Add(new SprayPainterEntry(name, null)); continue; } - Entries.Add(new SprayPainterEntry(style, icon.Frame0)); + Entries.Add(new SprayPainterEntry(name, icon.Frame0)); } } } diff --git a/Content.Client/SprayPainter/UI/SprayPainterBoundUserInterface.cs b/Content.Client/SprayPainter/UI/SprayPainterBoundUserInterface.cs index d5c57a601f0..e8442d23908 100644 --- a/Content.Client/SprayPainter/UI/SprayPainterBoundUserInterface.cs +++ b/Content.Client/SprayPainter/UI/SprayPainterBoundUserInterface.cs @@ -1,4 +1,5 @@ using Content.Shared.SprayPainter; +using Content.Shared.SprayPainter.Components; using Robust.Client.GameObjects; using Robust.Client.UserInterface.Controls; @@ -20,14 +21,20 @@ protected override void Open() { base.Open(); + if (!EntMan.TryGetComponent(Owner, out var comp)) + return; + _window = new SprayPainterWindow(); _painter = EntMan.System(); - _window.OpenCentered(); _window.OnClose += Close; _window.OnSpritePicked = OnSpritePicked; _window.OnColorPicked = OnColorPicked; + + _window.Populate(_painter.Entries, comp.Index, comp.PickedColor, comp.ColorPalette); + + _window.OpenCentered(); } protected override void Dispose(bool disposing) @@ -37,25 +44,6 @@ protected override void Dispose(bool disposing) _window?.Dispose(); } - protected override void UpdateState(BoundUserInterfaceState state) - { - base.UpdateState(state); - - if (_window == null) - return; - - if (_painter == null) - return; - - if (state is not SprayPainterBoundUserInterfaceState stateCast) - return; - - _window.Populate(_painter.Entries, - stateCast.SelectedStyle, - stateCast.SelectedColorKey, - stateCast.Palette); - } - private void OnSpritePicked(ItemList.ItemListSelectedEventArgs args) { SendMessage(new SprayPainterSpritePickedMessage(args.ItemIndex)); diff --git a/Content.Server/SprayPainter/SprayPainterSystem.cs b/Content.Server/SprayPainter/SprayPainterSystem.cs index 4f8f1cda2ea..e49c49c1da0 100644 --- a/Content.Server/SprayPainter/SprayPainterSystem.cs +++ b/Content.Server/SprayPainter/SprayPainterSystem.cs @@ -1,186 +1,69 @@ -using System.Linq; -using Content.Server.Administration.Logs; using Content.Server.Atmos.Piping.Components; using Content.Server.Atmos.Piping.EntitySystems; -using Content.Server.Popups; -using Content.Shared.Database; using Content.Shared.DoAfter; -using Content.Shared.Doors.Components; +using Content.Shared.Interaction; using Content.Shared.SprayPainter; using Content.Shared.SprayPainter.Components; -using Content.Shared.SprayPainter.Prototypes; -using Content.Shared.Interaction; -using JetBrains.Annotations; -using Robust.Server.GameObjects; -using Robust.Shared.Audio; -using Robust.Shared.Audio.Systems; -using Robust.Shared.Player; namespace Content.Server.SprayPainter; /// -/// A system for painting airlocks and pipes using enginner painter +/// Handles spraying pipes using a spray painter. +/// Airlocks are handled in shared. /// -[UsedImplicitly] public sealed class SprayPainterSystem : SharedSprayPainterSystem { - [Dependency] private readonly IAdminLogManager _adminLogger = default!; - [Dependency] private readonly UserInterfaceSystem _userInterfaceSystem = default!; - [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; - [Dependency] private readonly PopupSystem _popupSystem = default!; - [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - [Dependency] private readonly AtmosPipeColorSystem _pipeColorSystem = default!; + [Dependency] private readonly AtmosPipeColorSystem _pipeColor = default!; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(AfterInteractOn); - SubscribeLocalEvent(OnActivate); - SubscribeLocalEvent(OnSpritePicked); - SubscribeLocalEvent(OnColorPicked); - SubscribeLocalEvent(OnDoAfter); - } - - private void OnInit(EntityUid uid, SprayPainterComponent component, ComponentInit args) - { - if (component.ColorPalette.Count == 0) - return; + SubscribeLocalEvent(OnPipeDoAfter); - SetColor(uid, component, component.ColorPalette.First().Key); + SubscribeLocalEvent(OnPipeInteract); } - private void OnDoAfter(EntityUid uid, SprayPainterComponent component, SprayPainterDoAfterEvent args) + private void OnPipeDoAfter(Entity ent, ref SprayPainterPipeDoAfterEvent args) { - component.IsSpraying = false; - if (args.Handled || args.Cancelled) return; - if (args.Args.Target == null) + if (args.Args.Target is not {} target) return; - EntityUid target = (EntityUid) args.Args.Target; - - _audio.PlayPvs(component.SpraySound, uid); - - if (TryComp(target, out var atmosPipeColorComp)) - { - _pipeColorSystem.SetColor(target, atmosPipeColorComp, args.Color ?? Color.White); - } else { // Target is an airlock - if (args.Sprite != null) - { - _appearance.SetData(target, DoorVisuals.BaseRSI, args.Sprite); - _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(args.Args.User):user} painted {ToPrettyString(args.Args.Target.Value):target}"); - } - } - - args.Handled = true; - } - - private void OnActivate(EntityUid uid, SprayPainterComponent component, ActivateInWorldEvent args) - { - if (!EntityManager.TryGetComponent(args.User, out ActorComponent? actor)) + if (!TryComp(target, out var color)) return; - DirtyUI(uid, component); - _userInterfaceSystem.TryOpen(uid, SprayPainterUiKey.Key, actor.PlayerSession); - args.Handled = true; - } - - private void AfterInteractOn(EntityUid uid, SprayPainterComponent component, AfterInteractEvent args) - { - if (component.IsSpraying || args.Target is not { Valid: true } target || !args.CanReach) - return; + Audio.PlayPvs(ent.Comp.SpraySound, ent); - if (EntityManager.TryGetComponent(target, out var airlock)) - { - if (!_prototypeManager.TryIndex(airlock.Group, out var grp)) - { - Log.Error("Group not defined: %s", airlock.Group); - return; - } - - string style = Styles[component.Index]; - if (!grp.StylePaths.TryGetValue(style, out var sprite)) - { - string msg = Loc.GetString("spray-painter-style-not-available"); - _popupSystem.PopupEntity(msg, args.User, args.User); - return; - } - component.IsSpraying = true; - - var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.AirlockSprayTime, new SprayPainterDoAfterEvent(sprite, null), uid, target: target, used: uid) - { - BreakOnTargetMove = true, - BreakOnUserMove = true, - BreakOnDamage = true, - NeedHand = true, - }; - _doAfterSystem.TryStartDoAfter(doAfterEventArgs); - - // Log attempt - _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(args.User):user} is painting {ToPrettyString(uid):target} to '{style}' at {Transform(uid).Coordinates:targetlocation}"); - } else { // Painting pipes - if(component.PickedColor is null) - return; - - if (!EntityManager.HasComponent(target)) - return; - - if(!component.ColorPalette.TryGetValue(component.PickedColor, out var color)) - return; - - var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.PipeSprayTime, new SprayPainterDoAfterEvent(null, color), uid, target, uid) - { - BreakOnTargetMove = true, - BreakOnUserMove = true, - BreakOnDamage = true, - CancelDuplicate = true, - DuplicateCondition = DuplicateConditions.SameTarget, - NeedHand = true, - }; - - _doAfterSystem.TryStartDoAfter(doAfterEventArgs); - } - } + _pipeColor.SetColor(target, color, args.Color); - private void OnColorPicked(EntityUid uid, SprayPainterComponent component, SprayPainterColorPickedMessage args) - { - SetColor(uid, component, args.Key); - } - - private void OnSpritePicked(EntityUid uid, SprayPainterComponent component, SprayPainterSpritePickedMessage args) - { - component.Index = args.Index; - DirtyUI(uid, component); + args.Handled = true; } - private void SetColor(EntityUid uid, SprayPainterComponent component, string? paletteKey) + private void OnPipeInteract(Entity ent, ref InteractUsingEvent args) { - if (paletteKey == null) + if (args.Handled) return; - if (!component.ColorPalette.ContainsKey(paletteKey) || paletteKey == component.PickedColor) + if (!TryComp(args.Used, out var painter) || painter.PickedColor is not {} colorName) return; - component.PickedColor = paletteKey; - DirtyUI(uid, component); - } - - private void DirtyUI(EntityUid uid, SprayPainterComponent? component = null) - { - if (!Resolve(uid, ref component)) + if (!painter.ColorPalette.TryGetValue(colorName, out var color)) return; - _userInterfaceSystem.TrySetUiState( - uid, - SprayPainterUiKey.Key, - new SprayPainterBoundUserInterfaceState( - component.Index, - component.PickedColor, - component.ColorPalette)); + var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, painter.PipeSprayTime, new SprayPainterPipeDoAfterEvent(color), args.Used, target: ent, used: args.Used) + { + BreakOnTargetMove = true, + BreakOnUserMove = true, + BreakOnDamage = true, + CancelDuplicate = true, + // multiple pipes can be sprayed at once just not the same one + DuplicateCondition = DuplicateConditions.SameTarget, + NeedHand = true + }; + + args.Handled = DoAfter.TryStartDoAfter(doAfterEventArgs); } } diff --git a/Content.Shared/SprayPainter/Components/PaintableAirlockComponent.cs b/Content.Shared/SprayPainter/Components/PaintableAirlockComponent.cs index 10fd72434e6..fdd0aeeb7f9 100644 --- a/Content.Shared/SprayPainter/Components/PaintableAirlockComponent.cs +++ b/Content.Shared/SprayPainter/Components/PaintableAirlockComponent.cs @@ -1,11 +1,24 @@ +using Content.Shared.Roles; using Content.Shared.SprayPainter.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; -namespace Content.Server.SprayPainter; +namespace Content.Shared.SprayPainter.Components; -[RegisterComponent] +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class PaintableAirlockComponent : Component { - [DataField("group", customTypeSerializer:typeof(PrototypeIdSerializer))] - public string Group = default!; + /// + /// Group of styles this airlock can be painted with, e.g. glass, standard or external. + /// + [DataField(required: true), AutoNetworkedField] + public ProtoId Group = string.Empty; + + /// + /// Department this airlock is painted as, or none. + /// Must be specified in prototypes for turf war to work. + /// To better catch any mistakes, you need to explicitly state a non-styled airlock has a null department. + /// + [DataField(required: true), AutoNetworkedField] + public ProtoId? Department; } diff --git a/Content.Shared/SprayPainter/Components/SprayPainterComponent.cs b/Content.Shared/SprayPainter/Components/SprayPainterComponent.cs index e4581527b79..1742b13f8d3 100644 --- a/Content.Shared/SprayPainter/Components/SprayPainterComponent.cs +++ b/Content.Shared/SprayPainter/Components/SprayPainterComponent.cs @@ -1,29 +1,44 @@ +using Content.Shared.DoAfter; using Robust.Shared.Audio; using Robust.Shared.GameStates; namespace Content.Shared.SprayPainter.Components; -[RegisterComponent, NetworkedComponent] +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class SprayPainterComponent : Component { - [DataField("spraySound")] + [DataField] public SoundSpecifier SpraySound = new SoundPathSpecifier("/Audio/Effects/spray2.ogg"); - [DataField("airlockSprayTime")] - public float AirlockSprayTime = 3.0f; + [DataField] + public TimeSpan AirlockSprayTime = TimeSpan.FromSeconds(3); - [DataField("pipeSprayTime")] - public float PipeSprayTime = 1.0f; + [DataField] + public TimeSpan PipeSprayTime = TimeSpan.FromSeconds(1); - [DataField("isSpraying")] - public bool IsSpraying = false; + /// + /// DoAfterId for airlock spraying. + /// Pipes do not track doafters so you can spray multiple at once. + /// + [DataField] + public DoAfterId? AirlockDoAfter; - [ViewVariables(VVAccess.ReadWrite)] + /// + /// Pipe color chosen to spray with. + /// + [DataField, AutoNetworkedField] public string? PickedColor; - [ViewVariables(VVAccess.ReadWrite)] - [DataField("colorPalette")] + /// + /// Pipe colors that can be selected. + /// + [DataField] public Dictionary ColorPalette = new(); - public int Index = default!; + /// + /// Airlock style index selected. + /// After prototype reload this might not be the same style but it will never be out of bounds. + /// + [DataField, AutoNetworkedField] + public int Index; } diff --git a/Content.Shared/SprayPainter/Prototypes/AirlockDepartmentsPrototype.cs b/Content.Shared/SprayPainter/Prototypes/AirlockDepartmentsPrototype.cs new file mode 100644 index 00000000000..3553597c526 --- /dev/null +++ b/Content.Shared/SprayPainter/Prototypes/AirlockDepartmentsPrototype.cs @@ -0,0 +1,21 @@ +using Content.Shared.Roles; +using Robust.Shared.Prototypes; + +namespace Content.Shared.SprayPainter.Prototypes; + +/// +/// Maps airlock style names to department ids. +/// +[Prototype("airlockDepartments")] +public sealed class AirlockDepartmentsPrototype : IPrototype +{ + [IdDataField] + public string ID { get; private set; } = default!; + + /// + /// Dictionary of style names to department ids. + /// If a style does not have a department (e.g. external) it is set to null. + /// + [DataField(required: true)] + public Dictionary> Departments = new(); +} diff --git a/Content.Shared/SprayPainter/SharedDevicePainterSystem.cs b/Content.Shared/SprayPainter/SharedDevicePainterSystem.cs deleted file mode 100644 index ff43b119f63..00000000000 --- a/Content.Shared/SprayPainter/SharedDevicePainterSystem.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System.Linq; -using Content.Shared.SprayPainter.Prototypes; -using Robust.Shared.Prototypes; - -namespace Content.Shared.SprayPainter; - -public abstract class SharedSprayPainterSystem : EntitySystem -{ - [Dependency] protected readonly IPrototypeManager _prototypeManager = default!; - - public List Styles { get; private set; } = new(); - public List Groups { get; private set; } = new(); - - public override void Initialize() - { - base.Initialize(); - - SortedSet styles = new(); - foreach (AirlockGroupPrototype grp in _prototypeManager.EnumeratePrototypes()) - { - Groups.Add(grp); - foreach (string style in grp.StylePaths.Keys) - { - styles.Add(style); - } - } - Styles = styles.ToList(); - } -} diff --git a/Content.Shared/SprayPainter/SharedSprayPainterSystem.cs b/Content.Shared/SprayPainter/SharedSprayPainterSystem.cs new file mode 100644 index 00000000000..c0f0f6d1153 --- /dev/null +++ b/Content.Shared/SprayPainter/SharedSprayPainterSystem.cs @@ -0,0 +1,202 @@ +using Content.Shared.Administration.Logs; +using Content.Shared.Database; +using Content.Shared.DoAfter; +using Content.Shared.Doors.Components; +using Content.Shared.Interaction; +using Content.Shared.Popups; +using Content.Shared.SprayPainter.Components; +using Content.Shared.SprayPainter.Prototypes; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Prototypes; +using System.Linq; + +namespace Content.Shared.SprayPainter; + +/// +/// System for painting airlocks using a spray painter. +/// Pipes are handled serverside since AtmosPipeColorSystem is server only. +/// +public abstract class SharedSprayPainterSystem : EntitySystem +{ + [Dependency] protected readonly IPrototypeManager Proto = default!; + [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + [Dependency] protected readonly SharedAppearanceSystem Appearance = default!; + [Dependency] protected readonly SharedAudioSystem Audio = default!; + [Dependency] protected readonly SharedDoAfterSystem DoAfter = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly SharedUserInterfaceSystem _ui = default!; + + public List Styles { get; private set; } = new(); + public List Groups { get; private set; } = new(); + + [ValidatePrototypeId] + private const string Departments = "Departments"; + + public override void Initialize() + { + base.Initialize(); + + CacheStyles(); + + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnDoorDoAfter); + Subs.BuiEvents(SprayPainterUiKey.Key, subs => + { + subs.Event(OnSpritePicked); + subs.Event(OnColorPicked); + }); + + SubscribeLocalEvent(OnAirlockInteract); + + SubscribeLocalEvent(OnPrototypesReloaded); + } + + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + if (ent.Comp.ColorPalette.Count == 0) + return; + + SetColor(ent, ent.Comp.ColorPalette.First().Key); + } + + private void OnDoorDoAfter(Entity ent, ref SprayPainterDoorDoAfterEvent args) + { + ent.Comp.AirlockDoAfter = null; + + if (args.Handled || args.Cancelled) + return; + + if (args.Args.Target is not {} target) + return; + + if (!TryComp(target, out var airlock)) + return; + + airlock.Department = args.Department; + Dirty(target, airlock); + + Audio.PlayPredicted(ent.Comp.SpraySound, ent, args.Args.User); + Appearance.SetData(target, DoorVisuals.BaseRSI, args.Sprite); + _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(args.Args.User):user} painted {ToPrettyString(args.Args.Target.Value):target}"); + + args.Handled = true; + } + + #region UI messages + + private void OnColorPicked(Entity ent, ref SprayPainterColorPickedMessage args) + { + SetColor(ent, args.Key); + } + + private void OnSpritePicked(Entity ent, ref SprayPainterSpritePickedMessage args) + { + if (args.Index >= Styles.Count) + return; + + ent.Comp.Index = args.Index; + Dirty(ent, ent.Comp); + } + + private void SetColor(Entity ent, string? paletteKey) + { + if (paletteKey == null || paletteKey == ent.Comp.PickedColor) + return; + + if (!ent.Comp.ColorPalette.ContainsKey(paletteKey)) + return; + + ent.Comp.PickedColor = paletteKey; + Dirty(ent, ent.Comp); + } + + #endregion + + private void OnAirlockInteract(Entity ent, ref InteractUsingEvent args) + { + if (args.Handled) + return; + + if (!TryComp(args.Used, out var painter) || painter.AirlockDoAfter != null) + return; + + var group = Proto.Index(ent.Comp.Group); + + var style = Styles[painter.Index]; + if (!group.StylePaths.TryGetValue(style.Name, out var sprite)) + { + string msg = Loc.GetString("spray-painter-style-not-available"); + _popup.PopupEntity(msg, args.User, args.User); + return; + } + + var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, painter.AirlockSprayTime, new SprayPainterDoorDoAfterEvent(sprite, style.Department), args.Used, target: ent, used: args.Used) + { + BreakOnTargetMove = true, + BreakOnUserMove = true, + BreakOnDamage = true, + NeedHand = true + }; + if (!DoAfter.TryStartDoAfter(doAfterEventArgs, out var id)) + return; + + // since we are now spraying an airlock prevent spraying more at the same time + // pipes ignore this + painter.AirlockDoAfter = id; + args.Handled = true; + + // Log the attempt + _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(args.User):user} is painting {ToPrettyString(ent):target} to '{style.Name}' at {Transform(ent).Coordinates:targetlocation}"); + } + + #region Style caching + + private void OnPrototypesReloaded(PrototypesReloadedEventArgs args) + { + if (!args.WasModified() && !args.WasModified()) + return; + + Styles.Clear(); + Groups.Clear(); + CacheStyles(); + + // style index might be invalid now so check them all + var max = Styles.Count - 1; + var query = AllEntityQuery(); + while (query.MoveNext(out var uid, out var comp)) + { + if (comp.Index > max) + { + comp.Index = max; + Dirty(uid, comp); + } + } + } + + protected virtual void CacheStyles() + { + // collect every style's name + var names = new SortedSet(); + foreach (var group in Proto.EnumeratePrototypes()) + { + Groups.Add(group); + foreach (var style in group.StylePaths.Keys) + { + names.Add(style); + } + } + + // get their department ids too for the final style list + var departments = Proto.Index(Departments); + Styles.Capacity = names.Count; + foreach (var name in names) + { + departments.Departments.TryGetValue(name, out var department); + Styles.Add(new AirlockStyle(name, department)); + } + } + + #endregion +} + +public record struct AirlockStyle(string Name, string? Department); diff --git a/Content.Shared/SprayPainter/SprayPainterEvents.cs b/Content.Shared/SprayPainter/SprayPainterEvents.cs index f0e02086104..b88b054ad14 100644 --- a/Content.Shared/SprayPainter/SprayPainterEvents.cs +++ b/Content.Shared/SprayPainter/SprayPainterEvents.cs @@ -12,7 +12,7 @@ public enum SprayPainterUiKey [Serializable, NetSerializable] public sealed class SprayPainterSpritePickedMessage : BoundUserInterfaceMessage { - public int Index { get; } + public readonly int Index; public SprayPainterSpritePickedMessage(int index) { @@ -23,7 +23,7 @@ public SprayPainterSpritePickedMessage(int index) [Serializable, NetSerializable] public sealed class SprayPainterColorPickedMessage : BoundUserInterfaceMessage { - public string? Key { get; } + public readonly string? Key; public SprayPainterColorPickedMessage(string? key) { @@ -32,36 +32,40 @@ public SprayPainterColorPickedMessage(string? key) } [Serializable, NetSerializable] -public sealed class SprayPainterBoundUserInterfaceState : BoundUserInterfaceState +public sealed partial class SprayPainterDoorDoAfterEvent : DoAfterEvent { - public int SelectedStyle { get; } - public string? SelectedColorKey { get; } - public Dictionary Palette { get; } + /// + /// Base RSI path to set for the door sprite. + /// + [DataField] + public string Sprite; - public SprayPainterBoundUserInterfaceState(int selectedStyle, string? selectedColorKey, Dictionary palette) + /// + /// Department id to set for the door, if the style has one. + /// + [DataField] + public string? Department; + + public SprayPainterDoorDoAfterEvent(string sprite, string? department) { - SelectedStyle = selectedStyle; - SelectedColorKey = selectedColorKey; - Palette = palette; + Sprite = sprite; + Department = department; } + + public override DoAfterEvent Clone() => this; } [Serializable, NetSerializable] -public sealed partial class SprayPainterDoAfterEvent : DoAfterEvent +public sealed partial class SprayPainterPipeDoAfterEvent : DoAfterEvent { - [DataField("sprite")] - public string? Sprite = null; - - [DataField("color")] - public Color? Color = null; + /// + /// Color of the pipe to set. + /// + [DataField] + public Color Color; - private SprayPainterDoAfterEvent() + public SprayPainterPipeDoAfterEvent(Color color) { - } - - public SprayPainterDoAfterEvent(string? sprite, Color? color) - { - Sprite = sprite; Color = color; } diff --git a/Resources/Prototypes/Entities/Objects/Tools/spray_painter.yml b/Resources/Prototypes/Entities/Objects/Tools/spray_painter.yml index 8a8c569510d..903b8d3f906 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/spray_painter.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/spray_painter.yml @@ -4,24 +4,31 @@ name: spray painter description: A spray painter for painting airlocks and pipes. components: - - type: Sprite - sprite: Objects/Tools/spray_painter.rsi - state: spray_painter - - type: Item - sprite: Objects/Tools/spray_painter.rsi - - type: UserInterface - interfaces: - - key: enum.SprayPainterUiKey.Key - type: SprayPainterBoundUserInterface - - type: SprayPainter - colorPalette: - red: '#FF1212FF' - yellow: '#B3A234FF' - brown: '#947507FF' - green: '#3AB334FF' - cyan: '#03FCD3FF' - blue: '#0335FCFF' - white: '#FFFFFFFF' - black: '#333333FF' - - type: StaticPrice - price: 40 + - type: Sprite + sprite: Objects/Tools/spray_painter.rsi + state: spray_painter + - type: Item + sprite: Objects/Tools/spray_painter.rsi + - type: ActivatableUI + key: enum.SprayPainterUiKey.Key + - type: UserInterface + interfaces: + - key: enum.SprayPainterUiKey.Key + type: SprayPainterBoundUserInterface + - type: SprayPainter + colorPalette: + red: '#FF1212FF' + yellow: '#B3A234FF' + brown: '#947507FF' + green: '#3AB334FF' + cyan: '#03FCD3FF' + blue: '#0335FCFF' + white: '#FFFFFFFF' + black: '#333333FF' + # standard atmos pipes + waste: '#990000' + distro: '#0055cc' + air: '#03fcd3' + mix: '#947507' + - type: StaticPrice + price: 40 diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/airlocks.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/airlocks.yml index 227221472ae..536fa55e123 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/airlocks.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/airlocks.yml @@ -13,9 +13,11 @@ components: - type: Sprite sprite: Structures/Doors/Airlocks/Standard/engineering.rsi + - type: PaintableAirlock + department: Engineering - type: entity - parent: Airlock + parent: AirlockEngineering id: AirlockAtmospherics suffix: Atmospherics components: @@ -29,6 +31,8 @@ components: - type: Sprite sprite: Structures/Doors/Airlocks/Standard/cargo.rsi + - type: PaintableAirlock + department: Cargo - type: entity parent: Airlock @@ -37,9 +41,11 @@ components: - type: Sprite sprite: Structures/Doors/Airlocks/Standard/medical.rsi + - type: PaintableAirlock + department: Medical - type: entity - parent: Airlock + parent: AirlockMedical id: AirlockVirology suffix: Virology components: @@ -47,12 +53,9 @@ sprite: Structures/Doors/Airlocks/Standard/virology.rsi - type: entity - parent: Airlock + parent: AirlockMedical id: AirlockChemistry suffix: Chemistry - components: - - type: Sprite - sprite: Structures/Doors/Airlocks/Standard/medical.rsi - type: entity parent: Airlock @@ -61,6 +64,8 @@ components: - type: Sprite sprite: Structures/Doors/Airlocks/Standard/science.rsi + - type: PaintableAirlock + department: Science - type: entity parent: Airlock @@ -71,6 +76,8 @@ sprite: Structures/Doors/Airlocks/Standard/command.rsi - type: WiresPanelSecurity securityLevel: medSecurity + - type: PaintableAirlock + department: Command - type: entity parent: Airlock @@ -79,6 +86,8 @@ components: - type: Sprite sprite: Structures/Doors/Airlocks/Standard/security.rsi + - type: PaintableAirlock + department: Security - type: entity parent: Airlock @@ -89,7 +98,7 @@ sprite: Structures/Doors/Airlocks/Standard/maint.rsi - type: entity - parent: Airlock + parent: AirlockSecurity # if you get syndie door somehow it counts as sec id: AirlockSyndicate suffix: Syndicate components: @@ -97,7 +106,7 @@ sprite: Structures/Doors/Airlocks/Standard/syndicate.rsi - type: entity - parent: Airlock + parent: AirlockCargo id: AirlockMining suffix: Mining(Salvage) components: @@ -105,14 +114,12 @@ sprite: Structures/Doors/Airlocks/Standard/mining.rsi - type: entity - parent: Airlock + parent: AirlockCommand # if you get centcom door somehow it counts as command, also inherit panel id: AirlockCentralCommand suffix: Central Command components: - type: Sprite sprite: Structures/Doors/Airlocks/Standard/centcomm.rsi - - type: WiresPanelSecurity - securityLevel: medSecurity - type: entity parent: Airlock @@ -181,7 +188,7 @@ - type: Sprite sprite: Structures/Doors/Airlocks/Glass/engineering.rsi - type: PaintableAirlock - group: Glass + department: Engineering - type: entity parent: AirlockGlass @@ -190,18 +197,14 @@ components: - type: Sprite sprite: Structures/Doors/Airlocks/Glass/maint.rsi - - type: PaintableAirlock - group: Glass - type: entity - parent: AirlockGlass + parent: AirlockEngineeringGlass id: AirlockAtmosphericsGlass suffix: Atmospherics components: - type: Sprite sprite: Structures/Doors/Airlocks/Glass/atmospherics.rsi - - type: PaintableAirlock - group: Glass - type: entity parent: AirlockGlass @@ -211,17 +214,7 @@ - type: Sprite sprite: Structures/Doors/Airlocks/Glass/cargo.rsi - type: PaintableAirlock - group: Glass - -- type: entity - parent: AirlockGlass - id: AirlockChemistryGlass - suffix: Chemistry - components: - - type: Sprite - sprite: Structures/Doors/Airlocks/Glass/medical.rsi - - type: PaintableAirlock - group: Glass + department: Cargo - type: entity parent: AirlockGlass @@ -231,17 +224,20 @@ - type: Sprite sprite: Structures/Doors/Airlocks/Glass/medical.rsi - type: PaintableAirlock - group: Glass + department: Medical - type: entity - parent: AirlockGlass + parent: AirlockMedicalGlass + id: AirlockChemistryGlass + suffix: Chemistry + +- type: entity + parent: AirlockMedicalGlass id: AirlockVirologyGlass suffix: Virology components: - type: Sprite sprite: Structures/Doors/Airlocks/Glass/virology.rsi - - type: PaintableAirlock - group: Glass - type: entity parent: AirlockGlass @@ -251,7 +247,7 @@ - type: Sprite sprite: Structures/Doors/Airlocks/Glass/science.rsi - type: PaintableAirlock - group: Glass + department: Science - type: entity parent: AirlockGlass @@ -261,7 +257,7 @@ - type: Sprite sprite: Structures/Doors/Airlocks/Glass/command.rsi - type: PaintableAirlock - group: Glass + department: Command - type: WiresPanelSecurity securityLevel: medSecurity @@ -273,20 +269,18 @@ - type: Sprite sprite: Structures/Doors/Airlocks/Glass/security.rsi - type: PaintableAirlock - group: Glass + department: Security - type: entity - parent: AirlockGlass + parent: AirlockSecurityGlass # see standard id: AirlockSyndicateGlass suffix: Syndicate components: - type: Sprite sprite: Structures/Doors/Airlocks/Glass/syndicate.rsi - - type: PaintableAirlock - group: Glass - type: entity - parent: AirlockGlass + parent: AirlockCargoGlass id: AirlockMiningGlass suffix: Mining(Salvage) components: @@ -294,7 +288,7 @@ sprite: Structures/Doors/Airlocks/Glass/mining.rsi - type: entity - parent: AirlockGlass + parent: AirlockCommandGlass # see standard id: AirlockCentralCommandGlass suffix: Central Command components: @@ -302,4 +296,3 @@ sprite: Structures/Doors/Airlocks/Glass/centcomm.rsi - type: WiresPanelSecurity securityLevel: medSecurity - diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml index d610fb25fba..9930e6631de 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml @@ -134,6 +134,7 @@ mode: NoSprite - type: PaintableAirlock group: Standard + department: Civilian - type: AccessReader - type: StaticPrice price: 150 diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/external.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/external.yml index 5e2eb5689fb..75b23f70719 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/external.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/external.yml @@ -18,6 +18,7 @@ sprite: Structures/Doors/Airlocks/Standard/external.rsi - type: PaintableAirlock group: External + department: null - type: entity parent: AirlockExternal diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml index 8c5aa49b8e7..21d485be0c8 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/shuttle.yml @@ -64,6 +64,7 @@ - ForceNoFixRotations - type: PaintableAirlock group: Shuttle + department: null - type: Construction graph: AirlockShuttle node: airlock diff --git a/Resources/Prototypes/Entities/Structures/Doors/airlock_groups.yml b/Resources/Prototypes/Entities/Structures/Doors/airlock_groups.yml index b22d11826ce..09ce1a05d94 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/airlock_groups.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/airlock_groups.yml @@ -58,3 +58,19 @@ iconPriority: 40 stylePaths: shuttle: Structures/Doors/Airlocks/Glass/shuttle.rsi + +# fun +- type: airlockDepartments + id: Departments + departments: + atmospherics: Engineering + basic: Civilian + cargo: Cargo + command: Command + engineering: Engineering + freezer: Civilian + maintenance: Civilian + medical: Medical + science: Science + security: Security + virology: Medical From 22acbfd31c0459df84ad8dbed69139f7128bb478 Mon Sep 17 00:00:00 2001 From: themias <89101928+themias@users.noreply.github.com> Date: Thu, 1 Feb 2024 17:33:53 -0500 Subject: [PATCH 158/266] Fix cryopod debug assert (#24830) (cherry picked from commit efb623de19d1107f6319ebef451c043c0c606579) --- Content.Server/Medical/CryoPodSystem.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Content.Server/Medical/CryoPodSystem.cs b/Content.Server/Medical/CryoPodSystem.cs index e05dc2494fb..2f08dfddd17 100644 --- a/Content.Server/Medical/CryoPodSystem.cs +++ b/Content.Server/Medical/CryoPodSystem.cs @@ -181,6 +181,9 @@ private void OnActivateUIAttempt(Entity entity, ref Activatabl private void OnActivateUI(Entity entity, ref AfterActivatableUIOpenEvent args) { + if (!entity.Comp.BodyContainer.ContainedEntity.HasValue) + return; + TryComp(entity.Comp.BodyContainer.ContainedEntity, out var temp); TryComp(entity.Comp.BodyContainer.ContainedEntity, out var bloodstream); @@ -189,7 +192,8 @@ private void OnActivateUI(Entity entity, ref AfterActivatableU HealthAnalyzerUiKey.Key, new HealthAnalyzerScannedUserMessage(GetNetEntity(entity.Comp.BodyContainer.ContainedEntity), temp?.CurrentTemperature ?? 0, - (bloodstream != null && _solutionContainerSystem.ResolveSolution(entity.Owner, bloodstream.BloodSolutionName, ref bloodstream.BloodSolution, out var bloodSolution)) + (bloodstream != null && _solutionContainerSystem.ResolveSolution(entity.Comp.BodyContainer.ContainedEntity.Value, + bloodstream.BloodSolutionName, ref bloodstream.BloodSolution, out var bloodSolution)) ? bloodSolution.FillFraction : 0 )); From 7113ea3a1381e2a34fe58293a992569da93e2cb3 Mon Sep 17 00:00:00 2001 From: themias <89101928+themias@users.noreply.github.com> Date: Thu, 1 Feb 2024 17:34:09 -0500 Subject: [PATCH 159/266] Add Diona salute sound (#24836) (cherry picked from commit f25093e85e25ca0ea7a5c22a7a74b8a3287119e7) --- Resources/Audio/Voice/Diona/attributions.yml | 4 ++++ Resources/Audio/Voice/Diona/diona_salute.ogg | Bin 0 -> 14722 bytes .../Prototypes/Voice/speech_emote_sounds.yml | 4 ++++ 3 files changed, 8 insertions(+) create mode 100644 Resources/Audio/Voice/Diona/diona_salute.ogg diff --git a/Resources/Audio/Voice/Diona/attributions.yml b/Resources/Audio/Voice/Diona/attributions.yml index 5402ff65d3d..c5f3903944b 100644 --- a/Resources/Audio/Voice/Diona/attributions.yml +++ b/Resources/Audio/Voice/Diona/attributions.yml @@ -14,3 +14,7 @@ license: "CC0-1.0" copyright: "Made by nicoproson on freesound.org. The three files were cropped out of the source file and re-encoded to Ogg Vorbis." source: "https://freesound.org/people/nicoproson/sounds/631406/" +- files: ["diona_salute.ogg"] + license: "CC-BY-3.0" + copyright: "Taken from tgstation" + source: "https://github.com/tgstation/tgstation/tree/943f38bf7c5f9c048cc785deb0c537d57ee6ba77/sound/creatures/venus_trap_hurt.ogg" \ No newline at end of file diff --git a/Resources/Audio/Voice/Diona/diona_salute.ogg b/Resources/Audio/Voice/Diona/diona_salute.ogg new file mode 100644 index 0000000000000000000000000000000000000000..00ef59cc8003b9b682c5143ff13730b519fcec1f GIT binary patch literal 14722 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 literal 0 HcmV?d00001 diff --git a/Resources/Prototypes/Voice/speech_emote_sounds.yml b/Resources/Prototypes/Voice/speech_emote_sounds.yml index 96859954002..f6b630e5c00 100644 --- a/Resources/Prototypes/Voice/speech_emote_sounds.yml +++ b/Resources/Prototypes/Voice/speech_emote_sounds.yml @@ -297,6 +297,10 @@ path: /Audio/Voice/Diona/diona_snap.ogg params: volume: -10 + Salute: + path: /Audio/Voice/Diona/diona_salute.ogg + params: + volume: -5 # mobs - type: emoteSounds From 08bd54468f9946a50174527ef45616ea9e85026f Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 1 Feb 2024 22:35:15 +0000 Subject: [PATCH 160/266] Automatic changelog update (cherry picked from commit 1b424d6925eebeb58fd3c9885bde786dae447c19) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 690ed04bca4..69520b09d55 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: deltanedas - changes: - - message: Crusher Glaives can be made with the Salvage Weapons technology. - type: Add - id: 5364 - time: '2023-12-15T01:34:37.0000000+00:00' - author: brainfood1183 changes: - message: Acidifier now has a sprite effect. @@ -3867,3 +3861,10 @@ id: 5863 time: '2024-02-01T22:21:04.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24826 +- author: themias + changes: + - message: Added sound effect for Diona salutes + type: Add + id: 5864 + time: '2024-02-01T22:34:09.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24836 From 08452730d38cf0effb2aa8607e3f7fac88e318e3 Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 1 Feb 2024 22:50:59 +0000 Subject: [PATCH 161/266] Automatic changelog update (cherry picked from commit 92dcc0a03797440bb26699dc4a067e23ee10c1bb) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 69520b09d55..5f205168c38 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: brainfood1183 - changes: - - message: Acidifier now has a sprite effect. - type: Tweak - id: 5365 - time: '2023-12-15T01:56:42.0000000+00:00' - author: Ubaser changes: - message: Mercury poisoning now causes stuttering. @@ -3868,3 +3862,10 @@ id: 5864 time: '2024-02-01T22:34:09.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24836 +- author: Dutch-VanDerLinde + changes: + - message: Detectives are now listed under civilian instead of security. + type: Tweak + id: 5865 + time: '2024-02-01T22:49:54.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24739 From 1f3659ab14e3b5e5c1de138c543a3da2e018632f Mon Sep 17 00:00:00 2001 From: Vasilis Date: Fri, 2 Feb 2024 00:41:43 +0100 Subject: [PATCH 162/266] Nerf the fridge explosion resistance (#24844) Nerf (cherry picked from commit 20ecbc252cc0bdc4cb010ab8219902a948403c77) --- .../Entities/Structures/Storage/Closets/Lockers/lockers.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/lockers.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/lockers.yml index 59603028c28..dbbd9b16ae9 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/lockers.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/lockers.yml @@ -156,7 +156,7 @@ stateDoorOpen: freezer_open stateDoorClosed: freezer_door - type: ExplosionResistance - damageCoefficient: 0.01 + damageCoefficient: 0.50 - type: AntiRottingContainer - type: entity From 203ef202a644d5c2bfdcb0779ed7dcf9eb105ed7 Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 1 Feb 2024 23:42:49 +0000 Subject: [PATCH 163/266] Automatic changelog update (cherry picked from commit d356a075e65c68656c3ac1ae591806a0fafbc352) --- Resources/Changelog/Changelog.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 5f205168c38..da566e9dcdb 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: Ubaser - changes: - - message: Mercury poisoning now causes stuttering. - type: Tweak - id: 5366 - time: '2023-12-15T09:28:13.0000000+00:00' - author: ninruB changes: - message: Reptilians no longer innately take 30% less heat damage. @@ -3869,3 +3863,11 @@ id: 5865 time: '2024-02-01T22:49:54.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24739 +- author: VasilisThePikachu + changes: + - message: The fridge's explosion resistance has been nerfed significantly, It's + no longer able to survive nukes at point blank range of the nuke. + type: Tweak + id: 5866 + time: '2024-02-01T23:41:43.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24844 From d47df4cceb1a39e0ceffd9805621927a2032fab6 Mon Sep 17 00:00:00 2001 From: Hanz <41141796+Hanzdegloker@users.noreply.github.com> Date: Thu, 1 Feb 2024 19:49:42 -0500 Subject: [PATCH 164/266] Booze/Soda Dispenser label fix (#24848) This is literally it Ayup (cherry picked from commit 82434e7959d307f3cf4da77dfaca7241e6a0691c) --- .../Entities/Objects/Consumable/Drinks/drinks_bottles.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml index 77db111195a..2c156d58289 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml @@ -669,6 +669,8 @@ - ReagentId: Mead Quantity: 150 - type: Drink + - type: Label + currentLabel: mead - type: entity parent: DrinkBottlePlasticBaseFull @@ -756,7 +758,7 @@ - type: entity parent: DrinkBottlePlasticBaseFull id: DrinkDrGibbJug - name: dr gibb jug + name: dr gibb. jug description: yeah I don't know either... components: - type: SolutionContainerManager From c68e6eac1adfb9f32f601e8959a7a7140616486b Mon Sep 17 00:00:00 2001 From: Arendian <137322659+Arendian@users.noreply.github.com> Date: Fri, 2 Feb 2024 05:24:20 +0100 Subject: [PATCH 165/266] Fix slipping through fences (#24850) * Can't slide under fences anymore * Small mobs can't pass instead (cherry picked from commit 214961f46e18caae66ea3fe902a22b0e9750c243) --- .../Entities/Structures/Walls/fence_metal.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Resources/Prototypes/Entities/Structures/Walls/fence_metal.yml b/Resources/Prototypes/Entities/Structures/Walls/fence_metal.yml index 559970aa91f..88d2f272c08 100644 --- a/Resources/Prototypes/Entities/Structures/Walls/fence_metal.yml +++ b/Resources/Prototypes/Entities/Structures/Walls/fence_metal.yml @@ -163,7 +163,8 @@ mask: - FullTileMask layer: - - TableLayer + - MidImpassable + - LowImpassable - type: InteractionPopup interactSuccessString: fence-rattle-success messagePerceivedByOthers: fence-rattle-success @@ -230,7 +231,8 @@ mask: - TableMask layer: - - TableLayer + - MidImpassable + - LowImpassable - type: InteractionPopup interactSuccessString: fence-rattle-success messagePerceivedByOthers: fence-rattle-success @@ -266,7 +268,8 @@ mask: - TableMask layer: - - TableLayer + - MidImpassable + - LowImpassable - type: InteractionPopup interactSuccessString: fence-rattle-success messagePerceivedByOthers: fence-rattle-success @@ -301,7 +304,8 @@ mask: - TableMask layer: - - TableLayer + - MidImpassable + - LowImpassable - type: InteractionOutline - type: Door openSpriteState: door_opened From 087526a58491d5063fac02696941c041f99352dd Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 2 Feb 2024 04:25:25 +0000 Subject: [PATCH 166/266] Automatic changelog update (cherry picked from commit dfa86fbff81eacc832cf2f260e7a939cc98daa69) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index da566e9dcdb..baeeedb6147 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: ninruB - changes: - - message: Reptilians no longer innately take 30% less heat damage. - type: Tweak - id: 5367 - time: '2023-12-15T09:37:05.0000000+00:00' - author: keronshb changes: - message: Added the Action Upgrade System - used to upgrade specific actions! @@ -3871,3 +3865,10 @@ id: 5866 time: '2024-02-01T23:41:43.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24844 +- author: Dygon + changes: + - message: You can't slip through chain link fences anymore. + type: Fix + id: 5867 + time: '2024-02-02T04:24:20.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24850 From b6a34481084f5e715b26f1e4a160a0038392e44e Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Fri, 2 Feb 2024 15:25:58 +1100 Subject: [PATCH 167/266] Make popups nullable (#24802) This standardises it with audio and whatever. Me when I sprinkle nullchecks everywhere. Was 50/50 on making new non-nullable methods but figured it would bloat too hard and you can't access strings by .Value anyway. (cherry picked from commit 606c5a8c8b1005de62c33d5de888f67a8eae0ccc) --- Content.Client/Popups/PopupSystem.cs | 48 ++++++++++--------- Content.Server/Popups/PopupSystem.cs | 55 +++++++++++++++++----- Content.Shared/Popups/SharedPopupSystem.cs | 24 +++++----- 3 files changed, 81 insertions(+), 46 deletions(-) diff --git a/Content.Client/Popups/PopupSystem.cs b/Content.Client/Popups/PopupSystem.cs index d68272a107e..d9e66c79fa9 100644 --- a/Content.Client/Popups/PopupSystem.cs +++ b/Content.Client/Popups/PopupSystem.cs @@ -55,8 +55,11 @@ public override void Shutdown() .RemoveOverlay(); } - private void PopupMessage(string message, PopupType type, EntityCoordinates coordinates, EntityUid? entity, bool recordReplay) + private void PopupMessage(string? message, PopupType type, EntityCoordinates coordinates, EntityUid? entity, bool recordReplay) { + if (message == null) + return; + if (recordReplay && _replayRecording.IsRecording) { if (entity != null) @@ -75,25 +78,28 @@ private void PopupMessage(string message, PopupType type, EntityCoordinates coor } #region Abstract Method Implementations - public override void PopupCoordinates(string message, EntityCoordinates coordinates, PopupType type = PopupType.Small) + public override void PopupCoordinates(string? message, EntityCoordinates coordinates, PopupType type = PopupType.Small) { PopupMessage(message, type, coordinates, null, true); } - public override void PopupCoordinates(string message, EntityCoordinates coordinates, ICommonSession recipient, PopupType type = PopupType.Small) + public override void PopupCoordinates(string? message, EntityCoordinates coordinates, ICommonSession recipient, PopupType type = PopupType.Small) { - if (_playerManager.LocalPlayer?.Session == recipient) + if (_playerManager.LocalSession == recipient) PopupMessage(message, type, coordinates, null, true); } - public override void PopupCoordinates(string message, EntityCoordinates coordinates, EntityUid recipient, PopupType type = PopupType.Small) + public override void PopupCoordinates(string? message, EntityCoordinates coordinates, EntityUid recipient, PopupType type = PopupType.Small) { - if (_playerManager.LocalPlayer?.ControlledEntity == recipient) + if (_playerManager.LocalEntity == recipient) PopupMessage(message, type, coordinates, null, true); } - private void PopupCursorInternal(string message, PopupType type, bool recordReplay) + private void PopupCursorInternal(string? message, PopupType type, bool recordReplay) { + if (message == null) + return; + if (recordReplay && _replayRecording.IsRecording) _replayRecording.RecordClientMessage(new PopupCursorEvent(message, type)); @@ -106,53 +112,53 @@ private void PopupCursorInternal(string message, PopupType type, bool recordRepl _aliveCursorLabels.Add(label); } - public override void PopupCursor(string message, PopupType type = PopupType.Small) + public override void PopupCursor(string? message, PopupType type = PopupType.Small) => PopupCursorInternal(message, type, true); - public override void PopupCursor(string message, ICommonSession recipient, PopupType type = PopupType.Small) + public override void PopupCursor(string? message, ICommonSession recipient, PopupType type = PopupType.Small) { - if (_playerManager.LocalPlayer?.Session == recipient) + if (_playerManager.LocalSession == recipient) PopupCursor(message, type); } - public override void PopupCursor(string message, EntityUid recipient, PopupType type = PopupType.Small) + public override void PopupCursor(string? message, EntityUid recipient, PopupType type = PopupType.Small) { - if (_playerManager.LocalPlayer?.ControlledEntity == recipient) + if (_playerManager.LocalEntity == recipient) PopupCursor(message, type); } - public override void PopupCoordinates(string message, EntityCoordinates coordinates, Filter filter, bool replayRecord, PopupType type = PopupType.Small) + public override void PopupCoordinates(string? message, EntityCoordinates coordinates, Filter filter, bool replayRecord, PopupType type = PopupType.Small) { PopupCoordinates(message, coordinates, type); } - public override void PopupEntity(string message, EntityUid uid, EntityUid recipient, PopupType type = PopupType.Small) + public override void PopupEntity(string? message, EntityUid uid, EntityUid recipient, PopupType type = PopupType.Small) { - if (_playerManager.LocalPlayer?.ControlledEntity == recipient) + if (_playerManager.LocalEntity == recipient) PopupEntity(message, uid, type); } - public override void PopupEntity(string message, EntityUid uid, ICommonSession recipient, PopupType type = PopupType.Small) + public override void PopupEntity(string? message, EntityUid uid, ICommonSession recipient, PopupType type = PopupType.Small) { - if (_playerManager.LocalPlayer?.Session == recipient) + if (_playerManager.LocalSession == recipient) PopupEntity(message, uid, type); } - public override void PopupEntity(string message, EntityUid uid, Filter filter, bool recordReplay, PopupType type=PopupType.Small) + public override void PopupEntity(string? message, EntityUid uid, Filter filter, bool recordReplay, PopupType type=PopupType.Small) { - if (!filter.Recipients.Contains(_playerManager.LocalPlayer?.Session)) + if (!filter.Recipients.Contains(_playerManager.LocalSession)) return; PopupEntity(message, uid, type); } - public override void PopupClient(string message, EntityUid uid, EntityUid recipient, PopupType type = PopupType.Small) + public override void PopupClient(string? message, EntityUid uid, EntityUid recipient, PopupType type = PopupType.Small) { if (_timing.IsFirstTimePredicted) PopupEntity(message, uid, recipient, type); } - public override void PopupEntity(string message, EntityUid uid, PopupType type = PopupType.Small) + public override void PopupEntity(string? message, EntityUid uid, PopupType type = PopupType.Small) { if (TryComp(uid, out TransformComponent? transform)) PopupMessage(message, type, transform.Coordinates, uid, true); diff --git a/Content.Server/Popups/PopupSystem.cs b/Content.Server/Popups/PopupSystem.cs index 61ccaf4423a..4d9a9f3bf5b 100644 --- a/Content.Server/Popups/PopupSystem.cs +++ b/Content.Server/Popups/PopupSystem.cs @@ -13,70 +13,99 @@ public sealed class PopupSystem : SharedPopupSystem [Dependency] private readonly IConfigurationManager _cfg = default!; [Dependency] private readonly TransformSystem _xform = default!; - public override void PopupCursor(string message, PopupType type = PopupType.Small) + public override void PopupCursor(string? message, PopupType type = PopupType.Small) { // No local user. } - public override void PopupCursor(string message, ICommonSession recipient, PopupType type=PopupType.Small) + public override void PopupCursor(string? message, ICommonSession recipient, PopupType type=PopupType.Small) { + if (message == null) + return; + RaiseNetworkEvent(new PopupCursorEvent(message, type), recipient); } - public override void PopupCursor(string message, EntityUid recipient, PopupType type = PopupType.Small) + public override void PopupCursor(string? message, EntityUid recipient, PopupType type = PopupType.Small) { + if (message == null) + return; + if (TryComp(recipient, out ActorComponent? actor)) RaiseNetworkEvent(new PopupCursorEvent(message, type), actor.PlayerSession); } - public override void PopupCoordinates(string message, EntityCoordinates coordinates, Filter filter, bool replayRecord, PopupType type = PopupType.Small) + public override void PopupCoordinates(string? message, EntityCoordinates coordinates, Filter filter, bool replayRecord, PopupType type = PopupType.Small) { + if (message == null) + return; + RaiseNetworkEvent(new PopupCoordinatesEvent(message, type, GetNetCoordinates(coordinates)), filter, replayRecord); } - public override void PopupCoordinates(string message, EntityCoordinates coordinates, PopupType type = PopupType.Small) + public override void PopupCoordinates(string? message, EntityCoordinates coordinates, PopupType type = PopupType.Small) { + if (message == null) + return; + var mapPos = coordinates.ToMap(EntityManager, _xform); var filter = Filter.Empty().AddPlayersByPvs(mapPos, entManager: EntityManager, playerMan: _player, cfgMan: _cfg); RaiseNetworkEvent(new PopupCoordinatesEvent(message, type, GetNetCoordinates(coordinates)), filter); } - public override void PopupCoordinates(string message, EntityCoordinates coordinates, ICommonSession recipient, PopupType type = PopupType.Small) + public override void PopupCoordinates(string? message, EntityCoordinates coordinates, ICommonSession recipient, PopupType type = PopupType.Small) { + if (message == null) + return; + RaiseNetworkEvent(new PopupCoordinatesEvent(message, type, GetNetCoordinates(coordinates)), recipient); } - public override void PopupCoordinates(string message, EntityCoordinates coordinates, EntityUid recipient, PopupType type = PopupType.Small) + public override void PopupCoordinates(string? message, EntityCoordinates coordinates, EntityUid recipient, PopupType type = PopupType.Small) { + if (message == null) + return; + if (TryComp(recipient, out ActorComponent? actor)) RaiseNetworkEvent(new PopupCoordinatesEvent(message, type, GetNetCoordinates(coordinates)), actor.PlayerSession); } - public override void PopupEntity(string message, EntityUid uid, PopupType type = PopupType.Small) + public override void PopupEntity(string? message, EntityUid uid, PopupType type = PopupType.Small) { + if (message == null) + return; + var filter = Filter.Empty().AddPlayersByPvs(uid, entityManager:EntityManager, playerMan: _player, cfgMan: _cfg); RaiseNetworkEvent(new PopupEntityEvent(message, type, GetNetEntity(uid)), filter); } - public override void PopupEntity(string message, EntityUid uid, EntityUid recipient, PopupType type=PopupType.Small) + public override void PopupEntity(string? message, EntityUid uid, EntityUid recipient, PopupType type=PopupType.Small) { + if (message == null) + return; + if (TryComp(recipient, out ActorComponent? actor)) RaiseNetworkEvent(new PopupEntityEvent(message, type, GetNetEntity(uid)), actor.PlayerSession); } - public override void PopupClient(string message, EntityUid uid, EntityUid recipient, PopupType type = PopupType.Small) + public override void PopupClient(string? message, EntityUid uid, EntityUid recipient, PopupType type = PopupType.Small) { // do nothing duh its for client only } - - public override void PopupEntity(string message, EntityUid uid, ICommonSession recipient, PopupType type = PopupType.Small) + public override void PopupEntity(string? message, EntityUid uid, ICommonSession recipient, PopupType type = PopupType.Small) { + if (message == null) + return; + RaiseNetworkEvent(new PopupEntityEvent(message, type, GetNetEntity(uid)), recipient); } - public override void PopupEntity(string message, EntityUid uid, Filter filter, bool recordReplay, PopupType type = PopupType.Small) + public override void PopupEntity(string? message, EntityUid uid, Filter filter, bool recordReplay, PopupType type = PopupType.Small) { + if (message == null) + return; + RaiseNetworkEvent(new PopupEntityEvent(message, type, GetNetEntity(uid)), filter, recordReplay); } } diff --git a/Content.Shared/Popups/SharedPopupSystem.cs b/Content.Shared/Popups/SharedPopupSystem.cs index e4565b90e8b..f8e07e5df5e 100644 --- a/Content.Shared/Popups/SharedPopupSystem.cs +++ b/Content.Shared/Popups/SharedPopupSystem.cs @@ -14,7 +14,7 @@ public abstract class SharedPopupSystem : EntitySystem /// /// The message to display. /// Used to customize how this popup should appear visually. - public abstract void PopupCursor(string message, PopupType type = PopupType.Small); + public abstract void PopupCursor(string? message, PopupType type = PopupType.Small); /// /// Shows a popup at a users' cursor. @@ -22,7 +22,7 @@ public abstract class SharedPopupSystem : EntitySystem /// The message to display. /// Client that will see this popup. /// Used to customize how this popup should appear visually. - public abstract void PopupCursor(string message, ICommonSession recipient, PopupType type = PopupType.Small); + public abstract void PopupCursor(string? message, ICommonSession recipient, PopupType type = PopupType.Small); /// /// Shows a popup at a users' cursor. @@ -30,7 +30,7 @@ public abstract class SharedPopupSystem : EntitySystem /// The message to display. /// Client that will see this popup. /// Used to customize how this popup should appear visually. - public abstract void PopupCursor(string message, EntityUid recipient, PopupType type = PopupType.Small); + public abstract void PopupCursor(string? message, EntityUid recipient, PopupType type = PopupType.Small); /// /// Shows a popup at a world location to every entity in PVS range. @@ -38,7 +38,7 @@ public abstract class SharedPopupSystem : EntitySystem /// The message to display. /// The coordinates where to display the message. /// Used to customize how this popup should appear visually. - public abstract void PopupCoordinates(string message, EntityCoordinates coordinates, PopupType type = PopupType.Small); + public abstract void PopupCoordinates(string? message, EntityCoordinates coordinates, PopupType type = PopupType.Small); /// /// Filtered variant of , which should only be used @@ -46,17 +46,17 @@ public abstract class SharedPopupSystem : EntitySystem /// /// Filter for the players that will see the popup. /// If true, this pop-up will be considered as a globally visible pop-up that gets shown during replays. - public abstract void PopupCoordinates(string message, EntityCoordinates coordinates, Filter filter, bool recordReplay, PopupType type = PopupType.Small); + public abstract void PopupCoordinates(string? message, EntityCoordinates coordinates, Filter filter, bool recordReplay, PopupType type = PopupType.Small); /// /// Variant of that sends a pop-up to the player attached to some entity. /// - public abstract void PopupCoordinates(string message, EntityCoordinates coordinates, EntityUid recipient, PopupType type = PopupType.Small); + public abstract void PopupCoordinates(string? message, EntityCoordinates coordinates, EntityUid recipient, PopupType type = PopupType.Small); /// /// Variant of that sends a pop-up to a specific player. /// - public abstract void PopupCoordinates(string message, EntityCoordinates coordinates, ICommonSession recipient, PopupType type = PopupType.Small); + public abstract void PopupCoordinates(string? message, EntityCoordinates coordinates, ICommonSession recipient, PopupType type = PopupType.Small); /// /// Shows a popup above an entity for every player in pvs range. @@ -64,29 +64,29 @@ public abstract class SharedPopupSystem : EntitySystem /// The message to display. /// The UID of the entity. /// Used to customize how this popup should appear visually. - public abstract void PopupEntity(string message, EntityUid uid, PopupType type=PopupType.Small); + public abstract void PopupEntity(string? message, EntityUid uid, PopupType type=PopupType.Small); /// /// Variant of that shows the popup only to some specific client. /// - public abstract void PopupEntity(string message, EntityUid uid, EntityUid recipient, PopupType type = PopupType.Small); + public abstract void PopupEntity(string? message, EntityUid uid, EntityUid recipient, PopupType type = PopupType.Small); /// /// Variant of that shows the popup only to some specific client. /// - public abstract void PopupEntity(string message, EntityUid uid, ICommonSession recipient, PopupType type = PopupType.Small); + public abstract void PopupEntity(string? message, EntityUid uid, ICommonSession recipient, PopupType type = PopupType.Small); /// /// Filtered variant of , which should only be used /// if the filtering has to be more specific than simply PVS range based. /// - public abstract void PopupEntity(string message, EntityUid uid, Filter filter, bool recordReplay, PopupType type = PopupType.Small); + public abstract void PopupEntity(string? message, EntityUid uid, Filter filter, bool recordReplay, PopupType type = PopupType.Small); /// /// Variant of that only runs on the client, outside of prediction. /// Useful for shared code that is always ran by both sides to avoid duplicate popups. /// - public abstract void PopupClient(string message, EntityUid uid, EntityUid recipient, PopupType type = PopupType.Small); + public abstract void PopupClient(string? message, EntityUid uid, EntityUid recipient, PopupType type = PopupType.Small); } /// From 5826739524f26e367d3fdcae314977a0b949ac17 Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Fri, 2 Feb 2024 04:53:46 +0000 Subject: [PATCH 168/266] fix spray paint popup spam on invalid door (#24857) fix popup spam on invalid door Co-authored-by: deltanedas <@deltanedas:kde.org> (cherry picked from commit 58e28b5136261d4b308a1882fc64c542575d40e7) --- Content.Shared/SprayPainter/SharedSprayPainterSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/SprayPainter/SharedSprayPainterSystem.cs b/Content.Shared/SprayPainter/SharedSprayPainterSystem.cs index c0f0f6d1153..1e784797e33 100644 --- a/Content.Shared/SprayPainter/SharedSprayPainterSystem.cs +++ b/Content.Shared/SprayPainter/SharedSprayPainterSystem.cs @@ -126,7 +126,7 @@ private void OnAirlockInteract(Entity ent, ref Intera if (!group.StylePaths.TryGetValue(style.Name, out var sprite)) { string msg = Loc.GetString("spray-painter-style-not-available"); - _popup.PopupEntity(msg, args.User, args.User); + _popup.PopupClient(msg, args.User, args.User); return; } From 1376f8f0bac0d42773ef48b13427c38b2b98b5fc Mon Sep 17 00:00:00 2001 From: Kevin Zheng Date: Fri, 2 Feb 2024 00:00:06 -0800 Subject: [PATCH 169/266] Add popup message for activating trigger with hand (#24858) (cherry picked from commit 6b1524138b02e1a573f70364e5766705c7cd5e26) --- Content.Server/Explosion/EntitySystems/TriggerSystem.OnUse.cs | 2 ++ Resources/Locale/en-US/weapons/grenades/timer-trigger.ftl | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Content.Server/Explosion/EntitySystems/TriggerSystem.OnUse.cs b/Content.Server/Explosion/EntitySystems/TriggerSystem.OnUse.cs index 373cd1a9956..786d29d94a9 100644 --- a/Content.Server/Explosion/EntitySystems/TriggerSystem.OnUse.cs +++ b/Content.Server/Explosion/EntitySystems/TriggerSystem.OnUse.cs @@ -171,6 +171,8 @@ private void OnTimerUse(EntityUid uid, OnUseTimerTriggerComponent component, Use if (args.Handled || HasComp(uid) || component.UseVerbInstead) return; + _popupSystem.PopupEntity(Loc.GetString("trigger-activated", ("device", uid)), args.User, args.User); + HandleTimerTrigger( uid, args.User, diff --git a/Resources/Locale/en-US/weapons/grenades/timer-trigger.ftl b/Resources/Locale/en-US/weapons/grenades/timer-trigger.ftl index 77e2dd938d6..9a10e9ef044 100644 --- a/Resources/Locale/en-US/weapons/grenades/timer-trigger.ftl +++ b/Resources/Locale/en-US/weapons/grenades/timer-trigger.ftl @@ -12,3 +12,5 @@ verb-start-detonation = Start detonation verb-toggle-start-on-stick = Toggle auto-activation popup-start-on-stick-off = The device will no longer activate automatically when planted popup-start-on-stick-on = The device will now activate automatically when planted + +trigger-activated = You activate {THE($device)}. From 3c2f10a9c0265d2f64046ad53cb7711f9752e7bd Mon Sep 17 00:00:00 2001 From: Psychpsyo <60073468+Psychpsyo@users.noreply.github.com> Date: Fri, 2 Feb 2024 13:39:12 +0100 Subject: [PATCH 170/266] Screen Shake Intensity Slider in Accessibility Settings (#24749) * Reduced motion toggle disables screen shake * Actually, screen shake is its own slider instead * Cache screen shake intensity cvar (cherry picked from commit ba0ca39a7ad5ceef2ae0582e13be5044e6f0a5f7) --- Content.Client/Camera/CameraRecoilSystem.cs | 25 +++++++++++++++++++ Content.Client/Options/UI/Tabs/MiscTab.xaml | 9 +++++++ .../Options/UI/Tabs/MiscTab.xaml.cs | 13 ++++++++++ Content.Shared/CCVar/CCVars.cs | 7 ++++++ .../en-US/escape-menu/ui/options-menu.ftl | 2 ++ 5 files changed, 56 insertions(+) diff --git a/Content.Client/Camera/CameraRecoilSystem.cs b/Content.Client/Camera/CameraRecoilSystem.cs index 65a3fc71c70..bb419b465d3 100644 --- a/Content.Client/Camera/CameraRecoilSystem.cs +++ b/Content.Client/Camera/CameraRecoilSystem.cs @@ -1,14 +1,34 @@ using System.Numerics; using Content.Shared.Camera; +using Content.Shared.CCVar; +using Robust.Shared.Configuration; namespace Content.Client.Camera; public sealed class CameraRecoilSystem : SharedCameraRecoilSystem { + [Dependency] private readonly IConfigurationManager _configManager = default!; + + protected float Intensity; + public override void Initialize() { base.Initialize(); SubscribeNetworkEvent(OnCameraKick); + + _configManager.OnValueChanged(CCVars.ScreenShakeIntensity, OnCvarChanged, true); + } + + public override void Shutdown() + { + base.Shutdown(); + + _configManager.UnsubValueChanged(CCVars.ScreenShakeIntensity, OnCvarChanged); + } + + private void OnCvarChanged(float value) + { + Intensity = value; } private void OnCameraKick(CameraKickEvent ev) @@ -18,9 +38,14 @@ private void OnCameraKick(CameraKickEvent ev) public override void KickCamera(EntityUid uid, Vector2 recoil, CameraRecoilComponent? component = null) { + if (Intensity == 0) + return; + if (!Resolve(uid, ref component, false)) return; + recoil *= Intensity; + // Use really bad math to "dampen" kicks when we're already kicked. var existing = component.CurrentKick.Length(); var dampen = existing / KickMagnitudeMax; diff --git a/Content.Client/Options/UI/Tabs/MiscTab.xaml b/Content.Client/Options/UI/Tabs/MiscTab.xaml index e37333b0e45..db176db456c 100644 --- a/Content.Client/Options/UI/Tabs/MiscTab.xaml +++ b/Content.Client/Options/UI/Tabs/MiscTab.xaml @@ -22,6 +22,15 @@ FontColorOverride="{xNamespace:Static s:StyleNano.NanoGold}" StyleClasses="LabelKeyText"/> + + public sealed partial class PulledPrecondition : HTNPrecondition { - private SharedPullingSystem _pulling = default!; + private PullingSystem _pulling = default!; [ViewVariables(VVAccess.ReadWrite)] [DataField("isPulled")] public bool IsPulled = true; public override void Initialize(IEntitySystemManager sysManager) { base.Initialize(sysManager); - _pulling = sysManager.GetEntitySystem(); + _pulling = sysManager.GetEntitySystem(); } public override bool IsMet(NPCBlackboard blackboard) diff --git a/Content.Server/Objectives/Systems/StealConditionSystem.cs b/Content.Server/Objectives/Systems/StealConditionSystem.cs index 02d4ee010b5..0fe6f0947c8 100644 --- a/Content.Server/Objectives/Systems/StealConditionSystem.cs +++ b/Content.Server/Objectives/Systems/StealConditionSystem.cs @@ -6,11 +6,10 @@ using Robust.Shared.Containers; using Robust.Shared.Prototypes; using Robust.Shared.Random; -using Content.Shared.Pulling.Components; -using Content.Shared.Objectives; using Content.Shared.Mind.Components; using Content.Shared.Mobs.Systems; using Content.Shared.Mobs.Components; +using Content.Shared.Movement.Pulling.Components; namespace Content.Server.Objectives.Systems; @@ -100,19 +99,19 @@ private float GetProgress(MindComponent mind, StealConditionComponent condition) var count = 0; //check pulling object - if (TryComp(mind.OwnedEntity, out var pull)) //TO DO: to make the code prettier? don't like the repetition + if (TryComp(mind.OwnedEntity, out var pull)) //TO DO: to make the code prettier? don't like the repetition { - var pullid = pull.Pulling; - if (pullid != null) + var pulledEntity = pull.Pulling; + if (pulledEntity != null) { // check if this is the item - if (CheckStealTarget(pullid.Value, condition)) count++; + if (CheckStealTarget(pulledEntity.Value, condition)) count++; //we don't check the inventories of sentient entity - if (!TryComp(pullid, out var pullMind)) + if (!HasComp(pulledEntity)) { // if it is a container check its contents - if (_containerQuery.TryGetComponent(pullid, out var containerManager)) + if (_containerQuery.TryGetComponent(pulledEntity, out var containerManager)) stack.Push(containerManager); } } diff --git a/Content.Server/Physics/Controllers/PullController.cs b/Content.Server/Physics/Controllers/PullController.cs deleted file mode 100644 index 8f58f807aae..00000000000 --- a/Content.Server/Physics/Controllers/PullController.cs +++ /dev/null @@ -1,207 +0,0 @@ -using System.Numerics; -using Content.Shared.ActionBlocker; -using Content.Shared.Gravity; -using Content.Shared.Pulling; -using Content.Shared.Pulling.Components; -using Content.Shared.Rotatable; -using Robust.Shared.Physics; -using Robust.Shared.Physics.Components; -using Robust.Shared.Physics.Controllers; - -namespace Content.Server.Physics.Controllers -{ - public sealed class PullController : VirtualController - { - // Parameterization for pulling: - // Speeds. Note that the speed is mass-independent (multiplied by mass). - // Instead, tuning to mass is done via the mass values below. - // Note that setting the speed too high results in overshoots (stabilized by drag, but bad) - private const float AccelModifierHigh = 15f; - private const float AccelModifierLow = 60.0f; - // High/low-mass marks. Curve is constant-lerp-constant, i.e. if you can even pull an item, - // you'll always get at least AccelModifierLow and no more than AccelModifierHigh. - private const float AccelModifierHighMass = 70.0f; // roundstart saltern emergency closet - private const float AccelModifierLowMass = 5.0f; // roundstart saltern emergency crowbar - // Used to control settling (turns off pulling). - private const float MaximumSettleVelocity = 0.1f; - private const float MaximumSettleDistance = 0.1f; - // Settle shutdown control. - // Mustn't be too massive, as that causes severe mispredicts *and can prevent it ever resolving*. - // Exists to bleed off "I pulled my crowbar" overshoots. - // Minimum velocity for shutdown to be necessary. This prevents stuff getting stuck b/c too much shutdown. - private const float SettleMinimumShutdownVelocity = 0.25f; - // Distance in which settle shutdown multiplier is at 0. It then scales upwards linearly with closer distances. - private const float SettleShutdownDistance = 1.0f; - // Velocity change of -LinearVelocity * frameTime * this - private const float SettleShutdownMultiplier = 20.0f; - - // How much you must move for the puller movement check to actually hit. - private const float MinimumMovementDistance = 0.005f; - - [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; - [Dependency] private readonly SharedPullingSystem _pullableSystem = default!; - [Dependency] private readonly SharedGravitySystem _gravity = default!; - [Dependency] private readonly SharedTransformSystem _transform = default!; - - // TODO: Move this stuff to pullingsystem - /// - /// If distance between puller and pulled entity lower that this threshold, - /// pulled entity will not change its rotation. - /// Helps with small distance jittering - /// - private const float ThresholdRotDistance = 1; - - /// - /// If difference between puller and pulled angle lower that this threshold, - /// pulled entity will not change its rotation. - /// Helps with diagonal movement jittering - /// As of further adjustments, should divide cleanly into 90 degrees - /// - private const float ThresholdRotAngle = 22.5f; - - public override void Initialize() - { - UpdatesAfter.Add(typeof(MoverController)); - SubscribeLocalEvent(OnPullerMove); - - base.Initialize(); - } - - private void OnPullerMove(EntityUid uid, SharedPullerComponent component, ref MoveEvent args) - { - if (component.Pulling is not { } pullable || !TryComp(pullable, out var pullableComponent)) - return; - - UpdatePulledRotation(uid, pullable); - - if (args.NewPosition.EntityId == args.OldPosition.EntityId && - (args.NewPosition.Position - args.OldPosition.Position).LengthSquared() < MinimumMovementDistance * MinimumMovementDistance) - return; - - if (TryComp(pullable, out var physics)) - PhysicsSystem.WakeBody(pullable, body: physics); - - _pullableSystem.StopMoveTo(pullableComponent); - } - - private void UpdatePulledRotation(EntityUid puller, EntityUid pulled) - { - // TODO: update once ComponentReference works with directed event bus. - if (!TryComp(pulled, out RotatableComponent? rotatable)) - return; - - if (!rotatable.RotateWhilePulling) - return; - - var xforms = GetEntityQuery(); - var pulledXform = xforms.GetComponent(pulled); - var pullerXform = xforms.GetComponent(puller); - - var pullerData = TransformSystem.GetWorldPositionRotation(pullerXform, xforms); - var pulledData = TransformSystem.GetWorldPositionRotation(pulledXform, xforms); - - var dir = pullerData.WorldPosition - pulledData.WorldPosition; - if (dir.LengthSquared() > ThresholdRotDistance * ThresholdRotDistance) - { - var oldAngle = pulledData.WorldRotation; - var newAngle = Angle.FromWorldVec(dir); - - var diff = newAngle - oldAngle; - if (Math.Abs(diff.Degrees) > ThresholdRotAngle / 2f) - { - // Ok, so this bit is difficult because ideally it would look like it's snapping to sane angles. - // Otherwise PIANO DOOR STUCK! happens. - // But it also needs to work with station rotation / align to the local parent. - // So... - var baseRotation = pulledData.WorldRotation - pulledXform.LocalRotation; - var localRotation = newAngle - baseRotation; - var localRotationSnapped = Angle.FromDegrees(Math.Floor((localRotation.Degrees / ThresholdRotAngle) + 0.5f) * ThresholdRotAngle); - TransformSystem.SetLocalRotation(pulledXform, localRotationSnapped); - } - } - } - - public override void UpdateBeforeSolve(bool prediction, float frameTime) - { - base.UpdateBeforeSolve(prediction, frameTime); - - foreach (var pullable in _pullableSystem.Moving) - { - // There's a 1-frame delay between stopping moving something and it leaving the Moving set. - // This can include if leaving the Moving set due to not being pulled anymore, - // or due to being deleted. - - if (pullable.Deleted) - continue; - - if (pullable.MovingTo == null) - continue; - - if (pullable.Puller is not {Valid: true} puller) - continue; - - var pullableEnt = pullable.Owner; - var pullableXform = Transform(pullableEnt); - var pullerXform = Transform(puller); - - // Now that's over with... - - var pullerPosition = pullerXform.MapPosition; - var movingTo = pullable.MovingTo.Value.ToMap(EntityManager, _transform); - if (movingTo.MapId != pullerPosition.MapId) - { - _pullableSystem.StopMoveTo(pullable); - continue; - } - - if (!TryComp(pullableEnt, out var physics) || - physics.BodyType == BodyType.Static || - movingTo.MapId != pullableXform.MapID) - { - _pullableSystem.StopMoveTo(pullable); - continue; - } - - var movingPosition = movingTo.Position; - var ownerPosition = pullableXform.MapPosition.Position; - - var diff = movingPosition - ownerPosition; - var diffLength = diff.Length(); - - if (diffLength < MaximumSettleDistance && physics.LinearVelocity.Length() < MaximumSettleVelocity) - { - PhysicsSystem.SetLinearVelocity(pullableEnt, Vector2.Zero, body: physics); - _pullableSystem.StopMoveTo(pullable); - continue; - } - - var impulseModifierLerp = Math.Min(1.0f, Math.Max(0.0f, (physics.Mass - AccelModifierLowMass) / (AccelModifierHighMass - AccelModifierLowMass))); - var impulseModifier = MathHelper.Lerp(AccelModifierLow, AccelModifierHigh, impulseModifierLerp); - var multiplier = diffLength < 1 ? impulseModifier * diffLength : impulseModifier; - // Note the implication that the real rules of physics don't apply to pulling control. - var accel = diff.Normalized() * multiplier; - // Now for the part where velocity gets shutdown... - if (diffLength < SettleShutdownDistance && physics.LinearVelocity.Length() >= SettleMinimumShutdownVelocity) - { - // Shutdown velocity increases as we get closer to centre - var scaling = (SettleShutdownDistance - diffLength) / SettleShutdownDistance; - accel -= physics.LinearVelocity * SettleShutdownMultiplier * scaling; - } - - PhysicsSystem.WakeBody(pullableEnt, body: physics); - - var impulse = accel * physics.Mass * frameTime; - PhysicsSystem.ApplyLinearImpulse(pullableEnt, impulse, body: physics); - - // if the puller is weightless or can't move, then we apply the inverse impulse (Newton's third law). - // doing it under gravity produces an unsatisfying wiggling when pulling. - // If player can't move, assume they are on a chair and we need to prevent pull-moving. - if ((_gravity.IsWeightless(puller) && pullerXform.GridUid == null) || !_actionBlockerSystem.CanMove(puller)) - { - PhysicsSystem.WakeBody(puller); - PhysicsSystem.ApplyLinearImpulse(puller, -impulse); - } - } - } - } -} diff --git a/Content.Server/Pulling/PullingSystem.cs b/Content.Server/Pulling/PullingSystem.cs deleted file mode 100644 index 69bb7c93704..00000000000 --- a/Content.Server/Pulling/PullingSystem.cs +++ /dev/null @@ -1,48 +0,0 @@ -using Content.Shared.Input; -using Content.Shared.Pulling; -using Content.Shared.Pulling.Components; -using JetBrains.Annotations; -using Robust.Server.GameObjects; -using Robust.Shared.Input.Binding; -using Robust.Shared.Player; - -namespace Content.Server.Pulling -{ - [UsedImplicitly] - public sealed class PullingSystem : SharedPullingSystem - { - public override void Initialize() - { - base.Initialize(); - - UpdatesAfter.Add(typeof(PhysicsSystem)); - - SubscribeLocalEvent(OnPullableMove); - SubscribeLocalEvent(OnPullableStopMove); - - CommandBinds.Builder - .Bind(ContentKeyFunctions.ReleasePulledObject, InputCmdHandler.FromDelegate(HandleReleasePulledObject)) - .Register(); - } - - private void HandleReleasePulledObject(ICommonSession? session) - { - if (session?.AttachedEntity is not {Valid: true} player) - { - return; - } - - if (!TryGetPulled(player, out var pulled)) - { - return; - } - - if (!EntityManager.TryGetComponent(pulled.Value, out SharedPullableComponent? pullable)) - { - return; - } - - TryStopPull(pullable); - } - } -} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactInteractionTriggerSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactInteractionTriggerSystem.cs index 239b6741608..9976d56da0b 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactInteractionTriggerSystem.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactInteractionTriggerSystem.cs @@ -1,6 +1,6 @@ using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; using Content.Shared.Interaction; -using Content.Shared.Physics.Pull; +using Content.Shared.Movement.Pulling.Events; using Content.Shared.Weapons.Melee.Events; namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Systems; @@ -22,7 +22,7 @@ private void OnPull(EntityUid uid, ArtifactInteractionTriggerComponent component if (!component.PullActivation) return; - _artifactSystem.TryActivateArtifact(uid, args.Puller.Owner); + _artifactSystem.TryActivateArtifact(uid, args.PullerUid); } private void OnAttack(EntityUid uid, ArtifactInteractionTriggerComponent component, AttackedEvent args) diff --git a/Content.Server/Zombies/ZombieSystem.Transform.cs b/Content.Server/Zombies/ZombieSystem.Transform.cs index 1b4f2f1c5b2..09592c391f3 100644 --- a/Content.Server/Zombies/ZombieSystem.Transform.cs +++ b/Content.Server/Zombies/ZombieSystem.Transform.cs @@ -26,12 +26,12 @@ using Content.Shared.Mobs; using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; +using Content.Shared.Movement.Pulling.Components; using Content.Shared.Movement.Systems; using Content.Shared.Nutrition.AnimalHusbandry; using Content.Shared.Nutrition.Components; using Content.Shared.Popups; using Content.Shared.Roles; -using Content.Shared.Pulling.Components; using Content.Shared.Weapons.Melee; using Content.Shared.Zombies; using Content.Shared.Prying.Components; @@ -59,7 +59,6 @@ public sealed partial class ZombieSystem [Dependency] private readonly IChatManager _chatMan = default!; [Dependency] private readonly MindSystem _mind = default!; [Dependency] private readonly SharedRoleSystem _roles = default!; - [Dependency] private readonly MobThresholdSystem _mobThreshold = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly ActionsSystem _actions = default!; // DeltaV - No psionic zombies @@ -279,7 +278,9 @@ public void ZombifyEntity(EntityUid target, MobStateComponent? mobState = null) RemComp(target, handsComp); } - RemComp(target); + // Sloth: What the fuck? + // How long until compregistry lmao. + RemComp(target); // No longer waiting to become a zombie: // Requires deferral because this is (probably) the event which called ZombifyEntity in the first place. diff --git a/Content.Shared/Administration/AdminFrozenSystem.cs b/Content.Shared/Administration/AdminFrozenSystem.cs index 14438cc5912..4ec9600b0bd 100644 --- a/Content.Shared/Administration/AdminFrozenSystem.cs +++ b/Content.Shared/Administration/AdminFrozenSystem.cs @@ -1,13 +1,10 @@ using Content.Shared.ActionBlocker; using Content.Shared.Interaction.Events; using Content.Shared.Item; -using Content.Shared.Movement; using Content.Shared.Movement.Events; -using Content.Shared.Physics.Pull; -using Content.Shared.Pulling; -using Content.Shared.Pulling.Components; -using Content.Shared.Pulling.Events; -using Content.Shared.Stunnable; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Events; +using Content.Shared.Movement.Pulling.Systems; using Content.Shared.Throwing; namespace Content.Shared.Administration; @@ -15,7 +12,7 @@ namespace Content.Shared.Administration; public sealed class AdminFrozenSystem : EntitySystem { [Dependency] private readonly ActionBlockerSystem _blocker = default!; - [Dependency] private readonly SharedPullingSystem _pulling = default!; + [Dependency] private readonly PullingSystem _pulling = default!; public override void Initialize() { @@ -45,9 +42,9 @@ private void OnPullAttempt(EntityUid uid, AdminFrozenComponent component, PullAt private void OnStartup(EntityUid uid, AdminFrozenComponent component, ComponentStartup args) { - if (TryComp(uid, out var pullable)) + if (TryComp(uid, out var pullable)) { - _pulling.TryStopPull(pullable); + _pulling.TryStopPull(uid, pullable); } UpdateCanMove(uid, component, args); diff --git a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs index 731b2892aa8..7c85c5a6311 100644 --- a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs +++ b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs @@ -11,7 +11,6 @@ using Content.Shared.Mobs.Components; using Content.Shared.Movement.Events; using Content.Shared.Popups; -using Content.Shared.Pulling.Components; using Content.Shared.Standing; using Content.Shared.Storage.Components; using Content.Shared.Stunnable; @@ -20,6 +19,7 @@ using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Events; using Robust.Shared.Utility; +using PullableComponent = Content.Shared.Movement.Pulling.Components.PullableComponent; namespace Content.Shared.Buckle; @@ -356,11 +356,11 @@ public bool TryBuckle(EntityUid buckleUid, EntityUid userUid, EntityUid strapUid RaiseLocalEvent(ev.BuckledEntity, ref ev); RaiseLocalEvent(ev.StrapEntity, ref ev); - if (TryComp(buckleUid, out var ownerPullable)) + if (TryComp(buckleUid, out var ownerPullable)) { if (ownerPullable.Puller != null) { - _pulling.TryStopPull(ownerPullable); + _pulling.TryStopPull(buckleUid, ownerPullable); } } @@ -369,12 +369,12 @@ public bool TryBuckle(EntityUid buckleUid, EntityUid userUid, EntityUid strapUid _physics.ResetDynamics(physics); } - if (!buckleComp.PullStrap && TryComp(strapUid, out var toPullable)) + if (!buckleComp.PullStrap && TryComp(strapUid, out var toPullable)) { if (toPullable.Puller == buckleUid) { // can't pull it and buckle to it at the same time - _pulling.TryStopPull(toPullable); + _pulling.TryStopPull(strapUid, toPullable); } } diff --git a/Content.Shared/Buckle/SharedBuckleSystem.cs b/Content.Shared/Buckle/SharedBuckleSystem.cs index 8f683356637..67218657e52 100644 --- a/Content.Shared/Buckle/SharedBuckleSystem.cs +++ b/Content.Shared/Buckle/SharedBuckleSystem.cs @@ -15,6 +15,7 @@ using Robust.Shared.Physics.Systems; using Robust.Shared.Player; using Robust.Shared.Timing; +using PullingSystem = Content.Shared.Movement.Pulling.Systems.PullingSystem; namespace Content.Shared.Buckle; @@ -35,7 +36,7 @@ public abstract partial class SharedBuckleSystem : EntitySystem [Dependency] private readonly SharedInteractionSystem _interaction = default!; [Dependency] private readonly SharedJointSystem _joints = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; - [Dependency] private readonly SharedPullingSystem _pulling = default!; + [Dependency] private readonly PullingSystem _pulling = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly StandingStateSystem _standing = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; diff --git a/Content.Shared/Construction/EntitySystems/AnchorableSystem.cs b/Content.Shared/Construction/EntitySystems/AnchorableSystem.cs index b40c0495622..cc21507461f 100644 --- a/Content.Shared/Construction/EntitySystems/AnchorableSystem.cs +++ b/Content.Shared/Construction/EntitySystems/AnchorableSystem.cs @@ -6,16 +6,15 @@ using Content.Shared.Database; using Content.Shared.DoAfter; using Content.Shared.Interaction; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Systems; using Content.Shared.Popups; -using Content.Shared.Pulling; -using Content.Shared.Pulling.Components; using Content.Shared.Tools; using Content.Shared.Tools.Components; using Robust.Shared.Map; using Robust.Shared.Map.Components; using Robust.Shared.Physics.Components; using Content.Shared.Tag; -using Robust.Shared.Player; using Robust.Shared.Serialization; using Robust.Shared.Utility; using SharedToolSystem = Content.Shared.Tools.Systems.SharedToolSystem; @@ -27,7 +26,7 @@ public sealed partial class AnchorableSystem : EntitySystem [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; - [Dependency] private readonly SharedPullingSystem _pulling = default!; + [Dependency] private readonly PullingSystem _pulling = default!; [Dependency] private readonly SharedToolSystem _tool = default!; [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly TagSystem _tagSystem = default!; @@ -129,9 +128,9 @@ private void OnAnchorComplete(EntityUid uid, AnchorableComponent component, TryA var rot = xform.LocalRotation; xform.LocalRotation = Math.Round(rot / (Math.PI / 2)) * (Math.PI / 2); - if (TryComp(uid, out var pullable) && pullable.Puller != null) + if (TryComp(uid, out var pullable) && pullable.Puller != null) { - _pulling.TryStopPull(pullable); + _pulling.TryStopPull(uid, pullable); } // TODO: Anchoring snaps rn anyway! @@ -172,7 +171,7 @@ private void OnAnchorComplete(EntityUid uid, AnchorableComponent component, TryA public void TryToggleAnchor(EntityUid uid, EntityUid userUid, EntityUid usingUid, AnchorableComponent? anchorable = null, TransformComponent? transform = null, - SharedPullableComponent? pullable = null, + PullableComponent? pullable = null, ToolComponent? usingTool = null) { if (!Resolve(uid, ref transform)) @@ -201,7 +200,7 @@ public void TryToggleAnchor(EntityUid uid, EntityUid userUid, EntityUid usingUid private void TryAnchor(EntityUid uid, EntityUid userUid, EntityUid usingUid, AnchorableComponent? anchorable = null, TransformComponent? transform = null, - SharedPullableComponent? pullable = null, + PullableComponent? pullable = null, ToolComponent? usingTool = null) { if (!Resolve(uid, ref anchorable, ref transform)) diff --git a/Content.Shared/Cuffs/SharedCuffableSystem.cs b/Content.Shared/Cuffs/SharedCuffableSystem.cs index 99657c87aab..7118b8e5cbc 100644 --- a/Content.Shared/Cuffs/SharedCuffableSystem.cs +++ b/Content.Shared/Cuffs/SharedCuffableSystem.cs @@ -22,9 +22,8 @@ using Content.Shared.Item; using Content.Shared.Mobs.Systems; using Content.Shared.Movement.Events; -using Content.Shared.Physics.Pull; +using Content.Shared.Movement.Pulling.Events; using Content.Shared.Popups; -using Content.Shared.Pulling.Components; using Content.Shared.Pulling.Events; using Content.Shared.Rejuvenate; using Content.Shared.Stunnable; @@ -36,6 +35,7 @@ using Robust.Shared.Network; using Robust.Shared.Player; using Robust.Shared.Serialization; +using PullableComponent = Content.Shared.Movement.Pulling.Components.PullableComponent; namespace Content.Shared.Cuffs { @@ -70,7 +70,7 @@ public override void Initialize() SubscribeLocalEvent(OnCuffsInsertedIntoContainer); SubscribeLocalEvent(OnRejuvenate); SubscribeLocalEvent(OnStartup); - SubscribeLocalEvent(HandleStopPull); + SubscribeLocalEvent(HandleStopPull); SubscribeLocalEvent(HandleMoveAttempt); SubscribeLocalEvent(OnEquipAttempt); SubscribeLocalEvent(OnUnequipAttempt); @@ -182,7 +182,7 @@ public void UpdateCuffState(EntityUid uid, CuffableComponent component) private void OnBeingPulledAttempt(EntityUid uid, CuffableComponent component, BeingPulledAttemptEvent args) { - if (!TryComp(uid, out var pullable)) + if (!TryComp(uid, out var pullable)) return; if (pullable.Puller != null && !component.CanStillInteract) // If we are being pulled already and cuffed, we can't get pulled again. @@ -214,19 +214,19 @@ private void OnPull(EntityUid uid, CuffableComponent component, PullMessage args private void HandleMoveAttempt(EntityUid uid, CuffableComponent component, UpdateCanMoveEvent args) { - if (component.CanStillInteract || !EntityManager.TryGetComponent(uid, out SharedPullableComponent? pullable) || !pullable.BeingPulled) + if (component.CanStillInteract || !EntityManager.TryGetComponent(uid, out PullableComponent? pullable) || !pullable.BeingPulled) return; args.Cancel(); } - private void HandleStopPull(EntityUid uid, CuffableComponent component, StopPullingEvent args) + private void HandleStopPull(EntityUid uid, CuffableComponent component, AttemptStopPullingEvent args) { if (args.User == null || !Exists(args.User.Value)) return; if (args.User.Value == uid && !component.CanStillInteract) - args.Cancel(); + args.Cancelled = true; } private void AddUncuffVerb(EntityUid uid, CuffableComponent component, GetVerbsEvent args) diff --git a/Content.Shared/Follower/FollowerSystem.cs b/Content.Shared/Follower/FollowerSystem.cs index 5656778a3f9..fc7cccf9bd6 100644 --- a/Content.Shared/Follower/FollowerSystem.cs +++ b/Content.Shared/Follower/FollowerSystem.cs @@ -4,8 +4,8 @@ using Content.Shared.Ghost; using Content.Shared.Hands; using Content.Shared.Movement.Events; +using Content.Shared.Movement.Pulling.Events; using Content.Shared.Movement.Systems; -using Content.Shared.Physics.Pull; using Content.Shared.Tag; using Content.Shared.Verbs; using Robust.Shared.Containers; diff --git a/Content.Shared/Friction/TileFrictionController.cs b/Content.Shared/Friction/TileFrictionController.cs index 472f5b574b2..ae9f32819a5 100644 --- a/Content.Shared/Friction/TileFrictionController.cs +++ b/Content.Shared/Friction/TileFrictionController.cs @@ -2,8 +2,8 @@ using Content.Shared.CCVar; using Content.Shared.Gravity; using Content.Shared.Movement.Events; +using Content.Shared.Movement.Pulling.Components; using Content.Shared.Movement.Systems; -using Content.Shared.Pulling.Components; using JetBrains.Annotations; using Robust.Shared.Configuration; using Robust.Shared.Map; @@ -23,6 +23,12 @@ public sealed class TileFrictionController : VirtualController [Dependency] private readonly SharedMoverController _mover = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; + private EntityQuery _frictionQuery; + private EntityQuery _xformQuery; + private EntityQuery _pullerQuery; + private EntityQuery _pullableQuery; + private EntityQuery _gridQuery; + private float _stopSpeed; private float _frictionModifier; public const float DefaultFriction = 0.3f; @@ -31,6 +37,12 @@ public override void Initialize() { base.Initialize(); + _frictionQuery = GetEntityQuery(); + _xformQuery = GetEntityQuery(); + _pullerQuery = GetEntityQuery(); + _pullableQuery = GetEntityQuery(); + _gridQuery = GetEntityQuery(); + _configManager.OnValueChanged(CCVars.TileFrictionModifier, SetFrictionModifier, true); _configManager.OnValueChanged(CCVars.StopSpeed, SetStopSpeed, true); } @@ -51,12 +63,6 @@ public override void UpdateBeforeMapSolve(bool prediction, PhysicsMapComponent m { base.UpdateBeforeMapSolve(prediction, mapComponent, frameTime); - var frictionQuery = GetEntityQuery(); - var xformQuery = GetEntityQuery(); - var pullerQuery = GetEntityQuery(); - var pullableQuery = GetEntityQuery(); - var gridQuery = GetEntityQuery(); - foreach (var body in mapComponent.AwakeBodies) { var uid = body.Owner; @@ -72,16 +78,16 @@ public override void UpdateBeforeMapSolve(bool prediction, PhysicsMapComponent m if (body.LinearVelocity.Equals(Vector2.Zero) && body.AngularVelocity.Equals(0f)) continue; - if (!xformQuery.TryGetComponent(uid, out var xform)) + if (!_xformQuery.TryGetComponent(uid, out var xform)) { Log.Error($"Unable to get transform for {ToPrettyString(uid)} in tilefrictioncontroller"); continue; } - var surfaceFriction = GetTileFriction(uid, body, xform, gridQuery, frictionQuery); + var surfaceFriction = GetTileFriction(uid, body, xform); var bodyModifier = 1f; - if (frictionQuery.TryGetComponent(uid, out var frictionComp)) + if (_frictionQuery.TryGetComponent(uid, out var frictionComp)) { bodyModifier = frictionComp.Modifier; } @@ -94,8 +100,8 @@ public override void UpdateBeforeMapSolve(bool prediction, PhysicsMapComponent m // If we're sandwiched between 2 pullers reduce friction // Might be better to make this dynamic and check how many are in the pull chain? // Either way should be much faster for now. - if (pullerQuery.TryGetComponent(uid, out var puller) && puller.Pulling != null && - pullableQuery.TryGetComponent(uid, out var pullable) && pullable.BeingPulled) + if (_pullerQuery.TryGetComponent(uid, out var puller) && puller.Pulling != null && + _pullableQuery.TryGetComponent(uid, out var pullable) && pullable.BeingPulled) { bodyModifier *= 0.2f; } @@ -175,9 +181,7 @@ private void ReduceAngularVelocity(EntityUid uid, bool prediction, PhysicsCompon private float GetTileFriction( EntityUid uid, PhysicsComponent body, - TransformComponent xform, - EntityQuery gridQuery, - EntityQuery frictionQuery) + TransformComponent xform) { // TODO: Make IsWeightless event-based; we already have grid traversals tracked so just raise events if (_gravity.IsWeightless(uid, body, xform)) @@ -187,9 +191,9 @@ private float GetTileFriction( return 0.0f; // If not on a grid then return the map's friction. - if (!gridQuery.TryGetComponent(xform.GridUid, out var grid)) + if (!_gridQuery.TryGetComponent(xform.GridUid, out var grid)) { - return frictionQuery.TryGetComponent(xform.MapUid, out var friction) + return _frictionQuery.TryGetComponent(xform.MapUid, out var friction) ? friction.Modifier : DefaultFriction; } @@ -209,7 +213,7 @@ private float GetTileFriction( while (anc.MoveNext(out var tileEnt)) { - if (frictionQuery.TryGetComponent(tileEnt, out var friction)) + if (_frictionQuery.TryGetComponent(tileEnt, out var friction)) return friction.Modifier; } diff --git a/Content.Shared/Interaction/SharedInteractionSystem.cs b/Content.Shared/Interaction/SharedInteractionSystem.cs index 75063c55503..29cf8d6d12f 100644 --- a/Content.Shared/Interaction/SharedInteractionSystem.cs +++ b/Content.Shared/Interaction/SharedInteractionSystem.cs @@ -15,10 +15,10 @@ using Content.Shared.Inventory.Events; using Content.Shared.Item; using Content.Shared.Movement.Components; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Systems; using Content.Shared.Physics; using Content.Shared.Popups; -using Content.Shared.Pulling; -using Content.Shared.Pulling.Components; using Content.Shared.Tag; using Content.Shared.Timing; using Content.Shared.Verbs; @@ -60,7 +60,7 @@ public abstract partial class SharedInteractionSystem : EntitySystem [Dependency] private readonly SharedVerbSystem _verbSystem = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly UseDelaySystem _useDelay = default!; - [Dependency] private readonly SharedPullingSystem _pullSystem = default!; + [Dependency] private readonly PullingSystem _pullSystem = default!; [Dependency] private readonly InventorySystem _inventory = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly TagSystem _tagSystem = default!; @@ -185,10 +185,10 @@ private bool HandleTryPullObject(ICommonSession? session, EntityCoordinates coor if (!InRangeUnobstructed(userEntity.Value, uid, popup: true)) return false; - if (!TryComp(uid, out SharedPullableComponent? pull)) + if (!TryComp(uid, out PullableComponent? pull)) return false; - _pullSystem.TogglePull(userEntity.Value, pull); + _pullSystem.TogglePull(uid, userEntity.Value, pull); return false; } diff --git a/Content.Shared/Movement/Pulling/Components/PullableComponent.cs b/Content.Shared/Movement/Pulling/Components/PullableComponent.cs new file mode 100644 index 00000000000..db889e7e3bd --- /dev/null +++ b/Content.Shared/Movement/Pulling/Components/PullableComponent.cs @@ -0,0 +1,39 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Movement.Pulling.Components; + +/// +/// Specifies an entity as being pullable by an entity with +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(Systems.PullingSystem))] +public sealed partial class PullableComponent : Component +{ + /// + /// The current entity pulling this component. + /// + [AutoNetworkedField, DataField] + public EntityUid? Puller; + + /// + /// The pull joint. + /// + [AutoNetworkedField, DataField] + public string? PullJointId; + + public bool BeingPulled => Puller != null; + + /// + /// If the physics component has FixedRotation should we keep it upon being pulled + /// + [Access(typeof(Systems.PullingSystem), Other = AccessPermissions.ReadExecute)] + [ViewVariables(VVAccess.ReadWrite), DataField("fixedRotation")] + public bool FixedRotationOnPull; + + /// + /// What the pullable's fixedrotation was set to before being pulled. + /// + [Access(typeof(Systems.PullingSystem), Other = AccessPermissions.ReadExecute)] + [AutoNetworkedField, DataField] + public bool PrevFixedRotation; +} diff --git a/Content.Shared/Movement/Pulling/Components/PullerComponent.cs b/Content.Shared/Movement/Pulling/Components/PullerComponent.cs new file mode 100644 index 00000000000..1fc9b731bd5 --- /dev/null +++ b/Content.Shared/Movement/Pulling/Components/PullerComponent.cs @@ -0,0 +1,41 @@ +using Content.Shared.Movement.Pulling.Systems; +using Robust.Shared.GameStates; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; + +namespace Content.Shared.Movement.Pulling.Components; + +/// +/// Specifies an entity as being able to pull another entity with +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(PullingSystem))] +public sealed partial class PullerComponent : Component +{ + // My raiding guild + /// + /// Next time the puller can throw what is being pulled. + /// Used to avoid spamming it for infinite spin + velocity. + /// + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoNetworkedField] + public TimeSpan NextThrow; + + [DataField] + public TimeSpan ThrowCooldown = TimeSpan.FromSeconds(1); + + // Before changing how this is updated, please see SharedPullerSystem.RefreshMovementSpeed + public float WalkSpeedModifier => Pulling == default ? 1.0f : 0.95f; + + public float SprintSpeedModifier => Pulling == default ? 1.0f : 0.95f; + + /// + /// Entity currently being pulled if applicable. + /// + [AutoNetworkedField, DataField] + public EntityUid? Pulling; + + /// + /// Does this entity need hands to be able to pull something? + /// + [DataField] + public bool NeedsHands = true; +} diff --git a/Content.Shared/Movement/Pulling/Events/AttemptPullEvent.cs b/Content.Shared/Movement/Pulling/Events/AttemptPullEvent.cs new file mode 100644 index 00000000000..b0101c46996 --- /dev/null +++ b/Content.Shared/Movement/Pulling/Events/AttemptPullEvent.cs @@ -0,0 +1,13 @@ +using Robust.Shared.Physics.Components; + +namespace Content.Shared.Movement.Pulling.Events; + +/// +/// Raised directed on puller and pullable to determine if it can be pulled. +/// +public sealed class PullAttemptEvent : PullMessage +{ + public PullAttemptEvent(EntityUid pullerUid, EntityUid pullableUid) : base(pullerUid, pullableUid) { } + + public bool Cancelled { get; set; } +} diff --git a/Content.Shared/Movement/Pulling/Events/AttemptStopPullingEvent.cs b/Content.Shared/Movement/Pulling/Events/AttemptStopPullingEvent.cs new file mode 100644 index 00000000000..cd7edc5f623 --- /dev/null +++ b/Content.Shared/Movement/Pulling/Events/AttemptStopPullingEvent.cs @@ -0,0 +1,10 @@ +namespace Content.Shared.Pulling.Events; + +/// +/// Raised when a request is made to stop pulling an entity. +/// +public record struct AttemptStopPullingEvent(EntityUid? User = null) +{ + public readonly EntityUid? User = User; + public bool Cancelled; +} \ No newline at end of file diff --git a/Content.Shared/Pulling/Events/BeingPulledAttemptEvent.cs b/Content.Shared/Movement/Pulling/Events/BeingPulledAttemptEvent.cs similarity index 100% rename from Content.Shared/Pulling/Events/BeingPulledAttemptEvent.cs rename to Content.Shared/Movement/Pulling/Events/BeingPulledAttemptEvent.cs diff --git a/Content.Shared/Movement/Pulling/Events/PullMessage.cs b/Content.Shared/Movement/Pulling/Events/PullMessage.cs new file mode 100644 index 00000000000..a427e448d5c --- /dev/null +++ b/Content.Shared/Movement/Pulling/Events/PullMessage.cs @@ -0,0 +1,13 @@ +namespace Content.Shared.Movement.Pulling.Events; + +public abstract class PullMessage : EntityEventArgs +{ + public readonly EntityUid PullerUid; + public readonly EntityUid PulledUid; + + protected PullMessage(EntityUid pullerUid, EntityUid pulledUid) + { + PullerUid = pullerUid; + PulledUid = pulledUid; + } +} diff --git a/Content.Shared/Movement/Pulling/Events/PullStartedMessage.cs b/Content.Shared/Movement/Pulling/Events/PullStartedMessage.cs new file mode 100644 index 00000000000..29460e1dfc1 --- /dev/null +++ b/Content.Shared/Movement/Pulling/Events/PullStartedMessage.cs @@ -0,0 +1,9 @@ +namespace Content.Shared.Movement.Pulling.Events; + +public sealed class PullStartedMessage : PullMessage +{ + public PullStartedMessage(EntityUid pullerUid, EntityUid pullableUid) : + base(pullerUid, pullableUid) + { + } +} diff --git a/Content.Shared/Movement/Pulling/Events/PullStoppedMessage.cs b/Content.Shared/Movement/Pulling/Events/PullStoppedMessage.cs new file mode 100644 index 00000000000..47aa34562fb --- /dev/null +++ b/Content.Shared/Movement/Pulling/Events/PullStoppedMessage.cs @@ -0,0 +1,13 @@ +using Robust.Shared.Physics.Components; + +namespace Content.Shared.Movement.Pulling.Events; + +/// +/// Raised directed on both puller and pullable. +/// +public sealed class PullStoppedMessage : PullMessage +{ + public PullStoppedMessage(EntityUid pullerUid, EntityUid pulledUid) : base(pullerUid, pulledUid) + { + } +} diff --git a/Content.Shared/Pulling/Events/StartPullAttemptEvent.cs b/Content.Shared/Movement/Pulling/Events/StartPullAttemptEvent.cs similarity index 100% rename from Content.Shared/Pulling/Events/StartPullAttemptEvent.cs rename to Content.Shared/Movement/Pulling/Events/StartPullAttemptEvent.cs diff --git a/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs new file mode 100644 index 00000000000..8ed06ca8c98 --- /dev/null +++ b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs @@ -0,0 +1,455 @@ +using System.Numerics; +using Content.Shared.ActionBlocker; +using Content.Shared.Administration.Logs; +using Content.Shared.Alert; +using Content.Shared.Buckle.Components; +using Content.Shared.Database; +using Content.Shared.Hands; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.Input; +using Content.Shared.Interaction; +using Content.Shared.Movement.Events; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Events; +using Content.Shared.Movement.Systems; +using Content.Shared.Pulling.Events; +using Content.Shared.Throwing; +using Content.Shared.Verbs; +using Robust.Shared.Containers; +using Robust.Shared.Input.Binding; +using Robust.Shared.Map; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Components; +using Robust.Shared.Physics.Events; +using Robust.Shared.Physics.Systems; +using Robust.Shared.Player; +using Robust.Shared.Timing; + +namespace Content.Shared.Movement.Pulling.Systems; + +/// +/// Allows one entity to pull another behind them via a physics distance joint. +/// +public sealed class PullingSystem : EntitySystem +{ + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + [Dependency] private readonly ActionBlockerSystem _blocker = default!; + [Dependency] private readonly AlertsSystem _alertsSystem = default!; + [Dependency] private readonly MovementSpeedModifierSystem _modifierSystem = default!; + [Dependency] private readonly SharedJointSystem _joints = default!; + [Dependency] private readonly SharedContainerSystem _containerSystem = default!; + [Dependency] private readonly SharedHandsSystem _handsSystem = default!; + [Dependency] private readonly SharedInteractionSystem _interaction = default!; + [Dependency] private readonly SharedPhysicsSystem _physics = default!; + [Dependency] private readonly SharedTransformSystem _xformSys = default!; + [Dependency] private readonly ThrowingSystem _throwing = default!; + + public override void Initialize() + { + base.Initialize(); + + UpdatesAfter.Add(typeof(SharedPhysicsSystem)); + UpdatesOutsidePrediction = true; + + SubscribeLocalEvent(OnPullableMoveInput); + SubscribeLocalEvent(OnPullableCollisionChange); + SubscribeLocalEvent(OnJointRemoved); + SubscribeLocalEvent>(AddPullVerbs); + + SubscribeLocalEvent(OnPullerUnpaused); + SubscribeLocalEvent(OnVirtualItemDeleted); + SubscribeLocalEvent(OnRefreshMovespeed); + + CommandBinds.Builder + .Bind(ContentKeyFunctions.MovePulledObject, new PointerInputCmdHandler(OnRequestMovePulledObject)) + .Bind(ContentKeyFunctions.ReleasePulledObject, InputCmdHandler.FromDelegate(OnReleasePulledObject)) + .Register(); + } + + public override void Shutdown() + { + base.Shutdown(); + CommandBinds.Unregister(); + } + + private void OnPullerUnpaused(EntityUid uid, PullerComponent component, ref EntityUnpausedEvent args) + { + component.NextThrow += args.PausedTime; + } + + private void OnVirtualItemDeleted(EntityUid uid, PullerComponent component, VirtualItemDeletedEvent args) + { + // If client deletes the virtual hand then stop the pull. + if (component.Pulling == null) + return; + + if (component.Pulling != args.BlockingEntity) + return; + + if (EntityManager.TryGetComponent(args.BlockingEntity, out PullableComponent? comp)) + { + TryStopPull(args.BlockingEntity, comp, uid); + } + } + + private void AddPullVerbs(EntityUid uid, PullableComponent component, GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract) + return; + + // Are they trying to pull themselves up by their bootstraps? + if (args.User == args.Target) + return; + + //TODO VERB ICONS add pulling icon + if (component.Puller == args.User) + { + Verb verb = new() + { + Text = Loc.GetString("pulling-verb-get-data-text-stop-pulling"), + Act = () => TryStopPull(uid, component, user: args.User), + DoContactInteraction = false // pulling handle its own contact interaction. + }; + args.Verbs.Add(verb); + } + else if (CanPull(args.User, args.Target)) + { + Verb verb = new() + { + Text = Loc.GetString("pulling-verb-get-data-text"), + Act = () => TryStartPull(args.User, args.Target), + DoContactInteraction = false // pulling handle its own contact interaction. + }; + args.Verbs.Add(verb); + } + } + + private void OnRefreshMovespeed(EntityUid uid, PullerComponent component, RefreshMovementSpeedModifiersEvent args) + { + args.ModifySpeed(component.WalkSpeedModifier, component.SprintSpeedModifier); + } + + private void OnPullableMoveInput(EntityUid uid, PullableComponent component, ref MoveInputEvent args) + { + // If someone moves then break their pulling. + if (!component.BeingPulled) + return; + + var entity = args.Entity; + + if (!_blocker.CanMove(entity)) + return; + + TryStopPull(uid, component, user: uid); + } + + private void OnPullableCollisionChange(EntityUid uid, PullableComponent component, ref CollisionChangeEvent args) + { + // IDK what this is supposed to be. + if (!_timing.ApplyingState && component.PullJointId != null && !args.CanCollide) + { + _joints.RemoveJoint(uid, component.PullJointId); + } + } + + private void OnJointRemoved(EntityUid uid, PullableComponent component, JointRemovedEvent args) + { + // Not relevant / pullable state handle it. + if (component.Puller != args.OtherEntity || + args.Joint.ID != component.PullJointId || + _timing.ApplyingState) + { + return; + } + + if (args.Joint.ID != component.PullJointId) + return; + + CleanupPulling(uid, component); + } + + private void CleanupPulling(EntityUid pullableUid, PullableComponent pullableComp) + { + // No more joints with puller -> force stop pull. + if (TryComp(pullableComp.Puller, out var pullerComp)) + { + pullerComp.Pulling = null; + Dirty(pullableComp.Puller.Value, pullerComp); + } + + pullableComp.PullJointId = null; + pullableComp.Puller = null; + Dirty(pullableUid, pullableComp); + } + + public bool IsPulled(EntityUid uid, PullableComponent? component = null) + { + return Resolve(uid, ref component, false) && component.BeingPulled; + } + + private bool OnRequestMovePulledObject(ICommonSession? session, EntityCoordinates coords, EntityUid uid) + { + if (session?.AttachedEntity is not { } player || + !player.IsValid()) + { + return false; + } + + if (!TryComp(player, out var pullerComp)) + return false; + + var pulled = pullerComp.Pulling; + + if (!HasComp(pulled)) + return false; + + if (_containerSystem.IsEntityInContainer(player)) + return false; + + // Cooldown buddy + if (_timing.CurTime < pullerComp.NextThrow) + return false; + + pullerComp.NextThrow = _timing.CurTime + pullerComp.ThrowCooldown; + + // Cap the distance + const float range = 2f; + var fromUserCoords = coords.WithEntityId(player, EntityManager); + var userCoords = new EntityCoordinates(player, Vector2.Zero); + + if (!userCoords.InRange(EntityManager, _xformSys, fromUserCoords, range)) + { + var userDirection = fromUserCoords.Position - userCoords.Position; + fromUserCoords = userCoords.Offset(userDirection.Normalized() * range); + } + + Dirty(player, pullerComp); + _throwing.TryThrow(pulled.Value, fromUserCoords, user: player, strength: 4f, animated: false, recoil: false, playSound: false); + return false; + } + + public bool IsPulling(EntityUid puller, PullerComponent? component = null) + { + return Resolve(puller, ref component, false) && component.Pulling != null; + } + + private void OnReleasePulledObject(ICommonSession? session) + { + if (session?.AttachedEntity is not {Valid: true} player) + { + return; + } + + if (!TryComp(player, out PullerComponent? pullerComp) || + !TryComp(pullerComp.Pulling, out PullableComponent? pullableComp)) + { + return; + } + + TryStopPull(pullerComp.Pulling.Value, pullableComp, user: player); + } + + public bool CanPull(EntityUid puller, EntityUid pullableUid, PullerComponent? pullerComp = null) + { + if (!Resolve(puller, ref pullerComp, false)) + { + return false; + } + + if (pullerComp.NeedsHands && !_handsSystem.TryGetEmptyHand(puller, out _)) + { + return false; + } + + if (!_blocker.CanInteract(puller, pullableUid)) + { + return false; + } + + if (!EntityManager.TryGetComponent(pullableUid, out var physics)) + { + return false; + } + + if (physics.BodyType == BodyType.Static) + { + return false; + } + + if (puller == pullableUid) + { + return false; + } + + if (!_containerSystem.IsInSameOrNoContainer(puller, pullableUid)) + { + return false; + } + + if (EntityManager.TryGetComponent(puller, out BuckleComponent? buckle)) + { + // Prevent people pulling the chair they're on, etc. + if (buckle is { PullStrap: false, Buckled: true } && (buckle.LastEntityBuckledTo == pullableUid)) + { + return false; + } + } + + var getPulled = new BeingPulledAttemptEvent(puller, pullableUid); + RaiseLocalEvent(pullableUid, getPulled, true); + var startPull = new StartPullAttemptEvent(puller, pullableUid); + RaiseLocalEvent(puller, startPull, true); + return !startPull.Cancelled && !getPulled.Cancelled; + } + + public bool TogglePull(EntityUid pullableUid, EntityUid pullerUid, PullableComponent pullable) + { + if (pullable.Puller == pullerUid) + { + return TryStopPull(pullableUid, pullable); + } + + return TryStartPull(pullerUid, pullableUid, pullableComp: pullable); + } + + public bool TogglePull(EntityUid pullerUid, PullerComponent puller) + { + if (!TryComp(puller.Pulling, out var pullable)) + return false; + + return TogglePull(puller.Pulling.Value, pullerUid, pullable); + } + + public bool TryStartPull(EntityUid pullerUid, EntityUid pullableUid, EntityUid? user = null, + PullerComponent? pullerComp = null, PullableComponent? pullableComp = null) + { + if (!Resolve(pullerUid, ref pullerComp, false) || + !Resolve(pullableUid, ref pullableComp, false)) + { + return false; + } + + if (pullerComp.Pulling == pullableUid) + return true; + + if (!CanPull(pullerUid, pullableUid)) + return false; + + if (!EntityManager.TryGetComponent(pullerUid, out var pullerPhysics) || + !EntityManager.TryGetComponent(pullableUid, out var pullablePhysics)) + { + return false; + } + + // Ensure that the puller is not currently pulling anything. + var oldPullable = pullerComp.Pulling; + + if (oldPullable != null) + { + // Well couldn't stop the old one. + if (!TryStopPull(oldPullable.Value, pullableComp, user)) + return false; + } + + var pullAttempt = new PullAttemptEvent(pullerUid, pullableUid); + RaiseLocalEvent(pullerUid, pullAttempt); + + if (pullAttempt.Cancelled) + return false; + + RaiseLocalEvent(pullableUid, pullAttempt); + + if (pullAttempt.Cancelled) + return false; + + // Pulling confirmed + + _interaction.DoContactInteraction(pullableUid, pullerUid); + + // Use net entity so it's consistent across client and server. + pullableComp.PullJointId = $"pull-joint-{GetNetEntity(pullableUid)}"; + + pullerComp.Pulling = pullableUid; + pullableComp.Puller = pullerUid; + + // joint state handling will manage its own state + if (!_timing.ApplyingState) + { + // Joint startup + var union = _physics.GetHardAABB(pullerUid).Union(_physics.GetHardAABB(pullableUid, body: pullablePhysics)); + var length = Math.Max((float) union.Size.X, (float) union.Size.Y) * 0.75f; + + var joint = _joints.CreateDistanceJoint(pullableUid, pullerUid, id: pullableComp.PullJointId); + joint.CollideConnected = false; + // This maximum has to be there because if the object is constrained too closely, the clamping goes backwards and asserts. + joint.MaxLength = Math.Max(1.0f, length); + joint.Length = length * 0.75f; + joint.MinLength = 0f; + joint.Stiffness = 1f; + + _physics.SetFixedRotation(pullableUid, pullableComp.FixedRotationOnPull, body: pullablePhysics); + } + + pullableComp.PrevFixedRotation = pullablePhysics.FixedRotation; + + // Messaging + var message = new PullStartedMessage(pullerUid, pullableUid); + _alertsSystem.ShowAlert(pullerUid, AlertType.Pulling); + _alertsSystem.ShowAlert(pullableUid, AlertType.Pulled); + + RaiseLocalEvent(pullerUid, message); + RaiseLocalEvent(pullableUid, message); + + Dirty(pullerUid, pullerComp); + Dirty(pullableUid, pullableComp); + + _adminLogger.Add(LogType.Action, LogImpact.Low, + $"{ToPrettyString(pullerUid):user} started pulling {ToPrettyString(pullableUid):target}"); + return true; + } + + public bool TryStopPull(EntityUid pullableUid, PullableComponent pullable, EntityUid? user = null) + { + var pullerUidNull = pullable.Puller; + + if (pullerUidNull == null) + return false; + + var pullerUid = pullerUidNull.Value; + var msg = new AttemptStopPullingEvent(user); + RaiseLocalEvent(pullableUid, msg, true); + + if (msg.Cancelled) + return false; + + // Stop pulling confirmed! + if (!_timing.ApplyingState) + { + if (TryComp(pullableUid, out var pullablePhysics)) + { + _physics.SetFixedRotation(pullableUid, pullable.PrevFixedRotation, body: pullablePhysics); + } + + // Joint shutdown + if (pullable.PullJointId != null) + { + _joints.RemoveJoint(pullableUid, pullable.PullJointId); + pullable.PullJointId = null; + } + } + + CleanupPulling(pullableUid, pullable); + + // Messaging + var message = new PullStoppedMessage(pullerUid, pullableUid); + _alertsSystem.ClearAlert(pullerUid, AlertType.Pulling); + _alertsSystem.ClearAlert(pullableUid, AlertType.Pulled); + _modifierSystem.RefreshMovementSpeedModifiers(pullerUid); + _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(pullerUid):user} stopped pulling {ToPrettyString(pullableUid):target}"); + + RaiseLocalEvent(pullerUid, message); + RaiseLocalEvent(pullableUid, message); + return true; + } +} diff --git a/Content.Shared/Movement/Systems/SharedMoverController.cs b/Content.Shared/Movement/Systems/SharedMoverController.cs index 7d5e24a15b1..6a3dbb2864e 100644 --- a/Content.Shared/Movement/Systems/SharedMoverController.cs +++ b/Content.Shared/Movement/Systems/SharedMoverController.cs @@ -9,7 +9,6 @@ using Content.Shared.Mobs.Systems; using Content.Shared.Movement.Components; using Content.Shared.Movement.Events; -using Content.Shared.Pulling.Components; using Content.Shared.Tag; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; @@ -23,6 +22,7 @@ using Robust.Shared.Physics.Systems; using Robust.Shared.Timing; using Robust.Shared.Utility; +using PullableComponent = Content.Shared.Movement.Pulling.Components.PullableComponent; namespace Content.Shared.Movement.Systems { @@ -53,7 +53,7 @@ public abstract partial class SharedMoverController : VirtualController protected EntityQuery ModifierQuery; protected EntityQuery PhysicsQuery; protected EntityQuery RelayQuery; - protected EntityQuery PullableQuery; + protected EntityQuery PullableQuery; protected EntityQuery XformQuery; protected EntityQuery CanMoveInAirQuery; protected EntityQuery NoRotateQuery; @@ -85,7 +85,7 @@ public override void Initialize() RelayTargetQuery = GetEntityQuery(); PhysicsQuery = GetEntityQuery(); RelayQuery = GetEntityQuery(); - PullableQuery = GetEntityQuery(); + PullableQuery = GetEntityQuery(); XformQuery = GetEntityQuery(); NoRotateQuery = GetEntityQuery(); CanMoveInAirQuery = GetEntityQuery(); @@ -381,7 +381,7 @@ private bool IsAroundCollider(SharedPhysicsSystem broadPhaseSystem, TransformCom !otherCollider.CanCollide || ((collider.CollisionMask & otherCollider.CollisionLayer) == 0 && (otherCollider.CollisionMask & collider.CollisionLayer) == 0) || - (TryComp(otherCollider.Owner, out SharedPullableComponent? pullable) && pullable.BeingPulled)) + (TryComp(otherCollider.Owner, out PullableComponent? pullable) && pullable.BeingPulled)) { continue; } diff --git a/Content.Shared/Pulling/Components/PullableComponent.cs b/Content.Shared/Pulling/Components/PullableComponent.cs deleted file mode 100644 index c5c30688699..00000000000 --- a/Content.Shared/Pulling/Components/PullableComponent.cs +++ /dev/null @@ -1,57 +0,0 @@ -using Robust.Shared.GameStates; -using Robust.Shared.Map; -using Robust.Shared.Serialization; - -namespace Content.Shared.Pulling.Components -{ - // Before you try to add another type than SharedPullingStateManagementSystem, consider the can of worms you may be opening! - [NetworkedComponent, AutoGenerateComponentState] - [Access(typeof(SharedPullingStateManagementSystem))] - [RegisterComponent] - public sealed partial class SharedPullableComponent : Component - { - /// - /// The current entity pulling this component. - /// - [DataField, AutoNetworkedField] - public EntityUid? Puller { get; set; } - - /// - /// The pull joint. - /// - [DataField, AutoNetworkedField] - public string? PullJointId { get; set; } - - public bool BeingPulled => Puller != null; - - [Access(typeof(SharedPullingStateManagementSystem), Other = AccessPermissions.ReadExecute)] // FIXME Friends - public EntityCoordinates? MovingTo { get; set; } - - /// - /// If the physics component has FixedRotation should we keep it upon being pulled - /// - [Access(typeof(SharedPullingSystem), Other = AccessPermissions.ReadExecute)] - [ViewVariables(VVAccess.ReadWrite), DataField("fixedRotation")] - public bool FixedRotationOnPull { get; set; } - - /// - /// What the pullable's fixedrotation was set to before being pulled. - /// - [Access(typeof(SharedPullingSystem), Other = AccessPermissions.ReadExecute)] - [ViewVariables] - public bool PrevFixedRotation; - } - - /// - /// Raised when a request is made to stop pulling an entity. - /// - public sealed class StopPullingEvent : CancellableEntityEventArgs - { - public EntityUid? User { get; } - - public StopPullingEvent(EntityUid? uid = null) - { - User = uid; - } - } -} diff --git a/Content.Shared/Pulling/Components/SharedPullerComponent.cs b/Content.Shared/Pulling/Components/SharedPullerComponent.cs deleted file mode 100644 index 57a86e7f7a8..00000000000 --- a/Content.Shared/Pulling/Components/SharedPullerComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Robust.Shared.GameStates; - -namespace Content.Shared.Pulling.Components -{ - [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] - [Access(typeof(SharedPullingStateManagementSystem))] - public sealed partial class SharedPullerComponent : Component - { - // Before changing how this is updated, please see SharedPullerSystem.RefreshMovementSpeed - public float WalkSpeedModifier => Pulling == default ? 1.0f : 0.95f; - - public float SprintSpeedModifier => Pulling == default ? 1.0f : 0.95f; - - [DataField, AutoNetworkedField] - public EntityUid? Pulling { get; set; } - - /// - /// Does this entity need hands to be able to pull something? - /// - [DataField("needsHands")] - public bool NeedsHands = true; - } -} diff --git a/Content.Shared/Pulling/Events/PullAttemptEvent.cs b/Content.Shared/Pulling/Events/PullAttemptEvent.cs deleted file mode 100644 index 6296dc2f14f..00000000000 --- a/Content.Shared/Pulling/Events/PullAttemptEvent.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Robust.Shared.Physics.Components; - -namespace Content.Shared.Physics.Pull -{ - public sealed class PullAttemptEvent : PullMessage - { - public PullAttemptEvent(PhysicsComponent puller, PhysicsComponent pulled) : base(puller, pulled) { } - - public bool Cancelled { get; set; } - } -} diff --git a/Content.Shared/Pulling/Events/PullMessage.cs b/Content.Shared/Pulling/Events/PullMessage.cs deleted file mode 100644 index b11de7c1702..00000000000 --- a/Content.Shared/Pulling/Events/PullMessage.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Robust.Shared.Physics.Components; - -namespace Content.Shared.Physics.Pull -{ - public abstract class PullMessage : EntityEventArgs - { - public readonly PhysicsComponent Puller; - public readonly PhysicsComponent Pulled; - - protected PullMessage(PhysicsComponent puller, PhysicsComponent pulled) - { - Puller = puller; - Pulled = pulled; - } - } -} diff --git a/Content.Shared/Pulling/Events/PullStartedMessage.cs b/Content.Shared/Pulling/Events/PullStartedMessage.cs deleted file mode 100644 index 0ede284bb0c..00000000000 --- a/Content.Shared/Pulling/Events/PullStartedMessage.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Robust.Shared.Physics.Components; - -namespace Content.Shared.Physics.Pull -{ - public sealed class PullStartedMessage : PullMessage - { - public PullStartedMessage(PhysicsComponent puller, PhysicsComponent pulled) : - base(puller, pulled) - { - } - } -} diff --git a/Content.Shared/Pulling/Events/PullStoppedMessage.cs b/Content.Shared/Pulling/Events/PullStoppedMessage.cs deleted file mode 100644 index afcbcb70740..00000000000 --- a/Content.Shared/Pulling/Events/PullStoppedMessage.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Robust.Shared.Physics.Components; - -namespace Content.Shared.Physics.Pull -{ - public sealed class PullStoppedMessage : PullMessage - { - public PullStoppedMessage(PhysicsComponent puller, PhysicsComponent pulled) : base(puller, pulled) - { - } - } -} diff --git a/Content.Shared/Pulling/PullableMoveMessage.cs b/Content.Shared/Pulling/PullableMoveMessage.cs deleted file mode 100644 index 46c6b1291d6..00000000000 --- a/Content.Shared/Pulling/PullableMoveMessage.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Content.Shared.Pulling -{ - public sealed class PullableMoveMessage : EntityEventArgs - { - } -} diff --git a/Content.Shared/Pulling/PullableStopMovingMessage.cs b/Content.Shared/Pulling/PullableStopMovingMessage.cs deleted file mode 100644 index 0233e32f2b4..00000000000 --- a/Content.Shared/Pulling/PullableStopMovingMessage.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Content.Shared.Pulling -{ - public sealed class PullableStopMovingMessage : EntityEventArgs - { - } -} diff --git a/Content.Shared/Pulling/Systems/SharedPullableSystem.cs b/Content.Shared/Pulling/Systems/SharedPullableSystem.cs deleted file mode 100644 index 3dab476337b..00000000000 --- a/Content.Shared/Pulling/Systems/SharedPullableSystem.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Content.Shared.ActionBlocker; -using Content.Shared.Mobs.Systems; -using Content.Shared.Pulling.Components; -using Content.Shared.Movement.Events; - -namespace Content.Shared.Pulling.Systems -{ - public sealed class SharedPullableSystem : EntitySystem - { - [Dependency] private readonly ActionBlockerSystem _blocker = default!; - [Dependency] private readonly MobStateSystem _mobState = default!; - [Dependency] private readonly SharedPullingSystem _pullSystem = default!; - - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnRelayMoveInput); - } - - private void OnRelayMoveInput(EntityUid uid, SharedPullableComponent component, ref MoveInputEvent args) - { - var entity = args.Entity; - if (_mobState.IsIncapacitated(entity) || !_blocker.CanMove(entity)) return; - - _pullSystem.TryStopPull(component); - } - } -} diff --git a/Content.Shared/Pulling/Systems/SharedPullerSystem.cs b/Content.Shared/Pulling/Systems/SharedPullerSystem.cs deleted file mode 100644 index e388d7a57c6..00000000000 --- a/Content.Shared/Pulling/Systems/SharedPullerSystem.cs +++ /dev/null @@ -1,90 +0,0 @@ -using Content.Shared.Administration.Logs; -using Content.Shared.Alert; -using Content.Shared.Database; -using Content.Shared.Hands; -using Content.Shared.Movement.Systems; -using Content.Shared.Physics.Pull; -using Content.Shared.Pulling.Components; -using JetBrains.Annotations; - -namespace Content.Shared.Pulling.Systems -{ - [UsedImplicitly] - public sealed class SharedPullerSystem : EntitySystem - { - [Dependency] private readonly SharedPullingStateManagementSystem _why = default!; - [Dependency] private readonly SharedPullingSystem _pullSystem = default!; - [Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifierSystem = default!; - [Dependency] private readonly AlertsSystem _alertsSystem = default!; - [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(PullerHandlePullStarted); - SubscribeLocalEvent(PullerHandlePullStopped); - SubscribeLocalEvent(OnVirtualItemDeleted); - SubscribeLocalEvent(OnRefreshMovespeed); - SubscribeLocalEvent(OnPullerShutdown); - } - - private void OnPullerShutdown(EntityUid uid, SharedPullerComponent component, ComponentShutdown args) - { - _why.ForceDisconnectPuller(component); - } - - private void OnVirtualItemDeleted(EntityUid uid, SharedPullerComponent component, VirtualItemDeletedEvent args) - { - if (component.Pulling == null) - return; - - if (component.Pulling == args.BlockingEntity) - { - if (EntityManager.TryGetComponent(args.BlockingEntity, out var comp)) - { - _pullSystem.TryStopPull(comp, uid); - } - } - } - - private void PullerHandlePullStarted( - EntityUid uid, - SharedPullerComponent component, - PullStartedMessage args) - { - if (args.Puller.Owner != uid) - return; - - _alertsSystem.ShowAlert(component.Owner, AlertType.Pulling); - - RefreshMovementSpeed(component); - } - - private void PullerHandlePullStopped( - EntityUid uid, - SharedPullerComponent component, - PullStoppedMessage args) - { - if (args.Puller.Owner != uid) - return; - - var euid = component.Owner; - if (_alertsSystem.IsShowingAlert(euid, AlertType.Pulling)) - _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(euid):user} stopped pulling {ToPrettyString(args.Pulled.Owner):target}"); - _alertsSystem.ClearAlert(euid, AlertType.Pulling); - - RefreshMovementSpeed(component); - } - - private void OnRefreshMovespeed(EntityUid uid, SharedPullerComponent component, RefreshMovementSpeedModifiersEvent args) - { - args.ModifySpeed(component.WalkSpeedModifier, component.SprintSpeedModifier); - } - - private void RefreshMovementSpeed(SharedPullerComponent component) - { - _movementSpeedModifierSystem.RefreshMovementSpeedModifiers(component.Owner); - } - } -} diff --git a/Content.Shared/Pulling/Systems/SharedPullingStateManagementSystem.cs b/Content.Shared/Pulling/Systems/SharedPullingStateManagementSystem.cs deleted file mode 100644 index 38ed8998898..00000000000 --- a/Content.Shared/Pulling/Systems/SharedPullingStateManagementSystem.cs +++ /dev/null @@ -1,196 +0,0 @@ -using Content.Shared.Physics.Pull; -using Content.Shared.Pulling.Components; -using JetBrains.Annotations; -using Robust.Shared.Map; -using Robust.Shared.Physics; -using Robust.Shared.Physics.Components; -using Robust.Shared.Physics.Systems; -using Robust.Shared.Timing; - -namespace Content.Shared.Pulling -{ - /// - /// This is the core of pulling state management. - /// Because pulling state is such a mess to get right, all writes to pulling state must go through this class. - /// - [UsedImplicitly] - public sealed class SharedPullingStateManagementSystem : EntitySystem - { - [Dependency] private readonly SharedJointSystem _jointSystem = default!; - [Dependency] private readonly SharedPhysicsSystem _physics = default!; - [Dependency] private readonly IGameTiming _timing = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnShutdown); - } - - private void OnShutdown(EntityUid uid, SharedPullableComponent component, ComponentShutdown args) - { - if (component.Puller != null) - ForceRelationship(null, component); - } - - // A WARNING: - // The following 2 functions are the most internal part of the pulling system's relationship management. - // They do not expect to be cancellable. - private void ForceDisconnect(SharedPullerComponent puller, SharedPullableComponent pullable) - { - var pullerPhysics = EntityManager.GetComponent(puller.Owner); - var pullablePhysics = EntityManager.GetComponent(pullable.Owner); - - // MovingTo shutdown - ForceSetMovingTo(pullable, null); - - // Joint shutdown - if (!_timing.ApplyingState && // During state-handling, joint component will handle its own state. - pullable.PullJointId != null && - TryComp(puller.Owner, out JointComponent? jointComp)) - { - if (jointComp.GetJoints.TryGetValue(pullable.PullJointId, out var j)) - _jointSystem.RemoveJoint(j); - } - pullable.PullJointId = null; - - // State shutdown - puller.Pulling = null; - pullable.Puller = null; - - // Messaging - var message = new PullStoppedMessage(pullerPhysics, pullablePhysics); - - RaiseLocalEvent(puller.Owner, message, broadcast: false); - - if (Initialized(pullable.Owner)) - RaiseLocalEvent(pullable.Owner, message, true); - - // Networking - Dirty(puller); - Dirty(pullable); - } - - public void ForceRelationship(SharedPullerComponent? puller, SharedPullableComponent? pullable) - { - if (_timing.ApplyingState) - return; - ; - if (pullable != null && puller != null && (puller.Pulling == pullable.Owner)) - { - // Already done - return; - } - - // Start by disconnecting the pullable from whatever it is currently connected to. - var pullableOldPullerE = pullable?.Puller; - if (pullableOldPullerE != null) - { - ForceDisconnect(EntityManager.GetComponent(pullableOldPullerE.Value), pullable!); - } - - // Continue with the puller. - var pullerOldPullableE = puller?.Pulling; - if (pullerOldPullableE != null) - { - ForceDisconnect(puller!, EntityManager.GetComponent(pullerOldPullableE.Value)); - } - - // And now for the actual connection (if any). - - if (puller != null && pullable != null) - { - var pullerPhysics = EntityManager.GetComponent(puller.Owner); - var pullablePhysics = EntityManager.GetComponent(pullable.Owner); - pullable.PullJointId = $"pull-joint-{pullable.Owner}"; - - // State startup - puller.Pulling = pullable.Owner; - pullable.Puller = puller.Owner; - - // joint state handling will manage its own state - if (!_timing.ApplyingState) - { - // Joint startup - var union = _physics.GetHardAABB(puller.Owner).Union(_physics.GetHardAABB(pullable.Owner, body: pullablePhysics)); - var length = Math.Max(union.Size.X, union.Size.Y) * 0.75f; - - var joint = _jointSystem.CreateDistanceJoint(pullablePhysics.Owner, pullerPhysics.Owner, id: pullable.PullJointId); - joint.CollideConnected = false; - // This maximum has to be there because if the object is constrained too closely, the clamping goes backwards and asserts. - joint.MaxLength = Math.Max(1.0f, length); - joint.Length = length * 0.75f; - joint.MinLength = 0f; - joint.Stiffness = 1f; - } - - // Messaging - var message = new PullStartedMessage(pullerPhysics, pullablePhysics); - - RaiseLocalEvent(puller.Owner, message, broadcast: false); - RaiseLocalEvent(pullable.Owner, message, true); - - // Networking - Dirty(puller); - Dirty(pullable); - } - } - - // For OnRemove use only. - public void ForceDisconnectPuller(SharedPullerComponent puller) - { - // DO NOT ADD ADDITIONAL LOGIC IN THIS FUNCTION. Do it in ForceRelationship. - ForceRelationship(puller, null); - } - - // For OnRemove use only. - public void ForceDisconnectPullable(SharedPullableComponent pullable) - { - // DO NOT ADD ADDITIONAL LOGIC IN THIS FUNCTION. Do it in ForceRelationship. - ForceRelationship(null, pullable); - } - - public void ForceSetMovingTo(SharedPullableComponent pullable, EntityCoordinates? movingTo) - { - if (_timing.ApplyingState) - return; - - if (pullable.MovingTo == movingTo) - { - return; - } - - // Don't allow setting a MovingTo if there's no puller. - // The other half of this guarantee (shutting down a MovingTo if the puller goes away) is enforced in ForceRelationship. - if (pullable.Puller == null && movingTo != null) - { - return; - } - - pullable.MovingTo = movingTo; - Dirty(pullable); - - if (movingTo == null) - { - RaiseLocalEvent(pullable.Owner, new PullableStopMovingMessage(), true); - } - else - { - RaiseLocalEvent(pullable.Owner, new PullableMoveMessage(), true); - } - } - - /// - /// Changes if the entity needs a hand in order to be able to pull objects. - /// - public void ChangeHandRequirement(EntityUid uid, bool needsHands, SharedPullerComponent? comp) - { - if (!Resolve(uid, ref comp, false)) - return; - - comp.NeedsHands = needsHands; - - Dirty(uid, comp); - } - } -} diff --git a/Content.Shared/Pulling/Systems/SharedPullingSystem.Actions.cs b/Content.Shared/Pulling/Systems/SharedPullingSystem.Actions.cs deleted file mode 100644 index 1e2bb90c61e..00000000000 --- a/Content.Shared/Pulling/Systems/SharedPullingSystem.Actions.cs +++ /dev/null @@ -1,239 +0,0 @@ -using Content.Shared.ActionBlocker; -using Content.Shared.Administration.Logs; -using Content.Shared.Buckle.Components; -using Content.Shared.Database; -using Content.Shared.Hands.EntitySystems; -using Content.Shared.Interaction; -using Content.Shared.Physics.Pull; -using Content.Shared.Pulling.Components; -using Content.Shared.Pulling.Events; -using Robust.Shared.Containers; -using Robust.Shared.Map; -using Robust.Shared.Physics; -using Robust.Shared.Physics.Components; -using Robust.Shared.Physics.Systems; -using Robust.Shared.Timing; -using Robust.Shared.Utility; - -namespace Content.Shared.Pulling -{ - public abstract partial class SharedPullingSystem - { - [Dependency] private readonly ActionBlockerSystem _blocker = default!; - [Dependency] private readonly SharedContainerSystem _containerSystem = default!; - [Dependency] private readonly SharedHandsSystem _handsSystem = default!; - [Dependency] private readonly SharedInteractionSystem _interaction = default!; - [Dependency] private readonly SharedPhysicsSystem _physics = default!; - [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; - [Dependency] private readonly IGameTiming _timing = default!; - - public bool CanPull(EntityUid puller, EntityUid pulled) - { - if (!EntityManager.TryGetComponent(puller, out var comp)) - { - return false; - } - - if (comp.NeedsHands && !_handsSystem.TryGetEmptyHand(puller, out _)) - { - return false; - } - - if (!_blocker.CanInteract(puller, pulled)) - { - return false; - } - - if (!EntityManager.TryGetComponent(pulled, out var physics)) - { - return false; - } - - if (physics.BodyType == BodyType.Static) - { - return false; - } - - if (puller == pulled) - { - return false; - } - - if(_containerSystem.IsEntityInContainer(puller) || _containerSystem.IsEntityInContainer(pulled)) - { - return false; - } - - if (EntityManager.TryGetComponent(puller, out BuckleComponent? buckle)) - { - // Prevent people pulling the chair they're on, etc. - if (buckle is { PullStrap: false, Buckled: true } && (buckle.LastEntityBuckledTo == pulled)) - { - return false; - } - } - - var getPulled = new BeingPulledAttemptEvent(puller, pulled); - RaiseLocalEvent(pulled, getPulled, true); - var startPull = new StartPullAttemptEvent(puller, pulled); - RaiseLocalEvent(puller, startPull, true); - return (!startPull.Cancelled && !getPulled.Cancelled); - } - - public bool TogglePull(EntityUid puller, SharedPullableComponent pullable) - { - if (pullable.Puller == puller) - { - return TryStopPull(pullable); - } - return TryStartPull(puller, pullable.Owner); - } - - // -- Core attempted actions -- - - public bool TryStopPull(SharedPullableComponent pullable, EntityUid? user = null) - { - if (_timing.ApplyingState) - return false; - - if (!pullable.BeingPulled) - { - return false; - } - - var msg = new StopPullingEvent(user); - RaiseLocalEvent(pullable.Owner, msg, true); - - if (msg.Cancelled) return false; - - // Stop pulling confirmed! - - if (TryComp(pullable.Owner, out var pullablePhysics)) - { - _physics.SetFixedRotation(pullable.Owner, pullable.PrevFixedRotation, body: pullablePhysics); - } - - _pullSm.ForceRelationship(null, pullable); - return true; - } - - public bool TryStartPull(EntityUid puller, EntityUid pullable) - { - if (!EntityManager.TryGetComponent(puller, out SharedPullerComponent? pullerComp)) - { - return false; - } - if (!EntityManager.TryGetComponent(pullable, out SharedPullableComponent? pullableComp)) - { - return false; - } - return TryStartPull(pullerComp, pullableComp); - } - - // The main "start pulling" function. - public bool TryStartPull(SharedPullerComponent puller, SharedPullableComponent pullable) - { - if (_timing.ApplyingState) - return false; - - if (puller.Pulling == pullable.Owner) - return true; - - // Pulling a new object : Perform sanity checks. - - if (!CanPull(puller.Owner, pullable.Owner)) - { - return false; - } - - if (!EntityManager.TryGetComponent(puller.Owner, out var pullerPhysics)) - { - return false; - } - - if (!EntityManager.TryGetComponent(pullable.Owner, out var pullablePhysics)) - { - return false; - } - - // Ensure that the puller is not currently pulling anything. - // If this isn't done, then it happens too late, and the start/stop messages go out of order, - // and next thing you know it thinks it's not pulling anything even though it is! - - var oldPullable = puller.Pulling; - if (oldPullable != null) - { - if (EntityManager.TryGetComponent(oldPullable.Value, out SharedPullableComponent? oldPullableComp)) - { - if (!TryStopPull(oldPullableComp)) - { - return false; - } - } - else - { - Log.Warning("Well now you've done it, haven't you? Someone transferred pulling (onto {0}) while presently pulling something that has no Pullable component (on {1})!", pullable.Owner, oldPullable); - return false; - } - } - - // Ensure that the pullable is not currently being pulled. - // Same sort of reasons as before. - - var oldPuller = pullable.Puller; - if (oldPuller != null) - { - if (!TryStopPull(pullable)) - { - return false; - } - } - - // Continue with pulling process. - - var pullAttempt = new PullAttemptEvent(pullerPhysics, pullablePhysics); - - RaiseLocalEvent(puller.Owner, pullAttempt, broadcast: false); - - if (pullAttempt.Cancelled) - { - return false; - } - - RaiseLocalEvent(pullable.Owner, pullAttempt, true); - - if (pullAttempt.Cancelled) - return false; - - _interaction.DoContactInteraction(pullable.Owner, puller.Owner); - - _pullSm.ForceRelationship(puller, pullable); - pullable.PrevFixedRotation = pullablePhysics.FixedRotation; - _physics.SetFixedRotation(pullable.Owner, pullable.FixedRotationOnPull, body: pullablePhysics); - _adminLogger.Add(LogType.Action, LogImpact.Low, - $"{ToPrettyString(puller.Owner):user} started pulling {ToPrettyString(pullable.Owner):target}"); - return true; - } - - public bool TryMoveTo(SharedPullableComponent pullable, EntityCoordinates to) - { - if (pullable.Puller == null) - { - return false; - } - - if (!EntityManager.HasComponent(pullable.Owner)) - { - return false; - } - - _pullSm.ForceSetMovingTo(pullable, to); - return true; - } - - public void StopMoveTo(SharedPullableComponent pullable) - { - _pullSm.ForceSetMovingTo(pullable, null); - } - } -} diff --git a/Content.Shared/Pulling/Systems/SharedPullingSystem.cs b/Content.Shared/Pulling/Systems/SharedPullingSystem.cs deleted file mode 100644 index 0c139ee9e35..00000000000 --- a/Content.Shared/Pulling/Systems/SharedPullingSystem.cs +++ /dev/null @@ -1,243 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using Content.Shared.Alert; -using Content.Shared.GameTicking; -using Content.Shared.Input; -using Content.Shared.Physics.Pull; -using Content.Shared.Pulling.Components; -using Content.Shared.Verbs; -using JetBrains.Annotations; -using Robust.Shared.Containers; -using Robust.Shared.Input.Binding; -using Robust.Shared.Map; -using Robust.Shared.Physics; -using Robust.Shared.Physics.Events; -using Robust.Shared.Physics.Systems; -using Robust.Shared.Player; - -namespace Content.Shared.Pulling -{ - [UsedImplicitly] - public abstract partial class SharedPullingSystem : EntitySystem - { - [Dependency] private readonly SharedPullingStateManagementSystem _pullSm = default!; - [Dependency] private readonly AlertsSystem _alertsSystem = default!; - [Dependency] private readonly SharedJointSystem _joints = default!; - - /// - /// A mapping of pullers to the entity that they are pulling. - /// - private readonly Dictionary _pullers = - new(); - - private readonly HashSet _moving = new(); - private readonly HashSet _stoppedMoving = new(); - - public IReadOnlySet Moving => _moving; - - public override void Initialize() - { - base.Initialize(); - - UpdatesOutsidePrediction = true; - - SubscribeLocalEvent(Reset); - SubscribeLocalEvent(OnPullStarted); - SubscribeLocalEvent(OnPullStopped); - SubscribeLocalEvent(HandleContainerInsert); - SubscribeLocalEvent(OnJointRemoved); - SubscribeLocalEvent(OnPullableCollisionChange); - - SubscribeLocalEvent(PullableHandlePullStarted); - SubscribeLocalEvent(PullableHandlePullStopped); - - SubscribeLocalEvent>(AddPullVerbs); - - CommandBinds.Builder - .Bind(ContentKeyFunctions.MovePulledObject, new PointerInputCmdHandler(HandleMovePulledObject)) - .Register(); - } - - private void OnPullableCollisionChange(EntityUid uid, SharedPullableComponent component, ref CollisionChangeEvent args) - { - if (component.PullJointId != null && !args.CanCollide) - { - _joints.RemoveJoint(uid, component.PullJointId); - } - } - - private void OnJointRemoved(EntityUid uid, SharedPullableComponent component, JointRemovedEvent args) - { - if (component.Puller != args.OtherEntity) - return; - - // Do we have some other join with our Puller? - // or alternatively: - // TODO track the relevant joint. - - if (TryComp(uid, out JointComponent? joints)) - { - foreach (var jt in joints.GetJoints.Values) - { - if (jt.BodyAUid == component.Puller || jt.BodyBUid == component.Puller) - return; - } - } - - // No more joints with puller -> force stop pull. - _pullSm.ForceDisconnectPullable(component); - } - - private void AddPullVerbs(EntityUid uid, SharedPullableComponent component, GetVerbsEvent args) - { - if (!args.CanAccess || !args.CanInteract) - return; - - // Are they trying to pull themselves up by their bootstraps? - if (args.User == args.Target) - return; - - //TODO VERB ICONS add pulling icon - if (component.Puller == args.User) - { - Verb verb = new() - { - Text = Loc.GetString("pulling-verb-get-data-text-stop-pulling"), - Act = () => TryStopPull(component, args.User), - DoContactInteraction = false // pulling handle its own contact interaction. - }; - args.Verbs.Add(verb); - } - else if (CanPull(args.User, args.Target)) - { - Verb verb = new() - { - Text = Loc.GetString("pulling-verb-get-data-text"), - Act = () => TryStartPull(args.User, args.Target), - DoContactInteraction = false // pulling handle its own contact interaction. - }; - args.Verbs.Add(verb); - } - } - - // Raise a "you are being pulled" alert if the pulled entity has alerts. - private void PullableHandlePullStarted(EntityUid uid, SharedPullableComponent component, PullStartedMessage args) - { - if (args.Pulled.Owner != uid) - return; - - _alertsSystem.ShowAlert(uid, AlertType.Pulled); - } - - private void PullableHandlePullStopped(EntityUid uid, SharedPullableComponent component, PullStoppedMessage args) - { - if (args.Pulled.Owner != uid) - return; - - _alertsSystem.ClearAlert(uid, AlertType.Pulled); - } - - public bool IsPulled(EntityUid uid, SharedPullableComponent? component = null) - { - return Resolve(uid, ref component, false) && component.BeingPulled; - } - - public override void Update(float frameTime) - { - base.Update(frameTime); - - _moving.ExceptWith(_stoppedMoving); - _stoppedMoving.Clear(); - } - - public void Reset(RoundRestartCleanupEvent ev) - { - _pullers.Clear(); - _moving.Clear(); - _stoppedMoving.Clear(); - } - - private void OnPullStarted(PullStartedMessage message) - { - SetPuller(message.Puller.Owner, message.Pulled.Owner); - } - - private void OnPullStopped(PullStoppedMessage message) - { - RemovePuller(message.Puller.Owner); - } - - protected void OnPullableMove(EntityUid uid, SharedPullableComponent component, PullableMoveMessage args) - { - _moving.Add(component); - } - - protected void OnPullableStopMove(EntityUid uid, SharedPullableComponent component, PullableStopMovingMessage args) - { - _stoppedMoving.Add(component); - } - - // TODO: When Joint networking is less shitcodey fix this to use a dedicated joints message. - private void HandleContainerInsert(EntInsertedIntoContainerMessage message) - { - if (TryComp(message.Entity, out SharedPullableComponent? pullable)) - { - TryStopPull(pullable); - } - - if (TryComp(message.Entity, out SharedPullerComponent? puller)) - { - if (puller.Pulling == null) return; - - if (!TryComp(puller.Pulling.Value, out SharedPullableComponent? pulling)) - return; - - TryStopPull(pulling); - } - } - - private bool HandleMovePulledObject(ICommonSession? session, EntityCoordinates coords, EntityUid uid) - { - if (session?.AttachedEntity is not { } player || - !player.IsValid()) - return false; - - if (!TryGetPulled(player, out var pulled)) - return false; - - if (!TryComp(pulled.Value, out SharedPullableComponent? pullable)) - return false; - - if (_containerSystem.IsEntityInContainer(player)) - return false; - - TryMoveTo(pullable, coords); - - return false; - } - - private void SetPuller(EntityUid puller, EntityUid pulled) - { - _pullers[puller] = pulled; - } - - private bool RemovePuller(EntityUid puller) - { - return _pullers.Remove(puller); - } - - public EntityUid GetPulled(EntityUid by) - { - return _pullers.GetValueOrDefault(by); - } - - public bool TryGetPulled(EntityUid by, [NotNullWhen(true)] out EntityUid? pulled) - { - return (pulled = GetPulled(by)) != null; - } - - public bool IsPulling(EntityUid puller) - { - return _pullers.ContainsKey(puller); - } - } -} diff --git a/Content.Shared/Security/Systems/DeployableBarrierSystem.cs b/Content.Shared/Security/Systems/DeployableBarrierSystem.cs index 9d021c52194..953120596cb 100644 --- a/Content.Shared/Security/Systems/DeployableBarrierSystem.cs +++ b/Content.Shared/Security/Systems/DeployableBarrierSystem.cs @@ -1,6 +1,6 @@ using Content.Shared.Lock; -using Content.Shared.Pulling; -using Content.Shared.Pulling.Components; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Systems; using Content.Shared.Security.Components; using Robust.Shared.Physics.Systems; @@ -12,7 +12,7 @@ public sealed class DeployableBarrierSystem : EntitySystem [Dependency] private readonly FixtureSystem _fixtures = default!; [Dependency] private readonly SharedPointLightSystem _pointLight = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; - [Dependency] private readonly SharedPullingSystem _pulling = default!; + [Dependency] private readonly PullingSystem _pulling = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; public override void Initialize() @@ -58,8 +58,8 @@ private void ToggleBarrierDeploy(EntityUid uid, bool isDeployed, DeployableBarri var state = isDeployed ? DeployableBarrierState.Deployed : DeployableBarrierState.Idle; _appearance.SetData(uid, DeployableBarrierVisuals.State, state); - if (TryComp(uid, out SharedPullableComponent? pullable)) - _pulling.TryStopPull(pullable); + if (TryComp(uid, out PullableComponent? pullable)) + _pulling.TryStopPull(uid, pullable); SharedPointLightComponent? pointLight = null; if (_pointLight.ResolveLight(uid, ref pointLight)) diff --git a/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs b/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs index ebd83624114..8d67aec518a 100644 --- a/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs +++ b/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs @@ -1,9 +1,9 @@ using System.Linq; using Content.Shared.Ghost; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Systems; using Content.Shared.Popups; using Content.Shared.Projectiles; -using Content.Shared.Pulling; -using Content.Shared.Pulling.Components; using Content.Shared.Teleportation.Components; using Content.Shared.Verbs; using Robust.Shared.Audio; @@ -28,7 +28,7 @@ public abstract class SharedPortalSystem : EntitySystem [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; - [Dependency] private readonly SharedPullingSystem _pulling = default!; + [Dependency] private readonly PullingSystem _pulling = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; private const string PortalFixture = "portalFixture"; @@ -93,15 +93,15 @@ private void OnCollide(EntityUid uid, PortalComponent component, ref StartCollid return; // break pulls before portal enter so we dont break shit - if (TryComp(subject, out var pullable) && pullable.BeingPulled) + if (TryComp(subject, out var pullable) && pullable.BeingPulled) { - _pulling.TryStopPull(pullable); + _pulling.TryStopPull(subject, pullable); } - if (TryComp(subject, out var pulling) - && pulling.Pulling != null && TryComp(pulling.Pulling.Value, out var subjectPulling)) + if (TryComp(subject, out var pullerComp) + && TryComp(pullerComp.Pulling, out var subjectPulling)) { - _pulling.TryStopPull(subjectPulling); + _pulling.TryStopPull(subject, subjectPulling); } // if they came from another portal, just return and wait for them to exit the portal diff --git a/Content.Shared/Throwing/ThrowingSystem.cs b/Content.Shared/Throwing/ThrowingSystem.cs index 54294318315..7c861a85adb 100644 --- a/Content.Shared/Throwing/ThrowingSystem.cs +++ b/Content.Shared/Throwing/ThrowingSystem.cs @@ -20,6 +20,11 @@ public sealed class ThrowingSystem : EntitySystem { public const float ThrowAngularImpulse = 5f; + /// + /// Speed cap on rotation in case of click-spam. + /// + public const float ThrowAngularCap = 3f * MathF.PI; + public const float PushbackDefault = 2f; /// @@ -42,15 +47,17 @@ public void TryThrow( float strength = 1.0f, EntityUid? user = null, float pushbackRatio = PushbackDefault, + bool recoil = true, + bool animated = true, bool playSound = true) { - var thrownPos = Transform(uid).MapPosition; - var mapPos = coordinates.ToMap(EntityManager, _transform); + var thrownPos = _transform.GetMapCoordinates(uid); + var mapPos = _transform.ToMapCoordinates(coordinates); if (mapPos.MapId != thrownPos.MapId) return; - TryThrow(uid, mapPos.Position - thrownPos.Position, strength, user, pushbackRatio, playSound); + TryThrow(uid, mapPos.Position - thrownPos.Position, strength, user, pushbackRatio, recoil: recoil, animated: animated, playSound: playSound); } /// @@ -65,6 +72,8 @@ public void TryThrow(EntityUid uid, float strength = 1.0f, EntityUid? user = null, float pushbackRatio = PushbackDefault, + bool recoil = true, + bool animated = true, bool playSound = true) { var physicsQuery = GetEntityQuery(); @@ -72,7 +81,6 @@ public void TryThrow(EntityUid uid, return; var projectileQuery = GetEntityQuery(); - var tagQuery = GetEntityQuery(); TryThrow( uid, @@ -82,8 +90,7 @@ public void TryThrow(EntityUid uid, projectileQuery, strength, user, - pushbackRatio, - playSound); + pushbackRatio, recoil: recoil, animated: animated, playSound: playSound); } /// @@ -101,6 +108,8 @@ public void TryThrow(EntityUid uid, float strength = 1.0f, EntityUid? user = null, float pushbackRatio = PushbackDefault, + bool recoil = true, + bool animated = true, bool playSound = true) { if (strength <= 0 || direction == Vector2Helpers.Infinity || direction == Vector2Helpers.NaN || direction == Vector2.Zero) @@ -116,12 +125,17 @@ public void TryThrow(EntityUid uid, if (projectileQuery.TryGetComponent(uid, out var proj) && !proj.OnlyCollideWhenShot) return; - var comp = new ThrownItemComponent(); - comp.Thrower = user; + var comp = new ThrownItemComponent + { + Thrower = user, + Animate = animated, + }; // Estimate time to arrival so we can apply OnGround status and slow it much faster. var time = direction.Length() / strength; comp.ThrownTime = _gameTiming.CurTime; + // TODO: This is a bandaid, don't do this. + // if you want to force landtime have the caller handle it or add a new method. // did we launch this with something stronger than our hands? if (TryComp(comp.Thrower, out var hands) && strength > hands.ThrowForceMultiplier) comp.LandTime = comp.ThrownTime + TimeSpan.FromSeconds(time); @@ -166,7 +180,8 @@ public void TryThrow(EntityUid uid, if (user == null) return; - _recoil.KickCamera(user.Value, -direction * 0.04f); + if (recoil) + _recoil.KickCamera(user.Value, -direction * 0.04f); // Give thrower an impulse in the other direction if (pushbackRatio != 0.0f && diff --git a/Content.Shared/Throwing/ThrownItemComponent.cs b/Content.Shared/Throwing/ThrownItemComponent.cs index ab80e079383..8fb1173e6da 100644 --- a/Content.Shared/Throwing/ThrownItemComponent.cs +++ b/Content.Shared/Throwing/ThrownItemComponent.cs @@ -8,6 +8,12 @@ namespace Content.Shared.Throwing [RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] public sealed partial class ThrownItemComponent : Component { + /// + /// Should the in-air throwing animation play. + /// + [DataField, AutoNetworkedField] + public bool Animate = true; + /// /// The entity that threw this entity. /// diff --git a/Content.Shared/Throwing/ThrownItemSystem.cs b/Content.Shared/Throwing/ThrownItemSystem.cs index 0e5817ff92c..e6f7b3779b2 100644 --- a/Content.Shared/Throwing/ThrownItemSystem.cs +++ b/Content.Shared/Throwing/ThrownItemSystem.cs @@ -3,8 +3,7 @@ using Content.Shared.Database; using Content.Shared.Gravity; using Content.Shared.Physics; -using Content.Shared.Physics.Pull; -using Robust.Shared.GameStates; +using Content.Shared.Movement.Pulling.Events; using Robust.Shared.Physics; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Events; @@ -94,8 +93,8 @@ private void OnSleep(EntityUid uid, ThrownItemComponent thrownItem, ref PhysicsS private void HandlePullStarted(PullStartedMessage message) { // TODO: this isn't directed so things have to be done the bad way - if (EntityManager.TryGetComponent(message.Pulled.Owner, out ThrownItemComponent? thrownItemComponent)) - StopThrow(message.Pulled.Owner, thrownItemComponent); + if (EntityManager.TryGetComponent(message.PulledUid, out ThrownItemComponent? thrownItemComponent)) + StopThrow(message.PulledUid, thrownItemComponent); } public void StopThrow(EntityUid uid, ThrownItemComponent thrownItemComponent) From e74e88d26511b245ad330f7a4a79f00207a2869d Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 3 Feb 2024 03:37:15 +0000 Subject: [PATCH 192/266] Automatic changelog update (cherry picked from commit f7b61f6cda93fe8daa64f564530bcb95c7d1bf22) --- Resources/Changelog/Changelog.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 9955812716a..5074d84dcc6 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: TheShuEd - changes: - - message: 'Added 2 new artifact effect: attraction and repulsion' - type: Add - id: 5375 - time: '2023-12-15T15:39:25.0000000+00:00' - author: mirrorcult changes: - message: Explosion visuals now last slightly longer @@ -3870,3 +3864,11 @@ id: 5874 time: '2024-02-03T02:29:41.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24870 +- author: metalgearsloth + changes: + - message: Moving entities that are pulled now throws them instead of moving them + manually. + type: Tweak + id: 5875 + time: '2024-02-03T03:36:09.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/20906 From aded2ef145118641d3ffb3e44afeb22b88ca97a0 Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Sat, 3 Feb 2024 05:23:34 +0100 Subject: [PATCH 193/266] Remove soapy water (#24301) * localize shuttle timer eta etd * remove soapy water for real (cherry picked from commit c4e7f1ebe80b3a347d98784b8b0ec77e047b63d5) --- .../EntitySystems/PuddleSystem.Evaporation.cs | 5 +--- .../Locale/en-US/reagents/meta/cleaning.ftl | 5 +--- .../Objects/Consumable/Drinks/drinks_fun.yml | 5 ++-- Resources/Prototypes/Reagents/cleaning.yml | 30 ------------------- .../Prototypes/Recipes/Reactions/cleaning.yml | 10 ------- 5 files changed, 4 insertions(+), 51 deletions(-) diff --git a/Content.Server/Fluids/EntitySystems/PuddleSystem.Evaporation.cs b/Content.Server/Fluids/EntitySystems/PuddleSystem.Evaporation.cs index f3489ba7c6b..2a80c338360 100644 --- a/Content.Server/Fluids/EntitySystems/PuddleSystem.Evaporation.cs +++ b/Content.Server/Fluids/EntitySystems/PuddleSystem.Evaporation.cs @@ -13,10 +13,7 @@ public sealed partial class PuddleSystem [ValidatePrototypeId] private const string Water = "Water"; - [ValidatePrototypeId] - private const string SoapyWater = "SoapyWater"; - - public static string[] EvaporationReagents = new[] { Water, SoapyWater }; + public static string[] EvaporationReagents = new[] { Water }; private void OnEvaporationMapInit(Entity entity, ref MapInitEvent args) { diff --git a/Resources/Locale/en-US/reagents/meta/cleaning.ftl b/Resources/Locale/en-US/reagents/meta/cleaning.ftl index e770594956e..8603711b6eb 100644 --- a/Resources/Locale/en-US/reagents/meta/cleaning.ftl +++ b/Resources/Locale/en-US/reagents/meta/cleaning.ftl @@ -5,10 +5,7 @@ reagent-name-space-cleaner = space cleaner reagent-desc-space-cleaner = This is able to clean almost all surfaces of almost anything that may dirty them. The janitor is likely to appreciate refills. reagent-name-soap = soap -reagent-desc-soap = Soap can be used to make soapy water. - -reagent-name-soapy-water = soapy water -reagent-desc-soapy-water = It's just soap and water. Good for cleaning gunk off of surfaces and also slippier than regular water. +reagent-desc-soap = I wouldn't clean my mouth out with this if I were you. reagent-name-space-lube = space lube reagent-desc-space-lube = Space Lube is a high performance lubricant intended for maintenance of extremely complex mechanical equipment (and certainly not used to make people slip). diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_fun.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_fun.yml index f89b56ea878..359e4262cd1 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_fun.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_fun.yml @@ -70,7 +70,7 @@ solution: drink -# Mopwata +# Mopwata - type: weightedRandomFillSolution id: RandomFillMopwata fills: @@ -112,7 +112,6 @@ - Mold - SpaceLube - SpaceGlue - - SoapyWater - SpaceCleaner - MilkSpoiled - FourteenLoko @@ -136,4 +135,4 @@ solution: drink weightedRandomId: RandomFillMopwata - type: Sprite - sprite: Objects/Consumable/Drinks/mopwata.rsi \ No newline at end of file + sprite: Objects/Consumable/Drinks/mopwata.rsi diff --git a/Resources/Prototypes/Reagents/cleaning.yml b/Resources/Prototypes/Reagents/cleaning.yml index 24f0c033cf1..da02fc666d8 100644 --- a/Resources/Prototypes/Reagents/cleaning.yml +++ b/Resources/Prototypes/Reagents/cleaning.yml @@ -64,36 +64,6 @@ min: 6 probability: 0.20 -- type: reagent - id: SoapyWater - parent: Water - name: reagent-name-soapy-water - desc: reagent-desc-soapy-water - physicalDesc: reagent-physical-desc-soapy - flavor: clean - color: "#9ec8dc" - recognizable: true - metabolisms: - Drink: - effects: - - !type:SatiateThirst - factor: 3 - - !type:ChemVomit - conditions: - - !type:ReagentThreshold - min: 6 - probability: 0.10 - thirstAmount: -5.0 - hungerAmount: -5.0 - plantMetabolism: - - !type:PlantAdjustWater - amount: .8 - tileReactions: - - !type:CleanDecalsReaction - cleanCost: 5 - - !type:ExtinguishTileReaction { } - - !type:SpillIfPuddlePresentTileReaction { } - - type: reagent id: SpaceLube name: reagent-name-space-lube diff --git a/Resources/Prototypes/Recipes/Reactions/cleaning.yml b/Resources/Prototypes/Recipes/Reactions/cleaning.yml index df6b8f43154..5c620ea9e79 100644 --- a/Resources/Prototypes/Recipes/Reactions/cleaning.yml +++ b/Resources/Prototypes/Recipes/Reactions/cleaning.yml @@ -20,16 +20,6 @@ products: SpaceCleaner: 2 -- type: reaction - id: SoapyWater - reactants: - Water: - amount: 3 - SoapReagent: - amount: 1 - products: - SoapyWater: 4 - - type: reaction id: SpaceLube impact: Medium From 49a1b47c0952b7ccbe10bbc29bcb2eb787cb15b4 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Fri, 2 Feb 2024 23:24:33 -0500 Subject: [PATCH 194/266] Decouple panels and wires (#24840) decouple panels and wires (cherry picked from commit 5db6a3eafc08132b7415be23eb40506ca2f550a9) --- Content.Server/Wires/WiresSystem.cs | 98 +++++---------------- Content.Shared/Wires/SharedWiresSystem.cs | 78 +++++++++++++++- Content.Shared/Wires/WiresPanelComponent.cs | 28 ++++++ 3 files changed, 125 insertions(+), 79 deletions(-) diff --git a/Content.Server/Wires/WiresSystem.cs b/Content.Server/Wires/WiresSystem.cs index 5275a95c340..2b23b093603 100644 --- a/Content.Server/Wires/WiresSystem.cs +++ b/Content.Server/Wires/WiresSystem.cs @@ -1,51 +1,39 @@ using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Threading; -using Content.Server.Administration.Logs; using Content.Server.Construction; using Content.Server.Construction.Components; using Content.Server.Power.Components; -using Content.Shared.UserInterface; -using Content.Shared.Database; +using Content.Server.UserInterface; using Content.Shared.DoAfter; using Content.Shared.GameTicking; using Content.Shared.Hands.Components; using Content.Shared.Interaction; using Content.Shared.Popups; -using Content.Shared.Tools; using Content.Shared.Tools.Components; +using Content.Shared.UserInterface; using Content.Shared.Wires; using Robust.Server.GameObjects; -using Robust.Server.Player; -using Robust.Shared.Audio; -using Robust.Shared.Audio.Systems; using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Random; -using SharedToolSystem = Content.Shared.Tools.Systems.SharedToolSystem; -using Content.Server.UserInterface; namespace Content.Server.Wires; public sealed class WiresSystem : SharedWiresSystem { [Dependency] private readonly IPrototypeManager _protoMan = default!; - [Dependency] private readonly IAdminLogManager _adminLogger = default!; [Dependency] private readonly ActivatableUISystem _activatableUI = default!; [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; - [Dependency] private readonly SharedToolSystem _toolSystem = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; - [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly ConstructionSystem _construction = default!; // This is where all the wire layouts are stored. [ViewVariables] private readonly Dictionary _layouts = new(); - private const float ScrewTime = 1f; private float _toolTime = 0f; #region Initialization @@ -56,8 +44,7 @@ public override void Initialize() SubscribeLocalEvent(Reset); // this is a broadcast event - SubscribeLocalEvent(OnPanelDoAfter); - SubscribeLocalEvent(OnWiresStartup); + SubscribeLocalEvent(OnPanelChanged); SubscribeLocalEvent(OnWiresActionMessage); SubscribeLocalEvent(OnInteractUsing); SubscribeLocalEvent(OnMapInit); @@ -68,6 +55,7 @@ public override void Initialize() SubscribeLocalEvent(OnActivatableUIPanelChanged); SubscribeLocalEvent(SetWiresPanelSecurity); } + private void SetOrCreateWireLayout(EntityUid uid, WiresComponent? wires = null) { if (!Resolve(uid, ref wires)) @@ -246,11 +234,6 @@ private Wire CreateWire(EntityUid uid, IWireAction? action, int position, WireLa position, action); } - - private void OnWiresStartup(EntityUid uid, WiresComponent component, ComponentStartup args) - { - EnsureComp(uid); - } #endregion #region DoAfters @@ -464,49 +447,28 @@ private void OnInteractUsing(EntityUid uid, WiresComponent component, InteractUs if (args.Handled) return; - if (!TryComp(args.Used, out var tool) || !TryComp(uid, out var panel)) + if (!TryComp(args.Used, out var tool)) return; - if (panel.Open && - (_toolSystem.HasQuality(args.Used, "Cutting", tool) || - _toolSystem.HasQuality(args.Used, "Pulsing", tool))) - { - if (TryComp(uid, out var wiresPanelSecurity) && - !wiresPanelSecurity.WiresAccessible) - return; + if (!IsPanelOpen(uid)) + return; + if (Tool.HasQuality(args.Used, "Cutting", tool) || + Tool.HasQuality(args.Used, "Pulsing", tool)) + { if (TryComp(args.User, out ActorComponent? actor)) { _uiSystem.TryOpen(uid, WiresUiKey.Key, actor.PlayerSession); args.Handled = true; } } - else if (_toolSystem.UseTool(args.Used, args.User, uid, ScrewTime, "Screwing", new WirePanelDoAfterEvent(), toolComponent: tool)) - { - _adminLogger.Add(LogType.Action, LogImpact.Low, - $"{ToPrettyString(args.User):user} is screwing {ToPrettyString(uid):target}'s {(panel.Open ? "open" : "closed")} maintenance panel at {Transform(uid).Coordinates:targetlocation}"); - args.Handled = true; - } } - private void OnPanelDoAfter(EntityUid uid, WiresPanelComponent panel, WirePanelDoAfterEvent args) + private void OnPanelChanged(Entity ent, ref PanelChangedEvent args) { - if (args.Cancelled) + if (args.Open) return; - - TogglePanel(uid, panel, !panel.Open); - UpdateAppearance(uid, panel); - _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(args.User):user} screwed {ToPrettyString(uid):target}'s maintenance panel {(panel.Open ? "open" : "closed")}"); - - if (panel.Open) - { - _audio.PlayPvs(panel.ScrewdriverOpenSound, uid); - } - else - { - _audio.PlayPvs(panel.ScrewdriverCloseSound, uid); - _uiSystem.TryCloseAll(uid, WiresUiKey.Key); - } + _uiSystem.TryCloseAll(ent, WiresUiKey.Key); } private void OnAttemptOpenActivatableUI(EntityUid uid, ActivatableUIRequiresPanelComponent component, ActivatableUIOpenAttemptEvent args) @@ -665,16 +627,6 @@ public void ChangePanelVisibility(EntityUid uid, WiresPanelComponent component, Dirty(uid, component); } - public void TogglePanel(EntityUid uid, WiresPanelComponent component, bool open) - { - component.Open = open; - UpdateAppearance(uid, component); - Dirty(uid, component); - - var ev = new PanelChangedEvent(component.Open); - RaiseLocalEvent(uid, ref ev); - } - public void SetWiresPanelSecurity(EntityUid uid, WiresPanelSecurityComponent component, WiresPanelSecurityEvent args) { component.Examine = args.Examine; @@ -688,12 +640,6 @@ public void SetWiresPanelSecurity(EntityUid uid, WiresPanelSecurityComponent com } } - private void UpdateAppearance(EntityUid uid, WiresPanelComponent panel) - { - if (TryComp(uid, out var appearance)) - _appearance.SetData(uid, WiresVisuals.MaintenancePanelState, panel.Open && panel.Visible, appearance); - } - private void TryDoWireAction(EntityUid target, EntityUid user, EntityUid toolEntity, int id, WiresAction action, WiresComponent? wires = null, ToolComponent? tool = null) { if (!Resolve(target, ref wires) @@ -711,7 +657,7 @@ private void TryDoWireAction(EntityUid target, EntityUid user, EntityUid toolEnt switch (action) { case WiresAction.Cut: - if (!_toolSystem.HasQuality(toolEntity, "Cutting", tool)) + if (!Tool.HasQuality(toolEntity, "Cutting", tool)) { _popupSystem.PopupCursor(Loc.GetString("wires-component-ui-on-receive-message-need-wirecutters"), user); return; @@ -725,7 +671,7 @@ private void TryDoWireAction(EntityUid target, EntityUid user, EntityUid toolEnt break; case WiresAction.Mend: - if (!_toolSystem.HasQuality(toolEntity, "Cutting", tool)) + if (!Tool.HasQuality(toolEntity, "Cutting", tool)) { _popupSystem.PopupCursor(Loc.GetString("wires-component-ui-on-receive-message-need-wirecutters"), user); return; @@ -739,7 +685,7 @@ private void TryDoWireAction(EntityUid target, EntityUid user, EntityUid toolEnt break; case WiresAction.Pulse: - if (!_toolSystem.HasQuality(toolEntity, "Pulsing", tool)) + if (!Tool.HasQuality(toolEntity, "Pulsing", tool)) { _popupSystem.PopupCursor(Loc.GetString("wires-component-ui-on-receive-message-need-multitool"), user); return; @@ -798,7 +744,7 @@ private void UpdateWires(EntityUid used, EntityUid user, EntityUid toolEntity, i switch (action) { case WiresAction.Cut: - if (!_toolSystem.HasQuality(toolEntity, "Cutting", tool)) + if (!Tool.HasQuality(toolEntity, "Cutting", tool)) { _popupSystem.PopupCursor(Loc.GetString("wires-component-ui-on-receive-message-need-wirecutters"), user); break; @@ -810,7 +756,7 @@ private void UpdateWires(EntityUid used, EntityUid user, EntityUid toolEntity, i break; } - _toolSystem.PlayToolSound(toolEntity, tool, user); + Tool.PlayToolSound(toolEntity, tool, user); if (wire.Action == null || wire.Action.Cut(user, wire)) { wire.IsCut = true; @@ -819,7 +765,7 @@ private void UpdateWires(EntityUid used, EntityUid user, EntityUid toolEntity, i UpdateUserInterface(used); break; case WiresAction.Mend: - if (!_toolSystem.HasQuality(toolEntity, "Cutting", tool)) + if (!Tool.HasQuality(toolEntity, "Cutting", tool)) { _popupSystem.PopupCursor(Loc.GetString("wires-component-ui-on-receive-message-need-wirecutters"), user); break; @@ -831,7 +777,7 @@ private void UpdateWires(EntityUid used, EntityUid user, EntityUid toolEntity, i break; } - _toolSystem.PlayToolSound(toolEntity, tool, user); + Tool.PlayToolSound(toolEntity, tool, user); if (wire.Action == null || wire.Action.Mend(user, wire)) { wire.IsCut = false; @@ -840,7 +786,7 @@ private void UpdateWires(EntityUid used, EntityUid user, EntityUid toolEntity, i UpdateUserInterface(used); break; case WiresAction.Pulse: - if (!_toolSystem.HasQuality(toolEntity, "Pulsing", tool)) + if (!Tool.HasQuality(toolEntity, "Pulsing", tool)) { _popupSystem.PopupCursor(Loc.GetString("wires-component-ui-on-receive-message-need-multitool"), user); break; @@ -855,7 +801,7 @@ private void UpdateWires(EntityUid used, EntityUid user, EntityUid toolEntity, i wire.Action?.Pulse(user, wire); UpdateUserInterface(used); - _audio.PlayPvs(wires.PulseSound, used); + Audio.PlayPvs(wires.PulseSound, used); break; } diff --git a/Content.Shared/Wires/SharedWiresSystem.cs b/Content.Shared/Wires/SharedWiresSystem.cs index a5b43da482e..a40f4283299 100644 --- a/Content.Shared/Wires/SharedWiresSystem.cs +++ b/Content.Shared/Wires/SharedWiresSystem.cs @@ -1,29 +1,71 @@ +using Content.Shared.Administration.Logs; +using Content.Shared.Database; using Content.Shared.Examine; +using Content.Shared.Interaction; using Content.Shared.Tools.Systems; -using Robust.Shared.Prototypes; +using Robust.Shared.Audio.Systems; namespace Content.Shared.Wires; public abstract class SharedWiresSystem : EntitySystem { + [Dependency] protected readonly ISharedAdminLogManager AdminLogger = default!; + [Dependency] protected readonly SharedAppearanceSystem Appearance = default!; + [Dependency] protected readonly SharedAudioSystem Audio = default!; + [Dependency] protected readonly SharedToolSystem Tool = default!; + public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnPanelDoAfter); + SubscribeLocalEvent(OnInteractUsing); SubscribeLocalEvent(OnExamine); } + private void OnPanelDoAfter(EntityUid uid, WiresPanelComponent panel, WirePanelDoAfterEvent args) + { + if (args.Cancelled) + return; + + TogglePanel(uid, panel, !panel.Open); + AdminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(args.User):user} screwed {ToPrettyString(uid):target}'s maintenance panel {(panel.Open ? "open" : "closed")}"); + + var sound = panel.Open ? panel.ScrewdriverOpenSound : panel.ScrewdriverCloseSound; + Audio.PlayPredicted(sound, uid, args.User); + } + + private void OnInteractUsing(Entity ent, ref InteractUsingEvent args) + { + if (!Tool.UseTool( + args.Used, + args.User, + ent, + (float) ent.Comp.OpenDelay.TotalSeconds, + ent.Comp.OpeningTool, + new WirePanelDoAfterEvent())) + { + return; + } + + AdminLogger.Add(LogType.Action, LogImpact.Low, + $"{ToPrettyString(args.User):user} is screwing {ToPrettyString(ent):target}'s {(ent.Comp.Open ? "open" : "closed")} maintenance panel at {Transform(ent).Coordinates:targetlocation}"); + args.Handled = true; + } + private void OnExamine(EntityUid uid, WiresPanelComponent component, ExaminedEvent args) { using (args.PushGroup(nameof(WiresPanelComponent))) { if (!component.Open) { - args.PushMarkup(Loc.GetString("wires-panel-component-on-examine-closed")); + if (!string.IsNullOrEmpty(component.ExamineTextClosed)) + args.PushMarkup(Loc.GetString(component.ExamineTextClosed)); } else { - args.PushMarkup(Loc.GetString("wires-panel-component-on-examine-open")); + if (!string.IsNullOrEmpty(component.ExamineTextOpen)) + args.PushMarkup(Loc.GetString(component.ExamineTextOpen)); if (TryComp(uid, out var wiresPanelSecurity) && wiresPanelSecurity.Examine != null) @@ -33,4 +75,34 @@ private void OnExamine(EntityUid uid, WiresPanelComponent component, ExaminedEve } } } + + protected void UpdateAppearance(EntityUid uid, WiresPanelComponent panel) + { + if (TryComp(uid, out var appearance)) + Appearance.SetData(uid, WiresVisuals.MaintenancePanelState, panel.Open && panel.Visible, appearance); + } + + public void TogglePanel(EntityUid uid, WiresPanelComponent component, bool open) + { + component.Open = open; + UpdateAppearance(uid, component); + Dirty(uid, component); + + var ev = new PanelChangedEvent(component.Open); + RaiseLocalEvent(uid, ref ev); + } + + public bool IsPanelOpen(Entity entity) + { + if (!Resolve(entity, ref entity.Comp, false)) + return true; + + // Listen, i don't know what the fuck this component does. it's stapled on shit for airlocks + // but it looks like an almost direct duplication of WiresPanelComponent except with a shittier API. + if (TryComp(entity, out var wiresPanelSecurity) && + !wiresPanelSecurity.WiresAccessible) + return false; + + return entity.Comp.Open; + } } diff --git a/Content.Shared/Wires/WiresPanelComponent.cs b/Content.Shared/Wires/WiresPanelComponent.cs index 1162d050338..9c7444778e7 100644 --- a/Content.Shared/Wires/WiresPanelComponent.cs +++ b/Content.Shared/Wires/WiresPanelComponent.cs @@ -1,5 +1,7 @@ +using Content.Shared.Tools; using Robust.Shared.Audio; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; namespace Content.Shared.Wires; @@ -27,6 +29,32 @@ public sealed partial class WiresPanelComponent : Component [DataField("screwdriverCloseSound")] public SoundSpecifier ScrewdriverCloseSound = new SoundPathSpecifier("/Audio/Machines/screwdriverclose.ogg"); + + /// + /// Amount of times in seconds it takes to open + /// + [DataField] + public TimeSpan OpenDelay = TimeSpan.FromSeconds(1); + + /// + /// The tool quality needed to open this panel. + /// + [DataField] + public ProtoId OpeningTool = "Screwing"; + + /// + /// Text showed on examine when the panel is closed. + /// + /// + [DataField] + public LocId? ExamineTextClosed = "wires-panel-component-on-examine-closed"; + + /// + /// Text showed on examine when the panel is open. + /// + /// + [DataField] + public LocId? ExamineTextOpen = "wires-panel-component-on-examine-open"; } /// From 516bd1852afc06359727fcca04a11aeb17fa3729 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 3 Feb 2024 04:24:40 +0000 Subject: [PATCH 195/266] Automatic changelog update (cherry picked from commit 3484e69dffd27896a4234962e2c2640a8b4a3a58) --- Resources/Changelog/Changelog.yml | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 5074d84dcc6..9c4a4ff6fb2 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,15 +1,4 @@ Entries: -- author: mirrorcult - changes: - - message: Explosion visuals now last slightly longer - type: Add - - message: You will now hear a reverbed explosion sound effect for explosions that - are far away from you - type: Add - - message: Smaller explosions now make a distinct sound compared to larger ones - type: Add - id: 5376 - time: '2023-12-15T16:57:46.0000000+00:00' - author: Ubaser changes: - message: Artistic toolboxes now have a filled variant that can be found in maintenance @@ -3872,3 +3861,10 @@ id: 5875 time: '2024-02-03T03:36:09.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/20906 +- author: lzk228 + changes: + - message: Soapy water removed. + type: Remove + id: 5876 + time: '2024-02-03T04:23:34.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24301 From 731da5de6b0c34790a078014ac6c7dfaabe266d0 Mon Sep 17 00:00:00 2001 From: Krunklehorn <42424291+Krunklehorn@users.noreply.github.com> Date: Sat, 3 Feb 2024 03:06:44 -0500 Subject: [PATCH 196/266] Fixed unable to select None for character spawn priority (#24897) Allows None to be selected (cherry picked from commit 778a704b5820811d9267a23a8c080a83bc606ae4) --- Content.Shared/Preferences/HumanoidCharacterProfile.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Content.Shared/Preferences/HumanoidCharacterProfile.cs b/Content.Shared/Preferences/HumanoidCharacterProfile.cs index 9447bb7b407..af4516df7de 100644 --- a/Content.Shared/Preferences/HumanoidCharacterProfile.cs +++ b/Content.Shared/Preferences/HumanoidCharacterProfile.cs @@ -115,7 +115,7 @@ public HumanoidCharacterProfile() : this( new HumanoidCharacterAppearance(), ClothingPreference.Jumpsuit, BackpackPreference.Backpack, - SpawnPriorityPreference.Arrivals, + SpawnPriorityPreference.None, new Dictionary { {SharedGameTicker.FallbackOverflowJob, JobPriority.High} @@ -143,7 +143,7 @@ public static HumanoidCharacterProfile DefaultWithSpecies(string species = Share HumanoidCharacterAppearance.DefaultWithSpecies(species), ClothingPreference.Jumpsuit, BackpackPreference.Backpack, - SpawnPriorityPreference.Arrivals, + SpawnPriorityPreference.None, new Dictionary { {SharedGameTicker.FallbackOverflowJob, JobPriority.High} @@ -185,7 +185,7 @@ public static HumanoidCharacterProfile RandomWithSpecies(string species = Shared var name = GetName(species, gender); - return new HumanoidCharacterProfile(name, "", species, age, sex, gender, HumanoidCharacterAppearance.Random(species, sex), ClothingPreference.Jumpsuit, BackpackPreference.Backpack, SpawnPriorityPreference.Arrivals, + return new HumanoidCharacterProfile(name, "", species, age, sex, gender, HumanoidCharacterAppearance.Random(species, sex), ClothingPreference.Jumpsuit, BackpackPreference.Backpack, SpawnPriorityPreference.None, new Dictionary { {SharedGameTicker.FallbackOverflowJob, JobPriority.High}, @@ -479,9 +479,10 @@ public void EnsureValid() var spawnPriority = SpawnPriority switch { + SpawnPriorityPreference.None => SpawnPriorityPreference.None, SpawnPriorityPreference.Arrivals => SpawnPriorityPreference.Arrivals, SpawnPriorityPreference.Cryosleep => SpawnPriorityPreference.Cryosleep, - _ => SpawnPriorityPreference.Arrivals // Invalid enum values. + _ => SpawnPriorityPreference.None // Invalid enum values. }; var priorities = new Dictionary(JobPriorities From a7579b472c541ce79bf67c302ce2fe90f73331c0 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 3 Feb 2024 08:07:50 +0000 Subject: [PATCH 197/266] Automatic changelog update (cherry picked from commit 240ebfa3a657221d6484c021bc9ddda709879f12) --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 9c4a4ff6fb2..b2269be1e00 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Ubaser - changes: - - message: Artistic toolboxes now have a filled variant that can be found in maintenance - occasionally. - type: Tweak - id: 5377 - time: '2023-12-15T20:44:42.0000000+00:00' - author: Ilya246 changes: - message: Cyborg jobs now start with a positronic brain. @@ -3868,3 +3861,11 @@ id: 5876 time: '2024-02-03T04:23:34.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24301 +- author: Krunk + changes: + - message: Characters can properly select 'None' as a preference for their spawn + priority. + type: Fix + id: 5877 + time: '2024-02-03T08:06:44.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24897 From c12dacd966168fd29b3cdd5d7af349028c300daa Mon Sep 17 00:00:00 2001 From: Krunklehorn <42424291+Krunklehorn@users.noreply.github.com> Date: Sat, 3 Feb 2024 03:09:20 -0500 Subject: [PATCH 198/266] Travelling pointing arrows, brains can no longer point (#24864) * Decoupled from gravity, constant animation time, manual networking, cubic interpolation * Reduced overshoot * Implemented PointAttemptEvent, reacts with mobstate & sleeping * Brains can no longer point, PBs must be inside a chassis * Removed chassis check, made callback more obvious (cherry picked from commit d01d75073cc4179ca5e34cacccd2ca6387e2bf99) --- .../Components/PointingArrowComponent.cs | 11 +--- .../Pointing/PointingSystem.Visualizer.cs | 62 +++++++++++++++++++ Content.Client/Pointing/PointingSystem.cs | 36 +++++------ Content.Server/Body/Systems/BrainSystem.cs | 7 +++ .../Pointing/EntitySystems/PointingSystem.cs | 58 +++++++++-------- Content.Server/Silicons/Borgs/BorgSystem.cs | 7 +++ .../Bed/Sleep/SharedSleepingSystem.cs | 7 +++ .../Systems/MobStateSystem.Subscribers.cs | 2 + .../SharedPointingArrowComponent.cs | 11 +++- .../Pointing/SharedPointingSystem.cs | 31 ++++++++-- 10 files changed, 170 insertions(+), 62 deletions(-) create mode 100644 Content.Client/Pointing/PointingSystem.Visualizer.cs diff --git a/Content.Client/Pointing/Components/PointingArrowComponent.cs b/Content.Client/Pointing/Components/PointingArrowComponent.cs index 0d3bc4a5cc2..4156f84aac7 100644 --- a/Content.Client/Pointing/Components/PointingArrowComponent.cs +++ b/Content.Client/Pointing/Components/PointingArrowComponent.cs @@ -1,19 +1,12 @@ -using System.Numerics; using Content.Shared.Pointing.Components; +using System.Numerics; namespace Content.Client.Pointing.Components; [RegisterComponent] public sealed partial class PointingArrowComponent : SharedPointingArrowComponent { /// - /// How long it takes to go from the bottom of the animation to the top. - /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("animationTime")] - public float AnimationTime = 0.5f; - - /// - /// How far it goes in any direction. + /// How far the arrow moves up and down during the floating phase. /// [ViewVariables(VVAccess.ReadWrite)] [DataField("offset")] diff --git a/Content.Client/Pointing/PointingSystem.Visualizer.cs b/Content.Client/Pointing/PointingSystem.Visualizer.cs new file mode 100644 index 00000000000..63ce882e060 --- /dev/null +++ b/Content.Client/Pointing/PointingSystem.Visualizer.cs @@ -0,0 +1,62 @@ +using Content.Client.Pointing.Components; +using Content.Shared.Pointing; +using Robust.Client.GameObjects; +using Robust.Client.Animations; +using Robust.Shared.Animations; +using System.Numerics; + +namespace Content.Client.Pointing; + +public sealed partial class PointingSystem : SharedPointingSystem +{ + [Dependency] private readonly AnimationPlayerSystem _animationPlayer = default!; + + public void InitializeVisualizer() + { + SubscribeLocalEvent(OnAnimationCompleted); + } + + private void OnAnimationCompleted(EntityUid uid, PointingArrowComponent component, AnimationCompletedEvent args) + { + if (args.Key == component.AnimationKey) + _animationPlayer.Stop(uid, component.AnimationKey); + } + + private void BeginPointAnimation(EntityUid uid, Vector2 startPosition, Vector2 offset, string animationKey) + { + if (_animationPlayer.HasRunningAnimation(uid, animationKey)) + return; + + var animation = new Animation + { + Length = PointDuration, + AnimationTracks = + { + new AnimationTrackComponentProperty + { + ComponentType = typeof(SpriteComponent), + Property = nameof(SpriteComponent.Offset), + InterpolationMode = AnimationInterpolationMode.Cubic, + KeyFrames = + { + // We pad here to prevent improper looping and tighten the overshoot, just a touch + new AnimationTrackProperty.KeyFrame(startPosition, 0f), + new AnimationTrackProperty.KeyFrame(Vector2.Lerp(startPosition, offset, 0.9f), PointKeyTimeMove), + new AnimationTrackProperty.KeyFrame(offset, PointKeyTimeMove), + new AnimationTrackProperty.KeyFrame(Vector2.Zero, PointKeyTimeMove), + new AnimationTrackProperty.KeyFrame(offset, PointKeyTimeHover), + new AnimationTrackProperty.KeyFrame(Vector2.Zero, PointKeyTimeHover), + new AnimationTrackProperty.KeyFrame(offset, PointKeyTimeHover), + new AnimationTrackProperty.KeyFrame(Vector2.Zero, PointKeyTimeHover), + new AnimationTrackProperty.KeyFrame(offset, PointKeyTimeHover), + new AnimationTrackProperty.KeyFrame(Vector2.Zero, PointKeyTimeHover), + new AnimationTrackProperty.KeyFrame(offset, PointKeyTimeHover), + new AnimationTrackProperty.KeyFrame(Vector2.Zero, PointKeyTimeHover), + } + } + } + }; + + _animationPlayer.Play(uid, animation, animationKey); + } +} diff --git a/Content.Client/Pointing/PointingSystem.cs b/Content.Client/Pointing/PointingSystem.cs index 82b12fbf36a..a86b6e21b52 100644 --- a/Content.Client/Pointing/PointingSystem.cs +++ b/Content.Client/Pointing/PointingSystem.cs @@ -1,32 +1,25 @@ using Content.Client.Pointing.Components; -using Content.Client.Gravity; -using Content.Shared.Mobs.Systems; using Content.Shared.Pointing; using Content.Shared.Verbs; using Robust.Client.GameObjects; +using Robust.Shared.GameStates; using Robust.Shared.Utility; using DrawDepth = Content.Shared.DrawDepth.DrawDepth; namespace Content.Client.Pointing; -public sealed class PointingSystem : SharedPointingSystem +public sealed partial class PointingSystem : SharedPointingSystem { - [Dependency] private readonly MobStateSystem _mobState = default!; - [Dependency] private readonly FloatingVisualizerSystem _floatingSystem = default!; - public override void Initialize() { base.Initialize(); SubscribeLocalEvent>(AddPointingVerb); SubscribeLocalEvent(OnArrowStartup); - SubscribeLocalEvent(OnArrowAnimation); SubscribeLocalEvent(OnRogueArrowStartup); - } + SubscribeLocalEvent(HandleCompState); - private void OnArrowAnimation(EntityUid uid, PointingArrowComponent component, AnimationCompletedEvent args) - { - _floatingSystem.FloatAnimation(uid, component.Offset, component.AnimationKey, component.AnimationTime); + InitializeVisualizer(); } private void AddPointingVerb(GetVerbsEvent args) @@ -38,15 +31,11 @@ private void AddPointingVerb(GetVerbsEvent args) // I'm just adding this verb exclusively to clients so that the verb-loading pop-in on the verb menu isn't // as bad. Important for this verb seeing as its usually an option on just about any entity. + // this is a pointing arrow. no pointing here... if (HasComp(args.Target)) - { - // this is a pointing arrow. no pointing here... return; - } - // Can the user point? Checking mob state directly instead of some action blocker, as many action blockers are blocked for - // ghosts and there is no obvious choice for pointing (unless ghosts CanEmote?). - if (_mobState.IsIncapacitated(args.User)) + if (!CanPoint(args.User)) return; // We won't check in range or visibility, as this verb is currently only executable via the context menu, @@ -66,11 +55,9 @@ private void AddPointingVerb(GetVerbsEvent args) private void OnArrowStartup(EntityUid uid, PointingArrowComponent component, ComponentStartup args) { if (TryComp(uid, out var sprite)) - { sprite.DrawDepth = (int) DrawDepth.Overlays; - } - _floatingSystem.FloatAnimation(uid, component.Offset, component.AnimationKey, component.AnimationTime); + BeginPointAnimation(uid, component.StartPosition, component.Offset, component.AnimationKey); } private void OnRogueArrowStartup(EntityUid uid, RoguePointingArrowComponent arrow, ComponentStartup args) @@ -81,4 +68,13 @@ private void OnRogueArrowStartup(EntityUid uid, RoguePointingArrowComponent arro sprite.NoRotation = false; } } + + private void HandleCompState(Entity entity, ref ComponentHandleState args) + { + if (args.Current is not SharedPointingArrowComponentState state) + return; + + entity.Comp.StartPosition = state.StartPosition; + entity.Comp.EndTime = state.EndTime; + } } diff --git a/Content.Server/Body/Systems/BrainSystem.cs b/Content.Server/Body/Systems/BrainSystem.cs index b55274808d7..abb54971209 100644 --- a/Content.Server/Body/Systems/BrainSystem.cs +++ b/Content.Server/Body/Systems/BrainSystem.cs @@ -4,6 +4,7 @@ using Content.Shared.Body.Events; using Content.Shared.Mind; using Content.Shared.Mind.Components; +using Content.Shared.Pointing; namespace Content.Server.Body.Systems { @@ -17,6 +18,7 @@ public override void Initialize() SubscribeLocalEvent((uid, _, args) => HandleMind(args.Body, uid)); SubscribeLocalEvent((uid, _, args) => HandleMind(uid, args.OldBody)); + SubscribeLocalEvent(OnPointAttempt); } private void HandleMind(EntityUid newEntity, EntityUid oldEntity) @@ -36,5 +38,10 @@ private void HandleMind(EntityUid newEntity, EntityUid oldEntity) _mindSystem.TransferTo(mindId, newEntity, mind: mind); } + + private void OnPointAttempt(EntityUid uid, BrainComponent component, PointAttemptEvent args) + { + args.Cancel(); + } } } diff --git a/Content.Server/Pointing/EntitySystems/PointingSystem.cs b/Content.Server/Pointing/EntitySystems/PointingSystem.cs index 6fcdfcf994b..a7c455e6a5d 100644 --- a/Content.Server/Pointing/EntitySystems/PointingSystem.cs +++ b/Content.Server/Pointing/EntitySystems/PointingSystem.cs @@ -1,7 +1,6 @@ using System.Linq; using Content.Server.Administration.Logs; using Content.Server.Pointing.Components; -using Content.Shared.Bed.Sleep; using Content.Shared.Database; using Content.Shared.Examine; using Content.Shared.Eye; @@ -10,13 +9,13 @@ using Content.Shared.Input; using Content.Shared.Interaction; using Content.Shared.Mind; -using Content.Shared.Mobs.Systems; using Content.Shared.Pointing; using Content.Shared.Popups; using JetBrains.Annotations; using Robust.Server.GameObjects; using Robust.Server.Player; using Robust.Shared.Enums; +using Robust.Shared.GameStates; using Robust.Shared.Input.Binding; using Robust.Shared.Map; using Robust.Shared.Player; @@ -34,7 +33,6 @@ internal sealed class PointingSystem : SharedPointingSystem [Dependency] private readonly ITileDefinitionManager _tileDefinitionManager = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly RotateToFaceSystem _rotateToFaceSystem = default!; - [Dependency] private readonly MobStateSystem _mobState = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly VisibilitySystem _visibilitySystem = default!; [Dependency] private readonly SharedMindSystem _minds = default!; @@ -50,6 +48,15 @@ internal sealed class PointingSystem : SharedPointingSystem private const float PointingRange = 15f; + private void GetCompState(Entity entity, ref ComponentGetState args) + { + args.State = new SharedPointingArrowComponentState + { + StartPosition = entity.Comp.StartPosition, + EndTime = entity.Comp.EndTime + }; + } + private void OnPlayerStatusChanged(object? sender, SessionStatusEventArgs e) { if (e.NewStatus != SessionStatus.Disconnected) @@ -97,7 +104,7 @@ public bool InRange(EntityUid pointer, EntityCoordinates coordinates) } } - public bool TryPoint(ICommonSession? session, EntityCoordinates coords, EntityUid pointed) + public bool TryPoint(ICommonSession? session, EntityCoordinates coordsPointed, EntityUid pointed) { if (session?.AttachedEntity is not { } player) { @@ -105,9 +112,9 @@ public bool TryPoint(ICommonSession? session, EntityCoordinates coords, EntityUi return false; } - if (!coords.IsValid(EntityManager)) + if (!coordsPointed.IsValid(EntityManager)) { - Log.Warning($"Player {ToPrettyString(player)} attempted to point at invalid coordinates: {coords}"); + Log.Warning($"Player {ToPrettyString(player)} attempted to point at invalid coordinates: {coordsPointed}"); return false; } @@ -123,33 +130,30 @@ public bool TryPoint(ICommonSession? session, EntityCoordinates coords, EntityUi return false; } - // Checking mob state directly instead of some action blocker, as many action blockers are blocked for - // ghosts and there is no obvious choice for pointing. - if (_mobState.IsIncapacitated(player)) - { - return false; - } - - if (HasComp(player)) + if (!CanPoint(player)) { return false; } - if (!InRange(player, coords)) + if (!InRange(player, coordsPointed)) { _popup.PopupEntity(Loc.GetString("pointing-system-try-point-cannot-reach"), player, player); return false; } + var mapCoordsPointed = coordsPointed.ToMap(EntityManager); + _rotateToFaceSystem.TryFaceCoordinates(player, mapCoordsPointed.Position); - var mapCoords = coords.ToMap(EntityManager); - _rotateToFaceSystem.TryFaceCoordinates(player, mapCoords.Position); - - var arrow = EntityManager.SpawnEntity("PointingArrow", coords); + var arrow = EntityManager.SpawnEntity("PointingArrow", coordsPointed); if (TryComp(arrow, out var pointing)) { - pointing.EndTime = _gameTiming.CurTime + TimeSpan.FromSeconds(4); + if (TryComp(player, out TransformComponent? xformPlayer)) + pointing.StartPosition = EntityCoordinates.FromMap(arrow, xformPlayer.Coordinates.ToMap(EntityManager)).Position; + + pointing.EndTime = _gameTiming.CurTime + PointDuration; + + Dirty(arrow, pointing); } if (EntityQuery().FirstOrDefault() != null) @@ -215,10 +219,10 @@ bool ViewerPredicate(ICommonSession playerSession) TileRef? tileRef = null; string? position = null; - if (_mapManager.TryFindGridAt(mapCoords, out var gridUid, out var grid)) + if (_mapManager.TryFindGridAt(mapCoordsPointed, out var gridUid, out var grid)) { - position = $"EntId={gridUid} {grid.WorldToTile(mapCoords.Position)}"; - tileRef = grid.GetTileRef(grid.WorldToTile(mapCoords.Position)); + position = $"EntId={gridUid} {grid.WorldToTile(mapCoordsPointed.Position)}"; + tileRef = grid.GetTileRef(grid.WorldToTile(mapCoordsPointed.Position)); } var tileDef = _tileDefinitionManager[tileRef?.Tile.TypeId ?? 0]; @@ -228,7 +232,7 @@ bool ViewerPredicate(ICommonSession playerSession) viewerMessage = Loc.GetString("pointing-system-other-point-at-tile", ("otherName", playerName), ("tileName", name)); - _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(player):user} pointed at {name} {(position == null ? mapCoords : position)}"); + _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(player):user} pointed at {name} {(position == null ? mapCoordsPointed : position)}"); } _pointers[session] = _gameTiming.CurTime; @@ -242,6 +246,8 @@ public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(GetCompState); + SubscribeNetworkEvent(OnPointAttempt); _playerManager.PlayerStatusChanged += OnPlayerStatusChanged; @@ -255,8 +261,8 @@ private void OnPointAttempt(PointingAttemptEvent ev, EntitySessionEventArgs args { var target = GetEntity(ev.Target); - if (TryComp(target, out TransformComponent? xform)) - TryPoint(args.SenderSession, xform.Coordinates, target); + if (TryComp(target, out TransformComponent? xformTarget)) + TryPoint(args.SenderSession, xformTarget.Coordinates, target); else Log.Warning($"User {args.SenderSession} attempted to point at a non-existent entity uid: {ev.Target}"); } diff --git a/Content.Server/Silicons/Borgs/BorgSystem.cs b/Content.Server/Silicons/Borgs/BorgSystem.cs index 0efbe1a40ab..869c2797047 100644 --- a/Content.Server/Silicons/Borgs/BorgSystem.cs +++ b/Content.Server/Silicons/Borgs/BorgSystem.cs @@ -14,6 +14,7 @@ using Content.Shared.Mobs; using Content.Shared.Mobs.Systems; using Content.Shared.Movement.Systems; +using Content.Shared.Pointing; using Content.Shared.PowerCell; using Content.Shared.PowerCell.Components; using Content.Shared.Roles; @@ -67,6 +68,7 @@ public override void Initialize() SubscribeLocalEvent(OnGetDeadIC); SubscribeLocalEvent(OnBrainMindAdded); + SubscribeLocalEvent(OnBrainPointAttempt); InitializeModules(); InitializeMMI(); @@ -242,6 +244,11 @@ private void OnBrainMindAdded(EntityUid uid, BorgBrainComponent component, MindA _mind.TransferTo(mindId, containerEnt, mind: mind); } + private void OnBrainPointAttempt(EntityUid uid, BorgBrainComponent component, PointAttemptEvent args) + { + args.Cancel(); + } + private void UpdateBatteryAlert(EntityUid uid, PowerCellSlotComponent? slotComponent = null) { if (!_powerCell.TryGetBatteryFromSlot(uid, out var battery, slotComponent)) diff --git a/Content.Shared/Bed/Sleep/SharedSleepingSystem.cs b/Content.Shared/Bed/Sleep/SharedSleepingSystem.cs index 2ac1c372ca6..505b2a18e7b 100644 --- a/Content.Shared/Bed/Sleep/SharedSleepingSystem.cs +++ b/Content.Shared/Bed/Sleep/SharedSleepingSystem.cs @@ -2,6 +2,7 @@ using Content.Shared.Bed.Sleep; using Content.Shared.Damage.ForceSay; using Content.Shared.Eye.Blinding.Systems; +using Content.Shared.Pointing; using Content.Shared.Speech; using Robust.Shared.Network; using Robust.Shared.Prototypes; @@ -25,6 +26,7 @@ public override void Initialize() SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnSpeakAttempt); SubscribeLocalEvent(OnSeeAttempt); + SubscribeLocalEvent(OnPointAttempt); SubscribeLocalEvent(OnSleepUnpaused); } @@ -70,6 +72,11 @@ private void OnSeeAttempt(EntityUid uid, SleepingComponent component, CanSeeAtte if (component.LifeStage <= ComponentLifeStage.Running) args.Cancel(); } + + private void OnPointAttempt(EntityUid uid, SleepingComponent component, PointAttemptEvent args) + { + args.Cancel(); + } } } diff --git a/Content.Shared/Mobs/Systems/MobStateSystem.Subscribers.cs b/Content.Shared/Mobs/Systems/MobStateSystem.Subscribers.cs index 8ce12db5183..51991332539 100644 --- a/Content.Shared/Mobs/Systems/MobStateSystem.Subscribers.cs +++ b/Content.Shared/Mobs/Systems/MobStateSystem.Subscribers.cs @@ -9,6 +9,7 @@ using Content.Shared.Item; using Content.Shared.Mobs.Components; using Content.Shared.Movement.Events; +using Content.Shared.Pointing; using Content.Shared.Pulling.Events; using Content.Shared.Speech; using Content.Shared.Standing; @@ -38,6 +39,7 @@ private void SubscribeEvents() SubscribeLocalEvent(CheckAct); SubscribeLocalEvent(CheckAct); SubscribeLocalEvent(CheckAct); + SubscribeLocalEvent(CheckAct); SubscribeLocalEvent(OnSleepAttempt); SubscribeLocalEvent(OnCombatModeShouldHandInteract); SubscribeLocalEvent(OnAttemptPacifiedAttack); diff --git a/Content.Shared/Pointing/Components/SharedPointingArrowComponent.cs b/Content.Shared/Pointing/Components/SharedPointingArrowComponent.cs index 07613c77463..66cca50c2ed 100644 --- a/Content.Shared/Pointing/Components/SharedPointingArrowComponent.cs +++ b/Content.Shared/Pointing/Components/SharedPointingArrowComponent.cs @@ -1,13 +1,22 @@ using Robust.Shared.GameStates; +using System.Numerics; namespace Content.Shared.Pointing.Components; [NetworkedComponent] public abstract partial class SharedPointingArrowComponent : Component { + /// + /// The position of the sender when the point began. + /// + [DataField] + [ViewVariables(VVAccess.ReadWrite)] + public Vector2 StartPosition; + /// /// When the pointing arrow ends /// - [ViewVariables(VVAccess.ReadWrite), DataField("endTime")] + [DataField] + [ViewVariables(VVAccess.ReadWrite)] public TimeSpan EndTime; } diff --git a/Content.Shared/Pointing/SharedPointingSystem.cs b/Content.Shared/Pointing/SharedPointingSystem.cs index 05e4b4aa27a..bb3436a14b5 100644 --- a/Content.Shared/Pointing/SharedPointingSystem.cs +++ b/Content.Shared/Pointing/SharedPointingSystem.cs @@ -1,17 +1,36 @@ using Robust.Shared.Serialization; +using System.Numerics; namespace Content.Shared.Pointing; public abstract class SharedPointingSystem : EntitySystem { + protected readonly TimeSpan PointDuration = TimeSpan.FromSeconds(4); + protected readonly float PointKeyTimeMove = 0.1f; + protected readonly float PointKeyTimeHover = 0.5f; + [Serializable, NetSerializable] - protected sealed class PointingArrowComponentState : ComponentState + public sealed class SharedPointingArrowComponentState : ComponentState { - public TimeSpan EndTime; + public Vector2 StartPosition { get; init; } + public TimeSpan EndTime { get; init; } + } + + public bool CanPoint(EntityUid uid) + { + var ev = new PointAttemptEvent(uid); + RaiseLocalEvent(uid, ev, true); + + return !ev.Cancelled; + } +} - public PointingArrowComponentState(TimeSpan endTime) - { - EndTime = endTime; - } +public sealed class PointAttemptEvent : CancellableEntityEventArgs +{ + public PointAttemptEvent(EntityUid uid) + { + Uid = uid; } + + public EntityUid Uid { get; } } From 48bcdcd39be7d6ee5d489197a59520f7e3f3e05f Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 3 Feb 2024 08:10:25 +0000 Subject: [PATCH 199/266] Automatic changelog update (cherry picked from commit 864904dd5d3c939336c20781b70943b064490a07) --- Resources/Changelog/Changelog.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b2269be1e00..0e3727e4730 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: Ilya246 - changes: - - message: Cyborg jobs now start with a positronic brain. - type: Tweak - id: 5378 - time: '2023-12-15T20:45:31.0000000+00:00' - author: deltanedas changes: - message: Borgs can wear hats now. Time to get festive! @@ -3869,3 +3863,11 @@ id: 5877 time: '2024-02-03T08:06:44.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24897 +- author: Krunk + changes: + - message: Pointing arrows now begin at the player and smoothly animate to their + target. + type: Add + id: 5878 + time: '2024-02-03T08:09:20.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24864 From d6cb163db3f21aee79d1547c0e49f7e3e02a8332 Mon Sep 17 00:00:00 2001 From: Arendian <137322659+Arendian@users.noreply.github.com> Date: Sat, 3 Feb 2024 09:10:50 +0100 Subject: [PATCH 200/266] Fix sliding bug (#24846) * Fix slip bug * debug assert * count * DebugAssert (cherry picked from commit 9e484c4b61352a81bb84e2e1e9e030d13ff1464a) --- Content.Shared/Slippery/SlidingSystem.cs | 1 - Content.Shared/Slippery/SlipperySystem.cs | 7 ++++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Content.Shared/Slippery/SlidingSystem.cs b/Content.Shared/Slippery/SlidingSystem.cs index 0af6b203cc5..d44ddc883b9 100644 --- a/Content.Shared/Slippery/SlidingSystem.cs +++ b/Content.Shared/Slippery/SlidingSystem.cs @@ -59,5 +59,4 @@ private void OnEndCollide(EntityUid uid, SlidingComponent component, ref EndColl Dirty(uid, component); } - } diff --git a/Content.Shared/Slippery/SlipperySystem.cs b/Content.Shared/Slippery/SlipperySystem.cs index 59a1c208ed2..1f602b9b52b 100644 --- a/Content.Shared/Slippery/SlipperySystem.cs +++ b/Content.Shared/Slippery/SlipperySystem.cs @@ -9,6 +9,7 @@ using Robust.Shared.Containers; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Systems; +using Robust.Shared.Utility; namespace Content.Shared.Slippery; @@ -75,7 +76,11 @@ private void TrySlip(EntityUid uid, SlipperyComponent component, EntityUid other _physics.SetLinearVelocity(other, physics.LinearVelocity * component.LaunchForwardsMultiplier, body: physics); if (component.SuperSlippery) - EnsureComp(other); + { + var sliding = EnsureComp(other); + sliding.CollidingEntities.Add(uid); + DebugTools.Assert(_physics.GetContactingEntities(other, physics).Contains(uid)); + } } var playSound = !_statusEffects.HasStatusEffect(other, "KnockedDown"); From 1b913a2b7d8cf5a185316824ff5309713bca5b78 Mon Sep 17 00:00:00 2001 From: shamp <140359015+shampunj@users.noreply.github.com> Date: Sat, 3 Feb 2024 11:11:01 +0300 Subject: [PATCH 201/266] Fixed incorrect path to the uranium spear image in the construction menu (#24895) Update weapons.yml Fixed incorrect path to the uranium spear image in the construction menu (cherry picked from commit 8af1bea9371e77589fbe9c30ad531ffae1c382b3) --- Resources/Prototypes/Recipes/Construction/weapons.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Recipes/Construction/weapons.yml b/Resources/Prototypes/Recipes/Construction/weapons.yml index 865184fad0c..868a5cb186e 100644 --- a/Resources/Prototypes/Recipes/Construction/weapons.yml +++ b/Resources/Prototypes/Recipes/Construction/weapons.yml @@ -39,7 +39,7 @@ targetNode: spear category: construction-category-weapons description: A crude uranium spear for when you need to put holes in somebody. - icon: { sprite: Objects/Weapons/Melee/plasma_spear.rsi, state: spear } + icon: { sprite: Objects/Weapons/Melee/uranium_spear.rsi, state: spear } objectType: Item - type: construction From f4098941af36bbc2e47aef182b1e80a3dde7a9ff Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 3 Feb 2024 08:12:07 +0000 Subject: [PATCH 202/266] Automatic changelog update (cherry picked from commit 07523b5615903d0c0c960c8884aeb14a65afb37b) --- Resources/Changelog/Changelog.yml | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 0e3727e4730..5cfce160b9b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,16 +1,4 @@ Entries: -- author: deltanedas - changes: - - message: Borgs can wear hats now. Time to get festive! - type: Tweak - id: 5379 - time: '2023-12-15T22:33:52.0000000+00:00' -- author: mirrorcult - changes: - - message: Chasms no longer spawn on lava expeditions - type: Tweak - id: 5380 - time: '2023-12-15T22:34:09.0000000+00:00' - author: EmoGarbage404 changes: - message: The guidebook now shows you if a chemical's recipe needs an alternative @@ -3871,3 +3859,18 @@ id: 5878 time: '2024-02-03T08:09:20.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24864 +- author: Dygon + changes: + - message: Single tile sized puddles of space lube won't let you slide extremely + far anymore. + type: Fix + id: 5879 + time: '2024-02-03T08:10:51.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24846 +- author: shampunj + changes: + - message: Fixed incorrect path to the uranium spear image in the construction menu + type: Fix + id: 5880 + time: '2024-02-03T08:11:02.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24895 From 508568a6bbf9991c45bb6998b8c61ba4cb73bdb7 Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Sat, 3 Feb 2024 08:12:56 +0000 Subject: [PATCH 203/266] Add carp pocket (#24888) * texture * add the item * add it to present and salv loot --------- Co-authored-by: deltanedas <@deltanedas:kde.org> (cherry picked from commit 604748534ebd72efafa11344ee33d563c2ff93c3) --- .../Locale/en-US/flavors/flavor-profiles.ftl | 1 + .../Consumable/Food/Baked/donkpocket.yml | 37 ++++++++++++++++++ .../Consumable/Food/Containers/box.yml | 12 ++++++ .../Entities/Objects/Decoration/present.yml | 2 + Resources/Prototypes/Flavors/flavors.yml | 5 +++ .../Prototypes/Procedural/salvage_loot.yml | 2 + .../Recipes/Cooking/meal_recipes.yml | 8 ++++ .../Food/Baked/donkpocket.rsi/carp-box.png | Bin 0 -> 492 bytes .../Food/Baked/donkpocket.rsi/carp.png | Bin 0 -> 321 bytes .../Food/Baked/donkpocket.rsi/meta.json | 8 +++- 10 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/carp-box.png create mode 100644 Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/carp.png diff --git a/Resources/Locale/en-US/flavors/flavor-profiles.ftl b/Resources/Locale/en-US/flavors/flavor-profiles.ftl index 7c4242d4b3e..3ff86e38752 100644 --- a/Resources/Locale/en-US/flavors/flavor-profiles.ftl +++ b/Resources/Locale/en-US/flavors/flavor-profiles.ftl @@ -166,6 +166,7 @@ flavor-complex-spaceshroom-cooked = like space umami flavor-complex-lost-friendship = like lost friendship flavor-complex-light = like a light gone out flavor-complex-profits = like profits +flavor-complex-fishops = like the dreaded fishops # Drink-specific flavors. diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/donkpocket.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/donkpocket.yml index 1347aa42a1f..e8efb194356 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/donkpocket.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/donkpocket.yml @@ -329,6 +329,43 @@ - ReagentId: Omnizine Quantity: 2 +- type: entity + name: carp-pocket + parent: FoodDonkpocketBase + id: FoodDonkpocketCarp + description: A long-lost edition of donk pocket, made specifically for hard-working salvagers. + components: + - type: FlavorProfile + flavors: + - cheap + - fishops + - type: SolutionContainerManager + solutions: + food: + reagents: + - ReagentId: Nutriment + Quantity: 5 + - type: Sprite + state: carp + +- type: entity + name: warm carp-pocket + parent: FoodDonkpocketCarp + id: FoodDonkpocketCarpWarm + components: + - type: FlavorProfile + flavors: + - cheap + - fishops + - type: SolutionContainerManager + solutions: + food: + reagents: + - ReagentId: Nutriment + Quantity: 10 + - ReagentId: Omnizine + Quantity: 2 + - type: entity name: dink-pocket parent: FoodDonkpocketBase diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml index 1388299f5aa..fb6bd2e024b 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml @@ -413,6 +413,18 @@ - id: FoodDonkpocketStonk amount: 6 +- type: entity + parent: FoodBoxDonkpocket + id: FoodBoxDonkpocketCarp + name: box of carp-pockets + components: + - type: Sprite + state: carp-box + - type: StorageFill + contents: + - id: FoodDonkpocketCarp + amount: 6 + - type: entity parent: FoodBoxDonkpocket id: FoodBoxDonkpocketBerry diff --git a/Resources/Prototypes/Entities/Objects/Decoration/present.yml b/Resources/Prototypes/Entities/Objects/Decoration/present.yml index ff02e8a0864..e5c1884d1c5 100644 --- a/Resources/Prototypes/Entities/Objects/Decoration/present.yml +++ b/Resources/Prototypes/Entities/Objects/Decoration/present.yml @@ -270,6 +270,8 @@ orGroup: GiftPool - id: FoodBoxDonkpocketStonk orGroup: GiftPool + - id: FoodBoxDonkpocketCarp + orGroup: GiftPool - id: FoodBoxDonkpocketBerry orGroup: GiftPool - id: FoodBoxDonkpocketHonk diff --git a/Resources/Prototypes/Flavors/flavors.yml b/Resources/Prototypes/Flavors/flavors.yml index 91f63edfb74..bd22844e63b 100644 --- a/Resources/Prototypes/Flavors/flavors.yml +++ b/Resources/Prototypes/Flavors/flavors.yml @@ -998,3 +998,8 @@ id: profits flavorType: Complex description: flavor-complex-profits + +- type: flavor + id: fishops + flavorType: Complex + description: flavor-complex-fishops diff --git a/Resources/Prototypes/Procedural/salvage_loot.yml b/Resources/Prototypes/Procedural/salvage_loot.yml index ed649f54b3a..92b04496baa 100644 --- a/Resources/Prototypes/Procedural/salvage_loot.yml +++ b/Resources/Prototypes/Procedural/salvage_loot.yml @@ -27,6 +27,8 @@ - proto: CloningPodMachineCircuitboard cost: 2 - proto: CognizineChemistryBottle + - proto: FoodBoxDonkpocketCarp + prob: 0.5 - proto: CrateSalvageEquipment cost: 3 prob: 0.5 diff --git a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml index 2eed557eaa9..28761aa779d 100644 --- a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml +++ b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml @@ -1488,6 +1488,14 @@ solids: FoodDonkpocketStonk: 1 +- type: microwaveMealRecipe + id: RecipeDonkpocketCarp + name: warm carp-pocket recipe + result: FoodDonkpocketCarpWarm + time: 5 + solids: + FoodDonkpocketCarp: 1 + - type: microwaveMealRecipe id: RecipeHotChili diff --git a/Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/carp-box.png b/Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/carp-box.png new file mode 100644 index 0000000000000000000000000000000000000000..aa82f12f19c9e1a612f97be49180115022f44308 GIT binary patch literal 492 zcmVF6XU=)mkkq#IMDKL|B`%j4lrylLXYX=K4hOjYl zFqlfYF=&}7gZcN*y<|`{5@(Q55nwpJ>Lv#J+Nrw?r=RU&`1S7xL9>~N^$8~n57-iz zZ+|{BY`Hm?vM69?VqsumVrAgx5GKj;k3Zgm z^%4RERdBFyGOz0obqHD{_6WfYB=B>10S0RSq=c{rAib$ i`EqNtjt|NA?wadPMMhj)K( z=aGN^N7PdeWJw`-O?^kLo~mlH1Q+%_ByXun`1uFxFLfBx_P&#$H9OoLXL z^_XxoPI#)56O-`g<5$}&KUlhIe}9?uEs&vzg@fDsb%QM9A%)YNtvpv{8r~F7PFj{!BboC!CVIOD9CXQ?c*dje>6I1CZU;3aSetzopr07Tb;-T(jq literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/meta.json b/Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/meta.json index bd3331fa8ba..a2228b340ed 100644 --- a/Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Food/Baked/donkpocket.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c6e3401f2e7e1e55c57060cdf956a98ef1fefc24. Stonk pocket by Tayrtahn on GitHub", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c6e3401f2e7e1e55c57060cdf956a98ef1fefc24. Stonk pocket by Tayrtahn on GitHub. Carp pocket by deltanedas (GitHub).", "size": { "x": 32, "y": 32 @@ -58,6 +58,12 @@ { "name": "stonk" }, + { + "name": "carp-box" + }, + { + "name": "carp" + }, { "name": "inhand-left", "directions": 4 From c3629bc04331c2ebe90264b345dfc1933f77840b Mon Sep 17 00:00:00 2001 From: nikthechampiongr <32041239+nikthechampiongr@users.noreply.github.com> Date: Sat, 3 Feb 2024 18:43:50 +0200 Subject: [PATCH 204/266] Fix end of round messages looping forever (#24920) * Fix End of Round messages looping forever and ever and ever * Use the correct setting for round restart sounds (cherry picked from commit 09daa534bd32d4784b6dd88ac6877607efec17b8) --- Content.Client/Audio/BackgroundAudioSystem.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Content.Client/Audio/BackgroundAudioSystem.cs b/Content.Client/Audio/BackgroundAudioSystem.cs index 9c4bf3f266e..29279830627 100644 --- a/Content.Client/Audio/BackgroundAudioSystem.cs +++ b/Content.Client/Audio/BackgroundAudioSystem.cs @@ -25,6 +25,7 @@ public sealed class BackgroundAudioSystem : EntitySystem [Dependency] private readonly IStateManager _stateManager = default!; private readonly AudioParams _lobbyParams = new(-5f, 1, "Master", 0, 0, 0, true, 0f); + private readonly AudioParams _roundEndParams = new(-5f, 1, "Master", 0, 0, 0, false, 0f); public EntityUid? LobbyMusicStream; public EntityUid? LobbyRoundRestartAudioStream; @@ -139,7 +140,7 @@ private void EndLobbyMusic() private void PlayRestartSound(RoundRestartCleanupEvent ev) { - if (!_configManager.GetCVar(CCVars.LobbyMusicEnabled)) + if (!_configManager.GetCVar(CCVars.RestartSoundsEnabled)) return; var file = _gameTicker.RestartSound; @@ -152,7 +153,7 @@ private void PlayRestartSound(RoundRestartCleanupEvent ev) file, Filter.Local(), false, - _lobbyParams.WithVolume(_lobbyParams.Volume + SharedAudioSystem.GainToVolume(_configManager.GetCVar(CCVars.LobbyMusicVolume))) + _roundEndParams.WithVolume(_roundEndParams.Volume + SharedAudioSystem.GainToVolume(_configManager.GetCVar(CCVars.LobbyMusicVolume))) )?.Entity; } } From 584bfb8d5aa872a8aef89dd70b1eb665216af9b8 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 3 Feb 2024 16:44:56 +0000 Subject: [PATCH 205/266] Automatic changelog update (cherry picked from commit c9018cf205cbb09b825c04cd3bb3d0553e0bae75) --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 5cfce160b9b..e551e8d9575 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: EmoGarbage404 - changes: - - message: The guidebook now shows you if a chemical's recipe needs an alternative - mixing method, such as a chaplain's blessing or electrolysis. - type: Fix - id: 5381 - time: '2023-12-15T23:59:54.0000000+00:00' - author: deltanedas changes: - message: Added smoke grenades to the syndicate uplink for 1 TC, they create a @@ -3874,3 +3867,10 @@ id: 5880 time: '2024-02-03T08:11:02.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24895 +- author: nikthechampiongr + changes: + - message: End of round messages no longer loop until the heat death of the universe. + type: Fix + id: 5881 + time: '2024-02-03T16:43:50.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24920 From 3c4421c107e70d465e53aca1ba7d5cc2fd7045a9 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Sat, 3 Feb 2024 12:33:57 -0500 Subject: [PATCH 206/266] chat color change (#24922) (cherry picked from commit 2d48ec52abf6fe18f885d98ace617301e5020f89) --- Content.Server/Chat/Systems/ChatSystem.cs | 4 ++-- Resources/Prototypes/Palettes/text.yml | 19 ++++++++++++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/Content.Server/Chat/Systems/ChatSystem.cs b/Content.Server/Chat/Systems/ChatSystem.cs index 1a1ca190f79..5f875432b9b 100644 --- a/Content.Server/Chat/Systems/ChatSystem.cs +++ b/Content.Server/Chat/Systems/ChatSystem.cs @@ -77,7 +77,7 @@ public sealed partial class ChatSystem : SharedChatSystem private readonly bool _adminLoocEnabled = true; [ValidatePrototypeId] - private const string _chatNamePalette = "Material"; + private const string ChatNamePalette = "ChatNames"; private string[] _chatNameColors = default!; public override void Initialize() @@ -90,7 +90,7 @@ public override void Initialize() SubscribeLocalEvent(OnGameChange); - var nameColors = _prototypeManager.Index(_chatNamePalette).Colors.Values.ToArray(); + var nameColors = _prototypeManager.Index(ChatNamePalette).Colors.Values.ToArray(); _chatNameColors = new string[nameColors.Length]; for (var i = 0; i < nameColors.Length; i++) { diff --git a/Resources/Prototypes/Palettes/text.yml b/Resources/Prototypes/Palettes/text.yml index de0a9fb60d9..48d20741532 100644 --- a/Resources/Prototypes/Palettes/text.yml +++ b/Resources/Prototypes/Palettes/text.yml @@ -32,4 +32,21 @@ amber-lighten-2: "#755900" amber-darken-2: "#cc8000" amber-accent-2: "#7c6200" - amber-accent-4: "#996700" \ No newline at end of file + amber-accent-4: "#996700" + +- type: palette + id: ChatNames + name: Chat Names + colors: + ploink: "#da8bc9" + ourple: "#b18bda" + us-navy: "#96a4eb" + yet-another-blue: "#8cb7e8" + cyan: "#8bc9da" + fake-color: "#8bdaba" + green: "#8bda8e" + you-wish-you-were-green: "#a9da8b" + piss: "#ceda8b" + orange: "#dabc8b" + the-orange-she-tells-you-not-to-worry-about: "#daa58b" + red: "#da8b8b" From fb8069c32707040e166da56a62fcb29ce98b0721 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 3 Feb 2024 17:35:03 +0000 Subject: [PATCH 207/266] Automatic changelog update (cherry picked from commit b7814c7d279746246fb46bb2b7518f540717f9bc) --- Resources/Changelog/Changelog.yml | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index e551e8d9575..7c310303a2f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,14 +1,4 @@ Entries: -- author: deltanedas - changes: - - message: Added smoke grenades to the syndicate uplink for 1 TC, they create a - large smoke cloud to provide cover for your heinous activites. - type: Add - - message: Added tear gas grenades to the SecTech and security belts, use them to - control riots. - type: Add - id: 5382 - time: '2023-12-16T01:49:30.0000000+00:00' - author: metalgearsloth changes: - message: Fix map boundaries not pushing you back. @@ -3874,3 +3864,10 @@ id: 5881 time: '2024-02-03T16:43:50.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24920 +- author: EmoGarbage404 + changes: + - message: Changed the colors used for chat names. + type: Tweak + id: 5882 + time: '2024-02-03T17:33:58.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24922 From 6a9259db2e54d4e507c801ece7318b8344116955 Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Sat, 3 Feb 2024 19:13:30 +0100 Subject: [PATCH 208/266] nuke biochem research discipline (#24871) * make chem machine boards roundstart * nuke biochem * kill * pro --------- Co-authored-by: deltanedas <@deltanedas:kde.org> (cherry picked from commit 24af66a544d9c0ef2330f7f5ff3e0a420a5655aa) --- .../Locale/en-US/research/technologies.ftl | 16 +- .../Entities/Structures/Machines/lathe.yml | 29 ++-- .../Entities/Structures/Machines/research.yml | 1 - Resources/Prototypes/Research/arsenal.yml | 3 +- Resources/Prototypes/Research/biochemical.yml | 163 ------------------ .../Prototypes/Research/civilianservices.yml | 46 ++++- Resources/Prototypes/Research/disciplines.yml | 12 -- 7 files changed, 65 insertions(+), 205 deletions(-) delete mode 100644 Resources/Prototypes/Research/biochemical.yml diff --git a/Resources/Locale/en-US/research/technologies.ftl b/Resources/Locale/en-US/research/technologies.ftl index 411ce429ab7..37f0bb58824 100644 --- a/Resources/Locale/en-US/research/technologies.ftl +++ b/Resources/Locale/en-US/research/technologies.ftl @@ -1,6 +1,5 @@ research-discipline-none = None research-discipline-industrial = Industrial -research-discipline-biochemical = Biochemical research-discipline-arsenal = Arsenal research-discipline-experimental = Experimental research-discipline-civilian-services = Civilian Services @@ -21,18 +20,6 @@ research-technology-super-powercells = Super Powercells research-technology-bluespace-storage = Bluespace Storage research-technology-portable-fission = Portable Fission -research-technology-chemistry = Chemistry -research-technology-surgical-tools = Surgical Tools -research-technology-biochemical-stasis = Biochemical Stasis -research-technology-mechanized-treatment = Mechanized Treatment -research-technology-virology = Virology -research-technology-cryogenics = Cryogenics -research-technology-chemical-dispensary = Chemical Dispensary -research-technology-biofabrication = Biofabrication -research-technology-crew-monitoring = Crew Monitoring -research-technology-bluespace-chemistry = Bluespace Chemistry -research-technology-cloning = Cloning - research-technology-salvage-weapons = Salvage Weapons research-technology-draconic-munitions = Draconic Munitions research-technology-uranium-munitions = Uranium Munitions @@ -72,6 +59,8 @@ research-technology-food-service = Food Service research-technology-advanced-entertainment = Advanced Entertainment research-technology-audio-visual-communication = A/V Communication research-technology-faux-astro-tiles = Faux Astro-Tiles +research-technology-biochemical-stasis = Biochemical Stasis +research-technology-mechanized-treatment = Mechanized Treatment research-technology-robotic-cleanliness = Robotic Cleanliness research-technology-advanced-cleaning = Advanced Cleaning research-technology-meat-manipulation = Meat Manipulation @@ -79,3 +68,4 @@ research-technology-honk-mech = H.O.N.K. Mech research-technology-advanced-spray = Advanced Spray research-technology-bluespace-cargo-transport = Bluespace Cargo Transport research-technology-quantum-fiber-weaving = Quantum Fiber Weaving +research-technology-bluespace-chemistry = Bluespace Chemistry diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 4cedaa1cc6d..11a8e2237d8 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -254,6 +254,10 @@ - type: Lathe idleState: icon runningState: building + staticRecipes: + - LargeBeaker + - Dropper + - ClothingEyesGlassesChemical dynamicRecipes: - PowerDrill - MiningDrill @@ -269,11 +273,8 @@ - HoloprojectorField - Saw - Hemostat - - Beaker - - LargeBeaker - CryostasisBeaker - SyringeCryostasis - - Dropper - Syringe - Implanter - PillCanister @@ -312,7 +313,6 @@ - ClothingBackpackDuffelHolding - WelderExperimental - JawsOfLife - - ClothingEyesGlassesChemical - CoreSilver # Nyanotrasen - Silver Golem core - FauxTileAstroGrass - FauxTileAstroIce @@ -376,7 +376,10 @@ - MaterialReclaimerMachineCircuitboard - ElectrolysisUnitMachineCircuitboard - CentrifugeMachineCircuitboard + - ChemDispenserMachineCircuitboard + - ChemMasterMachineCircuitboard - CondenserMachineCircuitBoard + - HotplateMachineCircuitboard - UniformPrinterMachineCircuitboard - FloorGreenCircuit - FloorBlueCircuit @@ -389,8 +392,6 @@ - CryoPodMachineCircuitboard - VaccinatorMachineCircuitboard - DiagnoserMachineCircuitboard - - ChemMasterMachineCircuitboard - - ChemDispenserMachineCircuitboard - BiomassReclaimerMachineCircuitboard - BiofabricatorMachineCircuitboard - SurveillanceCameraRouterCircuitboard @@ -408,7 +409,6 @@ - AutolatheHyperConvectionMachineCircuitboard - ProtolatheHyperConvectionMachineCircuitboard - ReagentGrinderMachineCircuitboard - - HotplateMachineCircuitboard - MicrowaveMachineCircuitboard - ElectricGrillMachineCircuitboard - FatExtractorMachineCircuitboard @@ -848,9 +848,13 @@ - Defibrillator - HandheldHealthAnalyzer - ClothingHandsGlovesLatex + - ClothingHandsGlovesNitrile - ClothingMaskSterile - DiseaseSwab - Beaker + - LargeBeaker + - Dropper + - Jug - Syringe - Implanter - PillCanister @@ -867,23 +871,20 @@ - MedkitAdvanced - MedkitRadiation - MedkitCombat - dynamicRecipes: - - HandheldCrewMonitor - - ClothingHandsGlovesNitrile - - CryostasisBeaker - - LargeBeaker - - Dropper - Scalpel - Retractor - Cautery - Drill - Saw - Hemostat + - ClothingEyesGlassesChemical + dynamicRecipes: + - ChemicalPayload + - CryostasisBeaker - BluespaceBeaker - SyringeBluespace - ClothingEyesHudMedical # Nyano - ChemicalPayload # Nyano - - Jug - SyringeCryostasis - type: Machine board: MedicalTechFabCircuitboard diff --git a/Resources/Prototypes/Entities/Structures/Machines/research.yml b/Resources/Prototypes/Entities/Structures/Machines/research.yml index 66ea8e538ad..7b369f62cc9 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/research.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/research.yml @@ -15,7 +15,6 @@ - type: TechnologyDatabase supportedDisciplines: - Industrial - - Biochemical - Arsenal - Experimental - CivilianServices diff --git a/Resources/Prototypes/Research/arsenal.yml b/Resources/Prototypes/Research/arsenal.yml index 851bef6ccc8..8cbca4f7e10 100644 --- a/Resources/Prototypes/Research/arsenal.yml +++ b/Resources/Prototypes/Research/arsenal.yml @@ -50,6 +50,7 @@ - TimerTrigger - FlashPayload - ExplosivePayload + - ChemicalPayload - Igniter - type: technology @@ -209,4 +210,4 @@ - PowerCageHigh - ShuttleGunDusterCircuitboard technologyPrerequisites: - - BasicShuttleArmament \ No newline at end of file + - BasicShuttleArmament diff --git a/Resources/Prototypes/Research/biochemical.yml b/Resources/Prototypes/Research/biochemical.yml deleted file mode 100644 index 14ae362d5e8..00000000000 --- a/Resources/Prototypes/Research/biochemical.yml +++ /dev/null @@ -1,163 +0,0 @@ -# Tier 1 - -- type: technology - id: Chemistry - name: research-technology-chemistry - icon: - sprite: Objects/Specific/Chemistry/beaker_large.rsi - state: beakerlarge - discipline: Biochemical - tier: 1 - cost: 5000 - recipeUnlocks: - - LargeBeaker - - Dropper - - HotplateMachineCircuitboard - - ChemicalPayload - - ClothingEyesGlassesChemical - - Jug - -- type: technology - id: SurgicalTools - name: research-technology-surgical-tools - icon: - sprite: Objects/Specific/Medical/Surgery/saw.rsi - state: saw - discipline: Biochemical - tier: 1 - cost: 2500 #this is useless so heavy decrease - recipeUnlocks: - - Scalpel - - Retractor - - Cautery - - Drill - - Saw - - Hemostat - -- type: technology - id: BiochemicalStasis - name: research-technology-biochemical-stasis - icon: - sprite: Structures/Machines/stasis_bed.rsi - state: icon - discipline: Biochemical - tier: 1 - cost: 7500 - recipeUnlocks: - - CryostasisBeaker - - StasisBedMachineCircuitboard - - SyringeCryostasis - -- type: technology - id: MechanizedTreatment - name: research-technology-mechanized-treatment - icon: - sprite: Mobs/Silicon/chassis.rsi - state: medical - discipline: Biochemical - tier: 1 - cost: 7500 - recipeUnlocks: - - BorgModuleDiagnosis - - BorgModuleDefibrillator - -# doesn't do anything right now -# -#- type: technology -# id: Virology -# name: research-technology-virology -# icon: -# sprite: Structures/Machines/diagnoser.rsi -# state: icon -# discipline: Biochemical -# tier: 1 -# cost: 5000 -# recipeUnlocks: -# - VaccinatorMachineCircuitboard -# - DiagnoserMachineCircuitboard - -# Tier 2 - -- type: technology - id: Cryopod - name: research-technology-cryogenics - icon: - sprite: Structures/Machines/cryogenics.rsi - state: pod-on - discipline: Biochemical - tier: 2 - cost: 7500 - recipeUnlocks: - - CryoPodMachineCircuitboard - -- type: technology - id: Biofabrication - name: research-technology-biofabrication - icon: - sprite: Structures/Machines/biofabricator.rsi - state: icon - discipline: Biochemical - tier: 2 - cost: 10000 - recipeUnlocks: - - BiofabricatorMachineCircuitboard - - BiomassReclaimerMachineCircuitboard - -- type: technology - id: ChemicalDispensary - name: research-technology-chemical-dispensary - icon: - sprite: Structures/dispensers.rsi - state: industrial-working - discipline: Biochemical - tier: 2 - cost: 10000 - recipeUnlocks: - - ChemMasterMachineCircuitboard - - ChemDispenserMachineCircuitboard - - BorgModuleAdvancedTreatment - technologyPrerequisites: - - Chemistry - -- type: technology - id: CrewMonitoring - name: research-technology-crew-monitoring - icon: - sprite: Objects/Specific/Medical/handheldcrewmonitor.rsi - state: scanner - discipline: Biochemical - tier: 2 - cost: 10000 - recipeUnlocks: - - HandheldCrewMonitor - -# Tier 3 - -- type: technology - id: BluespaceChemistry - name: research-technology-bluespace-chemistry - icon: - sprite: Objects/Specific/Chemistry/beaker_bluespace.rsi - state: beakerbluespace - discipline: Biochemical - tier: 3 - cost: 10000 - recipeUnlocks: - - BluespaceBeaker - - SyringeBluespace - -# look into revisiting this later once medical isn't a hellhole -#- type: technology -# id: Cloning -# name: research-technology-cloning -# icon: -# sprite: Structures/Machines/cloning.rsi -# state: pod_0 -# discipline: Biochemical -# tier: 3 -# cost: 15000 -# recipeUnlocks: -# - CloningPodMachineCircuitboard -# - MedicalScannerMachineCircuitboard -# - CloningConsoleComputerCircuitboard -# - BiomassReclaimerMachineCircuitboard diff --git a/Resources/Prototypes/Research/civilianservices.yml b/Resources/Prototypes/Research/civilianservices.yml index 8607565d16d..13eccb316ca 100644 --- a/Resources/Prototypes/Research/civilianservices.yml +++ b/Resources/Prototypes/Research/civilianservices.yml @@ -108,9 +108,11 @@ state: display discipline: CivilianServices tier: 1 - cost: 5000 + cost: 7500 recipeUnlocks: - FatExtractorMachineCircuitboard + - BiofabricatorMachineCircuitboard + - BiomassReclaimerMachineCircuitboard # Tier 2 @@ -127,6 +129,35 @@ - FauxTileAstroGrass - FauxTileAstroIce +- type: technology + id: BiochemicalStasis + name: research-technology-biochemical-stasis + icon: + sprite: Structures/Machines/stasis_bed.rsi + state: icon + discipline: CivilianServices + tier: 2 + cost: 7500 + recipeUnlocks: + - StasisBedMachineCircuitboard + - CryoPodMachineCircuitboard + - CryostasisBeaker + - SyringeCryostasis + +- type: technology + id: MechanizedTreatment + name: research-technology-mechanized-treatment + icon: + sprite: Mobs/Silicon/chassis.rsi + state: medical + discipline: CivilianServices + tier: 2 + cost: 7500 + recipeUnlocks: + - BorgModuleAdvancedTreatment + - BorgModuleDiagnosis + - BorgModuleDefibrillator + - type: technology id: AdvancedCleaning name: research-technology-advanced-cleaning @@ -198,3 +229,16 @@ cost: 10000 recipeUnlocks: - ClothingShoesBootsSpeed + +- type: technology + id: BluespaceChemistry + name: research-technology-bluespace-chemistry + icon: + sprite: Objects/Specific/Chemistry/beaker_bluespace.rsi + state: beakerbluespace + discipline: CivilianServices + tier: 3 + cost: 10000 + recipeUnlocks: + - BluespaceBeaker + - SyringeBluespace diff --git a/Resources/Prototypes/Research/disciplines.yml b/Resources/Prototypes/Research/disciplines.yml index 7ce290d23cb..7a661da1a33 100644 --- a/Resources/Prototypes/Research/disciplines.yml +++ b/Resources/Prototypes/Research/disciplines.yml @@ -10,18 +10,6 @@ 2: 0.75 3: 0.75 -- type: techDiscipline - id: Biochemical - name: research-discipline-biochemical - color: "#449ae6" - icon: - sprite: Interface/Misc/research_disciplines.rsi - state: biochemical - tierPrerequisites: - 1: 0 - 2: 0.75 - 3: 0.75 - - type: techDiscipline id: Arsenal name: research-discipline-arsenal From f216f612294504f9e7a9fd1432c0d1f9e5e23f80 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 3 Feb 2024 18:14:36 +0000 Subject: [PATCH 209/266] Automatic changelog update (cherry picked from commit 914bab19e8f9d02f28be656d162a0bd102e1070a) --- Resources/Changelog/Changelog.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 7c310303a2f..b933f924e9d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: metalgearsloth - changes: - - message: Fix map boundaries not pushing you back. - type: Fix - id: 5383 - time: '2023-12-16T02:19:54.0000000+00:00' - author: Ubaser changes: - message: Crayons boxes now hold a white crayon. @@ -3871,3 +3865,11 @@ id: 5882 time: '2024-02-03T17:33:58.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24922 +- author: deltanedas + changes: + - message: Dissolved the biochem technology discipline into others and roundstart + availability. + type: Add + id: 5883 + time: '2024-02-03T18:13:30.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24871 From 070af36c577c88534db82449527a9d04cf21a966 Mon Sep 17 00:00:00 2001 From: Jezithyr Date: Sat, 3 Feb 2024 10:32:30 -0800 Subject: [PATCH 210/266] Emergency revert for pulling (#24923) Revert "Pulling rework (#20906)" This reverts commit 0d8254b2a2891f8d5623c9878bd0e567d0c7fe3c. (cherry picked from commit c15b0691ec452e543a3cc6894a28bb409dbc65f8) --- Content.Client/Alerts/ClientAlertsSystem.cs | 29 +- .../Physics/Controllers/MoverController.cs | 7 +- Content.Client/Pulling/PullingSystem.cs | 21 + .../ReplaySpectatorSystem.Blockers.cs | 2 +- .../Throwing/ThrownItemVisualizerSystem.cs | 2 +- .../Tests/Puller/PullerTest.cs | 4 +- Content.Server/Alert/Click/StopBeingPulled.cs | 8 +- Content.Server/Alert/Click/StopPulling.cs | 12 +- .../Electrocution/ElectrocutionSystem.cs | 7 +- Content.Server/Hands/Systems/HandsSystem.cs | 23 +- .../HTN/Preconditions/PulledPrecondition.cs | 5 +- .../Systems/StealConditionSystem.cs | 15 +- .../Physics/Controllers/PullController.cs | 207 ++++++++ Content.Server/Pulling/PullingSystem.cs | 48 ++ .../ArtifactInteractionTriggerSystem.cs | 4 +- .../Zombies/ZombieSystem.Transform.cs | 7 +- .../Administration/AdminFrozenSystem.cs | 15 +- .../Buckle/SharedBuckleSystem.Buckle.cs | 10 +- Content.Shared/Buckle/SharedBuckleSystem.cs | 3 +- .../EntitySystems/AnchorableSystem.cs | 15 +- Content.Shared/Cuffs/SharedCuffableSystem.cs | 14 +- Content.Shared/Follower/FollowerSystem.cs | 2 +- .../Friction/TileFrictionController.cs | 40 +- .../Interaction/SharedInteractionSystem.cs | 10 +- .../Pulling/Components/PullableComponent.cs | 39 -- .../Pulling/Components/PullerComponent.cs | 41 -- .../Pulling/Events/AttemptPullEvent.cs | 13 - .../Pulling/Events/AttemptStopPullingEvent.cs | 10 - .../Movement/Pulling/Events/PullMessage.cs | 13 - .../Pulling/Events/PullStartedMessage.cs | 9 - .../Pulling/Events/PullStoppedMessage.cs | 13 - .../Movement/Pulling/Systems/PullingSystem.cs | 455 ------------------ .../Movement/Systems/SharedMoverController.cs | 8 +- .../Pulling/Components/PullableComponent.cs | 57 +++ .../Components/SharedPullerComponent.cs | 23 + .../Pulling/Events/BeingPulledAttemptEvent.cs | 0 .../Pulling/Events/PullAttemptEvent.cs | 11 + Content.Shared/Pulling/Events/PullMessage.cs | 16 + .../Pulling/Events/PullStartedMessage.cs | 12 + .../Pulling/Events/PullStoppedMessage.cs | 11 + .../Pulling/Events/StartPullAttemptEvent.cs | 0 Content.Shared/Pulling/PullableMoveMessage.cs | 6 + .../Pulling/PullableStopMovingMessage.cs | 6 + .../Pulling/Systems/SharedPullableSystem.cs | 28 ++ .../Pulling/Systems/SharedPullerSystem.cs | 90 ++++ .../SharedPullingStateManagementSystem.cs | 196 ++++++++ .../Systems/SharedPullingSystem.Actions.cs | 239 +++++++++ .../Pulling/Systems/SharedPullingSystem.cs | 243 ++++++++++ .../Systems/DeployableBarrierSystem.cs | 10 +- .../Systems/SharedPortalSystem.cs | 16 +- Content.Shared/Throwing/ThrowingSystem.cs | 33 +- .../Throwing/ThrownItemComponent.cs | 6 - Content.Shared/Throwing/ThrownItemSystem.cs | 7 +- 53 files changed, 1358 insertions(+), 763 deletions(-) create mode 100644 Content.Client/Pulling/PullingSystem.cs create mode 100644 Content.Server/Physics/Controllers/PullController.cs create mode 100644 Content.Server/Pulling/PullingSystem.cs delete mode 100644 Content.Shared/Movement/Pulling/Components/PullableComponent.cs delete mode 100644 Content.Shared/Movement/Pulling/Components/PullerComponent.cs delete mode 100644 Content.Shared/Movement/Pulling/Events/AttemptPullEvent.cs delete mode 100644 Content.Shared/Movement/Pulling/Events/AttemptStopPullingEvent.cs delete mode 100644 Content.Shared/Movement/Pulling/Events/PullMessage.cs delete mode 100644 Content.Shared/Movement/Pulling/Events/PullStartedMessage.cs delete mode 100644 Content.Shared/Movement/Pulling/Events/PullStoppedMessage.cs delete mode 100644 Content.Shared/Movement/Pulling/Systems/PullingSystem.cs create mode 100644 Content.Shared/Pulling/Components/PullableComponent.cs create mode 100644 Content.Shared/Pulling/Components/SharedPullerComponent.cs rename Content.Shared/{Movement => }/Pulling/Events/BeingPulledAttemptEvent.cs (100%) create mode 100644 Content.Shared/Pulling/Events/PullAttemptEvent.cs create mode 100644 Content.Shared/Pulling/Events/PullMessage.cs create mode 100644 Content.Shared/Pulling/Events/PullStartedMessage.cs create mode 100644 Content.Shared/Pulling/Events/PullStoppedMessage.cs rename Content.Shared/{Movement => }/Pulling/Events/StartPullAttemptEvent.cs (100%) create mode 100644 Content.Shared/Pulling/PullableMoveMessage.cs create mode 100644 Content.Shared/Pulling/PullableStopMovingMessage.cs create mode 100644 Content.Shared/Pulling/Systems/SharedPullableSystem.cs create mode 100644 Content.Shared/Pulling/Systems/SharedPullerSystem.cs create mode 100644 Content.Shared/Pulling/Systems/SharedPullingStateManagementSystem.cs create mode 100644 Content.Shared/Pulling/Systems/SharedPullingSystem.Actions.cs create mode 100644 Content.Shared/Pulling/Systems/SharedPullingSystem.cs diff --git a/Content.Client/Alerts/ClientAlertsSystem.cs b/Content.Client/Alerts/ClientAlertsSystem.cs index d1ea1c32bc0..83327ad77b5 100644 --- a/Content.Client/Alerts/ClientAlertsSystem.cs +++ b/Content.Client/Alerts/ClientAlertsSystem.cs @@ -4,7 +4,6 @@ using Robust.Client.Player; using Robust.Shared.Player; using Robust.Shared.Prototypes; -using Robust.Shared.Timing; namespace Content.Client.Alerts; @@ -13,7 +12,6 @@ public sealed class ClientAlertsSystem : AlertsSystem { public AlertOrderPrototype? AlertOrder { get; set; } - [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; @@ -42,7 +40,7 @@ public IReadOnlyDictionary? ActiveAlerts { get { - var ent = _playerManager.LocalEntity; + var ent = _playerManager.LocalPlayer?.ControlledEntity; return ent is not null ? GetActiveAlerts(ent.Value) : null; @@ -51,28 +49,29 @@ public IReadOnlyDictionary? ActiveAlerts protected override void AfterShowAlert(Entity alerts) { - UpdateHud(alerts); - } + if (_playerManager.LocalPlayer?.ControlledEntity != alerts.Owner) + return; - protected override void AfterClearAlert(Entity alerts) - { - UpdateHud(alerts); + SyncAlerts?.Invoke(this, alerts.Comp.Alerts); } - private void ClientAlertsHandleState(Entity alerts, ref AfterAutoHandleStateEvent args) + protected override void AfterClearAlert(Entity alertsComponent) { - UpdateHud(alerts); + if (_playerManager.LocalPlayer?.ControlledEntity != alertsComponent.Owner) + return; + + SyncAlerts?.Invoke(this, alertsComponent.Comp.Alerts); } - private void UpdateHud(Entity entity) + private void ClientAlertsHandleState(EntityUid uid, AlertsComponent component, ref AfterAutoHandleStateEvent args) { - if (_playerManager.LocalEntity == entity.Owner) - SyncAlerts?.Invoke(this, entity.Comp.Alerts); + if (_playerManager.LocalPlayer?.ControlledEntity == uid) + SyncAlerts?.Invoke(this, component.Alerts); } private void OnPlayerAttached(EntityUid uid, AlertsComponent component, LocalPlayerAttachedEvent args) { - if (_playerManager.LocalEntity != uid) + if (_playerManager.LocalPlayer?.ControlledEntity != uid) return; SyncAlerts?.Invoke(this, component.Alerts); @@ -82,7 +81,7 @@ protected override void HandleComponentShutdown(EntityUid uid, AlertsComponent c { base.HandleComponentShutdown(uid, component, args); - if (_playerManager.LocalEntity != uid) + if (_playerManager.LocalPlayer?.ControlledEntity != uid) return; ClearAlerts?.Invoke(this, EventArgs.Empty); diff --git a/Content.Client/Physics/Controllers/MoverController.cs b/Content.Client/Physics/Controllers/MoverController.cs index 9e308c8e88c..763f7b01145 100644 --- a/Content.Client/Physics/Controllers/MoverController.cs +++ b/Content.Client/Physics/Controllers/MoverController.cs @@ -1,7 +1,6 @@ using Content.Shared.Movement.Components; -using Content.Shared.Movement.Pulling.Components; using Content.Shared.Movement.Systems; -using Robust.Client.GameObjects; +using Content.Shared.Pulling.Components; using Robust.Client.Physics; using Robust.Client.Player; using Robust.Shared.Physics.Components; @@ -25,7 +24,7 @@ public override void Initialize() SubscribeLocalEvent(OnUpdatePredicted); SubscribeLocalEvent(OnUpdateRelayTargetPredicted); - SubscribeLocalEvent(OnUpdatePullablePredicted); + SubscribeLocalEvent(OnUpdatePullablePredicted); } private void OnUpdatePredicted(EntityUid uid, InputMoverComponent component, ref UpdateIsPredictedEvent args) @@ -41,7 +40,7 @@ private void OnUpdateRelayTargetPredicted(EntityUid uid, MovementRelayTargetComp args.IsPredicted = true; } - private void OnUpdatePullablePredicted(EntityUid uid, PullableComponent component, ref UpdateIsPredictedEvent args) + private void OnUpdatePullablePredicted(EntityUid uid, SharedPullableComponent component, ref UpdateIsPredictedEvent args) { // Enable prediction if an entity is being pulled by the player. // Disable prediction if an entity is being pulled by some non-player entity. diff --git a/Content.Client/Pulling/PullingSystem.cs b/Content.Client/Pulling/PullingSystem.cs new file mode 100644 index 00000000000..556dadd00da --- /dev/null +++ b/Content.Client/Pulling/PullingSystem.cs @@ -0,0 +1,21 @@ +using Content.Shared.Pulling; +using Content.Shared.Pulling.Components; +using JetBrains.Annotations; +using Robust.Client.Physics; + +namespace Content.Client.Pulling +{ + [UsedImplicitly] + public sealed class PullingSystem : SharedPullingSystem + { + public override void Initialize() + { + base.Initialize(); + + UpdatesAfter.Add(typeof(PhysicsSystem)); + + SubscribeLocalEvent(OnPullableMove); + SubscribeLocalEvent(OnPullableStopMove); + } + } +} diff --git a/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Blockers.cs b/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Blockers.cs index 2fa862f3df7..86d113defb1 100644 --- a/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Blockers.cs +++ b/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Blockers.cs @@ -3,7 +3,7 @@ using Content.Shared.Inventory.Events; using Content.Shared.Item; using Content.Shared.Movement.Events; -using Content.Shared.Movement.Pulling.Events; +using Content.Shared.Physics.Pull; using Content.Shared.Throwing; namespace Content.Client.Replay.Spectator; diff --git a/Content.Client/Throwing/ThrownItemVisualizerSystem.cs b/Content.Client/Throwing/ThrownItemVisualizerSystem.cs index b25b4fbb7de..bbd36731104 100644 --- a/Content.Client/Throwing/ThrownItemVisualizerSystem.cs +++ b/Content.Client/Throwing/ThrownItemVisualizerSystem.cs @@ -24,7 +24,7 @@ public override void Initialize() private void OnAutoHandleState(EntityUid uid, ThrownItemComponent component, ref AfterAutoHandleStateEvent args) { - if (!TryComp(uid, out var sprite) || !component.Animate) + if (!TryComp(uid, out var sprite)) return; var animationPlayer = EnsureComp(uid); diff --git a/Content.IntegrationTests/Tests/Puller/PullerTest.cs b/Content.IntegrationTests/Tests/Puller/PullerTest.cs index 87d174f7272..ba91f54ff77 100644 --- a/Content.IntegrationTests/Tests/Puller/PullerTest.cs +++ b/Content.IntegrationTests/Tests/Puller/PullerTest.cs @@ -1,6 +1,6 @@ using Content.Shared.Hands.Components; -using Content.Shared.Movement.Pulling.Components; using Content.Shared.Prototypes; +using Content.Shared.Pulling.Components; using Robust.Shared.GameObjects; using Robust.Shared.Prototypes; @@ -29,7 +29,7 @@ await server.WaitAssertion(() => { foreach (var proto in protoManager.EnumeratePrototypes()) { - if (!proto.TryGetComponent(out PullerComponent? puller)) + if (!proto.TryGetComponent(out SharedPullerComponent? puller)) continue; if (!puller.NeedsHands) diff --git a/Content.Server/Alert/Click/StopBeingPulled.cs b/Content.Server/Alert/Click/StopBeingPulled.cs index b02da38ecfa..2cf076fbeed 100644 --- a/Content.Server/Alert/Click/StopBeingPulled.cs +++ b/Content.Server/Alert/Click/StopBeingPulled.cs @@ -1,7 +1,7 @@ using Content.Shared.ActionBlocker; using Content.Shared.Alert; -using Content.Shared.Movement.Pulling.Components; -using Content.Shared.Movement.Pulling.Systems; +using Content.Shared.Pulling.Components; +using Content.Shared.Pulling; using JetBrains.Annotations; namespace Content.Server.Alert.Click @@ -20,9 +20,9 @@ public void AlertClicked(EntityUid player) if (!entityManager.System().CanInteract(player, null)) return; - if (entityManager.TryGetComponent(player, out PullableComponent? playerPullable)) + if (entityManager.TryGetComponent(player, out SharedPullableComponent? playerPullable)) { - entityManager.System().TryStopPull(player, playerPullable, user: player); + entityManager.System().TryStopPull(playerPullable); } } } diff --git a/Content.Server/Alert/Click/StopPulling.cs b/Content.Server/Alert/Click/StopPulling.cs index 76f9569429f..00a41495985 100644 --- a/Content.Server/Alert/Click/StopPulling.cs +++ b/Content.Server/Alert/Click/StopPulling.cs @@ -1,6 +1,6 @@ using Content.Shared.Alert; -using Content.Shared.Movement.Pulling.Components; -using Content.Shared.Movement.Pulling.Systems; +using Content.Shared.Pulling; +using Content.Shared.Pulling.Components; using JetBrains.Annotations; namespace Content.Server.Alert.Click @@ -15,12 +15,12 @@ public sealed partial class StopPulling : IAlertClick public void AlertClicked(EntityUid player) { var entManager = IoCManager.Resolve(); - var ps = entManager.System(); - if (entManager.TryGetComponent(player, out PullerComponent? puller) && - entManager.TryGetComponent(puller.Pulling, out PullableComponent? pullableComp)) + var ps = entManager.System(); + var playerTarget = ps.GetPulled(player); + if (playerTarget != default && entManager.TryGetComponent(playerTarget, out SharedPullableComponent? playerPullable)) { - ps.TryStopPull(puller.Pulling.Value, pullableComp, user: player); + ps.TryStopPull(playerPullable); } } } diff --git a/Content.Server/Electrocution/ElectrocutionSystem.cs b/Content.Server/Electrocution/ElectrocutionSystem.cs index 591fd825b48..aac500f34f8 100644 --- a/Content.Server/Electrocution/ElectrocutionSystem.cs +++ b/Content.Server/Electrocution/ElectrocutionSystem.cs @@ -19,6 +19,7 @@ using Content.Shared.Maps; using Content.Shared.Mobs; using Content.Shared.Popups; +using Content.Shared.Pulling.Components; using Content.Shared.Speech.EntitySystems; using Content.Shared.StatusEffect; using Content.Shared.Stunnable; @@ -31,8 +32,6 @@ using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Random; -using PullableComponent = Content.Shared.Movement.Pulling.Components.PullableComponent; -using PullerComponent = Content.Shared.Movement.Pulling.Components.PullerComponent; namespace Content.Server.Electrocution; @@ -466,14 +465,14 @@ private void GetChainedElectrocutionTargetsRecurse( all.Add((entity, depth)); visited.Add(entity); - if (TryComp(entity, out var pullable) && + if (TryComp(entity, out var pullable) && pullable.Puller is { Valid: true } pullerId && !visited.Contains(pullerId)) { GetChainedElectrocutionTargetsRecurse(pullerId, depth + 1, visited, all); } - if (TryComp(entity, out var puller) && + if (TryComp(entity, out var puller) && puller.Pulling is { Valid: true } pullingId && !visited.Contains(pullingId)) { diff --git a/Content.Server/Hands/Systems/HandsSystem.cs b/Content.Server/Hands/Systems/HandsSystem.cs index 7c48ee089ee..9d664d0f9a0 100644 --- a/Content.Server/Hands/Systems/HandsSystem.cs +++ b/Content.Server/Hands/Systems/HandsSystem.cs @@ -1,5 +1,6 @@ using System.Numerics; using Content.Server.Inventory; +using Content.Server.Pulling; using Content.Server.Stack; using Content.Server.Stunnable; using Content.Shared.ActionBlocker; @@ -10,9 +11,8 @@ using Content.Shared.Hands.EntitySystems; using Content.Shared.Input; using Content.Shared.Inventory.VirtualItem; -using Content.Shared.Movement.Pulling.Components; -using Content.Shared.Movement.Pulling.Events; -using Content.Shared.Movement.Pulling.Systems; +using Content.Shared.Physics.Pull; +using Content.Shared.Pulling.Components; using Content.Shared.Stacks; using Content.Shared.Throwing; using Robust.Shared.GameStates; @@ -88,8 +88,9 @@ private void OnDisarmed(EntityUid uid, HandsComponent component, DisarmedEvent a return; // Break any pulls - if (TryComp(uid, out PullerComponent? puller) && TryComp(puller.Pulling, out PullableComponent? pullable)) - _pullingSystem.TryStopPull(puller.Pulling.Value, pullable); + if (TryComp(uid, out SharedPullerComponent? puller) && puller.Pulling is EntityUid pulled && + TryComp(pulled, out SharedPullableComponent? pullable)) + _pullingSystem.TryStopPull(pullable); if (!_handsSystem.TryDrop(uid, component.ActiveHand!, null, checkActionBlocker: false)) return; @@ -127,13 +128,13 @@ private void HandleBodyPartRemoved(EntityUid uid, HandsComponent component, ref private void HandlePullStarted(EntityUid uid, HandsComponent component, PullStartedMessage args) { - if (args.PullerUid != uid) + if (args.Puller.Owner != uid) return; - if (TryComp(args.PullerUid, out var pullerComp) && !pullerComp.NeedsHands) + if (TryComp(args.Puller.Owner, out var pullerComp) && !pullerComp.NeedsHands) return; - if (!_virtualItemSystem.TrySpawnVirtualItemInHand(args.PulledUid, uid)) + if (!_virtualItemSystem.TrySpawnVirtualItemInHand(args.Pulled.Owner, uid)) { DebugTools.Assert("Unable to find available hand when starting pulling??"); } @@ -141,7 +142,7 @@ private void HandlePullStarted(EntityUid uid, HandsComponent component, PullStar private void HandlePullStopped(EntityUid uid, HandsComponent component, PullStoppedMessage args) { - if (args.PullerUid != uid) + if (args.Puller.Owner != uid) return; // Try find hand that is doing this pull. @@ -150,10 +151,8 @@ private void HandlePullStopped(EntityUid uid, HandsComponent component, PullStop { if (hand.HeldEntity == null || !TryComp(hand.HeldEntity, out VirtualItemComponent? virtualItem) - || virtualItem.BlockingEntity != args.PulledUid) - { + || virtualItem.BlockingEntity != args.Pulled.Owner) continue; - } QueueDel(hand.HeldEntity.Value); break; diff --git a/Content.Server/NPC/HTN/Preconditions/PulledPrecondition.cs b/Content.Server/NPC/HTN/Preconditions/PulledPrecondition.cs index d276be72187..64a72b13cfa 100644 --- a/Content.Server/NPC/HTN/Preconditions/PulledPrecondition.cs +++ b/Content.Server/NPC/HTN/Preconditions/PulledPrecondition.cs @@ -1,5 +1,4 @@ using Content.Shared.Pulling; -using PullingSystem = Content.Shared.Movement.Pulling.Systems.PullingSystem; namespace Content.Server.NPC.HTN.Preconditions; @@ -8,14 +7,14 @@ namespace Content.Server.NPC.HTN.Preconditions; /// public sealed partial class PulledPrecondition : HTNPrecondition { - private PullingSystem _pulling = default!; + private SharedPullingSystem _pulling = default!; [ViewVariables(VVAccess.ReadWrite)] [DataField("isPulled")] public bool IsPulled = true; public override void Initialize(IEntitySystemManager sysManager) { base.Initialize(sysManager); - _pulling = sysManager.GetEntitySystem(); + _pulling = sysManager.GetEntitySystem(); } public override bool IsMet(NPCBlackboard blackboard) diff --git a/Content.Server/Objectives/Systems/StealConditionSystem.cs b/Content.Server/Objectives/Systems/StealConditionSystem.cs index 0fe6f0947c8..02d4ee010b5 100644 --- a/Content.Server/Objectives/Systems/StealConditionSystem.cs +++ b/Content.Server/Objectives/Systems/StealConditionSystem.cs @@ -6,10 +6,11 @@ using Robust.Shared.Containers; using Robust.Shared.Prototypes; using Robust.Shared.Random; +using Content.Shared.Pulling.Components; +using Content.Shared.Objectives; using Content.Shared.Mind.Components; using Content.Shared.Mobs.Systems; using Content.Shared.Mobs.Components; -using Content.Shared.Movement.Pulling.Components; namespace Content.Server.Objectives.Systems; @@ -99,19 +100,19 @@ private float GetProgress(MindComponent mind, StealConditionComponent condition) var count = 0; //check pulling object - if (TryComp(mind.OwnedEntity, out var pull)) //TO DO: to make the code prettier? don't like the repetition + if (TryComp(mind.OwnedEntity, out var pull)) //TO DO: to make the code prettier? don't like the repetition { - var pulledEntity = pull.Pulling; - if (pulledEntity != null) + var pullid = pull.Pulling; + if (pullid != null) { // check if this is the item - if (CheckStealTarget(pulledEntity.Value, condition)) count++; + if (CheckStealTarget(pullid.Value, condition)) count++; //we don't check the inventories of sentient entity - if (!HasComp(pulledEntity)) + if (!TryComp(pullid, out var pullMind)) { // if it is a container check its contents - if (_containerQuery.TryGetComponent(pulledEntity, out var containerManager)) + if (_containerQuery.TryGetComponent(pullid, out var containerManager)) stack.Push(containerManager); } } diff --git a/Content.Server/Physics/Controllers/PullController.cs b/Content.Server/Physics/Controllers/PullController.cs new file mode 100644 index 00000000000..8f58f807aae --- /dev/null +++ b/Content.Server/Physics/Controllers/PullController.cs @@ -0,0 +1,207 @@ +using System.Numerics; +using Content.Shared.ActionBlocker; +using Content.Shared.Gravity; +using Content.Shared.Pulling; +using Content.Shared.Pulling.Components; +using Content.Shared.Rotatable; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Components; +using Robust.Shared.Physics.Controllers; + +namespace Content.Server.Physics.Controllers +{ + public sealed class PullController : VirtualController + { + // Parameterization for pulling: + // Speeds. Note that the speed is mass-independent (multiplied by mass). + // Instead, tuning to mass is done via the mass values below. + // Note that setting the speed too high results in overshoots (stabilized by drag, but bad) + private const float AccelModifierHigh = 15f; + private const float AccelModifierLow = 60.0f; + // High/low-mass marks. Curve is constant-lerp-constant, i.e. if you can even pull an item, + // you'll always get at least AccelModifierLow and no more than AccelModifierHigh. + private const float AccelModifierHighMass = 70.0f; // roundstart saltern emergency closet + private const float AccelModifierLowMass = 5.0f; // roundstart saltern emergency crowbar + // Used to control settling (turns off pulling). + private const float MaximumSettleVelocity = 0.1f; + private const float MaximumSettleDistance = 0.1f; + // Settle shutdown control. + // Mustn't be too massive, as that causes severe mispredicts *and can prevent it ever resolving*. + // Exists to bleed off "I pulled my crowbar" overshoots. + // Minimum velocity for shutdown to be necessary. This prevents stuff getting stuck b/c too much shutdown. + private const float SettleMinimumShutdownVelocity = 0.25f; + // Distance in which settle shutdown multiplier is at 0. It then scales upwards linearly with closer distances. + private const float SettleShutdownDistance = 1.0f; + // Velocity change of -LinearVelocity * frameTime * this + private const float SettleShutdownMultiplier = 20.0f; + + // How much you must move for the puller movement check to actually hit. + private const float MinimumMovementDistance = 0.005f; + + [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; + [Dependency] private readonly SharedPullingSystem _pullableSystem = default!; + [Dependency] private readonly SharedGravitySystem _gravity = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + + // TODO: Move this stuff to pullingsystem + /// + /// If distance between puller and pulled entity lower that this threshold, + /// pulled entity will not change its rotation. + /// Helps with small distance jittering + /// + private const float ThresholdRotDistance = 1; + + /// + /// If difference between puller and pulled angle lower that this threshold, + /// pulled entity will not change its rotation. + /// Helps with diagonal movement jittering + /// As of further adjustments, should divide cleanly into 90 degrees + /// + private const float ThresholdRotAngle = 22.5f; + + public override void Initialize() + { + UpdatesAfter.Add(typeof(MoverController)); + SubscribeLocalEvent(OnPullerMove); + + base.Initialize(); + } + + private void OnPullerMove(EntityUid uid, SharedPullerComponent component, ref MoveEvent args) + { + if (component.Pulling is not { } pullable || !TryComp(pullable, out var pullableComponent)) + return; + + UpdatePulledRotation(uid, pullable); + + if (args.NewPosition.EntityId == args.OldPosition.EntityId && + (args.NewPosition.Position - args.OldPosition.Position).LengthSquared() < MinimumMovementDistance * MinimumMovementDistance) + return; + + if (TryComp(pullable, out var physics)) + PhysicsSystem.WakeBody(pullable, body: physics); + + _pullableSystem.StopMoveTo(pullableComponent); + } + + private void UpdatePulledRotation(EntityUid puller, EntityUid pulled) + { + // TODO: update once ComponentReference works with directed event bus. + if (!TryComp(pulled, out RotatableComponent? rotatable)) + return; + + if (!rotatable.RotateWhilePulling) + return; + + var xforms = GetEntityQuery(); + var pulledXform = xforms.GetComponent(pulled); + var pullerXform = xforms.GetComponent(puller); + + var pullerData = TransformSystem.GetWorldPositionRotation(pullerXform, xforms); + var pulledData = TransformSystem.GetWorldPositionRotation(pulledXform, xforms); + + var dir = pullerData.WorldPosition - pulledData.WorldPosition; + if (dir.LengthSquared() > ThresholdRotDistance * ThresholdRotDistance) + { + var oldAngle = pulledData.WorldRotation; + var newAngle = Angle.FromWorldVec(dir); + + var diff = newAngle - oldAngle; + if (Math.Abs(diff.Degrees) > ThresholdRotAngle / 2f) + { + // Ok, so this bit is difficult because ideally it would look like it's snapping to sane angles. + // Otherwise PIANO DOOR STUCK! happens. + // But it also needs to work with station rotation / align to the local parent. + // So... + var baseRotation = pulledData.WorldRotation - pulledXform.LocalRotation; + var localRotation = newAngle - baseRotation; + var localRotationSnapped = Angle.FromDegrees(Math.Floor((localRotation.Degrees / ThresholdRotAngle) + 0.5f) * ThresholdRotAngle); + TransformSystem.SetLocalRotation(pulledXform, localRotationSnapped); + } + } + } + + public override void UpdateBeforeSolve(bool prediction, float frameTime) + { + base.UpdateBeforeSolve(prediction, frameTime); + + foreach (var pullable in _pullableSystem.Moving) + { + // There's a 1-frame delay between stopping moving something and it leaving the Moving set. + // This can include if leaving the Moving set due to not being pulled anymore, + // or due to being deleted. + + if (pullable.Deleted) + continue; + + if (pullable.MovingTo == null) + continue; + + if (pullable.Puller is not {Valid: true} puller) + continue; + + var pullableEnt = pullable.Owner; + var pullableXform = Transform(pullableEnt); + var pullerXform = Transform(puller); + + // Now that's over with... + + var pullerPosition = pullerXform.MapPosition; + var movingTo = pullable.MovingTo.Value.ToMap(EntityManager, _transform); + if (movingTo.MapId != pullerPosition.MapId) + { + _pullableSystem.StopMoveTo(pullable); + continue; + } + + if (!TryComp(pullableEnt, out var physics) || + physics.BodyType == BodyType.Static || + movingTo.MapId != pullableXform.MapID) + { + _pullableSystem.StopMoveTo(pullable); + continue; + } + + var movingPosition = movingTo.Position; + var ownerPosition = pullableXform.MapPosition.Position; + + var diff = movingPosition - ownerPosition; + var diffLength = diff.Length(); + + if (diffLength < MaximumSettleDistance && physics.LinearVelocity.Length() < MaximumSettleVelocity) + { + PhysicsSystem.SetLinearVelocity(pullableEnt, Vector2.Zero, body: physics); + _pullableSystem.StopMoveTo(pullable); + continue; + } + + var impulseModifierLerp = Math.Min(1.0f, Math.Max(0.0f, (physics.Mass - AccelModifierLowMass) / (AccelModifierHighMass - AccelModifierLowMass))); + var impulseModifier = MathHelper.Lerp(AccelModifierLow, AccelModifierHigh, impulseModifierLerp); + var multiplier = diffLength < 1 ? impulseModifier * diffLength : impulseModifier; + // Note the implication that the real rules of physics don't apply to pulling control. + var accel = diff.Normalized() * multiplier; + // Now for the part where velocity gets shutdown... + if (diffLength < SettleShutdownDistance && physics.LinearVelocity.Length() >= SettleMinimumShutdownVelocity) + { + // Shutdown velocity increases as we get closer to centre + var scaling = (SettleShutdownDistance - diffLength) / SettleShutdownDistance; + accel -= physics.LinearVelocity * SettleShutdownMultiplier * scaling; + } + + PhysicsSystem.WakeBody(pullableEnt, body: physics); + + var impulse = accel * physics.Mass * frameTime; + PhysicsSystem.ApplyLinearImpulse(pullableEnt, impulse, body: physics); + + // if the puller is weightless or can't move, then we apply the inverse impulse (Newton's third law). + // doing it under gravity produces an unsatisfying wiggling when pulling. + // If player can't move, assume they are on a chair and we need to prevent pull-moving. + if ((_gravity.IsWeightless(puller) && pullerXform.GridUid == null) || !_actionBlockerSystem.CanMove(puller)) + { + PhysicsSystem.WakeBody(puller); + PhysicsSystem.ApplyLinearImpulse(puller, -impulse); + } + } + } + } +} diff --git a/Content.Server/Pulling/PullingSystem.cs b/Content.Server/Pulling/PullingSystem.cs new file mode 100644 index 00000000000..69bb7c93704 --- /dev/null +++ b/Content.Server/Pulling/PullingSystem.cs @@ -0,0 +1,48 @@ +using Content.Shared.Input; +using Content.Shared.Pulling; +using Content.Shared.Pulling.Components; +using JetBrains.Annotations; +using Robust.Server.GameObjects; +using Robust.Shared.Input.Binding; +using Robust.Shared.Player; + +namespace Content.Server.Pulling +{ + [UsedImplicitly] + public sealed class PullingSystem : SharedPullingSystem + { + public override void Initialize() + { + base.Initialize(); + + UpdatesAfter.Add(typeof(PhysicsSystem)); + + SubscribeLocalEvent(OnPullableMove); + SubscribeLocalEvent(OnPullableStopMove); + + CommandBinds.Builder + .Bind(ContentKeyFunctions.ReleasePulledObject, InputCmdHandler.FromDelegate(HandleReleasePulledObject)) + .Register(); + } + + private void HandleReleasePulledObject(ICommonSession? session) + { + if (session?.AttachedEntity is not {Valid: true} player) + { + return; + } + + if (!TryGetPulled(player, out var pulled)) + { + return; + } + + if (!EntityManager.TryGetComponent(pulled.Value, out SharedPullableComponent? pullable)) + { + return; + } + + TryStopPull(pullable); + } + } +} diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactInteractionTriggerSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactInteractionTriggerSystem.cs index 9976d56da0b..239b6741608 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactInteractionTriggerSystem.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactInteractionTriggerSystem.cs @@ -1,6 +1,6 @@ using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; using Content.Shared.Interaction; -using Content.Shared.Movement.Pulling.Events; +using Content.Shared.Physics.Pull; using Content.Shared.Weapons.Melee.Events; namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Systems; @@ -22,7 +22,7 @@ private void OnPull(EntityUid uid, ArtifactInteractionTriggerComponent component if (!component.PullActivation) return; - _artifactSystem.TryActivateArtifact(uid, args.PullerUid); + _artifactSystem.TryActivateArtifact(uid, args.Puller.Owner); } private void OnAttack(EntityUid uid, ArtifactInteractionTriggerComponent component, AttackedEvent args) diff --git a/Content.Server/Zombies/ZombieSystem.Transform.cs b/Content.Server/Zombies/ZombieSystem.Transform.cs index 09592c391f3..1b4f2f1c5b2 100644 --- a/Content.Server/Zombies/ZombieSystem.Transform.cs +++ b/Content.Server/Zombies/ZombieSystem.Transform.cs @@ -26,12 +26,12 @@ using Content.Shared.Mobs; using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; -using Content.Shared.Movement.Pulling.Components; using Content.Shared.Movement.Systems; using Content.Shared.Nutrition.AnimalHusbandry; using Content.Shared.Nutrition.Components; using Content.Shared.Popups; using Content.Shared.Roles; +using Content.Shared.Pulling.Components; using Content.Shared.Weapons.Melee; using Content.Shared.Zombies; using Content.Shared.Prying.Components; @@ -59,6 +59,7 @@ public sealed partial class ZombieSystem [Dependency] private readonly IChatManager _chatMan = default!; [Dependency] private readonly MindSystem _mind = default!; [Dependency] private readonly SharedRoleSystem _roles = default!; + [Dependency] private readonly MobThresholdSystem _mobThreshold = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly ActionsSystem _actions = default!; // DeltaV - No psionic zombies @@ -278,9 +279,7 @@ public void ZombifyEntity(EntityUid target, MobStateComponent? mobState = null) RemComp(target, handsComp); } - // Sloth: What the fuck? - // How long until compregistry lmao. - RemComp(target); + RemComp(target); // No longer waiting to become a zombie: // Requires deferral because this is (probably) the event which called ZombifyEntity in the first place. diff --git a/Content.Shared/Administration/AdminFrozenSystem.cs b/Content.Shared/Administration/AdminFrozenSystem.cs index 4ec9600b0bd..14438cc5912 100644 --- a/Content.Shared/Administration/AdminFrozenSystem.cs +++ b/Content.Shared/Administration/AdminFrozenSystem.cs @@ -1,10 +1,13 @@ using Content.Shared.ActionBlocker; using Content.Shared.Interaction.Events; using Content.Shared.Item; +using Content.Shared.Movement; using Content.Shared.Movement.Events; -using Content.Shared.Movement.Pulling.Components; -using Content.Shared.Movement.Pulling.Events; -using Content.Shared.Movement.Pulling.Systems; +using Content.Shared.Physics.Pull; +using Content.Shared.Pulling; +using Content.Shared.Pulling.Components; +using Content.Shared.Pulling.Events; +using Content.Shared.Stunnable; using Content.Shared.Throwing; namespace Content.Shared.Administration; @@ -12,7 +15,7 @@ namespace Content.Shared.Administration; public sealed class AdminFrozenSystem : EntitySystem { [Dependency] private readonly ActionBlockerSystem _blocker = default!; - [Dependency] private readonly PullingSystem _pulling = default!; + [Dependency] private readonly SharedPullingSystem _pulling = default!; public override void Initialize() { @@ -42,9 +45,9 @@ private void OnPullAttempt(EntityUid uid, AdminFrozenComponent component, PullAt private void OnStartup(EntityUid uid, AdminFrozenComponent component, ComponentStartup args) { - if (TryComp(uid, out var pullable)) + if (TryComp(uid, out var pullable)) { - _pulling.TryStopPull(uid, pullable); + _pulling.TryStopPull(pullable); } UpdateCanMove(uid, component, args); diff --git a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs index 7c85c5a6311..731b2892aa8 100644 --- a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs +++ b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs @@ -11,6 +11,7 @@ using Content.Shared.Mobs.Components; using Content.Shared.Movement.Events; using Content.Shared.Popups; +using Content.Shared.Pulling.Components; using Content.Shared.Standing; using Content.Shared.Storage.Components; using Content.Shared.Stunnable; @@ -19,7 +20,6 @@ using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Events; using Robust.Shared.Utility; -using PullableComponent = Content.Shared.Movement.Pulling.Components.PullableComponent; namespace Content.Shared.Buckle; @@ -356,11 +356,11 @@ public bool TryBuckle(EntityUid buckleUid, EntityUid userUid, EntityUid strapUid RaiseLocalEvent(ev.BuckledEntity, ref ev); RaiseLocalEvent(ev.StrapEntity, ref ev); - if (TryComp(buckleUid, out var ownerPullable)) + if (TryComp(buckleUid, out var ownerPullable)) { if (ownerPullable.Puller != null) { - _pulling.TryStopPull(buckleUid, ownerPullable); + _pulling.TryStopPull(ownerPullable); } } @@ -369,12 +369,12 @@ public bool TryBuckle(EntityUid buckleUid, EntityUid userUid, EntityUid strapUid _physics.ResetDynamics(physics); } - if (!buckleComp.PullStrap && TryComp(strapUid, out var toPullable)) + if (!buckleComp.PullStrap && TryComp(strapUid, out var toPullable)) { if (toPullable.Puller == buckleUid) { // can't pull it and buckle to it at the same time - _pulling.TryStopPull(strapUid, toPullable); + _pulling.TryStopPull(toPullable); } } diff --git a/Content.Shared/Buckle/SharedBuckleSystem.cs b/Content.Shared/Buckle/SharedBuckleSystem.cs index 67218657e52..8f683356637 100644 --- a/Content.Shared/Buckle/SharedBuckleSystem.cs +++ b/Content.Shared/Buckle/SharedBuckleSystem.cs @@ -15,7 +15,6 @@ using Robust.Shared.Physics.Systems; using Robust.Shared.Player; using Robust.Shared.Timing; -using PullingSystem = Content.Shared.Movement.Pulling.Systems.PullingSystem; namespace Content.Shared.Buckle; @@ -36,7 +35,7 @@ public abstract partial class SharedBuckleSystem : EntitySystem [Dependency] private readonly SharedInteractionSystem _interaction = default!; [Dependency] private readonly SharedJointSystem _joints = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; - [Dependency] private readonly PullingSystem _pulling = default!; + [Dependency] private readonly SharedPullingSystem _pulling = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly StandingStateSystem _standing = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; diff --git a/Content.Shared/Construction/EntitySystems/AnchorableSystem.cs b/Content.Shared/Construction/EntitySystems/AnchorableSystem.cs index cc21507461f..b40c0495622 100644 --- a/Content.Shared/Construction/EntitySystems/AnchorableSystem.cs +++ b/Content.Shared/Construction/EntitySystems/AnchorableSystem.cs @@ -6,15 +6,16 @@ using Content.Shared.Database; using Content.Shared.DoAfter; using Content.Shared.Interaction; -using Content.Shared.Movement.Pulling.Components; -using Content.Shared.Movement.Pulling.Systems; using Content.Shared.Popups; +using Content.Shared.Pulling; +using Content.Shared.Pulling.Components; using Content.Shared.Tools; using Content.Shared.Tools.Components; using Robust.Shared.Map; using Robust.Shared.Map.Components; using Robust.Shared.Physics.Components; using Content.Shared.Tag; +using Robust.Shared.Player; using Robust.Shared.Serialization; using Robust.Shared.Utility; using SharedToolSystem = Content.Shared.Tools.Systems.SharedToolSystem; @@ -26,7 +27,7 @@ public sealed partial class AnchorableSystem : EntitySystem [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; - [Dependency] private readonly PullingSystem _pulling = default!; + [Dependency] private readonly SharedPullingSystem _pulling = default!; [Dependency] private readonly SharedToolSystem _tool = default!; [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly TagSystem _tagSystem = default!; @@ -128,9 +129,9 @@ private void OnAnchorComplete(EntityUid uid, AnchorableComponent component, TryA var rot = xform.LocalRotation; xform.LocalRotation = Math.Round(rot / (Math.PI / 2)) * (Math.PI / 2); - if (TryComp(uid, out var pullable) && pullable.Puller != null) + if (TryComp(uid, out var pullable) && pullable.Puller != null) { - _pulling.TryStopPull(uid, pullable); + _pulling.TryStopPull(pullable); } // TODO: Anchoring snaps rn anyway! @@ -171,7 +172,7 @@ private void OnAnchorComplete(EntityUid uid, AnchorableComponent component, TryA public void TryToggleAnchor(EntityUid uid, EntityUid userUid, EntityUid usingUid, AnchorableComponent? anchorable = null, TransformComponent? transform = null, - PullableComponent? pullable = null, + SharedPullableComponent? pullable = null, ToolComponent? usingTool = null) { if (!Resolve(uid, ref transform)) @@ -200,7 +201,7 @@ public void TryToggleAnchor(EntityUid uid, EntityUid userUid, EntityUid usingUid private void TryAnchor(EntityUid uid, EntityUid userUid, EntityUid usingUid, AnchorableComponent? anchorable = null, TransformComponent? transform = null, - PullableComponent? pullable = null, + SharedPullableComponent? pullable = null, ToolComponent? usingTool = null) { if (!Resolve(uid, ref anchorable, ref transform)) diff --git a/Content.Shared/Cuffs/SharedCuffableSystem.cs b/Content.Shared/Cuffs/SharedCuffableSystem.cs index 7118b8e5cbc..99657c87aab 100644 --- a/Content.Shared/Cuffs/SharedCuffableSystem.cs +++ b/Content.Shared/Cuffs/SharedCuffableSystem.cs @@ -22,8 +22,9 @@ using Content.Shared.Item; using Content.Shared.Mobs.Systems; using Content.Shared.Movement.Events; -using Content.Shared.Movement.Pulling.Events; +using Content.Shared.Physics.Pull; using Content.Shared.Popups; +using Content.Shared.Pulling.Components; using Content.Shared.Pulling.Events; using Content.Shared.Rejuvenate; using Content.Shared.Stunnable; @@ -35,7 +36,6 @@ using Robust.Shared.Network; using Robust.Shared.Player; using Robust.Shared.Serialization; -using PullableComponent = Content.Shared.Movement.Pulling.Components.PullableComponent; namespace Content.Shared.Cuffs { @@ -70,7 +70,7 @@ public override void Initialize() SubscribeLocalEvent(OnCuffsInsertedIntoContainer); SubscribeLocalEvent(OnRejuvenate); SubscribeLocalEvent(OnStartup); - SubscribeLocalEvent(HandleStopPull); + SubscribeLocalEvent(HandleStopPull); SubscribeLocalEvent(HandleMoveAttempt); SubscribeLocalEvent(OnEquipAttempt); SubscribeLocalEvent(OnUnequipAttempt); @@ -182,7 +182,7 @@ public void UpdateCuffState(EntityUid uid, CuffableComponent component) private void OnBeingPulledAttempt(EntityUid uid, CuffableComponent component, BeingPulledAttemptEvent args) { - if (!TryComp(uid, out var pullable)) + if (!TryComp(uid, out var pullable)) return; if (pullable.Puller != null && !component.CanStillInteract) // If we are being pulled already and cuffed, we can't get pulled again. @@ -214,19 +214,19 @@ private void OnPull(EntityUid uid, CuffableComponent component, PullMessage args private void HandleMoveAttempt(EntityUid uid, CuffableComponent component, UpdateCanMoveEvent args) { - if (component.CanStillInteract || !EntityManager.TryGetComponent(uid, out PullableComponent? pullable) || !pullable.BeingPulled) + if (component.CanStillInteract || !EntityManager.TryGetComponent(uid, out SharedPullableComponent? pullable) || !pullable.BeingPulled) return; args.Cancel(); } - private void HandleStopPull(EntityUid uid, CuffableComponent component, AttemptStopPullingEvent args) + private void HandleStopPull(EntityUid uid, CuffableComponent component, StopPullingEvent args) { if (args.User == null || !Exists(args.User.Value)) return; if (args.User.Value == uid && !component.CanStillInteract) - args.Cancelled = true; + args.Cancel(); } private void AddUncuffVerb(EntityUid uid, CuffableComponent component, GetVerbsEvent args) diff --git a/Content.Shared/Follower/FollowerSystem.cs b/Content.Shared/Follower/FollowerSystem.cs index fc7cccf9bd6..5656778a3f9 100644 --- a/Content.Shared/Follower/FollowerSystem.cs +++ b/Content.Shared/Follower/FollowerSystem.cs @@ -4,8 +4,8 @@ using Content.Shared.Ghost; using Content.Shared.Hands; using Content.Shared.Movement.Events; -using Content.Shared.Movement.Pulling.Events; using Content.Shared.Movement.Systems; +using Content.Shared.Physics.Pull; using Content.Shared.Tag; using Content.Shared.Verbs; using Robust.Shared.Containers; diff --git a/Content.Shared/Friction/TileFrictionController.cs b/Content.Shared/Friction/TileFrictionController.cs index ae9f32819a5..472f5b574b2 100644 --- a/Content.Shared/Friction/TileFrictionController.cs +++ b/Content.Shared/Friction/TileFrictionController.cs @@ -2,8 +2,8 @@ using Content.Shared.CCVar; using Content.Shared.Gravity; using Content.Shared.Movement.Events; -using Content.Shared.Movement.Pulling.Components; using Content.Shared.Movement.Systems; +using Content.Shared.Pulling.Components; using JetBrains.Annotations; using Robust.Shared.Configuration; using Robust.Shared.Map; @@ -23,12 +23,6 @@ public sealed class TileFrictionController : VirtualController [Dependency] private readonly SharedMoverController _mover = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; - private EntityQuery _frictionQuery; - private EntityQuery _xformQuery; - private EntityQuery _pullerQuery; - private EntityQuery _pullableQuery; - private EntityQuery _gridQuery; - private float _stopSpeed; private float _frictionModifier; public const float DefaultFriction = 0.3f; @@ -37,12 +31,6 @@ public override void Initialize() { base.Initialize(); - _frictionQuery = GetEntityQuery(); - _xformQuery = GetEntityQuery(); - _pullerQuery = GetEntityQuery(); - _pullableQuery = GetEntityQuery(); - _gridQuery = GetEntityQuery(); - _configManager.OnValueChanged(CCVars.TileFrictionModifier, SetFrictionModifier, true); _configManager.OnValueChanged(CCVars.StopSpeed, SetStopSpeed, true); } @@ -63,6 +51,12 @@ public override void UpdateBeforeMapSolve(bool prediction, PhysicsMapComponent m { base.UpdateBeforeMapSolve(prediction, mapComponent, frameTime); + var frictionQuery = GetEntityQuery(); + var xformQuery = GetEntityQuery(); + var pullerQuery = GetEntityQuery(); + var pullableQuery = GetEntityQuery(); + var gridQuery = GetEntityQuery(); + foreach (var body in mapComponent.AwakeBodies) { var uid = body.Owner; @@ -78,16 +72,16 @@ public override void UpdateBeforeMapSolve(bool prediction, PhysicsMapComponent m if (body.LinearVelocity.Equals(Vector2.Zero) && body.AngularVelocity.Equals(0f)) continue; - if (!_xformQuery.TryGetComponent(uid, out var xform)) + if (!xformQuery.TryGetComponent(uid, out var xform)) { Log.Error($"Unable to get transform for {ToPrettyString(uid)} in tilefrictioncontroller"); continue; } - var surfaceFriction = GetTileFriction(uid, body, xform); + var surfaceFriction = GetTileFriction(uid, body, xform, gridQuery, frictionQuery); var bodyModifier = 1f; - if (_frictionQuery.TryGetComponent(uid, out var frictionComp)) + if (frictionQuery.TryGetComponent(uid, out var frictionComp)) { bodyModifier = frictionComp.Modifier; } @@ -100,8 +94,8 @@ public override void UpdateBeforeMapSolve(bool prediction, PhysicsMapComponent m // If we're sandwiched between 2 pullers reduce friction // Might be better to make this dynamic and check how many are in the pull chain? // Either way should be much faster for now. - if (_pullerQuery.TryGetComponent(uid, out var puller) && puller.Pulling != null && - _pullableQuery.TryGetComponent(uid, out var pullable) && pullable.BeingPulled) + if (pullerQuery.TryGetComponent(uid, out var puller) && puller.Pulling != null && + pullableQuery.TryGetComponent(uid, out var pullable) && pullable.BeingPulled) { bodyModifier *= 0.2f; } @@ -181,7 +175,9 @@ private void ReduceAngularVelocity(EntityUid uid, bool prediction, PhysicsCompon private float GetTileFriction( EntityUid uid, PhysicsComponent body, - TransformComponent xform) + TransformComponent xform, + EntityQuery gridQuery, + EntityQuery frictionQuery) { // TODO: Make IsWeightless event-based; we already have grid traversals tracked so just raise events if (_gravity.IsWeightless(uid, body, xform)) @@ -191,9 +187,9 @@ private float GetTileFriction( return 0.0f; // If not on a grid then return the map's friction. - if (!_gridQuery.TryGetComponent(xform.GridUid, out var grid)) + if (!gridQuery.TryGetComponent(xform.GridUid, out var grid)) { - return _frictionQuery.TryGetComponent(xform.MapUid, out var friction) + return frictionQuery.TryGetComponent(xform.MapUid, out var friction) ? friction.Modifier : DefaultFriction; } @@ -213,7 +209,7 @@ private float GetTileFriction( while (anc.MoveNext(out var tileEnt)) { - if (_frictionQuery.TryGetComponent(tileEnt, out var friction)) + if (frictionQuery.TryGetComponent(tileEnt, out var friction)) return friction.Modifier; } diff --git a/Content.Shared/Interaction/SharedInteractionSystem.cs b/Content.Shared/Interaction/SharedInteractionSystem.cs index 29cf8d6d12f..75063c55503 100644 --- a/Content.Shared/Interaction/SharedInteractionSystem.cs +++ b/Content.Shared/Interaction/SharedInteractionSystem.cs @@ -15,10 +15,10 @@ using Content.Shared.Inventory.Events; using Content.Shared.Item; using Content.Shared.Movement.Components; -using Content.Shared.Movement.Pulling.Components; -using Content.Shared.Movement.Pulling.Systems; using Content.Shared.Physics; using Content.Shared.Popups; +using Content.Shared.Pulling; +using Content.Shared.Pulling.Components; using Content.Shared.Tag; using Content.Shared.Timing; using Content.Shared.Verbs; @@ -60,7 +60,7 @@ public abstract partial class SharedInteractionSystem : EntitySystem [Dependency] private readonly SharedVerbSystem _verbSystem = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly UseDelaySystem _useDelay = default!; - [Dependency] private readonly PullingSystem _pullSystem = default!; + [Dependency] private readonly SharedPullingSystem _pullSystem = default!; [Dependency] private readonly InventorySystem _inventory = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly TagSystem _tagSystem = default!; @@ -185,10 +185,10 @@ private bool HandleTryPullObject(ICommonSession? session, EntityCoordinates coor if (!InRangeUnobstructed(userEntity.Value, uid, popup: true)) return false; - if (!TryComp(uid, out PullableComponent? pull)) + if (!TryComp(uid, out SharedPullableComponent? pull)) return false; - _pullSystem.TogglePull(uid, userEntity.Value, pull); + _pullSystem.TogglePull(userEntity.Value, pull); return false; } diff --git a/Content.Shared/Movement/Pulling/Components/PullableComponent.cs b/Content.Shared/Movement/Pulling/Components/PullableComponent.cs deleted file mode 100644 index db889e7e3bd..00000000000 --- a/Content.Shared/Movement/Pulling/Components/PullableComponent.cs +++ /dev/null @@ -1,39 +0,0 @@ -using Robust.Shared.GameStates; - -namespace Content.Shared.Movement.Pulling.Components; - -/// -/// Specifies an entity as being pullable by an entity with -/// -[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] -[Access(typeof(Systems.PullingSystem))] -public sealed partial class PullableComponent : Component -{ - /// - /// The current entity pulling this component. - /// - [AutoNetworkedField, DataField] - public EntityUid? Puller; - - /// - /// The pull joint. - /// - [AutoNetworkedField, DataField] - public string? PullJointId; - - public bool BeingPulled => Puller != null; - - /// - /// If the physics component has FixedRotation should we keep it upon being pulled - /// - [Access(typeof(Systems.PullingSystem), Other = AccessPermissions.ReadExecute)] - [ViewVariables(VVAccess.ReadWrite), DataField("fixedRotation")] - public bool FixedRotationOnPull; - - /// - /// What the pullable's fixedrotation was set to before being pulled. - /// - [Access(typeof(Systems.PullingSystem), Other = AccessPermissions.ReadExecute)] - [AutoNetworkedField, DataField] - public bool PrevFixedRotation; -} diff --git a/Content.Shared/Movement/Pulling/Components/PullerComponent.cs b/Content.Shared/Movement/Pulling/Components/PullerComponent.cs deleted file mode 100644 index 1fc9b731bd5..00000000000 --- a/Content.Shared/Movement/Pulling/Components/PullerComponent.cs +++ /dev/null @@ -1,41 +0,0 @@ -using Content.Shared.Movement.Pulling.Systems; -using Robust.Shared.GameStates; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; - -namespace Content.Shared.Movement.Pulling.Components; - -/// -/// Specifies an entity as being able to pull another entity with -/// -[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] -[Access(typeof(PullingSystem))] -public sealed partial class PullerComponent : Component -{ - // My raiding guild - /// - /// Next time the puller can throw what is being pulled. - /// Used to avoid spamming it for infinite spin + velocity. - /// - [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoNetworkedField] - public TimeSpan NextThrow; - - [DataField] - public TimeSpan ThrowCooldown = TimeSpan.FromSeconds(1); - - // Before changing how this is updated, please see SharedPullerSystem.RefreshMovementSpeed - public float WalkSpeedModifier => Pulling == default ? 1.0f : 0.95f; - - public float SprintSpeedModifier => Pulling == default ? 1.0f : 0.95f; - - /// - /// Entity currently being pulled if applicable. - /// - [AutoNetworkedField, DataField] - public EntityUid? Pulling; - - /// - /// Does this entity need hands to be able to pull something? - /// - [DataField] - public bool NeedsHands = true; -} diff --git a/Content.Shared/Movement/Pulling/Events/AttemptPullEvent.cs b/Content.Shared/Movement/Pulling/Events/AttemptPullEvent.cs deleted file mode 100644 index b0101c46996..00000000000 --- a/Content.Shared/Movement/Pulling/Events/AttemptPullEvent.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Robust.Shared.Physics.Components; - -namespace Content.Shared.Movement.Pulling.Events; - -/// -/// Raised directed on puller and pullable to determine if it can be pulled. -/// -public sealed class PullAttemptEvent : PullMessage -{ - public PullAttemptEvent(EntityUid pullerUid, EntityUid pullableUid) : base(pullerUid, pullableUid) { } - - public bool Cancelled { get; set; } -} diff --git a/Content.Shared/Movement/Pulling/Events/AttemptStopPullingEvent.cs b/Content.Shared/Movement/Pulling/Events/AttemptStopPullingEvent.cs deleted file mode 100644 index cd7edc5f623..00000000000 --- a/Content.Shared/Movement/Pulling/Events/AttemptStopPullingEvent.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Content.Shared.Pulling.Events; - -/// -/// Raised when a request is made to stop pulling an entity. -/// -public record struct AttemptStopPullingEvent(EntityUid? User = null) -{ - public readonly EntityUid? User = User; - public bool Cancelled; -} \ No newline at end of file diff --git a/Content.Shared/Movement/Pulling/Events/PullMessage.cs b/Content.Shared/Movement/Pulling/Events/PullMessage.cs deleted file mode 100644 index a427e448d5c..00000000000 --- a/Content.Shared/Movement/Pulling/Events/PullMessage.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Content.Shared.Movement.Pulling.Events; - -public abstract class PullMessage : EntityEventArgs -{ - public readonly EntityUid PullerUid; - public readonly EntityUid PulledUid; - - protected PullMessage(EntityUid pullerUid, EntityUid pulledUid) - { - PullerUid = pullerUid; - PulledUid = pulledUid; - } -} diff --git a/Content.Shared/Movement/Pulling/Events/PullStartedMessage.cs b/Content.Shared/Movement/Pulling/Events/PullStartedMessage.cs deleted file mode 100644 index 29460e1dfc1..00000000000 --- a/Content.Shared/Movement/Pulling/Events/PullStartedMessage.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Content.Shared.Movement.Pulling.Events; - -public sealed class PullStartedMessage : PullMessage -{ - public PullStartedMessage(EntityUid pullerUid, EntityUid pullableUid) : - base(pullerUid, pullableUid) - { - } -} diff --git a/Content.Shared/Movement/Pulling/Events/PullStoppedMessage.cs b/Content.Shared/Movement/Pulling/Events/PullStoppedMessage.cs deleted file mode 100644 index 47aa34562fb..00000000000 --- a/Content.Shared/Movement/Pulling/Events/PullStoppedMessage.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Robust.Shared.Physics.Components; - -namespace Content.Shared.Movement.Pulling.Events; - -/// -/// Raised directed on both puller and pullable. -/// -public sealed class PullStoppedMessage : PullMessage -{ - public PullStoppedMessage(EntityUid pullerUid, EntityUid pulledUid) : base(pullerUid, pulledUid) - { - } -} diff --git a/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs deleted file mode 100644 index 8ed06ca8c98..00000000000 --- a/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs +++ /dev/null @@ -1,455 +0,0 @@ -using System.Numerics; -using Content.Shared.ActionBlocker; -using Content.Shared.Administration.Logs; -using Content.Shared.Alert; -using Content.Shared.Buckle.Components; -using Content.Shared.Database; -using Content.Shared.Hands; -using Content.Shared.Hands.EntitySystems; -using Content.Shared.Input; -using Content.Shared.Interaction; -using Content.Shared.Movement.Events; -using Content.Shared.Movement.Pulling.Components; -using Content.Shared.Movement.Pulling.Events; -using Content.Shared.Movement.Systems; -using Content.Shared.Pulling.Events; -using Content.Shared.Throwing; -using Content.Shared.Verbs; -using Robust.Shared.Containers; -using Robust.Shared.Input.Binding; -using Robust.Shared.Map; -using Robust.Shared.Physics; -using Robust.Shared.Physics.Components; -using Robust.Shared.Physics.Events; -using Robust.Shared.Physics.Systems; -using Robust.Shared.Player; -using Robust.Shared.Timing; - -namespace Content.Shared.Movement.Pulling.Systems; - -/// -/// Allows one entity to pull another behind them via a physics distance joint. -/// -public sealed class PullingSystem : EntitySystem -{ - [Dependency] private readonly IGameTiming _timing = default!; - [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; - [Dependency] private readonly ActionBlockerSystem _blocker = default!; - [Dependency] private readonly AlertsSystem _alertsSystem = default!; - [Dependency] private readonly MovementSpeedModifierSystem _modifierSystem = default!; - [Dependency] private readonly SharedJointSystem _joints = default!; - [Dependency] private readonly SharedContainerSystem _containerSystem = default!; - [Dependency] private readonly SharedHandsSystem _handsSystem = default!; - [Dependency] private readonly SharedInteractionSystem _interaction = default!; - [Dependency] private readonly SharedPhysicsSystem _physics = default!; - [Dependency] private readonly SharedTransformSystem _xformSys = default!; - [Dependency] private readonly ThrowingSystem _throwing = default!; - - public override void Initialize() - { - base.Initialize(); - - UpdatesAfter.Add(typeof(SharedPhysicsSystem)); - UpdatesOutsidePrediction = true; - - SubscribeLocalEvent(OnPullableMoveInput); - SubscribeLocalEvent(OnPullableCollisionChange); - SubscribeLocalEvent(OnJointRemoved); - SubscribeLocalEvent>(AddPullVerbs); - - SubscribeLocalEvent(OnPullerUnpaused); - SubscribeLocalEvent(OnVirtualItemDeleted); - SubscribeLocalEvent(OnRefreshMovespeed); - - CommandBinds.Builder - .Bind(ContentKeyFunctions.MovePulledObject, new PointerInputCmdHandler(OnRequestMovePulledObject)) - .Bind(ContentKeyFunctions.ReleasePulledObject, InputCmdHandler.FromDelegate(OnReleasePulledObject)) - .Register(); - } - - public override void Shutdown() - { - base.Shutdown(); - CommandBinds.Unregister(); - } - - private void OnPullerUnpaused(EntityUid uid, PullerComponent component, ref EntityUnpausedEvent args) - { - component.NextThrow += args.PausedTime; - } - - private void OnVirtualItemDeleted(EntityUid uid, PullerComponent component, VirtualItemDeletedEvent args) - { - // If client deletes the virtual hand then stop the pull. - if (component.Pulling == null) - return; - - if (component.Pulling != args.BlockingEntity) - return; - - if (EntityManager.TryGetComponent(args.BlockingEntity, out PullableComponent? comp)) - { - TryStopPull(args.BlockingEntity, comp, uid); - } - } - - private void AddPullVerbs(EntityUid uid, PullableComponent component, GetVerbsEvent args) - { - if (!args.CanAccess || !args.CanInteract) - return; - - // Are they trying to pull themselves up by their bootstraps? - if (args.User == args.Target) - return; - - //TODO VERB ICONS add pulling icon - if (component.Puller == args.User) - { - Verb verb = new() - { - Text = Loc.GetString("pulling-verb-get-data-text-stop-pulling"), - Act = () => TryStopPull(uid, component, user: args.User), - DoContactInteraction = false // pulling handle its own contact interaction. - }; - args.Verbs.Add(verb); - } - else if (CanPull(args.User, args.Target)) - { - Verb verb = new() - { - Text = Loc.GetString("pulling-verb-get-data-text"), - Act = () => TryStartPull(args.User, args.Target), - DoContactInteraction = false // pulling handle its own contact interaction. - }; - args.Verbs.Add(verb); - } - } - - private void OnRefreshMovespeed(EntityUid uid, PullerComponent component, RefreshMovementSpeedModifiersEvent args) - { - args.ModifySpeed(component.WalkSpeedModifier, component.SprintSpeedModifier); - } - - private void OnPullableMoveInput(EntityUid uid, PullableComponent component, ref MoveInputEvent args) - { - // If someone moves then break their pulling. - if (!component.BeingPulled) - return; - - var entity = args.Entity; - - if (!_blocker.CanMove(entity)) - return; - - TryStopPull(uid, component, user: uid); - } - - private void OnPullableCollisionChange(EntityUid uid, PullableComponent component, ref CollisionChangeEvent args) - { - // IDK what this is supposed to be. - if (!_timing.ApplyingState && component.PullJointId != null && !args.CanCollide) - { - _joints.RemoveJoint(uid, component.PullJointId); - } - } - - private void OnJointRemoved(EntityUid uid, PullableComponent component, JointRemovedEvent args) - { - // Not relevant / pullable state handle it. - if (component.Puller != args.OtherEntity || - args.Joint.ID != component.PullJointId || - _timing.ApplyingState) - { - return; - } - - if (args.Joint.ID != component.PullJointId) - return; - - CleanupPulling(uid, component); - } - - private void CleanupPulling(EntityUid pullableUid, PullableComponent pullableComp) - { - // No more joints with puller -> force stop pull. - if (TryComp(pullableComp.Puller, out var pullerComp)) - { - pullerComp.Pulling = null; - Dirty(pullableComp.Puller.Value, pullerComp); - } - - pullableComp.PullJointId = null; - pullableComp.Puller = null; - Dirty(pullableUid, pullableComp); - } - - public bool IsPulled(EntityUid uid, PullableComponent? component = null) - { - return Resolve(uid, ref component, false) && component.BeingPulled; - } - - private bool OnRequestMovePulledObject(ICommonSession? session, EntityCoordinates coords, EntityUid uid) - { - if (session?.AttachedEntity is not { } player || - !player.IsValid()) - { - return false; - } - - if (!TryComp(player, out var pullerComp)) - return false; - - var pulled = pullerComp.Pulling; - - if (!HasComp(pulled)) - return false; - - if (_containerSystem.IsEntityInContainer(player)) - return false; - - // Cooldown buddy - if (_timing.CurTime < pullerComp.NextThrow) - return false; - - pullerComp.NextThrow = _timing.CurTime + pullerComp.ThrowCooldown; - - // Cap the distance - const float range = 2f; - var fromUserCoords = coords.WithEntityId(player, EntityManager); - var userCoords = new EntityCoordinates(player, Vector2.Zero); - - if (!userCoords.InRange(EntityManager, _xformSys, fromUserCoords, range)) - { - var userDirection = fromUserCoords.Position - userCoords.Position; - fromUserCoords = userCoords.Offset(userDirection.Normalized() * range); - } - - Dirty(player, pullerComp); - _throwing.TryThrow(pulled.Value, fromUserCoords, user: player, strength: 4f, animated: false, recoil: false, playSound: false); - return false; - } - - public bool IsPulling(EntityUid puller, PullerComponent? component = null) - { - return Resolve(puller, ref component, false) && component.Pulling != null; - } - - private void OnReleasePulledObject(ICommonSession? session) - { - if (session?.AttachedEntity is not {Valid: true} player) - { - return; - } - - if (!TryComp(player, out PullerComponent? pullerComp) || - !TryComp(pullerComp.Pulling, out PullableComponent? pullableComp)) - { - return; - } - - TryStopPull(pullerComp.Pulling.Value, pullableComp, user: player); - } - - public bool CanPull(EntityUid puller, EntityUid pullableUid, PullerComponent? pullerComp = null) - { - if (!Resolve(puller, ref pullerComp, false)) - { - return false; - } - - if (pullerComp.NeedsHands && !_handsSystem.TryGetEmptyHand(puller, out _)) - { - return false; - } - - if (!_blocker.CanInteract(puller, pullableUid)) - { - return false; - } - - if (!EntityManager.TryGetComponent(pullableUid, out var physics)) - { - return false; - } - - if (physics.BodyType == BodyType.Static) - { - return false; - } - - if (puller == pullableUid) - { - return false; - } - - if (!_containerSystem.IsInSameOrNoContainer(puller, pullableUid)) - { - return false; - } - - if (EntityManager.TryGetComponent(puller, out BuckleComponent? buckle)) - { - // Prevent people pulling the chair they're on, etc. - if (buckle is { PullStrap: false, Buckled: true } && (buckle.LastEntityBuckledTo == pullableUid)) - { - return false; - } - } - - var getPulled = new BeingPulledAttemptEvent(puller, pullableUid); - RaiseLocalEvent(pullableUid, getPulled, true); - var startPull = new StartPullAttemptEvent(puller, pullableUid); - RaiseLocalEvent(puller, startPull, true); - return !startPull.Cancelled && !getPulled.Cancelled; - } - - public bool TogglePull(EntityUid pullableUid, EntityUid pullerUid, PullableComponent pullable) - { - if (pullable.Puller == pullerUid) - { - return TryStopPull(pullableUid, pullable); - } - - return TryStartPull(pullerUid, pullableUid, pullableComp: pullable); - } - - public bool TogglePull(EntityUid pullerUid, PullerComponent puller) - { - if (!TryComp(puller.Pulling, out var pullable)) - return false; - - return TogglePull(puller.Pulling.Value, pullerUid, pullable); - } - - public bool TryStartPull(EntityUid pullerUid, EntityUid pullableUid, EntityUid? user = null, - PullerComponent? pullerComp = null, PullableComponent? pullableComp = null) - { - if (!Resolve(pullerUid, ref pullerComp, false) || - !Resolve(pullableUid, ref pullableComp, false)) - { - return false; - } - - if (pullerComp.Pulling == pullableUid) - return true; - - if (!CanPull(pullerUid, pullableUid)) - return false; - - if (!EntityManager.TryGetComponent(pullerUid, out var pullerPhysics) || - !EntityManager.TryGetComponent(pullableUid, out var pullablePhysics)) - { - return false; - } - - // Ensure that the puller is not currently pulling anything. - var oldPullable = pullerComp.Pulling; - - if (oldPullable != null) - { - // Well couldn't stop the old one. - if (!TryStopPull(oldPullable.Value, pullableComp, user)) - return false; - } - - var pullAttempt = new PullAttemptEvent(pullerUid, pullableUid); - RaiseLocalEvent(pullerUid, pullAttempt); - - if (pullAttempt.Cancelled) - return false; - - RaiseLocalEvent(pullableUid, pullAttempt); - - if (pullAttempt.Cancelled) - return false; - - // Pulling confirmed - - _interaction.DoContactInteraction(pullableUid, pullerUid); - - // Use net entity so it's consistent across client and server. - pullableComp.PullJointId = $"pull-joint-{GetNetEntity(pullableUid)}"; - - pullerComp.Pulling = pullableUid; - pullableComp.Puller = pullerUid; - - // joint state handling will manage its own state - if (!_timing.ApplyingState) - { - // Joint startup - var union = _physics.GetHardAABB(pullerUid).Union(_physics.GetHardAABB(pullableUid, body: pullablePhysics)); - var length = Math.Max((float) union.Size.X, (float) union.Size.Y) * 0.75f; - - var joint = _joints.CreateDistanceJoint(pullableUid, pullerUid, id: pullableComp.PullJointId); - joint.CollideConnected = false; - // This maximum has to be there because if the object is constrained too closely, the clamping goes backwards and asserts. - joint.MaxLength = Math.Max(1.0f, length); - joint.Length = length * 0.75f; - joint.MinLength = 0f; - joint.Stiffness = 1f; - - _physics.SetFixedRotation(pullableUid, pullableComp.FixedRotationOnPull, body: pullablePhysics); - } - - pullableComp.PrevFixedRotation = pullablePhysics.FixedRotation; - - // Messaging - var message = new PullStartedMessage(pullerUid, pullableUid); - _alertsSystem.ShowAlert(pullerUid, AlertType.Pulling); - _alertsSystem.ShowAlert(pullableUid, AlertType.Pulled); - - RaiseLocalEvent(pullerUid, message); - RaiseLocalEvent(pullableUid, message); - - Dirty(pullerUid, pullerComp); - Dirty(pullableUid, pullableComp); - - _adminLogger.Add(LogType.Action, LogImpact.Low, - $"{ToPrettyString(pullerUid):user} started pulling {ToPrettyString(pullableUid):target}"); - return true; - } - - public bool TryStopPull(EntityUid pullableUid, PullableComponent pullable, EntityUid? user = null) - { - var pullerUidNull = pullable.Puller; - - if (pullerUidNull == null) - return false; - - var pullerUid = pullerUidNull.Value; - var msg = new AttemptStopPullingEvent(user); - RaiseLocalEvent(pullableUid, msg, true); - - if (msg.Cancelled) - return false; - - // Stop pulling confirmed! - if (!_timing.ApplyingState) - { - if (TryComp(pullableUid, out var pullablePhysics)) - { - _physics.SetFixedRotation(pullableUid, pullable.PrevFixedRotation, body: pullablePhysics); - } - - // Joint shutdown - if (pullable.PullJointId != null) - { - _joints.RemoveJoint(pullableUid, pullable.PullJointId); - pullable.PullJointId = null; - } - } - - CleanupPulling(pullableUid, pullable); - - // Messaging - var message = new PullStoppedMessage(pullerUid, pullableUid); - _alertsSystem.ClearAlert(pullerUid, AlertType.Pulling); - _alertsSystem.ClearAlert(pullableUid, AlertType.Pulled); - _modifierSystem.RefreshMovementSpeedModifiers(pullerUid); - _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(pullerUid):user} stopped pulling {ToPrettyString(pullableUid):target}"); - - RaiseLocalEvent(pullerUid, message); - RaiseLocalEvent(pullableUid, message); - return true; - } -} diff --git a/Content.Shared/Movement/Systems/SharedMoverController.cs b/Content.Shared/Movement/Systems/SharedMoverController.cs index 6a3dbb2864e..7d5e24a15b1 100644 --- a/Content.Shared/Movement/Systems/SharedMoverController.cs +++ b/Content.Shared/Movement/Systems/SharedMoverController.cs @@ -9,6 +9,7 @@ using Content.Shared.Mobs.Systems; using Content.Shared.Movement.Components; using Content.Shared.Movement.Events; +using Content.Shared.Pulling.Components; using Content.Shared.Tag; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; @@ -22,7 +23,6 @@ using Robust.Shared.Physics.Systems; using Robust.Shared.Timing; using Robust.Shared.Utility; -using PullableComponent = Content.Shared.Movement.Pulling.Components.PullableComponent; namespace Content.Shared.Movement.Systems { @@ -53,7 +53,7 @@ public abstract partial class SharedMoverController : VirtualController protected EntityQuery ModifierQuery; protected EntityQuery PhysicsQuery; protected EntityQuery RelayQuery; - protected EntityQuery PullableQuery; + protected EntityQuery PullableQuery; protected EntityQuery XformQuery; protected EntityQuery CanMoveInAirQuery; protected EntityQuery NoRotateQuery; @@ -85,7 +85,7 @@ public override void Initialize() RelayTargetQuery = GetEntityQuery(); PhysicsQuery = GetEntityQuery(); RelayQuery = GetEntityQuery(); - PullableQuery = GetEntityQuery(); + PullableQuery = GetEntityQuery(); XformQuery = GetEntityQuery(); NoRotateQuery = GetEntityQuery(); CanMoveInAirQuery = GetEntityQuery(); @@ -381,7 +381,7 @@ private bool IsAroundCollider(SharedPhysicsSystem broadPhaseSystem, TransformCom !otherCollider.CanCollide || ((collider.CollisionMask & otherCollider.CollisionLayer) == 0 && (otherCollider.CollisionMask & collider.CollisionLayer) == 0) || - (TryComp(otherCollider.Owner, out PullableComponent? pullable) && pullable.BeingPulled)) + (TryComp(otherCollider.Owner, out SharedPullableComponent? pullable) && pullable.BeingPulled)) { continue; } diff --git a/Content.Shared/Pulling/Components/PullableComponent.cs b/Content.Shared/Pulling/Components/PullableComponent.cs new file mode 100644 index 00000000000..c5c30688699 --- /dev/null +++ b/Content.Shared/Pulling/Components/PullableComponent.cs @@ -0,0 +1,57 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Map; +using Robust.Shared.Serialization; + +namespace Content.Shared.Pulling.Components +{ + // Before you try to add another type than SharedPullingStateManagementSystem, consider the can of worms you may be opening! + [NetworkedComponent, AutoGenerateComponentState] + [Access(typeof(SharedPullingStateManagementSystem))] + [RegisterComponent] + public sealed partial class SharedPullableComponent : Component + { + /// + /// The current entity pulling this component. + /// + [DataField, AutoNetworkedField] + public EntityUid? Puller { get; set; } + + /// + /// The pull joint. + /// + [DataField, AutoNetworkedField] + public string? PullJointId { get; set; } + + public bool BeingPulled => Puller != null; + + [Access(typeof(SharedPullingStateManagementSystem), Other = AccessPermissions.ReadExecute)] // FIXME Friends + public EntityCoordinates? MovingTo { get; set; } + + /// + /// If the physics component has FixedRotation should we keep it upon being pulled + /// + [Access(typeof(SharedPullingSystem), Other = AccessPermissions.ReadExecute)] + [ViewVariables(VVAccess.ReadWrite), DataField("fixedRotation")] + public bool FixedRotationOnPull { get; set; } + + /// + /// What the pullable's fixedrotation was set to before being pulled. + /// + [Access(typeof(SharedPullingSystem), Other = AccessPermissions.ReadExecute)] + [ViewVariables] + public bool PrevFixedRotation; + } + + /// + /// Raised when a request is made to stop pulling an entity. + /// + public sealed class StopPullingEvent : CancellableEntityEventArgs + { + public EntityUid? User { get; } + + public StopPullingEvent(EntityUid? uid = null) + { + User = uid; + } + } +} diff --git a/Content.Shared/Pulling/Components/SharedPullerComponent.cs b/Content.Shared/Pulling/Components/SharedPullerComponent.cs new file mode 100644 index 00000000000..57a86e7f7a8 --- /dev/null +++ b/Content.Shared/Pulling/Components/SharedPullerComponent.cs @@ -0,0 +1,23 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Pulling.Components +{ + [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] + [Access(typeof(SharedPullingStateManagementSystem))] + public sealed partial class SharedPullerComponent : Component + { + // Before changing how this is updated, please see SharedPullerSystem.RefreshMovementSpeed + public float WalkSpeedModifier => Pulling == default ? 1.0f : 0.95f; + + public float SprintSpeedModifier => Pulling == default ? 1.0f : 0.95f; + + [DataField, AutoNetworkedField] + public EntityUid? Pulling { get; set; } + + /// + /// Does this entity need hands to be able to pull something? + /// + [DataField("needsHands")] + public bool NeedsHands = true; + } +} diff --git a/Content.Shared/Movement/Pulling/Events/BeingPulledAttemptEvent.cs b/Content.Shared/Pulling/Events/BeingPulledAttemptEvent.cs similarity index 100% rename from Content.Shared/Movement/Pulling/Events/BeingPulledAttemptEvent.cs rename to Content.Shared/Pulling/Events/BeingPulledAttemptEvent.cs diff --git a/Content.Shared/Pulling/Events/PullAttemptEvent.cs b/Content.Shared/Pulling/Events/PullAttemptEvent.cs new file mode 100644 index 00000000000..6296dc2f14f --- /dev/null +++ b/Content.Shared/Pulling/Events/PullAttemptEvent.cs @@ -0,0 +1,11 @@ +using Robust.Shared.Physics.Components; + +namespace Content.Shared.Physics.Pull +{ + public sealed class PullAttemptEvent : PullMessage + { + public PullAttemptEvent(PhysicsComponent puller, PhysicsComponent pulled) : base(puller, pulled) { } + + public bool Cancelled { get; set; } + } +} diff --git a/Content.Shared/Pulling/Events/PullMessage.cs b/Content.Shared/Pulling/Events/PullMessage.cs new file mode 100644 index 00000000000..b11de7c1702 --- /dev/null +++ b/Content.Shared/Pulling/Events/PullMessage.cs @@ -0,0 +1,16 @@ +using Robust.Shared.Physics.Components; + +namespace Content.Shared.Physics.Pull +{ + public abstract class PullMessage : EntityEventArgs + { + public readonly PhysicsComponent Puller; + public readonly PhysicsComponent Pulled; + + protected PullMessage(PhysicsComponent puller, PhysicsComponent pulled) + { + Puller = puller; + Pulled = pulled; + } + } +} diff --git a/Content.Shared/Pulling/Events/PullStartedMessage.cs b/Content.Shared/Pulling/Events/PullStartedMessage.cs new file mode 100644 index 00000000000..0ede284bb0c --- /dev/null +++ b/Content.Shared/Pulling/Events/PullStartedMessage.cs @@ -0,0 +1,12 @@ +using Robust.Shared.Physics.Components; + +namespace Content.Shared.Physics.Pull +{ + public sealed class PullStartedMessage : PullMessage + { + public PullStartedMessage(PhysicsComponent puller, PhysicsComponent pulled) : + base(puller, pulled) + { + } + } +} diff --git a/Content.Shared/Pulling/Events/PullStoppedMessage.cs b/Content.Shared/Pulling/Events/PullStoppedMessage.cs new file mode 100644 index 00000000000..afcbcb70740 --- /dev/null +++ b/Content.Shared/Pulling/Events/PullStoppedMessage.cs @@ -0,0 +1,11 @@ +using Robust.Shared.Physics.Components; + +namespace Content.Shared.Physics.Pull +{ + public sealed class PullStoppedMessage : PullMessage + { + public PullStoppedMessage(PhysicsComponent puller, PhysicsComponent pulled) : base(puller, pulled) + { + } + } +} diff --git a/Content.Shared/Movement/Pulling/Events/StartPullAttemptEvent.cs b/Content.Shared/Pulling/Events/StartPullAttemptEvent.cs similarity index 100% rename from Content.Shared/Movement/Pulling/Events/StartPullAttemptEvent.cs rename to Content.Shared/Pulling/Events/StartPullAttemptEvent.cs diff --git a/Content.Shared/Pulling/PullableMoveMessage.cs b/Content.Shared/Pulling/PullableMoveMessage.cs new file mode 100644 index 00000000000..46c6b1291d6 --- /dev/null +++ b/Content.Shared/Pulling/PullableMoveMessage.cs @@ -0,0 +1,6 @@ +namespace Content.Shared.Pulling +{ + public sealed class PullableMoveMessage : EntityEventArgs + { + } +} diff --git a/Content.Shared/Pulling/PullableStopMovingMessage.cs b/Content.Shared/Pulling/PullableStopMovingMessage.cs new file mode 100644 index 00000000000..0233e32f2b4 --- /dev/null +++ b/Content.Shared/Pulling/PullableStopMovingMessage.cs @@ -0,0 +1,6 @@ +namespace Content.Shared.Pulling +{ + public sealed class PullableStopMovingMessage : EntityEventArgs + { + } +} diff --git a/Content.Shared/Pulling/Systems/SharedPullableSystem.cs b/Content.Shared/Pulling/Systems/SharedPullableSystem.cs new file mode 100644 index 00000000000..3dab476337b --- /dev/null +++ b/Content.Shared/Pulling/Systems/SharedPullableSystem.cs @@ -0,0 +1,28 @@ +using Content.Shared.ActionBlocker; +using Content.Shared.Mobs.Systems; +using Content.Shared.Pulling.Components; +using Content.Shared.Movement.Events; + +namespace Content.Shared.Pulling.Systems +{ + public sealed class SharedPullableSystem : EntitySystem + { + [Dependency] private readonly ActionBlockerSystem _blocker = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; + [Dependency] private readonly SharedPullingSystem _pullSystem = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnRelayMoveInput); + } + + private void OnRelayMoveInput(EntityUid uid, SharedPullableComponent component, ref MoveInputEvent args) + { + var entity = args.Entity; + if (_mobState.IsIncapacitated(entity) || !_blocker.CanMove(entity)) return; + + _pullSystem.TryStopPull(component); + } + } +} diff --git a/Content.Shared/Pulling/Systems/SharedPullerSystem.cs b/Content.Shared/Pulling/Systems/SharedPullerSystem.cs new file mode 100644 index 00000000000..e388d7a57c6 --- /dev/null +++ b/Content.Shared/Pulling/Systems/SharedPullerSystem.cs @@ -0,0 +1,90 @@ +using Content.Shared.Administration.Logs; +using Content.Shared.Alert; +using Content.Shared.Database; +using Content.Shared.Hands; +using Content.Shared.Movement.Systems; +using Content.Shared.Physics.Pull; +using Content.Shared.Pulling.Components; +using JetBrains.Annotations; + +namespace Content.Shared.Pulling.Systems +{ + [UsedImplicitly] + public sealed class SharedPullerSystem : EntitySystem + { + [Dependency] private readonly SharedPullingStateManagementSystem _why = default!; + [Dependency] private readonly SharedPullingSystem _pullSystem = default!; + [Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifierSystem = default!; + [Dependency] private readonly AlertsSystem _alertsSystem = default!; + [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(PullerHandlePullStarted); + SubscribeLocalEvent(PullerHandlePullStopped); + SubscribeLocalEvent(OnVirtualItemDeleted); + SubscribeLocalEvent(OnRefreshMovespeed); + SubscribeLocalEvent(OnPullerShutdown); + } + + private void OnPullerShutdown(EntityUid uid, SharedPullerComponent component, ComponentShutdown args) + { + _why.ForceDisconnectPuller(component); + } + + private void OnVirtualItemDeleted(EntityUid uid, SharedPullerComponent component, VirtualItemDeletedEvent args) + { + if (component.Pulling == null) + return; + + if (component.Pulling == args.BlockingEntity) + { + if (EntityManager.TryGetComponent(args.BlockingEntity, out var comp)) + { + _pullSystem.TryStopPull(comp, uid); + } + } + } + + private void PullerHandlePullStarted( + EntityUid uid, + SharedPullerComponent component, + PullStartedMessage args) + { + if (args.Puller.Owner != uid) + return; + + _alertsSystem.ShowAlert(component.Owner, AlertType.Pulling); + + RefreshMovementSpeed(component); + } + + private void PullerHandlePullStopped( + EntityUid uid, + SharedPullerComponent component, + PullStoppedMessage args) + { + if (args.Puller.Owner != uid) + return; + + var euid = component.Owner; + if (_alertsSystem.IsShowingAlert(euid, AlertType.Pulling)) + _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(euid):user} stopped pulling {ToPrettyString(args.Pulled.Owner):target}"); + _alertsSystem.ClearAlert(euid, AlertType.Pulling); + + RefreshMovementSpeed(component); + } + + private void OnRefreshMovespeed(EntityUid uid, SharedPullerComponent component, RefreshMovementSpeedModifiersEvent args) + { + args.ModifySpeed(component.WalkSpeedModifier, component.SprintSpeedModifier); + } + + private void RefreshMovementSpeed(SharedPullerComponent component) + { + _movementSpeedModifierSystem.RefreshMovementSpeedModifiers(component.Owner); + } + } +} diff --git a/Content.Shared/Pulling/Systems/SharedPullingStateManagementSystem.cs b/Content.Shared/Pulling/Systems/SharedPullingStateManagementSystem.cs new file mode 100644 index 00000000000..38ed8998898 --- /dev/null +++ b/Content.Shared/Pulling/Systems/SharedPullingStateManagementSystem.cs @@ -0,0 +1,196 @@ +using Content.Shared.Physics.Pull; +using Content.Shared.Pulling.Components; +using JetBrains.Annotations; +using Robust.Shared.Map; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Components; +using Robust.Shared.Physics.Systems; +using Robust.Shared.Timing; + +namespace Content.Shared.Pulling +{ + /// + /// This is the core of pulling state management. + /// Because pulling state is such a mess to get right, all writes to pulling state must go through this class. + /// + [UsedImplicitly] + public sealed class SharedPullingStateManagementSystem : EntitySystem + { + [Dependency] private readonly SharedJointSystem _jointSystem = default!; + [Dependency] private readonly SharedPhysicsSystem _physics = default!; + [Dependency] private readonly IGameTiming _timing = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnShutdown); + } + + private void OnShutdown(EntityUid uid, SharedPullableComponent component, ComponentShutdown args) + { + if (component.Puller != null) + ForceRelationship(null, component); + } + + // A WARNING: + // The following 2 functions are the most internal part of the pulling system's relationship management. + // They do not expect to be cancellable. + private void ForceDisconnect(SharedPullerComponent puller, SharedPullableComponent pullable) + { + var pullerPhysics = EntityManager.GetComponent(puller.Owner); + var pullablePhysics = EntityManager.GetComponent(pullable.Owner); + + // MovingTo shutdown + ForceSetMovingTo(pullable, null); + + // Joint shutdown + if (!_timing.ApplyingState && // During state-handling, joint component will handle its own state. + pullable.PullJointId != null && + TryComp(puller.Owner, out JointComponent? jointComp)) + { + if (jointComp.GetJoints.TryGetValue(pullable.PullJointId, out var j)) + _jointSystem.RemoveJoint(j); + } + pullable.PullJointId = null; + + // State shutdown + puller.Pulling = null; + pullable.Puller = null; + + // Messaging + var message = new PullStoppedMessage(pullerPhysics, pullablePhysics); + + RaiseLocalEvent(puller.Owner, message, broadcast: false); + + if (Initialized(pullable.Owner)) + RaiseLocalEvent(pullable.Owner, message, true); + + // Networking + Dirty(puller); + Dirty(pullable); + } + + public void ForceRelationship(SharedPullerComponent? puller, SharedPullableComponent? pullable) + { + if (_timing.ApplyingState) + return; + ; + if (pullable != null && puller != null && (puller.Pulling == pullable.Owner)) + { + // Already done + return; + } + + // Start by disconnecting the pullable from whatever it is currently connected to. + var pullableOldPullerE = pullable?.Puller; + if (pullableOldPullerE != null) + { + ForceDisconnect(EntityManager.GetComponent(pullableOldPullerE.Value), pullable!); + } + + // Continue with the puller. + var pullerOldPullableE = puller?.Pulling; + if (pullerOldPullableE != null) + { + ForceDisconnect(puller!, EntityManager.GetComponent(pullerOldPullableE.Value)); + } + + // And now for the actual connection (if any). + + if (puller != null && pullable != null) + { + var pullerPhysics = EntityManager.GetComponent(puller.Owner); + var pullablePhysics = EntityManager.GetComponent(pullable.Owner); + pullable.PullJointId = $"pull-joint-{pullable.Owner}"; + + // State startup + puller.Pulling = pullable.Owner; + pullable.Puller = puller.Owner; + + // joint state handling will manage its own state + if (!_timing.ApplyingState) + { + // Joint startup + var union = _physics.GetHardAABB(puller.Owner).Union(_physics.GetHardAABB(pullable.Owner, body: pullablePhysics)); + var length = Math.Max(union.Size.X, union.Size.Y) * 0.75f; + + var joint = _jointSystem.CreateDistanceJoint(pullablePhysics.Owner, pullerPhysics.Owner, id: pullable.PullJointId); + joint.CollideConnected = false; + // This maximum has to be there because if the object is constrained too closely, the clamping goes backwards and asserts. + joint.MaxLength = Math.Max(1.0f, length); + joint.Length = length * 0.75f; + joint.MinLength = 0f; + joint.Stiffness = 1f; + } + + // Messaging + var message = new PullStartedMessage(pullerPhysics, pullablePhysics); + + RaiseLocalEvent(puller.Owner, message, broadcast: false); + RaiseLocalEvent(pullable.Owner, message, true); + + // Networking + Dirty(puller); + Dirty(pullable); + } + } + + // For OnRemove use only. + public void ForceDisconnectPuller(SharedPullerComponent puller) + { + // DO NOT ADD ADDITIONAL LOGIC IN THIS FUNCTION. Do it in ForceRelationship. + ForceRelationship(puller, null); + } + + // For OnRemove use only. + public void ForceDisconnectPullable(SharedPullableComponent pullable) + { + // DO NOT ADD ADDITIONAL LOGIC IN THIS FUNCTION. Do it in ForceRelationship. + ForceRelationship(null, pullable); + } + + public void ForceSetMovingTo(SharedPullableComponent pullable, EntityCoordinates? movingTo) + { + if (_timing.ApplyingState) + return; + + if (pullable.MovingTo == movingTo) + { + return; + } + + // Don't allow setting a MovingTo if there's no puller. + // The other half of this guarantee (shutting down a MovingTo if the puller goes away) is enforced in ForceRelationship. + if (pullable.Puller == null && movingTo != null) + { + return; + } + + pullable.MovingTo = movingTo; + Dirty(pullable); + + if (movingTo == null) + { + RaiseLocalEvent(pullable.Owner, new PullableStopMovingMessage(), true); + } + else + { + RaiseLocalEvent(pullable.Owner, new PullableMoveMessage(), true); + } + } + + /// + /// Changes if the entity needs a hand in order to be able to pull objects. + /// + public void ChangeHandRequirement(EntityUid uid, bool needsHands, SharedPullerComponent? comp) + { + if (!Resolve(uid, ref comp, false)) + return; + + comp.NeedsHands = needsHands; + + Dirty(uid, comp); + } + } +} diff --git a/Content.Shared/Pulling/Systems/SharedPullingSystem.Actions.cs b/Content.Shared/Pulling/Systems/SharedPullingSystem.Actions.cs new file mode 100644 index 00000000000..1e2bb90c61e --- /dev/null +++ b/Content.Shared/Pulling/Systems/SharedPullingSystem.Actions.cs @@ -0,0 +1,239 @@ +using Content.Shared.ActionBlocker; +using Content.Shared.Administration.Logs; +using Content.Shared.Buckle.Components; +using Content.Shared.Database; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.Interaction; +using Content.Shared.Physics.Pull; +using Content.Shared.Pulling.Components; +using Content.Shared.Pulling.Events; +using Robust.Shared.Containers; +using Robust.Shared.Map; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Components; +using Robust.Shared.Physics.Systems; +using Robust.Shared.Timing; +using Robust.Shared.Utility; + +namespace Content.Shared.Pulling +{ + public abstract partial class SharedPullingSystem + { + [Dependency] private readonly ActionBlockerSystem _blocker = default!; + [Dependency] private readonly SharedContainerSystem _containerSystem = default!; + [Dependency] private readonly SharedHandsSystem _handsSystem = default!; + [Dependency] private readonly SharedInteractionSystem _interaction = default!; + [Dependency] private readonly SharedPhysicsSystem _physics = default!; + [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + [Dependency] private readonly IGameTiming _timing = default!; + + public bool CanPull(EntityUid puller, EntityUid pulled) + { + if (!EntityManager.TryGetComponent(puller, out var comp)) + { + return false; + } + + if (comp.NeedsHands && !_handsSystem.TryGetEmptyHand(puller, out _)) + { + return false; + } + + if (!_blocker.CanInteract(puller, pulled)) + { + return false; + } + + if (!EntityManager.TryGetComponent(pulled, out var physics)) + { + return false; + } + + if (physics.BodyType == BodyType.Static) + { + return false; + } + + if (puller == pulled) + { + return false; + } + + if(_containerSystem.IsEntityInContainer(puller) || _containerSystem.IsEntityInContainer(pulled)) + { + return false; + } + + if (EntityManager.TryGetComponent(puller, out BuckleComponent? buckle)) + { + // Prevent people pulling the chair they're on, etc. + if (buckle is { PullStrap: false, Buckled: true } && (buckle.LastEntityBuckledTo == pulled)) + { + return false; + } + } + + var getPulled = new BeingPulledAttemptEvent(puller, pulled); + RaiseLocalEvent(pulled, getPulled, true); + var startPull = new StartPullAttemptEvent(puller, pulled); + RaiseLocalEvent(puller, startPull, true); + return (!startPull.Cancelled && !getPulled.Cancelled); + } + + public bool TogglePull(EntityUid puller, SharedPullableComponent pullable) + { + if (pullable.Puller == puller) + { + return TryStopPull(pullable); + } + return TryStartPull(puller, pullable.Owner); + } + + // -- Core attempted actions -- + + public bool TryStopPull(SharedPullableComponent pullable, EntityUid? user = null) + { + if (_timing.ApplyingState) + return false; + + if (!pullable.BeingPulled) + { + return false; + } + + var msg = new StopPullingEvent(user); + RaiseLocalEvent(pullable.Owner, msg, true); + + if (msg.Cancelled) return false; + + // Stop pulling confirmed! + + if (TryComp(pullable.Owner, out var pullablePhysics)) + { + _physics.SetFixedRotation(pullable.Owner, pullable.PrevFixedRotation, body: pullablePhysics); + } + + _pullSm.ForceRelationship(null, pullable); + return true; + } + + public bool TryStartPull(EntityUid puller, EntityUid pullable) + { + if (!EntityManager.TryGetComponent(puller, out SharedPullerComponent? pullerComp)) + { + return false; + } + if (!EntityManager.TryGetComponent(pullable, out SharedPullableComponent? pullableComp)) + { + return false; + } + return TryStartPull(pullerComp, pullableComp); + } + + // The main "start pulling" function. + public bool TryStartPull(SharedPullerComponent puller, SharedPullableComponent pullable) + { + if (_timing.ApplyingState) + return false; + + if (puller.Pulling == pullable.Owner) + return true; + + // Pulling a new object : Perform sanity checks. + + if (!CanPull(puller.Owner, pullable.Owner)) + { + return false; + } + + if (!EntityManager.TryGetComponent(puller.Owner, out var pullerPhysics)) + { + return false; + } + + if (!EntityManager.TryGetComponent(pullable.Owner, out var pullablePhysics)) + { + return false; + } + + // Ensure that the puller is not currently pulling anything. + // If this isn't done, then it happens too late, and the start/stop messages go out of order, + // and next thing you know it thinks it's not pulling anything even though it is! + + var oldPullable = puller.Pulling; + if (oldPullable != null) + { + if (EntityManager.TryGetComponent(oldPullable.Value, out SharedPullableComponent? oldPullableComp)) + { + if (!TryStopPull(oldPullableComp)) + { + return false; + } + } + else + { + Log.Warning("Well now you've done it, haven't you? Someone transferred pulling (onto {0}) while presently pulling something that has no Pullable component (on {1})!", pullable.Owner, oldPullable); + return false; + } + } + + // Ensure that the pullable is not currently being pulled. + // Same sort of reasons as before. + + var oldPuller = pullable.Puller; + if (oldPuller != null) + { + if (!TryStopPull(pullable)) + { + return false; + } + } + + // Continue with pulling process. + + var pullAttempt = new PullAttemptEvent(pullerPhysics, pullablePhysics); + + RaiseLocalEvent(puller.Owner, pullAttempt, broadcast: false); + + if (pullAttempt.Cancelled) + { + return false; + } + + RaiseLocalEvent(pullable.Owner, pullAttempt, true); + + if (pullAttempt.Cancelled) + return false; + + _interaction.DoContactInteraction(pullable.Owner, puller.Owner); + + _pullSm.ForceRelationship(puller, pullable); + pullable.PrevFixedRotation = pullablePhysics.FixedRotation; + _physics.SetFixedRotation(pullable.Owner, pullable.FixedRotationOnPull, body: pullablePhysics); + _adminLogger.Add(LogType.Action, LogImpact.Low, + $"{ToPrettyString(puller.Owner):user} started pulling {ToPrettyString(pullable.Owner):target}"); + return true; + } + + public bool TryMoveTo(SharedPullableComponent pullable, EntityCoordinates to) + { + if (pullable.Puller == null) + { + return false; + } + + if (!EntityManager.HasComponent(pullable.Owner)) + { + return false; + } + + _pullSm.ForceSetMovingTo(pullable, to); + return true; + } + + public void StopMoveTo(SharedPullableComponent pullable) + { + _pullSm.ForceSetMovingTo(pullable, null); + } + } +} diff --git a/Content.Shared/Pulling/Systems/SharedPullingSystem.cs b/Content.Shared/Pulling/Systems/SharedPullingSystem.cs new file mode 100644 index 00000000000..0c139ee9e35 --- /dev/null +++ b/Content.Shared/Pulling/Systems/SharedPullingSystem.cs @@ -0,0 +1,243 @@ +using System.Diagnostics.CodeAnalysis; +using Content.Shared.Alert; +using Content.Shared.GameTicking; +using Content.Shared.Input; +using Content.Shared.Physics.Pull; +using Content.Shared.Pulling.Components; +using Content.Shared.Verbs; +using JetBrains.Annotations; +using Robust.Shared.Containers; +using Robust.Shared.Input.Binding; +using Robust.Shared.Map; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Events; +using Robust.Shared.Physics.Systems; +using Robust.Shared.Player; + +namespace Content.Shared.Pulling +{ + [UsedImplicitly] + public abstract partial class SharedPullingSystem : EntitySystem + { + [Dependency] private readonly SharedPullingStateManagementSystem _pullSm = default!; + [Dependency] private readonly AlertsSystem _alertsSystem = default!; + [Dependency] private readonly SharedJointSystem _joints = default!; + + /// + /// A mapping of pullers to the entity that they are pulling. + /// + private readonly Dictionary _pullers = + new(); + + private readonly HashSet _moving = new(); + private readonly HashSet _stoppedMoving = new(); + + public IReadOnlySet Moving => _moving; + + public override void Initialize() + { + base.Initialize(); + + UpdatesOutsidePrediction = true; + + SubscribeLocalEvent(Reset); + SubscribeLocalEvent(OnPullStarted); + SubscribeLocalEvent(OnPullStopped); + SubscribeLocalEvent(HandleContainerInsert); + SubscribeLocalEvent(OnJointRemoved); + SubscribeLocalEvent(OnPullableCollisionChange); + + SubscribeLocalEvent(PullableHandlePullStarted); + SubscribeLocalEvent(PullableHandlePullStopped); + + SubscribeLocalEvent>(AddPullVerbs); + + CommandBinds.Builder + .Bind(ContentKeyFunctions.MovePulledObject, new PointerInputCmdHandler(HandleMovePulledObject)) + .Register(); + } + + private void OnPullableCollisionChange(EntityUid uid, SharedPullableComponent component, ref CollisionChangeEvent args) + { + if (component.PullJointId != null && !args.CanCollide) + { + _joints.RemoveJoint(uid, component.PullJointId); + } + } + + private void OnJointRemoved(EntityUid uid, SharedPullableComponent component, JointRemovedEvent args) + { + if (component.Puller != args.OtherEntity) + return; + + // Do we have some other join with our Puller? + // or alternatively: + // TODO track the relevant joint. + + if (TryComp(uid, out JointComponent? joints)) + { + foreach (var jt in joints.GetJoints.Values) + { + if (jt.BodyAUid == component.Puller || jt.BodyBUid == component.Puller) + return; + } + } + + // No more joints with puller -> force stop pull. + _pullSm.ForceDisconnectPullable(component); + } + + private void AddPullVerbs(EntityUid uid, SharedPullableComponent component, GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract) + return; + + // Are they trying to pull themselves up by their bootstraps? + if (args.User == args.Target) + return; + + //TODO VERB ICONS add pulling icon + if (component.Puller == args.User) + { + Verb verb = new() + { + Text = Loc.GetString("pulling-verb-get-data-text-stop-pulling"), + Act = () => TryStopPull(component, args.User), + DoContactInteraction = false // pulling handle its own contact interaction. + }; + args.Verbs.Add(verb); + } + else if (CanPull(args.User, args.Target)) + { + Verb verb = new() + { + Text = Loc.GetString("pulling-verb-get-data-text"), + Act = () => TryStartPull(args.User, args.Target), + DoContactInteraction = false // pulling handle its own contact interaction. + }; + args.Verbs.Add(verb); + } + } + + // Raise a "you are being pulled" alert if the pulled entity has alerts. + private void PullableHandlePullStarted(EntityUid uid, SharedPullableComponent component, PullStartedMessage args) + { + if (args.Pulled.Owner != uid) + return; + + _alertsSystem.ShowAlert(uid, AlertType.Pulled); + } + + private void PullableHandlePullStopped(EntityUid uid, SharedPullableComponent component, PullStoppedMessage args) + { + if (args.Pulled.Owner != uid) + return; + + _alertsSystem.ClearAlert(uid, AlertType.Pulled); + } + + public bool IsPulled(EntityUid uid, SharedPullableComponent? component = null) + { + return Resolve(uid, ref component, false) && component.BeingPulled; + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + _moving.ExceptWith(_stoppedMoving); + _stoppedMoving.Clear(); + } + + public void Reset(RoundRestartCleanupEvent ev) + { + _pullers.Clear(); + _moving.Clear(); + _stoppedMoving.Clear(); + } + + private void OnPullStarted(PullStartedMessage message) + { + SetPuller(message.Puller.Owner, message.Pulled.Owner); + } + + private void OnPullStopped(PullStoppedMessage message) + { + RemovePuller(message.Puller.Owner); + } + + protected void OnPullableMove(EntityUid uid, SharedPullableComponent component, PullableMoveMessage args) + { + _moving.Add(component); + } + + protected void OnPullableStopMove(EntityUid uid, SharedPullableComponent component, PullableStopMovingMessage args) + { + _stoppedMoving.Add(component); + } + + // TODO: When Joint networking is less shitcodey fix this to use a dedicated joints message. + private void HandleContainerInsert(EntInsertedIntoContainerMessage message) + { + if (TryComp(message.Entity, out SharedPullableComponent? pullable)) + { + TryStopPull(pullable); + } + + if (TryComp(message.Entity, out SharedPullerComponent? puller)) + { + if (puller.Pulling == null) return; + + if (!TryComp(puller.Pulling.Value, out SharedPullableComponent? pulling)) + return; + + TryStopPull(pulling); + } + } + + private bool HandleMovePulledObject(ICommonSession? session, EntityCoordinates coords, EntityUid uid) + { + if (session?.AttachedEntity is not { } player || + !player.IsValid()) + return false; + + if (!TryGetPulled(player, out var pulled)) + return false; + + if (!TryComp(pulled.Value, out SharedPullableComponent? pullable)) + return false; + + if (_containerSystem.IsEntityInContainer(player)) + return false; + + TryMoveTo(pullable, coords); + + return false; + } + + private void SetPuller(EntityUid puller, EntityUid pulled) + { + _pullers[puller] = pulled; + } + + private bool RemovePuller(EntityUid puller) + { + return _pullers.Remove(puller); + } + + public EntityUid GetPulled(EntityUid by) + { + return _pullers.GetValueOrDefault(by); + } + + public bool TryGetPulled(EntityUid by, [NotNullWhen(true)] out EntityUid? pulled) + { + return (pulled = GetPulled(by)) != null; + } + + public bool IsPulling(EntityUid puller) + { + return _pullers.ContainsKey(puller); + } + } +} diff --git a/Content.Shared/Security/Systems/DeployableBarrierSystem.cs b/Content.Shared/Security/Systems/DeployableBarrierSystem.cs index 953120596cb..9d021c52194 100644 --- a/Content.Shared/Security/Systems/DeployableBarrierSystem.cs +++ b/Content.Shared/Security/Systems/DeployableBarrierSystem.cs @@ -1,6 +1,6 @@ using Content.Shared.Lock; -using Content.Shared.Movement.Pulling.Components; -using Content.Shared.Movement.Pulling.Systems; +using Content.Shared.Pulling; +using Content.Shared.Pulling.Components; using Content.Shared.Security.Components; using Robust.Shared.Physics.Systems; @@ -12,7 +12,7 @@ public sealed class DeployableBarrierSystem : EntitySystem [Dependency] private readonly FixtureSystem _fixtures = default!; [Dependency] private readonly SharedPointLightSystem _pointLight = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; - [Dependency] private readonly PullingSystem _pulling = default!; + [Dependency] private readonly SharedPullingSystem _pulling = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; public override void Initialize() @@ -58,8 +58,8 @@ private void ToggleBarrierDeploy(EntityUid uid, bool isDeployed, DeployableBarri var state = isDeployed ? DeployableBarrierState.Deployed : DeployableBarrierState.Idle; _appearance.SetData(uid, DeployableBarrierVisuals.State, state); - if (TryComp(uid, out PullableComponent? pullable)) - _pulling.TryStopPull(uid, pullable); + if (TryComp(uid, out SharedPullableComponent? pullable)) + _pulling.TryStopPull(pullable); SharedPointLightComponent? pointLight = null; if (_pointLight.ResolveLight(uid, ref pointLight)) diff --git a/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs b/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs index 8d67aec518a..ebd83624114 100644 --- a/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs +++ b/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs @@ -1,9 +1,9 @@ using System.Linq; using Content.Shared.Ghost; -using Content.Shared.Movement.Pulling.Components; -using Content.Shared.Movement.Pulling.Systems; using Content.Shared.Popups; using Content.Shared.Projectiles; +using Content.Shared.Pulling; +using Content.Shared.Pulling.Components; using Content.Shared.Teleportation.Components; using Content.Shared.Verbs; using Robust.Shared.Audio; @@ -28,7 +28,7 @@ public abstract class SharedPortalSystem : EntitySystem [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; - [Dependency] private readonly PullingSystem _pulling = default!; + [Dependency] private readonly SharedPullingSystem _pulling = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; private const string PortalFixture = "portalFixture"; @@ -93,15 +93,15 @@ private void OnCollide(EntityUid uid, PortalComponent component, ref StartCollid return; // break pulls before portal enter so we dont break shit - if (TryComp(subject, out var pullable) && pullable.BeingPulled) + if (TryComp(subject, out var pullable) && pullable.BeingPulled) { - _pulling.TryStopPull(subject, pullable); + _pulling.TryStopPull(pullable); } - if (TryComp(subject, out var pullerComp) - && TryComp(pullerComp.Pulling, out var subjectPulling)) + if (TryComp(subject, out var pulling) + && pulling.Pulling != null && TryComp(pulling.Pulling.Value, out var subjectPulling)) { - _pulling.TryStopPull(subject, subjectPulling); + _pulling.TryStopPull(subjectPulling); } // if they came from another portal, just return and wait for them to exit the portal diff --git a/Content.Shared/Throwing/ThrowingSystem.cs b/Content.Shared/Throwing/ThrowingSystem.cs index 7c861a85adb..54294318315 100644 --- a/Content.Shared/Throwing/ThrowingSystem.cs +++ b/Content.Shared/Throwing/ThrowingSystem.cs @@ -20,11 +20,6 @@ public sealed class ThrowingSystem : EntitySystem { public const float ThrowAngularImpulse = 5f; - /// - /// Speed cap on rotation in case of click-spam. - /// - public const float ThrowAngularCap = 3f * MathF.PI; - public const float PushbackDefault = 2f; /// @@ -47,17 +42,15 @@ public void TryThrow( float strength = 1.0f, EntityUid? user = null, float pushbackRatio = PushbackDefault, - bool recoil = true, - bool animated = true, bool playSound = true) { - var thrownPos = _transform.GetMapCoordinates(uid); - var mapPos = _transform.ToMapCoordinates(coordinates); + var thrownPos = Transform(uid).MapPosition; + var mapPos = coordinates.ToMap(EntityManager, _transform); if (mapPos.MapId != thrownPos.MapId) return; - TryThrow(uid, mapPos.Position - thrownPos.Position, strength, user, pushbackRatio, recoil: recoil, animated: animated, playSound: playSound); + TryThrow(uid, mapPos.Position - thrownPos.Position, strength, user, pushbackRatio, playSound); } /// @@ -72,8 +65,6 @@ public void TryThrow(EntityUid uid, float strength = 1.0f, EntityUid? user = null, float pushbackRatio = PushbackDefault, - bool recoil = true, - bool animated = true, bool playSound = true) { var physicsQuery = GetEntityQuery(); @@ -81,6 +72,7 @@ public void TryThrow(EntityUid uid, return; var projectileQuery = GetEntityQuery(); + var tagQuery = GetEntityQuery(); TryThrow( uid, @@ -90,7 +82,8 @@ public void TryThrow(EntityUid uid, projectileQuery, strength, user, - pushbackRatio, recoil: recoil, animated: animated, playSound: playSound); + pushbackRatio, + playSound); } /// @@ -108,8 +101,6 @@ public void TryThrow(EntityUid uid, float strength = 1.0f, EntityUid? user = null, float pushbackRatio = PushbackDefault, - bool recoil = true, - bool animated = true, bool playSound = true) { if (strength <= 0 || direction == Vector2Helpers.Infinity || direction == Vector2Helpers.NaN || direction == Vector2.Zero) @@ -125,17 +116,12 @@ public void TryThrow(EntityUid uid, if (projectileQuery.TryGetComponent(uid, out var proj) && !proj.OnlyCollideWhenShot) return; - var comp = new ThrownItemComponent - { - Thrower = user, - Animate = animated, - }; + var comp = new ThrownItemComponent(); + comp.Thrower = user; // Estimate time to arrival so we can apply OnGround status and slow it much faster. var time = direction.Length() / strength; comp.ThrownTime = _gameTiming.CurTime; - // TODO: This is a bandaid, don't do this. - // if you want to force landtime have the caller handle it or add a new method. // did we launch this with something stronger than our hands? if (TryComp(comp.Thrower, out var hands) && strength > hands.ThrowForceMultiplier) comp.LandTime = comp.ThrownTime + TimeSpan.FromSeconds(time); @@ -180,8 +166,7 @@ public void TryThrow(EntityUid uid, if (user == null) return; - if (recoil) - _recoil.KickCamera(user.Value, -direction * 0.04f); + _recoil.KickCamera(user.Value, -direction * 0.04f); // Give thrower an impulse in the other direction if (pushbackRatio != 0.0f && diff --git a/Content.Shared/Throwing/ThrownItemComponent.cs b/Content.Shared/Throwing/ThrownItemComponent.cs index 8fb1173e6da..ab80e079383 100644 --- a/Content.Shared/Throwing/ThrownItemComponent.cs +++ b/Content.Shared/Throwing/ThrownItemComponent.cs @@ -8,12 +8,6 @@ namespace Content.Shared.Throwing [RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] public sealed partial class ThrownItemComponent : Component { - /// - /// Should the in-air throwing animation play. - /// - [DataField, AutoNetworkedField] - public bool Animate = true; - /// /// The entity that threw this entity. /// diff --git a/Content.Shared/Throwing/ThrownItemSystem.cs b/Content.Shared/Throwing/ThrownItemSystem.cs index e6f7b3779b2..0e5817ff92c 100644 --- a/Content.Shared/Throwing/ThrownItemSystem.cs +++ b/Content.Shared/Throwing/ThrownItemSystem.cs @@ -3,7 +3,8 @@ using Content.Shared.Database; using Content.Shared.Gravity; using Content.Shared.Physics; -using Content.Shared.Movement.Pulling.Events; +using Content.Shared.Physics.Pull; +using Robust.Shared.GameStates; using Robust.Shared.Physics; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Events; @@ -93,8 +94,8 @@ private void OnSleep(EntityUid uid, ThrownItemComponent thrownItem, ref PhysicsS private void HandlePullStarted(PullStartedMessage message) { // TODO: this isn't directed so things have to be done the bad way - if (EntityManager.TryGetComponent(message.PulledUid, out ThrownItemComponent? thrownItemComponent)) - StopThrow(message.PulledUid, thrownItemComponent); + if (EntityManager.TryGetComponent(message.Pulled.Owner, out ThrownItemComponent? thrownItemComponent)) + StopThrow(message.Pulled.Owner, thrownItemComponent); } public void StopThrow(EntityUid uid, ThrownItemComponent thrownItemComponent) From 2675d7bd0630c8da9057cf5b9e9dfc169816de43 Mon Sep 17 00:00:00 2001 From: keronshb <54602815+keronshb@users.noreply.github.com> Date: Sat, 3 Feb 2024 19:48:51 -0500 Subject: [PATCH 211/266] Adds a refund button & action upgrades for stores (#24518) * adds refunds to stores * Adds method to check for starting map * comments, datafields, some requested changes * turns event into ref event * Adds datafields * Switches to entity terminating event * Changes store entity to be nullable and checks if store is terminating to remove reference. * Tryadd instead of containskey * Adds a refund disable method, disables refund on bought ent container changes if not an action * Removes datafield specification * Readds missing using statement * Removes unused using statements * What the heck is listing data --------- Co-authored-by: metalgearsloth (cherry picked from commit 257909fd97c05bfde837a76afe5c5c612afc9f28) --- .../Store/Ui/StoreBoundUserInterface.cs | 6 + Content.Client/Store/Ui/StoreMenu.xaml | 5 + Content.Client/Store/Ui/StoreMenu.xaml.cs | 13 ++ .../Store/Components/StoreComponent.cs | 39 +++++ Content.Server/Store/StoreRefundComponent.cs | 13 ++ .../Store/Systems/StoreSystem.Refund.cs | 56 +++++++ .../Store/Systems/StoreSystem.Ui.cs | 158 +++++++++++++++++- Content.Server/Store/Systems/StoreSystem.cs | 2 + Content.Shared/Store/ListingPrototype.cs | 18 ++ Content.Shared/Store/StoreUi.cs | 14 +- 10 files changed, 318 insertions(+), 6 deletions(-) create mode 100644 Content.Server/Store/StoreRefundComponent.cs create mode 100644 Content.Server/Store/Systems/StoreSystem.Refund.cs diff --git a/Content.Client/Store/Ui/StoreBoundUserInterface.cs b/Content.Client/Store/Ui/StoreBoundUserInterface.cs index 6774ef35a02..b549918d7c4 100644 --- a/Content.Client/Store/Ui/StoreBoundUserInterface.cs +++ b/Content.Client/Store/Ui/StoreBoundUserInterface.cs @@ -48,6 +48,11 @@ protected override void Open() { SendMessage(new StoreRequestUpdateInterfaceMessage()); }; + + _menu.OnRefundAttempt += (_) => + { + SendMessage(new StoreRequestRefundMessage()); + }; } protected override void UpdateState(BoundUserInterfaceState state) { @@ -64,6 +69,7 @@ protected override void UpdateState(BoundUserInterfaceState state) _menu.UpdateListing(msg.Listings.ToList()); _menu.SetFooterVisibility(msg.ShowFooter); + _menu.UpdateRefund(msg.AllowRefund); break; case StoreInitializeState msg: _windowName = msg.Name; diff --git a/Content.Client/Store/Ui/StoreMenu.xaml b/Content.Client/Store/Ui/StoreMenu.xaml index a454e3e2b7f..4b38352a44a 100644 --- a/Content.Client/Store/Ui/StoreMenu.xaml +++ b/Content.Client/Store/Ui/StoreMenu.xaml @@ -22,6 +22,11 @@ MinWidth="64" HorizontalAlignment="Right" Text="{Loc 'store-ui-default-withdraw-text'}" /> + [ByRefEvent] -public readonly record struct ItemMaskToggledEvent(EntityUid Wearer, bool IsToggled, bool IsEquip); +public readonly record struct ItemMaskToggledEvent(EntityUid Wearer, string? equippedPrefix, bool IsToggled, bool IsEquip); /// /// Event raised on the entity wearing the mask when it is toggled. diff --git a/Content.Shared/Clothing/Components/FoldableClothingComponent.cs b/Content.Shared/Clothing/Components/FoldableClothingComponent.cs new file mode 100644 index 00000000000..61237b22834 --- /dev/null +++ b/Content.Shared/Clothing/Components/FoldableClothingComponent.cs @@ -0,0 +1,20 @@ +using Content.Shared.Inventory; +using Robust.Shared.GameStates; + +namespace Content.Shared.Clothing.Components; + +[RegisterComponent, NetworkedComponent] +public sealed partial class FoldableClothingComponent : Component +{ + /// + /// Which slots does this fit into when folded? + /// + [DataField] + public SlotFlags? FoldedSlots; + + /// + /// Which slots does this fit into when unfolded? + /// + [DataField] + public SlotFlags? UnfoldedSlots; +} diff --git a/Content.Shared/Clothing/Components/MaskComponent.cs b/Content.Shared/Clothing/Components/MaskComponent.cs index e645524da73..5430417a8cd 100644 --- a/Content.Shared/Clothing/Components/MaskComponent.cs +++ b/Content.Shared/Clothing/Components/MaskComponent.cs @@ -1,4 +1,4 @@ -using Content.Shared.Clothing.EntitySystems; +using Content.Shared.Clothing.EntitySystems; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; @@ -19,4 +19,7 @@ public sealed partial class MaskComponent : Component [DataField, AutoNetworkedField] public bool IsToggled; + + [DataField, AutoNetworkedField] + public string EquippedPrefix = "toggled"; } diff --git a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs index 92e31cfd8ea..154171fc054 100644 --- a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs @@ -113,7 +113,8 @@ private void OnHandleState(EntityUid uid, ClothingComponent component, ref Compo private void OnMaskToggled(Entity ent, ref ItemMaskToggledEvent args) { //TODO: sprites for 'pulled down' state. defaults to invisible due to no sprite with this prefix - SetEquippedPrefix(ent, args.IsToggled ? "toggled" : null, ent); + if(args.equippedPrefix != null) + SetEquippedPrefix(ent, args.IsToggled ? args.equippedPrefix : null, ent); } private void OnEquipDoAfter(Entity ent, ref ClothingEquipDoAfterEvent args) diff --git a/Content.Shared/Clothing/EntitySystems/FoldableClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/FoldableClothingSystem.cs new file mode 100644 index 00000000000..d0611c5851c --- /dev/null +++ b/Content.Shared/Clothing/EntitySystems/FoldableClothingSystem.cs @@ -0,0 +1,42 @@ +using Content.Shared.Clothing.Components; +using Content.Shared.Foldable; +using Content.Shared.Inventory; + +namespace Content.Shared.Clothing.EntitySystems; + +public sealed class FoldableClothingSystem : EntitySystem +{ + [Dependency] private readonly ClothingSystem _clothingSystem = default!; + [Dependency] private readonly InventorySystem _inventorySystem = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnFoldAttempt); + SubscribeLocalEvent(OnFolded); + } + + private void OnFoldAttempt(Entity ent, ref FoldAttemptEvent args) + { + if (args.Cancelled) + return; + + // allow folding while equipped if allowed slots are the same: + // e.g. flip a hat backwards while on your head + if (_inventorySystem.TryGetContainingSlot(ent.Owner, out var slot) && + !ent.Comp.FoldedSlots.Equals(ent.Comp.UnfoldedSlots)) + args.Cancelled = true; + } + + private void OnFolded(Entity ent, ref FoldedEvent args) + { + if (TryComp(ent.Owner, out var clothingComp)) + { + if (args.IsFolded && ent.Comp.FoldedSlots.HasValue) + _clothingSystem.SetSlots(ent.Owner, ent.Comp.FoldedSlots.Value, clothingComp); + else if (!args.IsFolded && ent.Comp.UnfoldedSlots.HasValue) + _clothingSystem.SetSlots(ent.Owner, ent.Comp.UnfoldedSlots.Value, clothingComp); + } + } +} diff --git a/Content.Shared/Clothing/EntitySystems/MaskSystem.cs b/Content.Shared/Clothing/EntitySystems/MaskSystem.cs index 2bbcad4bc4d..aab2a172dc1 100644 --- a/Content.Shared/Clothing/EntitySystems/MaskSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/MaskSystem.cs @@ -1,7 +1,9 @@ using Content.Shared.Actions; using Content.Shared.Clothing.Components; +using Content.Shared.Foldable; using Content.Shared.Inventory; using Content.Shared.Inventory.Events; +using Content.Shared.Item; using Content.Shared.Popups; using Robust.Shared.Timing; @@ -21,11 +23,12 @@ public override void Initialize() SubscribeLocalEvent(OnToggleMask); SubscribeLocalEvent(OnGetActions); SubscribeLocalEvent(OnGotUnequipped); + SubscribeLocalEvent(OnFolded); } private void OnGetActions(EntityUid uid, MaskComponent component, GetItemActionsEvent args) { - if (!args.InHands) + if (_inventorySystem.InSlotWithFlags(uid, SlotFlags.MASK)) args.AddAction(ref component.ToggleActionEntity, component.ToggleAction); } @@ -46,7 +49,7 @@ private void OnToggleMask(Entity ent, ref ToggleMaskEvent args) else _popupSystem.PopupEntity(Loc.GetString("action-mask-pull-up-popup-message", ("mask", uid)), args.Performer, args.Performer); - ToggleMaskComponents(uid, mask, args.Performer); + ToggleMaskComponents(uid, mask, args.Performer, mask.EquippedPrefix); } // set to untoggled when unequipped, so it isn't left in a 'pulled down' state @@ -59,15 +62,22 @@ private void OnGotUnequipped(EntityUid uid, MaskComponent mask, GotUnequippedEve Dirty(uid, mask); _actionSystem.SetToggled(mask.ToggleActionEntity, mask.IsToggled); - ToggleMaskComponents(uid, mask, args.Equipee, true); + ToggleMaskComponents(uid, mask, args.Equipee, mask.EquippedPrefix, true); } - private void ToggleMaskComponents(EntityUid uid, MaskComponent mask, EntityUid wearer, bool isEquip = false) + private void ToggleMaskComponents(EntityUid uid, MaskComponent mask, EntityUid wearer, string? equippedPrefix = null, bool isEquip = false) { - var maskEv = new ItemMaskToggledEvent(wearer, mask.IsToggled, isEquip); + var maskEv = new ItemMaskToggledEvent(wearer, equippedPrefix, mask.IsToggled, isEquip); RaiseLocalEvent(uid, ref maskEv); var wearerEv = new WearerMaskToggledEvent(mask.IsToggled); RaiseLocalEvent(wearer, ref wearerEv); } + + private void OnFolded(Entity ent, ref FoldedEvent args) + { + ent.Comp.IsToggled = args.IsFolded; + + ToggleMaskComponents(ent.Owner, ent.Comp, ent.Owner); + } } diff --git a/Content.Shared/Foldable/FoldableComponent.cs b/Content.Shared/Foldable/FoldableComponent.cs index 1943327c0d7..c22095f3f29 100644 --- a/Content.Shared/Foldable/FoldableComponent.cs +++ b/Content.Shared/Foldable/FoldableComponent.cs @@ -1,5 +1,4 @@ using Robust.Shared.GameStates; -using Robust.Shared.Serialization; namespace Content.Shared.Foldable; @@ -9,23 +8,13 @@ namespace Content.Shared.Foldable; /// /// Will prevent any insertions into containers while this item is unfolded. /// -[RegisterComponent] -[NetworkedComponent] +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] [Access(typeof(FoldableSystem))] public sealed partial class FoldableComponent : Component { - [DataField("folded")] + [DataField("folded"), AutoNetworkedField] public bool IsFolded = false; -} - -// ahhh, the ol' "state thats just a copy of the component". -[Serializable, NetSerializable] -public sealed class FoldableComponentState : ComponentState -{ - public readonly bool IsFolded; - public FoldableComponentState(bool isFolded) - { - IsFolded = isFolded; - } + [DataField] + public bool CanFoldInsideContainer = false; } diff --git a/Content.Shared/Foldable/FoldableSystem.cs b/Content.Shared/Foldable/FoldableSystem.cs index 6f2e9f3ee5e..374aba44c50 100644 --- a/Content.Shared/Foldable/FoldableSystem.cs +++ b/Content.Shared/Foldable/FoldableSystem.cs @@ -3,7 +3,6 @@ using Content.Shared.Storage.Components; using Content.Shared.Verbs; using Robust.Shared.Containers; -using Robust.Shared.GameStates; using Robust.Shared.Serialization; using Robust.Shared.Utility; @@ -20,8 +19,7 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent>(AddFoldVerb); - SubscribeLocalEvent(OnGetState); - SubscribeLocalEvent(OnHandleState); + SubscribeLocalEvent(OnHandleState); SubscribeLocalEvent(OnFoldableInit); SubscribeLocalEvent(OnInsertEvent); @@ -31,18 +29,9 @@ public override void Initialize() SubscribeLocalEvent(OnBuckleAttempt); } - private void OnGetState(EntityUid uid, FoldableComponent component, ref ComponentGetState args) + private void OnHandleState(EntityUid uid, FoldableComponent component, ref AfterAutoHandleStateEvent args) { - args.State = new FoldableComponentState(component.IsFolded); - } - - private void OnHandleState(EntityUid uid, FoldableComponent component, ref ComponentHandleState args) - { - if (args.Current is not FoldableComponentState state) - return; - - if (state.IsFolded != component.IsFolded) - SetFolded(uid, component, state.IsFolded); + SetFolded(uid, component, component.IsFolded); } private void OnFoldableInit(EntityUid uid, FoldableComponent component, ComponentInit args) @@ -90,11 +79,14 @@ public void SetFolded(EntityUid uid, FoldableComponent component, bool folded) Dirty(uid, component); _appearance.SetData(uid, FoldedVisuals.State, folded); _buckle.StrapSetEnabled(uid, !component.IsFolded); + + var ev = new FoldedEvent(folded); + RaiseLocalEvent(uid, ref ev); } private void OnInsertEvent(EntityUid uid, FoldableComponent component, ContainerGettingInsertedAttemptEvent args) { - if (!component.IsFolded) + if (!component.IsFolded && !component.CanFoldInsideContainer) args.Cancel(); } @@ -108,8 +100,8 @@ public bool CanToggleFold(EntityUid uid, FoldableComponent? fold = null) if (!Resolve(uid, ref fold)) return false; - // Can't un-fold in any container (locker, hands, inventory, whatever). - if (_container.IsEntityInContainer(uid)) + // Can't un-fold in any container unless enabled (locker, hands, inventory, whatever). + if (_container.IsEntityInContainer(uid) && !fold.CanFoldInsideContainer) return false; var ev = new FoldAttemptEvent(); @@ -167,3 +159,10 @@ public enum FoldedVisuals : byte /// [ByRefEvent] public record struct FoldAttemptEvent(bool Cancelled = false); + +/// +/// Event raised on an entity after it has been folded. +/// +/// +[ByRefEvent] +public readonly record struct FoldedEvent(bool IsFolded); diff --git a/Resources/Prototypes/Entities/Clothing/Head/bandanas.yml b/Resources/Prototypes/Entities/Clothing/Head/bandanas.yml index 1d1d5878602..8ee6479ee65 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/bandanas.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/bandanas.yml @@ -1,114 +1,72 @@ - type: entity - parent: ClothingHeadBaseButcherable + parent: [ClothingHeadBaseButcherable, BaseFoldable] + id: ClothingHeadBandBase + abstract: true + components: + - type: Foldable + folded: true + - type: Mask + isToggled: true + - type: IngestionBlocker + enabled: false + - type: IdentityBlocker + enabled: false + coverage: MOUTH + - type: Sprite # needed for vendor inventory icons + layers: + - state: icon + map: ["foldedLayer"] + visible: true + - state: icon_mask + map: [ "unfoldedLayer" ] + visible: false + +- type: entity + parent: [ClothingHeadBandBase, ClothingMaskBandBlack] id: ClothingHeadBandBlack name: black bandana - description: A black bandana to make you look cool. - components: - - type: Sprite - sprite: Clothing/Head/Bandanas/black.rsi - - type: Clothing - sprite: Clothing/Head/Bandanas/black.rsi - type: entity - parent: ClothingHeadBaseButcherable + parent: [ClothingHeadBandBase, ClothingMaskBandBlue] id: ClothingHeadBandBlue name: blue bandana - description: A blue bandana to make you look cool. - components: - - type: Sprite - sprite: Clothing/Head/Bandanas/blue.rsi - - type: Clothing - sprite: Clothing/Head/Bandanas/blue.rsi - type: entity - parent: ClothingHeadBaseButcherable + parent: [ClothingHeadBandBase, ClothingMaskBandBotany] id: ClothingHeadBandBotany name: botany bandana - description: A botany bandana to make you look cool, made from natural fibers. - components: - - type: Sprite - sprite: Clothing/Head/Bandanas/botany.rsi - - type: Clothing - sprite: Clothing/Head/Bandanas/botany.rsi - - type: Tag - tags: - - ClothMade - - HamsterWearable - - WhitelistChameleon - type: entity - parent: ClothingHeadBaseButcherable + parent: [ClothingHeadBandBase, ClothingMaskBandGold] id: ClothingHeadBandGold name: gold bandana - description: A gold bandana to make you look cool. - components: - - type: Sprite - sprite: Clothing/Head/Bandanas/gold.rsi - - type: Clothing - sprite: Clothing/Head/Bandanas/gold.rsi - type: entity - parent: ClothingHeadBaseButcherable + parent: [ClothingHeadBandBase, ClothingMaskBandGreen] id: ClothingHeadBandGreen name: green bandana - description: A green bandana to make you look cool. - components: - - type: Sprite - sprite: Clothing/Head/Bandanas/green.rsi - - type: Clothing - sprite: Clothing/Head/Bandanas/green.rsi - type: entity - parent: ClothingHeadBaseButcherable + parent: [ClothingHeadBandBase, ClothingMaskBandGrey] id: ClothingHeadBandGrey name: grey bandana - description: A grey bandana to make you look cool. - components: - - type: Sprite - sprite: Clothing/Head/Bandanas/grey.rsi - - type: Clothing - sprite: Clothing/Head/Bandanas/grey.rsi - type: entity - parent: ClothingHeadBaseButcherable + parent: [ClothingHeadBandBase, ClothingMaskBandRed] id: ClothingHeadBandRed name: red bandana - description: A red bandana to make you look cool. - components: - - type: Sprite - sprite: Clothing/Head/Bandanas/red.rsi - - type: Clothing - sprite: Clothing/Head/Bandanas/red.rsi - type: entity - parent: ClothingHeadBaseButcherable + parent: [ClothingHeadBandBase, ClothingMaskBandSkull] id: ClothingHeadBandSkull name: skull bandana - description: A bandana with a skull to make you look even cooler. - components: - - type: Sprite - sprite: Clothing/Head/Bandanas/skull.rsi - - type: Clothing - sprite: Clothing/Head/Bandanas/skull.rsi - type: entity - parent: ClothingHeadBaseButcherable + parent: [ClothingHeadBandBase, ClothingMaskBandMerc] id: ClothingHeadBandMerc name: mercenary bandana - description: To protect the head from the sun, insects and other dangers of the higher path. - components: - - type: Sprite - sprite: Clothing/Head/Bandanas/merc.rsi - - type: Clothing - sprite: Clothing/Head/Bandanas/merc.rsi - type: entity - parent: ClothingHeadBaseButcherable + parent: [ClothingHeadBandBase, ClothingMaskBandBrown] id: ClothingHeadBandBrown - name: brown bandana - description: A brown bandana to make you look cool. - components: - - type: Sprite - sprite: Clothing/Head/Bandanas/brown.rsi - - type: Clothing - sprite: Clothing/Head/Bandanas/brown.rsi + name: brown bandana \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Clothing/Masks/bandanas.yml b/Resources/Prototypes/Entities/Clothing/Masks/bandanas.yml new file mode 100644 index 00000000000..c008a755ee7 --- /dev/null +++ b/Resources/Prototypes/Entities/Clothing/Masks/bandanas.yml @@ -0,0 +1,138 @@ +- type: entity + parent: [ClothingMaskBaseButcherable, BaseFoldable] + id: ClothingMaskBandanaBase + abstract: true + components: + - type: Appearance + - type: Foldable + canFoldInsideContainer: true + - type: FoldableClothing + foldedSlots: + - HEAD + unfoldedSlots: + - MASK + - type: Mask + - type: IngestionBlocker + - type: IdentityBlocker + coverage: MOUTH + - type: Sprite + layers: + - state: icon_mask + map: [ "unfoldedLayer" ] + - state: icon + map: ["foldedLayer"] + visible: false + +- type: entity + parent: ClothingMaskBandanaBase + id: ClothingMaskBandBlack + name: black bandana + description: A black bandana to make you look cool. + components: + - type: Sprite + sprite: Clothing/Head/Bandanas/black.rsi + - type: Clothing + sprite: Clothing/Head/Bandanas/black.rsi + +- type: entity + parent: ClothingMaskBandanaBase + id: ClothingMaskBandBlue + name: blue bandana + description: A blue bandana to make you look cool. + components: + - type: Sprite + sprite: Clothing/Head/Bandanas/blue.rsi + - type: Clothing + sprite: Clothing/Head/Bandanas/blue.rsi + +- type: entity + parent: ClothingMaskBandanaBase + id: ClothingMaskBandBotany + name: botany bandana + description: A botany bandana to make you look cool, made from natural fibers. + components: + - type: Sprite + sprite: Clothing/Head/Bandanas/botany.rsi + - type: Clothing + sprite: Clothing/Head/Bandanas/botany.rsi + - type: Tag + tags: + - ClothMade + - WhitelistChameleon + +- type: entity + parent: ClothingMaskBandanaBase + id: ClothingMaskBandGold + name: gold bandana + description: A gold bandana to make you look cool. + components: + - type: Sprite + sprite: Clothing/Head/Bandanas/gold.rsi + - type: Clothing + sprite: Clothing/Head/Bandanas/gold.rsi + +- type: entity + parent: ClothingMaskBandanaBase + id: ClothingMaskBandGreen + name: green bandana + description: A green bandana to make you look cool. + components: + - type: Sprite + sprite: Clothing/Head/Bandanas/green.rsi + - type: Clothing + sprite: Clothing/Head/Bandanas/green.rsi + +- type: entity + parent: ClothingMaskBandanaBase + id: ClothingMaskBandGrey + name: grey bandana + description: A grey bandana to make you look cool. + components: + - type: Sprite + sprite: Clothing/Head/Bandanas/grey.rsi + - type: Clothing + sprite: Clothing/Head/Bandanas/grey.rsi + +- type: entity + parent: ClothingMaskBandanaBase + id: ClothingMaskBandRed + name: red bandana + description: A red bandana to make you look cool. + components: + - type: Sprite + sprite: Clothing/Head/Bandanas/red.rsi + - type: Clothing + sprite: Clothing/Head/Bandanas/red.rsi + +- type: entity + parent: ClothingMaskBandanaBase + id: ClothingMaskBandSkull + name: skull bandana + description: A bandana with a skull to make you look even cooler. + components: + - type: Sprite + sprite: Clothing/Head/Bandanas/skull.rsi + - type: Clothing + sprite: Clothing/Head/Bandanas/skull.rsi + +- type: entity + parent: ClothingMaskBandanaBase + id: ClothingMaskBandMerc + name: mercenary bandana + description: To protect the head from the sun, insects and other dangers of the higher path. + components: + - type: Sprite + sprite: Clothing/Head/Bandanas/merc.rsi + - type: Clothing + sprite: Clothing/Head/Bandanas/merc.rsi + +- type: entity + parent: ClothingMaskBandanaBase + id: ClothingMaskBandBrown + name: brown bandana + description: A brown bandana to make you look cool. + components: + - type: Sprite + sprite: Clothing/Head/Bandanas/brown.rsi + - type: Clothing + sprite: Clothing/Head/Bandanas/brown.rsi diff --git a/Resources/Prototypes/Entities/Clothing/Masks/base_clothingmask.yml b/Resources/Prototypes/Entities/Clothing/Masks/base_clothingmask.yml index d57065ba79a..3531a26a6c5 100644 --- a/Resources/Prototypes/Entities/Clothing/Masks/base_clothingmask.yml +++ b/Resources/Prototypes/Entities/Clothing/Masks/base_clothingmask.yml @@ -27,3 +27,26 @@ icon: { sprite: Clothing/Mask/gas.rsi, state: icon } iconOn: Interface/Default/blocked.png event: !type:ToggleMaskEvent + +- type: entity + id: ClothingMaskBaseButcherable + parent: ClothingMaskBase + abstract: true + components: + - type: Butcherable + butcheringType: Knife + spawned: + - id: MaterialCloth1 + amount: 1 + - type: Food + requiresSpecialDigestion: true + - type: SolutionContainerManager + solutions: + food: + maxVol: 10 + reagents: + - ReagentId: Fiber + Quantity: 10 + - type: Tag + tags: + - ClothMade \ No newline at end of file diff --git a/Resources/Textures/Clothing/Head/Bandanas/black.rsi/mask-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Bandanas/black.rsi/equipped-MASK.png similarity index 100% rename from Resources/Textures/Clothing/Head/Bandanas/black.rsi/mask-equipped-HELMET.png rename to Resources/Textures/Clothing/Head/Bandanas/black.rsi/equipped-MASK.png diff --git a/Resources/Textures/Clothing/Head/Bandanas/black.rsi/meta.json b/Resources/Textures/Clothing/Head/Bandanas/black.rsi/meta.json index 66dc616e523..a5553690327 100644 --- a/Resources/Textures/Clothing/Head/Bandanas/black.rsi/meta.json +++ b/Resources/Textures/Clothing/Head/Bandanas/black.rsi/meta.json @@ -18,7 +18,7 @@ "directions": 4 }, { - "name": "mask-equipped-HELMET", + "name": "equipped-MASK", "directions": 4 }, { diff --git a/Resources/Textures/Clothing/Head/Bandanas/blue.rsi/mask-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Bandanas/blue.rsi/equipped-MASK.png similarity index 100% rename from Resources/Textures/Clothing/Head/Bandanas/blue.rsi/mask-equipped-HELMET.png rename to Resources/Textures/Clothing/Head/Bandanas/blue.rsi/equipped-MASK.png diff --git a/Resources/Textures/Clothing/Head/Bandanas/blue.rsi/meta.json b/Resources/Textures/Clothing/Head/Bandanas/blue.rsi/meta.json index 66dc616e523..a5553690327 100644 --- a/Resources/Textures/Clothing/Head/Bandanas/blue.rsi/meta.json +++ b/Resources/Textures/Clothing/Head/Bandanas/blue.rsi/meta.json @@ -18,7 +18,7 @@ "directions": 4 }, { - "name": "mask-equipped-HELMET", + "name": "equipped-MASK", "directions": 4 }, { diff --git a/Resources/Textures/Clothing/Head/Bandanas/botany.rsi/mask-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Bandanas/botany.rsi/equipped-MASK.png similarity index 100% rename from Resources/Textures/Clothing/Head/Bandanas/botany.rsi/mask-equipped-HELMET.png rename to Resources/Textures/Clothing/Head/Bandanas/botany.rsi/equipped-MASK.png diff --git a/Resources/Textures/Clothing/Head/Bandanas/botany.rsi/meta.json b/Resources/Textures/Clothing/Head/Bandanas/botany.rsi/meta.json index 22a0c38fde5..a9b3b1556d9 100644 --- a/Resources/Textures/Clothing/Head/Bandanas/botany.rsi/meta.json +++ b/Resources/Textures/Clothing/Head/Bandanas/botany.rsi/meta.json @@ -22,7 +22,7 @@ "directions": 4 }, { - "name": "mask-equipped-HELMET", + "name": "equipped-MASK", "directions": 4 }, { diff --git a/Resources/Textures/Clothing/Head/Bandanas/brown.rsi/mask-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Bandanas/brown.rsi/equipped-MASK.png similarity index 100% rename from Resources/Textures/Clothing/Head/Bandanas/brown.rsi/mask-equipped-HELMET.png rename to Resources/Textures/Clothing/Head/Bandanas/brown.rsi/equipped-MASK.png diff --git a/Resources/Textures/Clothing/Head/Bandanas/brown.rsi/meta.json b/Resources/Textures/Clothing/Head/Bandanas/brown.rsi/meta.json index dc73ff464cd..ae745625601 100644 --- a/Resources/Textures/Clothing/Head/Bandanas/brown.rsi/meta.json +++ b/Resources/Textures/Clothing/Head/Bandanas/brown.rsi/meta.json @@ -18,7 +18,7 @@ "directions": 4 }, { - "name": "mask-equipped-HELMET", + "name": "equipped-MASK", "directions": 4 }, { diff --git a/Resources/Textures/Clothing/Head/Bandanas/gold.rsi/mask-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Bandanas/gold.rsi/equipped-MASK.png similarity index 100% rename from Resources/Textures/Clothing/Head/Bandanas/gold.rsi/mask-equipped-HELMET.png rename to Resources/Textures/Clothing/Head/Bandanas/gold.rsi/equipped-MASK.png diff --git a/Resources/Textures/Clothing/Head/Bandanas/gold.rsi/meta.json b/Resources/Textures/Clothing/Head/Bandanas/gold.rsi/meta.json index 66dc616e523..a5553690327 100644 --- a/Resources/Textures/Clothing/Head/Bandanas/gold.rsi/meta.json +++ b/Resources/Textures/Clothing/Head/Bandanas/gold.rsi/meta.json @@ -18,7 +18,7 @@ "directions": 4 }, { - "name": "mask-equipped-HELMET", + "name": "equipped-MASK", "directions": 4 }, { diff --git a/Resources/Textures/Clothing/Head/Bandanas/green.rsi/mask-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Bandanas/green.rsi/equipped-MASK.png similarity index 100% rename from Resources/Textures/Clothing/Head/Bandanas/green.rsi/mask-equipped-HELMET.png rename to Resources/Textures/Clothing/Head/Bandanas/green.rsi/equipped-MASK.png diff --git a/Resources/Textures/Clothing/Head/Bandanas/green.rsi/meta.json b/Resources/Textures/Clothing/Head/Bandanas/green.rsi/meta.json index 66dc616e523..a5553690327 100644 --- a/Resources/Textures/Clothing/Head/Bandanas/green.rsi/meta.json +++ b/Resources/Textures/Clothing/Head/Bandanas/green.rsi/meta.json @@ -18,7 +18,7 @@ "directions": 4 }, { - "name": "mask-equipped-HELMET", + "name": "equipped-MASK", "directions": 4 }, { diff --git a/Resources/Textures/Clothing/Head/Bandanas/grey.rsi/mask-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Bandanas/grey.rsi/equipped-MASK.png similarity index 100% rename from Resources/Textures/Clothing/Head/Bandanas/grey.rsi/mask-equipped-HELMET.png rename to Resources/Textures/Clothing/Head/Bandanas/grey.rsi/equipped-MASK.png diff --git a/Resources/Textures/Clothing/Head/Bandanas/grey.rsi/meta.json b/Resources/Textures/Clothing/Head/Bandanas/grey.rsi/meta.json index 66dc616e523..a5553690327 100644 --- a/Resources/Textures/Clothing/Head/Bandanas/grey.rsi/meta.json +++ b/Resources/Textures/Clothing/Head/Bandanas/grey.rsi/meta.json @@ -18,7 +18,7 @@ "directions": 4 }, { - "name": "mask-equipped-HELMET", + "name": "equipped-MASK", "directions": 4 }, { diff --git a/Resources/Textures/Clothing/Head/Bandanas/merc.rsi/mask-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Bandanas/merc.rsi/equipped-MASK.png similarity index 100% rename from Resources/Textures/Clothing/Head/Bandanas/merc.rsi/mask-equipped-HELMET.png rename to Resources/Textures/Clothing/Head/Bandanas/merc.rsi/equipped-MASK.png diff --git a/Resources/Textures/Clothing/Head/Bandanas/merc.rsi/meta.json b/Resources/Textures/Clothing/Head/Bandanas/merc.rsi/meta.json index 94ecdbc846b..7912d1eb0f7 100644 --- a/Resources/Textures/Clothing/Head/Bandanas/merc.rsi/meta.json +++ b/Resources/Textures/Clothing/Head/Bandanas/merc.rsi/meta.json @@ -18,7 +18,7 @@ "directions": 4 }, { - "name": "mask-equipped-HELMET", + "name": "equipped-MASK", "directions": 4 }, { diff --git a/Resources/Textures/Clothing/Head/Bandanas/red.rsi/mask-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Bandanas/red.rsi/equipped-MASK.png similarity index 100% rename from Resources/Textures/Clothing/Head/Bandanas/red.rsi/mask-equipped-HELMET.png rename to Resources/Textures/Clothing/Head/Bandanas/red.rsi/equipped-MASK.png diff --git a/Resources/Textures/Clothing/Head/Bandanas/red.rsi/meta.json b/Resources/Textures/Clothing/Head/Bandanas/red.rsi/meta.json index 66dc616e523..a5553690327 100644 --- a/Resources/Textures/Clothing/Head/Bandanas/red.rsi/meta.json +++ b/Resources/Textures/Clothing/Head/Bandanas/red.rsi/meta.json @@ -18,7 +18,7 @@ "directions": 4 }, { - "name": "mask-equipped-HELMET", + "name": "equipped-MASK", "directions": 4 }, { diff --git a/Resources/Textures/Clothing/Head/Bandanas/skull.rsi/mask-equipped-HELMET.png b/Resources/Textures/Clothing/Head/Bandanas/skull.rsi/equipped-MASK.png similarity index 100% rename from Resources/Textures/Clothing/Head/Bandanas/skull.rsi/mask-equipped-HELMET.png rename to Resources/Textures/Clothing/Head/Bandanas/skull.rsi/equipped-MASK.png diff --git a/Resources/Textures/Clothing/Head/Bandanas/skull.rsi/meta.json b/Resources/Textures/Clothing/Head/Bandanas/skull.rsi/meta.json index 66dc616e523..a5553690327 100644 --- a/Resources/Textures/Clothing/Head/Bandanas/skull.rsi/meta.json +++ b/Resources/Textures/Clothing/Head/Bandanas/skull.rsi/meta.json @@ -18,7 +18,7 @@ "directions": 4 }, { - "name": "mask-equipped-HELMET", + "name": "equipped-MASK", "directions": 4 }, { From fbcba23fd67da49701a4601d83b3dde43105efdf Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 4 Feb 2024 00:53:50 +0000 Subject: [PATCH 215/266] Automatic changelog update (cherry picked from commit 7d1567281f7df0c2f8003b5d2ebbc5312232c086) --- Resources/Changelog/Changelog.yml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index e31dafab7d4..08653bd77a3 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: Ubaser - changes: - - message: Chefs get black pepper packets in their lockers. - type: Tweak - id: 5385 - time: '2023-12-16T03:20:51.0000000+00:00' - author: Flareguy changes: - message: Resprited the Kammerer, Double-Barrel, and Enforcer shotguns using sprites @@ -3874,3 +3868,13 @@ id: 5884 time: '2024-02-04T00:50:24.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24869 +- author: themias + changes: + - message: Added face bandanas + type: Add + - message: Bandanas can be switched between head and face type with an alt verb + (Fold) + type: Tweak + id: 5885 + time: '2024-02-04T00:52:44.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24597 From c639a4efbb38799e1725a00ccdc2c4fd99c4d890 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sun, 4 Feb 2024 13:23:16 +1100 Subject: [PATCH 216/266] Predicted movement opening lockers (#24937) Relay wasn't really networked properly and this annoys me. EntityStorage is still pretty skrunkly but this fixes the main issue I think. (cherry picked from commit 042feae2e91f41f7d39e55340405e3c448903d61) --- .../Storage/Systems/EntityStorageSystem.cs | 1 + .../EntitySystems/EntityStorageSystem.cs | 1 + .../Components/SharedEntityStorageComponent.cs | 7 +++++-- .../EntitySystems/SharedEntityStorageSystem.cs | 17 +++++++++++++---- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/Content.Client/Storage/Systems/EntityStorageSystem.cs b/Content.Client/Storage/Systems/EntityStorageSystem.cs index 6d37beb0781..dd3f8d38605 100644 --- a/Content.Client/Storage/Systems/EntityStorageSystem.cs +++ b/Content.Client/Storage/Systems/EntityStorageSystem.cs @@ -17,6 +17,7 @@ public sealed class EntityStorageSystem : SharedEntityStorageSystem public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnEntityUnpausedEvent); SubscribeLocalEvent(OnComponentInit); SubscribeLocalEvent(OnComponentStartup); SubscribeLocalEvent(OnInteract, after: new[] { typeof(LockSystem) }); diff --git a/Content.Server/Storage/EntitySystems/EntityStorageSystem.cs b/Content.Server/Storage/EntitySystems/EntityStorageSystem.cs index 176fd9b9ed2..8b31f598d0d 100644 --- a/Content.Server/Storage/EntitySystems/EntityStorageSystem.cs +++ b/Content.Server/Storage/EntitySystems/EntityStorageSystem.cs @@ -33,6 +33,7 @@ public override void Initialize() base.Initialize(); /* CompRef things */ + SubscribeLocalEvent(OnEntityUnpausedEvent); SubscribeLocalEvent(OnComponentInit); SubscribeLocalEvent(OnComponentStartup); SubscribeLocalEvent(OnInteract, after: new[] { typeof(LockSystem) }); diff --git a/Content.Shared/Storage/Components/SharedEntityStorageComponent.cs b/Content.Shared/Storage/Components/SharedEntityStorageComponent.cs index b4cd18f4d5c..b02c97db711 100644 --- a/Content.Shared/Storage/Components/SharedEntityStorageComponent.cs +++ b/Content.Shared/Storage/Components/SharedEntityStorageComponent.cs @@ -14,7 +14,7 @@ public abstract partial class SharedEntityStorageComponent : Component public readonly float MaxSize = 1.0f; // maximum width or height of an entity allowed inside the storage. public static readonly TimeSpan InternalOpenAttemptDelay = TimeSpan.FromSeconds(0.5); - public TimeSpan LastInternalOpenAttempt; + public TimeSpan NextInternalOpenAttempt; /// /// Collision masks that get removed when the storage gets opened. @@ -139,13 +139,16 @@ public sealed class EntityStorageComponentState : ComponentState public float EnteringRange; - public EntityStorageComponentState(bool open, int capacity, bool isCollidableWhenOpen, bool openOnMove, float enteringRange) + public TimeSpan NextInternalOpenAttempt; + + public EntityStorageComponentState(bool open, int capacity, bool isCollidableWhenOpen, bool openOnMove, float enteringRange, TimeSpan nextInternalOpenAttempt) { Open = open; Capacity = capacity; IsCollidableWhenOpen = isCollidableWhenOpen; OpenOnMove = openOnMove; EnteringRange = enteringRange; + NextInternalOpenAttempt = nextInternalOpenAttempt; } } diff --git a/Content.Shared/Storage/EntitySystems/SharedEntityStorageSystem.cs b/Content.Shared/Storage/EntitySystems/SharedEntityStorageSystem.cs index 8f8707ccde8..636c6038348 100644 --- a/Content.Shared/Storage/EntitySystems/SharedEntityStorageSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SharedEntityStorageSystem.cs @@ -48,13 +48,19 @@ public abstract class SharedEntityStorageSystem : EntitySystem public const string ContainerName = "entity_storage"; + protected void OnEntityUnpausedEvent(EntityUid uid, SharedEntityStorageComponent component, EntityUnpausedEvent args) + { + component.NextInternalOpenAttempt += args.PausedTime; + } + protected void OnGetState(EntityUid uid, SharedEntityStorageComponent component, ref ComponentGetState args) { args.State = new EntityStorageComponentState(component.Open, component.Capacity, component.IsCollidableWhenOpen, component.OpenOnMove, - component.EnteringRange); + component.EnteringRange, + component.NextInternalOpenAttempt); } protected void OnHandleState(EntityUid uid, SharedEntityStorageComponent component, ref ComponentHandleState args) @@ -66,6 +72,7 @@ protected void OnHandleState(EntityUid uid, SharedEntityStorageComponent compone component.IsCollidableWhenOpen = state.IsCollidableWhenOpen; component.OpenOnMove = state.OpenOnMove; component.EnteringRange = state.EnteringRange; + component.NextInternalOpenAttempt = state.NextInternalOpenAttempt; } protected virtual void OnComponentInit(EntityUid uid, SharedEntityStorageComponent component, ComponentInit args) @@ -123,10 +130,12 @@ protected void OnRelayMovement(EntityUid uid, SharedEntityStorageComponent compo if (!HasComp(args.Entity)) return; - if (_timing.CurTime < component.LastInternalOpenAttempt + SharedEntityStorageComponent.InternalOpenAttemptDelay) + if (_timing.CurTime < component.NextInternalOpenAttempt) return; - component.LastInternalOpenAttempt = _timing.CurTime; + component.NextInternalOpenAttempt = _timing.CurTime + SharedEntityStorageComponent.InternalOpenAttemptDelay; + Dirty(uid, component); + if (component.OpenOnMove) { TryOpenStorage(args.Entity, uid); @@ -259,7 +268,7 @@ public void CloseStorage(EntityUid uid, SharedEntityStorageComponent? component ModifyComponents(uid, component); if (_net.IsClient && _timing.IsFirstTimePredicted) _audio.PlayPvs(component.CloseSound, uid); - component.LastInternalOpenAttempt = default; + var afterev = new StorageAfterCloseEvent(); RaiseLocalEvent(uid, ref afterev); } From aa069692eaf47a0e08b7c5f6d760bcccc233a80e Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 4 Feb 2024 02:24:22 +0000 Subject: [PATCH 217/266] Automatic changelog update (cherry picked from commit 66a0896e76822448cc842f6bf53cc3f370d83f52) --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 08653bd77a3..c62d855a868 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Flareguy - changes: - - message: Resprited the Kammerer, Double-Barrel, and Enforcer shotguns using sprites - courtesy of /tg/station. - type: Tweak - id: 5386 - time: '2023-12-16T04:23:57.0000000+00:00' - author: mirrorcult changes: - message: Scientists can now fabricate faux grass planet and ice tiles with a tier @@ -3878,3 +3871,10 @@ id: 5885 time: '2024-02-04T00:52:44.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24597 +- author: metalgearsloth + changes: + - message: Moving to open lockers is now predicted. + type: Fix + id: 5886 + time: '2024-02-04T02:23:16.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24937 From c4a57075f063606ac46e021ed60adfb764512949 Mon Sep 17 00:00:00 2001 From: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com> Date: Sun, 4 Feb 2024 00:24:58 -0600 Subject: [PATCH 218/266] Adds navmap beacon for escape pods (#24938) Co-authored-by: Jeff (cherry picked from commit aa86b93adddebd92f612cfe790b59df5f53767e9) --- Resources/Locale/en-US/navmap-beacons/station-beacons.ftl | 1 + .../Prototypes/Entities/Objects/Devices/station_beacon.yml | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/Resources/Locale/en-US/navmap-beacons/station-beacons.ftl b/Resources/Locale/en-US/navmap-beacons/station-beacons.ftl index 7a251b13fbf..1344bab9e22 100644 --- a/Resources/Locale/en-US/navmap-beacons/station-beacons.ftl +++ b/Resources/Locale/en-US/navmap-beacons/station-beacons.ftl @@ -71,3 +71,4 @@ station-beacon-theater = Theater station-beacon-tools = Tools station-beacon-disposals = Disposals station-beacon-cryosleep = Cryosleep +station-beacon-escape-pod = Escape Pod diff --git a/Resources/Prototypes/Entities/Objects/Devices/station_beacon.yml b/Resources/Prototypes/Entities/Objects/Devices/station_beacon.yml index 39754d28e78..6cf66ba0421 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/station_beacon.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/station_beacon.yml @@ -624,3 +624,10 @@ - type: NavMapBeacon text: station-beacon-cryosleep +- type: entity + parent: DefaultStationBeacon + id: DefaultStationBeaconEscapePod + suffix: Escape Pod + components: + - type: NavMapBeacon + text: station-beacon-escape-pod From 26a6c4d8d3c965c345d3b22c34b32d0473312aed Mon Sep 17 00:00:00 2001 From: Kot <1192090+koteq@users.noreply.github.com> Date: Mon, 5 Feb 2024 00:10:30 +0400 Subject: [PATCH 219/266] Fix quantum dispose (#24772) * Fix quantum disposable issue * remove force * Iterate over all the disposal holder children instead of contained ones (cherry picked from commit 50e38cbd21950cc3bf31113c6a222d7ef8a3625b) --- .../Unit/EntitySystems/DisposableSystem.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Content.Server/Disposal/Unit/EntitySystems/DisposableSystem.cs b/Content.Server/Disposal/Unit/EntitySystems/DisposableSystem.cs index cc9d2f711b3..eb3cda4db9b 100644 --- a/Content.Server/Disposal/Unit/EntitySystems/DisposableSystem.cs +++ b/Content.Server/Disposal/Unit/EntitySystems/DisposableSystem.cs @@ -36,8 +36,6 @@ public sealed class DisposableSystem : EntitySystem private EntityQuery _physicsQuery; private EntityQuery _xformQuery; - private List _entList = new(); - public override void Initialize() { base.Initialize(); @@ -119,15 +117,17 @@ public void ExitDisposals(EntityUid uid, DisposalHolderComponent? holder = null, } } - _entList.Clear(); - _entList.AddRange(holder.Container.ContainedEntities); - - foreach (var entity in _entList) + // We're purposely iterating over all the holder's children + // because the holder might have something teleported into it, + // outside the usual container insertion logic. + var children = holderTransform.ChildEnumerator; + while (children.MoveNext(out var entity)) { RemComp(entity); var meta = _metaQuery.GetComponent(entity); - _containerSystem.Remove((entity, null, meta), holder.Container, reparent: false, force: true); + if (holder.Container.Contains(entity)) + _containerSystem.Remove((entity, null, meta), holder.Container, reparent: false, force: true); var xform = _xformQuery.GetComponent(entity); if (xform.ParentUid != uid) From 83c1438b40b7a96413e52cfc4aa92a2a35c68338 Mon Sep 17 00:00:00 2001 From: Tayrtahn Date: Sun, 4 Feb 2024 15:13:47 -0500 Subject: [PATCH 220/266] Add open/closed/fill states and sprites (#24600) This adds visual differences to the sprites of many of the game's drinks when they are opened, as well as visual fill levels for most see-through drink containers. Condiment packets are visibly torn open in the corner when opened. Glue, lube, and condiment bottles are visibly opened too. I also noticed that the soda bottles were all completely opaque, so I fixed that while I was at it. Oh, and I updated the wine bottle sprite to say 14 instead of 13, 'cause yeah. As a result of the way fill levels take on the color of the contained liquid, many of the drinks have changed slightly in appearance. This can be adjusted in the future by modifying the colors of the reagents, but seems outside the scope of this already large PR. This also means that if you refill the bottles with a different liquid, they'll take on the new color appropriately. (cherry picked from commit 41cf3e559973f89eb48d1e24099716f54a1bc87c) --- .../Consumable/Drinks/drinks-cartons.yml | 30 ++++- .../Consumable/Drinks/drinks_bottles.yml | 123 +++++++++++++----- .../Objects/Consumable/Drinks/drinks_fun.yml | 32 ++++- .../Consumable/Food/Containers/condiments.yml | 90 +++++-------- .../Prototypes/Entities/Objects/Fun/toys.yml | 9 ++ .../Drinks/absinthebottle.rsi/fill-1.png | Bin 0 -> 136 bytes .../Drinks/absinthebottle.rsi/fill-2.png | Bin 0 -> 136 bytes .../Drinks/absinthebottle.rsi/fill-3.png | Bin 0 -> 140 bytes .../Drinks/absinthebottle.rsi/fill-4.png | Bin 0 -> 156 bytes .../Drinks/absinthebottle.rsi/fill-5.png | Bin 0 -> 168 bytes .../Drinks/absinthebottle.rsi/icon_empty.png | Bin 0 -> 495 bytes .../Drinks/absinthebottle.rsi/icon_open.png | Bin 0 -> 466 bytes .../Drinks/absinthebottle.rsi/meta.json | 23 +++- .../Consumable/Drinks/alco-blue.rsi/meta.json | 1 - .../Drinks/alco-bottle.rsi/fill-1.png | Bin 0 -> 142 bytes .../Drinks/alco-bottle.rsi/fill-2.png | Bin 0 -> 151 bytes .../Drinks/alco-bottle.rsi/fill-3.png | Bin 0 -> 157 bytes .../Drinks/alco-bottle.rsi/fill-4.png | Bin 0 -> 179 bytes .../Drinks/alco-bottle.rsi/fill-5.png | Bin 0 -> 207 bytes .../Drinks/alco-bottle.rsi/fill-6.png | Bin 0 -> 204 bytes .../icon_blue.png} | Bin .../Drinks/alco-bottle.rsi/icon_empty.png | Bin 0 -> 241 bytes .../icon_green.png} | Bin .../Drinks/alco-bottle.rsi/icon_open.png | Bin 0 -> 227 bytes .../icon.png => alco-bottle.rsi/icon_red.png} | Bin .../icon_white.png} | Bin .../Drinks/alco-bottle.rsi/meta.json | 47 +++++++ .../Drinks/alco-green.rsi/meta.json | 1 - .../Consumable/Drinks/alco-red.rsi/meta.json | 1 - .../Drinks/alco-white.rsi/meta.json | 1 - .../Drinks/alebottle.rsi/fill-1.png | Bin 0 -> 135 bytes .../Drinks/alebottle.rsi/fill-2.png | Bin 0 -> 150 bytes .../Drinks/alebottle.rsi/fill-3.png | Bin 0 -> 156 bytes .../Drinks/alebottle.rsi/fill-4.png | Bin 0 -> 181 bytes .../Drinks/alebottle.rsi/fill-5.png | Bin 0 -> 206 bytes .../Consumable/Drinks/alebottle.rsi/icon.png | Bin 436 -> 433 bytes .../Drinks/alebottle.rsi/icon_empty.png | Bin 0 -> 459 bytes .../Drinks/alebottle.rsi/icon_open.png | Bin 0 -> 432 bytes .../Consumable/Drinks/alebottle.rsi/meta.json | 36 ++++- .../Consumable/Drinks/beer.rsi/fill-1.png | Bin 0 -> 146 bytes .../Consumable/Drinks/beer.rsi/fill-2.png | Bin 0 -> 147 bytes .../Consumable/Drinks/beer.rsi/fill-3.png | Bin 0 -> 151 bytes .../Consumable/Drinks/beer.rsi/fill-4.png | Bin 0 -> 194 bytes .../Consumable/Drinks/beer.rsi/fill-5.png | Bin 0 -> 224 bytes .../Consumable/Drinks/beer.rsi/icon_empty.png | Bin 0 -> 535 bytes .../Consumable/Drinks/beer.rsi/icon_open.png | Bin 0 -> 532 bytes .../Consumable/Drinks/beer.rsi/meta.json | 36 ++++- .../Drinks/bottleofnothing.rsi/icon_open.png | Bin 0 -> 692 bytes .../Drinks/bottleofnothing.rsi/meta.json | 18 ++- .../Drinks/champagnebottle.rsi/icon_open.png | Bin 0 -> 680 bytes .../Drinks/champagnebottle.rsi/meta.json | 18 ++- .../coffeeliqueurbottle.rsi/icon_open.png | Bin 0 -> 529 bytes .../Drinks/coffeeliqueurbottle.rsi/meta.json | 18 ++- .../Drinks/cognacbottle.rsi/fill-1.png | Bin 0 -> 145 bytes .../Drinks/cognacbottle.rsi/fill-2.png | Bin 0 -> 144 bytes .../Drinks/cognacbottle.rsi/fill-3.png | Bin 0 -> 183 bytes .../Drinks/cognacbottle.rsi/fill-4.png | Bin 0 -> 225 bytes .../Drinks/cognacbottle.rsi/fill-5.png | Bin 0 -> 233 bytes .../Drinks/cognacbottle.rsi/icon_empty.png | Bin 0 -> 537 bytes .../Drinks/cognacbottle.rsi/icon_open.png | Bin 0 -> 561 bytes .../Drinks/cognacbottle.rsi/meta.json | 36 ++++- .../Drinks/colabottle.rsi/fill-1.png | Bin 0 -> 147 bytes .../Drinks/colabottle.rsi/fill-2.png | Bin 0 -> 176 bytes .../Drinks/colabottle.rsi/fill-3.png | Bin 0 -> 180 bytes .../Drinks/colabottle.rsi/fill-4.png | Bin 0 -> 176 bytes .../Drinks/colabottle.rsi/fill-5.png | Bin 0 -> 244 bytes .../Drinks/colabottle.rsi/icon_empty.png | Bin 0 -> 553 bytes .../Drinks/colabottle.rsi/icon_open.png | Bin 0 -> 543 bytes .../Drinks/colabottle.rsi/meta.json | 36 ++++- .../Consumable/Drinks/cream.rsi/icon_open.png | Bin 0 -> 498 bytes .../Consumable/Drinks/cream.rsi/meta.json | 18 ++- .../Drinks/gildlagerbottle.rsi/fill-1.png | Bin 0 -> 153 bytes .../Drinks/gildlagerbottle.rsi/fill-2.png | Bin 0 -> 181 bytes .../Drinks/gildlagerbottle.rsi/fill-3.png | Bin 0 -> 212 bytes .../Drinks/gildlagerbottle.rsi/fill-4.png | Bin 0 -> 247 bytes .../Drinks/gildlagerbottle.rsi/fill-5.png | Bin 0 -> 248 bytes .../Drinks/gildlagerbottle.rsi/icon_empty.png | Bin 0 -> 496 bytes .../Drinks/gildlagerbottle.rsi/icon_open.png | Bin 0 -> 526 bytes .../Drinks/gildlagerbottle.rsi/meta.json | 36 ++++- .../Drinks/ginbottle.rsi/fill-1.png | Bin 0 -> 139 bytes .../Drinks/ginbottle.rsi/fill-2.png | Bin 0 -> 167 bytes .../Drinks/ginbottle.rsi/fill-3.png | Bin 0 -> 157 bytes .../Drinks/ginbottle.rsi/fill-4.png | Bin 0 -> 191 bytes .../Drinks/ginbottle.rsi/fill-5.png | Bin 0 -> 201 bytes .../Drinks/ginbottle.rsi/icon_empty.png | Bin 0 -> 621 bytes .../Drinks/ginbottle.rsi/icon_open.png | Bin 0 -> 625 bytes .../Consumable/Drinks/ginbottle.rsi/meta.json | 36 ++++- .../Drinks/glue-tube.rsi/icon_open.png | Bin 0 -> 695 bytes .../Consumable/Drinks/glue-tube.rsi/meta.json | 3 + .../Drinks/grenadinebottle.rsi/fill-1.png | Bin 0 -> 123 bytes .../Drinks/grenadinebottle.rsi/fill-2.png | Bin 0 -> 132 bytes .../Drinks/grenadinebottle.rsi/fill-3.png | Bin 0 -> 124 bytes .../Drinks/grenadinebottle.rsi/fill-4.png | Bin 0 -> 124 bytes .../Drinks/grenadinebottle.rsi/fill-5.png | Bin 0 -> 142 bytes .../Drinks/grenadinebottle.rsi/fill-6.png | Bin 0 -> 136 bytes .../Drinks/grenadinebottle.rsi/icon_empty.png | Bin 0 -> 428 bytes .../Drinks/grenadinebottle.rsi/icon_open.png | Bin 0 -> 420 bytes .../Drinks/grenadinebottle.rsi/meta.json | 39 +++++- .../Drinks/limejuice.rsi/icon_open.png | Bin 0 -> 406 bytes .../Consumable/Drinks/limejuice.rsi/meta.json | 18 ++- .../Drinks/lube-tube.rsi/icon_open.png | Bin 0 -> 672 bytes .../Consumable/Drinks/lube-tube.rsi/meta.json | 3 + .../Consumable/Drinks/milk.rsi/icon_open.png | Bin 0 -> 410 bytes .../Consumable/Drinks/milk.rsi/meta.json | 18 ++- .../Consumable/Drinks/mopwata.rsi/fill-1.png | Bin 0 -> 147 bytes .../Consumable/Drinks/mopwata.rsi/fill-2.png | Bin 0 -> 136 bytes .../Consumable/Drinks/mopwata.rsi/fill-3.png | Bin 0 -> 136 bytes .../Consumable/Drinks/mopwata.rsi/fill-4.png | Bin 0 -> 170 bytes .../Consumable/Drinks/mopwata.rsi/fill-5.png | Bin 0 -> 197 bytes .../Drinks/mopwata.rsi/icon_empty.png | Bin 0 -> 535 bytes .../Drinks/mopwata.rsi/icon_open.png | Bin 0 -> 524 bytes .../Consumable/Drinks/mopwata.rsi/meta.json | 36 ++++- .../Drinks/oatmilk.rsi/icon_open.png | Bin 0 -> 384 bytes .../Consumable/Drinks/oatmilk.rsi/meta.json | 18 ++- .../Drinks/orangejuice.rsi/icon.png | Bin 597 -> 617 bytes .../Drinks/orangejuice.rsi/icon_open.png | Bin 0 -> 631 bytes .../Drinks/orangejuice.rsi/meta.json | 18 ++- .../Drinks/patronbottle.rsi/fill-1.png | Bin 0 -> 142 bytes .../Drinks/patronbottle.rsi/fill-2.png | Bin 0 -> 183 bytes .../Drinks/patronbottle.rsi/fill-3.png | Bin 0 -> 194 bytes .../Drinks/patronbottle.rsi/fill-4.png | Bin 0 -> 202 bytes .../Drinks/patronbottle.rsi/fill-5.png | Bin 0 -> 205 bytes .../Drinks/patronbottle.rsi/icon_empty.png | Bin 0 -> 548 bytes .../Drinks/patronbottle.rsi/icon_open.png | Bin 0 -> 487 bytes .../Drinks/patronbottle.rsi/meta.json | 36 ++++- .../Drinks/pwinebottle.rsi/icon_open.png | Bin 0 -> 502 bytes .../Drinks/pwinebottle.rsi/meta.json | 18 ++- .../Drinks/rumbottle.rsi/fill-1.png | Bin 0 -> 140 bytes .../Drinks/rumbottle.rsi/fill-2.png | Bin 0 -> 136 bytes .../Drinks/rumbottle.rsi/fill-3.png | Bin 0 -> 136 bytes .../Drinks/rumbottle.rsi/fill-4.png | Bin 0 -> 161 bytes .../Drinks/rumbottle.rsi/fill-5.png | Bin 0 -> 160 bytes .../Drinks/rumbottle.rsi/icon_empty.png | Bin 0 -> 465 bytes .../Drinks/rumbottle.rsi/icon_open.png | Bin 0 -> 457 bytes .../Consumable/Drinks/rumbottle.rsi/meta.json | 36 ++++- .../Consumable/Drinks/soymilk.rsi/icon.png | Bin 361 -> 363 bytes .../Drinks/soymilk.rsi/icon_open.png | Bin 0 -> 365 bytes .../Consumable/Drinks/soymilk.rsi/meta.json | 18 ++- .../Drinks/space-up_bottle.rsi/fill-1.png | Bin 0 -> 147 bytes .../Drinks/space-up_bottle.rsi/fill-2.png | Bin 0 -> 176 bytes .../Drinks/space-up_bottle.rsi/fill-3.png | Bin 0 -> 180 bytes .../Drinks/space-up_bottle.rsi/fill-4.png | Bin 0 -> 176 bytes .../Drinks/space-up_bottle.rsi/fill-5.png | Bin 0 -> 244 bytes .../Drinks/space-up_bottle.rsi/icon_empty.png | Bin 0 -> 557 bytes .../Drinks/space-up_bottle.rsi/icon_open.png | Bin 0 -> 551 bytes .../Drinks/space-up_bottle.rsi/meta.json | 36 ++++- .../space_mountain_wind_bottle.rsi/fill-1.png | Bin 0 -> 147 bytes .../space_mountain_wind_bottle.rsi/fill-2.png | Bin 0 -> 176 bytes .../space_mountain_wind_bottle.rsi/fill-3.png | Bin 0 -> 180 bytes .../space_mountain_wind_bottle.rsi/fill-4.png | Bin 0 -> 176 bytes .../space_mountain_wind_bottle.rsi/fill-5.png | Bin 0 -> 244 bytes .../icon_empty.png | Bin 0 -> 578 bytes .../icon_open.png | Bin 0 -> 585 bytes .../space_mountain_wind_bottle.rsi/meta.json | 36 ++++- .../Drinks/tequillabottle.rsi/fill-1.png | Bin 0 -> 121 bytes .../Drinks/tequillabottle.rsi/fill-2.png | Bin 0 -> 130 bytes .../Drinks/tequillabottle.rsi/fill-3.png | Bin 0 -> 132 bytes .../Drinks/tequillabottle.rsi/fill-4.png | Bin 0 -> 166 bytes .../Drinks/tequillabottle.rsi/fill-5.png | Bin 0 -> 205 bytes .../Drinks/tequillabottle.rsi/icon_empty.png | Bin 0 -> 608 bytes .../Drinks/tequillabottle.rsi/icon_open.png | Bin 0 -> 596 bytes .../Drinks/tequillabottle.rsi/meta.json | 36 ++++- .../Drinks/tomatojuice.rsi/icon_open.png | Bin 0 -> 411 bytes .../Drinks/tomatojuice.rsi/meta.json | 18 ++- .../Drinks/vermouthbottle.rsi/fill-1.png | Bin 0 -> 137 bytes .../Drinks/vermouthbottle.rsi/fill-2.png | Bin 0 -> 180 bytes .../Drinks/vermouthbottle.rsi/fill-3.png | Bin 0 -> 189 bytes .../Drinks/vermouthbottle.rsi/fill-4.png | Bin 0 -> 216 bytes .../Drinks/vermouthbottle.rsi/fill-5.png | Bin 0 -> 260 bytes .../Drinks/vermouthbottle.rsi/icon_empty.png | Bin 0 -> 557 bytes .../Drinks/vermouthbottle.rsi/icon_open.png | Bin 0 -> 587 bytes .../Drinks/vermouthbottle.rsi/meta.json | 36 ++++- .../Drinks/vodkabottle.rsi/fill-1.png | Bin 0 -> 135 bytes .../Drinks/vodkabottle.rsi/fill-2.png | Bin 0 -> 124 bytes .../Drinks/vodkabottle.rsi/fill-3.png | Bin 0 -> 124 bytes .../Drinks/vodkabottle.rsi/fill-4.png | Bin 0 -> 148 bytes .../Drinks/vodkabottle.rsi/fill-5.png | Bin 0 -> 182 bytes .../Drinks/vodkabottle.rsi/icon_empty.png | Bin 0 -> 490 bytes .../Drinks/vodkabottle.rsi/icon_open.png | Bin 0 -> 498 bytes .../Drinks/vodkabottle.rsi/meta.json | 36 ++++- .../Drinks/waterbottle.rsi/icon_open.png | Bin 0 -> 382 bytes .../Drinks/waterbottle.rsi/meta.json | 3 + .../Drinks/whiskeybottle.rsi/fill-1.png | Bin 0 -> 135 bytes .../Drinks/whiskeybottle.rsi/fill-2.png | Bin 0 -> 124 bytes .../Drinks/whiskeybottle.rsi/fill-3.png | Bin 0 -> 124 bytes .../Drinks/whiskeybottle.rsi/fill-4.png | Bin 0 -> 147 bytes .../Drinks/whiskeybottle.rsi/fill-5.png | Bin 0 -> 191 bytes .../Drinks/whiskeybottle.rsi/icon_empty.png | Bin 0 -> 521 bytes .../Drinks/whiskeybottle.rsi/icon_open.png | Bin 0 -> 521 bytes .../Drinks/whiskeybottle.rsi/meta.json | 36 ++++- .../Consumable/Drinks/winebottle.rsi/icon.png | Bin 540 -> 526 bytes .../Drinks/winebottle.rsi/icon_open.png | Bin 0 -> 539 bytes .../Drinks/winebottle.rsi/meta.json | 18 ++- .../Food/condiments.rsi/bottle-open.png | Bin 0 -> 260 bytes .../Consumable/Food/condiments.rsi/meta.json | 9 ++ .../Food/condiments.rsi/packet-label-a.png | Bin 0 -> 154 bytes .../Food/condiments.rsi/packet-layer-open.png | Bin 0 -> 258 bytes .../Food/condiments.rsi/packet-layer.png | Bin 220 -> 230 bytes .../whiskeybottle_empty.rsi/icon.png | Bin 521 -> 534 bytes .../Objects/Fun/glue.rsi/icon_open.png | Bin 0 -> 570 bytes .../Textures/Objects/Fun/glue.rsi/meta.json | 3 + 201 files changed, 1039 insertions(+), 135 deletions(-) create mode 100644 Resources/Textures/Objects/Consumable/Drinks/absinthebottle.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/absinthebottle.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/absinthebottle.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/absinthebottle.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/absinthebottle.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/absinthebottle.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/absinthebottle.rsi/icon_open.png delete mode 100644 Resources/Textures/Objects/Consumable/Drinks/alco-blue.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/fill-6.png rename Resources/Textures/Objects/Consumable/Drinks/{alco-blue.rsi/icon.png => alco-bottle.rsi/icon_blue.png} (100%) create mode 100644 Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/icon_empty.png rename Resources/Textures/Objects/Consumable/Drinks/{alco-green.rsi/icon.png => alco-bottle.rsi/icon_green.png} (100%) create mode 100644 Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/icon_open.png rename Resources/Textures/Objects/Consumable/Drinks/{alco-red.rsi/icon.png => alco-bottle.rsi/icon_red.png} (100%) rename Resources/Textures/Objects/Consumable/Drinks/{alco-white.rsi/icon.png => alco-bottle.rsi/icon_white.png} (100%) create mode 100644 Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/meta.json delete mode 100644 Resources/Textures/Objects/Consumable/Drinks/alco-green.rsi/meta.json delete mode 100644 Resources/Textures/Objects/Consumable/Drinks/alco-red.rsi/meta.json delete mode 100644 Resources/Textures/Objects/Consumable/Drinks/alco-white.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Drinks/alebottle.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/alebottle.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/alebottle.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/alebottle.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/alebottle.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/alebottle.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/alebottle.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/beer.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/beer.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/beer.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/beer.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/beer.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/beer.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/beer.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/bottleofnothing.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/champagnebottle.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/coffeeliqueurbottle.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/cognacbottle.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/cognacbottle.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/cognacbottle.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/cognacbottle.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/cognacbottle.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/cognacbottle.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/cognacbottle.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/colabottle.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/colabottle.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/colabottle.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/colabottle.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/colabottle.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/colabottle.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/colabottle.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/cream.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/gildlagerbottle.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/gildlagerbottle.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/gildlagerbottle.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/gildlagerbottle.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/gildlagerbottle.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/gildlagerbottle.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/gildlagerbottle.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/ginbottle.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/ginbottle.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/ginbottle.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/ginbottle.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/ginbottle.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/ginbottle.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/ginbottle.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/glue-tube.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/grenadinebottle.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/grenadinebottle.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/grenadinebottle.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/grenadinebottle.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/grenadinebottle.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/grenadinebottle.rsi/fill-6.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/grenadinebottle.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/grenadinebottle.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/limejuice.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/lube-tube.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/milk.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/mopwata.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/mopwata.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/mopwata.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/mopwata.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/mopwata.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/mopwata.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/mopwata.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/oatmilk.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/orangejuice.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/patronbottle.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/patronbottle.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/patronbottle.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/patronbottle.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/patronbottle.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/patronbottle.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/patronbottle.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/pwinebottle.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/rumbottle.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/rumbottle.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/rumbottle.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/rumbottle.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/rumbottle.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/rumbottle.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/rumbottle.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/soymilk.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space-up_bottle.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space-up_bottle.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space-up_bottle.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space-up_bottle.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space-up_bottle.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space-up_bottle.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space-up_bottle.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_bottle.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_bottle.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_bottle.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_bottle.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_bottle.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_bottle.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_bottle.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tequillabottle.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tequillabottle.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tequillabottle.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tequillabottle.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tequillabottle.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tequillabottle.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tequillabottle.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/tomatojuice.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/vermouthbottle.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/vermouthbottle.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/vermouthbottle.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/vermouthbottle.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/vermouthbottle.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/vermouthbottle.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/vermouthbottle.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/vodkabottle.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/vodkabottle.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/vodkabottle.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/vodkabottle.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/vodkabottle.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/vodkabottle.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/vodkabottle.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/waterbottle.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/whiskeybottle.rsi/fill-1.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/whiskeybottle.rsi/fill-2.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/whiskeybottle.rsi/fill-3.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/whiskeybottle.rsi/fill-4.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/whiskeybottle.rsi/fill-5.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/whiskeybottle.rsi/icon_empty.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/whiskeybottle.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Drinks/winebottle.rsi/icon_open.png create mode 100644 Resources/Textures/Objects/Consumable/Food/condiments.rsi/bottle-open.png create mode 100644 Resources/Textures/Objects/Consumable/Food/condiments.rsi/packet-label-a.png create mode 100644 Resources/Textures/Objects/Consumable/Food/condiments.rsi/packet-layer-open.png create mode 100644 Resources/Textures/Objects/Fun/glue.rsi/icon_open.png diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml index 345611bd87f..cab95b0803b 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks-cartons.yml @@ -36,7 +36,23 @@ solution: drink - type: entity - parent: DrinkCartonBaseFull + id: DrinkCartonVisualsOpenable + abstract: true + components: + - type: Appearance + - type: GenericVisualizer + visuals: + enum.OpenableVisuals.Opened: + enum.OpenableVisuals.Layer: + True: {state: "icon_open"} + False: {state: "icon"} + - type: Sprite + layers: + - state: icon + map: ["enum.OpenableVisuals.Layer"] + +- type: entity + parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseFull] id: DrinkJuiceLimeCarton name: lime juice description: Sweet-sour goodness. @@ -51,7 +67,7 @@ sprite: Objects/Consumable/Drinks/limejuice.rsi - type: entity - parent: DrinkCartonBaseFull + parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseFull] id: DrinkJuiceOrangeCarton name: orange juice description: Full of vitamins and deliciousness! @@ -66,7 +82,7 @@ sprite: Objects/Consumable/Drinks/orangejuice.rsi - type: entity - parent: DrinkCartonBaseFull + parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseFull] id: DrinkJuiceTomatoCarton name: tomato juice description: Well, at least it LOOKS like tomato juice. You can't tell with all that redness. @@ -81,7 +97,7 @@ sprite: Objects/Consumable/Drinks/tomatojuice.rsi - type: entity - parent: DrinkCartonBaseFull + parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseFull] id: DrinkCreamCarton name: milk cream description: It's cream. Made from milk. What else did you think you'd find in there? @@ -96,7 +112,7 @@ sprite: Objects/Consumable/Drinks/cream.rsi - type: entity - parent: DrinkCartonBaseFull + parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseFull] id: DrinkMilkCarton name: milk description: An opaque white liquid produced by the mammary glands of mammals. @@ -112,7 +128,7 @@ sprite: Objects/Consumable/Drinks/milk.rsi - type: entity - parent: DrinkCartonBaseFull + parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseFull] id: DrinkSoyMilkCarton name: soy milk description: White and nutritious soy goodness! @@ -128,7 +144,7 @@ sprite: Objects/Consumable/Drinks/soymilk.rsi - type: entity - parent: DrinkCartonBaseFull + parent: [DrinkCartonVisualsOpenable, DrinkCartonBaseFull] id: DrinkOatMilkCarton name: oat milk description: It's oat milk. Tan and nutritious goodness! diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml index 2c156d58289..b0b2c2729f9 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml @@ -79,7 +79,46 @@ Glass: 100 - type: entity - parent: DrinkBottleGlassBaseFull + id: DrinkBottleVisualsOpenable + abstract: true + components: + - type: Appearance + - type: GenericVisualizer + visuals: + enum.OpenableVisuals.Opened: + enum.OpenableVisuals.Layer: + True: {state: "icon_open"} + False: {state: "icon"} + - type: Sprite + layers: + - state: icon + map: ["enum.OpenableVisuals.Layer"] + +- type: entity + id: DrinkBottleVisualsAll + abstract: true + components: + - type: Appearance + - type: GenericVisualizer + visuals: + enum.OpenableVisuals.Opened: + enum.OpenableVisuals.Layer: + True: {state: "icon_open"} + False: {state: "icon_empty"} + - type: Sprite + sprite: Objects/Consumable/Drinks/alco-bottle.rsi + layers: + - state: icon + map: ["enum.OpenableVisuals.Layer"] + - state: fill-1 + map: ["enum.SolutionContainerLayers.Fill"] + visible: false + - type: SolutionContainerVisuals + maxFillLevels: 5 + fillBaseName: fill- + +- type: entity + parent: [DrinkBottleVisualsAll, DrinkBottleGlassBaseFull] id: DrinkAbsintheBottleFull name: Jailbreaker Verte description: One sip of this and you just know you're gonna have a good time. @@ -94,7 +133,7 @@ sprite: Objects/Consumable/Drinks/absinthebottle.rsi - type: entity - parent: DrinkBottleGlassBaseFull + parent: [DrinkBottleVisualsAll, DrinkBottleGlassBaseFull] id: DrinkBlueCuracaoBottleFull name: Miss Blue Curacao description: A fruity, exceptionally azure drink. Does not allow the imbiber to use the fifth magic. @@ -106,10 +145,19 @@ - ReagentId: BlueCuracao Quantity: 100 - type: Sprite - sprite: Objects/Consumable/Drinks/alco-blue.rsi + sprite: Objects/Consumable/Drinks/alco-bottle.rsi + layers: + - state: icon_blue + map: ["enum.OpenableVisuals.Layer"] + - state: fill-1 + map: ["enum.SolutionContainerLayers.Fill"] + visible: false + - type: SolutionContainerVisuals + maxFillLevels: 6 + fillBaseName: fill- - type: entity - parent: DrinkBottleGlassBaseFull + parent: [DrinkBottleVisualsOpenable, DrinkBottleGlassBaseFull] id: DrinkBottleOfNothingFull name: bottle of nothing description: A bottle filled with nothing. @@ -124,7 +172,7 @@ sprite: Objects/Consumable/Drinks/bottleofnothing.rsi - type: entity - parent: DrinkBottleGlassBaseFull + parent: [DrinkBottleVisualsOpenable, DrinkBottleGlassBaseFull] id: DrinkChampagneBottleFull name: champagne bottle description: Only people devoid of imagination can't find an excuse for champagne. @@ -139,7 +187,7 @@ sprite: Objects/Consumable/Drinks/champagnebottle.rsi - type: entity - parent: DrinkBottleGlassBaseFull + parent: [DrinkBottleVisualsAll, DrinkBottleGlassBaseFull] id: DrinkCognacBottleFull name: cognac bottle description: A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. You might as well not scream 'SHITCURITY' this time. @@ -156,7 +204,7 @@ sprite: Objects/Consumable/Drinks/cognacbottle.rsi - type: entity - parent: DrinkBottlePlasticBaseFull + parent: [DrinkBottleVisualsAll, DrinkBottlePlasticBaseFull] id: DrinkColaBottleFull name: space cola bottle description: Cola. In space. @@ -172,9 +220,8 @@ - type: Sprite sprite: Objects/Consumable/Drinks/colabottle.rsi - - type: entity - parent: DrinkBottleGlassBaseFull + parent: [DrinkBottleVisualsAll, DrinkBottleGlassBaseFull] id: DrinkGrenadineBottleFull name: briar rose grenadine syrup bottle description: Sweet and tangy, a bar syrup used to add color or flavor to drinks. @@ -190,9 +237,11 @@ opened: true - type: Sprite sprite: Objects/Consumable/Drinks/grenadinebottle.rsi + - type: SolutionContainerVisuals + maxFillLevels: 6 - type: entity - parent: DrinkBottleGlassBaseFull + parent: [DrinkBottleVisualsAll, DrinkBottleGlassBaseFull] id: DrinkGinBottleFull name: Griffeater gin description: A bottle of high quality gin, produced in the New London Space Station. @@ -209,7 +258,7 @@ sprite: Objects/Consumable/Drinks/ginbottle.rsi - type: entity - parent: DrinkBottleGlassBaseFull + parent: [DrinkBottleVisualsAll, DrinkBottleGlassBaseFull] id: DrinkGildlagerBottleFull name: gildlager bottle description: 100 proof cinnamon schnapps, made for alcoholic teen girls on spring break. @@ -224,7 +273,7 @@ sprite: Objects/Consumable/Drinks/gildlagerbottle.rsi - type: entity - parent: DrinkBottleGlassBaseFull + parent: [DrinkBottleVisualsOpenable, DrinkBottleGlassBaseFull] id: DrinkCoffeeLiqueurBottleFull name: coffee liqueur bottle description: The great taste of coffee with none of the benifits. @@ -241,7 +290,7 @@ sprite: Objects/Consumable/Drinks/coffeeliqueurbottle.rsi - type: entity - parent: DrinkBottleGlassBaseFull + parent: [DrinkBottleVisualsAll, DrinkBottleGlassBaseFull] id: DrinkMelonLiquorBottleFull name: emeraldine melon liquor description: A bottle of 46 proof Emeraldine Melon Liquor. Sweet and light. @@ -253,10 +302,19 @@ - ReagentId: MelonLiquor Quantity: 100 - type: Sprite - sprite: Objects/Consumable/Drinks/alco-green.rsi + sprite: Objects/Consumable/Drinks/alco-bottle.rsi + layers: + - state: icon_green + map: ["enum.OpenableVisuals.Layer"] + - state: fill-1 + map: ["enum.SolutionContainerLayers.Fill"] + visible: false + - type: SolutionContainerVisuals + maxFillLevels: 6 + fillBaseName: fill- - type: entity - parent: DrinkBottleGlassBaseFull + parent: [DrinkBottleVisualsAll, DrinkBottleGlassBaseFull] id: DrinkPatronBottleFull name: wrapp artiste patron bottle description: Silver laced tequilla, served in space night clubs across the galaxy. @@ -271,7 +329,7 @@ sprite: Objects/Consumable/Drinks/patronbottle.rsi - type: entity - parent: DrinkBottleGlassBaseFull + parent: [DrinkBottleVisualsOpenable, DrinkBottleGlassBaseFull] id: DrinkPoisonWinebottleFull name: warlock's velvet bottle description: What a delightful packaging for a surely high quality wine! The vintage must be amazing! @@ -286,7 +344,7 @@ sprite: Objects/Consumable/Drinks/pwinebottle.rsi - type: entity - parent: DrinkBottleGlassBaseFull + parent: [DrinkBottleVisualsAll, DrinkBottleGlassBaseFull] id: DrinkRumBottleFull name: captain pete's Cuban spiced rum description: This isn't just rum, oh no. It's practically GRIFF in a bottle. @@ -303,7 +361,7 @@ sprite: Objects/Consumable/Drinks/rumbottle.rsi - type: entity - parent: DrinkBottlePlasticBaseFull + parent: [DrinkBottleVisualsAll, DrinkBottlePlasticBaseFull] id: DrinkSpaceMountainWindBottleFull name: space mountain wind bottle description: Blows right through you like a space wind. @@ -321,7 +379,7 @@ sprite: Objects/Consumable/Drinks/space_mountain_wind_bottle.rsi - type: entity - parent: DrinkBottlePlasticBaseFull + parent: [DrinkBottleVisualsAll, DrinkBottlePlasticBaseFull] id: DrinkSpaceUpBottleFull name: space-up bottle description: Tastes like a hull breach in your mouth. @@ -339,7 +397,7 @@ sprite: Objects/Consumable/Drinks/space-up_bottle.rsi - type: entity - parent: DrinkBottleGlassBaseFull + parent: [DrinkBottleVisualsAll, DrinkBottleGlassBaseFull] id: DrinkTequilaBottleFull name: caccavo guaranteed quality tequila bottle description: Made from premium petroleum distillates, pure thalidomide and other fine quality ingredients! @@ -356,7 +414,7 @@ sprite: Objects/Consumable/Drinks/tequillabottle.rsi - type: entity - parent: DrinkBottleGlassBaseFull + parent: [DrinkBottleVisualsAll, DrinkBottleGlassBaseFull] id: DrinkVermouthBottleFull name: goldeneye vermouth bottle description: Sweet, sweet dryness! @@ -373,7 +431,7 @@ sprite: Objects/Consumable/Drinks/vermouthbottle.rsi - type: entity - parent: DrinkBottleGlassBaseFull + parent: [DrinkBottleVisualsAll, DrinkBottleGlassBaseFull] id: DrinkVodkaBottleFull name: vodka bottle description: Aah, vodka. Prime choice of drink AND fuel by Russians worldwide. @@ -390,7 +448,7 @@ sprite: Objects/Consumable/Drinks/vodkabottle.rsi - type: entity - parent: DrinkBottleGlassBaseFull + parent: [DrinkBottleVisualsAll, DrinkBottleGlassBaseFull] id: DrinkWhiskeyBottleFull name: uncle git's special reserve description: A premium single-malt whiskey, gently matured inside the tunnels of a nuclear shelter. TUNNEL WHISKEY RULES. @@ -407,7 +465,7 @@ sprite: Objects/Consumable/Drinks/whiskeybottle.rsi - type: entity - parent: DrinkBottleGlassBaseFull + parent: [DrinkBottleVisualsOpenable, DrinkBottleGlassBaseFull] id: DrinkWineBottleFull name: doublebearded bearded special wine bottle description: A faint aura of unease and asspainery surrounds the bottle. @@ -426,7 +484,7 @@ # Small Bottles - type: entity - parent: DrinkBottleGlassBaseFull + parent: [DrinkBottleVisualsAll, DrinkBottleGlassBaseFull] id: DrinkBeerBottleFull name: beer # beer it is. coffee. beer? coff-ee? be-er? c-o... b-e description: An alcoholic beverage made from malted grains, hops, yeast, and water. @@ -444,7 +502,7 @@ sprite: Objects/Consumable/Drinks/beer.rsi - type: entity - parent: DrinkBottleGlassBaseFull + parent: [DrinkBottleVisualsAll, DrinkBottleGlassBaseFull] id: DrinkBeerGrowler # Needs to be renamed DrinkBeerBottleFull name: Beer Growler # beer it is. coffee. beer? coff-ee? be-er? c-o... b-e description: An alcoholic beverage made from malted grains, hops, yeast, and water. XL growler bottle. @@ -463,7 +521,7 @@ - type: entity - parent: DrinkBottlePlasticBaseFull + parent: [DrinkBottleVisualsAll, DrinkBottlePlasticBaseFull] id: DrinkAleBottleFull name: Magm-Ale description: A true dorf's drink of choice. @@ -482,7 +540,7 @@ sprite: Objects/Consumable/Drinks/alebottle.rsi - type: entity - parent: DrinkBottlePlasticBaseFull + parent: [DrinkBottleVisualsAll, DrinkBottlePlasticBaseFull] id: DrinkAleBottleFullGrowler name: Magm-Ale Growler description: A true dorf's drink of choice. XL growler bottle. @@ -500,7 +558,7 @@ sprite: Objects/Consumable/Drinks/alebottle.rsi - type: entity - parent: DrinkBottlePlasticBaseFull + parent: [DrinkBottleVisualsOpenable, DrinkBottlePlasticBaseFull] id: DrinkWaterBottleFull name: water bottle description: Simple clean water of unknown origin. You think that maybe you dont want to know it. @@ -519,6 +577,7 @@ sprite: Objects/Consumable/Drinks/waterbottle.rsi layers: - state: icon + map: ["enum.OpenableVisuals.Layer"] - state: icon-1 map: ["enum.SolutionContainerLayers.Fill"] visible: false @@ -564,7 +623,7 @@ # Cartons, TODO: this needs to be moved elsewhere eventually, since cartons shouldnt smash into glass shards - type: entity - parent: DrinkBottlePlasticBaseFull + parent: [DrinkBottleVisualsOpenable, DrinkBottlePlasticBaseFull] id: DrinkJuiceLimeCartonXL name: lime juice XL description: Sweet-sour goodness. @@ -583,7 +642,7 @@ sprite: Objects/Consumable/Drinks/limejuice.rsi - type: entity - parent: DrinkBottlePlasticBaseFull + parent: [DrinkBottleVisualsOpenable, DrinkBottlePlasticBaseFull] id: DrinkJuiceOrangeCartonXL name: orange juice XL description: Full of vitamins and deliciousness! @@ -602,7 +661,7 @@ sprite: Objects/Consumable/Drinks/orangejuice.rsi - type: entity - parent: DrinkBottlePlasticBaseFull + parent: [DrinkBottleVisualsOpenable, DrinkBottlePlasticBaseFull] id: DrinkCreamCartonXL name: Milk Cream XL description: It's cream. Made from milk. What else did you think you'd find in there? diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_fun.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_fun.yml index 359e4262cd1..2fd2331f91e 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_fun.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_fun.yml @@ -11,7 +11,7 @@ sprite: Objects/Consumable/Drinks/glue-tube.rsi layers: - state: icon - map: [ "enum.SolutionContainerLayers.Base" ] + map: ["enum.OpenableVisuals.Layer"] - state: fill1 map: [ "enum.SolutionContainerLayers.Fill" ] visible: false @@ -29,6 +29,12 @@ - type: SolutionContainerVisuals maxFillLevels: 6 fillBaseName: fill + - type: GenericVisualizer + visuals: + enum.OpenableVisuals.Opened: + enum.OpenableVisuals.Layer: + True: {state: "icon_open"} + False: {state: "icon"} - type: Tag tags: - DrinkSpaceGlue @@ -48,7 +54,7 @@ sprite: Objects/Consumable/Drinks/lube-tube.rsi layers: - state: icon - map: [ "enum.SolutionContainerLayers.Base" ] + map: ["enum.OpenableVisuals.Layer"] - state: fill1 map: [ "enum.SolutionContainerLayers.Fill" ] visible: false @@ -65,6 +71,12 @@ - type: SolutionContainerVisuals maxFillLevels: 6 fillBaseName: fill + - type: GenericVisualizer + visuals: + enum.OpenableVisuals.Opened: + enum.OpenableVisuals.Layer: + True: {state: "icon_open"} + False: {state: "icon"} - type: Lube - type: TrashOnSolutionEmpty solution: drink @@ -134,5 +146,21 @@ - type: RandomFillSolution solution: drink weightedRandomId: RandomFillMopwata + - type: Appearance + - type: GenericVisualizer + visuals: + enum.OpenableVisuals.Opened: + enum.OpenableVisuals.Layer: + True: {state: "icon_open"} + False: {state: "icon_empty"} - type: Sprite sprite: Objects/Consumable/Drinks/mopwata.rsi + layers: + - state: icon + map: ["enum.OpenableVisuals.Layer"] + - state: fill-1 + map: ["enum.SolutionContainerLayers.Fill"] + visible: false + - type: SolutionContainerVisuals + maxFillLevels: 5 + fillBaseName: fill- diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/condiments.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/condiments.yml index 5ae992319a3..197e7ea9829 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/condiments.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/condiments.yml @@ -49,7 +49,19 @@ - type: SolutionTransfer maxTransferAmount: 10 - type: Sprite - state: packet-empty + layers: + - state: packet-trans-2 + map: ["enum.SolutionContainerLayers.Fill"] + visible: true + - state: packet-layer + map: ["enum.OpenableVisuals.Layer"] + - state: packet-label + - type: GenericVisualizer + visuals: + enum.OpenableVisuals.Opened: + enum.OpenableVisuals.Layer: + True: {state: "packet-layer-open"} + False: {state: "packet-layer"} - type: Icon state: packet-empty - type: PhysicalComposition @@ -77,7 +89,9 @@ - state: packet-trans-2 map: ["enum.SolutionContainerLayers.Fill"] visible: true - - state: packet-astrotame + - state: packet-layer + map: ["enum.OpenableVisuals.Layer"] + - state: packet-label-a - type: Icon state: packet-astrotame - type: Appearance @@ -98,12 +112,6 @@ reagents: - ReagentId: BbqSauce Quantity: 10 - - type: Sprite - layers: - - state: packet-trans-2 - map: ["enum.SolutionContainerLayers.Fill"] - visible: true - - state: packet-layer - type: Icon state: packet-bbq - type: Appearance @@ -124,12 +132,6 @@ reagents: - ReagentId: Cornoil Quantity: 10 - - type: Sprite - layers: - - state: packet-trans-2 - map: ["enum.SolutionContainerLayers.Fill"] - visible: true - - state: packet-layer - type: Icon state: packet-cornoil - type: Appearance @@ -150,12 +152,6 @@ reagents: - ReagentId: Frostoil Quantity: 10 - - type: Sprite - layers: - - state: packet-trans-2 - map: ["enum.SolutionContainerLayers.Fill"] - visible: true - - state: packet-layer - type: Icon state: packet-frostoil - type: Appearance @@ -176,12 +172,6 @@ reagents: - ReagentId: HorseradishSauce Quantity: 10 - - type: Sprite - layers: - - state: packet-solid-2 - map: ["enum.SolutionContainerLayers.Fill"] - visible: true - - state: packet-layer - type: Icon state: packet-greygoo - type: Appearance @@ -202,12 +192,6 @@ reagents: - ReagentId: Hotsauce Quantity: 10 - - type: Sprite - layers: - - state: packet-trans-2 - map: ["enum.SolutionContainerLayers.Fill"] - visible: true - - state: packet-layer - type: Icon state: packet-hotsauce - type: Appearance @@ -228,11 +212,6 @@ - ReagentId: Ketchup Quantity: 10 - type: Sprite - layers: - - state: packet-solid-2 - map: ["enum.SolutionContainerLayers.Fill"] - visible: true - - state: packet-layer - type: Icon state: packet-ketchup - type: Appearance @@ -252,12 +231,6 @@ reagents: - ReagentId: Mustard Quantity: 10 - - type: Sprite - layers: - - state: packet-solid-2 - map: ["enum.SolutionContainerLayers.Fill"] - visible: true - - state: packet-layer - type: Icon state: packet-mustard - type: Appearance @@ -277,12 +250,6 @@ reagents: - ReagentId: Blackpepper Quantity: 10 - - type: Sprite - layers: - - state: packet-solid-2 - map: ["enum.SolutionContainerLayers.Fill"] - visible: true - - state: packet-layer - type: Icon state: packet-pepper - type: Appearance @@ -308,6 +275,7 @@ map: ["enum.SolutionContainerLayers.Fill"] visible: true - state: packet-layer + map: ["enum.OpenableVisuals.Layer"] - state: packet-label color: black - type: Icon @@ -329,12 +297,6 @@ reagents: - ReagentId: Soysauce Quantity: 10 - - type: Sprite - layers: - - state: packet-solid-2 - map: ["enum.SolutionContainerLayers.Fill"] - visible: true - - state: packet-layer - type: Icon state: packet-soysauce - type: Appearance @@ -354,12 +316,6 @@ reagents: - ReagentId: Sugar Quantity: 10 - - type: Sprite - layers: - - state: packet-solid-2 - map: ["enum.SolutionContainerLayers.Fill"] - visible: true - - state: packet-layer - type: Icon state: packet-sugar - type: Appearance @@ -399,6 +355,12 @@ - type: SolutionContainerVisuals maxFillLevels: 6 fillBaseName: bottle-alpha- + - type: GenericVisualizer + visuals: + enum.OpenableVisuals.Opened: + enum.OpenableVisuals.Layer: + True: {state: "bottle-open"} + False: {state: "bottle-empty"} - type: PhysicalComposition materialComposition: Glass: 50 @@ -418,6 +380,7 @@ - type: Sprite layers: - state: bottle-empty + map: ["enum.OpenableVisuals.Layer"] - state: label-c - state: bottle-alpha-6 map: ["enum.SolutionContainerLayers.Fill"] @@ -443,6 +406,7 @@ - type: Sprite layers: - state: bottle-empty + map: ["enum.OpenableVisuals.Layer"] - state: label-e - state: bottle-alpha-6 map: ["enum.SolutionContainerLayers.Fill"] @@ -468,6 +432,7 @@ - type: Sprite layers: - state: bottle-empty + map: ["enum.OpenableVisuals.Layer"] - state: label-v - state: bottle-alpha-6 map: ["enum.SolutionContainerLayers.Fill"] @@ -490,6 +455,7 @@ - type: Sprite layers: - state: bottle-empty + map: ["enum.OpenableVisuals.Layer"] - state: label-h - state: bottle-alpha-6 map: ["enum.SolutionContainerLayers.Fill"] @@ -515,6 +481,7 @@ - type: Sprite layers: - state: bottle-empty + map: ["enum.OpenableVisuals.Layer"] - state: label-k - state: bottle-alpha-6 map: ["enum.SolutionContainerLayers.Fill"] @@ -540,6 +507,7 @@ - type: Sprite layers: - state: bottle-empty + map: ["enum.OpenableVisuals.Layer"] - state: label-b - state: bottle-alpha-6 map: ["enum.SolutionContainerLayers.Fill"] diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml index 17838b0fdeb..75259bfaf76 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml @@ -1213,7 +1213,16 @@ - type: Sprite sprite: Objects/Fun/glue.rsi state: icon + layers: + - state: icon + map: ["enum.OpenableVisuals.Layer"] - type: Appearance + - type: GenericVisualizer + visuals: + enum.OpenableVisuals.Opened: + enum.OpenableVisuals.Layer: + True: {state: "icon_open"} + False: {state: "icon"} - type: Glue consumptionUnit: 10 - type: Item diff --git a/Resources/Textures/Objects/Consumable/Drinks/absinthebottle.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/absinthebottle.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..e9d7a95189d8cf9850722aacbabe66eea5d0963a GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}PM$7~ArY-_ z&u!#oP~c%c*dU=3+1?nTF4@~9#@OZZIXrrsD^M8&!~ChUH|*vQy_=@wbY{)`vTd`O fvlW7Ua}PIj3deJLtO|1d2~y?h>gTe~DWM4fQl}_Z literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/absinthebottle.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/absinthebottle.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..745b1b6087ef221c7100fbe5e275a4d40f3f4c70 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}PM$7~ArY-_ z&u!#oP~c&9OxV2UutVhW#WPtuSXfyv#lP10bq%PD;eq<3OJ!lZ-%bg6XZ_dg!4o~D gXD`ne3V&c?jIcEoxRST8?>tDEr>mdKI;Vst060u7!vFvP literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/absinthebottle.rsi/fill-3.png b/Resources/Textures/Objects/Consumable/Drinks/absinthebottle.rsi/fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..7b1add8abad6a851f846bbfddf68c594b6103c8a GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Zk{fVArY-_ zFC64#P!M2t6#QKuXT9@W60?>@6NmME0S--8psEA@Dy?s4Jl*De$wYqTZe^p-8oSLN kY%2@8wYT!=Pi7tmcE)=mdgj)CJV3P!p00i_>zopr045PCX#fBK literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/absinthebottle.rsi/fill-4.png b/Resources/Textures/Objects/Consumable/Drinks/absinthebottle.rsi/fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..102c82b37cf759415c0e238975eb58eae30ecf0b GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}VV*9IArY-_ zFBx(jFyL{%7*O^9;`PA1Wj;59rdNFYbpIJkvw$2kP~i?0&7AhPH}b2eiQIg5GMdxy zxzBTH|H{qHOSU}Q|9|o~wp+|o`Zg53jlU(Wz#yi%OKllj!-%@7lspDw7FR`ySh zp&|WqR>xkc2bGb}ubyUFbAUmW!RB{M{AcsWyglp|R^C@<89(MVV2I^nmY(!-`ZY(O OZ492SelF{r5}E+T$~IR3 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/absinthebottle.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/absinthebottle.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..ecdaec3e51e6fdc3a041b691238dec7ade3b3a98 GIT binary patch literal 495 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^TTOMtd0D*n`YmOTf z|5900ED|bnKvVC?hrds)EoR3!1d6b@wisxv&u>56^rRY<{|L+dB2*I+J7@a(*hcsa}@^x~QqV<$g`+i*H&* zGLC_I8WxI$W+`{~Z=N#4u}m)k2r5p$KXu^b`2z9n6Wj-vUzT&AqekuGcYiiAjxF<_oQLB#I%_D z0|l*(K;Wo1Yp!FTPx$j7da6R9J=Wl|M)VQ5?s=g&_^%Ac;9Rsbv&VCpdLnK~RejMPW%x(cmNvE#BbL zEVP7?<5EBGaWqc^S-?AkM{rt1qB6# zR;P{hN0;a+zLhIo0MMa&I^VZP84^!BX#fDc*`cG%4jl!6BbCSr&=4e5z;Rsl+w1p# zPL7TtB?!o6?-1PFsJa-2soSZN5}+1au>}JY z0N{N|aqV*b=wAZVZXQM?4FJ<8b7C=`jgo|rHH6-TL6|xG5ac+BX8-^mwd3g20>D;t z0$il75a$J$0%~H1tO`bkhu~XTmZOk%54c26%xKlH-h@GTC=`CLhxX?6v}HEwJDaN4 zNmRk=ZXUFqLY)7ZzuQcPL`7afXnO~=odRvANEHAGPk;?9xxc;?f?J) literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/absinthebottle.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/absinthebottle.rsi/meta.json index e8a2f8c21d0..960293f615a 100644 --- a/Resources/Textures/Objects/Consumable/Drinks/absinthebottle.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Drinks/absinthebottle.rsi/meta.json @@ -9,6 +9,27 @@ "states": [ { "name": "icon" + }, + { + "name": "icon_open" + }, + { + "name": "icon_empty" + }, + { + "name": "fill-1" + }, + { + "name": "fill-2" + }, + { + "name": "fill-3" + }, + { + "name": "fill-4" + }, + { + "name": "fill-5" } ] -} \ No newline at end of file +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/alco-blue.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/alco-blue.rsi/meta.json deleted file mode 100644 index db0ac608ed0..00000000000 --- a/Resources/Textures/Objects/Consumable/Drinks/alco-blue.rsi/meta.json +++ /dev/null @@ -1 +0,0 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", "states": [{"name": "icon"}]} \ No newline at end of file diff --git a/Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..bbb021eb2eeee5d663b7ad8e31ce5078ba6a36aa GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}9-c0aArY-_ z&u!#AV8FxdsO51w)M&%;Pg*h#EAOu2{&aoCBWEF?x`zF$UvAj_U2s*E+T7}22co>U oO?BC}Tr&3Y(j_X#S?yl3CLZEjuTsK152%*G)78&qol`;+0NNxmsQ>@~ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..b9d62612269afddb89575d0a378828f714b8ae8e GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}fu1goArY-_ z&u!#waNu#i$Z|1F^x8SQHIEpbSRdV*QzG!06E3Y~j+!taYWZ|-I{ x+8iyLW1Q;gtY@omQt8pjr|j>9-?P}gWV*XrJeAG!FSQ`fBBoFbxKOshyin<}Lak`^+Ro$OWi$!;G@-nU&L=SGhkwcTe`g zySrH%d#5NbdUAzPP%-V>lP`?lJIeoMA4rd5&?#rsveo$JDz3l_)W_iI>gTe~DWM4f DEwMN) literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/fill-4.png b/Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..34088c12e0cd42e41ef68a821b2dfacb2a962a78 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}xt=bLArY-_ zFK*;*FyL{y$i1l7J@Nl7WrHqThZRket|=%_tnSsej^}c4adBC#eevkETb8m~Pdo11 zT+FzN%ecAYz?ntq8(hVYA9q!;U*O(jZ2N$>pXpBRtd)%K`l4RjUS_U3VsV}8$60ZK b+ILKU60KIOkd*%iw3xxu)z4*}Q$iB}LT^GU literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/fill-5.png b/Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/fill-5.png new file mode 100644 index 0000000000000000000000000000000000000000..bbbff3ac084883493ef0a1d04548af6548e54068 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}ot`d^ArY-_ zrx@}bR^V~94|Sit_{+cL2`3ak^xZt^A`-UTDCqU}JtwbC7GP^q;Al!PK51of%wn3W zX01;3y=x6YTr(tBaiwirckr~;i8BI%3_IRPDJUr@eYxl8@{f@rAUpPr)P*SLb3Zp# zAL!X}+xCI94OhU`qw5$y|IgpeZ2aimf36=h)j68p&M9B&@o|bgUlGtz44$rjF6*2U Fng9>UQA7X$ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/fill-6.png b/Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/fill-6.png new file mode 100644 index 0000000000000000000000000000000000000000..f2b760876e58c5b5d1480a50f8d8b4a167dac700 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}ZJsWUArY-_ zrx@}bR^V~94|SWp_{+cNFHZH9pYdD1XhYP*z@Yt4eYeeXFcM&K{P14o^#h5=n{~Wi z=H4uhVD{3ycCq!kYIGUvidRY38A4f&{dcn)7`w1AEQ@7!VR31>XWenao`E52ZFekl zRQ3r=p!6T5b7lNHnszXMuWfwG*#EOh;l?>}r^3LMjpZt5fG%S2boFyt=akR{01cx| A=Kufz literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/alco-blue.rsi/icon.png b/Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/icon_blue.png similarity index 100% rename from Resources/Textures/Objects/Consumable/Drinks/alco-blue.rsi/icon.png rename to Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/icon_blue.png diff --git a/Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..851126deae31be142c0af3a6053136c6e981f999 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}t36#DLn2y} z6C_xj1!XJ>8Xg{KWae46Y?-=`udn}sA5R#>yksuz&Fj9?r~O@0LZWU$E}O6_-vTy? zQih*=0oQ8M^p(ZL9wp}OdTf2%_?LBp!okMl`t$$(|9}74|Ns9N8N_V-%M!WJ;DMsS ztA;@KfJY6puM{w-P8F0kl`&YdIN=Io2;&qLC%-I ZNKDawuw~~eEucdgJYD@<);T3K0RWk`RRsV5 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/alco-red.rsi/icon.png b/Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/icon_red.png similarity index 100% rename from Resources/Textures/Objects/Consumable/Drinks/alco-red.rsi/icon.png rename to Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/icon_red.png diff --git a/Resources/Textures/Objects/Consumable/Drinks/alco-white.rsi/icon.png b/Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/icon_white.png similarity index 100% rename from Resources/Textures/Objects/Consumable/Drinks/alco-white.rsi/icon.png rename to Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/icon_white.png diff --git a/Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/meta.json new file mode 100644 index 00000000000..f60e29d82ff --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Drinks/alco-bottle.rsi/meta.json @@ -0,0 +1,47 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", + "states": [ + { + "name": "icon_blue" + }, + { + "name": "icon_green" + }, + { + "name": "icon_red" + }, + { + "name": "icon_white" + }, + { + "name": "icon_open" + }, + { + "name": "icon_empty" + }, + { + "name": "fill-1" + }, + { + "name": "fill-2" + }, + { + "name": "fill-3" + }, + { + "name": "fill-4" + }, + { + "name": "fill-5" + }, + { + "name": "fill-6" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/alco-green.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/alco-green.rsi/meta.json deleted file mode 100644 index db0ac608ed0..00000000000 --- a/Resources/Textures/Objects/Consumable/Drinks/alco-green.rsi/meta.json +++ /dev/null @@ -1 +0,0 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", "states": [{"name": "icon"}]} \ No newline at end of file diff --git a/Resources/Textures/Objects/Consumable/Drinks/alco-red.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/alco-red.rsi/meta.json deleted file mode 100644 index db0ac608ed0..00000000000 --- a/Resources/Textures/Objects/Consumable/Drinks/alco-red.rsi/meta.json +++ /dev/null @@ -1 +0,0 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", "states": [{"name": "icon"}]} \ No newline at end of file diff --git a/Resources/Textures/Objects/Consumable/Drinks/alco-white.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/alco-white.rsi/meta.json deleted file mode 100644 index db0ac608ed0..00000000000 --- a/Resources/Textures/Objects/Consumable/Drinks/alco-white.rsi/meta.json +++ /dev/null @@ -1 +0,0 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", "states": [{"name": "icon"}]} \ No newline at end of file diff --git a/Resources/Textures/Objects/Consumable/Drinks/alebottle.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/alebottle.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..1f619fbaa5dd1e9183ff018d1099feca28ecb716 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}j-D=#ArY-_ z&mZIks&WoAc$X_PA$P}PmPudI9@U3mS~i0bsOrG`7~YVpS=@KGUoyYSD7erq%9%Ii f+1JDG+R|mO=<{mE+LW9DDr4|;^>bP0l+XkK8T~At literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/alebottle.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/alebottle.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..88227517204d8f85537dfb4f609a9c1f37da7c29 GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}0iG_7ArY-_ zFC64-aNu#d==!F5Mg6QR+FMvf|Ltz`Z0lhJDtwS{R9u$kzb)&)w+SVdDw(&| wty?V~k^7$Q{k{tyf3crpReJQ|%!f#IrU+@XR~vV)0cv6JboFyt=akR{0I?!B6#xJL literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/alebottle.rsi/fill-3.png b/Resources/Textures/Objects/Consumable/Drinks/alebottle.rsi/fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..6d10fc3f83fab31b18aa137b3843a946b18c25b1 GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}VV*9IArY-_ zFF0~F81T4URJymjV!w>~??U~sH(LT)|4-vwI$4tysPKi#O0QM<&o8^We4e~K_OzK; z`W<`bJE3o{!L?&-yR*&&+o&UoIDAG9kdDb?$17*{->~K*b9rT+L_Pd?@Ep;&$%# zVn!F0T~BW_n5WhG+^R00J@e)!##0rO)1ox;6V5U$UNwDh%ggi`bAPPe(^$X|I=61? dJ*hv}SRdY!U!ykd_Isdd44$rjF6*2UngBj*MrHs2 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/alebottle.rsi/fill-5.png b/Resources/Textures/Objects/Consumable/Drinks/alebottle.rsi/fill-5.png new file mode 100644 index 0000000000000000000000000000000000000000..6cf2364cfd76ff634e1f366484355c2e4681943d GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}9iA?ZArY-_ zCp&T-P~c(NzSMpG4pyJPRbIf$;GpShpWhiuklT9H< zI5ky6QP2|M(yyfgp~;~=2m-HAlvHR66>DT1R!asOzfr<0H4oiE6-(DpnpX`Gf5h1dtH^xkrohx zv4e%sdkNqs{h)is9Ts>lT<(ty7Xj$6slb-A0sy7W=3+@cqa%T_v#)p3a9H5+{M0I6 zm)qqvq44syV`t$|jRW?RWz@s&2RO0P@qY}rzXgVkG zoBU0Iyz#Rvb?5LU%q0ZE9YMGwF@J7JL_t(oh3%HTOF~f?#((!{&LK?=4*dZUM9~MDppbz<)RZFO z)Km>cK}&>7UrPl+lS6wH1m5C`f(o^S2CfZG5rRvb>1oJ>Xu8Mn65R(5_nhH<_??IM zJzTJ5%hrFFX0{-k%>q!|56EDs0f3=97}`o}0DiyUl%LZqz<-y5p$3NTXz#0vK0*~h z^quXx+!0*v2-gp@SE@eB2|O3icYLEI01VwR2kYGh0C-w!ZD!OxIszCx{`?wxmjUii zj%4|=+%B&PjhDAg8A=?Oo+{-g1Q?Glc2eFsfF;_S56c)%c@~Yy7|!+ziypb+9g$}J zEKfjr3OxNK0)LMg05aQC+}t^oe3TOym>8y>^HR@w@hvZ@+Nc3chMF`h$@aNfNfMZD zbPwP+^)~?u`p>fTZI_!cpAra99N~$RPpJo~Jcb2bP|z=0C!u^5%X`3d0%NNiTK&E8 r?a6(uRp|v55{KHU$$vsymg@sn-Ctl>Do$?z0000Px$g-Jv~R9J;$U>F6XU=)mWz(}fw0|yQ;FfcGMT7fq{X6Vb2a`27~gw zj0_A63=R$sB$>xTssmua#p5r-o*m3^_8T(IA=?2=BGVcjgT7v3U|?X_xc^YBwLYC4 zaPPv*dIgz_3=9km4BYRT85kIf>FWRn1_p*p`A~)@`DRe$0KJJ2de08>&0r!&li1U1 z4YF!6!GF2Bga2}M2iG5BGe0`3cRk%400Vj{C7hJ#r`Q4103@dYv8UG>et-LVNiU^@ z^U|E2?+gqK42LE($=DUtwU;q4tY=_g2qeY40S^JP9q{U8V-Sb2#aa$yi?xiucZJj4 z0dJo_4ElZ8mf`ndTLuQpquE=%#@Ib-;gC zx0UE(^Y*dMCdVwY>wPx$YDq*vR9J;$U>F6XU=)mWz(}sfi?h3fSh=|M)^FXe@8f8k;_fNTf6I@uV+VQjIM!`NaiD+?@remcg$)l>6Pk6|W4sISe<) q&Ah&fy{7wLQ8@QZ%fAIv6QlL>wFF8xmM=R3QtRpJ=d#Wzp$P!TnJ^~+ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/beer.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/beer.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..427623e18d05c78ca647324dbceea4f5d6a241e1 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}zMd|QArY-_ zFKpywFywI#6wEv6Gb7cekKJRc+Jr|XdPN`NwR>7rfhrm5g$3`P^ozR6vHXtQ2Ju}_ rCwjR&|HPSxDLbyQguaoobD4JSI!L*vtDnm{r-UW|=*%%) literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/beer.rsi/fill-3.png b/Resources/Textures/Objects/Consumable/Drinks/beer.rsi/fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..cfdd56ce4dd34d44a8a7051333bf0fc77993bc92 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}fu1goArY-_ zFKy&xFywI#6wEv6Gb7cekA26hSrbIm%{l*Emr`!jWdtgd(&i>_){F#xk#2_wY%%T!|M^0qS7zboFyt=akR{08TV7I{*Lx literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/beer.rsi/fill-4.png b/Resources/Textures/Objects/Consumable/Drinks/beer.rsi/fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..914871c0c4b1d0a68d573e7a5e5724e78a78eec7 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}HJ&bxArY-_ zr(EQ1P~dU#f9$q_M|hXd%{InAhdwl_*m_)faxedKT=fMeCl19H0sYOD!e?|^1$J$m zW1Q5peEGeHxeK@$cN{&VV_3?NkS=`Nb8oP};jC$eO=St9Sq)hWzF&Kzc7bn8lX14k r-A2(vQ~&>M3_A7rqU6yd={p&^rL-(o%T*r+x`V;f)z4*}Q$iB}>rYC} literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/beer.rsi/fill-5.png b/Resources/Textures/Objects/Consumable/Drinks/beer.rsi/fill-5.png new file mode 100644 index 0000000000000000000000000000000000000000..af50ba4dddf4433cb89e103104bc0f6b73a1a1fc GIT binary patch literal 224 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}vpiiKLn2z= zPCdwZ*nr11-n;MKF{uODDTmfPWPFor7y)nm*@oct6+h7+Zjs;oj{LtR^wd-_x}cAHEfw(HZGbpTE{uc*a>(M!}mdNA7&r zWcvMJwUAm=c6+VeYT1u(B!9#=#_#?1<-YC**%!R*&-G>quCd8yJ7+d8U7BtCXU1hJ WhPKY#i>-mKWbkzLb6Mw<&;$VMp;IaV literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/beer.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/beer.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..e21b03404b88e4bb5d9a55d38632c20e4b77d656 GIT binary patch literal 535 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/cognacbottle.rsi/fill-4.png b/Resources/Textures/Objects/Consumable/Drinks/cognacbottle.rsi/fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..8740f00aab46e1460973e3ab5bea437af4ac2646 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}vproLLn2z= zPO;`=R^(xA*HGQw*feQza9(4+^ZsZ-S8b6*58F=iIMd_cH@51G47|br>$YIVX$#os-l? z!SkUHFV*?`o(H1~wGI+ZBxvXKEbLq5+XDy%q zHx|rQWMOFNSa411_Vy{0te)i`IUp!F^QSDs20!;7OBj`IF*M9nHa=eWwvaj8Nle%| zIKV5AbIY2H8Lt}mv4r^~SBT`kzr{22B1g}xiu)3Ab1wuj1+$%NS@YHWK5Mz@o!wOn g_7|mpv#_=PvB_fBwfaAOK<6@ey85}Sb4q9e0C@Ub7XSbN literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/cognacbottle.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/cognacbottle.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..506b9adb05d4781fddf1a37cd6e76f0b9516e8cb GIT binary patch literal 537 zcmV+!0_OdRP)Px$(@8`@R9J=WmOp3{Q5?rVCxXi*L}%?(rw(Seh1?J@Q&AioDrpBh)kV-r0+Fk5 zi)3<&LzN0$s-5L%U!YWwKo6lVUWZr0w1o)5Ad$NB5L^SS~V`CNfsUk=8mXbEI*5Af)A zj_KKlbi)rEeA+b@IA^?aNQ?#kyMXa6sI7FE+4qT}F3~}U=FEr%+=VMl&z4Va!I5c< zc?l}_*WT|Z7p}CZ@{^GZ3=88D0630Q1!%Y1qZKF?i#tIOTwhzRsM<=0G)*nr zw(Dt{)^)SAOOS0|DwXD%TNlXZ3OJ5aP1Ce)+qSlV7E;O`Ap}aPIUxi;K0s9nf#-Q| zbu#~{2@khDb-3**03pPytS59Z>Vb0k=BiBM)xpI2V|6l`KXn1uZK#Qf%fHRbB7P&s;}Se;JT=n!mdy@0Mq!DZTp00000NkvXXu0mjft)lhT literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/cognacbottle.rsi/icon_open.png b/Resources/Textures/Objects/Consumable/Drinks/cognacbottle.rsi/icon_open.png new file mode 100644 index 0000000000000000000000000000000000000000..04603ddf48ce02ce7514902cab3b18e36e8da549 GIT binary patch literal 561 zcmV-10?z%3P)Px$>q$gGR9J=WmOn_`P#njkC*WM zeR#iLLVzYs?mLRe!<5pCb-7$#%4W0k0AN|xP&^(VjP4Oa{yFo3h`?nsnanfGvW5Ua z*Yz#Nm{d-StiZ~b;g_j_?xfarlyq0dKFa1u3)G9Iz<(EzehYHbRrKxJ@Vpwly()@* z4Hhs)+wtnPj+(oPy`QJDG4d@)yqnwD4W1~cPy3b5#Kd^R1?q)#3jlx+k_LcErP5e| zSS+^gI8N`}M1tq0t6+>Ns;cH0V|mdm;TA;2HBCzue>}va*2f@(q#0v*RaJ!rgb2fM zol*+Ud5Ths%NKw&r4*)VE{SB`Y6uV4On$g#asZ%|&O|dIg47J?dU7@l{Mn0*g%A9E zHFD#ONCh$HD$t@!tnnT$Rfa7Rcq^D~3_vs{lN& zb|w(`I6evS%iS3PFnD9Y6{LpHwwK>-I}XCYM;Q13fa27o(EnwGbPGNgK1mh4iqr{| zN~Lf0C=Ljofa|*7ulw5Bw*3MCOw+8B)_vj+Tt~6ppkdli00000NkvXXu0mjf8=nMv literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/cognacbottle.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/cognacbottle.rsi/meta.json index db0ac608ed0..960293f615a 100644 --- a/Resources/Textures/Objects/Consumable/Drinks/cognacbottle.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Drinks/cognacbottle.rsi/meta.json @@ -1 +1,35 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", "states": [{"name": "icon"}]} \ No newline at end of file +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", + "states": [ + { + "name": "icon" + }, + { + "name": "icon_open" + }, + { + "name": "icon_empty" + }, + { + "name": "fill-1" + }, + { + "name": "fill-2" + }, + { + "name": "fill-3" + }, + { + "name": "fill-4" + }, + { + "name": "fill-5" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/colabottle.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/colabottle.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..6fbbd2f8bb9bd87cbff700481594dcb607a2398a GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}zMd|QArY-_ zFC64NV8G*iF<_S~+l4byUdbtZ<;@MZ?|qX0k)db;(#>FUBQA8S?d{c*E6crAUhd0@ q-M?(_g(!zhKAYx7T>2BnxxA7=Iab>*LY?m&NV%u0pUXO@geCxnm@)tW literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/colabottle.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/colabottle.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..aea5ea2c0921f7d6aa0bc66801b4b6f7ad6402c6 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}S)MMAArY-_ zFFW!cFyLrS+;qm3Re@paj)M$L0u6j=3!$rG@%V zU$t!J)^|4HPIqdb-nep6vadsA;_X_&g&iky8Lbr_d~Ud=pYZJAyZ-*3na6jl{Fu${ WZET7^FyLrS+;qm3Re@paj)M$L0u6oV9JaUQo#m^IzZA^;li#-!sDXj&Oizeu_4~t% zS7oLxo%`IUWB2(UUfKD%P6xyo1t%&MRqHE>2=3HLU}gCu7x0U7=FXkJA1fz6`=-ZP ZR?KLpZJ^U6c3Ku>kf*Dk%Q~loCICN8Jazy8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/colabottle.rsi/fill-4.png b/Resources/Textures/Objects/Consumable/Drinks/colabottle.rsi/fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..42fd7dc5d40d60bde105787e7c925e8bdf83f1ff GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}S)MMAArY-_ zuO8$)V8Fxd5V*^g?E}NSYtEGnyc2AHypWc?Ln2z= zPQA$Mq{!pC{+O=B0_G`P6L8bMe3#jE#u+}dIuP{nxoN4eju zCqbv)-if-M)Wgs)$GGFf*9eZpUC$zw6YkHMsi-6%XkZ+becMZSYs0-i6GH`8sWUW0 zz24CI{a){*wvU3EOScExP2T)`k*Au{^q{I=yo?Sm@5CpF literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/colabottle.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/colabottle.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..1559e7e97a3e4260aeb363f77476974f8e2c8f32 GIT binary patch literal 553 zcmV+^0@nSBP)Px$<4Ht8R9J=Wma&T4KoCIRB|fvZ3PHp*!Ic_=i|i*v{)oeETK~oUN=jAvfMC2= zq%gR;<}d*_Cc=vFfiMya#_Scg6*hVjFnQA{`vOS zBw5A`cmN`$Dqm3)z1nBX2B0qAvW%7M=a zqR80zv?{|pFrR=AO7T=HwfgwsU}xpm3c&1)F*i4d_s*DKr*B974y-a@{SVy#xQFC7 z$@O88A9tqGUBvnvc#0yDqh1f3TwgJB0I!M8rt*%r-NuP7@)N#2m-X$c%D~**oqUtcDqFgLATpI%RplQ zWm%pDtb;THa0>W0NMitHS-u&F6F^ZEXsyYztQxy+!FwCyPNy@KQdZ^X`#yP|(`vQQ zTGQ+Gm`o;L=JWa2*ZOqIfDnQ(3@g3SGJI*TUH${>UT|7{{W4M%MRhN*6{js&E|;Wf r3jA4hQ4~%9PQBnI8{1xRk&8S7Vgu~LqYQ^O00000NkvXXu0mjf-^BbU literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/colabottle.rsi/icon_open.png b/Resources/Textures/Objects/Consumable/Drinks/colabottle.rsi/icon_open.png new file mode 100644 index 0000000000000000000000000000000000000000..1865d8110695036c0643829e6d0c617768fd4334 GIT binary patch literal 543 zcmV+)0^t3LP)Px$*-1n}R9J=Wmp_WzKop0+O}sF+3PHp+!Ic_=i_8to

    hx>K1#IlsZE&nk`Zo z+&G;HxG^y(#tyywNwUdgLQxbf zmrJJ8>3gNr-v!WGH}*j(ySdmu0Ht-~%LSz80?^i{B++#S^5xRk4X?agK9jrv(lpJa zltfWP7=}nGNz*jz1fUKc$1(f;o}wrKydj(bv{F_|3D5)&f&hRZ2#`{um9j2AomRm; z*muAitvR%2db|APT+e%X{}#ZWthIM{=l99lZ}qo}eGg6qFQ*j(zk_;lWi(=^RSqY**~j4=oy z05Ha|TCJSV1h0)~JRW0=A&Mf5F$6)-fVj#F;CMVDgkUfjTxFm$fU2sl0=7Xq0jLB1 z3ep)sRaMUh;ssEaCB_(byIoWE9fH>`mHYjECZ%kaUl@iIMM1CE!x+PGIAk`PeON3O zAOF;+R|bR-#Bto%oi4+t#@c5dIG+V|@7tG=vMif>fvdcRV7*?G=Q;4$>#{7p0KCqE hr|S6rAH3-Q)lYit?o>F(-%ec literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/colabottle.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/colabottle.rsi/meta.json index db0ac608ed0..960293f615a 100644 --- a/Resources/Textures/Objects/Consumable/Drinks/colabottle.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Drinks/colabottle.rsi/meta.json @@ -1 +1,35 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", "states": [{"name": "icon"}]} \ No newline at end of file +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", + "states": [ + { + "name": "icon" + }, + { + "name": "icon_open" + }, + { + "name": "icon_empty" + }, + { + "name": "fill-1" + }, + { + "name": "fill-2" + }, + { + "name": "fill-3" + }, + { + "name": "fill-4" + }, + { + "name": "fill-5" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/cream.rsi/icon_open.png b/Resources/Textures/Objects/Consumable/Drinks/cream.rsi/icon_open.png new file mode 100644 index 0000000000000000000000000000000000000000..8ded82d6b16ea78db7b7bebb8aea8131f3b22a10 GIT binary patch literal 498 zcmVPx$tVu*cR9J=Wl{-koPyj`b)-NK8gBGRgC@y}`Du_+VqTo=7C2Fq~0gv=~4w&WB~Le6w^L$TIu} zoHGLXuuMKIbC$~@c|=mlm}0s>Dj8F*e6z)3d2a>bGDM|o!H|S5fmAZ4+@>?!rZXI@ zPa#}}7+T&1pzb0_rE7uCj#ga~n)iTO4v@afkiIKi&s_w0?(rh;tzgS#>F@30`sQBq zq%;Wxc6?vTKNCMX#g@w=3WGdX)$pphx`3u7SX}j&wL9zpINIzu+U$%B_tM$XiYN>+ zP*tO|_5)p?p(^p0=-PymN96eA9LXcn(%e)UHaTRjfJ$RSJrm=jCB?NHOXdq~``4IX z-1;(Rq*z7wQQX*2&wgODWc=ar34lm6Zk|9S8b|VoMUkJ1yZgr8|A_v-6;OjC(ZVUG oij)@XL-!JV7cp9FVPT>226|+d%1ASe*Z=?k07*qoM6N<$f_8l3C;$Ke literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/cream.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/cream.rsi/meta.json index db0ac608ed0..9e1d9a9075d 100644 --- a/Resources/Textures/Objects/Consumable/Drinks/cream.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Drinks/cream.rsi/meta.json @@ -1 +1,17 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", "states": [{"name": "icon"}]} \ No newline at end of file +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", + "states": [ + { + "name": "icon" + }, + { + "name": "icon_open" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/gildlagerbottle.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/gildlagerbottle.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..aa09b488ec56c84649368f6904f2165f2840633b GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}!JaOTArY-_ z&u!#AV8G!L*s)3Q%#(#PILo}GPZl;l)%$<-c%c$d9m9w6Tb$|73^wm{F}){Q-mkf( ypq#CvBjoCHgYy0}GI#f_uHLZe^Pd+CZ>kuMn24~NeduHbY4ddTb6Mw<&;$TVKsSp3 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/gildlagerbottle.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/gildlagerbottle.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..db67a5a9307f79ae0046f5b5b40c78f19a8b9536 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}`JOJ0ArY-_ zFJ0t3puod&VRMN}dXYwYm+{ShC6CSrOY83a4!kfynX3Z?I1ZlidcT+9K)GzSvG(e! z^GDk<)-o~#d6mXJH$LVY{$Q@ll6TwZ9?P+)Vv1{?Q~dSay9NIn(p$Q0&Q4^w_{^Qz b;|jCdZr!h(%j~LwRx^0I`njxgN@xNA%LGP5 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/gildlagerbottle.rsi/fill-3.png b/Resources/Textures/Objects/Consumable/Drinks/gildlagerbottle.rsi/fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..5179f6e95c4737aeb9e1aeb46b183a3168ea8eed GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}eV#6kArY-_ zCvD_Cpdi3JS3~u&0mJ2#6+VXR2dUue!_aesP9cn0g9m5u+H=jj~{+3eE58?U7hkr&`*xJb#&;SSJc44$rj JF6*2UngH?}P3Qms literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/gildlagerbottle.rsi/fill-4.png b/Resources/Textures/Objects/Consumable/Drinks/gildlagerbottle.rsi/fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..9c3b596b30b20bdb15e0e1f52720fd263d86fc38 GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}8$DedLn2z= zPCdwbSb@j2ewEx_Ub%)$iLOiuhWx_}wt@>avXYu-Isesj<|{Ln2z= zPCdwbSb@j2ewEx_Ub%)$iLOiuhWx_}wt@>avXYu-Isesj)!wmWKfPjI uAZ8HUrs`feebbb*o3RORyN~NDKWDa{ZppkRtEUO*dInEdKbLh*2~7Y`s9YHU literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/gildlagerbottle.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/gildlagerbottle.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..cbe035e903b3f37707917efaeee66b0daea7788f GIT binary patch literal 496 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^TC6?fAsu&*kzuCA3B9*^B!Io-*iUu zgMdWoffdYc+n7aETyjN$Skth1;vBJwoB9rJRd2U4O$|9CG4GD$QIN51!S!#3hoQ@Nu+mPemEaNs~dY;53`mj^z6H7RWX>NnM^tILng{+)6C(_1ft z)3K+wYioLR+?w>5qw7*b_Rlg^kT?$z@W<`3^YN=vIL(+T`0*@ABvFpB(7@`9a)PO4 z+Qg>~{PK2sEs-2cYb7Nl%qAy`MQ(k#N>=)vfq_Ab)6VXMM^9WBPx9?JdP?HBnxf$E z*GIdL791>{%4?*R#}r^m daA0*ZLzP4CZQjW6y}&4B@O1TaS?83{1OQsv*i--j literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/gildlagerbottle.rsi/icon_open.png b/Resources/Textures/Objects/Consumable/Drinks/gildlagerbottle.rsi/icon_open.png new file mode 100644 index 0000000000000000000000000000000000000000..4608bf002ba98a3b3288d7f8bcbcc3b5ff481832 GIT binary patch literal 526 zcmV+p0`dKcP)Px$$Vo&&R9J=WmN7^IQ5?oUqZ)!}D8Zq@(+CPdhX^7f7r}_4h9ZcxrJ7o5u&Ci6 zA)H%+rfiXdiX04sk|G0BY={@g6-hS;d127x1+Sq_!m0NXCGuO|-S_Uk_v8KFyLUiU ze^rV~g{N$egrjj$QK?XNfTwJZC@K{cl?vf#T;$EE<$dvTbE2bncX>VP$mN#FhfCKZ(m0k4w=yiTg9RA_8&aVaVl7Q}TXh+nM%hbLrmctR!s zc+5Os@T>IXY%a`qu2Me$2|!fyPJ9C*00gJItgLw@ z`4l@mAyb+pu@QVcEEhnu*wD5ktC&h~my&h?xQqSc@QD=wX66@p82-6F00%ImaJypY QSO5S307*qoM6N<$g0X_;DgXcg literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/gildlagerbottle.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/gildlagerbottle.rsi/meta.json index db0ac608ed0..960293f615a 100644 --- a/Resources/Textures/Objects/Consumable/Drinks/gildlagerbottle.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Drinks/gildlagerbottle.rsi/meta.json @@ -1 +1,35 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", "states": [{"name": "icon"}]} \ No newline at end of file +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", + "states": [ + { + "name": "icon" + }, + { + "name": "icon_open" + }, + { + "name": "icon_empty" + }, + { + "name": "fill-1" + }, + { + "name": "fill-2" + }, + { + "name": "fill-3" + }, + { + "name": "fill-4" + }, + { + "name": "fill-5" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/ginbottle.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/ginbottle.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..830daf63e92063d778600179a70cba1da92f1322 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}uAVNAArY-_ zFKpywFywI#EKafM*E_#NFVdQ&MBb@ E0BJ8fMF0Q* literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/ginbottle.rsi/fill-4.png b/Resources/Textures/Objects/Consumable/Drinks/ginbottle.rsi/fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..2d44a181a692b6ba4c85560878b72877a1ace195 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}m7Xq+ArY-_ zubkyPpuofWU`dI}@q#;jAB}>mJ}pY>6peaV>)t#|KBT3iql1YdrTqN6d9NcP*)JS% z>&p;IQ(IMa_4TT%nUP;C7M*2~u-m-6!vBZlIrZ7oJ!-l6<=NJ)=iLpiHckop oEZTjhH1#~+npyi#@LM^U&rmdq^lNr020DVl)78&qol`;+04f|ytN;K2 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/ginbottle.rsi/fill-5.png b/Resources/Textures/Objects/Consumable/Drinks/ginbottle.rsi/fill-5.png new file mode 100644 index 0000000000000000000000000000000000000000..60b0e590050181369fbd4bdf2c7802a1a9b2d86e GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}&7LlfArY-_ zr(EQ1P!MqTf9z(!_Snen=E;1{CKDl*Z?#T(*IzrHZ4r3%KF3F};lZ5UbCymyQ!U@l z%^;BVeXr6kmMyc4mA=U_DqGw*RC8+iyC(sBQ*_eg76`m%RJgJ)`t`meUlbOxOj(xF z+~Mc6E%DqJ(Ez?XNA(_`n#H$gYyD<^3kAQp-TF>-wPs#G=P-D>`njxgN@xNA)QU`l literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/ginbottle.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/ginbottle.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..f830bdc9b20c96ef99e3bf3885fd41f05357821c GIT binary patch literal 621 zcmV-z0+RiSP)Px%CrLy>R9J=WmOW?_VHn4Mml%-}xusYWT%6KE#ft~d$zWR$QUq5un;C+OxQQR& zaJsn0Mf?H>5w#%L5@;5aI2>uzVxuPqT2cbF4J0jsp07jFBZPvvH#QFT4+qctaQvSi z@B6$Tu&e)FikF{rxttrne0W(zqdEYklF7+4H(ak+EY`E<9xni$ibi!xCDV;%B@F;@ z;o=plUn+dItib~W9z4eX&StM&Ay8k3Tc-vKaANLbK~>ds2yjd@(QG!Qe0;J1e@jvT znx^GdRZRmZiZZV2`b;nwyfzSk&f)+0Pjrnl@{8#T{$2OH!wi6u`pd=%eB5DTavyuw1ROFga=h=e&A(x(iAZ5ixQ& zLgV0mH`k~(+}JJ`sco#0Ui{g!ucsOKem;Q{4l~q|8=^G>0Eea`Y`)FI;_IG0rIx^d zZ=UKe2>ZZE#tFP?^}>&-h-WV;04Et|1aR78nZi;4`|ix(-=+rw?bt3CX>6=X!~9Y8 zdOa_MI98g7h_8j)?pJtvNjy1zKmcbA!+7S!v%kwoJ;J6h+?Rz^4`{PXdg~y{VAa literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/ginbottle.rsi/icon_open.png b/Resources/Textures/Objects/Consumable/Drinks/ginbottle.rsi/icon_open.png new file mode 100644 index 0000000000000000000000000000000000000000..3edd21f8b5a9b0fdc9be254f52dae1b0eff59828 GIT binary patch literal 625 zcmV-%0*?KOP)Px%D@jB_R9J=WmOp3{Q5?rVml%-}xusYWT%6KE#ls8E352#&y0{fIn;8O~oUPkA zIoKgCqEhN0Qti~1K(m;nLujK`TMT4qNeR??khTaKpF`3kgo3$WXkGG!gZF;N`~1GV z_j`Y!ufBw`ENek2HKmlAvMg&s%F(0)ZQIVJ)9D&OEEX$;!{HezOQiYPX|?lZMXfD8 zRr9mcO3Jw)9q4=Y8t>pB$I|JEl)@d7tk=J!S6#yE=Vmy0z==_UBB3&~* zZVa4-LkN+Z^OOhWU*G+cKXKhmMP(g3~Y=K&ka6GGDsAF-D;JM@!=wH&n?T< zQM^7DQbX56)URH4V)bg>X;(@GYDWj8Hh*``bu|M&@5gBbgABCA258Ozz_p1G#~*XB z`Jrp3XbHS8R;m7hpa&X>D88j;E&Q4Yxn_wBG!jvUfJUn?Nh~sO>DeOQQ)PH7+Gyjxr+c~Awt@W{x+Q~n0zWmz<>doyd3b^a`anjpmq~GA!6YL2gssUqp%WNJ* zY09m)z@4?4iKdO7ivfT@`n?$d3@Mn%i*q@kNn_FqX$?t>6j#B;q2M68 z_%-+sbQN3`1VIr*+}!@`a+4j77r>>BVr{ z3$1h$WRi%cyY_S<5$E6ad52Hc+Y#04|9gL~jupez!50*s&~2wEEYlEQFWQQ?g?sdz zwjz8eJnYDT!dFVq)c9F(w#M&@om6rL{HkX-+r*hB)^ko?ct|*sw@P|_9`z-iMqz$V zYM<`CML*NlE3Jw37K<2IYQe`3FEpXeVp^ zaf<)|0R%}zK~z|UV_+BsBONf3qWJ&+{}4@#5N*{i{QqI*wC?$cAx{ioBEq3?jV-~LggpX@Zi zz`($8@!2nmEGO9k$l2?QcEVY2Z|}1V3=9lgw{A6_IB_CFD+$>TZYC*;VflP@yx4zj z2{r}>1_lOUE=VjMy7z-2bm1#TbcYfGWJkf(7nBD-0|OZ$P*6~C2A`UV6DOLGVkSu; zP*6~C1{Uvlz!_2;L9KG&85ENYsO11Day1V9l5o@kqYfB#z+iF!S%neRE29Y$CYX>? d9gl)h005FjN2A?>G8F&-002ovPDHLkV1lkWHA4UZ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/glue-tube.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/glue-tube.rsi/meta.json index 734e9e1e649..7319ee88375 100644 --- a/Resources/Textures/Objects/Consumable/Drinks/glue-tube.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Drinks/glue-tube.rsi/meta.json @@ -10,6 +10,9 @@ { "name": "icon" }, + { + "name": "icon_open" + }, { "name": "icon-front" }, diff --git a/Resources/Textures/Objects/Consumable/Drinks/grenadinebottle.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/grenadinebottle.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..09ad1e1b40c0f2b2c292699588351b4d2bce764c GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}rk*a2ArY-_ z&lvJDDDW^i&Qjp~&*h;j%9sRg} literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/grenadinebottle.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/grenadinebottle.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..d793961320e8b6a8670285a73f30d2b59dd26942 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}cAhSdArY-_ z&mH7sP~c%X=%RD-pZ0_;Q$!Z5cjh>BuD;)x8K~;QnW-Aa-wmJao3eJLi{QeP@W(eV ct!Hm2W8EakR+4V{2xKgSr>mdKI;Vst0E0{`n*aa+ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/grenadinebottle.rsi/fill-3.png b/Resources/Textures/Objects/Consumable/Drinks/grenadinebottle.rsi/fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..0b279477acbecc004173df1ee002f3e1d41a1dac GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}W}YsNArY-_ z&u!#oP~c%Uc(C--f7UPRWyiQycH6pnO)+F(Xh_=}bn49KG{KG9(W`@gon*`?XG}TA V!oetBp$;^G!PC{xWt~$(695InC9nVh literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/grenadinebottle.rsi/fill-4.png b/Resources/Textures/Objects/Consumable/Drinks/grenadinebottle.rsi/fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..0b279477acbecc004173df1ee002f3e1d41a1dac GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}W}YsNArY-_ z&u!#oP~c%Uc(C--f7UPRWyiQycH6pnO)+F(Xh_=}bn49KG{KG9(W`@gon*`?XG}TA V!oetBp$;^G!PC{xWt~$(695InC9nVh literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/grenadinebottle.rsi/fill-5.png b/Resources/Textures/Objects/Consumable/Drinks/grenadinebottle.rsi/fill-5.png new file mode 100644 index 0000000000000000000000000000000000000000..334740168ccc29fb6964a6743f0bc58ebe0a1045 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}9-c0aArY-_ zFK^@ps&WZ5%xn4Wudt?tIiu8YmdKI;Vst08Pp$WB>pF literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/grenadinebottle.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/grenadinebottle.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..e1a454f85bd23a8b7ce8ea8581c6caf206784c6f GIT binary patch literal 428 zcmV;d0aN~oP)Px$W=TXrR9J=Wl|4(tP!vGVYbuSrA5hYv4h13p1gDOIgCID!Ak8EN(bd^Sodm(^ z(z%OBp`lBEg@q0sI-~?dx|F718i#(axrHv~Ov!L>&bztyK1fJNNJ#kasJH>0P6vSJ zxA#aXML3J7RxTAlu~>{Pkd7U(;OhQi*l#zTo^|vJfiw*%QB=Y9`t7Cza5(&OS`*XT zt-yjX47UjfB)_0wdoQR-S#n!gJX z38+B@To+|Gh<;ivR0*pqZ)${W7qAi5*I&MwOkoAePfPbPx$UP(kjR9J=WmAy&>K@fny^CEX)A0S+cSOkQ91*?<+5kas{8m|;YTOUDNi*%{e zhzL1t@&HyA1}uW4xNs#s7>xqIUB3u{V%l`6D=>{B&v6`V+eRt1tita1mzOpdNGdQV zj$@2504SxTX=DP;z2-wwYGCDVz_Fm)<(dr3PqC(mRDoGTRFg30VCz2m&nK zBKf@pt+y)xVCfc25-fEKK_C`L{RValg=wu{J2vl&793G``*;V3_Ywh71#H^}R)c8K z4H6_>5Un4)HVdL{2{0TEm+QstMNLFfT)@`Mag%Zk?{wCSb354N0b!+ O0000Px$P)S5VR9J=Wma$92Kop0+78eHxr|OcTiy+-ZijzkjMO<_d7eQP)6!jknxVR`d zxD>%n2d5wo4wXX?Ez+$N92KhRR7#+b4#ug0Iu!1u2*G@C!#(c(_;L5%OCTX3;lGoT zBx$VyIQ%>c{AQQ>-80(ODFCIEk=B^RK%dj^I!pt*83Lh3I*NgVbdKWJEXx-yv4+@y zvQ@A-*J5IRl7+n$l&wUUAgTcr!SP8B$F;&xuj5lIS3sL-MtXu#5MKi~Z<&F;-|YUK z0d4D4tz2P!>H`3;(H@uuCd9J{@At2b;=>S6!cz8@Qg$%*`1E3|BQCY27PzXwNlNhcFx%&M7QJ@-NL~kjL3cW>K{a@Xem_u zUVQ)n0PRUcK~z|UV_+BsBONf3qWJ&+{}4@#5N%pNwxG7JLpW(@14y8c(Y@YB};)B>XpV4+0wkB?6netdjFKL;RZFIT~9 zXT80>&oVGDFl^nr)wp%hM}}4svLD<`QWV4Txpw@l{~Y`>3>*SdaJdf;Pcd9wn8t|i zP(pz0D4<60Gcb@50tE#HXYi?+IB}v0DQ1!s0tE#HXJGM;2b>|r5!A|t&!CuOKrIJI z5mrK52apX$9Wd&EQ3nhw2ar`5QN1#nFkylTDb?{P7zF@Yutr(dJvROT0000 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/lube-tube.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/lube-tube.rsi/meta.json index 734e9e1e649..7319ee88375 100644 --- a/Resources/Textures/Objects/Consumable/Drinks/lube-tube.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Drinks/lube-tube.rsi/meta.json @@ -10,6 +10,9 @@ { "name": "icon" }, + { + "name": "icon_open" + }, { "name": "icon-front" }, diff --git a/Resources/Textures/Objects/Consumable/Drinks/milk.rsi/icon_open.png b/Resources/Textures/Objects/Consumable/Drinks/milk.rsi/icon_open.png new file mode 100644 index 0000000000000000000000000000000000000000..cb980176272d1ffd627d9e856ff802a67b5ce66e GIT binary patch literal 410 zcmV;L0cHM)P)Px$R7pfZR9J=Wma%SwFc5}+st#m|kPs|sm90bB`~o~eXC9zqpQUp*I%Lk44Ml1_ zvVp{koDm6mg3TQwQiH0*XI06bh2pv9mEk2t_erRf6SmiHDaJ z#P)ES)5m$9D;W0Ios9w4bx%q4ZnQUbur zM#|2B>$>=Q|3=&X&J}41A+BTq0M_gEXe^J%a2*4E-&-e~Li%X{N)<(kFbq*u)o8`@ zJmh%}#u%dL8GvJ?O*Vj6gRl=68z5c7H2wV7IKZL@inkK2-u@Ggr7+jCYQpIa(4jUb z$pGgZjIoPJIOk{Ab;u8r&1R!6#U)ANm_A5mW@c{A51?0b`$8C!KL7v#07*qoM6N<$ Eg5?;pmjD0& literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/milk.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/milk.rsi/meta.json index db0ac608ed0..9e1d9a9075d 100644 --- a/Resources/Textures/Objects/Consumable/Drinks/milk.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Drinks/milk.rsi/meta.json @@ -1 +1,17 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", "states": [{"name": "icon"}]} \ No newline at end of file +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", + "states": [ + { + "name": "icon" + }, + { + "name": "icon_open" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/mopwata.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/mopwata.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..22eb0ee04b81514780c51d3b714da75cc86b41c7 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}zMd|QArY-_ z&+q0uV8Fu=Xj!40x%|wOi9A7%ZyjFZ^*UmL(u3-+3;Q{MY8l?FOGzrDG9VN!oi@mgQw*PhaLaV|))r>mdKI;Vst00a0np#T5? literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/mopwata.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/mopwata.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..976b08102cae6fc521f60e2ffc9b321e4ff2e85c GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}PM$7~ArY-_ z&u`>pP~dU7_`>Jr$(b^q9;t5)`V!U&u>4gTe~DWM4fE{iQM literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/mopwata.rsi/fill-3.png b/Resources/Textures/Objects/Consumable/Drinks/mopwata.rsi/fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..976b08102cae6fc521f60e2ffc9b321e4ff2e85c GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}PM$7~ArY-_ z&u`>pP~dU7_`>Jr$(b^q9;t5)`V!U&u>4gTe~DWM4fE{iQM literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/mopwata.rsi/fill-4.png b/Resources/Textures/Objects/Consumable/Drinks/mopwata.rsi/fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..637cd877a5f51cd91219c098d75423e446173363 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}DV{ElArY;~ z2@H)o(TW!{&zqQ;9n-4+_9n8;db-~-ca_x3#~9Pk z&6(-hVuih0%w8t OF?hQAxvXBn&1ksyMo5B@YN_RXsEA?d=VGa&DgO>4N8%PL{B-v9)z9$yszZ zMe!)(3$Y+(gNdsgUC-C3Sr&y9Gi*J0p@_lI(Z|mOVwlK;5Xrfg#ceBW@{*D!`K_7h kyjrCtbo-Q5lB~@@XO{L$?VG8b1adHgr>mdKI;Vst0K!^8d;kCd literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/mopwata.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/mopwata.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..332019fd2871358dedaa6ce9dcf22a141e53c40e GIT binary patch literal 535 zcmV+y0_gpTP)Px$(Md!>R9J=WR!d6)Q5Zd1Q9%mD)JBpXf-bZ-wTd* zn`zh9T7)g4Vx*?T2{p>B>;Ywh=rn3IElO#u#hvQ|BG2mHneRK_nRD;`?f?~3P{DtP zhBR<(Wl=F7=)RD*_EKonr7+Z`$Dy}V!8JF(K*U>3Dj*+$@Br*1CL}}&fp7#sjEaX? z0K+hfxs-X!ja?h-=Tp9TuA!O1eg5w)Vhm z?a6!A3jlbyi$Kb}$soLEin0gH)?NgKW2#(Y0bgHL)Zzfe5~R~<06@E?8vx+rxgRlV zS~al)-$}E@F9TlK`i4j;3KIYTQapx)D8a{b@bO%3oW<($k~4aLqe_6PC5T*w;636L zeIWY$?D!rNI`hL|Y$N8RItBSns1T@fz}h#c5qOW{G&JaR5R*v&Kr_Q&*gjUYe}xLl Zf)9N9uP96xz_$PZ002ovPDHLkV1ggH>J$I~ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/mopwata.rsi/icon_open.png b/Resources/Textures/Objects/Consumable/Drinks/mopwata.rsi/icon_open.png new file mode 100644 index 0000000000000000000000000000000000000000..677c9b74dd1b025b34317ed5d896b1947476889c GIT binary patch literal 524 zcmV+n0`vWeP)Px$#z{m$R9J=Wl|4uTVHn5%T3SOk#CZjhR0ujKr9n+Ck&r^v7`V08+#0n64NbL% z%Ry_4F5wac3SEU4mV|wOplKj_UiNVfWq8`~-m65BzvC|-_ejx zTw7UGv_ruy*~qd107xa1-ciq_LThe*fk?NR)IcRhmJOtmNiP62>-2tF9by9v!&LQk zc6RwcQVK@Ll>#&~AgO zN@#HmV%%ckPJ{!9&u^S}VhTA?`WoL21<_}7sF9>A#a8sxhJNF(qO#cgOa7$D~J001MyU}Vfgd;lB#3f=)`Iiaqyk=0`W O0000Px$I!Q!9R9J=Wma%SwFc60SR2{q_7FdYH9&dgM9wK66%o{M}4LY*9FTs|j^~h!< zcGwXc8y#rc5((;qiZ1>pi@Wpv_|7^57K`PdIZy+%*28_xIVZyK6PD_MUYG2I1T{dcn!v+X*01)DTg?YjYT|B1u({NyauS# z26fte3Ax>F)UDPDn8WkDRdM7J^nDKi=(_InOYmd8g8;@D^rZxUIROCP&hG%+{R9AG zBYrnuxbF${eZMK;BZNCU3|g1)eIHd-O)ReKq9_UoA;9?wz`=N5k^m$IZW%}djIW`T zuYc-yhtvc5Qlf3!S^HQDQhs_9hG95sThpAz0+dn^Lj0OUDcZOuO|B$K7RNCFWLdWP ekz%n}cI5-OB4C@X3XuB%0000Px%BS}O-R9J=WmOp3{Q5?rVnqZ+gv}7oW zmzoYj9V{q{(1bG*2)_)<b_21l0tPBYy%MNkl14=|_!+}IO zaIjh^l!|l=9jX!n!PO(r>%Fci->#zI*T8=O~p*oMfCkQTmy{nZT(L$Ys(-E`O6Y{<%OK9AApr&f&0g z5VdF927AXm0HhxT2|g`2L~=QW>8*$_#Y}KM83rI4aq}*v8X^+HpP-&njj5xzc*i{C zlVS47FrJxJD$-qKmqaw;rk+wQuLq$D)KjVvjktm4tnXhP0U)uyVUF3o_JUetgP_Hn zmMf6Uq>amuUVkCGBxIMwb^itOn+E`Bp&~QWcc=z*{Np~WDFML>_{V)z(E*qw&gX5Y z23prQn(JV1Wr~TNU%4sAlufSk_ zMlE=|0wQsIfi5^@@z;gcz!P7A#Fh#)_x`6*XCGW%tWaw_vwRR)7N}jC=k~oA+J{;5 z-uL&1@c4WaK4)Y4A_8W#L0N^1H=W=u!(8X_kDvQP7U&W={P?90tS_$(Pe5N@>+1n} z!L#!VLN@(?a6{7FjBM{Vc-{IFih^wm^orO8A6sBhaXQ-a|61TLg|4^~MIP7I00000 LNkvXXu0mjfJW3Aq diff --git a/Resources/Textures/Objects/Consumable/Drinks/orangejuice.rsi/icon_open.png b/Resources/Textures/Objects/Consumable/Drinks/orangejuice.rsi/icon_open.png new file mode 100644 index 0000000000000000000000000000000000000000..971467080429a9c939ca195b1dac56d28a74ccb9 GIT binary patch literal 631 zcmV--0*L*IP)Px%F-b&0R9J=WmOW@wQ5c3FO|a0ZAwx*KsmUPJ!GaPIOt?m(TyU^jD3q!=mJa?< zQi6+vgIPjQg4no7P(mO>Xoo_e#TZDyA1E|~+5AbZWDuP?HC%_=n?Eg_b6auAyWM-v zeV_My=evgk0}V9Lf7T(Ym zFn|g6xLqV3Js@*^Odq>n6t1e}04Chyb^%a`1ptVIoUFw)sSwgzP>*YRu(gcG?V=D1 zP>2O^O)gTgT|sf!h=iQf{Lf-P{Ku(36 z+5vaL0h9?FA7B0wwv+x1qZ=0iNTAYO--b`aok0~gms*^-IReGz!3TKU&`6B0wu1y& z?txP_DzLU7-UItOiu>Va1!T1U09|m(@}Em>!98!0=!OOu|NgrX`yX&+u0pNx5YdB3 zI6&>#441CXl6W)Ke)sM54%|Irz^5%NUnW3XCMc(J^nx8cWti>^Z+#c*e(M3cg6!-b zM&00KD*f*QBva|0JHX$-=B?=I^8@Yy(>R$*_gqH$!LpLxg8m>@!2=Cs>NgZkwH@Y< RQ=0$)002ovPDHLkV1mpAAKU-{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/orangejuice.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/orangejuice.rsi/meta.json index db0ac608ed0..9e1d9a9075d 100644 --- a/Resources/Textures/Objects/Consumable/Drinks/orangejuice.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Drinks/orangejuice.rsi/meta.json @@ -1 +1,17 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", "states": [{"name": "icon"}]} \ No newline at end of file +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", + "states": [ + { + "name": "icon" + }, + { + "name": "icon_open" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/patronbottle.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/patronbottle.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..8fdc92f22beaf282145c3830df0ae9578c5e4162 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}9-c0aArY-_ z&u!#9;K1V?n5zDM%FI2J%PxgxGO^ovOnkKe8dE(dP$5HGPWdFiOS{h&Z{K@&PpmrQ m<+UoISN~=n@I3Ox@&h+_Qi)8csH^fbkWx=qKbLh*2~7Z$t}sae literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/patronbottle.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/patronbottle.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..77f01452d0dcb6ed3d2e8961a9f33639c135f8ac GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}g`O^sArY-_ zFFA4@P~c%X!28Ahm-_uD^Ud-%P3Ky>MPTU#xiURDo|9UPE+Al+cF}2)=~5PB?X_F0 zZok=4T>fN^_mcNwybKKQ>MVZ?Oe$T|Ig87{ia*X&wjrhV*S)C@-u54ko!LGAzm literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/patronbottle.rsi/fill-3.png b/Resources/Textures/Objects/Consumable/Drinks/patronbottle.rsi/fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..58f72cf2d312c1b38a2b7f9acb9fa4d440a7555f GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}HJ&bxArY-_ zFP-LPQRHC`*nDf!9bwaplUHgMM`gB%Wd3+F=TBb8f*A}6X+Xg5nI(8pX;G@_{#wt> zvoEZL7k%fOWSSk|<@vpjWruR)``0&*-DV7v?z6LQ_qpUnJr1ZOt9o zhkP^6zHGY9aB@=#_aZ0TJMkZ9?^<81cx3$?c4-UQiXDCiK=&|sy85}Sb4q9e0F~BE AmjD0& literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/patronbottle.rsi/fill-5.png b/Resources/Textures/Objects/Consumable/Drinks/patronbottle.rsi/fill-5.png new file mode 100644 index 0000000000000000000000000000000000000000..33a96802d6ba6b6a315116f9b31e78378affe5d2 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}?Vc`kmQ^$Jo?HvZN2oAmaM6_cBb>{=d>GZ{Qx{an^LB{Ts5 DLwiw) literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/patronbottle.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/patronbottle.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..9dc2e2ffa8e03ba4b5f571cc98270299295bc5e2 GIT binary patch literal 548 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^T<_dH!3Ln2y} z6C_v{Cy4MEB&dWvY-DCPI3o9M?f>%!4jfQ;f2Sj{ueq5y@R^a|YlfU@w`a{X(D3Ru zjER){J3prQL>U7!GxOoe%ljqX+1I*u3O=!Ph&=v4YX2VL!`5Q5ZSnt)NaXDkOa5{6 z*kuQE_B(rv98X&){Qq^l{kO!88F7X`rk%-4`Tez3hke6@#hh$4ulO_!4GawC*w&iO zi!s*lV&)QB)CIy*W;hmcXuOt)Nlr*ec<|`?_qq>{OnrX*yLmZXS^@|>dbuV!fvpy| z-)|1W%*@TAn_@PsKd!hfK3>X9)?(j05#vri#u-lo)?HoFch7{4t!)ec`}?!)>VEt< z+AO|)uBeL3T(kAD!W^Y83Zb$MENg(~_B{<1k$0Y6@!`?eT2{`$BiO^NWE#=NQPv)ZvA?YW24 zwx>MS;t%RhE4p-GqpEcH&xez0fbRKw?Hb=J>j&?qa!2iW^+$Gh*=yy`e`R!-e|MA} e(vV-PQs-JLfot>4gbd0le4)Ct4xP8r|w^)VNIefyYf%FKM& zkd2M4ZR_mv8yo-ra+<~*(Ggnl-~i*KD;5?O0;zhDiVVzLLW{aUc*+dN5{?56oB9r# z0`;)z)z!Uc*N;2g@_xQ;?Y2e`xUxb)lVwUN&$_~opR0?3*x0}zLh&@~?<$$3-(Qy| zUT%E++S73I3xS46zNb;XuU_~jCnR|M{_t<_%g62g@irA7Z$&yfUCI1>%d|1Toh9fh zqsM`+#>R&cajqW?OFDtJ-4CB2Q0jG7SM8QTk<5V$m#^5#&aUu`O;uZ&Ht|ivv{Szp z%=+fGMohKM<$Xdzg2G9`lvW02pf8v7-DBke0(twI4G+ZyEGC5q&T;6oOtEf=;l9Y| z${JYg`gZHHu3OnaPZn`-baI?NbYrXR*{CTIe$$vYb$wPl_M<)bklOZ?$6EYB-DyRa z4s2AF4*&UZQq6})U;kda#`ntl!Mmy4QTuOHNNqUz_Quv|`I+yZCrI9K-y-aGP(vbt af#Csfi^LbdLm9xBWAJqKb6Mw<&;$S|WYl>8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/patronbottle.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/patronbottle.rsi/meta.json index db0ac608ed0..960293f615a 100644 --- a/Resources/Textures/Objects/Consumable/Drinks/patronbottle.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Drinks/patronbottle.rsi/meta.json @@ -1 +1,35 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", "states": [{"name": "icon"}]} \ No newline at end of file +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", + "states": [ + { + "name": "icon" + }, + { + "name": "icon_open" + }, + { + "name": "icon_empty" + }, + { + "name": "fill-1" + }, + { + "name": "fill-2" + }, + { + "name": "fill-3" + }, + { + "name": "fill-4" + }, + { + "name": "fill-5" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/pwinebottle.rsi/icon_open.png b/Resources/Textures/Objects/Consumable/Drinks/pwinebottle.rsi/icon_open.png new file mode 100644 index 0000000000000000000000000000000000000000..46ad7af1561cd6096efc6cdab9227605d1236ec9 GIT binary patch literal 502 zcmVPx$ut`KgR9J=Wm(42#VI0RlUM|Q>?O_eu(-_G~lAEL*a*(%haCMPfz1$r90sa9w zaCJbjwa1+lH#x`!t!cwXXtM_=#zC_Ym*+R^q>xh{aOPBlQ{col&9nwZo^4zMtCh}C8Dnpwxasucs2 ziX(qWp#z9Zu(I2QaiGXP%yOMOVQo<66M6PTE zAmPCQenQ$iVZ3$LGa?Ej+C=vDvhY6pkl`qkB>(Jcd4`?=?J+Ei-EhYZXKv#2hf1h# ztRjE$%K!jMectL&epcbN7MuT{k^18`=rw@06SaT%rDLr z55SjYnFR=`w8yZoZ`4yNMsu_Er36p;9OoCOTAtz_NTv1*_tN@9fD-skXjvv>6XRll zKpF6}5M&I+Q()UYh3Bz}ad8$zO$gtwx+qQfa@BwlQM8+152Lf|q^{i`JdEIdwV}yz s99p8?-p8xD!t|;uOwa#o`j?L0029BB-s$O$Q~&?~07*qoM6N<$g2mwGdH?_b literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/pwinebottle.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/pwinebottle.rsi/meta.json index db0ac608ed0..9e1d9a9075d 100644 --- a/Resources/Textures/Objects/Consumable/Drinks/pwinebottle.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Drinks/pwinebottle.rsi/meta.json @@ -1 +1,17 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", "states": [{"name": "icon"}]} \ No newline at end of file +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", + "states": [ + { + "name": "icon" + }, + { + "name": "icon_open" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/rumbottle.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/rumbottle.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..edb576e22351b977a39c4445f7f7779b22a63ee4 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Zk{fVArY-_ z&pYxmDDXH3dK5JF{tUlx(&4xP1N*Vg5AmClXRi|hDr7j2tguXt?Ne0cWi~D iSIxZeF4*{Wd2yWyqkox-cge&ZV1=HpelF{r5}E+LC@p0G literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/rumbottle.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/rumbottle.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..0926cb5d2d5f737c350a7d4156b2f9d16710b263 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}PM$7~ArY-_ zFC64#P~>sB_$w|L-D*wN{GW4vsB_$w|L-D*wN{GW4vtFbj>C$h}Rkxid$r*QQ1O=SaGXPq{;OXk; Jvd$@?2>@?vJTU+O literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/rumbottle.rsi/fill-5.png b/Resources/Textures/Objects/Consumable/Drinks/rumbottle.rsi/fill-5.png new file mode 100644 index 0000000000000000000000000000000000000000..6d4f19e9ffb509dafd0a4ad8984558677253bb57 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}QJyZ2ArY-_ zuU+JAP~dUBxV(`2dcuFsxZ^KmN|}-wcnxvPgWQ$v@&m9c$3qqC!9 zW})XLGozC7$JcKCtUPeJ_`BPiy^Q(F4GatseeWxNy0vgOWhz`^?iEf3+QQ)J>gTe~ HDWM4fESWn$ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/rumbottle.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/rumbottle.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..2dd73a7cb5f75cebb670e79cf2c0435081d7bfc9 GIT binary patch literal 465 zcmV;?0WSWDP)Px$i%CR5R9J=Wmp@1XVHn1rD;t8VBZxw3>JM^Z=;;kE!4bG51c8HO1?^HpjhO`v zLThU{MB>)e=I{xr4ayND5tu_nvx8g1*V2gy4d45T68XTvdk62skN1V|`3@NBze^Eq zV2l9(?r%=GVFUpHwp~SJ_d)>x%d&+0T%rJu3?m5JuC{Bc$N&IvaCC~#_gB2t>tv4+ z8Gv4hJb{g!^RlLCiFrMY(dp`DtJNa;NKZgf6t7JGz*j&5@caEGP16zpz&U?5O|zk@ z>RC_8ep9pAEOE{QKTq7L0qj*O6=4XO73ct7IzQy|d0#&PdZHn~zyXBQFne{#JKvo^ za&&q9AmmA!z}k8Q?zsg_JvLx`d|`QUg`9}w6)bsljJXudxM$%DtWs^{;&>t!mT8v* zC^Cl9Z4m(Ajd-9=j+1=ID<~HVh$o|nC!?r6)u=Xffa6rEU2pHl`VRmA*-Q@EOispP z@aKTAy5cy{8OP~#`cBmE?;XXAF?8R4oO?hh6xtH~F&XL`+dG4u@nySb00000NkvXX Hu0mjf`SHvR literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/rumbottle.rsi/icon_open.png b/Resources/Textures/Objects/Consumable/Drinks/rumbottle.rsi/icon_open.png new file mode 100644 index 0000000000000000000000000000000000000000..27221c4c6648ecb35381816f99981bea69d48792 GIT binary patch literal 457 zcmV;)0XF`LP)Px$gGod|R9J=WmOn@WVHn1r3mbwfX(^?BWx0az(G0)+5?wX(ea=$ z2bXZ_aB~fD_=LO)JVeOaTxw~%!L8wK$uObedry?$9ys{;j`!im`@s9XfG=N6nWkAM zB7=ww(=_W`AB9`!x~^TRR6YP8olf^OO)GJ|ShC7_dV6Wm)7>>$$;Sm=ME@}67^C)_Xt=3C$jZrAzs|LW#m%9GWB zgTo9$8=F{t93b)jiJh%oBog}^D}Dsq;RqH33f4mFh$Z*9HVCjQ0W9Z^yp($bXbS=R zwhaJ?X2MWcmRLUQ2p(E37=rT literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/rumbottle.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/rumbottle.rsi/meta.json index db0ac608ed0..960293f615a 100644 --- a/Resources/Textures/Objects/Consumable/Drinks/rumbottle.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Drinks/rumbottle.rsi/meta.json @@ -1 +1,35 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", "states": [{"name": "icon"}]} \ No newline at end of file +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", + "states": [ + { + "name": "icon" + }, + { + "name": "icon_open" + }, + { + "name": "icon_empty" + }, + { + "name": "fill-1" + }, + { + "name": "fill-2" + }, + { + "name": "fill-3" + }, + { + "name": "fill-4" + }, + { + "name": "fill-5" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/soymilk.rsi/icon.png b/Resources/Textures/Objects/Consumable/Drinks/soymilk.rsi/icon.png index 307ff9a9d0d5595af181d343192f4b4f7678e72f..168410f33107312c69fde277f02951c28c304aa2 100644 GIT binary patch delta 337 zcmV-X0j~b(0_y^hBYyw^b5ch_0Itp)=>Px$B}qgcJ4C}^+Q48m5W|%j; z-xr1eSS%LHe`iOsIZe~`I6v>A0=Qcdt7NcGYyIWEdlCVFEPuUfb{hWYqmoPbo zd_(c^4CWB41WGOFIqC>L<9_-ezDM)~VwDg~1In@-)VwQC94;2`sy-XfrNa zb@u=szyo*y09}_!$?(3C8G!W$3$|+Lob%4f0JPSXR5x`$j(_92o##1}Qlxw&0IhW; zgn+>Az;v&Hb51fR1ANBvY66*kw9Byt0EA)alFAK0W?#mC4X0Zm2SAWAJa1V$0JBSr za%}5uI6FX)G6X4u95l7Losx2q&ww!oPx$CrLy>R9J=Wl`%@hKp2HTMG#yBS&~>tSOl9TWvsTci#B@!k6^cRfm~oqZ(+6F zbh*HEN-S)aRI`~{u!_ZMM6!y1L@k`J8uBLZJ?0-0@OV6)|IU_Vb5RrkBuUa(Yca;) zoa^jUN`2XPM^XU57}K2TBVZSpP|prp&034rTI44xV2o+9EF*~ae-HE z_7n2udR>p#BZ#7?k5#_{`SLCJyKMI=FoLiQxPA=&roh#nqaM3<48L9=ECa$aARl!# z<)$Jp@g1nDiu&}h^L({haWOat9)7NXa#I+bK)FG@pTIH9g9S?9*=qzJaXY*dzau(< zd9WZGW>i(x(c;Tk94;=H00000 LNkvXXu0mjfTP>YU literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/soymilk.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/soymilk.rsi/meta.json index db0ac608ed0..9e1d9a9075d 100644 --- a/Resources/Textures/Objects/Consumable/Drinks/soymilk.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Drinks/soymilk.rsi/meta.json @@ -1 +1,17 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", "states": [{"name": "icon"}]} \ No newline at end of file +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", + "states": [ + { + "name": "icon" + }, + { + "name": "icon_open" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/space-up_bottle.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/space-up_bottle.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..6fbbd2f8bb9bd87cbff700481594dcb607a2398a GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}zMd|QArY-_ zFC64NV8G*iF<_S~+l4byUdbtZ<;@MZ?|qX0k)db;(#>FUBQA8S?d{c*E6crAUhd0@ q-M?(_g(!zhKAYx7T>2BnxxA7=Iab>*LY?m&NV%u0pUXO@geCxnm@)tW literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/space-up_bottle.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/space-up_bottle.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..aea5ea2c0921f7d6aa0bc66801b4b6f7ad6402c6 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}S)MMAArY-_ zFFW!cFyLrS+;qm3Re@paj)M$L0u6j=3!$rG@%V zU$t!J)^|4HPIqdb-nep6vadsA;_X_&g&iky8Lbr_d~Ud=pYZJAyZ-*3na6jl{Fu${ WZET7^FyLrS+;qm3Re@paj)M$L0u6oV9JaUQo#m^IzZA^;li#-!sDXj&Oizeu_4~t% zS7oLxo%`IUWB2(UUfKD%P6xyo1t%&MRqHE>2=3HLU}gCu7x0U7=FXkJA1fz6`=-ZP ZR?KLpZJ^U6c3Ku>kf*Dk%Q~loCICN8Jazy8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/space-up_bottle.rsi/fill-4.png b/Resources/Textures/Objects/Consumable/Drinks/space-up_bottle.rsi/fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..42fd7dc5d40d60bde105787e7c925e8bdf83f1ff GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}S)MMAArY-_ zuO8$)V8Fxd5V*^g?E}NSYtEGnyc2AHypWc?Ln2z= zPQA$Mq{!pC{+O=B0_G`P6L8bMe3#jE#u+}dIuP{nxoN4eju zCqbv)-if-M)Wgs)$GGFf*9eZpUC$zw6YkHMsi-6%XkZ+becMZSYs0-i6GH`8sWUW0 zz24CI{a){*wvU3EOScExP2T)`k*Au{^q{I=yo?Sm@5CpF literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/space-up_bottle.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/space-up_bottle.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..69a0fd07c89ff8366962123253694b54c7beab4b GIT binary patch literal 557 zcmV+|0@D47P)Px$=Sf6CR9J=WmLYH3Kp2LftO1u87#NHMnPd$)VB^gD0hPi+$F}UJ^bZtIDlrQg zjAAn8fRt<*2(mO;Q8ZbRtz%aZ#Z3yT+^up+UgEQSdcWuH`_A9NMQ^N@$>bzS>hbOE zN1f-8=kPE4!;j=|?G;7Q*`93^fMY#8K$h*tj;+c60NmVsONPTCMNzO^E`hO?&pTUy z*OC=L9LIAhC7$Qux-L>m;y9i+0&ocK`##(4mZB&CtRaj5CRwDVlmK;b$Jv*l<2Xnu znPibR@iZ>NF#H;gMw<82rxToyG}CE|F95$y9SwASkJcI;1iF46kF^f;^*u&AU<_~? zkdxqOi~)>`Fik@sV3D?HvHz7W(tSEKfvKHY4MaaDN%-L|0!W{I3t7~2esOoUr*SWc z<9Och_Yp#%ltKsrfKrOpYQ=aw{$$b%tbRm;!2qQcp68*I!f~7$#8g%QyWI{U1l?}; zWCt1psH*BD;4w%e0Ed9jK^g<7s_NB1tN_ZgL@C8)v#H;0Q*dQ6xzp*)rIhvYb6uCB zC}_9aD5dE2ddz0C&uN-|KiAW02ZRv#zF&_UJ%%sk+NKVS+wo!b$Cr_^EbDuLsjO14 vUa!gX9C%uFS(a7+R=wb*Ii|hfqKh5@ZTIqDe~onq00000NkvXXu0mjfNA>`D literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/space-up_bottle.rsi/icon_open.png b/Resources/Textures/Objects/Consumable/Drinks/space-up_bottle.rsi/icon_open.png new file mode 100644 index 0000000000000000000000000000000000000000..f9e2861df081e792f139c0f7875c64fbd6f64271 GIT binary patch literal 551 zcmV+?0@(eDP)Px$;Ymb6R9J=Wmo1OmKoEwXv;mtK7#NfUnWPu8AjYZt15OGHIZ)QRf9P)KgO30NY@6Ssq5>nc{2krbMo`X72u`h z1dyg_CZ!|@0({>`N=cfgSt|hN;9(eYI21 zqp=3CZo;C7fHBLWLx; zi-1j#RshZcAA__8P}lW~fj9wFRfSTD{eExmT}$xRW^k|9%cPWM`uV<3S(bFWU6fJ` z1_Kt0#iybuzCG8cQwD?(gkfmxR;S@pwRY(P>+Sgb_07XbRaNF(U@NB*Y&IKqyB+ZG p)m2qF0XXdiPmOW?KX}#ut9w5?^yPR}_A3AY002ovPDHLkV1npg{%ZgL literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/space-up_bottle.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/space-up_bottle.rsi/meta.json index db0ac608ed0..960293f615a 100644 --- a/Resources/Textures/Objects/Consumable/Drinks/space-up_bottle.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Drinks/space-up_bottle.rsi/meta.json @@ -1 +1,35 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", "states": [{"name": "icon"}]} \ No newline at end of file +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", + "states": [ + { + "name": "icon" + }, + { + "name": "icon_open" + }, + { + "name": "icon_empty" + }, + { + "name": "fill-1" + }, + { + "name": "fill-2" + }, + { + "name": "fill-3" + }, + { + "name": "fill-4" + }, + { + "name": "fill-5" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_bottle.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_bottle.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..6fbbd2f8bb9bd87cbff700481594dcb607a2398a GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}zMd|QArY-_ zFC64NV8G*iF<_S~+l4byUdbtZ<;@MZ?|qX0k)db;(#>FUBQA8S?d{c*E6crAUhd0@ q-M?(_g(!zhKAYx7T>2BnxxA7=Iab>*LY?m&NV%u0pUXO@geCxnm@)tW literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_bottle.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_bottle.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..aea5ea2c0921f7d6aa0bc66801b4b6f7ad6402c6 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}S)MMAArY-_ zFFW!cFyLrS+;qm3Re@paj)M$L0u6j=3!$rG@%V zU$t!J)^|4HPIqdb-nep6vadsA;_X_&g&iky8Lbr_d~Ud=pYZJAyZ-*3na6jl{Fu${ WZET7^FyLrS+;qm3Re@paj)M$L0u6oV9JaUQo#m^IzZA^;li#-!sDXj&Oizeu_4~t% zS7oLxo%`IUWB2(UUfKD%P6xyo1t%&MRqHE>2=3HLU}gCu7x0U7=FXkJA1fz6`=-ZP ZR?KLpZJ^U6c3Ku>kf*Dk%Q~loCICN8Jazy8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_bottle.rsi/fill-4.png b/Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_bottle.rsi/fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..42fd7dc5d40d60bde105787e7c925e8bdf83f1ff GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}S)MMAArY-_ zuO8$)V8Fxd5V*^g?E}NSYtEGnyc2AHypWc?Ln2z= zPQA$Mq{!pC{+O=B0_G`P6L8bMe3#jE#u+}dIuP{nxoN4eju zCqbv)-if-M)Wgs)$GGFf*9eZpUC$zw6YkHMsi-6%XkZ+becMZSYs0-i6GH`8sWUW0 zz24CI{a){*wvU3EOScExP2T)`k*Au{^q{I=yo?Sm@5CpF literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_bottle.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_bottle.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..18e42a0f4d95e9ce95c981a221c46b0a299d1ec9 GIT binary patch literal 578 zcmV-I0=@l-P)Px${7FPXR9J=WmcNS{K@`V7<}60H*kTE3thNzsrr5mq9_`l1>oS^_kEHiAx%>NYX~EN z{$sz8QUa9D9mfH{aU7(S^dI|$iB01gc&I#d0Pa8E@rjSzJl%5t^^TjTTdPfNUW5Ut zKoQ0v0P6d`uYN$N*q;jqvMRzbuAl;S?1w<1_N}3e0aTz+LGcoS7!?Lk>|x5*Kt?HO zU$rOUAnY9f1cX0rgAjsxy?zpbvjOCJe&X;o$XNgm4*v!@8$h1t{|v+mAj>ke z)-0FH^4m5AS0;mNwc1!pS#CeqbxG5dYPE{innt6+Xf*n!l=}5vn^qAJLg4#;*+1(x zd@I*BbzpoO9#;SQF_L9j`7SV(RSM?wIg7;tIIi0EU1)U|yfw!3F1YBTXN<<-DRav8 Q>Hq)$07*qoM6N<$g2vel(f|Me literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_bottle.rsi/icon_open.png b/Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_bottle.rsi/icon_open.png new file mode 100644 index 0000000000000000000000000000000000000000..d74fc8721ab1f41ccb9d3f9ba81e6c61d4a33ce0 GIT binary patch literal 585 zcmV-P0=E5$P)Px%14%?dR9J=WmoaPGKorM+ZZw=Ns0LBGWYS{ra)X4If^nA&{Q`zgol-oDkk1f8 zK0uSHOF*9>ld(U*dGHk6!E`mo#==M(IG_%$WxGS@9j!Yw|K*;<-Fv^g_fB_$7yV;Z zYzKC`-F~apB2809qY<4>=Y6}~{<{E!!JxF`aa=sDo&a#ZIoy1_DSerMI3@u5I{SV` zv)N>^Sn&Az(bkPUz;d}9XsubV*JN2{4e-ilP?98lDJ8z|<9QxZN|Ge$9|d3=JO~2j z^Eqjn0$4*B0mS!lA*BQ;gS)N^fa|(QDT(jn!o;U>4ct}k+5p$@u6WBEE*>tq{&2;` z!==@xHZQ^uRH%rC5di9ZW2?^)DPU;k&Z-EbVFeYcogD#%+O&o;22i0wg~iVm7^0#O ziVaNJ8ptRG&6DOJx{cbqHzCm%;5ItwGc?G9@uxURl778jM+kw|8X*J#T5HDRvGJK; zRRfJi1Fbc_@1wQGb=?xgR8|11)e0d5wOZ|91&#)g=lMaveUPI7Yy&l(O7@p68LKDURcywdVBnlwPm*Nh$U9cYRu|fDnQp z2uk~?+wi$u+th*aX}F#J{$(V~vhrSFDytMsCKIO9DX^Qh?Y+?IEO@Su?f=1x{$Kq7 X2gBhfUk3oC00000NkvXXu0mjfMI8|M literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_bottle.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_bottle.rsi/meta.json index db0ac608ed0..960293f615a 100644 --- a/Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_bottle.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Drinks/space_mountain_wind_bottle.rsi/meta.json @@ -1 +1,35 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", "states": [{"name": "icon"}]} \ No newline at end of file +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", + "states": [ + { + "name": "icon" + }, + { + "name": "icon_open" + }, + { + "name": "icon_empty" + }, + { + "name": "fill-1" + }, + { + "name": "fill-2" + }, + { + "name": "fill-3" + }, + { + "name": "fill-4" + }, + { + "name": "fill-5" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/tequillabottle.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/tequillabottle.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..204e885505a4a03044793a27e3652a8b77ff43b4 GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}#-1*YArY-_ z&lz$tDDbcxRQR|5+~Q9f(YGCRT4w&TFk@n1XlPq?s`G5_{*D(Blhfnb3K-_}bNrpT SxQ`#Gox#)9&t;ucLK6V3f+mju literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/tequillabottle.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/tequillabottle.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..fa2fa7a1eb64cd98f865d688b2dfa87693f6bdc5 GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Hl8kyArY-_ zFBx(HRXJSjcxPX(!GHCZSlfe7_ttz6JPuSNq?8nX=FYQvKVHVSjM}>=)NY#oje84w a0mI>VPS#x)(k=qkFnGH9xvXACKXd0JucM4N{?$PBUoC!UK$NtRq<(w=d_;J=st(0e$ z)}I4d-Z3%s3r%vKt7;s)sO!!B(rXEf+z|(u-ZFjCkEs28+x&uFf}YPivDzw^m_IiOFm1BtvyLg!^F0Ej9)?UW`-&#=POCW~;Bg29FGffUIowE4s z8Os(27Z)X`wOdQ&y){eM@62F%*KuO@OEbo_bN+vydwntJ_gL3!$X(O;lkbRx{?c_@ zSC!>0Qtu2q@|Qz_fsw=EK&-=G@t(TRceNkrF_?)I$nRy9no$6B5`(9!pUXO@geCwR Cm`a=g literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/tequillabottle.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/tequillabottle.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..c8e014cc46aaeb6a315bfca0122d5db2ad8b42bd GIT binary patch literal 608 zcmV-m0-ybfP)Px%8c9S!R9J=WmOp3{Q5?rVC*sg0pdp33(kTiBOVbdCgMh&yP=^%vQaV^eA#RHQ z1~cgiE`lI#f})$+CDCv~21y2UT1d3ZEs5TVrOHVT9iM~EQMF*-T^o@4g~$8x-o5Yp z@cX@ccko|(U5d=Z^?E&sXYSk7?{}TR|jPfLUb(4 zDr7R5Z9{}D!340n(GWs(;OBWTO>;`dDD+!!_14WZ?%Jm!fSMS+3pB#`NCPZhIdA3l zEU(_RIlFifr`P52^GC(gm(LZQ^)-N}GJet}$m?0uF%2!A!0B~)+x>_ZPmtHMvQ|KZ z66EzPwdRW;4l8MZg-R85T*d9V!Pvt}6#((|8^?DW0N_M?l>UJc0G4f=x%4yu_f1pU zOB&$b$r;o!4flfsz^NmLgSq#yk=+LXSa??9*rp83CX+1NwsiVK0}M9aDwb8~kI|s+ zbLnYjlgZEkp)>H{^_yS%p#jvIFS({?srCDR%sK1dBf@dHj2(m8TlxWrC&7BwQPe{K0000Px%4oO5oR9J=WmOp3{VHn1LC*qJLOGqIpPEjZby@s=J5HL6d?2zJKN(XBYbW;!= z>?Ak1IJyanB8b{0)o?-vxq{|&FxusoL@#2ga*|+|!s}ozR4thAE>)yH@bP`z$M@Wi z_j&IR{MTNW7US%6qtTcFFbty#JRc3xkP3pp0jB#POHqCH#eoo!EfLv@;}HvB6pGvf zi8B?+9L&&ZcaYDY*t~Z?l9$q$>hFlgYCHuIrY2z1~u|S1cBX_KY2YrfEmw zod4@RuwV6nuImm!Sbh;{YMMs)C~l8p7%BBY5CntVfrt(>}azT$7J13XgkQ;wiy7RZce$)?iy?G|rZAIPTCl+1#v6%ZqWl3Ad(`gE|4 zDrJC$>I&g2IMki$3IOuuE5~*l0N{9PjP8L10Lz}oTz(3GTehw2r3`R$<^-AXES>j0 z04EP08tlDGCUzeHVBv90000Px$RY^oaR9J=Wl(9?0P!NZ|M1we6OdUG7l!8JQ2N!8k>D;A*Yde_PzaXo)bc}<7 zlY@)1SV-vNP&X?@9Nb#LP7b9+eGZyxp+zo5UET+Qm&?2R{qFL3pwVbFnt#TSYz~3| zfWtyT#j%p_bJK1Ea9^tda4M)fD=`p@mlrd`_Xt?c^9z*xO$wJtO{;LlR{ct9b^kCf6L7f0bxJnSa#KCyvVc$|32_y5MgILcQIagOK^mVBSht!?Iy zJqE2N0COvA^eY}w{Stt4*Zn;MG5w17wf+`ATi+1Z5*etwF1>{%9t|}TcT9`hw+LHy zu>uLtfUS&?r~CQ>K%>`THwZ*7L=$-a6q$rnT%*wdyaR%AU0gU=OgsPp002ovPDHLk FV1m_7t-=5R literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/tomatojuice.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/tomatojuice.rsi/meta.json index db0ac608ed0..9e1d9a9075d 100644 --- a/Resources/Textures/Objects/Consumable/Drinks/tomatojuice.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Drinks/tomatojuice.rsi/meta.json @@ -1 +1,17 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", "states": [{"name": "icon"}]} \ No newline at end of file +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", + "states": [ + { + "name": "icon" + }, + { + "name": "icon_open" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/vermouthbottle.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/vermouthbottle.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..be5efc55d81ff2913957651af3be7db33c8a0cc0 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}&YmugArY-_ z&u!#oP~c%c*l({88!j6MgLxD>$oscUT*6op8`RYEvwGc~&^j6&79R zy$7}*FnX9;#TFyGLFoO=>1UP{t$m5xZTFV3oQZ!1rWsfX5I2zEnmYw&sI(D>KZV z&#^!6V$v$Wz@XF=m7VoIspszfnoO2y9Uadt7#?I=y0`?Nzop4k?I^}M)xp0Z>`)0S zZ<^nkId$)C924Z;Of=wJ!y2U;6JEfg)o7OEr5WFQ?b^`D5UR8Lz0;%jn`#E%&ZTBwtCI5o=63^1pvkN$Q?k%5eFD0L0Hv{Ms22WQ%mvv4F FO#r;CU|j$J literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/vermouthbottle.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/vermouthbottle.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..3983b282db99063057024feef214e6086daebbf2 GIT binary patch literal 557 zcmV+|0@D47P)Px$=Sf6CR9J=WmOV%tVHn4M*K~1ks6<7lc8DLL&EX~p&Q3y8u?}9xgf4|H0f}oI zEK;aLIfo48+HiqOoUBfUN*C)Pxeiu3l(v)Rv_n$@ws0Lv+7eveCnZ$Z`u>BUtG@?;#?dL}(Tw<7fKLj*!LF!k$s*uuNr01uEGG+D0CZnZNuEKg)_tLTX$;PrYY(V%4IZLGXaHCkP>w+fC#OMDq= zy_AASXE^{54`5iL6Z$9?MZh>P+yF2z{_H(ANR=P1cLbmst**UYewW(c_gGoYVdZTi zgFhS~qN*h>!uiZ>X=ODBz^%-PxCoWnu=OrzJ$I(;;l9b(tV%12B5ot`2N-3 v{pkAB=be4p`l9zu#*_h+NAbV5&{Oae@K~{!`w>uX00000NkvXXu0mjfcgX|i literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/vermouthbottle.rsi/icon_open.png b/Resources/Textures/Objects/Consumable/Drinks/vermouthbottle.rsi/icon_open.png new file mode 100644 index 0000000000000000000000000000000000000000..25787f9279bbe592bc1e2a899d925c344f6153fe GIT binary patch literal 587 zcmV-R0<`^!P)Px%1xZ9fR9J=Wl|N`xQ5431F|HYew2&_1&_5Q;mxx1caqyuC68jnxhnhN+Dimy95luvB3(q06h0>w#Xj8;|)8QWO zcfNb>`2$Tfam;W@FW$B9U0PeNj&D`1{OO)E&*HB8ixQrbQUPnr)$z6t&lq@EHCKXw zNPsv47XktM+Lfy;nkHX=eCNGkh`1bOz%YzmJK@Vb-|YA~c8)GQ=1TBkZO<171P;x4 z!ij*RKvRH7K*E=qt#?2j3(}uzP%g# z5viriuP>SaZ~F>80Q!K|+1lSel#jj`JS?ZU2K*KONP0cTlXp4%75|8oM>GlT3L(W( zLQ1y+-GD_HKu0s2a>+7axk3ONqfs_SqW~zD5|&VjzaW*=n5e--t!_)XK^OfQq_z_CO_^yYsXm0*c<^%!kR3;X#kQV>|002ovPDHLkV1kCF5q|&x literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/vermouthbottle.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/vermouthbottle.rsi/meta.json index db0ac608ed0..960293f615a 100644 --- a/Resources/Textures/Objects/Consumable/Drinks/vermouthbottle.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Drinks/vermouthbottle.rsi/meta.json @@ -1 +1,35 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", "states": [{"name": "icon"}]} \ No newline at end of file +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", + "states": [ + { + "name": "icon" + }, + { + "name": "icon_open" + }, + { + "name": "icon_empty" + }, + { + "name": "fill-1" + }, + { + "name": "fill-2" + }, + { + "name": "fill-3" + }, + { + "name": "fill-4" + }, + { + "name": "fill-5" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/vodkabottle.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/vodkabottle.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..345d88ca77505316a575f6acf312725bf1902664 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}j-D=#ArY-_ z&u!!ds&WZ5$z%B~`Mr7Wnm0KHDrWz;ioX+J1S(^wxweV@on7eHS*|TJZl3zm`-VAv eg_nNzp~bv@jhy*kE=Mc?sq%F7b6Mw<&;$VUlPux@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/vodkabottle.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/vodkabottle.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..051e61b2d5e03628bcb5e5988ac20a8db103e0f6 GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}W}YsNArY-_ z&mH7sP~c&9C|&kW{oVD2cN{c0{@$r|b~*-Bv*6|$F{9%BpE@k2?hUp55dE7`&tVn| U+s^x82Z6E-p00i_>zopr06WJhG5`Po literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/vodkabottle.rsi/fill-3.png b/Resources/Textures/Objects/Consumable/Drinks/vodkabottle.rsi/fill-3.png new file mode 100644 index 0000000000000000000000000000000000000000..051e61b2d5e03628bcb5e5988ac20a8db103e0f6 GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}W}YsNArY-_ z&mH7sP~c&9C|&kW{oVD2cN{c0{@$r|b~*-Bv*6|$F{9%BpE@k2?hUp55dE7`&tVn| U+s^x82Z6E-p00i_>zopr06WJhG5`Po literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/vodkabottle.rsi/fill-4.png b/Resources/Textures/Objects/Consumable/Drinks/vodkabottle.rsi/fill-4.png new file mode 100644 index 0000000000000000000000000000000000000000..6ff8e90bf3d4807338a4640302c7691d452a52a2 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}ex5FlArY-_ zuR3xaFyL?r6s}U<8~@_(7r)rlaIRpc)@S?QE;#3B%)n4~{Yv8*nRj)wL#MhPS^38L u3e#r+h6mPx$q)9|UR9J=Wm9b01Kop0+v<51K2Gqe(HwDoWx`+r7L5iT0n@e}|Kd6Jy&DpJs zvs)3Yki`}$Z7>}yiklQ6C>b)e6g`L5THSJLMCxzJy%+A?M}9B&;9tWoCF};2x};Y1&?7 z00Wx+;{NdReZM4xFoY1>y{93BFo3CCE_V{P-mf=d=vi=S7~-y0>&Nb=_qmWYr7oi7 z@*x2C%_h^m+>Kk}djBGHEh!5U`39=v_2Z=Dp-LPs4baNYbT=QI6FWEuy2D9EQWhlg zjSq29aJvI3Dgc1zg>hciR)MYsNCHS(5WjjP>3Ad^kD%cGjs-#C{U?-dLMeb&b_Uh) zK3LG%7zGK4FMWYnr2;?z(Kg}P(NTZ>`6m2v4Gbe=IEPWaUO#TP+qZ+cVzIaYplRBq gWm${g1veae1qGR>DgtA~+W-In07*qoM6N<$g0Q^R7XSbN literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/vodkabottle.rsi/icon_open.png b/Resources/Textures/Objects/Consumable/Drinks/vodkabottle.rsi/icon_open.png new file mode 100644 index 0000000000000000000000000000000000000000..cec7bd047be9d4e16deb5752ecb402672da07087 GIT binary patch literal 498 zcmVPx$tVu*cR9J=Wl|4(tP!xurRs$761M1+Yn}T2nSww`QMO<`pbI>1<|DYX&Y_4^y zgR@%~D|Bf@iU!j`QQV{`LCKK8B6=PCs%|-IMf8P0?hW_NL(a*2;9vg|%5~jsrPQKQ zYSDGwZK+R6dN7J2uUITz0p#=fBipuDI|{J5GNGns7r1CPISo9P3N?{ew-i7t)W}?p zlCIa$4iBX^$pNa>DgdTw?iq&R^aEW72lLf91|XNqCGtxr1^8F?xM(&Rdfqz?JdO*s#9pEjWJ)J!e)zi1`XQR&9BpYrCY^b^*9s znGgYpN{}g?yj#cRKs=Dd)9`+*kB6CQ;Hd-%0mLQfI=Uw7hh+VbxE%aU3F7kGPbh6d z5y0*8Fq$8}E5Y4d4+tPW^##)PIsh?rwh4DOHeT;PCgHcMZ5Ua9a~L%mjjdLzb=JOD osZ_=QbX^~C9B2Hi;Qodl0dS$UMoA`WH2?qr07*qoM6N<$f~JhxT>t<8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/vodkabottle.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/vodkabottle.rsi/meta.json index db0ac608ed0..960293f615a 100644 --- a/Resources/Textures/Objects/Consumable/Drinks/vodkabottle.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Drinks/vodkabottle.rsi/meta.json @@ -1 +1,35 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", "states": [{"name": "icon"}]} \ No newline at end of file +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", + "states": [ + { + "name": "icon" + }, + { + "name": "icon_open" + }, + { + "name": "icon_empty" + }, + { + "name": "fill-1" + }, + { + "name": "fill-2" + }, + { + "name": "fill-3" + }, + { + "name": "fill-4" + }, + { + "name": "fill-5" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/waterbottle.rsi/icon_open.png b/Resources/Textures/Objects/Consumable/Drinks/waterbottle.rsi/icon_open.png new file mode 100644 index 0000000000000000000000000000000000000000..e38ba306507f624519762f569aa7fc88ffb828f1 GIT binary patch literal 382 zcmV-^0fGLBP)Px$I7vi7R9J=Wl(9;~P!xv0h(jFI4yHwjxby)8DaEbbic5w(f;hPO2#y^k;LuIn zg$9>wX0n5zMV#W`k_>4^3(0mItVML{v1DmJxWheg&i(m0|AmT*idDzZHiltHkedR~ z+b9fxPN%c*oHgy^%R(gpAjnPW_S$rN?YR@B2?%mi&RR`;z=wZ{P&=?J)-_GzID=M` z!=wNp{;nxdIdGi6v%ho8*7H3l_6?g4cLb-`DgjDdd3t#j7)TUF0t4|pPrZl>^A$r^ zU@$wbXrrmxf&SZvTuiQhR2=&LqoDZMR00lcizBOnKYtzy+agfRQm4SoQtGq&2z?6F z4os}ZpPI%2RSd^*h6B{IlzNupP_hGNZAzRJ?6D0%oD`U~X?X(9tzF}CG?d@9p-MtU cMa8P~36aom`^e$ii~s-t07*qoM6N<$f?+_YQ2+n{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/waterbottle.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/waterbottle.rsi/meta.json index 0922ee1d1aa..763da96dcbb 100644 --- a/Resources/Textures/Objects/Consumable/Drinks/waterbottle.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Drinks/waterbottle.rsi/meta.json @@ -11,6 +11,9 @@ { "name": "icon" }, + { + "name": "icon_open" + }, { "name": "icon-1" }, diff --git a/Resources/Textures/Objects/Consumable/Drinks/whiskeybottle.rsi/fill-1.png b/Resources/Textures/Objects/Consumable/Drinks/whiskeybottle.rsi/fill-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d5b0ad0b404e4fbce1347df21ab6433e2622d45d GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}j-D=#ArY-_ z&mH7sP~dUCsFio+o%*}$@1C4oy+UNqpK?A=7oaKzhWS%xZ`fTPdN)nU=}gX?vTd`O fvlW7Ua}PIjhX3Wv|NJTOKS-6QtDnm{r-UW|b`CD1 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/whiskeybottle.rsi/fill-2.png b/Resources/Textures/Objects/Consumable/Drinks/whiskeybottle.rsi/fill-2.png new file mode 100644 index 0000000000000000000000000000000000000000..ff0a6c45d770edd32af9c2f57841c0369d0ed807 GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}W}YsNArY-_ z&u!#oP~c%cc);f-|Hk;XBvy@pS-XFwS~4*(G^9ONUALoE?XT1O^!u8@*93S~FZ?s-j-Gvnf#Jt)Z_f0z^6#n3R_Q3syE}V( tP=Xx;Lrs^Bo3&+X&#a&ayvMl{7(ABq7F9SbR|6W%;OXk;vd$@?2>@;~Fi-#h literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/whiskeybottle.rsi/fill-5.png b/Resources/Textures/Objects/Consumable/Drinks/whiskeybottle.rsi/fill-5.png new file mode 100644 index 0000000000000000000000000000000000000000..44a006bcc1b66b38a382d6427a6ee8b4f525a483 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}m7Xq+ArY-_ zuN~xVP~c&`u>RwX+yn+Q<-B7ICDLpkmKe(UIQsJcD_075(C*FH(eW?um8RZOnPkC} ziYyEbs}^nD_AXmf_47<`{|4>Q+D)}O4INK*|NQJ7aV9_JUbL~y1MYV~T_<9%w=cPt m^{T|st=PLP-|Zb^2DAANvDCHa{#O7U!QkoY=d#Wzp$Py-s7H1H literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/whiskeybottle.rsi/icon_empty.png b/Resources/Textures/Objects/Consumable/Drinks/whiskeybottle.rsi/icon_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..196022ee1ae15b33b9d6677918e8c61e57f0108a GIT binary patch literal 521 zcmV+k0`~ohP)Px$!%0LzR9J=WmCs5WQ5431BX08t@d?aIknzrtRosM%+xQ0A#ID+ha5+$P=c>&n zFVIyblqm^?PB$49iMVJIBxEV&lFa_PNHRtnXzookh<#+?=sb(04g={uEvj|fQHi7HWLMhdRVL$l3zpX>G z^d8W%V0U+4{cq^>2a-RntC@MVo6r`5y}fr+-yMBA)}_-IkjZRtc6Pz}`Q?Ls$Fa%n zzxm*FDR4V>cky)Yr7i2OU0CDokIJcA2 z7GPX~QmF_G%RgC-XA@8^S8yCVj!j`K05JA_E&=U!2e`KYpwqdbR{KftE6^6O^hu}% zDP^FPa;Ghz2oycf`>Mma^vg)A2U@MxccAci-}n7(&+`^0>UH4`^hmOEbIh!Q00000 LNkvXXu0mjfI&bn8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/whiskeybottle.rsi/icon_open.png b/Resources/Textures/Objects/Consumable/Drinks/whiskeybottle.rsi/icon_open.png new file mode 100644 index 0000000000000000000000000000000000000000..31d51b22663880466bb807d8fb43b13670b02d26 GIT binary patch literal 521 zcmV+k0`~ohP)Px$!%0LzR9J=WmOo1)K^Vq=EB5&UVqq%bh_g$o*aQ>X_yL48Y41a%95}R2lg2L~ zHiyWH;o#OLt9M5Z3zHzh=0If7?OzMc>S@5tL=%qlfni@}cAj~7pLhPi2R`5kt@W;m zY>LRH)_T{K$8()%jENeJ#vg!kx%@Mq&)26apj6tB#l-~%gG&Go5BHq7=3E7s>#LFR z)C9a0=52m%wOVPclse92GM@qBIIbi~l8zON#j!aj&Vc86pC+0AZ&?7Kl!^d`=@*fX z=Xtc-?K(h`By}4;tF2> z%xl2Pf>LQiUORMdZVl(%-(&My7hz5**4NiYj%|I}wxzQdkj*Y}a`J=I(_eq}`+knX zYJvUzukS0M*XuJFT;lsVf=Hn__|v$s zTCf)2oPk=c3f!mvX*Q-NpxNBP_j76N3TFX;v+olL==J)*qXhu{{sl)z--y0P)&gdJ z5?a9+6NyMLssUA?YWqZ=`DJ8P1Kn=-0H{3g55sUpYyD=T{x94CI3m7s&=pZ300000 LNkvXXu0mjf;tKVq literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/whiskeybottle.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/whiskeybottle.rsi/meta.json index db0ac608ed0..960293f615a 100644 --- a/Resources/Textures/Objects/Consumable/Drinks/whiskeybottle.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Drinks/whiskeybottle.rsi/meta.json @@ -1 +1,35 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", "states": [{"name": "icon"}]} \ No newline at end of file +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", + "states": [ + { + "name": "icon" + }, + { + "name": "icon_open" + }, + { + "name": "icon_empty" + }, + { + "name": "fill-1" + }, + { + "name": "fill-2" + }, + { + "name": "fill-3" + }, + { + "name": "fill-4" + }, + { + "name": "fill-5" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Drinks/winebottle.rsi/icon.png b/Resources/Textures/Objects/Consumable/Drinks/winebottle.rsi/icon.png index 8929546cb5029aad427ce132b4c3718f181d617f..e527e5598a9d4a8bf3ac97693d55d5c437bb42ad 100644 GIT binary patch delta 501 zcmVPx$$Vo&&R9J=Wmpw>ZQ5462kq#C=Fwj9V zXqAH26cIZ3mEmFLl0vh&WD=xw5w#FHN}vv%)Tzafc4~_#g>I2Y2>}O*Lm~)1-%B;& zAxJc})XC?NKGE?WqYuH~bkBuz&YyGcxt9y~c#KcgLDzKvR(~|j8S1D3U~T)1m%8o) z&@@dc-UC$uE>C@x#O_*3jocN6CkAk<;E8~0Aa23e-a&pD0c?LirOq-RgmFBtfad~4 zEjZly<}58tVHXSlEHlIELfnbO63X*%H!Cprag*hr2eh<3=C^5K7mJjR{}73($5Jj? zxNp#D4g@ZeyMNflB35A^V=u21^X|2vx2q92fl`*%Cdit*0MtE%;FDU6y&D$re4w4a zP!s^WVDReyzGY@er827FfRXWek-z6-C>AjFHhRU5zwWtR0m)R3nJ<;G^KRq}ghN4sZM8t<99X9M9Uv00 zk=|t^J$+%jH=z{e7OZcT$sg6@_@9wKs;9xF|9LGOv9SZ;CLZHl{GKH`aMMM-ELh>vd z=&eK{2!gzbrKmSUa1WluQxQ?8ln8=u#t_Rwhh;sumEgK-;4%c^e~b=}hw&|Ve7~7> z`kvkly!Sru_x=5T??r6eCQOxuy8HhCa8Ww(V|TZE@0Q2^Wq<9M`?ei9SAfQdx3L;a z<;#Kx&$>`i2n8Sri7j~Fafh#21I#{tl>KB*xQ_1#IE8|*`Jr17k#xd8>x*uu)sM54 z1t6bGlSrhA4b5oRL+B9@CE>!$6+V3a&9%B4{L1BV3I(=z_lXVZucaM<>G4Uo)-Z~j z1JoJ@(JNIv8h;pcOAZjUv@PhkT?HJ#_A1w_VKuh_K>1}b8!nX|psnjBomM{p&Q_Mb z)BmaxN)DhjHM_*qhpjxH`2;{y{RNSqB7o&YrZ|pI^aAjB^fh-|^w$z4VUJ~=`BqVo zD3B^pQIJTS14`=jR(lQnbIuRo#h7;&sMC8@pbsFnV0<}|Vg8+0c7Ad|9DyFo#H{lg zPkf@6d``ayhyYT_4N}Q?@mqC5skANl_I;1doeJD&6Pr5~R7RVrj5c$4bd}8d-_ipF zEir()iv3FTBpZ1$eCFQYJ=g=_)!R4PPcjiekP1BqP5_49lo*sfJ_`T<002ovPDHLk FV1iJ;^mhON diff --git a/Resources/Textures/Objects/Consumable/Drinks/winebottle.rsi/icon_open.png b/Resources/Textures/Objects/Consumable/Drinks/winebottle.rsi/icon_open.png new file mode 100644 index 0000000000000000000000000000000000000000..399e934cd7906ce93f5cca1d5a5b8c04153f5967 GIT binary patch literal 539 zcmV+$0_6RPP)Px$)k#D_R9J=WmoZ3NQ51&16bDPAZJ>jsQnfe~Q>5si#tebX#X-p?6$(NTmm)2M zjuOzJQ*}}_)#)h(6}kyQqUa!TFr|af_fk!K6iPHzbnYyG(*Stvt(4lx0itWm zGz|pVn_p$`*QprbfjF~75?4TLX=h3IWBJ-Bye#rX=;L|?Tn7-f;P2Lq{cUm(E2jfs z8foSxV|GVRTzRbTW(7vaHu(PI56|mr`E8h3`81>j?R0f6|(hR8<*u$an-HY*uGBow$3J5`WK{1`bJj=ce(cVI%4@A?>u z0R}&HU5R6TuWuJ%F_q!#^x4?Cat0!y0D-!4;OrcjhWZ^K0$5+!W_@M&B6e;gMRwmyg|CqcUn57yPswbZ+&n<3B?h?s6kkW8pV5c+{r2UxgTo>K<5LNb d>d)w2{{c?ekRV2hfBgUe002ovPDHLkV1f~B_H6(F literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Drinks/winebottle.rsi/meta.json b/Resources/Textures/Objects/Consumable/Drinks/winebottle.rsi/meta.json index db0ac608ed0..9e1d9a9075d 100644 --- a/Resources/Textures/Objects/Consumable/Drinks/winebottle.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Drinks/winebottle.rsi/meta.json @@ -1 +1,17 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", "states": [{"name": "icon"}]} \ No newline at end of file +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/discordia-space/CEV-Eris/raw/f7aa28fd4b4d0386c3393d829681ebca526f1d2d/icons/obj/drinks.dmi", + "states": [ + { + "name": "icon" + }, + { + "name": "icon_open" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Food/condiments.rsi/bottle-open.png b/Resources/Textures/Objects/Consumable/Food/condiments.rsi/bottle-open.png new file mode 100644 index 0000000000000000000000000000000000000000..e4348aebba49e8d26ee1be39110548d83758eb06 GIT binary patch literal 260 zcmV+f0sH=mP)Px#zDYzuR9J=WmN5>(FbqXMh$Cdn24|>LwP$D;$~9PE$q~H3!Z}#rJjoK}9AyHb zb^!-rA^f&Pvh`xikpV^dWr!#cQ7FkV|CG%C2@p}J>l)Ttl(a#-0y9p~{q-rO$6d}D z-uuSg!LTUGIi5UGD}?F7XzqfVco_3fiiPZnK_D!S#Ik zjsO7cx4St02|0+jKm}BQEs#=zF$Tt%A_3My0${R+ah4H90e~Ax96nk4Tkdyi41_ymyT%N4=kYbp$C-?ym`-Uum*#)6%uh%a- z*sLlKiePUs$NwrL^jpi|nFbx^6Yh-{g57So9T}7Mac08 zGsl6|zc~~p^{DvXoz4BCL?U$SPQynB?oRUAWE+&t+K}4oyS?ZdW8yw-&VA?iSXFnGH9xvXNkl>teFp?}HZf1>$u1`|V z%pBVD7)drW003yMUACI4o*sIH&=U~Rm?PpCGkr+`?{4^02SeO_jG4ZqfWLAeqkmjL zIk3WkR41Hi_wE?(gdqo*8Hq>%K({e-c#3cThDA{nH@s|Xj)R<)fB*mh07*qoM6N<$ Ef=7c?a{vGU delta 192 zcmV;x06+ic0o(zQB!8nxL_t(oh3%DH3IibwgtKMe`#zxeKZ@s2$a6~%U~y?d7W*^l zwzM=KNRZJOM~LD$j`MTmoU7c4EIZ4llu{i<3lp=a-BMKpfYXg7hZrN3b7mH+>Jmc; z$F){U*Ine!)7p)Z{uERJk8b#B2c~X}^z94yHV0_^VzZh(jDne uNIB4w11PQWt)t~|6I=g=j^q3}B60@1lVy$_C4d|N0000%A_P)Px$^hrcPR9J=WmcMHgVHn3h5w#kq*Emm??n{g^n(T2BCLr@DI32 zNTfp1#ecv>C#PyB#i$UMoQqcQa!u6qa%ho2UWc^O8g28usVzc3+xz2t&-Z=qeIFh; zW@3YGR7&*(v7W@prq#|j!Y6P0)(7R3X!kBU%{HB8TUY*z(>fv}n^y6J$(i#bgzp1o zWYe-^??O8RhsFPGptJR3Xaibz0N{Jj8alW(wr#6gtyXC?8Xs)iRtGEoj<^m?-ngzV zSYrU3JvRctXMY3#!Lu01>wwlTXn)<*k^K=-1{}xPH{IoOSzHeW&Vb`Ms!%ArI$)cU zni#qcSe7+zS=P9&UUUa;zj!$F``oqZs{pLMdy|a+YXbmN6PNakEn`e0tfqlv@owK- zkjeDcs#ThEb7BLcJFv9SWoe;{VVY!CRxnJH`PnY>vt4muEdx6wU6)iUMbdTmm^(59 z`Fsvzbd-EPrxjG&K?=fx z%hLcnf4NHhbwh06*n2{8DgIdhwC`BTq4oo%QYj|wh)y`+Cu6OhIV`$IB>(^b07*qo IM6N<$f_fbXFaQ7m literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Fun/glue.rsi/meta.json b/Resources/Textures/Objects/Fun/glue.rsi/meta.json index d2ae18500a5..55fc6227cd4 100644 --- a/Resources/Textures/Objects/Fun/glue.rsi/meta.json +++ b/Resources/Textures/Objects/Fun/glue.rsi/meta.json @@ -10,6 +10,9 @@ { "name": "icon" }, + { + "name": "icon_open" + }, { "name": "inhand-left", "directions": 4 From 196853a693bac0c858ce3be6c01ea124fd7881e2 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 4 Feb 2024 20:14:53 +0000 Subject: [PATCH 221/266] Automatic changelog update (cherry picked from commit d9e6d3e2f7e3930ab1983a78d048c3cc173a1345) --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index c62d855a868..ffab45ce947 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: mirrorcult - changes: - - message: Scientists can now fabricate faux grass planet and ice tiles with a tier - 2 civilian services research! They're just as good as the real thing, while - being removable. - type: Add - id: 5387 - time: '2023-12-16T08:20:57.0000000+00:00' - author: Ubaser changes: - message: Lawyers, librarians and reporters now spawn with a luxury pen in their @@ -3878,3 +3870,10 @@ id: 5886 time: '2024-02-04T02:23:16.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24937 +- author: Tayrtahn + changes: + - message: Added opened/closed visuals and fill levels for a variety of drinks. + type: Add + id: 5887 + time: '2024-02-04T20:13:48.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24600 From ac1f8436c437180f3ef4c4644dc61470515a607c Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Sun, 4 Feb 2024 20:48:06 +0000 Subject: [PATCH 222/266] grille is flimsy (#24881) Co-authored-by: deltanedas <@deltanedas:kde.org> (cherry picked from commit 66d7e60cdcd1dabb564ac4166aade722f6cf2583) --- Resources/Prototypes/Damage/modifier_sets.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Resources/Prototypes/Damage/modifier_sets.yml b/Resources/Prototypes/Damage/modifier_sets.yml index bf88837e8da..8a7b84ff1a7 100644 --- a/Resources/Prototypes/Damage/modifier_sets.yml +++ b/Resources/Prototypes/Damage/modifier_sets.yml @@ -52,12 +52,9 @@ id: PerforatedMetallic coefficients: Blunt: 2 - Slash: 0.6 Piercing: 0.2 - Shock: 1.2 + Shock: 0.6 flatReductions: - Blunt: 5 - Heat: 5 Piercing: 10 # for fragile electronics like consoles or shuttle engines. From 8b3687a8aea37036373ee9de3602b4e6dc871794 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 4 Feb 2024 20:49:12 +0000 Subject: [PATCH 223/266] Automatic changelog update (cherry picked from commit 0ccdd873d258947481eb8c87f1d9472d4cc6c750) --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index ffab45ce947..ec6b8a8c49d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Ubaser - changes: - - message: Lawyers, librarians and reporters now spawn with a luxury pen in their - PDA. - type: Add - id: 5388 - time: '2023-12-16T08:21:24.0000000+00:00' - author: TheShuEd changes: - message: Added 9 new cargo bounties! @@ -3877,3 +3870,10 @@ id: 5887 time: '2024-02-04T20:13:48.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24600 +- author: deltanedas + changes: + - message: Grilles are no longer incredibly strong. + type: Tweak + id: 5888 + time: '2024-02-04T20:48:06.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24881 From a60a0a3c8eb4f8d2fe8cc5973e835c11fdb937f6 Mon Sep 17 00:00:00 2001 From: Scribbles0 <91828755+Scribbles0@users.noreply.github.com> Date: Sun, 4 Feb 2024 15:01:49 -0800 Subject: [PATCH 224/266] Auto Attack for Holoparasites (#24944) autoAttack field (cherry picked from commit 8ae63ccc03a8b217f7b47d8a33633ff7a94addfe) --- Resources/Prototypes/Entities/Mobs/Player/guardian.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/Resources/Prototypes/Entities/Mobs/Player/guardian.yml b/Resources/Prototypes/Entities/Mobs/Player/guardian.yml index 06eda05ee15..d892b31fac3 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/guardian.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/guardian.yml @@ -85,6 +85,7 @@ altDisarm: false animation: WeaponArcFist attackRate: 1.8 + autoAttack: true damage: types: Blunt: 20 From 5a5da1df6b27672efd87cff06ad0db2def60928d Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 4 Feb 2024 23:02:55 +0000 Subject: [PATCH 225/266] Automatic changelog update (cherry picked from commit c856dd75067bace5944332a0f4b43d5bde413042) --- Resources/Changelog/Changelog.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index ec6b8a8c49d..91ae5225c4f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: TheShuEd - changes: - - message: Added 9 new cargo bounties! - type: Add - id: 5389 - time: '2023-12-16T08:23:35.0000000+00:00' - author: mirrorcult changes: - message: Everyone can toggle fire alarms now, not just atmos @@ -3877,3 +3871,11 @@ id: 5888 time: '2024-02-04T20:48:06.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24881 +- author: Scribbles0 + changes: + - message: Holoparasites can now autoattack at their max attack rate when holding + down their attack button. + type: Add + id: 5889 + time: '2024-02-04T23:01:49.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24944 From 965e1cae5716c9602532a4166dc0d2aebb9e4285 Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Sun, 4 Feb 2024 23:29:35 +0000 Subject: [PATCH 226/266] criminal records revival (#22510) (cherry picked from commit 683591ab046eb720e6ccfd3d0f6e5574f5f7efbc) --- .../CriminalRecords/CrimeHistoryWindow.xaml | 15 + .../CrimeHistoryWindow.xaml.cs | 105 +++++++ ...riminalRecordsConsoleBoundUserInterface.cs | 78 +++++ .../CriminalRecordsConsoleWindow.xaml | 37 +++ .../CriminalRecordsConsoleWindow.xaml.cs | 263 +++++++++++++++++ ...lStationRecordConsoleBoundUserInterface.cs | 21 +- .../GeneralStationRecordConsoleWindow.xaml.cs | 26 +- .../Access/Systems/IdCardConsoleSystem.cs | 20 +- .../Administration/Systems/AdminSystem.cs | 4 +- .../CriminalRecordsConsoleComponent.cs | 45 +++ .../Systems/CriminalRecordsConsoleSystem.cs | 224 +++++++++++++++ .../Systems/CriminalRecordsSystem.cs | 93 ++++++ Content.Server/Mind/Commands/RenameCommand.cs | 10 +- .../StationEvents/Events/ClericalErrorRule.cs | 7 +- .../GeneralStationRecordConsoleComponent.cs | 19 +- .../StationRecords/StationRecordSet.cs | 71 +++-- .../GeneralStationRecordConsoleSystem.cs | 131 +++------ .../Systems/StationRecordsSystem.cs | 272 +++++++++++++----- .../Components/AccessReaderComponent.cs | 2 +- .../CriminalRecords/CriminalRecord.cs | 38 +++ .../CriminalRecords/CriminalRecordsUi.cs | 102 +++++++ Content.Shared/Security/SecurityStatus.cs | 15 + ...rdConsoleSystem.cs => GeneralRecordsUi.cs} | 30 +- .../StationRecords/GeneralStationRecord.cs | 22 +- .../GeneralStationRecordsFilter.cs | 38 --- .../StationRecords/StationRecordKey.cs | 10 +- .../StationRecords/StationRecordsFilter.cs | 44 +++ .../criminal-records/criminal-records.ftl | 44 +++ Resources/Locale/en-US/guidebook/guides.ftl | 1 + .../general-station-records.ftl | 7 +- .../Prototypes/Datasets/criminal_records.yml | 18 ++ .../Machines/Computers/computers.yml | 14 +- Resources/Prototypes/Guidebook/security.yml | 10 +- .../Guidebook/Security/CriminalRecords.xml | 39 +++ 34 files changed, 1550 insertions(+), 325 deletions(-) create mode 100644 Content.Client/CriminalRecords/CrimeHistoryWindow.xaml create mode 100644 Content.Client/CriminalRecords/CrimeHistoryWindow.xaml.cs create mode 100644 Content.Client/CriminalRecords/CriminalRecordsConsoleBoundUserInterface.cs create mode 100644 Content.Client/CriminalRecords/CriminalRecordsConsoleWindow.xaml create mode 100644 Content.Client/CriminalRecords/CriminalRecordsConsoleWindow.xaml.cs create mode 100644 Content.Server/CriminalRecords/Components/CriminalRecordsConsoleComponent.cs create mode 100644 Content.Server/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs create mode 100644 Content.Server/CriminalRecords/Systems/CriminalRecordsSystem.cs create mode 100644 Content.Shared/CriminalRecords/CriminalRecord.cs create mode 100644 Content.Shared/CriminalRecords/CriminalRecordsUi.cs create mode 100644 Content.Shared/Security/SecurityStatus.cs rename Content.Shared/StationRecords/{SharedGeneralStationRecordConsoleSystem.cs => GeneralRecordsUi.cs} (65%) delete mode 100644 Content.Shared/StationRecords/GeneralStationRecordsFilter.cs create mode 100644 Content.Shared/StationRecords/StationRecordsFilter.cs create mode 100644 Resources/Locale/en-US/criminal-records/criminal-records.ftl create mode 100644 Resources/Prototypes/Datasets/criminal_records.yml create mode 100644 Resources/ServerInfo/Guidebook/Security/CriminalRecords.xml diff --git a/Content.Client/CriminalRecords/CrimeHistoryWindow.xaml b/Content.Client/CriminalRecords/CrimeHistoryWindow.xaml new file mode 100644 index 00000000000..358fade2e3c --- /dev/null +++ b/Content.Client/CriminalRecords/CrimeHistoryWindow.xaml @@ -0,0 +1,15 @@ + + + +

    /// All recently accessed keys from this record set. - public IEnumerable GetRecentlyAccessed() + public IEnumerable GetRecentlyAccessed() { return _recentlyAccessed.ToArray(); } @@ -135,17 +146,23 @@ public void ClearRecentlyAccessed() _recentlyAccessed.Clear(); } + /// + /// Removes a recently accessed key from the set. + /// + public void RemoveFromRecentlyAccessed(uint key) + { + _recentlyAccessed.Remove(key); + } + /// /// Removes all record entries related to this key from this set. /// /// The key to remove. /// True if successful, false otherwise. - public bool RemoveAllRecords(StationRecordKey key) + public bool RemoveAllRecords(uint key) { if (!Keys.Remove(key)) - { return false; - } foreach (var table in _tables.Values) { diff --git a/Content.Server/StationRecords/Systems/GeneralStationRecordConsoleSystem.cs b/Content.Server/StationRecords/Systems/GeneralStationRecordConsoleSystem.cs index f69caaa9a7e..721eff6f2cf 100644 --- a/Content.Server/StationRecords/Systems/GeneralStationRecordConsoleSystem.cs +++ b/Content.Server/StationRecords/Systems/GeneralStationRecordConsoleSystem.cs @@ -1,5 +1,6 @@ using System.Linq; using Content.Server.Station.Systems; +using Content.Server.StationRecords.Components; using Content.Shared.StationRecords; using Robust.Server.GameObjects; @@ -7,126 +8,78 @@ namespace Content.Server.StationRecords.Systems; public sealed class GeneralStationRecordConsoleSystem : EntitySystem { - [Dependency] private readonly UserInterfaceSystem _userInterface = default!; - [Dependency] private readonly StationSystem _stationSystem = default!; - [Dependency] private readonly StationRecordsSystem _stationRecordsSystem = default!; + [Dependency] private readonly UserInterfaceSystem _ui = default!; + [Dependency] private readonly StationSystem _station = default!; + [Dependency] private readonly StationRecordsSystem _stationRecords = default!; public override void Initialize() { - SubscribeLocalEvent(UpdateUserInterface); - SubscribeLocalEvent(OnKeySelected); - SubscribeLocalEvent(OnFiltersChanged); SubscribeLocalEvent(UpdateUserInterface); SubscribeLocalEvent(UpdateUserInterface); SubscribeLocalEvent(UpdateUserInterface); + + Subs.BuiEvents(GeneralStationRecordConsoleKey.Key, subs => + { + subs.Event(UpdateUserInterface); + subs.Event(OnKeySelected); + subs.Event(OnFiltersChanged); + }); } - private void UpdateUserInterface(EntityUid uid, GeneralStationRecordConsoleComponent component, T ev) + private void UpdateUserInterface(Entity ent, ref T args) { - UpdateUserInterface(uid, component); + UpdateUserInterface(ent); } - private void OnKeySelected(EntityUid uid, GeneralStationRecordConsoleComponent component, - SelectGeneralStationRecord msg) + // TODO: instead of copy paste shitcode for each record console, have a shared records console comp they all use + // then have this somehow play nicely with creating ui state + // if that gets done put it in StationRecordsSystem console helpers section :) + private void OnKeySelected(Entity ent, ref SelectStationRecord msg) { - component.ActiveKey = msg.SelectedKey; - UpdateUserInterface(uid, component); + ent.Comp.ActiveKey = msg.SelectedKey; + UpdateUserInterface(ent); } - private void OnFiltersChanged(EntityUid uid, - GeneralStationRecordConsoleComponent component, GeneralStationRecordsFilterMsg msg) + private void OnFiltersChanged(Entity ent, ref SetStationRecordFilter msg) { - if (component.Filter == null || - component.Filter.Type != msg.Type || component.Filter.Value != msg.Value) + if (ent.Comp.Filter == null || + ent.Comp.Filter.Type != msg.Type || ent.Comp.Filter.Value != msg.Value) { - component.Filter = new GeneralStationRecordsFilter(msg.Type, msg.Value); - UpdateUserInterface(uid, component); + ent.Comp.Filter = new StationRecordsFilter(msg.Type, msg.Value); + UpdateUserInterface(ent); } } - private void UpdateUserInterface(EntityUid uid, - GeneralStationRecordConsoleComponent? console = null) + private void UpdateUserInterface(Entity ent) { - if (!Resolve(uid, ref console)) - { - return; - } - - var owningStation = _stationSystem.GetOwningStation(uid); + var (uid, console) = ent; + var owningStation = _station.GetOwningStation(uid); - if (!TryComp(owningStation, out var stationRecordsComponent)) + if (!TryComp(owningStation, out var stationRecords)) { - GeneralStationRecordConsoleState state = new(null, null, null, null); - SetStateForInterface(uid, state); + _ui.TrySetUiState(uid, GeneralStationRecordConsoleKey.Key, new GeneralStationRecordConsoleState()); return; } - var consoleRecords = - _stationRecordsSystem.GetRecordsOfType(owningStation.Value, stationRecordsComponent); - - var listing = new Dictionary<(NetEntity, uint), string>(); + var listing = _stationRecords.BuildListing((owningStation.Value, stationRecords), console.Filter); - foreach (var pair in consoleRecords) + switch (listing.Count) { - if (console.Filter != null && IsSkippedRecord(console.Filter, pair.Item2)) - { - continue; - } - - listing.Add(_stationRecordsSystem.Convert(pair.Item1), pair.Item2.Name); + case 0: + _ui.TrySetUiState(uid, GeneralStationRecordConsoleKey.Key, new GeneralStationRecordConsoleState()); + return; + case 1: + console.ActiveKey = listing.Keys.First(); + break; } - if (listing.Count == 0) - { - GeneralStationRecordConsoleState state = new(null, null, null, console.Filter); - SetStateForInterface(uid, state); + if (console.ActiveKey is not { } id) return; - } - else if (listing.Count == 1) - { - console.ActiveKey = listing.Keys.First(); - } - GeneralStationRecord? record = null; - if (console.ActiveKey != null) - { - _stationRecordsSystem.TryGetRecord(owningStation.Value, _stationRecordsSystem.Convert(console.ActiveKey.Value), out record, - stationRecordsComponent); - } + var key = new StationRecordKey(id, owningStation.Value); + _stationRecords.TryGetRecord(key, out var record, stationRecords); - GeneralStationRecordConsoleState newState = new(console.ActiveKey, record, listing, console.Filter); - SetStateForInterface(uid, newState); - } - - private void SetStateForInterface(EntityUid uid, GeneralStationRecordConsoleState newState) - { - _userInterface.TrySetUiState(uid, GeneralStationRecordConsoleKey.Key, newState); - } - - private bool IsSkippedRecord(GeneralStationRecordsFilter filter, - GeneralStationRecord someRecord) - { - bool isFilter = filter.Value.Length > 0; - string filterLowerCaseValue = ""; - - if (!isFilter) - return false; - - filterLowerCaseValue = filter.Value.ToLower(); - - return filter.Type switch - { - GeneralStationRecordFilterType.Name => - !someRecord.Name.ToLower().Contains(filterLowerCaseValue), - GeneralStationRecordFilterType.Prints => someRecord.Fingerprint != null - && IsFilterWithSomeCodeValue(someRecord.Fingerprint, filterLowerCaseValue), - GeneralStationRecordFilterType.DNA => someRecord.DNA != null - && IsFilterWithSomeCodeValue(someRecord.DNA, filterLowerCaseValue), - }; - } - - private bool IsFilterWithSomeCodeValue(string value, string filter) - { - return !value.ToLower().StartsWith(filter); + GeneralStationRecordConsoleState newState = new(id, record, listing, console.Filter); + _ui.TrySetUiState(uid, GeneralStationRecordConsoleKey.Key, newState); } } diff --git a/Content.Server/StationRecords/Systems/StationRecordsSystem.cs b/Content.Server/StationRecords/Systems/StationRecordsSystem.cs index fd5094d5330..09a00e5967c 100644 --- a/Content.Server/StationRecords/Systems/StationRecordsSystem.cs +++ b/Content.Server/StationRecords/Systems/StationRecordsSystem.cs @@ -32,8 +32,8 @@ namespace Content.Server.StationRecords.Systems; ///
    public sealed class StationRecordsSystem : SharedStationRecordsSystem { - [Dependency] private readonly InventorySystem _inventorySystem = default!; - [Dependency] private readonly StationRecordKeyStorageSystem _keyStorageSystem = default!; + [Dependency] private readonly InventorySystem _inventory = default!; + [Dependency] private readonly StationRecordKeyStorageSystem _keyStorage = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; public override void Initialize() @@ -45,26 +45,22 @@ public override void Initialize() private void OnPlayerSpawn(PlayerSpawnCompleteEvent args) { - if (!HasComp(args.Station)) + if (!TryComp(args.Station, out var stationRecords)) return; - CreateGeneralRecord(args.Station, args.Mob, args.Profile, args.JobId); + CreateGeneralRecord(args.Station, args.Mob, args.Profile, args.JobId, stationRecords); } private void CreateGeneralRecord(EntityUid station, EntityUid player, HumanoidCharacterProfile profile, - string? jobId, StationRecordsComponent? records = null) + string? jobId, StationRecordsComponent records) { - if (!Resolve(station, ref records) - || string.IsNullOrEmpty(jobId) + // TODO make PlayerSpawnCompleteEvent.JobId a ProtoId + if (string.IsNullOrEmpty(jobId) || !_prototypeManager.HasIndex(jobId)) - { return; - } - if (!_inventorySystem.TryGetSlotEntity(player, "id", out var idUid)) - { + if (!_inventory.TryGetSlotEntity(player, "id", out var idUid)) return; - } TryComp(player, out var fingerprintComponent); TryComp(player, out var dnaComponent); @@ -100,17 +96,28 @@ private void CreateGeneralRecord(EntityUid station, EntityUid player, HumanoidCh /// Optional - other systems should anticipate this. /// /// Station records component. - public void CreateGeneralRecord(EntityUid station, EntityUid? idUid, string name, int age, string species, Gender gender, string jobId, string? mobFingerprint, string? dna, HumanoidCharacterProfile? profile = null, - StationRecordsComponent? records = null) + public void CreateGeneralRecord( + EntityUid station, + EntityUid? idUid, + string name, + int age, + string species, + Gender gender, + string jobId, + string? mobFingerprint, + string? dna, + HumanoidCharacterProfile profile, + StationRecordsComponent records) { - if (!Resolve(station, ref records)) - { - return; - } + if (!_prototypeManager.TryIndex(jobId, out var jobPrototype)) + throw new ArgumentException($"Invalid job prototype ID: {jobId}"); - if (!_prototypeManager.TryIndex(jobId, out JobPrototype? jobPrototype)) + // when adding a record that already exists use the old one + // this happens when respawning as the same character + if (GetRecordByName(station, name, records) is {} id) { - throw new ArgumentException($"Invalid job prototype ID: {jobId}"); + SetIdKey(idUid, new StationRecordKey(id, station)); + return; } var record = new GeneralStationRecord() @@ -129,40 +136,47 @@ public void CreateGeneralRecord(EntityUid station, EntityUid? idUid, string name var key = AddRecordEntry(station, record); if (!key.IsValid()) + { + Log.Warning($"Failed to add general record entry for {name}"); return; + } + + SetIdKey(idUid, key); + + RaiseLocalEvent(new AfterGeneralRecordCreatedEvent(key, record, profile)); + } - if (idUid != null) + /// + /// Set the station records key for an id/pda. + /// + public void SetIdKey(EntityUid? uid, StationRecordKey key) + { + if (uid is not {} idUid) + return; + + var keyStorageEntity = idUid; + if (TryComp(idUid, out var pda) && pda.ContainedId is {} id) { - var keyStorageEntity = idUid; - if (TryComp(idUid, out PdaComponent? pdaComponent) && pdaComponent.ContainedId != null) - { - keyStorageEntity = pdaComponent.IdSlot.Item; - } - - if (keyStorageEntity != null) - { - _keyStorageSystem.AssignKey(keyStorageEntity.Value, key); - } + keyStorageEntity = id; } - RaiseLocalEvent(new AfterGeneralRecordCreatedEvent(station, key, record, profile)); + _keyStorage.AssignKey(keyStorageEntity, key); } /// /// Removes a record from this station. /// - /// Station to remove the record from. - /// The key to remove. + /// The station and key to remove. /// Station records component. /// True if the record was removed, false otherwise. - public bool RemoveRecord(EntityUid station, StationRecordKey key, StationRecordsComponent? records = null) + public bool RemoveRecord(StationRecordKey key, StationRecordsComponent? records = null) { - if (!Resolve(station, ref records)) + if (!Resolve(key.OriginStation, ref records)) return false; - if (records.Records.RemoveAllRecords(key)) + if (records.Records.RemoveAllRecords(key.Id)) { - RaiseLocalEvent(new RecordRemovedEvent(station, key)); + RaiseLocalEvent(new RecordRemovedEvent(key)); return true; } @@ -174,20 +188,39 @@ public bool RemoveRecord(EntityUid station, StationRecordKey key, StationRecords /// from the provided station record key. Will always return /// null if the key does not match the station. ///
    - /// Station to get the record from. - /// Key to try and index from the record set. + /// Station and key to try and index from the record set. /// The resulting entry. /// Station record component. /// Type to get from the record set. /// True if the record was obtained, false otherwise. - public bool TryGetRecord(EntityUid station, StationRecordKey key, [NotNullWhen(true)] out T? entry, StationRecordsComponent? records = null) + public bool TryGetRecord(StationRecordKey key, [NotNullWhen(true)] out T? entry, StationRecordsComponent? records = null) { entry = default; - if (!Resolve(station, ref records)) + if (!Resolve(key.OriginStation, ref records)) return false; - return records.Records.TryGetRecordEntry(key, out entry); + return records.Records.TryGetRecordEntry(key.Id, out entry); + } + + /// + /// Returns an id if a record with the same name exists. + /// + /// + /// Linear search so O(n) time complexity. + /// + public uint? GetRecordByName(EntityUid station, string name, StationRecordsComponent? records = null) + { + if (!Resolve(station, ref records)) + return null; + + foreach (var (id, record) in GetRecordsOfType(station, records)) + { + if (record.Name == name) + return id; + } + + return null; } /// @@ -197,30 +230,47 @@ public bool TryGetRecord(EntityUid station, StationRecordKey key, [NotNullWhe /// Station records component. /// Type of record to fetch /// Enumerable of pairs with a station record key, and the entry in question of type T. - public IEnumerable<(StationRecordKey, T)> GetRecordsOfType(EntityUid station, StationRecordsComponent? records = null) + public IEnumerable<(uint, T)> GetRecordsOfType(EntityUid station, StationRecordsComponent? records = null) { if (!Resolve(station, ref records)) - { - return Array.Empty<(StationRecordKey, T)>(); - } + return Array.Empty<(uint, T)>(); return records.Records.GetRecordsOfType(); } /// - /// Adds a record entry to a station's record set. + /// Adds a new record entry to a station's record set. /// /// The station to add the record to. /// The record to add. /// Station records component. /// The type of record to add. - public StationRecordKey AddRecordEntry(EntityUid station, T record, - StationRecordsComponent? records = null) + public StationRecordKey AddRecordEntry(EntityUid station, T record, StationRecordsComponent? records = null) { if (!Resolve(station, ref records)) return StationRecordKey.Invalid; - return records.Records.AddRecordEntry(station, record); + var id = records.Records.AddRecordEntry(record); + if (id == null) + return StationRecordKey.Invalid; + + return new StationRecordKey(id.Value, station); + } + + /// + /// Adds a record to an existing entry. + /// + /// The station and id of the existing entry. + /// The record to add. + /// Station records component. + /// The type of record to add. + public void AddRecordEntry(StationRecordKey key, T record, + StationRecordsComponent? records = null) + { + if (!Resolve(key.OriginStation, ref records)) + return; + + records.Records.AddRecordEntry(key.Id, record); } /// @@ -231,17 +281,99 @@ public StationRecordKey AddRecordEntry(EntityUid station, T record, public void Synchronize(EntityUid station, StationRecordsComponent? records = null) { if (!Resolve(station, ref records)) - { return; - } foreach (var key in records.Records.GetRecentlyAccessed()) { - RaiseLocalEvent(new RecordModifiedEvent(station, key)); + RaiseLocalEvent(new RecordModifiedEvent(new StationRecordKey(key, station))); } records.Records.ClearRecentlyAccessed(); } + + /// + /// Synchronizes a single record's entries for a station. + /// + /// The station and id of the record + /// Station records component. + public void Synchronize(StationRecordKey key, StationRecordsComponent? records = null) + { + if (!Resolve(key.OriginStation, ref records)) + return; + + RaiseLocalEvent(new RecordModifiedEvent(key)); + + records.Records.RemoveFromRecentlyAccessed(key.Id); + } + + #region Console system helpers + + /// + /// Checks if a record should be skipped given a filter. + /// Takes general record since even if you are using this for e.g. criminal records, + /// you don't want to duplicate basic info like name and dna. + /// Station records lets you do this nicely with multiple types having their own data. + /// + public bool IsSkipped(StationRecordsFilter? filter, GeneralStationRecord someRecord) + { + // if nothing is being filtered, show everything + if (filter == null) + return false; + if (filter.Value.Length == 0) + return false; + + var filterLowerCaseValue = filter.Value.ToLower(); + + return filter.Type switch + { + StationRecordFilterType.Name => + !someRecord.Name.ToLower().Contains(filterLowerCaseValue), + StationRecordFilterType.Prints => someRecord.Fingerprint != null + && IsFilterWithSomeCodeValue(someRecord.Fingerprint, filterLowerCaseValue), + StationRecordFilterType.DNA => someRecord.DNA != null + && IsFilterWithSomeCodeValue(someRecord.DNA, filterLowerCaseValue), + }; + } + + private bool IsFilterWithSomeCodeValue(string value, string filter) + { + return !value.ToLower().StartsWith(filter); + } + + /// + /// Build a record listing of id to name for a station and filter. + /// + public Dictionary BuildListing(Entity station, StationRecordsFilter? filter) + { + var listing = new Dictionary(); + + var records = GetRecordsOfType(station, station.Comp); + foreach (var pair in records) + { + if (IsSkipped(filter, pair.Item2)) + continue; + + listing.Add(pair.Item1, pair.Item2.Name); + } + + return listing; + } + + #endregion +} + +/// +/// Base event for station record events +/// +public abstract class StationRecordEvent : EntityEventArgs +{ + public readonly StationRecordKey Key; + public EntityUid Station => Key.OriginStation; + + protected StationRecordEvent(StationRecordKey key) + { + Key = key; + } } /// @@ -250,23 +382,19 @@ public void Synchronize(EntityUid station, StationRecordsComponent? records = nu /// listening to this event, as it contains the character's record key. /// Also stores the general record reference, to save some time. /// -public sealed class AfterGeneralRecordCreatedEvent : EntityEventArgs +public sealed class AfterGeneralRecordCreatedEvent : StationRecordEvent { - public readonly EntityUid Station; - public StationRecordKey Key { get; } - public GeneralStationRecord Record { get; } + public readonly GeneralStationRecord Record; /// /// Profile for the related player. This is so that other systems can get further information /// about the player character. /// Optional - other systems should anticipate this. /// - public HumanoidCharacterProfile? Profile { get; } + public readonly HumanoidCharacterProfile Profile; - public AfterGeneralRecordCreatedEvent(EntityUid station, StationRecordKey key, GeneralStationRecord record, - HumanoidCharacterProfile? profile) + public AfterGeneralRecordCreatedEvent(StationRecordKey key, GeneralStationRecord record, + HumanoidCharacterProfile profile) : base(key) { - Station = station; - Key = key; Record = record; Profile = profile; } @@ -278,15 +406,10 @@ public AfterGeneralRecordCreatedEvent(EntityUid station, StationRecordKey key, G /// that store record keys can then remove the key from their internal /// fields. /// -public sealed class RecordRemovedEvent : EntityEventArgs +public sealed class RecordRemovedEvent : StationRecordEvent { - public readonly EntityUid Station; - public StationRecordKey Key { get; } - - public RecordRemovedEvent(EntityUid station, StationRecordKey key) + public RecordRemovedEvent(StationRecordKey key) : base(key) { - Station = station; - Key = key; } } @@ -295,14 +418,9 @@ public RecordRemovedEvent(EntityUid station, StationRecordKey key) /// inform other systems that records stored in this key /// may have changed. /// -public sealed class RecordModifiedEvent : EntityEventArgs +public sealed class RecordModifiedEvent : StationRecordEvent { - public readonly EntityUid Station; - public StationRecordKey Key { get; } - - public RecordModifiedEvent(EntityUid station, StationRecordKey key) + public RecordModifiedEvent(StationRecordKey key) : base(key) { - Station = station; - Key = key; } } diff --git a/Content.Shared/Access/Components/AccessReaderComponent.cs b/Content.Shared/Access/Components/AccessReaderComponent.cs index 3f6c9e1c052..b1577979223 100644 --- a/Content.Shared/Access/Components/AccessReaderComponent.cs +++ b/Content.Shared/Access/Components/AccessReaderComponent.cs @@ -34,7 +34,7 @@ public sealed partial class AccessReaderComponent : Component public List> AccessLists = new(); /// - /// A list of s that grant access. Only a single matching key is required tp gaim + /// A list of s that grant access. Only a single matching key is required to gain /// access. /// [DataField] diff --git a/Content.Shared/CriminalRecords/CriminalRecord.cs b/Content.Shared/CriminalRecords/CriminalRecord.cs new file mode 100644 index 00000000000..0fe23d43954 --- /dev/null +++ b/Content.Shared/CriminalRecords/CriminalRecord.cs @@ -0,0 +1,38 @@ +using Content.Shared.Security; +using Robust.Shared.Serialization; + +namespace Content.Shared.CriminalRecords; + +/// +/// Criminal record for a crewmember. +/// Can be viewed and edited in a criminal records console by security. +/// +[Serializable, NetSerializable, DataRecord] +public sealed record CriminalRecord +{ + /// + /// Status of the person (None, Wanted, Detained). + /// + [DataField] + public SecurityStatus Status = SecurityStatus.None; + + /// + /// When Status is Wanted, the reason for it. + /// Should never be set otherwise. + /// + [DataField] + public string? Reason; + + /// + /// Criminal history of the person. + /// This should have charges and time served added after someone is detained. + /// + [DataField] + public List History = new(); +} + +/// +/// A line of criminal activity and the time it was added at. +/// +[Serializable, NetSerializable] +public record struct CrimeHistory(TimeSpan AddTime, string Crime); diff --git a/Content.Shared/CriminalRecords/CriminalRecordsUi.cs b/Content.Shared/CriminalRecords/CriminalRecordsUi.cs new file mode 100644 index 00000000000..287de36ac73 --- /dev/null +++ b/Content.Shared/CriminalRecords/CriminalRecordsUi.cs @@ -0,0 +1,102 @@ +using Content.Shared.Security; +using Content.Shared.StationRecords; +using Robust.Shared.Serialization; + +namespace Content.Shared.CriminalRecords; + +[Serializable, NetSerializable] +public enum CriminalRecordsConsoleKey : byte +{ + Key +} + +/// +/// Criminal records console state. There are a few states: +/// - SelectedKey null, Record null, RecordListing null +/// - The station record database could not be accessed. +/// - SelectedKey null, Record null, RecordListing non-null +/// - Records are populated in the database, or at least the station has +/// the correct component. +/// - SelectedKey non-null, Record null, RecordListing non-null +/// - The selected key does not have a record tied to it. +/// - SelectedKey non-null, Record non-null, RecordListing non-null +/// - The selected key has a record tied to it, and the record has been sent. +/// +/// - there is added new filters and so added new states +/// -SelectedKey null, Record null, RecordListing null, filters non-null +/// the station may have data, but they all did not pass through the filters +/// +/// Other states are erroneous. +/// +[Serializable, NetSerializable] +public sealed class CriminalRecordsConsoleState : BoundUserInterfaceState +{ + /// + /// Currently selected crewmember record key. + /// + public uint? SelectedKey = null; + + public CriminalRecord? CriminalRecord = null; + public GeneralStationRecord? StationRecord = null; + public readonly Dictionary? RecordListing; + public readonly StationRecordsFilter? Filter; + + public CriminalRecordsConsoleState(Dictionary? recordListing, StationRecordsFilter? newFilter) + { + RecordListing = recordListing; + Filter = newFilter; + } + + /// + /// Default state for opening the console + /// + public CriminalRecordsConsoleState() : this(null, null) + { + } + + public bool IsEmpty() => SelectedKey == null && StationRecord == null && CriminalRecord == null && RecordListing == null; +} + +/// +/// Used to change status, respecting the wanted/reason nullability rules in . +/// +[Serializable, NetSerializable] +public sealed class CriminalRecordChangeStatus : BoundUserInterfaceMessage +{ + public readonly SecurityStatus Status; + public readonly string? Reason; + + public CriminalRecordChangeStatus(SecurityStatus status, string? reason) + { + Status = status; + Reason = reason; + } +} + +/// +/// Used to add a single line to the record's crime history. +/// +[Serializable, NetSerializable] +public sealed class CriminalRecordAddHistory : BoundUserInterfaceMessage +{ + public readonly string Line; + + public CriminalRecordAddHistory(string line) + { + Line = line; + } +} + +/// +/// Used to delete a single line from the crime history, by index. +/// +[Serializable, NetSerializable] +public sealed class CriminalRecordDeleteHistory : BoundUserInterfaceMessage +{ + public readonly uint Index; + + public CriminalRecordDeleteHistory(uint index) + { + Index = index; + } +} diff --git a/Content.Shared/Security/SecurityStatus.cs b/Content.Shared/Security/SecurityStatus.cs new file mode 100644 index 00000000000..95250a86459 --- /dev/null +++ b/Content.Shared/Security/SecurityStatus.cs @@ -0,0 +1,15 @@ +namespace Content.Shared.Security; + +/// +/// Status used in Criminal Records. +/// +/// None - the default value +/// Wanted - the person is being wanted by security +/// Detained - the person is detained by security +/// +public enum SecurityStatus : byte +{ + None, + Wanted, + Detained +} diff --git a/Content.Shared/StationRecords/SharedGeneralStationRecordConsoleSystem.cs b/Content.Shared/StationRecords/GeneralRecordsUi.cs similarity index 65% rename from Content.Shared/StationRecords/SharedGeneralStationRecordConsoleSystem.cs rename to Content.Shared/StationRecords/GeneralRecordsUi.cs index 27288a7a1f9..860454efde5 100644 --- a/Content.Shared/StationRecords/SharedGeneralStationRecordConsoleSystem.cs +++ b/Content.Shared/StationRecords/GeneralRecordsUi.cs @@ -30,14 +30,16 @@ public enum GeneralStationRecordConsoleKey : byte public sealed class GeneralStationRecordConsoleState : BoundUserInterfaceState { /// - /// Current selected key. + /// Current selected key. + /// Station is always the station that owns the console. /// - public (NetEntity, uint)? SelectedKey { get; } - public GeneralStationRecord? Record { get; } - public Dictionary<(NetEntity, uint), string>? RecordListing { get; } - public GeneralStationRecordsFilter? Filter { get; } - public GeneralStationRecordConsoleState((NetEntity, uint)? key, GeneralStationRecord? record, - Dictionary<(NetEntity, uint), string>? recordListing, GeneralStationRecordsFilter? newFilter) + public readonly uint? SelectedKey; + public readonly GeneralStationRecord? Record; + public readonly Dictionary? RecordListing; + public readonly StationRecordsFilter? Filter; + + public GeneralStationRecordConsoleState(uint? key, GeneralStationRecord? record, + Dictionary? recordListing, StationRecordsFilter? newFilter) { SelectedKey = key; Record = record; @@ -45,16 +47,24 @@ public GeneralStationRecordConsoleState((NetEntity, uint)? key, GeneralStationRe Filter = newFilter; } + public GeneralStationRecordConsoleState() : this(null, null, null, null) + { + } + public bool IsEmpty() => SelectedKey == null && Record == null && RecordListing == null; } +/// +/// Select a specific crewmember's record, or deselect. +/// Used by any kind of records console including general and criminal. +/// [Serializable, NetSerializable] -public sealed class SelectGeneralStationRecord : BoundUserInterfaceMessage +public sealed class SelectStationRecord : BoundUserInterfaceMessage { - public (NetEntity, uint)? SelectedKey { get; } + public readonly uint? SelectedKey; - public SelectGeneralStationRecord((NetEntity, uint)? selectedKey) + public SelectStationRecord(uint? selectedKey) { SelectedKey = selectedKey; } diff --git a/Content.Shared/StationRecords/GeneralStationRecord.cs b/Content.Shared/StationRecords/GeneralStationRecord.cs index de4cda8f251..2ca34a4ffbd 100644 --- a/Content.Shared/StationRecords/GeneralStationRecord.cs +++ b/Content.Shared/StationRecords/GeneralStationRecord.cs @@ -7,46 +7,46 @@ namespace Content.Shared.StationRecords; /// General station record. Indicates the crewmember's name and job. ///
    [Serializable, NetSerializable] -public sealed class GeneralStationRecord +public sealed record GeneralStationRecord { /// /// Name tied to this station record. /// - [ViewVariables] + [DataField] public string Name = string.Empty; /// /// Age of the person that this station record represents. /// - [ViewVariables] + [DataField] public int Age; /// /// Job title tied to this station record. /// - [ViewVariables] + [DataField] public string JobTitle = string.Empty; /// /// Job icon tied to this station record. /// - [ViewVariables] + [DataField] public string JobIcon = string.Empty; - [ViewVariables] + [DataField] public string JobPrototype = string.Empty; /// /// Species tied to this station record. /// - [ViewVariables] + [DataField] public string Species = string.Empty; /// /// Gender identity tied to this station record. /// /// Sex should be placed in a medical record, not a general record. - [ViewVariables] + [DataField] public Gender Gender = Gender.Epicene; /// @@ -54,18 +54,18 @@ public sealed class GeneralStationRecord /// This is taken from the 'weight' of a job prototype, /// usually. /// - [ViewVariables] + [DataField] public int DisplayPriority; /// /// Fingerprint of the person. /// - [ViewVariables] + [DataField] public string? Fingerprint; /// /// DNA of the person. /// - [ViewVariables] + [DataField] public string? DNA; } diff --git a/Content.Shared/StationRecords/GeneralStationRecordsFilter.cs b/Content.Shared/StationRecords/GeneralStationRecordsFilter.cs deleted file mode 100644 index f0322420119..00000000000 --- a/Content.Shared/StationRecords/GeneralStationRecordsFilter.cs +++ /dev/null @@ -1,38 +0,0 @@ -using Robust.Shared.Serialization; - -namespace Content.Shared.StationRecords; - -[Serializable, NetSerializable] -public sealed class GeneralStationRecordsFilter -{ - public GeneralStationRecordFilterType Type { get; set; } - = GeneralStationRecordFilterType.Name; - public string Value { get; set; } = ""; - public GeneralStationRecordsFilter(GeneralStationRecordFilterType filterType, string newValue = "") - { - Type = filterType; - Value = newValue; - } -} - -[Serializable, NetSerializable] -public sealed class GeneralStationRecordsFilterMsg : BoundUserInterfaceMessage -{ - public string Value { get; } - public GeneralStationRecordFilterType Type { get; } - - public GeneralStationRecordsFilterMsg(GeneralStationRecordFilterType filterType, - string filterValue) - { - Type = filterType; - Value = filterValue; - } -} - -[Serializable, NetSerializable] -public enum GeneralStationRecordFilterType : byte -{ - Name, - Prints, - DNA, -} diff --git a/Content.Shared/StationRecords/StationRecordKey.cs b/Content.Shared/StationRecords/StationRecordKey.cs index 937c3aa3ef1..3693c0f57d9 100644 --- a/Content.Shared/StationRecords/StationRecordKey.cs +++ b/Content.Shared/StationRecords/StationRecordKey.cs @@ -1,10 +1,14 @@ namespace Content.Shared.StationRecords; -// Station record keys. These should be stored somewhere, -// preferably within an ID card. +/// +/// Station record keys. These should be stored somewhere, +/// preferably within an ID card. +/// This refers to both the id and station. This is suitable for an access reader field etc, +/// but when you already know the station just store the id itself. +/// public readonly struct StationRecordKey : IEquatable { - [DataField("id")] + [DataField] public readonly uint Id; [DataField("station")] diff --git a/Content.Shared/StationRecords/StationRecordsFilter.cs b/Content.Shared/StationRecords/StationRecordsFilter.cs new file mode 100644 index 00000000000..10b94dda998 --- /dev/null +++ b/Content.Shared/StationRecords/StationRecordsFilter.cs @@ -0,0 +1,44 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.StationRecords; + +[Serializable, NetSerializable] +public sealed class StationRecordsFilter +{ + public StationRecordFilterType Type = StationRecordFilterType.Name; + public string Value = ""; + + public StationRecordsFilter(StationRecordFilterType filterType, string newValue = "") + { + Type = filterType; + Value = newValue; + } +} + +/// +/// Message for updating the filter on any kind of records console. +/// +[Serializable, NetSerializable] +public sealed class SetStationRecordFilter : BoundUserInterfaceMessage +{ + public readonly string Value; + public readonly StationRecordFilterType Type; + + public SetStationRecordFilter(StationRecordFilterType filterType, + string filterValue) + { + Type = filterType; + Value = filterValue; + } +} + +/// +/// Different strings that results can be filtered by. +/// +[Serializable, NetSerializable] +public enum StationRecordFilterType : byte +{ + Name, + Prints, + DNA, +} diff --git a/Resources/Locale/en-US/criminal-records/criminal-records.ftl b/Resources/Locale/en-US/criminal-records/criminal-records.ftl new file mode 100644 index 00000000000..49cd59914ac --- /dev/null +++ b/Resources/Locale/en-US/criminal-records/criminal-records.ftl @@ -0,0 +1,44 @@ +criminal-records-console-window-title = Criminal Records Computer +criminal-records-console-records-list-title = Crewmembers +criminal-records-console-select-record-info = Select a record. +criminal-records-console-no-records = No records found! +criminal-records-console-no-record-found = No record was found for the selected person. + +## Status + +criminal-records-console-status = Status +criminal-records-status-none = None +criminal-records-status-wanted = Wanted +criminal-records-status-detained = Detained + +criminal-records-console-wanted-reason = [color=gray]Wanted Reason[/color] +criminal-records-console-reason = Reason +criminal-records-console-reason-placeholder = For example: {$placeholder} + +## Crime History + +criminal-records-console-crime-history = Crime History +criminal-records-history-placeholder = Write the crime here +criminal-records-no-history = This crewmember's record is spotless. +criminal-records-add-history = Add +criminal-records-delete-history = Delete + +criminal-records-permission-denied = Permission denied + +## Security channel notifications + +criminal-records-console-wanted = {$name} is wanted by {$officer} for: {$reason}. +criminal-records-console-detained = {$name} has been detained by {$officer}. +criminal-records-console-released = {$name} has been released by {$officer}. +criminal-records-console-not-wanted = {$name} is no longer wanted. + +## Filters + +criminal-records-filter-placeholder = Input text and press "Enter" +criminal-records-name-filter = Name +criminal-records-prints-filter = Fingerprints +criminal-records-dna-filter = DNA + +## Arrest auto history lines +criminal-records-console-auto-history = ARRESTED: {$reason} +criminal-records-console-unspecified-reason = diff --git a/Resources/Locale/en-US/guidebook/guides.ftl b/Resources/Locale/en-US/guidebook/guides.ftl index 405d65630f5..c98f24ab70c 100644 --- a/Resources/Locale/en-US/guidebook/guides.ftl +++ b/Resources/Locale/en-US/guidebook/guides.ftl @@ -48,6 +48,7 @@ guide-entry-cyborgs = Cyborgs guide-entry-security = Security guide-entry-forensics = Forensics guide-entry-defusal = Large Bomb Defusal +guide-entry-criminal-records = Criminal Records guide-entry-antagonists = Antagonists guide-entry-nuclear-operatives = Nuclear Operatives diff --git a/Resources/Locale/en-US/station-records/general-station-records.ftl b/Resources/Locale/en-US/station-records/general-station-records.ftl index 89775a449e2..3ee1f834fb3 100644 --- a/Resources/Locale/en-US/station-records/general-station-records.ftl +++ b/Resources/Locale/en-US/station-records/general-station-records.ftl @@ -1,4 +1,4 @@ -general-station-record-console-window-title = Station Records Computer +general-station-record-console-window-title = Station Records Computer general-station-record-console-select-record-info = Select a record on the left. general-station-record-console-empty-state = No records found! general-station-record-console-no-record-found = No record was found for the selected person. @@ -11,8 +11,5 @@ general-station-record-console-record-fingerprint = Fingerprint: {$fingerprint} general-station-record-console-record-dna = DNA: {$dna} general-station-record-for-filter-line-placeholder = Input text and press "Enter" -general-station-record-name-filter = Name of person -general-station-record-prints-filter = Fingerprints -general-station-record-dna-filter = DNA general-station-record-console-search-records = Search -general-station-record-console-reset-filters = Reset \ No newline at end of file +general-station-record-console-reset-filters = Reset diff --git a/Resources/Prototypes/Datasets/criminal_records.yml b/Resources/Prototypes/Datasets/criminal_records.yml new file mode 100644 index 00000000000..ee283091843 --- /dev/null +++ b/Resources/Prototypes/Datasets/criminal_records.yml @@ -0,0 +1,18 @@ +# "funny" placeholders of extremely minor/non-crimes for wanted reason dialog +- type: dataset + id: CriminalRecordsWantedReasonPlaceholders + values: + - Ate their own shoes + - Being a clown + - Being a mime + - Breathed the wrong way + - Broke into evac + - Did literally nothing + - Didn't say hello to me + - Drank one too many + - Lied on common radio + - Looked at me funny + - Slipped the HoS + - Stole the clown's mask + - Told an unfunny joke + - Wore a gasmask diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml index 31730efb504..5927602b4d7 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml @@ -285,8 +285,15 @@ parent: BaseComputer id: ComputerCriminalRecords name: criminal records computer - description: This can be used to check criminal records. + description: This can be used to check criminal records. Only security can modify them. components: + - type: CriminalRecordsConsole + - type: UserInterface + interfaces: + - key: enum.CriminalRecordsConsoleKey.Key + type: CriminalRecordsConsoleBoundUserInterface + - type: ActivatableUI + key: enum.CriminalRecordsConsoleKey.Key - type: Sprite layers: - map: ["computerLayerBody"] @@ -303,6 +310,11 @@ color: "#1f8c28" - type: Computer board: CriminalRecordsComputerCircuitboard + - type: AccessReader + access: [["Security"]] + - type: GuideHelp + guides: + - CriminalRecords - type: entity parent: BaseComputer diff --git a/Resources/Prototypes/Guidebook/security.yml b/Resources/Prototypes/Guidebook/security.yml index 8e734b4d137..f5e34708283 100644 --- a/Resources/Prototypes/Guidebook/security.yml +++ b/Resources/Prototypes/Guidebook/security.yml @@ -3,8 +3,9 @@ name: guide-entry-security text: "/ServerInfo/Guidebook/Security/Security.xml" children: - - Forensics - - Defusal + - Forensics + - Defusal + - CriminalRecords - type: guideEntry id: Forensics @@ -15,3 +16,8 @@ id: Defusal name: guide-entry-defusal text: "/ServerInfo/Guidebook/Security/Defusal.xml" + +- type: guideEntry + id: CriminalRecords + name: guide-entry-criminal-records + text: "/ServerInfo/Guidebook/Security/CriminalRecords.xml" diff --git a/Resources/ServerInfo/Guidebook/Security/CriminalRecords.xml b/Resources/ServerInfo/Guidebook/Security/CriminalRecords.xml new file mode 100644 index 00000000000..c7b7ad2098d --- /dev/null +++ b/Resources/ServerInfo/Guidebook/Security/CriminalRecords.xml @@ -0,0 +1,39 @@ + + # Criminal Records + The criminal records console is accessible in every station's security department, it serves the purpose of tracking and managing the criminal history and status of anybody part of the crew manifest. + + + + + + Anyone can open the console's UI, but only those with Security access can modify anything. + + The UI is composed by the following elements: + - A search bar that has a filter next to it that lets you filter the crewmembers by their names, fingerprints or DNA. + + - A list of all the crewmembers in the manifest, selecting one of the entries will make the criminal records of a crewmember appear. The list is filtered by the search bar so make sure it's empty if you want an overall overview! + + - The criminal records themselves + + In the record section you can: + - See security-related information about a crewmember like their name, fingerprints and DNA. + + - Change the security status between [color=gray]None[/color], [color=yellow]Wanted[/color] and [color=red]Detained[/color]. When setting it to Wanted you will be asked to write a reason. + + - If they are wanted, you can see the reason given below the status dropdown. + + - Once someone has been arrested, update their status on the console so everyone knows they no longer need to be captured. + + - After they've done their time, release them and update their status to None so nobody thinks they are an escaped convict. + + - Open the Crime History window to check or modify it. + + The Crime History window lists someone's crimes and can be modified in multiple ways: + - Automatically, just by setting someone's status to arrested. The reason will be added to "ARRESTED:" so it's easy to see the automated entries. + + - Adding a new line by clicking "Add" and writing something in the input box. When adding a record, remember to mention their crime and sentence, the console will automatically insert the shift's time so you don't need to! + + - Select a line of unwanted history and click "Delete" to remove it. Excellent for keeping records clean from the clown's stolen ID antics. + + Now you can be the desk jockey you've always wanted to be. + From f3107f7eb675776128801ce9c4ae141bb0e25c78 Mon Sep 17 00:00:00 2001 From: AJCM-git <60196617+AJCM-git@users.noreply.github.com> Date: Sun, 4 Feb 2024 20:12:07 -0400 Subject: [PATCH 227/266] Fixes bug with criminal records (#24954) (cherry picked from commit a8c9af1227714aa33efeebb88aa3c9b38067d834) --- .../Systems/CriminalRecordsConsoleSystem.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Content.Server/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs b/Content.Server/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs index 67ac1bf13c5..f0a4f96152a 100644 --- a/Content.Server/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs +++ b/Content.Server/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs @@ -104,6 +104,12 @@ private void OnChangeStatus(Entity ent, ref Cri if (_idCard.TryFindIdCard(mob.Value, out var id) && id.Comp.FullName is {} fullName) officer = fullName; + (string, object)[] args; + if (reason != null) + args = new (string, object)[] { ("name", name), ("officer", officer), ("reason", reason) }; + else + args = new (string, object)[] { ("name", name), ("officer", officer) }; + // figure out which radio message to send depending on transition var statusString = (oldStatus, msg.Status) switch { @@ -118,9 +124,7 @@ private void OnChangeStatus(Entity ent, ref Cri // this is impossible _ => "not-wanted" }; - var message = Loc.GetString($"criminal-records-console-{statusString}", ("name", name), ("officer", officer), - reason != null ? ("reason", reason) : default!); - _radio.SendRadioMessage(ent, message, ent.Comp.SecurityChannel, ent); + _radio.SendRadioMessage(ent, Loc.GetString($"criminal-records-console-{statusString}", args), ent.Comp.SecurityChannel, ent); UpdateUserInterface(ent); } From 6bcd38e6c39e4dc9f4258cf67da794515d0d0af3 Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Mon, 5 Feb 2024 02:39:58 +0000 Subject: [PATCH 228/266] criminal records cl (#24953) (cherry picked from commit 1ed86128ecbcdf809ed2602b1a242e8418a9df86) --- Resources/Changelog/Parts/parts_22510.yaml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 Resources/Changelog/Parts/parts_22510.yaml diff --git a/Resources/Changelog/Parts/parts_22510.yaml b/Resources/Changelog/Parts/parts_22510.yaml new file mode 100644 index 00000000000..84133098a6d --- /dev/null +++ b/Resources/Changelog/Parts/parts_22510.yaml @@ -0,0 +1,4 @@ +author: ficcialfaint and deltanedas +changes: +- type: Add + message: Criminal records and the console that manages them have been added to the game. They also have a guidebook entry. From 452347902dc7f4bc31b98d28fbcdf50db6d34f71 Mon Sep 17 00:00:00 2001 From: keronshb <54602815+keronshb@users.noreply.github.com> Date: Sun, 4 Feb 2024 22:02:46 -0500 Subject: [PATCH 229/266] Store Action Upgrade Fix (#24959) (cherry picked from commit e79d2b5561692f34c3ee88c0d2a5707982227af2) --- Content.Server/Store/Systems/StoreSystem.Refund.cs | 4 +--- Content.Shared/Store/ListingPrototype.cs | 1 - 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/Content.Server/Store/Systems/StoreSystem.Refund.cs b/Content.Server/Store/Systems/StoreSystem.Refund.cs index c42c79475e3..d59ee75e3ea 100644 --- a/Content.Server/Store/Systems/StoreSystem.Refund.cs +++ b/Content.Server/Store/Systems/StoreSystem.Refund.cs @@ -1,6 +1,4 @@ -using Content.Server.Actions; -using Content.Server.Store.Components; -using Content.Shared.Actions; +using Content.Server.Store.Components; using Robust.Shared.Containers; namespace Content.Server.Store.Systems; diff --git a/Content.Shared/Store/ListingPrototype.cs b/Content.Shared/Store/ListingPrototype.cs index 5dccc253373..61721f2fb44 100644 --- a/Content.Shared/Store/ListingPrototype.cs +++ b/Content.Shared/Store/ListingPrototype.cs @@ -163,7 +163,6 @@ public object Clone() ProductEntity = ProductEntity, ProductAction = ProductAction, ProductUpgradeID = ProductUpgradeID, - ProductActionEntity = ProductActionEntity, ProductEvent = ProductEvent, PurchaseAmount = PurchaseAmount, RestockTime = RestockTime, From 7b87d398ab6329788818a4ecec6e8a3563045e5a Mon Sep 17 00:00:00 2001 From: keronshb <54602815+keronshb@users.noreply.github.com> Date: Sun, 4 Feb 2024 23:56:59 -0500 Subject: [PATCH 230/266] Actually fix store action upgrades (#24960) actual fix this time (cherry picked from commit b88a8f0bb2a4e1c9dca39bf0778aa3c6c947702f) --- Content.Shared/Store/ListingPrototype.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/Store/ListingPrototype.cs b/Content.Shared/Store/ListingPrototype.cs index 61721f2fb44..2f067afbeeb 100644 --- a/Content.Shared/Store/ListingPrototype.cs +++ b/Content.Shared/Store/ListingPrototype.cs @@ -120,7 +120,6 @@ public bool Equals(ListingData? listing) Description != listing.Description || ProductEntity != listing.ProductEntity || ProductAction != listing.ProductAction || - ProductActionEntity != listing.ProductActionEntity || ProductEvent != listing.ProductEvent || RestockTime != listing.RestockTime) return false; @@ -163,6 +162,7 @@ public object Clone() ProductEntity = ProductEntity, ProductAction = ProductAction, ProductUpgradeID = ProductUpgradeID, + ProductActionEntity = ProductActionEntity, ProductEvent = ProductEvent, PurchaseAmount = PurchaseAmount, RestockTime = RestockTime, From ab73fe386da407cbb53db82079207080ee3cbacf Mon Sep 17 00:00:00 2001 From: EdenTheLiznerd <138748328+EdenTheLiznerd@users.noreply.github.com> Date: Mon, 5 Feb 2024 05:24:51 -0700 Subject: [PATCH 231/266] Sectech Advert Change (#24965) The Duality of Skull Cracking!!! Fixes a IC standpoint of what the sectech should be threatening to beat, go crack syndicate skulls not non-existent communist skulls silly (cherry picked from commit 30fd0c89e1b49ef0017c886dc5bdb09dcffb9320) --- Resources/Locale/en-US/advertisements/vending/sectech.ftl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Locale/en-US/advertisements/vending/sectech.ftl b/Resources/Locale/en-US/advertisements/vending/sectech.ftl index 1edaa980cdd..8f028971429 100644 --- a/Resources/Locale/en-US/advertisements/vending/sectech.ftl +++ b/Resources/Locale/en-US/advertisements/vending/sectech.ftl @@ -1,4 +1,4 @@ -advertisement-sectech-1 = Crack communist skulls! +advertisement-sectech-1 = Crack syndicate skulls! advertisement-sectech-2 = Beat some heads in! advertisement-sectech-3 = Don't forget - harm is good! advertisement-sectech-4 = Your weapons are right here. From 31b93e02a83fcd298344a6fe02498da30c6200a6 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 5 Feb 2024 12:25:58 +0000 Subject: [PATCH 232/266] Automatic changelog update (cherry picked from commit 9deaf675216e72561da0d0b021351ebd16276fff) --- Resources/Changelog/Changelog.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 91ae5225c4f..ce745f1fa54 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: mirrorcult - changes: - - message: Everyone can toggle fire alarms now, not just atmos - type: Tweak - id: 5390 - time: '2023-12-16T08:24:00.0000000+00:00' - author: EmoGarbage404 changes: - message: A variety of chemicals can now be decomposed via electrolysis or centrifugal @@ -3879,3 +3873,11 @@ id: 5889 time: '2024-02-04T23:01:49.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24944 +- author: EdenTheLiznerd + changes: + - message: Sectech no longer says "Let's crack communist skulls!" It now says "Let's + crack syndicate skulls!" + type: Tweak + id: 5890 + time: '2024-02-05T12:24:52.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24965 From b45675731df3a082671df653b94d58bd48331336 Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Mon, 5 Feb 2024 12:55:39 +0000 Subject: [PATCH 233/266] move criminal records console component to shared (#24957) * move criminal records console component to shared * todone --------- Co-authored-by: deltanedas <@deltanedas:kde.org> (cherry picked from commit 9b1c88b78b4d27d7a762ebd80dc4294e9cf6332f) --- Content.Client/CriminalRecords/CrimeHistoryWindow.xaml.cs | 8 +++++--- .../CriminalRecordsConsoleBoundUserInterface.cs | 7 +++++-- .../CriminalRecords/CriminalRecordsConsoleWindow.xaml.cs | 7 ++++--- .../Systems/CriminalRecordsConsoleSystem.cs | 7 +++++++ .../Systems/CriminalRecordsConsoleSystem.cs | 8 ++++++-- .../Components/CriminalRecordsConsoleComponent.cs | 6 +++--- .../Systems/SharedCriminalRecordsConsoleSystem.cs | 8 ++++++++ 7 files changed, 38 insertions(+), 13 deletions(-) create mode 100644 Content.Client/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs rename {Content.Server => Content.Shared}/CriminalRecords/Components/CriminalRecordsConsoleComponent.cs (90%) create mode 100644 Content.Shared/CriminalRecords/Systems/SharedCriminalRecordsConsoleSystem.cs diff --git a/Content.Client/CriminalRecords/CrimeHistoryWindow.xaml.cs b/Content.Client/CriminalRecords/CrimeHistoryWindow.xaml.cs index bccf501d9c5..1c6e83a359f 100644 --- a/Content.Client/CriminalRecords/CrimeHistoryWindow.xaml.cs +++ b/Content.Client/CriminalRecords/CrimeHistoryWindow.xaml.cs @@ -15,13 +15,16 @@ public sealed partial class CrimeHistoryWindow : FancyWindow public Action? OnAddHistory; public Action? OnDeleteHistory; + private uint _maxLength; private uint? _index; private DialogWindow? _dialog; - public CrimeHistoryWindow() + public CrimeHistoryWindow(uint maxLength) { RobustXamlLoader.Load(this); + _maxLength = maxLength; + OnClose += () => { _dialog?.Close(); @@ -47,8 +50,7 @@ public CrimeHistoryWindow() _dialog.OnConfirmed += responses => { var line = responses[field]; - // TODO: whenever the console is moved to shared unhardcode this - if (line.Length < 1 || line.Length > 256) + if (line.Length < 1 || line.Length > _maxLength) return; OnAddHistory?.Invoke(line); diff --git a/Content.Client/CriminalRecords/CriminalRecordsConsoleBoundUserInterface.cs b/Content.Client/CriminalRecords/CriminalRecordsConsoleBoundUserInterface.cs index f6c9080a2db..88b9c90c2ff 100644 --- a/Content.Client/CriminalRecords/CriminalRecordsConsoleBoundUserInterface.cs +++ b/Content.Client/CriminalRecords/CriminalRecordsConsoleBoundUserInterface.cs @@ -1,5 +1,6 @@ using Content.Shared.Access.Systems; using Content.Shared.CriminalRecords; +using Content.Shared.CriminalRecords.Components; using Content.Shared.Security; using Content.Shared.StationRecords; using Robust.Client.Player; @@ -27,7 +28,9 @@ protected override void Open() { base.Open(); - _window = new(Owner, _playerManager, _proto, _random, _accessReader); + var comp = EntMan.GetComponent(Owner); + + _window = new(Owner, comp.MaxStringLength, _playerManager, _proto, _random, _accessReader); _window.OnKeySelected += key => SendMessage(new SelectStationRecord(key)); _window.OnFiltersChanged += (type, filterValue) => @@ -40,7 +43,7 @@ protected override void Open() _window.OnHistoryClosed += () => _historyWindow?.Close(); _window.OnClose += Close; - _historyWindow = new(); + _historyWindow = new(comp.MaxStringLength); _historyWindow.OnAddHistory += line => SendMessage(new CriminalRecordAddHistory(line)); _historyWindow.OnDeleteHistory += index => SendMessage(new CriminalRecordDeleteHistory(index)); diff --git a/Content.Client/CriminalRecords/CriminalRecordsConsoleWindow.xaml.cs b/Content.Client/CriminalRecords/CriminalRecordsConsoleWindow.xaml.cs index f5c631ea0bc..61b5c383315 100644 --- a/Content.Client/CriminalRecords/CriminalRecordsConsoleWindow.xaml.cs +++ b/Content.Client/CriminalRecords/CriminalRecordsConsoleWindow.xaml.cs @@ -35,6 +35,7 @@ public sealed partial class CriminalRecordsConsoleWindow : FancyWindow public Action? OnHistoryClosed; public Action? OnDialogConfirmed; + private uint _maxLength; private bool _isPopulating; private bool _access; private uint? _selectedKey; @@ -44,7 +45,7 @@ public sealed partial class CriminalRecordsConsoleWindow : FancyWindow private StationRecordFilterType _currentFilterType; - public CriminalRecordsConsoleWindow(EntityUid console, IPlayerManager playerManager, IPrototypeManager prototypeManager, IRobustRandom robustRandom, AccessReaderSystem accessReader) + public CriminalRecordsConsoleWindow(EntityUid console, uint maxLength, IPlayerManager playerManager, IPrototypeManager prototypeManager, IRobustRandom robustRandom, AccessReaderSystem accessReader) { RobustXamlLoader.Load(this); @@ -54,6 +55,7 @@ public CriminalRecordsConsoleWindow(EntityUid console, IPlayerManager playerMana _random = robustRandom; _accessReader = accessReader; + _maxLength = maxLength; _currentFilterType = StationRecordFilterType.Name; OpenCentered(); @@ -246,8 +248,7 @@ private void GetWantedReason() _reasonDialog.OnConfirmed += responses => { var reason = responses[field]; - // TODO: same as history unhardcode - if (reason.Length < 1 || reason.Length > 256) + if (reason.Length < 1 || reason.Length > _maxLength) return; OnDialogConfirmed?.Invoke(SecurityStatus.Wanted, reason); diff --git a/Content.Client/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs b/Content.Client/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs new file mode 100644 index 00000000000..2a34376f6a6 --- /dev/null +++ b/Content.Client/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs @@ -0,0 +1,7 @@ +using Content.Shared.CriminalRecords.Systems; + +namespace Content.Client.CriminalRecords.Systems; + +public sealed class CriminalRecordsConsoleSystem : SharedCriminalRecordsConsoleSystem +{ +} diff --git a/Content.Server/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs b/Content.Server/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs index f0a4f96152a..84f8ffc2e50 100644 --- a/Content.Server/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs +++ b/Content.Server/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs @@ -1,4 +1,3 @@ -using Content.Server.CriminalRecords.Components; using Content.Server.Popups; using Content.Server.Radio.EntitySystems; using Content.Server.Station.Systems; @@ -6,6 +5,8 @@ using Content.Server.StationRecords.Systems; using Content.Shared.Access.Systems; using Content.Shared.CriminalRecords; +using Content.Shared.CriminalRecords.Components; +using Content.Shared.CriminalRecords.Systems; using Content.Shared.Security; using Content.Shared.StationRecords; using Robust.Server.GameObjects; @@ -14,7 +15,10 @@ namespace Content.Server.CriminalRecords.Systems; -public sealed class CriminalRecordsConsoleSystem : EntitySystem +/// +/// Handles all UI for criminal records console +/// +public sealed class CriminalRecordsConsoleSystem : SharedCriminalRecordsConsoleSystem { [Dependency] private readonly AccessReaderSystem _access = default!; [Dependency] private readonly CriminalRecordsSystem _criminalRecords = default!; diff --git a/Content.Server/CriminalRecords/Components/CriminalRecordsConsoleComponent.cs b/Content.Shared/CriminalRecords/Components/CriminalRecordsConsoleComponent.cs similarity index 90% rename from Content.Server/CriminalRecords/Components/CriminalRecordsConsoleComponent.cs rename to Content.Shared/CriminalRecords/Components/CriminalRecordsConsoleComponent.cs index de9ada8f8c7..70e927e3cb8 100644 --- a/Content.Server/CriminalRecords/Components/CriminalRecordsConsoleComponent.cs +++ b/Content.Shared/CriminalRecords/Components/CriminalRecordsConsoleComponent.cs @@ -1,15 +1,15 @@ -using Content.Server.CriminalRecords.Systems; +using Content.Shared.CriminalRecords.Systems; using Content.Shared.Radio; using Content.Shared.StationRecords; using Robust.Shared.Prototypes; -namespace Content.Server.CriminalRecords.Components; +namespace Content.Shared.CriminalRecords.Components; /// /// A component for Criminal Record Console storing an active station record key and a currently applied filter /// [RegisterComponent] -[Access(typeof(CriminalRecordsConsoleSystem))] +[Access(typeof(SharedCriminalRecordsConsoleSystem))] public sealed partial class CriminalRecordsConsoleComponent : Component { /// diff --git a/Content.Shared/CriminalRecords/Systems/SharedCriminalRecordsConsoleSystem.cs b/Content.Shared/CriminalRecords/Systems/SharedCriminalRecordsConsoleSystem.cs new file mode 100644 index 00000000000..f9fc67c8964 --- /dev/null +++ b/Content.Shared/CriminalRecords/Systems/SharedCriminalRecordsConsoleSystem.cs @@ -0,0 +1,8 @@ +namespace Content.Shared.CriminalRecords.Systems; + +/// +/// Nothing is predicted just exists for access. +/// +public abstract class SharedCriminalRecordsConsoleSystem : EntitySystem +{ +} From 7863210fdff7fb5c903eb1c784d7438a4b04d7d2 Mon Sep 17 00:00:00 2001 From: Kot <1192090+koteq@users.noreply.github.com> Date: Mon, 5 Feb 2024 17:51:45 +0400 Subject: [PATCH 234/266] Update log probe UI for better looking (#24966) (cherry picked from commit 2ba1bd22dc992df2e63de056c1ce99c6f8b0fa0f) --- .../CartridgeLoader/Cartridges/LogProbeUiEntry.xaml | 10 +++++----- .../CartridgeLoader/Cartridges/LogProbeUiFragment.xaml | 8 ++++---- Resources/Locale/en-US/cartridge-loader/cartridges.ftl | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Content.Client/CartridgeLoader/Cartridges/LogProbeUiEntry.xaml b/Content.Client/CartridgeLoader/Cartridges/LogProbeUiEntry.xaml index 5712b301c38..598acf36e7a 100644 --- a/Content.Client/CartridgeLoader/Cartridges/LogProbeUiEntry.xaml +++ b/Content.Client/CartridgeLoader/Cartridges/LogProbeUiEntry.xaml @@ -4,16 +4,16 @@ Orientation="Vertical"> diff --git a/Content.Client/CartridgeLoader/Cartridges/LogProbeUiFragment.xaml b/Content.Client/CartridgeLoader/Cartridges/LogProbeUiFragment.xaml index d369a33c6ce..d12fb55cdce 100644 --- a/Content.Client/CartridgeLoader/Cartridges/LogProbeUiFragment.xaml +++ b/Content.Client/CartridgeLoader/Cartridges/LogProbeUiFragment.xaml @@ -9,10 +9,10 @@ BorderColor="#5a5a5a" BorderThickness="0 0 0 1"/> - - - \ No newline at end of file + diff --git a/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs b/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs index 588eb88502e..2f19cd0a050 100644 --- a/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs +++ b/Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs @@ -1,5 +1,6 @@ using System.Linq; using System.Numerics; +using Content.Client.UserInterface.Controls; using Content.Shared.Damage; using Content.Shared.Damage.Prototypes; using Content.Shared.FixedPoint; @@ -7,7 +8,6 @@ using Content.Shared.MedicalScanner; using Content.Shared.Nutrition.Components; using Robust.Client.AutoGenerated; -using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.XAML; using Robust.Client.GameObjects; using Robust.Client.Graphics; @@ -20,7 +20,7 @@ namespace Content.Client.HealthAnalyzer.UI { [GenerateTypedNameReferences] - public sealed partial class HealthAnalyzerWindow : DefaultWindow + public sealed partial class HealthAnalyzerWindow : FancyWindow { private readonly IEntityManager _entityManager; private readonly SpriteSystem _spriteSystem; @@ -62,6 +62,17 @@ public void Populate(HealthAnalyzerScannedUserMessage msg) entityName = Identity.Name(target.Value, _entityManager); } + if (msg.ScanMode.HasValue) + { + ScanModePanel.Visible = true; + ScanModeText.Text = Loc.GetString(msg.ScanMode.Value ? "health-analyzer-window-scan-mode-active" : "health-analyzer-window-scan-mode-inactive"); + ScanModeText.FontColorOverride = msg.ScanMode.Value ? Color.Green : Color.Red; + } + else + { + ScanModePanel.Visible = false; + } + PatientName.Text = Loc.GetString( "health-analyzer-window-entity-health-text", ("entityName", entityName) diff --git a/Content.Server/Medical/Components/HealthAnalyzerComponent.cs b/Content.Server/Medical/Components/HealthAnalyzerComponent.cs index 39b1df573f2..0002f275c5b 100644 --- a/Content.Server/Medical/Components/HealthAnalyzerComponent.cs +++ b/Content.Server/Medical/Components/HealthAnalyzerComponent.cs @@ -1,32 +1,54 @@ -using Content.Server.UserInterface; -using Content.Shared.MedicalScanner; -using Robust.Server.GameObjects; using Robust.Shared.Audio; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; -namespace Content.Server.Medical.Components +namespace Content.Server.Medical.Components; + +/// +/// After scanning, retrieves the target Uid to use with its related UI. +/// +[RegisterComponent] +[Access(typeof(HealthAnalyzerSystem))] +public sealed partial class HealthAnalyzerComponent : Component { /// - /// After scanning, retrieves the target Uid to use with its related UI. + /// When should the next update be sent for the patient + /// + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] + public TimeSpan NextUpdate = TimeSpan.Zero; + + /// + /// The delay between patient health updates + /// + [DataField] + public TimeSpan UpdateInterval = TimeSpan.FromSeconds(1); + + /// + /// How long it takes to scan someone. + /// + [DataField] + public TimeSpan ScanDelay = TimeSpan.FromSeconds(0.8); + + /// + /// Which entity has been scanned, for continuous updates + /// + [DataField] + public EntityUid? ScannedEntity; + + /// + /// The maximum range in tiles at which the analyzer can receive continuous updates + /// + [DataField] + public float MaxScanRange = 2.5f; + + /// + /// Sound played on scanning begin + /// + [DataField] + public SoundSpecifier? ScanningBeginSound; + + /// + /// Sound played on scanning end /// - [RegisterComponent] - public sealed partial class HealthAnalyzerComponent : Component - { - /// - /// How long it takes to scan someone. - /// - [DataField("scanDelay")] - public float ScanDelay = 0.8f; - - /// - /// Sound played on scanning begin - /// - [DataField("scanningBeginSound")] - public SoundSpecifier? ScanningBeginSound; - - /// - /// Sound played on scanning end - /// - [DataField("scanningEndSound")] - public SoundSpecifier? ScanningEndSound; - } + [DataField] + public SoundSpecifier? ScanningEndSound; } diff --git a/Content.Server/Medical/CryoPodSystem.cs b/Content.Server/Medical/CryoPodSystem.cs index 2f08dfddd17..25a47933a84 100644 --- a/Content.Server/Medical/CryoPodSystem.cs +++ b/Content.Server/Medical/CryoPodSystem.cs @@ -195,7 +195,8 @@ private void OnActivateUI(Entity entity, ref AfterActivatableU (bloodstream != null && _solutionContainerSystem.ResolveSolution(entity.Comp.BodyContainer.ContainedEntity.Value, bloodstream.BloodSolutionName, ref bloodstream.BloodSolution, out var bloodSolution)) ? bloodSolution.FillFraction - : 0 + : 0, + null )); } diff --git a/Content.Server/Medical/HealthAnalyzerSystem.cs b/Content.Server/Medical/HealthAnalyzerSystem.cs index d9559a96264..5c7d265e615 100644 --- a/Content.Server/Medical/HealthAnalyzerSystem.cs +++ b/Content.Server/Medical/HealthAnalyzerSystem.cs @@ -6,94 +6,195 @@ using Content.Shared.Damage; using Content.Shared.DoAfter; using Content.Shared.Interaction; +using Content.Shared.Interaction.Events; using Content.Shared.MedicalScanner; using Content.Shared.Mobs.Components; +using Content.Shared.PowerCell; using Robust.Server.GameObjects; using Robust.Shared.Audio.Systems; +using Robust.Shared.Containers; using Robust.Shared.Player; +using Robust.Shared.Timing; -namespace Content.Server.Medical +namespace Content.Server.Medical; + +public sealed class HealthAnalyzerSystem : EntitySystem { - public sealed class HealthAnalyzerSystem : EntitySystem + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly PowerCellSystem _cell = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!; + [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; + [Dependency] private readonly TransformSystem _transformSystem = default!; + + public override void Initialize() { - [Dependency] private readonly PowerCellSystem _cell = default!; - [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; - [Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!; - [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; + SubscribeLocalEvent(OnEntityUnpaused); + SubscribeLocalEvent(OnAfterInteract); + SubscribeLocalEvent(OnDoAfter); + SubscribeLocalEvent(OnInsertedIntoContainer); + SubscribeLocalEvent(OnPowerCellSlotEmpty); + SubscribeLocalEvent(OnDropped); + } - public override void Initialize() + public override void Update(float frameTime) + { + var analyzerQuery = EntityQueryEnumerator(); + while (analyzerQuery.MoveNext(out var uid, out var component, out var transform)) { - base.Initialize(); - SubscribeLocalEvent(OnAfterInteract); - SubscribeLocalEvent(OnDoAfter); - } + //Update rate limited to 1 second + if (component.NextUpdate > _timing.CurTime) + continue; - private void OnAfterInteract(Entity entity, ref AfterInteractEvent args) - { - if (args.Target == null || !args.CanReach || !HasComp(args.Target) || !_cell.HasActivatableCharge(entity.Owner, user: args.User)) - return; + if (component.ScannedEntity is not {} patient) + continue; - _audio.PlayPvs(entity.Comp.ScanningBeginSound, entity); + component.NextUpdate = _timing.CurTime + component.UpdateInterval; - _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, args.User, TimeSpan.FromSeconds(entity.Comp.ScanDelay), new HealthAnalyzerDoAfterEvent(), entity.Owner, target: args.Target, used: entity.Owner) + //Get distance between health analyzer and the scanned entity + var patientCoordinates = Transform(patient).Coordinates; + if (!patientCoordinates.InRange(EntityManager, _transformSystem, transform.Coordinates, component.MaxScanRange)) { - BreakOnTargetMove = true, - BreakOnUserMove = true, - NeedHand = true - }); + //Range too far, disable updates + StopAnalyzingEntity((uid, component), patient); + continue; + } + + UpdateScannedUser(uid, patient, true); } + } - private void OnDoAfter(Entity entity, ref HealthAnalyzerDoAfterEvent args) - { - if (args.Handled || args.Cancelled || args.Target == null || !_cell.TryUseActivatableCharge(entity.Owner, user: args.User)) - return; + private void OnEntityUnpaused(Entity ent, ref EntityUnpausedEvent args) + { + ent.Comp.NextUpdate += args.PausedTime; + } - _audio.PlayPvs(entity.Comp.ScanningEndSound, args.User); + /// + /// Trigger the doafter for scanning + /// + private void OnAfterInteract(Entity uid, ref AfterInteractEvent args) + { + if (args.Target == null || !args.CanReach || !HasComp(args.Target) || !_cell.HasDrawCharge(uid, user: args.User)) + return; - UpdateScannedUser(entity, args.User, args.Target.Value, entity.Comp); - args.Handled = true; - } + _audio.PlayPvs(uid.Comp.ScanningBeginSound, uid); - private void OpenUserInterface(EntityUid user, EntityUid analyzer) + _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, args.User, uid.Comp.ScanDelay, new HealthAnalyzerDoAfterEvent(), uid, target: args.Target, used: uid) { - if (!TryComp(user, out var actor) || !_uiSystem.TryGetUi(analyzer, HealthAnalyzerUiKey.Key, out var ui)) - return; + BreakOnTargetMove = true, + BreakOnUserMove = true, + NeedHand = true + }); + } - _uiSystem.OpenUi(ui ,actor.PlayerSession); - } + private void OnDoAfter(Entity uid, ref HealthAnalyzerDoAfterEvent args) + { + if (args.Handled || args.Cancelled || args.Target == null || !_cell.HasDrawCharge(uid, user: args.User)) + return; - public void UpdateScannedUser(EntityUid uid, EntityUid user, EntityUid? target, HealthAnalyzerComponent? healthAnalyzer) - { - if (!Resolve(uid, ref healthAnalyzer)) - return; - - if (target == null || !_uiSystem.TryGetUi(uid, HealthAnalyzerUiKey.Key, out var ui)) - return; - - if (!HasComp(target)) - return; - - float bodyTemperature; - if (TryComp(target, out var temp)) - bodyTemperature = temp.CurrentTemperature; - else - bodyTemperature = float.NaN; - - float bloodAmount; - if (TryComp(target, out var bloodstream) && - _solutionContainerSystem.ResolveSolution(target.Value, bloodstream.BloodSolutionName, ref bloodstream.BloodSolution, out var bloodSolution)) - bloodAmount = bloodSolution.FillFraction; - else - bloodAmount = float.NaN; - - OpenUserInterface(user, uid); - - _uiSystem.SendUiMessage(ui, new HealthAnalyzerScannedUserMessage( - GetNetEntity(target), - bodyTemperature, - bloodAmount - )); - } + _audio.PlayPvs(uid.Comp.ScanningEndSound, uid); + + OpenUserInterface(args.User, uid); + BeginAnalyzingEntity(uid, args.Target.Value); + args.Handled = true; + } + + /// + /// Turn off when placed into a storage item or moved between slots/hands + /// + private void OnInsertedIntoContainer(Entity uid, ref EntGotInsertedIntoContainerMessage args) + { + if (uid.Comp.ScannedEntity is { } patient) + StopAnalyzingEntity(uid, patient); + } + + /// + /// Disable continuous updates once battery is dead + /// + private void OnPowerCellSlotEmpty(Entity uid, ref PowerCellSlotEmptyEvent args) + { + if (uid.Comp.ScannedEntity is { } patient) + StopAnalyzingEntity(uid, patient); + } + + /// + /// Turn off the analyser when dropped + /// + private void OnDropped(Entity uid, ref DroppedEvent args) + { + if (uid.Comp.ScannedEntity is { } patient) + StopAnalyzingEntity(uid, patient); + } + + private void OpenUserInterface(EntityUid user, EntityUid analyzer) + { + if (!TryComp(user, out var actor) || !_uiSystem.TryGetUi(analyzer, HealthAnalyzerUiKey.Key, out var ui)) + return; + + _uiSystem.OpenUi(ui, actor.PlayerSession); + } + + /// + /// Mark the entity as having its health analyzed, and link the analyzer to it + /// + /// The health analyzer that should receive the updates + /// The entity to start analyzing + private void BeginAnalyzingEntity(Entity healthAnalyzer, EntityUid target) + { + //Link the health analyzer to the scanned entity + healthAnalyzer.Comp.ScannedEntity = target; + + _cell.SetPowerCellDrawEnabled(healthAnalyzer, true); + + UpdateScannedUser(healthAnalyzer, target, true); + } + + /// + /// Remove the analyzer from the active list, and remove the component if it has no active analyzers + /// + /// The health analyzer that's receiving the updates + /// The entity to analyze + private void StopAnalyzingEntity(Entity healthAnalyzer, EntityUid target) + { + //Unlink the analyzer + healthAnalyzer.Comp.ScannedEntity = null; + + _cell.SetPowerCellDrawEnabled(target, false); + + UpdateScannedUser(healthAnalyzer, target, false); + } + + /// + /// Send an update for the target to the healthAnalyzer + /// + /// The health analyzer + /// The entity being scanned + /// True makes the UI show ACTIVE, False makes the UI show INACTIVE + public void UpdateScannedUser(EntityUid healthAnalyzer, EntityUid target, bool scanMode) + { + if (!_uiSystem.TryGetUi(healthAnalyzer, HealthAnalyzerUiKey.Key, out var ui)) + return; + + if (!HasComp(target)) + return; + + var bodyTemperature = float.NaN; + + if (TryComp(target, out var temp)) + bodyTemperature = temp.CurrentTemperature; + + var bloodAmount = float.NaN; + + if (TryComp(target, out var bloodstream) && + _solutionContainerSystem.ResolveSolution(target, bloodstream.BloodSolutionName, ref bloodstream.BloodSolution, out var bloodSolution)) + bloodAmount = bloodSolution.FillFraction; + + _uiSystem.SendUiMessage(ui, new HealthAnalyzerScannedUserMessage( + GetNetEntity(target), + bodyTemperature, + bloodAmount, + scanMode + )); } } diff --git a/Content.Shared/MedicalScanner/HealthAnalyzerScannedUserMessage.cs b/Content.Shared/MedicalScanner/HealthAnalyzerScannedUserMessage.cs index eb50323d38f..1e2c2575d9c 100644 --- a/Content.Shared/MedicalScanner/HealthAnalyzerScannedUserMessage.cs +++ b/Content.Shared/MedicalScanner/HealthAnalyzerScannedUserMessage.cs @@ -11,12 +11,14 @@ public sealed class HealthAnalyzerScannedUserMessage : BoundUserInterfaceMessage public readonly NetEntity? TargetEntity; public float Temperature; public float BloodLevel; + public bool? ScanMode; - public HealthAnalyzerScannedUserMessage(NetEntity? targetEntity, float temperature, float bloodLevel) + public HealthAnalyzerScannedUserMessage(NetEntity? targetEntity, float temperature, float bloodLevel, bool? scanMode) { TargetEntity = targetEntity; Temperature = temperature; BloodLevel = bloodLevel; + ScanMode = scanMode; } } diff --git a/Resources/Locale/en-US/medical/components/health-analyzer-component.ftl b/Resources/Locale/en-US/medical/components/health-analyzer-component.ftl index d232be5c4d9..9b0a8dd3ee3 100644 --- a/Resources/Locale/en-US/medical/components/health-analyzer-component.ftl +++ b/Resources/Locale/en-US/medical/components/health-analyzer-component.ftl @@ -8,6 +8,10 @@ health-analyzer-window-damage-group-text = {$damageGroup}: {$amount} health-analyzer-window-damage-type-text = {$damageType}: {$amount} health-analyzer-window-damage-type-duplicate-text = {$damageType}: {$amount} (duplicate) +health-analyzer-window-scan-mode-text = Scan Mode: +health-analyzer-window-scan-mode-active = ACTIVE +health-analyzer-window-scan-mode-inactive = INACTIVE + health-analyzer-window-damage-group-Brute = Brute health-analyzer-window-damage-type-Blunt = Blunt health-analyzer-window-damage-type-Slash = Slash diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml index 752f98740ad..64bd04569b5 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml @@ -45,8 +45,7 @@ suffix: Powered components: - type: PowerCellDraw - drawRate: 0 - useRate: 20 + drawRate: 1.2 #Calculated for 5 minutes on a small cell - type: ActivatableUIRequiresPowerCell - type: entity From 40f40efb91aaf41e71feabb136055414881d8203 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 6 Feb 2024 13:21:16 +0000 Subject: [PATCH 250/266] Automatic changelog update (cherry picked from commit 8e766ba84d293e7ba50ce77a4abfaf9b96a5e89f) --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index fb685f8ac81..ae6bf77f4e3 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: deltanedas - changes: - - message: Fixed explosion resistance from bags being applied to the wearer. - type: Fix - id: 5396 - time: '2023-12-16T17:17:09.0000000+00:00' - author: deltanedas changes: - message: Added the power sensor for checking power stats in logic circuits. @@ -3884,3 +3878,10 @@ id: 5895 time: '2024-02-05T23:46:39.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24702 +- author: Rainfey + changes: + - message: Health Analysers now continuously update their UI after scanning a patient + type: Tweak + id: 5896 + time: '2024-02-06T13:20:10.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/22449 From aebe8d20712122206104a8bbb14a8dfe4bee8880 Mon Sep 17 00:00:00 2001 From: ada-please <155147867+ada-please@users.noreply.github.com> Date: Tue, 6 Feb 2024 08:25:07 -0800 Subject: [PATCH 251/266] Added Monitor Computer Boards to Observation Kit (#24979) * Added Monitor Computer Boards to Observation Kit * Removed crew monitor board from bundle as requested by mainters (cherry picked from commit c5027b51ecc7387a678e194fd7733a03349be536) --- Resources/Prototypes/Catalog/Fills/Boxes/syndicate.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Resources/Prototypes/Catalog/Fills/Boxes/syndicate.yml b/Resources/Prototypes/Catalog/Fills/Boxes/syndicate.yml index c08d82bd28d..53c526f0339 100644 --- a/Resources/Prototypes/Catalog/Fills/Boxes/syndicate.yml +++ b/Resources/Prototypes/Catalog/Fills/Boxes/syndicate.yml @@ -46,4 +46,6 @@ amount: 1 - id: ClothingEyesGlassesHiddenSecurity amount: 1 + - id: SurveillanceCameraMonitorCircuitboard + amount: 1 From 97c44c09a05d236ba6bc516a56bda760249d7580 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 6 Feb 2024 16:26:13 +0000 Subject: [PATCH 252/266] Automatic changelog update (cherry picked from commit 4dba9a5ea1477bfd9c04049f0f6b9f2bb0ebcbaa) --- Resources/Changelog/Changelog.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index ae6bf77f4e3..457fd34885c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: deltanedas - changes: - - message: Added the power sensor for checking power stats in logic circuits. - type: Add - id: 5397 - time: '2023-12-16T18:32:42.0000000+00:00' - author: Flareguy changes: - message: Standardized all material sheets to 10u of total reagents when grinded. @@ -3885,3 +3879,11 @@ id: 5896 time: '2024-02-06T13:20:10.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/22449 +- author: ada-please + changes: + - message: A Surveillance Camera Monitor Board has been added to the Syndicate Observation + Kit. + type: Add + id: 5897 + time: '2024-02-06T16:25:07.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24979 From 7cc7dbab0a49ce9912a4bcee6d823e3cfb980bb6 Mon Sep 17 00:00:00 2001 From: Kevin Zheng Date: Tue, 6 Feb 2024 08:32:39 -0800 Subject: [PATCH 253/266] Make radiation collector a power supplier (#24978) (cherry picked from commit effcc5d8277cd28f9739359e50fc268ada8f4ea6) --- .../Components/RadiationCollectorComponent.cs | 12 +++++++- .../EntitySystems/RadiationCollectorSystem.cs | 29 ++++++++++++++----- .../Generation/Singularity/collector.yml | 12 +------- 3 files changed, 34 insertions(+), 19 deletions(-) diff --git a/Content.Server/Singularity/Components/RadiationCollectorComponent.cs b/Content.Server/Singularity/Components/RadiationCollectorComponent.cs index 30522c28f3a..7870234aab6 100644 --- a/Content.Server/Singularity/Components/RadiationCollectorComponent.cs +++ b/Content.Server/Singularity/Components/RadiationCollectorComponent.cs @@ -11,12 +11,22 @@ namespace Content.Server.Singularity.Components; public sealed partial class RadiationCollectorComponent : Component { /// - /// How much joules will collector generate for each rad. + /// Power output (in Watts) per unit of radiation collected. /// [DataField] [ViewVariables(VVAccess.ReadWrite)] public float ChargeModifier = 30000f; + /// + /// Number of power ticks that the power supply can remain active for. This is needed since + /// power and radiation don't update at the same tickrate, and since radiation does not provide + /// an update when radiation is removed. When this goes to zero, zero out the power supplier + /// to model the radiation source going away. + /// + [DataField] + [ViewVariables(VVAccess.ReadWrite)] + public int PowerTicksLeft = 0; + /// /// Is the machine enabled. /// diff --git a/Content.Server/Singularity/EntitySystems/RadiationCollectorSystem.cs b/Content.Server/Singularity/EntitySystems/RadiationCollectorSystem.cs index 83666776a05..92b963e2017 100644 --- a/Content.Server/Singularity/EntitySystems/RadiationCollectorSystem.cs +++ b/Content.Server/Singularity/EntitySystems/RadiationCollectorSystem.cs @@ -38,6 +38,7 @@ public override void Initialize() SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnTankChanged); SubscribeLocalEvent(OnTankChanged); + SubscribeLocalEvent(PostSync); } private bool TryGetLoadedGasTank(EntityUid uid, [NotNullWhen(true)] out GasTankComponent? gasTankComponent) @@ -107,20 +108,34 @@ private void OnRadiation(EntityUid uid, RadiationCollectorComponent component, O } } - // No idea if this is even vaguely accurate to the previous logic. - // The maths is copied from that logic even though it works differently. - // But the previous logic would also make the radiation collectors never ever stop providing energy. - // And since frameTime was used there, I'm assuming that this is what the intent was. - // This still won't stop things being potentially hilariously unbalanced though. - if (TryComp(uid, out var batteryComponent)) + if (TryComp(uid, out var comp)) { - _batterySystem.SetCharge(uid, charge, batteryComponent); + int powerHoldoverTicks = _gameTiming.TickRate * 2; // number of ticks to hold radiation + component.PowerTicksLeft = powerHoldoverTicks; + comp.MaxSupply = component.Enabled ? charge : 0; } // Update appearance UpdatePressureIndicatorAppearance(uid, component, gasTankComponent); } + private void PostSync(NetworkBatteryPostSync ev) + { + // This is run every power tick. Used to decrement the PowerTicksLeft counter. + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var component)) + { + if (component.PowerTicksLeft > 0) + { + component.PowerTicksLeft -= 1; + } + else if (TryComp(uid, out var comp)) + { + comp.MaxSupply = 0; + } + } + } + private void OnExamined(EntityUid uid, RadiationCollectorComponent component, ExaminedEvent args) { if (!TryGetLoadedGasTank(uid, out var gasTank)) diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/collector.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/collector.yml index 73ce2217878..3742c037ff5 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/collector.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/collector.yml @@ -62,21 +62,11 @@ - reactantPrototype: Plasma powerGenerationEfficiency: 1 reactantBreakdownRate: 0.0001 - # Note that this doesn't matter too much (see next comment) - # However it does act as a cap on power receivable via the collector. - - type: Battery - maxCharge: 100000 - startingCharge: 0 - - type: BatteryDischarger - # This is JUST a default. It has to be dynamically adjusted to ensure that the battery doesn't discharge "too fast" & run out immediately, while still scaling by input power. - activeSupplyRate: 100000 - type: RadiationReceiver + - type: PowerSupplier - type: Anchorable - type: Rotatable - type: Pullable - - type: PowerNetworkBattery - maxSupply: 1000000000 - supplyRampTolerance: 1000000000 - type: GuideHelp guides: [ Singularity, Power ] - type: ContainerContainer From 0a94997478091523af2580ff3baa2ac087a1288c Mon Sep 17 00:00:00 2001 From: sneb <96957003+snebl@users.noreply.github.com> Date: Tue, 6 Feb 2024 20:38:38 +0100 Subject: [PATCH 254/266] Fixed glass cargo opened sprite (#25003) (cherry picked from commit f8df3ae398712acfe8132ac640ecf9d9941d48a1) --- .../Doors/Airlocks/Glass/cargo.rsi/open.png | Bin 247 -> 358 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Resources/Textures/Structures/Doors/Airlocks/Glass/cargo.rsi/open.png b/Resources/Textures/Structures/Doors/Airlocks/Glass/cargo.rsi/open.png index 3fa424bafa2d642aa26ab07b0a210d40f50c5267..d0175d0f8616a897fe4e80d639e0f8e33a1eeca8 100644 GIT binary patch delta 314 zcmV-A0mc6J0pOlq#vjZ76oHoUS0+!er{H% zF#SP}8wUe=u+tq39tWT&4qAftwXdNpr~{^D$}@B)O4G#=pxg$+Fh_tL@c7j?Fn?zt zz-S^I91f5b;{tOA0x(W1F!~Qmk!bY+P3r7g_7eaKc z4V@(3fdxQ-Zob9^2HpYY*6L6u{Q$^L7#=)nfS$D>$ipxI4gn||EP)gfGzkG1fQ1A& z4S=wxr!G{AegI_eXf_-i4j8QsK__6KYQw>i1_lxgxB~{bd(OZB0CNyxWkjO9t^fc4 M07*qoM6N<$g7!*s*Z=?k delta 202 zcmaFH^qp~nBnLAC1B1(wu45Aw73w7dd_r7hWo6q_b*B{=ZEmw!QD+fv%3bKd3siLF z>G~Z&ilZdRFZe$MFx+e28wnKSEbxddW?8eR=R!4OXu#}EtutCt=54k&QA zT#VPL`Y&xQo^WTvGO03~lM+fBPAyim;d61Q5YSy9#-(5oXKwBMjQxScryoAm@d~mh v&ahpWxKPYv#j?2zPy=-xcJK*zF!M~7BG0a`njxgN@xNAX9h~q From 69007c811c15740d0d6b93535856387e42d43d4f Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 6 Feb 2024 19:39:44 +0000 Subject: [PATCH 255/266] Automatic changelog update (cherry picked from commit 635bd2a2ab22c8dc3dca083c07b7ed1ecec05033) --- Resources/Changelog/Changelog.yml | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 457fd34885c..19d4546b68b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,15 +1,4 @@ Entries: -- author: Flareguy - changes: - - message: Standardized all material sheets to 10u of total reagents when grinded. - Alloys are still worth the sum of their parts. - type: Tweak - - message: You can now grind plastic into oil and phosphorous. - type: Tweak - - message: Steel sheets no longer contain trace amounts of lead in them. - type: Tweak - id: 5398 - time: '2023-12-16T20:52:11.0000000+00:00' - author: SlamBamActionman changes: - message: Discord bot Changelog now includes hyperlinks to the PRs. @@ -3887,3 +3876,11 @@ id: 5897 time: '2024-02-06T16:25:07.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24979 +- author: snebl + changes: + - message: Fixed the glass version of cargo airlock looking like an engineering + door when opened. + type: Fix + id: 5898 + time: '2024-02-06T19:38:39.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/25003 From cc9b30af6852ac8e36be44ea60a33e709e3a158b Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 7 Feb 2024 08:50:13 +0000 Subject: [PATCH 256/266] Automatic changelog update (cherry picked from commit 8dec7a608e140a6da8ef4bb51cff6348a0e5e082) --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 19d4546b68b..62836d23b74 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: SlamBamActionman - changes: - - message: Discord bot Changelog now includes hyperlinks to the PRs. - type: Add - id: 5399 - time: '2023-12-16T21:00:59.0000000+00:00' - url: null - author: brainfood1183 changes: - message: Crystals now drop crystal shards, you can use them to craft colored light @@ -3884,3 +3877,10 @@ id: 5898 time: '2024-02-06T19:38:39.0000000+00:00' url: https://api.github.com/repos/space-wizards/space-station-14/pulls/25003 +- author: Mangohydra + changes: + - message: New cargo shuttle for fland + type: Tweak + id: 5899 + time: '2024-02-07T08:49:06.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/25016 From aac95649d10ffc770943de5cf9aad3d35f3733e5 Mon Sep 17 00:00:00 2001 From: Kevin Zheng Date: Thu, 8 Feb 2024 00:33:53 +0100 Subject: [PATCH 257/266] Disable voting for Sandbox mode (#25027) Sandbox mode should not be votable, because players can vote for it, and then entity spam to quickly lag a server or run it out of memory. (cherry picked from commit 8ccdbe73503ac96febaa8ba6e517b43220d7e80d) --- Resources/Prototypes/game_presets.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/game_presets.yml b/Resources/Prototypes/game_presets.yml index dcac598c6ec..4770ec9f6e4 100644 --- a/Resources/Prototypes/game_presets.yml +++ b/Resources/Prototypes/game_presets.yml @@ -79,8 +79,8 @@ - sandbox name: sandbox-title description: sandbox-description - showInVote: false # DeltaV - No - maxPlayers: 1 + showInVote: false # Not suitable for use without admin intervention, since entity spamming can quickly crash a server + maxPlayers: 5 rules: - Sandbox From de74e0faed55f740ec2660e677765864743f8006 Mon Sep 17 00:00:00 2001 From: Tayrtahn Date: Wed, 7 Feb 2024 18:37:24 -0500 Subject: [PATCH 258/266] Improved output distribution of RoundToLevels (#25026) * Improved output distribution of RoundToLevels * Updated tests * Oops (cherry picked from commit 9cee54e5a1b4efd1b8d511584b3e4dcbd7e7c529) --- Content.Shared/Rounding/ContentHelpers.cs | 22 +------------------ .../Shared/Utility/ContentHelpers_Test.cs | 12 +++++----- 2 files changed, 7 insertions(+), 27 deletions(-) diff --git a/Content.Shared/Rounding/ContentHelpers.cs b/Content.Shared/Rounding/ContentHelpers.cs index b1525ed4ee6..9ecee22998b 100644 --- a/Content.Shared/Rounding/ContentHelpers.cs +++ b/Content.Shared/Rounding/ContentHelpers.cs @@ -35,27 +35,7 @@ public static int RoundToLevels(double actual, double max, int levels) } var toOne = actual / max; - double threshold; - if (levels % 2 == 0) - { - // Basically, if we have an even count of levels, there's no exact "mid point". - // Thus, I nominate the first one below the 50% mark. - threshold = ((levels / 2f) - 1) / (levels - 1); - } - else - { - threshold = 0.5f; - } - - var preround = toOne * (levels - 1); - if (toOne < threshold || levels <= 2) - { - return (int) Math.Ceiling(preround); - } - else - { - return (int) Math.Floor(preround); - } + return (int) Math.Ceiling(toOne * (levels - 2)); } /// diff --git a/Content.Tests/Shared/Utility/ContentHelpers_Test.cs b/Content.Tests/Shared/Utility/ContentHelpers_Test.cs index 52d4286b8ce..6a546238922 100644 --- a/Content.Tests/Shared/Utility/ContentHelpers_Test.cs +++ b/Content.Tests/Shared/Utility/ContentHelpers_Test.cs @@ -18,15 +18,15 @@ public sealed class ContentHelpers_Test (0.01f, 10, 5, 1), (1, 10, 5, 1), (2, 10, 5, 1), - (2.5f, 10, 5, 1), - (2.51f, 10, 5, 2), - (3, 10, 5, 2), + (3, 10, 5, 1), + (3.33f, 10, 5, 1), + (3.34f, 10, 5, 2), (4, 10, 5, 2), (5, 10, 5, 2), (6, 10, 5, 2), - (7, 10, 5, 2), - (7.49f, 10, 5, 2), - (7.5f, 10, 5, 3), + (6.66f, 10, 5, 2), + (6.67f, 10, 5, 3), + (7, 10, 5, 3), (8, 10, 5, 3), (9, 10, 5, 3), (10, 10, 5, 4), From 2d684f3c1a45f0ebb5502fb7012aaf6a5448c04b Mon Sep 17 00:00:00 2001 From: Kot <1192090+koteq@users.noreply.github.com> Date: Thu, 8 Feb 2024 03:41:11 +0400 Subject: [PATCH 259/266] Fix scram implant's teleportation out of containers (#24827) * Fix scram teleportation out of containers * re-run ci * Use AttachToGridOrMap method (cherry picked from commit d4434dbb5e586544a5dbd067a3fee4a6bd4e9e89) --- Content.Server/Implants/SubdermalImplantSystem.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Content.Server/Implants/SubdermalImplantSystem.cs b/Content.Server/Implants/SubdermalImplantSystem.cs index 7f6f6fd0459..ac415a04342 100644 --- a/Content.Server/Implants/SubdermalImplantSystem.cs +++ b/Content.Server/Implants/SubdermalImplantSystem.cs @@ -131,6 +131,7 @@ private void OnScramImplant(EntityUid uid, SubdermalImplantComponent component, break; } _xform.SetWorldPosition(ent, targetCoords.Position); + _xform.AttachToGridOrMap(ent, xform); _audio.PlayPvs(implant.TeleportSound, ent); args.Handled = true; From 30e03ca4ae5a5daaa7b1c86acf4b59c9e662f6a7 Mon Sep 17 00:00:00 2001 From: Krunklehorn <42424291+Krunklehorn@users.noreply.github.com> Date: Wed, 7 Feb 2024 18:43:44 -0500 Subject: [PATCH 260/266] Fixed GluedComponent interactions with metamorphic glasses (#24943) * Only rename if name matches reconstructed * Rearranged query Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * Okay --------- Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> (cherry picked from commit 6e91190478ec03e038ff1c3a10ecd632808f281e) --- Content.Server/Glue/GlueSystem.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Content.Server/Glue/GlueSystem.cs b/Content.Server/Glue/GlueSystem.cs index 9409a423c44..6bb6aca3ad2 100644 --- a/Content.Server/Glue/GlueSystem.cs +++ b/Content.Server/Glue/GlueSystem.cs @@ -77,13 +77,16 @@ public override void Update(float frameTime) { base.Update(frameTime); - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var glue, out _)) + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var glue, out var _, out var meta)) { if (_timing.CurTime < glue.Until) continue; - _metaData.SetEntityName(uid, glue.BeforeGluedEntityName); + // Instead of string matching, just reconstruct the expected name and compare + if (meta.EntityName == Loc.GetString("glued-name-prefix", ("target", glue.BeforeGluedEntityName))) + _metaData.SetEntityName(uid, glue.BeforeGluedEntityName); + RemComp(uid); RemComp(uid); } From c73f3837bd35ed8b084f6dfb71e3d98a487a1b35 Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Thu, 8 Feb 2024 06:24:24 +0000 Subject: [PATCH 261/266] predict egg cracking + refactor (#25028) * move stuff to server and some refactoring * update spikables to not use triggering * add Delete bool just incase * a new egg * mom can we have webedit. no, we have webedit at home --------- Co-authored-by: deltanedas <@deltanedas:kde.org> (cherry picked from commit 55dbe26019ed22e11f017393c028c6760699343d) --- .../Components/SolutionSpikerComponent.cs | 24 ++++++++++++----- .../EntitySystems/SolutionSpikerSystem.cs | 27 +++++++++---------- .../Entities/Objects/Consumable/Food/egg.yml | 1 - .../Objects/Specific/Medical/morgue.yml | 1 - .../Entities/Objects/Specific/chemistry.yml | 1 - 5 files changed, 29 insertions(+), 25 deletions(-) rename {Content.Server => Content.Shared}/Chemistry/Components/SolutionSpikerComponent.cs (51%) rename Content.Server/Chemistry/EntitySystems/SolutionSpikableSystem.cs => Content.Shared/Chemistry/EntitySystems/SolutionSpikerSystem.cs (61%) diff --git a/Content.Server/Chemistry/Components/SolutionSpikerComponent.cs b/Content.Shared/Chemistry/Components/SolutionSpikerComponent.cs similarity index 51% rename from Content.Server/Chemistry/Components/SolutionSpikerComponent.cs rename to Content.Shared/Chemistry/Components/SolutionSpikerComponent.cs index 1fad6c9a3e8..e6cf9e02054 100644 --- a/Content.Server/Chemistry/Components/SolutionSpikerComponent.cs +++ b/Content.Shared/Chemistry/Components/SolutionSpikerComponent.cs @@ -1,30 +1,40 @@ -namespace Content.Server.Chemistry.Components; +using Content.Shared.Chemistry.EntitySystems; +using Robust.Shared.GameStates; -[RegisterComponent] +namespace Content.Shared.Chemistry.Components; + +[RegisterComponent, NetworkedComponent, Access(typeof(SolutionSpikerSystem))] public sealed partial class SolutionSpikerComponent : Component { /// /// The source solution to take the reagents from in order /// to spike the other solution container. /// - [DataField] - public string SourceSolution { get; private set; } = string.Empty; + [DataField(required: true)] + public string SourceSolution = string.Empty; /// /// If spiking with this entity should ignore empty containers or not. /// [DataField] - public bool IgnoreEmpty { get; private set; } + public bool IgnoreEmpty; + + /// + /// If true, the entity is deleted after spiking. + /// This is almost certainly what you want. + /// + [DataField] + public bool Delete = true; /// /// What should pop up when spiking with this entity. /// [DataField] - public LocId Popup { get; private set; } = "spike-solution-generic"; + public LocId Popup = "spike-solution-generic"; /// /// What should pop up when spiking fails because the container was empty. /// [DataField] - public LocId PopupEmpty { get; private set; } = "spike-solution-empty-generic"; + public LocId PopupEmpty = "spike-solution-empty-generic"; } diff --git a/Content.Server/Chemistry/EntitySystems/SolutionSpikableSystem.cs b/Content.Shared/Chemistry/EntitySystems/SolutionSpikerSystem.cs similarity index 61% rename from Content.Server/Chemistry/EntitySystems/SolutionSpikableSystem.cs rename to Content.Shared/Chemistry/EntitySystems/SolutionSpikerSystem.cs index 7518b45a8bc..f179580604c 100644 --- a/Content.Server/Chemistry/EntitySystems/SolutionSpikableSystem.cs +++ b/Content.Shared/Chemistry/EntitySystems/SolutionSpikerSystem.cs @@ -1,12 +1,9 @@ -using Content.Server.Chemistry.Components; -using Content.Server.Chemistry.Containers.EntitySystems; -using Content.Server.Explosion.EntitySystems; -using Content.Server.Popups; +using Content.Shared.Popups; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Components.SolutionManager; using Content.Shared.Interaction; -namespace Content.Server.Chemistry.EntitySystems; +namespace Content.Shared.Chemistry.EntitySystems; /// /// Entity system used to handle when solution containers are 'spiked' @@ -17,11 +14,10 @@ namespace Content.Server.Chemistry.EntitySystems; /// Examples of spikable entity interactions include pills being dropped into glasses, /// eggs being cracked into bowls, and so on. /// -public sealed class SolutionSpikableSystem : EntitySystem +public sealed class SolutionSpikerSystem : EntitySystem { - [Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!; - [Dependency] private readonly TriggerSystem _triggerSystem = default!; - [Dependency] private readonly PopupSystem _popupSystem = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly SharedSolutionContainerSystem _solution = default!; public override void Initialize() { @@ -47,23 +43,24 @@ private void TrySpike(EntityUid source, EntityUid target, EntityUid user, Refill { if (!Resolve(source, ref spikableSource, ref managerSource, false) || !Resolve(target, ref spikableTarget, ref managerTarget, false) - || !_solutionContainerSystem.TryGetRefillableSolution((target, spikableTarget, managerTarget), out var targetSoln, out var targetSolution) - || !_solutionContainerSystem.TryGetSolution((source, managerSource), spikableSource.SourceSolution, out _, out var sourceSolution)) + || !_solution.TryGetRefillableSolution((target, spikableTarget, managerTarget), out var targetSoln, out var targetSolution) + || !_solution.TryGetSolution((source, managerSource), spikableSource.SourceSolution, out _, out var sourceSolution)) { return; } if (targetSolution.Volume == 0 && !spikableSource.IgnoreEmpty) { - _popupSystem.PopupEntity(Loc.GetString(spikableSource.PopupEmpty, ("spiked-entity", target), ("spike-entity", source)), user, user); + _popup.PopupClient(Loc.GetString(spikableSource.PopupEmpty, ("spiked-entity", target), ("spike-entity", source)), user, user); return; } - if (!_solutionContainerSystem.ForceAddSolution(targetSoln.Value, sourceSolution)) + if (!_solution.ForceAddSolution(targetSoln.Value, sourceSolution)) return; - _popupSystem.PopupEntity(Loc.GetString(spikableSource.Popup, ("spiked-entity", target), ("spike-entity", source)), user, user); + _popup.PopupClient(Loc.GetString(spikableSource.Popup, ("spiked-entity", target), ("spike-entity", source)), user, user); sourceSolution.RemoveAllSolution(); - _triggerSystem.Trigger(source, user); + if (spikableSource.Delete) + QueueDel(source); } } diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/egg.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/egg.yml index 449b996dac4..8cd2fa70ee5 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/egg.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/egg.yml @@ -30,7 +30,6 @@ sourceSolution: food ignoreEmpty: true popup: spike-solution-egg - - type: DeleteOnTrigger # egg fragile - type: DamageOnHighSpeedImpact minimumSpeed: 0.1 diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml index 42b8ff378d1..1ce3cc26982 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml @@ -118,7 +118,6 @@ - type: SolutionSpiker sourceSolution: food ignoreEmpty: true - - type: DeleteOnTrigger - type: Extractable grindableSolutionName: food diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml index a8acc5ff9c4..ab65940fabc 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml @@ -454,7 +454,6 @@ maxVol: 20 - type: SolutionSpiker sourceSolution: food - - type: DeleteOnTrigger - type: Extractable grindableSolutionName: food - type: StaticPrice From a4fd13ae701b8c828a1d789831616ca225074597 Mon Sep 17 00:00:00 2001 From: Debug <49997488+DebugOk@users.noreply.github.com> Date: Thu, 8 Feb 2024 13:05:23 +0100 Subject: [PATCH 262/266] Fix current test fails --- .../DeltaV/RoundEnd/RoundEndSystem.Pacified.cs | 2 ++ .../Nyanotrasen/Abilities/Oni/OniSystem.cs | 9 ++++++--- .../Kitchen/EntitySystems/DeepFryerSystem.cs | 1 + .../Invisibility/PsionicInvisibilitySystem.cs | 4 ---- .../ReverseEngineeringSystem.cs | 1 + .../Nyanotrasen/Abilities/Oni/SharedOniSystem.cs | 5 +++++ .../Weapons/Ranged/Components/GunComponent.cs | 3 ++- Resources/Migrations/deltaMigrations.yml | 3 +++ .../DeltaV/Catalog/Fills/Crates/food.yml | 2 -- .../Structures/Doors/Airlocks/airlocks.yml | 8 ++++---- .../Entities/Structures/Doors/airlock_groups.yml | 4 ++-- .../Markers/Spawners/Random/antagvehicle.yml | 15 --------------- 12 files changed, 26 insertions(+), 31 deletions(-) create mode 100644 Content.Shared/Nyanotrasen/Abilities/Oni/SharedOniSystem.cs delete mode 100644 Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/antagvehicle.yml diff --git a/Content.Server/DeltaV/RoundEnd/RoundEndSystem.Pacified.cs b/Content.Server/DeltaV/RoundEnd/RoundEndSystem.Pacified.cs index 36615a425f7..aa268ccf74a 100644 --- a/Content.Server/DeltaV/RoundEnd/RoundEndSystem.Pacified.cs +++ b/Content.Server/DeltaV/RoundEnd/RoundEndSystem.Pacified.cs @@ -7,7 +7,9 @@ using Content.Shared.CombatMode; using Content.Shared.CombatMode.Pacification; using Content.Shared.DeltaV.CCVars; +using Content.Shared.Explosion.Components; using Content.Shared.FixedPoint; +using Content.Shared.Flash.Components; using Robust.Server.Player; using Robust.Shared.Configuration; diff --git a/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs b/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs index e0139685a7a..6fdb27097e9 100644 --- a/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs @@ -1,15 +1,18 @@ using Content.Server.Tools; +using Content.Server.Weapons.Ranged.Systems; using Content.Shared.Tools.Components; using Content.Shared.Damage.Events; +using Content.Shared.Nyanotrasen.Abilities.Oni; using Content.Shared.Weapons.Melee.Events; using Content.Shared.Weapons.Ranged.Components; using Robust.Shared.Containers; namespace Content.Server.Abilities.Oni { - public sealed class OniSystem : EntitySystem + public sealed class OniSystem : SharedOniSystem { [Dependency] private readonly ToolSystem _toolSystem = default!; + [Dependency] private readonly GunSystem _gunSystem = default!; public override void Initialize() { @@ -29,7 +32,7 @@ private void OnEntInserted(EntityUid uid, OniComponent component, EntInsertedInt if (TryComp(args.Entity, out var tool) && _toolSystem.HasQuality(args.Entity, "Prying", tool)) tool.SpeedModifier *= 1.66f; - if (TryComp(args.Entity, out var gun)) + if (_gunSystem.TryGetGun(args.Entity, out _, out var gun)) { gun.MinAngle *= 15f; gun.AngleIncrease *= 15f; @@ -42,7 +45,7 @@ private void OnEntRemoved(EntityUid uid, OniComponent component, EntRemovedFromC if (TryComp(args.Entity, out var tool) && _toolSystem.HasQuality(args.Entity, "Prying", tool)) tool.SpeedModifier /= 1.66f; - if (TryComp(args.Entity, out var gun)) + if (_gunSystem.TryGetGun(args.Entity, out _, out var gun)) { gun.MinAngle /= 15f; gun.AngleIncrease /= 15f; diff --git a/Content.Server/Nyanotrasen/Kitchen/EntitySystems/DeepFryerSystem.cs b/Content.Server/Nyanotrasen/Kitchen/EntitySystems/DeepFryerSystem.cs index cb95251f5ee..84157ed5f17 100644 --- a/Content.Server/Nyanotrasen/Kitchen/EntitySystems/DeepFryerSystem.cs +++ b/Content.Server/Nyanotrasen/Kitchen/EntitySystems/DeepFryerSystem.cs @@ -43,6 +43,7 @@ using Content.Shared.Nyanotrasen.Kitchen.UI; using Content.Shared.Popups; using Content.Shared.Throwing; +using Content.Shared.UserInterface; using FastAccessors; using Robust.Server.GameObjects; using Robust.Shared.Audio; diff --git a/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibilitySystem.cs b/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibilitySystem.cs index 8d7325c0eea..38349c26fa9 100644 --- a/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibilitySystem.cs +++ b/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibilitySystem.cs @@ -1,5 +1,4 @@ using Content.Shared.Abilities.Psionics; -using Content.Shared.Vehicle.Components; using Content.Server.Abilities.Psionics; using Content.Shared.Eye; using Content.Server.NPC.Systems; @@ -106,9 +105,6 @@ private void OnInvisShutdown(EntityUid uid, PsionicallyInvisibleComponent compon private void OnEyeInit(EntityUid uid, EyeComponent component, ComponentInit args) { - if (HasComp(uid) || HasComp(uid)) - return; - //SetCanSeePsionicInvisiblity(uid, true); //JJ Comment - Not allowed to modifies .yml on spawn any longer. See UninitializedSaveTest. } private void OnEntInserted(EntityUid uid, PsionicallyInvisibleComponent component, EntInsertedIntoContainerMessage args) diff --git a/Content.Server/Nyanotrasen/ReverseEngineering/ReverseEngineeringSystem.cs b/Content.Server/Nyanotrasen/ReverseEngineering/ReverseEngineeringSystem.cs index 1722bfd98b5..85fa160d8ee 100644 --- a/Content.Server/Nyanotrasen/ReverseEngineering/ReverseEngineeringSystem.cs +++ b/Content.Server/Nyanotrasen/ReverseEngineering/ReverseEngineeringSystem.cs @@ -7,6 +7,7 @@ using Content.Server.Power.Components; using Content.Server.Construction; using Content.Server.Popups; +using Content.Shared.UserInterface; using Robust.Shared.Containers; using Robust.Shared.Random; using Robust.Shared.Utility; diff --git a/Content.Shared/Nyanotrasen/Abilities/Oni/SharedOniSystem.cs b/Content.Shared/Nyanotrasen/Abilities/Oni/SharedOniSystem.cs new file mode 100644 index 00000000000..874213aa5c5 --- /dev/null +++ b/Content.Shared/Nyanotrasen/Abilities/Oni/SharedOniSystem.cs @@ -0,0 +1,5 @@ +namespace Content.Shared.Nyanotrasen.Abilities.Oni; + +public abstract class SharedOniSystem : EntitySystem +{ +} diff --git a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs index 8d7d548ad8f..31ad2042341 100644 --- a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs +++ b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs @@ -1,4 +1,5 @@ using Content.Shared.Damage; +using Content.Shared.Nyanotrasen.Abilities.Oni; using Content.Shared.Tag; using Content.Shared.Weapons.Ranged.Events; using Content.Shared.Weapons.Ranged.Systems; @@ -10,7 +11,7 @@ namespace Content.Shared.Weapons.Ranged.Components; [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] -[Access(typeof(SharedGunSystem))] +[Access(typeof(SharedGunSystem), typeof(SharedOniSystem))] // DeltaV - I didn't feel like rewriting big chunks of code public sealed partial class GunComponent : Component { #region Sound diff --git a/Resources/Migrations/deltaMigrations.yml b/Resources/Migrations/deltaMigrations.yml index 19f7dedc817..7c2046f7c59 100644 --- a/Resources/Migrations/deltaMigrations.yml +++ b/Resources/Migrations/deltaMigrations.yml @@ -91,3 +91,6 @@ ExteriorLightTube: BlueLightTube # 2024-01-26 SalvagePartsSpawnerSubSpace: SalvagePartsSpawnerMid + +# 2024-08-02 +SpawnVehicleAntagVehicle: null diff --git a/Resources/Prototypes/DeltaV/Catalog/Fills/Crates/food.yml b/Resources/Prototypes/DeltaV/Catalog/Fills/Crates/food.yml index 1da4e911dfc..6e273a72c48 100644 --- a/Resources/Prototypes/DeltaV/Catalog/Fills/Crates/food.yml +++ b/Resources/Prototypes/DeltaV/Catalog/Fills/Crates/food.yml @@ -27,7 +27,5 @@ amount: 1 - id: FoodBoxDonkpocketBerry amount: 1 - - id: FoodBoxDonkpocketGondola - amount: 1 - id: FoodBoxDonkpocketDink prob: 0.1 diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/airlocks.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/airlocks.yml index 536fa55e123..3a2659f8296 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/airlocks.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/airlocks.yml @@ -32,7 +32,7 @@ - type: Sprite sprite: Structures/Doors/Airlocks/Standard/cargo.rsi - type: PaintableAirlock - department: Cargo + department: Logistics - type: entity parent: Airlock @@ -65,7 +65,7 @@ - type: Sprite sprite: Structures/Doors/Airlocks/Standard/science.rsi - type: PaintableAirlock - department: Science + department: Epistemics - type: entity parent: Airlock @@ -214,7 +214,7 @@ - type: Sprite sprite: Structures/Doors/Airlocks/Glass/cargo.rsi - type: PaintableAirlock - department: Cargo + department: Logistics - type: entity parent: AirlockGlass @@ -247,7 +247,7 @@ - type: Sprite sprite: Structures/Doors/Airlocks/Glass/science.rsi - type: PaintableAirlock - department: Science + department: Epistemics - type: entity parent: AirlockGlass diff --git a/Resources/Prototypes/Entities/Structures/Doors/airlock_groups.yml b/Resources/Prototypes/Entities/Structures/Doors/airlock_groups.yml index 09ce1a05d94..dfb37f49869 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/airlock_groups.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/airlock_groups.yml @@ -65,12 +65,12 @@ departments: atmospherics: Engineering basic: Civilian - cargo: Cargo + cargo: Logistics command: Command engineering: Engineering freezer: Civilian maintenance: Civilian medical: Medical - science: Science + science: Epistemics security: Security virology: Medical diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/antagvehicle.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/antagvehicle.yml deleted file mode 100644 index 235fd4cf36c..00000000000 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/Random/antagvehicle.yml +++ /dev/null @@ -1,15 +0,0 @@ -- type: entity - name: Antag Vehicle Spawner - id: SpawnVehicleAntagVehicle - parent: MarkerBase - components: - - type: Sprite - layers: - - state: green - - sprite: Objects/Vehicles/syndicatesegway.rsi - state: keys - - type: RandomSpawner - prototypes: - - VehicleSyndicateSegway - - VehicleSkeletonMotorcycle - chance: 1 From ef307b77e478a228021eb9a33e501af454101f55 Mon Sep 17 00:00:00 2001 From: Debug <49997488+DebugOk@users.noreply.github.com> Date: Thu, 8 Feb 2024 13:37:51 +0100 Subject: [PATCH 263/266] Fix invalid entry Signed-off-by: Debug <49997488+DebugOk@users.noreply.github.com> --- Content.Server/DeltaV/NPC/Roboisseur/RoboisseurComponent.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Content.Server/DeltaV/NPC/Roboisseur/RoboisseurComponent.cs b/Content.Server/DeltaV/NPC/Roboisseur/RoboisseurComponent.cs index 36ae954efac..0e0d2e4e683 100644 --- a/Content.Server/DeltaV/NPC/Roboisseur/RoboisseurComponent.cs +++ b/Content.Server/DeltaV/NPC/Roboisseur/RoboisseurComponent.cs @@ -161,7 +161,6 @@ public sealed partial class RoboisseurComponent : Component "FoodMothOatStew", "FoodMeatLizardtailKebab", "FoodSoupTomato", - "FoodDonkpocketGondolaWarm", "FoodDonkpocketBerryWarm", "FoodBreadButteredToast", "FoodMothCottonSoup", From 7ea62e49edfacbd2b6f1b3c67a962e11d86898d9 Mon Sep 17 00:00:00 2001 From: Debug <49997488+DebugOk@users.noreply.github.com> Date: Thu, 8 Feb 2024 15:21:58 +0100 Subject: [PATCH 264/266] Remove soapy water Literally 1984 --- Resources/Maps/hammurabi.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Resources/Maps/hammurabi.yml b/Resources/Maps/hammurabi.yml index c35c3836d16..c5ee4e34893 100644 --- a/Resources/Maps/hammurabi.yml +++ b/Resources/Maps/hammurabi.yml @@ -191226,7 +191226,7 @@ entities: name: null reagents: - data: null - ReagentId: SoapyWater + ReagentId: Water Quantity: 90 - uid: 1978 components: @@ -211592,7 +211592,7 @@ entities: ReagentId: Water Quantity: 30 - data: null - ReagentId: SoapyWater + ReagentId: Water Quantity: 30 - type: TileFrictionModifier modifier: 0.15 @@ -211631,7 +211631,7 @@ entities: name: null reagents: - data: null - ReagentId: SoapyWater + ReagentId: Water Quantity: 60 - type: TileFrictionModifier modifier: 0.15 From 0d3511813404fee93c50bcd9d1482541a2563e39 Mon Sep 17 00:00:00 2001 From: Debug <49997488+DebugOk@users.noreply.github.com> Date: Thu, 8 Feb 2024 16:02:35 +0100 Subject: [PATCH 265/266] Resave Hammurabi again --- Resources/Maps/hammurabi.yml | 60 ------------------------------------ 1 file changed, 60 deletions(-) diff --git a/Resources/Maps/hammurabi.yml b/Resources/Maps/hammurabi.yml index c5ee4e34893..61df9032d1f 100644 --- a/Resources/Maps/hammurabi.yml +++ b/Resources/Maps/hammurabi.yml @@ -191211,23 +191211,6 @@ entities: - type: InsideEntityStorage - proto: Jug entities: - - uid: 1136 - components: - - type: Transform - pos: 15.33049,9.647776 - parent: 1 - - type: SolutionContainerManager - solutions: - beaker: - temperature: 293.15 - canMix: True - canReact: True - maxVol: 200 - name: null - reagents: - - data: null - ReagentId: Water - Quantity: 90 - uid: 1978 components: - type: Transform @@ -211574,29 +211557,6 @@ entities: parent: 1 - proto: Puddle entities: - - uid: 9841 - components: - - type: Transform - pos: -111.5,-17.5 - parent: 1 - - type: SolutionContainerManager - solutions: - puddle: - temperature: 293.15 - canMix: False - canReact: True - maxVol: 1000 - name: null - reagents: - - data: null - ReagentId: Water - Quantity: 30 - - data: null - ReagentId: Water - Quantity: 30 - - type: TileFrictionModifier - modifier: 0.15 - - type: Evaporation - uid: 29384 components: - type: Transform @@ -211616,26 +211576,6 @@ entities: Quantity: 30 - type: StepTrigger active: False - - uid: 36425 - components: - - type: Transform - pos: -118.5,-52.5 - parent: 1 - - type: SolutionContainerManager - solutions: - puddle: - temperature: 293.15 - canMix: False - canReact: True - maxVol: 1000 - name: null - reagents: - - data: null - ReagentId: Water - Quantity: 60 - - type: TileFrictionModifier - modifier: 0.15 - - type: Evaporation - uid: 41114 components: - type: Transform From 75c21fda2e1257d5804e74399d9e4c62fd83fcb5 Mon Sep 17 00:00:00 2001 From: Debug <49997488+DebugOk@users.noreply.github.com> Date: Thu, 8 Feb 2024 16:34:11 +0100 Subject: [PATCH 266/266] Fix changelog order (again) How many times do I need to do this lmao Signed-off-by: Debug <49997488+DebugOk@users.noreply.github.com> --- Resources/Changelog/Changelog.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 62836d23b74..ebc431b9428 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,3 +1,4 @@ +Order: 1 Entries: - author: brainfood1183 changes: