Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 27 additions & 26 deletions Content.Client/Movement/Systems/ClientSpriteMovementSystem.cs
Original file line number Diff line number Diff line change
@@ -1,45 +1,46 @@
using Content.Shared.Movement.Components;
using Content.Shared.Movement.Systems;
using Content.Shared.Movement.Events;
using Robust.Client.GameObjects;

namespace Content.Client.Movement.Systems;

/// <summary>
/// Controls the switching of motion and standing still animation
/// </summary>
public sealed partial class ClientSpriteMovementSystem : SharedSpriteMovementSystem
public sealed class ClientSpriteMovementSystem : VisualizerSystem<SpriteMovementComponent>
{
[Dependency] private SpriteSystem _sprite = default!;

private EntityQuery<SpriteComponent> _spriteQuery;

public override void Initialize()
protected override void OnAppearanceChange(EntityUid uid, SpriteMovementComponent comp, ref AppearanceChangeEvent args)
{
base.Initialize();

_spriteQuery = GetEntityQuery<SpriteComponent>();

SubscribeLocalEvent<SpriteMovementComponent, AfterAutoHandleStateEvent>(OnAfterAutoHandleState);
}
var sprite = args.Sprite;
if (!args.AppearanceData.TryGetValue(SpriteMovementVisuals.Moving, out var obj) || obj is not bool isMoving)
return;

private void OnAfterAutoHandleState(Entity<SpriteMovementComponent> ent, ref AfterAutoHandleStateEvent args)
{
if (!_spriteQuery.TryGetComponent(ent, out var sprite))
comp.WasMoving ??= !isMoving;
if (isMoving == comp.WasMoving)
return;

if (ent.Comp.IsMoving)
{
foreach (var (layer, state) in ent.Comp.MovementLayers)
{
_sprite.LayerSetData((ent.Owner, sprite), layer, state);
}
}
else
void SetLayers(Dictionary<string, PrototypeLayerData> layers)
{
foreach (var (layer, state) in ent.Comp.NoMovementLayers)
foreach (var (layer, state) in layers)
{
_sprite.LayerSetData((ent.Owner, sprite), layer, state);
if (!SpriteSystem.TryGetLayer((uid, sprite), layer, out var layerData, true))
continue;

var oldTime = layerData.AnimationTime;
var oldStateWasAnim = layerData.AnimationTimeLeft > 0;
SpriteSystem.LayerSetAutoAnimated(layerData, true);
SpriteSystem.LayerSetData(layerData, state);
// if there was old anim time left from a previously playing anim, take that into account here
if (oldStateWasAnim)
{
var setAnimTime = layerData.AnimationTimeLeft - oldTime;
SpriteSystem.LayerSetAnimationTime(layerData, setAnimTime);
}
}
}

Log.Info($"setting layers {isMoving}");
SetLayers(isMoving ? comp.MovementLayers : comp.NoMovementLayers);
comp.WasMoving = isMoving;
}
}
7 changes: 0 additions & 7 deletions Content.Server/Movement/Systems/SpriteMovementSystem.cs

This file was deleted.

9 changes: 5 additions & 4 deletions Content.Server/NPC/Systems/NPCSteeringSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ public sealed partial class NPCSteeringSystem : SharedNPCSteeringSystem
[Dependency] private NpcFactionSystem _npcFaction = default!;
[Dependency] private PathfindingSystem _pathfindingSystem = default!;
[Dependency] private PryingSystem _pryingSystem = default!;
[Dependency] private SharedAppearanceSystem _appearance = default!;
[Dependency] private SharedMapSystem _mapSystem = default!;
[Dependency] private SharedInteractionSystem _interaction = default!;
[Dependency] private SharedMeleeWeaponSystem _melee = default!;
Expand Down Expand Up @@ -216,8 +217,8 @@ public void Unregister(EntityUid uid, NPCSteeringComponent? component = null)
{
controller.CurTickSprintMovement = Vector2.Zero;

var ev = new SpriteMoveEvent(false);
RaiseLocalEvent(uid, ref ev);
if (controller.UsesSpriteMovement)
_appearance.SetData(uid, SpriteMovementVisuals.Moving, controller.HasDirectionalMovement);
}

component.PathfindToken?.Cancel();
Expand Down Expand Up @@ -297,8 +298,8 @@ private void SetDirection(EntityUid uid, InputMoverComponent component, NPCSteer
component.LastInputTick = _timing.CurTick;
component.LastInputSubTick = ushort.MaxValue;

var ev = new SpriteMoveEvent(true);
RaiseLocalEvent(uid, ref ev);
if (component.UsesSpriteMovement)
_appearance.SetData(uid, SpriteMovementVisuals.Moving, component.HasDirectionalMovement);
}

/// <summary>
Expand Down
6 changes: 6 additions & 0 deletions Content.Shared/Gravity/FloatingVisualsComponent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,11 @@ public sealed partial class FloatingVisualsComponent : Component
[DataField, AutoNetworkedField]
public bool CanFloat;

/// <summary>
/// If true, this sprite will always be floating irrespective of gravity status.
/// </summary>
[DataField, AutoNetworkedField]
public bool AlwaysFloat;

public readonly string AnimationKey = "gravity";
}
5 changes: 4 additions & 1 deletion Content.Shared/Gravity/SharedFloatingVisualizerSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public virtual void FloatAnimation(EntityUid uid, Vector2 offset, string animati

protected bool CanFloat(Entity<FloatingVisualsComponent> entity)
{
entity.Comp.CanFloat = _gravity.IsWeightless(entity.Owner);
entity.Comp.CanFloat = _gravity.IsWeightless(entity.Owner) || entity.Comp.AlwaysFloat;
Dirty(entity);
return entity.Comp.CanFloat;
}
Expand All @@ -38,6 +38,9 @@ private void OnComponentStartup(Entity<FloatingVisualsComponent> entity, ref Com

private void OnWeightlessnessChanged(Entity<FloatingVisualsComponent> entity, ref WeightlessnessChangedEvent args)
{
if (entity.Comp.AlwaysFloat)
return;

if (entity.Comp.CanFloat == args.Weightless)
return;

Expand Down
6 changes: 6 additions & 0 deletions Content.Shared/Movement/Components/InputMoverComponent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,12 @@ public sealed partial class InputMoverComponent : Component

[ViewVariables(VVAccess.ReadWrite)]
public bool CanMove = true;

/// <summary>
/// Used to optimize not changing movement appearance data if it isnt necessary.
/// </summary>
[DataField]
public bool UsesSpriteMovement = false;
}

[Serializable, NetSerializable]
Expand Down
5 changes: 2 additions & 3 deletions Content.Shared/Movement/Components/SpriteMovementComponent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ namespace Content.Shared.Movement.Components;
/// <summary>
/// Updates a sprite layer based on whether an entity is moving via input or not.
/// </summary>
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)]
[RegisterComponent, NetworkedComponent]
public sealed partial class SpriteMovementComponent : Component
{
/// <summary>
Expand All @@ -20,6 +20,5 @@ public sealed partial class SpriteMovementComponent : Component
[DataField]
public Dictionary<string, PrototypeLayerData> NoMovementLayers = new();

[DataField, AutoNetworkedField]
public bool IsMoving;
public bool? WasMoving = null;
}
15 changes: 0 additions & 15 deletions Content.Shared/Movement/Events/SpriteMoveEvent.cs

This file was deleted.

9 changes: 9 additions & 0 deletions Content.Shared/Movement/Events/SpriteMovementVisuals.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using Robust.Shared.Serialization;

namespace Content.Shared.Movement.Events;

[Serializable, NetSerializable]
public enum SpriteMovementVisuals : byte
{
Moving,
}
Original file line number Diff line number Diff line change
Expand Up @@ -100,8 +100,8 @@ protected void SetMoveInput(Entity<InputMoverComponent> entity, MoveButtons butt
RaiseLocalEvent(entity, ref moveEvent);
Dirty(entity, entity.Comp);

var ev = new SpriteMoveEvent(entity.Comp.HasDirectionalMovement);
RaiseLocalEvent(entity, ref ev);
if (entity.Comp.UsesSpriteMovement)
_appearance.SetData(entity, SpriteMovementVisuals.Moving, entity.Comp.HasDirectionalMovement);
}

private void OnMoverHandleState(Entity<InputMoverComponent> entity, ref ComponentHandleState args)
Expand All @@ -126,8 +126,8 @@ private void OnMoverHandleState(Entity<InputMoverComponent> entity, ref Componen
entity.Comp.HeldMoveButtons = state.HeldMoveButtons;
RaiseLocalEvent(entity.Owner, ref moveEvent);

var ev = new SpriteMoveEvent(entity.Comp.HasDirectionalMovement);
RaiseLocalEvent(entity, ref ev);
if (entity.Comp.UsesSpriteMovement)
_appearance.SetData(entity, SpriteMovementVisuals.Moving, entity.Comp.HasDirectionalMovement);
}
}

Expand Down
1 change: 1 addition & 0 deletions Content.Shared/Movement/Systems/SharedMoverController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ public abstract partial class SharedMoverController : VirtualController
[Dependency] private SharedGravitySystem _gravity = default!;
[Dependency] private SharedTransformSystem _transform = default!;
[Dependency] private TagSystem _tags = default!;
[Dependency] private SharedAppearanceSystem _appearance = default!;

protected EntityQuery<CanMoveInAirComponent> CanMoveInAirQuery;
protected EntityQuery<FootstepModifierComponent> FootstepModifierQuery;
Expand Down
23 changes: 0 additions & 23 deletions Content.Shared/Movement/Systems/SharedSpriteMovementSystem.cs

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
sprite: Markers/jobs.rsi
layers:
- state: green
- sprite: _ES/Mobs/Ghosts/theatergoer.rsi
- sprite: _ES/Mobs/Ghosts/theatergoer_body.rsi
state: body
- type: SpawnPoint
spawn_type: Theatergoer
Expand Down
4 changes: 2 additions & 2 deletions Resources/Prototypes/_ES/Entities/Markers/lobby.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
sprite: Markers/cross.rsi
layers:
- state: green
- sprite: _ES/Mobs/Ghosts/theatergoer.rsi
- sprite: _ES/Mobs/Ghosts/theatergoer_head.rsi
state: head-1
- type: Physics
bodyType: Static
Expand All @@ -36,7 +36,7 @@
sprite: Markers/cross.rsi
layers:
- state: red
- sprite: _ES/Mobs/Ghosts/theatergoer.rsi
- sprite: _ES/Mobs/Ghosts/theatergoer_head.rsi
state: head-3
- type: Physics
bodyType: Static
Expand Down
27 changes: 23 additions & 4 deletions Resources/Prototypes/_ES/Entities/Mobs/Player/stagehand.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,13 @@
description: Every show needs a loyal crew in the back making it tick. Today, that person is you.
components:
- type: Sprite
sprite: _ES/Mobs/Ghosts/theatergoer.rsi
sprite: _ES/Mobs/Ghosts/theatergoer_body.rsi
layers:
- state: body
map: [ "body" ]
shader: unshaded
- state: head-1
sprite: _ES/Mobs/Ghosts/theatergoer_head.rsi
map: [ "face" ]
shader: unshaded
- type: RandomSprite
Expand Down Expand Up @@ -69,9 +70,27 @@
- type: GenericVisualizer
visuals:
enum.ESUsernameEntityVisuals.Admin:
base:
True: { state: admin, shader: unshaded }
False: { state: body, shader: unshaded }
body:
True:
sprite: _ES/Mobs/Ghosts/theatergoer_body_admin.rsi
loop: false
False:
sprite: _ES/Mobs/Ghosts/theatergoer_body.rsi
loop: false
- type: FloatingVisuals
offset: 0,0.1
alwaysFloat: true
- type: InputMover
usesSpriteMovement: true
- type: SpriteMovement
movementLayers:
body:
state: body-floating
loop: false
noMovementLayers:
body:
state: body-floating-reversed
loop: false
- type: ESMindVisuals
- type: ESBlockInteraction
- type: ShowElectrocutionHUD
Expand Down
9 changes: 5 additions & 4 deletions Resources/Prototypes/_ES/Entities/Mobs/Player/theatergoer.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@
description: A member of your troupe.
components:
- type: Sprite
sprite: _ES/Mobs/Ghosts/theatergoer.rsi
sprite: _ES/Mobs/Ghosts/theatergoer_body.rsi
layers:
- state: body
map: [ "body" ]
- state: head-1
sprite: _ES/Mobs/Ghosts/theatergoer_head.rsi
map: [ "face" ]
- type: RandomSprite
available:
Expand Down Expand Up @@ -46,9 +47,9 @@
- type: GenericVisualizer
visuals:
enum.ESUsernameEntityVisuals.Admin:
base:
True: { state: admin }
False: { state: body }
body:
True: { sprite: _ES/Mobs/Ghosts/theatergoer_body_admin.rsi }
False: { sprite: _ES/Mobs/Ghosts/theatergoer_body.rsi }
- type: ESMindVisuals
- type: Buckle
- type: Hands
Expand Down
Loading
Loading