Files

153 lines
5.0 KiB
C#
Raw Permalink Normal View History

2024-02-14 12:49:00 +03:00
using Content.Shared._Amour.Hole;
using Content.Shared.Humanoid;
using Robust.Client.GameObjects;
using Robust.Shared.Containers;
2024-02-18 13:23:05 +03:00
using Robust.Shared.GameStates;
2024-02-14 23:27:46 +03:00
using Robust.Shared.Reflection;
using Content.Shared.Foldable;
2024-02-14 12:49:00 +03:00
namespace Content.Client._Amour.Hole;
public sealed class HoleSystem : SharedHoleSystem
{
2024-02-14 23:27:46 +03:00
[Dependency] private readonly IReflectionManager _reflection = default!;
2024-02-14 12:49:00 +03:00
public override void Initialize()
{
2024-02-14 23:27:46 +03:00
base.Initialize();
SubscribeLocalEvent<HoleContainerComponent, EntInsertedIntoContainerMessage>(OnInsert);
SubscribeLocalEvent<HoleContainerComponent, EntRemovedFromContainerMessage>(OnRemoved);
2024-02-18 13:23:05 +03:00
SubscribeLocalEvent<HoleComponent, ComponentHandleState>(OnHandleState);
SubscribeLocalEvent<HoleBlockerComponent, FoldedEvent>(OnFolded);
}
private void OnFolded(Entity<HoleBlockerComponent> ent, ref FoldedEvent args)
{
if (ent.Comp.Equipee == NetEntity.Invalid)
return;
var equipee = GetEntity(ent.Comp.Equipee);
if (!HasComp<HoleContainerComponent>(equipee))
return;
UpdateVisuals(equipee);
2024-02-18 13:23:05 +03:00
}
private void OnHandleState(EntityUid uid, HoleComponent component, ref ComponentHandleState args)
2024-02-18 13:23:05 +03:00
{
if (args.Current is not HoleComponentState componentState)
2024-02-18 13:23:05 +03:00
return;
component.IsExcited = componentState.IsExcited;
component.Parent = componentState.Parent;
if (component.Parent is not null)
{
UpdateVisual(GetEntity(component.Parent.Value), uid, !HasAccessTo(GetEntity(component.Parent.Value), uid));
2024-02-18 13:23:05 +03:00
}
2024-02-14 12:49:00 +03:00
}
private void OnRemoved(EntityUid uid, HoleContainerComponent component, EntRemovedFromContainerMessage args)
{
if (!HasComp<HumanoidAppearanceComponent>(uid))
2024-02-14 23:27:46 +03:00
return;
UpdateVisuals(uid);
if (args.Container != component.Slot)
2024-02-14 23:27:46 +03:00
return;
UpdateVisual(uid, args.Entity, true);
2024-02-14 12:49:00 +03:00
}
private void OnInsert(EntityUid uid, HoleContainerComponent component, EntInsertedIntoContainerMessage args)
{
if (!HasComp<HumanoidAppearanceComponent>(uid))
2024-02-14 23:27:46 +03:00
return;
UpdateVisuals(uid);
2024-02-14 12:49:00 +03:00
}
2024-02-14 23:27:46 +03:00
private void UpdateVisuals(Entity<HoleContainerComponent?> entity)
2024-02-14 12:49:00 +03:00
{
if (!Resolve(entity, ref entity.Comp) || entity.Comp.Slot == null)
2024-02-14 23:27:46 +03:00
return;
2024-02-18 13:23:05 +03:00
2024-02-14 23:27:46 +03:00
foreach (var hole in entity.Comp.Slot.ContainedEntities)
{
UpdateVisual(entity.Owner, hole, !HasAccessTo(entity, hole));
2024-02-14 23:27:46 +03:00
}
}
private void UpdateVisual(Entity<SpriteComponent?, HumanoidAppearanceComponent?, HoleContainerComponent?> owner, Entity<HoleComponent?> entity, bool clear = false)
2024-02-14 23:27:46 +03:00
{
if (!Resolve(owner.Owner, ref owner.Comp1, ref owner.Comp3) || !Resolve(entity.Owner, ref entity.Comp))
2024-02-14 12:49:00 +03:00
return;
var spriteComp = owner.Comp1;
var holeComp = entity.Comp;
2024-02-14 23:27:46 +03:00
foreach (var layer in holeComp.Layers)
2024-02-14 12:49:00 +03:00
{
2024-02-14 23:27:46 +03:00
if (string.IsNullOrEmpty(layer.RsiPath))
layer.RsiPath = holeComp.RsiPath;
2024-02-14 12:49:00 +03:00
2024-02-17 19:03:07 +03:00
if (Resolve(owner.Owner, ref owner.Comp2))
{
2024-02-14 23:27:46 +03:00
layer.Color ??= owner.Comp2.SkinColor;
2024-02-17 19:03:07 +03:00
}
2024-02-14 23:27:46 +03:00
var state = layer.State;
if (holeComp.Prefixes.Count == 0)
{
if (clear)
spriteComp.LayerSetVisible(GenitalVisualLayers.DickFront, false);
2024-02-14 23:27:46 +03:00
else
{
spriteComp.LayerSetData(GenitalVisualLayers.DickFront, layer);
spriteComp.LayerSetVisible(GenitalVisualLayers.DickFront, true);
2024-02-14 23:27:46 +03:00
}
return;
}
foreach (var prefix in holeComp.Prefixes)
{
if (!_reflection.TryParseEnumReference(prefix.Layer, out var @enum))
{
Log.Error("FUCK! ERROR WITH " + prefix.Layer);
continue;
}
if (clear)
{
spriteComp.LayerSetVisible(@enum, false);
2024-02-14 23:27:46 +03:00
}
else
{
2024-02-17 19:03:07 +03:00
var s = "";
if (prefix.HasForHuman && owner.Comp3.UseHumanGenitalLayers)
s = "_s";
var mainPrefix = prefix.Prefix;
if (holeComp.IsExcited && !string.IsNullOrEmpty(prefix.ExcitedPrefix))
mainPrefix = prefix.ExcitedPrefix;
layer.State = state + s + mainPrefix;
2024-02-14 23:27:46 +03:00
spriteComp.LayerSetData(@enum, layer);
spriteComp.LayerSetVisible(@enum, true);
2024-02-17 19:03:07 +03:00
layer.State = state;
2024-02-14 23:27:46 +03:00
}
}
2024-02-14 12:49:00 +03:00
}
}
2024-02-17 19:03:07 +03:00
public override void Exide(Entity<HoleComponent?> entity, bool value = true)
{
if (!Resolve(entity.Owner, ref entity.Comp)) return;
2024-02-17 19:03:07 +03:00
base.Exide(entity, value);
2024-02-18 13:23:05 +03:00
var netEntity = entity.Comp.Parent;
2024-02-17 19:03:07 +03:00
if (netEntity != null)
UpdateVisual(GetEntity(netEntity.Value), entity);
}
2024-02-14 12:49:00 +03:00
}