From 48ae4d70965e0afed16f7a3c6c534be9ef4d6c6c Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 16 Jun 2024 22:27:39 -0400 Subject: [PATCH 1/7] Fuck its lets go, no more procrastinating on sneks --- .../DeltaV/Lamiae/ClientLamiaVisuals.cs | 18 +- .../Lamiae/LamiaSegmentVisualsComponent.cs | 2 +- .../SegmentSpawnedEvent.cs} | 9 +- .../SegmentedEntityComponent.cs} | 4 +- .../SegmentedEntitySegmentComponent.cs} | 4 +- .../SegmentedEntitySegmentVisuals.cs} | 4 +- .../SegmentedEntity/SegmentedEntitySystem.cs | 204 +++++++++--------- .../DeltaV/Entities/Mobs/Species/lamia.yml | 2 +- .../Objects/Specific/Species/lamia.yml | 4 +- 9 files changed, 120 insertions(+), 131 deletions(-) rename Content.Shared/{DeltaV/Lamiae/SharedLamiaeSystem.cs => SegmentedEntity/SegmentSpawnedEvent.cs} (52%) rename Content.Shared/{DeltaV/Lamiae/LamiaComponent.cs => SegmentedEntity/SegmentedEntityComponent.cs} (96%) rename Content.Shared/{DeltaV/Lamiae/LamiaSegmentComponent.cs => SegmentedEntity/SegmentedEntitySegmentComponent.cs} (89%) rename Content.Shared/{DeltaV/Lamiae/LamiaSegmentVisuals.cs => SegmentedEntity/SegmentedEntitySegmentVisuals.cs} (73%) rename Content.Server/DeltaV/Lamiae/LamiaSystem.cs => Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs (63%) diff --git a/Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs b/Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs index 8b9f3b4c47..046f6a7a3c 100644 --- a/Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs +++ b/Content.Client/DeltaV/Lamiae/ClientLamiaVisuals.cs @@ -6,37 +6,37 @@ using Robust.Client.GameObjects; using System.Numerics; -using Content.Shared.DeltaV.Lamiae; +using Content.Shared.SegmentedEntity; namespace Content.Client.DeltaV.Lamiae; -public sealed class ClientLamiaVisualSystem : VisualizerSystem +public sealed class ClientLamiaVisualSystem : VisualizerSystem { public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnAppearanceChange); + SubscribeLocalEvent(OnAppearanceChange); } - private void OnAppearanceChange(EntityUid uid, LamiaSegmentComponent component, ref AppearanceChangeEvent args) + private void OnAppearanceChange(EntityUid uid, SegmentedEntitySegmentComponent component, ref AppearanceChangeEvent args) { if (args.Sprite == null) return; if (AppearanceSystem.TryGetData(uid, ScaleVisuals.Scale, out var scale) && TryComp(uid, out var sprite)) { - sprite.Scale = (new Vector2(scale, scale)); + sprite.Scale = new Vector2(scale, scale); } - if (AppearanceSystem.TryGetData(uid, LamiaSegmentVisualLayers.Armor, out var worn) - && AppearanceSystem.TryGetData(uid, LamiaSegmentVisualLayers.ArmorRsi, out var path)) + if (AppearanceSystem.TryGetData(uid, SegmentedEntitySegmentVisualLayers.Armor, out var worn) + && AppearanceSystem.TryGetData(uid, SegmentedEntitySegmentVisualLayers.ArmorRsi, out var path)) { var valid = !string.IsNullOrWhiteSpace(path); if (valid) { - args.Sprite.LayerSetRSI(LamiaSegmentVisualLayers.Armor, path); + args.Sprite.LayerSetRSI(SegmentedEntitySegmentVisualLayers.Armor, path); } - args.Sprite.LayerSetVisible(LamiaSegmentVisualLayers.Armor, worn); + args.Sprite.LayerSetVisible(SegmentedEntitySegmentVisualLayers.Armor, worn); } } } diff --git a/Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs b/Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs index d2d519e2c8..e2c1139f23 100644 --- a/Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs +++ b/Content.Client/DeltaV/Lamiae/LamiaSegmentVisualsComponent.cs @@ -7,5 +7,5 @@ namespace Content.Client.DeltaV.Lamiae; [RegisterComponent] -public sealed partial class LamiaSegmentVisualsComponent : Component +public sealed partial class SegmentedEntitySegmentVisualsComponent : Component {} diff --git a/Content.Shared/DeltaV/Lamiae/SharedLamiaeSystem.cs b/Content.Shared/SegmentedEntity/SegmentSpawnedEvent.cs similarity index 52% rename from Content.Shared/DeltaV/Lamiae/SharedLamiaeSystem.cs rename to Content.Shared/SegmentedEntity/SegmentSpawnedEvent.cs index de66e5d530..6b0e0407a3 100644 --- a/Content.Shared/DeltaV/Lamiae/SharedLamiaeSystem.cs +++ b/Content.Shared/SegmentedEntity/SegmentSpawnedEvent.cs @@ -1,11 +1,4 @@ -/* -* Delta-V - This file is licensed under AGPLv3 -* Copyright (c) 2024 Delta-V Contributors -* See AGPLv3.txt for details. -*/ - -namespace Content.Shared.DeltaV.Lamiae; - +namespace Content.Shared.SegmentedEntity; public sealed class SegmentSpawnedEvent : EntityEventArgs { public EntityUid Lamia = default!; diff --git a/Content.Shared/DeltaV/Lamiae/LamiaComponent.cs b/Content.Shared/SegmentedEntity/SegmentedEntityComponent.cs similarity index 96% rename from Content.Shared/DeltaV/Lamiae/LamiaComponent.cs rename to Content.Shared/SegmentedEntity/SegmentedEntityComponent.cs index bc70724404..ee217771d4 100644 --- a/Content.Shared/DeltaV/Lamiae/LamiaComponent.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntityComponent.cs @@ -4,13 +4,13 @@ * See AGPLv3.txt for details. */ -namespace Content.Shared.DeltaV.Lamiae +namespace Content.Shared.SegmentedEntity { /// /// Controls initialization of any Multi-segmented entity /// [RegisterComponent] - public sealed partial class LamiaComponent : Component + public sealed partial class SegmentedEntityComponent : Component { /// /// A list of each UID attached to the Lamia, in order of spawn diff --git a/Content.Shared/DeltaV/Lamiae/LamiaSegmentComponent.cs b/Content.Shared/SegmentedEntity/SegmentedEntitySegmentComponent.cs similarity index 89% rename from Content.Shared/DeltaV/Lamiae/LamiaSegmentComponent.cs rename to Content.Shared/SegmentedEntity/SegmentedEntitySegmentComponent.cs index 37d21ae6f6..b29e282e9e 100644 --- a/Content.Shared/DeltaV/Lamiae/LamiaSegmentComponent.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntitySegmentComponent.cs @@ -6,14 +6,14 @@ using Robust.Shared.GameStates; -namespace Content.Shared.DeltaV.Lamiae +namespace Content.Shared.SegmentedEntity { /// /// Lamia segment /// [RegisterComponent] [NetworkedComponent] - public sealed partial class LamiaSegmentComponent : Component + public sealed partial class SegmentedEntitySegmentComponent : Component { [DataField("AttachedToUid")] public EntityUid AttachedToUid = default!; diff --git a/Content.Shared/DeltaV/Lamiae/LamiaSegmentVisuals.cs b/Content.Shared/SegmentedEntity/SegmentedEntitySegmentVisuals.cs similarity index 73% rename from Content.Shared/DeltaV/Lamiae/LamiaSegmentVisuals.cs rename to Content.Shared/SegmentedEntity/SegmentedEntitySegmentVisuals.cs index 2d73dd746e..f1e6a20211 100644 --- a/Content.Shared/DeltaV/Lamiae/LamiaSegmentVisuals.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntitySegmentVisuals.cs @@ -6,10 +6,10 @@ using Robust.Shared.Serialization; -namespace Content.Shared.DeltaV.Lamiae +namespace Content.Shared.SegmentedEntity { [Serializable, NetSerializable] - public enum LamiaSegmentVisualLayers + public enum SegmentedEntitySegmentVisualLayers { Tail, Armor, diff --git a/Content.Server/DeltaV/Lamiae/LamiaSystem.cs b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs similarity index 63% rename from Content.Server/DeltaV/Lamiae/LamiaSystem.cs rename to Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs index 5a413e7bb2..8d70fad7c2 100644 --- a/Content.Server/DeltaV/Lamiae/LamiaSystem.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs @@ -1,39 +1,54 @@ using Robust.Shared.Physics; using Content.Shared.Damage; using Content.Shared.Explosion; -using Content.Shared.Clothing.Components; using Content.Shared.Humanoid; using Content.Shared.Humanoid.Markings; -using Content.Server.Humanoid; +using Content.Shared.Clothing.Components; using Content.Shared.Inventory.Events; using Content.Shared.Tag; -using Content.Shared.Teleportation.Components; using Content.Shared.Storage.Components; +using Robust.Shared.Physics.Events; +using Content.Shared.Projectiles; +using Content.Shared.Weapons.Ranged.Events; +using Content.Shared.Teleportation.Components; using Robust.Shared.Containers; using Robust.Shared.Map; using Robust.Shared.Physics.Systems; using Robust.Shared.Physics.Components; using System.Numerics; -using Content.Shared.DeltaV.Lamiae; -using Robust.Shared.Physics.Events; -using Content.Shared.Projectiles; -using Content.Shared.Weapons.Ranged.Events; -using System.Linq; -namespace Content.Server.DeltaV.Lamiae +namespace Content.Shared.SegmentedEntity { public sealed partial class LamiaSystem : EntitySystem { - [Dependency] private readonly SharedJointSystem _jointSystem = default!; - [Dependency] private readonly HumanoidAppearanceSystem _humanoid = default!; - [Dependency] private readonly DamageableSystem _damageableSystem = default!; [Dependency] private readonly TagSystem _tagSystem = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly DamageableSystem _damageableSystem = default!; + [Dependency] private readonly SharedHumanoidAppearanceSystem _humanoid = default!; + [Dependency] private readonly SharedJointSystem _jointSystem = default!; + + Queue<(SegmentedEntitySegmentComponent segment, EntityUid lamia)> _segments = new(); [ValidatePrototypeId] private const string LamiaHardsuitTag = "AllowLamiaHardsuit"; - - Queue<(LamiaSegmentComponent segment, EntityUid lamia)> _segments = new(); + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnShootHitscan); + SubscribeLocalEvent(OnLamiaStorageInsertAttempt); + SubscribeLocalEvent(OnSegmentStorageInsertAttempt); + SubscribeLocalEvent(OnDidEquipEvent); + SubscribeLocalEvent(OnDidUnequipEvent); + SubscribeLocalEvent(OnSnekBoom); + SubscribeLocalEvent(PreventShootSelf); + SubscribeLocalEvent(HandleDamageTransfer); + SubscribeLocalEvent(HandleSegmentDamage); + SubscribeLocalEvent(OnSegmentSpawned); + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnJointRemoved); + SubscribeLocalEvent(OnRemovedFromContainer); + } public override void Update(float frameTime) { base.Update(frameTime); @@ -71,63 +86,14 @@ public override void Update(float frameTime) } _segments.Clear(); } - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnShutdown); - SubscribeLocalEvent(OnJointRemoved); - SubscribeLocalEvent(OnRemovedFromContainer); - SubscribeLocalEvent(OnShootHitscan); - SubscribeLocalEvent(OnSegmentSpawned); - SubscribeLocalEvent(HandleDamageTransfer); - SubscribeLocalEvent(HandleSegmentDamage); - SubscribeLocalEvent(OnLamiaStorageInsertAttempt); - SubscribeLocalEvent(OnSegmentStorageInsertAttempt); - SubscribeLocalEvent(OnDidEquipEvent); - SubscribeLocalEvent(OnDidUnequipEvent); - SubscribeLocalEvent(OnSnekBoom); - SubscribeLocalEvent(PreventShootSelf); - } - - /// - /// Handles transferring marking selections to the tail segments. Every tail marking must be repeated 2 times in order for this script to work. - /// - /// - /// - /// - // TODO: Please for the love of god don't make me write a test to validate that every marking also has its matching segment states. - // Future contributors will just find out when their game crashes because they didn't make a marking-segment. - private void OnSegmentSpawned(EntityUid uid, LamiaSegmentComponent component, SegmentSpawnedEvent args) - { - component.Lamia = args.Lamia; - - if (!TryComp(uid, out var species)) return; - if (!TryComp(args.Lamia, out var humanoid)) return; - if (!TryComp(uid, out var appearance)) return; - - _appearance.SetData(uid, ScaleVisuals.Scale, component.ScaleFactor, appearance); - - if (humanoid.MarkingSet.TryGetCategory(MarkingCategories.Tail, out var tailMarkings)) - { - foreach (var markings in tailMarkings) - { - var segmentId = species.Species; - var markingId = markings.MarkingId; - string segmentmarking = $"{markingId}-{segmentId}"; - _humanoid.AddMarking(uid, segmentmarking, markings.MarkingColors); - } - } - } - - private void OnInit(EntityUid uid, LamiaComponent component, ComponentInit args) + private void OnInit(EntityUid uid, SegmentedEntityComponent component, ComponentInit args) { Math.Clamp(component.NumberOfSegments, 2, 18); Math.Clamp(component.TaperOffset, 1, component.NumberOfSegments - 1); SpawnSegments(uid, component); } - private void OnShutdown(EntityUid uid, LamiaComponent component, ComponentShutdown args) + private void OnShutdown(EntityUid uid, SegmentedEntityComponent component, ComponentShutdown args) { foreach (var segment in component.Segments) { @@ -137,7 +103,7 @@ private void OnShutdown(EntityUid uid, LamiaComponent component, ComponentShutdo component.Segments.Clear(); } - private void OnJointRemoved(EntityUid uid, LamiaComponent component, JointRemovedEvent args) + private void OnJointRemoved(EntityUid uid, SegmentedEntityComponent component, JointRemovedEvent args) { if (!component.Segments.Contains(args.OtherEntity)) return; @@ -148,7 +114,7 @@ private void OnJointRemoved(EntityUid uid, LamiaComponent component, JointRemove component.Segments.Clear(); } - private void OnRemovedFromContainer(EntityUid uid, LamiaComponent component, EntGotRemovedFromContainerMessage args) + private void OnRemovedFromContainer(EntityUid uid, SegmentedEntityComponent component, EntGotRemovedFromContainerMessage args) { if (component.Segments.Count != 0) { @@ -160,19 +126,7 @@ private void OnRemovedFromContainer(EntityUid uid, LamiaComponent component, Ent SpawnSegments(uid, component); } - private void HandleSegmentDamage(EntityUid uid, LamiaSegmentComponent component, DamageModifyEvent args) - { - if (args.Origin == component.Lamia) - args.Damage *= 0; - args.Damage = args.Damage / component.DamageModifyFactor; - } - private void HandleDamageTransfer(EntityUid uid, LamiaSegmentComponent component, DamageChangedEvent args) - { - if (args.DamageDelta == null) return; - _damageableSystem.TryChangeDamage(component.Lamia, args.DamageDelta); - } - - public void SpawnSegments(EntityUid uid, LamiaComponent component) + public void SpawnSegments(EntityUid uid, SegmentedEntityComponent component) { int i = 1; var addTo = uid; @@ -184,31 +138,31 @@ public void SpawnSegments(EntityUid uid, LamiaComponent component) } } - private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, LamiaComponent lamiaComponent, int segmentNumber) + private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, SegmentedEntityComponent segmentedComponent, int segmentNumber) { - LamiaSegmentComponent segmentComponent = new(); + SegmentedEntitySegmentComponent segmentComponent = new(); segmentComponent.Lamia = parentuid; segmentComponent.AttachedToUid = segmentuid; - segmentComponent.DamageModifierConstant = lamiaComponent.NumberOfSegments * lamiaComponent.DamageModifierOffset; - float damageModifyCoefficient = segmentComponent.DamageModifierConstant / lamiaComponent.NumberOfSegments; + segmentComponent.DamageModifierConstant = segmentedComponent.NumberOfSegments * segmentedComponent.DamageModifierOffset; + float damageModifyCoefficient = segmentComponent.DamageModifierConstant / segmentedComponent.NumberOfSegments; segmentComponent.DamageModifyFactor = segmentComponent.DamageModifierConstant * damageModifyCoefficient; - segmentComponent.ExplosiveModifyFactor = 1 / segmentComponent.DamageModifyFactor / (lamiaComponent.NumberOfSegments * lamiaComponent.ExplosiveModifierOffset); + segmentComponent.ExplosiveModifyFactor = 1 / segmentComponent.DamageModifyFactor / (segmentedComponent.NumberOfSegments * segmentedComponent.ExplosiveModifierOffset); - float taperConstant = lamiaComponent.NumberOfSegments - lamiaComponent.TaperOffset; + float taperConstant = segmentedComponent.NumberOfSegments - segmentedComponent.TaperOffset; EntityUid segment; if (segmentNumber == 1) - segment = EntityManager.SpawnEntity(lamiaComponent.InitialSegmentId, Transform(segmentuid).Coordinates); + segment = EntityManager.SpawnEntity(segmentedComponent.InitialSegmentId, Transform(segmentuid).Coordinates); else - segment = EntityManager.SpawnEntity(lamiaComponent.SegmentId, Transform(segmentuid).Coordinates); - if (segmentNumber >= taperConstant && lamiaComponent.UseTaperSystem == true) + segment = EntityManager.SpawnEntity(segmentedComponent.SegmentId, Transform(segmentuid).Coordinates); + if (segmentNumber >= taperConstant && segmentedComponent.UseTaperSystem == true) { - segmentComponent.OffsetSwitching = lamiaComponent.StaticOffset * MathF.Pow(lamiaComponent.OffsetConstant, segmentNumber - taperConstant); - segmentComponent.ScaleFactor = lamiaComponent.StaticScale * MathF.Pow(1f / lamiaComponent.OffsetConstant, segmentNumber - taperConstant); + segmentComponent.OffsetSwitching = segmentedComponent.StaticOffset * MathF.Pow(segmentedComponent.OffsetConstant, segmentNumber - taperConstant); + segmentComponent.ScaleFactor = segmentedComponent.StaticScale * MathF.Pow(1f / segmentedComponent.OffsetConstant, segmentNumber - taperConstant); } else { - segmentComponent.OffsetSwitching = lamiaComponent.StaticOffset; - segmentComponent.ScaleFactor = lamiaComponent.StaticScale; + segmentComponent.OffsetSwitching = segmentedComponent.StaticOffset; + segmentComponent.ScaleFactor = segmentedComponent.StaticScale; } if (segmentNumber % 2 != 0) { @@ -220,21 +174,63 @@ private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, LamiaCom EntityManager.AddComponent(segment, segmentComponent, true); EnsureComp(segment); _segments.Enqueue((segmentComponent, parentuid)); - lamiaComponent.Segments.Add(segment); + segmentedComponent.Segments.Add(segment); return segment; } - private void OnLamiaStorageInsertAttempt(EntityUid uid, LamiaComponent comp, ref InsertIntoEntityStorageAttemptEvent args) + /// + /// Handles transferring marking selections to the tail segments. Every tail marking must be repeated 2 times in order for this script to work. + /// + /// + /// + /// + // TODO: Please for the love of god don't make me write a test to validate that every marking also has its matching segment states. + // Future contributors will just find out when their game crashes because they didn't make a marking-segment. + private void OnSegmentSpawned(EntityUid uid, SegmentedEntitySegmentComponent component, SegmentSpawnedEvent args) + { + component.Lamia = args.Lamia; + + if (!TryComp(uid, out var species)) return; + if (!TryComp(args.Lamia, out var humanoid)) return; + if (!TryComp(uid, out var appearance)) return; + + _appearance.SetData(uid, ScaleVisuals.Scale, component.ScaleFactor, appearance); + + if (humanoid.MarkingSet.TryGetCategory(MarkingCategories.Tail, out var tailMarkings)) + { + foreach (var markings in tailMarkings) + { + var segmentId = species.Species; + var markingId = markings.MarkingId; + string segmentmarking = $"{markingId}-{segmentId}"; + _humanoid.AddMarking(uid, segmentmarking, markings.MarkingColors); + } + } + } + + private void HandleSegmentDamage(EntityUid uid, SegmentedEntitySegmentComponent component, DamageModifyEvent args) + { + if (args.Origin == component.Lamia) + args.Damage *= 0; + args.Damage = args.Damage / component.DamageModifyFactor; + } + private void HandleDamageTransfer(EntityUid uid, SegmentedEntitySegmentComponent component, DamageChangedEvent args) + { + if (args.DamageDelta == null) return; + _damageableSystem.TryChangeDamage(component.Lamia, args.DamageDelta); + } + + private void OnLamiaStorageInsertAttempt(EntityUid uid, SegmentedEntityComponent comp, ref InsertIntoEntityStorageAttemptEvent args) { args.Cancelled = true; } - private void OnSegmentStorageInsertAttempt(EntityUid uid, LamiaSegmentComponent comp, ref InsertIntoEntityStorageAttemptEvent args) + private void OnSegmentStorageInsertAttempt(EntityUid uid, SegmentedEntitySegmentComponent comp, ref InsertIntoEntityStorageAttemptEvent args) { args.Cancelled = true; } - private void OnDidEquipEvent(EntityUid equipee, LamiaComponent component, DidEquipEvent args) + private void OnDidEquipEvent(EntityUid equipee, SegmentedEntityComponent component, DidEquipEvent args) { if (!TryComp(args.Equipment, out var clothing)) return; if (args.Slot == "outerClothing" && _tagSystem.HasTag(args.Equipment, LamiaHardsuitTag)) @@ -242,31 +238,31 @@ private void OnDidEquipEvent(EntityUid equipee, LamiaComponent component, DidEqu foreach (var uid in component.Segments) { if (!TryComp(uid, out var appearance)) return; - _appearance.SetData(uid, LamiaSegmentVisualLayers.Armor, true, appearance); + _appearance.SetData(uid, SegmentedEntitySegmentVisualLayers.Armor, true, appearance); if (clothing.RsiPath == null) return; - _appearance.SetData(uid, LamiaSegmentVisualLayers.ArmorRsi, clothing.RsiPath, appearance); + _appearance.SetData(uid, SegmentedEntitySegmentVisualLayers.ArmorRsi, clothing.RsiPath, appearance); } } } - private void OnSnekBoom(EntityUid uid, LamiaSegmentComponent component, ref GetExplosionResistanceEvent args) + private void OnSnekBoom(EntityUid uid, SegmentedEntitySegmentComponent component, ref GetExplosionResistanceEvent args) { args.DamageCoefficient = component.ExplosiveModifyFactor; } - private void OnDidUnequipEvent(EntityUid equipee, LamiaComponent component, DidUnequipEvent args) + private void OnDidUnequipEvent(EntityUid equipee, SegmentedEntityComponent component, DidUnequipEvent args) { if (args.Slot == "outerClothing" && _tagSystem.HasTag(args.Equipment, LamiaHardsuitTag)) { foreach (var uid in component.Segments) { if (!TryComp(uid, out var appearance)) return; - _appearance.SetData(uid, LamiaSegmentVisualLayers.Armor, false, appearance); + _appearance.SetData(uid, SegmentedEntitySegmentVisualLayers.Armor, false, appearance); } } } - private void PreventShootSelf(EntityUid uid, LamiaSegmentComponent component, ref PreventCollideEvent args) + private void PreventShootSelf(EntityUid uid, SegmentedEntitySegmentComponent component, ref PreventCollideEvent args) { if (!TryComp(args.OtherEntity, out var projectileComponent)) return; @@ -276,7 +272,7 @@ private void PreventShootSelf(EntityUid uid, LamiaSegmentComponent component, re } } - private void OnShootHitscan(EntityUid uid, LamiaComponent component, ref HitScanAfterRayCastEvent args) + private void OnShootHitscan(EntityUid uid, SegmentedEntityComponent component, ref HitScanAfterRayCastEvent args) { if (args.RayCastResults == null) return; diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml index d7cb856e29..9b97a24002 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml @@ -194,7 +194,7 @@ - MobMask layer: - MobLayer - - type: Lamia + - type: SegmentedEntity numberOfSegments: 18 - type: Speech speechSounds: Alto diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml index a76973e0f0..173993127f 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml @@ -29,7 +29,7 @@ - MobLayer - type: Transform anchored: false - - type: LamiaSegmentVisuals + - type: SegmentedEntitySegmentVisuals - type: Tag tags: - HideContextMenu @@ -47,7 +47,7 @@ drawdepth: SmallMobs layers: - map: [ "enum.HumanoidVisualLayers.Tail" ] - - map: [ "enum.LamiaSegmentVisualLayers.Armor" ] + - map: [ "enum.SegmentedEntitySegmentVisualLayers.Armor" ] sprite: Clothing/OuterClothing/Hardsuits/basic.rsi state: segment visible: false From c94767740db838e1c7bb065a5b234d8e390f1b48 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 17 Jun 2024 16:39:48 -0400 Subject: [PATCH 2/7] Update SegmentedEntitySystem.cs --- .../SegmentedEntity/SegmentedEntitySystem.cs | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs index 8d70fad7c2..9e393642b3 100644 --- a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs @@ -140,13 +140,6 @@ public void SpawnSegments(EntityUid uid, SegmentedEntityComponent component) private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, SegmentedEntityComponent segmentedComponent, int segmentNumber) { - SegmentedEntitySegmentComponent segmentComponent = new(); - segmentComponent.Lamia = parentuid; - segmentComponent.AttachedToUid = segmentuid; - segmentComponent.DamageModifierConstant = segmentedComponent.NumberOfSegments * segmentedComponent.DamageModifierOffset; - float damageModifyCoefficient = segmentComponent.DamageModifierConstant / segmentedComponent.NumberOfSegments; - segmentComponent.DamageModifyFactor = segmentComponent.DamageModifierConstant * damageModifyCoefficient; - segmentComponent.ExplosiveModifyFactor = 1 / segmentComponent.DamageModifyFactor / (segmentedComponent.NumberOfSegments * segmentedComponent.ExplosiveModifierOffset); float taperConstant = segmentedComponent.NumberOfSegments - segmentedComponent.TaperOffset; EntityUid segment; @@ -154,6 +147,18 @@ private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, Segmente segment = EntityManager.SpawnEntity(segmentedComponent.InitialSegmentId, Transform(segmentuid).Coordinates); else segment = EntityManager.SpawnEntity(segmentedComponent.SegmentId, Transform(segmentuid).Coordinates); + + if (EnsureComp(segment, out var segmentComponent)) + { + segmentComponent.Lamia = parentuid; + segmentComponent.AttachedToUid = segmentuid; + segmentComponent.DamageModifierConstant = segmentedComponent.NumberOfSegments * segmentedComponent.DamageModifierOffset; + float damageModifyCoefficient = segmentComponent.DamageModifierConstant / segmentedComponent.NumberOfSegments; + segmentComponent.DamageModifyFactor = segmentComponent.DamageModifierConstant * damageModifyCoefficient; + segmentComponent.ExplosiveModifyFactor = 1 / segmentComponent.DamageModifyFactor / (segmentedComponent.NumberOfSegments * segmentedComponent.ExplosiveModifierOffset); + } + + if (segmentNumber >= taperConstant && segmentedComponent.UseTaperSystem == true) { segmentComponent.OffsetSwitching = segmentedComponent.StaticOffset * MathF.Pow(segmentedComponent.OffsetConstant, segmentNumber - taperConstant); @@ -168,10 +173,7 @@ private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, Segmente { segmentComponent.OffsetSwitching *= -1; } - - segmentComponent.Owner = segment; segmentComponent.SegmentNumber = segmentNumber; - EntityManager.AddComponent(segment, segmentComponent, true); EnsureComp(segment); _segments.Enqueue((segmentComponent, parentuid)); segmentedComponent.Segments.Add(segment); From 202ab2883af6c1329986fafab38631007f66d429 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 24 Jun 2024 16:25:47 -0400 Subject: [PATCH 3/7] Update SegmentedEntitySystem.cs --- .../SegmentedEntity/SegmentedEntitySystem.cs | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs index 9e393642b3..af9274c2a4 100644 --- a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs @@ -16,6 +16,7 @@ using Robust.Shared.Physics.Systems; using Robust.Shared.Physics.Components; using System.Numerics; +using System.Net; namespace Content.Shared.SegmentedEntity { @@ -148,16 +149,16 @@ private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, Segmente else segment = EntityManager.SpawnEntity(segmentedComponent.SegmentId, Transform(segmentuid).Coordinates); - if (EnsureComp(segment, out var segmentComponent)) - { - segmentComponent.Lamia = parentuid; - segmentComponent.AttachedToUid = segmentuid; - segmentComponent.DamageModifierConstant = segmentedComponent.NumberOfSegments * segmentedComponent.DamageModifierOffset; - float damageModifyCoefficient = segmentComponent.DamageModifierConstant / segmentedComponent.NumberOfSegments; - segmentComponent.DamageModifyFactor = segmentComponent.DamageModifierConstant * damageModifyCoefficient; - segmentComponent.ExplosiveModifyFactor = 1 / segmentComponent.DamageModifyFactor / (segmentedComponent.NumberOfSegments * segmentedComponent.ExplosiveModifierOffset); - } + var segmentComponent = EnsureComp(segment); + segmentComponent.Lamia = parentuid; + segmentComponent.AttachedToUid = segmentuid; + segmentComponent.DamageModifierConstant = segmentedComponent.NumberOfSegments * segmentedComponent.DamageModifierOffset; + float damageModifyCoefficient = segmentComponent.DamageModifierConstant / segmentedComponent.NumberOfSegments; + segmentComponent.DamageModifyFactor = segmentComponent.DamageModifierConstant * damageModifyCoefficient; + segmentComponent.ExplosiveModifyFactor = 1 / segmentComponent.DamageModifyFactor / (segmentedComponent.NumberOfSegments * segmentedComponent.ExplosiveModifierOffset); + segmentComponent.SegmentNumber = segmentNumber; + segmentComponent.Owner = segment; if (segmentNumber >= taperConstant && segmentedComponent.UseTaperSystem == true) { @@ -173,7 +174,7 @@ private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, Segmente { segmentComponent.OffsetSwitching *= -1; } - segmentComponent.SegmentNumber = segmentNumber; + EnsureComp(segment); _segments.Enqueue((segmentComponent, parentuid)); segmentedComponent.Segments.Add(segment); From 84edee0ff742c6a9646de24d80221f7a72fe7457 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 24 Jun 2024 16:39:27 -0400 Subject: [PATCH 4/7] Implement shoot over segment --- .../SegmentedEntity/SegmentedEntitySystem.cs | 11 ----------- .../Entities/Objects/Specific/Species/lamia.yml | 2 ++ 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs index af9274c2a4..a820c87c2a 100644 --- a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs @@ -41,7 +41,6 @@ public override void Initialize() SubscribeLocalEvent(OnDidEquipEvent); SubscribeLocalEvent(OnDidUnequipEvent); SubscribeLocalEvent(OnSnekBoom); - SubscribeLocalEvent(PreventShootSelf); SubscribeLocalEvent(HandleDamageTransfer); SubscribeLocalEvent(HandleSegmentDamage); SubscribeLocalEvent(OnSegmentSpawned); @@ -265,16 +264,6 @@ private void OnDidUnequipEvent(EntityUid equipee, SegmentedEntityComponent compo } } - private void PreventShootSelf(EntityUid uid, SegmentedEntitySegmentComponent component, ref PreventCollideEvent args) - { - if (!TryComp(args.OtherEntity, out var projectileComponent)) return; - - if (projectileComponent.Shooter == component.Lamia) - { - args.Cancelled = true; - } - } - private void OnShootHitscan(EntityUid uid, SegmentedEntityComponent component, ref HitScanAfterRayCastEvent args) { if (args.RayCastResults == null) return; diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml index 173993127f..0383143c26 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Species/lamia.yml @@ -33,6 +33,8 @@ - type: Tag tags: - HideContextMenu + - type: RequireProjectileTarget + active: True - type: entity id: LamiaSegment From 9b135eec80a41c26793e09e10a3e532166b80253 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Fri, 19 Jul 2024 14:46:32 -0400 Subject: [PATCH 5/7] Prove I am still working on this --- .../SegmentedEntity/SegmentedEntitySystem.cs | 102 ++++++++++++++---- .../DeltaV/Entities/Mobs/Species/lamia.yml | 1 + 2 files changed, 81 insertions(+), 22 deletions(-) diff --git a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs index a820c87c2a..c751391adf 100644 --- a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs @@ -17,6 +17,8 @@ using Robust.Shared.Physics.Components; using System.Numerics; using System.Net; +using Robust.Shared.Network; +using System.Net.WebSockets; namespace Content.Shared.SegmentedEntity { @@ -27,6 +29,7 @@ public sealed partial class LamiaSystem : EntitySystem [Dependency] private readonly DamageableSystem _damageableSystem = default!; [Dependency] private readonly SharedHumanoidAppearanceSystem _humanoid = default!; [Dependency] private readonly SharedJointSystem _jointSystem = default!; + [Dependency] private readonly INetManager _net = default!; Queue<(SegmentedEntitySegmentComponent segment, EntityUid lamia)> _segments = new(); @@ -35,19 +38,23 @@ public sealed partial class LamiaSystem : EntitySystem public override void Initialize() { base.Initialize(); + //Parent subscriptions SubscribeLocalEvent(OnShootHitscan); SubscribeLocalEvent(OnLamiaStorageInsertAttempt); - SubscribeLocalEvent(OnSegmentStorageInsertAttempt); SubscribeLocalEvent(OnDidEquipEvent); SubscribeLocalEvent(OnDidUnequipEvent); - SubscribeLocalEvent(OnSnekBoom); - SubscribeLocalEvent(HandleDamageTransfer); - SubscribeLocalEvent(HandleSegmentDamage); - SubscribeLocalEvent(OnSegmentSpawned); SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnJointRemoved); SubscribeLocalEvent(OnRemovedFromContainer); + SubscribeLocalEvent(OnParentChanged); + + //Child subscriptions + SubscribeLocalEvent(OnSegmentStorageInsertAttempt); + SubscribeLocalEvent(OnSnekBoom); + SubscribeLocalEvent(HandleDamageTransfer); + SubscribeLocalEvent(HandleSegmentDamage); + SubscribeLocalEvent(OnSegmentSpawned); } public override void Update(float frameTime) { @@ -88,6 +95,7 @@ public override void Update(float frameTime) } private void OnInit(EntityUid uid, SegmentedEntityComponent component, ComponentInit args) { + EnsureComp(uid); //Temporary, remove when Portal handling is added Math.Clamp(component.NumberOfSegments, 2, 18); Math.Clamp(component.TaperOffset, 1, component.NumberOfSegments - 1); SpawnSegments(uid, component); @@ -95,6 +103,9 @@ private void OnInit(EntityUid uid, SegmentedEntityComponent component, Component private void OnShutdown(EntityUid uid, SegmentedEntityComponent component, ComponentShutdown args) { + if (_net.IsClient) + return; + foreach (var segment in component.Segments) { QueueDel(segment); @@ -103,42 +114,65 @@ private void OnShutdown(EntityUid uid, SegmentedEntityComponent component, Compo component.Segments.Clear(); } + private void SegmentSelfTest(EntityUid uid, SegmentedEntityComponent component) + { + + } + private void OnJointRemoved(EntityUid uid, SegmentedEntityComponent component, JointRemovedEvent args) { if (!component.Segments.Contains(args.OtherEntity)) return; + RespawnSegments(uid, component); + } + + private void OnRemovedFromContainer(EntityUid uid, SegmentedEntityComponent component, EntGotRemovedFromContainerMessage args) + { + RespawnSegments(uid, component); + } + + private void DeleteSegments(SegmentedEntityComponent component) + { + if (_net.IsClient) + return; //Client is not allowed to predict QueueDel, it'll throw an error(but won't crash in Release build) + foreach (var segment in component.Segments) QueueDel(segment); component.Segments.Clear(); } - private void OnRemovedFromContainer(EntityUid uid, SegmentedEntityComponent component, EntGotRemovedFromContainerMessage args) + /// + /// Public call for a SegmentedEntity to reset their tail completely. + /// + /// + /// + public void RespawnSegments(EntityUid uid, SegmentedEntityComponent component) { - if (component.Segments.Count != 0) - { - foreach (var segment in component.Segments) - QueueDel(segment); - component.Segments.Clear(); - } - + DeleteSegments(component); SpawnSegments(uid, component); } - public void SpawnSegments(EntityUid uid, SegmentedEntityComponent component) + private void SpawnSegments(EntityUid uid, SegmentedEntityComponent component) { + if (_net.IsClient) + return; //Client is not allowed to spawn entities. It won't throw an error, but it'll make fake client entities. + + //Segmented Entities are potentially not humanoids, they could for instance be a giant space worm. + var humanoidFactor = TryComp(uid, out var humanoid) ? (humanoid.Height + humanoid.Width) / 2 : 1; + int i = 1; var addTo = uid; while (i <= component.NumberOfSegments + 1) { - var segment = AddSegment(addTo, uid, component, i); + var segment = AddSegment(addTo, uid, component, i, humanoidFactor); addTo = segment; i++; } } - private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, SegmentedEntityComponent segmentedComponent, int segmentNumber) + private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, SegmentedEntityComponent segmentedComponent, int segmentNumber, float humanoidFactor) { float taperConstant = segmentedComponent.NumberOfSegments - segmentedComponent.TaperOffset; @@ -159,22 +193,38 @@ private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, Segmente segmentComponent.SegmentNumber = segmentNumber; segmentComponent.Owner = segment; - if (segmentNumber >= taperConstant && segmentedComponent.UseTaperSystem == true) + if (segmentedComponent.UseTaperSystem == true) { - segmentComponent.OffsetSwitching = segmentedComponent.StaticOffset * MathF.Pow(segmentedComponent.OffsetConstant, segmentNumber - taperConstant); - segmentComponent.ScaleFactor = segmentedComponent.StaticScale * MathF.Pow(1f / segmentedComponent.OffsetConstant, segmentNumber - taperConstant); + if (segmentNumber >= taperConstant) + { + segmentComponent.OffsetSwitching = segmentedComponent.StaticOffset + * humanoidFactor + * MathF.Pow(segmentedComponent.OffsetConstant, segmentNumber - taperConstant); + + segmentComponent.ScaleFactor = segmentedComponent.StaticScale + * humanoidFactor + * MathF.Pow(1f / segmentedComponent.OffsetConstant, segmentNumber - taperConstant); + } + if (segmentNumber < taperConstant) + { + segmentComponent.OffsetSwitching = segmentedComponent.StaticOffset * humanoidFactor; + segmentComponent.ScaleFactor = segmentedComponent.StaticScale * humanoidFactor; + } } else { - segmentComponent.OffsetSwitching = segmentedComponent.StaticOffset; - segmentComponent.ScaleFactor = segmentedComponent.StaticScale; + segmentComponent.OffsetSwitching = segmentedComponent.StaticOffset * humanoidFactor; + segmentComponent.ScaleFactor = segmentedComponent.StaticScale * humanoidFactor; } + + // We invert the Y axis offset on every odd numbered tail so that the segmented entity spawns in a neat pile + // Rather than stretching across 5 to 10 vertical tiles, and potentially getting trapped in a wall if (segmentNumber % 2 != 0) { segmentComponent.OffsetSwitching *= -1; } - EnsureComp(segment); + EnsureComp(segment); //Not temporary, segments must never be allowed to go through portals for physics limitation reasons _segments.Enqueue((segmentComponent, parentuid)); segmentedComponent.Segments.Add(segment); return segment; @@ -276,5 +326,13 @@ private void OnShootHitscan(EntityUid uid, SegmentedEntityComponent component, r } args.RayCastResults = entityList; } + + private void OnParentChanged(EntityUid uid, SegmentedEntityComponent component, ref EntParentChangedMessage args) + { + if (Transform(uid).MapID != args.OldMapId) + return; + + RespawnSegments(uid, component); + } } } diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml index 9b97a24002..eb8d0f03f0 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/lamia.yml @@ -214,6 +214,7 @@ bloodlossHealDamage: types: Bloodloss: -1 + - type: PortalExempt - type: entity save: false From 41eeba0457aae320ebc6ab93601389075025df4f Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 21 Jul 2024 17:52:42 -0400 Subject: [PATCH 6/7] Fix mistakes from merge conflicts --- .../Clothing/OuterClothing/Hardsuits/basic.rsi/meta.json | 1 + .../Clothing/OuterClothing/Hardsuits/rd.rsi/meta.json | 4 ++++ .../Clothing/OuterClothing/Suits/bombsuit.rsi/meta.json | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/meta.json index 925de1c4a7..1fd6139e1d 100644 --- a/Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Hardsuits/basic.rsi/meta.json @@ -1,3 +1,4 @@ +{ "version": 1, "license": "CC-BY-SA-3.0", "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/40d89d11ea4a5cb81d61dc1018b46f4e7d32c62a. Further modifications and derivate works (inhand-left and inhand-right) under same license, derivative monkey made by brainfood1183 (github) for ss14, harpy by VMSolidus, lamia & segment by @noctyrnal", diff --git a/Resources/Textures/Clothing/OuterClothing/Hardsuits/rd.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Hardsuits/rd.rsi/meta.json index ad76d93153..45b83db717 100644 --- a/Resources/Textures/Clothing/OuterClothing/Hardsuits/rd.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Hardsuits/rd.rsi/meta.json @@ -6,6 +6,10 @@ "x": 32, "y": 32 }, + "states": [ + { + "name": "icon" + }, { "name": "equipped-OUTERCLOTHING", "directions": 4 diff --git a/Resources/Textures/Clothing/OuterClothing/Suits/bombsuit.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Suits/bombsuit.rsi/meta.json index 16d4a62e0b..906a91a7ec 100644 --- a/Resources/Textures/Clothing/OuterClothing/Suits/bombsuit.rsi/meta.json +++ b/Resources/Textures/Clothing/OuterClothing/Suits/bombsuit.rsi/meta.json @@ -6,6 +6,10 @@ "x": 32, "y": 32 }, + "states": [ + { + "name": "icon" + }, { "name": "equipped-OUTERCLOTHING", "directions": 4 From c630d637fd905a918446b6551d8d8f50669adf40 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 21 Jul 2024 22:33:38 -0400 Subject: [PATCH 7/7] Lamia are *technically* "Playable" again. --- .../Systems/ShuttleSystem.FasterThanLight.cs | 5 +- .../SegmentedEntity/SegmentedEntitySystem.cs | 73 +++++++++++-------- .../Structures/Piping/Disposal/units.yml | 3 + 3 files changed, 48 insertions(+), 33 deletions(-) diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs index 5128869103..2ac779cc94 100644 --- a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs +++ b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs @@ -9,6 +9,7 @@ using Content.Shared.Ghost; using Content.Shared.Maps; using Content.Shared.Parallax; +using Content.Shared.SegmentedEntity; using Content.Shared.Shuttles.Components; using Content.Shared.Shuttles.Systems; using Content.Shared.StatusEffect; @@ -601,7 +602,9 @@ private void KnockOverKids(TransformComponent xform, ref ValueList to var childEnumerator = xform.ChildEnumerator; while (childEnumerator.MoveNext(out var child)) { - if (!_buckleQuery.TryGetComponent(child, out var buckle) || buckle.Buckled) + if (!_buckleQuery.TryGetComponent(child, out var buckle) || buckle.Buckled + || HasComp(child) + || HasComp(child)) continue; toKnock.Add(child); diff --git a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs index c751391adf..497dd31d59 100644 --- a/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs +++ b/Content.Shared/SegmentedEntity/SegmentedEntitySystem.cs @@ -7,18 +7,13 @@ using Content.Shared.Inventory.Events; using Content.Shared.Tag; using Content.Shared.Storage.Components; -using Robust.Shared.Physics.Events; -using Content.Shared.Projectiles; using Content.Shared.Weapons.Ranged.Events; using Content.Shared.Teleportation.Components; -using Robust.Shared.Containers; using Robust.Shared.Map; using Robust.Shared.Physics.Systems; using Robust.Shared.Physics.Components; using System.Numerics; -using System.Net; using Robust.Shared.Network; -using System.Net.WebSockets; namespace Content.Shared.SegmentedEntity { @@ -46,8 +41,8 @@ public override void Initialize() SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnJointRemoved); - SubscribeLocalEvent(OnRemovedFromContainer); SubscribeLocalEvent(OnParentChanged); + SubscribeLocalEvent(OnStoreSnekAttempt); //Child subscriptions SubscribeLocalEvent(OnSegmentStorageInsertAttempt); @@ -58,6 +53,7 @@ public override void Initialize() } public override void Update(float frameTime) { + //I HATE THIS, SO MUCH. I AM FORCED TO DEAL WITH THIS MONSTROSITY. PLEASE. SEND HELP. base.Update(frameTime); foreach (var segment in _segments) { @@ -73,6 +69,10 @@ public override void Update(float frameTime) EnsureComp(segmentUid); EnsureComp(attachedUid); // Hello I hate tests + // This is currently HERE and not somewhere more sane like OnInit because HumanoidAppearanceComponent is for whatever + // ungodly reason not initialized when ComponentStartup is called. Kill me. + var humanoidFactor = TryComp(segment.segment.Lamia, out var humanoid) ? (humanoid.Height + humanoid.Width) / 2 : 1; + var ev = new SegmentSpawnedEvent(segment.lamia); RaiseLocalEvent(segmentUid, ev, false); @@ -83,9 +83,9 @@ public override void Update(float frameTime) revoluteJoint.CollideConnected = false; } if (segment.segment.SegmentNumber <= segment.segment.MaxSegments) - Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates.Offset(new Vector2(0, segment.segment.OffsetSwitching)); + Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates.Offset(new Vector2(0, segment.segment.OffsetSwitching * humanoidFactor)); else - Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates.Offset(new Vector2(0, segment.segment.OffsetSwitching)); + Transform(segmentUid).Coordinates = Transform(attachedUid).Coordinates.Offset(new Vector2(0, segment.segment.OffsetSwitching * humanoidFactor)); var joint = _jointSystem.CreateDistanceJoint(attachedUid, segmentUid, id: ("Segment" + segment.segment.SegmentNumber + segment.segment.Lamia)); joint.CollideConnected = false; @@ -114,22 +114,37 @@ private void OnShutdown(EntityUid uid, SegmentedEntityComponent component, Compo component.Segments.Clear(); } - private void SegmentSelfTest(EntityUid uid, SegmentedEntityComponent component) + /// + /// TODO: Full Self-Test function that intelligently checks the status of where everything is, and calls whatever + /// functions are appropriate + /// + /// + /// + public void SegmentSelfTest(EntityUid uid, SegmentedEntityComponent component) { } - private void OnJointRemoved(EntityUid uid, SegmentedEntityComponent component, JointRemovedEvent args) + /// + /// TODO: Function that ensures clothing visuals, to be called anytime the tail is reset + /// + /// + /// + private void EnsureSnekSock(EntityUid uid, SegmentedEntityComponent segment) { - if (!component.Segments.Contains(args.OtherEntity)) - return; - RespawnSegments(uid, component); + } + public void OnStoreSnekAttempt(EntityUid uid, SegmentedEntityComponent comp, ref StoreMobInItemContainerAttemptEvent args) + { + args.Cancelled = true; } - private void OnRemovedFromContainer(EntityUid uid, SegmentedEntityComponent component, EntGotRemovedFromContainerMessage args) + private void OnJointRemoved(EntityUid uid, SegmentedEntityComponent component, JointRemovedEvent args) { - RespawnSegments(uid, component); + if (!component.Segments.Contains(args.OtherEntity)) + return; + + DeleteSegments(component); } private void DeleteSegments(SegmentedEntityComponent component) @@ -159,22 +174,18 @@ private void SpawnSegments(EntityUid uid, SegmentedEntityComponent component) if (_net.IsClient) return; //Client is not allowed to spawn entities. It won't throw an error, but it'll make fake client entities. - //Segmented Entities are potentially not humanoids, they could for instance be a giant space worm. - var humanoidFactor = TryComp(uid, out var humanoid) ? (humanoid.Height + humanoid.Width) / 2 : 1; - int i = 1; var addTo = uid; while (i <= component.NumberOfSegments + 1) { - var segment = AddSegment(addTo, uid, component, i, humanoidFactor); + var segment = AddSegment(addTo, uid, component, i); addTo = segment; i++; } } - private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, SegmentedEntityComponent segmentedComponent, int segmentNumber, float humanoidFactor) + private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, SegmentedEntityComponent segmentedComponent, int segmentNumber) { - float taperConstant = segmentedComponent.NumberOfSegments - segmentedComponent.TaperOffset; EntityUid segment; if (segmentNumber == 1) @@ -198,23 +209,21 @@ private EntityUid AddSegment(EntityUid segmentuid, EntityUid parentuid, Segmente if (segmentNumber >= taperConstant) { segmentComponent.OffsetSwitching = segmentedComponent.StaticOffset - * humanoidFactor * MathF.Pow(segmentedComponent.OffsetConstant, segmentNumber - taperConstant); segmentComponent.ScaleFactor = segmentedComponent.StaticScale - * humanoidFactor * MathF.Pow(1f / segmentedComponent.OffsetConstant, segmentNumber - taperConstant); } if (segmentNumber < taperConstant) { - segmentComponent.OffsetSwitching = segmentedComponent.StaticOffset * humanoidFactor; - segmentComponent.ScaleFactor = segmentedComponent.StaticScale * humanoidFactor; + segmentComponent.OffsetSwitching = segmentedComponent.StaticOffset; + segmentComponent.ScaleFactor = segmentedComponent.StaticScale; } } else { - segmentComponent.OffsetSwitching = segmentedComponent.StaticOffset * humanoidFactor; - segmentComponent.ScaleFactor = segmentedComponent.StaticScale * humanoidFactor; + segmentComponent.OffsetSwitching = segmentedComponent.StaticOffset; + segmentComponent.ScaleFactor = segmentedComponent.StaticScale; } // We invert the Y axis offset on every odd numbered tail so that the segmented entity spawns in a neat pile @@ -245,8 +254,9 @@ private void OnSegmentSpawned(EntityUid uid, SegmentedEntitySegmentComponent com if (!TryComp(uid, out var species)) return; if (!TryComp(args.Lamia, out var humanoid)) return; if (!TryComp(uid, out var appearance)) return; + var humanoidFactor = (humanoid.Height + humanoid.Width) / 2; - _appearance.SetData(uid, ScaleVisuals.Scale, component.ScaleFactor, appearance); + _appearance.SetData(uid, ScaleVisuals.Scale, component.ScaleFactor * humanoidFactor, appearance); if (humanoid.MarkingSet.TryGetCategory(MarkingCategories.Tail, out var tailMarkings)) { @@ -329,10 +339,9 @@ private void OnShootHitscan(EntityUid uid, SegmentedEntityComponent component, r private void OnParentChanged(EntityUid uid, SegmentedEntityComponent component, ref EntParentChangedMessage args) { - if (Transform(uid).MapID != args.OldMapId) - return; - - RespawnSegments(uid, component); + //If the change was NOT to a different map + if (args.OldMapId == args.Transform.MapID) + RespawnSegments(uid, component); } } } diff --git a/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml b/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml index 75ec98c402..6d88a1015b 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml @@ -77,6 +77,9 @@ graph: DisposalMachine node: disposal_unit - type: DisposalUnit + blacklist: + components: + - SegmentedEntity - type: UserInterface interfaces: - key: enum.DisposalUnitUiKey.Key