Files
wwdpublic/Content.Server/Wagging/WaggingSystem.cs
FoxxoTrystan 1481146f64 Vulpkanin Tail Wagging (#588)
# Description

Add the ability for Vulpkanins to wag their tails like Lizards and add a
far better icon for tail wagging making it not look like only action.

---

<details><summary><h1>Media</h1></summary>
<p>


![image](https://github.com/user-attachments/assets/6ed28a22-81ac-494c-bc18-92b5f7ae8ecb)

![image](https://github.com/user-attachments/assets/d3f976b1-d680-4181-a645-8e84a071e6cf)

</p>
</details>

---

# Changelog

🆑
- add: Vulpkanins can wag their tails now

---------

Signed-off-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com>
Co-authored-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com>
2024-08-01 19:06:24 -04:00

105 lines
3.5 KiB
C#

using Content.Server.Actions;
using Content.Server.Humanoid;
using Content.Shared.Humanoid;
using Content.Shared.Humanoid.Markings;
using Content.Shared.Mobs;
using Content.Shared.Toggleable;
using Content.Shared.Wagging;
using Robust.Shared.Prototypes;
namespace Content.Server.Wagging;
/// <summary>
/// Adds an action to toggle wagging animation for tails markings that supporting this
/// </summary>
public sealed class WaggingSystem : EntitySystem
{
[Dependency] private readonly ActionsSystem _actions = default!;
[Dependency] private readonly HumanoidAppearanceSystem _humanoidAppearance = default!;
[Dependency] private readonly IPrototypeManager _prototype = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<WaggingComponent, MapInitEvent>(OnWaggingMapInit);
SubscribeLocalEvent<WaggingComponent, ComponentShutdown>(OnWaggingShutdown);
SubscribeLocalEvent<WaggingComponent, ToggleActionEvent>(OnWaggingToggle);
SubscribeLocalEvent<WaggingComponent, MobStateChangedEvent>(OnMobStateChanged);
}
private void OnWaggingMapInit(EntityUid uid, WaggingComponent component, MapInitEvent args)
{
_actions.AddAction(uid, ref component.ActionEntity, component.Action, uid);
}
private void OnWaggingShutdown(EntityUid uid, WaggingComponent component, ComponentShutdown args)
{
_actions.RemoveAction(uid, component.ActionEntity);
}
private void OnWaggingToggle(EntityUid uid, WaggingComponent component, ref ToggleActionEvent args)
{
if (args.Handled)
return;
TryToggleWagging(uid, wagging: component);
}
private void OnMobStateChanged(EntityUid uid, WaggingComponent component, MobStateChangedEvent args)
{
if (component.Wagging)
TryToggleWagging(uid, wagging: component);
}
public bool TryToggleWagging(EntityUid uid, WaggingComponent? wagging = null, HumanoidAppearanceComponent? humanoid = null)
{
if (!Resolve(uid, ref wagging, ref humanoid))
return false;
if (!humanoid.MarkingSet.Markings.TryGetValue(MarkingCategories.Tail, out var markings))
return false;
if (markings.Count == 0)
return false;
wagging.Wagging = !wagging.Wagging;
_actions.SetToggled(wagging.ActionEntity, wagging.Wagging);
for (var idx = 0; idx < markings.Count; idx++) // Animate all possible tails
{
var currentMarkingId = markings[idx].MarkingId;
string newMarkingId;
if (wagging.Wagging)
{
newMarkingId = $"{currentMarkingId}{wagging.Suffix}";
}
else
{
if (currentMarkingId.EndsWith(wagging.Suffix))
{
newMarkingId = currentMarkingId[..^wagging.Suffix.Length];
}
else
{
newMarkingId = currentMarkingId;
Log.Warning($"Unable to revert wagging for {currentMarkingId}");
}
}
if (!_prototype.HasIndex<MarkingPrototype>(newMarkingId))
{
Log.Warning($"{ToPrettyString(uid)} tried toggling wagging but {newMarkingId} marking doesn't exist");
continue;
}
_humanoidAppearance.SetMarkingId(uid, MarkingCategories.Tail, idx, newMarkingId,
humanoid: humanoid);
}
return true;
}
}