From 80e148c265dc8602f50e3941dbd94bb396a1f5b5 Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Fri, 8 Nov 2024 11:15:41 +0000 Subject: [PATCH 1/8] cham projector fixes/rewrite (#27111) * cant disguise to thing in a container * copy cigarette visualiser * prevent aghost throwing an error * make disguises die in space * fuck it rewrite it to not use polymorph * fix action troll * oop * add vebr * add access to the components * 2/3 * fix * relay damage from disguise to user * fix integrity * :trollface: * :trollface: * m * kill integrity * fix a bug * review * remove them from component * relay flash effect to the disguise * fix icon being weird * change method since multiple systems cant handle same network event * :trollface: * actually network Disguise real --------- Co-authored-by: deltanedas <@deltanedas:kde.org> --- .../Effects/ColorFlashEffectSystem.cs | 10 + .../Systems/ChameleonProjectorSystem.cs | 30 +++ .../Systems/ChameleonProjectorSystem.cs | 96 +------- .../Components/ChameleonDisguiseComponent.cs | 16 +- .../Components/ChameleonDisguisedComponent.cs | 25 ++ .../Components/ChameleonProjectorComponent.cs | 19 +- .../Systems/SharedChameleonProjectorSystem.cs | 227 ++++++++++++++++-- .../chameleon-projector.ftl | 2 + .../Objects/Devices/chameleon_projector.yml | 24 +- 9 files changed, 310 insertions(+), 139 deletions(-) create mode 100644 Content.Shared/Polymorph/Components/ChameleonDisguisedComponent.cs diff --git a/Content.Client/Effects/ColorFlashEffectSystem.cs b/Content.Client/Effects/ColorFlashEffectSystem.cs index 956c9465244200..b584aa9ad1bd35 100644 --- a/Content.Client/Effects/ColorFlashEffectSystem.cs +++ b/Content.Client/Effects/ColorFlashEffectSystem.cs @@ -124,6 +124,10 @@ private void OnColorFlashEffect(ColorFlashEffectEvent ev) continue; } + var targetEv = new GetFlashEffectTargetEvent(ent); + RaiseLocalEvent(ent, ref targetEv); + ent = targetEv.Target; + EnsureComp(ent, out comp); comp.NetSyncEnabled = false; comp.Color = sprite.Color; @@ -132,3 +136,9 @@ private void OnColorFlashEffect(ColorFlashEffectEvent ev) } } } + +/// +/// Raised on an entity to change the target for a color flash effect. +/// +[ByRefEvent] +public record struct GetFlashEffectTargetEvent(EntityUid Target); diff --git a/Content.Client/Polymorph/Systems/ChameleonProjectorSystem.cs b/Content.Client/Polymorph/Systems/ChameleonProjectorSystem.cs index 5ba4878c6d4534..8ba09c661701ba 100644 --- a/Content.Client/Polymorph/Systems/ChameleonProjectorSystem.cs +++ b/Content.Client/Polymorph/Systems/ChameleonProjectorSystem.cs @@ -1,7 +1,10 @@ +using Content.Client.Effects; +using Content.Client.Smoking; using Content.Shared.Chemistry.Components; using Content.Shared.Polymorph.Components; using Content.Shared.Polymorph.Systems; using Robust.Client.GameObjects; +using Robust.Shared.Player; namespace Content.Client.Polymorph.Systems; @@ -10,14 +13,20 @@ public sealed class ChameleonProjectorSystem : SharedChameleonProjectorSystem [Dependency] private readonly SharedAppearanceSystem _appearance = default!; private EntityQuery _appearanceQuery; + private EntityQuery _spriteQuery; public override void Initialize() { base.Initialize(); _appearanceQuery = GetEntityQuery(); + _spriteQuery = GetEntityQuery(); SubscribeLocalEvent(OnHandleState); + + SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnGetFlashEffectTargetEvent); } private void OnHandleState(Entity ent, ref AfterAutoHandleStateEvent args) @@ -25,9 +34,30 @@ private void OnHandleState(Entity ent, ref AfterAuto CopyComp(ent); CopyComp(ent); CopyComp(ent); + CopyComp(ent); // reload appearance to hopefully prevent any invisible layers if (_appearanceQuery.TryComp(ent, out var appearance)) _appearance.QueueUpdate(ent, appearance); } + + private void OnStartup(Entity ent, ref ComponentStartup args) + { + if (!_spriteQuery.TryComp(ent, out var sprite)) + return; + + ent.Comp.WasVisible = sprite.Visible; + sprite.Visible = false; + } + + private void OnShutdown(Entity ent, ref ComponentShutdown args) + { + if (_spriteQuery.TryComp(ent, out var sprite)) + sprite.Visible = ent.Comp.WasVisible; + } + + private void OnGetFlashEffectTargetEvent(Entity ent, ref GetFlashEffectTargetEvent args) + { + args.Target = ent.Comp.Disguise; + } } diff --git a/Content.Server/Polymorph/Systems/ChameleonProjectorSystem.cs b/Content.Server/Polymorph/Systems/ChameleonProjectorSystem.cs index 1586973a21e7e4..ab12f2764cfba6 100644 --- a/Content.Server/Polymorph/Systems/ChameleonProjectorSystem.cs +++ b/Content.Server/Polymorph/Systems/ChameleonProjectorSystem.cs @@ -1,99 +1,5 @@ -using Content.Server.Polymorph.Components; -using Content.Shared.Actions; -using Content.Shared.Construction.Components; -using Content.Shared.Hands; -using Content.Shared.Mobs; -using Content.Shared.Mobs.Components; -using Content.Shared.Mobs.Systems; -using Content.Shared.Polymorph; -using Content.Shared.Polymorph.Components; using Content.Shared.Polymorph.Systems; -using Content.Shared.StatusIcon.Components; -using Robust.Shared.Physics.Components; namespace Content.Server.Polymorph.Systems; -public sealed class ChameleonProjectorSystem : SharedChameleonProjectorSystem -{ - [Dependency] private readonly MetaDataSystem _meta = default!; - [Dependency] private readonly MobThresholdSystem _mobThreshold = default!; - [Dependency] private readonly PolymorphSystem _polymorph = default!; - [Dependency] private readonly SharedActionsSystem _actions = default!; - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - [Dependency] private readonly SharedTransformSystem _xform = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnEquippedHand); - SubscribeLocalEvent(OnToggleNoRot); - SubscribeLocalEvent(OnToggleAnchored); - } - - private void OnEquippedHand(Entity ent, ref GotEquippedHandEvent args) - { - if (!TryComp(ent, out var poly)) - return; - - _polymorph.Revert((ent, poly)); - args.Handled = true; - } - - public override void Disguise(ChameleonProjectorComponent proj, EntityUid user, EntityUid entity) - { - if (_polymorph.PolymorphEntity(user, proj.Polymorph) is not {} disguise) - return; - - // make disguise look real (for simple things at least) - var meta = MetaData(entity); - _meta.SetEntityName(disguise, meta.EntityName); - _meta.SetEntityDescription(disguise, meta.EntityDescription); - - var comp = EnsureComp(disguise); - comp.SourceEntity = entity; - comp.SourceProto = Prototype(entity)?.ID; - Dirty(disguise, comp); - - // no sechud trolling - RemComp(disguise); - - _appearance.CopyData(entity, disguise); - - var mass = CompOrNull(entity)?.Mass ?? 0f; - - // let the disguise die when its taken enough damage, which then transfers to the player - // health is proportional to mass, and capped to not be insane - if (TryComp(disguise, out var thresholds)) - { - // if the player is of flesh and blood, cap max health to theirs - // so that when reverting damage scales 1:1 and not round removing - var playerMax = _mobThreshold.GetThresholdForState(user, MobState.Dead).Float(); - var max = playerMax == 0f ? proj.MaxHealth : Math.Max(proj.MaxHealth, playerMax); - - var health = Math.Clamp(mass, proj.MinHealth, proj.MaxHealth); - _mobThreshold.SetMobStateThreshold(disguise, health, MobState.Critical, thresholds); - _mobThreshold.SetMobStateThreshold(disguise, max, MobState.Dead, thresholds); - } - - // add actions for controlling transform aspects - _actions.AddAction(disguise, proj.NoRotAction); - _actions.AddAction(disguise, proj.AnchorAction); - } - - private void OnToggleNoRot(Entity ent, ref DisguiseToggleNoRotEvent args) - { - var xform = Transform(ent); - xform.NoLocalRotation = !xform.NoLocalRotation; - } - - private void OnToggleAnchored(Entity ent, ref DisguiseToggleAnchoredEvent args) - { - var uid = ent.Owner; - var xform = Transform(uid); - if (xform.Anchored) - _xform.Unanchor(uid, xform); - else - _xform.AnchorEntity((uid, xform)); - } -} +public sealed class ChameleonProjectorSystem : SharedChameleonProjectorSystem; diff --git a/Content.Shared/Polymorph/Components/ChameleonDisguiseComponent.cs b/Content.Shared/Polymorph/Components/ChameleonDisguiseComponent.cs index 2b9fba7b3919ac..282106b8f6fff1 100644 --- a/Content.Shared/Polymorph/Components/ChameleonDisguiseComponent.cs +++ b/Content.Shared/Polymorph/Components/ChameleonDisguiseComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.Polymorph.Systems; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; @@ -7,9 +8,22 @@ namespace Content.Shared.Polymorph.Components; /// Component added to disguise entities. /// Used by client to copy over appearance from the disguise's source entity. /// -[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] +[RegisterComponent, NetworkedComponent, Access(typeof(SharedChameleonProjectorSystem))] +[AutoGenerateComponentState(true)] public sealed partial class ChameleonDisguiseComponent : Component { + /// + /// The user of this disguise. + /// + [DataField] + public EntityUid User; + + /// + /// The projector that created this disguise. + /// + [DataField] + public EntityUid Projector; + /// /// The disguise source entity for copying the sprite. /// diff --git a/Content.Shared/Polymorph/Components/ChameleonDisguisedComponent.cs b/Content.Shared/Polymorph/Components/ChameleonDisguisedComponent.cs new file mode 100644 index 00000000000000..cd2e26c420a377 --- /dev/null +++ b/Content.Shared/Polymorph/Components/ChameleonDisguisedComponent.cs @@ -0,0 +1,25 @@ +using Content.Shared.Polymorph.Systems; +using Robust.Shared.GameStates; + +namespace Content.Shared.Polymorph.Components; + +/// +/// Added to a player when they use a chameleon projector. +/// Handles making them invisible and revealing when damaged enough or switching hands. +/// +[RegisterComponent, NetworkedComponent, Access(typeof(SharedChameleonProjectorSystem))] +[AutoGenerateComponentState] +public sealed partial class ChameleonDisguisedComponent : Component +{ + /// + /// The disguise entity parented to the player. + /// + [DataField, AutoNetworkedField] + public EntityUid Disguise; + + /// + /// For client, whether the user's sprite was previously visible or not. + /// + [DataField] + public bool WasVisible; +} diff --git a/Content.Shared/Polymorph/Components/ChameleonProjectorComponent.cs b/Content.Shared/Polymorph/Components/ChameleonProjectorComponent.cs index 239b5236f2799b..1b289c54fc75e4 100644 --- a/Content.Shared/Polymorph/Components/ChameleonProjectorComponent.cs +++ b/Content.Shared/Polymorph/Components/ChameleonProjectorComponent.cs @@ -1,4 +1,3 @@ -using Content.Shared.Polymorph; using Content.Shared.Polymorph.Systems; using Content.Shared.Whitelist; using Robust.Shared.Prototypes; @@ -25,22 +24,26 @@ public sealed partial class ChameleonProjectorComponent : Component public EntityWhitelist? Blacklist; /// - /// Polymorph configuration for the disguise entity. + /// Disguise entity to spawn and use. /// [DataField(required: true)] - public PolymorphConfiguration Polymorph = new(); + public EntProtoId DisguiseProto = string.Empty; /// /// Action for disabling your disguise's rotation. /// [DataField] public EntProtoId NoRotAction = "ActionDisguiseNoRot"; + [DataField] + public EntityUid? NoRotActionEntity; /// /// Action for anchoring your disguise in place. /// [DataField] public EntProtoId AnchorAction = "ActionDisguiseAnchor"; + [DataField] + public EntityUid? AnchorActionEntity; /// /// Minimum health to give the disguise. @@ -55,14 +58,8 @@ public sealed partial class ChameleonProjectorComponent : Component public float MaxHealth = 100f; /// - /// Popup shown to the user when they try to disguise as an invalid entity. - /// - [DataField] - public LocId InvalidPopup = "chameleon-projector-invalid"; - - /// - /// Popup shown to the user when they disguise as a valid entity. + /// User currently disguised by this projector, if any /// [DataField] - public LocId SuccessPopup = "chameleon-projector-success"; + public EntityUid? Disguised; } diff --git a/Content.Shared/Polymorph/Systems/SharedChameleonProjectorSystem.cs b/Content.Shared/Polymorph/Systems/SharedChameleonProjectorSystem.cs index 00096b7d4094db..99737996b0873d 100644 --- a/Content.Shared/Polymorph/Systems/SharedChameleonProjectorSystem.cs +++ b/Content.Shared/Polymorph/Systems/SharedChameleonProjectorSystem.cs @@ -1,67 +1,264 @@ using Content.Shared.Actions; +using Content.Shared.Coordinates; +using Content.Shared.Damage; +using Content.Shared.Hands; using Content.Shared.Interaction; -using Content.Shared.Polymorph; +using Content.Shared.Item; using Content.Shared.Polymorph.Components; using Content.Shared.Popups; -using Robust.Shared.Serialization.Manager; +using Content.Shared.Storage.Components; +using Content.Shared.Verbs; +using Content.Shared.Whitelist; +using Robust.Shared.Containers; +using Robust.Shared.Network; using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.Manager; using System.Diagnostics.CodeAnalysis; -using Content.Shared.Whitelist; namespace Content.Shared.Polymorph.Systems; /// -/// Handles whitelist/blacklist checking. -/// Actual polymorphing and deactivation is done serverside. +/// Handles disguise validation, disguising and revealing. +/// Most appearance copying is done clientside. /// public abstract class SharedChameleonProjectorSystem : EntitySystem { + [Dependency] private readonly DamageableSystem _damageable = default!; + [Dependency] private readonly EntityWhitelistSystem _whitelist = default!; + [Dependency] private readonly INetManager _net = default!; [Dependency] private readonly IPrototypeManager _proto = default!; [Dependency] private readonly ISerializationManager _serMan = default!; + [Dependency] private readonly MetaDataSystem _meta = default!; + [Dependency] private readonly SharedActionsSystem _actions = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; - [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!; + [Dependency] private readonly SharedTransformSystem _xform = default!; public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnDisguiseInteractHand, before: [typeof(SharedItemSystem)]); + SubscribeLocalEvent(OnDisguiseDamaged); + SubscribeLocalEvent(OnDisguiseInsertAttempt); + SubscribeLocalEvent(OnDisguiseShutdown); + SubscribeLocalEvent(OnInteract); + SubscribeLocalEvent>(OnGetVerbs); + SubscribeLocalEvent(OnToggleNoRot); + SubscribeLocalEvent(OnToggleAnchored); + SubscribeLocalEvent(OnDeselected); + SubscribeLocalEvent(OnUnequipped); + SubscribeLocalEvent(OnProjectorShutdown); + } + + #region Disguise entity + + private void OnDisguiseInteractHand(Entity ent, ref InteractHandEvent args) + { + TryReveal(ent.Comp.User); + args.Handled = true; } + private void OnDisguiseDamaged(Entity ent, ref DamageChangedEvent args) + { + // this mirrors damage 1:1 + if (args.DamageDelta is {} damage) + _damageable.TryChangeDamage(ent.Comp.User, damage); + } + + private void OnDisguiseInsertAttempt(Entity ent, ref InsertIntoEntityStorageAttemptEvent args) + { + // stay parented to the user, not the storage + args.Cancelled = true; + } + + private void OnDisguiseShutdown(Entity ent, ref ComponentShutdown args) + { + _actions.RemoveProvidedActions(ent.Comp.User, ent.Comp.Projector); + } + + #endregion + + #region Projector + private void OnInteract(Entity ent, ref AfterInteractEvent args) { - if (!args.CanReach || args.Target is not {} target) + if (args.Handled || !args.CanReach || args.Target is not {} target) return; - var user = args.User; args.Handled = true; + TryDisguise(ent, args.User, target); + } + + private void OnGetVerbs(Entity ent, ref GetVerbsEvent args) + { + if (!args.CanAccess) + return; + + var user = args.User; + var target = args.Target; + args.Verbs.Add(new UtilityVerb() + { + Act = () => + { + TryDisguise(ent, user, target); + }, + Text = Loc.GetString("chameleon-projector-set-disguise") + }); + } + + public bool TryDisguise(Entity ent, EntityUid user, EntityUid target) + { + if (_container.IsEntityInContainer(target)) + { + _popup.PopupClient(Loc.GetString("chameleon-projector-inside-container"), target, user); + return false; + } if (IsInvalid(ent.Comp, target)) { - _popup.PopupClient(Loc.GetString(ent.Comp.InvalidPopup), target, user); - return; + _popup.PopupClient(Loc.GetString("chameleon-projector-invalid"), target, user); + return false; } - _popup.PopupClient(Loc.GetString(ent.Comp.SuccessPopup), target, user); - Disguise(ent.Comp, user, target); + _popup.PopupClient(Loc.GetString("chameleon-projector-success"), target, user); + Disguise(ent, user, target); + return true; } + private void OnToggleNoRot(Entity ent, ref DisguiseToggleNoRotEvent args) + { + if (ent.Comp.Disguised is not {} uid) + return; + + var xform = Transform(uid); + _xform.SetLocalRotationNoLerp(uid, 0, xform); + xform.NoLocalRotation = !xform.NoLocalRotation; + args.Handled = true; + } + + private void OnToggleAnchored(Entity ent, ref DisguiseToggleAnchoredEvent args) + { + if (ent.Comp.Disguised is not {} uid) + return; + + var xform = Transform(uid); + if (xform.Anchored) + _xform.Unanchor(uid, xform); + else + _xform.AnchorEntity((uid, xform)); + + args.Handled = true; + } + + private void OnDeselected(Entity ent, ref HandDeselectedEvent args) + { + RevealProjector(ent); + } + + private void OnUnequipped(Entity ent, ref GotUnequippedHandEvent args) + { + RevealProjector(ent); + } + + private void OnProjectorShutdown(Entity ent, ref ComponentShutdown args) + { + RevealProjector(ent); + } + + #endregion + + #region API + /// /// Returns true if an entity cannot be used as a disguise. /// public bool IsInvalid(ChameleonProjectorComponent comp, EntityUid target) { - return _whitelistSystem.IsWhitelistFail(comp.Whitelist, target) - || _whitelistSystem.IsBlacklistPass(comp.Blacklist, target); + return _whitelist.IsWhitelistFail(comp.Whitelist, target) + || _whitelist.IsBlacklistPass(comp.Blacklist, target); } /// /// On server, polymorphs the user into an entity and sets up the disguise. /// - public virtual void Disguise(ChameleonProjectorComponent comp, EntityUid user, EntityUid entity) + public void Disguise(Entity ent, EntityUid user, EntityUid entity) + { + var proj = ent.Comp; + + // no spawning prediction sorry + if (_net.IsClient) + return; + + // reveal first to allow quick switching + TryReveal(user); + + // add actions for controlling transform aspects + _actions.AddAction(user, ref proj.NoRotActionEntity, proj.NoRotAction, container: ent); + _actions.AddAction(user, ref proj.AnchorActionEntity, proj.AnchorAction, container: ent); + + proj.Disguised = user; + + var disguise = SpawnAttachedTo(proj.DisguiseProto, user.ToCoordinates()); + + var disguised = AddComp(user); + disguised.Disguise = disguise; + Dirty(user, disguised); + + // make disguise look real (for simple things at least) + var meta = MetaData(entity); + _meta.SetEntityName(disguise, meta.EntityName); + _meta.SetEntityDescription(disguise, meta.EntityDescription); + + var comp = EnsureComp(disguise); + comp.User = user; + comp.Projector = ent; + comp.SourceEntity = entity; + comp.SourceProto = Prototype(entity)?.ID; + Dirty(disguise, comp); + + // item disguises can be picked up to be revealed, also makes sure their examine size is correct + CopyComp((disguise, comp)); + + _appearance.CopyData(entity, disguise); + } + + /// + /// Removes the disguise, if the user is disguised. + /// + public bool TryReveal(Entity ent) + { + if (!Resolve(ent, ref ent.Comp, false)) + return false; + + if (TryComp(ent.Comp.Disguise, out var disguise) + && TryComp(disguise.Projector, out var proj)) + { + proj.Disguised = null; + } + + var xform = Transform(ent); + xform.NoLocalRotation = false; + _xform.Unanchor(ent, xform); + + Del(ent.Comp.Disguise); + RemComp(ent); + return true; + } + + /// + /// Reveal a projector's user, if any. + /// + public void RevealProjector(Entity ent) { + if (ent.Comp.Disguised is {} user) + TryReveal(user); } + #endregion + /// /// Copy a component from the source entity/prototype to the disguise entity. /// diff --git a/Resources/Locale/en-US/chameleon-projector/chameleon-projector.ftl b/Resources/Locale/en-US/chameleon-projector/chameleon-projector.ftl index 8a79516077d02d..b525c9da1a3363 100644 --- a/Resources/Locale/en-US/chameleon-projector/chameleon-projector.ftl +++ b/Resources/Locale/en-US/chameleon-projector/chameleon-projector.ftl @@ -1,2 +1,4 @@ +chameleon-projector-inside-container = There's no room to scan that! chameleon-projector-invalid = You can't disguise as that! chameleon-projector-success = Projected new disguise. +chameleon-projector-set-disguise = Set Disguise diff --git a/Resources/Prototypes/Entities/Objects/Devices/chameleon_projector.yml b/Resources/Prototypes/Entities/Objects/Devices/chameleon_projector.yml index f07ae635696ee8..b6819a18b96462 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/chameleon_projector.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/chameleon_projector.yml @@ -17,15 +17,12 @@ blacklist: components: - ChameleonDisguise # no becoming kleiner - - InsideEntityStorage # no clark kent going in phone booth and becoming superman - MindContainer # no - Pda # PDAs currently make you invisible /!\ - polymorph: - entity: ChameleonDisguise + disguiseProto: ChameleonDisguise - type: entity categories: [ HideSpawnMenu ] - parent: BaseMob id: ChameleonDisguise name: Urist McKleiner components: @@ -33,20 +30,11 @@ - type: Sprite sprite: /Textures/Mobs/Species/Human/parts.rsi state: full - # so people can attempt to pick it up - - type: Item - # so it can take damage - # projector system sets health to be proportional to mass + - type: Transform + noRot: true # players rotation and anchor is used instead + - type: InteractionOutline + - type: Clickable - type: Damageable - - type: MobState - - type: MobThresholds - thresholds: - 0: Alive - 1: Critical - 200: Dead - - type: MovementSpeedModifier - baseWalkSpeed: 1 # precise movement for the perfect spot - baseSprintSpeed: 5 # the jig is up - type: ChameleonDisguise # actions @@ -57,6 +45,7 @@ components: - type: InstantAction icon: Interface/VerbIcons/refresh.svg.192dpi.png + itemIconStyle: BigAction event: !type:DisguiseToggleNoRotEvent - type: entity @@ -68,4 +57,5 @@ icon: sprite: Objects/Tools/wrench.rsi state: icon + itemIconStyle: BigAction event: !type:DisguiseToggleAnchoredEvent From 84338686a3aeeb6b4e12a11c3b3e5b1420ed2f25 Mon Sep 17 00:00:00 2001 From: Jezithyr Date: Fri, 8 Nov 2024 03:46:22 -0800 Subject: [PATCH 2/8] Stable Merge (#33218) --- Content.Server/Antag/AntagSelectionSystem.cs | 4 +++ .../GameTicking/Rules/TraitorRuleSystem.cs | 31 +++++++++++++++++++ .../Thief/Systems/ThiefBeaconSystem.cs | 1 - Resources/Prototypes/GameRules/roundstart.yml | 8 +++-- 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/Content.Server/Antag/AntagSelectionSystem.cs b/Content.Server/Antag/AntagSelectionSystem.cs index 224629ff2e5226..610c0ad182ada8 100644 --- a/Content.Server/Antag/AntagSelectionSystem.cs +++ b/Content.Server/Antag/AntagSelectionSystem.cs @@ -55,6 +55,8 @@ public override void Initialize() { base.Initialize(); + Log.Level = LogLevel.Debug; + SubscribeLocalEvent(OnTakeGhostRole); SubscribeLocalEvent(OnObjectivesTextGetInfo); @@ -360,6 +362,8 @@ public void MakeAntag(Entity ent, ICommonSession? sessi _role.MindAddRoles(curMind.Value, def.MindRoles, null, true); ent.Comp.SelectedMinds.Add((curMind.Value, Name(player))); SendBriefing(session, def.Briefing); + + Log.Debug($"Selected {ToPrettyString(curMind)} as antagonist: {ToPrettyString(ent)}"); } var afterEv = new AfterAntagEntitySelectedEvent(session, player, ent, def); diff --git a/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs b/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs index 8df6ed1098a55f..950795fc05ecba 100644 --- a/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs @@ -41,6 +41,8 @@ public override void Initialize() { base.Initialize(); + Log.Level = LogLevel.Debug; + SubscribeLocalEvent(AfterEntitySelected); SubscribeLocalEvent(OnObjectivesTextPrepend); } @@ -53,6 +55,7 @@ protected override void Added(EntityUid uid, TraitorRuleComponent component, Gam private void AfterEntitySelected(Entity ent, ref AfterAntagEntitySelectedEvent args) { + Log.Debug($"AfterAntagEntitySelected {ToPrettyString(ent)}"); MakeTraitor(args.EntityUid, ent); } @@ -78,14 +81,22 @@ public string[] GenerateTraitorCodewords(TraitorRuleComponent component) public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component) { + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - start"); + //Grab the mind if it wasn't provided if (!_mindSystem.TryGetMind(traitor, out var mindId, out var mind)) + { + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - failed, no Mind found"); return false; + } var briefing = ""; if (component.GiveCodewords) + { + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - added codewords flufftext to briefing"); briefing = Loc.GetString("traitor-role-codewords-short", ("codewords", string.Join(", ", component.Codewords))); + } var issuer = _random.Pick(_prototypeManager.Index(component.ObjectiveIssuers).Values); @@ -94,6 +105,7 @@ public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component) if (component.GiveUplink) { + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Uplink start"); // Calculate the amount of currency on the uplink. var startingBalance = component.StartingBalance; if (_jobs.MindTryGetJob(mindId, out var prototype)) @@ -105,18 +117,27 @@ public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component) } // Choose and generate an Uplink, and return the uplink code if applicable + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Uplink request start"); var uplinkParams = RequestUplink(traitor, startingBalance, briefing); code = uplinkParams.Item1; briefing = uplinkParams.Item2; + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Uplink request completed"); } string[]? codewords = null; if (component.GiveCodewords) + { + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - set codewords from component"); codewords = component.Codewords; + } if (component.GiveBriefing) + { _antag.SendBriefing(traitor, GenerateBriefing(codewords, code, issuer), null, component.GreetSoundNotification); + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Sent the Briefing"); + } + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Adding TraitorMind"); component.TraitorMinds.Add(mindId); // Assign briefing @@ -126,9 +147,14 @@ public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component) _roleSystem.MindHasRole(mindId, out var traitorRole); if (traitorRole is not null) { + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Add traitor briefing components"); AddComp(traitorRole.Value.Owner); Comp(traitorRole.Value.Owner).Briefing = briefing; } + else + { + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - did not get traitor briefing"); + } // Send codewords to only the traitor client var color = TraitorCodewordColor; // Fall back to a dark red Syndicate color if a prototype is not found @@ -137,9 +163,11 @@ public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component) _roleCodewordSystem.SetRoleCodewords(codewordComp, "traitor", component.Codewords.ToList(), color); // Change the faction + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Change faction"); _npcFaction.RemoveFaction(traitor, component.NanoTrasenFaction, false); _npcFaction.AddFaction(traitor, component.SyndicateFaction); + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Finished"); return true; } @@ -148,10 +176,12 @@ public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component) var pda = _uplink.FindUplinkTarget(traitor); Note[]? code = null; + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Uplink add"); var uplinked = _uplink.AddUplink(traitor, startingBalance, pda, true); if (pda is not null && uplinked) { + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Uplink is PDA"); // Codes are only generated if the uplink is a PDA code = EnsureComp(pda.Value).Code; @@ -163,6 +193,7 @@ public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component) } else if (pda is null && uplinked) { + Log.Debug($"MakeTraitor {ToPrettyString(traitor)} - Uplink is implant"); briefing += "\n" + Loc.GetString("traitor-role-uplink-implant-short"); } diff --git a/Content.Server/Thief/Systems/ThiefBeaconSystem.cs b/Content.Server/Thief/Systems/ThiefBeaconSystem.cs index de1c3d2e6d1981..4c65ba5c449a31 100644 --- a/Content.Server/Thief/Systems/ThiefBeaconSystem.cs +++ b/Content.Server/Thief/Systems/ThiefBeaconSystem.cs @@ -20,7 +20,6 @@ public sealed class ThiefBeaconSystem : EntitySystem [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly MindSystem _mind = default!; [Dependency] private readonly SharedRoleSystem _roles = default!; - public override void Initialize() { base.Initialize(); diff --git a/Resources/Prototypes/GameRules/roundstart.yml b/Resources/Prototypes/GameRules/roundstart.yml index cec5c9ee093174..6ca322d0d5f731 100644 --- a/Resources/Prototypes/GameRules/roundstart.yml +++ b/Resources/Prototypes/GameRules/roundstart.yml @@ -191,12 +191,17 @@ - type: entity id: TraitorReinforcement - parent: Traitor + parent: BaseTraitorRule components: - type: TraitorRule giveUplink: false giveCodewords: false # It would actually give them a different set of codewords than the regular traitors, anyway giveBriefing: false + - type: AntagSelection + definitions: + - prefRoles: [ Traitor ] + mindRoles: + - MindRoleTraitor - type: entity id: Revolutionary @@ -280,7 +285,6 @@ tableId: CalmPestEventsTable - !type:NestedSelector tableId: SpicyPestEventsTable - - type: entityTable id: SpaceTrafficControlTable From fea5769cc5064e6ad5d51afbcdcdbe0d6575a221 Mon Sep 17 00:00:00 2001 From: Boaz1111 <149967078+Boaz1111@users.noreply.github.com> Date: Fri, 8 Nov 2024 15:50:14 +0100 Subject: [PATCH 3/8] dark green jumpsuit recolor, casual green jumpsuits added (#31710) * green * fix material arbitrage * lighter --- .../Catalog/Cargo/cargo_vending.yml | 2 +- .../Inventories/clothesmate.yml | 2 ++ .../Clothing/Uniforms/color_jumpskirts.yml | 8 ++--- .../Clothing/Uniforms/color_jumpsuits.yml | 8 ++--- .../Entities/Clothing/Uniforms/jumpskirts.yml | 30 +++++++++++++++++++ .../Entities/Clothing/Uniforms/jumpsuits.yml | 30 +++++++++++++++++++ 6 files changed, 71 insertions(+), 9 deletions(-) diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml index 5dae53f8edec1c..86da8fb940e01f 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: 2400 + cost: 2440 category: cargoproduct-category-name-service group: market diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml index 54a6ae2a194a8c..a069833759d703 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml @@ -53,6 +53,8 @@ ClothingUniformJumpskirtCasualPurple: 2 ClothingUniformJumpsuitCasualRed: 2 ClothingUniformJumpskirtCasualRed: 2 + ClothingUniformJumpsuitCasualGreen: 2 + ClothingUniformJumpskirtCasualGreen: 2 # DO NOT ADD MORE, USE UNIFORM DYING ClothingShoesColorBlack: 8 ClothingShoesColorBrown: 4 diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/color_jumpskirts.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/color_jumpskirts.yml index a2bf6b687a923d..3f48b0260fc7df 100644 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/color_jumpskirts.yml +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/color_jumpskirts.yml @@ -222,24 +222,24 @@ sprite: Clothing/Uniforms/Jumpskirt/color.rsi layers: - state: icon - color: "#79CC26" + color: "#007923" - state: trinkets-icon - type: Item inhandVisuals: left: - state: inhand-left - color: "#79CC26" + color: "#007923" - state: trinkets-inhand-left right: - state: inhand-right - color: "#79CC26" + color: "#007923" - state: trinkets-inhand-right - type: Clothing sprite: Clothing/Uniforms/Jumpskirt/color.rsi clothingVisuals: jumpsuit: - state: equipped-INNERCLOTHING - color: "#79CC26" + color: "#007923" - state: trinkets-equipped-INNERCLOTHING # Orange Jumpskirt diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/color_jumpsuits.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/color_jumpsuits.yml index f56afabeac1a07..7a44409079bb7d 100644 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/color_jumpsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/color_jumpsuits.yml @@ -222,24 +222,24 @@ sprite: Clothing/Uniforms/Jumpsuit/color.rsi layers: - state: icon - color: "#79CC26" + color: "#007923" - state: trinkets-icon - type: Item inhandVisuals: left: - state: inhand-left - color: "#79CC26" + color: "#007923" - state: trinkets-inhand-left right: - state: inhand-right - color: "#79CC26" + color: "#007923" - state: trinkets-inhand-right - type: Clothing sprite: Clothing/Uniforms/Jumpsuit/color.rsi clothingVisuals: jumpsuit: - state: equipped-INNERCLOTHING - color: "#79CC26" + color: "#007923" - state: trinkets-equipped-INNERCLOTHING # Orange Jumpsuit diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml index 9a91f92715737d..c4850954cd701b 100644 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml @@ -822,6 +822,36 @@ - state: equipped-INNERCLOTHING-shirt color: "#b30000" +- type: entity + parent: ClothingUniformSkirtBase + id: ClothingUniformJumpskirtCasualGreen + name: casual green jumpskirt + description: A loose worn green shirt with a grey skirt, perfect for someone looking to relax. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/casual.rsi + layers: + - state: icon-jumpskirt + - state: icon-shirt + color: "#00661D" + - type: Item + inhandVisuals: + left: + - state: inhand-left-jumpskirt + - state: inhand-left-shirt + color: "#00661D" + right: + - state: inhand-right-jumpskirt + - state: inhand-right-shirt + color: "#00661D" + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/casual.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING-jumpskirt + - state: equipped-INNERCLOTHING-shirt + color: "#00661D" + - type: entity parent: ClothingUniformSkirtBase id: ClothingUniformJumpskirtOldDress diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml index 42a0b7069d1276..ef5c1164cfdd26 100644 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml @@ -1347,6 +1347,36 @@ - state: equipped-INNERCLOTHING-shirt color: "#b30000" +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitCasualGreen + name: casual green jumpsuit + description: A loose worn green shirt with a grey pants, perfect for someone looking to relax. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpsuit/casual.rsi + layers: + - state: icon-jumpsuit + - state: icon-shirt + color: "#00661D" + - type: Item + inhandVisuals: + left: + - state: inhand-left-jumpsuit + - state: inhand-left-shirt + color: "#00661D" + right: + - state: inhand-right-jumpsuit + - state: inhand-right-shirt + color: "#00661D" + - type: Clothing + sprite: Clothing/Uniforms/Jumpsuit/casual.rsi + clothingVisuals: + jumpsuit: + - state: equipped-INNERCLOTHING-jumpsuit + - state: equipped-INNERCLOTHING-shirt + color: "#00661D" + - type: entity parent: ClothingUniformBase id: ClothingUniformJumpsuitFamilyGuy From 6ed2ab9e85bd0321dc22ea92725d32f9b1b951d5 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 8 Nov 2024 14:51:26 +0000 Subject: [PATCH 4/8] Automatic changelog update --- 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 34a2d1435847b2..485cad8e96d3c5 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: LeoSantich - changes: - - message: Updated 'narsie' and 'ratvar' to 'Nar'Sie' and 'Ratvar' in randomly generated - storybook content. - type: Tweak - id: 7099 - time: '2024-08-12T23:20:53.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/30954 - author: pigeonpeas changes: - message: Added non command mantle into the winterdrobe @@ -3949,3 +3941,10 @@ id: 7598 time: '2024-11-07T22:02:25.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/33065 +- author: Boaz1111 + changes: + - message: Added casual green jumpsuits and skirts to the clothesmate. + type: Add + id: 7599 + time: '2024-11-08T14:50:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/31710 From 41b84fc29dbca40704627cbe6eb44a1d8791d30b Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Fri, 8 Nov 2024 22:59:27 +0100 Subject: [PATCH 5/8] Label workflow - stable (#33220) --- .github/workflows/labeler-stable.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .github/workflows/labeler-stable.yml diff --git a/.github/workflows/labeler-stable.yml b/.github/workflows/labeler-stable.yml new file mode 100644 index 00000000000000..491d6a76fad509 --- /dev/null +++ b/.github/workflows/labeler-stable.yml @@ -0,0 +1,16 @@ +name: "Labels: Branch stable" + +on: + pull_request_target: + types: + - opened + branches: + - 'stable' + +jobs: + add_label: + runs-on: ubuntu-latest + steps: + - uses: actions-ecosystem/action-add-labels@v1 + with: + labels: "Branch: stable" From b9685850faaa1a14f8340cb44e7c48a7d8d13fb6 Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Fri, 8 Nov 2024 22:59:38 +0100 Subject: [PATCH 6/8] Label workflow - staging (#33221) --- .github/workflows/labeler-staging.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 .github/workflows/labeler-staging.yml diff --git a/.github/workflows/labeler-staging.yml b/.github/workflows/labeler-staging.yml new file mode 100644 index 00000000000000..e31a5a482f2db5 --- /dev/null +++ b/.github/workflows/labeler-staging.yml @@ -0,0 +1,16 @@ +name: "Labels: Branch staging" + +on: + pull_request_target: + types: + - opened + branches: + - 'staging' + +jobs: + add_label: + runs-on: ubuntu-latest + steps: + - uses: actions-ecosystem/action-add-labels@v1 + with: + labels: "Branch: staging" From 1e368ae30076606501332f34ab786c14e25c477a Mon Sep 17 00:00:00 2001 From: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Date: Sat, 9 Nov 2024 01:28:24 +0100 Subject: [PATCH 7/8] Add a Walking alert (#32954) * Initial commit * Review feedback changes * ProtoId * TempCommit * First attempt to have client alerts * Review changes --- Content.Client/Alerts/ClientAlertsSystem.cs | 15 ++++++++++----- .../Physics/Controllers/MoverController.cs | 16 ++++++++++++++++ Content.Server/Alert/ServerAlertsSystem.cs | 12 ++++++++++++ Content.Shared/Alert/AlertsComponent.cs | 16 ++++++++++++++-- .../Systems/SharedMoverController.Input.cs | 6 +++++- Resources/Locale/en-US/alerts/alerts.ftl | 3 +++ Resources/Prototypes/Alerts/alerts.yml | 9 +++++++++ .../Interface/Alerts/walking.rsi/meta.json | 14 ++++++++++++++ .../Interface/Alerts/walking.rsi/walking.png | Bin 0 -> 15838 bytes 9 files changed, 83 insertions(+), 8 deletions(-) create mode 100644 Resources/Textures/Interface/Alerts/walking.rsi/meta.json create mode 100644 Resources/Textures/Interface/Alerts/walking.rsi/walking.png diff --git a/Content.Client/Alerts/ClientAlertsSystem.cs b/Content.Client/Alerts/ClientAlertsSystem.cs index 525ef1f018fc9c..c5ec254c0ccc5e 100644 --- a/Content.Client/Alerts/ClientAlertsSystem.cs +++ b/Content.Client/Alerts/ClientAlertsSystem.cs @@ -2,6 +2,7 @@ using Content.Shared.Alert; using JetBrains.Annotations; using Robust.Client.Player; +using Robust.Shared.GameStates; using Robust.Shared.Player; using Robust.Shared.Prototypes; @@ -24,8 +25,7 @@ public override void Initialize() SubscribeLocalEvent(OnPlayerAttached); SubscribeLocalEvent(OnPlayerDetached); - - SubscribeLocalEvent(ClientAlertsHandleState); + SubscribeLocalEvent(OnHandleState); } protected override void LoadPrototypes() { @@ -47,17 +47,22 @@ public IReadOnlyDictionary? ActiveAlerts } } - protected override void AfterShowAlert(Entity alerts) + private void OnHandleState(Entity alerts, ref ComponentHandleState args) { + if (args.Current is not AlertComponentState cast) + return; + + alerts.Comp.Alerts = cast.Alerts; + UpdateHud(alerts); } - protected override void AfterClearAlert(Entity alerts) + protected override void AfterShowAlert(Entity alerts) { UpdateHud(alerts); } - private void ClientAlertsHandleState(Entity alerts, ref AfterAutoHandleStateEvent args) + protected override void AfterClearAlert(Entity alerts) { UpdateHud(alerts); } diff --git a/Content.Client/Physics/Controllers/MoverController.cs b/Content.Client/Physics/Controllers/MoverController.cs index c97110b208e58f..d2ac0cdefdc131 100644 --- a/Content.Client/Physics/Controllers/MoverController.cs +++ b/Content.Client/Physics/Controllers/MoverController.cs @@ -1,9 +1,12 @@ +using Content.Shared.Alert; +using Content.Shared.CCVar; using Content.Shared.Movement.Components; using Content.Shared.Movement.Pulling.Components; using Content.Shared.Movement.Systems; using Robust.Client.GameObjects; using Robust.Client.Physics; using Robust.Client.Player; +using Robust.Shared.Configuration; using Robust.Shared.Physics.Components; using Robust.Shared.Player; using Robust.Shared.Timing; @@ -14,6 +17,8 @@ public sealed class MoverController : SharedMoverController { [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; + [Dependency] private readonly AlertsSystem _alerts = default!; + [Dependency] private readonly IConfigurationManager _cfg = default!; public override void Initialize() { @@ -135,4 +140,15 @@ protected override bool CanSound() { return _timing is { IsFirstTimePredicted: true, InSimulation: true }; } + + public override void SetSprinting(Entity entity, ushort subTick, bool walking) + { + // Logger.Info($"[{_gameTiming.CurTick}/{subTick}] Sprint: {enabled}"); + base.SetSprinting(entity, subTick, walking); + + if (walking && _cfg.GetCVar(CCVars.ToggleWalk)) + _alerts.ShowAlert(entity, WalkingAlert, showCooldown: false, autoRemove: false); + else + _alerts.ClearAlert(entity, WalkingAlert); + } } diff --git a/Content.Server/Alert/ServerAlertsSystem.cs b/Content.Server/Alert/ServerAlertsSystem.cs index b7b80f732105b1..5af2b0621883ba 100644 --- a/Content.Server/Alert/ServerAlertsSystem.cs +++ b/Content.Server/Alert/ServerAlertsSystem.cs @@ -1,7 +1,19 @@ using Content.Shared.Alert; +using Robust.Shared.GameStates; namespace Content.Server.Alert; internal sealed class ServerAlertsSystem : AlertsSystem { + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnGetState); + } + + private void OnGetState(Entity alerts, ref ComponentGetState args) + { + args.State = new AlertComponentState(alerts.Comp.Alerts); + } } diff --git a/Content.Shared/Alert/AlertsComponent.cs b/Content.Shared/Alert/AlertsComponent.cs index 05b11e19efbaa5..16827e9cdff1f3 100644 --- a/Content.Shared/Alert/AlertsComponent.cs +++ b/Content.Shared/Alert/AlertsComponent.cs @@ -1,4 +1,5 @@ using Robust.Shared.GameStates; +using Robust.Shared.Serialization; namespace Content.Shared.Alert; @@ -6,12 +7,23 @@ namespace Content.Shared.Alert; /// Handles the icons on the right side of the screen. /// Should only be used for player-controlled entities. /// -[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] +// Component is not AutoNetworked due to supporting clientside-only alerts. +// Component state is handled manually to avoid the server overwriting the client list. +[RegisterComponent, NetworkedComponent] public sealed partial class AlertsComponent : Component { [ViewVariables] - [AutoNetworkedField] public Dictionary Alerts = new(); public override bool SendOnlyToOwner => true; } + +[Serializable, NetSerializable] +public sealed class AlertComponentState : ComponentState +{ + public Dictionary Alerts { get; } + public AlertComponentState(Dictionary alerts) + { + Alerts = alerts; + } +} diff --git a/Content.Shared/Movement/Systems/SharedMoverController.Input.cs b/Content.Shared/Movement/Systems/SharedMoverController.Input.cs index 9dda249423e2e0..c11df709f631ba 100644 --- a/Content.Shared/Movement/Systems/SharedMoverController.Input.cs +++ b/Content.Shared/Movement/Systems/SharedMoverController.Input.cs @@ -1,4 +1,5 @@ using System.Numerics; +using Content.Shared.Alert; using Content.Shared.CCVar; using Content.Shared.Follower.Components; using Content.Shared.Input; @@ -8,6 +9,7 @@ using Robust.Shared.Input; using Robust.Shared.Input.Binding; using Robust.Shared.Player; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Timing; using Robust.Shared.Utility; @@ -21,6 +23,8 @@ public abstract partial class SharedMoverController { public bool CameraRotationLocked { get; set; } + public static ProtoId WalkingAlert = "Walking"; + private void InitializeInput() { var moveUpCmdHandler = new MoverDirInputCmdHandler(this, Direction.North); @@ -460,7 +464,7 @@ private void ResetSubtick(InputMoverComponent component) component.LastInputSubTick = 0; } - public void SetSprinting(Entity entity, ushort subTick, bool walking) + public virtual void SetSprinting(Entity entity, ushort subTick, bool walking) { // Logger.Info($"[{_gameTiming.CurTick}/{subTick}] Sprint: {enabled}"); diff --git a/Resources/Locale/en-US/alerts/alerts.ftl b/Resources/Locale/en-US/alerts/alerts.ftl index 37af416c3a1758..1748798beaef34 100644 --- a/Resources/Locale/en-US/alerts/alerts.ftl +++ b/Resources/Locale/en-US/alerts/alerts.ftl @@ -27,6 +27,9 @@ alerts-weightless-desc = Gravity has ceased affecting you, and you're floating around aimlessly. Find something sturdy to hold onto, or throw or shoot something in a direction opposite of you. Mag-boots or jetpacks would help you move with more control. +alerts-walking-name = Walking +alerts-walking-desc = You are walking, moving at a slow pace. + alerts-stunned-name = [color=yellow]Stunned[/color] alerts-stunned-desc = You're [color=yellow]stunned[/color]! Something is impairing your ability to move or interact with objects. diff --git a/Resources/Prototypes/Alerts/alerts.yml b/Resources/Prototypes/Alerts/alerts.yml index 80fcc44a559e02..859f223730bad5 100644 --- a/Resources/Prototypes/Alerts/alerts.yml +++ b/Resources/Prototypes/Alerts/alerts.yml @@ -13,6 +13,7 @@ - alertType: Ensnared - category: Buckled - alertType: Pulling + - alertType: Walking - category: Piloting - alertType: Corporeal - alertType: Stun @@ -126,6 +127,14 @@ name: alerts-weightless-name description: alerts-weightless-desc +- type: alert + id: Walking + icons: + - sprite: /Textures/Interface/Alerts/walking.rsi + state: walking + name: alerts-walking-name + description: alerts-walking-desc + - type: alert id: Stun icons: diff --git a/Resources/Textures/Interface/Alerts/walking.rsi/meta.json b/Resources/Textures/Interface/Alerts/walking.rsi/meta.json new file mode 100644 index 00000000000000..88238a60e32cc9 --- /dev/null +++ b/Resources/Textures/Interface/Alerts/walking.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Created by SlamBamActionman", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "walking" + } + ] +} diff --git a/Resources/Textures/Interface/Alerts/walking.rsi/walking.png b/Resources/Textures/Interface/Alerts/walking.rsi/walking.png new file mode 100644 index 0000000000000000000000000000000000000000..a0169368a6051afd1675f6f2cd17a06b7dfa3d4e GIT binary patch literal 15838 zcmeI3e~c968OPtlXwN%ABcx}W8rJ0`2+q#0ox9uV?vm^6;hwN~Jr?eWY3l6EySGzz zXV#tB+vQ5r<45sKt08JCA=*&*qZ%8qS|SPrilSmF#r9eXE!NhW6tO@oDTT(`clPJp zdwXwawQ1VCo9vJ0ectc$%zU2reP;HLd9Z)^T{Bxg-vR)b*%yrrpl^@!ZoUqETBD;E z(bx6a=xPgq*4fUx32b}f7687uRgVwZL$PJDYG!R~+MWa) z){T(&{Jw);kFJHhgHnu(WqV*skB;WxiqYk9b##py(7cPoEy1FU0%V}Ac#4^{Vadgi zw-i@Kznx*$>nTmK*Mz*?PD0O6tl!gP=AcLNbucQ|(dp?7_;{(a)8BcgN8osgaT2dZ}EUBbJR>+&O?X1kQg+jqs5PfEDnB@b30LuxiATVeK zW34r8rN|i8ymF9goCvhkoSwCH)9^TPm4unMLtd|wsP?LyS0-CaWLOn;h$355vMlf8 z*hV5vt!c9PT)K2K1u22x2 ztK5@=if!iNrkM_xS6P1*p{J*(w5mJ{26aO-3)US$7MIlPU5^GMiVed8C-@m2Ek+^E zcgegYOMyk4Aak56NO>j}BW7xPa&3bc5-0P5JBDi}9s}(kO|g}$isGK@ileD=(#&NP zJFI7vVaR5U;UHTdbj_@-D!Io@n>ln?Ff0byM#C;uX{E`1hGi>;3i~2qG~m;9O%?<` zA&F`y6X26cMoaqrOhOS=rb7@FG091iUx6ivv6x#vC3M78^UiLmgw{}KuFKC!9cqFR z{er}ZUH&en3kH%5pMXh;gOKY`%Jo5^UGgcR@5$+?(rsxTv~y)eb-Gztbv6Xlg6yQx z`eD_S6`4M@fLBMk9N#6MK1U%14bp}xhbqmQK8R%|?Shhn-NR^2T+LoDN1ZIg!v|TX z`=|B)Kp`w;X}ss{+B9ubsg}NZJ;v~OzojT=SD(C{TKBD zrPTNMAUkEOzGlkvhnzl|&X?wQ3LJW|yz^O+y4|>RHCgI*tlp^^<7cB!1Z zo${r41-dbZ;SNa>r67wBSy$6M#W;$Bp48~NpX?+U|xy~141?_E;1j?OL1X9 z$R@=_=7V`DE({3Sq`1g@FfYZ00U?_d7nu*{rMNI4WRv0|^TE6n7Y2lEQe0#{n3v+h zfRIg!i_8b}Qd}4ivPp4~`Cwj(3j;znDK0V}%u8`$K*%P=MdpKfDJ~2M*`&D0d@wJ? zg#jU(6c?Ef=B2nWAY_x`BJ;t#6c+}BY*JigKA4x{!hn!Xii^w#^HN+G5VA>ek@;X= ziVFimHYqMLAIwW}VL-?x#YN_Wc_}Uo2-zg!YN(@YrOZ@mFPiSj~X3_ z0Wf+y0Am{gxco8tJ_A6W1K|Dp0Fbu=&}KgJ)gwy)Xgbsv>5dmqeJ~g@H}ua5`EP9= zITUT5H7kE+;``Q#f6TbxE(qBq~Y{&s!c?73~{e*d<0>>JISZu;Yk#+JXlG~@MK4>9LAZc`rl`vb3CSa*El z+V5Rz4ldk&wD-)c9dQ8CgRQ=se#?x{|Jk>$(cABNXww59oim%3z1DNvg#+AW<>RBV z!;yu@?>)WcNAV`Bu=z}J!G%?0tFIk>=IibI{?xMW##Or+?N>9l1uulsgWsNeY0)oF zeL4N(fv4|(=h@%=(6&T){?r&%m7CQF5ek706Lbt_iVm&;>yXJSM)!( z;}36M@jSO9xpTv@)Xn#6`2cLcGh1a(~-MYVhS+Mou zs>kOneQ%y;zcu!oajo~r$e!k-^A~+BdibYJbCyDID0$$OI(DdY6 z?IT9}cW?VM`^-ctcy=uD;razfhsIKy`-V<$IXUisxjk;|-}U&ZU4OeWd~r8eHxslQ Y?{3(5<%x0U3GBY!<&j-qx^Kfj0jgnaeE Date: Fri, 8 Nov 2024 23:56:16 -0600 Subject: [PATCH 8/8] The Jumpsuit Re-Detailening (#33096) * jumpsuit detailening * jumpskirt stuff * meta.json * update meta.json * meta.json fix fix * meta.json fix fix fix --- .../color.rsi/equipped-INNERCLOTHING.png | Bin 518 -> 1068 bytes .../Uniforms/Jumpskirt/color.rsi/icon.png | Bin 300 -> 429 bytes .../Jumpskirt/color.rsi/inhand-left.png | Bin 391 -> 435 bytes .../Jumpskirt/color.rsi/inhand-right.png | Bin 408 -> 424 bytes .../Uniforms/Jumpskirt/color.rsi/meta.json | 2 +- .../color.rsi/prisoner-inhand-left.png | Bin 258 -> 221 bytes .../color.rsi/prisoner-inhand-right.png | Bin 259 -> 232 bytes .../trinkets-equipped-INNERCLOTHING.png | Bin 274 -> 292 bytes .../color.rsi/equipped-INNERCLOTHING.png | Bin 540 -> 1314 bytes .../Uniforms/Jumpsuit/color.rsi/icon.png | Bin 293 -> 387 bytes .../Jumpsuit/color.rsi/inhand-left.png | Bin 391 -> 451 bytes .../Jumpsuit/color.rsi/inhand-right.png | Bin 408 -> 437 bytes .../Uniforms/Jumpsuit/color.rsi/meta.json | 2 +- .../prisoner-equipped-INNERCLOTHING.png | Bin 365 -> 413 bytes .../Jumpsuit/color.rsi/prisoner-icon.png | Bin 232 -> 188 bytes .../color.rsi/prisoner-inhand-left.png | Bin 258 -> 221 bytes .../trinkets-equipped-INNERCLOTHING.png | Bin 265 -> 295 bytes .../Jumpsuit/color.rsi/trinkets-icon.png | Bin 235 -> 206 bytes .../color.rsi/trinkets-inhand-left.png | Bin 245 -> 198 bytes .../color.rsi/trinkets-inhand-right.png | Bin 251 -> 212 bytes 20 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/equipped-INNERCLOTHING.png index 3faba7285ff1b3898e47a23c7299d33e20a05c0c..4df4336458d688a519f10685058a3b070ab2c6a3 100644 GIT binary patch delta 1058 zcmV+-1l{|F1gr><8Gi-<0063Kaozv`00DDSM?wIu&K&6g00ZVpL_t(|ob8%1Z=*aM z#-BUA%Gg|^h=C={X@)R{&K)B14Kj4B1YNsiB6C-$)GqLZmZq4(dzbh8TS{!~=kXtGQ`>+*AP@)y0)gP~s;UA2PESu++2wMX z0)X%PxV*gNs*_irUYn-L(jCWP*Sz}w@QCZW4gl~x58LgQnOQ6r&~+WMECWE=L=X(a zV8NGVIoD`i*AYb#yYJ@are1y9w$m)D)he}ZJKb)#scqZoYPHJcXP;CP`jmeODNL_b zpNhY2Bn?7QdVifJK5BfCrz%1CUe<``c_4(a--@C@*L5h0!qNyK@H~&BdF62&C#PQo zAtcu|%CL6~ux&dvO_NpX`#v;HWBJ*}(|l_7Wsv&PctFRUtUjZl<93 z*7+sUqOq<-nHYQ0o?c6J5;?`8qubzrhAtM-3}n$qVsYVC1;Mjsfj8E zsz9}7vsvo8ZrbbhFdmOlH3+3K3?p@2H@6K!043-|u5Ooubp}u+5O{nS`vzGH{Op*>!okG_7eGG)>Fx5I02> zMNBX2;jOo_aBYrK16h(JLA%}N7OsONN!T?#B*6=J0DRxa-Q694U4Oi~xL@c;k-07*qoM6N<$f(GCBdjJ3c delta 503 zcmV3N*fjv{wa9X60AS-DhUkUyv!VvT=5P>efR2AM1$530cm~jt5pnRIZs|4gTo^ZaviP69J# z%$V`t@snb#wf0g<09LD2?|VERJ%DqL&1RDn^EV~AQVJmi&VM<&uJhq@&LM0~Ihd}5gvsj>%0!bwR*b+pKp}Aed&(1#(l2T$4FQI4x!06nk=qD4{7KN8m(zfl}F+814ESF2R zMG;+v=x!};LD%awz{3;(91e$I8yz?4=^PSyp-YZ8V;9DZ3q&>o*Z1rrWdHyG07*qo IM6N<$f?D0eqyPW_ delta 284 zcmZ3>yoPClWIZzj1B1(wu46!ou{g-xiDBJ2nU_EgOS+@4BLl<6e(pbstU$hKfKQ0) zlqpj#UcC7K|Nk2|ZiI%0zIgEhC=>HgiU~-umjw9*1Eqj~LCTxi4JgD};1OBOz`%D9 zgc)~C%zg_L?DceU46*Qk+waJCRDq-3W#X#u_C@S1`b$iFr~Cff!7zti=`8!-#--s5 zro6hQtxdC{#A2+~)7o5l4Yx&x#B+R97G(I!x0H*ad`sH`*_(M^UYx(JB);Ig9K%W< zd!a+@NAKTV#Ij>em}&ygG0Adi}P8aP|Rg;0-=rVd}}Vrjq^N}vFcIn#u5h`b^!KZ_X%MDM$-*1LKdVVlb%0ssI2 z000000Du_A7~eFFpIVR28?QA@<74v+kLwcitMd6VP=X5&i6(*7~_q zVg0Z3=6vl9$n*Szh&&OI*81i5vMh)HJ3Vg=%Lxd>jCUt|-#RRJ-jdxXAb30;)V3`p zNkUncQB_sc_kTUrb$yAvLn)=6FR7_drPQVu7I)r~-B&;<<{7;&u^zP8yd24oG zfubnFeViR=%bn%U0{{R3000000D%8ts*S#Ed(3UFjgD!L*}B2AjoawUw#VGK+vD4w z0Iv3!ts6WGcYA!x6TsOX-|hqiw`z~Makj^|y8_(p@g4210NP^!;PedyoxtVqGpvyS O0000AKt5&T#cI?=!S+jsjrc_^<1f;l1g8YL2!vMpkGdkyi zqMQXDk;M!Qe1}1p@p%4<6rkW8&w3ZfkO=p;Q!ny0EAY5>uaN%#|8Vxglxz1?%c^I3 z`YWB&wr~Okiws(4PNrU-+R_;Wth&tcxkht)|MVYiG~HIyp~EiK8>At zRzy5-ZH|V`zW9YXOe{td|0l56&2DhH_IPVwe!#K?8BcdE*T46Df73~M*5xNPq<`cT zEIzpGJku!=l?R(YrLx)uA6U0-uH2T}J2j*iB)57vaGXlTFs`|H7<^X{$x>J)ojohz*4*wwnLrWNQ=44wf1mMO^02{? z6Ed+^_C&otUaz?6`>L&ej~KqZdvZ62aqZU0LG%7CoFcSRD%MXn%j6s?N~TVE~8&U=ZpQn*i<`(cFbptFP;tzeFjfgKbLh*2~7Y<8o3$( delta 393 zcmZ3%JcD_HWIZzj1H;_yjcNS%G|&0G|-o z-Me?+xpU|K{rms^{kwVd=KT5dXU&?mYSpS^$Bupa^y%EWb3la)=GzGZDV~xbzu^A} zz#w!VEX`Tq5n0T@z;_sg8IRZJuSfx^e(LGs7!u+BcIs`uW(5J4=}KF#{{Mgfoziqy z;kmu~W;Z8`OyN@(kZ-#-d&dFRChiyo8@CC|8*XYmF|@xvGwybWgx9LHZiP)#omyA| z{cdflTqIFx`k^BCMtZk{*bjaWgS68cab+~T}>{$}Uqx80$QI#De3y1UPI zng!KatM6^k5&bat2RrAn981qxFP)7y)z3e=t`=k&(9T1fS$;~cdC}Gtt+i`0Yg^a5 zFI$!_5{)`Adw+zhc1T24IivQj#g}XTvF6@5rZD3jr;g}dNtO!N@-L0LqIV7M{Wx)- d``TCb|8dKCXYUd31^Sr5)78&qofA_+6982YvkCwJ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/meta.json index 7e6832bd12c083..82edfe13a027bc 100644 --- a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/meta.json +++ b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.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/c838ba21dae97db345e0113f99596decd1d66039 and modified by Flareguy for Space Station 14", + "copyright": "Taken from vgstation at commit https://github.com/vgstation-coders/vgstation13/commit/993de554ecfc30cc45f8340819c5a60ef1eee7e1 and modified by Flareguy & P3MOIRA, with the lower half of the jumpskirt taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039 and modified by Flareguy for SS14.", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/prisoner-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/prisoner-inhand-left.png index f6ff6866ffc359196192cec6c75f0631f2a399a3..6b40ed5af0ec63d3f482b5c3e6a081aa1a2c7e7a 100644 GIT binary patch delta 180 zcmZo-y307huztFyi(^Q|oVPa*ayC1Nuw39=BA|P8_0ot1Z!^@N2{6T_+D|(Aol7F| z|ASN^1`wF{I8@Yx=kP?8#};Yxp09a5EBE#!mEZf~|M`{PTRSb)@}K4VH?g86`ywX! zTrLSQU7++n%+_?lANdJ2>%Z*|yL7E#l?~XOhU2fx5?|_8*{-{`Np{-W!{x6*%u5Y< e@u#YI7|z-~NsBsI%(`PSNU^7@pUXO@geCwL#Zun@ delta 217 zcmcc1*u*r!u%0E|(btiIVPik{pF~y$1_sUokH}&M2EM}}%y>M1MG8=Gx~Gd{NJZS+ zn;UtX4Fp&(oK_2{5_L;-2wQk$wu+J0k}aI#Dv!R;($<-)`?K60sDXiDf&BL8HaQY) z)w3U495eCVsNRxE*0`eH>RB!N(B= OQtIjI=d#Wzp$PyZ8d#eE diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/prisoner-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/prisoner-inhand-right.png index 45393e81a66103898d2e33673dc0c227824b4f29..e43a9b42dbcce7413e0191765e4d201a3f8cf80e 100644 GIT binary patch delta 191 zcmZo>dciosuzr!Ji(^Q|oVPa*axxi;xL(wb@K`qGrk|#!!CRHNM_M`bc#N{#gx}w+ zW9mPzKAU}#iYEvy`CpjD>%<|N5Gl4TS9z(+Imw0~ug`b4mzo!*R?=B2D>@s&$ugou^%X1y*>9(emq0Z#Bhj77L!z77VMUqd{OH0I=9!{(X-xu qP+n|$EcR>>qyAsU1ZHi|ODuYMrcnpqS4)O40D-5gpUXO@geCwN{!(QC delta 218 zcmaFC*vvG+u%0E|(btiIVPik{pF~y$1_sUokH}&M2EM}}%y>M1MG8=GhNp{TNJZS+ zn;UtX4Fp&(oK_2{5_L;-2wP|}TgAw06^Eva;>phMv$S=h)nAv}19dPkJh0LG{&UIe zUD>m1?;khdG4u_-5_NrZYNXlwzo!=d?t8q$Zr;&(wZZXT4w|aZD*Yxm^uMou#bWX{ zTz>z}KgCS5cz!d1&8fM&?%0zHY-Y1_Y9CJ9E<9nOq1~00!WS|U7*FUuV%s|_u2lKd QbX|~APgg&ebxsLQ0Bzt{bN~PV diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/trinkets-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/color.rsi/trinkets-equipped-INNERCLOTHING.png index cee5a50d2caea42b0fc53599a92a1cc8be1a8d72..bb9dd4f505ee4ad6cf2969435ae4333f48849290 100644 GIT binary patch delta 276 zcmbQlw1jDbWIY=L1H-D!!h1l9u{g-xiDBJ2nU_G$Jx>?Mkcv5PZ|(1GHV`@f@xE(j z=6u(qOg;~~WFt=4Zr;F_#2~i7sq8evzE?{oE4g|$xZJ6=?@c{fKR-6&(`29t4ee`R z&w79L{FB#L`}Uj1iX1)tc+Rbv{&LkXcD?&z{$SJ6&lY{v^=ls|o3S3S+K_~WIZzj1H;_yjcNS%G}%0G|-o z8#iufYinm_W@cq&1qB67nKC6fIN09a9w_f;tS1koI7@>3g8xGSL$H5^5J<4VBeIx* zf$tCqGm2_>H2?*(JzX3_BC6cqUbx8BV8GG(aOUQp|NLe2@`c#)L|x|W=ayXEzv0DM z28Im`dl-D0KQe!ssmCjKdtlh%?=+^wxwSSs{4&DGoHM|SrCM!lQ nnfw07&0jb9rZF)%gnngcR;-t?v9eYM+RNbS>gTe~DWM4fWsO~T diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/equipped-INNERCLOTHING.png index 5c333dfc11811bc991f2cd4e82637351c4ead25c..2d86990cb8bf89056064b448cdff4458e5caa870 100644 GIT binary patch delta 1306 zcmV+#1?Bpj1fmL%8Gi-<0063Kaozv`00DDSM?wIu&K&6g00i7gL_t(|ob8%HZ`w!{ z$Nyce=xQs4234%;L$Oj$2^Y493it%bd;<Ep}8(Ab2rP^|tJ&>8&1QL&JSnbxo(|GK8@6Gefn}4z201*)p5fKp)5fR@f zPedNpb)9CjSpYzxP~dGloel*6(=@TWyDKD9R6i?gn#Swv^*S$$>i{A?)dmPT>ZMPQzyM%kLtQk$Kx^8 zb)EKlJ=cBbn}1q{e#SW=bL&IZ&y>%0k~v{seV9fp>ij&L{5atUuZ9?g0YV7BmSq`= zqCl2qUPlOlVHg74^G>~9cj=!8A;dK`yzpQQ&~=?^n#P5iripw$&+j`s&+ap0?}AjI zc);S0Q$H|`0Z!fhejkIuz@`5#UOlS+(Gk$^_W^v1u7B*>?{lJbIvtnX;c&=1zrMZ> zVEQ74!=dXr*6uML908VP!Llq@-C!`d_vTssL+$+FSB6Nt2OThPIgum@gb>$MAcR1Y zBt8VgT80+MA%tLSYYPA{8jWyydFiR$JUs6MoJf-78sc~B|H>E+hd4Vs3q_WY18mzy zqtOUOv40T+9DwQGgazc^-@o@I&sPj!8xj`u0Jt2nOn!O!63u24-EJ3?$pp1p z4e4~+H4;Sdyc3*-efc?^unJ^ZMtWld0C0GC_n#)nudc4pY&KnWVQqW8Fqus7+q-x7>P}BjSE4^6A|fIpA|fIpA|m4Z zMpf0&Gr&R6b)BlJ>dPMC{{gD1(qgfQR4Rp5t3@l73S~z4F~AQ@XQfi1tyYVsQYjRR zMSu8pf@f4!rL9)Wm4;?c2t6;q0H%v|e%2OICkTyzWHO0TsRUs92c}-HBa_J>m&-xZ zw3YlAxw*N4rfJCKa>!&dsMqWKZ&0aJLNb{Yk|*SV7cXA$vSAp=X0woG8Hq#!<#HLD zo0~$){UE=3g>t!!L?QuMmXXb7U1t)UHh+3SI0nqi3Fh;8H!lv3Jmw^#Qu1i0tAd2xYQEapc{ zAY!o?%!`Y;Hi_Wtgb3r04n zFhle&`lPKt0e_?fu=?KubXhDpK$pd{*ntjw4KFXTR-aUwjRI(pdP>suzv`trmx*a_}2NwTeOjugLpl_Vxu)T zB(VLNa>>=Xq{EH@T+gO;e*$3Rj+Zo!pBXU#cDAu-h=2HZ5#ItjzX9+=bam}Jz5^$j zl*N<>V2-%|S-c1%U`7m}o9vAMoEagY%i=|5ha+frZ(-b7Trvqsdn35^9&oh0{YmgU zpHELGky;aGfPch`)`SHR&jH0(% zQ%EEd|DBa3*f|&SJO`jCiui5YwgJFoIjT0s)~r{69PZ9nL>^wn@pv@lOe7MC#2?WJs_uX+ Riy;62002ovPDHLkV1n?ywvqq< delta 277 zcmZo>Udl8}{CC_9?}s@uur)p&YgYr>Yh7;uTF6Z^&~zn61oN z<`{D&TUn&Z{y@xX=(@y0foC-g(bFU)n&dsJOAbr#*WpAD%l@by zKtx1DL_|bHL_{HsF}`hEe{MZAZ@JdCtq;w6DPxRx&UtI?$$#dYa}RHN%3H2mYkf%G zHJ?&JS(YKsbIcFHIp?!13(lJ#g0pB2G zH&>SB?@dkX|DAWq*RugtReb>P08p0Y$?v<}ZvMZw=iMSQ0n=udw=+FIx>@PGYs5Z* zSc#luQ561oJbz-d*&s<0Y`0tN_j?S(fN8yHn!Dd6op+7c1Zb^M*EN(AKt5&T#cI?=!S+jsjrc_^<1f;l1g8YL2!vMpkGdkyi zqMQXDk;M!Qe1}1p@p%4<6rkW8&w3ZfkO=p;Q!ny0EAY5>uaN%#|8Vxglxz1?%c^I3 z`YWB&wr~Okiws(4PNrU-+R_;Wth&tcxkht)|MVYiG~HIyp~EiK8>At zRzy5-ZH|V`zW9YXOe{td|0l56&2DhH_IPVwe!#K?8BcdE*T46Df73~M*5xNPq<`cT zEIzpGJku!=l?R(YrLx)uA6U0-uH2T}J2j*iB)57va$0mHa*dK}bYr?KLvAHku<0L=mF^JR&a*(o@@bEKN6SMc)%VvGx!*9>BJ|kV;Mk5;s}z>rk@+FI zWXg(Fubv%SyH(F>z2ULmpTb+N-CMKVh&B52I==%yYuG-NZi;&Se)jj*D=SUjA1`@W zV6lg>fMLPbd9@2)@A|kee!J=WM=U?iUcUT!esE=FzW2SW`w!G_tS~B#-F^9G%O;&b z5!P?NZGY`MZopIj;dSn9HDlK3PwV^|g1CGyJ8(2U{>Y)oGHY35(5uq?O$QfOhUafw zmmMy`+9Gh{ZP|_(y&ZAuCE65M-u_;6+S>&RrZnG?dc6G9T0=h3(4HsPBNS%G|&0G|-o z-Me?+xpU|K{rms^{kwVd=KT5dXU&?mYSpS^$Bupa^y%EWb3la)=GzGZDV~xbzu^A} zz#w!VEX`Tq5n0T@z;_sg8IRZJuSfx^e(LGs7!u+BcIs`uW(5J4=}KF#{{Mgfoziqy z;kmu~W;Z8`OyN@(kZ-#-d&dFRChiyo8@CC|8*XYmF|@xvGwybWgx9LHZiP)#omyA| z{cdflTqIFx`k^BCMtZk{*bjaWgS68cab+~T}>{$}Uqx80$QI#De3y1UPI zng!KatM6^k5&bat2RrAn981qxFP)7y)z3e=t`=k&(9T1fS$;~cdC}Gtt+i`0Yg^a5 zFI$!_5{)`Adw+zhc1T24IivQj#g}XTvF6@5rZD3jr;g}dNtO!N@-L0LqIV7M{Wx)- d``TCb|8dKCXYUd31^Sr5)78&qofA_+698!hvljpW diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/meta.json index 7e6832bd12c083..797ea180d8ee67 100644 --- a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/meta.json +++ b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.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/c838ba21dae97db345e0113f99596decd1d66039 and modified by Flareguy for Space Station 14", + "copyright": "Taken from vgstation at commit https://github.com/vgstation-coders/vgstation13/commit/993de554ecfc30cc45f8340819c5a60ef1eee7e1 and modified for SS14 by Flareguy & P3MOIRA", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/prisoner-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/prisoner-equipped-INNERCLOTHING.png index 320db64b5794a279427cd43b16b4839490b43800..ef35d8c80c579f45bbf65b60c2d209d5fd24af5b 100644 GIT binary patch delta 398 zcmV;90dfBA0-Xbp8Gi-<0063Kaozv`00DDSM?wIu&K&6g00CD?L_t(|obB4Zje{^0 z2k?h97j2QwryLxpN}?w2yjPPmVJB%d~NwMV}I=FhRd>Cv&n-3Uc z(s7*M{b3kL-9Iw^LXsrc&VVS2WK~rZ1OXLAVX31{w9E=2gvB|RbzM^!hLq>I_J~aV z%;Ue40qS|W@&9!B3{btB0edfME&hDORj1DZ0001RAB-^>MUkAgL_e>~^Y$yp2LJ#7 z0001hXMNwF_J3Ra%vf-ByXt7K{(?HXHfJK{rEPw4j4`>kUcgiaOltxT&j!xNS%G}T0G|-o z?(S{{1%=??U?U@=tgI|wUtbp&m+0u|f`WpUmKLC@mrpK~0x9m2Aiv=MaKPZ@&-e)_ z%vskvb7Fd0ANMfN*Wb()@%ZRL1-?BS zYxX~ycwa_A>8?yed$Z9DS(EGnDbXL+jX%_H?pT&vsyOvil#3_>(5wf)Sqj2Tu5H_r zv}rx_Hx7T9AHSCED&@_cl(>@lkU{gyUCq`K%V#DYv*|TzS$JW4$NL3Ls*SI-7%GiK lC-5!syk_^OM$kEeA-;QdO7yZX`almdc)I$ztaD0e0stA8jer0E diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/prisoner-icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/prisoner-icon.png index faebe0e0550c4a7a41276f787c0f1496dbd6276e..819e7ac9d9c978d7fd87bba47ffbd86bb505a79b 100644 GIT binary patch delta 171 zcmV;c0960z0lWc_8Gi-<0047(dh`GQ00DDSM?wIu&K&6g004GLL_t(oh3(S83BVu> z1<2WLL1_OwNl2o6Bm#iH+oFT5HM`C^=kT6AI>^jq zX2i_V74uZp-n+i6);gWQ;b~4O-7XZ7N3HiB{*Z2^l(h+rY9!tSTn`v5x7o;-CjbBd Z04F$kDR^N;oe%&3002ovPDHLkV1m{Eak-;h&tK%-|;K5WujKOG4s8>4J}vk`fDbBpj|c==twbp1Ht8MnOA) zjY&*^@o6*TF3vRpQhXPD6PE7flt>6+WVsN-C@sy<^hCTPt&SCBJAM1MG8=Gx~Gd{NJZS+ zn;UtX4Fp&(oK_2{5_L;-2wQk$wu+J0k}aI#Dv!R;($<-)`?K60sDXiDf&BL8HaQY) z)w3U495eCVsNRxE*0`eH>RB!N(B= OQtIjI=d#Wzp$PyZ8d#eE diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-equipped-INNERCLOTHING.png index e21afe8d4eb1d95295728d41429e90b26765ade0..c97a78f047727a2fd76b4e841b0bbf7a7dc86edc 100644 GIT binary patch delta 279 zcmV+y0qFjT0;d9y8Gi-<0063Kaozv`00DDSM?wIu&K&6g007}hL_t(|obB2%ii9u} z#_?~LZEat$@&cY9m3Qz$={<|r5D(x5tR!hYK(<&G1_qXyQAb?ze=SU&+U-6K^+N6vfNmxwI>vJoeCa-Q{n<=a$LiIDhUH$7wbtz&W>99H-fo zfd7C5oE^Z~zMdKEz0YM?$~h-9Q`0muvz$^=j8V(7Xc&gWeu}*Jxvp!?^Q@|>?%HXZ z4qYDr000000002|cxSBubqN3f>|*m4CfZ<;A-bkPrXMsm#F#`kN zVGw3Kp1&dmD46Ey;usR){`TC(Laqh_j@HD|mGA!_TUaq!Ajegt@Lz1lhT5J#X$%Z5 z3~~(94*qM%_Pfrw((>;4hJ#Mhoc*_|wWhgepZ~=_jhR7#34%VDHkcS$x_auYmyx@= hM}~pn;_Zgtd{=kmM{Uq*yb83E!PC{xWt~$(69DR)T2BA~ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-icon.png index c9e8398b47d94679bfbec574bbdd8c639bb7064b..683e91de958724384d033fbd3ada13b6aed64281 100644 GIT binary patch delta 165 zcmV;W09ya+0nP!CF@K0jL_t(oh3(X_4Fe$z1<;=;D`0AN@Bl2~C0NaiumwE~;j40O zB9r8b_*H;x^CcvJ5W>H^c^g&Lo@)_t&$)XWnHgpVX7-NQH^#8nRbSLv+YaD<0sttb z?B2f@p!a@lfSmKS0X`uDJl-u75lbnZdm=)u6+~on&hvb&1s+v(|BNAo5W>$LuxTA5 Tk@>Vl00000NkvXXu0mjfyxvEy delta 194 zcmV;z06qWC0qX&fF@FSSK}|sb0I`n?{9y$E000SaNLh0L01mxv2);fCe6Ku)6I^ w&iQ=zeyp|Ry{A_1r`7A06mLcV0DzAX9sAlK?eLYNg#Z8m07*qoM6N<$f(-CcVgLXD diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-inhand-left.png index 9bbcac8268ab5a6466b66447666b6542c66ca9bc..b0e2998c0d42d5c7316397736533bb4c7ba9a464 100644 GIT binary patch delta 157 zcmey$c#Ls^VSR(Ai(^Q|oVPa@N;Vsav|hYkcV>d+qQ#r!s~6s6n6Dbt&A&zDoa6)X z>-RVqKp^3W&H2Bl_U`>Ic`^64-rd{QsSWj?elRXu?6h>syyCtoL06)bmtKj^-ncGX z=k%vvrTk!B4b~Es{rMkx`}Q2)E|GBLF}uYZ*?(s54H?89+jZz0pXWL}T^^*+)78&q Iol`;+0Kxl4oB#j- delta 204 zcmX@c_?2;jVLeN_qpu?a!^VE@KZ&di3=EtF9+AZi419+{nDKc2iWHz=m#2$kNJZS+ zn;Uss40u=r?)x58&`?gXVM}6}A}FB{UEs?VH6?~|&-EKuw?FyD4%ETGa3M8v+Tyj& zJ?E@{Z?n9z?|rUxa>>1$@p1*~>+26JKbxnyGkhJ?3cgD`)$kdTMy0RUvJZ0{Y|1FPS8F!&+OQQB{Nk(syto&T-G@yGywo; Cc~MvZ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/color.rsi/trinkets-inhand-right.png index cfd725831525040c80289ad5c787cadc64f573c4..ec1962dde48680be042df398a89787a6dcfa40dc 100644 GIT binary patch delta 171 zcmey(c!hC-VSS&ci(^Q|oVPbO@-`cYxL%yEVO+tNrS<-J+?AXM^He>&1-)k|ohb0j z77yQFE64x>2kx2p-oDDK8&!4R-EL~ox$7|tmVUp$`0mX|_8(W|juqZ%OYE2u^kk0m z(k*LWOP$_y#OD0^dN;X?(fVNR4)#^iJ=uQw&3ko^nX2^5yUW)%yt4Y!%_`PV{gdh2 WJmd46Z*LcZlzO`QxvXBuz}nOWd*kchHVYUd_@E&noK-feRlsdmDe% zw|?c@y%7ChGnN|u+bO+ft)bmwS-r~W_^r#NA{e5C3K`ZdFg}*GB=$K-ou{jx%Q~lo FCIG9?Q%(Q?