diff --git a/Content.Client/_CorvaxNext/Footprints/FootprintSystem.cs b/Content.Client/_CorvaxNext/Footprints/FootprintSystem.cs new file mode 100644 index 00000000000..7355370779d --- /dev/null +++ b/Content.Client/_CorvaxNext/Footprints/FootprintSystem.cs @@ -0,0 +1,47 @@ +using Content.Shared._CorvaxNext.Footprints; +using Robust.Client.GameObjects; +using Robust.Shared.Utility; + +namespace Content.Client._CorvaxNext.Footprints; + +public sealed class FootprintSystem : EntitySystem +{ + public override void Initialize() + { + SubscribeLocalEvent(OnComponentStartup); + SubscribeNetworkEvent(OnFootprintChanged); + } + + private void OnComponentStartup(Entity entity, ref ComponentStartup e) + { + UpdateSprite(entity, entity); + } + + private void OnFootprintChanged(FootprintChangedEvent e) + { + if (!TryGetEntity(e.Entity, out var entity)) + return; + + if (!TryComp(entity, out var footprint)) + return; + + UpdateSprite(entity.Value, footprint); + } + + private void UpdateSprite(EntityUid entity, FootprintComponent footprint) + { + if (!TryComp(entity, out var sprite)) + return; + + for (var i = 0; i < footprint.Footprints.Count; i++) + { + if (!sprite.LayerExists(i, false)) + sprite.AddBlankLayer(i); + + sprite.LayerSetOffset(i, footprint.Footprints[i].Offset); + sprite.LayerSetRotation(i, footprint.Footprints[i].Rotation); + sprite.LayerSetColor(i, footprint.Footprints[i].Color); + sprite.LayerSetSprite(i, new SpriteSpecifier.Rsi(new("/Textures/_CorvaxNext/Effects/footprint.rsi"), footprint.Footprints[i].State)); + } + } +} diff --git a/Content.Client/_CorvaxNext/Footprints/FootprintsVisualizerSystem.cs b/Content.Client/_CorvaxNext/Footprints/FootprintsVisualizerSystem.cs deleted file mode 100644 index 2eed78b04ae..00000000000 --- a/Content.Client/_CorvaxNext/Footprints/FootprintsVisualizerSystem.cs +++ /dev/null @@ -1,75 +0,0 @@ -using Content.Shared._CorvaxNext.Footprints; -using Content.Shared._CorvaxNext.Footprints.Components; -using Robust.Client.GameObjects; -using Robust.Shared.Random; - -namespace Content.Client._CorvaxNext.Footprints; - -public sealed class FootprintsVisualizerSystem : VisualizerSystem -{ - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - [Dependency] private readonly IRobustRandom _random = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnInitialized); - SubscribeLocalEvent(OnShutdown); - } - - private void OnInitialized(EntityUid uid, FootprintComponent comp, ComponentInit args) - { - if (!TryComp(uid, out var sprite)) - return; - - sprite.LayerMapReserveBlank(FootprintVisualLayers.Print); - UpdateAppearance(uid, comp, sprite); - } - - private void OnShutdown(EntityUid uid, FootprintComponent comp, ComponentShutdown args) - { - if (!TryComp(uid, out var sprite)) - return; - - if (!sprite.LayerMapTryGet(FootprintVisualLayers.Print, out var layer)) - return; - - sprite.RemoveLayer(layer); - } - - private void UpdateAppearance(EntityUid uid, FootprintComponent component, SpriteComponent sprite) - { - if (!sprite.LayerMapTryGet(FootprintVisualLayers.Print, out var layer)) - return; - - if (!TryComp(component.FootprintsVisualizer, out var printsComponent)) - return; - - if (!TryComp(uid, out var appearance)) - return; - - if (!_appearance.TryGetData(uid, FootprintVisualState.State, out var printVisuals, appearance)) - return; - - sprite.LayerSetState(layer, new(printVisuals switch - { - FootprintVisuals.BareFootprint => printsComponent.RightStep ? printsComponent.RightBarePrint : printsComponent.LeftBarePrint, - FootprintVisuals.ShoesPrint => printsComponent.ShoesPrint, - FootprintVisuals.SuitPrint => printsComponent.SuitPrint, - FootprintVisuals.Dragging => _random.Pick(printsComponent.DraggingPrint), - _ => throw new ArgumentOutOfRangeException($"Unknown {printVisuals} parameter.") - }), printsComponent.RsiPath); - - if (_appearance.TryGetData(uid, FootprintVisualState.Color, out var printColor, appearance)) - sprite.LayerSetColor(layer, printColor); - } - - protected override void OnAppearanceChange(EntityUid uid, FootprintComponent component, ref AppearanceChangeEvent args) - { - if (args.Sprite is null) - return; - - UpdateAppearance(uid, component, args.Sprite); - } -} diff --git a/Content.Server/Chemistry/TileReactions/CleanTileReaction.cs b/Content.Server/Chemistry/TileReactions/CleanTileReaction.cs index f2d1bcebe1c..3dfe7ac1242 100644 --- a/Content.Server/Chemistry/TileReactions/CleanTileReaction.cs +++ b/Content.Server/Chemistry/TileReactions/CleanTileReaction.cs @@ -7,6 +7,8 @@ using Robust.Shared.Map; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; using System.Linq; +using Content.Shared._CorvaxNext.Footprints; +using Content.Server._CorvaxNext.Footprints; namespace Content.Server.Chemistry.TileReactions; @@ -57,6 +59,11 @@ IEntityManager entityManager solutionContainerSystem.TryAddSolution(puddleSolution.Value, new Solution(ReplacementReagent, purgeable.Volume)); + // Corvax-Next-Footprints-Start + if (entityManager.HasComponent(entity)) + entityManager.EventBus.RaiseLocalEvent(entity, new FootprintCleanEvent()); + // Corvax-Next-Footprints-End + if (purgeable.Volume <= FixedPoint2.Zero) break; } diff --git a/Content.Server/Fluids/EntitySystems/AbsorbentSystem.cs b/Content.Server/Fluids/EntitySystems/AbsorbentSystem.cs index 5f47baa7cc2..6b34b390d3d 100644 --- a/Content.Server/Fluids/EntitySystems/AbsorbentSystem.cs +++ b/Content.Server/Fluids/EntitySystems/AbsorbentSystem.cs @@ -1,4 +1,5 @@ using System.Numerics; +using Content.Server._CorvaxNext.Footprints; using Content.Server.Popups; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.EntitySystems; @@ -13,7 +14,6 @@ using Robust.Shared.Map.Components; using Robust.Shared.Prototypes; using Robust.Shared.Utility; -using Content.Shared._CorvaxNext.Footprints.Components; namespace Content.Server.Fluids.EntitySystems; @@ -29,9 +29,6 @@ public sealed class AbsorbentSystem : SharedAbsorbentSystem [Dependency] private readonly SharedSolutionContainerSystem _solutionContainerSystem = default!; [Dependency] private readonly UseDelaySystem _useDelay = default!; [Dependency] private readonly MapSystem _mapSystem = default!; - [Dependency] private readonly EntityLookupSystem _lookup = default!; - - public const float FootprintAbsorptionRange = 0.25f; // Corvax-Next-Footprints public override void Initialize() { @@ -115,18 +112,13 @@ public void Mop(EntityUid user, EntityUid target, EntityUid used, AbsorbentCompo && _useDelay.IsDelayed((used, useDelay))) return; - // Corvax-Next-Footprints-Start - // Footsteps cleaning logic, try to grab from - if (TryFootprintInteract(user, used, target, component, useDelay, absorberSoln.Value)) - return; - // If it's a puddle try to grab from - if (TryPuddleInteract(user, used, target, component, useDelay, absorberSoln.Value)) - return; - - // If it's refillable try to transfer - TryRefillableInteract(user, used, target, component, useDelay, absorberSoln.Value); - // Corvax-Next-Footprints-End + if (!TryPuddleInteract(user, used, target, component, useDelay, absorberSoln.Value)) + { + // If it's refillable try to transfer + if (!TryRefillableInteract(user, used, target, component, useDelay, absorberSoln.Value)) + return; + } } /// @@ -331,73 +323,8 @@ private bool TryPuddleInteract(EntityUid user, EntityUid used, EntityUid target, _melee.DoLunge(user, used, Angle.Zero, localPos, null, false); - return true; - } - - // Corvax-Next-Footprints-Start - private bool TryFootprintInteract(EntityUid user, EntityUid used, EntityUid target, AbsorbentComponent absorber, UseDelayComponent? useDelay, Entity absorberSoln) - { - if (!HasComp(target)) // Perform a check if it was a footprint that was clicked on - return false; - - var soundPlayed = false; - - var footPrints = new HashSet>(); - _lookup.GetEntitiesInRange(Transform(target).Coordinates, FootprintAbsorptionRange, footPrints, LookupFlags.Dynamic | LookupFlags.Uncontained); - - foreach (var (footstepUid, comp) in footPrints) - { - if (!_solutionContainerSystem.ResolveSolution(footstepUid, comp.SolutionName, ref comp.Solution, out var targetStepSolution) || targetStepSolution.Volume <= 0) - continue; - - if (_puddleSystem.CanFullyEvaporate(targetStepSolution)) - continue; // no spam - - var absorberSolution = absorberSoln.Comp.Solution; - var available = absorberSolution.GetTotalPrototypeQuantity(SharedPuddleSystem.EvaporationReagents); - - // No material - if (available == FixedPoint2.Zero) - { - _popups.PopupEntity(Loc.GetString("mopping-system-no-water", ("used", used)), user, user); - return true; - } - - var transferMax = absorber.PickupAmount; - var transferAmount = FixedPoint2.Min(transferMax, available); - - var puddleSplit = targetStepSolution.SplitSolutionWithout(transferAmount, SharedPuddleSystem.EvaporationReagents); - var absorberSplit = absorberSolution.SplitSolutionWithOnly(puddleSplit.Volume, SharedPuddleSystem.EvaporationReagents); - - var transform = Transform(target); - var gridUid = transform.GridUid; - if (TryComp(gridUid, out var mapGrid)) - { - var tileRef = _mapSystem.GetTileRef(gridUid.Value, mapGrid, transform.Coordinates); - _puddleSystem.DoTileReactions(tileRef, absorberSplit); - } - - _solutionContainerSystem.AddSolution(comp.Solution.Value, absorberSplit); - _solutionContainerSystem.AddSolution(absorberSoln, puddleSplit); - - if (!soundPlayed) - { - soundPlayed = true; // to prevent sound spam - _audio.PlayPvs(absorber.PickupSound, target); - } - - if (useDelay is not null) - _useDelay.TryResetDelay((used, useDelay)); - } - - var userXform = Transform(user); - var targetPos = _transform.GetWorldPosition(target); - var localPos = Vector2.Transform(targetPos, _transform.GetInvWorldMatrix(userXform)); - localPos = userXform.LocalRotation.RotateVec(localPos); - - _melee.DoLunge(user, used, Angle.Zero, localPos, null, false); + RaiseLocalEvent(target, new FootprintCleanEvent()); // Corvax-Next-Footprints return true; } - // Corvax-Next-Footprints-End } diff --git a/Content.Server/Fluids/EntitySystems/PuddleSystem.cs b/Content.Server/Fluids/EntitySystems/PuddleSystem.cs index ef06b9f2d99..cc1f66aa0ab 100644 --- a/Content.Server/Fluids/EntitySystems/PuddleSystem.cs +++ b/Content.Server/Fluids/EntitySystems/PuddleSystem.cs @@ -2,6 +2,7 @@ using Content.Server.DoAfter; using Content.Server.Fluids.Components; using Content.Server.Spreader; +using Content.Shared._CorvaxNext.Footprints; using Content.Shared.Chemistry; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Components.SolutionManager; @@ -424,7 +425,7 @@ private void UpdateSlip(EntityUid entityUid, PuddleComponent component, Solution private void UpdateSlow(EntityUid uid, Solution solution, PuddleComponent component) // Corvax-Next-Footprints { // Corvax-Next-Footprints-Start - if (!component.ViscosityAffectsMovement) + if (!component.AffectsMovement) return; // Corvax-Next-Footprints-End @@ -674,6 +675,7 @@ public override bool TrySpillAt(TileRef tileRef, Solution solution, out EntityUi var anchored = _map.GetAnchoredEntitiesEnumerator(gridId, mapGrid, tileRef.GridIndices); var puddleQuery = GetEntityQuery(); var sparklesQuery = GetEntityQuery(); + var footprintQuery = GetEntityQuery(); // Corvax-Next-Footprints while (anchored.MoveNext(out var ent)) { @@ -687,6 +689,11 @@ public override bool TrySpillAt(TileRef tileRef, Solution solution, out EntityUi if (!puddleQuery.TryGetComponent(ent, out var puddle)) continue; + // Corvax-Next-Footprints-Start + if (footprintQuery.HasComp(ent)) + continue; + // Corvax-Next-Footprints-End + if (TryAddSolution(ent.Value, solution, sound, puddleComponent: puddle)) { EnsureComp(ent.Value); @@ -735,12 +742,18 @@ public bool TryGetPuddle(TileRef tile, out EntityUid puddleUid) var anc = _map.GetAnchoredEntitiesEnumerator(tile.GridUid, grid, tile.GridIndices); var puddleQuery = GetEntityQuery(); + var footprintQuery = GetEntityQuery(); // Corvax-Next-Footprints while (anc.MoveNext(out var ent)) { if (!puddleQuery.HasComponent(ent.Value)) continue; + // Corvax-Next-Footprints-Start + if (footprintQuery.HasComponent(ent.Value)) + continue; + // Corvax-Next-Footprints-End + puddleUid = ent.Value; return true; } diff --git a/Content.Server/_CorvaxNext/Footprints/EntitySystems/FootprintsSystem.cs b/Content.Server/_CorvaxNext/Footprints/EntitySystems/FootprintsSystem.cs deleted file mode 100644 index 8539b55cd3e..00000000000 --- a/Content.Server/_CorvaxNext/Footprints/EntitySystems/FootprintsSystem.cs +++ /dev/null @@ -1,128 +0,0 @@ -using Content.Server.Atmos.Components; -using Content.Shared.Inventory; -using Content.Shared.Mobs; -using Content.Shared.Mobs.Components; -using Content.Shared.Chemistry.Components.SolutionManager; -using Content.Shared.Chemistry.EntitySystems; -using Robust.Shared.Map; -using Robust.Shared.Random; -using Content.Shared._CorvaxNext.Footprints; -using Content.Shared._CorvaxNext.Footprints.Components; -using Content.Shared._CorvaxNext.Standing; - -namespace Content.Server._CorvaxNext.Footprints.EntitySystems; - -public sealed class FootprintsSystem : EntitySystem -{ - [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly InventorySystem _inventory = default!; - [Dependency] private readonly IMapManager _map = default!; - - [Dependency] private readonly SharedSolutionContainerSystem _solution = default!; - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - [Dependency] private readonly SharedTransformSystem _transform = default!; - - private EntityQuery _transformQuery; - private EntityQuery _mobThresholdQuery; - private EntityQuery _appearanceQuery; - private EntityQuery _layingQuery; - - public override void Initialize() - { - _transformQuery = GetEntityQuery(); - _mobThresholdQuery = GetEntityQuery(); - _appearanceQuery = GetEntityQuery(); - _layingQuery = GetEntityQuery(); - - SubscribeLocalEvent(OnStartupComponent); - SubscribeLocalEvent(OnMove); - } - - private void OnStartupComponent(EntityUid uid, FootprintVisualizerComponent component, ComponentStartup args) - { - component.StepSize = Math.Max(0f, component.StepSize + _random.NextFloat(-0.05f, 0.05f)); - } - - private void OnMove(EntityUid uid, FootprintVisualizerComponent component, ref MoveEvent args) - { - if (component.PrintsColor.A <= 0f) - return; - - if (!_transformQuery.TryComp(uid, out var transform)) - return; - - if (!_mobThresholdQuery.TryComp(uid, out var mobThreshHolds)) - return; - - if (!_map.TryFindGridAt(_transform.GetMapCoordinates((uid, transform)), out var gridUid, out _)) - return; - - var dragging = mobThreshHolds.CurrentThresholdState is MobState.Critical or MobState.Dead || _layingQuery.TryComp(uid, out var laying) && laying.DrawDowned; - var distance = (transform.LocalPosition - component.StepPos).Length(); - var stepSize = dragging ? component.DragSize : component.StepSize; - - if (distance <= stepSize) - return; - - component.RightStep = !component.RightStep; - - var entity = Spawn(component.StepProtoId, CalcCoords(gridUid, component, transform, dragging)); - var footPrintComponent = EnsureComp(entity); - - footPrintComponent.FootprintsVisualizer = uid; - Dirty(entity, footPrintComponent); - - if (_appearanceQuery.TryComp(entity, out var appearance)) - { - _appearance.SetData(entity, FootprintVisualState.State, PickState(uid, dragging), appearance); - _appearance.SetData(entity, FootprintVisualState.Color, component.PrintsColor, appearance); - } - - if (!_transformQuery.TryComp(entity, out var stepTransform)) - return; - - stepTransform.LocalRotation = dragging - ? (transform.LocalPosition - component.StepPos).ToAngle() + Angle.FromDegrees(-90f) - : transform.LocalRotation + Angle.FromDegrees(180f); - - component.PrintsColor = component.PrintsColor.WithAlpha(Math.Max(0f, component.PrintsColor.A - component.ColorReduceAlpha)); - component.StepPos = transform.LocalPosition; - - if (!TryComp(entity, out var solutionContainer)) - return; - - if (!_solution.ResolveSolution((entity, solutionContainer), footPrintComponent.SolutionName, ref footPrintComponent.Solution, out var solution)) - return; - - if (string.IsNullOrWhiteSpace(component.ReagentToTransfer) || solution.Volume >= 1) - return; - - _solution.TryAddReagent(footPrintComponent.Solution.Value, component.ReagentToTransfer, 0.5, out _); - } - - private EntityCoordinates CalcCoords(EntityUid uid, FootprintVisualizerComponent component, TransformComponent transform, bool state) - { - if (state) - return new EntityCoordinates(uid, transform.LocalPosition); - - var offset = component.RightStep - ? new Angle(Angle.FromDegrees(180f) + transform.LocalRotation).RotateVec(component.OffsetPrint) - : new Angle(transform.LocalRotation).RotateVec(component.OffsetPrint); - - return new EntityCoordinates(uid, transform.LocalPosition + offset); - } - - private FootprintVisuals PickState(EntityUid uid, bool dragging) - { - var state = FootprintVisuals.BareFootprint; - - if (dragging) - state = FootprintVisuals.Dragging; - else if (_inventory.TryGetSlotEntity(uid, "outerClothing", out var suit) && TryComp(suit, out _)) - state = FootprintVisuals.SuitPrint; - else if (_inventory.TryGetSlotEntity(uid, "shoes", out _)) - state = FootprintVisuals.ShoesPrint; - - return state; - } -} diff --git a/Content.Server/_CorvaxNext/Footprints/EntitySystems/PuddleFootprintsSystem.cs b/Content.Server/_CorvaxNext/Footprints/EntitySystems/PuddleFootprintsSystem.cs deleted file mode 100644 index 03a57312b29..00000000000 --- a/Content.Server/_CorvaxNext/Footprints/EntitySystems/PuddleFootprintsSystem.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System.Linq; -using Content.Shared._CorvaxNext.Footprints.Components; -using Content.Shared.Chemistry.Components.SolutionManager; -using Content.Shared.Chemistry.EntitySystems; -using Content.Shared.Fluids; -using Content.Shared.Fluids.Components; -using Robust.Shared.Physics.Events; - -namespace Content.Server._CorvaxNext.Footprints.EntitySystems; - -public sealed class PuddleFootprintsSystem : EntitySystem -{ - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - [Dependency] private readonly SharedSolutionContainerSystem _solutionContainer = default!; - - public override void Initialize() - { - SubscribeLocalEvent(OnStepTrigger); - } - - private void OnStepTrigger(EntityUid uid, PuddleFootprintsComponent component, ref EndCollideEvent args) - { - if (!TryComp(uid, out var appearance)) - return; - - if (!TryComp(uid, out var puddle)) - return; - - if (!TryComp(args.OtherEntity, out var tripper)) - return; - - if (!TryComp(uid, out var solutionManager)) - return; - - if (!_solutionContainer.ResolveSolution((uid, solutionManager), puddle.SolutionName, ref puddle.Solution, out var solutions)) - return; - - var totalSolutionQuantity = solutions.Contents.Sum(sol => (float)sol.Quantity); - var waterQuantity = (float)solutions.Contents.Where(solution => solution.Reagent.Prototype == "Water").FirstOrDefault().Quantity; - - if (waterQuantity / (totalSolutionQuantity / 100f) > component.OffPercent || solutions.Contents.Count <= 0) - return; - - tripper.ReagentToTransfer = solutions.Contents.Aggregate((l, r) => l.Quantity > r.Quantity ? l : r).Reagent.Prototype; - - if (_appearance.TryGetData(uid, PuddleVisuals.SolutionColor, out var color, appearance) - && _appearance.TryGetData(uid, PuddleVisuals.CurrentVolume, out var volume, appearance)) - AddColor((Color)color, (float)volume * component.SizeRatio, tripper); - - _solutionContainer.RemoveEachReagent(puddle.Solution.Value, 1); - } - - private void AddColor(Color col, float quantity, FootprintVisualizerComponent component) - { - component.PrintsColor = component.ColorQuantity == 0 ? col : Color.InterpolateBetween(component.PrintsColor, col, component.ColorInterpolationFactor); - component.ColorQuantity += quantity; - } -} diff --git a/Content.Server/_CorvaxNext/Footprints/FootprintCleanEvent.cs b/Content.Server/_CorvaxNext/Footprints/FootprintCleanEvent.cs new file mode 100644 index 00000000000..59ce41ee6c9 --- /dev/null +++ b/Content.Server/_CorvaxNext/Footprints/FootprintCleanEvent.cs @@ -0,0 +1,3 @@ +namespace Content.Server._CorvaxNext.Footprints; + +public readonly struct FootprintCleanEvent; diff --git a/Content.Server/_CorvaxNext/Footprints/FootprintOwnerComponent.cs b/Content.Server/_CorvaxNext/Footprints/FootprintOwnerComponent.cs new file mode 100644 index 00000000000..f54ce6fca50 --- /dev/null +++ b/Content.Server/_CorvaxNext/Footprints/FootprintOwnerComponent.cs @@ -0,0 +1,37 @@ +using Content.Shared.FixedPoint; + +namespace Content.Server._CorvaxNext.Footprints; + +[RegisterComponent] +public sealed partial class FootprintOwnerComponent : Component +{ + [DataField] + public FixedPoint2 MaxFootVolume = 10; + + [DataField] + public FixedPoint2 MaxBodyVolume = 20; + + [DataField] + public FixedPoint2 MinFootprintVolume = 0.5; + + [DataField] + public FixedPoint2 MaxFootprintVolume = 1; + + [DataField] + public FixedPoint2 MinBodyprintVolume = 2; + + [DataField] + public FixedPoint2 MaxBodyprintVolume = 5; + + [DataField] + public float FootDistance = 0.5f; + + [DataField] + public float BodyDistance = 1; + + [ViewVariables(VVAccess.ReadWrite)] + public float Distance; + + [DataField] + public float NextFootOffset = 0.0625f; +} diff --git a/Content.Server/_CorvaxNext/Footprints/FootprintSystem.cs b/Content.Server/_CorvaxNext/Footprints/FootprintSystem.cs new file mode 100644 index 00000000000..e45ec5ca9c0 --- /dev/null +++ b/Content.Server/_CorvaxNext/Footprints/FootprintSystem.cs @@ -0,0 +1,241 @@ +using System.Diagnostics.CodeAnalysis; +using System.Numerics; +using Content.Shared._CorvaxNext.Footprints; +using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.EntitySystems; +using Content.Shared.FixedPoint; +using Content.Shared.Fluids; +using Content.Shared.Fluids.Components; +using Content.Shared.Standing; +using Robust.Server.GameObjects; +using Robust.Shared.Map; +using Robust.Shared.Map.Components; +using Robust.Shared.Prototypes; + +namespace Content.Server._CorvaxNext.Footprints; + +public sealed class FootprintSystem : EntitySystem +{ + [Dependency] private readonly TransformSystem _transform = default!; + [Dependency] private readonly SharedMapSystem _map = default!; + [Dependency] private readonly SharedSolutionContainerSystem _solution = default!; + [Dependency] private readonly SharedPuddleSystem _puddle = default!; + [Dependency] private readonly IPrototypeManager _prototype = default!; + + public static readonly FixedPoint2 MaxFootprintVolumeOnTile = 50; + + public static readonly EntProtoId FootprintPrototypeId = "Footprint"; + + public const string FootprintOwnerSolution = "print"; + + public const string FootprintSolution = "print"; + + public const string PuddleSolution = "puddle"; + + public override void Initialize() + { + SubscribeLocalEvent(OnAbsorbentPuddleInteract); + + SubscribeLocalEvent(OnMove); + + SubscribeLocalEvent(OnMapInit); + } + + private void OnAbsorbentPuddleInteract(Entity entity, ref FootprintCleanEvent e) + { + if (!_solution.TryGetSolution(entity.Owner, FootprintSolution, out _, out var puddleSolution)) + return; + + var color = puddleSolution.GetColor(_prototype); + + for (var i = 0; i < entity.Comp.Footprints.Count; i++) + entity.Comp.Footprints[i] = entity.Comp.Footprints[i] with + { + Color = color + }; + + Dirty(entity); + + if (!TryGetNetEntity(entity, out var netFootprint)) + return; + + RaiseNetworkEvent(new FootprintChangedEvent(netFootprint.Value)); + } + + private void OnMove(Entity entity, ref MoveEvent e) + { + var oldPosition = _transform.ToMapCoordinates(e.OldPosition).Position; + var newPosition = _transform.ToMapCoordinates(e.NewPosition).Position; + + entity.Comp.Distance += Vector2.Distance(newPosition, oldPosition); + + var standing = TryComp(entity, out var standingState) && standingState.Standing; + + var requiredDistance = standing ? entity.Comp.FootDistance : entity.Comp.BodyDistance; + + if (entity.Comp.Distance < requiredDistance) + return; + + entity.Comp.Distance -= requiredDistance; + + var transform = Transform(entity); + + if (transform.GridUid is null) + return; + + if (!TryComp(transform.GridUid.Value, out var gridComponent)) + return; + + EntityCoordinates coordinates = new(entity, standing ? entity.Comp.NextFootOffset : 0, 0); + + entity.Comp.NextFootOffset = -entity.Comp.NextFootOffset; + + var tile = _map.CoordinatesToTile(transform.GridUid.Value, gridComponent, coordinates); + + if (TryPuddleInteraction(entity, (transform.GridUid.Value, gridComponent), tile, standing)) + return; + + Angle rotation; + + if (!standing) + { + var oldLocalPosition = _map.WorldToLocal(transform.GridUid.Value, gridComponent, oldPosition); + var newLocalPosition = _map.WorldToLocal(transform.GridUid.Value, gridComponent, newPosition); + + rotation = (newLocalPosition - oldLocalPosition).ToAngle(); + } + else + rotation = transform.LocalRotation; + + FootprintInteraction(entity, (transform.GridUid.Value, gridComponent), tile, coordinates, rotation, standing); + } + + private bool TryPuddleInteraction(Entity entity, Entity grid, Vector2i tile, bool standing) + { + if (!TryGetAnchoredEntity(grid, tile, out var puddle)) + return false; + + if (!_solution.TryGetSolution(puddle.Value.Owner, PuddleSolution, out var puddleSolution, out _)) + return false; + + if (!_solution.EnsureSolutionEntity(entity.Owner, FootprintOwnerSolution, out _, out var solution, FixedPoint2.Max(entity.Comp.MaxFootVolume, entity.Comp.MaxBodyVolume))) + return false; + + _solution.TryTransferSolution(puddleSolution.Value, solution.Value.Comp.Solution, GetFootprintVolume(entity, solution.Value)); + + _solution.TryTransferSolution(solution.Value, puddleSolution.Value.Comp.Solution, (standing ? entity.Comp.MaxFootVolume : entity.Comp.MaxBodyVolume) - solution.Value.Comp.Solution.Volume); + + _solution.UpdateChemicals(puddleSolution.Value, false); + + return true; + } + + private void FootprintInteraction(Entity entity, Entity grid, Vector2i tile, EntityCoordinates coordinates, Angle rotation, bool standing) + { + if (!_solution.TryGetSolution(entity.Owner, FootprintOwnerSolution, out var solution, out _)) + return; + + var volume = standing ? GetFootprintVolume(entity, solution.Value) : GetBodyprintVolume(entity, solution.Value); + + if (volume < entity.Comp.MinFootprintVolume) + return; + + if (!TryGetAnchoredEntity(grid, tile, out var footprint)) + { + var footprintEntity = SpawnAtPosition(FootprintPrototypeId, coordinates); + + footprint = (footprintEntity, Comp(footprintEntity)); + } + + if (!_solution.EnsureSolutionEntity(footprint.Value.Owner, FootprintSolution, out _, out var footprintSolution, MaxFootprintVolumeOnTile)) + return; + + var color = solution.Value.Comp.Solution.GetColor(_prototype).WithAlpha((float)volume / (float)(standing ? entity.Comp.MaxFootprintVolume : entity.Comp.MaxBodyprintVolume) / 2f); + + _solution.TryTransferSolution(footprintSolution.Value, solution.Value.Comp.Solution, volume); + + if (footprintSolution.Value.Comp.Solution.Volume >= MaxFootprintVolumeOnTile) + { + var footprintSolutionClone = footprintSolution.Value.Comp.Solution.Clone(); + + Del(footprint); + + _puddle.TrySpillAt(coordinates, footprintSolutionClone, out _, false); + + return; + } + + var gridCoords = _map.LocalToGrid(grid, grid, coordinates); + + var x = gridCoords.X / grid.Comp.TileSize; + var y = gridCoords.Y / grid.Comp.TileSize; + + var halfTileSize = grid.Comp.TileSize / 2f; + + x -= MathF.Floor(x) + halfTileSize; + y -= MathF.Floor(y) + halfTileSize; + + footprint.Value.Comp.Footprints.Add(new(new(x, y), rotation, color, standing ? "foot" : "body")); + + Dirty(footprint.Value); + + if (!TryGetNetEntity(footprint, out var netFootprint)) + return; + + RaiseNetworkEvent(new FootprintChangedEvent(netFootprint.Value)); + } + + private void OnMapInit(Entity entity, ref MapInitEvent e) + { + if (HasComp(entity)) + return; + + var transform = Transform(entity); + + if (transform.GridUid is null) + return; + + if (!TryComp(transform.GridUid.Value, out var gridComponent)) + return; + + var tile = _map.CoordinatesToTile(transform.GridUid.Value, gridComponent, transform.Coordinates); + + if (!TryGetAnchoredEntity((transform.GridUid.Value, gridComponent), tile, out var footprint)) + return; + + if (!_solution.TryGetSolution(footprint.Value.Owner, FootprintSolution, out _, out var footprintSolution)) + return; + + footprintSolution = footprintSolution.Clone(); + + Del(footprint); + + _puddle.TrySpillAt(transform.Coordinates, footprintSolution, out _, false); + } + + private static FixedPoint2 GetFootprintVolume(Entity entity, Entity solution) + { + return FixedPoint2.Min(solution.Comp.Solution.Volume, (entity.Comp.MaxFootprintVolume - entity.Comp.MinFootprintVolume) * (solution.Comp.Solution.Volume / entity.Comp.MaxFootVolume) + entity.Comp.MinFootprintVolume); + } + + private static FixedPoint2 GetBodyprintVolume(Entity entity, Entity solution) + { + return FixedPoint2.Min(solution.Comp.Solution.Volume, (entity.Comp.MaxBodyprintVolume - entity.Comp.MinBodyprintVolume) * (solution.Comp.Solution.Volume / entity.Comp.MaxBodyVolume) + entity.Comp.MinBodyprintVolume); + } + + private bool TryGetAnchoredEntity(Entity grid, Vector2i pos, [NotNullWhen(true)] out Entity? entity) where T : IComponent + { + var anchoredEnumerator = _map.GetAnchoredEntitiesEnumerator(grid, grid, pos); + var entityQuery = GetEntityQuery(); + + while (anchoredEnumerator.MoveNext(out var ent)) + if (entityQuery.TryComp(ent, out var comp)) + { + entity = (ent.Value, comp); + return true; + } + + entity = null; + return false; + } +} diff --git a/Content.Shared/Fluids/Components/PuddleComponent.cs b/Content.Shared/Fluids/Components/PuddleComponent.cs index 3e08a725841..50fc86c3b5c 100644 --- a/Content.Shared/Fluids/Components/PuddleComponent.cs +++ b/Content.Shared/Fluids/Components/PuddleComponent.cs @@ -24,7 +24,10 @@ public sealed partial class PuddleComponent : Component // Corvax-Next-Footprints-Start [DataField] - public bool ViscosityAffectsMovement = true; + public bool AffectsMovement = true; + + [DataField] + public bool AffectsSound = true; // Corvax-Next-Footprints-End } } diff --git a/Content.Shared/Fluids/SharedPuddleSystem.cs b/Content.Shared/Fluids/SharedPuddleSystem.cs index f573c042c55..2b54c961589 100644 --- a/Content.Shared/Fluids/SharedPuddleSystem.cs +++ b/Content.Shared/Fluids/SharedPuddleSystem.cs @@ -73,6 +73,11 @@ private void OnRefillableCanDropDragged(Entity enti private void OnGetFootstepSound(Entity entity, ref GetFootstepSoundEvent args) { + // Corvax-Next-Footprints + if (!entity.Comp.AffectsSound) + return; + // Corvax-Next-Footprints + if (!_solutionContainerSystem.ResolveSolution(entity.Owner, entity.Comp.SolutionName, ref entity.Comp.Solution, out var solution)) return; diff --git a/Content.Shared/_CorvaxNext/Footprints/Components/FootprintComponent.cs b/Content.Shared/_CorvaxNext/Footprints/Components/FootprintComponent.cs deleted file mode 100644 index 72aff01cd81..00000000000 --- a/Content.Shared/_CorvaxNext/Footprints/Components/FootprintComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Content.Shared.Chemistry.Components; -using Robust.Shared.GameStates; - -namespace Content.Shared._CorvaxNext.Footprints.Components; - -/// -/// This is used for marking footsteps, handling footprint drawing. -/// -[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] -public sealed partial class FootprintComponent : Component -{ - /// - /// Owner (with ) of a print (this component). - /// - [AutoNetworkedField] - public EntityUid FootprintsVisualizer; - - [DataField] - public string SolutionName = "step"; - - [DataField] - public Entity? Solution; -} diff --git a/Content.Shared/_CorvaxNext/Footprints/Components/FootprintVisualizerComponent.cs b/Content.Shared/_CorvaxNext/Footprints/Components/FootprintVisualizerComponent.cs deleted file mode 100644 index 966e0d75cd6..00000000000 --- a/Content.Shared/_CorvaxNext/Footprints/Components/FootprintVisualizerComponent.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System.Numerics; -using Robust.Shared.Prototypes; -using Robust.Shared.Utility; - -namespace Content.Shared._CorvaxNext.Footprints.Components; - -[RegisterComponent] -public sealed partial class FootprintVisualizerComponent : Component -{ - [ViewVariables(VVAccess.ReadOnly), DataField] - public ResPath RsiPath = new("/Textures/_CorvaxNext/Effects/footprints.rsi"); - - // all of those are set as a layer - [ViewVariables(VVAccess.ReadOnly), DataField] - public string LeftBarePrint = "footprint-left-bare-human"; - - [ViewVariables(VVAccess.ReadOnly), DataField] - public string RightBarePrint = "footprint-right-bare-human"; - - [ViewVariables(VVAccess.ReadOnly), DataField] - public string ShoesPrint = "footprint-shoes"; - - [ViewVariables(VVAccess.ReadOnly), DataField] - public string SuitPrint = "footprint-suit"; - - [ViewVariables(VVAccess.ReadOnly), DataField] - public string[] DraggingPrint = - [ - "dragging-1", - "dragging-2", - "dragging-3", - "dragging-4", - "dragging-5", - ]; - // yea, those - - [ViewVariables(VVAccess.ReadOnly), DataField] - public EntProtoId StepProtoId = "Footstep"; - - [ViewVariables(VVAccess.ReadOnly), DataField] - public Color PrintsColor = Color.FromHex("#00000000"); - - /// - /// The size scaling factor for footprint steps. Must be positive. - /// - [DataField] - public float StepSize = 0.7f; - - /// - /// The size scaling factor for drag marks. Must be positive. - /// - [DataField] - public float DragSize = 0.5f; - - /// - /// The amount of color to transfer from the source (e.g., puddle) to the footprint. - /// - [DataField] - public float ColorQuantity; - - /// - /// The factor by which the alpha channel is reduced in subsequent footprints. - /// - [DataField] - public float ColorReduceAlpha = 0.1f; - - [DataField] - public string? ReagentToTransfer; - - [DataField] - public Vector2 OffsetPrint = new(0.1f, 0f); - - /// - /// Tracks which foot should make the next print. True for right foot, false for left. - /// - public bool RightStep = true; - - /// - /// The position of the last footprint in world coordinates. - /// - public Vector2 StepPos = Vector2.Zero; - - /// - /// Controls how quickly the footprint color transitions between steps. - /// Value between 0 and 1, where higher values mean faster color changes. - /// - public float ColorInterpolationFactor = 0.2f; -} diff --git a/Content.Shared/_CorvaxNext/Footprints/Components/PuddleFootprintsComponent.cs b/Content.Shared/_CorvaxNext/Footprints/Components/PuddleFootprintsComponent.cs deleted file mode 100644 index b61ad1dc9fb..00000000000 --- a/Content.Shared/_CorvaxNext/Footprints/Components/PuddleFootprintsComponent.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace Content.Shared._CorvaxNext.Footprints.Components; - -[RegisterComponent] -public sealed partial class PuddleFootprintsComponent : Component -{ - [ViewVariables(VVAccess.ReadWrite)] - public float SizeRatio = 0.2f; - - [ViewVariables(VVAccess.ReadWrite)] - public float OffPercent = 80f; -} diff --git a/Content.Shared/_CorvaxNext/Footprints/FootprintChangedEvent.cs b/Content.Shared/_CorvaxNext/Footprints/FootprintChangedEvent.cs new file mode 100644 index 00000000000..98a39a22d64 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Footprints/FootprintChangedEvent.cs @@ -0,0 +1,9 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared._CorvaxNext.Footprints; + +[Serializable, NetSerializable] +public sealed class FootprintChangedEvent(NetEntity entity) : EntityEventArgs +{ + public NetEntity Entity = entity; +} diff --git a/Content.Shared/_CorvaxNext/Footprints/FootprintComponent.cs b/Content.Shared/_CorvaxNext/Footprints/FootprintComponent.cs new file mode 100644 index 00000000000..59ffdf20d69 --- /dev/null +++ b/Content.Shared/_CorvaxNext/Footprints/FootprintComponent.cs @@ -0,0 +1,15 @@ +using System.Numerics; +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; + +namespace Content.Shared._CorvaxNext.Footprints; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class FootprintComponent : Component +{ + [AutoNetworkedField, ViewVariables] + public List Footprints = []; +} + +[Serializable, NetSerializable] +public readonly record struct Footprint(Vector2 Offset, Angle Rotation, Color Color, string State); diff --git a/Content.Shared/_CorvaxNext/Footprints/FootprintVisuals.cs b/Content.Shared/_CorvaxNext/Footprints/FootprintVisuals.cs deleted file mode 100644 index 91ff0bc643e..00000000000 --- a/Content.Shared/_CorvaxNext/Footprints/FootprintVisuals.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Robust.Shared.Serialization; - -namespace Content.Shared._CorvaxNext.Footprints; - -[Serializable, NetSerializable] -public enum FootprintVisuals : byte -{ - BareFootprint, - ShoesPrint, - SuitPrint, - Dragging -} - -[Serializable, NetSerializable] -public enum FootprintVisualState : byte -{ - State, - Color -} - -[Serializable, NetSerializable] -public enum FootprintVisualLayers : byte -{ - Print -} diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/effects/footprint.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/effects/footprint.ftl new file mode 100644 index 00000000000..52168cf7aaf --- /dev/null +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/effects/footprint.ftl @@ -0,0 +1,2 @@ +ent-Footprint = след + .desc = Дорожка из жидкости. diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/objects/effects/footstep.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/objects/effects/footstep.ftl deleted file mode 100644 index 23636484792..00000000000 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/objects/effects/footstep.ftl +++ /dev/null @@ -1,2 +0,0 @@ -ent-Footstep = след - .desc = След из жидкости. diff --git a/Resources/Prototypes/Entities/Effects/puddle.yml b/Resources/Prototypes/Entities/Effects/puddle.yml index c8c130d3ccc..36f0faa1df1 100644 --- a/Resources/Prototypes/Entities/Effects/puddle.yml +++ b/Resources/Prototypes/Entities/Effects/puddle.yml @@ -165,4 +165,3 @@ - type: Tag tags: - DNASolutionScannable - - type: PuddleFootprints # Corvax-Next-Footprints diff --git a/Resources/Prototypes/Entities/Mobs/Player/arachnid.yml b/Resources/Prototypes/Entities/Mobs/Player/arachnid.yml index 2cb3a3da3e5..d9dea3c18d9 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/arachnid.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/arachnid.yml @@ -10,4 +10,4 @@ Asphyxiation: 1.5 # This makes space and crit more lethal to arachnids. damageRecovery: types: - Asphyxiation: -0.5 \ No newline at end of file + Asphyxiation: -0.5 diff --git a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml index 2bdcde14fa9..0d7f7717586 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml @@ -115,9 +115,7 @@ visible: false - type: Inventory templateId: arachnid - - type: FootprintVisualizer # Corvax-Next-Footprints - leftBarePrint: "footprint-left-bare-spider" - rightBarePrint: "footprint-right-bare-spider" + - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index 9aedfba2feb..4a27bc59eaa 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -288,6 +288,7 @@ Asphyxiation: -1.0 - type: FireVisuals alternateState: Standing + - type: FootprintOwner # Corvax-Next-Footprints - type: entity save: false diff --git a/Resources/Prototypes/Entities/Mobs/Species/diona.yml b/Resources/Prototypes/Entities/Mobs/Species/diona.yml index a25440110b0..205ab2c0cab 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/diona.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/diona.yml @@ -111,9 +111,6 @@ 32: sprite: Mobs/Species/Human/displacement.rsi state: jumpsuit-female - - type: FootprintVisualizer # Corvax-Next-Footprints - leftBarePrint: "footprint-left-bare-diona" - rightBarePrint: "footprint-right-bare-diona" - type: FTLKnockdownImmune # Corvax-Next-FTLImmune - type: entity diff --git a/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml b/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml index 37070f0304d..c925f3a0081 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml @@ -63,9 +63,6 @@ 32: sprite: Mobs/Species/Human/displacement.rsi state: jumpsuit-female - - type: FootprintVisualizer # Corvax-Next-Footprints - leftBarePrint: "footprint-left-bare-dwarf" - rightBarePrint: "footprint-right-bare-dwarf" - type: InnateMiningScannerViewer # Corvax-Next-Dwarfs pingSound: null viewRange: 3 diff --git a/Resources/Prototypes/Entities/Mobs/Species/human.yml b/Resources/Prototypes/Entities/Mobs/Species/human.yml index cf7fd51dde3..bf357e1f102 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/human.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/human.yml @@ -27,7 +27,6 @@ 32: sprite: Mobs/Species/Human/displacement.rsi state: jumpsuit-female - - type: FootprintVisualizer # Corvax-Next-Footprints - type: entity @@ -41,4 +40,4 @@ sizeMaps: 32: sprite: Mobs/Species/Human/displacement.rsi - state: jumpsuit-female + state: jumpsuit-female \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/Species/moth.yml b/Resources/Prototypes/Entities/Mobs/Species/moth.yml index 2a790fd5660..ad09fd57578 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/moth.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/moth.yml @@ -122,7 +122,7 @@ 32: sprite: Mobs/Species/Human/displacement.rsi state: jumpsuit-female - - type: FootprintVisualizer # Corvax-Next-Footprints + - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml index f93d86a6eb8..cb887e40cea 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml @@ -94,9 +94,6 @@ sprite: Corvax/Mobs/Species/displacement.rsi state: shoes # Corvax-Digitigrade-End - - type: FootprintVisualizer # Corvax-Next-Footprints - leftBarePrint: "footprint-left-bare-lizard" - rightBarePrint: "footprint-right-bare-lizard" - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml b/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml index 5434f8de086..b5a625aa66e 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml @@ -110,7 +110,6 @@ 32: sprite: Mobs/Species/Human/displacement.rsi state: jumpsuit-female - - type: FootprintVisualizer # Corvax-Next-Footprints - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/slime.yml b/Resources/Prototypes/Entities/Mobs/Species/slime.yml index d3bc5bdc7ed..0b71a908f58 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/slime.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/slime.yml @@ -119,9 +119,6 @@ 32: sprite: Mobs/Species/Human/displacement.rsi state: jumpsuit-female - - type: FootprintVisualizer # Corvax-Next-Footprints - leftBarePrint: "footprint-left-bare-slime" - rightBarePrint: "footprint-right-bare-slime" - type: entity parent: MobHumanDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/vox.yml b/Resources/Prototypes/Entities/Mobs/Species/vox.yml index 2f9e0c1c2ba..a4da88adc02 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/vox.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/vox.yml @@ -142,9 +142,6 @@ 32: sprite: Mobs/Species/Vox/displacement.rsi state: shoes - - type: FootprintVisualizer # Corvax-Next-Footprints - leftBarePrint: "footprint-left-bare-lizard" - rightBarePrint: "footprint-right-bare-lizard" - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/_CorvaxNext/Entities/Effects/footstep.yml b/Resources/Prototypes/_CorvaxNext/Entities/Effects/footprint.yml similarity index 63% rename from Resources/Prototypes/_CorvaxNext/Entities/Effects/footstep.yml rename to Resources/Prototypes/_CorvaxNext/Entities/Effects/footprint.yml index 8369a040070..a9e12f8a8f3 100644 --- a/Resources/Prototypes/_CorvaxNext/Entities/Effects/footstep.yml +++ b/Resources/Prototypes/_CorvaxNext/Entities/Effects/footprint.yml @@ -1,20 +1,17 @@ - type: entity - name: footstep - id: Footstep + name: footprint + id: Footprint save: false description: Trace of liquid. + placement: + mode: SnapgridCenter components: - type: Clickable - - type: FootstepModifier - footstepSoundCollection: - collection: FootstepWater - params: - volume: 3 - type: Transform noRot: false + anchored: true - type: Sprite drawdepth: FloorObjects - color: "#FFFFFF80" - type: Physics bodyType: Static - type: Fixtures @@ -24,30 +21,28 @@ !type:PhysShapeAabb bounds: "-0.4,-0.4,0.4,0.4" mask: - - ItemMask + - ItemMask layer: - - SlipLayer + - SlipLayer hard: false - type: SolutionContainerManager - solutions: - step: { maxVol: 2 } - type: Footprint - type: Puddle - solution: step - viscosityAffectsMovement: false - - type: Appearance + solution: print + affectsMovement: false + affectsSound: false - type: ExaminableSolution - solution: step + solution: print - type: MixableSolution - solution: step + solution: print - type: DrawableSolution - solution: step + solution: print - type: BadDrink - type: IgnoresFingerprints - type: Drink delay: 3 transferAmount: 0.5 - solution: step + solution: print examinable: false - type: Tag tags: diff --git a/Resources/Prototypes/_CorvaxNext/Entities/Species/resomi.yml b/Resources/Prototypes/_CorvaxNext/Entities/Species/resomi.yml index 409e654e488..a9fdd73df36 100644 --- a/Resources/Prototypes/_CorvaxNext/Entities/Species/resomi.yml +++ b/Resources/Prototypes/_CorvaxNext/Entities/Species/resomi.yml @@ -13,9 +13,6 @@ - type: FlashModifier modifier: 2 - type: ResomiAccent - - type: FootprintVisualizer - leftBarePrint: "footprint-left-bare-lizard" - rightBarePrint: "footprint-right-bare-lizard" - type: DamageVisuals thresholds: [ 10, 30, 50, 70] targetLayers: diff --git a/Resources/Textures/_CorvaxNext/Effects/footprint.rsi/body.png b/Resources/Textures/_CorvaxNext/Effects/footprint.rsi/body.png new file mode 100644 index 00000000000..b6af8f1b598 Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Effects/footprint.rsi/body.png differ diff --git a/Resources/Textures/_CorvaxNext/Effects/footprint.rsi/foot.png b/Resources/Textures/_CorvaxNext/Effects/footprint.rsi/foot.png new file mode 100644 index 00000000000..80051d9bd47 Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Effects/footprint.rsi/foot.png differ diff --git a/Resources/Textures/_CorvaxNext/Effects/footprint.rsi/meta.json b/Resources/Textures/_CorvaxNext/Effects/footprint.rsi/meta.json new file mode 100644 index 00000000000..86a4d9981b8 --- /dev/null +++ b/Resources/Textures/_CorvaxNext/Effects/footprint.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-4.0", + "copyright": "foot.png created by evgen99 (673243657935257617). body.png created by ko4erga (266899933632659456).", + "states": [ + { + "name": "foot" + }, + { + "name": "body" + } + ] +} diff --git a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/dragging-1.png b/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/dragging-1.png deleted file mode 100644 index 74d2aeb0743..00000000000 Binary files a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/dragging-1.png and /dev/null differ diff --git a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/dragging-2.png b/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/dragging-2.png deleted file mode 100644 index cc45f4f8ae8..00000000000 Binary files a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/dragging-2.png and /dev/null differ diff --git a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/dragging-3.png b/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/dragging-3.png deleted file mode 100644 index d0f7274dd3c..00000000000 Binary files a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/dragging-3.png and /dev/null differ diff --git a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/dragging-4.png b/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/dragging-4.png deleted file mode 100644 index 5eb34b5d570..00000000000 Binary files a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/dragging-4.png and /dev/null differ diff --git a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/dragging-5.png b/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/dragging-5.png deleted file mode 100644 index 6b1b34d1456..00000000000 Binary files a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/dragging-5.png and /dev/null differ diff --git a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/dragging-test.png b/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/dragging-test.png deleted file mode 100644 index b8c9ba50a7d..00000000000 Binary files a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/dragging-test.png and /dev/null differ diff --git a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-left-bare-diona.png b/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-left-bare-diona.png deleted file mode 100644 index fa40e0f2977..00000000000 Binary files a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-left-bare-diona.png and /dev/null differ diff --git a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-left-bare-dwarf.png b/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-left-bare-dwarf.png deleted file mode 100644 index 43b88aa1646..00000000000 Binary files a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-left-bare-dwarf.png and /dev/null differ diff --git a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-left-bare-human.png b/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-left-bare-human.png deleted file mode 100644 index f7ab3257c58..00000000000 Binary files a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-left-bare-human.png and /dev/null differ diff --git a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-left-bare-lizard.png b/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-left-bare-lizard.png deleted file mode 100644 index e53ba99227e..00000000000 Binary files a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-left-bare-lizard.png and /dev/null differ diff --git a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-left-bare-slime.png b/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-left-bare-slime.png deleted file mode 100644 index 87561cb1619..00000000000 Binary files a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-left-bare-slime.png and /dev/null differ diff --git a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-left-bare-spider.png b/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-left-bare-spider.png deleted file mode 100644 index 4939e72c4b5..00000000000 Binary files a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-left-bare-spider.png and /dev/null differ diff --git a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-right-bare-diona.png b/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-right-bare-diona.png deleted file mode 100644 index 21f3a117741..00000000000 Binary files a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-right-bare-diona.png and /dev/null differ diff --git a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-right-bare-dwarf.png b/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-right-bare-dwarf.png deleted file mode 100644 index e493ddbdf6a..00000000000 Binary files a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-right-bare-dwarf.png and /dev/null differ diff --git a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-right-bare-human.png b/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-right-bare-human.png deleted file mode 100644 index 4de70b5c1ea..00000000000 Binary files a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-right-bare-human.png and /dev/null differ diff --git a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-right-bare-lizard.png b/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-right-bare-lizard.png deleted file mode 100644 index e53ba99227e..00000000000 Binary files a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-right-bare-lizard.png and /dev/null differ diff --git a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-right-bare-slime.png b/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-right-bare-slime.png deleted file mode 100644 index c10fe24f0b0..00000000000 Binary files a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-right-bare-slime.png and /dev/null differ diff --git a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-right-bare-spider.png b/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-right-bare-spider.png deleted file mode 100644 index e9f3a88776c..00000000000 Binary files a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-right-bare-spider.png and /dev/null differ diff --git a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-shoes.png b/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-shoes.png deleted file mode 100644 index 6cf329a9b6f..00000000000 Binary files a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-shoes.png and /dev/null differ diff --git a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-suit.png b/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-suit.png deleted file mode 100644 index 6bc32d343c7..00000000000 Binary files a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/footprint-suit.png and /dev/null differ diff --git a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/meta.json b/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/meta.json deleted file mode 100644 index 0ce2e096ac5..00000000000 --- a/Resources/Textures/_CorvaxNext/Effects/footprints.rsi/meta.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "version": 1, - "size": { - "x": 32, - "y": 32 - }, - "license": "CC-BY-SA-3.0", - "copyright": "IMPERIAL SPACE", - "states": [ - { - "name": "footprint-left-bare-diona" - }, - { - "name": "footprint-left-bare-dwarf" - }, - { - "name": "footprint-left-bare-human" - }, - { - "name": "footprint-left-bare-lizard" - }, - { - "name": "footprint-left-bare-slime" - }, - { - "name": "footprint-left-bare-spider" - }, - { - "name": "footprint-right-bare-diona" - }, - { - "name": "footprint-right-bare-dwarf" - }, - { - "name": "footprint-right-bare-human" - }, - { - "name": "footprint-right-bare-lizard" - }, - { - "name": "footprint-right-bare-slime" - }, - { - "name": "footprint-right-bare-spider" - }, - { - "name": "footprint-shoes" - }, - { - "name": "footprint-suit" - }, - { - "name": "dragging-1" - }, - { - "name": "dragging-2" - }, - { - "name": "dragging-3" - }, - { - "name": "dragging-4" - }, - { - "name": "dragging-5" - }, - { - "name": "dragging-test" - } - ] -}