using Content.Shared._Amour.HumanoidAppearanceExtension; using Content.Shared.Humanoid; using Robust.Shared.Random; using Robust.Shared.Serialization; namespace Content.Shared._Amour.CustomHeight; public abstract class SharedCustomHeightSystem : EntitySystem { [Dependency] protected readonly SharedAppearanceSystem AppearanceSystem = default!; [Dependency] private readonly IRobustRandom _robustRandom = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnLoaded); SubscribeLocalEvent(OnCloned); } private void OnCloned(EntityUid uid, CustomHeightComponent component, HumanoidAppearanceClonedEvent args) { if(!AppearanceSystem.TryGetData(uid, HeightVisuals.State, out var height)) return; SetHeight(args.Target.Owner,height); } private void OnLoaded(EntityUid uid, CustomHeightComponent component, HumanoidAppearanceLoadedEvent args) { SetHeight(uid,GetHeightFromByte(uid,args.Profile.Appearance.Height)); } private void OnInit(EntityUid uid, CustomHeightComponent component, ComponentInit args) { if(HasComp(uid)) return; if (component.Random) component.Starting = _robustRandom.NextFloat(component.Min, component.Max); if(component.Starting == 1f) return; SetHeight(uid,component.Starting); } public void SetHeight(Entity entity, float height) { if (!Resolve(entity, ref entity.Comp)) entity.Comp = EnsureComp(entity); height = Math.Clamp(height, entity.Comp.Min, entity.Comp.Max); AppearanceSystem.SetData(entity,HeightVisuals.State, height); } public float GetHeightFromByte(Entity entity, byte per) { if (!Resolve(entity, ref entity.Comp)) entity.Comp = EnsureComp(entity); var percent = (float)per / byte.MaxValue; var min = entity.Comp.Min; var max = entity.Comp.Max; return min + (max - min) * percent; } public byte GetByteFromHeight(Entity entity,float? varheight = null) { if (!Resolve(entity, ref entity.Comp)) entity.Comp = EnsureComp(entity); var min = entity.Comp.Min; var max = entity.Comp.Max; varheight ??= AppearanceSystem.TryGetData(entity, HeightVisuals.State, out var height) ? height : min; return (byte) ((varheight.Value - min) / (max - min) * byte.MaxValue); } } [Serializable, NetSerializable] public enum HeightVisuals : byte { State }