diff --git a/Content.Client/ADT/NightVision/NightVisionOverlay.cs b/Content.Client/ADT/NightVision/NightVisionOverlay.cs new file mode 100644 index 00000000000..108a88c46a9 --- /dev/null +++ b/Content.Client/ADT/NightVision/NightVisionOverlay.cs @@ -0,0 +1,117 @@ +// taken and adapted from https://github.com/RMC-14/RMC-14?ysclid=lzx00zxd6e53093995 + +using System.Numerics; +using Content.Shared.ADT.NightVision; +// using Content.Shared._RMC14.Xenonids; +using Robust.Client.GameObjects; +using Robust.Client.Graphics; +using Robust.Client.Player; +using Robust.Shared.Enums; +using Robust.Shared.Map; + +namespace Content.Client.ADT.NightVision; + +public sealed class NightVisionOverlay : Overlay +{ + [Dependency] private readonly IEntityManager _entity = default!; + [Dependency] private readonly IPlayerManager _players = default!; + + private readonly ContainerSystem _container; + private readonly TransformSystem _transform; + // private readonly EntityQuery _xenoQuery; + + public override OverlaySpace Space => OverlaySpace.WorldSpace; + + private readonly List _entries = new(); + + public NightVisionOverlay() + { + IoCManager.InjectDependencies(this); + + _container = _entity.System(); + _transform = _entity.System(); + // _xenoQuery = _entity.GetEntityQuery(); + } + + protected override void Draw(in OverlayDrawArgs args) + { + if (!_entity.TryGetComponent(_players.LocalEntity, out NightVisionComponent? nightVision) || + nightVision.State == NightVisionState.Off) + { + return; + } + + var handle = args.WorldHandle; + var eye = args.Viewport.Eye; + var eyeRot = eye?.Rotation ?? default; + + _entries.Clear(); + var entities = _entity.EntityQueryEnumerator(); + while (entities.MoveNext(out var uid, out var visible, out var sprite, out var xform)) + { + _entries.Add(new NightVisionRenderEntry((uid, sprite, xform), + eye?.Position.MapId, + eyeRot, + nightVision.SeeThroughContainers, + visible.Priority, + visible.Transparency)); + } + + _entries.Sort(SortPriority); + + foreach (var entry in _entries) + { + Render(entry.Ent, + entry.Map, + handle, + entry.EyeRot, + entry.NightVisionSeeThroughContainers, + entry.Transparency); + } + + handle.SetTransform(Matrix3x2.Identity); + } + + private static int SortPriority(NightVisionRenderEntry x, NightVisionRenderEntry y) + { + return x.Priority.CompareTo(y.Priority); + } + + private void Render(Entity ent, + MapId? map, + DrawingHandleWorld handle, + Angle eyeRot, + bool seeThroughContainers, + float? transparency) + { + var (uid, sprite, xform) = ent; + if (xform.MapID != map) + return; + + var seeThrough = seeThroughContainers; // && !_xenoQuery.HasComp(uid); + if (!seeThrough && _container.IsEntityOrParentInContainer(uid, xform: xform)) + return; + + var (position, rotation) = _transform.GetWorldPositionRotation(xform); + + var colorCache = sprite.Color; + if (transparency != null) + { + var color = sprite.Color * Color.White.WithAlpha(transparency.Value); + sprite.Color = color; + } + sprite.Render(handle, eyeRot, rotation, position: position); + if (transparency != null) + { + sprite.Color = colorCache; + } + } +} + +public record struct NightVisionRenderEntry( + (EntityUid, SpriteComponent, TransformComponent) Ent, + MapId? Map, + Angle EyeRot, + bool NightVisionSeeThroughContainers, + int Priority, + float? Transparency); diff --git a/Content.Client/ADT/NightVision/NightVisionSystem.cs b/Content.Client/ADT/NightVision/NightVisionSystem.cs new file mode 100644 index 00000000000..d69b4338c9a --- /dev/null +++ b/Content.Client/ADT/NightVision/NightVisionSystem.cs @@ -0,0 +1,84 @@ +// taken and adapted from https://github.com/RMC-14/RMC-14?ysclid=lzx00zxd6e53093995 + +using Content.Shared.ADT.NightVision; +using Robust.Client.Graphics; +using Robust.Client.Player; +using Robust.Shared.Player; + +namespace Content.Client.ADT.NightVision; + +public sealed class NightVisionSystem : SharedNightVisionSystem +{ + [Dependency] private readonly ILightManager _light = default!; + [Dependency] private readonly IOverlayManager _overlay = default!; + [Dependency] private readonly IPlayerManager _player = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnNightVisionAttached); + SubscribeLocalEvent(OnNightVisionDetached); + } + + private void OnNightVisionAttached(Entity ent, ref LocalPlayerAttachedEvent args) + { + NightVisionChanged(ent); + } + + private void OnNightVisionDetached(Entity ent, ref LocalPlayerDetachedEvent args) + { + Off(); + } + + protected override void NightVisionChanged(Entity ent) + { + if (ent != _player.LocalEntity) + return; + + switch (ent.Comp.State) + { + case NightVisionState.Off: + Off(); + break; + case NightVisionState.Half: + Half(ent); + break; + case NightVisionState.Full: + Full(ent); + break; + default: + throw new ArgumentOutOfRangeException(); + } + } + + protected override void NightVisionRemoved(Entity ent) + { + if (ent != _player.LocalEntity) + return; + + Off(); + } + + private void Off() + { + _overlay.RemoveOverlay(new NightVisionOverlay()); + _light.DrawLighting = true; + } + + private void Half(Entity ent) + { + if (ent.Comp.Overlay) + _overlay.AddOverlay(new NightVisionOverlay()); + + _light.DrawLighting = true; + } + + private void Full(Entity ent) + { + if (ent.Comp.Overlay) + _overlay.AddOverlay(new NightVisionOverlay()); + + _light.DrawLighting = false; + } +} diff --git a/Content.Server/ADT/Hallucinations/Systems/HallucinationsSystem.cs b/Content.Server/ADT/Hallucinations/Systems/HallucinationsSystem.cs index 2e32c6e3feb..693b318e926 100644 --- a/Content.Server/ADT/Hallucinations/Systems/HallucinationsSystem.cs +++ b/Content.Server/ADT/Hallucinations/Systems/HallucinationsSystem.cs @@ -141,6 +141,8 @@ public bool StartEpidemicHallucinations(EntityUid target, string proto) return false; var hallucinations = EnsureComp(target); + hallucinations.EndTime = _timing.CurTime + TimeSpan.FromSeconds(15); + hallucinations.Proto = prototype; hallucinations.Spawns = prototype.Entities; hallucinations.Range = prototype.Range; @@ -224,6 +226,12 @@ public override void Update(float frameTime) var diseaseQuery = EntityQueryEnumerator(); while (diseaseQuery.MoveNext(out var uid, out var stat, out var xform)) { + if (_timing.CurTime >= stat.EndTime) + { + RemCompDeferred(uid); + continue; + } + if (_timing.CurTime < stat.NextSecond) continue; var rate = stat.SpawnRate; diff --git a/Content.Server/ADT/NightVision/NightVisionSystem.cs b/Content.Server/ADT/NightVision/NightVisionSystem.cs new file mode 100644 index 00000000000..5f6a3602a1c --- /dev/null +++ b/Content.Server/ADT/NightVision/NightVisionSystem.cs @@ -0,0 +1,7 @@ +// taken and adapted from https://github.com/RMC-14/RMC-14?ysclid=lzx00zxd6e53093995 + +using Content.Shared.ADT.NightVision; + +namespace Content.Server.ADT.NightVision; + +public sealed class NightVisionSystem : SharedNightVisionSystem; diff --git a/Content.Server/ADT/Phantom/EntitySystems/PhantomSystem.cs b/Content.Server/ADT/Phantom/EntitySystems/PhantomSystem.cs index ff19e4c79df..4d0d32c975e 100644 --- a/Content.Server/ADT/Phantom/EntitySystems/PhantomSystem.cs +++ b/Content.Server/ADT/Phantom/EntitySystems/PhantomSystem.cs @@ -57,7 +57,7 @@ using Content.Shared.Weapons.Melee; using Content.Shared.CombatMode; using Content.Server.Cuffs; -using Content.Server.Humanoid; +using Robust.Server.Player; using Content.Shared.Preferences; using Content.Shared.Ghost; using Content.Shared.Tag; @@ -75,6 +75,7 @@ using Content.Shared.Mobs.Components; using Content.Shared.ADT.Silicon.Components; using Content.Server.Singularity.Events; +using Content.Server.GameTicking.Rules; namespace Content.Server.ADT.Phantom.EntitySystems; @@ -85,10 +86,8 @@ public sealed partial class PhantomSystem : SharedPhantomSystem [Dependency] private readonly StatusEffectsSystem _status = default!; [Dependency] private readonly SharedActionsSystem _action = default!; [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!; - [Dependency] private readonly MobStateSystem _mobState = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly SharedControlledSystem _controlled = default!; - [Dependency] private readonly ISerializationManager _serialization = default!; [Dependency] private readonly SharedContainerSystem _container = default!; [Dependency] private readonly AlertsSystem _alerts = default!; [Dependency] private readonly IRobustRandom _random = default!; @@ -123,6 +122,9 @@ public sealed partial class PhantomSystem : SharedPhantomSystem [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly HandsSystem _handsSystem = default!; [Dependency] private readonly CuffableSystem _cuffable = default!; + [Dependency] private readonly IPlayerManager _playerManager = default!; + [Dependency] private readonly PhantomRuleSystem _phantomGameRule = default!; + #endregion public override void Initialize() @@ -131,8 +133,8 @@ public override void Initialize() // Startup SubscribeLocalEvent(OnMapInit); - SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnStatusAdded); SubscribeLocalEvent(OnStatusEnded); @@ -569,14 +571,14 @@ private void OnMakeVessel(EntityUid uid, PhantomComponent component, MakeVesselA if (!HasComp(target)) { - var selfMessage = Loc.GetString("changeling-dna-fail-nohuman", ("target", Identity.Entity(target, EntityManager))); + var selfMessage = Loc.GetString("phantom-fail-nohuman", ("target", Identity.Entity(target, EntityManager))); _popup.PopupEntity(selfMessage, uid, uid); return; } if (HasComp(target)) { - var selfMessage = Loc.GetString("phantom-vessel-fail-mindshield", ("target", Identity.Entity(target, EntityManager))); + var selfMessage = Loc.GetString("phantom-fail-mindshield", ("target", Identity.Entity(target, EntityManager))); _popup.PopupEntity(selfMessage, uid, uid); return; } @@ -616,6 +618,13 @@ private void OnParalysis(EntityUid uid, PhantomComponent component, ParalysisAct var target = args.Target; + if (HasComp(target)) + { + var selfMessage = Loc.GetString("phantom-fail-mindshield", ("target", Identity.Entity(target, EntityManager))); + _popup.PopupEntity(selfMessage, uid, uid); + return; + } + if (!TryUseAbility(uid, target)) return; @@ -766,7 +775,7 @@ private void OnBreakdown(EntityUid uid, PhantomComponent component, BreakdownAct _apcSystem.ApcToggleBreaker(target, apc); success = true; } - if (HasComp(target) && HasComp(target)) //&& _status.TryAddStatusEffect(target, "SeeingStatic", timeStatic, false)) + if (HasComp(target) && HasComp(target) && _status.TryAddStatusEffect(target, "SeeingStatic", timeStatic, false)) { _status.TryAddStatusEffect(target, "KnockedDown", time, false); _status.TryAddStatusEffect(target, "Stun", time, false); @@ -790,7 +799,7 @@ private void OnBreakdown(EntityUid uid, PhantomComponent component, BreakdownAct _apcSystem.ApcToggleBreaker(entity, entApc); success = true; } - if (HasComp(entity) && HasComp(entity)) //&& _status.TryAddStatusEffect(entity, "SeeingStatic", timeStatic, false)) + if (HasComp(entity) && HasComp(entity) && _status.TryAddStatusEffect(entity, "SeeingStatic", timeStatic, false)) { _status.TryAddStatusEffect(entity, "KnockedDown", time, false); _status.TryAddStatusEffect(entity, "Stun", time, false); @@ -1193,6 +1202,13 @@ private void OnBlinding(EntityUid uid, PhantomComponent component, BloodBlinding return; } + if (HasComp(target)) + { + var selfMessage = Loc.GetString("phantom-fail-mindshield", ("target", Identity.Entity(target, EntityManager))); + _popup.PopupEntity(selfMessage, uid, uid); + return; + } + UpdateEctoplasmSpawn(uid); args.Handled = true; @@ -1272,58 +1288,41 @@ private void OnPsychoEpidemic(EntityUid uid, PhantomComponent component, PsychoE if (args.Handled) return; - if (!component.EpidemicActive) + List list = new(); + foreach (var (ent, humanoid) in _lookup.GetEntitiesInRange(Transform(uid).Coordinates, 150f)) { - List list = new(); - foreach (var (ent, humanoid) in _lookup.GetEntitiesInRange(Transform(uid).Coordinates, 150f)) - { - if (_mindSystem.TryGetMind(ent, out _, out _) && TryComp(ent, out var state) && state.CurrentState == Shared.Mobs.MobState.Alive) - list.Add(ent); - } - - if (list.Count <= 0) - { - var failMessage = Loc.GetString("phantom-epidemic-fail"); - _popup.PopupEntity(failMessage, uid, uid); - return; - } - - var (target, _) = _random.Pick(_lookup.GetEntitiesInRange(Transform(uid).Coordinates, 150f)); - - if (!_hallucinations.StartEpidemicHallucinations(target, component.HallucinationsPrototype)) - { - var failMessage = Loc.GetString("phantom-epidemic-fail"); - _popup.PopupEntity(failMessage, uid, uid); - return; - } - - if (_mindSystem.TryGetMind(uid, out _, out var mind) && mind.Session != null) - _audio.PlayGlobal(component.PsychoSound, mind.Session); + if ( + _mindSystem.TryGetMind(ent, out _, out _) && + TryComp(ent, out var state) && + state.CurrentState == Shared.Mobs.MobState.Alive && + !HasComp(ent)) + list.Add(ent); + } - var selfMessage = Loc.GetString("phantom-epidemic-success", ("name", Identity.Entity(target, EntityManager))); - _popup.PopupEntity(selfMessage, uid, uid); + if (list.Count <= 0) + { + var failMessage = Loc.GetString("phantom-epidemic-fail"); + _popup.PopupEntity(failMessage, uid, uid); + return; + } - component.EpidemicActive = true; + var (target, _) = _random.Pick(_lookup.GetEntitiesInRange(Transform(uid).Coordinates, 150f)); - UpdateEctoplasmSpawn(uid); - args.Handled = true; - } - else + if (!_hallucinations.StartEpidemicHallucinations(target, component.HallucinationsPrototype)) { - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var mob, out var comp)) - { - RemComp(mob); - } + var failMessage = Loc.GetString("phantom-epidemic-fail"); + _popup.PopupEntity(failMessage, uid, uid); + return; + } - var selfMessage = Loc.GetString("phantom-epidemic-end"); - _popup.PopupEntity(selfMessage, uid, uid); + if (_mindSystem.TryGetMind(uid, out _, out var mind) && mind.Session != null) + _audio.PlayGlobal(component.PsychoSound, mind.Session); - component.EpidemicActive = false; + var selfMessage = Loc.GetString("phantom-epidemic-success", ("name", Identity.Entity(target, EntityManager))); + _popup.PopupEntity(selfMessage, uid, uid); - UpdateEctoplasmSpawn(uid); - args.Handled = true; - } + UpdateEctoplasmSpawn(uid); + args.Handled = true; } private void OnHelpingHand(EntityUid uid, PhantomComponent component, PhantomHelpingHelpActionEvent args) @@ -1379,6 +1378,20 @@ private void OnControl(EntityUid uid, PhantomComponent component, PhantomControl return; } + if (!HasComp(target)) + { + var selfMessage = Loc.GetString("phantom-puppeter-fail-notvessel", ("target", Identity.Entity(target, EntityManager))); + _popup.PopupEntity(selfMessage, uid, uid); + return; + } + + if (HasComp(target)) + { + var selfMessage = Loc.GetString("phantom-fail-mindshield", ("target", Identity.Entity(target, EntityManager))); + _popup.PopupEntity(selfMessage, uid, uid); + return; + } + if (_mindSystem.TryGetMind(uid, out _, out var mind))// && //_mindSystem.TryGetMind(target, out _, out var targetMind)) { @@ -1413,6 +1426,13 @@ private void OnNightmare(EntityUid uid, PhantomComponent component, NightmareFin } var target = component.Holder; + if (HasComp(target)) + { + var selfMessage = Loc.GetString("phantom-fail-mindshield", ("target", Identity.Entity(target, EntityManager))); + _popup.PopupEntity(selfMessage, uid, uid); + return; + } + if (!TryUseAbility(uid, target)) return; @@ -1480,6 +1500,20 @@ public void OnTrySpeak(EntityUid uid, PhantomComponent component, AlternativeSpe { args.Cancel(); + foreach (var ghost in _playerManager.Sessions) + { + var ent = ghost.AttachedEntity; + if (!HasComp(ent)) + continue; + var wrappedMessage = Loc.GetString("chat-manager-entity-say-wrap-message", + ("entityName", Identity.Entity(uid, EntityManager)), + ("verb", "шепчет"), + ("fontType", "Default"), + ("fontSize", 12), + ("message", args.Message)); + + _chatManager.ChatMessageToOne(ChatChannel.Local, args.Message, wrappedMessage, uid, false, ghost.Channel); + } if (args.Radio) { var popupMessage = Loc.GetString("phantom-say-target"); @@ -1644,7 +1678,7 @@ private void OnTryMove(EntityUid uid, PhantomComponent component, UpdateCanMoveE args.Cancel(); } - private void OnLevelChanged(EntityUid uid, PhantomComponent component, RefreshPhantomLevelEvent args) + private void OnLevelChanged(EntityUid uid, PhantomComponent component, ref RefreshPhantomLevelEvent args) { SelectStyle(uid, component, component.CurrentStyle, true); _alerts.ShowAlert(uid, _proto.Index(component.VesselCountAlert), (short) Math.Clamp(component.Vessels.Count, 0, 10)); @@ -1746,7 +1780,7 @@ public bool TryRevive(EntityUid uid, PhantomComponent component) if (allowedVessels.Count < 1) { var ev = new PhantomDiedEvent(); - RaiseLocalEvent(uid, ev); + RaiseLocalEvent(uid, ref ev); return false; } @@ -1863,8 +1897,8 @@ public void Haunt(EntityUid uid, EntityUid target, PhantomComponent component) holderComp.Phantom = uid; _actionBlocker.UpdateCanMove(uid); - var eye = EnsureComp(uid); - _eye.SetDrawFov(uid, true, eye); + // var eye = EnsureComp(uid); + // _eye.SetDrawFov(uid, true, eye); _appearance.SetData(uid, PhantomVisuals.Haunting, true); var xform = Transform(uid); @@ -1942,8 +1976,8 @@ public void StopHaunt(EntityUid uid, EntityUid holder, PhantomComponent? compone _alerts.ClearAlert(uid, component.HauntedAlert); //_action.RemoveAction(uid, component.PhantomStopHauntActionEntity); - var eye = EnsureComp(uid); - _eye.SetDrawFov(uid, false, eye); + // var eye = EnsureComp(uid); + // _eye.SetDrawFov(uid, false, eye); _appearance.SetData(uid, PhantomVisuals.Haunting, false); Dirty(holder, holderComp); @@ -2046,7 +2080,7 @@ public void MakePuppet(EntityUid target, PhantomComponent component) /// Phantom uid /// Phantom component /// Is there are any altars - public bool CheckAltars(EntityUid uid, PhantomComponent component) + public bool CheckAltars(EntityUid uid, PhantomComponent? component = null) { var xformQuery = GetEntityQuery(); @@ -2087,14 +2121,11 @@ public void OnHelpingHandAccept(EntityUid target, PhantomComponent component) /// Target uid (nullable) /// Phantom component /// Is phantom able to use this ability - private bool TryUseAbility(EntityUid uid, EntityUid? trgt = null, PhantomComponent? comp = null) + private bool TryUseAbility(EntityUid uid, EntityUid? trgt = null) { - if (!Resolve(uid, ref comp)) - return false; - if (trgt == null) { - if (CheckAltars(uid, comp)) + if (CheckAltars(uid)) return false; return true; } @@ -2384,7 +2415,7 @@ public void Nightmare(EntityUid uid, PhantomComponent component) return; var ev = new PhantomNightmareEvent(); - RaiseLocalEvent(uid, ev); + RaiseLocalEvent(uid, ref ev); var list = new List(); foreach (var vessel in component.Vessels) @@ -2427,7 +2458,7 @@ public void Tyrany(EntityUid uid, PhantomComponent component) return; var ev = new PhantomTyranyEvent(); - RaiseLocalEvent(uid, ev); + RaiseLocalEvent(uid, ref ev); _alertLevel.SetLevel(stationUid.Value, "delta", false, false, true, true); _chatSystem.DispatchGlobalAnnouncement(Loc.GetString("phantom-tyrany-announcement"), Loc.GetString("phantom-announcer"), true, component.TyranySound, Color.DarkCyan); @@ -2523,7 +2554,7 @@ public void Oblivion(EntityUid uid, PhantomComponent component) { _mindSystem.TransferTo(mindId, human); var ev = new PhantomReincarnatedEvent(); - RaiseLocalEvent(uid, ev); + RaiseLocalEvent(uid, ref ev); QueueDel(uid); _euiManager.OpenEui(new PhantomAmnesiaEui(), selfMind.Session); _audio.PlayGlobal(component.OblivionSong, selfMind.Session); @@ -2574,7 +2605,7 @@ public void Deathmatch(EntityUid uid, PhantomComponent component) { _mindSystem.TransferTo(selfMindId, human); var ev = new PhantomReincarnatedEvent(); - RaiseLocalEvent(uid, ev); + RaiseLocalEvent(uid, ref ev); QueueDel(uid); } } @@ -2606,7 +2637,7 @@ public void Blessing(EntityUid uid, PhantomComponent component) { _mindSystem.TransferTo(selfMindId, human); var ev = new PhantomReincarnatedEvent(); - RaiseLocalEvent(uid, ev); + RaiseLocalEvent(uid, ref ev); QueueDel(uid); _audio.PlayGlobal(component.HelpSong, selfMind.Session); } diff --git a/Content.Server/ADT/Phantom/EntitySystems/VesselSystem.cs b/Content.Server/ADT/Phantom/EntitySystems/VesselSystem.cs index 706cb35c48b..e4344e80410 100644 --- a/Content.Server/ADT/Phantom/EntitySystems/VesselSystem.cs +++ b/Content.Server/ADT/Phantom/EntitySystems/VesselSystem.cs @@ -40,7 +40,7 @@ private void OnShutdown(EntityUid uid, VesselComponent component, ComponentShutd phantom.Vessels.Remove(uid); var ev = new RefreshPhantomLevelEvent(); - RaiseLocalEvent(component.Phantom, ev); + RaiseLocalEvent(component.Phantom, ref ev); _phantom.PopulateVesselMenu(component.Phantom); if (phantom.Holder == uid) @@ -104,7 +104,7 @@ private void OnDeleted(EntityUid uid, VesselComponent component, EntityTerminati phantom.Vessels.Remove(uid); var ev = new RefreshPhantomLevelEvent(); - RaiseLocalEvent(component.Phantom, ev); + RaiseLocalEvent(component.Phantom, ref ev); if (phantom.Holder == uid) _phantom.StopHaunt(component.Phantom, uid, phantom); diff --git a/Content.Server/ADT/Phantom/Role/PhantomRuleComponent.cs b/Content.Server/ADT/Phantom/Role/PhantomRuleComponent.cs index f258a311d03..9dc68c11173 100644 --- a/Content.Server/ADT/Phantom/Role/PhantomRuleComponent.cs +++ b/Content.Server/ADT/Phantom/Role/PhantomRuleComponent.cs @@ -4,6 +4,7 @@ using Content.Shared.Random; using Robust.Shared.Audio; using Content.Shared.Dataset; +using Content.Shared.Mind; namespace Content.Server.GameTicking.Rules.Components; @@ -63,7 +64,7 @@ public sealed partial class PhantomRuleComponent : Component [DataField] public Dictionary OperativeMindPendingData = new(); - public EntityUid PhantomMind = new(); + public Entity PhantomMind = new(); [DataField] public ProtoId ObjectiveGroup = "PhantomObjectiveGroups"; diff --git a/Content.Server/ADT/Phantom/Role/PhantomRuleSystem.cs b/Content.Server/ADT/Phantom/Role/PhantomRuleSystem.cs index 16ef1344fde..2e52bf05724 100644 --- a/Content.Server/ADT/Phantom/Role/PhantomRuleSystem.cs +++ b/Content.Server/ADT/Phantom/Role/PhantomRuleSystem.cs @@ -19,6 +19,8 @@ using Content.Server.Revolutionary.Components; using Content.Shared.Mind; using Content.Shared.GameTicking.Components; +using Content.Shared.Stunnable; +using Content.Shared.Damage; namespace Content.Server.GameTicking.Rules; @@ -33,6 +35,8 @@ public sealed class PhantomRuleSystem : GameRuleSystem [Dependency] private readonly StationSystem _stationSystem = default!; [Dependency] private readonly EmergencyShuttleSystem _emergencyShuttle = default!; [Dependency] private readonly ObjectivesSystem _objectives = default!; + [Dependency] private readonly SharedStunSystem _sharedStun = default!; + [Dependency] private readonly DamageableSystem _damage = default!; private ISawmill _sawmill = default!; @@ -46,6 +50,8 @@ public override void Initialize() SubscribeLocalEvent(OnMobStateChanged); SubscribeLocalEvent(OnMindAdded); + SubscribeLocalEvent(OnNewLevelReached); + SubscribeLocalEvent(OnCommandMobStateChanged); SubscribeLocalEvent(OnTyranyAttempt); @@ -101,8 +107,25 @@ protected override void AppendRoundEndText(EntityUid uid, PhantomRuleComponent c } } - private void OnMobStateChanged(EntityUid uid, PhantomComponent component, PhantomDiedEvent args) + private void OnMobStateChanged(EntityUid uid, PhantomComponent component, ref PhantomDiedEvent args) { + foreach (var vessel in component.Vessels) + { + var stunTime = TimeSpan.FromSeconds(4); + RemComp(uid); + _sharedStun.TryParalyze(vessel, stunTime, true); + } + foreach (var cursed in component.CursedVessels) + { + var damage = new DamageSpecifier(); + damage.DamageDict.Add("Blunt", 200); + damage.DamageDict.Add("Cellular", 200); + _damage.TryChangeDamage(cursed, damage, true); + RemComp(uid); + } + if (HasComp(component.Holder)) + RemCompDeferred(component.Holder); + var ruleQuery = QueryActiveRules(); while (ruleQuery.MoveNext(out _, out _, out var phantom, out _)) { @@ -113,7 +136,7 @@ private void OnMobStateChanged(EntityUid uid, PhantomComponent component, Phanto } } - private void OnTyranyAttempt(EntityUid uid, PhantomComponent component, PhantomTyranyEvent args) + private void OnTyranyAttempt(EntityUid uid, PhantomComponent component, ref PhantomTyranyEvent args) { var ruleQuery = QueryActiveRules(); while (ruleQuery.MoveNext(out _, out _, out var phantom, out _)) @@ -123,7 +146,7 @@ private void OnTyranyAttempt(EntityUid uid, PhantomComponent component, PhantomT } } - private void OnNightmareAttempt(EntityUid uid, PhantomComponent component, PhantomNightmareEvent args) + private void OnNightmareAttempt(EntityUid uid, PhantomComponent component, ref PhantomNightmareEvent args) { var ruleQuery = QueryActiveRules(); while (ruleQuery.MoveNext(out _, out _, out var phantom, out _)) @@ -133,7 +156,7 @@ private void OnNightmareAttempt(EntityUid uid, PhantomComponent component, Phant } } - private void OnReincarnation(EntityUid uid, PhantomComponent component, PhantomReincarnatedEvent args) + private void OnReincarnation(EntityUid uid, PhantomComponent component, ref PhantomReincarnatedEvent args) { var ruleQuery = QueryActiveRules(); while (ruleQuery.MoveNext(out _, out _, out var phantom, out _)) @@ -155,9 +178,13 @@ private void OnMindAdded(EntityUid uid, PhantomComponent component, MindAddedMes while (query.MoveNext(out _, out _, out var nukeops, out _)) { _roles.MindAddRole(mindId, new PhantomRoleComponent { PrototypeId = "Phantom" }); - AddObjectives(mindId, mind, nukeops); + var finObjective = _objectives.GetRandomObjective(mindId, mind, nukeops.FinalObjectiveGroup, 10f); + if (finObjective == null) + return; + + _mind.AddObjective(mindId, mind, finObjective.Value); nukeops.OperativeMindPendingData.Remove(uid); - nukeops.PhantomMind = mindId; + nukeops.PhantomMind = (mindId, mind); _antagSelection.SendBriefing(mind.Session, Loc.GetString("phantom-welcome"), Color.BlueViolet, component.GreetSoundNotification); if (mind.Session is not { } playerSession) @@ -168,6 +195,21 @@ private void OnMindAdded(EntityUid uid, PhantomComponent component, MindAddedMes } } + private void OnNewLevelReached(EntityUid uid, PhantomComponent component, ref PhantomLevelReachedEvent args) + { + var ruleQuery = QueryActiveRules(); + while (ruleQuery.MoveNext(out _, out _, out var phantom, out _)) + { + var objective = _objectives.GetRandomObjective(phantom.PhantomMind.Owner, phantom.PhantomMind.Comp, phantom.ObjectiveGroup, _cfg.GetCVar(CCVars.PhantomMaxDifficulty)); + if (objective == null) + continue; + + _mind.AddObjective(phantom.PhantomMind.Owner, phantom.PhantomMind.Comp, objective.Value); + var adding = Comp(objective.Value).Difficulty; + Log.Debug($"Added objective {ToPrettyString(objective):objective} with {adding} difficulty"); + } + } + private void SetWinType(EntityUid uid, PhantomWinType type, PhantomRuleComponent? component = null, bool endRound = true) { if (!Resolve(uid, ref component)) diff --git a/Content.Server/Objectives/Systems/KillPhantomImmunePersonConditionSystem.cs b/Content.Server/Objectives/Systems/KillPhantomImmunePersonConditionSystem.cs index 91e3080c93d..d1529cc50d2 100644 --- a/Content.Server/Objectives/Systems/KillPhantomImmunePersonConditionSystem.cs +++ b/Content.Server/Objectives/Systems/KillPhantomImmunePersonConditionSystem.cs @@ -8,7 +8,7 @@ using Robust.Shared.Random; using Content.Shared.ADT.Phantom.Components; -namespace Content.Server.Objectives.Systems; +namespace Content.Server.Objectives.Systems; // ADT file /// /// Handles kill person condition logic and picking random kill targets. @@ -59,9 +59,19 @@ private void OnPersonAssigned(EntityUid uid, PickPhantomImmunePersonComponent co args.Cancelled = true; return; } + var resultList = new List(); + + foreach (var item in allHumans) // Don't pick heads because they may be tyrany targets + { + if (_job.MindTryGetJob(item, out _, out var prototype) && prototype.RequireAdminNotify) // Why is it named RequireAdminNotify? Anyway, this checks if this mind is a command staff + continue; + resultList.Add(item); + } + var pickedTarget = _random.Pick(resultList); + + if (TryComp(pickedTarget, out var mind) && mind.OwnedEntity != null) + EnsureComp(mind.OwnedEntity.Value); - var pickedTarget = _random.Pick(allHumans); - EnsureComp(pickedTarget); _target.SetTarget(uid, pickedTarget, target); } diff --git a/Content.Server/Objectives/Systems/MakeTargetVesselConditionComponent.cs b/Content.Server/Objectives/Systems/MakeTargetVesselConditionComponent.cs index 947f694a98a..1d4d8bfc381 100644 --- a/Content.Server/Objectives/Systems/MakeTargetVesselConditionComponent.cs +++ b/Content.Server/Objectives/Systems/MakeTargetVesselConditionComponent.cs @@ -8,10 +8,10 @@ using Robust.Shared.Random; using Content.Shared.ADT.Phantom.Components; -namespace Content.Server.Objectives.Systems; +namespace Content.Server.Objectives.Systems; // ADT filt /// -/// Handles kill person condition logic and picking random kill targets. +/// Handles turning person into a vessel /// public sealed class MakeTargetVesselConditionSystem : EntitySystem { diff --git a/Content.Server/Objectives/Systems/PhantomNightmareStartedConditionSystem.cs b/Content.Server/Objectives/Systems/PhantomNightmareStartedConditionSystem.cs index d9fcf804b91..66fe25fe848 100644 --- a/Content.Server/Objectives/Systems/PhantomNightmareStartedConditionSystem.cs +++ b/Content.Server/Objectives/Systems/PhantomNightmareStartedConditionSystem.cs @@ -8,10 +8,10 @@ using Robust.Shared.Random; using Content.Shared.ADT.Phantom.Components; -namespace Content.Server.Objectives.Systems; +namespace Content.Server.Objectives.Systems; // ADT file /// -/// Handles kill person condition logic and picking random kill targets. +/// Final phantom objective /// public sealed class PhantomNightmareStartedConditionSystem : EntitySystem { diff --git a/Content.Server/Objectives/Systems/PhantomReincarnateConditionSystem.cs b/Content.Server/Objectives/Systems/PhantomReincarnateConditionSystem.cs index 79ba4971577..d7355b54383 100644 --- a/Content.Server/Objectives/Systems/PhantomReincarnateConditionSystem.cs +++ b/Content.Server/Objectives/Systems/PhantomReincarnateConditionSystem.cs @@ -8,10 +8,10 @@ using Robust.Shared.Random; using Content.Shared.ADT.Phantom.Components; -namespace Content.Server.Objectives.Systems; +namespace Content.Server.Objectives.Systems; // ADT file /// -/// Handles kill person condition logic and picking random kill targets. +/// Final phantom objective /// public sealed class PhantomReincarnateConditionSystem : EntitySystem { diff --git a/Content.Server/Objectives/Systems/PhantomTyranyConditionSystem.cs b/Content.Server/Objectives/Systems/PhantomTyranyConditionSystem.cs index e9ec5f02b0d..43aaf91d3b3 100644 --- a/Content.Server/Objectives/Systems/PhantomTyranyConditionSystem.cs +++ b/Content.Server/Objectives/Systems/PhantomTyranyConditionSystem.cs @@ -13,10 +13,10 @@ using Content.Shared.Mobs.Components; using Content.Server.Revolutionary.Components; -namespace Content.Server.Objectives.Systems; +namespace Content.Server.Objectives.Systems; // ADT file /// -/// Handles kill person condition logic and picking random kill targets. +/// Final phantom objective /// public sealed class PhantomTyranyConditionSystem : EntitySystem { @@ -76,6 +76,6 @@ private float GetProgress(EntityUid? uid) } } - return Math.Clamp(dead / commandList.Count, 0f, 1f); + return Math.Clamp(dead / commandList.Count, 0f, component.TyranyStarted ? 1f : 0.8f); } } diff --git a/Content.Server/Solar/Components/SolarPanelComponent.cs b/Content.Server/Solar/Components/SolarPanelComponent.cs index 870b4c78ef1..db8aa638a8f 100644 --- a/Content.Server/Solar/Components/SolarPanelComponent.cs +++ b/Content.Server/Solar/Components/SolarPanelComponent.cs @@ -15,7 +15,7 @@ public sealed partial class SolarPanelComponent : Component /// Maximum supply output by this panel (coverage = 1) /// [DataField("maxSupply")] - public int MaxSupply = 750; + public int MaxSupply = 1875; ///ADT_Tweak /// /// Current coverage of this panel (from 0 to 1). diff --git a/Content.Shared/ADT/Hallucinations/Components/HallucinationsDiseaseComponent.cs b/Content.Shared/ADT/Hallucinations/Components/HallucinationsDiseaseComponent.cs index e78a2a74d94..a669c4524d6 100644 --- a/Content.Shared/ADT/Hallucinations/Components/HallucinationsDiseaseComponent.cs +++ b/Content.Shared/ADT/Hallucinations/Components/HallucinationsDiseaseComponent.cs @@ -38,6 +38,9 @@ public sealed partial class HallucinationsDiseaseComponent : Component [DataField, ViewVariables(VVAccess.ReadWrite)] public float CurChance = 0.1f; + [DataField, ViewVariables(VVAccess.ReadWrite)] + public TimeSpan? EndTime; + public List Spawns = new(); [DataField] diff --git a/Content.Shared/ADT/NightVision/ADTNightVisionVisibleComponent.cs b/Content.Shared/ADT/NightVision/ADTNightVisionVisibleComponent.cs new file mode 100644 index 00000000000..6c5a997453e --- /dev/null +++ b/Content.Shared/ADT/NightVision/ADTNightVisionVisibleComponent.cs @@ -0,0 +1,25 @@ +// taken and adapted from https://github.com/RMC-14/RMC-14?ysclid=lzx00zxd6e53093995 + +using Robust.Shared.GameStates; + +namespace Content.Shared.ADT.NightVision; + +/// +/// For rendering sprites on top of FOV when the user has a . +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class NightVisionVisibleComponent : Component +{ + /// + /// Priority for rendering order. + /// Rendered from lowest to highest, which means higher numbers will be rendered above lower numbers. + /// + [DataField, AutoNetworkedField] + public int Priority = 0; + + /// + /// Transparency of the rendered sprite. + /// + [DataField, AutoNetworkedField] + public float? Transparency = null; +} diff --git a/Content.Shared/ADT/NightVision/NightVisionComponent.cs b/Content.Shared/ADT/NightVision/NightVisionComponent.cs new file mode 100644 index 00000000000..f51be334412 --- /dev/null +++ b/Content.Shared/ADT/NightVision/NightVisionComponent.cs @@ -0,0 +1,36 @@ +// taken and adapted from https://github.com/RMC-14/RMC-14?ysclid=lzx00zxd6e53093995 + +using Content.Shared.Alert; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; + +namespace Content.Shared.ADT.NightVision; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] +[Access(typeof(SharedNightVisionSystem))] +public sealed partial class NightVisionComponent : Component +{ + [DataField] + public ProtoId? Alert; + + [DataField, AutoNetworkedField] + public NightVisionState State = NightVisionState.Full; + + [DataField, AutoNetworkedField] + public bool Overlay; + + [DataField, AutoNetworkedField] + public bool Innate; + + [DataField, AutoNetworkedField] + public bool SeeThroughContainers; +} + +[Serializable, NetSerializable] +public enum NightVisionState +{ + Off, + Half, + Full +} diff --git a/Content.Shared/ADT/NightVision/NightVisionItemComponent.cs b/Content.Shared/ADT/NightVision/NightVisionItemComponent.cs new file mode 100644 index 00000000000..887d94c0a5a --- /dev/null +++ b/Content.Shared/ADT/NightVision/NightVisionItemComponent.cs @@ -0,0 +1,28 @@ +// taken and adapted from https://github.com/RMC-14/RMC-14?ysclid=lzx00zxd6e53093995 + +using Content.Shared.Inventory; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.ADT.NightVision; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(SharedNightVisionSystem))] +public sealed partial class NightVisionItemComponent : Component +{ + [DataField, AutoNetworkedField] + public EntProtoId ActionId = "ActionToggleNinjaNightVision"; + + [DataField, AutoNetworkedField] + public EntityUid? Action; + + [DataField, AutoNetworkedField] + public EntityUid? User; + + [DataField, AutoNetworkedField] + public bool Toggleable = true; + + // Only allows for a single slotflag right now because some code uses strings and some code uses enums to determine slots :( + [DataField, AutoNetworkedField] + public SlotFlags SlotFlags { get; set; } = SlotFlags.EYES; +} diff --git a/Content.Shared/ADT/NightVision/NightVisionItemVisuals.cs b/Content.Shared/ADT/NightVision/NightVisionItemVisuals.cs new file mode 100644 index 00000000000..a0602cd1910 --- /dev/null +++ b/Content.Shared/ADT/NightVision/NightVisionItemVisuals.cs @@ -0,0 +1,11 @@ +// taken and adapted from https://github.com/RMC-14/RMC-14?ysclid=lzx00zxd6e53093995 + +using Robust.Shared.Serialization; + +namespace Content.Shared.ADT.NightVision; + +[Serializable, NetSerializable] +public enum NightVisionItemVisuals +{ + Active, +} diff --git a/Content.Shared/ADT/NightVision/SharedNightVisionSystem.cs b/Content.Shared/ADT/NightVision/SharedNightVisionSystem.cs new file mode 100644 index 00000000000..85a7bff3663 --- /dev/null +++ b/Content.Shared/ADT/NightVision/SharedNightVisionSystem.cs @@ -0,0 +1,201 @@ +// taken and adapted from https://github.com/RMC-14/RMC-14?ysclid=lzx00zxd6e53093995 + +using Content.Shared.Actions; +using Content.Shared.Alert; +using Content.Shared.Inventory.Events; +using Content.Shared.Rounding; +using Content.Shared.Toggleable; +using Robust.Shared.Timing; + +namespace Content.Shared.ADT.NightVision; + +public abstract class SharedNightVisionSystem : EntitySystem +{ + [Dependency] private readonly SharedActionsSystem _actions = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly AlertsSystem _alerts = default!; + [Dependency] private readonly IGameTiming _timing = default!; + + public override void Initialize() + { + SubscribeLocalEvent(OnNightVisionStartup); + SubscribeLocalEvent(OnNightVisionMapInit); + SubscribeLocalEvent(OnNightVisionAfterHandle); + SubscribeLocalEvent(OnNightVisionRemove); + + SubscribeLocalEvent(OnNightVisionItemGetActions); + SubscribeLocalEvent(OnNightVisionItemToggle); + SubscribeLocalEvent(OnNightVisionItemGotEquipped); + SubscribeLocalEvent(OnNightVisionItemGotUnequipped); + SubscribeLocalEvent(OnNightVisionItemActionRemoved); + SubscribeLocalEvent(OnNightVisionItemRemove); + SubscribeLocalEvent(OnNightVisionItemTerminating); + } + + private void OnNightVisionStartup(Entity ent, ref ComponentStartup args) + { + NightVisionChanged(ent); + } + + private void OnNightVisionAfterHandle(Entity ent, ref AfterAutoHandleStateEvent args) + { + NightVisionChanged(ent); + } + + private void OnNightVisionMapInit(Entity ent, ref MapInitEvent args) + { + UpdateAlert(ent); + } + + private void OnNightVisionRemove(Entity ent, ref ComponentRemove args) + { + if (ent.Comp.Alert is { } alert) + _alerts.ClearAlert(ent, alert); + + NightVisionRemoved(ent); + } + + private void OnNightVisionItemGetActions(Entity ent, ref GetItemActionsEvent args) + { + if (args.InHands || !ent.Comp.Toggleable) + return; + + if (ent.Comp.SlotFlags != args.SlotFlags) + return; + + args.AddAction(ref ent.Comp.Action, ent.Comp.ActionId); + } + + private void OnNightVisionItemToggle(Entity ent, ref ToggleActionEvent args) + { + if (args.Handled) + return; + + args.Handled = true; + ToggleNightVisionItem(ent, args.Performer); + } + + private void OnNightVisionItemGotEquipped(Entity ent, ref GotEquippedEvent args) + { + if (ent.Comp.SlotFlags != args.SlotFlags) + return; + + EnableNightVisionItem(ent, args.Equipee); + } + + private void OnNightVisionItemGotUnequipped(Entity ent, ref GotUnequippedEvent args) + { + if (ent.Comp.SlotFlags != args.SlotFlags) + return; + + DisableNightVisionItem(ent, args.Equipee); + } + + private void OnNightVisionItemActionRemoved(Entity ent, ref ActionRemovedEvent args) + { + DisableNightVisionItem(ent, ent.Comp.User); + } + + private void OnNightVisionItemRemove(Entity ent, ref ComponentRemove args) + { + DisableNightVisionItem(ent, ent.Comp.User); + } + + private void OnNightVisionItemTerminating(Entity ent, ref EntityTerminatingEvent args) + { + DisableNightVisionItem(ent, ent.Comp.User); + } + + public void Toggle(Entity ent) + { + if (!Resolve(ent, ref ent.Comp)) + return; + + ent.Comp.State = ent.Comp.State switch + { + NightVisionState.Off => NightVisionState.Half, + NightVisionState.Half => NightVisionState.Full, + NightVisionState.Full => NightVisionState.Off, + _ => throw new ArgumentOutOfRangeException(), + }; + + Dirty(ent); + UpdateAlert((ent, ent.Comp)); + } + + private void UpdateAlert(Entity ent) + { + if (ent.Comp.Alert is { } alert) + { + var level = MathF.Max((int) NightVisionState.Off, (int) ent.Comp.State); + var max = _alerts.GetMaxSeverity(alert); + var severity = max - ContentHelpers.RoundToLevels(level, (int) NightVisionState.Full, max + 1); + _alerts.ShowAlert(ent, alert, (short) severity); + } + + NightVisionChanged(ent); + } + + private void ToggleNightVisionItem(Entity item, EntityUid user) + { + if (item.Comp.User == user && item.Comp.Toggleable) + { + DisableNightVisionItem(item, item.Comp.User); + return; + } + + EnableNightVisionItem(item, user); + } + + private void EnableNightVisionItem(Entity item, EntityUid user) + { + DisableNightVisionItem(item, item.Comp.User); + + item.Comp.User = user; + Dirty(item); + + _appearance.SetData(item, NightVisionItemVisuals.Active, true); + + if (!_timing.ApplyingState) + { + var nightVision = EnsureComp(user); + nightVision.State = NightVisionState.Full; + Dirty(user, nightVision); + } + + _actions.SetToggled(item.Comp.Action, true); + } + + protected virtual void NightVisionChanged(Entity ent) + { + } + + protected virtual void NightVisionRemoved(Entity ent) + { + } + + protected void DisableNightVisionItem(Entity item, EntityUid? user) + { + _actions.SetToggled(item.Comp.Action, false); + + item.Comp.User = null; + Dirty(item); + + _appearance.SetData(item, NightVisionItemVisuals.Active, false); + + if (TryComp(user, out NightVisionComponent? nightVision) && + !nightVision.Innate) + { + RemCompDeferred(user.Value); + } + } + + public void SetSeeThroughContainers(Entity ent, bool see) + { + if (!Resolve(ent, ref ent.Comp, false)) + return; + + ent.Comp.SeeThroughContainers = see; + Dirty(ent); + } +} diff --git a/Content.Shared/ADT/NightVision/ToggleNightVision.cs b/Content.Shared/ADT/NightVision/ToggleNightVision.cs new file mode 100644 index 00000000000..d7b3a10f064 --- /dev/null +++ b/Content.Shared/ADT/NightVision/ToggleNightVision.cs @@ -0,0 +1,13 @@ +using Content.Shared.Alert; + +namespace Content.Shared.ADT.NightVision; + +[DataDefinition] +public sealed partial class ToggleNightVision : IAlertClick +{ + public void AlertClicked(EntityUid player) + { + var entities = IoCManager.Resolve(); + entities.System().Toggle(player); + } +} diff --git a/Content.Shared/ADT/Phantom/Components/PhantomComponent.cs b/Content.Shared/ADT/Phantom/Components/PhantomComponent.cs index b800e000bed..03bba9d56ba 100644 --- a/Content.Shared/ADT/Phantom/Components/PhantomComponent.cs +++ b/Content.Shared/ADT/Phantom/Components/PhantomComponent.cs @@ -310,9 +310,6 @@ public sealed partial class PhantomComponent : Component [ViewVariables(VVAccess.ReadWrite)] public Container HelpingHand = default!; - [ViewVariables(VVAccess.ReadWrite)] - public bool EpidemicActive = false; - [DataField] public int HelpingHandDuration = 10; public int HelpingHandTimer = 0; @@ -330,6 +327,9 @@ public sealed partial class PhantomComponent : Component [DataField] public bool IgnoreLevels = false; + + [DataField] + public int MaxReachedLevel = 0; #region Finale [DataField] public bool FinalAbilityUsed = false; diff --git a/Content.Shared/ADT/Phantom/SharedPhantom.cs b/Content.Shared/ADT/Phantom/SharedPhantom.cs index 0a440c683a5..0040676050b 100644 --- a/Content.Shared/ADT/Phantom/SharedPhantom.cs +++ b/Content.Shared/ADT/Phantom/SharedPhantom.cs @@ -145,40 +145,23 @@ public sealed partial class PuppeterDoAfterEvent : SimpleDoAfterEvent #endregion #region Events -public sealed class RefreshPhantomLevelEvent : EntityEventArgs -{ - public RefreshPhantomLevelEvent() - { - } -} +[ByRefEvent] +public record struct RefreshPhantomLevelEvent(); -public sealed class PhantomReincarnatedEvent : EntityEventArgs -{ - public PhantomReincarnatedEvent() - { - } -} +[ByRefEvent] +public record struct PhantomReincarnatedEvent(); -public sealed class PhantomDiedEvent : EntityEventArgs -{ - public PhantomDiedEvent() - { - } -} +[ByRefEvent] +public record struct PhantomDiedEvent(); -public sealed class PhantomTyranyEvent : EntityEventArgs -{ - public PhantomTyranyEvent() - { - } -} +[ByRefEvent] +public record struct PhantomTyranyEvent(); -public sealed class PhantomNightmareEvent : EntityEventArgs -{ - public PhantomNightmareEvent() - { - } -} +[ByRefEvent] +public record struct PhantomNightmareEvent(); + +[ByRefEvent] +public record struct PhantomLevelReachedEvent(int Level); [DataDefinition] public sealed partial class EctoplasmHitscanHitEvent : EntityEventArgs diff --git a/Content.Shared/ADT/Phantom/Systems/SharedPhantomSystem.cs b/Content.Shared/ADT/Phantom/Systems/SharedPhantomSystem.cs index 1593c5d9890..b85d612c995 100644 --- a/Content.Shared/ADT/Phantom/Systems/SharedPhantomSystem.cs +++ b/Content.Shared/ADT/Phantom/Systems/SharedPhantomSystem.cs @@ -62,6 +62,13 @@ public void SelectStyle(EntityUid uid, PhantomComponent component, string style, if (level > 9 && curseds > 1) AddFromList(uid, component, proto.Lvl5Actions); component.CurrentStyle = style; + + if (component.MaxReachedLevel < level) + { + var ev = new PhantomLevelReachedEvent(level); + component.MaxReachedLevel = level; + RaiseLocalEvent(uid, ref ev); + } } /// diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 945172f31fe..434cd10a606 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -1110,7 +1110,7 @@ public static readonly CVarDef /// Whether gas differences will move entities. /// public static readonly CVarDef SpaceWind = - CVarDef.Create("atmos.space_wind", false, CVar.SERVERONLY); + CVarDef.Create("atmos.space_wind", true, CVar.SERVERONLY); ///ADT /// /// Divisor from maxForce (pressureDifference * 2.25f) to force applied on objects. @@ -1159,7 +1159,7 @@ public static readonly CVarDef /// Also looks weird on slow spacing for unrelated reasons. If you do want to enable this, you should probably turn on instaspacing. /// public static readonly CVarDef MonstermosRipTiles = - CVarDef.Create("atmos.monstermos_rip_tiles", false, CVar.SERVERONLY); + CVarDef.Create("atmos.monstermos_rip_tiles", true, CVar.SERVERONLY); ///ADT /// /// Whether explosive depressurization will cause the grid to gain an impulse. diff --git a/Content.Shared/Preferences/HumanoidCharacterProfile.cs b/Content.Shared/Preferences/HumanoidCharacterProfile.cs index b0579b09797..e6873680a47 100644 --- a/Content.Shared/Preferences/HumanoidCharacterProfile.cs +++ b/Content.Shared/Preferences/HumanoidCharacterProfile.cs @@ -30,7 +30,7 @@ public sealed partial class HumanoidCharacterProfile : ICharacterProfile private static readonly Regex RestrictedNameRegex = new("[^А-Яа-яёЁ0-9' -]"); // Corvax-Localization private static readonly Regex ICNameCaseRegex = new(@"^(?\w)|\b(?\w)(?=\w*$)"); - public const int MaxNameLength = 32; + public const int MaxNameLength = 96; // ну тип ADT public const int MaxDescLength = 512; /// diff --git a/Content.Shared/Revolutionary/SharedRevolutionarySystem.cs b/Content.Shared/Revolutionary/SharedRevolutionarySystem.cs index bbf91193cc3..f6cf9e5ffa4 100644 --- a/Content.Shared/Revolutionary/SharedRevolutionarySystem.cs +++ b/Content.Shared/Revolutionary/SharedRevolutionarySystem.cs @@ -6,6 +6,7 @@ using Robust.Shared.GameStates; using Robust.Shared.Player; using Content.Shared.Antag; +using Content.Shared.ADT.Phantom.Components; namespace Content.Shared.Revolutionary; @@ -45,6 +46,20 @@ private void MindShieldImplanted(EntityUid uid, MindShieldComponent comp, MapIni _sharedStun.TryParalyze(uid, stunTime, true); _popupSystem.PopupEntity(Loc.GetString("rev-break-control", ("name", name)), uid); } + // who and why have done it THIS way + // ADT phantom start + if (HasComp(uid)) + { + if (HasComp(uid)) + RemCompDeferred(uid); + else + { + var stunTime = TimeSpan.FromSeconds(4); + RemComp(uid); + _sharedStun.TryParalyze(uid, stunTime, true); + } + } + // ADT phantom end } /// diff --git a/Resources/Changelog/ChangelogADT.yml b/Resources/Changelog/ChangelogADT.yml index 8f3c304674f..972b4d25145 100644 --- a/Resources/Changelog/ChangelogADT.yml +++ b/Resources/Changelog/ChangelogADT.yml @@ -2210,3 +2210,72 @@ Entries: type: Fix} time: '2024-08-13T18:21:15Z' id: 239 + - author: Котя + changes: + - {message: Исправлено проигрывание барков на дальних дистанциях, type: Fix} + - {message: Исправлена видимость призраков при галлюцинациях, type: Fix} + - {message: Исправлены пустые сообщения, type: Fix} + time: '2024-08-14T14:37:39Z' + id: 240 + - author: Котя + changes: + - {message: Исправлен спавн КПБ без ключей шифрования, type: Fix} + time: '2024-08-14T14:38:48Z' + id: 241 + - author: Darki255 + changes: + - {message: 'Добавлены рога, кастомизация', type: Add} + time: '2024-08-14T20:49:52Z' + id: 242 + - author: FaDeOkno + changes: + - {message: Фикс языков фантома, type: Fix} + time: '2024-08-15T10:43:24Z' + id: 243 + - author: KashRas2 + changes: + - {message: 'Временно отключил ттс у вендоматов, чтоб зря не нагружали наши + 4 запроса в секунду.', type: Tweak} + time: '2024-08-15T20:09:22Z' + id: 244 + - author: FaDeOkno + changes: + - {message: Фикс галлюцинаций фантома, type: Fix} + time: '2024-08-15T20:10:03Z' + id: 245 + - author: AserCreator + changes: + - {message: Средний ракетный двигатель. Занимает 2х2 тайла., type: Add} + - {message: Большой ракетный двигатель. Занимает 3х3 тайлов., type: Add} + - {message: У старых спрайтов двигателей была ассиметрия. Больше нет., type: Fix} + - {message: Коллизия двигателей подогнана под размеры. Ставим 2+ тайла перед + двигателем вместо 1 под ним., type: Fix} + time: '2024-08-17T12:16:42Z' + id: 246 + - author: jungarikjan + changes: + - {message: Добавлено ночное зрение визору ниндзя + сама система, type: Add} + time: '2024-08-17T12:18:52Z' + id: 247 + - author: Котя + changes: + - {message: Теперь фантом может перехватывать контроль тела только если цель + является сосудом., type: Tweak} + - {message: 'Фантом больше не может использовать способности выше 1 уровня на + персонажах, имеющих имплант защиты разума.', type: Tweak} + - {message: Стоимость крафтов защиты от фантома снизилась в несколько раз., + type: Tweak} + - {message: 'Психо-эпидемия теперь заканчивается, если молчать и не слышать + никого 15 секунд.', type: Tweak} + - {message: Фантом получает новые цели одновременно с созданием сосудов., type: Tweak} + - {message: Речь фантома теперь видна для призракам., type: Tweak} + - {message: Проклятые умирают вместе с фантомом., type: Tweak} + - {message: После смерти фантома сосуды и проклятые теряют этот статус., type: Tweak} + - {message: Исправлено игнорирование фантомом МЩ., type: Fix} + time: '2024-08-17T13:23:30Z' + id: 248 + - author: Котя + changes: + - {message: Снова можно делать длинные имена, type: Tweak} + time: '2024-08-17T13:29:04Z' + id: 249 diff --git a/Resources/Locale/ru-RU/ADT/Phantom/game-rule.ftl b/Resources/Locale/ru-RU/ADT/Phantom/game-rule.ftl index aa20446c602..127603829c4 100644 --- a/Resources/Locale/ru-RU/ADT/Phantom/game-rule.ftl +++ b/Resources/Locale/ru-RU/ADT/Phantom/game-rule.ftl @@ -20,5 +20,6 @@ phantom-cond-maxphantomlevelreached = Фантом достиг максимал phantom-welcome = Вы - неупокоенный дух, способный воздействовать на реальность. Пути к выполнению ваших целей могут быть любыми, ограничивает вас лишь фантазия. + Ваши цели будут появляться по мере создания СОСУДОВ, потому следите за их списком. objective-issuer-phantom = [color=#6505ff]Фантом[/color] diff --git a/Resources/Locale/ru-RU/ADT/Phantom/phantom.ftl b/Resources/Locale/ru-RU/ADT/Phantom/phantom.ftl index 2f5400d3862..60839f45c55 100644 --- a/Resources/Locale/ru-RU/ADT/Phantom/phantom.ftl +++ b/Resources/Locale/ru-RU/ADT/Phantom/phantom.ftl @@ -100,6 +100,9 @@ phantom-claws-disappear-self = Призрачные когти исчезают. phantom-fail-nohuman = {CAPITALIZE($target)} не гуманоид. +phantom-fail-mindshield = Имплант защиты разума {CAPITALIZE($target)} не позволяет это сделать. + +phantom-vessel-removed = {CAPITALIZE($target)} больше не является сосудом. # Alerts diff --git a/Resources/Locale/ru-RU/ADT/prototypes/Entities/Clothing/Shoes/specific.ftl b/Resources/Locale/ru-RU/ADT/prototypes/Entities/Clothing/Shoes/specific.ftl new file mode 100644 index 00000000000..61e77a0e63a --- /dev/null +++ b/Resources/Locale/ru-RU/ADT/prototypes/Entities/Clothing/Shoes/specific.ftl @@ -0,0 +1,23 @@ +ent-ADTClothingFootWrapsBlack = черные обмотки для ног + .desc = Пара кусков ткани для тех, кому некомфортно в обычных человеческих ботинках. + .suffix = { "" } + +ent-ADTClothingFootWrapsWhite = белые обмотки для ног + .desc = Пара кусков ткани для тех, кому некомфортно в обычных человеческих ботинках. + .suffix = { "" } + +ent-ADTClothingFootWrapsHighBlack = черные высокие обмотки для ног + .desc = Пара кусков ткани для тех, кому некомфортно в обычных человеческих ботинках. + .suffix = { "" } + +ent-ADTClothingFootWrapsHighWhite = белые высокие обмотки для ног + .desc = Пара кусков ткани для тех, кому некомфортно в обычных человеческих ботинках. + .suffix = { "" } + +ent-ADTClothingFootWrapsBrown = коричневые обмотки для ног + .desc = Пара кусков ткани для тех, кому некомфортно в обычных человеческих ботинках. + .suffix = { "" } + +ent-ADTClothingFootWrapsHighBrown = коричневые высокие обмотки для ног + .desc = Пара кусков ткани для тех, кому некомфортно в обычных человеческих ботинках. + .suffix = { "" } diff --git a/Resources/Prototypes/ADT/Actions/nightvision.yml b/Resources/Prototypes/ADT/Actions/nightvision.yml new file mode 100644 index 00000000000..d22c98b6cf7 --- /dev/null +++ b/Resources/Prototypes/ADT/Actions/nightvision.yml @@ -0,0 +1,16 @@ +- type: entity + id: ActionToggleNinjaNightVision + categories: [HideSpawnMenu] + name: Toggle ninja visor nightvision + description: Allows you to see even in complete darkness. + components: + - type: InstantAction + icon: + sprite: Clothing/Eyes/Glasses/ninjavisor.rsi + state: icon + iconOn: + sprite: Clothing/Eyes/Glasses/ninjavisor.rsi + state: icon + event: !type:ToggleActionEvent + useDelay: 0.25 + diff --git a/Resources/Prototypes/ADT/Catalog/Cargo/cargo_engines.yml b/Resources/Prototypes/ADT/Catalog/Cargo/cargo_engines.yml new file mode 100644 index 00000000000..94545d0cd5f --- /dev/null +++ b/Resources/Prototypes/ADT/Catalog/Cargo/cargo_engines.yml @@ -0,0 +1,20 @@ + +- type: cargoProduct + id: EngineeringAMEShielding + icon: + sprite: Objects/Devices/flatpack.rsi + state: ame-part + product: CrateEngineeringAMEShielding + cost: 7500 + category: cargoproduct-category-name-engineering + group: market + +- type: cargoProduct + id: EngineeringAMEControl + icon: + sprite: Structures/Power/Generation/ame.rsi + state: control + product: CrateEngineeringAMEControl + cost: 2500 + category: cargoproduct-category-name-engineering + group: market diff --git a/Resources/Prototypes/ADT/Entities/Clothing/Shoes/specific.yml b/Resources/Prototypes/ADT/Entities/Clothing/Shoes/specific.yml new file mode 100644 index 00000000000..97307bee2bc --- /dev/null +++ b/Resources/Prototypes/ADT/Entities/Clothing/Shoes/specific.yml @@ -0,0 +1,71 @@ +- type: entity + parent: ClothingShoesBaseButcherable + id: ADTClothingFootWrapsWhite + name: white footwraps + description: Pair of pieces of clothing for those who are uncomfortable with ordinary shoes. + components: + - type: Sprite + sprite: ADT/Clothing/Shoes/Specific/white_footwraps.rsi #спрайты от floppo4ka + state: icon + - type: Clothing + sprite: ADT/Clothing/Shoes/Specific/white_footwraps.rsi #спрайты от floppo4ka + +- type: entity + parent: ClothingShoesBaseButcherable + id: ADTClothingFootWrapsBlack + name: black footwraps + description: Pair of pieces of clothing for those who are uncomfortable with ordinary shoes. + components: + - type: Sprite + sprite: ADT/Clothing/Shoes/Specific/black_footwraps.rsi #спрайты от floppo4ka + state: icon + - type: Clothing + sprite: ADT/Clothing/Shoes/Specific/black_footwraps.rsi #спрайты от floppo4ka + +- type: entity + parent: ClothingShoesBaseButcherable + id: ADTClothingFootWrapsHighBlack + name: high black footwraps + description: Pair of pieces of clothing for those who are uncomfortable with ordinary shoes. + components: + - type: Sprite + sprite: ADT/Clothing/Shoes/Specific/blackhigh_footwraps.rsi #спрайты от floppo4ka + state: icon + - type: Clothing + sprite: ADT/Clothing/Shoes/Specific/blackhigh_footwraps.rsi #спрайты от floppo4ka + +- type: entity + parent: ClothingShoesBaseButcherable + id: ADTClothingFootWrapsHighWhite + name: high white footwraps + description: Pair of pieces of clothing for those who are uncomfortable with ordinary shoes. + components: + - type: Sprite + sprite: ADT/Clothing/Shoes/Specific/whitehigh_footwraps.rsi #спрайты от floppo4ka + state: icon + - type: Clothing + sprite: ADT/Clothing/Shoes/Specific/whitehigh_footwraps.rsi #спрайты от floppo4ka + +- type: entity + parent: ClothingShoesBaseButcherable + id: ADTClothingFootWrapsBrown + name: brown footwraps + description: Pair of pieces of clothing for those who are uncomfortable with ordinary shoes. + components: + - type: Sprite + sprite: ADT/Clothing/Shoes/Specific/brown_footwraps.rsi #спрайты от floppo4ka + state: icon + - type: Clothing + sprite: ADT/Clothing/Shoes/Specific/brown_footwraps.rsi #спрайты от floppo4ka + +- type: entity + parent: ClothingShoesBaseButcherable + id: ADTClothingFootWrapsHighBrown + name: brown white footwraps + description: Pair of pieces of clothing for those who are uncomfortable with ordinary shoes. + components: + - type: Sprite + sprite: ADT/Clothing/Shoes/Specific/brownhigh_footwraps.rsi #спрайты от floppo4ka + state: icon + - type: Clothing + sprite: ADT/Clothing/Shoes/Specific/brownhigh_footwraps.rsi #спрайты от floppo4ka diff --git a/Resources/Prototypes/ADT/Entities/Mobs/Player/phantom.yml b/Resources/Prototypes/ADT/Entities/Mobs/Player/phantom.yml index 213bc3e5cb3..0841b2cb927 100644 --- a/Resources/Prototypes/ADT/Entities/Mobs/Player/phantom.yml +++ b/Resources/Prototypes/ADT/Entities/Mobs/Player/phantom.yml @@ -44,7 +44,7 @@ #- type: TTS # voice: Kelthuzad - type: Eye - drawFov: false + drawFov: true visMask: - Normal - Ghost diff --git a/Resources/Prototypes/ADT/Phantom/objective_groups.yml b/Resources/Prototypes/ADT/Phantom/objective_groups.yml index 6769eed22d1..85a47928066 100644 --- a/Resources/Prototypes/ADT/Phantom/objective_groups.yml +++ b/Resources/Prototypes/ADT/Phantom/objective_groups.yml @@ -13,7 +13,7 @@ id: PhantomSocialObjectives weights: PhantomKeepAliveObjective: 1 - PhantomEscapeShuttleObjective: 1 + # PhantomEscapeShuttleObjective: 1 - type: weightedRandom id: PhantomFinalObjectiveGroup @@ -25,4 +25,4 @@ weights: PhantomStartNightmareObjective: 1 PhantomReincarnateObjective: 1 - + PhantomTyranyObjective: 1 diff --git a/Resources/Prototypes/ADT/Recipes/Lathes/paranormal.yml b/Resources/Prototypes/ADT/Recipes/Lathes/paranormal.yml index 627a271a370..747e5d9946d 100644 --- a/Resources/Prototypes/ADT/Recipes/Lathes/paranormal.yml +++ b/Resources/Prototypes/ADT/Recipes/Lathes/paranormal.yml @@ -27,7 +27,7 @@ Silver: 250 Gold: 250 Uranium: 1500 - Ectoplasm: 500 + Ectoplasm: 300 - type: latheRecipe id: EctoPistol @@ -40,7 +40,7 @@ Silver: 50 Gold: 1000 Uranium: 500 - Ectoplasm: 500 + Ectoplasm: 150 - type: latheRecipe id: PsiShield @@ -53,7 +53,7 @@ Silver: 50 Gold: 1000 Uranium: 500 - Ectoplasm: 2000 + Ectoplasm: 400 - type: latheRecipe id: PhantomHud @@ -64,7 +64,7 @@ Glass: 1500 Silver: 500 Gold: 100 - Ectoplasm: 2000 + Ectoplasm: 200 - type: latheRecipe id: EctoShield @@ -75,7 +75,7 @@ Plastic: 500 Silver: 500 Gold: 1000 - Ectoplasm: 1000 + Ectoplasm: 300 - type: latheRecipe id: EctoBatterySmall @@ -84,7 +84,7 @@ materials: Steel: 300 Glass: 300 - Ectoplasm: 100 + Ectoplasm: 50 - type: latheRecipe id: EctoBattery @@ -93,4 +93,4 @@ materials: Steel: 500 Glass: 500 - Ectoplasm: 200 + Ectoplasm: 100 diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml index e202d2482b7..c04f6892ecc 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: 2500 #ADT_Tweak category: cargoproduct-category-name-service group: market diff --git a/Resources/Prototypes/Catalog/Fills/Crates/engines.yml b/Resources/Prototypes/Catalog/Fills/Crates/engines.yml index c37b7b7535a..3254419ba2c 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/engines.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/engines.yml @@ -9,7 +9,7 @@ - type: StorageFill contents: - id: AmePartFlatpack - amount: 9 + amount: 12 #ADT_Tweaks - type: entity id: CrateEngineeringAMEJar diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml index 6d387eb8777..09bb73d1f06 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml @@ -54,6 +54,14 @@ ClothingUniformJumpsuitCasualRed: 2 ClothingUniformJumpskirtCasualRed: 2 # DO NOT ADD MORE, USE UNIFORM DYING + # ADT бельё/обмотки/плащи начало + ADTClothingFootWrapsWhite: 2 + ADTClothingFootWrapsHighWhite: 2 + ADTClothingFootWrapsBlack: 2 + ADTClothingFootWrapsHighBlack: 2 + ADTClothingFootWrapsBrown: 2 + ADTClothingFootWrapsHighBrown: 2 + # ADT бельё/обмотки/плащи конец ClothingShoesColorBlack: 8 ClothingShoesColorBrown: 4 ClothingShoesColorWhite: 3 diff --git a/Resources/Prototypes/Entities/Clothing/Eyes/glasses.yml b/Resources/Prototypes/Entities/Clothing/Eyes/glasses.yml index d5200747445..c8c03b0237e 100644 --- a/Resources/Prototypes/Entities/Clothing/Eyes/glasses.yml +++ b/Resources/Prototypes/Entities/Clothing/Eyes/glasses.yml @@ -243,3 +243,11 @@ - type: Clothing sprite: Clothing/Eyes/Glasses/ninjavisor.rsi - type: FlashImmunity + - type: NightVisionItem + - type: Appearance + - type: GenericVisualizer + visuals: + enum.NightVisionItemVisuals.Active: + icon: + True: { state: icon } + False: { state: icon } diff --git a/Resources/Prototypes/Entities/Structures/Storage/Tanks/tanks.yml b/Resources/Prototypes/Entities/Structures/Storage/Tanks/tanks.yml index b9a77aa8faa..4c450569674 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Tanks/tanks.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Tanks/tanks.yml @@ -32,7 +32,7 @@ - type: PacifismDangerousAttack - type: Explosive explosionType: Default - totalIntensity: 60 # Mediocre explosion. Not enough to do any meaningful structural damage to anything other then windows, provided you're only using one tank. + totalIntensity: 30 # ADT-Tweak - type: entity id: WeldingFuelTankFull @@ -74,7 +74,7 @@ maxVol: 5000 - type: Explosive explosionType: Default - totalIntensity: 120 + totalIntensity: 60 #ADT-Tweak # Water diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/black_footwraps.rsi/equipped-FEET-reptilian.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/black_footwraps.rsi/equipped-FEET-reptilian.png new file mode 100644 index 00000000000..b9539e97931 Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/black_footwraps.rsi/equipped-FEET-reptilian.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/black_footwraps.rsi/equipped-FEET.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/black_footwraps.rsi/equipped-FEET.png new file mode 100644 index 00000000000..091dcd73115 Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/black_footwraps.rsi/equipped-FEET.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/black_footwraps.rsi/icon.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/black_footwraps.rsi/icon.png new file mode 100644 index 00000000000..6dc3b24b14e Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/black_footwraps.rsi/icon.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/black_footwraps.rsi/inhand-left.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/black_footwraps.rsi/inhand-left.png new file mode 100644 index 00000000000..c529017186c Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/black_footwraps.rsi/inhand-left.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/black_footwraps.rsi/inhand-right.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/black_footwraps.rsi/inhand-right.png new file mode 100644 index 00000000000..47ee0f62bab Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/black_footwraps.rsi/inhand-right.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/black_footwraps.rsi/meta.json b/Resources/Textures/ADT/Clothing/Shoes/Specific/black_footwraps.rsi/meta.json new file mode 100644 index 00000000000..7c9206782b1 --- /dev/null +++ b/Resources/Textures/ADT/Clothing/Shoes/Specific/black_footwraps.rsi/meta.json @@ -0,0 +1,30 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Created by discord:floppo4ka for Adventure Time MRP Server", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-FEET", + "directions": 4 + }, + { + "name": "equipped-FEET-reptilian", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/blackhigh_footwraps.rsi/equipped-FEET-reptilian.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/blackhigh_footwraps.rsi/equipped-FEET-reptilian.png new file mode 100644 index 00000000000..2fdceef21b1 Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/blackhigh_footwraps.rsi/equipped-FEET-reptilian.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/blackhigh_footwraps.rsi/equipped-FEET.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/blackhigh_footwraps.rsi/equipped-FEET.png new file mode 100644 index 00000000000..dcb17d1dbe6 Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/blackhigh_footwraps.rsi/equipped-FEET.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/blackhigh_footwraps.rsi/icon.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/blackhigh_footwraps.rsi/icon.png new file mode 100644 index 00000000000..6dc3b24b14e Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/blackhigh_footwraps.rsi/icon.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/blackhigh_footwraps.rsi/inhand-left.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/blackhigh_footwraps.rsi/inhand-left.png new file mode 100644 index 00000000000..c529017186c Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/blackhigh_footwraps.rsi/inhand-left.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/blackhigh_footwraps.rsi/inhand-right.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/blackhigh_footwraps.rsi/inhand-right.png new file mode 100644 index 00000000000..47ee0f62bab Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/blackhigh_footwraps.rsi/inhand-right.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/blackhigh_footwraps.rsi/meta.json b/Resources/Textures/ADT/Clothing/Shoes/Specific/blackhigh_footwraps.rsi/meta.json new file mode 100644 index 00000000000..7c9206782b1 --- /dev/null +++ b/Resources/Textures/ADT/Clothing/Shoes/Specific/blackhigh_footwraps.rsi/meta.json @@ -0,0 +1,30 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Created by discord:floppo4ka for Adventure Time MRP Server", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-FEET", + "directions": 4 + }, + { + "name": "equipped-FEET-reptilian", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/brown_footwraps.rsi/equipped-FEET-reptilian.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/brown_footwraps.rsi/equipped-FEET-reptilian.png new file mode 100644 index 00000000000..b568df084cb Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/brown_footwraps.rsi/equipped-FEET-reptilian.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/brown_footwraps.rsi/equipped-FEET.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/brown_footwraps.rsi/equipped-FEET.png new file mode 100644 index 00000000000..c53e7ee6fbf Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/brown_footwraps.rsi/equipped-FEET.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/brown_footwraps.rsi/icon.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/brown_footwraps.rsi/icon.png new file mode 100644 index 00000000000..6fd7ddf601a Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/brown_footwraps.rsi/icon.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/brown_footwraps.rsi/inhand-left.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/brown_footwraps.rsi/inhand-left.png new file mode 100644 index 00000000000..9127dd36bad Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/brown_footwraps.rsi/inhand-left.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/brown_footwraps.rsi/inhand-right.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/brown_footwraps.rsi/inhand-right.png new file mode 100644 index 00000000000..784ef24b825 Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/brown_footwraps.rsi/inhand-right.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/brown_footwraps.rsi/meta.json b/Resources/Textures/ADT/Clothing/Shoes/Specific/brown_footwraps.rsi/meta.json new file mode 100644 index 00000000000..7c9206782b1 --- /dev/null +++ b/Resources/Textures/ADT/Clothing/Shoes/Specific/brown_footwraps.rsi/meta.json @@ -0,0 +1,30 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Created by discord:floppo4ka for Adventure Time MRP Server", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-FEET", + "directions": 4 + }, + { + "name": "equipped-FEET-reptilian", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/brownhigh_footwraps.rsi/equipped-FEET-reptilian.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/brownhigh_footwraps.rsi/equipped-FEET-reptilian.png new file mode 100644 index 00000000000..079fb8f12be Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/brownhigh_footwraps.rsi/equipped-FEET-reptilian.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/brownhigh_footwraps.rsi/equipped-FEET.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/brownhigh_footwraps.rsi/equipped-FEET.png new file mode 100644 index 00000000000..246f8e0049b Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/brownhigh_footwraps.rsi/equipped-FEET.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/brownhigh_footwraps.rsi/icon.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/brownhigh_footwraps.rsi/icon.png new file mode 100644 index 00000000000..6fd7ddf601a Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/brownhigh_footwraps.rsi/icon.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/brownhigh_footwraps.rsi/inhand-left.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/brownhigh_footwraps.rsi/inhand-left.png new file mode 100644 index 00000000000..9127dd36bad Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/brownhigh_footwraps.rsi/inhand-left.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/brownhigh_footwraps.rsi/inhand-right.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/brownhigh_footwraps.rsi/inhand-right.png new file mode 100644 index 00000000000..784ef24b825 Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/brownhigh_footwraps.rsi/inhand-right.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/brownhigh_footwraps.rsi/meta.json b/Resources/Textures/ADT/Clothing/Shoes/Specific/brownhigh_footwraps.rsi/meta.json new file mode 100644 index 00000000000..7c9206782b1 --- /dev/null +++ b/Resources/Textures/ADT/Clothing/Shoes/Specific/brownhigh_footwraps.rsi/meta.json @@ -0,0 +1,30 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Created by discord:floppo4ka for Adventure Time MRP Server", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-FEET", + "directions": 4 + }, + { + "name": "equipped-FEET-reptilian", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/white_footwraps.rsi/equipped-FEET-reptilian.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/white_footwraps.rsi/equipped-FEET-reptilian.png new file mode 100644 index 00000000000..f5b9a65dd6c Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/white_footwraps.rsi/equipped-FEET-reptilian.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/white_footwraps.rsi/equipped-FEET.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/white_footwraps.rsi/equipped-FEET.png new file mode 100644 index 00000000000..b9872e677f4 Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/white_footwraps.rsi/equipped-FEET.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/white_footwraps.rsi/icon.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/white_footwraps.rsi/icon.png new file mode 100644 index 00000000000..29ea38f36b0 Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/white_footwraps.rsi/icon.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/white_footwraps.rsi/inhand-left.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/white_footwraps.rsi/inhand-left.png new file mode 100644 index 00000000000..5a5098034bc Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/white_footwraps.rsi/inhand-left.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/white_footwraps.rsi/inhand-right.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/white_footwraps.rsi/inhand-right.png new file mode 100644 index 00000000000..dd122e05e7b Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/white_footwraps.rsi/inhand-right.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/white_footwraps.rsi/meta.json b/Resources/Textures/ADT/Clothing/Shoes/Specific/white_footwraps.rsi/meta.json new file mode 100644 index 00000000000..7c9206782b1 --- /dev/null +++ b/Resources/Textures/ADT/Clothing/Shoes/Specific/white_footwraps.rsi/meta.json @@ -0,0 +1,30 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Created by discord:floppo4ka for Adventure Time MRP Server", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-FEET", + "directions": 4 + }, + { + "name": "equipped-FEET-reptilian", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/whitehigh_footwraps.rsi/equipped-FEET-reptilian.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/whitehigh_footwraps.rsi/equipped-FEET-reptilian.png new file mode 100644 index 00000000000..25e348153ef Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/whitehigh_footwraps.rsi/equipped-FEET-reptilian.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/whitehigh_footwraps.rsi/equipped-FEET.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/whitehigh_footwraps.rsi/equipped-FEET.png new file mode 100644 index 00000000000..1ebff7a36aa Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/whitehigh_footwraps.rsi/equipped-FEET.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/whitehigh_footwraps.rsi/icon.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/whitehigh_footwraps.rsi/icon.png new file mode 100644 index 00000000000..29ea38f36b0 Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/whitehigh_footwraps.rsi/icon.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/whitehigh_footwraps.rsi/inhand-left.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/whitehigh_footwraps.rsi/inhand-left.png new file mode 100644 index 00000000000..5a5098034bc Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/whitehigh_footwraps.rsi/inhand-left.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/whitehigh_footwraps.rsi/inhand-right.png b/Resources/Textures/ADT/Clothing/Shoes/Specific/whitehigh_footwraps.rsi/inhand-right.png new file mode 100644 index 00000000000..dd122e05e7b Binary files /dev/null and b/Resources/Textures/ADT/Clothing/Shoes/Specific/whitehigh_footwraps.rsi/inhand-right.png differ diff --git a/Resources/Textures/ADT/Clothing/Shoes/Specific/whitehigh_footwraps.rsi/meta.json b/Resources/Textures/ADT/Clothing/Shoes/Specific/whitehigh_footwraps.rsi/meta.json new file mode 100644 index 00000000000..7c9206782b1 --- /dev/null +++ b/Resources/Textures/ADT/Clothing/Shoes/Specific/whitehigh_footwraps.rsi/meta.json @@ -0,0 +1,30 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Created by discord:floppo4ka for Adventure Time MRP Server", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-FEET", + "directions": 4 + }, + { + "name": "equipped-FEET-reptilian", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +}