From ba058ccbddeb792ea4e532b8bf13af7fec726aaa Mon Sep 17 00:00:00 2001 From: juliangiebel Date: Wed, 12 Aug 2020 23:01:30 +0200 Subject: [PATCH 01/81] Add priority sorting to `InteractUsing` --- .../GameObjects/EntitySystems/Click/InteractionSystem.cs | 2 +- .../GameObjects/Components/Interaction/IInteractUsing.cs | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Content.Server/GameObjects/EntitySystems/Click/InteractionSystem.cs b/Content.Server/GameObjects/EntitySystems/Click/InteractionSystem.cs index 478f0123d2..fd73d86a3a 100644 --- a/Content.Server/GameObjects/EntitySystems/Click/InteractionSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/Click/InteractionSystem.cs @@ -446,7 +446,7 @@ namespace Content.Server.GameObjects.EntitySystems.Click return; } - var attackBys = attacked.GetAllComponents().ToList(); + var attackBys = attacked.GetAllComponents().OrderByDescending(x => x.Priority); var attackByEventArgs = new InteractUsingEventArgs { User = user, ClickLocation = clickLocation, Using = weapon, Target = attacked diff --git a/Content.Shared/Interfaces/GameObjects/Components/Interaction/IInteractUsing.cs b/Content.Shared/Interfaces/GameObjects/Components/Interaction/IInteractUsing.cs index 79890756a0..1589b00493 100644 --- a/Content.Shared/Interfaces/GameObjects/Components/Interaction/IInteractUsing.cs +++ b/Content.Shared/Interfaces/GameObjects/Components/Interaction/IInteractUsing.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using JetBrains.Annotations; using Robust.Shared.GameObjects; using Robust.Shared.Interfaces.GameObjects; @@ -12,6 +13,12 @@ namespace Content.Shared.Interfaces.GameObjects.Components /// public interface IInteractUsing { + /// + /// The interaction Priority. Higher numbers get called first. + /// + /// Prority defaults to 0 + int Priority { get => 0; } + /// /// Called when using one object on another when user is in range of the target entity. /// From 3b894c7de4bd9f5360999ea6fb47cb6e2fa5dd84 Mon Sep 17 00:00:00 2001 From: juliangiebel Date: Wed, 12 Aug 2020 23:41:09 +0200 Subject: [PATCH 02/81] Add higher interaction priority to --- Content.Server/GameObjects/Components/AnchorableComponent.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Content.Server/GameObjects/Components/AnchorableComponent.cs b/Content.Server/GameObjects/Components/AnchorableComponent.cs index 6ad088bdbe..5ab4989660 100644 --- a/Content.Server/GameObjects/Components/AnchorableComponent.cs +++ b/Content.Server/GameObjects/Components/AnchorableComponent.cs @@ -14,6 +14,8 @@ namespace Content.Server.GameObjects.Components { public override string Name => "Anchorable"; + int IInteractUsing.Priority { get => 1; } + /// /// Checks if a tool can change the anchored status. /// From a41e2d100208b7ff32f15ae98ce194ba3febb945 Mon Sep 17 00:00:00 2001 From: Julian Giebel Date: Thu, 13 Aug 2020 09:54:27 +0200 Subject: [PATCH 03/81] Fix typos in doc comment --- .../GameObjects/Components/Interaction/IInteractUsing.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Shared/Interfaces/GameObjects/Components/Interaction/IInteractUsing.cs b/Content.Shared/Interfaces/GameObjects/Components/Interaction/IInteractUsing.cs index 1589b00493..f036e91314 100644 --- a/Content.Shared/Interfaces/GameObjects/Components/Interaction/IInteractUsing.cs +++ b/Content.Shared/Interfaces/GameObjects/Components/Interaction/IInteractUsing.cs @@ -14,9 +14,9 @@ namespace Content.Shared.Interfaces.GameObjects.Components public interface IInteractUsing { /// - /// The interaction Priority. Higher numbers get called first. + /// The interaction priority. Higher numbers get called first. /// - /// Prority defaults to 0 + /// Priority defaults to 0 int Priority { get => 0; } /// From 781faae98a5bb1609b50991a547f008f8a428b02 Mon Sep 17 00:00:00 2001 From: juliangiebel Date: Thu, 13 Aug 2020 20:14:07 +0200 Subject: [PATCH 04/81] Set interaction priority of PlacableSurfaceComponent to 1 --- .../GameObjects/Components/PlaceableSurfaceComponent.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Content.Server/GameObjects/Components/PlaceableSurfaceComponent.cs b/Content.Server/GameObjects/Components/PlaceableSurfaceComponent.cs index 3ac23365fe..34e41ed1a9 100644 --- a/Content.Server/GameObjects/Components/PlaceableSurfaceComponent.cs +++ b/Content.Server/GameObjects/Components/PlaceableSurfaceComponent.cs @@ -1,4 +1,4 @@ -using Content.Server.GameObjects.Components.GUI; +using Content.Server.GameObjects.Components.GUI; using Content.Shared.GameObjects.Components; using Content.Shared.Interfaces.GameObjects.Components; using Robust.Shared.GameObjects; @@ -12,6 +12,8 @@ namespace Content.Server.GameObjects.Components private bool _isPlaceable; public bool IsPlaceable { get => _isPlaceable; set => _isPlaceable = value; } + int IInteractUsing.Priority { get => 1; } + public override void ExposeData(ObjectSerializer serializer) { base.ExposeData(serializer); From 66367309f0971784ee98a1943fc004710805d02d Mon Sep 17 00:00:00 2001 From: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com> Date: Sun, 16 Aug 2020 05:23:34 -0700 Subject: [PATCH 05/81] Add args.Handled for in simulation hotkeys (#1657) --- Content.Client/State/GameScreenBase.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Content.Client/State/GameScreenBase.cs b/Content.Client/State/GameScreenBase.cs index 1372dacce5..64e62d2b16 100644 --- a/Content.Client/State/GameScreenBase.cs +++ b/Content.Client/State/GameScreenBase.cs @@ -226,7 +226,10 @@ namespace Content.Client.State // client side command handlers will always be sent the local player session. var session = PlayerManager.LocalPlayer.Session; - inputSys.HandleInputCommand(session, func, message); + if (inputSys.HandleInputCommand(session, func, message)) + { + args.Handle(); + } } } } From 43606b061703b92cbc94000d53d91b6ebdd2794e Mon Sep 17 00:00:00 2001 From: Julian Giebel Date: Sun, 16 Aug 2020 14:58:36 +0200 Subject: [PATCH 06/81] Change formating --- Content.Server/GameObjects/Components/AnchorableComponent.cs | 2 +- .../GameObjects/Components/PlaceableSurfaceComponent.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Server/GameObjects/Components/AnchorableComponent.cs b/Content.Server/GameObjects/Components/AnchorableComponent.cs index 5ab4989660..b1d07fbc60 100644 --- a/Content.Server/GameObjects/Components/AnchorableComponent.cs +++ b/Content.Server/GameObjects/Components/AnchorableComponent.cs @@ -14,7 +14,7 @@ namespace Content.Server.GameObjects.Components { public override string Name => "Anchorable"; - int IInteractUsing.Priority { get => 1; } + int IInteractUsing.Priority => 1; /// /// Checks if a tool can change the anchored status. diff --git a/Content.Server/GameObjects/Components/PlaceableSurfaceComponent.cs b/Content.Server/GameObjects/Components/PlaceableSurfaceComponent.cs index 34e41ed1a9..54469fb856 100644 --- a/Content.Server/GameObjects/Components/PlaceableSurfaceComponent.cs +++ b/Content.Server/GameObjects/Components/PlaceableSurfaceComponent.cs @@ -12,7 +12,7 @@ namespace Content.Server.GameObjects.Components private bool _isPlaceable; public bool IsPlaceable { get => _isPlaceable; set => _isPlaceable = value; } - int IInteractUsing.Priority { get => 1; } + int IInteractUsing.Priority => 1; public override void ExposeData(ObjectSerializer serializer) { From f61d55a63de40c3460e49177a687fee6a9f070f6 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Sun, 16 Aug 2020 14:20:16 +0200 Subject: [PATCH 07/81] Disable airlock "walk by" fix. It makes it hard to walk through double doors so I'd rather have this be disabled. --- .../Components/Doors/ServerDoorComponent.cs | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/Content.Server/GameObjects/Components/Doors/ServerDoorComponent.cs b/Content.Server/GameObjects/Components/Doors/ServerDoorComponent.cs index bcd49e5c89..7f4228b272 100644 --- a/Content.Server/GameObjects/Components/Doors/ServerDoorComponent.cs +++ b/Content.Server/GameObjects/Components/Doors/ServerDoorComponent.cs @@ -58,8 +58,7 @@ namespace Content.Server.GameObjects.Components.Doors private const float DoorStunTime = 5f; protected bool Safety = true; - [ViewVariables] - private bool _occludes; + [ViewVariables] private bool _occludes; public override void ExposeData(ObjectSerializer serializer) { @@ -111,18 +110,25 @@ namespace Content.Server.GameObjects.Components.Doors { return; } + + // Disabled because it makes it suck hard to walk through double doors. + if (entity.HasComponent(typeof(SpeciesComponent))) { if (!entity.TryGetComponent(out var mover)) return; + /* // TODO: temporary hack to fix the physics system raising collision events akwardly. // E.g. when moving parallel to a door by going off the side of a wall. var (walking, sprinting) = mover.VelocityDir; // Also TODO: walking and sprint dir are added together here // instead of calculating their contribution correctly. var dotProduct = Vector2.Dot((sprinting + walking).Normalized, (entity.Transform.WorldPosition - Owner.Transform.WorldPosition).Normalized); - if (dotProduct <= -0.9f) + if (dotProduct <= -0.85f) TryOpen(entity); + */ + + TryOpen(entity); } } @@ -144,6 +150,7 @@ namespace Content.Server.GameObjects.Components.Doors { return true; } + return accessReader.IsAllowed(user); } @@ -204,6 +211,7 @@ namespace Content.Server.GameObjects.Components.Doors { return true; } + return accessReader.IsAllowed(user); } @@ -214,6 +222,7 @@ namespace Content.Server.GameObjects.Components.Doors Deny(); return; } + Close(); } @@ -242,6 +251,7 @@ namespace Content.Server.GameObjects.Components.Doors stun.Paralyze(DoorStunTime); hitSomeone = true; } + // If we hit someone, open up after stun (opens right when stun ends) if (hitSomeone) { From 3e87e24028de1aa6db978e073c0c85dfacd8b118 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Aguilera=20Puerto?= Date: Sun, 16 Aug 2020 16:24:27 +0200 Subject: [PATCH 08/81] Optimizes atmos further by using rented arrays where applicable --- Content.Server/Atmos/TileAtmosphere.cs | 92 ++++++++++++++++---------- SpaceStation14.sln.DotSettings | 1 + 2 files changed, 57 insertions(+), 36 deletions(-) diff --git a/Content.Server/Atmos/TileAtmosphere.cs b/Content.Server/Atmos/TileAtmosphere.cs index 8e634a1c7d..cddfc3ee96 100644 --- a/Content.Server/Atmos/TileAtmosphere.cs +++ b/Content.Server/Atmos/TileAtmosphere.cs @@ -332,32 +332,40 @@ namespace Content.Server.Atmos var tile = tiles[i]; tile._tileAtmosInfo.FastDone = true; if (!(tile._tileAtmosInfo.MoleDelta > 0)) continue; - var eligibleDirections = new List(); - var amtEligibleAdj = 0; + var eligibleDirections = ArrayPool.Shared.Rent(4); + var eligibleDirectionCount = 0; foreach (var direction in Cardinal) { if (!tile._adjacentTiles.TryGetValue(direction, out var tile2)) continue; - // skip anything that isn't part of our current processing block. Original one didn't do this unfortunately, which probably cause some massive lag. + // skip anything that isn't part of our current processing block. if (tile2._tileAtmosInfo.FastDone || tile2._tileAtmosInfo.LastQueueCycle != queueCycle) continue; - eligibleDirections.Add(direction); - amtEligibleAdj++; + eligibleDirections[eligibleDirectionCount++] = direction; } - if (amtEligibleAdj <= 0) + if (eligibleDirectionCount <= 0) continue; // Oof we've painted ourselves into a corner. Bad luck. Next part will handle this. - var molesToMove = tile._tileAtmosInfo.MoleDelta / amtEligibleAdj; + var molesToMove = tile._tileAtmosInfo.MoleDelta / eligibleDirectionCount; foreach (var direction in Cardinal) { - if (eligibleDirections.Contains(direction) || - !tile._adjacentTiles.TryGetValue(direction, out var tile2)) continue; + var hasDirection = false; + for (var j = 0; j < eligibleDirectionCount; j++) + { + if (eligibleDirections[j] != direction) continue; + hasDirection = true; + break; + } + + if (hasDirection || !tile._adjacentTiles.TryGetValue(direction, out var tile2)) continue; tile.AdjustEqMovement(direction, molesToMove); tile._tileAtmosInfo.MoleDelta -= molesToMove; tile2._tileAtmosInfo.MoleDelta += molesToMove; } + + ArrayPool.Shared.Return(eligibleDirections); } giverTilesLength = 0; @@ -446,7 +454,7 @@ namespace Content.Server.Atmos } } - ArrayPool.Shared.Return(queue, true); + ArrayPool.Shared.Return(queue); } else { @@ -516,7 +524,7 @@ namespace Content.Server.Atmos } } - ArrayPool.Shared.Return(queue, true); + ArrayPool.Shared.Return(queue); } for (var i = 0; i < tileCount; i++) @@ -537,9 +545,9 @@ namespace Content.Server.Atmos } } - ArrayPool.Shared.Return(tiles, true); - ArrayPool.Shared.Return(giverTiles, true); - ArrayPool.Shared.Return(takerTiles, true); + ArrayPool.Shared.Return(tiles); + ArrayPool.Shared.Return(giverTiles); + ArrayPool.Shared.Return(takerTiles); } } @@ -925,16 +933,22 @@ namespace Content.Server.Atmos public void ExplosivelyDepressurize(int cycleNum) { if (Air == null) return; + + const int limit = Atmospherics.ZumosTileLimit; + var totalGasesRemoved = 0f; var queueCycle = ++_gridAtmosphereComponent.EqualizationQueueCycleControl; - var tiles = new List(); - var spaceTiles = new List(); - tiles.Add(this); + var tiles = ArrayPool.Shared.Rent(limit); + var spaceTiles = ArrayPool.Shared.Rent(limit); + + var tileCount = 0; + var spaceTileCount = 0; + + tiles[tileCount++] = this; ResetTileAtmosInfo(); _tileAtmosInfo.LastQueueCycle = queueCycle; - var tileCount = 1; for (var i = 0; i < tileCount; i++) { var tile = tiles[i]; @@ -942,40 +956,44 @@ namespace Content.Server.Atmos tile._tileAtmosInfo.CurrentTransferDirection = Direction.Invalid; if (tile.Air.Immutable) { - spaceTiles.Add(tile); + spaceTiles[spaceTileCount++] = tile; tile.PressureSpecificTarget = tile; } else { - if (i > Atmospherics.ZumosTileLimit) continue; foreach (var direction in Cardinal) { if (!tile._adjacentTiles.TryGetValue(direction, out var tile2)) continue; - if (tile2?.Air == null) continue; + if (tile2.Air == null) continue; if (tile2._tileAtmosInfo.LastQueueCycle == queueCycle) continue; + tile.ConsiderFirelocks(tile2); - if (tile._adjacentTiles[direction]?.Air != null) - { - tile2.ResetTileAtmosInfo(); - tile2._tileAtmosInfo.LastQueueCycle = queueCycle; - tiles.Add(tile2); - tileCount++; - } + + // The firelocks might have closed on us. + if (tile._adjacentTiles[direction]?.Air == null) continue; + tile2.ResetTileAtmosInfo(); + tile2._tileAtmosInfo.LastQueueCycle = queueCycle; + tiles[tileCount++] = tile2; } } + + if (tileCount >= limit || spaceTileCount >= limit) + break; } var queueCycleSlow = ++_gridAtmosphereComponent.EqualizationQueueCycleControl; - var progressionOrder = new List(); - foreach (var tile in spaceTiles) + var progressionOrder = ArrayPool.Shared.Rent(limit * 2); + var progressionCount = 0; + + for (var i = 0; i < spaceTileCount; i++) { - progressionOrder.Add(tile); + var tile = spaceTiles[i]; + progressionOrder[progressionCount++] = tile; tile._tileAtmosInfo.LastSlowQueueCycle = queueCycleSlow; tile._tileAtmosInfo.CurrentTransferDirection = Direction.Invalid; } - var progressionCount = progressionOrder.Count; - for (int i = 0; i < progressionCount; i++) + for (var i = 0; i < progressionCount; i++) { var tile = progressionOrder[i]; foreach (var direction in Cardinal) @@ -988,8 +1006,7 @@ namespace Content.Server.Atmos tile2._tileAtmosInfo.CurrentTransferAmount = 0; tile2.PressureSpecificTarget = tile.PressureSpecificTarget; tile2._tileAtmosInfo.LastSlowQueueCycle = queueCycleSlow; - progressionOrder.Add(tile2); - progressionCount++; + progressionOrder[progressionCount++] = tile2; } } @@ -1017,6 +1034,10 @@ namespace Content.Server.Atmos tile.UpdateVisuals(); tile.HandleDecompressionFloorRip(sum); } + + ArrayPool.Shared.Return(tiles); + ArrayPool.Shared.Return(spaceTiles); + ArrayPool.Shared.Return(progressionOrder); } private void HandleDecompressionFloorRip(float sum) @@ -1029,7 +1050,6 @@ namespace Content.Server.Atmos private void ConsiderFirelocks(TileAtmosphere other) { // TODO ATMOS firelocks! - //throw new NotImplementedException(); } private void React() diff --git a/SpaceStation14.sln.DotSettings b/SpaceStation14.sln.DotSettings index c93412bf8d..14abc1df09 100644 --- a/SpaceStation14.sln.DotSettings +++ b/SpaceStation14.sln.DotSettings @@ -51,6 +51,7 @@ <data><IncludeFilters /><ExcludeFilters><Filter ModuleMask="Lidgren.Network" ModuleVersionMask="*" ClassMask="*" FunctionMask="*" IsEnabled="True" /></ExcludeFilters></data> True True + True True True True From 1068269db0e3371f64749635248e73622e38d88f Mon Sep 17 00:00:00 2001 From: DrSmugleaf Date: Sun, 16 Aug 2020 16:26:07 +0200 Subject: [PATCH 09/81] Fix pointing by ghosts being visible to the living (#1715) --- .../GameObjects/EntitySystems/PointingSystem.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Content.Server/GameObjects/EntitySystems/PointingSystem.cs b/Content.Server/GameObjects/EntitySystems/PointingSystem.cs index 898ed90475..d27857954f 100644 --- a/Content.Server/GameObjects/EntitySystems/PointingSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/PointingSystem.cs @@ -6,6 +6,7 @@ using Content.Shared.GameObjects.EntitySystems; using Content.Shared.Input; using Content.Shared.Interfaces; using JetBrains.Annotations; +using Robust.Server.GameObjects.Components; using Robust.Server.Interfaces.Player; using Robust.Server.Player; using Robust.Shared.Enums; @@ -113,7 +114,13 @@ namespace Content.Server.GameObjects.EntitySystems var viewers = _playerManager.GetPlayersInRange(player.Transform.GridPosition, 15); - EntityManager.SpawnEntity("pointingarrow", coords); + var arrow = EntityManager.SpawnEntity("pointingarrow", coords); + + if (player.TryGetComponent(out VisibilityComponent playerVisibility)) + { + var arrowVisibility = arrow.EnsureComponent(); + arrowVisibility.Layer = playerVisibility.Layer; + } string selfMessage; string viewerMessage; From d58d84096b935f7cc64f85824c7977a2c7f2d870 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Aguilera=20Puerto?= <6766154+Zumorica@users.noreply.github.com> Date: Sun, 16 Aug 2020 16:30:52 +0200 Subject: [PATCH 10/81] Adds mobCheck to a bunch of inventory/hands methods (#1704) * Adds mobCheck to a bunch of inventory/hands methods, fix not being able to strip dead bodies * Address review --- .../Components/GUI/HandsComponent.cs | 46 +++++++++++-------- .../Components/GUI/InventoryComponent.cs | 35 +++++++------- .../Components/GUI/StrippableComponent.cs | 18 ++++---- .../Items/Clothing/ClothingComponent.cs | 2 +- .../Components/Items/IHandsComponent.cs | 23 ++++++---- 5 files changed, 70 insertions(+), 54 deletions(-) diff --git a/Content.Server/GameObjects/Components/GUI/HandsComponent.cs b/Content.Server/GameObjects/Components/GUI/HandsComponent.cs index ea75c7f382..f5403a6928 100644 --- a/Content.Server/GameObjects/Components/GUI/HandsComponent.cs +++ b/Content.Server/GameObjects/Components/GUI/HandsComponent.cs @@ -11,6 +11,7 @@ using Content.Server.Interfaces.GameObjects.Components.Interaction; using Content.Server.Interfaces.GameObjects.Components.Items; using Content.Shared.GameObjects.Components.Items; using Content.Shared.GameObjects.Components.Mobs; +using Content.Shared.GameObjects.EntitySystems; using Content.Shared.Health.BodySystem; using Content.Shared.Physics; using Robust.Server.GameObjects; @@ -140,11 +141,11 @@ namespace Content.Server.GameObjects.Components.GUI } } - public bool PutInHand(ItemComponent item) + public bool PutInHand(ItemComponent item, bool mobCheck = true) { foreach (var hand in ActivePriorityEnumerable()) { - if (PutInHand(item, hand, false)) + if (PutInHand(item, hand, false, mobCheck)) { OnItemChanged?.Invoke(); @@ -155,10 +156,10 @@ namespace Content.Server.GameObjects.Components.GUI return false; } - public bool PutInHand(ItemComponent item, string index, bool fallback = true) + public bool PutInHand(ItemComponent item, string index, bool fallback = true, bool mobChecks = true) { var hand = GetHand(index); - if (!CanPutInHand(item, index) || hand == null) + if (!CanPutInHand(item, index, mobChecks) || hand == null) { return fallback && PutInHand(item); } @@ -176,19 +177,23 @@ namespace Content.Server.GameObjects.Components.GUI return success; } - public void PutInHandOrDrop(ItemComponent item) + public void PutInHandOrDrop(ItemComponent item, bool mobCheck = true) { - if (!PutInHand(item)) + if (!PutInHand(item, mobCheck)) { item.Owner.Transform.GridPosition = Owner.Transform.GridPosition; } } - public bool CanPutInHand(ItemComponent item) + public bool CanPutInHand(ItemComponent item, bool mobCheck = true) { + if (mobCheck && !ActionBlockerSystem.CanPickup(Owner)) + return false; + foreach (var handName in ActivePriorityEnumerable()) { - if (CanPutInHand(item, handName)) + // We already did a mobCheck, so let's not waste cycles. + if (CanPutInHand(item, handName, false)) { return true; } @@ -197,8 +202,11 @@ namespace Content.Server.GameObjects.Components.GUI return false; } - public bool CanPutInHand(ItemComponent item, string index) + public bool CanPutInHand(ItemComponent item, string index, bool mobCheck = true) { + if (mobCheck && !ActionBlockerSystem.CanPickup(Owner)) + return false; + return GetHand(index)?.Container.CanInsert(item.Owner) == true; } @@ -284,17 +292,17 @@ namespace Content.Server.GameObjects.Components.GUI return Drop(slot, coords, doMobChecks); } - public bool Drop(string slot, bool doMobChecks = true) + public bool Drop(string slot, bool mobChecks = true) { var hand = GetHand(slot); - if (!CanDrop(slot) || hand?.Entity == null) + if (!CanDrop(slot, mobChecks) || hand?.Entity == null) { return false; } var item = hand.Entity.GetComponent(); - if (!DroppedInteraction(item, doMobChecks)) + if (!DroppedInteraction(item, mobChecks)) return false; if (!hand.Container.Remove(hand.Entity)) @@ -321,7 +329,7 @@ namespace Content.Server.GameObjects.Components.GUI return true; } - public bool Drop(IEntity entity, bool doMobChecks = true) + public bool Drop(IEntity entity, bool mobChecks = true) { if (entity == null) { @@ -333,7 +341,7 @@ namespace Content.Server.GameObjects.Components.GUI throw new ArgumentException("Entity must be held in one of our hands.", nameof(entity)); } - return Drop(slot, doMobChecks); + return Drop(slot, mobChecks); } public bool Drop(string slot, BaseContainer targetContainer, bool doMobChecks = true) @@ -409,13 +417,15 @@ namespace Content.Server.GameObjects.Components.GUI /// /// True if there is an item in the slot and it can be dropped, false otherwise. /// - public bool CanDrop(string name) + public bool CanDrop(string name, bool mobCheck = true) { var hand = GetHand(name); - if (hand?.Entity == null) - { + + if (mobCheck && !ActionBlockerSystem.CanDrop(Owner)) + return false; + + if (hand?.Entity == null) return false; - } return hand.Container.CanRemove(hand.Entity); } diff --git a/Content.Server/GameObjects/Components/GUI/InventoryComponent.cs b/Content.Server/GameObjects/Components/GUI/InventoryComponent.cs index 1d1e52b6a2..57ab715eb5 100644 --- a/Content.Server/GameObjects/Components/GUI/InventoryComponent.cs +++ b/Content.Server/GameObjects/Components/GUI/InventoryComponent.cs @@ -173,9 +173,10 @@ namespace Content.Server.GameObjects.Components.GUI /// /// The slot to put the item in. /// The item to insert into the slot. + /// Whether to perform an ActionBlocker check to the entity. /// The translated reason why the item cannot be equipped, if this function returns false. Can be null. /// True if the item was successfully inserted, false otherwise. - public bool Equip(Slots slot, ItemComponent item, out string reason) + public bool Equip(Slots slot, ItemComponent item, bool mobCheck, out string reason) { if (item == null) { @@ -183,7 +184,7 @@ namespace Content.Server.GameObjects.Components.GUI "Clothing must be passed here. To remove some clothing from a slot, use Unequip()"); } - if (!CanEquip(slot, item, out reason)) + if (!CanEquip(slot, item, mobCheck, out reason)) { return false; } @@ -203,9 +204,9 @@ namespace Content.Server.GameObjects.Components.GUI return true; } - public bool Equip(Slots slot, ItemComponent item) => Equip(slot, item, out var _); + public bool Equip(Slots slot, ItemComponent item, bool mobCheck = true) => Equip(slot, item, mobCheck, out var _); - public bool Equip(Slots slot, IEntity entity) => Equip(slot, entity.GetComponent()); + public bool Equip(Slots slot, IEntity entity, bool mobCheck = true) => Equip(slot, entity.GetComponent(), mobCheck); /// /// Checks whether an item can be put in the specified slot. @@ -214,12 +215,12 @@ namespace Content.Server.GameObjects.Components.GUI /// The item to check for. /// The translated reason why the item cannot be equiped, if this function returns false. Can be null. /// True if the item can be inserted into the specified slot. - public bool CanEquip(Slots slot, ItemComponent item, out string reason) + public bool CanEquip(Slots slot, ItemComponent item, bool mobCheck, out string reason) { var pass = false; reason = null; - if (!ActionBlockerSystem.CanEquip(Owner)) + if (mobCheck && !ActionBlockerSystem.CanEquip(Owner)) return false; if (item is ClothingComponent clothing) @@ -248,18 +249,19 @@ namespace Content.Server.GameObjects.Components.GUI return pass && _slotContainers[slot].CanInsert(item.Owner); } - public bool CanEquip(Slots slot, ItemComponent item) => CanEquip(slot, item, out var _); + public bool CanEquip(Slots slot, ItemComponent item, bool mobCheck = true) => CanEquip(slot, item, mobCheck, out var _); - public bool CanEquip(Slots slot, IEntity entity) => CanEquip(slot, entity.GetComponent()); + public bool CanEquip(Slots slot, IEntity entity, bool mobCheck = true) => CanEquip(slot, entity.GetComponent(), mobCheck); /// /// Drops the item in a slot. /// /// The slot to drop the item from. /// True if an item was dropped, false otherwise. - public bool Unequip(Slots slot) + /// Whether to perform an ActionBlocker check to the entity. + public bool Unequip(Slots slot, bool mobCheck = true) { - if (!CanUnequip(slot)) + if (!CanUnequip(slot, mobCheck)) { return false; } @@ -288,16 +290,17 @@ namespace Content.Server.GameObjects.Components.GUI /// Checks whether an item can be dropped from the specified slot. /// /// The slot to check for. + /// Whether to perform an ActionBlocker check to the entity. /// /// True if there is an item in the slot and it can be dropped, false otherwise. /// - public bool CanUnequip(Slots slot) + public bool CanUnequip(Slots slot, bool mobCheck = true) { - if (!ActionBlockerSystem.CanUnequip(Owner)) + if (mobCheck && !ActionBlockerSystem.CanUnequip(Owner)) return false; - var InventorySlot = _slotContainers[slot]; - return InventorySlot.ContainedEntity != null && InventorySlot.CanRemove(InventorySlot.ContainedEntity); + var inventorySlot = _slotContainers[slot]; + return inventorySlot.ContainedEntity != null && inventorySlot.CanRemove(inventorySlot.ContainedEntity); } /// @@ -398,7 +401,7 @@ namespace Content.Server.GameObjects.Components.GUI if (activeHand != null && activeHand.Owner.TryGetComponent(out ItemComponent clothing)) { hands.Drop(hands.ActiveHand); - if (!Equip(msg.Inventoryslot, clothing, out var reason)) + if (!Equip(msg.Inventoryslot, clothing, true, out var reason)) { hands.PutInHand(clothing); @@ -434,7 +437,7 @@ namespace Content.Server.GameObjects.Components.GUI var activeHand = hands.GetActiveHand; if (activeHand != null && GetSlotItem(msg.Inventoryslot) == null) { - var canEquip = CanEquip(msg.Inventoryslot, activeHand, out var reason); + var canEquip = CanEquip(msg.Inventoryslot, activeHand, true, out var reason); _hoverEntity = new KeyValuePair(msg.Inventoryslot, (activeHand.Owner.Uid, canEquip)); Dirty(); diff --git a/Content.Server/GameObjects/Components/GUI/StrippableComponent.cs b/Content.Server/GameObjects/Components/GUI/StrippableComponent.cs index e045fd2b5a..0363fee424 100644 --- a/Content.Server/GameObjects/Components/GUI/StrippableComponent.cs +++ b/Content.Server/GameObjects/Components/GUI/StrippableComponent.cs @@ -137,7 +137,7 @@ namespace Content.Server.GameObjects.Components.GUI return false; } - if (!inventory.CanEquip(slot, item)) + if (!inventory.CanEquip(slot, item, false)) { _notifyManager.PopupMessageCursor(user, Loc.GetString("{0:They} cannot equip that there!", Owner)); return false; @@ -162,7 +162,7 @@ namespace Content.Server.GameObjects.Components.GUI if (result != DoAfterStatus.Finished) return; userHands.Drop(item!.Owner, false); - inventory.Equip(slot, item!.Owner); + inventory.Equip(slot, item!.Owner, false); UpdateSubscribed(); } @@ -202,7 +202,7 @@ namespace Content.Server.GameObjects.Components.GUI return false; } - if (!hands.CanPutInHand(item, hand)) + if (!hands.CanPutInHand(item, hand, false)) { _notifyManager.PopupMessageCursor(user, Loc.GetString("{0:They} cannot put that there!", Owner)); return false; @@ -227,7 +227,7 @@ namespace Content.Server.GameObjects.Components.GUI if (result != DoAfterStatus.Finished) return; userHands.Drop(hand, false); - hands.PutInHand(item, hand, false); + hands.PutInHand(item!, hand, false, false); UpdateSubscribed(); } @@ -253,7 +253,7 @@ namespace Content.Server.GameObjects.Components.GUI return false; } - if (!inventory.CanUnequip(slot)) + if (!inventory.CanUnequip(slot, false)) { _notifyManager.PopupMessageCursor(user, Loc.GetString("{0:They} cannot unequip that!", Owner)); return false; @@ -277,7 +277,7 @@ namespace Content.Server.GameObjects.Components.GUI if (result != DoAfterStatus.Finished) return; var item = inventory.GetSlotItem(slot); - inventory.Unequip(slot); + inventory.Unequip(slot, false); userHands.PutInHandOrDrop(item); UpdateSubscribed(); } @@ -304,7 +304,7 @@ namespace Content.Server.GameObjects.Components.GUI return false; } - if (!hands.CanDrop(hand)) + if (!hands.CanDrop(hand, false)) { _notifyManager.PopupMessageCursor(user, Loc.GetString("{0:They} cannot drop that!", Owner)); return false; @@ -329,7 +329,7 @@ namespace Content.Server.GameObjects.Components.GUI var item = hands.GetItem(hand); hands.Drop(hand, false); - userHands.PutInHandOrDrop(item); + userHands.PutInHandOrDrop(item!); UpdateSubscribed(); } @@ -364,8 +364,6 @@ namespace Content.Server.GameObjects.Components.GUI else TakeItemFromHands(user, handMessage.Hand); break; - default: - break; } } } diff --git a/Content.Server/GameObjects/Components/Items/Clothing/ClothingComponent.cs b/Content.Server/GameObjects/Components/Items/Clothing/ClothingComponent.cs index a94c5982bc..7de3236ec9 100644 --- a/Content.Server/GameObjects/Components/Items/Clothing/ClothingComponent.cs +++ b/Content.Server/GameObjects/Components/Items/Clothing/ClothingComponent.cs @@ -112,7 +112,7 @@ namespace Content.Server.GameObjects.Components.Items.Clothing private bool TryEquip(InventoryComponent inv, Slots slot, IEntity user) { - if (!inv.Equip(slot, this, out var reason)) + if (!inv.Equip(slot, this, true, out var reason)) { if (reason != null) _serverNotifyManager.PopupMessage(Owner, user, reason); diff --git a/Content.Server/Interfaces/GameObjects/Components/Items/IHandsComponent.cs b/Content.Server/Interfaces/GameObjects/Components/Items/IHandsComponent.cs index e716533285..5765098531 100644 --- a/Content.Server/Interfaces/GameObjects/Components/Items/IHandsComponent.cs +++ b/Content.Server/Interfaces/GameObjects/Components/Items/IHandsComponent.cs @@ -61,8 +61,9 @@ namespace Content.Server.Interfaces.GameObjects.Components.Items /// Puts an item into any empty hand, preferring the active hand. /// /// The item to put in a hand. + /// Whether to perform an ActionBlocker check to the entity. /// True if the item was inserted, false otherwise. - bool PutInHand(ItemComponent item); + bool PutInHand(ItemComponent item, bool mobCheck = true); /// /// Puts an item into a specific hand. @@ -71,24 +72,27 @@ namespace Content.Server.Interfaces.GameObjects.Components.Items /// The name of the hand to put the item into. /// /// If true and the provided hand is full, the method will fall back to + /// Whether to perform an ActionBlocker check to the entity. /// /// True if the item was inserted into a hand, false otherwise. - bool PutInHand(ItemComponent item, string index, bool fallback=true); + bool PutInHand(ItemComponent item, string index, bool fallback=true, bool mobCheck = true); /// /// Checks to see if an item can be put in any hand. /// /// The item to check for. + /// Whether to perform an ActionBlocker check to the entity. /// True if the item can be inserted, false otherwise. - bool CanPutInHand(ItemComponent item); + bool CanPutInHand(ItemComponent item, bool mobCheck = true); /// /// Checks to see if an item can be put in the specified hand. /// /// The item to check for. /// The name for the hand to check for. + /// Whether to perform an ActionBlocker check to the entity. /// True if the item can be inserted, false otherwise. - bool CanPutInHand(ItemComponent item, string index); + bool CanPutInHand(ItemComponent item, string index, bool mobCheck = true); /// /// Finds the hand slot holding the specified entity, if any. @@ -107,15 +111,15 @@ namespace Content.Server.Interfaces.GameObjects.Components.Items /// Drops the item contained in the slot to the same position as our entity. /// /// The slot of which to drop to drop the item. - /// Whether to check the for the mob or not. + /// Whether to check the for the mob or not. /// True on success, false if something blocked the drop. - bool Drop(string slot, bool doMobChecks = true); + bool Drop(string slot, bool mobChecks = true); /// /// Drops an item held by one of our hand slots to the same position as our owning entity. /// /// The item to drop. - /// Whether to check the for the mob or not. + /// Whether to check the for the mob or not. /// True on success, false if something blocked the drop. /// /// Thrown if is null. @@ -123,7 +127,7 @@ namespace Content.Server.Interfaces.GameObjects.Components.Items /// /// Thrown if is not actually held in any hand. /// - bool Drop(IEntity entity, bool doMobChecks = true); + bool Drop(IEntity entity, bool mobChecks = true); /// /// Drops the item in a slot. @@ -194,10 +198,11 @@ namespace Content.Server.Interfaces.GameObjects.Components.Items /// Checks whether the item in the specified hand can be dropped. /// /// The hand to check for. + /// Whether to perform an ActionBlocker check to the entity. /// /// True if the item can be dropped, false if the hand is empty or the item in the hand cannot be dropped. /// - bool CanDrop(string name); + bool CanDrop(string name, bool mobCheck = true); /// /// Adds a new hand to this hands component. From 83567c1bd9047e9a116a7de99d2c53f7d8aa9970 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Aguilera=20Puerto?= Date: Sun, 16 Aug 2020 17:08:27 +0200 Subject: [PATCH 11/81] Improves MindComponent's description. Force ghost without body return when commiting suicide. --- Content.Server/Chat/ChatCommands.cs | 8 +++++++- .../GameObjects/Components/Mobs/MindComponent.cs | 3 ++- Content.Server/Observer/Ghost.cs | 3 ++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Content.Server/Chat/ChatCommands.cs b/Content.Server/Chat/ChatCommands.cs index 9d3ff7c995..a6c5404f59 100644 --- a/Content.Server/Chat/ChatCommands.cs +++ b/Content.Server/Chat/ChatCommands.cs @@ -1,10 +1,12 @@ -using System.Linq; +using System; +using System.Linq; using Content.Server.GameObjects.Components.Damage; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Observer; using Content.Server.Interfaces.Chat; using Content.Server.Interfaces.GameObjects; +using Content.Server.Observer; using Content.Server.Players; using Content.Shared.GameObjects.Components.Damage; using Robust.Server.Interfaces.Console; @@ -168,6 +170,10 @@ namespace Content.Server.Chat // Default suicide, bite your tongue chat.EntityMe(owner, Loc.GetString("is attempting to bite {0:their} own tongue, looks like {0:theyre} trying to commit suicide!", owner)); //TODO: theyre macro dmgComponent.TakeDamage(DamageType.Brute, 500, owner, owner); //TODO: dmg value needs to be a max damage of some sorts + + // Prevent the player from returning to the body. Yes, this is an ugly hack. + var ghost = new Ghost(){CanReturn = false}; + ghost.Execute(shell, player, Array.Empty()); } } } diff --git a/Content.Server/GameObjects/Components/Mobs/MindComponent.cs b/Content.Server/GameObjects/Components/Mobs/MindComponent.cs index d148490bd9..fe033e2231 100644 --- a/Content.Server/GameObjects/Components/Mobs/MindComponent.cs +++ b/Content.Server/GameObjects/Components/Mobs/MindComponent.cs @@ -137,7 +137,8 @@ namespace Content.Server.GameObjects.Components.Mobs } else if (Mind?.Session == null) { - message.AddMarkup("[color=yellow]" + Loc.GetString("{0:They} {0:have} a blank, absent-minded stare and appears completely unresponsive to anything. {0:They} may snap out of it soon.", Owner) + "[/color]"); + if(!dead) + message.AddMarkup("[color=yellow]" + Loc.GetString("{0:They} {0:have} a blank, absent-minded stare and appears completely unresponsive to anything. {0:They} may snap out of it soon.", Owner) + "[/color]"); } } } diff --git a/Content.Server/Observer/Ghost.cs b/Content.Server/Observer/Ghost.cs index 80480b958a..004f5951ee 100644 --- a/Content.Server/Observer/Ghost.cs +++ b/Content.Server/Observer/Ghost.cs @@ -17,6 +17,7 @@ namespace Content.Server.Observer public string Command => "ghost"; public string Description => "Give up on life and become a ghost."; public string Help => "ghost"; + public bool CanReturn { get; set; } = true; public void Execute(IConsoleShell shell, IPlayerSession player, string[] args) { @@ -27,7 +28,7 @@ namespace Content.Server.Observer } var mind = player.ContentData().Mind; - var canReturn = player.AttachedEntity != null; + var canReturn = player.AttachedEntity != null && CanReturn; var name = player.AttachedEntity?.Name ?? player.Name; if (player.AttachedEntity != null && player.AttachedEntity.HasComponent()) From 2c853ea5723c3a68d5eb696e8707973c6530c5df Mon Sep 17 00:00:00 2001 From: Julian Giebel Date: Sun, 16 Aug 2020 17:45:15 +0200 Subject: [PATCH 12/81] Update IInteractUsing.cs --- .../GameObjects/Components/Interaction/IInteractUsing.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/Interfaces/GameObjects/Components/Interaction/IInteractUsing.cs b/Content.Shared/Interfaces/GameObjects/Components/Interaction/IInteractUsing.cs index f036e91314..21c0dacedb 100644 --- a/Content.Shared/Interfaces/GameObjects/Components/Interaction/IInteractUsing.cs +++ b/Content.Shared/Interfaces/GameObjects/Components/Interaction/IInteractUsing.cs @@ -17,7 +17,7 @@ namespace Content.Shared.Interfaces.GameObjects.Components /// The interaction priority. Higher numbers get called first. /// /// Priority defaults to 0 - int Priority { get => 0; } + int Priority => 0; /// /// Called when using one object on another when user is in range of the target entity. From 327c3b92adf8d8b9321b8812606f6e6b766c6ce6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Aguilera=20Puerto?= Date: Sun, 16 Aug 2020 18:18:42 +0200 Subject: [PATCH 13/81] Adds conditional spawners for ammunition. Still needs to be mapped in. --- .../Markers/gamemode_conditional_spawners.yml | 133 ++++++++++++++++++ .../Interface/Misc/markers.rsi/meta.json | 47 ++++++- .../Interface/Misc/markers.rsi/spawner_ai.png | Bin 5382 -> 1115 bytes .../markers.rsi/spawner_launcher_ammo.png | Bin 0 -> 445 bytes .../Misc/markers.rsi/spawner_magnum_ammo.png | Bin 0 -> 614 bytes .../Misc/markers.rsi/spawner_pistol_ammo.png | Bin 0 -> 636 bytes .../Misc/markers.rsi/spawner_rifle_ammo.png | Bin 0 -> 482 bytes .../Misc/markers.rsi/spawner_shotgun_ammo.png | Bin 0 -> 469 bytes .../Misc/markers.rsi/spawner_trash.png | Bin 663 -> 551 bytes .../Misc/markers.rsi/spawner_xenoai.png | Bin 5530 -> 1111 bytes 10 files changed, 179 insertions(+), 1 deletion(-) create mode 100644 Resources/Textures/Interface/Misc/markers.rsi/spawner_launcher_ammo.png create mode 100644 Resources/Textures/Interface/Misc/markers.rsi/spawner_magnum_ammo.png create mode 100644 Resources/Textures/Interface/Misc/markers.rsi/spawner_pistol_ammo.png create mode 100644 Resources/Textures/Interface/Misc/markers.rsi/spawner_rifle_ammo.png create mode 100644 Resources/Textures/Interface/Misc/markers.rsi/spawner_shotgun_ammo.png diff --git a/Resources/Prototypes/Entities/Effects/Markers/gamemode_conditional_spawners.yml b/Resources/Prototypes/Entities/Effects/Markers/gamemode_conditional_spawners.yml index f5a840c392..b203903616 100644 --- a/Resources/Prototypes/Entities/Effects/Markers/gamemode_conditional_spawners.yml +++ b/Resources/Prototypes/Entities/Effects/Markers/gamemode_conditional_spawners.yml @@ -260,6 +260,139 @@ - ExGrenade - GrenadeFlashBang - SyndieMiniBomb + - GrenadeFlash + - GrenadeBlast + - GrenadeFrag + - GrenadeBaton chance: 0.75 gameRules: - RuleSuspicion + +- type: entity + name: Suspicion Sniper Spawner + id: SuspicionSniperSpawner + parent: BaseConditionalSpawner + components: + - type: Sprite + netsync: false + visible: false + sprite: Interface/Misc/markers.rsi + state: spawner_sniper + - type: Icon + sprite: Interface/Misc/markers.rsi + state: spawner_sniper + - type: ConditionalSpawner + prototypes: + - SniperBoltGun + - SniperBoltGunWood + - SniperHeavy + chance: 0.75 + gameRules: + - RuleSuspicion + +- type: entity + name: Suspicion Rifle Ammo Spawner + id: SuspicionRifleMagazineSpawner + parent: BaseConditionalSpawner + components: + - type: Sprite + netsync: false + visible: false + sprite: Interface/Misc/markers.rsi + state: spawner_rifle_ammo + - type: Icon + sprite: Interface/Misc/markers.rsi + state: spawner_rifle_ammo + - type: ConditionalSpawner + prototypes: + - MagazineSRifle + - MagazineClRifle + - MagazineLRifle + chance: 0.95 + gameRules: + - RuleSuspicion + +- type: entity + name: Suspicion Shotgun Ammo Spawner + id: SuspicionShotgunMagazineSpawner + parent: BaseConditionalSpawner + components: + - type: Sprite + netsync: false + visible: false + sprite: Interface/Misc/markers.rsi + state: spawner_shotgun_ammo + - type: Icon + sprite: Interface/Misc/markers.rsi + state: spawner_shotgun_ammo + - type: ConditionalSpawner + prototypes: + - MagazineShotgun + chance: 0.95 + gameRules: + - RuleSuspicion + +- type: entity + name: Suspicion Pistol Ammo Spawner + id: SuspicionPistolMagazineSpawner + parent: BaseConditionalSpawner + components: + - type: Sprite + netsync: false + visible: false + sprite: Interface/Misc/markers.rsi + state: spawner_pistol_ammo + - type: Icon + sprite: Interface/Misc/markers.rsi + state: spawner_pistol_ammo + - type: ConditionalSpawner + prototypes: + - MagazinePistol + - MagazineHCPistol + - MagazinePistolSmg + - MagazineClRiflePistol + chance: 0.95 + gameRules: + - RuleSuspicion + +- type: entity + name: Suspicion Magnum Ammo Spawner + id: SuspicionMagnumMagazineSpawner + parent: BaseConditionalSpawner + components: + - type: Sprite + netsync: false + visible: false + sprite: Interface/Misc/markers.rsi + state: spawner_magnum_ammo + - type: Icon + sprite: Interface/Misc/markers.rsi + state: spawner_magnum_ammo + - type: ConditionalSpawner + prototypes: + - MagazineMagnum + - MagazineMagnumSmg + chance: 0.95 + gameRules: + - RuleSuspicion + +- type: entity + name: Suspicion Launcher Ammo Spawner + id: SuspicionLauncherAmmoSpawner + parent: BaseConditionalSpawner + components: + - type: Sprite + netsync: false + visible: false + sprite: Interface/Misc/markers.rsi + state: spawner_launcher_ammo + - type: Icon + sprite: Interface/Misc/markers.rsi + state: spawner_launcher_ammo + - type: ConditionalSpawner + prototypes: + - RocketAmmo + - GrenadeFrag + chance: 0.95 + gameRules: + - RuleSuspicion diff --git a/Resources/Textures/Interface/Misc/markers.rsi/meta.json b/Resources/Textures/Interface/Misc/markers.rsi/meta.json index a1fa3f2b53..3c58904297 100644 --- a/Resources/Textures/Interface/Misc/markers.rsi/meta.json +++ b/Resources/Textures/Interface/Misc/markers.rsi/meta.json @@ -403,6 +403,24 @@ ] ] }, + { + "name": "spawner_launcher_ammo", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "spawner_magnum_ammo", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, { "name": "spawner_melee", "directions": 1, @@ -421,6 +439,15 @@ ] ] }, + { + "name": "spawner_pistol_ammo", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, { "name": "spawner_revolver", "directions": 1, @@ -439,6 +466,15 @@ ] ] }, + { + "name": "spawner_rifle_ammo", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, { "name": "spawner_shotgun", "directions": 1, @@ -448,6 +484,15 @@ ] ] }, + { + "name": "spawner_shotgun_ammo", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, { "name": "spawner_smg", "directions": 1, @@ -466,7 +511,7 @@ ] ] }, - { + { "name": "spawner_trash", "directions": 1, "delays": [ diff --git a/Resources/Textures/Interface/Misc/markers.rsi/spawner_ai.png b/Resources/Textures/Interface/Misc/markers.rsi/spawner_ai.png index c9d18bf907da994aacb7765b42b4422e7811f372..6e7304d7620a88cd5bf564669cd6db3674b554e5 100644 GIT binary patch delta 1095 zcmV-N1i1T#D%%K#Wrv>a1rE*WASB-sIZB*nuDC_vf7R{r-OU+~4oO|5JkUUw_4PnHvTH1R@SIr${wY zi9FB;Jw3bhlYm>uW8W>P>*3*H zfhmbpBe#C)kw`U0%Z;sk&AxpZ*&S%$?W73E=Fy{az5q1WV*ALU6t!2`+$(r7iQk$o z%X(dh2*}mbr+4i>*9Hd%rMtUZwjDl+z5bo;oja`-3V(CraOx_zUxIayhv(+!neNhd zS?0#6R0>=RFpKSPUV?y5;uK#{%{Od!b~4w{z`=_bQ51#gE)6vrV!BI1Q55?7`*oM9 zD)u#hWeeN}0eCC0jCj4=ud5^J@ld*;&Ij5D3uH(xMNl9^&hKlW#j;VKR|oe0==L z2mr6S?kuu$=vfYWs{s8!fB)o3?vIU8Gd2coZ3F@V5aE_%C*hqADxRt2_WWPAPQX$G zK7Ze?d`kZK;Uk$F4av}%_oThOT~t+-D~*jJAgSxuMO9T9ZfYuV6~9|D5zCfQLubAO z;MngGG}nnDt8h4M^fgT*JaLwxF8$>^_TkR!TH->oAYlHaYHcS_Rn@Rcr_;tg05CE# zLO6VOPtS0PqSWL)Z_5J%#N%WMuRrKY>cOFSMY91c4QN$6s) zvNAaVJC#hyYa>U%q3<+k>m;m;(!G^YCM4{ggv*k(1-R7}TRd+srpwx)7(9_kkVqtU z!I;hMC8mi4P0OgEXjF!xQE|K7;`jT-@AnHpuJ3lcC1+zdW*HKBIX5sMA|m%P892)NyDnVguAdzp-gh@2Z3upm(^wi2tix7XCUudmNhYRyjUe*j=HkZ+_mc)b7s N002ovPDHLkV1kBP5AOf~ literal 5382 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 Y0D4{LE&xuH8UO$Q07*qoM6N<$f>nFi2><{9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Misc/markers.rsi/spawner_shotgun_ammo.png b/Resources/Textures/Interface/Misc/markers.rsi/spawner_shotgun_ammo.png new file mode 100644 index 0000000000000000000000000000000000000000..2c341f221888cff724d484873717cf11cfa63ba1 GIT binary patch literal 469 zcmV;`0V@89P)Z-VslDB%hO~cHm46L zbeKrYsnbMiE*&No=2(P4TZ(CjwBJWb2-AyisVvm0rk01%-J>0IS=w7N;lB zxPfw>M7>irmHgW&E=X%dCIB!l!*?aiSMP(dnXHehSP7g}vgC?2N@nt2i-BcU?Q$@wI`n=zHUAeMo`af~bj%I(@T+sbi2=yOrb1K_@oC>&;D z3Ch^}mp3I=VL*6rOW8V_u6t4s&9*a-t{c+o4?8g+JZJ`{5V8w|2SVvwP9r)QLD>5s zAc2{1sdA0|r+AW8xoJ%deR{pu3jAsiA%VF!t*cmIC?600000 LNkvXXu0mjfO3==t literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Misc/markers.rsi/spawner_trash.png b/Resources/Textures/Interface/Misc/markers.rsi/spawner_trash.png index b92ba56c3d6787c907e6c6b2da408cc8075117c5..0a685dc041cc75a123b97bf270d728a93d0f68b1 100644 GIT binary patch delta 527 zcmV+q0`UEp1*Zg%BYy$zNkl6%!`2YxYUg6-S{p5~Ilr0TWGG!gN1ztTgpP-v*G{o}p2=??W2?cyTh zcSCTu!&ag!h<`;5bp>tUHCyU7&iCM>uDE)4i1Ube*j*2l1&Pp56e)`g()_}Pw`C_j zh{)$kR>1_b$ZQ{FW-Aeq^}fBgb$h>;;B)(Xh8#d-C1Obr)bzpvn5So?RiciNDC)Y+ z&pf(qPh*seNX4RE#Te4vMH?>G*N43fcWV!G;Yk%F`F~#MotPeH1p^{Vb~tD+!z|f` zh#o=D3b-IwD9gH$19%&iKAtlvZB&SYh>;i*_JPZdWly|JIv9)18+O7$2%v`*Zfrzn zHn5k-zj`3~@zcxqkDdo-iFog^{Kka$|Ck&neB{^ca>8u;3Cs!h4^Fe>y;&1L R82|tP00>D%PDHLkV1fZG`DFkA delta 639 zcmV-_0)YLe1eXPnBYyw^b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi z!vFvd!vV){sAK>D0xU^HK~z{r%~c6d=8<&L@Mo%=JVN zE64J3S2*qjamV)qSBT69*Un20x-N=W{0>4%HwbfvL4K8mcLc$w*&mC4mFEVcVBwkc zUl))w&%Dx-m_jav_vbisG6!ru+-a)|T-!JZfLMdbO9UlIDTD{%GlRn_dwwQUc-#7b zE~L!{@`45hPJaTh1X>Uv7u*!60t;?SeFcNS%FCpIr1FQImPl~SYmJ*T1A*CyZstwP2ucjv57v6f0?P)R1#(&=sDXg#M8h>TCb*x_6G<>r z`u)J}wlQ204}0Mx118QYw_ugE&NyDM&zZvp@TiQTjV#4KeShL0fJPku(`@5LX(B~S zb{)Iglz9AZP~cdQ8RIxE!v^T^`8&}5u&j+|O-B!&9r+9daVBnp1cvnePH145hSt}b z(0n_BI2P}_#bu6h$2J32f{J0Taq)B94dRw~#V}{%a9g}$n6o-OAzm@e`J{NoUvS=r ZbKeHpFo>>3@002ovPDHLkV1m^^AqfBg diff --git a/Resources/Textures/Interface/Misc/markers.rsi/spawner_xenoai.png b/Resources/Textures/Interface/Misc/markers.rsi/spawner_xenoai.png index 7b0db41b65adc0da4275491af5488b64b25924bf..4f64d33046accca6bfafa294920ee273b4af692d 100644 GIT binary patch delta 1091 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 From d55ace72e46cc6b4485e3dd51f70b2ea9c3ccf0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Aguilera=20Puerto?= Date: Sun, 16 Aug 2020 18:24:36 +0200 Subject: [PATCH 14/81] Fix duplicate prototype, increase most conditional spawners' chance of spawning --- .../Markers/gamemode_conditional_spawners.yml | 36 ++++--------------- 1 file changed, 7 insertions(+), 29 deletions(-) diff --git a/Resources/Prototypes/Entities/Effects/Markers/gamemode_conditional_spawners.yml b/Resources/Prototypes/Entities/Effects/Markers/gamemode_conditional_spawners.yml index b203903616..1fe1cb94e2 100644 --- a/Resources/Prototypes/Entities/Effects/Markers/gamemode_conditional_spawners.yml +++ b/Resources/Prototypes/Entities/Effects/Markers/gamemode_conditional_spawners.yml @@ -71,7 +71,7 @@ - PistolMolly - PistolOlivaw - PistolPaco - chance: 0.75 + chance: 0.95 gameRules: - RuleSuspicion @@ -96,7 +96,7 @@ - ToolboxEmergency - CrowbarRed - Stunbaton - chance: 0.75 + chance: 0.95 gameRules: - RuleSuspicion @@ -118,7 +118,7 @@ - RevolverDeckard - RevolverInspector - RevolverMateba - chance: 0.75 + chance: 0.95 gameRules: - RuleSuspicion @@ -144,7 +144,7 @@ - ShotgunRegulator - ShotgunPump - ShotgunSawn - chance: 0.75 + chance: 0.95 gameRules: - RuleSuspicion @@ -169,7 +169,7 @@ - SmgStraylight - SmgWt550 - SmgZoric - chance: 0.75 + chance: 0.95 gameRules: - RuleSuspicion @@ -191,7 +191,7 @@ - SniperBoltGun - SniperBoltGunWood - SniperHeavy - chance: 0.75 + chance: 0.95 gameRules: - RuleSuspicion @@ -217,7 +217,7 @@ - LaserCannon - XrayCannon - TaserGun - chance: 0.75 + chance: 0.85 gameRules: - RuleSuspicion @@ -268,28 +268,6 @@ gameRules: - RuleSuspicion -- type: entity - name: Suspicion Sniper Spawner - id: SuspicionSniperSpawner - parent: BaseConditionalSpawner - components: - - type: Sprite - netsync: false - visible: false - sprite: Interface/Misc/markers.rsi - state: spawner_sniper - - type: Icon - sprite: Interface/Misc/markers.rsi - state: spawner_sniper - - type: ConditionalSpawner - prototypes: - - SniperBoltGun - - SniperBoltGunWood - - SniperHeavy - chance: 0.75 - gameRules: - - RuleSuspicion - - type: entity name: Suspicion Rifle Ammo Spawner id: SuspicionRifleMagazineSpawner From fa49eb58953ab5053b4e440d280c111ad78ec967 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Aguilera=20Puerto?= Date: Sun, 16 Aug 2020 18:35:47 +0200 Subject: [PATCH 15/81] Adds more weapon/ammo SSS spawners to Saltern. --- Resources/Maps/saltern.yml | 318 ++++++++++++++++++++++++++++++++++++- 1 file changed, 312 insertions(+), 6 deletions(-) diff --git a/Resources/Maps/saltern.yml b/Resources/Maps/saltern.yml index e387f022c3..f3ccd2b9b1 100644 --- a/Resources/Maps/saltern.yml +++ b/Resources/Maps/saltern.yml @@ -33466,10 +33466,10 @@ entities: rot: -1.5707963267948966 rad type: Transform - uid: 2877 - type: TrashSpawner + type: SuspicionPistolMagazineSpawner components: - parent: 15 - pos: -21.5,-12.5 + pos: -35.5,0.5 rot: -1.5707963267948966 rad type: Transform - uid: 2878 @@ -37344,7 +37344,6 @@ entities: pos: -13.672081,21.719378 rot: -1.5707963267948966 rad type: Transform - - type: BatteryBarrel - anchored: False type: Collidable - containers: @@ -37371,7 +37370,6 @@ entities: pos: -14.515831,21.735003 rot: -1.5707963267948966 rad type: Transform - - type: BatteryBarrel - anchored: False type: Collidable - containers: @@ -37840,10 +37838,10 @@ entities: type: Robust.Server.GameObjects.Components.Container.Container type: ContainerContainer - uid: 3282 - type: metal_wall + type: SuspicionPistolSpawner components: - parent: 15 - pos: 13.293709,-8.309891 + pos: 8.5,-4.5 rot: -1.5707963267948966 rad type: Transform - uid: 3283 @@ -38099,4 +38097,312 @@ entities: type: Transform - anchored: False type: Collidable +- uid: 3310 + type: SuspicionShotgunMagazineSpawner + components: + - parent: 15 + pos: -6.5,-3.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3311 + type: SuspicionShotgunMagazineSpawner + components: + - parent: 15 + pos: -7.5,-3.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3312 + type: SuspicionShotgunSpawner + components: + - parent: 15 + pos: -7.5,-6.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3313 + type: SuspicionSniperSpawner + components: + - parent: 15 + pos: -8.5,-12.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3314 + type: SuspicionRifleMagazineSpawner + components: + - parent: 15 + pos: -13.5,-6.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3315 + type: SuspicionGrenadesSpawner + components: + - parent: 15 + pos: 15.5,-0.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3316 + type: SuspicionGrenadesSpawner + components: + - parent: 15 + pos: 18.5,1.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3317 + type: SuspicionHitscanSpawner + components: + - parent: 15 + pos: 25.5,0.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3318 + type: SuspicionGrenadesSpawner + components: + - parent: 15 + pos: 0.5,-15.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3319 + type: SuspicionGrenadesSpawner + components: + - parent: 15 + pos: -8.5,-17.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3320 + type: SuspicionMagnumMagazineSpawner + components: + - parent: 15 + pos: 14.5,-2.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3321 + type: SuspicionRevolverSpawner + components: + - parent: 15 + pos: 15.5,-3.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3322 + type: SuspicionMagnumMagazineSpawner + components: + - parent: 15 + pos: 16.5,7.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3323 + type: SuspicionSMGSpawner + components: + - parent: 15 + pos: -7.5,8.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3324 + type: SuspicionRifleMagazineSpawner + components: + - parent: 15 + pos: -7.5,7.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3325 + type: SuspicionShotgunSpawner + components: + - parent: 15 + pos: -29.5,-5.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3326 + type: SuspicionShotgunMagazineSpawner + components: + - parent: 15 + pos: -30.5,-4.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3327 + type: SuspicionShotgunMagazineSpawner + components: + - parent: 15 + pos: -29.5,-4.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3328 + type: SuspicionPistolMagazineSpawner + components: + - parent: 15 + pos: -3.5,0.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3329 + type: SuspicionPistolMagazineSpawner + components: + - parent: 15 + pos: -10.5,1.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3330 + type: SuspicionPistolMagazineSpawner + components: + - parent: 15 + pos: -9.5,6.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3331 + type: SuspicionPistolMagazineSpawner + components: + - parent: 15 + pos: -29.5,9.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3332 + type: SuspicionPistolMagazineSpawner + components: + - parent: 15 + pos: -31.5,13.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3333 + type: SuspicionPistolSpawner + components: + - parent: 15 + pos: -5.5,24.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3334 + type: SuspicionPistolSpawner + components: + - parent: 15 + pos: -10.5,-0.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3335 + type: SuspicionHitscanSpawner + components: + - parent: 15 + pos: -14.5,18.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3336 + type: SuspicionRevolverSpawner + components: + - parent: 15 + pos: -14.5,19.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3337 + type: SuspicionPistolSpawner + components: + - parent: 15 + pos: -13.5,18.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3338 + type: SuspicionRifleSpawner + components: + - parent: 15 + pos: -13.5,19.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3339 + type: SuspicionSMGSpawner + components: + - parent: 15 + pos: -13.5,20.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3340 + type: SuspicionShotgunSpawner + components: + - parent: 15 + pos: -12.5,20.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3341 + type: SuspicionSniperSpawner + components: + - parent: 15 + pos: -12.5,19.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3342 + type: SuspicionLaunchersSpawner + components: + - parent: 15 + pos: -12.5,18.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3343 + type: SuspicionGrenadesSpawner + components: + - parent: 15 + pos: -11.5,20.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3344 + type: SuspicionGrenadesSpawner + components: + - parent: 15 + pos: -11.5,19.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3345 + type: SuspicionGrenadesSpawner + components: + - parent: 15 + pos: -11.5,18.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3346 + type: SuspicionShotgunMagazineSpawner + components: + - parent: 15 + pos: -35.5,-7.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3347 + type: SuspicionShotgunMagazineSpawner + components: + - parent: 15 + pos: -35.5,-6.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3348 + type: SuspicionRifleMagazineSpawner + components: + - parent: 15 + pos: -35.5,-4.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3349 + type: SuspicionRifleMagazineSpawner + components: + - parent: 15 + pos: -35.5,-3.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3350 + type: SuspicionPistolMagazineSpawner + components: + - parent: 15 + pos: -35.5,-0.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3351 + type: SuspicionShotgunMagazineSpawner + components: + - parent: 15 + pos: -23.5,-13.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3352 + type: SuspicionShotgunSpawner + components: + - parent: 15 + pos: -15.5,-14.5 + rot: -1.5707963267948966 rad + type: Transform +- uid: 3353 + type: SuspicionHitscanSpawner + components: + - parent: 15 + pos: -15.5,-11.5 + rot: -1.5707963267948966 rad + type: Transform ... From 772eb2c966afee091826adf6fa3ec354081eaa6f Mon Sep 17 00:00:00 2001 From: DrSmugleaf Date: Sun, 16 Aug 2020 18:41:16 +0200 Subject: [PATCH 16/81] Fix SSS role being repeated in the examine tooltip (#1714) --- .../Suspicion/SuspicionRoleComponent.cs | 42 +++++++++++++++++++ .../GamePresets/PresetSuspicion.cs | 5 ++- .../GameTicking/GameRules/RuleSuspicion.cs | 24 +---------- 3 files changed, 48 insertions(+), 23 deletions(-) create mode 100644 Content.Server/GameObjects/Components/Suspicion/SuspicionRoleComponent.cs diff --git a/Content.Server/GameObjects/Components/Suspicion/SuspicionRoleComponent.cs b/Content.Server/GameObjects/Components/Suspicion/SuspicionRoleComponent.cs new file mode 100644 index 0000000000..833169a223 --- /dev/null +++ b/Content.Server/GameObjects/Components/Suspicion/SuspicionRoleComponent.cs @@ -0,0 +1,42 @@ +using Content.Server.GameObjects.Components.Mobs; +using Content.Server.Mobs.Roles; +using Content.Shared.GameObjects.EntitySystems; +using Robust.Shared.GameObjects; +using Robust.Shared.Localization; +using Robust.Shared.Utility; + +namespace Content.Server.GameObjects.Components.Suspicion +{ + [RegisterComponent] + public class SuspicionRoleComponent : Component, IExamine + { + public override string Name => "SuspicionRole"; + + public bool IsDead() + { + return Owner.TryGetComponent(out SpeciesComponent species) && + species.CurrentDamageState is DeadState; + } + + public bool IsTraitor() + { + return Owner.TryGetComponent(out MindComponent mind) && + mind.HasMind && + mind.Mind!.HasRole(); + } + + void IExamine.Examine(FormattedMessage message, bool inDetailsRange) + { + if (!IsDead()) + { + return; + } + + var tooltip = IsTraitor() + ? Loc.GetString($"They were a [color=red]traitor[/color]!") + : Loc.GetString($"They were an [color=green]innocent[/color]!"); + + message.AddMarkup(tooltip); + } + } +} diff --git a/Content.Server/GameTicking/GamePresets/PresetSuspicion.cs b/Content.Server/GameTicking/GamePresets/PresetSuspicion.cs index bd2f43a13d..1f6e0437ca 100644 --- a/Content.Server/GameTicking/GamePresets/PresetSuspicion.cs +++ b/Content.Server/GameTicking/GamePresets/PresetSuspicion.cs @@ -10,11 +10,12 @@ using Robust.Shared.Prototypes; using Robust.Shared.Random; using System.Collections.Generic; using System.Linq; +using Content.Server.GameObjects.Components.Suspicion; using Content.Shared.Roles; +using Robust.Shared.GameObjects; using Robust.Shared.Log; using Robust.Shared.Maths; - namespace Content.Server.GameTicking.GamePresets { public class PresetSuspicion : GamePreset @@ -54,6 +55,8 @@ namespace Content.Server.GameTicking.GamePresets { prefList.Add(player); } + + player.AttachedEntity?.EnsureComponent(); } var numTraitors = FloatMath.Clamp(readyPlayers.Count % PlayersPerTraitor, diff --git a/Content.Server/GameTicking/GameRules/RuleSuspicion.cs b/Content.Server/GameTicking/GameRules/RuleSuspicion.cs index 34ddc50f78..a3d830412e 100644 --- a/Content.Server/GameTicking/GameRules/RuleSuspicion.cs +++ b/Content.Server/GameTicking/GameRules/RuleSuspicion.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading; using Content.Server.GameObjects.Components.Mobs; using Content.Server.Interfaces.Chat; @@ -7,7 +7,6 @@ using Content.Server.Mobs.Roles; using Content.Server.Players; using Robust.Server.Interfaces.Player; using Robust.Shared.GameObjects; -using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.IoC; using Timer = Robust.Shared.Timers.Timer; @@ -24,7 +23,6 @@ namespace Content.Server.GameTicking.GameRules #pragma warning disable 649 [Dependency] private readonly IPlayerManager _playerManager; [Dependency] private readonly IChatManager _chatManager; - [Dependency] private readonly IEntityManager _entityManager; [Dependency] private readonly IGameTicker _gameTicker; #pragma warning restore 649 @@ -32,28 +30,9 @@ namespace Content.Server.GameTicking.GameRules public override void Added() { - _entityManager.EventBus.SubscribeEvent(EventSource.Local, this, _onMobDamageStateChanged); - Timer.SpawnRepeating(DeadCheckDelay, _checkWinConditions, _checkTimerCancel.Token); } - private void _onMobDamageStateChanged(MobDamageStateChangedMessage message) - { - var owner = message.Species.Owner; - - if (!(message.Species.CurrentDamageState is DeadState)) - return; - - if (!owner.TryGetComponent(out var mind)) - return; - - if (!mind.HasMind) - return; - - message.Species.Owner.Description += - mind.Mind.HasRole() ? "\nThey were a traitor!" : "\nThey were an innocent!"; - } - public override void Removed() { base.Removed(); @@ -78,6 +57,7 @@ namespace Content.Server.GameTicking.GameRules { continue; } + if (playerSession.ContentData().Mind.HasRole()) traitorsAlive++; else From dbeb89a5e54ed58bfb36fd50c0f032819709033e Mon Sep 17 00:00:00 2001 From: DrSmugleaf Date: Sun, 16 Aug 2020 18:51:21 +0200 Subject: [PATCH 17/81] Fix pulling not stopping when going into a container (#1712) --- .../Components/GUI/HandsComponent.cs | 55 ++++++++++--------- .../EntitySystems/Click/InteractionSystem.cs | 1 + Content.Server/GlobalVerbs/PullingVerb.cs | 1 + .../Components/Items/SharedHandsComponent.cs | 24 +++++++- .../EntitySystems/SharedMoverSystem.cs | 1 + .../Physics/{ => Pull}/PullController.cs | 54 ++++++++++++++++-- Content.Shared/Physics/Pull/PullMessage.cs | 19 +++++++ .../Physics/Pull/PullStartedMessage.cs | 12 ++++ .../Physics/Pull/PullStoppedMessage.cs | 12 ++++ 9 files changed, 146 insertions(+), 33 deletions(-) rename Content.Shared/Physics/{ => Pull}/PullController.cs (68%) create mode 100644 Content.Shared/Physics/Pull/PullMessage.cs create mode 100644 Content.Shared/Physics/Pull/PullStartedMessage.cs create mode 100644 Content.Shared/Physics/Pull/PullStoppedMessage.cs diff --git a/Content.Server/GameObjects/Components/GUI/HandsComponent.cs b/Content.Server/GameObjects/Components/GUI/HandsComponent.cs index f5403a6928..a7c0c49289 100644 --- a/Content.Server/GameObjects/Components/GUI/HandsComponent.cs +++ b/Content.Server/GameObjects/Components/GUI/HandsComponent.cs @@ -13,7 +13,7 @@ using Content.Shared.GameObjects.Components.Items; using Content.Shared.GameObjects.Components.Mobs; using Content.Shared.GameObjects.EntitySystems; using Content.Shared.Health.BodySystem; -using Content.Shared.Physics; +using Content.Shared.Physics.Pull; using Robust.Server.GameObjects; using Robust.Server.GameObjects.Components.Container; using Robust.Server.GameObjects.EntitySystemMessages; @@ -547,15 +547,9 @@ namespace Content.Server.GameObjects.Components.GUI return; } - var isOwnerContained = ContainerHelpers.TryGetContainer(Owner, out var ownerContainer); - var isPullableContained = ContainerHelpers.TryGetContainer(pullable.Owner, out var pullableContainer); - - if (isOwnerContained || isPullableContained) + if (!Owner.IsInSameOrNoContainer(pullable.Owner)) { - if (ownerContainer != pullableContainer) - { - return; - } + return; } if (IsPulling) @@ -564,10 +558,8 @@ namespace Content.Server.GameObjects.Components.GUI } PulledObject = pullable.Owner.GetComponent(); - var controller = PulledObject!.EnsureController(); - controller!.StartPull(Owner.GetComponent()); - - AddPullingStatuses(); + var controller = PulledObject.EnsureController(); + controller.StartPull(Owner.GetComponent()); } public void MovePulledObject(GridCoordinates puller, GridCoordinates to) @@ -579,6 +571,27 @@ namespace Content.Server.GameObjects.Components.GUI } } + public override void HandleMessage(ComponentMessage message, IComponent? component) + { + base.HandleMessage(message, component); + + if (!(message is PullMessage pullMessage) || + pullMessage.Puller.Owner != Owner) + { + return; + } + + switch (message) + { + case PullStartedMessage msg: + AddPullingStatuses(msg.Pulled.Owner); + break; + case PullStoppedMessage msg: + RemovePullingStatuses(msg.Pulled.Owner); + break; + } + } + public override void HandleNetworkMessage(ComponentMessage message, INetChannel channel, ICommonSession? session = null) { base.HandleNetworkMessage(message, channel, session); @@ -689,10 +702,9 @@ namespace Content.Server.GameObjects.Components.GUI } } - private void AddPullingStatuses() + private void AddPullingStatuses(IEntity pulled) { - if (PulledObject?.Owner != null && - PulledObject.Owner.TryGetComponent(out ServerStatusEffectsComponent pulledStatus)) + if (pulled.TryGetComponent(out ServerStatusEffectsComponent pulledStatus)) { pulledStatus.ChangeStatusEffectIcon(StatusEffect.Pulled, "/Textures/Interface/StatusEffects/Pull/pulled.png"); @@ -705,10 +717,9 @@ namespace Content.Server.GameObjects.Components.GUI } } - private void RemovePullingStatuses() + private void RemovePullingStatuses(IEntity pulled) { - if (PulledObject?.Owner != null && - PulledObject.Owner.TryGetComponent(out ServerStatusEffectsComponent pulledStatus)) + if (pulled.TryGetComponent(out ServerStatusEffectsComponent pulledStatus)) { pulledStatus.RemoveStatusEffect(StatusEffect.Pulled); } @@ -719,12 +730,6 @@ namespace Content.Server.GameObjects.Components.GUI } } - public override void StopPull() - { - RemovePullingStatuses(); - base.StopPull(); - } - void IBodyPartAdded.BodyPartAdded(BodyPartAddedEventArgs eventArgs) { if (eventArgs.Part.PartType != BodyPartType.Hand) diff --git a/Content.Server/GameObjects/EntitySystems/Click/InteractionSystem.cs b/Content.Server/GameObjects/EntitySystems/Click/InteractionSystem.cs index 478f0123d2..41640a0fac 100644 --- a/Content.Server/GameObjects/EntitySystems/Click/InteractionSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/Click/InteractionSystem.cs @@ -12,6 +12,7 @@ using Content.Shared.GameObjects.EntitySystems; using Content.Shared.Input; using Content.Shared.Interfaces.GameObjects.Components; using Content.Shared.Physics; +using Content.Shared.Physics.Pull; using JetBrains.Annotations; using Robust.Server.GameObjects; using Robust.Server.Interfaces.Player; diff --git a/Content.Server/GlobalVerbs/PullingVerb.cs b/Content.Server/GlobalVerbs/PullingVerb.cs index 0b864eb075..6213d443a5 100644 --- a/Content.Server/GlobalVerbs/PullingVerb.cs +++ b/Content.Server/GlobalVerbs/PullingVerb.cs @@ -4,6 +4,7 @@ using Content.Shared.GameObjects.Components.Items; using Content.Shared.GameObjects.EntitySystems; using Content.Shared.GameObjects.Verbs; using Content.Shared.Physics; +using Content.Shared.Physics.Pull; using Robust.Server.Interfaces.GameObjects; using Robust.Shared.GameObjects.Components; using Robust.Shared.Interfaces.GameObjects; diff --git a/Content.Shared/GameObjects/Components/Items/SharedHandsComponent.cs b/Content.Shared/GameObjects/Components/Items/SharedHandsComponent.cs index 47a15e5f10..02919bcf8e 100644 --- a/Content.Shared/GameObjects/Components/Items/SharedHandsComponent.cs +++ b/Content.Shared/GameObjects/Components/Items/SharedHandsComponent.cs @@ -1,8 +1,9 @@ #nullable enable using System; -using Content.Shared.Physics; +using Content.Shared.Physics.Pull; using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Components; +using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Serialization; using Robust.Shared.ViewVariables; @@ -26,8 +27,27 @@ namespace Content.Shared.GameObjects.Components.Items { controller.StopPull(); } + } - PulledObject = null; + public override void HandleMessage(ComponentMessage message, IComponent? component) + { + base.HandleMessage(message, component); + + if (!(message is PullMessage pullMessage) || + pullMessage.Puller.Owner != Owner) + { + return; + } + + switch (message) + { + case PullStartedMessage msg: + PulledObject = msg.Pulled; + break; + case PullStoppedMessage _: + PulledObject = null; + break; + } } } diff --git a/Content.Shared/GameObjects/EntitySystems/SharedMoverSystem.cs b/Content.Shared/GameObjects/EntitySystems/SharedMoverSystem.cs index 7c9a4537a2..49f77ad735 100644 --- a/Content.Shared/GameObjects/EntitySystems/SharedMoverSystem.cs +++ b/Content.Shared/GameObjects/EntitySystems/SharedMoverSystem.cs @@ -3,6 +3,7 @@ using System.Diagnostics.CodeAnalysis; using Content.Shared.GameObjects.Components.Items; using Content.Shared.GameObjects.Components.Movement; using Content.Shared.Physics; +using Content.Shared.Physics.Pull; using Robust.Shared.Configuration; using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Components; diff --git a/Content.Shared/Physics/PullController.cs b/Content.Shared/Physics/Pull/PullController.cs similarity index 68% rename from Content.Shared/Physics/PullController.cs rename to Content.Shared/Physics/Pull/PullController.cs index c0ea728571..02b199a345 100644 --- a/Content.Shared/Physics/PullController.cs +++ b/Content.Shared/Physics/Pull/PullController.cs @@ -1,15 +1,16 @@ #nullable enable using System; -using Content.Shared.GameObjects.Components.Items; using Content.Shared.GameObjects.EntitySystems; +using Robust.Shared.Containers; using Robust.Shared.GameObjects.Components; using Robust.Shared.Interfaces.Map; using Robust.Shared.IoC; using Robust.Shared.Map; using Robust.Shared.Maths; using Robust.Shared.Physics; +using Robust.Shared.Utility; -namespace Content.Shared.Physics +namespace Content.Shared.Physics.Pull { public class PullController : VirtualController { @@ -25,15 +26,50 @@ namespace Content.Shared.Physics public ICollidableComponent? Puller => _puller; - public void StartPull(ICollidableComponent? pull) + public void StartPull(ICollidableComponent puller) { - _puller = pull; + DebugTools.AssertNotNull(puller); + + if (_puller == puller) + { + return; + } + + _puller = puller; + + if (ControlledComponent == null) + { + return; + } + + var message = new PullStartedMessage(this, _puller, ControlledComponent); + + _puller.Owner.SendMessage(null, message); + ControlledComponent.Owner.SendMessage(null, message); } public void StopPull() { + var oldPuller = _puller; + + if (oldPuller == null) + { + return; + } + _puller = null; - ControlledComponent?.TryRemoveController(); + + if (ControlledComponent == null) + { + return; + } + + var message = new PullStoppedMessage(this, oldPuller, ControlledComponent); + + oldPuller.Owner.SendMessage(null, message); + ControlledComponent.Owner.SendMessage(null, message); + + ControlledComponent.TryRemoveController(); } public void TryMoveTo(GridCoordinates from, GridCoordinates to) @@ -68,12 +104,18 @@ namespace Content.Shared.Physics return; } + if (!_puller.Owner.IsInSameOrNoContainer(ControlledComponent.Owner)) + { + StopPull(); + return; + } + // Are we outside of pulling range? var dist = _puller.Owner.Transform.WorldPosition - ControlledComponent.Owner.Transform.WorldPosition; if (dist.Length > DistBeforeStopPull) { - _puller.Owner.GetComponent().StopPull(); + StopPull(); } else if (_movingTo.HasValue) { diff --git a/Content.Shared/Physics/Pull/PullMessage.cs b/Content.Shared/Physics/Pull/PullMessage.cs new file mode 100644 index 0000000000..811eae404e --- /dev/null +++ b/Content.Shared/Physics/Pull/PullMessage.cs @@ -0,0 +1,19 @@ +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Components; + +namespace Content.Shared.Physics.Pull +{ + public class PullMessage : ComponentMessage + { + public readonly PullController Controller; + public readonly ICollidableComponent Puller; + public readonly ICollidableComponent Pulled; + + protected PullMessage(PullController controller, ICollidableComponent puller, ICollidableComponent pulled) + { + Controller = controller; + Puller = puller; + Pulled = pulled; + } + } +} diff --git a/Content.Shared/Physics/Pull/PullStartedMessage.cs b/Content.Shared/Physics/Pull/PullStartedMessage.cs new file mode 100644 index 0000000000..263c0b8db1 --- /dev/null +++ b/Content.Shared/Physics/Pull/PullStartedMessage.cs @@ -0,0 +1,12 @@ +using Robust.Shared.GameObjects.Components; + +namespace Content.Shared.Physics.Pull +{ + public class PullStartedMessage : PullMessage + { + public PullStartedMessage(PullController controller, ICollidableComponent puller, ICollidableComponent pulled) : + base(controller, puller, pulled) + { + } + } +} diff --git a/Content.Shared/Physics/Pull/PullStoppedMessage.cs b/Content.Shared/Physics/Pull/PullStoppedMessage.cs new file mode 100644 index 0000000000..c018558341 --- /dev/null +++ b/Content.Shared/Physics/Pull/PullStoppedMessage.cs @@ -0,0 +1,12 @@ +using Robust.Shared.GameObjects.Components; + +namespace Content.Shared.Physics.Pull +{ + public class PullStoppedMessage : PullMessage + { + public PullStoppedMessage(PullController controller, ICollidableComponent puller, ICollidableComponent pulled) : + base(controller, puller, pulled) + { + } + } +} From 4ef8bc962e3f34ee3d4a49f445d4aa81e9bee960 Mon Sep 17 00:00:00 2001 From: Exp Date: Sun, 16 Aug 2020 19:31:59 +0200 Subject: [PATCH 18/81] Fix RoundEndMsg being retarded and writing 0 as length (#1721) --- Content.Shared/SharedGameTicker.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/SharedGameTicker.cs b/Content.Shared/SharedGameTicker.cs index cd16b79191..5952c35f3e 100644 --- a/Content.Shared/SharedGameTicker.cs +++ b/Content.Shared/SharedGameTicker.cs @@ -214,7 +214,7 @@ namespace Content.Shared buffer.Write(RoundDuration.Seconds); - buffer.Write(PlayerCount); + buffer.Write(AllPlayersEndInfo.Count); foreach(var playerEndInfo in AllPlayersEndInfo) { buffer.Write(playerEndInfo.PlayerOOCName); From ac9d40b606dabcd48a0477d348cb6f45a10d4809 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Aguilera=20Puerto?= Date: Sun, 16 Aug 2020 19:35:50 +0200 Subject: [PATCH 19/81] Fix suspicion crash on forcing 0 players readied --- Content.Server/GameTicking/GamePresets/PresetSuspicion.cs | 6 ++++++ Content.Shared/SharedGameTicker.cs | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/Content.Server/GameTicking/GamePresets/PresetSuspicion.cs b/Content.Server/GameTicking/GamePresets/PresetSuspicion.cs index 1f6e0437ca..fc09cc14a3 100644 --- a/Content.Server/GameTicking/GamePresets/PresetSuspicion.cs +++ b/Content.Server/GameTicking/GamePresets/PresetSuspicion.cs @@ -41,6 +41,12 @@ namespace Content.Server.GameTicking.GamePresets return false; } + if (readyPlayers.Count == 0) + { + _chatManager.DispatchServerAnnouncement($"No players readied up! Can't start Suspicion."); + return false; + } + var list = new List(readyPlayers); var prefList = new List(); diff --git a/Content.Shared/SharedGameTicker.cs b/Content.Shared/SharedGameTicker.cs index 5952c35f3e..846598dfbf 100644 --- a/Content.Shared/SharedGameTicker.cs +++ b/Content.Shared/SharedGameTicker.cs @@ -176,7 +176,7 @@ namespace Content.Shared public TimeSpan RoundDuration; - public uint PlayerCount; + public int PlayerCount; public List AllPlayersEndInfo; @@ -189,9 +189,9 @@ namespace Content.Shared var seconds = buffer.ReadInt32(); RoundDuration = new TimeSpan(hours, mins, seconds); - PlayerCount = buffer.ReadUInt32(); + PlayerCount = buffer.ReadInt32(); AllPlayersEndInfo = new List(); - for(var i = 0; i < PlayerCount + 1; i++) + for(var i = 0; i < PlayerCount; i++) { var readPlayerData = new RoundEndPlayerInfo { From 3293dc44599b1da75d6e41b414870aafd6b18d84 Mon Sep 17 00:00:00 2001 From: Exp Date: Sun, 16 Aug 2020 20:54:33 +0200 Subject: [PATCH 20/81] -Move pointing to common (#1718) -Remove some duplicate keyfunctions --- Content.Client/Input/ContentContexts.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Content.Client/Input/ContentContexts.cs b/Content.Client/Input/ContentContexts.cs index 1250627a4f..89ddd64268 100644 --- a/Content.Client/Input/ContentContexts.cs +++ b/Content.Client/Input/ContentContexts.cs @@ -19,6 +19,7 @@ namespace Content.Client.Input common.AddFunction(ContentKeyFunctions.OpenTutorial); common.AddFunction(ContentKeyFunctions.TakeScreenshot); common.AddFunction(ContentKeyFunctions.TakeScreenshotNoUI); + common.AddFunction(ContentKeyFunctions.Point); var human = contexts.GetContext("human"); human.AddFunction(ContentKeyFunctions.SwapHands); @@ -37,9 +38,6 @@ namespace Content.Client.Input human.AddFunction(ContentKeyFunctions.MouseMiddle); human.AddFunction(ContentKeyFunctions.ToggleCombatMode); human.AddFunction(ContentKeyFunctions.WideAttack); - human.AddFunction(ContentKeyFunctions.Point); - human.AddFunction(ContentKeyFunctions.TryPullObject); - human.AddFunction(ContentKeyFunctions.MovePulledObject); var ghost = contexts.New("ghost", "common"); ghost.AddFunction(EngineKeyFunctions.MoveUp); From 9fb6afd08bca4e0992918aef3ff6d418a9522916 Mon Sep 17 00:00:00 2001 From: DrSmugleaf Date: Sun, 16 Aug 2020 21:08:05 +0200 Subject: [PATCH 21/81] Fix pulled physics objects not being woken up when the puller moves (#1720) --- .../Components/GUI/HandsComponent.cs | 20 +++++++++++++++++++ Content.Shared/Physics/Pull/PullController.cs | 6 ++++++ 2 files changed, 26 insertions(+) diff --git a/Content.Server/GameObjects/Components/GUI/HandsComponent.cs b/Content.Server/GameObjects/Components/GUI/HandsComponent.cs index a7c0c49289..6336845970 100644 --- a/Content.Server/GameObjects/Components/GUI/HandsComponent.cs +++ b/Content.Server/GameObjects/Components/GUI/HandsComponent.cs @@ -20,6 +20,7 @@ using Robust.Server.GameObjects.EntitySystemMessages; using Robust.Shared.Containers; using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Components; +using Robust.Shared.GameObjects.Components.Transform; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.Network; using Robust.Shared.IoC; @@ -571,6 +572,21 @@ namespace Content.Server.GameObjects.Components.GUI } } + private void MoveEvent(MoveEvent moveEvent) + { + if (moveEvent.Sender != Owner) + { + return; + } + + if (!IsPulling) + { + return; + } + + PulledObject!.WakeBody(); + } + public override void HandleMessage(ComponentMessage message, IComponent? component) { base.HandleMessage(message, component); @@ -584,9 +600,13 @@ namespace Content.Server.GameObjects.Components.GUI switch (message) { case PullStartedMessage msg: + Owner.EntityManager.EventBus.SubscribeEvent(EventSource.Local, this, MoveEvent); + AddPullingStatuses(msg.Pulled.Owner); break; case PullStoppedMessage msg: + Owner.EntityManager.EventBus.UnsubscribeEvent(EventSource.Local, this); + RemovePullingStatuses(msg.Pulled.Owner); break; } diff --git a/Content.Shared/Physics/Pull/PullController.cs b/Content.Shared/Physics/Pull/PullController.cs index 02b199a345..8bb76473be 100644 --- a/Content.Shared/Physics/Pull/PullController.cs +++ b/Content.Shared/Physics/Pull/PullController.cs @@ -42,6 +42,8 @@ namespace Content.Shared.Physics.Pull return; } + ControlledComponent.WakeBody(); + var message = new PullStartedMessage(this, _puller, ControlledComponent); _puller.Owner.SendMessage(null, message); @@ -64,6 +66,8 @@ namespace Content.Shared.Physics.Pull return; } + ControlledComponent.WakeBody(); + var message = new PullStoppedMessage(this, oldPuller, ControlledComponent); oldPuller.Owner.SendMessage(null, message); @@ -86,6 +90,8 @@ namespace Content.Shared.Physics.Pull return; } + ControlledComponent.WakeBody(); + var dist = _puller.Owner.Transform.GridPosition.Position - to.Position; if (Math.Sqrt(dist.LengthSquared) > DistBeforeStopPull || From da23890eabbddc8a1888d377c72f401b1157f778 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Aguilera=20Puerto?= Date: Sun, 16 Aug 2020 21:09:14 +0200 Subject: [PATCH 22/81] Update submodule --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index 1934428c95..688ec89d43 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 1934428c95d44210cfc9c155c7d15405d4a374c4 +Subproject commit 688ec89d43b707a9f6c26c2ac348ee019d9a33e6 From 9dc884fa4650a3277ef13cc71805289c21c89922 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Sun, 16 Aug 2020 23:36:21 +0200 Subject: [PATCH 23/81] Update submodule. --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index 688ec89d43..c72ea7194e 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 688ec89d43b707a9f6c26c2ac348ee019d9a33e6 +Subproject commit c72ea7194e08bba42371a06e353bcd79f5a7c7cc From d04ad6ec85ad924e07204d2e87f53d8f5b2ee2a1 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Sun, 16 Aug 2020 23:36:50 +0200 Subject: [PATCH 24/81] Request window attention when round starts/restarts. --- .../GameTicking/ClientGameTicker.cs | 6 +++++ Content.Server/GameTicking/GameTicker.cs | 14 ++++++++++ Content.Server/Players/PlayerSessionExt.cs | 14 ++++++++++ .../NetMessages/MsgRequestWindowAttention.cs | 27 +++++++++++++++++++ Content.Shared/SharedGameTicker.cs | 1 + 5 files changed, 62 insertions(+) create mode 100644 Content.Server/Players/PlayerSessionExt.cs create mode 100644 Content.Shared/Network/NetMessages/MsgRequestWindowAttention.cs diff --git a/Content.Client/GameTicking/ClientGameTicker.cs b/Content.Client/GameTicking/ClientGameTicker.cs index a80f606215..cab0608a93 100644 --- a/Content.Client/GameTicking/ClientGameTicker.cs +++ b/Content.Client/GameTicking/ClientGameTicker.cs @@ -3,6 +3,8 @@ using Content.Client.Interfaces; using Content.Client.State; using Content.Client.UserInterface; using Content.Shared; +using Content.Shared.Network.NetMessages; +using Robust.Client.Interfaces.Graphics; using Robust.Client.Interfaces.State; using Robust.Shared.Interfaces.Network; using Robust.Shared.IoC; @@ -39,6 +41,10 @@ namespace Content.Client.GameTicking _netManager.RegisterNetMessage(nameof(MsgTickerLobbyInfo), LobbyInfo); _netManager.RegisterNetMessage(nameof(MsgTickerLobbyCountdown), LobbyCountdown); _netManager.RegisterNetMessage(nameof(MsgRoundEndMessage), RoundEnd); + _netManager.RegisterNetMessage(nameof(MsgRequestWindowAttention), msg => + { + IoCManager.Resolve().RequestWindowAttention(); + }); _initialized = true; } diff --git a/Content.Server/GameTicking/GameTicker.cs b/Content.Server/GameTicking/GameTicker.cs index bef68e027d..006740fc38 100644 --- a/Content.Server/GameTicking/GameTicker.cs +++ b/Content.Server/GameTicking/GameTicker.cs @@ -24,6 +24,7 @@ using Content.Server.Players; using Content.Shared; using Content.Shared.Chat; using Content.Shared.GameObjects.Components.PDA; +using Content.Shared.Network.NetMessages; using Content.Shared.Preferences; using Content.Shared.Roles; using Prometheus; @@ -137,6 +138,7 @@ namespace Content.Server.GameTicking _netManager.RegisterNetMessage(nameof(MsgTickerLobbyInfo)); _netManager.RegisterNetMessage(nameof(MsgTickerLobbyCountdown)); _netManager.RegisterNetMessage(nameof(MsgRoundEndMessage)); + _netManager.RegisterNetMessage(nameof(MsgRequestWindowAttention)); SetStartPreset(_configurationManager.GetCVar("game.defaultpreset")); @@ -206,6 +208,16 @@ namespace Content.Server.GameTicking _roundStartTimeUtc = DateTime.UtcNow + LobbyDuration; _sendStatusToAll(); + + ReqWindowAttentionAll(); + } + } + + private void ReqWindowAttentionAll() + { + foreach (var player in _playerManager.GetAllPlayers()) + { + player.RequestWindowAttention(); } } @@ -284,6 +296,7 @@ namespace Content.Server.GameTicking _roundStartTimeSpan = IoCManager.Resolve().RealTime; _sendStatusToAll(); + ReqWindowAttentionAll(); } private void SendServerMessage(string message) @@ -621,6 +634,7 @@ namespace Content.Server.GameTicking _playerJoinLobby(player); } + EntitySystem.Get().ResettingCleanup(); EntitySystem.Get().ResettingCleanup(); EntitySystem.Get().ResettingCleanup(); EntitySystem.Get().ResetLayouts(); diff --git a/Content.Server/Players/PlayerSessionExt.cs b/Content.Server/Players/PlayerSessionExt.cs new file mode 100644 index 0000000000..3b06788869 --- /dev/null +++ b/Content.Server/Players/PlayerSessionExt.cs @@ -0,0 +1,14 @@ +using Content.Shared.Network.NetMessages; +using Robust.Server.Interfaces.Player; + +namespace Content.Server.Players +{ + public static class PlayerSessionExt + { + public static void RequestWindowAttention(this IPlayerSession session) + { + var msg = session.ConnectedClient.CreateNetMessage(); + session.ConnectedClient.SendMessage(msg); + } + } +} diff --git a/Content.Shared/Network/NetMessages/MsgRequestWindowAttention.cs b/Content.Shared/Network/NetMessages/MsgRequestWindowAttention.cs new file mode 100644 index 0000000000..e14ca862e5 --- /dev/null +++ b/Content.Shared/Network/NetMessages/MsgRequestWindowAttention.cs @@ -0,0 +1,27 @@ +using Lidgren.Network; +using Robust.Shared.Interfaces.Network; +using Robust.Shared.Network; + +namespace Content.Shared.Network.NetMessages +{ + public sealed class MsgRequestWindowAttention : NetMessage + { + #region REQUIRED + + public const MsgGroups GROUP = MsgGroups.Command; + public const string NAME = nameof(MsgRequestWindowAttention); + public MsgRequestWindowAttention(INetChannel channel) : base(NAME, GROUP) { } + + #endregion + + public override void ReadFromBuffer(NetIncomingMessage buffer) + { + // Nothing + } + + public override void WriteToBuffer(NetOutgoingMessage buffer) + { + // Nothing + } + } +} diff --git a/Content.Shared/SharedGameTicker.cs b/Content.Shared/SharedGameTicker.cs index 846598dfbf..669a6acb93 100644 --- a/Content.Shared/SharedGameTicker.cs +++ b/Content.Shared/SharedGameTicker.cs @@ -152,6 +152,7 @@ namespace Content.Shared } } + public struct RoundEndPlayerInfo { public string PlayerOOCName; From 0ea8844491d508cad6e2113594ad9309dc8717e5 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Sun, 16 Aug 2020 23:40:52 +0200 Subject: [PATCH 25/81] I blame rider for this. --- Content.Server/GameTicking/GameTicker.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Content.Server/GameTicking/GameTicker.cs b/Content.Server/GameTicking/GameTicker.cs index 006740fc38..42bd24d44c 100644 --- a/Content.Server/GameTicking/GameTicker.cs +++ b/Content.Server/GameTicking/GameTicker.cs @@ -634,7 +634,6 @@ namespace Content.Server.GameTicking _playerJoinLobby(player); } - EntitySystem.Get().ResettingCleanup(); EntitySystem.Get().ResettingCleanup(); EntitySystem.Get().ResettingCleanup(); EntitySystem.Get().ResetLayouts(); From 12d94f28a1568f1f407773c8e66e28378415909c Mon Sep 17 00:00:00 2001 From: DrSmugleaf Date: Sun, 16 Aug 2020 23:47:33 +0200 Subject: [PATCH 26/81] Fix duplicate OOC console message (#1724) --- Content.Client/Chat/ChatManager.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Content.Client/Chat/ChatManager.cs b/Content.Client/Chat/ChatManager.cs index 1cf96367a6..21be7769ae 100644 --- a/Content.Client/Chat/ChatManager.cs +++ b/Content.Client/Chat/ChatManager.cs @@ -323,8 +323,6 @@ namespace Content.Client.Chat private void _onChatMessage(MsgChatMessage msg) { - Logger.Debug($"{msg.Channel}: {msg.Message}"); - // Log all incoming chat to repopulate when filter is un-toggled var storedMessage = new StoredChatMessage(msg); filteredHistory.Add(storedMessage); From 58b9ac10c251acfbe7fff948c36696adbd77e964 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Sun, 16 Aug 2020 23:49:20 +0200 Subject: [PATCH 27/81] Fix right-click verbs. --- .../GameObjects/EntitySystems/VerbSystem.cs | 13 +++++++++++-- Content.Shared/GameObjects/Verbs/Verb.cs | 1 + 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Content.Server/GameObjects/EntitySystems/VerbSystem.cs b/Content.Server/GameObjects/EntitySystems/VerbSystem.cs index 6de086226a..761681b1ac 100644 --- a/Content.Server/GameObjects/EntitySystems/VerbSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/VerbSystem.cs @@ -113,8 +113,17 @@ namespace Content.Server.GameObjects.EntitySystems if (verb.RequireInteractionRange && !VerbUtility.InVerbUseRange(userEntity, entity)) continue; - if (verb.BlockedByContainers && !userEntity.IsInSameOrNoContainer(entity)) - continue; + if (verb.BlockedByContainers) + { + if (!userEntity.IsInSameOrNoContainer(entity)) + { + if (!ContainerHelpers.TryGetContainer(entity, out var container) || + container.Owner != userEntity) + { + continue; + } + } + } var verbData = verb.GetData(userEntity, component); if (verbData.IsInvisible) diff --git a/Content.Shared/GameObjects/Verbs/Verb.cs b/Content.Shared/GameObjects/Verbs/Verb.cs index 99cf50b24d..723f90f1f3 100644 --- a/Content.Shared/GameObjects/Verbs/Verb.cs +++ b/Content.Shared/GameObjects/Verbs/Verb.cs @@ -23,6 +23,7 @@ namespace Content.Shared.GameObjects.Verbs /// /// If true, this verb requires both the user and the entity on which /// this verb resides to be in the same container or no container. + /// OR the user can be the entity's container /// public virtual bool BlockedByContainers => true; From 0f7e62d4142893404b725a4a21a06260cbde60bb Mon Sep 17 00:00:00 2001 From: Swept Date: Sun, 16 Aug 2020 16:20:36 -0700 Subject: [PATCH 28/81] More Mobs | Space Carp, Monkey, Gorilla etc. (#1502) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Space Carp (Can't move in Space) * Carps! * Monky and Gorilla * Fixes * Chickens I guess * rsis updated * Buncha Sprites m8 * Hopefully that pr'll get merged * Fixed * Added a shitton of stuff * Refined hitboxes and added new corgi * Broken for now * Fixes conflicts * Moves Xeno back * ok NOW it fixes it Co-authored-by: Víctor Aguilera Puerto --- Resources/Audio/Effects/chungus.ogg | Bin 0 -> 678300 bytes .../Prototypes/Entities/Mobs/NPCs/animals.yml | 588 ++++++++++++++++++ .../Prototypes/Entities/Mobs/NPCs/carp.yml | 110 ++++ .../Prototypes/Entities/Mobs/NPCs/pets.yml | 212 +++++++ .../Prototypes/Entities/Mobs/NPCs/xeno.yml | 4 +- .../Mobs/Back/corgi_back.rsi/armor.png | Bin 0 -> 481 bytes .../Mobs/Back/corgi_back.rsi/cardborg.png | Bin 0 -> 792 bytes .../Mobs/Back/corgi_back.rsi/deathsquad.png | Bin 0 -> 1979 bytes .../corgi_back.rsi/fire_extinguisher0.png | Bin 0 -> 526 bytes .../corgi_back.rsi/fire_extinguisher1.png | Bin 0 -> 526 bytes .../Clothing/Mobs/Back/corgi_back.rsi/ian.png | Bin 0 -> 1012 bytes .../Mobs/Back/corgi_back.rsi/meta.json | 1 + .../Mobs/Back/corgi_back.rsi/oxygen.png | Bin 0 -> 585 bytes .../Mobs/Back/corgi_back.rsi/petcollar.png | Bin 0 -> 258 bytes .../Mobs/Back/corgi_back.rsi/walkietalkie.png | Bin 0 -> 433 bytes .../Mobs/Hats/corgi_hats.rsi/beret.png | Bin 0 -> 354 bytes .../Mobs/Hats/corgi_hats.rsi/blackscarf.png | Bin 0 -> 346 bytes .../Mobs/Hats/corgi_hats.rsi/bunny.png | Bin 0 -> 508 bytes .../Mobs/Hats/corgi_hats.rsi/captain.png | Bin 0 -> 413 bytes .../Mobs/Hats/corgi_hats.rsi/cardborg_h.png | Bin 0 -> 505 bytes .../Mobs/Hats/corgi_hats.rsi/cargosoft.png | Bin 0 -> 412 bytes .../Mobs/Hats/corgi_hats.rsi/chef.png | Bin 0 -> 197 bytes .../Hats/corgi_hats.rsi/christmasscarf.png | Bin 0 -> 366 bytes .../Mobs/Hats/corgi_hats.rsi/clown.png | Bin 0 -> 547 bytes .../Mobs/Hats/corgi_hats.rsi/detective.png | Bin 0 -> 245 bytes .../Mobs/Hats/corgi_hats.rsi/festive.png | Bin 0 -> 362 bytes .../Hats/corgi_hats.rsi/hardhat0_cakehat.png | Bin 0 -> 289 bytes .../Hats/corgi_hats.rsi/hardhat0_reindeer.png | Bin 0 -> 301 bytes .../Hats/corgi_hats.rsi/hardhat0_white.png | Bin 0 -> 505 bytes .../Hats/corgi_hats.rsi/hardhat0_yellow.png | Bin 0 -> 527 bytes .../Hats/corgi_hats.rsi/hardhat1_cakehat.png | Bin 0 -> 459 bytes .../Hats/corgi_hats.rsi/hardhat1_white.png | Bin 0 -> 496 bytes .../Hats/corgi_hats.rsi/hardhat1_yellow.png | Bin 0 -> 518 bytes .../Mobs/Hats/corgi_hats.rsi/helmet.png | Bin 0 -> 632 bytes .../Mobs/Hats/corgi_hats.rsi/hopcap.png | Bin 0 -> 431 bytes .../Mobs/Hats/corgi_hats.rsi/kitty.png | Bin 0 -> 866 bytes .../Mobs/Hats/corgi_hats.rsi/meta.json | 1 + .../Mobs/Hats/corgi_hats.rsi/nursehat.png | Bin 0 -> 255 bytes .../Mobs/Hats/corgi_hats.rsi/paper.png | Bin 0 -> 322 bytes .../Mobs/Hats/corgi_hats.rsi/paper_words.png | Bin 0 -> 322 bytes .../Mobs/Hats/corgi_hats.rsi/pirate.png | Bin 0 -> 535 bytes .../Mobs/Hats/corgi_hats.rsi/policehelm.png | Bin 0 -> 478 bytes .../Mobs/Hats/corgi_hats.rsi/redwizard.png | Bin 0 -> 421 bytes .../Mobs/Hats/corgi_hats.rsi/santahat.png | Bin 0 -> 446 bytes .../Mobs/Hats/corgi_hats.rsi/scarf.png | Bin 0 -> 329 bytes .../Mobs/Hats/corgi_hats.rsi/sheet.png | Bin 0 -> 1130 bytes .../Mobs/Hats/corgi_hats.rsi/sheriff.png | Bin 0 -> 586 bytes .../Mobs/Hats/corgi_hats.rsi/sombrero.png | Bin 0 -> 523 bytes .../Clothing/Mobs/Hats/corgi_hats.rsi/sun.png | Bin 0 -> 204 bytes .../Mobs/Hats/corgi_hats.rsi/tophat.png | Bin 0 -> 245 bytes .../Mobs/Hats/corgi_hats.rsi/ushankadown.png | Bin 0 -> 1097 bytes .../Mobs/Hats/corgi_hats.rsi/ushankaup.png | Bin 0 -> 887 bytes .../Mobs/Hats/corgi_hats.rsi/wizard-fake.png | Bin 0 -> 515 bytes .../Mobs/Hats/corgi_hats.rsi/wizard.png | Bin 0 -> 515 bytes .../Mobs/Hats/corgi_hats.rsi/zebrascarf.png | Bin 0 -> 369 bytes .../Mobs/Aliens/Carps/carp_holo.rsi/dead.png | Bin 0 -> 98 bytes .../Aliens/Carps/carp_holo.rsi/holocarp.png | Bin 0 -> 5821 bytes .../Mobs/Aliens/Carps/carp_holo.rsi/icon.png | Bin 0 -> 388 bytes .../Mobs/Aliens/Carps/carp_holo.rsi/meta.json | 103 +++ .../Mobs/Aliens/Carps/carp_magic.rsi/dead.png | Bin 0 -> 478 bytes .../Mobs/Aliens/Carps/carp_magic.rsi/icon.png | Bin 0 -> 485 bytes .../Aliens/Carps/carp_magic.rsi/magicarp.png | Bin 0 -> 2899 bytes .../Carps/carp_magic.rsi/magicarp_gib.png | Bin 0 -> 2186 bytes .../Aliens/Carps/carp_magic.rsi/meta.json | 73 +++ .../Mobs/Aliens/Carps/carp_space.rsi/carp.png | Bin 0 -> 3713 bytes .../Aliens/Carps/carp_space.rsi/carp_gib.png | Bin 0 -> 2967 bytes .../Mobs/Aliens/Carps/carp_space.rsi/dead.png | Bin 0 -> 279 bytes .../Mobs/Aliens/Carps/carp_space.rsi/icon.png | Bin 0 -> 557 bytes .../Aliens/Carps/carp_space.rsi/meta.json | 73 +++ .../Xenos}/xeno_hunter.rsi/crit.png | Bin .../Xenos}/xeno_hunter.rsi/dead.png | Bin .../Xenos}/xeno_hunter.rsi/meta.json | 0 .../Xenos}/xeno_hunter.rsi/running.png | Bin .../Xenos}/xeno_hunter.rsi/sleeping.png | Bin .../Xenos}/xeno_hunter.rsi/standing.png | Bin .../Textures/Mobs/Animals/bat.rsi/bat.png | Bin 0 -> 1102 bytes .../Textures/Mobs/Animals/bat.rsi/dead.png | Bin 0 -> 177 bytes .../Textures/Mobs/Animals/bat.rsi/meta.json | 50 ++ .../Mobs/Animals/bear.rsi/armor_bear.png | Bin 0 -> 1222 bytes .../Textures/Mobs/Animals/bear.rsi/bear.png | Bin 0 -> 2759 bytes .../Mobs/Animals/bear.rsi/bear_dead.png | Bin 0 -> 1105 bytes .../Mobs/Animals/bear.rsi/bear_gib.png | Bin 0 -> 9926 bytes .../Mobs/Animals/bear.rsi/brownbear.png | Bin 0 -> 2905 bytes .../Mobs/Animals/bear.rsi/brownbear_dead.png | Bin 0 -> 1154 bytes .../Mobs/Animals/bear.rsi/brownbear_gib.png | Bin 0 -> 4780 bytes .../Mobs/Animals/bear.rsi/combatbear.png | Bin 0 -> 3340 bytes .../Mobs/Animals/bear.rsi/combatbear_dead.png | Bin 0 -> 1140 bytes .../Textures/Mobs/Animals/bear.rsi/meta.json | 138 ++++ Resources/Textures/Mobs/Animals/bee.rsi/0.png | Bin 0 -> 207 bytes Resources/Textures/Mobs/Animals/bee.rsi/1.png | Bin 0 -> 217 bytes Resources/Textures/Mobs/Animals/bee.rsi/2.png | Bin 0 -> 220 bytes Resources/Textures/Mobs/Animals/bee.rsi/3.png | Bin 0 -> 207 bytes Resources/Textures/Mobs/Animals/bee.rsi/4.png | Bin 0 -> 213 bytes .../Textures/Mobs/Animals/bee.rsi/dead.png | Bin 0 -> 136 bytes .../Textures/Mobs/Animals/bee.rsi/meta.json | 105 ++++ .../Mobs/Animals/butterfly.rsi/butterfly.png | Bin 0 -> 1402 bytes .../Mobs/Animals/butterfly.rsi/dead.png | Bin 0 -> 227 bytes .../Mobs/Animals/butterfly.rsi/meta.json | 50 ++ .../Textures/Mobs/Animals/chick.rsi/chick.png | Bin 0 -> 667 bytes .../Textures/Mobs/Animals/chick.rsi/dead.png | Bin 0 -> 289 bytes .../Textures/Mobs/Animals/chick.rsi/gib.png | Bin 0 -> 1605 bytes .../Textures/Mobs/Animals/chick.rsi/meta.json | 62 ++ .../Mobs/Animals/chicken.rsi/chicken-0.png | Bin 0 -> 1824 bytes .../Mobs/Animals/chicken.rsi/chicken-1.png | Bin 0 -> 1940 bytes .../Mobs/Animals/chicken.rsi/chicken-2.png | Bin 0 -> 1879 bytes .../Mobs/Animals/chicken.rsi/dead-0.png | Bin 0 -> 418 bytes .../Mobs/Animals/chicken.rsi/dead-1.png | Bin 0 -> 430 bytes .../Mobs/Animals/chicken.rsi/dead-2.png | Bin 0 -> 428 bytes .../Mobs/Animals/chicken.rsi/icon-0.png | Bin 0 -> 242 bytes .../Mobs/Animals/chicken.rsi/icon-1.png | Bin 0 -> 242 bytes .../Mobs/Animals/chicken.rsi/icon-2.png | Bin 0 -> 245 bytes .../Mobs/Animals/chicken.rsi/meta.json | 143 +++++ .../Mobs/Animals/chicken.rsi/note.txt | 1 + .../Mobs/Animals/cockroach.rsi/cockroach.png | Bin 0 -> 922 bytes .../Mobs/Animals/cockroach.rsi/glockroach.png | Bin 0 -> 996 bytes .../Mobs/Animals/cockroach.rsi/meta.json | 55 ++ .../Textures/Mobs/Animals/cow.rsi/cow.png | Bin 0 -> 2891 bytes .../Textures/Mobs/Animals/cow.rsi/dead.png | Bin 0 -> 1143 bytes .../Textures/Mobs/Animals/cow.rsi/gib.png | Bin 0 -> 3763 bytes .../Textures/Mobs/Animals/cow.rsi/meta.json | 58 ++ .../Textures/Mobs/Animals/crab.rsi/crab.png | Bin 0 -> 3404 bytes .../Textures/Mobs/Animals/crab.rsi/dead.png | Bin 0 -> 614 bytes .../Textures/Mobs/Animals/crab.rsi/meta.json | 46 ++ .../Textures/Mobs/Animals/frog.rsi/dead.png | Bin 0 -> 301 bytes .../Textures/Mobs/Animals/frog.rsi/frog.png | Bin 0 -> 2005 bytes .../Textures/Mobs/Animals/frog.rsi/meta.json | 46 ++ .../Textures/Mobs/Animals/goat.rsi/dead.png | Bin 0 -> 1066 bytes .../Textures/Mobs/Animals/goat.rsi/goat.png | Bin 0 -> 2114 bytes .../Textures/Mobs/Animals/goat.rsi/meta.json | 38 ++ .../Textures/Mobs/Animals/goose.rsi/dead.png | Bin 0 -> 665 bytes .../Textures/Mobs/Animals/goose.rsi/goose.png | Bin 0 -> 1917 bytes .../Textures/Mobs/Animals/goose.rsi/meta.json | 132 ++++ .../Textures/Mobs/Animals/goose.rsi/vomit.png | Bin 0 -> 2872 bytes .../Mobs/Animals/goose.rsi/vomit_end.png | Bin 0 -> 3587 bytes .../Mobs/Animals/goose.rsi/vomit_start.png | Bin 0 -> 7376 bytes .../Mobs/Animals/gorilla.rsi/crawling.png | Bin 0 -> 2590 bytes .../Mobs/Animals/gorilla.rsi/dead.png | Bin 0 -> 663 bytes .../Mobs/Animals/gorilla.rsi/icon.png | Bin 0 -> 369 bytes .../Mobs/Animals/gorilla.rsi/meta.json | 65 ++ .../Mobs/Animals/gorilla.rsi/standing.png | Bin 0 -> 2823 bytes .../Textures/Mobs/Animals/lizard.rsi/dead.png | Bin 0 -> 214 bytes .../Textures/Mobs/Animals/lizard.rsi/gib.png | Bin 0 -> 1065 bytes .../Mobs/Animals/lizard.rsi/lizard.png | Bin 0 -> 361 bytes .../Mobs/Animals/lizard.rsi/meta.json | 75 +++ .../Mobs/Animals/lizard.rsi/space.png | Bin 0 -> 574 bytes .../Textures/Mobs/Animals/monkey.rsi/dead.png | Bin 0 -> 348 bytes .../Mobs/Animals/monkey.rsi/meta.json | 38 ++ .../Mobs/Animals/monkey.rsi/monkey.png | Bin 0 -> 641 bytes .../Mobs/Animals/mouse.rsi/dead-0.png | Bin 0 -> 385 bytes .../Mobs/Animals/mouse.rsi/dead-1.png | Bin 0 -> 411 bytes .../Mobs/Animals/mouse.rsi/dead-2.png | Bin 0 -> 379 bytes .../Mobs/Animals/mouse.rsi/icon-0.png | Bin 0 -> 233 bytes .../Mobs/Animals/mouse.rsi/icon-1.png | Bin 0 -> 228 bytes .../Mobs/Animals/mouse.rsi/icon-2.png | Bin 0 -> 232 bytes .../Textures/Mobs/Animals/mouse.rsi/meta.json | 170 +++++ .../Mobs/Animals/mouse.rsi/mouse-0.png | Bin 0 -> 1530 bytes .../Mobs/Animals/mouse.rsi/mouse-1.png | Bin 0 -> 1658 bytes .../Mobs/Animals/mouse.rsi/mouse-2.png | Bin 0 -> 1489 bytes .../Mobs/Animals/mouse.rsi/splat-0.png | Bin 0 -> 484 bytes .../Mobs/Animals/mouse.rsi/splat-1.png | Bin 0 -> 489 bytes .../Mobs/Animals/mouse.rsi/splat-2.png | Bin 0 -> 487 bytes .../Textures/Mobs/Animals/parrot.rsi/dead.png | Bin 0 -> 647 bytes .../Textures/Mobs/Animals/parrot.rsi/icon.png | Bin 0 -> 593 bytes .../Mobs/Animals/parrot.rsi/meta.json | 109 ++++ .../Mobs/Animals/parrot.rsi/parrot.png | Bin 0 -> 16667 bytes .../Textures/Mobs/Animals/parrot.rsi/sit.png | Bin 0 -> 1264 bytes .../Mobs/Animals/penguin.rsi/meta.json | 1 + .../Mobs/Animals/penguin.rsi/penguin.png | Bin 0 -> 890 bytes .../Mobs/Animals/penguin.rsi/penguin_baby.png | Bin 0 -> 669 bytes .../Animals/penguin.rsi/penguin_baby_dead.png | Bin 0 -> 253 bytes .../penguin.rsi/penguin_baby_dead_blood.png | Bin 0 -> 294 bytes .../Mobs/Animals/penguin.rsi/penguin_dead.png | Bin 0 -> 302 bytes .../penguin.rsi/penguin_dead_blood.png | Bin 0 -> 357 bytes .../Mobs/Animals/penguin.rsi/penguin_egg.png | Bin 0 -> 196 bytes .../penguin.rsi/penguin_egg_broken.png | Bin 0 -> 221 bytes .../penguin.rsi/penguin_shamebrero.png | Bin 0 -> 1395 bytes .../Textures/Mobs/Animals/snake.rsi/dead.png | Bin 0 -> 688 bytes .../Textures/Mobs/Animals/snake.rsi/icon.png | Bin 0 -> 202 bytes .../Textures/Mobs/Animals/snake.rsi/meta.json | 64 ++ .../Textures/Mobs/Animals/snake.rsi/snake.png | Bin 0 -> 1115 bytes .../Mobs/Animals/spider.rsi/guard.png | Bin 0 -> 3969 bytes .../Mobs/Animals/spider.rsi/guard_dead.png | Bin 0 -> 660 bytes .../Mobs/Animals/spider.rsi/hunter.png | Bin 0 -> 3906 bytes .../Mobs/Animals/spider.rsi/hunter_dead.png | Bin 0 -> 638 bytes .../Mobs/Animals/spider.rsi/meta.json | 221 +++++++ .../Mobs/Animals/spider.rsi/midwife.png | Bin 0 -> 3928 bytes .../Mobs/Animals/spider.rsi/midwife_dead.png | Bin 0 -> 764 bytes .../Mobs/Animals/spider.rsi/nurse.png | Bin 0 -> 3344 bytes .../Mobs/Animals/spider.rsi/nurse_dead.png | Bin 0 -> 560 bytes .../Mobs/Animals/spider.rsi/tarantula.png | Bin 0 -> 4225 bytes .../Animals/spider.rsi/tarantula_dead.png | Bin 0 -> 886 bytes .../Mobs/Animals/spider.rsi/viper.png | Bin 0 -> 4075 bytes .../Mobs/Animals/spider.rsi/viper_dead.png | Bin 0 -> 829 bytes .../chungster.png | Bin 0 -> 1461 bytes .../unusuallylargefunnyrabbit.rsi/dead.png | Bin 0 -> 848 bytes .../unusuallylargefunnyrabbit.rsi/meta.json | 38 ++ ...ungs_plasmaman.png => lungs_phoronman.png} | Bin Resources/Textures/Mobs/Pets/cat.rsi/cak.png | Bin 0 -> 1112 bytes .../Textures/Mobs/Pets/cat.rsi/cak_dead.png | Bin 0 -> 355 bytes .../Textures/Mobs/Pets/cat.rsi/cak_rest.png | Bin 0 -> 370 bytes .../Textures/Mobs/Pets/cat.rsi/cak_sit.png | Bin 0 -> 400 bytes Resources/Textures/Mobs/Pets/cat.rsi/cat.png | Bin 0 -> 2619 bytes Resources/Textures/Mobs/Pets/cat.rsi/cat2.png | Bin 0 -> 2252 bytes .../Textures/Mobs/Pets/cat.rsi/cat2_dead.png | Bin 0 -> 625 bytes .../Textures/Mobs/Pets/cat.rsi/cat2_rest.png | Bin 0 -> 878 bytes .../Textures/Mobs/Pets/cat.rsi/cat2_sit.png | Bin 0 -> 645 bytes .../Textures/Mobs/Pets/cat.rsi/cat_dead.png | Bin 0 -> 555 bytes .../Mobs/Pets/cat.rsi/cat_deadcollar.png | Bin 0 -> 119 bytes .../Mobs/Pets/cat.rsi/cat_deadtag.png | Bin 0 -> 95 bytes .../Textures/Mobs/Pets/cat.rsi/cat_rest.png | Bin 0 -> 741 bytes .../Mobs/Pets/cat.rsi/cat_restcollar.png | Bin 0 -> 119 bytes .../Mobs/Pets/cat.rsi/cat_resttag.png | Bin 0 -> 95 bytes .../Textures/Mobs/Pets/cat.rsi/cat_sit.png | Bin 0 -> 655 bytes .../Textures/Mobs/Pets/cat.rsi/catcollar.png | Bin 0 -> 162 bytes .../Textures/Mobs/Pets/cat.rsi/cattag.png | Bin 0 -> 139 bytes .../Textures/Mobs/Pets/cat.rsi/kitten.png | Bin 0 -> 1701 bytes .../Mobs/Pets/cat.rsi/kitten_dead.png | Bin 0 -> 486 bytes .../Mobs/Pets/cat.rsi/kitten_deadcollar.png | Bin 0 -> 113 bytes .../Mobs/Pets/cat.rsi/kitten_deadtag.png | Bin 0 -> 96 bytes .../Mobs/Pets/cat.rsi/kitten_rest.png | Bin 0 -> 662 bytes .../Mobs/Pets/cat.rsi/kitten_restcollar.png | Bin 0 -> 113 bytes .../Mobs/Pets/cat.rsi/kitten_resttag.png | Bin 0 -> 96 bytes .../Textures/Mobs/Pets/cat.rsi/kitten_sit.png | Bin 0 -> 552 bytes .../Mobs/Pets/cat.rsi/kittencollar.png | Bin 0 -> 140 bytes .../Textures/Mobs/Pets/cat.rsi/kittentag.png | Bin 0 -> 140 bytes .../Textures/Mobs/Pets/cat.rsi/meta.json | 392 ++++++++++++ .../Textures/Mobs/Pets/cat.rsi/spacecat.png | Bin 0 -> 3666 bytes .../Mobs/Pets/cat.rsi/spacecat_dead.png | Bin 0 -> 881 bytes .../Mobs/Pets/cat.rsi/spacecat_rest.png | Bin 0 -> 1266 bytes .../Mobs/Pets/cat.rsi/spacecat_sit.png | Bin 0 -> 988 bytes .../Textures/Mobs/Pets/corgi.rsi/corgi.png | Bin 0 -> 795 bytes .../Mobs/Pets/corgi.rsi/corgi_dead.png | Bin 0 -> 306 bytes .../Mobs/Pets/corgi.rsi/corgi_deadcollar.png | Bin 0 -> 117 bytes .../Mobs/Pets/corgi.rsi/corgi_deadtag.png | Bin 0 -> 104 bytes .../Mobs/Pets/corgi.rsi/corgi_rest.png | Bin 0 -> 816 bytes .../Mobs/Pets/corgi.rsi/corgicollar.png | Bin 0 -> 189 bytes .../Textures/Mobs/Pets/corgi.rsi/corgitag.png | Bin 0 -> 136 bytes .../Textures/Mobs/Pets/corgi.rsi/ian.png | Bin 0 -> 1313 bytes .../Textures/Mobs/Pets/corgi.rsi/ian_dead.png | Bin 0 -> 523 bytes .../Mobs/Pets/corgi.rsi/ian_shaved.png | Bin 0 -> 1396 bytes .../Mobs/Pets/corgi.rsi/ian_shaved_dead.png | Bin 0 -> 557 bytes .../Textures/Mobs/Pets/corgi.rsi/lisa.png | Bin 0 -> 1470 bytes .../Mobs/Pets/corgi.rsi/lisa_dead.png | Bin 0 -> 594 bytes .../Mobs/Pets/corgi.rsi/lisa_shaved.png | Bin 0 -> 1585 bytes .../Mobs/Pets/corgi.rsi/lisa_shaved_dead.png | Bin 0 -> 590 bytes .../Textures/Mobs/Pets/corgi.rsi/meta.json | 415 ++++++++++++ .../Textures/Mobs/Pets/corgi.rsi/narsian.png | Bin 0 -> 1849 bytes .../Mobs/Pets/corgi.rsi/narsian_dead.png | Bin 0 -> 675 bytes .../Textures/Mobs/Pets/corgi.rsi/old_ian.png | Bin 0 -> 2447 bytes .../Mobs/Pets/corgi.rsi/old_ian_dead.png | Bin 0 -> 685 bytes .../Mobs/Pets/corgi.rsi/old_ian_shaved.png | Bin 0 -> 2712 bytes .../Pets/corgi.rsi/old_ian_shaved_dead.png | Bin 0 -> 762 bytes .../Textures/Mobs/Pets/corgi.rsi/puppy.png | Bin 0 -> 911 bytes .../Mobs/Pets/corgi.rsi/puppy_dead.png | Bin 0 -> 359 bytes .../Mobs/Pets/corgi.rsi/puppy_deadcollar.png | Bin 0 -> 118 bytes .../Mobs/Pets/corgi.rsi/puppy_deadtag.png | Bin 0 -> 106 bytes .../Mobs/Pets/corgi.rsi/puppy_shaved.png | Bin 0 -> 1005 bytes .../Mobs/Pets/corgi.rsi/puppy_shaved_dead.png | Bin 0 -> 381 bytes .../Mobs/Pets/corgi.rsi/puppycollar.png | Bin 0 -> 159 bytes .../Textures/Mobs/Pets/corgi.rsi/puppytag.png | Bin 0 -> 145 bytes Resources/Textures/Mobs/Pets/fox.rsi/fox.png | Bin 0 -> 1524 bytes .../Textures/Mobs/Pets/fox.rsi/fox_dead.png | Bin 0 -> 539 bytes .../Mobs/Pets/fox.rsi/fox_deadcollar.png | Bin 0 -> 116 bytes .../Mobs/Pets/fox.rsi/fox_deadtag.png | Bin 0 -> 123 bytes .../Textures/Mobs/Pets/fox.rsi/foxcollar.png | Bin 0 -> 145 bytes .../Textures/Mobs/Pets/fox.rsi/foxtag.png | Bin 0 -> 141 bytes .../Textures/Mobs/Pets/fox.rsi/meta.json | 92 +++ .../Textures/Mobs/Pets/sloth.rsi/meta.json | 38 ++ .../Textures/Mobs/Pets/sloth.rsi/sloth.png | Bin 0 -> 4219 bytes .../Mobs/Pets/sloth.rsi/sloth_dead.png | Bin 0 -> 1072 bytes 270 files changed, 3805 insertions(+), 2 deletions(-) create mode 100644 Resources/Audio/Effects/chungus.ogg create mode 100644 Resources/Prototypes/Entities/Mobs/NPCs/animals.yml create mode 100644 Resources/Prototypes/Entities/Mobs/NPCs/carp.yml create mode 100644 Resources/Prototypes/Entities/Mobs/NPCs/pets.yml create mode 100644 Resources/Textures/Clothing/Mobs/Back/corgi_back.rsi/armor.png create mode 100644 Resources/Textures/Clothing/Mobs/Back/corgi_back.rsi/cardborg.png create mode 100644 Resources/Textures/Clothing/Mobs/Back/corgi_back.rsi/deathsquad.png create mode 100644 Resources/Textures/Clothing/Mobs/Back/corgi_back.rsi/fire_extinguisher0.png create mode 100644 Resources/Textures/Clothing/Mobs/Back/corgi_back.rsi/fire_extinguisher1.png create mode 100644 Resources/Textures/Clothing/Mobs/Back/corgi_back.rsi/ian.png create mode 100644 Resources/Textures/Clothing/Mobs/Back/corgi_back.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Mobs/Back/corgi_back.rsi/oxygen.png create mode 100644 Resources/Textures/Clothing/Mobs/Back/corgi_back.rsi/petcollar.png create mode 100644 Resources/Textures/Clothing/Mobs/Back/corgi_back.rsi/walkietalkie.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/beret.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/blackscarf.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/bunny.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/captain.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/cardborg_h.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/cargosoft.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/chef.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/christmasscarf.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/clown.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/detective.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/festive.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/hardhat0_cakehat.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/hardhat0_reindeer.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/hardhat0_white.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/hardhat0_yellow.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/hardhat1_cakehat.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/hardhat1_white.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/hardhat1_yellow.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/helmet.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/hopcap.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/kitty.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/meta.json create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/nursehat.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/paper.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/paper_words.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/pirate.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/policehelm.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/redwizard.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/santahat.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/scarf.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/sheet.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/sheriff.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/sombrero.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/sun.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/tophat.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/ushankadown.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/ushankaup.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/wizard-fake.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/wizard.png create mode 100644 Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/zebrascarf.png create mode 100644 Resources/Textures/Mobs/Aliens/Carps/carp_holo.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Aliens/Carps/carp_holo.rsi/holocarp.png create mode 100644 Resources/Textures/Mobs/Aliens/Carps/carp_holo.rsi/icon.png create mode 100644 Resources/Textures/Mobs/Aliens/Carps/carp_holo.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Aliens/Carps/carp_magic.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Aliens/Carps/carp_magic.rsi/icon.png create mode 100644 Resources/Textures/Mobs/Aliens/Carps/carp_magic.rsi/magicarp.png create mode 100644 Resources/Textures/Mobs/Aliens/Carps/carp_magic.rsi/magicarp_gib.png create mode 100644 Resources/Textures/Mobs/Aliens/Carps/carp_magic.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Aliens/Carps/carp_space.rsi/carp.png create mode 100644 Resources/Textures/Mobs/Aliens/Carps/carp_space.rsi/carp_gib.png create mode 100644 Resources/Textures/Mobs/Aliens/Carps/carp_space.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Aliens/Carps/carp_space.rsi/icon.png create mode 100644 Resources/Textures/Mobs/Aliens/Carps/carp_space.rsi/meta.json rename Resources/Textures/Mobs/{Species => Aliens/Xenos}/xeno_hunter.rsi/crit.png (100%) rename Resources/Textures/Mobs/{Species => Aliens/Xenos}/xeno_hunter.rsi/dead.png (100%) rename Resources/Textures/Mobs/{Species => Aliens/Xenos}/xeno_hunter.rsi/meta.json (100%) rename Resources/Textures/Mobs/{Species => Aliens/Xenos}/xeno_hunter.rsi/running.png (100%) rename Resources/Textures/Mobs/{Species => Aliens/Xenos}/xeno_hunter.rsi/sleeping.png (100%) rename Resources/Textures/Mobs/{Species => Aliens/Xenos}/xeno_hunter.rsi/standing.png (100%) create mode 100644 Resources/Textures/Mobs/Animals/bat.rsi/bat.png create mode 100644 Resources/Textures/Mobs/Animals/bat.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Animals/bat.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Animals/bear.rsi/armor_bear.png create mode 100644 Resources/Textures/Mobs/Animals/bear.rsi/bear.png create mode 100644 Resources/Textures/Mobs/Animals/bear.rsi/bear_dead.png create mode 100644 Resources/Textures/Mobs/Animals/bear.rsi/bear_gib.png create mode 100644 Resources/Textures/Mobs/Animals/bear.rsi/brownbear.png create mode 100644 Resources/Textures/Mobs/Animals/bear.rsi/brownbear_dead.png create mode 100644 Resources/Textures/Mobs/Animals/bear.rsi/brownbear_gib.png create mode 100644 Resources/Textures/Mobs/Animals/bear.rsi/combatbear.png create mode 100644 Resources/Textures/Mobs/Animals/bear.rsi/combatbear_dead.png create mode 100644 Resources/Textures/Mobs/Animals/bear.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Animals/bee.rsi/0.png create mode 100644 Resources/Textures/Mobs/Animals/bee.rsi/1.png create mode 100644 Resources/Textures/Mobs/Animals/bee.rsi/2.png create mode 100644 Resources/Textures/Mobs/Animals/bee.rsi/3.png create mode 100644 Resources/Textures/Mobs/Animals/bee.rsi/4.png create mode 100644 Resources/Textures/Mobs/Animals/bee.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Animals/bee.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Animals/butterfly.rsi/butterfly.png create mode 100644 Resources/Textures/Mobs/Animals/butterfly.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Animals/butterfly.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Animals/chick.rsi/chick.png create mode 100644 Resources/Textures/Mobs/Animals/chick.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Animals/chick.rsi/gib.png create mode 100644 Resources/Textures/Mobs/Animals/chick.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Animals/chicken.rsi/chicken-0.png create mode 100644 Resources/Textures/Mobs/Animals/chicken.rsi/chicken-1.png create mode 100644 Resources/Textures/Mobs/Animals/chicken.rsi/chicken-2.png create mode 100644 Resources/Textures/Mobs/Animals/chicken.rsi/dead-0.png create mode 100644 Resources/Textures/Mobs/Animals/chicken.rsi/dead-1.png create mode 100644 Resources/Textures/Mobs/Animals/chicken.rsi/dead-2.png create mode 100644 Resources/Textures/Mobs/Animals/chicken.rsi/icon-0.png create mode 100644 Resources/Textures/Mobs/Animals/chicken.rsi/icon-1.png create mode 100644 Resources/Textures/Mobs/Animals/chicken.rsi/icon-2.png create mode 100644 Resources/Textures/Mobs/Animals/chicken.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Animals/chicken.rsi/note.txt create mode 100644 Resources/Textures/Mobs/Animals/cockroach.rsi/cockroach.png create mode 100644 Resources/Textures/Mobs/Animals/cockroach.rsi/glockroach.png create mode 100644 Resources/Textures/Mobs/Animals/cockroach.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Animals/cow.rsi/cow.png create mode 100644 Resources/Textures/Mobs/Animals/cow.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Animals/cow.rsi/gib.png create mode 100644 Resources/Textures/Mobs/Animals/cow.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Animals/crab.rsi/crab.png create mode 100644 Resources/Textures/Mobs/Animals/crab.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Animals/crab.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Animals/frog.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Animals/frog.rsi/frog.png create mode 100644 Resources/Textures/Mobs/Animals/frog.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Animals/goat.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Animals/goat.rsi/goat.png create mode 100644 Resources/Textures/Mobs/Animals/goat.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Animals/goose.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Animals/goose.rsi/goose.png create mode 100644 Resources/Textures/Mobs/Animals/goose.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Animals/goose.rsi/vomit.png create mode 100644 Resources/Textures/Mobs/Animals/goose.rsi/vomit_end.png create mode 100644 Resources/Textures/Mobs/Animals/goose.rsi/vomit_start.png create mode 100644 Resources/Textures/Mobs/Animals/gorilla.rsi/crawling.png create mode 100644 Resources/Textures/Mobs/Animals/gorilla.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Animals/gorilla.rsi/icon.png create mode 100644 Resources/Textures/Mobs/Animals/gorilla.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Animals/gorilla.rsi/standing.png create mode 100644 Resources/Textures/Mobs/Animals/lizard.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Animals/lizard.rsi/gib.png create mode 100644 Resources/Textures/Mobs/Animals/lizard.rsi/lizard.png create mode 100644 Resources/Textures/Mobs/Animals/lizard.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Animals/lizard.rsi/space.png create mode 100644 Resources/Textures/Mobs/Animals/monkey.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Animals/monkey.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Animals/monkey.rsi/monkey.png create mode 100644 Resources/Textures/Mobs/Animals/mouse.rsi/dead-0.png create mode 100644 Resources/Textures/Mobs/Animals/mouse.rsi/dead-1.png create mode 100644 Resources/Textures/Mobs/Animals/mouse.rsi/dead-2.png create mode 100644 Resources/Textures/Mobs/Animals/mouse.rsi/icon-0.png create mode 100644 Resources/Textures/Mobs/Animals/mouse.rsi/icon-1.png create mode 100644 Resources/Textures/Mobs/Animals/mouse.rsi/icon-2.png create mode 100644 Resources/Textures/Mobs/Animals/mouse.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Animals/mouse.rsi/mouse-0.png create mode 100644 Resources/Textures/Mobs/Animals/mouse.rsi/mouse-1.png create mode 100644 Resources/Textures/Mobs/Animals/mouse.rsi/mouse-2.png create mode 100644 Resources/Textures/Mobs/Animals/mouse.rsi/splat-0.png create mode 100644 Resources/Textures/Mobs/Animals/mouse.rsi/splat-1.png create mode 100644 Resources/Textures/Mobs/Animals/mouse.rsi/splat-2.png create mode 100644 Resources/Textures/Mobs/Animals/parrot.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Animals/parrot.rsi/icon.png create mode 100644 Resources/Textures/Mobs/Animals/parrot.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Animals/parrot.rsi/parrot.png create mode 100644 Resources/Textures/Mobs/Animals/parrot.rsi/sit.png create mode 100644 Resources/Textures/Mobs/Animals/penguin.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Animals/penguin.rsi/penguin.png create mode 100644 Resources/Textures/Mobs/Animals/penguin.rsi/penguin_baby.png create mode 100644 Resources/Textures/Mobs/Animals/penguin.rsi/penguin_baby_dead.png create mode 100644 Resources/Textures/Mobs/Animals/penguin.rsi/penguin_baby_dead_blood.png create mode 100644 Resources/Textures/Mobs/Animals/penguin.rsi/penguin_dead.png create mode 100644 Resources/Textures/Mobs/Animals/penguin.rsi/penguin_dead_blood.png create mode 100644 Resources/Textures/Mobs/Animals/penguin.rsi/penguin_egg.png create mode 100644 Resources/Textures/Mobs/Animals/penguin.rsi/penguin_egg_broken.png create mode 100644 Resources/Textures/Mobs/Animals/penguin.rsi/penguin_shamebrero.png create mode 100644 Resources/Textures/Mobs/Animals/snake.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Animals/snake.rsi/icon.png create mode 100644 Resources/Textures/Mobs/Animals/snake.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Animals/snake.rsi/snake.png create mode 100644 Resources/Textures/Mobs/Animals/spider.rsi/guard.png create mode 100644 Resources/Textures/Mobs/Animals/spider.rsi/guard_dead.png create mode 100644 Resources/Textures/Mobs/Animals/spider.rsi/hunter.png create mode 100644 Resources/Textures/Mobs/Animals/spider.rsi/hunter_dead.png create mode 100644 Resources/Textures/Mobs/Animals/spider.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Animals/spider.rsi/midwife.png create mode 100644 Resources/Textures/Mobs/Animals/spider.rsi/midwife_dead.png create mode 100644 Resources/Textures/Mobs/Animals/spider.rsi/nurse.png create mode 100644 Resources/Textures/Mobs/Animals/spider.rsi/nurse_dead.png create mode 100644 Resources/Textures/Mobs/Animals/spider.rsi/tarantula.png create mode 100644 Resources/Textures/Mobs/Animals/spider.rsi/tarantula_dead.png create mode 100644 Resources/Textures/Mobs/Animals/spider.rsi/viper.png create mode 100644 Resources/Textures/Mobs/Animals/spider.rsi/viper_dead.png create mode 100644 Resources/Textures/Mobs/Animals/unusuallylargefunnyrabbit.rsi/chungster.png create mode 100644 Resources/Textures/Mobs/Animals/unusuallylargefunnyrabbit.rsi/dead.png create mode 100644 Resources/Textures/Mobs/Animals/unusuallylargefunnyrabbit.rsi/meta.json rename Resources/Textures/Mobs/Parts/{lungs_plasmaman.png => lungs_phoronman.png} (100%) create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/cak.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/cak_dead.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/cak_rest.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/cak_sit.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/cat.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/cat2.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/cat2_dead.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/cat2_rest.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/cat2_sit.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/cat_dead.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/cat_deadcollar.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/cat_deadtag.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/cat_rest.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/cat_restcollar.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/cat_resttag.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/cat_sit.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/catcollar.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/cattag.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/kitten.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/kitten_dead.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/kitten_deadcollar.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/kitten_deadtag.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/kitten_rest.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/kitten_restcollar.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/kitten_resttag.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/kitten_sit.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/kittencollar.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/kittentag.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/spacecat.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/spacecat_dead.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/spacecat_rest.png create mode 100644 Resources/Textures/Mobs/Pets/cat.rsi/spacecat_sit.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/corgi.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/corgi_dead.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/corgi_deadcollar.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/corgi_deadtag.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/corgi_rest.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/corgicollar.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/corgitag.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/ian.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/ian_dead.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/ian_shaved.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/ian_shaved_dead.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/lisa.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/lisa_dead.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/lisa_shaved.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/lisa_shaved_dead.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/narsian.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/narsian_dead.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/old_ian.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/old_ian_dead.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/old_ian_shaved.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/old_ian_shaved_dead.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/puppy.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/puppy_dead.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/puppy_deadcollar.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/puppy_deadtag.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/puppy_shaved.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/puppy_shaved_dead.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/puppycollar.png create mode 100644 Resources/Textures/Mobs/Pets/corgi.rsi/puppytag.png create mode 100644 Resources/Textures/Mobs/Pets/fox.rsi/fox.png create mode 100644 Resources/Textures/Mobs/Pets/fox.rsi/fox_dead.png create mode 100644 Resources/Textures/Mobs/Pets/fox.rsi/fox_deadcollar.png create mode 100644 Resources/Textures/Mobs/Pets/fox.rsi/fox_deadtag.png create mode 100644 Resources/Textures/Mobs/Pets/fox.rsi/foxcollar.png create mode 100644 Resources/Textures/Mobs/Pets/fox.rsi/foxtag.png create mode 100644 Resources/Textures/Mobs/Pets/fox.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Pets/sloth.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Pets/sloth.rsi/sloth.png create mode 100644 Resources/Textures/Mobs/Pets/sloth.rsi/sloth_dead.png diff --git a/Resources/Audio/Effects/chungus.ogg b/Resources/Audio/Effects/chungus.ogg new file mode 100644 index 0000000000000000000000000000000000000000..054ac995bf0c28cbd3e58f990176ea54953c7816 GIT binary patch literal 678300 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 }&-$HK;U8VTyhC9B1!VN`d^ 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≥v01hIu`;tUDUC~$bkKKxY%#?V9t3Mju9 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ⅈ8xwUW)Eea|trx0@R7seIx1bpfi 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 Njg8JvPJ+H2R4n<|&hti|aEuHAkvBtDu$egT+ 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

0T6v2ifXSdI4pN!7-{Jk;ymIZc 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 z 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 z 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

h}ILAdaQ1&?$60N=tj@UVL>62;8pUdM-a!c}| zGgb-T0&K%?wgE1?{-0b^u%S7Kh#dcRc0Cr^W7Wx)l33e^GMTQ|9D7bLV6=;#(@UPo zf_pc^$m4fz8X*J)4L%WwT)M|v-t!5Vds>?}6keFWqM?|WUQBMTr#RnB84vq)`j;$% zfS=%R!24J>A|6ivQADa)v~UmI4DK@I$GCUhP6!xo1|iCS(;cMDCoytsx8Q|JFjML< zU!3)i*n}ZW6ZRRY1P4X&simEfKD);>HC?=-Kq=8FN_lEuv;tzoW0 ziiLZOs@*d~g?wJYOs-Pk20lAc@QLwxe9WoDAgXkH0->y^P}RAg-RswMX6^Zb~Z{fX!7RB>6AH;?;tL!o~_XX}Wpz7ax^O* z+O?p8upXZ{!^y{k?w=q;Ro9fCGvYcBIqx@7e(gt3(P^jGfy=1#b)k2ciP4pOdklwe z@q!-(_gC726701j>hP_IQ;GSFiQMF1)(I(FBHH8hW3$*xYs5JhY87R>+N(L z9*BS>UfZC;t@@KcOgwxz1)^o|4+4uLrb2vzFQ$zkw^>@P(e<6HZF^^2ZS`k?fU z_*$NL>x)G5BzrU)Dfa|n91EuAOwp=RU+<;mS9sYj%edvy1m}mHP2kUGZ!agpyhm$B zWfjvBc56`hMRr)PSb7dub`lAi6@lU`T05RB<}_(ioTj0FiHnYG|GA6`Uwg1_1kf+ zC4usA(F_lL#D>%_?rwU}#^bVdvXAy#y-{QXc};Fj8!5tgM@*^7GjM&l$kUjhxoTrEOcSv@Q_=?&?Jcb1CmYuK7roGsxNC$iVG=SaoJ

8QjOMS93w^$&yY9iP0C2=>oPtoYq@QHl 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

ip`HOVEFx! zZ|?JJ+dtjB?0R!%wC}mQt5)w5XW9RO(_zPl{<@^iAH$VjpIh4FJ9jqBO&JRL_sjAH U3Or=?10#aL)78&qol`;+0AAI-=>Px# literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/kitty.png b/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/kitty.png new file mode 100644 index 0000000000000000000000000000000000000000..bc30f075d7dff529309578c55008b53ba30c33aa GIT binary patch literal 866 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrVAk|>aSW-L^Y-rkyhjcK$3K32 zsWL0Xv5&i@f-yx?%-_MYdkTBO6s7fInzsBCge-$@O<7qKv~Jfkt@!4N9~~3+W}iP) zXCI{X?@!y;1fM05EvfWK`=e&=HTra3Dc;59+2^0zmrqOHKDqwh zPX-1BgUveH>5<1+-42{OEAMw;wraxcW`Aauo@RcqBVojcTdL=dx6jKrk)6|{c6);J z!>_-0y6yX2vzV>pam1vHDd~E9-#z}U?d2xi`S`|@%#-0~%(H+FDGjXI{qexY+qo0p zoBdxNYx!#x=bUxo_m)gska3CcuT10IC9=M0_D{!D^X!01<%*IITR(^1*jM+uzv0$(`?u?pZvE7< ziK>VB4@@6ueO0ua=hNM%hzWPZ%*?szcCPTRJzLObBK&0P&^kjdbWo%8}&vojn zeLwxTX5KO5Q>?hF$nlLlm#%y%ymmA9bF82F>}R{@t;yT^Zy|p~$2&FQted~rF*?Z_ ztccrwtT8}(ZMv03fr-O|42Cx!QZJdFs0rL5k@HV}!TFqu2N&EMzHL)?e7^c!#iG4; zyUO;l+^a!xVZ-TCz2bLIwilNeESY6^J&NVi?z8r{7=SJ-yLTsSwq?cipSf8(w){!s zb(c<oCsh@k+@CXR`8SI%pUWu2 zUHZP!tMtLuYl+iRpFX=Q-)SH#V!C5MHbHyHn|SJa9Ap5U~qLWqIkMWENpx4-0{ z@BeyFB6-cEEjp)z%@VKtS;yO9c&&2Y{+Q_NU(cH*KKXO|s(jw<1e$`pj(;fodhhg^wtqjvXYd1E2?h731id=3 z_|wJ8weOma%-p*}p;yy)i)8LM?=Hh@L0)^~t3TJBlG@A3KY!tTQSmcAm!4Pty?V)M z_V)X`pL@vLHe}9fn`$6e$9k@d+cN#>9M!+;wp@62_xT%N0WSfF4G!DOg>L`4de-N5 PIY_|M)z4*}Q$iB}k1mk` literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/paper_words.png b/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/paper_words.png new file mode 100644 index 0000000000000000000000000000000000000000..3924013f33e1149c5f847d13dda5d7620125ee64 GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEVC3|4aSW-L^Y+%p+`|SUEf0&; z0uHiTG;p0;FBq}m0z*EdsLoA8SB2I>C5MHbHyHn|SJa9Ap5U~qLWqIkMWENpx4-0{ z@BeyFB6-cEEjp)z%@VKtS;yO9c&&2Y{+Q_NU(cH*KKXO|s(jw<1e$`pj(;fodhhg^wtqjvXYd1E2?h731id=3 z_|wJ8weOma%-p*}p;yy)i)8LM?=Hh@L0)^~t3TJBlG@A3KY!tTQSmcAm!4Pty?V)M z_V)X`pL@vLHe}9fn`$6e$9k@d+cN#>9M!+;wp@62_xT%N0WSfF4G!DOg>L`4de-N5 PIY_|M)z4*}Q$iB}k1mk` literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/pirate.png b/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/pirate.png new file mode 100644 index 0000000000000000000000000000000000000000..d977afefa571a7149b7e11917aff2ff5cc291937 GIT binary patch literal 535 zcmV+y0_gpTP)3~&8;q@CtlYuC9<(%Wf>p2z*I>y8taTB%11qsKA+d38aU7z?>jlK(= zObqt@8n*DB^TF z0d&f5J5c9?i=rS10-SU8Zyd*zWl33aW%T3`IF z+u)orrmt=BGCvH%hu<#wO(&q9@hrxNkY!nYZj;ICn*V&$VHkGG zZ@f(XZ2IEB!#f}deo9$u>wUT3?|a(@)>?PJ-{1L0zKDp3h=_=Yh=_=Yh{!MZmEPHX zSGFw6k23nK^-AvrpPQ&r6tUaw0_U6q2z(dyFYeEq&1TLwLw%>W?@4If9{(3(jJq8e zV;GOeq-hHLbava;^Vg(l%6L4+*Y!Dljr-%-e1787=@fvfsu&CgESF2x>osLray%Xz zt$@j7f-#0PP1$TVT(4I~qY(gy!vW}TMf9=){LQCnN>x=s%lg3onH3StB)t1MN!0dyKS@r=JWa64|ou-Vrk9FuGcHXyOhOU(Zyq$ z35#R%9=4s%PKxv2YrXj2+`PN`&hLG{@7?`k*U-`N;{L1&l^QRuvoicRRQNq^cN`;w zjZNv2XMfiIP*&e9cURE(a1UZ8vRYz^`9i+?kmXMa+h zXm{lASIfBh(evsV{r;>^dDQ=vo5A7bmYyeNhh%@Bj8B*l_}KrH%7n9`3tp<3+;!2K zTz-D@&ZaXZ$w%MYr#$jrKP@#|Q-}3D<(6eTh@vJ!AX3>qWfb^2Ve}T`ke)-&SeOdB*L&J1+26^MWl5 zipEO2=C)P8xSlv&o`MHmd(yE)BBgk*bpc9?NYP>5A#Z&dwcD(E-4y6Dr=OH ze|vaau8hd}Df?_5I5PfhUVk*Gxy7E7gIpzlk$gJTZ}h&5{g?E9t!XrMypuGH>+a5HTMNB|d%a6D zz122MkG&`BLDJDV$;_{LNuDHsbWXjQ_R;ZfV$PDPK|@nXx|wN^bQssM-b@GQbT<3( z-keRzolx%NrLQY-FKIWatsW{2bBv1ThD+59QR-!@{G%vRHP_P3HN zzUIGkT6=1)GID5+OBOB{$-FYo<_& z36V$4O>UG@C^hxws!E8|Seo4M&iOQR&_%C99-ws!Wmb_jk{fXlqK`HrSFdFXWmCzG zG=*}DPBPTY#dDUVP@3liTO>EqjmXssmi`o)-%eU4H%Ng100000fHiyquphdnaw7`> P00000NkvXXu0mjfvVyt2 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/santahat.png b/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/santahat.png new file mode 100644 index 0000000000000000000000000000000000000000..8056d14327c3c6574ce7f44acecad447a686e027 GIT binary patch literal 446 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU~KhtaSW-L^Y)gb*I@?<)(7Fq z-p<{;dAl;i88^;ew+)%9WU-@$?R@ed!YD8O#iOjmPkH^9lmi|Yfok|`&1a-P`eZMz|!c|w(a-0 zH}47RKh^r0XZuF|`^%1Z=2pyjD(@#>QLWsy{+YjFtk3+{Kb5y!TUs?|8t=uZ?$^6^ z?EWN}W|=29kAWfbSI^U;&hCq-pu-pT*`#rNMYzMW%W*!+ai0LdET77{afgPb!QcokieqFRwwrV zd6fUas6NTCVcb{40AJR_{2&zopr049KwI{*Lx literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/sheet.png b/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/sheet.png new file mode 100644 index 0000000000000000000000000000000000000000..d71f99f848b99c94edcd612c417d692b43cb5d5f GIT binary patch literal 1130 zcmV-w1eN=VP)S4#@0dJ8}ZskO((Q2f0G_*c+NfGV{wl?A`XABJJx24fXNWAI=7E%5#QeHo&* z>W`HLI)2W1Vcm!S>NDV6bP|AbK9(Q7_-C_OVciF#WWZk&st%otXKdUw&9jL6Vrc$p z4Cs5Is`jPReklId0&vbDiXvgF&tKV&qG)hID5ZwVuP!n_rL@)CY3HXv6h*)o)4q%_ z#zqMqfg&{Vw+$Wupwm0N@B2Bx&j2J(M*#r5yu1_we|mZvZGND-$hiYb|GUh*gj|_j zdP;o4gb5QSOqeiX!e0iK&3~<}i@^8&oO7NJ;rNhk=`i?&i0}J3rL_0AIvuhs14`*A znK1f{&^b zcL$VGFiq3ooL@&4=z5=Xo}W&q!uIKO$}vzGp67|figd^BFm z7!&KoVo{p*QrrGBPwF+DZS%~?34mUS9rE|hCY;31#a<=jy2CfUP z4r!VKz|RLu#u)5&yUxKQJkQHFn+;f&CFcEgLev38suDuG6RWwlNRk9>+ZJ}3ra}M! z=p_OM4*)^{Ie3+`31Jv&MJQE*b;0Y(TiwV!o6Ud_0+waL;c#f}q>97g0G4F|A*A#P zoDfp!j}BF(bfHz>_w)67UFlGkWd#D+u38U)I*uxTbXc#~B@tS^3uIXaNs=@Y>GmCu z$6jNA>$(P3j!hh@KS`3b?tqd2I#mGxY}*Fgwo48FW?`Z$l+aJKDTnepUI62!f!Hm8JBIf!6F;P<>pDa8M(EI&f9A}Jy{5J+U w!x6O;6NoN7iPsL*`)%5lpY3wB*Cvkt0s7pPwk_cEvH$=807*qoM6N<$f|j2dyZ`_I literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/sheriff.png b/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/sheriff.png new file mode 100644 index 0000000000000000000000000000000000000000..ac29b44c025bb0984d49b1815d0884ba3d793e24 GIT binary patch literal 586 zcmV-Q0=4~#P)Pf8+;MFYKCkWW_&(3W!*jRX10o_KuB_x|4L~uM zF~^a=lebfc8$P!OJ4x+&4S=229ycGAT*q^&kWHI_?!v0h&DtiEoZb#o;@YdS?v z##b3mPVl+>n&tNw00;-Ip7#d|*|ceHxBeRIbaKqIN$_L>in)xj>osDL(0;+}HUNl4 zLWF}B0n6XhH=&rzn1JOc9JGiiHL}Zh=_=Yi2Uci Y0fGn1ZPu$EEC2ui07*qoM6N<$f|+j|Jpcdz literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/sombrero.png b/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/sombrero.png new file mode 100644 index 0000000000000000000000000000000000000000..2f199b9ef044a4fc8cbea4e91218e00db40dd78c GIT binary patch literal 523 zcmV+m0`&cfP)+*+7Y6(QczHFU&Zi3(SyV_X$H_)l0Ugmdl^8^+e5v*7oz&(Kg^=id^4(3jvh=_=Y zh=_=Yh=_=Yh&+D2{BdY9I^%Z?$M}LKqci=8;V2?waxs(9m43x=x{Ann@p^laV$-Ho zt&oC_(V73na3~)WjK#?YN_D*@>6A>I=;wu1FEY6G79V0(j-`~wR^=jpx8j8S(h=_=Yh=_=I@E4n5^kb{ez2*P_ N002ovPDHLkV1h-3|6Kq8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/sun.png b/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/sun.png new file mode 100644 index 0000000000000000000000000000000000000000..730dea902e53aa04c43f68e5f88c2e5f047ea059 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=lRaG=Ln`LHy>*(i*+GEeg0EzB zlY4NJEyv2FgI-Kwf&$SScu&uaaXR77p~hvor(7y+#>~C%m#{D}97vDVyf{_J^0~zE zkGk)?I`@A6A9O$H$(&?Gknup!U|)PA`Nd=Tzo`;Ip`n?xmWA$~wXCyp-sP3K?{^m8 xfB)&8uk7nzU;Q4eUfdadKKTBj9FVSSyO>^FH)Uac5?u!3db;|#taD0e0stGdP%Z!f literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/tophat.png b/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/tophat.png new file mode 100644 index 0000000000000000000000000000000000000000..f723d36da8e4c2cedacac1c6b2ffaad646ecb987 GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=dpunnLn`LHy=BPPq9D-vaQkds zgIkv_RPa{mpAOv9#@qW=>dhVDoK4;iNq_cB&EPz0@>zx9K&@?&USu|Za?h@HmoI#; z%AXzNb?bZV>s@JkZ?5{cIc#$HLG~?q3$})zTbeoR$(+gG;~raNMT(vMyhdWN6UWl( zHBtZ9HzuyNt+S0zme{tAALtGUh>5uPH}d3zLy?L-x7Q#4*>H__%QVpmKbEBwJX|B- lHZd{CXomv_6GZKbSIqiF#j+3g$!miIJYD@<);T3K0Ra2@WZwV) literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/ushankadown.png b/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/ushankadown.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0b85e2bc81adba6dca217b91d1d46ca64d579e GIT binary patch literal 1097 zcmV-P1h)H$P)a8D*QX8rCQzAk4sZ#)qe|jCru$Ia2=khXv|E}ta z!v?&2&a7FEvTQFFBUi2nk^6&Cu!-z;gz1@?19dN7yeQf|c?zWpN^1`fA3btyF&vJ^ zMFgFIUuCV@%p1*>1J|q+o9OfxDOYRc3G;aN=*7_XE1+u{pD!&JPM+vo33coR<5HppirtD zIWS$*D3lJ~o#RTS(*US#eE@{i3P#l;Q`q?osg*tDyVoDZ_5?hhomC8_<;cg%?sbh= zO{G{!CV4tPuWb8U*?&BppH~)=Nmf%Sx0`-Byg4vn>-XL6b&@1Wk|arzBuSDaNs=T< zlJtsk?azy=LuW)R+6ut#&XLVRnXKqw>cNAC+WFwxHPNoD@5uvLO6T})?pIg(?n=nj zp)(>BY&x{;t#{sMJ)33X?p;T1eKI~SI@;U$@%wKMEiaTRu1vzQ_6O|e^Lc3w`e_dO z0m$YHj0{iE`DDs*R_Bu`MusQI<_iGzT%WJ;y#R-4Xn(+dyLUg}Q&GJhYSuPtAVjQt zfY0ywFwdFr^H+{Ce>wLqi}!rQ`b|pfzu{F(RIdlGqF|a9|MtW=<;p8?d9Y8!qHXoT zm$rR~*Sh%n{(V>SZ;p-%#YhqKnDsW6(i==Cp1mBefI*nW&A&UgtXV|DVK<@yh=ju| zYZgoC4Qkdli<=${+{t%k0_GA4rCh0y-q4A*ML2sB^1ALuG_aF(_9R5xBBVET%9RRp ziG(Xpm#d3lxoQ#$`pFq3bi;5hS2qlDMu||+Pq}KkmJ2RUz+57s7=%f#WH2qu)h#l* zreRtZ$(0NSVb|{d3o$e}D2C&4*Ec8($KzsXa8Pc1kR(ZxBuSDaNpizqu2ZK^al^E< P00000NkvXXu0mjf&;%9Q literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/ushankaup.png b/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/ushankaup.png new file mode 100644 index 0000000000000000000000000000000000000000..a4ebe9b46329f2bc0f456625d8d746290f160633 GIT binary patch literal 887 zcmV--1Bm>IP)ghDU+LG)|Q%FB!*TiPB{sZHxZ#$A)pyblOTBk9f4dpo1U z2!s$qhKhk!&WzcjfYtV!kQH$*vcRQ4j>wYc*C2 z1r`?;XmvW=-`pg3>J+Z)^8L-5$6ACq8!%-$d9_w!HwaiQ6ae__lWzc6Efm-d0)Bh? z)HI}#^DWmz_L(E9jO6E1!%R~04Svx3`gDZ*ZF^1ir@8}QPX2OP)2vMjo-mT?27O%kYAtIW^M;d&m8Mg!Y%_~Pr2fi}ba zeO%8Y8V>0mQvv>2*!{ua#RJQlY-XknFe(7R!ElJ$+vDfEcmK87Ea&qPKr)#$4f|T^ z)heUWh-usYYtXVFiomj%vTc-7^sCj^j%l<69z1$vDW!N=sT{h~j>mu5+&s2lfn+kt z!Ei`6mwR!`W+(T9=g*I=_-~End_EdqX(q1;A%qY@2qA2KraljfUTXKSmJ+p_G}aZsrmWInC|yqc}#C2mMZ|Dx3|Y|G@3kr{Nzb&8|>E3 zj`hKrGtq7k0ANo|;W$n#v13c}@8|MybmmRXA%qY@2qAg=_yO1z{oHlOQJuY^$LI-4)B z-Bk$Uq+S~U%H78Lom>5MYBW^2j%G^$Kzt~ms}jfO#l`2M{kk4PpC)dtYrbc0UdRxF zI6?I^0{|S0RqMK)o04W^5XWM5@fkS=0I%`sY`9(#a>fDRt2$lw(SD5}PN1vuY!JVTMP`cC`D)LpxmfQeNO_!EO+h)Gtarv&z_nMoRJU}*I zV1r!yx)KHz8Is%pP^U_4$&F?TCEEWcOlg=_yO1z{oHlOQJuY^$LI-4)B z-Bk$Uq+S~U%H78Lom>5MYBW^2j%G^$Kzt~ms}jfO#l`2M{kk4PpC)dtYrbc0UdRxF zI6?I^0{|S0RqMK)o04W^5XWM5@fkS=0I%`sY`9(#a>fDRt2$lw(SD5}PN1vuY!JVTMP`cC`D)LpxmfQeNO_!EO+h)Gtarv&z_nMoRJU}*I zV1r!yx)KHz8Is%pP^U_4$&F?TCEEWcOl^^FK zY=O?{_~#omZ$_jlvOKF~WAM4$k|@Df|MR$v9H-)iZErtTMr1qR|E?JJ_;QlnO{Ql% z-e>3R{J(q7%3lor3=P-+x9*pJ<8XhzUqc51Z1TM18f)g+_fBAW-`48pRQq+SR_(5< zjlJ$^=k~@?YiXY0qP>Qb!m=&RAMAAx6xscZZOIhHcZw|x3>EJu&)f9m_|+)sM_b&s zlx97N{BC)i<&<9f8>#ftZ95y^=+!gn#nwLf&*LW`7<-7H;l+|T9hI;DfI-RN>FVdQ I&MBb@0Hc?pt^fc4 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Aliens/Carps/carp_holo.rsi/dead.png b/Resources/Textures/Mobs/Aliens/Carps/carp_holo.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..9d4043029689331d8ee657e3e30e4fc57e1bf3c0 GIT binary patch literal 98 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzO-~ockcif|7ac``60956U-fig uS~aV2b^huN3=Huz)>+3MS7X>P?FnPhOXe)kM@E7`O$?r{elF{r5}E*>vK&SL literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Aliens/Carps/carp_holo.rsi/holocarp.png b/Resources/Textures/Mobs/Aliens/Carps/carp_holo.rsi/holocarp.png new file mode 100644 index 0000000000000000000000000000000000000000..47c26a457fe89ff4ada5bf0e9ca822f7a8c208e2 GIT binary patch literal 5821 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 Uw*HUfP5=M^07*qoM6N<$g14vJUjP6A literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Aliens/Carps/carp_magic.rsi/icon.png b/Resources/Textures/Mobs/Aliens/Carps/carp_magic.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1350ed8543af81a902fda4609b6873ba348b1c3c GIT binary patch literal 485 zcmVJ5FH3wDbms;P|$D!xBwLu4JQCvlnd+ya)A_x4pGnmC!nFBrCq@ZC_({LyHcb` zkk#At6K%+WU=NT%{yx*TmuWLO(AonhsUqdN4S8z;7d;Y}J=I2i-2FXXcO5o3D>cc_ z(yINoB)Tqjf2ZRX1702g`QcNJ$d`m%(1-op5QZ!9@q`oR?_QSuL>IQLA}?5x=eZ<- z7eHDRg%E>*tkH)Z_-&r7{@#xG`>@I=jjJgzoTrgH6(k9s=sDL zciXCMepEIrod9yY^M{G*<833sun-d<=5YYo5echFgf#}3oL!2|WsXlsn0em>k3)o9 zSE_xMiKrD|lJm*L^KAW?X*PN-M;Ib1>Bd_Q=71THawr#M?^&Y bUl7qZ1qtcPwQbar00000NkvXXu0mjf797^E literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Aliens/Carps/carp_magic.rsi/magicarp.png b/Resources/Textures/Mobs/Aliens/Carps/carp_magic.rsi/magicarp.png new file mode 100644 index 0000000000000000000000000000000000000000..ee64f5acf17b23f2e3291dbb046c966e78a179e4 GIT binary patch literal 2899 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 M07*qoM6N<$f+c24F8}}l literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Aliens/Carps/carp_magic.rsi/meta.json b/Resources/Textures/Mobs/Aliens/Carps/carp_magic.rsi/meta.json new file mode 100644 index 0000000000..30cc05d941 --- /dev/null +++ b/Resources/Textures/Mobs/Aliens/Carps/carp_magic.rsi/meta.json @@ -0,0 +1,73 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/d3d351dea8d9420cee47514843a02158d0a7266f#diff-8dd94e19fdb2ff341b57e31bce101298", + "states": [ + { + "name": "icon", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "dead", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "magicarp", + "directions": 4, + "delays": [ + [ + 0.2, + 0.3, + 0.2 + ], + [ + 0.2, + 0.3, + 0.2 + ], + [ + 0.2, + 0.3, + 0.2 + ], + [ + 0.2, + 0.3, + 0.2 + ] + ] + }, + { + "name": "magicarp_gib", + "directions": 1, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Mobs/Aliens/Carps/carp_space.rsi/carp.png b/Resources/Textures/Mobs/Aliens/Carps/carp_space.rsi/carp.png new file mode 100644 index 0000000000000000000000000000000000000000..de6b4c960bb05f431a47c411ad70ae3908cf1fc8 GIT binary patch literal 3713 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Aliens/Carps/carp_space.rsi/carp_gib.png b/Resources/Textures/Mobs/Aliens/Carps/carp_space.rsi/carp_gib.png new file mode 100644 index 0000000000000000000000000000000000000000..f5d2c96041dcc10e89267f742f26c3f39a299ae7 GIT binary patch literal 2967 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 N002ovPDHLkV1gi->Vg0O literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Aliens/Carps/carp_space.rsi/dead.png b/Resources/Textures/Mobs/Aliens/Carps/carp_space.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..610087d8f2a5d50fa5441233b4d84d984f63414e GIT binary patch literal 279 zcmV+y0qFjTP)e<^Yin70RQ!SNklZw*bdG}E;?ypgh2me}rcMr0+pSV@5ft59 zPz1H5n?$~g7gL)wzbXjkgK~ZEeth41clRz7;@?BCN`R(Zy3R|bD`@+YX1R_Tg0gDq zp9r!8AP+JhmLJe#n8q86XpR|L(@{H8-~%$pPOP;G{vw zeGAy@yld;R6#I`hCCyuk`xOBopAn-2KG@mxmSH0sZbf(!0CF+5K_xXuFTFS82OEAr zB0L>JL|Rhx?QL8g5A-RDKxMh^Y5xJ&891PvhDdjJPAQ!%&_&~rnky03!iFFH7&mqS zsCbGga*#@r#B8*%c}6hKONDg31&9zNh?-=X`GjhfwW2IDe})PJ=U}V?IC`qe2sK6d zcDCEhPuZf^<=mfv`~EYFZY^8X$spz{6R_b&KgM~1<8#dS^Ssj{adMjZo^ESHbLN)v zx|okw;zi2*P}x1lBewwLxaY0zqd^>5Od4cnfEafl{Sb@lSfQxnw}PzzPR>(`#c{_o zCr4V}W)AO%2+T`h9S0GX9c8(0kn_l_3Jl2X{1AaHOGIY%0;c9Hxf~Cn`IY+#kocMB vTEJO6&Q#l#SGx}mKAz7H5hBFj1rdD$P>T8GU(=&s00000NkvXXu0mjf2YUc? literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Aliens/Carps/carp_space.rsi/meta.json b/Resources/Textures/Mobs/Aliens/Carps/carp_space.rsi/meta.json new file mode 100644 index 0000000000..66407ac9a2 --- /dev/null +++ b/Resources/Textures/Mobs/Aliens/Carps/carp_space.rsi/meta.json @@ -0,0 +1,73 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation/blob/master/icons/mob/animal.dmi", + "states": [ + { + "name": "icon", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "dead", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "carp", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "carp_gib", + "directions": 1, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Mobs/Species/xeno_hunter.rsi/crit.png b/Resources/Textures/Mobs/Aliens/Xenos/xeno_hunter.rsi/crit.png similarity index 100% rename from Resources/Textures/Mobs/Species/xeno_hunter.rsi/crit.png rename to Resources/Textures/Mobs/Aliens/Xenos/xeno_hunter.rsi/crit.png diff --git a/Resources/Textures/Mobs/Species/xeno_hunter.rsi/dead.png b/Resources/Textures/Mobs/Aliens/Xenos/xeno_hunter.rsi/dead.png similarity index 100% rename from Resources/Textures/Mobs/Species/xeno_hunter.rsi/dead.png rename to Resources/Textures/Mobs/Aliens/Xenos/xeno_hunter.rsi/dead.png diff --git a/Resources/Textures/Mobs/Species/xeno_hunter.rsi/meta.json b/Resources/Textures/Mobs/Aliens/Xenos/xeno_hunter.rsi/meta.json similarity index 100% rename from Resources/Textures/Mobs/Species/xeno_hunter.rsi/meta.json rename to Resources/Textures/Mobs/Aliens/Xenos/xeno_hunter.rsi/meta.json diff --git a/Resources/Textures/Mobs/Species/xeno_hunter.rsi/running.png b/Resources/Textures/Mobs/Aliens/Xenos/xeno_hunter.rsi/running.png similarity index 100% rename from Resources/Textures/Mobs/Species/xeno_hunter.rsi/running.png rename to Resources/Textures/Mobs/Aliens/Xenos/xeno_hunter.rsi/running.png diff --git a/Resources/Textures/Mobs/Species/xeno_hunter.rsi/sleeping.png b/Resources/Textures/Mobs/Aliens/Xenos/xeno_hunter.rsi/sleeping.png similarity index 100% rename from Resources/Textures/Mobs/Species/xeno_hunter.rsi/sleeping.png rename to Resources/Textures/Mobs/Aliens/Xenos/xeno_hunter.rsi/sleeping.png diff --git a/Resources/Textures/Mobs/Species/xeno_hunter.rsi/standing.png b/Resources/Textures/Mobs/Aliens/Xenos/xeno_hunter.rsi/standing.png similarity index 100% rename from Resources/Textures/Mobs/Species/xeno_hunter.rsi/standing.png rename to Resources/Textures/Mobs/Aliens/Xenos/xeno_hunter.rsi/standing.png diff --git a/Resources/Textures/Mobs/Animals/bat.rsi/bat.png b/Resources/Textures/Mobs/Animals/bat.rsi/bat.png new file mode 100644 index 0000000000000000000000000000000000000000..404ac148c73abdb6984042a23e455768b33167fd GIT binary patch literal 1102 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrU=j6naSW-L^Y*TPzEHHxv5)Pu z%N7a>FJcs2IhVoF^Uj8Z%S)u+Rqx1uxKHJN(|bpAz1SU@k9ud`>)E-)wCwT`Df0<3 z;&+&j3r>)Hb|&CQT^LJ7-ShKb=9GM_)?x(O0s_-A*nN}Z?ccMcT`k{!Q{Hpm8^5ZX zOgrBH-l8o%AuQ~(y+=@i#S5=Vmi=x^x7@#}`gTDkAOE$uLuB5R{M!=ubZ>JeS@rtuS9RjrS~sgpKpxYSGCsf z!k4K0o9VO9)xXt#U?Vkk-Mah|u{f_uhccFAEnRcD&RhPF$D}JGW{>;2NQ3nr`k ze%`O;g9Hl_*`T{Y`|Zmo%y)vGFpI2-()6D7j5*{~d6%4D*2+(eODf%0#Wwu-z3($) zj`Fg#@5_!y?c3cFTUp8)4YcrL!()EOIqPc}qOJG6IQ`=u&uyi5c3&#DwEdo8|C539 z^<;hl=`(iEnQs{0xL!S-KcK|E=HA!sy7CKNd}T*+0))9^YS~g-+sic#j~BbGi#7cC z>vziQPmEGuXJy(}YIr`oTrX}tmp5T+bEe&a+-X|!56h<^cy?*pre7$@9AM=BGEo=2pzLuEwl-c96utERi+td5k{y&(hp>SxE zZop|Vh4n{owDR6?5&P^vC$FI9iosfSep5MrF|j|f6OOE_yvKQ_!br19Vx{Umh2OXB z<@`(j-;4E}w3{LCcgZ#WhUn-^hkg~>$vY`aN()@%oOSQ@&l&ZPv=8Lg{}XVtdb?f3 zP1*DE9)|eY@2}N~*<8B(tGV^->ZzaBu3J{{_fS5`@b{|67L?Gy&+R(+rB09ld^02AO2X8C^oktuchyOyZ@=Qe=CLi^z7<2 zV}0V!y*seyUCr#Kz>wP4*Av>7S#s;|y?%Gv&-ZIX69rZ~sldabA?7bb##K?-+Av*E PIlgTe~DWM4f5}OuT literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/bat.rsi/dead.png b/Resources/Textures/Mobs/Animals/bat.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..9c0d4e458b8b70b629483b89d5b2d806b2006b10 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ3Qrfukcv5PFKpy(P!M3fu)dI& zOGrq_o0}{8?m@vBmssx{NN_r+ke-^ZB=@#n^la@vSqB#o;5sK&S)KjmZRstZTL-V5 zl@Ap!xYn`R?a{VVHoZ&?n&LVKm7g~4Si4B~%GH{EEc^^N`ac_gIQ7){b2($KMPRSA Y?i9I0+Y&--fNo&$boFyt=akR{0R2!wQvd(} literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/bat.rsi/meta.json b/Resources/Textures/Mobs/Animals/bat.rsi/meta.json new file mode 100644 index 0000000000..127fb60ead --- /dev/null +++ b/Resources/Textures/Mobs/Animals/bat.rsi/meta.json @@ -0,0 +1,50 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/53d1f1477d22a11a99c6c6924977cd431075761b", + "states": [ + { + "name": "bat", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "dead", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Mobs/Animals/bear.rsi/armor_bear.png b/Resources/Textures/Mobs/Animals/bear.rsi/armor_bear.png new file mode 100644 index 0000000000000000000000000000000000000000..a9513d2c825222d8006f191292570e85815a1e2b GIT binary patch literal 1222 zcmV;%1UdVOP)9kXCbog(rtM)oq;EUjZgyt&N4hclLFhI+JMYcg_h!C%^8)lZB2FLF zvT0`iPR|z|_jgwE&pQPj_xv;j$%rRM(X2O6D(FaMGz<<8 z0f4f6B}Mtcuf174_3ZTA4BM~mLsbbC`SIi^Hdi)~%4nzVmkK&2XQ!}R{vs{^oD)S# z1s&6KGbdbddTxf53c8c-ltF{vuk9Nj{(BWDg@B$fM(#eyF)I&Pd$Ssuo||EV!$Wxe z@|ABP(5yFLPP|%^wQQQv$B*_QLWJmDbS#787Ul^}#01;5F+;c= zc1mx(qQ%tD*u=Q`7Bg>$iG%QMMDnHb0UQZpGJ_#y_`SOuj7^N={i}Dz|EY{d24Q-> z7~$pdNg2ux*}>KTS~hL)@6DAB#73@2D@|#uTBQmto0c-1mHe@Zas2xJQ##wjw`q?c1ST&~Y((@x+_Gox6jNTOSP9KKg6q3kj)=hHsy~+V(Fr zKq{l5RM4^a>$mh9)bquNo-g9k)ypiE(OiW=GNU>6006jt^M>t!I%otMJe@)l z<+dV0A}CW~qNPWin*k?xU4VZfVXh7_*C>!~Do{QfBrBH+dfV->-v%(FR;ivSn((be z#;in8=w=Xg3ehc)a+k#?t;y}#yEK5{x*3JS<2ywFz@w+)@d*z{7oUK|*Ap1I2Fwo} zx>nL}%nux5!6>x>G@)W z_fTH73LmK-Cwn kHR}*mem58*M2OzTKhONe)VBaxZ2$lO07*qoM6N<$f~Y$}F#rGn literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/bear.rsi/bear.png b/Resources/Textures/Mobs/Animals/bear.rsi/bear.png new file mode 100644 index 0000000000000000000000000000000000000000..a2eb0ef3c35be0f66bb2cddbcadb18083e27fca4 GIT binary patch literal 2759 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 N002ovPDHLkV1fkFFBJd) literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/bear.rsi/bear_dead.png b/Resources/Textures/Mobs/Animals/bear.rsi/bear_dead.png new file mode 100644 index 0000000000000000000000000000000000000000..2e47b74683ea5b09d5e17d670648a1fc561525fe GIT binary patch literal 1105 zcmV-X1g`suP)jIEUr2y#ldH|HmWo@SP#P@wFl}g;jDNSsVR1Lb{H8M z!M1I}Ff>^J2*Z#d2(WFN)z#I0a^N6a&1UnpA~dIz(y{?6l?tBcVcRyNqoV+9Z*TML z*)tr+!Eqb_e!71jrBs4ElgZF-x3O&-fNr--xm+fn&znr;^LeF*5JJt*&r_*X5JIRl z!1L$Njk6OcPS9?*@jMS91gTVt-Q8Ur$Kk_s=h!|hjkaH2UgqrCvt%+EY}+OX0wY3~ z#Pd8ZkL_^x$ta%ZvAMZPqtQT0X<6}<08CF$8}h?FGnZ2G;>8P=mX?f&xw$zr&*gGF zefpFj2vEwnOrYIv1JG)de)oQq|i|e}NaybA# zy1qa*n>B>%>+2@4PN&1#+8X(Mo^rXYjDUXZ@9zT#hfYI_0I)18Auc|CzImG<2-w}- zrPJx)`#!U?vjFVv?NO~(6I`#{1O3p%mi6*bTb4zy*E2%CefJwKKE9N&dHC=l_iAUL zaE1%luQNS8J<$Ka4Cvn1QR z)9rTYcDt_^pb>^4N-3n2q|<47y&h2%nU;&9h>MRe@%4|V__+0n$yhdPQOyhq&E!1L5pwsC92M5seyo61E7o>#{ z>h$T;z(HSUG8r~DHYgU09E!uTEP@~a4lbynp&?SKlzt-&;^exFT7dCCUnQlq z(f}tW8NFFV+EkeBWn& zejb2EqoH2=7Fd?WJN29VUjNdhe^A=vCFvtyJX~Ige-AV!SwTt}Cm#gOx!C_=EtE>7y8a)K zQu5x7JG8D{F~mBpLWp{`TIJKxC*1kNK`C`q@&pDwnG2JXlXZR3XvFHdD1=b=YG=6n zWb~g#ek1|VS2InlCqf8SsZ_W;w!>{d`^MyNg9Rak(&H}#9|>>sqZudt&mup@zm7iv X3N!EPjL>Nm00000NkvXXu0mjf0nict literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/bear.rsi/bear_gib.png b/Resources/Textures/Mobs/Animals/bear.rsi/bear_gib.png new file mode 100644 index 0000000000000000000000000000000000000000..75e436ca6a26319c19bdf28f3ddc44cee5c29e5d GIT binary patch literal 9926 zcma)Cg^ervi#}r?j*nJ%G}!(%lRll1dNV3f@wQ2uj z#pYr~K40w4&CzM)4$p3W2XSu@**_8$Rn5T+Wo{S}C)j@F^Kpy+XWklf7@wl$5Sf5_ zr!;qor?b|og!f;x2DK7Zp#uNg%M*{QJ$KE#V|Sdv5L8en^{Cq`g**k6L?EeN2gxJ+ z2zho2x60L%t5{{0r%R{nt|K9${NZ9F zPfEF&jvin=or5bkk7g0oetblQ@ZlBRL|*mXWe}|GP8Asaw8i5#ZDR8MPmfeyM<=<@ z;>wFa7|rKqujEl8EZ)Pjbq+xIEd6_p28b-VU}R-wy}a^1`V&Fx+=Mm=Nb0q)9d|k- z#ShDH63od_aJV(l_1LK+^n7Px1KuB-F=J!7A6kGLAxDMk#mn~!u607i2?Bhdv$JEx z+_%>X5+R?jwnsC=mX=J7tJ~Y9QpyE-u9oS3!Ec?3(dgMCF)gA3Pq*x21dNb;iOi}g zPwh@S%zYjudgsXe9?fJ&Hfjt)yeMG3)008&gC8GMow;-0y~i?zgY(XL1Z0T0vu=+= z3A*aUz&)y4V&uH>TUW64&Y6V2@y?;v4WRVjrcaiI@o3;b+va(%Jaf*O3 z7Obrbf4%3ATUi_~#HPUw8bCiq-ueO|8?Z#1zq?auT0z03yMF7_Or)2H4cL!sX)i)N zhy%cldvtU(;7!v0sR$2411-9NE}5@`)9CIS7@()g(YV-QJz(gMri{S{f}p@IraT~^ zb-ab)Xs3-(I7kr!lzje7rk=rz)nx3}{WVl+254~~rV zw)vhXrKhtQ0)2y)xUvqq)NKOGYxBn+6jfC4tQlSrhLb>W=P?+8AoqQiG>={&L}%d%@1lt?25?haTFMgo|eB zh%SOmd~cel;jTU*dApF@9ij*Z#I*{sxVRV}@9$N>1v`XLK76fNiXgF&j{DHjLO^-z z^&1Y8jC?!t=&iG}u;Z18lSYUWW5_o%@Jq0;uzY-b3!-5g$}D80a)bWBv;kbfRS30|p6Cl|bi-#I|DpD2$fX(P z;XB*7WwN_^MRhbX#OOdGEXa-DQ_Ro#7!sc` zB-)Im=Gk~|Qs+Y3jMF6Cx7Ar^|B#i*;WycS>~zq?TrKq{b;AGnr)61p)CRW^2`)7v zBBFG8HBLneJ0Yq>MF^6C)G~N&)k0E@IJuHN9ebwf@I1w<5nz&#pzXX}J~`du34T(b z7%wNu5H)|$Uz;NG>}C!hoc_jq=e-aW*MBS$j;kGk7@uN;vrfg@5d*YtDaBy*R^el- zYb_sln4pRoGZR0Uw2+;&Uoimr_4SkmN{NbIUc$u;kdXaKeZ4hR0Fbf!*3$A{8p5w# znKfmh;k}9K4hHopVEQ6p+0U%M#LpACNgyaJe5r;zy$&YSK(Sad1?twzxqGhFuxkUc z_Nz#ZTFkAG;$z_LrOJwDK%o#C2u5Jeq(N2UzeN%-yKD_p{`Ohfg~Q=NB#__SY^dX7 z=cPvXk^J=v=qg2ssM~Y2gghwpD7uCg)!p^bb28RFzb%OcAR=ClfxkM1)E|GyfcXCy-HVu@@?GE6v&}tl9QUqA#;<@x#bZi()8W=}Z zS91rfUyUu`NdK&@{Q-tj?@D+>=BdF(YZiUCrFI;nG=m&2m`HK-5>#M#K3}B_v4G`F z7K5poD;e{`u)2$vFb5Lo*Tv984*@Fw)RXhb8x}M+dQT#nndmeDo^f{AK}{zyP+DCb zX+@3P=LyRF_<%Z}7!g;-6<7~Ng{mXcPkg8zIyTM!US1A=krBTjX(9#i(LKS~7fJbR zdtNP53pu8yb|Ghl*sG#iTU%Z4QNG9k2rjb=ye|d~ulu4e(U%ZWgqMf0?(ON>eQ*I! zGjT?<9PiPhxet_RT!RUm$bgB^ae8Zyk{Jxzx1b9dJh*tOYs?W^^ZJwg(@^=RXn8dg zS+;N9^d4MXmW*NaoE#rB=m$8bw43vsot^P|9U39;f_`7mlRfyu?xTO$z^sio1pa}@ zNsh0>9g`B;8nY#krp=?ma1CYzogA*3vd@|H14Rm(7K66r3RlpZH*Bwu{`i`mwzjlj z(|0lxSR>&5-wF#cErRz9fshi;3IG6iZV~=37m%y>8|J9(85O0RI-2~(#>X-8a`)11 zo62~a@?lyDPk<%lDYhivt+4w2PF~B~}INMeO?>ojBtfn6gc(z&D>4ilIJ83n(I1U`Wh!e4~wU_ zcWGl}jTD5~{hLE6h^lLX@BjA=Gsx~9oYA8NdPpdU)*Q$Q1BI!yXOn5qPE8FwCJ|!7 zfD%aGYt>v@#cSU0jS@ddcG5CF96xRlO>hNj=3i*7B+!YGfpGiw{d)zF7EnRb+!h^# z02SqLaIqghqO+u^JV{z3{$>JS_zg>7x*iK|vPbG7+ssjai=+l2m9SORR>f3P1$1R< zDm3;n53%a)KLCDC7#bdUOJec0 zMd`!P!#H(kLBXp51lj^zE0Z4!uwA$Sb&C-wgNQrv)UUo;AVCrbVHE@b)z&e~4Ei7x zcLh+63<(_{*90!*GF}U=`W6lXh=f$0|s+vtWd2FHOa!6}_8sMBI|Ys;!H`q4ik zjUi_{J#Ia@l)#o*06-KhMeJI~X zvy>t|xVn8G!NZV9`}g5<0nVg04J%{!Qx7j>wM3*^mY(g<`)2jM=@2bDYzZE|6k##M zB#%a^TFh$|Z=Mvoi%@uLbIrOEK2N{vnlFr^7A(>~X!9pXqtNjiFy&8F>BxLs2FKd)x0*orpX7bVT zFA{F6?(CYPxjChD+XwUQ zy)vYJE&)3Xo~7g+PoVTFZRmwVDman;ZPeB`a6E|v+Mnv7^%6|@D>3^rr)Uc|3x26Pn{+I8-RQuM^0Vy)`LWY!4(!Y`B>wZ!gsx1)$>>nINfUOxg z)|np**$;zYXBRX*gR(Hos8tFXd=f#u<+E;yRlGbWSXS9|-{tPhYxQ~(evRz(B8aQR zZ5dS1sGN!ZrRfW-gb9=*V;{J09E%<0Op9a_JUjILo#$wiTP1ohJ^KCH7Ac2>3NJ|u zqS6tLgqpK_uNLvsoOG~19P~Q--QVKJR1GA%9Ts_rVGoFdXIM&VQa+ zLROCcM50#SpWU}D1;mL>89rW5x#qZA`>Z|`#5ID-^Vv{gXyJ7MQ&O7bi%H$eK|%R* zlE0D9ovP8@6!!2IBf!+Egnn_v~pyU1sq!YV+ILOhNM3 zF*oNnsCGO+#?|?UVW|k@U4X1WWeX};n)qU$8}Wc;)sXXFNf8w0O;WE7cz2SAUEOsI z4D4Ku#2}WA61xROv^5%-@}10o#OdB<1a>)*tksqnM-U_$M*{8W!j7p451bp7}A&1dYG7 zpH#IMZ5RX$;k}1jP3^Th47kiFlG^l*$v&@9AGYX430lNWspHbax^P%y)I8K0eI_4G zn!@*ZNo;Y+W7rg}vUzXDYEL|8^#gv!-ptt87&bJS1QT7Xeq=ivmNIL*VK78U+A)#E~9 z2k4>T8t41KckNZZujXS)z;_!(p`a#8T>wRJ>`5INvrrXw2-t?C{zT93eu@fn~jKIF?sC$vc0+%I>XtO zSg)Xd@w)PRrRd?Q0R!?P1Ew515uw))@5yg4-mxGxR+qW6qb^dhT58yqhz2oKDu4p4 zOi2%ST$_QoZg&HnzQ-o+(;speyZ!Zsb={`@KeYN~4Sbz8SOPm^$qUp8AmhCMaxc;q zg>)tG0!yW*N6tr*;awKFtdrA=zreyv|Fa;HBhWoyAPiQO?Bc z$iKWaJSGwa?d{8N+p;8-)P6l*=H=w%)CQ>&Yysl&^p>f1s{ z5x}n}p$6<=rDB1t{*Su>htD_(7FiSncgBG|gNWugjOWxJUD$(NT1Xbw$&o&zG%>3b zyy>Nk_B=QuLW>`ASZ}?|%@2Li80Cn$V?TfXd~keRQB5t@Bexp6h;+393pjQ8)t7aA&|B5{?$03z zJFmQ7qXG79O?qj}QE_RZ`(;HS(rcxT$$@kYT3IAY)hz#peWjp)#qj5bj^PqFKqQz; zyoEv5_4vQGh3jZ6Mj(xK^n{I7>(!ef`53LcSCUJ5ybKRDTS9`Ic-fu;!&tBnBaar` zoy6{s2N}8WYQdc6gNG@BLiZ(d21l9`k2$yx7xkOA#>$~5Y0GPcw0ozm!1b-Q1pcZ$ z&lmmKdXNk1qBI@TgrmPrm7<*RWh#w+$W@v)>-I@TmX?>3feBnEk6p&ldX83J1y|GL zoJhAUJT90j)vuQfDT>r?-gtG%Pe(k`vKItWBRC@ku<4Y?CZVdP#37i+@7d-wGVAy( zP-0ziv~e-*CuwJv0Lj|`X^JbiMW>J6rxE$z)7w|{Z6F`4U)^qXk%w>+ZnBd-GmZ8s zY3(iuU6WH9{QwqKT)I0d@}+WcxDR1e?|=TI5)nRYJ%!c1D!98T61I|ALx??J35J>a zcH+G6ds)X4tF`OsauZR#RujzrzJ$y5>+-~EiSzP`R?3rSPiom8B(=NuV5os^%Ts&rF0 zI0R_2H9a_HGz)UXQCU3qLaI|%^|Bq#D`m1a6&yS&`(<$`*a?~qX{@djRa*-|8-g=j zM(pX`s{xCWgtee6_KJ!HGBeH;v(CVpiIEiwA_3_vBzm^OaK!Cu#lNQXvim1Zv~OJ9 zex40Ex5KBmf{r?G!qo)w?CD@QH|oGF%ojJRmqSwiX>zI^#n`+251B>=2G7TmK55lv zpTNP!QHVM7i5X)ll2h2?%vESYqtFo>s9>$m*5UTp9+2ZpY+mONz7KeGo`E9==2>Z3 z*^h9Riooxf+Q&^B#A>C<1WEJ>%k?gzFSjT1cxZkmebjQ~r-vXcMUbfx6$gUVx++NJ zt^HHbm@(&qtWPpkj7ZfVg-`rIbI;B=^)+_x!L=~Ba7O4wdkvK8GWb`Ql_jr&N!q4V z`+lX(_X$>*2ejLpYPOzdJ;hzIHeA^g@SGnKHoVovVB1WeWRQFuR33HSkE0k>gCCJ1 zFmSLIFkSt89#fJki6cnWr-7LO-pTnG^dufzAOi*Vd9s~`HQb-_p9K7CTD3YFR6Ftk zUcJOLAxM~t)OLkBhp<+V?6P!~61>RbcL(3AelTZV9?XMKIhw(T5z<`ezZLrkG)Bzf zc~btb;W{WQ4OvnUQb0>@q1C&_R8Hs6a&FHHmmssD>}kh*!bDZYENPdWUWB zZuCP-L715&znZlKeS}{prQlw#5GC}Mn@LR7TS>Vw`e;|fViLEv?H2=+9T_pX_^#c_ zS=GD9Ywp;B>dt~B&qoFLsbnBPKlcaCh^6g#LUxLHG%_@!v+{@wJD9A% z(S4X(Xbw93@{CU%gZx18^j_@g`z*KVy6;%&A67ix8}ZB^TbSvG7U8)sUjN;j7WKb; zY3{p4+3etPIK?=EYGJ%f{14cUB`aMAwOVD%n@6gus;9?)zdt8P4~Gtez}~-yXM=Ed zq3dW2Mo(iUqyq(}rh0B9%BE_;?+U-}bq(*E`HbX$8UQq7o8FIk+g9I$EItv8qU6x_ zP|e^Sq_W6(+#L%|4EaNtVX_&F>}8CL>Tr9U>%09V%>L$IzfwqxeNq6bJW;_P^q`Mu zd?}6F3A%q&(hd=ULyGVv)`5&sK1;a-4+`$t}N8h7o+3T_>xd5SWZ`^re?sP2;PN$aVkOPob5s zCo{t+q*nquF$A%W9i=?Dc{i~ePN5)jK7bre#cj$i_caOhwi z2!gFLW5B4%FJZUu)HU{u%D!;`8*Rl#C<*pXSdH>w z0Qt|WI>N0UCAMV!fbq^xT7hcFLSMSZw`HFXZIn(|JFZE9Q7)@ttxnI@Cu!{*-eN(w z&jnVl2WUU!=jQ|N7J)Eu&0N0c3b*FB|V& zD2|Rk4d@kutu()cgjEOOjRnJE92F77asWwykM9B-X?0yx^Vg;0HiMmwQL%)aV{L>I zEJssP4)KFiu8DgRV_=aH%4O1!G0#Jw#K2;HWl-sCmEZhiOtrNv5o}RsI{$vwc^nhH zkh`2F`(f~-=tKIJsQ&@W%Vy4y3spwa`i2I0vq*wflvY@xSs8r|x5JD-0oBVS$GDke zuxYY3GcS5xx^{I7_WKb>uPdD=#e^TDdrFNSfdnQE%bTi-y^Ylp!!5ryN;h<9EVV2(OZK=YzL>2#e>-fR* z8I5W$zY>(#0c=YIQ?qbHC!i8GJ7ZIIJSCGjD8Q1+pMAaMg+I~XhutnGUX zk>WLX22gD!%N6!t-QIDSbC`MKZ=Kx=_T~&P&VIE9bqQ?w)x~cY(RVr@JmT+5zI3N@ z=$Rr6j@(z;H|-OL_xV2@!tXT;=N_FG=2HDMk=q}QJIazK*PX8O7$U;Jep0MOmHbS0 zHMAqsR%A_5T6$Y0FYh=l66=&E89HCC$5lR0__v511F$1Ff5T7D4h6(#1@zHNvEM=T z&|w8yEq|YB?(>K3l#q*UmAFevm`CaY0!4L7CDp&)s4|6gT$GkO;(X3?Rx$;yOA$-GjW!4*=-DiJu3w9m?Oj!I8>OI1QH!*t>KA`{<|wGf}FvzY7x zW(g+|`|U|B^x3O;X}e@`RwbJbm1}}FgHUKAN&|F_JzWgYW*nFpD%S-`iBc1=3+;BT z%!0&^Sjr?kLoO8X+onAaj3{e4LgMVBT9%CkJpUVR5hX{fd$xitf{wf3lpmV32vIjo zd_mr)7vmYf4NLO1L*eoh71IuccF26%?<$ilMK2v#i<$A@PmtE8t@L{Oxa;eT%pN-w zPt|*(C&?Kjnwa=hBcnJ(=&G&rdhf3^5A0e8D@i0Pcb#*V3zBR`7U{vI*~62#51|ZOEfVqN{BT73|BMIcR=x6w?aNY zt`L`YruLdP1{n=6H?MlGA4|LO?`ZfN?b8BT}9y zC(aqi^L#4K3R|qICan8-l$w{j_fi|m3Y9#lh zI42%<&=q{ViZfCiKhDUQ;q!`#{SD!kUgp}!!ON}HEV0fJmo0h3-@j$c7UJ;%Z2g9r zu9PrZiqvy=XyiqR_vlm%w0+!EhR+YqIExAl!Ib-B@y+F+-wh{X1|p=HomV}x?jgOb z?m{NxS>JQptwFoI#P*VHvBt4L{d9Q&sgBS)%;XkXCRX=O#F5>-;HOwyw|~QwkUQMy z2PLp%CC)bqT1s`TK!fgk^{oG=ZWyeHEZ?um);adkgp%;131W>(dWsNX+=R=pg(Qp? zGmmGd80MAL7D3WgfRaw+6CAH!YigAqV6K`Gp|x6loaplCGZ1&c6B>l~6?}4H3+XFy z{HRY7@E!f-5}KMwY|Zl^e4f9T1l+Td-@lqnl&igHO{Z{C)W?Rt#=!7wImDbCH=Sa` zTa&>Fv95vn-5ezXXD5A)*}T=7!0gE#^U7)i zQt+*&Fii8z2P3qD(JS9ppjDb9qiuARmI5HD-8MmVSfTziV3??$GBu;@q` zB&jJRo7rGig0)O)A z2QD0M*!DyQMzG4{I4CzPCVx>#MkKmkVUwCXt^8Tj9M#=Z&+k`KuGBS}X!wR+2UH1m ztfGA1rsXtS-89ja^Y$<&V@PH>X1{p82)XN?mx9$N{SomR83i+teS2?&?CkdL?1-)n z4*qf`^@$eqU|kLCEN|u97E6fCsv3>{w^hjIMe&9LjATc)YUH@ZL=u{`kD{he&;$hf z8i^%{-{0TXrM9iy3a!wt`all?d3Zu|!MiEX2x?en)Yh z(V1{zb?F9l9YNzcIu(W0^LTX=DGpY2dTS8;Z8^vELi0cAdj$b_iPNlzn%MKm-Ic|W zk+M~s?8u0Bq{<>j`<2BHQ1IVJT&nmf64t+yi$}}zaE^Lhw)iT=muoDE$Fz8pX-oBL z?lPt5!J3Dd>z?s5?$w1($CB-}9@`D+i%d`t%MW75LN4s17v1*l zie>D_QZ0*rZIK`PN)|m4{zNxLjFkQNA)7Nkd|CoEO&B_jmO4IwD!{_j3*QeP$+ni5*{0#z}-F&i<`MQhx zp=%t=IgAE?^pt!&(*X2r`kIjLZIHOPoB=9>?ZVq{mq9CKZcN-+7k7mFI(0)L^J#h5 zDjQ@^!FV52dn`RWZqG?|-{1GJ?e^=i79(c>#Q%D9rk(K5I7OL2P(HF;#$4o=?^wC& zW<0|o>aSC1P1*y?dhq^W{JBT_vmnRJ?!&(a@zM)_AJ8P#1ZoLBuIPimPXkmGH07)1 HEI7y*=}Yy!**jrL&0#WGVMvbciTqy_wlJB07vMtyEd+8*Nfepym&p#(BbKKcRD{Bvp)Li z4Q-+5hngX&-Qm$met-G`fBDTJz)`@PfBGwLALt|1(!|M&*ICZlFQub`nYs+h)XwzxG{9!72ex#xshp4y21;?Kvf>gs45Ee z5e+OW6#Y;N0C=+S4FJ2Ie}-50?F8V}eLLCp{4>7iwS=MTShnK=R7LSAA}m5H;M@2* z0EUKgq}oyp=JKT4QVb2{e9u<`mTmh!MN@~$QSbTS9`Z1;V?F?64IKe@W> z>)%U%N2bGF|Ei+6)}R|E*{}1V=!c2|Ud)9W-}f6s_p2Q)6iS^RIKo$hP&0L8Z;#!( zZKE4@?mrxNpRHfp?0&D66-fG{g&B9<7j=XBSoEh z)0ky^Y`i8)kn{_>m>>HMlUUThl67H$Wd%|~;3y!?-Y5LjB*N60otXxpInhiq*&1}n zP$=jEVHj?EY;p#G`dHN028e0FgImR(((40gkqEQ8;QoJyoQF1;hKUx@(6q=r3+URo zo^m;R7?gT_FJ$KD3ggWORF(8o$%^zt}Q|*o@)^eEuvvtj-t;EWbtm4y#KET z^8XjE-E}>EqN$;*fQhCCz_E-A*X{?(73-T7*b6!uw~h zaGsY-uNqyYe`^!W~7&P_UUP6cDBkHfYh9>ljzft=FP%EI3|R7`i^M03zWPUMeW2 zspwW^D_qnG?oN03Ha{}Ulfnbow(SaUSr+kl-0fE%i;{jSS#_0I(l6+u?D{UX26(I( zRZ-kzXfgT~qrmu7(KnN=t5-8UG4AUlg;!PoaB`=%6qKgGUZ{#fOjF&0NHqwQ2h_)+ z6m^61S8gGM>4ZH?xF)Y@5mZ%0n1Wf;8~&mra+hieRdXePI#kObeXYjo5uQR)ipaWeXnr3uw3C~KA;QBmk?RD zjq0fzR;7T3x+vpQMMfuQFik<{hBp58_kS^6oJE*|qOMb%)hQGTOce?k#Ukgg+@fT53ot$BOsz^g!b<04~H%x))oo&lvd~%vp^An5~X3&Mx#^dy4|4Q^LPR-ADK4))f zUrR$>jHZSM$tjuUYj3s;c_v59ab5==~9= zFa6ssg-iODW$|cYsv`YBjP-5ZZ13OMNkmf_nV9DM^=#RLhu!H8`=#w^T30n<3X6|F zyTgUsUo5#GvJic_)s=Bx(oeR;De7h*`hoI*3%9>eiiTl(3!#7&*9S zJDK*Rk4P;~f)+z*z0Z4M6%>IL@N##jy{|h>=GiUW7`l%vl!9|EztT$Z7Hh$&LuQ`c z!a<-V-e?Cc#DsQ&gP-4Zh5z98FuiXaU6$%^7)arJ-#E$#w}$~|_6I+|8+xozOF*8! zNF3Ul;`P^G=g`)a%NW#dNt7ztOWVt17*u^Y`efl7zKyTr(AE@NGMm|w*$lw3+Y5(MftvvkBDTsI#QR|Bl zUX(@vS#wysx|y^8ydA0(AE@KY-JLf0wJjlcX5U8`1bpFGLYC%(D57EqIqRjBnPjq+ z!7p=e`|F3JD{28xt!;7JnN97!Ls@X5K@e-G$_XZut*mKlBjfq)>xZM&3{^EUo7&y) zYuefX<|!cv7S&F<*_Xmgn4W^^>5uF%v8` z{d|6eM-LtVj_{hMfhEv1jlo<#xFl6#FqikyloL=Yd^z6BVbLWZLz{$jcwIoEb@dz( z9W5Hew!`1is}{B`(4sMfp@ZruA)g<4%%8_Gmda3yiWcB4YwyT(up`sq?zptM15sh< zG&VW$x0ZVXId)@Hvm?BRhm#ktyZn{oeIYEWfd1?~<^1(5BNNk%OiUvT17R2(?(5;$ z@l)8gAl}l77LD=Vi8CDT>#16}pg7#u!+R&rphaWETUxPg!Lj3~INaCc@+bLSsCMZ^ z#VAl(WjVNKySug;ni5P;j-e>h5^7rxE2S|#IZi`U!uPwk9uOoe4U`A$>rT7obpE=N zWE}nVA(XjmD$)@hJASIBsW3QIAGslt5x^D}NB{T%055HKlC{=Vjhq|EEZY1@4WVkUHUG7mj^Fz!Z6s8=~&t|xy5c+c?k>Q#N?&k2n&MY zvBEryE1iha{)-`WNepmLe`N^LG!2{DT!|?M8_P%A%Trh^s({hLbXm{dwQ)UI!ku}5 zk%y0}VxSsGTCOEnqU^3v7{<~Pq5kYW<>bZdW$SFG&wlDKVCV=#=lqph?CVZ*=JL%j zvV_8!%QxBAop$ai%+b{}jnij8o!3{3MgzUPRn=~=XbJ{%dA@u2IQL(P_3x!MHa6zA z2XlGS8`^4fOALH3ExH#I&Ro997h}#1?Vk44q!MukbNLm?12XMNhQ|tA&3y;J=0pQO zeQ_J`_`+1sSN8%tLAeaPS{@!AR^HmblisdPW!GS>(6wN3dj4`4%;lG@_!4-=yvNS}Pv-AMH9Y5v%rY)x0h z4PoKZ8114>frLn!p)pdEfl-`7hqlhNGj!(tb@Aq1`r0QLYIM_Y^>WX-=lkw?=bU?C z2Rqoo{|qT;@oaCGvtBo_9Y?Iq%;y7rw+nUi!uf%;^VaM8NJKTXa0q}zRHLUo=>SYj z-WEbWK6cmv*ta{zX4^{%7(RN)>1y9gNKuG{TvJUq0C@lHl;pDNC*e0>xRfexmu&Ho3zGbsH#l%{(_Gjpf}Y{P!vj1%F6OG$z%&j zU~c|5AvO`!xIUd_WZ(#~Sd>UuVQH!46X9j%)ye{oVh89=wQ=*t9j;ByGBcl-q>U*7 z=xI+1asWk9X^tmwkf>GGSbkFEo9}K35uc6>itn~JQWPHKSXwG!+je037yn%2@ye>G zlP&*g>{P$=$>~89RY6fyBv}EVDHd}@RM)Uf1E)cthFqaqY?p{pc#xx5Tmj(P)GVVX z`$(nQx%tyCe0lvxu3o&r^xYg2leZ-~NM%jeu}llgGR4|@r2>E?%YclcxLslzbxfm9 zt+Ga~x(2|~Qi;Nove^6Xd&dBHyt2yGix+%cTjl_;q0w9d07-Ix0e~!nq3g)9tKTv$ zEb}R9NEJRFMo;$f#a9#bv?l|p0yAJ5I)FH(8j1)}4mP%FAv zE0@MNcV+-^+qqn=Jzs!J1eRrD+cu_AM+t?o3?17rkrlTtY}>*zEhJe&QPhTrI<2j{ zY1^9+u^KJM{+2kOfBmhGC$I}n52gue8WGhEYTLF*w{DoMSF3@d6T1_XOJz}j*<69% zRGZIdOBW1vcQ_}GzA5HFJgV_?{*g}vK&4THUT^?K^_S3|mblNJ%@qLu9Pr@H0TtlD zo@ePYEt|s!_w&Q8Ilw;&SJ!LAn>68TnWj(3X7Y*2+Zli{`ZHO8#e$fG4LH)q^q(K< z6?cKED#((5Ow@IMkwwBPimD1B0pyn(OXC~uL){%2fSLJxM%ri`K6)r~y!$n@P>5G{ zHMyW)@aJtj^EWJk%zbrWfPr}RJ zXMYXy^##s{lXU1s^5Nu5lWzy(!|6_EINj+q?)vc;?)V#Q=b^cg^glcK4*qrg1vC-z U@%8(w^8f$<07*qoM6N<$f*ZOi4*&oF literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/bear.rsi/brownbear_gib.png b/Resources/Textures/Mobs/Animals/bear.rsi/brownbear_gib.png new file mode 100644 index 0000000000000000000000000000000000000000..8b73affbac7ed9cd09d4b751f8ddab299330a12b GIT binary patch literal 4780 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/bear.rsi/combatbear.png b/Resources/Textures/Mobs/Animals/bear.rsi/combatbear.png new file mode 100644 index 0000000000000000000000000000000000000000..98f1213c4be11bd1eb249b5462bc4629202a3e71 GIT binary patch literal 3340 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/bear.rsi/meta.json b/Resources/Textures/Mobs/Animals/bear.rsi/meta.json new file mode 100644 index 0000000000..36e8f5ff86 --- /dev/null +++ b/Resources/Textures/Mobs/Animals/bear.rsi/meta.json @@ -0,0 +1,138 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/53d1f1477d22a11a99c6c6924977cd431075761b", + "states": [ + { + "name": "brownbear", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "brownbear_dead", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "brownbear_gib", + "directions": 1, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "combatbear", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "combatbear_dead", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "bear", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "bear_dead", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "bear_gib", + "directions": 1, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Mobs/Animals/bee.rsi/0.png b/Resources/Textures/Mobs/Animals/bee.rsi/0.png new file mode 100644 index 0000000000000000000000000000000000000000..fdd7e9eb478ced8ae2629419dc6dcae0ad1647d5 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGo(>z@qLn`LHy|s|n*^!6&!W(=4 z<1hR)HT8c^ihXKZWH7DRz!<2E;Xr-G`+b)r&t+-sS9Ct|?#-Du-+MDO?B^D@YXt*erW!WjRaHGUn&OhrG)lUgY6r6*<$No}mF#z`#%ub9iCFm9N@wH?xMw nXwKJHu>4=csCrHutm1&a{9m1gRTAqfW`p>iu6{1-oD!M<8vCC$`RGkf4!g+cxNYBWH8l>H8U}{@oio$( sr+^G(ocv|))A%2`e?LXm!A&|KobTheu&QUr+u0yJp00i_>zopr0G_E&rvLx| literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/bee.rsi/2.png b/Resources/Textures/Mobs/Animals/bee.rsi/2.png new file mode 100644 index 0000000000000000000000000000000000000000..bc356e03882fa0d775355a8582fc2b066ea77be9 GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoi#=T&Ln`LHy}ePe*@1_};cI;V z=>_VRhK8Jn=eFN%3Hbh9zDp9Qj^W?YjlVt9J3Qs>Z0)6#YJc3lIrHXybLCK{qYuw( ztmI);HHmSUBLq?j1`WHHm`{mcyY$aAnSQMsJ@aPH`&69$>mc_B4yy{59WYfudWY-L zsw$%+(dpqW9_QBmFjtUVw5Z|FpNftyCa|gz@qLn`LHy|s|n*^!6&!W(=4 z<1hR)HT8c^ihXKZWH7DRz!<2E;Xr-G`+b)r&t+-sS9Ct|?#-Du-+MDO?B^D@YXt*erW!WjRaHGUn&OhrG)lUgY6r6*<$No}mF#z`#%ub9iCFm9N@wH?xMw nXwKJHu>4=csCrHutm1&a{9m1gRTAqfW`p>iu6{1-oD!ML{zmR;DPr~QAY v)*hPk@5br>8{abb)VnJj`BBaSR@M+BuVFfM;!2gR(?EPrS3j3^P6}@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/bee.rsi/dead.png b/Resources/Textures/Mobs/Animals/bee.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..dba0f3b2786740a889347e9dc0e48f18627130a3 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdze@_?3kcif|=MQo=I0!gj+)y>) z=)ct;lH{{3izj{5|E9p>6vupW`plU(^Ibdci3WsB(2NpZpkw)ATKt{ohj&epktpD~ kF==ng{WE9I>{HBSa@i-dNx))X3eacNh! zgfn9<5!0G1R7*R>u}-q>ByHM}M~j)+cGidUoG<;J_xAn$y>HQJ-{Yq1Y}Nq)V2bfU zozZo|w=@RnDi;~f1AsMN7?jt~>9^;m;E63KEJ0$CA9D=~LJ{8RBJ9mDV31AiqV!Jp zcCY_x7_Im2{il<#B9R;c_370H+Fz@>WiXxNql5tF|MAKwD!5D+q({D@$;XlcUMI8^ zE@hc|nNHa@F&9+z@K0@_o2v1)J{@sl9+GcZ?#XA$8(W0wAw z+xf|9eLOjySZ^Fl8MMxWffvs1F9>xTP~wr6X!!6IA`CqBth%)+mIA3I-UD;RR-w=l z>zj{h`Hsbj0a_Tiq-;vzPJ}1M|BfB@uqC-pk6a-(##+(x0@Ok>5a&dvds75VwEbQr#v(sl8oQ$(Gp$GK{be{7oQx<8u#aa(=FNO`pIhi}Q^B$XsV$|DeSsWBfW3(w_}J5dk!f=-tZp9H zP4(P9DaKR#6-Pz_DNk1Ub+Zc8cM%DMD?3+f!0I$9q2vwJj`3 znU2NDNMd$W0?kj9xyoUC=;x@-3%`Sunz4c{v|sJ}81Yt;Gsbq`q0z>SYsU}tk}Cx+ zqhf=g)PMLNoz)r#!Ms`;bXYlnJFzi+9#XfNSmRJ0g_I+zCZG+&%A%U+#e=cq^BYa~ z77xgrzN;OFAc5l}>Qj=0I=iTLs!?5r@@}D7BDO zM)Qrc;L~H3t=;8DfjsE_A4{%_eoL67 zR>rrYCwo4Bh;v9IGqke?_Sf}^@Mf6}aA+;j3Jnj5OX^e+UZyU08M#O@kSCZx?D~%3 zV+})rGVSYK9{sz6yOw96AMAiPk!Es@UR;@Jd{FisiL1Lo&x`r4Y(loWgkjMKWvHL+ e-0?s4+NCYkYa26a1PqMsrvezXFRINuEcah8->{DW literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/butterfly.rsi/dead.png b/Resources/Textures/Mobs/Animals/butterfly.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..10f9a5db9f17869686653fd97c3bdefe1a0aaaeb GIT binary patch literal 227 zcmV<90382`P)ST5J1r%DXoR*@eFLh0?d00cmrne00?dXr{aRBjFl$hUWa6J-xzStIp>^n?&)4F zo0erM=jU-8o8EIfAf;3QVvO{C55T&vQZ3|XEKuY-B2tYqjrljpd-&tmJ0-u-y@PQrHp!!QiPFbu;m48t%C!!Z97 z7WGDv1QGz|S&7iIv48xXycUII)RCcQL)mcr@h3_D8_G>038dq@0D#c5;rMP95ECfp z9p8oHy9hlS$*4opPYS?1D`B;6D+8?7E#_HCS&EF>faZ5yNC5~v8{fNos zIaE5D;5l7X{d<&~=2?l8Px-F_QI zx~ybHxaXy*~1ZTp?kc3DA8Jr13 zQ?b!tgkq!U)h9(Nt{-2lLn8-0i7y9hvLan>lzF5KNJbs0oUiu?XYt}i+f&xy&YH!G z>RNTCMG{DACTJO}lyv*;HMt6c=^D_?J{26Dx}co_&Ebeyyny4oh^9h!DKgPi!0}x) zv!S^$e}i@a>QfoxVO|B~^y=Q&nB3{ry`>x;5A!vfbkR1t{@7DQQ(-g!0C010DBpkB zUz1TDizK6OE)LfUj%nv#jU95(+j>v_HQ2Dz{028?DgWzBxNraf002ovPDHLkV1n;! BITZi^ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/chick.rsi/dead.png b/Resources/Textures/Mobs/Animals/chick.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..901a2fd58a8196f4f232f1b1f5900ca71922d95b GIT binary patch literal 289 zcmV++0p9+JP)zDmxgKGE?BGvUt$;q@g0^l`3jv;KMnGs8@Fo6&G~x nBk-cLzhhe}J?*aaAIO~-`XyO)JhF-p00000NkvXXu0mjffg*PH literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/chick.rsi/gib.png b/Resources/Textures/Mobs/Animals/chick.rsi/gib.png new file mode 100644 index 0000000000000000000000000000000000000000..b0581ad981ce3a208225eda6b4732b53ad986643 GIT binary patch literal 1605 zcmV-L2D zJ96VV5QZC5Ta!6bFuVsGP2@!O4G3rv0RR910000000000003aiC}{)0GE9Fo^y@bf5h>N8|MrCGkA{fM z@Mv1I_BDU3Hw$oL`XkZH$Mq5H57QsbnY4`pV2_+hqw^&({m~fHW*LK*g3cGFL?R~1 z-6nyOccFA5Rz(yL?f}udP&yGilQy}WASnWv{%BNlB6@!#rCQqCU8tIqav!;Qq%NCo z@(@r%2XyV<>-Rz{Vv?cQI)RuCrav0@OTq@}u~14sr*6`n&(RCPmmk0E@B0x-^ z71KU_sy3c8h^{&&8AR^4)Ha)ZK%Qtr8a(A+zpU9H$%?R<<<=8`_EbV z?0B(lUs8=9(wE2y#+-m{SFqju*)w_H8#FJW{6~sZ%ALz~&sfeYk$V)041L(QlH{ zLxG!nIFH|KD5cM-5z~!n=eFselz%GinM$?FMgh~yoxqXC&jU)3v<|>=XDHPwrP|=0 zJC2OJmK>xys#u($!kus0VYjXH6u6f5t_GGF$c!AMv@Kkne>Y3PoP6dWM8AHM>5rp1 zNU2V$b_QVCYiRP9h)YL-Qm+jX;aa2TDnhYp2-v%amI~8z7s7Hxpw&6R-kgAIY_?1A zsyW^KJTwJf(+7(eg3hFk?hn*87t-dLh=|Pl!Eo0HaP=k5=ll9OuYYPGETm6On%3e7 zU>kW5cZ^CiVHwujeSNO;`Ga2I`m8I%2U3~!Q^Z7$3OP|k|(zgwe>wJ1{ zeJ-S~e@wr4g%DpL$NBW!`kcc6_w^IqUZ1a@@;3dVB+y=5?0mXv|J)dmyD{eI6MZ#O zE`7gI?er|9Ut%Yb|C+Juw`KFBcQXM10000000000008a^>GSbG5Og+x6YLr3@DJy! z0O>L%aDs~2^6~85GpFIXwth)diyftiZVB@b9Z2jlksgBfK-2+hDb6I7eCFO(wp5>s zpaa;=g{5l&jbUpM#eR>ZG!H=s2pvD-tPnP)&xNnYQLZJVTbk^-(^CnOdw<+Mu2X*T8TAoI|Qfddp z^v|S?X`hDDJE1A)Sb{z`8bl*Ns7R4D!oGOueEeF@q)n$@zv+kO$ffk{^RE4Sqwm{c zol&Edz#DM#D2gV#`(Z%TL99VE$A?VOw%HBgf+Y>bWjv7x{|=BN*_M1RijO0apy z@GmgbvHsa~&Qd8cTcq?i$#7RYpHe+_r*R~UoHc>w{%&(lHz(ZBohhU?&eH$eTqo3m zF>SCIQY`GoDp=(xm@vorawVu^uQ{esGC>9afc*Rq{i&9oy`&LS00000NkvXXu0mjf DwJi`e literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/chick.rsi/meta.json b/Resources/Textures/Mobs/Animals/chick.rsi/meta.json new file mode 100644 index 0000000000..1d01fd99a0 --- /dev/null +++ b/Resources/Textures/Mobs/Animals/chick.rsi/meta.json @@ -0,0 +1,62 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/53d1f1477d22a11a99c6c6924977cd431075761b", + "states": [ + { + "name": "dead", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "cow", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "chick_gib", + "directions": 1, + "delays": [ + [ + 0.6, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Mobs/Animals/chicken.rsi/chicken-0.png b/Resources/Textures/Mobs/Animals/chicken.rsi/chicken-0.png new file mode 100644 index 0000000000000000000000000000000000000000..d5ebdc2de106cf56b97e32c652840722ea285653 GIT binary patch literal 1824 zcmZvddpOez7{`Ar_j_6yj$0vR2d77pw2_3Ixi3veW`#NqO~*aEQMpG)By4jO)8v|_ zCPVHioR&l`b31EupZjWa)^q;tdEUz(-}ian_j#Ys^Sr4ZZcfSyS_%LFD7!eH@sebs z#L;pxk~kP2?*afaT$eNUKCwj$szR}`w6UL3jkXyHv6E9^XG{^p~w3VF0^VNH`9j?3|* z68^Zk+)x#E!M&wzDIl!p^7VTEF(%`mxf9{_I5gN1iOR$JYq~YZA(D6j)9&Tm zoNm+u1}A-2n^RtFv6lLmR1@v4nf^`&;wUFe@?Xhp~4CaJpFV_+^l>X zRva@zL1H}cdT3OcYQ(-8@pi6i(V^1?Wvgw)Z>);%13{=hSE}5YQ?=T!twLHqIY_hp zPdkbHSpZr&YSXmW#69uFA(d9-N1EgQex3R);Qn5Z?RG6G`(wIUp*wj&n!h$1ycW`g zg30O%JPlpwR^ZU2-6@P-2LZ{2`Ldn}hRlwtrYD=hvexi*r2Y`0z(eWR$H zzgd?I7YjOTuk|xd4Ic$(Ri5CLOpNGWN>(An>!~yoI>xUy#^cvM=IdlYCxJZtIK_Bp z`K#}jv=BK_pL}sIbzH++-Z>AO>ZceDb{wQ(_cmlH%yYZ!>R>`LgJ_aQUx`)fU**K< zc22JpZ(QX-K@Co^o1c|~;G;n)d05V^I>p7 zCH(y+Zs+w>%%JZ%B10VMZOKdbwfm{duYdP6h_zFZ>DK!xf z!-Wo0!}%6hUEz{b(9?cfPZ|Cr7`p9<<4YSJLi^%o6^cJoS!Tki10MoMw9NQyE0geK z|MiobvIDd30Zt<3*P%hJJ`u>q3&A)NB53`a>cFc?V?_~I3u38~#Q`CMOZhP^kh9v1 z1rB2!F;D@w(oI1X!qyPD7p|ehQcKF?!LhL$f@9%&`&^p@n77P%3|&~_@A|+$Oww6W zxy3wn_bI}scCW%q)5P4AYr zD(Sw|gKaj#(m6ZASg)vY$^BoO8%l!d!-0+XQX!pZ?%Kig2;iFmjAWaN*2upnjJ z!`K4Gf*7=)5-7yFV&Ni0M*0oh&Y0+MT~atI+Q>5Sv-0t4$9yZQY;}%hJ*0wTn%A z48O7qwG4q^QQXv@T@e}3UJJ4tH=1Xm#Ep1()yIH;+=#>EHC%$)ET{S=kl{F!7_9e6 z@E9&WkLOPF2Dmwh(pd6ZZX(!SbkqR~tDQF;MYxHx$|s({?Z!k7F$&Lhx{yN+!I_sz tAyxJGW5e_+!Bp>vRSxl{lm&TPuMrZX`f}n^oaFNXE{<+zs!pR5{{#HVl#2iW literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/chicken.rsi/chicken-1.png b/Resources/Textures/Mobs/Animals/chicken.rsi/chicken-1.png new file mode 100644 index 0000000000000000000000000000000000000000..c2f2bd7cf70e1c69156ee8dc39013f2eeabf6c96 GIT binary patch literal 1940 zcmZuydpr}47T=f_KaVog)Y>Q^mBo69Sp1OHvTD{QxhdTq^Sq@NvzbRxo_F6%*n?_1=XZxx`{}>Mzz84bR0_D$a%}vyDTPf#3-4o%$&1uyA;*k!`WHGIN z**nYCOr`Oh)PCa7ihkmmXJ9vfLx~A!xu1P$i)*tzYXJYBy_@ly8j_tTYd)TqJp9Kd z%LL78Zrq$ zf%ZBRg+a8HH*(OHOmO*$mdLqse0$uCNn9cEVL{JX>dNXXkV|z3qyLL*nE!fx_0km( zx<9%&=>@RB2DE!sN7+viV;^w7hZG)dw1Q|6Rg3c$%fw2}=%>XA+Uvi5POoVc5F5(o z!ISF>iUO(2Ip;e@{D!Btb76tog6Q=+IcO=akU4YA^B$3V>V>~6XQplg;QW;Zz(|$z zlrl+T^zLwWvsGVY0@lr_Ge2E0!ng`pe}U)py*5BeEEDhAdi&RQeR#^9HmZR;lq~;2 zQrWg?orQ>cNPnyG42m7)qrR&+20_hTVfvtVR-a72>UWcY(z&m7Gd%0C!&kG(FDb`ASB1WnrCQWF6I?^Bd&p z;aDKC+PJKc zOdg|bhrZ99Q89>bh1l#14z5K-c_M__DTgtNp|myc&%#Y$JAK`4$OHOOTyiYjjY06{ zeken6;$+xMR4{#Lg%^qmHkeZIGG50Uur`qSr{24qvr*H}H|2b+hyINc=e^d_qVA`H zD6Oyx=?qkB`oG!bf*$+i?;tx<`aa?sfB;nF5pvL$zI!k>V+_swf#((WBI@6lQtEJ~ zQj}APudDlwrq8vR(?&RIh_DNN$BFF%V&$@J}dw;XKmY~oyRp`S_*o`pYb;;SSOXL zYy9WczwX^-4Tq(Q?cLomviQaJ@ynC74lx=3q&pM)i3;4;XZAs}7;j5y1O-GjDVb1%uqv-NJ57H_ z*?U<0G{>sg)IcS$d8Y{bzXUvG4eRsXQm?sJ=X|tMrcGXR_NlyZ<-#k$pkqX)dU7e`e^4BzslEP=5^0+e1CL@8@=HF@?2KA#$sNNqon;oW{U0)uG25Fj7032 zlTAM;9}hY%Eq`er$l}nu>@I4&Ahwy9QNI)r^s7}z#R!=V9^Gaw+UwL{*X;%m;K28L zD1gbvuqQgYMG8YFbuh6nBL{URhD2VAAAk+?5Ze1}{bsa}mEbMm!Mc>sJ6o6IeO-=n zUj?;IC_y%xYsP_q!OgZC9Hi)`%CkO-iCd5Ulw5Yc_o^>9ehW8u(W2Q*F^y;U{(C-+ z8^CguY(tz}#F0DCp#-EBK*D$F01q1Sgu}>RJgtGZ)nU9=Uxv#gUy{?|8MCiR)1WeR zZsQTP00AmrRxpe#aYg8fNYr+hZ_iG2>Q7>6nA)H-i4S4l@`b)&w1Re3;jQDs)B5k zSFr7d!^W<#!Ji|Oj+gL39ydL!P{pZ@#%VPIL6&P=4!~j8ilK0`P5e8h&`tks0a*Va KziQv`)c*qrx5kJ7 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/chicken.rsi/chicken-2.png b/Resources/Textures/Mobs/Animals/chicken.rsi/chicken-2.png new file mode 100644 index 0000000000000000000000000000000000000000..366315fdd9b4c2748a10c5fb20b989e86850b876 GIT binary patch literal 1879 zcmZvdc~sJg7RP_MPimS=LuqcQ^s+F0xjb|hiXJLfL{+rdJ^D+ zlx-xNk#i0&-I}Ru_ks;}NbjXMJniSP%8-(L){AkFTB}Y;fkUx3Qs4l^#*$Nm<ck z9S*fBsUCjGArW>dlL{B9dHg91@8dM%)5s`Pm%k81^*U@*>3>OQNGj=#mPyf&NJ|^P z5qbTGt=ZOv)T3_^5c7()lV!gC-t9Q$>56<4HEqv*@j@>>&s!p>C`wB>A$__@Cu5yI zn-+?Wf4zxYz6jEvWAeupR5B(Yu}P2(g(s->>;V7ZCxZSXirVNM#AD;0cQVnWs3|T5%br0MubiBSTov# z#eeog@TFaKbzrMhX(U-Y*VJ$Xi7AO09>LCth@FSAz{?)FUyH)cqibWyif2MBhVPuA-7l4nF;3z00_pDCp=esU`*5VY%$$nxTaoO|FBldX9_MT`N6FRD&kr z{K2j~UZ6AZ+wMO~WFXJUIcq2U_x_B8dFy43=TD%ztepv*8fBYXwt0V{rcO@MccW`< zH&f8A6)CN=%QH_!KN#+|LwtiVWH>^yfQq8#y}DxVb+4E}cA3k1U`#=be|DTDj_@Mh zwpS;@+rZU~Fi<^^arn*^+Dk9U^Px}rIiQPO;mSkU1Ad*hV%Y2cbB~Toyy-xtbp5ED z9ehSdg28||PH=WdLGOS~yJuHMwgG@!n$37^cZ*Yt$<$?oe2aS5{?Bu$SM))2dE(uQa;W2**Qqbf201rsG+>S#YIlAU;?>Hwv+0`#oyi=X**b8LXdg zC@DJ4AOF&4d46&BVLfS93iRwQG_aXzS*WIuuZ^qCq9fJgw9l_jaZ&^RGmuP{BEG^- zR1&{&W&S=r33oU-jPax!7dF2*mwVGXt~1J&_@Lj_(SABL1wP~GFZRKta!B;8Rmk+?$;Smg`(66Eg`!X& znL-JuHRaNEai8-e+-W_1xAT&BKBvYhb(u4(@gZ`0^p|HO3F@jZyz-)sYt4nf>rPdf zk~j{FU1dcE`G|Bo!XZLy8(5F_p`(}O6Ly6AIW_N}WW2POUXm;%oIFxQN)sr$j#@Dj z8qYcy@xjM|RbRzZ`oI{pjTz?2#pyc!>U&IZ4fSUL{S)=SOG2m?u^Wt39c}J=mD$^7 zcdIeXdX$Bjgtm$4Qn#!3>WP~6P1Y)$bi%BrT*_ej8y_srkj0UP$AykF6NQAu09D){ zhgt1z?)$G6Tr->tbv~O#1TII9UkbLXOVTvUPl5M^wJWp#O-_Vlt+Vn^Xv737{HlcV zt&z7F{b;4ZTThN~ZeB7g#4abA3i6qqY=^oQf=2QDOU#zjDZX^wmYvMLEx5cd*02ZW zDuh+fn}=FRYDsFbW6TJZjrJT9ig-s(Rvr2R$2Sn0=*?vVA%5hAXEXzs4eIC`t7~@e z3t_3kY2^dCQCPYuiYr`J*eZ>Gq}M_t)tLy;BS-n z@e={uIYtMJQ5e;1vydvOSqgL7+17uQS?!O?o_3)>?!RSZguH z5XUjrTDsjXfD6Nr;cz(9$jUVFm-jbXW5e;q4Xv>$1k2=U2qBPCqLjjz&)P5yky4VT zsVldxO0By*`Z$hhO-UfXecgI)B2PpJfl{hAjoKERjPC=60JyWARkj{1Qp)1CRq=8w z;A>WtQiX|y5-8(t_gv8H2h~5Ij;pq%b3H2JFPmK`feDAbegI5tE}O}+jHiPpo$C>_ zn`o^Atu;{;IRIk}LWqg?;>U5P+qFZMB#BGY)J0J=a}a-(KNX*c5BK7!DcGvm00000 M07*qoM6N<$f=Zgc=>Px# literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/chicken.rsi/dead-1.png b/Resources/Textures/Mobs/Animals/chicken.rsi/dead-1.png new file mode 100644 index 0000000000000000000000000000000000000000..5ea03157c93a24be91bdccf35362d27b781b1d3e GIT binary patch literal 430 zcmV;f0a5;mP)cd(V{U1y)MoEm}DaE)@qd!ld#TB(Ozm~!%uwp{z|K(a(4GXtE0MtUYsKq(QAajcrb*tiz%)O%-zH}w0GjAPgvv@Ys}l*pMZUBqAGPsLZ| Y1J9?WdPlm-$N&HU07*qoM6N<$g4&44*#H0l literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/chicken.rsi/dead-2.png b/Resources/Textures/Mobs/Animals/chicken.rsi/dead-2.png new file mode 100644 index 0000000000000000000000000000000000000000..87f5d022775bee162db17ad35042c82c315ba962 GIT binary patch literal 428 zcmV;d0aN~oP)oyjG;C`+zukU^R`aQto@pwEQkH_=hA)CA$hM~>Z;y7Mw=JqB_8DpT7 z=3DGKLY6k&?;P0ytGMR{OXrB92*#MD^Gh3^cTerUy1}sD#@^w1VUJP@lu{_AAf<#5 z!quWELJ$O{Zfun;AJ3+Ed$_~d)gy-ewp*Abb%Rn0#uzx~kWvBwf*=563`vsMqPzel z85qx|7_bV&#WkJ)=Rnr}^h>j1Qa3o~uBMcN5CQ;f-i?I?;cSdM6t1!k8V+^#`767D_pp-&uy~?_uVQ*<+$igtRNs`!Ft+p_Tzs{d7U&a?O WxvKKmXID!A0000qr%!-OS5FjOH$+%EuOT$i)CH!0wUf#{V zhYvqYGcd4V_SNKd6-vj?)M~||e k%@$T$z*$ga^niik4ug2c^60Psfv#cjboFyt=akR{06*kS7ytkO literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/chicken.rsi/icon-1.png b/Resources/Textures/Mobs/Animals/chicken.rsi/icon-1.png new file mode 100644 index 0000000000000000000000000000000000000000..69360a0393d482ca9c20ed5f277aa5d0dc861431 GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvxd5LK*M|QMiv+{^_`R!wbs8KP z4t502ObuU|YYdeC-{A0n$(Gqb7Gp_}UoeBivm0qZPLrpLV~EDYzq9tt^oZJNN9l!x-6c@aR$2 kv)RIG3pfjkj2zopr0PG=8g8%>k literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/chicken.rsi/icon-2.png b/Resources/Textures/Mobs/Animals/chicken.rsi/icon-2.png new file mode 100644 index 0000000000000000000000000000000000000000..7d579a9ed3f285d3a6c0e8ba243945d5fa2d3437 GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv#Q>iW*M|QMiv+{^_`L%H0+f}N zFJ8PjGc|nT#EC1rvVlteH#h{{F_Z$b7)yfuf*Bm1-ADs+nmk<`Lo_BPCrGdgC^Q^P z7ilt{IhVI#$pWUB1EwYt8d7Nt;R14USqBns&EyGB%!-OS5FjPEm0_XEmWG`oOZd4W zyu6!z4U{3UOaSW-L^Y*T-cXXfx`-l2p zN~)9gJy;~_$|BpcsP(}W)eB2YUKFWs@B1q<$$#R;=;b=HUEYe`>Vm5{Btx7!L%M@j z@UpEv{8Hihw0wpc7$C2!}1 z*BrNUqdnfXE|;~}+?H)u9&=A7R7&z>6XSzFJJclq?LXBzr%S81=k)tKugxPgPiZq) zum*H3V0aK)d0O*_ug9_PlGcSRCA+Up<+e06FJt{%ToiEhq@$^yj>*X%OEuP)*ci9x zg|p4BJoIXXX!xeA+TAlX*QH#2b;;>;_Ux;*Gj8wuyYu~5pF2PYJwI;hGPTX4CRp>- z>YW=`&)fLbZ14JO+h=!HMyN-{oZKdJ_T)>+KR@bjOmg`9hDrFW@{Tz6c161a+fQ|A z^OL?^Y_7PSR%(ClXv*f#jK@7IN;4TJUpBVb8**dq)xxTk0rtBYF6^zizddW+$6ABz z4z1oZE}vJZE}MD!$rqpF9Ue)woKZEO#rAKvE1y$3f8V=@H~-|s?5WiKveo!kuf3gV zf4F>E-W=y@-zt?i*Irfptud^dFUQOOS%2gAk9)6bY_MZ^HsSx)4@~{v_cQz`kCw=~ z!SD1Z?~9}4{8{V`7V4iTJ$cG7L)f68_U+X(itB|x?NyF>{M+hvb>{luem39ptlNY) zetpjHx4p}vr~UDf$-6(kwp!S`HB~f;{l+o&vYPh3udB|^X~!qrNx40~zGa46M;hSWuMlzrErXr>Fh;2aD^LUpu05Y47j9 zU!MQI;{UhSR^H&$dA1*Y?`s%J>TMdP$(`NOw$J;IfN#>i*X3U4mfG)&IiYz!w@LBW zXXm5a*WTAWDDd~=V!8W26>abT{pjiR{rPTzN;?O8r4+S?o9*wpo%r`hW#Q}h){gOD zWtxtkb3R;^e}AgHeqXo1SL?fN-)3FB{HlNYyYti6?QgEkotAM{?B#iLkL&k8-fb_b zuetS+eQli*5?BJlhI>Ch#UTgMKi|9~KZ|3K-Gv0JAs9f}}@ zES*HCMVdh+EtYDllvaa5E9G^NcfQqMxdHaC$Hvn%z)+(b%Dj*T?@Y^kyib=%j!Nuy`t!t}T}*sh{b zu33q%Di(5Lxa+uSY`IPDtJ#%$U>>0potsEC9L>IgLHzjsts#NUy+icWx1c)@UWE9- z$;kVax{aY5*PU%km31c%$_YML07jODjO*g&? zY7K>QEzwioYKW=k(l;>Z84*E3PeG$ko??Ibz2~fZ_i+vPvO`Ys>Rf1QXGD$P-Jivy zH=oX(gS#d<5>~65czl1DPS8|;e5c3P zN=Q8$O!dd>GTooABaZsDZbO@0(bWskX@7j$OnyJM}OZxNA zV7q?LXCJov<69lS-RdVIA|fIpA|fIpA|fKXq&odMftIn|j}Nrh`T-_z{Q%3jet>0M zKfp4sA7B~R53r2u2Uy1S11#hE0hV$70L!?3K)d7m0hV$703sqHA|fKXRQ?0v5REUZ S!*sF$0000 zRJ-vuk6AXuUgDJtd$pAnvbBkc;0}ne1~UN81(?7;2c52Kg$%F=*B{;1Rxd1uM+`O= zYD)ou3G~{RYq7uKn7Kxdywk6c5U$#A`P}dJUb;lz5|^P%LDl8VKwhFL0I1CEGTPuE z2}fl*jN?}mH>%e$(p+G~z|-P1Wy$KQ^4dMz7s)zW;Cjzpl69bq z{21+iNEC~zqLAsVqR}h2e1FZXF5*?rUrn=+kL|HAi(!$L(HTH%3gxDB?F9IJZM*`B z_`<6$|He*06Yd^AQ1Gc33uFHv%@@?$rGal3w(C{kXYNLmxhoGYbGQWAI zYMQ}HC(%M5rNlrKH zLcMX}q?CD28N5Jx@EIOPuBENNOtqjSOXP!hM%IxMkcU=Jx9aNjml9=B+UkClg<9n- z3;kMI#5L*RWE>N~6p66CKu*zSL&$3IMG;qoOTC+CZq8*iz=o>0?E`^P&b}DmKWwHW z=|eJ9yH)Yz7IW_E`e6nH)8mB@_SR%EW?VI z?U-!J>SBzjTsxO$@od=}5wWC%>vlYO$M*db&=x|o`1c(L@-!PNvu&&&zG7@fI~n?> zA#caT|FDppir3c`9^uVIBNWP>PUd$n;Fw6A?N zG!IWVW4QKWf9`QST4eU}aR@yz9&|C>uo*HQ?#+bmeW*Hd`p>rc(+o|b;6UgPalf^l zTjP>dU>=!P-B^XoIU0Ln$V}L?HJ(R<^*%rpM$@m5I}W?1Gy~Y~y#hDk+CC>;%XRj6 zRvGi2JF-cKlzD{E>R{e{eZ5o)p+@s!=oX^qEIf8o4m+BsqS2p=XOsQEJTYS(5lL5p9O(7Ba`x91v0m3FqJqJ^$u{tkM;Yj%? z_ES+;s<2AXQXf(^B|Tl5q|RjGo;F8=#qfR~n%vTf&uX{iu_{?Nf&)-QG0mxJIbEJJ z9mXTC|gfl_+2$vX}3s;Tm8VW(Tl z`nP{_OIg}-xKkH=C1c8sSkn^p7DK-wF8YM2h)Q6INti#v7m6zNsuaUl=0lM0f5S?F zJfXL$niqg2UnNZ_!Y^u{#Cp5xauFl;{D5I^szGdNeA> z=p}XK?#roj0n0<#PW&FpKfBIcj6>rm z&-%nmbDYNrT%0`E$Acm=-C2k5s&I=Y(b6CR95}YGzY--J=U=XqJfTKpOg8ddWhBW8hp6#|e3X7>2ePY<- zY1aR^-Y8q-*_g@f9#g#Q>-aNm+^1M5ex}fFkga|j;i(yr2v6ZsS)=sLYCuLbku-vxUu;RSpo+Z+_52xAP&m_)i3Ni^)lC$BLo4d-qTh zG%i7*-?paXdE3q2N#>1MjQ6PUWp-F-Hm{_x-*??i0ZN&2{}6PkMWFzNWe#2e$5w zYRe^(J^;IdBkObuBLfr4x!leZ=z+`w<>G$+R<+itfaN!N-b6_*IyM}!ss6Mbej3GFI};{wEC4e^1$8Yd1dR7gbZk*_j)T% z!||HiJo9C%0oZQtJ2{xBZcu$M*|xs6h3%31kKn14>>k}wnpd7TwHdoW@rz5K;r{E% zEXfocVLol+RhwPg%T;C|olo|Ak!?q5n=203Urj<+l?eh>?I94W2@dJPH2;6~M$#20 zw|xpN$G9Y7HNEC#yRKKt#jV@7JW5!ti{eIArkUO_J#ywk0W zYcq$aD49u9Rfd9NS$`l?c@8?*Q>zu<(Zp2hsd%FY_2w47NfhuGUUwvvIb45DP zNSU@vTgGlCZ~ADTg*YGlr~Is%uVI`d4$vxtq;lhr3Zs) z8rH)U`PxA}b7U7^czfi$svtO#eOB)BsHfW9Nr3yg^sOJ0CWsklimU3+Ah4e|5`^mQ kyen)j@@JZM*!67TVxD|aFm+6%gF`Z)f87LIsqGZ`KW7(XApigX literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/cow.rsi/dead.png b/Resources/Textures/Mobs/Animals/cow.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..1eff485ebe149110c8221ee3efe87fafe1f963bb GIT binary patch literal 1143 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/cow.rsi/meta.json b/Resources/Textures/Mobs/Animals/cow.rsi/meta.json new file mode 100644 index 0000000000..caab74e720 --- /dev/null +++ b/Resources/Textures/Mobs/Animals/cow.rsi/meta.json @@ -0,0 +1,58 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/53d1f1477d22a11a99c6c6924977cd431075761b", + "states": [ + { + "name": "dead", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "cow", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "gib", + "directions": 1, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Mobs/Animals/crab.rsi/crab.png b/Resources/Textures/Mobs/Animals/crab.rsi/crab.png new file mode 100644 index 0000000000000000000000000000000000000000..9c423c97b96cfd51796a9b19cb74c22e7bbbc3f1 GIT binary patch literal 3404 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 JqS725_h0bevi$%6 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/crab.rsi/dead.png b/Resources/Textures/Mobs/Animals/crab.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..c2fa2d91acb244bf8188b6fd496a24d8732b60bb GIT binary patch literal 614 zcmV-s0-61ZP)A!|1NGo+%SA8rB2sBWzzjt+DXkF{3WbP6hq@IU+{J)%XCdP5AP8L?I*67| z7L1gpic`fvib2gut~NCG;4E}FhwzMs)RNnqg;#zI=8+Zqt{I; zhDA_*P!XO$zxJMF9#ljx+=V!UVp_3ts^lzcSQfeonhXi4V=m~|0fAmOeHwy_VL3%a zgt;bn+T=#W#McjkdnRG+sE&mHSlj6-MF<% z)mFrJ1{#*d((*h2``bILtu@e1h+jBMa&nmKx32*3{OP7g_}+sV0N%g;L~Zwo)9pia z6Yk$l5X)u&c(J_h6eK!u$}QqH7tBtnXfiZ^95NOkC01A=R#+iBmm-x>NM#hVb15f2 z79S-!IgD$JmZ-=698O{Qv*}07*qoM6N<$f|yMn AmjD0& literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/crab.rsi/meta.json b/Resources/Textures/Mobs/Animals/crab.rsi/meta.json new file mode 100644 index 0000000000..73d7ef3bdb --- /dev/null +++ b/Resources/Textures/Mobs/Animals/crab.rsi/meta.json @@ -0,0 +1,46 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/53d1f1477d22a11a99c6c6924977cd431075761b", + "states": [ + { + "name": "crab", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "dead", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Mobs/Animals/frog.rsi/dead.png b/Resources/Textures/Mobs/Animals/frog.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..4d667a1b2aa4a87b7d4d200ada6cfe09d954a3c4 GIT binary patch literal 301 zcmV+|0n+}7P)MP_C@&p~6oqHFD3N8)~f(TV# zz}ulD7<#pmjy>OWIrqG8z{wL?4kYO z$9|EUs~Tz4Kq*f$jaeP9BMv)uB*gHEW zfc7OZz<2~^4uE~1s_NJK)sf9?Pm<}HkQf$kpH=O2?ZO#NlwwQq>x%-u<6a+jtPi`I zd~iRk-FK9VkS4Jg)09}QHImb4 zB)8(Y726TVZ7poMlv|kG=Q7Lr{R8K`UeEJ=UeEXS`hLH!=lQ;$&y(!xY=_vXx)T5Z z1j(N04z6Ty`ongBmKPmO0sv?piD=~+l{c3^5{f>9<}~Tv`SFu%H9$Fakqf~gKgn$( z?c44ReZS{|@~v)^8$>OSrlFTr7VVaLQjWAjE0At8)YqD&J;+^nmAVJ_>*9MgE5r}g z6LOul$&MJ!$neNFgh0)hpvO^o{eY=1&8aUpe;kj5EjLIbWvu>tRP0$W=0j@j-AF;t zs`Dl<6QTqUmJ0l0dxN204xG?9{>Za)nG#u9cSi1EVfqn{jjOs-ptlJD3OwC#b@4%v zZMy(EIg=p`j7Py1v?1XZ_XSg@R^a6|L-_JS=+UY?O}+(rlRdHs1h2sT<=!r?A5fwz zDTtuG{i}Sg%nG~%CQc}pJUu_CSl`T_;e>h1{(=DLTPF>Hdr*kl#_VMnmL+$KgP#%$IjzJd5qGQ=u?o zja+qmIz|LlNSkksFP`rVeSEWfaf%}E>W0L_)?aix$LL+LdvGo?W#dxk)+%#6=-oU| z5f2IaCUz*xPoB3Mz@S4g0E#55c(C$Pxl?Lqq0i+q81Nm=2U;G;ctlS?;>w%`%T=5#$MQWFWxj8b2Wa>G@lJq#p6f>b;m zwM!!Xkz?sEbUkKmKXqo-I4-U2|coun6t4kPq?4PwCS9c^A zN$LH$0iI)iIFK=6^vqry6A{qaE&T+3w<>Qkbhbx7jJdTo<7Cj3N_20b2C1sYuW3&{ zQIPwK18z{H7XgQrtb=eXG0%I<>kAy*+AY>2dTSv5A#uFZpqqJntP+MPdRb%`Q~mjj z5|z2ZAGtM4MQ4Hm`gd}2aNpjS@dSa%H-=vtLki9Pbma;YMuG=q{Gpib@VWm1v^9uR z>`{pdt-wo96SJ$PKeec}#2q}`zjm|^CRj4!Sd|t!uO5 z;+@{wA+a<#v4-WnZyFu9_l+i5gCLZ*K2dN)WL95*A(Wh-e5L|oU-7yMX6$Qea+DG^ z>jxyA_MlPrX<@>&<)NuEFQ=tI1_PFp%rdK!**Y|tQKo6SOPt0xR?OA%rU(^>mbE`V zA@fDI8ccLMO4Ul{Kelrkb+s_!r(ZCwPqvw5wTkaI_ zaU2vm#2u=cxYKWPZgQxlY~pKkiD?F@a%o@~oIZ$gFv4z{8cX~QK``+59cL}-60t=tO1q1M_TXV}gKqS_n zW-MW!ycLb|&|ar_Cx<#U52`LG1;)I$eivDmpT~6{6&tJj*59ZwKI!a3cuA312?rmw zaNS1JMqZS-U(qu694I&~7ub=eESB;S5>i)Ia?>L;`tFbTNg8bPe((O-Ut$SLOwDct zC+&Sk`u677?CN!egC{g3ZH9=!y*8putcf&v@NB3hQ9EExrnyw_!hpXgR~F0#2kc#% z;&YBz(kMs~w8e!U-9G*ifmaFzihcA@QSyH5)4KbO^K)}3UFqk_47Y^nN3p}s?*=(z zZ3nz=o0}fFyA6!&Gd**GV|I3i^{9%?===S8W=6dU+vwWdo$$6*V#>+Qj&`W^MDJg$ z+_XAJZ_qnvQ-pCW^m9t=9G_7i9_!eYgfCg~;@+4>6?z2VE;<@w`AW0gGA_bCs}4# z@KphmU3_ss!-Qw$SqPCnV(WG}h~AwP0vYXp$I6QB-IC|;e&{+<>nj1jYk+jZnOJ7+ GfA3#;Ahn$U literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/frog.rsi/meta.json b/Resources/Textures/Mobs/Animals/frog.rsi/meta.json new file mode 100644 index 0000000000..2d517146ef --- /dev/null +++ b/Resources/Textures/Mobs/Animals/frog.rsi/meta.json @@ -0,0 +1,46 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/53d1f1477d22a11a99c6c6924977cd431075761b", + "states": [ + { + "name": "frog", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "dead", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Mobs/Animals/goat.rsi/dead.png b/Resources/Textures/Mobs/Animals/goat.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..7b85384e80604d495fb56b29279939a4c104a034 GIT binary patch literal 1066 zcmV+_1l9YAP)7~BJkNQ)-{~LF>l)f>Y?g7vZA7?4;@=>ZNs@Ah#1Ic?{g5uiJ~N z>v(*|e)I;iq7n#(u!{L31vD&Sq&F#8MU&gP>-OsPYfX!zXgXb?FaWCNWjGnd>o@TD z3l+=Zpt1TJ4?~bv;5uFhL=u`3?eIT%B2Fb;>INkR4P?m zE^&VxIGbM&S#k4d>;7IR-be%3_Z$|*jGMz5eDlP0h zCKP)bqchNuuUslP-Pzi_caW}e1mlyl!sW{g01PBg)NF)f3H+TQyd4IjDBuzsPgYrR zv9)f?AXUcSnst@~7VO8^v$J4mvIwm5WtF}Wb$r|GRI9!rK zxnv=V0@bRGX%-xES#eV_Tb~I{0%1df6jjX&5r<_WB{TlP%Q4?l{KnW z+Yyo9-bB+p=pH|Sv#i-~_CD)_?QbbS_ZR@IT$!`aygez*TS*&W?A@~fcsus|oq;gr zk_E6ongW$dmBq!yrYc(z*U-|ja%IkzRW~oDKXm-H^B|K+<2QmWD?Eyj>ymHZg k?#%lw{|oi_x1{y>8#Y>3kGa+Ero`9 z)X-6OHFmRxZGm-Ty>W80+>~X7v5>?jCYDrNwk%nSqFS~koqv+fE{@M<9ZOb}#J0+I z9`McizVkir`%0r2 zm#ePxq}U7orb-uYd^xT=-9AdmP2%Cc@X*EbexD0nk*1 zh6V>~s}E_}*9m~v>!Y#Bg{I~>d-g2e<~B4{DSJY-2(j1v6$85R=~+FY_yIWR4)F4c zU*Pe!h#&y+noN_^LqmhHgb{!dT(PL5D3X}3C=#-iVRG_%O(N_if5kl@q4@d9Pk#o0 zrYZdSPgek=)Vy9F0J5CLQ+m^;+JNy?ibbOuH8uCBoa@Hlu=T>k_?SL2at2LRIM8#5 z)pQbo6GN{Hac}*s>ohE!sSp8mrC_?laBx_snT;sA7X_5gRPim=!G76CSPNaKa$ z)JXtdeCajE#Q2zgdn!o(fUz@cY7Pxha3Gw-KhR|%(9|5h=2ieEuT?(<>cL-D z0V5-uFBLDo^qOUIBpeVy6beO_Bl7^bJYG7xx&g>*8mVNQ&aQ6pWXu3-IRf{Z-y%SC zF`xtVKIg9(s47c5jK|pD{Va-{;a*^gLkC-Ms|oZ*vso5yE zrsu>)^|aV6{>S=uzWCnHb!XG&zWLF|zp>o^{-s~)rPn|D@IBoO{&9HrlE31|P$isy z=S@8ki_+iMO-_=C#vYW7FD))0E5?re!Nqs=)s-a4RJvA*y71R5KzK2RBq^lVGNisu z^VL89ZBcb8nqWPX6W6C_LKWvdDeBE{!-fqTHf-3iVZ(-v|1CV#he9o0eI<{-R@ALO zpc+a8Fl}kmgxs*PEKcmJL+2e|UH?qilpI5+M{5eSuKfX}sHFDr@JT#gLvZuTOU^qu-R<@Y@7?KgQ^*_tXe<_W;nkZk?XCa( z<1K*U&iS)ejcCy z;rF%V4%E3n05-jJMUl#qHDNlhO->Ij`#M=$eJF@e480B*o8p0M__o|vDC!i8I?{TY)s?ugu1c}t{p;K9%GLSCU8yg!+=Hx{3 z7e+5TX71k9ONIEZ^#_z~g64!mp-3*fCX!4g(ZzrsT@2{k`TzCk4|wFafZNkTED}Q7Ajz(! z$!i*O(X^P8O2&l=c`vX8R91Vt#2z(%Vf3me5oMBf!2Lx5Hug`UAGD05geja2icj zn2V6EJP$c7lZ0!#yjmszxsW`~!eF8u*p{q?Q>y9jRMI)IkX^XpH3 zyDN_DZuAFKt$>wG1LJ=i{v<^i?P-;UC96Cv$ z385_kBRB|7;(R)N^y?QQySB*kY8rsB9s*#c z@P$BM54E!kYG)S!)XvK)5qFDP0!+sS)I(uC#KCrfso4bp4z>#{ucj&PT7>lw*|kN6 z#}X8GEslQta_kd~jC2HgBOPuCPXJl*VZEEVr3_QE3lzTpY%+F3$gy3n7C2(Jr_gDi zJgj$fSnmcPF{m-Ol;OkMH>$rfayJCPd}^jum`xDw6gu5R09}`-6n8BWgBsbjMHPQo z4>6ybVR<#p@zF^W#OJTy)E=_`E~zA>rz0BKdwVY@Vppekcr4*r>C(sdJQ#Z9n5&&# z5R8npddoxuz)579rpV=TSeAuh7<65pHbKZrr77Sr&aAAHOirqCD}ZXXA^_s?msbF$ zX$k;o?p9RSnjl8U<2-(PpSySNsaI}eBM+be+L_;e{_yvcoBg+B0-m4F#v)!l8*kzRC)G*MtgJiCy#ORce}53eFueZ}rP8J-l{Q5KPE@NEbwzbeM0HJ6%6p=AUUrNt zv`g~UY;h=9<800000NkvXXu0mjfyni=& literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/goose.rsi/goose.png b/Resources/Textures/Mobs/Animals/goose.rsi/goose.png new file mode 100644 index 0000000000000000000000000000000000000000..5c3685ac13bde7555f5bbf817ae892cf10e971dc GIT binary patch literal 1917 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℞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

gw61g=t!85EVd~4qi9Ucr7a{wR}J0`>{tu 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 U6x7s$E0uteo|*1@?Hkem4^FR0WdHyG literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/gorilla.rsi/crawling.png b/Resources/Textures/Mobs/Animals/gorilla.rsi/crawling.png new file mode 100644 index 0000000000000000000000000000000000000000..2faeab4cdea7aace9732b887b66f0faed3feabde GIT binary patch literal 2590 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/gorilla.rsi/dead.png b/Resources/Textures/Mobs/Animals/gorilla.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..0033f8f4d7dbe7665147b5a4e63f2ffe4bebdd5f GIT binary patch literal 663 zcmV;I0%-k-P)DDu5CL+FHjEGADKw3*y zN@HmP0KQ+ef>ODB!aSY*-GjsemZcGKC>6(%{)=$Ge-jbc#ODOSFbEd3gdEH#nrFn zwWb{`CbVeMTo96y$Z7GX&tLH7?JGuMkH=4*@!;VezF)LG_KbN2OXNU)YJntXp!}II;<76T=`N-cn`6npju`hm9iuPERf~tI_*{ zq@l$;WBBy>9WZavulV)-R-%FTA72A-esP>>KqnGUD2~hnqK*aU+npIn4)&N8goHQ|A^<+BEIu$cb zXmM*m-CS!Y)Fx!Z(qlAfMwcEIVrqZ)VBs_zg@ctQUzUM;%LYcb;<>Os4JCzmOX7*7 xapyN8SbZX9aP}wO34!FZKW$E}`_}Y-^An`KMyv!9V}}3$002ovPDHLkV1g_iF?s+1 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/gorilla.rsi/icon.png b/Resources/Textures/Mobs/Animals/gorilla.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ad43fef18444f6b5b513eabf8e25ffebfbbdd4c0 GIT binary patch literal 369 zcmV-%0gnEOP)RRaqyPW_Rf)OU00001bW%=J06^y0W&i*H z`$g0*+a0~;XlD}RdS17EgaaMjnA{Ljjg4Xuw`D( zpvk!lg4o|cNb+T7m?(9MQ~Vhf(Hv^#^XYxD?0hq;xY+M!HS`qj4$~TWe7HZfQ`lYK z_z6^U%a>k$?ypk6zme+;Ski`9nrvxH!3&WDpP@?60M@+9qf~*H8X#t$=dPIuLN)6G zoi;wLP{4FLT=6z-8J<13;YPxc;l(2OuyrPbT3hr)gEQqfVj-P}qXJH&w=}>OKpLwb z0DUaMW&|Q6!@^+`#~9&|0SVMuOdmW#j2|(M|AKiB1+xA#b_P2~rPiaE4^U>Rd P00000NkvXXu0mjf%B-HS literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/gorilla.rsi/meta.json b/Resources/Textures/Mobs/Animals/gorilla.rsi/meta.json new file mode 100644 index 0000000000..8a9ee12dc6 --- /dev/null +++ b/Resources/Textures/Mobs/Animals/gorilla.rsi/meta.json @@ -0,0 +1,65 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 64 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/53d1f1477d22a11a99c6c6924977cd431075761b", + "states": [ + { + "name": "icon", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "dead", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "crawling", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "standing", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Mobs/Animals/gorilla.rsi/standing.png b/Resources/Textures/Mobs/Animals/gorilla.rsi/standing.png new file mode 100644 index 0000000000000000000000000000000000000000..f5e18f58c0498e7960dc9269442c95707ea01401 GIT binary patch literal 2823 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/lizard.rsi/dead.png b/Resources/Textures/Mobs/Animals/lizard.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..3026938567b6e736fc4421b3a5c254b1eb05f336 GIT binary patch literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJxt=bLAr*7pUfjsrY#_jT!C!_` zh3$jDy+f_Pc_s*MVpNq*VcE9egc#33h6PI${8CFAd|&)r|G2)>dM=|97+CGjS$`(` z`P1!2Qo+}m8SbqYYb~8^^CRT#yZz1Ct3HVBGm&C2DE({WBH8=!=9%VH`RIT5m8ORT zMznvtrekEeq~^}zooA+8oUOf1b^Gb;>5MM%=-ACqCoAfQ4Cseos9m?S8 L>gTe~DWM4f-{n?! literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/lizard.rsi/gib.png b/Resources/Textures/Mobs/Animals/lizard.rsi/gib.png new file mode 100644 index 0000000000000000000000000000000000000000..b296dbd780bb8a5eb20ee34dc0b92abacca816d0 GIT binary patch literal 1065 zcmV+^1lIeBP)QUHI5PZt^QB?)81Z~9h}8b7rPxX0Ur>c(Fe`;*&pUHqmt000000000000000 z00000000005Hj`~F%Z`J4IwUlkwjnD!#H|N0QYqE^tDG}gNYppS1PFD?v|7}@ z7R8?V_R`~T@-)$x6^!xUnp1(=`6S{WeEsaO-N|9QI}T!2=EsiK&vbpdJT%JK5QwX4{-@1Ghj zJ2L^zg8+kL7O#6Z*PZ>z&;9M!9-S%ETUGv63-@fc|LHyJ!;S?EvfH+*ygV7XHFR>- zmDp6x*-qd4ckflv{FAp@?d6{8XXoo!cRid`a_6nMeOLBLc9^LQVXyq#W`6Y1lM873 zdSzke{eKJBgq&nQ(i*c*aKe&!=hJ(1zI+WkUDJO)JykNjHrll6-;J2LH>Xd%)pK+9 zA^Cppm%?h>CY9W{cFOK~>d)|>)4!j+8oB+`lApaZN(%4a?Mwgce3V7A{J6zzPphNZ z+c)hh^*t-QC*jnZz1GX$uhXw|*XQN%OO8x#%d%vicyg|t(8o_dL2mPO^>bP0l+XkK D-ld{c literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/lizard.rsi/meta.json b/Resources/Textures/Mobs/Animals/lizard.rsi/meta.json new file mode 100644 index 0000000000..8680a2713d --- /dev/null +++ b/Resources/Textures/Mobs/Animals/lizard.rsi/meta.json @@ -0,0 +1,75 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/53d1f1477d22a11a99c6c6924977cd431075761b", + "states": [ + { + "name": "lizard", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "dead", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "gib", + "directions": 1, + "delays": [ + [ + 0.6, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "space", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Mobs/Animals/lizard.rsi/space.png b/Resources/Textures/Mobs/Animals/lizard.rsi/space.png new file mode 100644 index 0000000000000000000000000000000000000000..a63b48aaeddcec39e9666233855d06d0e378b511 GIT binary patch literal 574 zcmV-E0>S->P)zNfccKOi4z>h2Yjev#KxQ!Y2?bh%gnOAQoT3xaq=fi#x%T zSk1zsRRUJYqO^gw3FGR93r=X}j*5%#x5`{5_ne%$naw#MA|fIpA|fIpA|fIp|G(Z~ z6!r$AFv%Y2qzM32vguTkeOzPj{XCd_cFn=L0KLH|eEw!LaRRQfcRuW}@pT)3W~t_! z!<=gZ!CJu3J7VY^5v&CyJ&JL?{j$rccfzT6Li^*E^FB@m0JwC+XSvg5xzlCtTHZMU z7nN)}b^dB@a_ukGo&SbT1*o-}T<|Z_&gE(6@?5`llUl3kvXzre&(t8?>g5Wn z{dF=y!|4RZu39E&gkH74`2BaD-FXbagUu(Hwc|&x|LVKIj&J){@kK;LL_|bHL_|bH zL_{Ja9botq0}y9PG$3KvjY-p+OFBO=?fX%&l5pO@PQL*O!QzdW?=X~(|D#a z!~ZjBiHV619z1AhXkcKNc}Vt>1W+YoNswPKgTu2MX+TavRY*jMOKNd)QD#9&W_}(6 zL&conu!5q}?_YuoK7M_o<*loA?#%h%4WR}XjUPPHIq#!+lA)-lcZY>>knv?>FNHae zCLNg+q7bZUZm(~>^^$>|s;QxCXScEH<`oheIVX8;uxYaF*!k^&LO~)apv&@8E-UNRFu{%QCOp-ab$rAgRp>zXL3+bpiqlu zQizaNxrj)hp=cAQK?VbB%pB$B2g^LBSX=F~Xm4VbV3m-NG(8pjK#S$#S%H=tK`h%_ q104b+ugW$tb-mC#`hoi|BZG~CVA!-tIfg*H89ZJ6T-G@yGywo(X?r37 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/monkey.rsi/meta.json b/Resources/Textures/Mobs/Animals/monkey.rsi/meta.json new file mode 100644 index 0000000000..1621265020 --- /dev/null +++ b/Resources/Textures/Mobs/Animals/monkey.rsi/meta.json @@ -0,0 +1,38 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/53d1f1477d22a11a99c6c6924977cd431075761b", + "states": [ + { + "name": "dead", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "monkey", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Mobs/Animals/monkey.rsi/monkey.png b/Resources/Textures/Mobs/Animals/monkey.rsi/monkey.png new file mode 100644 index 0000000000000000000000000000000000000000..0aa76fde169b7e788a05d5cc4d95006c9f96a2f1 GIT binary patch literal 641 zcmV-{0)G98P)202u%PPg2MN00001bW%=J06^y0W&i*H zYG8(C9|j)q>YO+ttc@!6~s2=QdV&F za{(I+0ChMT(zqrt&Hw-blSxEDR7i>Klrc}kFc5`pEEt%QT4d-(fZgsX8DQ%#0HPp9 ztO)NcgdHJf#xQ}pW#tcYF0Ja9($1COGJWTF_Sw-rA$BHYnr`Jiou7<=iAGQ`nNDrY zL}Wowu<5NDwghv#=D7FpA_a0;_m~<*`L&sE&FV@?1$#LIoE8v7<5YgEc;$Z#KklDZw2F!+ljw3RU0-ZIuL+J)hYC-{7bUD() z9V}F^A(ZfRX=9;6I`2{7eHIH;-L_AcE8gevhsjbE8%8`?w{2T2d2RydUH26qanW_N z#nO)n^jZrDYx~8LAf-(IiPsJfGwv7u5NzN>+7#a*)yZMx4}6WPiUmahmk8Ss_yHpd b{(O7`OU_zcC9&$s00000NkvXXu0mjf3?WLs_6~uf~bLh$cTYyo}T{cz4Xf*|ONNFfBSFV9fEJ&)eKF(sTaW}WP8 zfl><2Inp!*=Nz1KL{S9WwpV&6rSLotANvQmU%o>Kv9>dl1XQ>>r)jFc5=BuU&vO7+ zk!YHx`$x$PF?k0Tw+|KogkdP-I7U@fN=yQP>$-3p2W{JSJx{)m)3O9GyojR{P|Kv( zwqKTdIKnVQQ4~m$1a)0^Q)-$9hgk+-eQ&;%o2zrFe=A`^h$Mu_EX(BUC=adJ8?LfIaN zUb5icU8LUqZQm@Dk?nA$R;|$7On`2u4cGIbtGV|BQwsoq;;T21S8udXHZ;^5Eo6Hf zL4keQip(&@#Y=@(!u5RM{t5ul&8Sh{^V4H=rfg^k3M{cks({Ga&b|`LoE#mZvUQ`_ z4p%~ne7`v$0RXGpm(eD1g0)XB1MF5}Y z=2xjzDnT*ahSLpU&kKzv*i;yTXHUY_>;|)iPlx@@40fhdEP)bh~8?81?=k{H&;p_2!gSQ(OP4(-s0iuem48dcOxPrgz)y! z&ODwmD5W5!1Y-;U5QZTDpzFGWePvmKbB?ksp|ytZ`=36=>O0NtQ0tVCQlhTw*PzvV zRNJ=0Kb&*;zCYPxR>0=!=GNm{0|IgkK=G);%~)C|lD^uuJ=E>53O zRn-v27=x4&MNyz>n&FlJAdX`IALr&**+)BLuX|x4GDKvOBr(-pX2u6OijXaGGy%t- Z;{}PkmVpvKGYJ3y002ovPDHLkV1h8?rz8LX literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/mouse.rsi/icon-0.png b/Resources/Textures/Mobs/Animals/mouse.rsi/icon-0.png new file mode 100644 index 0000000000000000000000000000000000000000..63e17544dd2c2d7d68ba6f99724a59c9fbfbd315 GIT binary patch literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy#sNMdt_}Yi0s;b7c4gmKz3lp$ zPGx1~ix)38FfgoKxw5vl_W%F?d-v|0IB{Z4O-+A)|Gs_uW~PQ$)=C!wwKJ9k`2{mL zJiCzw1!riCzNgdWT@QzUG~7vgAcSD(qC7+ zFWf$lU$9rAho#caaF5!7$zit-b|}33Uvi>OsX2XFPL+t`f~5^>ID^6_`L2*}uYIpNQ8!Uxv%yTcoeBjf7kqU-seL+Zjcl~zr=!+aU;mma ZyRwCGJKwvwuRz-vJYD@<);T3K0RS36R{H<| literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/mouse.rsi/icon-2.png b/Resources/Textures/Mobs/Animals/mouse.rsi/icon-2.png new file mode 100644 index 0000000000000000000000000000000000000000..d52d3b4c2717f5911b47520e729f5f8ed18d7383 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy#sNMdt_}YiY;A2l9Cc8CZ^=%M-L~rnLrVQms7yO?{z5GBZN@bqZpPR{T|{T$;1!?G3I;`uC<3 d#qQt4yn}`D`jqEZkAc=Pc)I$ztaD0e0svW%S4RK< literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/mouse.rsi/meta.json b/Resources/Textures/Mobs/Animals/mouse.rsi/meta.json new file mode 100644 index 0000000000..f63289117b --- /dev/null +++ b/Resources/Textures/Mobs/Animals/mouse.rsi/meta.json @@ -0,0 +1,170 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/e15c63d100db65eaaa5231133b8a2662ff439131#diff-8dd94e19fdb2ff341b57e31bce101298", + "states": [ + { + "name": "icon-0", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "icon-1", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "icon-2", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "mouse-0", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "mouse-1", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "mouse-2", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "dead-0", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "dead-1", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "dead-2", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "splat-0", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "splat-1", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "splat-2", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Mobs/Animals/mouse.rsi/mouse-0.png b/Resources/Textures/Mobs/Animals/mouse.rsi/mouse-0.png new file mode 100644 index 0000000000000000000000000000000000000000..b82f7affdefdaf4e7c5e97c64108424ca085f9b1 GIT binary patch literal 1530 zcmZ8hdoZt9(uirOSej8A#u~f3|MorK$N8S~eSW^@d~XH#d8w=EsR00>j_`(~6gER4 z5vp4hnuEh30N}T$2)Ntv*c_#z5$FN5}o^*}-zxG`$$D zRIS#Gy4u?bY- zHQp*bo);B(YDtFWzDHU-;>Lw`ByL^CeGKOblZF%=eJFq)G~E$jp{J}4h&S7S@mtBF z051N{)1hwBs{!we+j=S4xcyeR?z7yay0O?8pe;$LSI4RAX^>#px*$Ng(VW1B&h)&v zP=w#r?#Is!|3BNQTvo-`tmh9=y?_iV)wF?5C*r0DH0<+pOxP01l>Nawf@!OnffJcy z@%0?hegf4j%Z*UFxpc?KTw($T0|3E$RLFiRfYh@)j$3;l+p7rnP_1-ybi^bkCdQuX z3e$wF{o$?-0C}jYpn4@BC@2U3u!}rmK@-}A_NiUNF1%_ex>pQ&f?HMt5)u+JbZx>a zhN2DXO;JdTuFlT-!I`EYZvo#50cb=Sx8D;G#^$q>4gEX}=#RR0|#T zU0>zsj%&2j*)`_00_M!+4_vOmG8&CW9~kZRV1f1$*!gcZU=$@rneXTDCI4iF6-sIZy<64QT zkM*R%RegQ^@l=;pr+=r8k?^Q9F~~%AkLS=ZHiU>y7aTX zYlfZh8<0mM<~p}`?#aRMZ!T=No2H>^8$H^?8qdYW#Z@`bPBB#~l#KFU^)^|_(tnsR zoHhRLHv!=31El*RnC?CTyGv5NTU%0MbW6sgCM573_0$^}459>GlZeFj4Deq@B~1+3gw{8sDYMmmn!CRx4pGdqr>Gn)#?CG;%m6dJG4fB2MW* zSeg85ZFqUNTwG%hT>=hb>&JOK&)Vb9L?XL#$h8|tnzBXIeDmZzQA(-p@`KJRfE<)2 zOyZ))%8O*Kh57=$

KHCuZYKXDHY|YWB|qlc~^nch#=uW-2x*Nj3>9hR&W>7nk81 ziff7Fs#Ifwq5V_=%CyL%#Kp>VAr>0>VHDx*j34n`+R!d$k{^0T?JxBI^?nNf(CDXy zTuT4O&*5@t(3P(TyVmEj+jhT;mGc*Sh+_X#5Q{0>`g{z8j+cuR2a#jwfpIBA;!QbK zXI;Jxf6Wa>&i(Z;`}hH3QfE$IA8eu%tH}@;{*3${=(3c*GRuldXU|K*ls&svF_Hm^ z>$PTUme`0!C_tg(rWS9b`J)atyzujJzI5M@zVi>haa5b9&zJ8hq(Z2 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/mouse.rsi/mouse-1.png b/Resources/Textures/Mobs/Animals/mouse.rsi/mouse-1.png new file mode 100644 index 0000000000000000000000000000000000000000..073b4ef031a53bf080438c0803d41b1152662360 GIT binary patch literal 1658 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/mouse.rsi/splat-2.png b/Resources/Textures/Mobs/Animals/mouse.rsi/splat-2.png new file mode 100644 index 0000000000000000000000000000000000000000..297f2dbd4fdb96d7375448e0c779cb8a5d7427b2 GIT binary patch literal 487 zcmVO24Hnv7tv|rU#?l{*Q5=}3ns+jp_nEI3N=iyfN=i!JJJwrH=0cQc7n=LU z0#eE-8LugoC6$|F0Q7o2Ge!u3 zZQGeSas`rXH(FLK({8tEHk+1G$~v2!pjN5!ki}!D5b37 z=e9c9$M<~;?%%!RI5aD_9FFzre4XRq^4uiv?d}4P?@eKWH1q97Yam`7?X#v7o4(IN z{~CbL`}@GZBij;-kLpIut16+JsC+R~^$ji>EfafEns(YTyt)*-8Rd6a&VA#uUkDeX dVUd#mjytf5obdXv;)DPI002ovPDHLkV1l+|>A3&^ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/parrot.rsi/dead.png b/Resources/Textures/Mobs/Animals/parrot.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..8a87b42a3bee00e95f9eb741a0bfe42e96ea4e62 GIT binary patch literal 647 zcmV;20(kw2P)ML+0p=@i*K#iLq=9R7tAWho(15=fsIT*ZUJD>_lA4HIF-sl8gfqK&OJlb z>~Zjok1f~XQim2xFH^FEVZ>Q9}MACccI$(GUHLK&T(mBY

nrmghHUb@6`qG7k*`<1Kqtw2;jn8VMV9PvXuT@4I8wgB}t>{^E{ky0MZXFt2 h_pfSTU|{fn^9`Jc)H?=Fi!lHI002ovPDHLkV1i#nIY|Hj literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/parrot.rsi/icon.png b/Resources/Textures/Mobs/Animals/parrot.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..10459e3c3ce00ca301e93678104d1210e6e4999b GIT binary patch literal 593 zcmV-X0lElQsA1f`iw6q&OQ4d9$-}?3d3J|Z2N!^<#0t*jacz<0JA&v|g zEj&Jm2p|p^f&dB+ssRh500^-P3LR3XV3m}pEEUcm8ITMa0S+WcNJv{-TL2AF026!w z6@gApP5>5x0TX-y5^EF{HxLjq01|2%YSa*3$=gp%TL~#{00001bW%=J06^y0W&i*I zKS@MER5*>*ky}&3FcgGOnl_hG(xz0vR&FVRP@n?Zs#W>_|H{aylXj?2zIgJG?Cdvt zb|wISH3%&HBe11)!?zuad=r>hj@=*}M46GmC~_JB$i{}oTGt{7=gc*<%Qz<{VAGC= zjTPAIP}}gkgbKg5!WWcu4ZtS8IF}59;9OEjVjBPu8H%31qbq&%-4mf->p;T36d0nx z@On6i01Lk#ngIZDB6W#~-{_+OUnX(Qhh!9wb;N{oKG6Z=xSP}g7{yaLQ|X+~Z`Djr z<59zh1zLLYZl&gGwU*uzEt&wJjBeC+m+rP|L$l^*eop47bafrCt8I>l^l)r-0UjO;Rg_Py{_{&wl~qx_wgF}Jrh)gWYy(bTz^T2& f2`c!-{=f49C|eoyk3tL*00000NkvXXu0mjfz&7mH literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/parrot.rsi/meta.json b/Resources/Textures/Mobs/Animals/parrot.rsi/meta.json new file mode 100644 index 0000000000..5a57f8f46e --- /dev/null +++ b/Resources/Textures/Mobs/Animals/parrot.rsi/meta.json @@ -0,0 +1,109 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/53d1f1477d22a11a99c6c6924977cd431075761b", + "states": [ + { + "name": "icon", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "dead", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "parrot", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "sit", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Mobs/Animals/parrot.rsi/parrot.png b/Resources/Textures/Mobs/Animals/parrot.rsi/parrot.png new file mode 100644 index 0000000000000000000000000000000000000000..fd9079fd668d12dc3a1d92fef2e2a6a71ed478bc GIT binary patch literal 16667 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 ag7O!_w^3=EHkxbz0000I9w%=8 zq%67Debi9NFRTDRGF?hg&5yExX97wA&2}sB{%LU>6iLQP`Ci9CG16sl92CiBZF_QW z);5Zt+X8ys4oT-7I4m!o?T6(B(s>7Z-A*J*p!~UO!_xwD*9MB8O96C)IVEk#*3Ph4 z&F|V5t2tzAXE-J8yXRFQW2MM!GKEvphEvjp*<^ax?rsy|w^RxmHC|udP;Eg7wSbJ3 zBF%OSYLzmSs`cCV)CyQ@C{^oFtCXSHZYi?@>^QvrP`?7KBE0S&31~l{RIS5eHGk-r z2at4xbiKT&pCR&mpaL>hinw=tUMyB~>3u*4f2ajuXIYhXM9pu`0zr+kKK>*0Hx>}~ z!1r%oQ3GT9>E;hqz;HB9U|r1Dmp2%W#!{g&9sHpdfQ`4QiWA1oe?za^A)B>L&gZl5 zwOQLF%HwcQEP`I5{KBU}Rcrep!OlXj+qqp>?aT11n0)}jyntUUURRF5&6BZGg#OjR zZ(v|xU|{fMP*NWNp#S$*6~B`D0Ke~|f=YfR^#L^ULS0gfAiUgke6MH^hFjQdL`YOE zizqqKX8~0Lh(fgts6D{x7r^Nkq=>Qb;_#D)2iyu^*IqjBKsxV$(=Whbd4c!O4-~l! z-akL!u)KiNFWlr|_afeLxMz$VlxAyk*9K&3X8`yUDB14z(s95r^tv6wW~zT|zuf8) z*!Ur@HKOVRDA8hNLl!fDLY$H|x;6lSQvp0C#iXK0R94`g{UFd_N!W8ziIMGYFVkHK zWMwd!p|}Nz8%6JLR{~iXxD?>!P`EX%!xbKm#)<82 z|5tv}Yt|!ig=drLjf~eLiyCej+;zlZ5Ize~f`7sMS%|(k1-Am+Nk|sDPJ#eHIS7D% zDV#`LLaJIk?pgt@{C@wX!RG9B%R;MGykz4Yi_28p1G2lWd+q6t3Chay8*+*0=Om*n Q&j0`b07*qoM6N<$g2A?)T>t<8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/penguin.rsi/penguin_baby.png b/Resources/Textures/Mobs/Animals/penguin.rsi/penguin_baby.png new file mode 100644 index 0000000000000000000000000000000000000000..25b423bffd7a485e89b29e614b106a934b1bb250 GIT binary patch literal 669 zcmV;O0%HA%P)yo2o3+|*)~YB9z0J`#j({-m z6#(Q(r0@Lhut%Om6q4%8*Kf5w2BZ%FclQtam#c4NXc+ja*Xf@)+0AN*+uz||t1XYCRv#Gnfz-z(E0aOiY5?dQ20&GsEb{N`rl?CYeztpN@ z0?Prk_|@GGa|>hxw=B3T0OqCx;6Ic!y^oMwQ ze&n25IdlWKWpd*em-3&WGTdHWjy{01lU*&A#`?bi`iXyemW)-m00000NkvXXu0mjf DA-OyM literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/penguin.rsi/penguin_baby_dead.png b/Resources/Textures/Mobs/Animals/penguin.rsi/penguin_baby_dead.png new file mode 100644 index 0000000000000000000000000000000000000000..5d9a12a299a7c3bc9a3d426f2103078dddf433fd GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJBc3jfAr*6y6C_v{Cy4Yk1sZU< z9n=7GcnlJjxD@-P{i>I!KJ{g$$V}I1PiJ3W_v8P|%gg_R82xV~f*80pyDB4Z1n6um z|C+QyOW(CnWRs2ILZ^}q2X*@WeNzg`3tOxiWM%H`?QH~t#OL$=x>z=K&YGs&tv|miDjQ%$gL5$oRxhf-X1n6um z|C+QyOW(CnWRuOtg-%nHW<344vXkeXUS9$Gg68Jk+YJqX;LV-Q^E2EH0#6sEd~DtP zT-az@1^a_dEsa1hy}v)PYlTMJpG{M{JIYv2@-?s;Gcz+Ee(pbCLaYAYkqP}={mC8v zzDxR;?f(Bfdg1^BXIR7?C2OYHj}xZ-Pft*oVcl_V|As9AC(m$vFSWL|j`Z)*1@t(Br>mdKI;Vst006LkO8@`> literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/penguin.rsi/penguin_dead.png b/Resources/Textures/Mobs/Animals/penguin.rsi/penguin_dead.png new file mode 100644 index 0000000000000000000000000000000000000000..69245c07d925814ccd1c7469bf05f94251eb94df GIT binary patch literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJubwWBAr*6y6C_v{Cy4Yk1sZU< z9n=7EmN2^&nS9)|;jj9VXP@WCyUg_6!rZZOip+6=5(ZVV$4n>ql9aA}`fgVf-PDAHhUlF4uUMyB@2HlJ zxj*Hl@xyOPyo@;ww|{Un&-ks*W~g!h-qr4ftM-UE$3~}{`x%$LyV?IJfsIYbi6Q)t yv4KL9SoDVE;C6Ga50*_=uJrLG>~k+;V0gvlf8tvgqX;kn7(8A5T-G@yGywp2EPBuY literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/penguin.rsi/penguin_dead_blood.png b/Resources/Textures/Mobs/Animals/penguin.rsi/penguin_dead_blood.png new file mode 100644 index 0000000000000000000000000000000000000000..fa6a1432ad2bf4036cbde1f95812f47cb236fa0c GIT binary patch literal 357 zcmV-r0h<1aP)1w5&<;h%-bkTqiKGO21A>F4LlFnTp(1(%MI0-H;2=6ky#b+ED23cZ?jxNV zBJI$gkY96%qvzSq`QG!r@A(6TLZMJ76bgmnzf-HS=vc3B%QWjSkm@ZRK*qF6n9=}$ zF)kt=NRu@mjE04}-)d!j3j@SO?zqFvsl&(Td#?8FRJM2PWnFf|=L`N%FrF4R{ITU=u z^fmZlz=>YR4+E~RE;IV6?J#LH_JKDWfLxsj5Pt(Z`uAaYTR?vE00000NkvXXu0mjf DtR|sp literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/penguin.rsi/penguin_egg.png b/Resources/Textures/Mobs/Animals/penguin.rsi/penguin_egg.png new file mode 100644 index 0000000000000000000000000000000000000000..aa81895fef45c3c7b1c7f4f32cc887a683f7a717 GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJZci7-kcv5PFZpscC*X14w7VuxN?$nB?O$;kLnKP0zqo*g-M~h!N*2OGxiTSTV vnv2Mut!CG*yBuNP^SQk{laGO6{s!iZRgtIJ{x0SOI*Y;6)z4*}Q$iB}95G99 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/penguin.rsi/penguin_egg_broken.png b/Resources/Textures/Mobs/Animals/penguin.rsi/penguin_egg_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..e2e4f957de2888d6d7636265b3ced5525e42d298 GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJC7v#hAr*6y6C_v{Cy4Yk1sZU9 zu*|-`?uY$?Y4yLpy!^l1e?Es*Q$+iwfOk4R4n53?4V^;X8zNbRt#?#Q=gJ-cf#b)I zd-O;+%N4{eYvGzq$k6%i!ti K=d#Wzp$PzJJXVJQ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/penguin.rsi/penguin_shamebrero.png b/Resources/Textures/Mobs/Animals/penguin.rsi/penguin_shamebrero.png new file mode 100644 index 0000000000000000000000000000000000000000..99b01708019ff4494079d4d69fe6918bf34457b8 GIT binary patch literal 1395 zcmV-(1&sQMP)= zVuUP8Syn_+khVxSXn&HDP#X*lE4UBw%`Qq{65>y)w-0hJGqdaLow>6!8s>vx{_eTo zch5aD%$;*2Sj4TC+eCf-<=sBXYF}>hTQa)Ua+{pnJEOUFui`JqoM0!vPlQ|!RX`3^ z007SIohg`=a=>nW*-R*@+dlgA8NRsGga`Mkk^A#!oc{47_W+FUJI(I{fcD`*L`XfC zK-%t|H$nh_y^WXbI6~?T?diP;sYmI9q)hYcJODR9e>FGzjU52Mo3&L~T3x|s_di7F=Eq1~xq=hq1OOmF0tEvI z*MxEZj413DNnl>Gz%vc5Fx+7zUwr!?(S(^Cips*&}j zLEBSXy0-!~|KvmxSzj7iUmEYe^|q$n?z(8{o)Jo} z27|Jn^!7*5*4m7w^B3548U^ZTXgYrZZLQ7d?T@mk5rx%$ctLkEnGjZ0QPF}u4iVsva=C{f}Bf5`}V{@<>p zL0GjrYWxg|c#O==rir2`hi-GTX|^1-8}uhksm(0E>D8cJ&-Sr|dKMD#7~8CRUxeR| z*#}H!ht;2!>Sye*>vluW6O{dg?yd4$7VFgqc=Z8ZeSlXV0C@EQ0KEDDuRcIMTV8zt zy!wDc@!Ho1==Vl_nXL~vjH4Jo&sc=&14IOrvpztSpMj@7fac=$1q$V^4^TUT@-GiH zYH9{V`3r;q2P-jsE`E8ak>qAT6h$F=0=w%2^w$+d(P+r$*ELIXUViSygL=tHvo#;= ze~!8~1;D|NlKISn@PEKkNW^1AovF^xhge;L`u`#Cve;6603}LIr%`960~?X`r7hP6 z0Gtls$+4+YQKVc^pr3ss(4Qrx+6g5_<}(W-=C(jogO?d{TY%f}9N@M9x8XU!Ok>e} zy%R92Q78i1TAM}8ZGor;E(a9*pwN5TiBI9tv2kfWvrv$qEH>+9`4pacuF>SnkafOP$L-ku%|Lm2sKA;?0{s(jMA3~5|MtT4M002ovPDHLkV1kAU Bo-Y6Z literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/snake.rsi/dead.png b/Resources/Textures/Mobs/Animals/snake.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..62df7fb2c7933a0f722d51a92667c6e48213a7ee GIT binary patch literal 688 zcmV;h0#E&kP)hAy#Ye;phJAF3O-(BjWPS|q*1iy&S z_|)2WO&KTbJpf*~4&CRq|Do-l?&~V0&9W2#`ebHC$vp=5k0T6V6zL`ojb>H~;d(?L=p&f_M@H+~CSFVF~!gLNi8&a42P8hWH$xMu1JOJ(y z41nmxL>;Xmh=>l;h0vFdk_**r5wroIZ>B1t9UA~^blD7;ahNu}^CS_eOWjEsVlcEm znTdWe?S&a&Hl7u_=?-vtr%oTrOh-P7PKCYzXy)4LnC66s9H5#$3VcyWBpZodTG~#V zXqEwMv>$SSFFnV1XVY)jnmmRGMSpJX82wl$u;+mBLx(MC>xlRkKzmrBmc+Me(YIcT?RN#Sb8^{7o->B6n#l@=_ea!7{s_Gy~jDIt6QHmUc+m_UhznE3HI)#X-P|0}h zkQ;;Ky;I%+fdYl1Q-fz5x%IgKxbH7sAHY?pNZgNS2?Rh9{lGXR^w;fzn0xtKRj5eo zPpX1km^!%>{qzzg>v3O&$k7dns- yW3J4w?RrwOn#8dgX-?rQ8kgAcMZ|wtD#yHrOK|@APrN`I89ZJ6T-G@yGywpA%tq7z literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/snake.rsi/meta.json b/Resources/Textures/Mobs/Animals/snake.rsi/meta.json new file mode 100644 index 0000000000..7177be225b --- /dev/null +++ b/Resources/Textures/Mobs/Animals/snake.rsi/meta.json @@ -0,0 +1,64 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/53d1f1477d22a11a99c6c6924977cd431075761b", + "states": [ + { + "name": "icon", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "snake", + "directions": 4, + "delays": [ + [ + 2.5, + 0.1, + 0.1, + 0.1 + ], + [ + 2.5, + 0.1, + 0.1, + 0.1 + ], + [ + 2.5, + 0.1, + 0.1, + 0.1 + ], + [ + 2.5, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "dead", + "directions": 1, + "delays": [ + [ + 0.2, + 0.03, + 0.03, + 0.03, + 0.03, + 0.03 + ] + ] + } + ] +} diff --git a/Resources/Textures/Mobs/Animals/snake.rsi/snake.png b/Resources/Textures/Mobs/Animals/snake.rsi/snake.png new file mode 100644 index 0000000000000000000000000000000000000000..4b92f120ec981aa9a536904ceea6b4ccd44697e6 GIT binary patch literal 1115 zcmZ8f3ozRU82`J_c3GXaQ*Sbljj7|P>5)$8P${ZyN>@?AF>7;?tv1h;FvlhoQ|b}* zC^hfL7+nyiDyT%P11`|f+(?|$ERzaOt$zNn7WLjnMx zj`eiArp(m0e(Z=c4mgL50)VOs*3I>LEPbQ2=k9`wrU%BZ*51A;Ff6dn$GxohVtG`4 zcRFZNiZ)7i`Ya!x|48$CWFhIC8s_AORr&2Vh?9uZcpF!Eq3B*~9T^5i#)`qQe}G3eG618w2%g3mLS!c7WN#{1q@8W;SGp zlFSqdh6DP?6Y+}KCur})F>4z|)^F<22hssP5EWxG2HIfP&G@vuKbVVmDjRV~#ohYhP)qV2 z{5^6hb;xUP(A)2tyf`k;m&JldH|8x2=fPfJ1b$#+6f5wZb#140?cjCz-!C3!aa;wak0ska zs`Io=4wy>Plg`9WQM7U5lF2~8@3qRCO^77xU{LRE@tEH#qM(J=PoWK2mZ^&$yq4pO zN|~0=r|0>z_b5ayT%7Lyy2d0RQyJI2>5S=6;z2(DAy1)#d5Ka)=Av&BHCMSvMg5P8 zF!N`ELD#B*tVjBowA8b@CSrqK6iN$4X#G>e;2WxAJX{K2MV4nK-Bb_+@{fc85{SFc zJ>BR0OHh!g7iKs@=)L`Lgcpxogv{S{1$SRoSL`N7$Op?fZ30OBaY(qeoq#+ro-!d5 zq;D&U<8tRPB_jm0OfOY!7tbTI6aFm_53I!SOTa;Jo9~sZc7pDj^Z7Dy~MAi#P`b=AMyjVGd@=o2jP=3Ma*baE+)Je z5>}Cs<5fd+>T;)K_C7GkDB+Dz_MkS0JR@CrSMJaGJ)8Z-cV%p#C>DMxYs5bbWRQ** zL9P2L@4jfs;j5jjaztlN!Vt=Xi{RW58Yby9w}V$SE*-@; z5ft;X(Z-J#oT|k(oyAs9whAVg_tJA%f?00!stFf04>r4dr|t+gYj%{{)ls&61tLGd z_8%Hf26_pyc=)!A<3au5U`Fowrgip!VjKb&!QPxYb8wf_mPW&K0{=y}f7;s`>wej- I=|XVI-{5*gfdBvi literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/spider.rsi/guard.png b/Resources/Textures/Mobs/Animals/spider.rsi/guard.png new file mode 100644 index 0000000000000000000000000000000000000000..0bc66cd8340b7cb960cf627f77b0a5fdec88cf24 GIT binary patch literal 3969 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 W@Its*#%*?M4cJ)OTQ-?{-}?{Yw5%8a literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/spider.rsi/guard_dead.png b/Resources/Textures/Mobs/Animals/spider.rsi/guard_dead.png new file mode 100644 index 0000000000000000000000000000000000000000..39654f9037a1528962ce04892bdb4c8850eacd52 GIT binary patch literal 660 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 Y0!r(7Hen->rvLx|07*qoM6N<$g5%61W&i*H literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/spider.rsi/meta.json b/Resources/Textures/Mobs/Animals/spider.rsi/meta.json new file mode 100644 index 0000000000..be37234ec3 --- /dev/null +++ b/Resources/Textures/Mobs/Animals/spider.rsi/meta.json @@ -0,0 +1,221 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/53d1f1477d22a11a99c6c6924977cd431075761b", + "states": [ + { + "name": "hunter", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "midwife", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "viper", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "tarantula", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "nurse", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "guard", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "hunter_dead", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "midwife_dead", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "viper_dead", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "tarantula_dead", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "nurse_dead", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "guard_dead", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Mobs/Animals/spider.rsi/midwife.png b/Resources/Textures/Mobs/Animals/spider.rsi/midwife.png new file mode 100644 index 0000000000000000000000000000000000000000..9c9ef66268f30f9a37e550c2d5c79eb9edf61814 GIT binary patch literal 3928 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/spider.rsi/nurse_dead.png b/Resources/Textures/Mobs/Animals/spider.rsi/nurse_dead.png new file mode 100644 index 0000000000000000000000000000000000000000..8add1b16eb75b6f0806e183ca3431157b4e94386 GIT binary patch literal 560 zcmV-00?+-4P)-(`>L{DDd9!>AQA&k*6A5xGhg(yy1il!Kk;slvegZl;}V*zG5`S8y|#P$AdR;i@Zt7oW<{PqGo?^zjpkn4$i6oluX5g#DTN}> zgWc2V0OaVkqIKb0klJRdyMM{OrP%SB{U&VvMa zrL@x8Dr@ewRm$t3y)1Jn@zwwl;e5Haj7Wv)dIiXIzSrlsGwi%{j)<%di4Fzt!oz;I zwZ=FyYrF^C#%!3s_q%OxL3%6H9V9a4?0{RC-2XCj?6?drm;nY)#!RV>B41ayGUh#W zBYGX+$++Kby}XTu)G_%zz_q|pOa(_C8b-nEn21`Oo-fzdyk{6=I{c3rV8KU*yagp4 yF0bxCA{sS{N4;{mE2J{FQ+)q^`^g~R1M9g4S-xWQ=gj{Lw;-kM)?c?>iO(Arl&G3*G^Am z@M3ol0K`4ZK)sy|XqTVvY1f8@nN&~tfo9>7Jzsur;?MJG0KgyrbAT^?nRDc~-%6-G zNr}u&jA3)X3^(UFUhM9{C?1M?{1_4Q>-q28%H!Tc0|4-O>O-tv+DHCU&T*}=W8%in z1pfN^JIMFw`1^I_i}PtL%%p@PztFenp}qX{HOE+`G4>*-nm;(DWa=({O=oB4CuOr75YG@J9u#1O8% zV+T|&=}gMB>`K1=>KLVJ&CvyLUt}9v45EQop>_)Es4AM1rHuo}bu=XC8 z1%a{)C{<2iRclz7Nx?A7Fs-_9VqqqQ-@M9TeYWJd=h~0c_~xBGEI)sZmhp${S8@6Lz!9xv0Hr~H z>oS24Sfb>gOblUUd`Qbr{>%18{03g^?unYt?{%9i5I^L?zy852 z)}CxTn!v^RG%gyKVcZ;2lIK@yDCD=qwbTS&|6mpXu=&GFZ6S~iYmuhR-_MDy%89b@X@CI$tC#j+?3lRwU|Afy z`(PQyj)~Pv`{I~s)y3n>+LLX(*xeH&>3nv)CDOU`FLw7L=fD2JtSi6le<%2<@KwIc zHUMz68gc=)7(A5SS$_T+rd7w~^8@8Sa-Pyye*PNM zQyF~r=?wtQM-&P&4hj+q5M#&0^i-y8eyegKo|_kDQYckx$^jwSMf{(AdLt74>8Xt1 z7rrTKw^`ilqe7uV1c1jS=b(+BlOdmz@1+4@%Ts_^-0MRl0?9}Kjz*L06?3j`8KYg}~tG}4?^dE3`1M)nCbyRJ> z{Ao-`aqz;INBaC&!*=mBGAI+58iR)w)}K5sRbe%1Egz&=jSS)g6Qg*DQniN1rM?zp zY*PLvtNAx~miXy+JN$s%H!jYn9fK*#1Tp8po{_0Jj)LDhsyg^7P4Zvv2FVV;O}+LS zR_I3Y5Y|z(B{=%!3;^r_%rI*vWn*5j=S{jt9)R$BC^N`9691S%wX(uV%YdFJ*v?@l;)T6AnsP9UEh7yTY(Nae8B zj9|rlxX6%3R4&e^@y(AFWd=~XE#9M93;1(10JOv3;Hq!#J8Oc@7C8Xh^?!4}4C05& zWDsu&+-f(qpvlpMV5nK;O1>RbKq0yt1cE+2UUz*c`6rRo7U zrtXyi94%9)?ejY_%x?fj#ZRrQ7vyfhJy6td_jLK{7F1#?nBG9GzdDAc7$iM?w%byJ zn%6iVVfet0;FSTLiRhzJ zpk*bBR|a&NpW|_}#o0Cs~PfUm+216^0(SU%*uAzIL6%jrO0%j?l@EwFUs;kA$E zLpr&ZPv+<6JGr=&zh!jLAp9)5yStI(l!@g#5nqSvSE(5^n7+aAUSDu72XPsRQKD$O2W z&reIb7O$mnf3=8DW{0t~aS)o{O{qkSPU*N+IT89t`t65X+XCEsXkcmMpriV9o%8ML z`r+ zF1}`;zzZL+R|or9!rcje)%rylN`WSqLUWC|n?Wjax%Kd~-c8oWN5N0``qk*mcBsUd zv-b{KwH zU*}a2UYRfR@j%_`PmA$MY5gg_{NBXJBg4Lezmxnrzm+Wj{~d)sox`s_p6?LSEq=ay zTW)1^L3i`w08VD#SDydxilWoz3-aa>B6c2p`UN87tx&Vqgl|Ee^n<+>Ecc7XDtu~~j(G)MFZq>SfFA^%+;H2Vz>QxQ3}N`m z20xP{Trsp#ID^%gVzrK{FfF_3-P|vWX4ohm!W_1D1##>(U^VrSLAro$@{0g)+o-^K zL-R33?uXnY%3PDC8w03R%B|DivaeLNTc0RYxo%u;$Nlg-<^eiY_VF=>>ncrRiahb&9_oK41F-cxlsh$D@WH zZGM#d1@N@OYW1T+ki7THt^Ig3PyF6PIJD{Z2Nas0U6J+aJdG%(KRFDuEWX4^zxh4Q zZ}tUSg{$HxRWkX{xhZWGKWX|YkHYfH$7Fuulk=X+%!}J|g9z>nmqybUK~Q# zFYUE!v?7%jF@}|gFV3ft98EaH9m&xIzTQ5@@qq0YeW8onvb1ra+*Bb946}^;t3|>8 z=;bL2wNuC9QaLY{HV&}4Uk)t|r?gc5yYX`krrV|xDtNX4D}^%{jZdBsfl)kkeE$y6 z>ErbuKl0+Xj;gr7T67$@j+!4;+B`nT@^j^lS}E{desG{HSr=_36J7`gHniX&7+lKTmzw*aBu4 zrd1c~<$$K+vaQolOUA>X7yRAuzhw~UN1r}DmBI8>Mi5isZ}q2fGW$M^n?s zXa3^T1a6;iv4S z?`~Q?6Z}EMnQt4vvJ0T8%zSnnUvD3?n=|!J>*MAA*R<-6*)TiZx??*T~RuLZ2g3{ov=oPgCKATEg?`%ky1;968<4$MfrT>GI=`OU?OlSs5D?KXv{fHn=_o zcxls#q+NZwDowhcOQGa_1*rAWrD;`8=+&ujc=79Odeiv**q{sm(xzV=ayAhB8C8Z# zpB{D|o?j~m4%wiJY`LksI5dd-*g)V{!a9Bxwl*9C~P#Q=~@4Rgnw< z6B<(`?g4gL8wyd?s+W8c65gHtzS-H?nT01j;R#Rp&#(Xjzn+?dy{K>f3$ax?w)&91 zgIf`JqPS%Ex5PbB#H|RV@91$`c@jorjy$oJ;4zMEvODqwVKmlJ&V)Mf>#6h|;vYYW zCy6!+{CetE1a5hoFdA!nb6$--X1#gD`Up(KlVoY^)yq9C?p6eDMd;nCZ-6iw^Xlc^ zqc{P!Oz-EOrR_$I@b(@c1@J_X*29nsC0^dnkg9Jr)_NFnC5kZTK6q9|Rtt2xBYIKa zGBxe|jsODJ;;yhbow8Hp{BoEPd$Cv7^Xk8vJHH%Kc8Yrbu3!|WHj;z@#A z-qwTXm&1%e{NraPY+BGDGVSwgUhLHu8<<;a#9dKK`@rPMRf7 znkD_+ZqzhKr#k{>$t(AR47YjQ`kI*6NBRz7G)DRk2PIpRwHq}8*W!!4vlIn@*29oq zoM!B=?jAH(7>&ta$4nv0C)nxXOi=C26qox!<_GY_-qFdXoIO3PWjOP-K-U4~g!COQ zK40_pO_Q?^Au_0HQUxWrZY*#uWKiYoL&)1VO)frPbMUOXREU-qU zF#OtEIs!m*D9(JN+gjQR;FY%-BvTGbHpj1b=*1}?2ML|-h<2k!%N@e?FterwTHLJ& zjyyr&TJ++S(BRBt$pLjG-HM>o9r6C11a67Dv#O_dXI?MJmfCod5Hw53pvw7Wh+7d{ z-Q2Eh^DFy){#L-EKA5FA4`rXPC99gyZzEtvq1~wQ>3&wWH;Kcd6c6T30JDNL?*XgU ztaLzOmi>#OvZ@c5`1ZZ8%j_VT>ZDzVwX=cI&8}{4k-qa=anp$~8tXN%{)xBpJ)oc# z%4$L1VO94xiOXtXqd07cfP#vI*~`s$9V{A=Y4e!J?H|8>|JF;1V>SG#j%=^x&hoi@pDzOp1lPbj)7XJXrR@{Nc*b8R_dNERLkimHU{S^`S&)=79yE8)XK3IK3yzMG!AQI1A?ca)Aw4a zSGm5;5I6vWbqyOZui~WUR=qf2Lw37~xvH6a74^)l{f*R=aD@=LNBF|=7<`m1=Wmu~{J^4Rdf5Hg6ZFNhJIu z9JWW8L~L#317wcGi19rFE)eg3tJg*`YSA*%lSpuS8$~ICGC0FfYSM!kh160 z2_4}0aMoVMb9w#3s5EgniybJrMDNkw{R29zWdS6_dQF81NCd3|43voe%1`PFkNv?r zA^gFLlN7*16ZGQjaC>1tK(>R5v7EKSdU-!u6GLZImQRB&#BYYemXLt%A-P8R&p-Wx`g=tsMlrb z0Nf5}Oo>r=2kVy+#^jl30yKna^}O|=*+-nzr^~n&tt9Y=O1xI={j{R*o_gh{;W`^D zDAqLJ4b~bTrI|JWyQDm~djCxJIjMx!%JmY(QOE3+kSzaNP1P_z(V#7yn>=IrXi_cA z?*?I{Zt-`Ly3%fSZPvg7$N?af`|pJI4hzGM>o;GqLRDUNF~`p+2e!konAzC6I!4fE zF}=C=+I?iiw+|{WP^=mUMt$^M83t`sn@)sRxl@?X3!s;i+`y&C@ zl4KKJCtgeo*OY&ZV|EbH`aM|)zw&~&mg*Y^t^sq_n z@eu73m{XLlqkr4snf1&+L0b3{`CDUl(_s|!gPqqslL5rKkF*_u_mui^sp~hLQ#=Z6 zdREjDYd+PpJ75hzW&~LG)v>RTZec7(zm(4T#J~yg!k=U>o+(JccexP_F-EttzBbtK zBM$p*V6&e9^1G^+!~;P8*5!%A_{p7yR9J=N4Yw!qB=~pp6-++brX(uA@2}cL&FbN@ zhJWd#9{)CzKW1mjsewzxJI~zN)?fTI&W5@uLThm?BeU!8=>Aa3OCdpPX-nQ<77i%?Y%HA@Y=kb}&L%XVDsX1t=d4)-aM5n5&=zp^`gZnclsyIt0CIwpavupz8 zpglD4;I8l=yqA}B*sOC^z6dPAtPHaSIx+maQV{YZ|RVuSSpnP*r zi4C#%D%{()=fK9$-~Nh_a~b)>f{*TVFZO=T5A+p_fe6im2dU4?dI4lU?;f9PivL9z z>kGOUzUGi8ZB-BIy0+fSJH z9pl9|2akgn)09Ud8Fgq&TZt5crTuZF<<9l#l(${7P(J*L+*W9FCT%}cNS!DC*Ngs< z&C>fyjtOub-l^co3a^*_@p%XF+==7y6@0{{C7=@=4UZh)MjeB7YIbG(srpdDTRc80 zwnu}s#AB{`h@xKNHBl8n!+K#M>uV#YVvME~uo&*I>LCVh2b?V@n=k45{=q}GUg>9< zCzOZv-ZBbnOw1y+E5{Nk%+Zc7db-yy#M!erl!?J!x{2xF#Cgw3#|s7>S?uL`GUL5C zCnU-7a=*L+*+BL<t3{X}l|By6Rx-e4LxAScrj+<+Vc>DWlqN3> zQX+5R!G{C+w{utljMA~P8g>a1>$~`7bnbi|*pW%co9)EKj2}^rtm$$^@HaFY zCCXP&exUITw9APo6Fa196$-MH&_3xk%iQ46c!+JR6e)r556?d;YErNk5c!@>fLF2rU|m)Q~PC4rtvq(mY|s##Jw7rD8RHi_1EY%V0z z_h;_1hng16+>3H<{+D2sO!wan5qm!JVq{`qV_Kyx(?XAozn|4Y$SRz26331x8EEVe z{>xqRst#+EH7Nl6>YGI5aol|7MrlzJeHN*wk9D+wnK`7NkN1ForlkydNsaE1kD2X? zWjPC3V%r4|*ICS;3;C1#nQYO1c0C)pe;CcH;B_<2x%w$j>#ab}_7+4{`|y!^&*GgD zq-f_A&{?vKsdsf83`VJ`>F)#MF~Q9f1ABVVv*c$HeGVjQ(mpEGscwlub^5_>TVl*| zCP@uhYJ49l)`!*?N_}p%x`5EPwkxl$@Kh;WX!bB>UyGSQH+*_oSsYqngV{emCZ zor=R~NxJD6>X|r5M&o%}-4UM|R4Bj5GjEH@kFRnI%E$!ItBsJUD!w~weZm?zg5QwO zPp;vyon%FqG7e+4&!+{iaudBvk_gdql7ps`nJNFzdb|YZ$jOH0FArZop8jx**m}+C zUEsI#8O%9p*qewJ(dB8A(b!U8nJ(Gnqoh~c%U?OF;=|dMIrAsyM^Tg@5fl2w{&d%t ze>BG+ORwT>58|Z_+)EY7&;OJt7?2#Qr)8Cj_F~8b3qRBR@a7vg;++%}SDl*&YnBin zNux>zW!6p?27m0BN2DN&jj&&+*~sotdhSpNAt8*Si&OqxP@E}-C8Q|mV6~4~ND&e* zdjwlOs<`0#sFCHV_+PVK{_+u*L;#Gx;tT|NGpkP{fpL30T!&!vw3*qo&pKc}tQ=b_ zsn>x*dg?aW`m1R+3ZT$-XuVny{_xjdwrdpXe8$H&&9kmQ1M43)>{k6rvu&Z5`5Uqr zHHv5zRi2~Hpf4vKe(ix8KvDmOC2dbPFoDOhHJR!X$@iG&W6w1i)70tT@;$OW4-9vH zpXo9CEod)W$NnTWR|(kONbv*4pF3W{>9b3J^<1ZZgdE+!9d{BodD&UAB5EnU@MVX_ zo;?jA`cNl;yKj~~8)q{`i!iqIbx&W|JsjYB1Z`izZjWG0;R*KExGn6Pqgq&dOUf;R z;-jxuWVDtld-*^i1Q;-d=@rpZ2bt2~C}wlvTdJM_RB^=c)*Ibx0}8|Q$KG&Hv&!V4 zPn2@fLAiqhtU0bLV&N7tU3$C9w~{OSN?hxWt6>{@1jD+h^Db0uolT#$S}MxbkBT_p z0!r7eKzdbHh`aVcnkvhbXiZhW8_2UZak#f*_$yq*T_&cly?s+9>HDX|?(+)cOJf2J zx=McuiX>|i!x=#ER-a2rvyp8pW=UUXPX^U`^x$i`7S~>M-2G|Z2}Sm-Ge2ajxp+6hXUJQH{R(Tl9|Fs3mN zseDIR*(xV^6P5BHLx-2zXZ^b$It78h0A=H2*n7*}x}q(5L|M_5oafS zGWNXsvLD)ipQtMLO<~j=dk?cp7F>C^*OV`r&sSu7AD%W=q9c6x=Zy8_wXP;Afx z)^=n5lIbLwRK8RF7Jt(n?=f(7k`aJPk%nM3Ij4Ft#yz}tmH&CKVueMu3-jlEFiS5! zv6od#FMm)Gx~w48IvRKyOWL?c8c?2sq&LVQQ0I1-bjrx`S$Ubi&i%t?9&9|sGW}wr m>7Q(cSHPV3U(4tNjyZ_Qx#oj5AIrc;JYa5uHm)`DNctb^!rvhP literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/spider.rsi/viper_dead.png b/Resources/Textures/Mobs/Animals/spider.rsi/viper_dead.png new file mode 100644 index 0000000000000000000000000000000000000000..8a008976af2ac6320033da2fb6bab37083b35bdb GIT binary patch literal 829 zcmV-D1H$}?P)T(Gw^z_U*O;HQg&5wFy?NCqhkwW zmKJOq3#qj+M2_z4LeE*!CQ^nl7=55{lJkB%?|Yu}rob3uj4{R-{}@v6fe^y@no=qa zoBuuHVowYjDzb`Fp&W8}jO3+48H%iqW~^&Twz9C!9)koSgsm*BGhItY#!C#opp;4; z+{nZ{K-}>>wD0-u=*P;t5M)dUVe`2qrfW$C0H(ez_V`-Yl59S=G~^doJ#eo9LI~r( zI70bs5shXYy?$3R^=&q%EDOImWf`Wv&3gT=)M(a`&lY1fG?+_>a8P`jqCt^W@!Y*| z;Q1~HAuJ(VxSTqGkxIizrExiRfP`#;5W+m)MfbuH$rM?IrfA}MP>fQLnIfymJ$r#q zU*1cE5N4#(u$>ktr4lD%q|(Se&qWmn>xTu~X#s%n3C37iSZ7wP8q$O40Hsv&d>2-& zDymLCNeOb?j=zgSa4#yxVDb=whd?QnHdZ$Q0F7oH=bg@w&3UJTMzan8*jU{hS@A=Y z&`71x_xkXB7XXmY7V-V`Ysg8FRm@~&L+={Ry71u$`f@Gs^e* zd=**6OQz%GCY)?Bq2is?gXgGx$*iH-faVu1irf5SQitGS);#Hh?I--q6DlKewwG8H_?}+~F^zo+O6np$8 z6@2IfJ2w&mN~vT!EzD$Q(X{W>T`H8Ze|?5Z zyA1$%bt?;dzOJ;}*uOqQsZfUJyJ*^V%w%R`+YiJX0Y`B9@vE7g)UlXQv1OWgZCe0< zw?+3TIp)1D=ipw$5uo(Qz#(ii8_aFOT)&Gg#3lx};2)k9S00000NkvXX Hu0mjfi|&GQ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/unusuallylargefunnyrabbit.rsi/chungster.png b/Resources/Textures/Mobs/Animals/unusuallylargefunnyrabbit.rsi/chungster.png new file mode 100644 index 0000000000000000000000000000000000000000..74af69c98339d2ba55e1f6f0d2cece7c82fda3cb GIT binary patch literal 1461 zcmV;m1xosfP)z!Hpo8ih`{hH(I+gmX=DZ8?6yt6l#@3jQ`Mu;$JsvQCgbR zjX&A6i`0N(QYg5Q6p6ai#7&{W-gECg zl7ja;I!e7g>q|I`<=%!;sT6hOA%)w81+g!HY~|8!xi+{%sDOSy7g+pmhk%nt^B%g@ z-2o4uO)5eFq*Oq^uP5?2aSz?Yk!tlgchR$cL)&@a7*Dwu6`~Q1pCW}?0P!kZN4W@KLvCuhc(FY|vfX#qk zfBV3d!pg*O+s-LSasWe(#2gyuY8cdqJnE1V{y=gBPyw9Rez0C$L$Q=(BovU%um`8E zLn;dA0Z`=1tzXqW&h^X%&(-0zQ%7176uJlRE>UXlX_j$SBrf4oh;J$qFh zhmT#9{w0gm`R0Qu^?$NP4o=860e$AfcL=7D(11$IWB&QP&Og&YhIC*=>nw7cc_%>u&wQ6)cIz0@1d7U5niI^cVI08)L z33&g%Og9+YrkgWyF)^rBQbeP4BXyV) zGX8&me9Y^0uLJh?@06kOyXwHTc)mWc;fr-j3G~*J)6;V4+;`DU0q@{l7j#GPT2G3o zuM18GK#5&_Co1>2?%BB9DR6Y;gnAARs~7miT}=bOPyF`S>-^wR;D_@E)#1a2O<~Wa zz&7o*HM6{?VuRBGyZ4^VXbd9(2F3vILr$!{rA;WI}s2NCOd z{?B`rC`d7$D8HKob#U3$~mDL8D7 z$on{WZ+ODJKH+o#$dT$IwPc!UbHX?Kcd7%%uUh?~e1GP$y2iUjoIrlaf=tM!BVJ|; zW-X2q&=op|@aKjI$zd4CVK|+ze9cEy&m!D6Z|SuXu_>g^2J_@DdhsHA)7e?|-{S{= zs56X5vPRtznS=d%thPGah>bk8Z5N#m+tAxHdxmH_MGEMgi*|j$Jl6++OJ4!veY-xO zT^|sSrmqhus>54RAHYr8c6~s*J|G@R34(30QaoRwR*4X~33Kr^ilkj1(5???zWM;2 zt6d-9(Io^)?S^w~?ge7H`Q@Vt`Ef;0Wvk4beirQnIXySI$PeUAd20^z#FJ0{tvU!? z+ZG{;&ITdVR~6E`1E!`BDI%FycrLZYDI>jNMIvLMq1>SWW`1?PHztv*1+ zy+6qMfL(pDCg+1Y#Mp3k?N6e1VYa?fa_vzzO?`mRc>TE;{)Vp)hyit@t|8n_Qy&1C zp&)mN?m=sUs0{#I!;lHo2h?Iq3QoWl-Ky1L4nP#>skskc2b9yw;7ZMU)CZJhRn0(M zz|a|*5;sMC0OdfoE&bJ@>lnh{boBwaCZ7rF))MsrHqMr-53nIhXA$`yMtUly?(uf$ P00000NkvXXu0mjfv?IPx literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Animals/unusuallylargefunnyrabbit.rsi/dead.png b/Resources/Textures/Mobs/Animals/unusuallylargefunnyrabbit.rsi/dead.png new file mode 100644 index 0000000000000000000000000000000000000000..25dd2ead4b9bc7b31d9cfc2df9ceb14b71301d56 GIT binary patch literal 848 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 Bq5uE@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/cat.rsi/cak_rest.png b/Resources/Textures/Mobs/Pets/cat.rsi/cak_rest.png new file mode 100644 index 0000000000000000000000000000000000000000..9d6d13f93a1ea09ece6f56809dc0544b9359e73b GIT binary patch literal 370 zcmV-&0ge8NP)WF!N80VCt&CSdIY3ifE}hXbbZ|&iNP}2%;YF> zY?=frG5C`*#EIYk`Pnj%$z(E_OeT~0uh4GeXt#04&M8vioHKCF@D~z9l&ldID9^5E z*4D7L{` z5ji15BjKNL8x9H-^973e;>UwD1hrC-QuZVc?z7g~Nv*JF)EO_!vNJan6hc6%Csg{O zSMz;!kE_S^Y_LFV+!)h&_w62nF{W8SQoyfhXkjIn(AC?h@T5Td0Hp&ZbX7$Iw&f`< zXy3@UyA^I-Pr%=T*4Dtud8Y$XDO6e~rHnDa*9T(r!*BkciFY877|jTYZ`|&rX2e-k Q1ONa407*qoM6N<$f_E&U=Kufz literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/cat.rsi/cak_sit.png b/Resources/Textures/Mobs/Pets/cat.rsi/cak_sit.png new file mode 100644 index 0000000000000000000000000000000000000000..f8e99f1953fdd8ca5bfcfb75e7a02212bcc1bf5d GIT binary patch literal 400 zcmV;B0dM|^P)!ALTx2yDS!X}Hsvi^gGQdSvCrLcGCKVrE;s9{sYG4RceO3DJJ$MHC2G13z z1Wf!|Zy}ef$Or?!zkOf+lz^$)78mKoKNwh?_eNe;FZ=r^kvhN9YY2%5X(>=q_q3S< z=yIJy>#fr}of44CRix`P06--g@!clJZj(d3KO+^Q5&wK`E)Tp~U@C00W`>k9G6M<# uNfM*)r)A@P7VJ+pt5RDSzz^Z}vo_y~H=m}D9$wD?0000!OGN literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/cat.rsi/cat.png b/Resources/Textures/Mobs/Pets/cat.rsi/cat.png new file mode 100644 index 0000000000000000000000000000000000000000..37b105b12ed7dfe1ef4426f9a52bf52cdb79be4b GIT binary patch literal 2619 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 LNkvXXu0mjf5I`W= literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/cat.rsi/cat2_rest.png b/Resources/Textures/Mobs/Pets/cat.rsi/cat2_rest.png new file mode 100644 index 0000000000000000000000000000000000000000..b1f6676873eb64f6db85a782104f368b516af576 GIT binary patch literal 878 zcmV-!1CjiRP)iOM_^FF-q|G(#b&&z@50YMN1 zK@bE%5ClOG1VIo6qm)v?hI;ikv@@YQ!78YfQg<6Kr7TkFVbp&l*if%FZrhcXB#cF$ zQV(i=o-O6wFZG~4UOuS+0$%Np*GlLsrN&j?@&o{!IJi3{@vdGQPP>hOS5vFYcaD0E zb@@5ts-H9gUA?w38%R*-I|{(l;MGyj9dG@KBTcGar4e;RI32V$5b$d1+l*P}^OP^2 z0PsJHaP~ko07VOplh^V(hX6NJMN=f{wq{Cy!~_8N)~^J@0P4!4;Y|XpC@7&frW=F# z#!qdTlODZ~;>peEtij>cd3?r!d*x;V-2S5^WJ2H4M7(LA0tmJD0kG#>tr?r+>IdL> zRh2oWxtv4h_vpsF;>peCSY@byeT8n;9P%ekKqmAp?|@KypDC`noZLCK-;51@H#L_N z&E;glT%E_K35byLXH|Mx>W5i#y1ICf7xfdocu2ERFo#*$j6LmxY*n7?T zwac{rZ)RFV4{RGUWg8jAR_G#v%18JZJB`0B_$ss~g*< zm8fDyJi6rtz}i#V`P65L5Mkk-%}BNKG}{5E{TKlDj(Grfx{3f8Y-hKu1aMsMz><9olxZf*OQjtJIFJePQICQ3qqVYU1jsCkys29tp$79IZc)9QGzDWQkF886> zPc^i-hK^w7cNg7od$63m1hA>%0hZ>%O^Y{dV00!aRf^etlYEf-cz@_7(rB{W70)l2 z0a)88Xlp>F(!@dQIRH|TfLNLfZ{j3@{q&V?(+Knb?yI*R#!4&btNMz`7d z&e$kesEDi1PPi##CNZm$W=WBGnmcf~=Y7w6?tqVvkB^U!kB^Vf|3W+-7ynE=kw}Q? zrw`(o5&6EwlgXrz5JUnGh{xli{r<&4UAj;4bUH1B*bjVhp)#K@kY$Co+V0WeLIXf(=tz4n?bih|=f2ZD;CpsMQ0G;G^uI2@A8&;BHV0je%x-* z9z6#3@9OE3D>~o4Ga8K!-+)W2)e_-wn8{>9v)Ke-ySV`%9C=766uL9HYtV5V3WWms ze4g!gOSM|XFbwMTI+7$I%lp5+QmIfXm5v(#sMTsh(=>X$9$&wFMhX1g{+-)>^l#q2 tL(?>7vl)#>1H&*-Rn;@(*2?9w^b<$(!+w8dU0VPE002ovPDHLkV1oEP37r4{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/cat.rsi/cat_deadcollar.png b/Resources/Textures/Mobs/Pets/cat.rsi/cat_deadcollar.png new file mode 100644 index 0000000000000000000000000000000000000000..d065e3f898e414c4e5bb46ce1bd69ce38033ee3b GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzJ5LwKkcv5PFCFA$FyLTu^!%S2 z(SG-a+oi@k&pA$bP0l+XkKC&U`q literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/cat.rsi/cat_rest.png b/Resources/Textures/Mobs/Pets/cat.rsi/cat_rest.png new file mode 100644 index 0000000000000000000000000000000000000000..5650e1d504ff6e518483d5835946f1783d3f2190 GIT binary patch literal 741 zcmV7K;UZ-$yS_007@cx^fKX;avJ(j|E866j_$7$|%n(B|%DQ zecuNF1VI1*5JEr*VY4hN9m{#BN?HAb6_BQ>m!>Iz)l;Z?em(Dfk3tB{!r9tPl~`Kq zv+AFG5=tqXWf_DJu=d@<%gf8wy;908gP!NDGw(3Qpx^J~M^E7U!*i)BIJf>u6GUW# zAb=2J{aaBKTV@UkZqn=Z007hJ6vh~oJqG92KWM_0$)T5!F=oruCd=h={k_#{ZCxvh zqSWRurN7sR%Q~<+KSfahz|jo5;KmrV+im#1k6*u+ST6nmFzYpCUZ$7S-!U^DkF5{_ zd7fiD9s^iq+nI5nkHT(U7>2mLy@fFbkB^Utq6kTn!1Fu|heHq%-rn9Y7!39%;?nwi zO^ik(OGKDXr_j3kfA{_UJ-Xd4USD7F^z?)%iqPqF)`r}*ySuypQlDWMhG7_nVHk#C z7=~e(%kvp+`7#`BjyfYvMXI*7;yAWp7$T12tLX2TX=0*of8JFYto)W|Kt&<+nxrR&j(~#R(tbh^^eX60KjB2sU`kd z^8s~fJRji5^ZaV_0XH`{&|1S7!}9?=AF!c6pU-#J@q9o{eVz~a7=-5oaQ*)LCH4OT X;A_732aJWE00000NkvXXu0mjf?{!$I literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/cat.rsi/cat_restcollar.png b/Resources/Textures/Mobs/Pets/cat.rsi/cat_restcollar.png new file mode 100644 index 0000000000000000000000000000000000000000..d065e3f898e414c4e5bb46ce1bd69ce38033ee3b GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzJ5LwKkcv5PFCFA$FyLTu^!%S2 z(SG-a+oi@k&pA$bP0l+XkKC&U`q literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/cat.rsi/cat_sit.png b/Resources/Textures/Mobs/Pets/cat.rsi/cat_sit.png new file mode 100644 index 0000000000000000000000000000000000000000..36f980d37cb1d9dfb55158da3f2b48a1ecf9d284 GIT binary patch literal 655 zcmV;A0&x9_P)<6)bH+9XY2#Y_IT*_nBM|7V|PW?-O!1{!Fff&PIk%ToUh zK0Q6Hj$W>-UX5sB!n4_|5-4IrI+kUr;*vc5E&uxEyzbhjW7F~%B|Y6+6b5kIINK?p(VR*6)~U}`ecu@}NMFcLpE&Tr)b z*nDuiCLooF=5v#0Al#p~OE`}?##9B6tTD8br+7Uz;k~lwF=KW#q+#iz2i7spSu~J0f0(*7c(`= z_(U4d^Qayl;ks@BZZy77uQ>oLFE4ZQ-3iaY&d!cVjgBFNf2typ2+v;>SX^ABRSMNS zWo&$ctGQX0mX_E%_!yo6fSTjizm>7B>*R7dfZ)O@l}ZA@wr$qd)`E+xoBDnWS})tx p+$;d|^Yau6g>!LQ;C6F=>ksAp)y=mXoX7wG002ovPDHLkV1h_OD_Z~n literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/cat.rsi/catcollar.png b/Resources/Textures/Mobs/Pets/cat.rsi/catcollar.png new file mode 100644 index 0000000000000000000000000000000000000000..c420a6bdbb5cd1c7a18bee52f36ce7c043461327 GIT binary patch literal 162 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=nVv3=Ar*7p-rUH0K!JzF;r)L0 z;tG?XixZY~DJZ=2()xcoqz|Z!p`kYAT1SV*(tkE5Q)Ye@`}LBSEwg@o`4z5jsxqQ- zAQcP@eBa6pWD{>%Kj{&g#(TdQ(r literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/cat.rsi/cattag.png b/Resources/Textures/Mobs/Pets/cat.rsi/cattag.png new file mode 100644 index 0000000000000000000000000000000000000000..449b89638d71737ec2bfec1d8e6ec53a623f8eb1 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=L7py-Ar*7p-rUIBV8G+*IQyfq z_$j7D`QVEIfh??@yBX*G$#w^-0|Fa^sIadqE^Z3Dzv;~StM3=GqSz1oFlJXQSn5~RS>)z4*}Q$iB}<1j89 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/cat.rsi/kitten.png b/Resources/Textures/Mobs/Pets/cat.rsi/kitten.png new file mode 100644 index 0000000000000000000000000000000000000000..875d8d358c77331bd37241077565c7665b0d1be7 GIT binary patch literal 1701 zcmV;W23q-vP)8OML)aBBx}W+BV03uOmH*=d5pbVt{{)Gh_ohRr5UiiS!PR=Y79BdIkp)^<&^ zUJ@G9y%_dF{m|}arD$qW0_(Umw9PWWE?Af_R3PH$fTPUHcx0$73~xVB5Lf4R95kDp z-={fe&ig$7_kW&q-ZS$YP*6}%P*6}%P*6}%P*6}%P*8}7?(S~U-Q6u7wGO!~d62=E zwj-9Mr9?~1BjG^|5CExf=dtviRlL8W?4edc?Y_dh^5rep%gV2knO~HejQp+Bf!O~T zAB+~EPVwOXDwWqhtdkovY-;xviX@+xTN*8{wq{&vGXNdV%k&JoBg!wU0!mFr(zJ<` znvDE$CZCL_{Qzha2IYj4&9cXJq^~XHaqWcc7%_4NrD+rS?Mvs;r!8Zotr20y1yghSh5T_WIRp9fSzsT68;}mv#ng>H~-zj zUiC>i;bf8I^UiE7)F8hxC){a-i*ua_j?I&`|9?A*;vrAs)(#Low-@y|v?vvj-Co0$rGXHS_?@A1Nww3 z5s#H+fIi_0Nd^PiC3_G~2UF=oygh7|6G}EeTlXE(zYC5h_n?b~RhGjf{r`rz=(ugi z#f4s*xbgX60kFN$EJ{sA0S~7F>UNog+jd;k?J@~~>LUll`Hr(<_;UZlslW@pHsQ7% z|7Nl|6BeC00~YS9K5{@*A35-?{ZXc%prD|jprD|jprD|jpztlmpi?i}pAw7Fe|(_s z@Ha8&)Z(*uj{-#X57IePf4u$&Q8yu^0iH`9;ko1qE9sMovpvF|3WTPl`T?cg;j?#- z&YPf4@q{%dT-`wp7~P48Pl+c!C7$ygXM+Ya=+q*2g_+S2CvgQ;_|EPPOK3R!eBWN0 z-q^+Hh?69rH)Iu@?>IZJdvs^;N(^Yg=uSjx-UbruD;ex-CEr{UwBay!_SfWS$gP?n zuAnL^m%;NHh}u0>2gqGv z=2xZbXdmz)4)$~C3pa5ERiTE3q;^jghrVzl4))VN;A2(x3wQMe1CehoQ8`=d;r7j- z#|1Rtst+bycHSHc-SDU>Lzq%KNE5wiV`Hco(DVB0R4&fALXHi^#Tgf`uTG_6K#w*y zhBVR3jq9D%l!dOYH;2qjxa?f@1wJO=nKkItVy>)nSD2}7?oiF`+qTgJz|74~0G2Gh zv%O_)5!Y1T=i-cuO}{)9m0n@vF^kArl1`fFny>#}MaI-~j1?85J7;BM z=I4w|Jv%SXH!dMbl8BZGk|YV=xP&$~2Jh4~-l=IeX7=2pA?~F=uqtO(NA0H_G@*`OUBZC30yD*$$zl`q|T-s@{& zrD&gDrlLLhg)!IUXjm!Qd9Sa9FWvgPwAgJ{G>OSf8Y+;o3PMgE!hA_;+S!Pv$U@t> zQxtEmyeFvj^a9V2yzY%Yc~7P58zomcLj|S3^zE^>=NN zCFC(O5v3+0FMo8CPS5?HO}ZLt#PS!*@r_HwWNwOXcI)XAqVbqT1e;t}LyfpP;u2R! vTv0cm)MO0#5=K`;jc7b(5!TZu!p{Fcx9X=rJld#U00000NkvXXu0mjf@oH4w literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/cat.rsi/kitten_dead.png b/Resources/Textures/Mobs/Pets/cat.rsi/kitten_dead.png new file mode 100644 index 0000000000000000000000000000000000000000..330fd0bff55ad4665ac12eb6d893ebed441cb7d9 GIT binary patch literal 486 zcmV@P)1uT+RzYM6m2Q~&7vaWV1oaU6fFpDnL-hj4h|JGm@QZgI5>%mAQHF~H)|UO z9YPxlr4Xy21vTm75QtJSAtElqkCNJQ9mIf`L>FK(jppz{sBi&^INB z1bob`eMj_AbQa3~CqUwhkWSAKhq)}d#AmGO6dB`;S1lD(9{mI$b=CpEX+sm%bc$a; zmZ)j-V6#+STxcs)a&~SMxRd~JdWJ~G!iDqWyrr;yyq5srVRH-CbP9m@#xwv<-4B3k cBy=tBKd79N-xwx-U;qFB07*qoM6N<$g5FKlcmMzZ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/cat.rsi/kitten_deadcollar.png b/Resources/Textures/Mobs/Pets/cat.rsi/kitten_deadcollar.png new file mode 100644 index 0000000000000000000000000000000000000000..b45fc5ccede74f4428204b0c09e31ffe7d51e462 GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz3r`ovkcv5PFCOG%P~c%c@aSK* zMf>d%-nk1GaTI;`=TKo{U}#w1W4L-^S@QASj5FO|fBO=*@8L?;z-?^Pf3FB)0h+FVdQ&MBb@039$U6951J literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/cat.rsi/kitten_deadtag.png b/Resources/Textures/Mobs/Pets/cat.rsi/kitten_deadtag.png new file mode 100644 index 0000000000000000000000000000000000000000..2851bfd41eaab9500dadb6bfbad692e96e0bd976 GIT binary patch literal 96 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzbx#+^kcv5PPZ;2v_KjdLm`eXdl5h%vs>FVdQ&MBb@06Q=m)&Kwi literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/cat.rsi/kitten_rest.png b/Resources/Textures/Mobs/Pets/cat.rsi/kitten_rest.png new file mode 100644 index 0000000000000000000000000000000000000000..3d46e4f45d062a9a699c5588c3fbda89e75806f0 GIT binary patch literal 662 zcmV;H0%`q;P)gQw~eNC?kHQS=vs z7DO9?1(Jao<+ejoLlYv0BBKaavMjzGWNX6IrEJ6czE016Jp4Z2=lAgJ^8JERN-3q3 zQc5YMlu}A5rPLxdR3ZRfO*Z-O@*66V@jDl!tH~xGj5B#J;BWFvve^vaNd5G0_kB$B z-5-q?^QhOy3gC73y{rpQ5)lD#R{e>}RsO7-iHJC>Ohn_w09@R&7Jx5hqulMAd2eg2 zjjyZL0C4-s07v)Lux-;W>e_zrzQcn1rjMS`r#TBx7xWtvOPDEo_lo0}ujMp9Mr1?P5Du;o-o z)(4O-`9^b^bLOG>gi(u^bY=HYIPkWm+Szk!&zy!W3w&; zAfA{4z%^9C341xWUOdA%%!2+4a-Bc#TM7CNaWu9tJ{Dyx_!!G@gwgmUyQ@nmo#+Q3 zGU){1`^L>!h9iWZKcKv(5v#crfY6)HdB5F4`{!CCsVoN%E2WfDN-3q3Qc5YMlu}B~X-UrqB-_)A318Cl z0il2=)gDjE=X?N6x5G}l-8s*nb+c~Yb;(D6J`)jNX{vtLJOBUy07*qoM6N<$f^xJqqyPW_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/cat.rsi/kitten_restcollar.png b/Resources/Textures/Mobs/Pets/cat.rsi/kitten_restcollar.png new file mode 100644 index 0000000000000000000000000000000000000000..b45fc5ccede74f4428204b0c09e31ffe7d51e462 GIT binary patch literal 113 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz3r`ovkcv5PFCOG%P~c%c@aSK* zMf>d%-nk1GaTI;`=TKo{U}#w1W4L-^S@QASj5FO|fBO=*@8L?;z-?^Pf3FB)0h+FVdQ&MBb@039$U6951J literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/cat.rsi/kitten_resttag.png b/Resources/Textures/Mobs/Pets/cat.rsi/kitten_resttag.png new file mode 100644 index 0000000000000000000000000000000000000000..2851bfd41eaab9500dadb6bfbad692e96e0bd976 GIT binary patch literal 96 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzbx#+^kcv5PPZ;2v_KjdLm`eXdl5h%vs>FVdQ&MBb@06Q=m)&Kwi literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/cat.rsi/kitten_sit.png b/Resources/Textures/Mobs/Pets/cat.rsi/kitten_sit.png new file mode 100644 index 0000000000000000000000000000000000000000..bcaf7b46b1b646c6138087c92ea090ab18be8871 GIT binary patch literal 552 zcmV+@0@wYCP)1wCc5_MD7!gxxL#^5x&_mf`TT1li-=Szxj3N|l3oZ2E9x4c4M9_mhimdby zPeMQx4*|6W@gz}61b+^-7!AZURIo*?plSR(=$2x7m_WqKKBr;6nfHCanSlWh4-XFy z4-XHII?@)><-eN0yEQ2QF9%T$;;UDH=Ee%HdEnrr^1hk^h=@$zNmO;$7Sbi!(aon~ z9=~O?{P0};1Bi&s+`YMO&F#LYJwVj{hTpQ4uR$q5EP`y?*Z{zRV?)~C^=L;o6a9TW zom)mOzUA`s5`N28k)}au)gLa|LsfH59D!$qB?!hY2Ira>@7zT0XF*A`rZ@2MtG+sp zMUYqo@ddl^1-nS5X9&w1F6?RIvtA-Ll2FpDI?nY-4z$RkzrfXLo%f3sEjiF4TlWTwE?(AM>H*~U8UZM5$c>;|lrfDi^D_ueSP?+-OBfxb+KYp77%qGS#7Sh~!^q8^U z@6f)F5-6K12bjvhnZq!Aa-3Y=V5z)r#(g18fks$wIm{#CbWv8k)p!fzxr!tyr z2GBEcjn~F*UNn!Ojb=16m*xH!p%lMeleuyLm$f0bSp5KGQ;vLia&L9McmHv+Dd*q) q3G>B*%ohu?7Ppp7IpWq;^?m_UsZ%k_9T3dXRa(CDdrZ!~CChF(X(^VNsP&^~|$5cXRVw f`)%!SGBup$)bbIUG2gw<45Yx*)z4*}Q$iB}tDY-I literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/cat.rsi/meta.json b/Resources/Textures/Mobs/Pets/cat.rsi/meta.json new file mode 100644 index 0000000000..79e5c555bd --- /dev/null +++ b/Resources/Textures/Mobs/Pets/cat.rsi/meta.json @@ -0,0 +1,392 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/tgstation/tgstation/commit/53d1f1477d22a11a99c6c6924977cd431075761b", + "states": [ + { + "name": "cak", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "cak_dead", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "cak_rest", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "cak_sit", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "cat", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "cat2", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "cat2_dead", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "cat2_rest", + "directions": 1, + "delays": [ + [ + 0.1, + 0.2, + 0.1, + 0.2 + ] + ] + }, + { + "name": "cat2_sit", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "cat_dead", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "cat_deadcollar", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "cat_deadtag", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "cat_rest", + "directions": 1, + "delays": [ + [ + 0.1, + 0.2, + 0.1, + 0.2 + ] + ] + }, + { + "name": "cat_restcollar", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "cat_resttag", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "cat_sit", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "catcollar", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "cattag", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "kitten", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "kitten_dead", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "kitten_deadcollar", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "kitten_deadtag", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "kitten_rest", + "directions": 1, + "delays": [ + [ + 0.1, + 0.2, + 0.1, + 0.2 + ] + ] + }, + { + "name": "kitten_restcollar", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "kitten_resttag", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "kitten_sit", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "kittencollar", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "kittentag", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "spacecat", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "spacecat_dead", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "spacecat_rest", + "directions": 1, + "delays": [ + [ + 0.1, + 0.2, + 0.1, + 0.2 + ] + ] + }, + { + "name": "spacecat_sit", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Mobs/Pets/cat.rsi/spacecat.png b/Resources/Textures/Mobs/Pets/cat.rsi/spacecat.png new file mode 100644 index 0000000000000000000000000000000000000000..15fd940b54d6c4d428a22ca45253281661b27baa GIT binary patch literal 3666 zcmV-Y4z2NtP)q!t;%f0no2^pDl=BBwKfJ* zJC(I+XLhod6-nYuvKvD(1QUTZ35Ws`5m8Y|Ml^uZKtt2C&~!t;?)UocAA*Syu-nnu znq9tCT~xn&`+Lv%zH{!o_uT_bV;a+##x$lejsLGu{cjs^zi2dj%6@oll~I@DFVA0{ z0OO9gm>g}#b*)Je~vLf{M;{> zuNZf}w&c)uphuFVK}nJZCA+O#vfI8ne)vE(z^SH7K67gQHDcV+%bnI?KpOi50)gXg z_mhjhj5{Vkha!8Z{NO-gMo#{#0HdR$oG$;c&?~!;M+e)qL7|T{nmuK{*x{D|jb=~T zo%7AI=DahUe3D!^g1niJ9apGU`blJ zKfJy`vfBup6-MQI|Nfdrt3g&&1ZdT$RVvUK5JI5QXlVTM(|<}^`$Ty_u)!x@pXY!^ zv*%ObTiNaAXKNOt3kX1xBq~2Ruvc;pqZSI=m&Y?aXdCbUK<9+f(NWA_H)O}h&qs1e zcs;IL&I6|^{zyxG74DHy<{6E+9M)`Kd3_e3#WbJ*&Yx#2<`paN7X72W1OW<|yM9D)8k z1r$IjI&l$2kx>f;*&`!+WP~h%*8{+NRSkYn`i^xgQyA)Q%YJ0x0@NBUUw>7_$xlB3 zASNb;p}`>n^g%36NyXlKBYS;%hEKdc3ozK%jU-7RyHN`TQ^Iu=_b6W3g+S1o+>2VH z#_RFipNIFrDx)svr@33oH|IZFe!1>*Ufc5;L55)7efM2{wewfJ@vm>t((om-qT|teLaewtXv0mp;mn-A-so2qB@NY}vAf z-Me@D&F8ZKtBktM8S7SsZrZ$s0sAO}PKlW47>@kO!u?3Z5-GV1JKEe9*jEAxq z0&tEx_>bT1=dHI6QdU+*U0ofIEJ)<^=|;9~+vYc)UrXUtM&0Jb<&T#SS$eVc_TZFc z^fQ8SN-{UC76!~F5|%9UIsfhl4*RX;e?&wiZnqngsheT@ATwqJj;L@c_G&eVM^5n_ecj#dwJbX4cZ{Eb~b#rsbMr4%nzIgl= zK=F7;OG~40-R0dzIc(BkJ<^AEdEmZg|M(NezImcyZ_d}!M6?)JaZ<$KlFQct`8zPI+*aVu!lN6 zYuBz7$Bun2(o)jI_phg>q>7JAO2q2btHfl#eNcGv$tOicMTJOCP8I;k$;qOss!D9y zw8`(W{f>a(;9xpB+Ob;u?znEXTDUo2BP1l$UrN8x-`|hfY-aZC*}$!+=;`U9tE=mw zj}1UfwDGq3<48_U7K;`weCT%{ASE?bJoeaQcZ{`m?OKtNn)(+Re;U)6#x$lejcH6{ z8q@ecfCpY6@t{gq9yHfvm{5Ss%uE4LQ&Z!!KtC*9X>F>@PF$H@4*r*}JV-8>+Mm0& z!};5`itXFCQ&?EYjvYIE+FgwoFN__a4mDLC$={v@ z7Sn*c`9yg(VBWZJ4o#IuvVox%(}2=q8u0n_dB=_&qOh=#?c2ALzisPX{@f*i+0svQ zb2EGP>>)2NkK8R!`?|#(0S0?6wi0V{>9S$3J}QxnSX9c%Y9H#Rs1Ou8xg$PvmZSTIA*Bv1iX7nwy(3Tl(+n zbC&=$H8rZDqN3ZOGHC1jVVAp%ZZQoE10BGy;MSYl-B%DzA)JQRrISh1Vkys8Mm|iz9{j7y)O#I8qp>QQ`GSw>T69l~=|i zjlft{NZlugcK&+j3sas#wYIk6a5yk`Pp;L3=K`6TnPSC?6;xDI-1A9rrKy%A;Kbqm zdl3S)E&z|qh2r%Pd1*ERLDbv`QbN?2zALJl3f@hR#&K!LORuG$$V;=4g$p6;(CPIk z9*Gl&_wOCHTDa0Qbrs5(?IL?qF6Yjj6F#RvpSg$F*w`tizGS~y!>Mrmm&Nl8f}b&7X^?d|Qv#>UcT?wPQCLIJb^fyBkdfe^QyO-)S| zG0{emnwl!Iva&=$K>+~u_4QO%9p`Ly8MfYTgphCZ^mO&mXX(c!Nvv3(^*W%R?C5-z zQI|7TQ=nh5KI?UtB++N-r>E;X!-bHs^>%Z%x{S)IJPAI^HDKI!Vh@vQL-L{SD>S|F`RD{#%q`0`4yu3VOVq$PO9PHb-k9XdA2Y||| z{pr9a}PA6)$nw1-}Uj;M)!G?HX#)MYfi5UUGhWRVjXB7fUQ+4@XuhWUa zU|@7~lq*fOx1BF5D`VfjeMCe=uzK}sy1Tn6EiENKKOcj^z>Xa|#D)zUP!xs1!NCa! zn=rrQ;^M^1FTaeUC}d`4a_ZD6WLc)Sw-=+)h|y>yFfb6UR!d!79j&dcW`pRFrC5g+YkMsQV&ogV* zEXvBtNK8y5Jv|*+mXRb0v)PQr5IXUF!=2B5nfy?FM zCr@Sna>cq0<>33$b-dr$qtbBhRCV^5s-x)jdUA7f?{GdXEsf#fVLToWk|Z%QGD1&J z53($?eED+P+S*vXdNm~_C6kUf=?otm8!L*7i|Od-pufK#lgUI!M+XTB34HT)3tFv~ zkdP2o{&*Dt*REaT!i5Xu=H}Ab*~x_q7ief`cp#gtHEY(0Wy_W^fBt+v`|LB8EnCK- zMT-DvI@`$5&=9gLv*brhZ`(L;-aH~AB1lL`AU{8!uCA^LZJF|T+-9@ka=C7Q?=km* z5DZwYta)rL01aP##qyOaNlQz^GfqSu}{vX5-x1 zM&`xEF+A*`%hZWlqs15y`o{F&{#MGPFDFx{4>{NA}J%-EWnv&?^ z#fz$=M~~uixu#rq|G6-Ccj0omIC}Ib7cX9%G^~XXxLhte&K{$)vvbOHyk~ttlrfsl z&Q5mi+C|dhMU$$a(P*$*t-Mh15*Zm85B!)qBO^n+Q1B8~s}+q#Gikr1#f!wQUAyS) z>?Fzw=8Kwrix0!;=ABok(stK5wH`#B8(on|+JG49Hb9^2izF(g2 z7b;Y!P@zJF3Kc3;c+8A>{ZnIJ|J1+jHIG?b#L`*r#a6FAnE5;x&;Bn49unuvlLi{! z9Y&HQy3f6T^_nPZ*8^Fmvtte~Rbz zGp9v7u|cU+qM@OIrluxNoM=S(?Kbh{U+8zcd9&*zHk%EtR?Ga4myg_Q9*Fn$_L9%% zNu^Q%ghC+z;;|^ood|!Hiqx2D%ZE+Uv%F}t)7RI>;o%`mOH26uewJm<;lRzLqFc>5njWRJYfyH8>w)VbYB9UNr zb{2=jfx%$FVzHpp>Co%-WV2cJ_xDj%l|rEaKsueKSX8-u=@J0%^nbu-Lm#5iXfT;f z0J!7}Q$Ekdv)bL=UDnpt2nK`X^Lg@Z?=d(y$jrfAwPrdx zUgD=f0BdV2>C`rkmtO&3>+W6th{f31*`Zi0B1sZ=OsDB=Eb)8b8)R8#e0&^@MuS$X z1z>o1n47ob|7-xDy}e!7?RLy&GgrR!Q>AcR1t)1j(GYHDi8W-|A)S5?%) zA-N|leEQMb)YsRON~Q34Jjk+)(P(6JbQD>Z%e$eWAq~J^F41gBIKpqG00000NkvXX Hu0mjfRf4II literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/cat.rsi/spacecat_rest.png b/Resources/Textures/Mobs/Pets/cat.rsi/spacecat_rest.png new file mode 100644 index 0000000000000000000000000000000000000000..631f7937e60461ecf4944f7fe3c07b788ff0a349 GIT binary patch literal 1266 zcmV0Xkwqs!Do9;zd zw>QdQ?8RW+*w(_zT&cB`bx*_;gWLb}Di^r> z{OZ*za#tLlXO0=|A`DhN<0*d z0dVK~&rRj~UOWd-QR;Z;Ab7oA(`vPH?b@|9*Yr4kIVG>DsWI0oPRWOYF@}OM1DL&j z;Y`#1r?&x2-nw+IX($*=_KnO(((mzly=H4`E4jJ38}66aQ=Y~waQD*bo|d^-ge|7Z z#jm>GJyh-h7`-<#e(A@dsg)w^c01$a<18#JY`9-uZ}~f~S2cCMRo4Q{nSeFN#>eM= zVaYJ~?1G;}{Lfik*FwNj>Yn@e?^9M*wl0(KxPEy(<&~9{=7|#@v1gBm<40Rs?WWV|WNd7V?(S|}E*EzDvM?A7(%;{Y&*#Htv*B{NP!t8L)ymx5 z9J8~tXqrYcnFL^FW(Hl?&{P%E)R83#=k{$FNsVwQ%*Y=J>YDaGFvG*c!%|mQm$}h? zIlTZ?RZ%P6rnR+|-rioOr>7Yh7yuw1j}s1ui9{j{3=A+fHpb%OBB4--Kp?=#$OsOH zgDY3ApePCerm3&IU^o;eG95)tB&dG*z=sukJj&|tflT7WAb_f>jE;`ta5%Vk_by-p66J0;7K?>sGKt^sCmas5Yu7G<6B8tLlS^m5Q*lI7Nx_U1c`}%N~ zmopQc##dVhKxAr)(eZI&u^76pQ&LjG?XC6fD>k^(_XTZjZJauF3Q3Zv-G7*DiN%C?Z7zvb^GWuhnwnx<1wP{3R~ zzP$G|4K0~qG0(;O?=@3YR75lyrK_upwzf9%^YiKK?4;+r3s@``ZuNandwcssPx(yy z1p;M1&07*qoM6N<$f+NszuK)l5 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/cat.rsi/spacecat_sit.png b/Resources/Textures/Mobs/Pets/cat.rsi/spacecat_sit.png new file mode 100644 index 0000000000000000000000000000000000000000..09b93e9104f026087dcea7fb7e7a4eff78f65fc1 GIT binary patch literal 988 zcmV<210(#2P)77svc!`FOgs?91BSRt zc2o|InLwk4QPu*HSwfqINIPO#XiEpI9e-ME>F?Lq!v;wijIzv=d~ffQ-}`*O@AG@! z=ljAjj&Y1*9OD@OcPL(T!au{Qp}nySXH@n7xquzw*+2vU-}JcIP*Xb$@LKt)1BEEF zNp3Qkgvn$Q&mx}3KV>=d)-yU~nG-_5oumiu}kHKKb zh<$bSGxPY3>sJ9#C`cu@P^2Z&vP`ftNII1yFGsjQ#js7eb&^sYxXg$mtZP?-n8ul$Dln?j_comTtW4OTnGuJLc!_MVoFY)WGT4BFEf9mF349umw@H)5;~m@zuynQ z*_Y3Vwzf6^CMPEuxiyN*K1B3E2qC21eM`Y5mRD9uB$J%K_`#Qe=3;GK#yrUC7v!q* z(ChUe9$$dsl2Uqmd+F}(roX=*fRS6HSS%KdHFapUTH^6IN~MyTOXe?t9CbndE5M1T za%Ur8ZEX!%mT7Ei!fv+LKl-JkSu&=BGdb5830004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRL zOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5DLKC=JyVH`GbOXA7^I1dGp#5wHxYCm3jjDd8X_ZJGs6G?0xU^HK~zYI?UcW3+dve@Uo?sgv2mfJtRIkej6_kPi>xOq zXeUQ5EuBhIm;M>8L^*{Hor+{Km`-++p+kq#DbOwr{-gTN`r&tuFl5g&hWozz+{B6~IIVhNt+3C!A=aECBn&Jyn1NCo1st zowDV&C0L)PsagZ7H9S}pOJ#>%@16oIX5WiBFB&o6faaHFal~{&7Gn;?c_~Ir(>yW_ zPAr6AW!pHQAM>y!z!G*iHjfn`%=453_&E0z0P`|a03o=h#)%?hHEe6xL%;9>uHyok zrgOhsBx9}#;C%p_0Aq&+>(%m@C#=^OiiYCzzWBoQFVa6au)5Y)S3C4w+$x66px-^O zwcovEbOKiU0XRpUfZeMXYQ0g{Jl&=`Z*Se~I`%L+c{l}_etVSQK?mSq_%{9u@IHIt zso!HA1G8C~?02EomFEpfe2%mH-ag>FX?y zW_LMD5zi{U%+@mMH$Dzl5uR0g;nj)SM|W$D4bW(JZ3!11MqNOH;qM9{J8DA2EvTq~ z{uOXZmhxrAcwT#E5*Sla*OmT>IGo@F{RT)$O!|n=s)YU*BkIEdKQ`w+#DMyc;PZKN z%nzWMcHFjC%SNUF_uF=Af8<)n-vFtcI(*V5{>k$9H;=WRU&+Iqx4piU)#|GaupX|n Z@E`u%u3UOqerf;!002ovPDHLkV1mp=YDNG6 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/corgi.rsi/corgi_dead.png b/Resources/Textures/Mobs/Pets/corgi.rsi/corgi_dead.png new file mode 100644 index 0000000000000000000000000000000000000000..b52737b4b77f0e615445c385f4123c305c3c350a GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvl>na**Z=?jPntAk!}>L!K7BfK z=FH|u)=%paFILDu?l(A`DSZ9CkKN zTI0RO{96|=}nW7XoH%cIoLg7U*NqGB}svoz3sS!7=;ojf)pMMI@qiRt1(Ayb-&* zZ*ek{SA%Pbf;1yn-^{f)*eHC;Vd=s>Uq#4-HI$XNLvB(?f4+c+HKbLh*2~7ZP CCUW@z literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/corgi.rsi/corgi_deadcollar.png b/Resources/Textures/Mobs/Pets/corgi.rsi/corgi_deadcollar.png new file mode 100644 index 0000000000000000000000000000000000000000..35edb287d90744b01e18b0bec968e3849c582383 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz8&4O(g103_Xl{*Y7``DkfNJ{%ECu=dBc`kQ;n`7Cq5r QKyw&8UHx3vIVCg!0I@wL*#H0l literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/corgi.rsi/corgi_deadtag.png b/Resources/Textures/Mobs/Pets/corgi.rsi/corgi_deadtag.png new file mode 100644 index 0000000000000000000000000000000000000000..dbc4b6c1e4ba3c1bb1d88e238a35d39fb7e6eae6 GIT binary patch literal 104 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzeNPw1kcv5P&l(CcDDW_BY^slx z;reh{D?yj%ozmhw>x6hv8y=bvNOG5Uhij_dE44$rjF6*2UngCns B9{T_Q literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/corgi.rsi/corgi_rest.png b/Resources/Textures/Mobs/Pets/corgi.rsi/corgi_rest.png new file mode 100644 index 0000000000000000000000000000000000000000..8fa2495489e88393ed28ce81fe057d72ca8f4c87 GIT binary patch literal 816 zcmV-01JC@4P)LKl(4U?*Voq$zJ}od0004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRL zOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5DLKC=Ju|*Eue3NdMTv_uC9|j)q?d~`ttc@! z6~s2=QdV&Fa{-$U04G}=6-{8EumAu8I!Q!9R7i>Kl)aAAKoG|_TbhPgISQ)8u_cu2 z5_7WX;>?~bQN`NOP$DAe5f6Zkw9a)%Alp^$Xc9vaoj^kI8}L+&FaFrgStp>rspdcX z+nw3f&Jc2M|6m=1(7_#=P`huA@6d#DpZl@~pSvmmpaKk3;1Qhb%7%q(<)XD3&4qETLO3i_%h%nv9zOe1I#6Wdy$ZKm<$%2NmW|rEDFG? z118`RTm~$*`p9Hp4pSKz=m@yoI$*)b7@5*bQT=K9dEC4$Wv6*=N!Q$@@r6j^b)_#C zkMsS>yw+r&<@pcz_9*O*0>cgs}DiDZreJ3 z9;(4b)e`fimYfouw2gPns!(85q7lckI#q`tAF!yD(xOC1R&vZ*BpoWJ3MZZfJ&w8y~U;8Y1?y}2&d6qjH zZ*T6qlle8r$~Z~p`uqL!<zztL27o|b!6pU!tya%F-WsW! cGcas;$J{R_R=qxr^#@4S)78&qol`;+0OWZn#sB~S literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/corgi.rsi/ian.png b/Resources/Textures/Mobs/Pets/corgi.rsi/ian.png new file mode 100644 index 0000000000000000000000000000000000000000..4ee2f2544bd34e0325e8693f713189901f0508dd GIT binary patch literal 1313 zcmV++1>X9JP)XAdI2X$7nyECiV(X33${=mrdMlR=|~1~ut70~idUm; z+`PO2SOou<`CMd-VLF|4v-a#>^~x{mza;;qVu08PwOaqIb~7ZD)P0tK{b6W-3xp7i z$G~)YWj6Y&grmcdu>m%BFT7FjXij)H!FW8I`<(v`yqhFdqu!D8jgX4J;3b!<;-8@3 zZSv{k8+MTGh<&6&moOgf@fVXdf!C;Wo|8ega z4FL4PfQMn|d<0bdW!Ug9Eu^qI0LV;qbl13S{xxdUs8ORvjT$u;!R48t%JW4fcY@*q z(}mzJ`%=NV0g~HWmp4N!s^q2_Si!CEGD5E+<;Ll$Np*Mcol>i`8IcN;O}r@c>SKb+ zJ)rgQW#Yb+QZ64`vk>*dkgbO=s}|3l2WVezSd=_uvb%d&TU!IAGv;pFS z?3eT&1<3x^Ecj(!e0h6aD~}2~Bcu$_?>70y&D&aGyvge{0~XC_GUFv4Dz(t`T_}$N z8#iy~j9|75vMB9xEHbh_yMLfv_7*`bi|l?T(CPR}bnlcJ4?xZUDy!z|CDB24tuCOl zo*Yob(bYSpc=7F1=MR*WQvSuS-z7ZcUyG>Z62Bk;P&gokTVc`g+D~6AHxe?f-yQPn z<#e)w$^F9S?uFOy4*A)G-;mo&m_j5Shy)0eHvMk1bepoWm>z;`|6tz(suIm|@aK=6;rKQ|PC6K`zUAO?|!yqwnbO}pd zGarJxt_R$n0RTP*Pq}v|i*jt6TQ&xc`< zGFzHJmbf5Bv;cQJG>{(wWdz_-#=@t1;t=Gi??G@hFwwG&{Z6#6+!gUM;^1B>~^}CE_Vx zU3oajFtJM%Jwq!D1I&krYmeQZzRbYR#kMw(K)U%q>?a$h|APJ`z5omm*c(A}_s{?U N002ovPDHLkV1lyl=HvhX literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/corgi.rsi/ian_shaved.png b/Resources/Textures/Mobs/Pets/corgi.rsi/ian_shaved.png new file mode 100644 index 0000000000000000000000000000000000000000..2b71f36e398f7590758e96d841a99b9165c2ec95 GIT binary patch literal 1396 zcmV-)1&jKLP)gVTE4GAQTL}Wn{1(N68L3?6|{VHy?J}rI#Ld z*rA7o=CVtm1j^_&;7g-GW=vf)Vs%M8d0wI^=IvlVSyG;4y(h`(KpzP9`^oS9{=7d@ z^!ot`2?+@a2?+_DG%6DDYyV&Le;}%SzVNZ7)ZLDoDD|gAl>@+0^AAgImo0v0a*ume z`qN>IDJ-oH8mCH_p{`87&=vpy@?puh9XI6qoNqfQLIEISlh$|R!7ogCoRI5tKql`L zX7WNo5MBY9&vyU-hG96`Bf~iMZwEy93^0Da(|3B-YL6U2r|k%@fco9%&~@GVtKWSd z+L*w&m;W%i58MHe9}Z4ly8P*<`+6M64_A@Cx87@H@`JyNe~`Yn&aGc)3tX(d!n|qX zs5w}I^M#LavGxk--@ge4lBrJSVU|t87xDDY#@;L3i zD}AaDBrNZ#bqFLVfI$8%ir_Zi{4 z!25#wbS+f>PysMa)B5hUE#gFdx`x8iYN#Lx1%Ns$Ns=YYj^`W!85PZg-BA7cZ-b_W z8N9&xcrWUvX~H$l?~&Hztfjy6w{zC1{zm;BS-iOtNI$ocwOY-3%(Oe{C6Ag$eb3Tk zchXCqkdTm&kdTm&FlwT#6^OI$AeMK6jfzAHORJF>9_3gpA`bvHIEuWTg>j6yf)M*# z;V?#zqU0vh|C+4Xw<|bRgvw@UDU7@DqIs|zX$em3D`4#L8*BM0ib51c@tjq9od$C3 z@te5K3s)l)1moGK0DAR2hAd-hY6^;?kW#7Sn8m&fx~?PBUq!TUoJ79@+=pL3XHQFM zbY1uCO0QXEH|~6Ylm}~{$O6!{@A#%>7LfbvCt$)=gQPwQG|sRbf#(Xa93PgCchh;@`y89KL?SOK z7jLeltQVbQvx9MIAOhOet%3mFfnWw8P$7by)=OaKvw?xs*r>6u0=rH>`hIk)Agmx< zIs_XP$=i8W?#Hps?= zNKgjGt;5eA2CV-l*tbEq6Q;XK}=H3rNG{Svl!|tcuDhU03l+FW#TcX_Q2O+3Ez|a-S41hXa={NklK|)JGs6(*gX6hoiOTnd!Q^CQ1!9T&-p{vl%*+J-D5EoY|WNEKkAri4^ zORJJ0t>qljCYR<%FWQ1bzvV9X?!E7OFE5V(Ypk)x8l2GDb*i=Nbk#ngfrbNv4hIIE zs70=TtWT7PL>v+F_r3jKHn4eITj;B`>olF&0|0yuUy(aF@%e1<3UH7qa9@=_u951M zBkv?*3m6+**CuL_LOKGZJW{%+8Fjq|vl(8EAm|kzIS{u3 zX2b4ofPWt76#xhwT%iIy<8#z?iRS_@!lH@kGZI250LZfJITs%H`R# vWUCagbh6k29EdwB$(|e9jqvwB+y9Cmr+LseEH*=q00000NkvXXu0mjfMZf#^ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/corgi.rsi/lisa.png b/Resources/Textures/Mobs/Pets/corgi.rsi/lisa.png new file mode 100644 index 0000000000000000000000000000000000000000..0c517d95300a2d5827dbf18a4bdbd40e18a68156 GIT binary patch literal 1470 zcmV;v1ws0WP)Req#6kFAZA(jX34!86F^1ApNx?Utnm-_SUvklZ5qfBDhLj!y z!T1mYzQr`eBOii@jJ8_SjhiiAvbJG*kY+Ta-IaDmyK)cvfw1PSX5No^`{vEOF_0ri zjvP61z`~EB7ReQC+|kE_DJSYJn_yo|16!*9O8a9f4{Ct6ax3IOz#7XC7NmSDvA^KOO=5P@Vx@(Be|4ZTP3k<0u;d z0BW1R0CP710Kw)i%;#G@W1OGBInfzW4Yarfm?fELme7lUw$fO7uK)n^=Vt(bAPA)P z)DXC%+X3?|O2++Ffc`5G1D!3Y7E;;_B{smy&ZXhB4hMw3yK`ED2%$5dRq=5im{XJFu(r6WG@H%s1G=`jisStw6zl6shn%WN-2nXbR@|TK z+#3-41a4+V$oy28-6v4Fwo-p`&uF4|6((z>x@(H6+!$vBUB^~FplCM=v{GIM{oIo1 zX;+;xi2)*JAH3u4O9-LjwsjcnIWy$!gLherm!1d2)(wTT{9tnz3kwS%goO6&gb-?3 z7Cg^``FtzXS45g#kiG{DA5IF&1Aymwv0d3S_S=y18Ppw9F@QAtW+@~nR|r6-(}_H> zu`J8zbUKlJdW3;Dq`4wwvkEXHT=~3Kz?2(xTxD67!D2+UT9wDpxc!j?Az^eZ8~N^^ zpK#@Mj;W<;^pziZ0YaxNJ}igS;7rXDA6&WW$_kScC?Aps7@Yen-UN~K2;7i7{0m!m z0if&HN{Sn2L|(6j*#}ba03hTAA)aHv?-Kx0Uc!Um%FdO(O6Q<*{F4r+mMg~~|^rmSzw*dyhMK$LFD zmchVSx-!w z*w)oJBY6AWv(yWegb=#=@(0eN>kO{NN697rSINh%*Rd)1$W)khocsOT$k`NW?S@S& zYC35l$@#*{&ZW_A*!2AVpS_e?2kg>;=XoRd@FLocf^r{KS(2veI`T&jqS{%f&vnZ3 YAFxff;>2smq5uE@07*qoM6N<$f`G`~=l}o! literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/corgi.rsi/lisa_dead.png b/Resources/Textures/Mobs/Pets/corgi.rsi/lisa_dead.png new file mode 100644 index 0000000000000000000000000000000000000000..f698bef30e59f1abb7b77e5e6f19272153d377b7 GIT binary patch literal 594 zcmV-Y0DRAmrU)}ETL;58U01l-QS}90)b@fV8~disV#Kyb!i8K z6a}}#6+z_`ejQ}Vcc(u-gH56MEjsScd++y7`XOMCJ@(k+e+TEBIOp_Fh&bmYgdibA z}w+*Yh2L@okM^vK(?13Ok+@Y2=?;}k|b94yRNq~ zY$z6F7sDHvg6Vu5$Bd40zK?JKBsFIhC38^@{( z1AxXFOhfR;d~(}55I*7Yf@R}*9x z&taW?Kz6l^T1!B0D)qQ)T~!E*`?oIxID?bi#Fcu_MfK~2&7dR@1c5|6p~V{y4{J

C?t9-h>t=t g{R`TOiCt^_1(DP88wELvga7~l07*qoM6N<$f^78;O8@`> literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/corgi.rsi/lisa_shaved.png b/Resources/Textures/Mobs/Pets/corgi.rsi/lisa_shaved.png new file mode 100644 index 0000000000000000000000000000000000000000..9094804887ef8d4f16e1227d994b03ce2df601ef GIT binary patch literal 1585 zcmV-12G043P)2E3Hu4jwvoC=@Rmx^>Bt zAwvTh8e$4v0wFjw8N8Tii6r9+5rr$3Qrqe|ihVtc*Fk!xyVIR?@9EA-;67mF_dC7! z`}6+X>3%=J$H&LV$H#|-+~PXPEv}PJviE@iYlqz8I+^-n8hEB)vy#{3Q;|4uHiXT! z3=((FGmpz^Lx18TCVo^kJ;jtj-sGMz>;8btf@cbVhSR!FD)$oV{8(%p#gssDi|eGA z63AF=9Q}!lU|ofL0XQ210Br?mE1@Cx66(CZO`$@2LJ#*`Rr?u50eJj$=pMILJdx3am4#5l8>Wxse z`FHdN!3)=z^>b~3qlKp!Q&nu2noDpj_7RR2o+9|yH#|c!6TJLWt59XX3or*@tM?b2 z0w4$iPJJA+ybdIo4PipCIqmJ_ZD860we&nW9o@p=!M^47!-IXCj&7lrp7-QOQ7t`B zATGE6lDN#IpX(6p?F%!>-(|S(0`Cgat%a`ocNG9tRki=^wuP5Sw-yjf%ykt6t^iPH z1wqhcy?tRrK#q%2?on6$*>8ht84*0hVP8G!s;WXclrb2NB7E>iSH?KiPfvSsY1Poy zt~1c}7TDR{$6z>myt7Z8RLem5p0UjcQvgoPJP4qC4*<|BuVQC+AMtoRuwB}1&VKn` z{d*pu*H4|-WYl>^{roH7zgO+sUgMH}z5rA+s0>^;hz?JF2UIg$!}02uhEo6lX*k8L zpXm_H=kug8B%rr1j9vhccMaDok?(;Bkk6|m9*?`e4T^;gQW+f4^jBXSXPxRV7G9Bw z$yrDGnT^cn^V(yk-bp*T+Y}2MnjXEAc5)vdA0HndAD_2IH$@ZgW5I<6&E1pRGFRn@ zzHc!lcoqmx-U${{0*NK&8maUQrXq2s*~~4jlc`7?n`;^LCoUqEn1feAa6JIjc|+cg zr*J~wN7?Z#2;9k0r_h25mfD@fo%4Yl>ZLGV*{tm{rq^j8dv3h&+C1;KfO7X!0QGtvMHDeKG=yw6 zOOnZ?VHO)Q$g+%3V-?Z9UgG`=Fc&Q}a`v>8MwVsUuJoE#c4N->yHF5e#ef zRD&elbTm$<9D(f$&>ZiSk2h0&UjOVF(L_8iDJLdp1KNwuo{{FbG!PE$s--~y`#@L* zz)>NBp2}k&@_ExhYOLGnSAkwPe6uj j-*OPv&OCkIrY-*ib%!36tb&yW00000NkvXXu0mjfV%hm_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/corgi.rsi/lisa_shaved_dead.png b/Resources/Textures/Mobs/Pets/corgi.rsi/lisa_shaved_dead.png new file mode 100644 index 0000000000000000000000000000000000000000..fec42685a09114f54e7ee7f63dba381c1e49b4fd GIT binary patch literal 590 zcmV-U0{zrdg1?BFVN6GsQZy->R7QjlVn_GK$n zGPEkKN`$nQ=MbB`n2)~HcI#R4^6tC$oO|ERCBPI@Ofdx~8ubco)GKt-K7oNc?H28{ zTePocxB{|1VIpRth>*T-tQVt-xt+pL-$uPc6UkKoz(?m9Ya6>BpIKf3Hj-)Xqtg2s z;;$E>XXYad=(V_x_0dUqyH?{E}O11qcwpb&ryu zdJRU+AsDQU8YAG>7E4)GGiuOpF985+XFZ!YdJnJ!141@a7O|A`6cwy&9eToq3h>Q- z5cKaJyPr&Z&-wWwY7?><^;%ZOY~WZ55QE*DTFF&@fa3~27mut(_r+~6YQfd;gP!-0 z15qnrRITm?_~(J12Y|rA6)3G1{0Z9KZetjbO<9YzuOqOgW+xP#pp^OFiB=;#xizPnEeHz&w z2NP-Cm0eu-imvQVGE5@;_S=6aY7ZkZ0ZWS|;LdoUhXmC=EvOj|dz>mK^?=_cRiJTQ zrz^W$yI1@{6nTH!;bNO#ZtZiz{$~ZQ2)bs-?Nl2(6|Q=$Y!#1Wf#N9_0)Gd?WxN~ zS>#Rmq}623FK-_mvwwKN$>LX=U(HTd&n=T-PC{ZLybt$eYs08Fbp6p8B8t znb%?D3MY%WN8LJ+J)66PK%Ggn)3_~IUbb&8Io6L*6nTkS5bs1ESi`WFX zt!Adv?!!(JwV9^Z;fxPuLA_f^2Yjluty}3pIAx#G8D#?FF`%>jhsR5fx&C{ zZKf=WQW2k2ej-Jmf}F#<0qScXAYA{CG02SpY0WPHDC5DCBg>)~c&GF0FRFed5-a&s z`@O9jIjDXL(0}b^V${zt!wfUbFvAQp%y8dGGd?i2Si`hFiAg_5nug+Oj@5^05DENkr9M^b!PG$r`jkbHYxk-z-j}u)Bo2-afea@sxb78S*%em(y7#xD%^N`Z?g0wt9T9$?5IAk+fT=xp$MTq&>zDrv8%isPA!2aPu-|X!l z9%TF+1Ah4Kd)gm5!Mh@FdWji}CAzYUWm&lHRVrSPiU$a>jN>?1mKDs@lU9>GpwYVJ zW4le&sR7Z(E2y@rQ{!X1O`~n*4q@6`y08Q@K~nNy3Kt1^*1Ot zkHX2(vHbSyZ)mh`GidH@1~6uMxr)BIc$A(Ww$3ruVcrq zaCZKxCy4szR$c-~hfYb-^ zGcEeCV^?_XA5jW==7=6Xdk1W<0@cW&2IBKoIIH%L2ShC~%IoWq#DM1kYFUIy=<@)z z&KlSCNI^P=g~2=RPOy9LSCb!C`&BY~AfL3Fyr5SPwZs$@K`Lq#)?<*zLIeRSwPbs1 z6URTgbSPnQascM=!e!$k?z_4!VZCw>47Rs6IrH-c!YO>=1(VS`v_JGlgNOaEF99|C zkAY_sTvnbz<}uzqAUu9tz4WqgTaP{ikHOcMmz4bwv>M3y^%oU*43tpDE0&F%5v0*g zV!XmL$jsr9VB`$W&R?;;wb>^h2=vnpFR!on?N@Oit@#CM%`eEE-b+tkKm7FA9lIh$ z-jpJ5%DpLkxY+aM=(0xXwPRNTI|lR{2r2TWEQ_K}!pL{5`2{KRraW0qpMaB9Pp7!X zDC5hbsFT%)VJ<4I`Gw%}F`{qq&K~};$9TJc6cnLnRrtGC6-yU&iY3Vx=o^HDu5+@A ne7>=kx(7VpSR2Q)M(Y1RtW>Tw&QtKL00000NkvXXu0mjf7UPsj literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/corgi.rsi/narsian_dead.png b/Resources/Textures/Mobs/Pets/corgi.rsi/narsian_dead.png new file mode 100644 index 0000000000000000000000000000000000000000..6d792a2b54368ec8f462e5d2edcff46408ec695c GIT binary patch literal 675 zcmV;U0$lxxP)pu)qTU0b~+dEakmre{)0b zZ*I)JXdbyREQDbxAv1WCmmJ_n`0bATP%IVWMWBD5OMoIiIt5}Ug&fCZ;ye?%O0abr z6Mi%-+|@NDA`>mINwHLeBFb6bfh8S2N)UeLSy;U3L(nG9zFj16!|O74~*^<@+~p<<{wd z?POo2QTKkGX6p2yeW)dJ zst%p=j+PwIl7prM05!MD<5CIRF!=!V2LsNouUN7yJg+(7N`=nxP!4gb4(+%Hw9_-q zK$3b^OpBUZ9d&Oozz_Oq{glg#UZ=oVN4u_@5|25?_q%z0I!K|c4I zQi2qsBJHx1202D?UQDY?FK&o+zWCoMPt`kVrrfUXDqviREQ<;~ze}a;r27}WPUgA0 zV(ug?K*3MQooXx~sqcf4X9`d{#yea!*5Ag1H{QKO{7dpbil35N45I$aMCbqj002ov JPDHLkV1m!!G5!Dm literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/corgi.rsi/old_ian.png b/Resources/Textures/Mobs/Pets/corgi.rsi/old_ian.png new file mode 100644 index 0000000000000000000000000000000000000000..6bdc878a6cce5924b9cced7b0137683556c1d5a3 GIT binary patch literal 2447 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 TIjq{`00000NkvXXu0mjf!*NGx literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/corgi.rsi/old_ian_shaved.png b/Resources/Textures/Mobs/Pets/corgi.rsi/old_ian_shaved.png new file mode 100644 index 0000000000000000000000000000000000000000..0541d67d6ebc728c337c4219613c6985f6dda7a2 GIT binary patch literal 2712 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 OfP<|Is^X+i;(q~)HB&$U literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/corgi.rsi/old_ian_shaved_dead.png b/Resources/Textures/Mobs/Pets/corgi.rsi/old_ian_shaved_dead.png new file mode 100644 index 0000000000000000000000000000000000000000..f94b46fe72c091ebf34cacd2ca4abf6f48eb4e49 GIT binary patch literal 762 zcmVF|9LGOf#)A6?7Y)fpWiLysmtZa(G6Vx*6gU4?;!INhpJ)@(=_` zH!m)_(KX|NCr8%9;KB|GD^~7KSjKdi=IxHNyN zh)5(NjpOlnRgnEU$;Av>k>i;A?u=2o>EW_e-DPSOmlNHzgC7ECmDO@?Ew30;J_lxX~K;9R{%(k z&QT~7Sf0NHrBw*@Sd0FQ$0k2Iq5u#K2FYf#D2l>F_bdQi_kK!W&na-2gJoV?Esrad z&1MM(gVNkq`}qOad+SCZrwQ}Hqvu{39jdJUSS*I7X*?OsvALFUM4%>sq9`)Q!^6Xe z2GDgKfR2t1`G2B&)?p5HimdB>z$J3g!&FHlw0tTgs7j+7tn zZh^nmg2+!-{U99)psslZ#HP05s^p`{(TKv~ur$9iRf63u>sL~>Hp{PCijfvM85Ley`?56_qY?Xe5sZ*{fN sMyT$`sL^JJ29P?Y(|eYkihokS0m(-xEk&7~meE2cQAJD0zA$y<%x_4-3hRalg z!6r7Cl0z|3GhBzu*|KB(xRd12@;+cJo#gwz_w?@0=p8^11VIo4K@bE%5CoBfLANII zwEYYEFHFQ=x!#iCy0)q)TmPl0A@1HG2Hi`cjxn2WF$%uQNhsf&z*Bc7Ls?+g6 zXkwHB_SX&o>A2^42*X9&Mz9;pPki-U1FZlIx;5eM9RdKtaM8ZKEx+Z;P~B2E=+=bW zYA0Sd(Knj|uy8sah>c*F>PZ*}K%oNhEEE{~3he+`v&mdkJ^e70#+a_f+N^WhFc6mR z57ggIQEwu8e}OOr8sFNmW)s|uN7y}i(C$-LU(G|SjQf|``q~+=d-7o2j7P9$lX(Vg z%6X+f?q5D>H*p>?$NHL4!CkTQd2!bF8 zf*=TjAmR+VHBm)zq^f=k*9GEaRc?ynw%Vmvo=OWq-1)K%t+MY@GeBVrBnm1z{aJfys5Fay)Z_i>83xKy=i@a43rwMGF;b2>HG*gYc-4h6+rc zKxE#aJ+nts{CfMP^a>4QOuYH=NoylSo?((Y2_`z9QJwXDA7xf*;zJ>iz9P?xk-ZA6 zcD$|(o+B+w#cn*YD_*u=vMYnkO;Xlu0ud8c&Rf6P)9q>%?-5wCttl0$jovT7Ke-dgKZ1oQ2T50yEYguzZW(M4S_=)>RVMV;t#dcMB zUWN03Tum5b!tY#Rt9LMWeA$-8c)#yl;chqtPJ&{>j4{DE7o79de|3XyE!TZz*pW7| l<+WE^JWpp;*XgUU<1e>=Ct`_s*82be002ovPDHLkV1mPysQv%| literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/corgi.rsi/puppy_dead.png b/Resources/Textures/Mobs/Pets/corgi.rsi/puppy_dead.png new file mode 100644 index 0000000000000000000000000000000000000000..1f80afd4bfea5bdaf4e5a2b31c789db8a13f1293 GIT binary patch literal 359 zcmV-t0hs=YP)1pw6ox;S8i%fiCPdJslZV{HC+KB5`!a!?pmgjNs?G+RI1maN0;YpH)J`qOiDa4* z0{RvU>+%1;(9;8t$K&yMJf3SpN~xuk`doFR&6QGGDW&r)JSyI;a|vJz%|p_9+P=;5{BZ{g5$WH3v%*w#^3+y*wQ?>f>T;r8&7)N@+mX zt91XZSLw-NbT-bP0l+XkK D*I*$x literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/corgi.rsi/puppy_shaved.png b/Resources/Textures/Mobs/Pets/corgi.rsi/puppy_shaved.png new file mode 100644 index 0000000000000000000000000000000000000000..ae84297e042e39a5c9470a839d74804210ad9fe0 GIT binary patch literal 1005 zcmVLkijP2 zy!5iggTYZqafP}yYusvAUk`5+qixo_Z_`cX`9R>!n>Wv|JntKLpBEqqf*=TjAP9mW z2!e<}F`r~n`u+v|XJnL*>Q{bK*r~5y#H~LeYlwbh3dMYZd2M_v%ZieMJ6vL3TNdd6 zC=WltaU9-OReXPOP1*<<*m(_lD$U#V3I-%UfK&k3c@6c~X(*}+0I0vtg4HVkN>WD1 z=_&oUxj^n^_9DJU91}Gy^qGa_00O}Qf1^Wb%3c%6q3dYBDlu9L( zN+pbs={TBQkupFOV=jZlbdKLBBfjH_=^Tu?jIcc6DPYWHfP?oqJa-%8V>$q!>I_0p zZt!P|tHMSIlhlxyc^Zo-p$upivJ4uJer>`&Jl~TH@c_76{#Wq6er>VX|k~U|6M;p z5ClOG1VIo4K@bEHq?k{#ew-8Nm)xG~0zr!TB-2yk^|`3%sZ8vLFk%Zp(D}Fx?WgQm zGr&VxScRU-^t@T=y|1S-P!{@Abd6;TIV|<-GcTd4DooQ9-mW%Hlcm#XIF1A5?ftgr zJ0I6@b+OU2{XzmlE3d7J?a{j>zpFm;5&&S^@_Y5BX)?p$d;Y;7B<{2-#P(9B*Mtfr zkp}vXA6J?NczrIZ!By_Uwt3N_*FuFig$%>MP<_MKaV)LCLP zC}aEJ9wsIxVy)0vmc_20Tkr0C0DF19>ohrb5e)sU#aNw{BBK5%e+==zK&LWzl(dYK zq}J|mplmNf*8uE%T>B+B==|O~zYi+y_Zfjdo%HnYt+zjKl)3F)=sHjR^8f(gZiWxk za)7&q?K6*KpZ^|~WwGl&o&!U-(6L1B5wN%0LfG|`*!IOGjOv$g_S1t9Q<~xwT#9)^?d?S)mI`vyhE6E)F}6I|&xmUSZ`?ghd_q bH`(zMZr&8e|A+z!00000NkvXXu0mjfCK>4> literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/corgi.rsi/puppy_shaved_dead.png b/Resources/Textures/Mobs/Pets/corgi.rsi/puppy_shaved_dead.png new file mode 100644 index 0000000000000000000000000000000000000000..04584d4d443945fa0522ac30e78c5d0550ec289b GIT binary patch literal 381 zcmV-@0fPRCP)U{upbU zuhyAJ?3fBL#+=v58@zD`@Y~QyFvcA3<-)Wr8pf5Y_(y;oXeHpc;f*_J%E8)Jj%lV4 zf|?(WQc_{LsX8j|NiSvKC0~Inbe2~BWhT*Q!?VsyRlkT(M4f1+D%T{%B?7N-6 z<%N=76oJ(+FsRME$fJMVt$)>t>FXce=i2e-A;SktcJF&8VVrB0mw*&`y85}Sb4q9e E0O8s@?*IS* literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/corgi.rsi/puppytag.png b/Resources/Textures/Mobs/Pets/corgi.rsi/puppytag.png new file mode 100644 index 0000000000000000000000000000000000000000..b7d9d09d57972f9ac86266611168145df7b59ecc GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=5uPrNAr*7p-ZJEBFyLXmpmFbi z$WrwWc7>WHqS-4CRR>S2ae5}t2vo_yP~d#+#F~k#-%Aws=*&;ezP!F3EDR+4_uiDA mantceI_vj$2exlwSg@Nx$yDIs9hHW&ASIrzelF{r5}E*CH!&gr literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/fox.rsi/fox.png b/Resources/Textures/Mobs/Pets/fox.rsi/fox.png new file mode 100644 index 0000000000000000000000000000000000000000..912c87ede461a5e275c8e89e2089be28d8ff7b61 GIT binary patch literal 1524 zcmVBX>xTt-iY(J2qCnGT#`T_Op_NFg9?QRc`-)zM6>wqAU#>Kq||z`-3|1EK;F}P?|a|( z-uIrY?*kGN5)u*;5)u*;5)!&(THr{W`v0>0pjcJxJT@0+F~t8$TFrMbCgfR%VuHWU;l)?)LOa+Y;`|cse7A?D z^(yu_skj}KGEc;rSzx>ne0W-crW|2ry%~GlSn}tW>_R5jeqdGs0NTM$EcwhXPX4Nha60h=M-T{Ij zKvh+2Z*N0YRS1I6%Xz&XXUj*HyM)PCWmzVYB*C&Qw~pgDsH%!$vDi2NrzmAU^2&>Q z{xI!;p|2MJ*h?_A5wgJ4SuxVbn^`?0NaenF2)#(LFnJ41nGPHx8 zw(_2GT={HgK*InY-$y2M&2@v!FQ3@;gM|7$qyGa}I0Pwl`wx^Tg&7RNZh(g2x`1U_ zgJ1m~!E|CPWuCnC?VkVu!!VG|P9U8=$6sH*-PgB3uYABc_%b=btU^230WhFj;O?^) zxJM-zh5_m63Tm|zaF0s3`>e$>9Fu$>nHEdM8YNBZ6@E9YzMlb9{-Ih=(er?A|G00Wu_sG~^Vd1-9_w!Z z(o~)_|F+O?BfM$(2?+@a2?+@a2?+@aUBeQ(9(1_9Z%hjuk?-A(t&Du{HW`EwuKZQ_ zGHBiaOX!@2-}`L@=KO$e858ojajX3y^K~CBX}cS@0Q}bfoP++x@tw$x7w!2*q!C#9 zT$R4MKqrNVTW?dD48d0j%P5=Pe>;wQHley*}@bUeC5rFu?kIRVkMV7$={@bzg zrg`Bi4Ya@DdcWmovlFf%!gd1CHbh*)4ClKAd@E>H?Z87=GSp?5Ro{fE@|Iuw)t8WGjly6)TYHk?eq3F&X&E)i-BvB8C4NbOzFtBd24OqMiXyD{iV>u$?`rTJ0oO#HLs*rrfh4N@1_u zs0H&FMpKSL^+~&{?@@kcy_r(V8WATwEi*Y=AOP*920(KkiIbvVs1veAqskn!1Dr#! zQT2}rxC-0zXd{j|*Xek{XBh3J=IC@}Cwaoz1=t||S7DD814hu>%6FcoN?9Y+AmXG5 zG;CiqAMBxK#9Ms|JqxlA_KbCdoG0y7P|2()@ zu08+&=d4o7JkfQXXxbU+y#MEzs=w5u^` z`>;MrnJ1cdMs!^#N|`4^t<`;S9EWuJJTk+=UU~h06LH-=)>FdG(a>kD)qSMX=ioRF zt=0YZEzqlMuS2z-;<;fMXLa;q7nG**#5k*i<^%L%jsaa|Ste1bC9GSz7p@R@>v!AF atM9+}Rw2rym2YW9sbtN15>+lg(25VG6tqAnqX zEDdlG)b5LjQ^__Ylgbac+8HS;p_`2LHGw*a9 zFf0H*JcHotuT*q!yvohQ#Mhw8n5nQ_FUNa0N4qT9TMBNX}vy5 zicJd^bKG?pmUAY4klUd2V}Q3$bHzFFjKR5>n{K7uG3?yh#%MIcG@F=a6VLNl zEPms8UShs&^nH4MprYprWBvZXOZ9@2cMOhKng+@6K++!X%@?LG?pE7j6;$YqF>D4n zH^q+Q$m#Q&Nr;yZ3-y%1McMvyc8*rnjqCaYe#}B1pM2*1qs@7>EpTOsCr9$oZe8l= dy%hh-{0|$Z!FO^2JZb;{002ovPDHLkV1iXW2D1PF literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/fox.rsi/fox_deadcollar.png b/Resources/Textures/Mobs/Pets/fox.rsi/fox_deadcollar.png new file mode 100644 index 0000000000000000000000000000000000000000..258e2b5f06d2f9f23c1625891af985a01829383e GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzYfl%)kcv5P&pYxmDDbcx{QUm0 z&4fCwwGs^TS|`Y|?iK>7;WKi(n>XRjq`Tsi46`cl$!_}U!ou(;g{h}sjYyFRZ#?$G$CI0`nKju)(zF`6Pftt0ipB?nbKJ5-t1Ju9+G<-Wdk5hiB R#CD)*44$rjF6*2UngC0_CfNW0 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/fox.rsi/foxcollar.png b/Resources/Textures/Mobs/Pets/fox.rsi/foxcollar.png new file mode 100644 index 0000000000000000000000000000000000000000..83a226ba7c8e5b33c94bb9c82a0fb475229138d0 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=5uPrNAr*7p-r6YG;K0G+@auiE zl?HEcbG`6=$*<*?y&I-<1646FH0)f}w@NN;rtHkeZ_3ZL-^eNi3o|g3nZM>;^W~TM opU}ofedkLB!g&8&ab#>@zBOIz`y=ZQ7eUHAUHx3vIVCg!0L`p3_W%F@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/fox.rsi/foxtag.png b/Resources/Textures/Mobs/Pets/fox.rsi/foxtag.png new file mode 100644 index 0000000000000000000000000000000000000000..86254d3959663bb0b2b67af5bac5f3bad1f1bedb GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=A)YRdAr*7p-rUIBV8FxT(Eia_ z{1j87yfKp?$IcV6|3AHsb_Xg0g4JpHk#`rKd81qGl4tK!$_^1_(3qwixBvY9lyKR4 g`5ouNCb2f8o9E?=eBF3DT^Xdr)78&qol`;+0Kn`kV*mgE literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/fox.rsi/meta.json b/Resources/Textures/Mobs/Pets/fox.rsi/meta.json new file mode 100644 index 0000000000..6e4b003f46 --- /dev/null +++ b/Resources/Textures/Mobs/Pets/fox.rsi/meta.json @@ -0,0 +1,92 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/tgstation/tgstation/commit/53d1f1477d22a11a99c6c6924977cd431075761b", + "states": [ + { + "name": "fox", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "fox_dead", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "fox_deadcollar", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "fox_deadtag", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "foxcollar", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "foxtag", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Mobs/Pets/sloth.rsi/meta.json b/Resources/Textures/Mobs/Pets/sloth.rsi/meta.json new file mode 100644 index 0000000000..53aabb227e --- /dev/null +++ b/Resources/Textures/Mobs/Pets/sloth.rsi/meta.json @@ -0,0 +1,38 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/tgstation/tgstation/commit/53d1f1477d22a11a99c6c6924977cd431075761b", + "states": [ + { + "name": "sloth", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "sloth_dead", + "directions": 1, + "delays": [ + [ + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Mobs/Pets/sloth.rsi/sloth.png b/Resources/Textures/Mobs/Pets/sloth.rsi/sloth.png new file mode 100644 index 0000000000000000000000000000000000000000..66d8bb71c708f85f0bac026feabd69f5541f9dbf GIT binary patch literal 4219 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 Rmkj^_002ovPDHLkV1g;wL`VPt literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Pets/sloth.rsi/sloth_dead.png b/Resources/Textures/Mobs/Pets/sloth.rsi/sloth_dead.png new file mode 100644 index 0000000000000000000000000000000000000000..6320626c24bbdeea8edc034f034b359ffe29553c GIT binary patch literal 1072 zcmV-01kd}4P)4~>67)1|Wrpd%z}&g_^g+3XC}L`pzRdS>b8@!toZs(v zE`$jaCQO(xVZ!{+h-VqJ{*_F*x28&O_g=Wj_?HB-8>Qt?dP z#WQ)AT$c;?%jwka+edAMTRyLVaixyU>#}7qq_L&61R-F4c7kYoA^?T?xm>+ANO6t> zaLZswqqS@BU){#CN$>B>m$P#rG%1O;MDUWU2za!)U5;|s7e%x^k;4330D>V&`-x@% zigO$^eAz1i))lUm1|j+N%G1N7ckbNel1`h6^73*zfBXr6jO+sDXD0wC*-*ySYlC`w ziINRv0Cb#cVagZ8XpUie#>1}N)c~}gI>z>rWL@lu0^3V-b@;=go@iPqBq*ySkW<74;=5|%ACIpZZQ?M05Z zH1Y8#2dJ%Yz@C`JzWwzphColk6Kzf8ueG6sAR{%2NOJ_Frw|)dx!6B~!6M0C)Clxk zCwWH}mVn9v;LfxWmsv_j$M*ylRZg@u@m^g$8_PyeRTWJO(bU+;UsHi63Wz#qob;K@ zs4fTV-Ld@AH$#-gh(SP5QJM8Gk~`+rC)`Z2qM0Jdom07=97S1CJOJHSrde22@CQP~ zJ1lIec#s2qeSLJF{~b+ge6%<3v0Tsva<`?Ss&IMON9xTCQGZefXWlAo%Q;oi*G-yKH{1xda>i2&roMYRMw z;x#vWYO4A0)6YqD1X&2G0A!E-jY-ouG~*TeCLPTO Date: Sun, 16 Aug 2020 19:29:47 -0400 Subject: [PATCH 29/81] Fixes mistake (#1751) Never again. --- Resources/Audio/Effects/chungus.ogg | Bin 678300 -> 0 bytes .../Prototypes/Entities/Mobs/NPCs/animals.yml | 40 ------------------ .../chungster.png | Bin 1461 -> 0 bytes .../unusuallylargefunnyrabbit.rsi/dead.png | Bin 848 -> 0 bytes .../unusuallylargefunnyrabbit.rsi/meta.json | 38 ----------------- 5 files changed, 78 deletions(-) delete mode 100644 Resources/Audio/Effects/chungus.ogg delete mode 100644 Resources/Textures/Mobs/Animals/unusuallylargefunnyrabbit.rsi/chungster.png delete mode 100644 Resources/Textures/Mobs/Animals/unusuallylargefunnyrabbit.rsi/dead.png delete mode 100644 Resources/Textures/Mobs/Animals/unusuallylargefunnyrabbit.rsi/meta.json diff --git a/Resources/Audio/Effects/chungus.ogg b/Resources/Audio/Effects/chungus.ogg deleted file mode 100644 index 054ac995bf0c28cbd3e58f990176ea54953c7816..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 678300 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 }&-$HK;U8VTyhC9B1!VN`d^ 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≥v01hIu`;tUDUC~$bkKKxY%#?V9t3Mju9 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ⅈ8xwUW)Eea|trx0@R7seIx1bpfi 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 Njg8JvPJ+H2R4n<|&hti|aEuHAkvBtDu$egT+ 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

0T6v2ifXSdI4pN!7-{Jk;ymIZc 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 z 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 z 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

h}ILAdaQ1&?$60N=tj@UVL>62;8pUdM-a!c}| zGgb-T0&K%?wgE1?{-0b^u%S7Kh#dcRc0Cr^W7Wx)l33e^GMTQ|9D7bLV6=;#(@UPo zf_pc^$m4fz8X*J)4L%WwT)M|v-t!5Vds>?}6keFWqM?|WUQBMTr#RnB84vq)`j;$% zfS=%R!24J>A|6ivQADa)v~UmI4DK@I$GCUhP6!xo1|iCS(;cMDCoytsx8Q|JFjML< zU!3)i*n}ZW6ZRRY1P4X&simEfKD);>HC?=-Kq=8FN_lEuv;tzoW0 ziiLZOs@*d~g?wJYOs-Pk20lAc@QLwxe9WoDAgXkH0->y^P}RAg-RswMX6^Zb~Z{fX!7RB>6AH;?;tL!o~_XX}Wpz7ax^O* z+O?p8upXZ{!^y{k?w=q;Ro9fCGvYcBIqx@7e(gt3(P^jGfy=1#b)k2ciP4pOdklwe z@q!-(_gC726701j>hP_IQ;GSFiQMF1)(I(FBHH8hW3$*xYs5JhY87R>+N(L z9*BS>UfZC;t@@KcOgwxz1)^o|4+4uLrb2vzFQ$zkw^>@P(e<6HZF^^2ZS`k?fU z_*$NL>x)G5BzrU)Dfa|n91EuAOwp=RU+<;mS9sYj%edvy1m}mHP2kUGZ!agpyhm$B zWfjvBc56`hMRr)PSb7dub`lAi6@lU`T05RB<}_(ioTj0FiHnYG|GA6`Uwg1_1kf+ zC4usA(F_lL#D>%_?rwU}#^bVdvXAy#y-{QXc};Fj8!5tgM@*^7GjM&l$kUjhxoTrEOcSv@Q_=?&?Jcb1CmYuK7roGsxNC$iVG=SaoJ

8QjOMS93w^$&yY9iP0C2=>oPtoYq@QHl zpI+&XW$G_U`H_NO(sPce8edVK#;lIH4j40j-zU8Y-FCmvVPa;tO<1+V>J%{{>cJrBCycW8htiqxO>o5k#k|9ulzl zY+@Lw>&U>%s4V){GFfm(SIs}oj$7e_B=&5-*Mmu{MQE*0Eg&U|u!*qSNQ^__f0`|g zNsmO-`{zsL%qW%5PyjWA2_Y=1LZE7?El$pzD#IF*YAio94^wjB5a<1Gs*|+J_>A6@N_u3zWl0)T98NWc-q9t|VPL<(O2Z$1~{*7TTw#3c#h3dMwH#-`cYWnFU zK9eiYCVMl@e>}mhuG34Gj(bREFzw_i$UO4tt;|H7wMDUnW;Od+jYw&rpEAXLP&S#V z?3j0tV9oegXlLdVf8GKK+_bTj1KMa?Oj0f!>QHFp-4|Feu4Q|3Xft5v;$@jv!@WK0hubJ447xiT{R6kO#!-hLH3`(LoH_k zwwr};Qr;x-nk{Z*=7RZycBNU#EndA)_1}{AWV3x97#s);zE(ah_`fBP)WXw6V$Mnq zy!VMisM5$E;t`(LLPRf_ciKkBoryaMNK;11Jk7a}pceT=$%t!ML@{U$EwH=lv%D=s zwDAd76umV%JV4BjC^iQOm%)SttWM2*BHVl>W1QaV{3sQ!3a~$TU!M~qesbIazu(@K zA-d{5Vmo9tqmwn*OwY6r{H$}W@pCzAGCS6dekOrfv_3tzS5VJNr^In23wuv?G1EH3 zhO*!`2a;xF6_zvxxOg6iVcQQzs?AZ2^Gaf$tfni8Nvo3h5kikSXuCEGG^R8_`n1g) z%}BS?LQPVC9ycNd$H|>CmHs;U%!Ni2Jt8zli4m&A&JU6LzTM33JnR>bV6adCVct&I5ME8k zZ*q4$AvtbH>KO~TC?XXY^3B!kANVf$I$dro&#yO-B1j0Vw!i=lR%~Rd&F+1J3=vU$ zzUhE5F+rM?qJ3wwo>bZG7YR8=dcXW1AvL()9NX!3Q;ZvG$Ncfr8c*Zny5GmYV}>qO zZeHP@^WP19gu4{;Mv<}_F3JQ#zF%Y_fks@Fea}hOLaMZc7nIkGNfc%l|K#G%R`3&~ z2s>F$6h3qp^O0E4{OCx-`&%=%K4-%((0wvk!9s6xzv>4_XK2xt`?9!N94Ck1m?kv&jPbVr&zR)jqnT3we13VkAEChCZZLp~ zZ2KJs6bns6+R+#xG@|)*HJqr@+OUI@pjWOo&es8h76x@vizIT2u%z68YmE2G8u<0| zNl;*Xky0g@B(nrkQ5(!HS3vHhvH~=RrXx!#n4_S(-%XzjcFOz$-%kRMNzmIb} zN-{zhu-3J)ttFlu?pwMQ16FX6{3?+8EB+j}DvL(-oUe31sI2A&kbfkf47apL)oPDk z?|z3C8fW}Kh(lDM>E1M+$n+YRMYCvS{5(pURafS-&hWk6P|eTx%Ar!Wcyex1Qm%cb zlJQy%RoEg^u(-Ca4DFsBnU-tVA|Z2{YO7fw9no9i^es+PW6p%V2*rJPQ@6@m%!X^9bP z1~eeS2)?wV&8_-qg0Cfy4nl&6dmAbBxZ09&=kUPE&$4)Ix@y3#iWiaPz}l*T7gBi3 zD}GnDwbbs-UCA*Qdt+2I<@-yzH&;fl7Z>M-gbcL&SEW6l*|YK@U`n+}e!fT1iz-Yz z{T_0W)ZvvTN^A3S{RCgw<&~D8u}a;bD`&99j!8p2)Xp)z_TjJB=ysDkNOPPDm1Q`v z{)8euuPtU+@>a39BEi}KGz8{NjQE+Qcpw7#>Cvxpu=^@-KXG8-1ZL02_~){2p)yT0 zJ%n5%ZfP@8^T-GPOZWFzZxUBf9R-X6Fb-{`Kjfm6p#W6y3jA|{gL^S7B@y=ki!dX( zC2J_DRvk%&K5SNF8d$zxXj>utJSS`rG9GN^twG1jq>dhviA&Ofuyu#eihtoX(zLi} z!L^`%SxYCQiP|wwZ?Ghhh-_{YmY@0-bK}ve=m1>jp!`mns(kTvSnD~P79Sv(ORV(7 zfh95Mx)yYGhq6&|n0>+XyTV~GcawP}noH9o8X@Amaynh?EiW@vQ8^&7`vJ5@pmVuZgnoFfb={7V9jkWghQ!UElyN|qHk{myrJyF`zf zz=LvfSwA5#d$WI%K~W!_(s;<_slm`>Iz^L8G+oM-dD%L?A%2^|JCN~%h~l&un}dqr zHx*K&1U6;)FA4isH-hmjooiU%2iO=u@cgX5=;@^vuDd*ACw2l9j7X|?cle|y1c|O5 zou^B#xOJ(`6UlSp=vRZYwUU>2;M|R+hOEeSL18#Q!uCP_?jPg3(xw`Jl&9h|N9&a| z`{9>LaeJ}FUT2^wFSDjs(5xOWnZz@_Bd%#G!0=l#=PFFrslsZAgOwJm>U}DXNJrs_F!ISnNrTa*cv2@hX(`G zbj}(FoEQ(1CXeS^H{*y%jp_8n+FcB=$ig)W49Y|}yz_?@>s3juw2{-Cbp;)|;ijOX zt5D(hKv#<;_0qZh?JL6E91CN4`u;<{#6K?O5N9P5`|#@(4RbUgol=rLLq3B<9J|-; z>PM9>p6nD;WQ&2?9I&|@*}ftOXX#r`9uJwe0wuBom7s1=VA8@ahEfYQ(q}56;I^VC z#$_LQVTHk$WeA7Zajq2X`9T3E3&ZY&mi62hn2v_nEtwOo{xZ(azXqaA^^nrMS;(x@ z!oNJRvfb>b1|YfG;#8YvGTOY7BWg^+u$l!{#}{_xe%S(Px`a+@_I;+8McSAc-gx|0(HzREhS7YKjUEeWL#X1LTO>FGwS=9~vlBm_?ysDD3 z;qJ1A{6p)<`w)!i{t4g=P#QPDU*|vu*$w$urHD zhGz27N7+2RZw5ir_k!^oegn}`DTYvDNP~Y`hi*!g^vUhjM<>RU-y8AWk0{_8sT!YQ zWfABWslw350`wFrBQngW&A-~Idcie}USsoXG2T$tZT*R6RK8mSQQN9tHV;~}w4~28 z-<<|2^Cq7#uY_Eimr>iHI82JEJR$fOG9mBzrfPwkyB^B4wUH&hBs&Rm6Xcde72(PC zrYpt^NUN<{2U$e@l%L4Ub~u;B84jo5$DTf}T9-_dV^0U*)BXys#^vhMgP8+H`h7_M zD{VCVPuej4s8`n31wrIT2WvFcG_;hIRLo55EG&yFOPi}phkvGbX=!Mw={XrW{%i^n zC~d+Z0+Sz3&HO$o$^JwKa2F`v@VM!f;uzEM`N)uE>bskb-R#T6M&y=@GB;9Ff_HOO zglil7DkEWp-N{eIsZSB%n^~$Qh~!5Nc882V-9I%><~CB(h^G;;?c@wNz6l~MY+SvZ zir{Y8B(N#tt&bHbcJ!%P+C`q#BZ z_zBL7p?1Ee(9Z(sfMTWzZa=Iz7|2;op8fdF*sTCL$PToqKt@Uto~#ys%_=vu`r87Y znak2iquQkYoRS0R!S(z0;>e1%NGB7ixLd3}KZV+`*?fwd0-_|jIIyplu=xDV(EMaN zK+#Y=^`*b=>|cb4VPY;Wfot=xefa3G-lg?#RrV}A52u~V9eBI`rC-ze zSA7%NcrTtOSyIbd19jxe=QrMV$r%V#HBB9NVaw({_ZGbM!!WWiRECziKtG3#SQF&VW(z1Egu8qUHc014b?=Dc7*&NO~ z*9Nfs9rY)4F{wihVW7kWe}?P-h&re6N`iKc?j75BR5V`AGjCYso`J+W;} zcyjdoSAE+zRbAg(z1E8iB!AB#0G#H9tIz!QP;f+o@HXzVs6md|#OAJ2;)+IUpS{py zuPj)uv5{DFwFF4<+fKP$Hhzw;HI(hyz>$e#t=Ww)39TEJ_`al)l&0s+NF zrwob)JCmN2f#C+3D(81HbvEtg*~hMB76-%$E9+(nWYYG_(!gwvKp;Ty9~XJ6BHOzq zY-_S&0;ZOWp-eqlv=^sC5OHN=4*N$QXp@%^xkDJT3GHpuV z&bZ(2O}Mv!wXS|xL>s3MrDD>l;Jzz>xD%mZ;Q3+nyz04=M4rLR% zS-_x`BN&j!gV1s(Q6y9#pIRo1i)juP-D!QV6I8E#cnEX_6b(=ubczlD_*Z5C(;Vux zhUk5ixDw18!(iK}sfatV@ukzW$Q8i`-3(Qb$%1zLv;ZD`b>B_(;S0leh(E73kxB+x zzsDEpZk>v4V6mAYK)52-^xYd^s%g-z9Z{R;a72pe%C3}V$>4nvM}Bd(%Q3y#`+OF-zE2XKPNSxy1vf^Q^CTkH-IY+NH#(q z7o>WGzS_SA%nN^#HT0_kopqS;kxg#~xAA`T2sGb{9D-w-`@6-3lf3l5|KRfW8M>nEJ*5!TuA4rRqEdPYcXNT1y1rwU?{KW&VuR$GAq+C9aBs9Mlxao~A- zK1Z^|Zui2WFnYNFW-Y)$!M&zDF+dhJJ6)3q?AJn?vIlR*CV_d0PjnM}oClVwB2eQm z`|yYLJd8!s2|XN*l2|oA)`|EdD1tx(?N$W%TYKJfuv6uZUlm8%7;w9wxz+lbr}yx&l)^{H9)6Vz>@;U2k+ zzalqE6}3Sic?)(X#E2mM?q$5?{SR|f<22i*t?lB>=CRQs&H2j6L_zcN|CnTxOWRpB zsG960?jj`SB}TQsWy4WW-!I3qg@pj9z?hX%+l+D_<-J z_GG5-Gi z06rtsxCl41va$)oJtU9fkEM)YK|iSAck%@xzq6gg#|9`#QsX*Ydv|ZW84s>GhhvJV z$BvfS!rS$*iK%0x#ARJk^qYU&VO0x7gZdrdnorB~rI4pQt!5pQw8oR)%w|%$Dpj-H zaB2bf?&^5=XTOMa9IJ4(8F3*|coEOL9^CP9fIuau+0I^7BNtBL5EvP895A7P96h%$J*N2#h+ozO@&h{&C)4Q2v`0qds#=KGuc${CLltckF6xkj#@aOZ8*p@O%^<+DqhKxEWrnJkRuhVO7AeD+Vo{?fTH z1)@9C88N#H0H-brcP~E|67|_^jA0B^x*L*-k3Ng*51I=O^#d`2)UzB@YbA=ZjOUKa zMKOjTRdxQbt8N-O4 z@`!HF1MQ4d3~_${O6(X+ zy7^{UFobnTVhl;!7WjfgNJERYe{!(IO`#g#dYEv>o&7|Al4iGX-+(2vW-12H2Ia5s zcVt%AP*nynO;2n2&ea=446dz#gm8 zU>f!#Wlo`$i5^wK#Di92iu3SGyYI8+uSS58zm_kR>t8zBuE*ktQ{yP6$agvizq?k8 zcup9VO+@?$Q4`Y)o#GF!)c5pO>+0*bqu4BrT2!BObc@#2;p6q~p!a{g#x@xE<&5nd z;i5^$1fELF3)FY3ZGh7Y_HYIxzaUS)@eH6zIP~NeOo{w81p>QqVuEA{;sHB3n_+cO zk;qtp3?P@qY=FZ<*Wj~OX|{YYf{)rvkL)IokKaYWyMM=#>l-X`^RBLNPj}8%GtP#|LX%_kjj!(bLN&yuBsAPsl^nv5LLClOu90(;RxKLtE0OkU zdT5^`ZU$MhljoeX$J+xp*5J;Qc}WS{NNz0GVMX;dzfCR{WeS-`#q)o1+{r-hh;>dD z|Hc3bJ-00{1oA_Zd$4bXgoUEGANvVb5WGO-4}cPBP)YJJLiF3J=g(wG9Q~E{X}dj0 zjN$CK*z{$Wc%DPub3xkiW8~S61Bjpty8M!mydtfFxE;>q`79J2ngts zdB+?@qphQ-Xq(J;UHHic(!sx{KbQRr+Zf(P8|FuMGCbJQb-9$8+Q~(Qdz{Rt*kV(j z+x0r!iD{Tr4m#4|&S-<`QmFPO^@fYE1N@jmh;RJJMYFI9?FN- zO*jTlwUg9T>}Kf{2$j~EjmG(^EIpf}dK@ zvQLM_dyW2Gr)>700Wkbs^E;i^WMr(iZ|P73`{Olb7IILMIoBk(nK5lYKmnrCz7_xt zUT5ka0WmNrsc>ITc8rSQ5`EN}W0xy=GG4>1n?KFjxHteEe)hRWxbhv}>OiIGpnHF* zNCOv+3U=y5*HdbeTYqS$M1=0jSb2af%Oin80`~r2t&1ANo12+niBu*Cje1QvlY88| z+bgz=>3IAl(KZNhUKU?31prO7vlwXb@rIEcOLE2E4qxTSUiQr{>yeH}hm%H#S4|L6 zny$iM$)YD*V+==GN+8H%g}eeJ^H5C|6f&^m7)X}%!*6#qxhyHvw(znnmVNhV;v~KI z{xJExT$2?Bsb{y@|Jr&qhd8{{G!jxOQ-?8GajW;oubkXuZG3A8BESGTS`)?*)w+pw z?>a$jK5=J7ekc(u?}B*BowjM~U%Qr59Qqla&u{Q$31H8lI&KsBWgJTsM=l~im*~lg zjg$H};IT{s8QoYW?TcPTl#KB0N;V(V%nN?7tfh2PXuX|5d99N}!vwDi4ToL-J9+-% z0(V^pQ*_!OUl+UlSL4!o-qtd?zP_!W7jJN;%hVJJ4MS>34FMZ3i;nPBIL&{h_U=zuU=p3_`M(JGvn*7afH zozI=k@4{>pDYc?#enrY7lo9!>Kncp5%9SX=3*^ju1G=emO41CBQb}E!2rtt$SMjK) zaQ?g@#gk;ult%r#ccX;0D%P?8IUfF1^V|ZIk6#xPloO!HQ@v#NU_DaN@uVv_RvNmV ziwM|ydxQoxf&`LoIVYQf2$53=XHooPNQiM;mpq2eTp9ORiC7p2&aHKHF4!%QQw;GY3U=TFN#QFJZO$H3ds0m7nB zbLioW$bo(zxH^^&&Xg!lJvm~x-OiD%3`KM3!P!~w`F?kc7Vtu${%99{V{38At!#yH zDx_C(iu)6?%jP5u>xr?mr`)#-UNOkKNGZ0?0w}fDJ<}-A9|A`BG-QR*FD)NQjsqg4 zs6MyBB#6mLL_Z08@K)%6{|9UczWyhfF!(+~)w>3G6K?MBtj*4B9Dkc1sHkWu*ccgD z7}n2rPd6x8nD6fnx@n(6fp@@wHy=I{;v3a73ao{@b&j2h+QTC1#2m%#qnT%YDaP|CE@h)5h>_W1H)suD=^S0? zG98D%V9+Jjans8Scu7w0SN_UVZ)Z(!V(^pJv%qeveLxsvpER!NW~r^-!T@UW3WfJy zCGvX&GtY9EZj#5W>Mdq;<61e)N}_*XFMtB>G*Q=k!22xCDTs?7HHPT$!W8453Kz7i zr$go?;xYZcG@dTyxh&P8g8|HbX^*Y+00LgSMkokq+EHn&typ@wME?;B15nA0J6-Za zPFd&2%?*&-Ml-qS*SpwhZ0&k}&wq!eF614#x@9=E%rGZhI|Su>=MzM*YPYC-jW+`! z$vh3_{6k1Q1L`ad%GL80Uv6;n-vq;NHnZy`7wI*-xg;=MlI}U7)~h!G1}rW44*V`E zwo1%z(`+_pDK|KwUK?XeaHm(S*R0UyqGCw0F2udzn@BVtC_?v>c8qxd7_f!|YkY{KT{8(m7_}Cl7}dBoTP; z&4;;A!CaTW_C9!k?Z84L4>cvF>=#`3K^XZUHKUZ+;X!p6-zpRRDNDyqFA2=_mf5sa;)%E)!L=v-ECP=hr8> z8!g}@=R^_)W}o>}$S$>@Q&!2hyH}sk9VvlH%Fb#z6PsZtR6D4c+~P=E%c%sn5_fOn z<3h%1_-~l)pUOl>uUmZ_o2S);LIx+!Cw`-R-CW$|t^OSeabl%tc`iO;vH&yhkYG!N zj*q{QMKIU$RseFkqS&GrW`5i!W(XocbWe|%B$7?2IA%N%w88|rlw^8HU)o zKlSeO*6okfW%Z+GP$C`|^BhfGd=t3AhBOi&Qay_0T;6rZ3#!$I5)f8by^z{69n^bl zWPSGLHI|7E!|iF1Wt3WpnYUgAf%!6R6_%cw^dx&<=LXm<1&$Tjjv5~np zeJ@u^Yo2Cr*L#4R+w)Sa@UNK0eT6|23DeNm=1QCUSWT~vc)_wgAP zO{70GXb6o^RP#|^hO=hJ<=qQ{$v75}tX;K}UD`C)?v)m63P5N$cKci7hxY|@N-;|( zqhbwNc$6|k3H4Z)P}=07i%7rAc4jvS2VWyw`nWfBlj_n+9GGO_KUfo{|MiY*!9J3- zjucE_AgzonTqKg5%%2i?*~)$mK6y>(6c6~r9V(1^BMGS9&ZE)Gjl?+OepuX-02DZb z$MdQLEL*H`=U|<_dTDd~+KPttKUBdWsk*$J%*7P7#4=JDPpMP-C-vu!?2}a+NA~w8 zf>Lo|D#d`ypXwn7xnH>2GKx3wS|CkoZ_ueyYx2;-N>v|i7OLRJY>DR{EMnu#a@PA` zyE9OkMnwpYe@#y^_WdM>v?JJGB4?`-0Lgk0YzEPM5UXvlOo@;8 z9sFE{^^y#GDSdRv$I1Pn_@dw@Z&m;@lCJV&09vcS5D4kNrz{pdlYHi1XgLOIMh-nA z*&l9BE^}SDGT=Vqp%%xLhhXd1zaV1o+#gBLWh%1&&=r7K=FXPOv@5_oJ@a+kt^lH? zmB2$#g3vBI0m8xs_E`v2hvmGKuC>W1Qp>zKWjz>~Q*)c}2mm??KCd zrEbZ8M#+|;ZYK60X;N~I|8CSBGhLBS)?9i(0kRa2vrvM8_Zsjw;pwcn(&8o+j-v;4 zXB|CSB^dOc=`gm12dDr%iY^W;&@8BR1jSmtWx-z(8y~6)E$r1Z(?TKZXZsahDR38d zd7>@YkLWo!4;IE>HBbN_apb9BnyLQGJfO#2$qJPTMVL{qbYwZs`^J>f+qT5C<56#F z=eOiFw#p_Z49rEG-9U8yufd}dh-I5$QPH4T+QTMD$6}_~;Iv)YoW-!2SK}lMUJEWiB3yAEZ7=Tj#g=?*vmc zc?^cXmy$$OB(0k4!!$sZ#?xh=tBb|RDn#X>k|jj-nksWKkmD~^Gi%T_f|PiMis})P z4|<#(6HC5IONw-gwa(vI8#goB#_$*OeO*f`kGsOBnNZ?!za|snJJ&M}r)!Nplp<~; z3U}MR4-R=CXJ$KB6vSa$iT%Me5OQ~Ojkc387qoBP(=9!jj~6O>xkPbuHk2Db=|A*cCz#0jsJdg6$#&3scP+I(PGSzj#@LDHIFG~>7K)9qLb^6jGCwoPn`!^G1NAj z{85yoX_Ldx7g7Cnt@*_JN2Klgo}$1-o(u^5S+XOt=v3XWYk8(X?Qe#2g#U zVEx(T=u$IcHZN~V_qLji37S29lr6R%{)q^ei}Z?-(dHFOt|=x50?8Ss9i#D}bI>4L zcN8mII4Ph0aU~bH=*P!yvok!Pf#_)kDE@|ye*yuYKZgKhq*BOrCH;57yDzmQ>yNq5vD^nb8Fui~`QaI!KYKfBL6QZCy@1qS^S)cG1W^qzHR*c`BJm*x!|3 zMS(kF#tqPn@H-W&5JN&H(AnERTzO&6l~`|N%{QrD8EdH5x$ zb5B6Xy^Z?Px5%5rmmV9;re2O^9Le_S@h;sR02`34nkceu(dC3C)xM z3R2)Qm+xwLP47DN>=zHvL5ka5#vff8{=A^!qBozqpvb03tNxwb*7XfH@a;xcTGLB}j?k-WV=PfJMPQDn|1yIv zcCk?aWq@;v)Fu?q>N6Br6fl2_AO!tmHVo3I~qadGoN3NPVQg zX^Xh~bX3aK4<%s2!?e9&4PaxTKK^Hr++F|9vI7|Vyk>viaUZS-64M($3CG9FVfFGdlF#aAy3d3@iMMMk@CGy!U2E*?9(uLtP%C2b7NCD8cc^{_ksQVQ!EF%}(6kjs4UzM_-Kw|{CO zLBTIX5mGhN#y<64iVr{O!~Iy-mL+dI4BVbFuqch85iTK9m@gO)L{{1vyN~^6cCxM} zgWKs(t)xzM`P&0bjiRjuvD;T5cYnj=uFt2bQp_I^FhZH%kaj|c588nTvQGra#by_b zp_!j$g!4AXjH1E3(M1>JQ=EkdYa(}fal&b?B3Mv!YccgOkGi=2$n>ml=ORFQ{g>;+ zhfkR*JyWOk^f!gL&_-ZOi`-ie_8uyhU^2}DYA${9^@lXG)r%Dfd6a>s($o|2)xVDQ z_>ygZLRK3{XotFZ-(l}agkRg$Y<~x0l3&6XSn&Wc2uCf9-3^IoL#~?!Os^uJZc?kD za}Ci+IAs0=5meH3Z;=h==E)dIV-8`+2DZ-smWw?59JeXg*$ilV#Cv)#t=XG790Xs| zKQvIwwzG{PE`A6D^7+XC>Ap(~_e`zGOqH2*c#vCELts$5g1QE`yHTTM#l?YXl>iPb zE^NqgA$0WsqPhra8HUr|@=?>?j&*EP_?arPBpv$ZL&kHpGhA$JtKtxxDI0ra{R0g; zAwM`>RWX_4XAY@BvA_2vV2bXC{a<}DKWUJ4)gy>Zd6GH*qNQ+G1&=Vg!pOwJw0Cx_ z2fY+7j?x4;hxvs#v@2L(pWoD<;T=@ShrPPPt_xD^9O$3Ou>+ zh5m4kj_}m0Ejih7!hzjYEQwI->#mp~t+g9%g+q>^Tu^?;kEMObX4=h6(R4{xa3!qw z$=`3}8aw@Yixu`n6_RaXB&YBbJ));`C2FzZsq!|3*>}kdg1E+|<-D&7N93K4lJJ_w z^yFHbfS{#)(S2sJt>g}Kj;KoSgX%W}-bhLuq($|nxjZBDB{WL)7xAK=eP!dMNl~tb zBAPW%)GuIl_CzsgFmf+{7BC%B7WG_C8!-tk(nE?bC=(T z#nkXu6L%nBOp$`+YOphQ{MdN+T&iN?Wr;av*>+`>bSpk?;qP2awHOf*@jFVRyO_(f zbrZVMBKcw9edkrq&h1zM6Es`r$OTy27(_2J^g|F8vDWoSn4>9y-n*}64`Vx0nnl&~ zlX@4o@VREmz>{DAGoQ}-yjEA1ZPsDjh8mVE!fdd8%->z=VlQ!uig zyWwSzZ(rD3Z|NN{y*!df#db(w1+t%*rTQ*xhYjpA9p@qgQ?TN>9#==+@HcMMV6?+2 zJ2!5C9<~o+*B@+&&Emo;-x+A+cR}$2j!J9oqVzHp{u8wsis%pJVHo`+}wvOLJ9w9s8ne{bCZhmo>BX6_fQejL8bdRsn(5l)#l zSMdnFxFaLJJ2Yt?oZ1X}B($LuHnEcSqb|y* z^V0NCvIsey3lU?cX&Q&MXnnW_d;&W{3OjGuVcFGktI;iZsNtG?6@Ce3nm_*4vo8JM zz^a`8^4WW?s>KAuHyd)k+p;*41^JaHWyuN{CPgUBsK1!Xt7MYp;?9a{+dywTq2Yz4 z$}Xr7Fy!Pi^<(LZeqAIWd6|k*FerK^%?h`XaY%V&p+`h)lyirdj+7h%`mDOQke<*o zWg6SVKT_YAuBuss=d-~wB-$tG^;!V+aC3QMVL-bk;$8lYMKFUE%I}aS^fFTe#sed+ zJY=X=0hv?Ulzn3; zWo*jT$iXEgiltdUe~vw0JMP+G<>LKe1)ZwWBp3sLi^$-2{sIoSL;(bWa5}ZNeL6pd z;YGF9p~ae9YKPZ|yo`FdVz6n|W!i)WO^@W*jZtWRQU`5wDX0t+5q5*a0T{z8rn-uK z96%aAn>Qo|uQ1Oc0GtLOelocd*`07MSoQDkjA^txHDH9~CPQ z@l`1bGJ*qGhl_`t1u)BHF8_?{=Zfissr(FHHBIjtZ(u)D7cfl%n!;g5CTEnIk9Vp< zzbO|KGbtK6%p*%JDD9`P-v-Z{UIwFEtV3O+kSp#^HCU4Uy)?qcMc>&6vS6b1Ps zlLj?>Zej8XNBQYjzC$*Fmsx&mkj7uzMC<4hYLKpkeWsyD!RjwOW4%V*UiaqsGRRXBXeG>fI3M8Vn^az}4;#rF3iFOH5^62udS;*f= zpJV#Ue-H2m-}4HJxH11POQt<4J;ZU0?g+`FabC+8G=ZW9Q#67 zVWp8YZYujkpCoxwd{Fojw@uI;^v7!2!3YbKHXpyP>n=H=gcOX^M9n-SOnC(K&l$}4^8=wqPLOcd$BoKXm}9N z`qY)=TjNCi#`1MXt6zf%brmDqT%2UvmbFHLl<9LzHYWLdpXtEa1mn|({pcB+81|2$ zqPW$*(k5W0;ZH`;qRbEFrPlqY?;G%M5kRi_b`TDL?c$4|58VL(FxU?~fJabPs??&i zj9rCZ7VUe7LpkqegM9 zRu@pe33v+s&XcFm`lTpd*UZg$oQKPe>*-wQpU5+~id#z@)pz*$$ zvb!wFvo}Fn3)I7CXFUy8)|h0jlF`HV^Uo_JWRMi{V%HiXPsf(lV$46$UAEFfDe@tH zV zz3{?2RTpG}<8SC%d8-IiMu@x5);CiUdeYMfb3Y|l5-xDcVUKicGiw~k#G8aC9s;Nc zVdHxwk)fV^L9`A(S1P^&K{1KvqNjYgV6NZZ)@K&s2GMq>U%HS|giy9Gxi?}f%{#!-61O5?Z2Zs2NQN%AzzdjPuDT|ln`|s3pP?*&%jVP zBIP24rx5`Q&ySx&=yu4+_|OMXz4DN~H|S)#B$VC9m{NoqVPEj>Nrlwz2J(|PTR$tO z^I}+y*4zf$=9@aaBQnsQQ3yTi#q!y?xa{|lUqx)zRjFfY0I_49(QglOOi(TnN9_>N z&aXLGMeYhitz`Kbwj^=Wer!&fZ}`Fh7lDg~XLv|~O5eb^r2bla%qa4_bS`$Ne_@8MN}(Yb+j>=usN-E2Xqg zaRazC+P{qWv=0*e+#ue_)xArrNkjs(>1hdQkOLd$M@PK20bn^%*xIS*!^^4nyW zZwA^pQJa$C79~wV>?AG(m_|xX!^JGe#i@_!nqIxgAEw{06Cy;KF2ak7D;eQJa8$El zejE8=g~NTW9n~XFC}3jsjtT0?7A%+OdiG4s?@TW6RMo`}g|L2@*dq2yE(2TnUc(|_ zg(J8S3o(5ko(D1-bHxvN7l(;yQM1jEA(K^m{q8`-hw9E{5<*gk8763qylzX3b(X<9 z-y_@AEdV|g$OvRiL=RR5WXF0R-it^Yutux}kt*FVXCD|fp!z~gDP*KTULN8Ho8HC= zvAwSg921&lxZ}i|GpnrwpQUdT`7!L~spHO>*WmH!lqDO*>%N=k0#dYAL_QJ(KFQEq zS3MD`Rw0VjVC&i;(s4DTPi^w=d{NW9}{P&88 z1BRvZaUYeFD--wvs_Iv&2MTpNm?O?{jM^@(#vs*JN}@E0_aQAqo7dkv2Q%q8Orx`O~9!JmHWQIi?at_dCuWjfnUQhCgHO>Z_MU{uy7l;a}}s4ozL zi1$rOq^)$o2plmretD|t->8QAy}S%ZR(O7NFXmv!IsR2Yu{Av~b?U+TG~8d~vF=bQ60 znmkq=HbG)+YlA^Tsw|xql&H+(n>gO~{&I7}M`fZq@6$RZO=1r*O!Tc8Twn&DpbAvv zOITjO*8Pc?&I_}9NjX#Oxk-*pPV8 z=nm)%#KKg%a=RO)6Y*{<%QjgoX>8C1vQ;^h!2DxQU^-2ajpI|C>2=(FSAXXRA8`0z zUGNix5RT+Kiv2P0-Gh& zUrjnJ1Re4V0Ko6MH~=75>M;n8Lg-15;5u!YfdCc|K+X%XLmLb|D2_n22@8>bautFr z$LVdPmvI^;`$GQe4RQk7r@2;sXXmm+b$Fx_48x;Zqv?FSSUHs_kD?anR0$d~Qvq;L zR(e&xztefM@~ty{kZ&oFc~^vY=eqf!Kdn}o`?NgG6I7b5bE;&?iVh>2fF&W6d&!_t zm5sSDN9#wqM-5W~tdn~*R^J^JkAR=Uc6iAoi|mdM5x5_mVa^1I#s~qA7;E#BrSFaq zrlOdiDMgocL7X-LuX}8|HwE>ORO!EVUq{Rz_^huBYJ=aF{vYuO`%mOx^gZDJ?v0be zJ~^dgVPQUce>}dVW~OI8KRNijJ+rhhedtGp4j_|I0=#^m5E$tDdJq7fK)@tEfGnVm z%R>ujf+Qc+Q@Wb=_{pXO7*_+PZ<(lEd*;w0t)0P>zT=oqc+%Oj%2 z@;JyT;>ZK$-d=zG(1J&_p~I|z7lB|zypO)z5VB{?msYh;!-wuII8fd_?`S!qqz#s6 zDBSv5vnxdUigTVPpITBXnYE_tbD2cMhGr*eTST81t|AWOY`PA#194xl4k(V}OQ7(R z`{k&Qs#wannP3t8Oa3-PI9RpC%wW+&>i1yNlWNPJW;dJdIu6x%hsOsmxFn8C70!@f z{gk5GUbgI&#w2;&O#*Z1n7_;6STv0hoF(1~Y^9(}S=%w(&12syVBU}6BF^9FPUI1L zDL57tWeq0d43uMkF6#y*=y#d314T)cj`{?-keYni`yBti{jpK-!po=bfSSD3k zJ{NQ62}NXMg`y)-LZ=dg4o0=$5xG$sV_VswqOGMzw_A|fAJl~Jygrt739B+=mAAuSB=n&+O4h9PLkuNe>A7m|Hl z`r};(0*lpQ3;AedOj*B1g6KjW?kSoIu1Pmd2ZJ~6BX>5Zb<>X%UXC0SCh+8;m%KJ8 zu>m-dsR4JmwbDsOOdiwC6%>FRp7}*_mh3}-7-m9?webl7uqFrNRkW}AcGF_= z;DcsUib5;#xPCP_x8_aU1QVX|Vd|6|wlPlWP60 zVpB(|2@z*Zqu7rsX7p8>Lmrw~pm_UTxgPsPH!UKOf!$v*#}t_{CQH4lD6*#0RhnT; zx|@rGQFbvn@VyBeZ2n^3Vpru^&rCI8utk&hA3EV16};+S`=gIF_bvx+^xoT>uLh<*y0cJL!DH(t1HX_bpv=HK+voOFbezCb|ELS-xPpA_sZA2 zxf}p6KsX2XEg=o~3BUc+TVC{fL`W^rJKfv4zt)HL_UUevgF?yi5P$(^LcbuASN_;y z{tl~6PN;A$<3l2pc6VGVOGE^7zYSl?F`pMa<{&V>Q5LWTDFg{@Y*Hp4sQ0qT`CwJ- z_&=?(L=j*H7OdN^s+0rcKX6#C< z(gwJ(y?v?b75Pb%IYRGa5&q{(UpVaUkym?Q@7_}w&Ms{JBC-L(=h6Y z;DBx|Ir*S)u>h+h->wh}b$vAQo`qjQwL5=l_(9v z`)=;4xO@V6(!})5f(Tw4vP|k^tDX*cQxH?DP@#q=y(v+oHYSbJhia!ky0_Y@O>BM;j7N?u;iKxV3&^HC zelac6!xmZ9qD;M^@^u$%bgnAokK$aacTXSrRr|wasDs8&3w)_knfOG5;x4=unFUiZ zS)jG0++a==_Kp``{4~0>4CM=Ac*N%tN!{}>Jy6bD@Rw$n000o(#|1D71z~*r_&Ka# z;pc=fxGTMxd{*@*YrKa$PPA@t)dp{W6A5v8b-1gK#YKCq;(Xx;QohC%{ujMWh3k5# zyT7t=uEyF;0$w78HH4)Zl{Lg`e@*8 zX-a3nS7p_}(83^lF^Nr_T3x$n2t!v(N*Wu(fbAg6r-znXXCb8KCRdAV87TgPrj@Z9 z77N3AI#oxRbR7-G_2s^mCOWvuL11(fKY7`TMSm#S#2k416h&Z#NF@RoR27np}&#{?8RRg^*pC~&=2 zDuWv6I`RvsnLsgq{e&lkXWslAQFicl+cwB*5=Q;YFBQSm(#`pei1EpiCzE?VF#=l+ zJ4nk%9d)CRAzd71`SN6&?YQfwd`yovuQ_=?DArN|)m~kbW{r~Kg({z5@v*nK+bhYn zg@?7J)(Qy^$n*)H8!G_E>51bU)HmfI zbD&J!dSrW3na>Q7O%MzJG}H&TSQ68T9h@Ys1GE)vGz+SaN+oLkh4B)+$&>Ey zQ-6%FpV;dQB6VM2HLEM0LaE{$r4@(-YBSxO^HcxeXU+)=IXAPP?mW|{-_u<5!c7|g z=iS>Y=}KbE1LucRjl!_rZHjnd((4N^IP}ma;Q@+OMxJxOB!(KF1@W@c)^l4|o9eNt z4Q=_o*T9-h1y~>&B0Jn}-+kDaMnEtc-;m`)yPu|Wrdsg!KrsqTu3!Fp9ugnlt>tAR zX>7kZ%C-$|FaGgjPJ}|eQ81Sjewr`L)l^dOb8ZYXkN7%V)`d2>gLD#>gIT&>d$ibi zJBn9E*Yr{+37%8!{mhO&qg+pxP6!QM|5yCa{9hnH>V~(L7!g@%s;j4NYrOqJp<6Mu zmR+JJ?Robo;y9hH2EhQkEuc0s{0&bJtl;Er4d7mqvZ5;j;C2snqWHepSum$}1 zv3syY=27^7yWC|8PqE;7Q$7>0YH4wPhe(l!3m~ASNE{e{!tshvF%|G<4LLK2W2Y>& zT9AGhB!X^38XEFX)?s8z9#2O19?g8ZU-8qmZKE(|;Vs@C_7I{9J>Ja%m%a~fOICkz zJeW`gk^PmSQA2)FbAu9CPhvD|db~17{tdoW%M$A&!<7{12U?lZ21vH*BR7wan6VLN zkTG8wDyO@{Jg08TdP#M!hfMr45mebfz7hX5S`&?qJ~PBt`2rIs>$ifEtHe@9A>KNV zSG*(~d5^GuLLGpmVw~zv zKht>`z8n$a2TS|1kAEO;NLXHa`Yp7RlO>{4`TO?2PNmyTIU)Cw1a2A_;hm{j9_x&Q zm+ZIgcHs$^4IpgY9O9`r)$J}(ErudsNvq66>=!Y$p_Kigrz~(_u6Amd1XQ68k=W52gMp@sW&ka4)hB?Xf{eP% zg}K$9o|m1}!rP97d2!lwD(2}zx0*HbHybR1)P%Qlt4DHSF^)N74U8J2$z$*~Bp8@E zg&aO_Kh5mnGs4M=z-M6j@UteY!dMOAq-iB&*VJlWK|Gc1->%K!q+F6Q$eID*Q%#st zuH3OsIYmLLQNSI+Rh!_tq3{TB=^RI6g4OB81oh0=oI3ViVkA25%_l@aIBSTJASbLi zho>=myt9%6pMV$!F^YQrL|HF_g7Yk#r|80iK#vxqgghCWmWZ*Z2izzSf&mcSwdk%U zB|MIn<(~O(np5s#`n+KI-5ocNl!bCzk{QP;cp2HUl(qkr3C4AL5y1#a5G{$?XH71V z7JOu}M2Is(l7nXB4O&k_e}liA{Z;-a128ABqjF84qVg2X>kwPf6I0>>H9x})g?810 zjLXleP!qS9&nBfwqe;rEiD2>&1sc(kyf&Or0AjJg=yA39*!%SmK|Z~tI@I|((Tavy z=njTgN(8ow)qaByd%$K_J1en(T6?w)*TjH<->L(~kCvlGG?`fs#Ox(EXqtSsmmV;Y z4jhD;wG^PbtuCNC4i2JD(kW{EDnEEIl5Da{f_Y(&d6o}r5u+JjkFwdVRN!prlLc5n z&;!BPcf8tX;A|&?taTYI1u8B@+Y+2oW1Q*U>x9LG}OEWu(h60>ogQQBNNbb}10 zww03~LT@7?#|}U%GHES}PQeCjmKVZuSvNjP!P0zo>5z%2-hhTEh4WWUv&s2pjZYoP zCe)Ih+gXvqj2Z~7xHk8IVSr14|7??Hx8o`d?y^U-P$V>QCm7N_C_u2U0*=Tl@TU|x z@t+4m^C5P92)6mQ%k{FdyGOkUB7cNx87pjC%$cdI+rrmG<_!qzn4T~ z7x0kg*JHpXcJ@hpp8q+sTQ`;&>~%7ql~ohdSujSq@C(I6(kMM&f15(_RSt|yZ-;$T znp;oR{^PCd@vm9fN62J#dBK*WbKjx)H)PBnim@>gx=_Emx`Z`rO>G)c)e`YWq(U6E zTdJ3L5o&|Zmn~KMG*>}!6D=mSOr{!D8a8m^O0{5w_j>qP*Ue1EB7hx&zDA+)|C1oS zlm7`Y{u>g;C5>3bqo$&wp{1r~Vqj)vIevQD-&tQhxxU)j+uWI(Hj(~-rn*%LKP|O_ zKT%^lc4~AK9~b_UJXdS0wr|#J|5KCM9gUC95i**CU1S8BN75hmhUkwD%y4wrE!ohu zD%e9ir>y2g9N@nI&OkB0q4@=?#iAPk6fR4YVNiAgZr^rDl#jOuU1~k7(^+%0@e^Z5 z)5X#&xU=_G43uUABoaN?Xp3~kkf6e=g@nsY#^m{VwC zGelnF6{lC1A{h(gB#XBaG!LtE)}I7qKIy1z!q6QV+K&P#=gEXGMkO_I5%LtO?A|bW zYV|D$EHjHE=Tq(Mu$-NYmP6#t_J$|@Qb4OP3&k>}fVDt|?6aQx#`;6G7o8<6;n zzaMdXemKB``vGKLb(Gysu=5edee3{fVItu2LEko-9&e)}%;Pyn#AYWRJHN&DQHS&e zm#lSpTM;-15;RH+XycaIwO<%_fGj8neC-%CV=KGbN{ZJU)LLhFi?a4}|1(NHjDw@b zemg9>VgLa8ndJZuQ=k#p1_N)aj;_-@q^&z<(q_1H1}M!mNy_;%fGh$r*_f4`?TZ$$ z{PWnS*4Br*PsF^PmYht__gR;qTt(fxG?<@l@k#2WCYz^y+9Z4%&ha#|Dp|Ie3oZCF zML4KmTq@vb>UWYC4`~s8&<(AVani~ql z^A80!xGHYD|1mP<%*=h8C}+Ka4KFrJU3mpX!C7SK#iItsDj9QIB}hJ4PX{tr(e#%P z?+PEIdLXQ7hFwFE?+Dx=XabP!@fKX0T7KEw*J4+m)z9s$Umpjg@odyk4ZsdL4h`N8Gi|SKAEiCepr~!s;nplHxYsqV9vd| z=5e2rNZmB>QW8MnsAzt3kUa6ejS5~2_)+&zV+0jkjHOYg|4=+$=`t}^a5eINp3qWrM&}9Gu0l6ddArjXkGku=AHQjT=XVaa6tBf3p zx3Pv&i3HrwhAg3mTY(xi`gg=D+6OIqE1K&XosA45VkyCWql~^eU;>tPe8~?nR$$1O z%`&x2KNQ1B%Ud8T%shooMx)^+)+5eDgk*51P4xg&x>Taf&Hxlm+0A{6=D9IIB03^D zUURCJzcR%m_b_XelnFpmifUvEa!$RS5J*5TnH;JMbK%pYjRzWqEX5*nCh)r(ZK)L!j(0|TB{b1&0N#3~F$RSofOPuYk}FCQ z0X`DYq`f4Gv5cSkOv7Vy?|y%8RFbK)w$LzDcEaUQ9;;{#(7fFV-B3!&sT)+zub{JE znaGwOQ6rp6MZX9OtgK>_Fl%J1Sve`=d?2Vt)O!#zMh?zQaf|3e2%s-TuDYZt8&&9T z*jMD$?`>s>wjXB1_*iP@48(UWRxww2;SR2u?cS_A3MT?K6{4WhS?!0as)s?2ud=R} z5qH*|ZU%^W7jgxIWtyUGH8&OoG6r>x5&`F?=>ew_eo2Qeh#$doKbMTK6Ey&SiWM5i zQ9NX;h4H5%rA{4MSo}HwWSWMP=qqi!K1yqcwx(^eP1%p=fnx}ncug%AwHZY;me_Ng zF_~P|^&EgmPwri_RX4g=(LJz32YD%mY` z>lf1EmNaQC*zl5ZGZsuZ(6uwhWaZL2(QDg@J&wffH?51@(VG@1V - /// Generic client-side UI list popup that allows users to choose from an option of limbs or organs to operate on. + /// Generic client-side UI list popup that allows users to choose from an option + /// of limbs or organs to operate on. /// + [UsedImplicitly] public class GenericSurgeryBoundUserInterface : BoundUserInterface { + private GenericSurgeryWindow? _window; - private GenericSurgeryWindow _window; - - public GenericSurgeryBoundUserInterface(ClientUserInterfaceComponent owner, object uiKey) : base(owner, uiKey) - { - - } + public GenericSurgeryBoundUserInterface(ClientUserInterfaceComponent owner, object uiKey) : base(owner, uiKey) { } protected override void Open() { _window = new GenericSurgeryWindow(); + _window.OpenCentered(); + _window.OnClose += Close; } protected override void ReceiveMessage(BoundUserInterfaceMessage message) @@ -44,40 +45,42 @@ namespace Content.Client.Health.BodySystem.Surgery private void HandleBodyPartRequest(RequestBodyPartSurgeryUIMessage msg) { - _window.BuildDisplay(msg.Targets, BodyPartSelectedCallback); + _window?.BuildDisplay(msg.Targets, BodyPartSelectedCallback); } + private void HandleMechanismRequest(RequestMechanismSurgeryUIMessage msg) { - _window.BuildDisplay(msg.Targets, MechanismSelectedCallback); + _window?.BuildDisplay(msg.Targets, MechanismSelectedCallback); } + private void HandleBodyPartSlotRequest(RequestBodyPartSlotSurgeryUIMessage msg) { - _window.BuildDisplay(msg.Targets, BodyPartSlotSelectedCallback); + _window?.BuildDisplay(msg.Targets, BodyPartSlotSelectedCallback); } - - private void BodyPartSelectedCallback(int selectedOptionData) { SendMessage(new ReceiveBodyPartSurgeryUIMessage(selectedOptionData)); } + private void MechanismSelectedCallback(int selectedOptionData) { SendMessage(new ReceiveMechanismSurgeryUIMessage(selectedOptionData)); } + private void BodyPartSlotSelectedCallback(int selectedOptionData) { SendMessage(new ReceiveBodyPartSlotSurgeryUIMessage(selectedOptionData)); } - - protected override void Dispose(bool disposing) { base.Dispose(disposing); - if (!disposing) - return; - _window.Dispose(); + + if (disposing) + { + _window?.Dispose(); + } } } } diff --git a/Content.Client/Health/BodySystem/Surgery/GenericSurgeryWindow.cs b/Content.Client/GameObjects/Components/Body/Surgery/GenericSurgeryWindow.cs similarity index 57% rename from Content.Client/Health/BodySystem/Surgery/GenericSurgeryWindow.cs rename to Content.Client/GameObjects/Components/Body/Surgery/GenericSurgeryWindow.cs index baae1b145c..d432c3342a 100644 --- a/Content.Client/Health/BodySystem/Surgery/GenericSurgeryWindow.cs +++ b/Content.Client/GameObjects/Components/Body/Surgery/GenericSurgeryWindow.cs @@ -1,58 +1,62 @@ using System; using System.Collections.Generic; -using System.Globalization; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Shared.Localization; using Robust.Shared.Maths; -namespace Content.Client.Health.BodySystem.Surgery +namespace Content.Client.GameObjects.Components.Body.Surgery { public class GenericSurgeryWindow : SS14Window { - public delegate void CloseCallback(); public delegate void OptionSelectedCallback(int selectedOptionData); - private Control _vSplitContainer; - private VBoxContainer _optionsBox; + private readonly VBoxContainer _optionsBox; private OptionSelectedCallback _optionSelectedCallback; - protected override Vector2? CustomSize => (300, 400); public GenericSurgeryWindow() { Title = Loc.GetString("Select surgery target..."); RectClipContent = true; - _vSplitContainer = new VBoxContainer(); - var listScrollContainer = new ScrollContainer - { - SizeFlagsVertical = SizeFlags.FillExpand, - SizeFlagsHorizontal = SizeFlags.FillExpand, - HScrollEnabled = true, - VScrollEnabled = true - }; - _optionsBox = new VBoxContainer - { - SizeFlagsHorizontal = SizeFlags.FillExpand - }; - listScrollContainer.AddChild(_optionsBox); - _vSplitContainer.AddChild(listScrollContainer); - Contents.AddChild(_vSplitContainer); + var vSplitContainer = new VBoxContainer + { + Children = + { + new ScrollContainer + { + SizeFlagsVertical = SizeFlags.FillExpand, + SizeFlagsHorizontal = SizeFlags.FillExpand, + HScrollEnabled = true, + VScrollEnabled = true, + Children = + { + (_optionsBox = new VBoxContainer + { + SizeFlagsHorizontal = SizeFlags.FillExpand + }) + } + } + } + }; + + Contents.AddChild(vSplitContainer); } public void BuildDisplay(Dictionary data, OptionSelectedCallback callback) { _optionsBox.DisposeAllChildren(); _optionSelectedCallback = callback; + foreach (var (displayText, callbackData) in data) { var button = new SurgeryButton(callbackData); - button.SetOnToggleBehavior(OnButtonPressed); - button.SetDisplayText(CultureInfo.CurrentCulture.TextInfo.ToTitleCase(displayText)); + button.SetOnToggleBehavior(OnButtonPressed); + button.SetDisplayText(Loc.GetString(displayText)); _optionsBox.AddChild(button); } @@ -60,17 +64,23 @@ namespace Content.Client.Health.BodySystem.Surgery private void OnButtonPressed(BaseButton.ButtonEventArgs args) { - var pressedButton = (SurgeryButton)args.Button.Parent; - _optionSelectedCallback(pressedButton.CallbackData); + if (args.Button.Parent is SurgeryButton surgery) + { + _optionSelectedCallback(surgery.CallbackData); + } } } class SurgeryButton : PanelContainer { public Button Button { get; } + private SpriteView SpriteView { get; } + private Control EntityControl { get; } + private Label DisplayText { get; } + public int CallbackData { get; } public SurgeryButton(int callbackData) @@ -84,25 +94,28 @@ namespace Content.Client.Health.BodySystem.Surgery ToggleMode = true, MouseFilter = MouseFilterMode.Stop }; + AddChild(Button); - var hBoxContainer = new HBoxContainer(); - SpriteView = new SpriteView + + AddChild(new HBoxContainer { - CustomMinimumSize = new Vector2(32.0f, 32.0f) - }; - DisplayText = new Label - { - SizeFlagsVertical = SizeFlags.ShrinkCenter, - Text = "N/A", - }; - hBoxContainer.AddChild(SpriteView); - hBoxContainer.AddChild(DisplayText); - EntityControl = new Control - { - SizeFlagsHorizontal = SizeFlags.FillExpand - }; - hBoxContainer.AddChild(EntityControl); - AddChild(hBoxContainer); + Children = + { + (SpriteView = new SpriteView + { + CustomMinimumSize = new Vector2(32.0f, 32.0f) + }), + (DisplayText = new Label + { + SizeFlagsVertical = SizeFlags.ShrinkCenter, + Text = "N/A", + }), + (new Control + { + SizeFlagsHorizontal = SizeFlags.FillExpand + }) + } + }); } public void SetDisplayText(string text) diff --git a/Content.Client/GameObjects/Components/DamageableComponent.cs b/Content.Client/GameObjects/Components/DamageableComponent.cs deleted file mode 100644 index 2e42501894..0000000000 --- a/Content.Client/GameObjects/Components/DamageableComponent.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System.Collections.Generic; -using Content.Shared.GameObjects.Components.Damage; -using Robust.Shared.GameObjects; - -namespace Content.Client.GameObjects.Components -{ - /// - /// Fuck I really hate doing this - /// TODO: make sure the client only gets damageable component on the clientside entity for its player mob - /// - [RegisterComponent] - public class DamageableComponent : SharedDamageableComponent - { - /// - public override string Name => "Damageable"; - - public Dictionary CurrentDamage = new Dictionary(); - - public override void HandleComponentState(ComponentState curState, ComponentState nextState) - { - base.HandleComponentState(curState, nextState); - - if(curState is DamageComponentState damagestate) - { - CurrentDamage = damagestate.CurrentDamage; - } - } - } -} diff --git a/Content.Client/GameObjects/Components/MedicalScanner/MedicalScannerBoundUserInterface.cs b/Content.Client/GameObjects/Components/MedicalScanner/MedicalScannerBoundUserInterface.cs index 135a55f992..4b2fa2a1fc 100644 --- a/Content.Client/GameObjects/Components/MedicalScanner/MedicalScannerBoundUserInterface.cs +++ b/Content.Client/GameObjects/Components/MedicalScanner/MedicalScannerBoundUserInterface.cs @@ -1,9 +1,11 @@ +using JetBrains.Annotations; using Robust.Client.GameObjects.Components.UserInterface; using Robust.Shared.GameObjects.Components.UserInterface; using static Content.Shared.GameObjects.Components.Medical.SharedMedicalScannerComponent; namespace Content.Client.GameObjects.Components.MedicalScanner { + [UsedImplicitly] public class MedicalScannerBoundUserInterface : BoundUserInterface { public MedicalScannerBoundUserInterface(ClientUserInterfaceComponent owner, object uiKey) : base(owner, uiKey) diff --git a/Content.Client/GameObjects/Components/MedicalScanner/MedicalScannerWindow.cs b/Content.Client/GameObjects/Components/MedicalScanner/MedicalScannerWindow.cs index 4f6eefb5d9..61adc113f2 100644 --- a/Content.Client/GameObjects/Components/MedicalScanner/MedicalScannerWindow.cs +++ b/Content.Client/GameObjects/Components/MedicalScanner/MedicalScannerWindow.cs @@ -1,6 +1,10 @@ using System.Text; +using Content.Shared.Damage; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Localization; using Robust.Shared.Maths; using static Content.Shared.GameObjects.Components.Medical.SharedMedicalScannerComponent; @@ -14,22 +18,36 @@ namespace Content.Client.GameObjects.Components.MedicalScanner { Contents.RemoveAllChildren(); var text = new StringBuilder(); - if (state.MaxHealth == 0) - { - text.Append("No patient data."); - } else - { - text.Append($"Patient's health: {state.CurrentHealth}/{state.MaxHealth}\n"); - if (state.DamageDictionary != null) + if (!state.Entity.HasValue || + !state.HasDamage() || + !IoCManager.Resolve().TryGetEntity(state.Entity.Value, out var entity)) + { + text.Append(Loc.GetString("No patient data.")); + } + else + { + text.Append($"{entity.Name}{Loc.GetString("'s health:")}\n"); + + foreach (var (@class, classAmount) in state.DamageClasses) { - foreach (var (dmgType, amount) in state.DamageDictionary) + text.Append($"\n{Loc.GetString("{0}: {1}", @class, classAmount)}"); + + foreach (var type in @class.ToTypes()) { - text.Append($"\n{dmgType}: {amount}"); + if (!state.DamageTypes.TryGetValue(type, out var typeAmount)) + { + continue; + } + + text.Append($"\n- {Loc.GetString("{0}: {1}", type, typeAmount)}"); } + + text.Append("\n"); } } - Contents.AddChild(new Label(){Text = text.ToString()}); + + Contents.AddChild(new Label() {Text = text.ToString()}); } } } diff --git a/Content.Client/GameObjects/Components/Mobs/HumanoidAppearanceComponent.cs b/Content.Client/GameObjects/Components/Mobs/HumanoidAppearanceComponent.cs index 44b4b7e4ce..0ddf3f175a 100644 --- a/Content.Client/GameObjects/Components/Mobs/HumanoidAppearanceComponent.cs +++ b/Content.Client/GameObjects/Components/Mobs/HumanoidAppearanceComponent.cs @@ -44,8 +44,8 @@ namespace Content.Client.GameObjects.Components.Mobs sprite.LayerSetColor(HumanoidVisualLayers.Hair, Appearance.HairColor); sprite.LayerSetColor(HumanoidVisualLayers.FacialHair, Appearance.FacialHairColor); - sprite.LayerSetState(HumanoidVisualLayers.Chest, Sex == Sex.Male ? "human_chest_m" : "human_chest_f"); - sprite.LayerSetState(HumanoidVisualLayers.Head, Sex == Sex.Male ? "human_head_m" : "human_head_f"); + sprite.LayerSetState(HumanoidVisualLayers.Chest, Sex == Sex.Male ? "torso_m" : "torso_f"); + sprite.LayerSetState(HumanoidVisualLayers.Head, Sex == Sex.Male ? "head_m" : "head_f"); sprite.LayerSetVisible(HumanoidVisualLayers.StencilMask, Sex == Sex.Female); diff --git a/Content.Client/GameObjects/Components/Mobs/SpeciesComponent.cs b/Content.Client/GameObjects/Components/Mobs/SpeciesComponent.cs deleted file mode 100644 index 6500134159..0000000000 --- a/Content.Client/GameObjects/Components/Mobs/SpeciesComponent.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Content.Client.GameObjects.Components.Disposal; -using Content.Client.Interfaces.GameObjects.Components.Interaction; -using Content.Shared.GameObjects.Components.Mobs; -using Robust.Shared.GameObjects; - -namespace Content.Client.GameObjects.Components.Mobs -{ - [RegisterComponent] - [ComponentReference(typeof(SharedSpeciesComponent))] - public class SpeciesComponent : SharedSpeciesComponent, IClientDraggable - { - bool IClientDraggable.ClientCanDropOn(CanDropEventArgs eventArgs) - { - return eventArgs.Target.HasComponent(); - } - - bool IClientDraggable.ClientCanDrag(CanDragEventArgs eventArgs) - { - return true; - } - } -} diff --git a/Content.Client/GameObjects/Components/Mobs/SpeciesVisualizer.cs b/Content.Client/GameObjects/Components/Rotation/RotationVisualizer.cs similarity index 81% rename from Content.Client/GameObjects/Components/Mobs/SpeciesVisualizer.cs rename to Content.Client/GameObjects/Components/Rotation/RotationVisualizer.cs index cc2e60b92e..d78cf08a33 100644 --- a/Content.Client/GameObjects/Components/Mobs/SpeciesVisualizer.cs +++ b/Content.Client/GameObjects/Components/Rotation/RotationVisualizer.cs @@ -1,5 +1,6 @@ using System; -using Content.Shared.GameObjects.Components.Mobs; +using Content.Shared.GameObjects.Components.Rotation; +using JetBrains.Annotations; using Robust.Client.Animations; using Robust.Client.GameObjects; using Robust.Client.GameObjects.Components.Animations; @@ -7,22 +8,23 @@ using Robust.Client.Interfaces.GameObjects.Components; using Robust.Shared.Animations; using Robust.Shared.Maths; -namespace Content.Client.GameObjects.Components.Mobs +namespace Content.Client.GameObjects.Components.Rotation { - public class SpeciesVisualizer : AppearanceVisualizer + [UsedImplicitly] + public class RotationVisualizer : AppearanceVisualizer { public override void OnChangeData(AppearanceComponent component) { base.OnChangeData(component); - if (component.TryGetData(SharedSpeciesComponent.MobVisuals.RotationState, out var state)) + if (component.TryGetData(RotationVisuals.RotationState, out var state)) { switch (state) { - case SharedSpeciesComponent.MobState.Standing: + case RotationState.Vertical: SetRotation(component, 0); break; - case SharedSpeciesComponent.MobState.Down: + case RotationState.Horizontal: SetRotation(component, Angle.FromDegrees(90)); break; } @@ -40,7 +42,9 @@ namespace Content.Client.GameObjects.Components.Mobs } if (animation.HasRunningAnimation("rotate")) + { animation.Stop("rotate"); + } animation.Play(new Animation { diff --git a/Content.Client/Health/BodySystem/BodyScanner/BodyScannerDisplay.cs b/Content.Client/Health/BodySystem/BodyScanner/BodyScannerDisplay.cs deleted file mode 100644 index d997c73216..0000000000 --- a/Content.Client/Health/BodySystem/BodyScanner/BodyScannerDisplay.cs +++ /dev/null @@ -1,155 +0,0 @@ -using System.Collections.Generic; -using System.Globalization; -using Content.Shared.Health.BodySystem.BodyScanner; -using Robust.Client.UserInterface.Controls; -using Robust.Client.UserInterface.CustomControls; -using Robust.Shared.IoC; -using Robust.Shared.Localization; -using Robust.Shared.Maths; -using static Robust.Client.UserInterface.Controls.ItemList; - -namespace Content.Client.Health.BodySystem.BodyScanner -{ - public sealed class BodyScannerDisplay : SS14Window - { - #pragma warning disable 649 - [Dependency] private readonly ILocalizationManager _loc; - #pragma warning restore 649 - - public BodyScannerBoundUserInterface Owner { get; private set; } - protected override Vector2? CustomSize => (800, 600); - private ItemList BodyPartList { get; } - private Label BodyPartLabel { get; } - private Label BodyPartHealth { get; } - private ItemList MechanismList { get; } - private RichTextLabel MechanismInfoLabel { get; } - - - private BodyScannerTemplateData _template; - private Dictionary _parts; - private List _slots; - private BodyScannerBodyPartData _currentBodyPart; - - - public BodyScannerDisplay(BodyScannerBoundUserInterface owner) - { - IoCManager.InjectDependencies(this); - Owner = owner; - Title = _loc.GetString("Body Scanner"); - - var hSplit = new HBoxContainer(); - Contents.AddChild(hSplit); - - //Left half - var scrollBox = new ScrollContainer - { - SizeFlagsHorizontal = SizeFlags.FillExpand, - }; - hSplit.AddChild(scrollBox); - BodyPartList = new ItemList { }; - scrollBox.AddChild(BodyPartList); - BodyPartList.OnItemSelected += BodyPartOnItemSelected; - - //Right half - var vSplit = new VBoxContainer - { - SizeFlagsHorizontal = SizeFlags.FillExpand, - }; - hSplit.AddChild(vSplit); - - //Top half of the right half - var limbBox = new VBoxContainer - { - SizeFlagsVertical = SizeFlags.FillExpand - }; - vSplit.AddChild(limbBox); - BodyPartLabel = new Label(); - limbBox.AddChild(BodyPartLabel); - var limbHealthHBox = new HBoxContainer(); - limbBox.AddChild(limbHealthHBox); - var healthLabel = new Label - { - Text = "Health: " - }; - limbHealthHBox.AddChild(healthLabel); - BodyPartHealth = new Label(); - limbHealthHBox.AddChild(BodyPartHealth); - var limbScroll = new ScrollContainer - { - SizeFlagsVertical = SizeFlags.FillExpand - }; - limbBox.AddChild(limbScroll); - MechanismList = new ItemList(); - limbScroll.AddChild(MechanismList); - MechanismList.OnItemSelected += MechanismOnItemSelected; - - //Bottom half of the right half - MechanismInfoLabel = new RichTextLabel - { - SizeFlagsVertical = SizeFlags.FillExpand - }; - vSplit.AddChild(MechanismInfoLabel); - } - - - public void UpdateDisplay(BodyScannerTemplateData template, Dictionary parts) - { - _template = template; - _parts = parts; - _slots = new List(); - BodyPartList.Clear(); - foreach (var (key, value) in _parts) - { - _slots.Add(key); //We have to do this since ItemLists only return the index of what item is selected and dictionaries don't allow you to explicitly grab things by index. - //So we put the contents of the dictionary into a list so that we can grab the list by index. I don't know either. - BodyPartList.AddItem(CultureInfo.CurrentCulture.TextInfo.ToTitleCase(key)); - } - } - - - public void BodyPartOnItemSelected(ItemListSelectedEventArgs args) - { - if(_parts.TryGetValue(_slots[args.ItemIndex], out _currentBodyPart)) { - UpdateBodyPartBox(_currentBodyPart, _slots[args.ItemIndex]); - } - } - private void UpdateBodyPartBox(BodyScannerBodyPartData part, string slotName) - { - BodyPartLabel.Text = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(slotName) + ": " + CultureInfo.CurrentCulture.TextInfo.ToTitleCase(part.Name); - BodyPartHealth.Text = part.CurrentDurability + "/" + part.MaxDurability; - - MechanismList.Clear(); - foreach (var mechanism in part.Mechanisms) { - MechanismList.AddItem(mechanism.Name); - } - } - - - public void MechanismOnItemSelected(ItemListSelectedEventArgs args) - { - UpdateMechanismBox(_currentBodyPart.Mechanisms[args.ItemIndex]); - } - private void UpdateMechanismBox(BodyScannerMechanismData mechanism) - { - //TODO: Make UI look less shit and clean up whatever the fuck this is lmao - if (mechanism != null) - { - string message = ""; - message += mechanism.Name; - message += "\nHealth: "; - message += mechanism.CurrentDurability; - message += "/"; - message += mechanism.MaxDurability; - message += "\n"; - message += mechanism.Description; - MechanismInfoLabel.SetMessage(message); - } - else - { - MechanismInfoLabel.SetMessage(""); - } - } - - - } -} diff --git a/Content.Client/IgnoredComponents.cs b/Content.Client/IgnoredComponents.cs index 5169e4a189..a032972f02 100644 --- a/Content.Client/IgnoredComponents.cs +++ b/Content.Client/IgnoredComponents.cs @@ -96,7 +96,6 @@ "BarSign", "DroppedBodyPart", "DroppedMechanism", - "BodyManager", "SolarPanel", "BodyScanner", "Stunbaton", @@ -157,6 +156,7 @@ "Vapor", "DamageOnHighSpeedImpact", "Barotrauma", + "MobStateManager", }; } } diff --git a/Content.Server/AI/Utility/AiLogic/UtilityAI.cs b/Content.Server/AI/Utility/AiLogic/UtilityAI.cs index 005a30a9bc..6c15106012 100644 --- a/Content.Server/AI/Utility/AiLogic/UtilityAI.cs +++ b/Content.Server/AI/Utility/AiLogic/UtilityAI.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Threading; using Content.Server.AI.Operators; @@ -6,10 +6,9 @@ using Content.Server.AI.Utility.Actions; using Content.Server.AI.Utility.BehaviorSets; using Content.Server.AI.WorldState; using Content.Server.AI.WorldState.States.Utility; -using Content.Server.GameObjects.Components.Damage; -using Content.Server.GameObjects.Components.Mobs; using Content.Server.GameObjects.EntitySystems.AI.LoadBalancer; using Content.Server.GameObjects.EntitySystems.JobQueues; +using Content.Shared.GameObjects.Components.Damage; using Robust.Server.AI; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.IoC; @@ -114,39 +113,27 @@ namespace Content.Server.AI.Utility.AiLogic _planCooldownRemaining = PlanCooldown; _blackboard = new Blackboard(SelfEntity); _planner = IoCManager.Resolve().GetEntitySystem(); - if (SelfEntity.TryGetComponent(out DamageableComponent damageableComponent)) + if (SelfEntity.TryGetComponent(out IDamageableComponent damageableComponent)) { - damageableComponent.DamageThresholdPassed += DamageThresholdHandle; + damageableComponent.HealthChangedEvent += DeathHandle; } } public override void Shutdown() { // TODO: If DamageableComponent removed still need to unsubscribe? - if (SelfEntity.TryGetComponent(out DamageableComponent damageableComponent)) + if (SelfEntity.TryGetComponent(out IDamageableComponent damageableComponent)) { - damageableComponent.DamageThresholdPassed -= DamageThresholdHandle; + damageableComponent.HealthChangedEvent -= DeathHandle; } var currentOp = CurrentAction?.ActionOperators.Peek(); currentOp?.Shutdown(Outcome.Failed); } - private void DamageThresholdHandle(object sender, DamageThresholdPassedEventArgs eventArgs) + private void DeathHandle(HealthChangedEventArgs eventArgs) { - if (!SelfEntity.TryGetComponent(out SpeciesComponent speciesComponent)) - { - return; - } - - if (speciesComponent.CurrentDamageState is DeadState) - { - _isDead = true; - } - else - { - _isDead = false; - } + _isDead = eventArgs.Damageable.CurrentDamageState == DamageState.Dead || eventArgs.Damageable.CurrentDamageState == DamageState.Critical; } private void ReceivedAction() diff --git a/Content.Server/AI/Utility/Considerations/Combat/TargetHealthCon.cs b/Content.Server/AI/Utility/Considerations/Combat/TargetHealthCon.cs index 8e70bb9200..64fce8bf56 100644 --- a/Content.Server/AI/Utility/Considerations/Combat/TargetHealthCon.cs +++ b/Content.Server/AI/Utility/Considerations/Combat/TargetHealthCon.cs @@ -1,4 +1,4 @@ -using Content.Server.AI.WorldState; +using Content.Server.AI.WorldState; using Content.Server.AI.WorldState.States; using Content.Server.GameObjects.Components.Damage; using Content.Shared.GameObjects.Components.Damage; @@ -11,13 +11,12 @@ namespace Content.Server.AI.Utility.Considerations.Combat { var target = context.GetState().GetValue(); - if (target == null || !target.TryGetComponent(out DamageableComponent damageableComponent)) + if (target == null || !target.TryGetComponent(out IDamageableComponent damageableComponent)) { return 0.0f; } - // Just went with max health - return damageableComponent.CurrentDamage[DamageType.Total] / 300.0f; + return damageableComponent.TotalDamage / 300.0f; } } } diff --git a/Content.Server/AI/Utility/Considerations/Combat/TargetIsCritCon.cs b/Content.Server/AI/Utility/Considerations/Combat/TargetIsCritCon.cs index 97ed516326..856a53958d 100644 --- a/Content.Server/AI/Utility/Considerations/Combat/TargetIsCritCon.cs +++ b/Content.Server/AI/Utility/Considerations/Combat/TargetIsCritCon.cs @@ -1,6 +1,6 @@ -using Content.Server.AI.WorldState; +using Content.Server.AI.WorldState; using Content.Server.AI.WorldState.States; -using Content.Server.GameObjects.Components.Mobs; +using Content.Shared.GameObjects.Components.Damage; namespace Content.Server.AI.Utility.Considerations.Combat { @@ -10,12 +10,12 @@ namespace Content.Server.AI.Utility.Considerations.Combat { var target = context.GetState().GetValue(); - if (target == null || !target.TryGetComponent(out SpeciesComponent speciesComponent)) + if (target == null || !target.TryGetComponent(out IDamageableComponent damageableComponent)) { return 0.0f; } - if (speciesComponent.CurrentDamageState is CriticalState) + if (damageableComponent.CurrentDamageState == DamageState.Critical) { return 1.0f; } diff --git a/Content.Server/AI/Utility/Considerations/Combat/TargetIsDeadCon.cs b/Content.Server/AI/Utility/Considerations/Combat/TargetIsDeadCon.cs index e973538e79..d4d582e6b1 100644 --- a/Content.Server/AI/Utility/Considerations/Combat/TargetIsDeadCon.cs +++ b/Content.Server/AI/Utility/Considerations/Combat/TargetIsDeadCon.cs @@ -1,6 +1,6 @@ -using Content.Server.AI.WorldState; +using Content.Server.AI.WorldState; using Content.Server.AI.WorldState.States; -using Content.Server.GameObjects.Components.Mobs; +using Content.Shared.GameObjects.Components.Damage; namespace Content.Server.AI.Utility.Considerations.Combat { @@ -10,12 +10,12 @@ namespace Content.Server.AI.Utility.Considerations.Combat { var target = context.GetState().GetValue(); - if (target == null || !target.TryGetComponent(out SpeciesComponent speciesComponent)) + if (target == null || !target.TryGetComponent(out IDamageableComponent damageableComponent)) { return 0.0f; } - if (speciesComponent.CurrentDamageState is DeadState) + if (damageableComponent.CurrentDamageState == DamageState.Dead) { return 1.0f; } diff --git a/Content.Server/AI/Utility/ExpandableActions/Combat/Melee/MeleeAttackNearbyPlayerExp.cs b/Content.Server/AI/Utility/ExpandableActions/Combat/Melee/MeleeAttackNearbyPlayerExp.cs index b54aed6274..cde979be3e 100644 --- a/Content.Server/AI/Utility/ExpandableActions/Combat/Melee/MeleeAttackNearbyPlayerExp.cs +++ b/Content.Server/AI/Utility/ExpandableActions/Combat/Melee/MeleeAttackNearbyPlayerExp.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using Content.Server.AI.Utility.Actions; using Content.Server.AI.Utility.Actions.Combat.Melee; @@ -7,8 +7,8 @@ using Content.Server.AI.Utility.Considerations.Combat.Melee; using Content.Server.AI.Utils; using Content.Server.AI.WorldState; using Content.Server.AI.WorldState.States; -using Content.Server.GameObjects.Components.Mobs; using Content.Server.GameObjects.Components.Movement; +using Content.Shared.GameObjects.Components.Damage; using Robust.Server.GameObjects; using Robust.Shared.IoC; @@ -37,7 +37,7 @@ namespace Content.Server.AI.Utility.ExpandableActions.Combat.Melee throw new InvalidOperationException(); } - foreach (var entity in Visibility.GetEntitiesInRange(owner.Transform.GridPosition, typeof(SpeciesComponent), + foreach (var entity in Visibility.GetEntitiesInRange(owner.Transform.GridPosition, typeof(IDamageableComponent), controller.VisionRadius)) { if (entity.HasComponent() && entity != owner) diff --git a/Content.Server/AI/Utility/ExpandableActions/Combat/Melee/MeleeAttackNearbySpeciesExp.cs b/Content.Server/AI/Utility/ExpandableActions/Combat/Melee/MeleeAttackNearbySpeciesExp.cs index 29937b0270..bd78ab74ec 100644 --- a/Content.Server/AI/Utility/ExpandableActions/Combat/Melee/MeleeAttackNearbySpeciesExp.cs +++ b/Content.Server/AI/Utility/ExpandableActions/Combat/Melee/MeleeAttackNearbySpeciesExp.cs @@ -15,7 +15,7 @@ namespace Content.Server.AI.Utility.ExpandableActions.Combat.Melee { var owner = context.GetState().GetValue(); - foreach (var entity in context.GetState().GetValue()) + foreach (var entity in context.GetState().GetValue()) { yield return new MeleeWeaponAttackEntity(owner, entity, Bonus); } diff --git a/Content.Server/AI/Utility/ExpandableActions/Combat/Melee/UnarmedAttackNearbyPlayerExp.cs b/Content.Server/AI/Utility/ExpandableActions/Combat/Melee/UnarmedAttackNearbyPlayerExp.cs index 74696e13e5..46f1f79479 100644 --- a/Content.Server/AI/Utility/ExpandableActions/Combat/Melee/UnarmedAttackNearbyPlayerExp.cs +++ b/Content.Server/AI/Utility/ExpandableActions/Combat/Melee/UnarmedAttackNearbyPlayerExp.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using Content.Server.AI.Utility.Actions; using Content.Server.AI.Utility.Actions.Combat.Melee; @@ -7,8 +7,8 @@ using Content.Server.AI.Utility.Considerations.Combat.Melee; using Content.Server.AI.Utils; using Content.Server.AI.WorldState; using Content.Server.AI.WorldState.States; -using Content.Server.GameObjects.Components.Mobs; using Content.Server.GameObjects.Components.Movement; +using Content.Shared.GameObjects.Components.Body; using Robust.Server.GameObjects; using Robust.Shared.IoC; @@ -37,7 +37,7 @@ namespace Content.Server.AI.Utility.ExpandableActions.Combat.Melee throw new InvalidOperationException(); } - foreach (var entity in Visibility.GetEntitiesInRange(owner.Transform.GridPosition, typeof(SpeciesComponent), + foreach (var entity in Visibility.GetEntitiesInRange(owner.Transform.GridPosition, typeof(IBodyManagerComponent), controller.VisionRadius)) { if (entity.HasComponent() && entity != owner) diff --git a/Content.Server/AI/WorldState/States/Mobs/NearbySpeciesState.cs b/Content.Server/AI/WorldState/States/Mobs/NearbyBodiesState.cs similarity index 70% rename from Content.Server/AI/WorldState/States/Mobs/NearbySpeciesState.cs rename to Content.Server/AI/WorldState/States/Mobs/NearbyBodiesState.cs index a72786d326..2554c4cf53 100644 --- a/Content.Server/AI/WorldState/States/Mobs/NearbySpeciesState.cs +++ b/Content.Server/AI/WorldState/States/Mobs/NearbyBodiesState.cs @@ -1,16 +1,16 @@ -using System.Collections.Generic; +using System.Collections.Generic; using Content.Server.AI.Utils; -using Content.Server.GameObjects.Components.Mobs; using Content.Server.GameObjects.Components.Movement; +using Content.Shared.GameObjects.Components.Body; using JetBrains.Annotations; using Robust.Shared.Interfaces.GameObjects; namespace Content.Server.AI.WorldState.States.Mobs { [UsedImplicitly] - public sealed class NearbySpeciesState : CachedStateData> + public sealed class NearbyBodiesState : CachedStateData> { - public override string Name => "NearbySpecies"; + public override string Name => "NearbyBodies"; protected override List GetTrueValue() { @@ -21,7 +21,7 @@ namespace Content.Server.AI.WorldState.States.Mobs return result; } - foreach (var entity in Visibility.GetEntitiesInRange(Owner.Transform.GridPosition, typeof(SpeciesComponent), controller.VisionRadius)) + foreach (var entity in Visibility.GetEntitiesInRange(Owner.Transform.GridPosition, typeof(IBodyManagerComponent), controller.VisionRadius)) { if (entity == Owner) continue; result.Add(entity); diff --git a/Content.Server/AI/WorldState/States/Mobs/NearbyPlayersState.cs b/Content.Server/AI/WorldState/States/Mobs/NearbyPlayersState.cs index f1c7bbae1a..1ba739e3aa 100644 --- a/Content.Server/AI/WorldState/States/Mobs/NearbyPlayersState.cs +++ b/Content.Server/AI/WorldState/States/Mobs/NearbyPlayersState.cs @@ -1,6 +1,6 @@ -using System.Collections.Generic; -using Content.Server.GameObjects.Components.Mobs; +using System.Collections.Generic; using Content.Server.GameObjects.Components.Movement; +using Content.Shared.GameObjects.Components.Damage; using JetBrains.Annotations; using Robust.Server.Interfaces.Player; using Robust.Shared.Interfaces.GameObjects; @@ -27,7 +27,7 @@ namespace Content.Server.AI.WorldState.States.Mobs foreach (var player in nearbyPlayers) { - if (player.AttachedEntity != Owner && player.AttachedEntity.HasComponent()) + if (player.AttachedEntity != Owner && player.AttachedEntity.HasComponent()) { result.Add(player.AttachedEntity); } diff --git a/Content.Server/Body/BodyCommands.cs b/Content.Server/Body/BodyCommands.cs new file mode 100644 index 0000000000..89d6355203 --- /dev/null +++ b/Content.Server/Body/BodyCommands.cs @@ -0,0 +1,147 @@ +#nullable enable +using System.Linq; +using Content.Server.GameObjects.Components.Body; +using Content.Shared.Body.Part; +using Content.Shared.GameObjects.Components.Body; +using Robust.Server.Interfaces.Console; +using Robust.Server.Interfaces.Player; +using Robust.Shared.Interfaces.Random; +using Robust.Shared.IoC; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; + +namespace Content.Server.Body +{ + class AddHandCommand : IClientCommand + { + public string Command => "addhand"; + public string Description => "Adds a hand to your entity."; + public string Help => $"Usage: {Command}"; + + public void Execute(IConsoleShell shell, IPlayerSession? player, string[] args) + { + if (player == null) + { + shell.SendText(player, "Only a player can run this command."); + return; + } + + if (player.AttachedEntity == null) + { + shell.SendText(player, "You have no entity."); + return; + } + + if (!player.AttachedEntity.TryGetComponent(out BodyManagerComponent body)) + { + var random = IoCManager.Resolve(); + var text = $"You have no body{(random.Prob(0.2f) ? " and you must scream." : ".")}"; + + shell.SendText(player, text); + return; + } + + var prototypeManager = IoCManager.Resolve(); + prototypeManager.TryIndex("bodyPart.Hand.BasicHuman", out BodyPartPrototype prototype); + + var part = new BodyPart(prototype); + var slot = part.GetHashCode().ToString(); + + body.Template.Slots.Add(slot, BodyPartType.Hand); + body.InstallBodyPart(part, slot); + } + } + + class RemoveHandCommand : IClientCommand + { + public string Command => "removehand"; + public string Description => "Removes a hand from your entity."; + public string Help => $"Usage: {Command}"; + + public void Execute(IConsoleShell shell, IPlayerSession? player, string[] args) + { + if (player == null) + { + shell.SendText(player, "Only a player can run this command."); + return; + } + + if (player.AttachedEntity == null) + { + shell.SendText(player, "You have no entity."); + return; + } + + if (!player.AttachedEntity.TryGetComponent(out BodyManagerComponent body)) + { + var random = IoCManager.Resolve(); + var text = $"You have no body{(random.Prob(0.2f) ? " and you must scream." : ".")}"; + + shell.SendText(player, text); + return; + } + + var hand = body.Parts.FirstOrDefault(x => x.Value.PartType == BodyPartType.Hand); + if (hand.Value == null) + { + shell.SendText(player, "You have no hands."); + } + else + { + body.DisconnectBodyPart(hand.Value, true); + } + } + } + + class DestroyMechanismCommand : IClientCommand + { + public string Command => "destroymechanism"; + public string Description => "Destroys a mechanism from your entity"; + public string Help => $"Usage: {Command} "; + + public void Execute(IConsoleShell shell, IPlayerSession? player, string[] args) + { + if (player == null) + { + shell.SendText(player, "Only a player can run this command."); + return; + } + + if (args.Length == 0) + { + shell.SendText(player, Help); + return; + } + + if (player.AttachedEntity == null) + { + shell.SendText(player, "You have no entity."); + return; + } + + if (!player.AttachedEntity.TryGetComponent(out BodyManagerComponent body)) + { + var random = IoCManager.Resolve(); + var text = $"You have no body{(random.Prob(0.2f) ? " and you must scream." : ".")}"; + + shell.SendText(player, text); + return; + } + + var mechanismName = string.Join(" ", args).ToLowerInvariant(); + + foreach (var part in body.Parts.Values) + foreach (var mechanism in part.Mechanisms) + { + if (mechanism.Name.ToLowerInvariant() == mechanismName) + { + part.DestroyMechanism(mechanism); + shell.SendText(player, $"Mechanism with name {mechanismName} has been destroyed."); + return; + } + } + + shell.SendText(player, $"No mechanism was found with name {mechanismName}."); + } + } +} diff --git a/Content.Server/Body/BodyPart.cs b/Content.Server/Body/BodyPart.cs new file mode 100644 index 0000000000..32121f056a --- /dev/null +++ b/Content.Server/Body/BodyPart.cs @@ -0,0 +1,602 @@ +#nullable enable +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using Content.Server.Body.Mechanisms; +using Content.Server.Body.Surgery; +using Content.Server.GameObjects.Components.Body; +using Content.Server.GameObjects.Components.Metabolism; +using Content.Shared.Body.Mechanism; +using Content.Shared.Body.Part; +using Content.Shared.Body.Part.Properties; +using Content.Shared.Damage.DamageContainer; +using Content.Shared.Damage.ResistanceSet; +using Content.Shared.GameObjects.Components.Body; +using Content.Shared.GameObjects.Components.Damage; +using Robust.Server.GameObjects; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.Reflection; +using Robust.Shared.Interfaces.Serialization; +using Robust.Shared.IoC; +using Robust.Shared.Log; +using Robust.Shared.Map; +using Robust.Shared.Maths; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; +using Robust.Shared.ViewVariables; + +namespace Content.Server.Body +{ + /// + /// Data class representing a singular limb such as an arm or a leg. + /// Typically held within either a , + /// which coordinates functions between BodyParts, or a + /// . + /// + public class BodyPart + { + /// + /// The body that this body part is in, if any. + /// + private BodyManagerComponent? _body; + + /// + /// Set of all currently inside this + /// . + /// To add and remove from this list see and + /// + /// + private readonly HashSet _mechanisms = new HashSet(); + + public BodyPart(BodyPartPrototype data) + { + SurgeryData = null!; + Properties = new HashSet(); + Name = null!; + Plural = null!; + RSIPath = null!; + RSIState = null!; + RSIMap = null!; + Damage = null!; + Resistances = null!; + + LoadFromPrototype(data); + } + + /// + /// The body that this body part is in, if any. + /// + [ViewVariables] + public BodyManagerComponent? Body + { + get => _body; + set + { + var old = _body; + _body = value; + + if (value == null && old != null) + { + foreach (var mechanism in Mechanisms) + { + mechanism.RemovedFromBody(old); + } + } + else + { + foreach (var mechanism in Mechanisms) + { + mechanism.InstalledIntoBody(); + } + } + } + } + + /// + /// The class currently representing this BodyPart's + /// surgery status. + /// + [ViewVariables] private SurgeryData SurgeryData { get; set; } + + /// + /// How much space is currently taken up by Mechanisms in this BodyPart. + /// + [ViewVariables] private int SizeUsed { get; set; } + + /// + /// List of properties, allowing for additional + /// data classes to be attached to a limb, such as a "length" class to an arm. + /// + [ViewVariables] + private HashSet Properties { get; } + + /// + /// The name of this , often displayed to the user. + /// For example, it could be named "advanced robotic arm". + /// + [ViewVariables] + public string Name { get; private set; } + + /// + /// Plural version of this name. + /// + [ViewVariables] + public string Plural { get; private set; } + + /// + /// Path to the RSI that represents this . + /// + [ViewVariables] + public string RSIPath { get; private set; } + + /// + /// RSI state that represents this . + /// + [ViewVariables] + public string RSIState { get; private set; } + + /// + /// RSI map keys that this body part changes on the sprite. + /// + [ViewVariables] + public Enum? RSIMap { get; set; } + + /// + /// RSI color of this body part. + /// + // TODO: SpriteComponent rework + public Color? RSIColor { get; set; } + + /// + /// that this is considered + /// to be. + /// For example, . + /// + [ViewVariables] + public BodyPartType PartType { get; private set; } + + /// + /// Determines many things: how many mechanisms can be fit inside this + /// , whether a body can fit through tiny crevices, etc. + /// + [ViewVariables] + private int Size { get; set; } + + /// + /// Max HP of this . + /// + [ViewVariables] + public int MaxDurability { get; private set; } + + /// + /// Current HP of this based on sum of all damage types. + /// + [ViewVariables] + public int CurrentDurability => MaxDurability - Damage.TotalDamage; + + // TODO: Individual body part damage + /// + /// Current damage dealt to this . + /// + [ViewVariables] + public DamageContainer Damage { get; private set; } + + /// + /// Armor of this against damages. + /// + [ViewVariables] + public ResistanceSet Resistances { get; private set; } + + /// + /// At what HP this destroyed. + /// + [ViewVariables] + public int DestroyThreshold { get; private set; } + + /// + /// What types of BodyParts this can easily attach to. + /// For the most part, most limbs aren't universal and require extra work to + /// attach between types. + /// + [ViewVariables] + public BodyPartCompatibility Compatibility { get; private set; } + + /// + /// Set of all currently inside this + /// . + /// + [ViewVariables] + public IReadOnlyCollection Mechanisms => _mechanisms; + + /// + /// This method is called by + /// before is called. + /// + public void PreMetabolism(float frameTime) + { + foreach (var mechanism in Mechanisms) + { + mechanism.PreMetabolism(frameTime); + } + } + + /// + /// This method is called by + /// after is called. + /// + public void PostMetabolism(float frameTime) + { + foreach (var mechanism in Mechanisms) + { + mechanism.PreMetabolism(frameTime); + } + } + + /// + /// Attempts to add the given . + /// + /// + /// True if a of that type doesn't exist, + /// false otherwise. + /// + public bool TryAddProperty(BodyPartProperty property) + { + if (HasProperty(property.GetType())) + { + return false; + } + + Properties.Add(property); + return true; + } + + /// + /// Attempts to retrieve the given type. + /// The resulting will be null if unsuccessful. + /// + /// The property if found, null otherwise. + /// The type of the property to find. + /// True if successful, false otherwise. + public bool TryGetProperty(out T property) + { + property = (T) Properties.First(x => x.GetType() == typeof(T)); + return property != null; + } + + /// + /// Attempts to retrieve the given type. + /// The resulting will be null if unsuccessful. + /// + /// True if successful, false otherwise. + public bool TryGetProperty(Type propertyType, out BodyPartProperty property) + { + property = (BodyPartProperty) Properties.First(x => x.GetType() == propertyType); + return property != null; + } + + /// + /// Checks if the given type is on this . + /// + /// + /// The subtype of to look for. + /// + /// + /// True if this has a property of type + /// , false otherwise. + /// + public bool HasProperty() where T : BodyPartProperty + { + return Properties.Count(x => x.GetType() == typeof(T)) > 0; + } + + /// + /// Checks if a subtype of is on this + /// . + /// + /// + /// The subtype of to look for. + /// + /// + /// True if this has a property of type + /// , false otherwise. + /// + public bool HasProperty(Type propertyType) + { + return Properties.Count(x => x.GetType() == propertyType) > 0; + } + + /// + /// Checks if another can be connected to this one. + /// + /// The part to connect. + /// True if it can be connected, false otherwise. + public bool CanAttachBodyPart(BodyPart toBeConnected) + { + return SurgeryData.CanAttachBodyPart(toBeConnected); + } + + /// + /// Checks if a can be installed on this + /// . + /// + /// True if it can be installed, false otherwise. + public bool CanInstallMechanism(Mechanism mechanism) + { + return SizeUsed + mechanism.Size <= Size && + SurgeryData.CanInstallMechanism(mechanism); + } + + /// + /// Tries to install a mechanism onto this body part. + /// Call instead if you want to + /// easily install an with a + /// . + /// + /// The mechanism to try to install. + /// + /// True if successful, false if there was an error + /// (e.g. not enough room in ). + /// + private bool TryInstallMechanism(Mechanism mechanism) + { + if (!CanInstallMechanism(mechanism)) + { + return false; + } + + AddMechanism(mechanism); + + return true; + } + + /// + /// Tries to install a into this + /// , potentially deleting the dropped + /// . + /// + /// The mechanism to install. + /// + /// True if successful, false if there was an error + /// (e.g. not enough room in ). + /// + public bool TryInstallDroppedMechanism(DroppedMechanismComponent droppedMechanism) + { + if (!TryInstallMechanism(droppedMechanism.ContainedMechanism)) + { + return false; //Installing the mechanism failed for some reason. + } + + droppedMechanism.Owner.Delete(); + return true; + } + + /// + /// Tries to remove the given reference from + /// this . + /// + /// + /// The newly spawned , or null + /// if there was an error in spawning the entity or removing the mechanism. + /// + public bool TryDropMechanism(IEntity dropLocation, Mechanism mechanismTarget, + [NotNullWhen(true)] out DroppedMechanismComponent dropped) + { + dropped = null!; + + if (!_mechanisms.Remove(mechanismTarget)) + { + return false; + } + + SizeUsed -= mechanismTarget.Size; + + var entityManager = IoCManager.Resolve(); + var position = dropLocation.Transform.GridPosition; + var mechanismEntity = entityManager.SpawnEntity("BaseDroppedMechanism", position); + + dropped = mechanismEntity.GetComponent(); + dropped.InitializeDroppedMechanism(mechanismTarget); + + return true; + } + + /// + /// Tries to destroy the given in this + /// . Does NOT spawn a dropped entity. + /// + /// + /// Tries to destroy the given in this + /// . + /// + /// The mechanism to destroy. + /// True if successful, false otherwise. + public bool DestroyMechanism(Mechanism mechanismTarget) + { + if (!RemoveMechanism(mechanismTarget)) + { + return false; + } + + return true; + } + + /// + /// Checks if the given can be used on + /// the current state of this . + /// + /// True if it can be used, false otherwise. + public bool SurgeryCheck(SurgeryType toolType) + { + return SurgeryData.CheckSurgery(toolType); + } + + /// + /// Attempts to perform surgery on this with the given + /// tool. + /// + /// True if successful, false if there was an error. + public bool AttemptSurgery(SurgeryType toolType, IBodyPartContainer target, ISurgeon surgeon, IEntity performer) + { + return SurgeryData.PerformSurgery(toolType, target, surgeon, performer); + } + + private void AddMechanism(Mechanism mechanism) + { + DebugTools.AssertNotNull(mechanism); + + _mechanisms.Add(mechanism); + SizeUsed += mechanism.Size; + mechanism.Part = this; + + mechanism.EnsureInitialize(); + + if (Body == null) + { + return; + } + + if (!Body.Template.MechanismLayers.TryGetValue(mechanism.Id, out var mapString)) + { + return; + } + + if (!IoCManager.Resolve().TryParseEnumReference(mapString, out var @enum)) + { + Logger.Warning($"Template {Body.Template.Name} has an invalid RSI map key {mapString} for mechanism {mechanism.Id}."); + return; + } + + var message = new MechanismSpriteAddedMessage(@enum); + + Body.Owner.SendNetworkMessage(Body, message); + } + + /// + /// Tries to remove the given from this + /// . + /// + /// The mechanism to remove. + /// True if it was removed, false otherwise. + private bool RemoveMechanism(Mechanism mechanism) + { + DebugTools.AssertNotNull(mechanism); + + if (!_mechanisms.Remove(mechanism)) + { + return false; + } + + SizeUsed -= mechanism.Size; + mechanism.Part = null; + + if (Body == null) + { + return true; + } + + if (!Body.Template.MechanismLayers.TryGetValue(mechanism.Id, out var mapString)) + { + return true; + } + + if (!IoCManager.Resolve().TryParseEnumReference(mapString, out var @enum)) + { + Logger.Warning($"Template {Body.Template.Name} has an invalid RSI map key {mapString} for mechanism {mechanism.Id}."); + return true; + } + + var message = new MechanismSpriteRemovedMessage(@enum); + + Body.Owner.SendNetworkMessage(Body, message); + + return true; + } + + /// + /// Loads the given . + /// Current data on this will be overwritten! + /// + protected virtual void LoadFromPrototype(BodyPartPrototype data) + { + var prototypeManager = IoCManager.Resolve(); + + Name = data.Name; + Plural = data.Plural; + PartType = data.PartType; + RSIPath = data.RSIPath; + RSIState = data.RSIState; + MaxDurability = data.Durability; + + if (!prototypeManager.TryIndex(data.DamageContainerPresetId, + out DamageContainerPrototype damageContainerData)) + { + throw new InvalidOperationException( + $"No {nameof(DamageContainerPrototype)} found with id {data.DamageContainerPresetId}"); + } + + Damage = new DamageContainer(OnHealthChanged, damageContainerData); + + if (!prototypeManager.TryIndex(data.ResistanceSetId, out ResistanceSetPrototype resistancesData)) + { + throw new InvalidOperationException( + $"No {nameof(ResistanceSetPrototype)} found with id {data.ResistanceSetId}"); + } + + Resistances = new ResistanceSet(resistancesData); + Size = data.Size; + Compatibility = data.Compatibility; + + Properties.Clear(); + Properties.UnionWith(data.Properties); + + var surgeryDataType = Type.GetType(data.SurgeryDataName); + + if (surgeryDataType == null) + { + throw new InvalidOperationException($"No {nameof(Surgery.SurgeryData)} found with name {data.SurgeryDataName}"); + } + + if (!surgeryDataType.IsSubclassOf(typeof(SurgeryData))) + { + throw new InvalidOperationException( + $"Class {data.SurgeryDataName} is not a subtype of {nameof(Surgery.SurgeryData)} with id {data.ID}"); + } + + SurgeryData = IoCManager.Resolve().CreateInstance(surgeryDataType, new object[] {this}); + + foreach (var id in data.Mechanisms) + { + if (!prototypeManager.TryIndex(id, out MechanismPrototype mechanismData)) + { + throw new InvalidOperationException($"No {nameof(MechanismPrototype)} found with id {id}"); + } + + var mechanism = new Mechanism(mechanismData); + + AddMechanism(mechanism); + } + } + + private void OnHealthChanged(List changes) + { + // TODO + } + + public bool SpawnDropped([NotNullWhen(true)] out IEntity dropped) + { + dropped = default!; + + if (Body == null) + { + return false; + } + + dropped = IoCManager.Resolve().SpawnEntity("BaseDroppedBodyPart", Body.Owner.Transform.GridPosition); + + dropped.GetComponent().TransferBodyPartData(this); + + return true; + } + } +} diff --git a/Content.Server/Body/BodyPreset.cs b/Content.Server/Body/BodyPreset.cs new file mode 100644 index 0000000000..12e67c53e9 --- /dev/null +++ b/Content.Server/Body/BodyPreset.cs @@ -0,0 +1,36 @@ +using System.Collections.Generic; +using Content.Shared.Body.Part; +using Content.Shared.Body.Preset; +using Robust.Shared.ViewVariables; + +namespace Content.Server.Body +{ + /// + /// Stores data on what should + /// fill a BodyTemplate. + /// Used for loading complete body presets, like a "basic human" with all + /// human limbs. + /// + public class BodyPreset + { + public BodyPreset(BodyPresetPrototype data) + { + LoadFromPrototype(data); + } + + [ViewVariables] public string Name { get; private set; } + + /// + /// Maps a template slot to the ID of the that should + /// fill it. E.g. "right arm" : "BodyPart.arm.basic_human". + /// + [ViewVariables] + public Dictionary PartIDs { get; private set; } + + protected virtual void LoadFromPrototype(BodyPresetPrototype data) + { + Name = data.Name; + PartIDs = data.PartIDs; + } + } +} diff --git a/Content.Server/Body/BodyTemplate.cs b/Content.Server/Body/BodyTemplate.cs new file mode 100644 index 0000000000..ae32c02688 --- /dev/null +++ b/Content.Server/Body/BodyTemplate.cs @@ -0,0 +1,145 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Content.Server.GameObjects.Components.Body; +using Content.Shared.Body.Template; +using Content.Shared.GameObjects.Components.Body; +using Robust.Shared.ViewVariables; + +namespace Content.Server.Body +{ + /// + /// This class is a data capsule representing the standard format of a + /// . + /// For instance, the "humanoid" BodyTemplate defines two arms, each connected to + /// a torso and so on. + /// Capable of loading data from a . + /// + public class BodyTemplate + { + public BodyTemplate() + { + Name = "empty"; + CenterSlot = ""; + Slots = new Dictionary(); + Connections = new Dictionary>(); + Layers = new Dictionary(); + MechanismLayers = new Dictionary(); + } + + public BodyTemplate(BodyTemplatePrototype data) + { + LoadFromPrototype(data); + } + + [ViewVariables] public string Name { get; private set; } + + /// + /// The name of the center BodyPart. For humans, this is set to "torso". + /// Used in many calculations. + /// + [ViewVariables] + public string CenterSlot { get; set; } + + /// + /// Maps all parts on this template to its BodyPartType. + /// For instance, "right arm" is mapped to "BodyPartType.arm" on the humanoid + /// template. + /// + [ViewVariables] + public Dictionary Slots { get; private set; } + + /// + /// Maps limb name to the list of their connections to other limbs. + /// For instance, on the humanoid template "torso" is mapped to a list + /// containing "right arm", "left arm", "left leg", and "right leg". + /// This is mapped both ways during runtime, but in the prototype only one + /// way has to be defined, i.e., "torso" to "left arm" will automatically + /// map "left arm" to "torso". + /// + [ViewVariables] + public Dictionary> Connections { get; private set; } + + [ViewVariables] + public Dictionary Layers { get; private set; } + + [ViewVariables] + public Dictionary MechanismLayers { get; private set; } + + public bool Equals(BodyTemplate other) + { + return GetHashCode() == other.GetHashCode(); + } + + /// + /// Checks if the given slot exists in this . + /// + /// True if it does, false otherwise. + public bool SlotExists(string slotName) + { + return Slots.Keys.Any(slot => slot == slotName); + } + + /// + /// Calculates the hash code for this instance of . + /// It does not matter in which order the Connections or Slots are defined. + /// + /// + /// An integer unique to this 's layout. + /// + public override int GetHashCode() + { + var slotsHash = 0; + var connectionsHash = 0; + + foreach (var (key, value) in Slots) + { + var slot = key.GetHashCode(); + slot = HashCode.Combine(slot, value.GetHashCode()); + slotsHash ^= slot; + } + + var connections = new List(); + foreach (var (key, value) in Connections) + { + foreach (var targetBodyPart in value) + { + var connection = key.GetHashCode() ^ targetBodyPart.GetHashCode(); + if (!connections.Contains(connection)) + { + connections.Add(connection); + } + } + } + + foreach (var connection in connections) + { + connectionsHash ^= connection; + } + + // One of the unit tests considers 0 to be an error, but it will be 0 if + // the BodyTemplate is empty, so let's shift that up to 1. + var hash = HashCode.Combine( + CenterSlot.GetHashCode(), + slotsHash, + connectionsHash); + + if (hash == 0) + { + hash++; + } + + return hash; + } + + protected virtual void LoadFromPrototype(BodyTemplatePrototype data) + { + Name = data.Name; + CenterSlot = data.CenterSlot; + Slots = data.Slots; + Connections = data.Connections; + Layers = data.Layers; + MechanismLayers = data.MechanismLayers; + } + } +} diff --git a/Content.Server/Body/IBodyPartContainer.cs b/Content.Server/Body/IBodyPartContainer.cs new file mode 100644 index 0000000000..fdc4c402e9 --- /dev/null +++ b/Content.Server/Body/IBodyPartContainer.cs @@ -0,0 +1,19 @@ +using Content.Server.Body.Surgery; +using Content.Server.GameObjects.Components.Body; + +namespace Content.Server.Body +{ + /// + /// Making a class inherit from this interface allows you to do many things with + /// it in the class. + /// This includes passing it as an argument to a + /// delegate, as to later typecast it back + /// to the original class type. + /// Every BodyPart also needs an to be its parent + /// (i.e. the holds many , + /// each of which have an upward reference to it). + /// + public interface IBodyPartContainer + { + } +} diff --git a/Content.Server/Body/Mechanisms/Behaviors/BrainBehavior.cs b/Content.Server/Body/Mechanisms/Behaviors/BrainBehavior.cs new file mode 100644 index 0000000000..869534803e --- /dev/null +++ b/Content.Server/Body/Mechanisms/Behaviors/BrainBehavior.cs @@ -0,0 +1,9 @@ +namespace Content.Server.Body.Mechanisms.Behaviors +{ + /// + /// The behaviors of a brain, inhabitable by a player. + /// + public class BrainBehavior : MechanismBehavior + { + } +} diff --git a/Content.Server/Body/Mechanisms/Behaviors/HeartBehavior.cs b/Content.Server/Body/Mechanisms/Behaviors/HeartBehavior.cs new file mode 100644 index 0000000000..51366583bd --- /dev/null +++ b/Content.Server/Body/Mechanisms/Behaviors/HeartBehavior.cs @@ -0,0 +1,38 @@ +#nullable enable +using System; +using Content.Server.Body.Network; +using Content.Server.GameObjects.Components.Body.Circulatory; +using JetBrains.Annotations; + +namespace Content.Server.Body.Mechanisms.Behaviors +{ + [UsedImplicitly] + public class HeartBehavior : MechanismBehavior + { + private float _accumulatedFrameTime; + + protected override Type? Network => typeof(CirculatoryNetwork); + + public override void PreMetabolism(float frameTime) + { + // TODO do between pre and metabolism + base.PreMetabolism(frameTime); + + if (Mechanism.Body == null || + !Mechanism.Body.Owner.TryGetComponent(out BloodstreamComponent bloodstream)) + { + return; + } + + // Update at most once per second + _accumulatedFrameTime += frameTime; + + // TODO: Move/accept/process bloodstream reagents only when the heart is pumping + if (_accumulatedFrameTime >= 1) + { + // bloodstream.Update(_accumulatedFrameTime); + _accumulatedFrameTime -= 1; + } + } + } +} diff --git a/Content.Server/Body/Mechanisms/Behaviors/LungBehavior.cs b/Content.Server/Body/Mechanisms/Behaviors/LungBehavior.cs new file mode 100644 index 0000000000..675cc37e76 --- /dev/null +++ b/Content.Server/Body/Mechanisms/Behaviors/LungBehavior.cs @@ -0,0 +1,27 @@ +#nullable enable +using System; +using Content.Server.Body.Network; +using Content.Server.GameObjects.Components.Body.Respiratory; +using JetBrains.Annotations; + +namespace Content.Server.Body.Mechanisms.Behaviors +{ + [UsedImplicitly] + public class LungBehavior : MechanismBehavior + { + protected override Type? Network => typeof(RespiratoryNetwork); + + public override void PreMetabolism(float frameTime) + { + base.PreMetabolism(frameTime); + + if (Mechanism.Body == null || + !Mechanism.Body.Owner.TryGetComponent(out LungComponent lung)) + { + return; + } + + lung.Update(frameTime); + } + } +} diff --git a/Content.Server/Body/Mechanisms/Behaviors/MechanismBehavior.cs b/Content.Server/Body/Mechanisms/Behaviors/MechanismBehavior.cs new file mode 100644 index 0000000000..77c3d5e982 --- /dev/null +++ b/Content.Server/Body/Mechanisms/Behaviors/MechanismBehavior.cs @@ -0,0 +1,185 @@ +#nullable enable +using System; +using Content.Server.GameObjects.Components.Body; +using Content.Server.GameObjects.Components.Metabolism; + +namespace Content.Server.Body.Mechanisms.Behaviors +{ + /// + /// The behaviors a mechanism performs. + /// + public abstract class MechanismBehavior + { + private bool Initialized { get; set; } + + private bool Removed { get; set; } + + /// + /// The network, if any, that this behavior forms when its mechanism is + /// added and destroys when its mechanism is removed. + /// + protected virtual Type? Network { get; } = null; + + /// + /// Upward reference to the parent that this + /// behavior is attached to. + /// + protected Mechanism Mechanism { get; private set; } = null!; + + /// + /// Called by a to initialize this behavior. + /// + /// The mechanism that owns this behavior. + /// + /// If the mechanism has already been initialized. + /// + public void Initialize(Mechanism mechanism) + { + if (Initialized) + { + throw new InvalidOperationException("This mechanism has already been initialized."); + } + + Mechanism = mechanism; + + Initialize(); + + if (Mechanism.Body != null) + { + OnInstalledIntoBody(); + } + + if (Mechanism.Part != null) + { + OnInstalledIntoPart(); + } + + Initialized = true; + } + + /// + /// Called when a behavior is removed from a . + /// + public void Remove() + { + OnRemove(); + TryRemoveNetwork(Mechanism.Body); + + Mechanism = null!; + Removed = true; + } + + /// + /// Called when the containing is attached to a + /// . + /// For instance, attaching a head to a body will call this on the brain inside. + /// + public void InstalledIntoBody() + { + TryAddNetwork(); + OnInstalledIntoBody(); + } + + /// + /// Called when the parent is + /// installed into a . + /// For instance, putting a brain into an empty head. + /// + public void InstalledIntoPart() + { + TryAddNetwork(); + OnInstalledIntoPart(); + } + + /// + /// Called when the containing is removed from a + /// . + /// For instance, cutting off ones head will call this on the brain inside. + /// + public void RemovedFromBody(BodyManagerComponent old) + { + OnRemovedFromBody(old); + TryRemoveNetwork(old); + } + + /// + /// Called when the parent is removed from a + /// . + /// For instance, taking a brain out of ones head. + /// + public void RemovedFromPart(BodyPart old) + { + OnRemovedFromPart(old); + TryRemoveNetwork(old.Body); + } + + private void TryAddNetwork() + { + if (Network != null) + { + Mechanism.Body?.EnsureNetwork(Network); + } + } + + private void TryRemoveNetwork(BodyManagerComponent? body) + { + if (Network != null) + { + body?.RemoveNetwork(Network); + } + } + + /// + /// Called by when this behavior is first initialized. + /// + protected virtual void Initialize() { } + + protected virtual void OnRemove() { } + + /// + /// Called when the containing is attached to a + /// . + /// For instance, attaching a head to a body will call this on the brain inside. + /// + protected virtual void OnInstalledIntoBody() { } + + /// + /// Called when the parent is + /// installed into a . + /// For instance, putting a brain into an empty head. + /// + protected virtual void OnInstalledIntoPart() { } + + /// + /// Called when the containing is removed from a + /// . + /// For instance, cutting off ones head will call this on the brain inside. + /// + protected virtual void OnRemovedFromBody(BodyManagerComponent old) { } + + /// + /// Called when the parent is removed from a + /// . + /// For instance, taking a brain out of ones head. + /// + protected virtual void OnRemovedFromPart(BodyPart old) { } + + /// + /// Called every update when this behavior is connected to a + /// , but not while in a + /// or + /// , + /// before is called. + /// + public virtual void PreMetabolism(float frameTime) { } + + /// + /// Called every update when this behavior is connected to a + /// , but not while in a + /// or + /// , + /// after is called. + /// + public virtual void PostMetabolism(float frameTime) { } + } +} diff --git a/Content.Server/Body/Mechanisms/Behaviors/StomachBehavior.cs b/Content.Server/Body/Mechanisms/Behaviors/StomachBehavior.cs new file mode 100644 index 0000000000..ae1e17b49b --- /dev/null +++ b/Content.Server/Body/Mechanisms/Behaviors/StomachBehavior.cs @@ -0,0 +1,36 @@ +#nullable enable +using System; +using Content.Server.Body.Network; +using Content.Server.GameObjects.Components.Body.Digestive; +using JetBrains.Annotations; + +namespace Content.Server.Body.Mechanisms.Behaviors +{ + [UsedImplicitly] + public class StomachBehavior : MechanismBehavior + { + private float _accumulatedFrameTime; + + protected override Type? Network => typeof(DigestiveNetwork); + + public override void PreMetabolism(float frameTime) + { + base.PreMetabolism(frameTime); + + if (Mechanism.Body == null || + !Mechanism.Body.Owner.TryGetComponent(out StomachComponent stomach)) + { + return; + } + + // Update at most once per second + _accumulatedFrameTime += frameTime; + + if (_accumulatedFrameTime >= 1) + { + stomach.Update(_accumulatedFrameTime); + _accumulatedFrameTime -= 1; + } + } + } +} diff --git a/Content.Server/Body/Mechanisms/Mechanism.cs b/Content.Server/Body/Mechanisms/Mechanism.cs new file mode 100644 index 0000000000..9c88b0425b --- /dev/null +++ b/Content.Server/Body/Mechanisms/Mechanism.cs @@ -0,0 +1,249 @@ +#nullable enable +using System; +using System.Collections.Generic; +using Content.Server.Body.Mechanisms.Behaviors; +using Content.Server.GameObjects.Components.Body; +using Content.Server.GameObjects.Components.Metabolism; +using Content.Shared.Body.Mechanism; +using Content.Shared.GameObjects.Components.Body; +using Robust.Shared.IoC; +using Robust.Shared.ViewVariables; + +namespace Content.Server.Body.Mechanisms +{ + /// + /// Data class representing a persistent item inside a . + /// This includes livers, eyes, cameras, brains, explosive implants, + /// binary communicators, and other things. + /// + public class Mechanism + { + private BodyPart? _part; + + public Mechanism(MechanismPrototype data) + { + Data = data; + Id = null!; + Name = null!; + Description = null!; + ExamineMessage = null!; + RSIPath = null!; + RSIState = null!; + Behaviors = new List(); + } + + [ViewVariables] private bool Initialized { get; set; } + + [ViewVariables] private MechanismPrototype Data { get; set; } + + [ViewVariables] public string Id { get; private set; } + + [ViewVariables] public string Name { get; set; } + + /// + /// Professional description of the . + /// + [ViewVariables] + public string Description { get; set; } + + /// + /// The message to display upon examining a mob with this Mechanism installed. + /// If the string is empty (""), no message will be displayed. + /// + [ViewVariables] + public string ExamineMessage { get; set; } + + /// + /// Path to the RSI that represents this . + /// + [ViewVariables] + public string RSIPath { get; set; } + + /// + /// RSI state that represents this . + /// + [ViewVariables] + public string RSIState { get; set; } + + /// + /// Max HP of this . + /// + [ViewVariables] + public int MaxDurability { get; set; } + + /// + /// Current HP of this . + /// + [ViewVariables] + public int CurrentDurability { get; set; } + + /// + /// At what HP this is completely destroyed. + /// + [ViewVariables] + public int DestroyThreshold { get; set; } + + /// + /// Armor of this against attacks. + /// + [ViewVariables] + public int Resistance { get; set; } + + /// + /// Determines a handful of things - mostly whether this + /// can fit into a . + /// + [ViewVariables] + public int Size { get; set; } + + /// + /// What kind of this can be + /// easily installed into. + /// + [ViewVariables] + public BodyPartCompatibility Compatibility { get; set; } + + /// + /// The behaviors that this performs. + /// + [ViewVariables] + private List Behaviors { get; } + + public BodyManagerComponent? Body => Part?.Body; + + public BodyPart? Part + { + get => _part; + set + { + var old = _part; + _part = value; + + if (value == null && old != null) + { + foreach (var behavior in Behaviors) + { + behavior.RemovedFromPart(old); + } + } + else + { + foreach (var behavior in Behaviors) + { + behavior.InstalledIntoPart(); + } + } + } + } + + public void EnsureInitialize() + { + if (Initialized) + { + return; + } + + LoadFromPrototype(Data); + Initialized = true; + } + + /// + /// Loads the given . + /// Current data on this will be overwritten! + /// + private void LoadFromPrototype(MechanismPrototype data) + { + Data = data; + Id = data.ID; + Name = data.Name; + Description = data.Description; + ExamineMessage = data.ExamineMessage; + RSIPath = data.RSIPath; + RSIState = data.RSIState; + MaxDurability = data.Durability; + CurrentDurability = MaxDurability; + DestroyThreshold = data.DestroyThreshold; + Resistance = data.Resistance; + Size = data.Size; + Compatibility = data.Compatibility; + + foreach (var behavior in Behaviors.ToArray()) + { + RemoveBehavior(behavior); + } + + foreach (var mechanismBehaviorName in data.BehaviorClasses) + { + var mechanismBehaviorType = Type.GetType(mechanismBehaviorName); + + if (mechanismBehaviorType == null) + { + throw new InvalidOperationException( + $"No {nameof(MechanismBehavior)} found with name {mechanismBehaviorName}"); + } + + if (!mechanismBehaviorType.IsSubclassOf(typeof(MechanismBehavior))) + { + throw new InvalidOperationException( + $"Class {mechanismBehaviorName} is not a subtype of {nameof(MechanismBehavior)} for mechanism prototype {data.ID}"); + } + + var newBehavior = IoCManager.Resolve().CreateInstance(mechanismBehaviorType); + + AddBehavior(newBehavior); + } + } + + public void InstalledIntoBody() + { + foreach (var behavior in Behaviors) + { + behavior.InstalledIntoBody(); + } + } + + public void RemovedFromBody(BodyManagerComponent old) + { + foreach (var behavior in Behaviors) + { + behavior.RemovedFromBody(old); + } + } + + /// + /// This method is called by before + /// is called. + /// + public void PreMetabolism(float frameTime) + { + foreach (var behavior in Behaviors) + { + behavior.PreMetabolism(frameTime); + } + } + + /// + /// This method is called by after + /// is called. + /// + public void PostMetabolism(float frameTime) + { + foreach (var behavior in Behaviors) + { + behavior.PostMetabolism(frameTime); + } + } + + private void AddBehavior(MechanismBehavior behavior) + { + Behaviors.Add(behavior); + behavior.Initialize(this); + } + + private bool RemoveBehavior(MechanismBehavior behavior) + { + behavior.Remove(); + return Behaviors.Remove(behavior); + } + } +} diff --git a/Content.Server/Body/Network/BodyNetwork.cs b/Content.Server/Body/Network/BodyNetwork.cs new file mode 100644 index 0000000000..911bfbde75 --- /dev/null +++ b/Content.Server/Body/Network/BodyNetwork.cs @@ -0,0 +1,76 @@ +using System; +using Content.Server.GameObjects.Components.Body; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.Serialization; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; + +namespace Content.Server.Body.Network +{ + /// + /// Represents a "network" such as a bloodstream or electrical power that + /// is coordinated throughout an entire . + /// + public abstract class BodyNetwork : IExposeData + { + [ViewVariables] + public abstract string Name { get; } + + protected IEntity Owner { get; private set; } + + public virtual void ExposeData(ObjectSerializer serializer) { } + + public void OnAdd(IEntity entity) + { + Owner = entity; + OnAdd(); + } + + protected virtual void OnAdd() { } + + public virtual void OnRemove() { } + + /// + /// Called every update by . + /// + public virtual void Update(float frameTime) { } + } + + public static class BodyNetworkExtensions + { + public static void TryAddNetwork(this IEntity entity, Type type) + { + if (!entity.TryGetComponent(out BodyManagerComponent body)) + { + return; + } + + body.EnsureNetwork(type); + } + + public static void TryAddNetwork(this IEntity entity) where T : BodyNetwork + { + if (!entity.TryGetComponent(out BodyManagerComponent body)) + { + return; + } + + body.EnsureNetwork(); + } + + public static bool TryGetBodyNetwork(this IEntity entity, Type type, out BodyNetwork network) + { + network = null; + + return entity.TryGetComponent(out BodyManagerComponent body) && + body.TryGetNetwork(type, out network); + } + + public static bool TryGetBodyNetwork(this IEntity entity, out T network) where T : BodyNetwork + { + entity.TryGetBodyNetwork(typeof(T), out var unCastNetwork); + network = (T) unCastNetwork; + return network != null; + } + } +} diff --git a/Content.Server/Body/Network/BodyNetworkFactory.cs b/Content.Server/Body/Network/BodyNetworkFactory.cs new file mode 100644 index 0000000000..8b5ec0cc7f --- /dev/null +++ b/Content.Server/Body/Network/BodyNetworkFactory.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; +using Robust.Shared.Interfaces.Reflection; +using Robust.Shared.IoC; + +namespace Content.Server.Body.Network +{ + public class BodyNetworkFactory : IBodyNetworkFactory + { + [Dependency] private readonly IDynamicTypeFactory _typeFactory = default!; + [Dependency] private readonly IReflectionManager _reflectionManager = default!; + + /// + /// Mapping of body network names to their types. + /// + private readonly Dictionary _names = new Dictionary(); + + private void Register(Type type) + { + if (_names.ContainsValue(type)) + { + throw new InvalidOperationException($"Type is already registered: {type}"); + } + + if (!type.IsSubclassOf(typeof(BodyNetwork))) + { + throw new InvalidOperationException($"{type} is not a subclass of {nameof(BodyNetwork)}"); + } + + var dummy = _typeFactory.CreateInstance(type); + + if (dummy == null) + { + throw new NullReferenceException(); + } + + var name = dummy.Name; + + if (name == null) + { + throw new NullReferenceException($"{type}'s name cannot be null."); + } + + if (_names.ContainsKey(name)) + { + throw new InvalidOperationException($"{name} is already registered."); + } + + _names.Add(name, type); + } + + public void DoAutoRegistrations() + { + var bodyNetwork = typeof(BodyNetwork); + + foreach (var child in _reflectionManager.GetAllChildren(bodyNetwork)) + { + Register(child); + } + } + + public BodyNetwork GetNetwork(string name) + { + Type type; + + try + { + type = _names[name]; + } + catch (KeyNotFoundException) + { + throw new ArgumentException($"No {nameof(BodyNetwork)} exists with name {name}"); + } + + return _typeFactory.CreateInstance(type); + } + + public BodyNetwork GetNetwork(Type type) + { + if (!_names.ContainsValue(type)) + { + throw new ArgumentException($"{type} is not registered."); + } + + return _typeFactory.CreateInstance(type); + } + } +} diff --git a/Content.Server/Body/Network/CirculatoryNetwork.cs b/Content.Server/Body/Network/CirculatoryNetwork.cs new file mode 100644 index 0000000000..c67bc6e201 --- /dev/null +++ b/Content.Server/Body/Network/CirculatoryNetwork.cs @@ -0,0 +1,25 @@ +using Content.Server.GameObjects.Components.Body.Circulatory; +using JetBrains.Annotations; +using Robust.Shared.GameObjects; + +namespace Content.Server.Body.Network +{ + [UsedImplicitly] + public class CirculatoryNetwork : BodyNetwork + { + public override string Name => "Circulatory"; + + protected override void OnAdd() + { + Owner.EnsureComponent(); + } + + public override void OnRemove() + { + if (Owner.HasComponent()) + { + Owner.RemoveComponent(); + } + } + } +} diff --git a/Content.Server/Body/Network/DigestiveNetwork.cs b/Content.Server/Body/Network/DigestiveNetwork.cs new file mode 100644 index 0000000000..6362b55072 --- /dev/null +++ b/Content.Server/Body/Network/DigestiveNetwork.cs @@ -0,0 +1,28 @@ +using Content.Server.GameObjects.Components.Body.Digestive; +using JetBrains.Annotations; +using Robust.Shared.GameObjects; + +namespace Content.Server.Body.Network +{ + /// + /// Represents the system that processes food, liquids, and the reagents inside them. + /// + [UsedImplicitly] + public class DigestiveNetwork : BodyNetwork + { + public override string Name => "Digestive"; + + protected override void OnAdd() + { + Owner.EnsureComponent(); + } + + public override void OnRemove() + { + if (Owner.HasComponent()) + { + Owner.RemoveComponent(); + } + } + } +} diff --git a/Content.Server/Body/Network/IBodyNetworkFactory.cs b/Content.Server/Body/Network/IBodyNetworkFactory.cs new file mode 100644 index 0000000000..29d883f21b --- /dev/null +++ b/Content.Server/Body/Network/IBodyNetworkFactory.cs @@ -0,0 +1,13 @@ +using System; + +namespace Content.Server.Body.Network +{ + public interface IBodyNetworkFactory + { + void DoAutoRegistrations(); + + BodyNetwork GetNetwork(string name); + + BodyNetwork GetNetwork(Type type); + } +} diff --git a/Content.Server/Body/Network/RespiratoryNetwork.cs b/Content.Server/Body/Network/RespiratoryNetwork.cs new file mode 100644 index 0000000000..92c974f2e3 --- /dev/null +++ b/Content.Server/Body/Network/RespiratoryNetwork.cs @@ -0,0 +1,25 @@ +using Content.Server.GameObjects.Components.Body.Respiratory; +using JetBrains.Annotations; +using Robust.Shared.GameObjects; + +namespace Content.Server.Body.Network +{ + [UsedImplicitly] + public class RespiratoryNetwork : BodyNetwork + { + public override string Name => "Respiratory"; + + protected override void OnAdd() + { + Owner.EnsureComponent(); + } + + public override void OnRemove() + { + if (Owner.HasComponent()) + { + Owner.RemoveComponent(); + } + } + } +} diff --git a/Content.Server/Body/Surgery/BiologicalSurgeryData.cs b/Content.Server/Body/Surgery/BiologicalSurgeryData.cs new file mode 100644 index 0000000000..37fbb57b29 --- /dev/null +++ b/Content.Server/Body/Surgery/BiologicalSurgeryData.cs @@ -0,0 +1,250 @@ +#nullable enable +using System.Collections.Generic; +using System.Linq; +using Content.Server.Body.Mechanisms; +using Content.Server.GameObjects.Components.Body; +using Content.Shared.GameObjects.Components.Body; +using Content.Shared.Interfaces; +using JetBrains.Annotations; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Localization; + +namespace Content.Server.Body.Surgery +{ + /// + /// Data class representing the surgery state of a biological entity. + /// + [UsedImplicitly] + public class BiologicalSurgeryData : SurgeryData + { + private readonly List _disconnectedOrgans = new List(); + + private bool _skinOpened; + private bool _skinRetracted; + private bool _vesselsClamped; + + public BiologicalSurgeryData(BodyPart parent) : base(parent) { } + + protected override SurgeryAction? GetSurgeryStep(SurgeryType toolType) + { + if (toolType == SurgeryType.Amputation) + { + return RemoveBodyPartSurgery; + } + + if (!_skinOpened) + { + // Case: skin is normal. + if (toolType == SurgeryType.Incision) + { + return OpenSkinSurgery; + } + } + else if (!_vesselsClamped) + { + // Case: skin is opened, but not clamped. + switch (toolType) + { + case SurgeryType.VesselCompression: + return ClampVesselsSurgery; + case SurgeryType.Cauterization: + return CauterizeIncisionSurgery; + } + } + else if (!_skinRetracted) + { + // Case: skin is opened and clamped, but not retracted. + switch (toolType) + { + case SurgeryType.Retraction: + return RetractSkinSurgery; + case SurgeryType.Cauterization: + return CauterizeIncisionSurgery; + } + } + else + { + // Case: skin is fully open. + if (Parent.Mechanisms.Count > 0 && + toolType == SurgeryType.VesselCompression) + { + if (_disconnectedOrgans.Except(Parent.Mechanisms).Count() != 0 || + Parent.Mechanisms.Except(_disconnectedOrgans).Count() != 0) + { + return LoosenOrganSurgery; + } + } + + if (_disconnectedOrgans.Count > 0 && toolType == SurgeryType.Incision) + { + return RemoveOrganSurgery; + } + + if (toolType == SurgeryType.Cauterization) + { + return CauterizeIncisionSurgery; + } + } + + return null; + } + + public override string GetDescription(IEntity target) + { + var toReturn = ""; + + if (_skinOpened && !_vesselsClamped) + { + // Case: skin is opened, but not clamped. + toReturn += Loc.GetString("The skin on {0:their} {1} has an incision, but it is prone to bleeding.\n", + target, Parent.Name); + } + else if (_skinOpened && _vesselsClamped && !_skinRetracted) + { + // Case: skin is opened and clamped, but not retracted. + toReturn += Loc.GetString("The skin on {0:their} {1} has an incision, but it is not retracted.\n", + target, Parent.Name); + } + else if (_skinOpened && _vesselsClamped && _skinRetracted) + { + // Case: skin is fully open. + toReturn += Loc.GetString("There is an incision on {0:their} {1}.\n", target, Parent.Name); + foreach (var mechanism in _disconnectedOrgans) + { + toReturn += Loc.GetString("{0:their} {1} is loose.\n", target, mechanism.Name); + } + } + + return toReturn; + } + + public override bool CanInstallMechanism(Mechanism mechanism) + { + return _skinOpened && _vesselsClamped && _skinRetracted; + } + + public override bool CanAttachBodyPart(BodyPart part) + { + return true; + // TODO: if a bodypart is disconnected, you should have to do some surgery to allow another bodypart to be attached. + } + + private void OpenSkinSurgery(IBodyPartContainer container, ISurgeon surgeon, IEntity performer) + { + performer.PopupMessage(performer, Loc.GetString("Cut open the skin...")); + + // TODO do_after: Delay + _skinOpened = true; + } + + private void ClampVesselsSurgery(IBodyPartContainer container, ISurgeon surgeon, IEntity performer) + { + performer.PopupMessage(performer, Loc.GetString("Clamp the vessels...")); + + // TODO do_after: Delay + _vesselsClamped = true; + } + + private void RetractSkinSurgery(IBodyPartContainer container, ISurgeon surgeon, IEntity performer) + { + performer.PopupMessage(performer, Loc.GetString("Retract the skin...")); + + // TODO do_after: Delay + _skinRetracted = true; + } + + private void CauterizeIncisionSurgery(IBodyPartContainer container, ISurgeon surgeon, IEntity performer) + { + performer.PopupMessage(performer, Loc.GetString("Cauterize the incision...")); + + // TODO do_after: Delay + _skinOpened = false; + _vesselsClamped = false; + _skinRetracted = false; + } + + private void LoosenOrganSurgery(IBodyPartContainer container, ISurgeon surgeon, IEntity performer) + { + if (Parent.Mechanisms.Count <= 0) + { + return; + } + + var toSend = new List(); + foreach (var mechanism in Parent.Mechanisms) + { + if (!_disconnectedOrgans.Contains(mechanism)) + { + toSend.Add(mechanism); + } + } + + if (toSend.Count > 0) + { + surgeon.RequestMechanism(toSend, LoosenOrganSurgeryCallback); + } + } + + private void LoosenOrganSurgeryCallback(Mechanism target, IBodyPartContainer container, ISurgeon surgeon, + IEntity performer) + { + if (target == null || !Parent.Mechanisms.Contains(target)) + { + return; + } + + performer.PopupMessage(performer, Loc.GetString("Loosen the organ...")); + + // TODO do_after: Delay + _disconnectedOrgans.Add(target); + } + + private void RemoveOrganSurgery(IBodyPartContainer container, ISurgeon surgeon, IEntity performer) + { + if (_disconnectedOrgans.Count <= 0) + { + return; + } + + if (_disconnectedOrgans.Count == 1) + { + RemoveOrganSurgeryCallback(_disconnectedOrgans[0], container, surgeon, performer); + } + else + { + surgeon.RequestMechanism(_disconnectedOrgans, RemoveOrganSurgeryCallback); + } + } + + private void RemoveOrganSurgeryCallback(Mechanism target, IBodyPartContainer container, + ISurgeon surgeon, + IEntity performer) + { + if (target == null || !Parent.Mechanisms.Contains(target)) + { + return; + } + + performer.PopupMessage(performer, Loc.GetString("Remove the organ...")); + + // TODO do_after: Delay + Parent.TryDropMechanism(performer, target, out _); + _disconnectedOrgans.Remove(target); + } + + private void RemoveBodyPartSurgery(IBodyPartContainer container, ISurgeon surgeon, IEntity performer) + { + // This surgery requires a DroppedBodyPartComponent. + if (!(container is BodyManagerComponent)) + { + return; + } + + var bmTarget = (BodyManagerComponent) container; + performer.PopupMessage(performer, Loc.GetString("Saw off the limb!")); + + // TODO do_after: Delay + bmTarget.DisconnectBodyPart(Parent, true); + } + } +} diff --git a/Content.Server/Body/Surgery/ISurgeon.cs b/Content.Server/Body/Surgery/ISurgeon.cs new file mode 100644 index 0000000000..be2ed1135c --- /dev/null +++ b/Content.Server/Body/Surgery/ISurgeon.cs @@ -0,0 +1,34 @@ +using System.Collections.Generic; +using Content.Server.Body.Mechanisms; +using Content.Server.GameObjects.Components.Body; +using Robust.Shared.Interfaces.GameObjects; + +namespace Content.Server.Body.Surgery +{ + /// + /// Interface representing an entity capable of performing surgery (performing operations on an + /// class). + /// For an example see , which inherits from this class. + /// + public interface ISurgeon + { + public delegate void MechanismRequestCallback( + Mechanism target, + IBodyPartContainer container, + ISurgeon surgeon, + IEntity performer); + + /// + /// How long it takes to perform a single surgery step (in seconds). + /// + public float BaseOperationTime { get; set; } + + /// + /// When performing a surgery, the may sometimes require selecting from a set of Mechanisms + /// to operate on. + /// This function is called in that scenario, and it is expected that you call the callback with one mechanism from the + /// provided list. + /// + public void RequestMechanism(IEnumerable options, MechanismRequestCallback callback); + } +} diff --git a/Content.Server/Body/Surgery/SurgeryData.cs b/Content.Server/Body/Surgery/SurgeryData.cs new file mode 100644 index 0000000000..a4274d0042 --- /dev/null +++ b/Content.Server/Body/Surgery/SurgeryData.cs @@ -0,0 +1,91 @@ +#nullable enable +using Content.Server.Body.Mechanisms; +using Content.Shared.GameObjects.Components.Body; +using Robust.Shared.Interfaces.GameObjects; + +namespace Content.Server.Body.Surgery +{ + /// + /// This data class represents the state of a in regards to everything surgery related - + /// whether there's an incision on it, whether the bone is broken, etc. + /// + public abstract class SurgeryData + { + protected delegate void SurgeryAction(IBodyPartContainer container, ISurgeon surgeon, IEntity performer); + + /// + /// The this surgeryData is attached to. + /// The class should not exist without a + /// that it represents, and will throw errors if it + /// is null. + /// + protected readonly BodyPart Parent; + + protected SurgeryData(BodyPart parent) + { + Parent = parent; + } + + /// + /// The of the parent . + /// + protected BodyPartType ParentType => Parent.PartType; + + /// + /// Returns the description of this current to be shown + /// upon observing the given entity. + /// + public abstract string GetDescription(IEntity target); + + /// + /// Returns whether a can be installed into the + /// this represents. + /// + public abstract bool CanInstallMechanism(Mechanism mechanism); + + /// + /// Returns whether the given can be connected to the + /// this represents. + /// + public abstract bool CanAttachBodyPart(BodyPart part); + + /// + /// Gets the delegate corresponding to the surgery step using the given + /// . + /// + /// + /// The corresponding surgery action or null if no step can be performed. + /// + protected abstract SurgeryAction? GetSurgeryStep(SurgeryType toolType); + + /// + /// Returns whether the given can be used to perform a surgery on the BodyPart this + /// represents. + /// + public bool CheckSurgery(SurgeryType toolType) + { + return GetSurgeryStep(toolType) != null; + } + + /// + /// Attempts to perform surgery of the given . Returns whether the operation was successful. + /// + /// The used for this surgery. + /// The container where the surgery is being done. + /// The entity being used to perform the surgery. + /// The entity performing the surgery. + public bool PerformSurgery(SurgeryType surgeryType, IBodyPartContainer container, ISurgeon surgeon, + IEntity performer) + { + var step = GetSurgeryStep(surgeryType); + + if (step == null) + { + return false; + } + + step(container, surgeon, performer); + return true; + } + } +} diff --git a/Content.Server/Chat/ChatCommands.cs b/Content.Server/Chat/ChatCommands.cs index a6c5404f59..777bba1fe9 100644 --- a/Content.Server/Chat/ChatCommands.cs +++ b/Content.Server/Chat/ChatCommands.cs @@ -1,6 +1,5 @@ -using System; +using System; using System.Linq; -using Content.Server.GameObjects.Components.Damage; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Observer; @@ -15,6 +14,7 @@ using Robust.Shared.Enums; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Localization; +using Content.Shared.Damage; namespace Content.Server.Chat { @@ -107,24 +107,24 @@ namespace Content.Server.Chat "If that fails, it will attempt to use an object in the environment.\n" + "Finally, if neither of the above worked, you will die by biting your tongue."; - private void DealDamage(ISuicideAct suicide, IChatManager chat, DamageableComponent damageableComponent, IEntity source, IEntity target) + private void DealDamage(ISuicideAct suicide, IChatManager chat, IDamageableComponent damageableComponent, IEntity source, IEntity target) { SuicideKind kind = suicide.Suicide(target, chat); if (kind != SuicideKind.Special) { - damageableComponent.TakeDamage(kind switch - { - SuicideKind.Brute => DamageType.Brute, - SuicideKind.Heat => DamageType.Heat, - SuicideKind.Cold => DamageType.Cold, - SuicideKind.Acid => DamageType.Acid, - SuicideKind.Toxic => DamageType.Toxic, - SuicideKind.Electric => DamageType.Electric, - _ => DamageType.Brute - }, - 500, //TODO: needs to be a max damage of some sorts - source, - target); + damageableComponent.ChangeDamage(kind switch + { + SuicideKind.Blunt => DamageType.Blunt, + SuicideKind.Piercing => DamageType.Piercing, + SuicideKind.Heat => DamageType.Heat, + SuicideKind.Disintegration => DamageType.Disintegration, + SuicideKind.Cellular => DamageType.Cellular, + SuicideKind.DNA => DamageType.DNA, + SuicideKind.Asphyxiation => DamageType.Asphyxiation, + _ => DamageType.Blunt + }, + 500, + true, source); } } @@ -135,7 +135,7 @@ namespace Content.Server.Chat var chat = IoCManager.Resolve(); var owner = player.ContentData().Mind.OwnedMob.Owner; - var dmgComponent = owner.GetComponent(); + var dmgComponent = owner.GetComponent(); //TODO: needs to check if the mob is actually alive //TODO: maybe set a suicided flag to prevent ressurection? @@ -169,7 +169,7 @@ namespace Content.Server.Chat } // Default suicide, bite your tongue chat.EntityMe(owner, Loc.GetString("is attempting to bite {0:their} own tongue, looks like {0:theyre} trying to commit suicide!", owner)); //TODO: theyre macro - dmgComponent.TakeDamage(DamageType.Brute, 500, owner, owner); //TODO: dmg value needs to be a max damage of some sorts + dmgComponent.ChangeDamage(DamageType.Piercing, 500, true, owner); // Prevent the player from returning to the body. Yes, this is an ugly hack. var ghost = new Ghost(){CanReturn = false}; diff --git a/Content.Server/EntryPoint.cs b/Content.Server/EntryPoint.cs index e83771204d..120b364352 100644 --- a/Content.Server/EntryPoint.cs +++ b/Content.Server/EntryPoint.cs @@ -1,8 +1,9 @@ -using Content.Server.AI.Utility.Considerations; +using Content.Server.AI.Utility.Considerations; using Content.Server.AI.WorldState; using Content.Server.GameObjects.Components.NodeContainer.NodeGroups; using Content.Server.Interfaces; using Content.Server.Interfaces.Chat; +using Content.Server.Body.Network; using Content.Server.Interfaces.GameTicking; using Content.Server.Interfaces.PDA; using Content.Server.Sandbox; @@ -46,6 +47,8 @@ namespace Content.Server IoCManager.BuildGraph(); + IoCManager.Resolve().DoAutoRegistrations(); + _gameTicker = IoCManager.Resolve(); IoCManager.Resolve().Initialize(); diff --git a/Content.Server/Explosions/ExplosionHelper.cs b/Content.Server/Explosions/ExplosionHelper.cs index 277713bf28..1b61f037f3 100644 --- a/Content.Server/Explosions/ExplosionHelper.cs +++ b/Content.Server/Explosions/ExplosionHelper.cs @@ -1,7 +1,7 @@ using System; using System.Linq; using Content.Server.GameObjects.Components.Mobs; -using Content.Server.GameObjects.EntitySystems; +using Content.Shared.GameObjects.EntitySystems; using Content.Shared.Maps; using Robust.Server.GameObjects.EntitySystems; using Robust.Server.Interfaces.GameObjects; diff --git a/Content.Server/GameObjects/Components/Atmos/BarotraumaComponent.cs b/Content.Server/GameObjects/Components/Atmos/BarotraumaComponent.cs index 4beaa374b1..cabaf72d5a 100644 --- a/Content.Server/GameObjects/Components/Atmos/BarotraumaComponent.cs +++ b/Content.Server/GameObjects/Components/Atmos/BarotraumaComponent.cs @@ -1,11 +1,11 @@ using System; using System.Runtime.CompilerServices; -using Content.Server.GameObjects.Components.Damage; using Content.Server.GameObjects.Components.Mobs; using Content.Server.GameObjects.EntitySystems; using Content.Server.Interfaces.GameObjects; using Content.Shared.Atmos; using Content.Shared.GameObjects.Components.Damage; +using Content.Shared.Damage; using Content.Shared.GameObjects.Components.Mobs; using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Systems; @@ -23,7 +23,7 @@ namespace Content.Server.GameObjects.Components.Atmos [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Update(float frameTime) { - if (!Owner.TryGetComponent(out DamageableComponent damageable)) return; + if (!Owner.TryGetComponent(out IDamageableComponent damageable)) return; Owner.TryGetComponent(out ServerStatusEffectsComponent status); var coordinates = Owner.Transform.GridPosition; @@ -52,7 +52,7 @@ namespace Content.Server.GameObjects.Components.Atmos if(pressure > Atmospherics.WarningLowPressure) goto default; - damageable.TakeDamage(DamageType.Brute, Atmospherics.LowPressureDamage, Owner); + damageable.ChangeDamage(DamageType.Blunt, Atmospherics.LowPressureDamage, false, Owner); if (status == null) break; @@ -74,7 +74,7 @@ namespace Content.Server.GameObjects.Components.Atmos var damage = (int) MathF.Min((pressure / Atmospherics.HazardHighPressure) * Atmospherics.PressureDamageCoefficient, Atmospherics.MaxHighPressureDamage); - damageable.TakeDamage(DamageType.Brute, damage, Owner); + damageable.ChangeDamage(DamageType.Blunt, damage, false, Owner); if (status == null) break; diff --git a/Content.Server/GameObjects/Components/Atmos/GasMixtureComponent.cs b/Content.Server/GameObjects/Components/Atmos/GasMixtureComponent.cs index 68e59e0869..c60ad08efa 100644 --- a/Content.Server/GameObjects/Components/Atmos/GasMixtureComponent.cs +++ b/Content.Server/GameObjects/Components/Atmos/GasMixtureComponent.cs @@ -1,6 +1,7 @@ using Content.Server.Atmos; using Robust.Shared.GameObjects; using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; namespace Content.Server.GameObjects.Components.Atmos { @@ -8,7 +9,8 @@ namespace Content.Server.GameObjects.Components.Atmos public class GasMixtureComponent : Component { public override string Name => "GasMixture"; - public GasMixture GasMixture { get; set; } = new GasMixture(); + + [ViewVariables] public GasMixture GasMixture { get; set; } = new GasMixture(); public override void ExposeData(ObjectSerializer serializer) { diff --git a/Content.Server/GameObjects/Components/Body/BodyManagerComponent.cs b/Content.Server/GameObjects/Components/Body/BodyManagerComponent.cs new file mode 100644 index 0000000000..ac2f427299 --- /dev/null +++ b/Content.Server/GameObjects/Components/Body/BodyManagerComponent.cs @@ -0,0 +1,1015 @@ +#nullable enable +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using Content.Server.Body; +using Content.Server.Body.Network; +using Content.Server.GameObjects.Components.Metabolism; +using Content.Server.GameObjects.EntitySystems; +using Content.Server.Interfaces.GameObjects.Components.Interaction; +using Content.Server.Mobs; +using Content.Server.Observer; +using Content.Shared.Body.Part; +using Content.Shared.Body.Part.Properties.Movement; +using Content.Shared.Body.Part.Properties.Other; +using Content.Shared.Body.Preset; +using Content.Shared.Body.Template; +using Content.Shared.GameObjects.Components.Body; +using Content.Shared.GameObjects.Components.Damage; +using Content.Shared.GameObjects.Components.Movement; +using Robust.Server.GameObjects; +using Robust.Server.Interfaces.Player; +using Robust.Shared.GameObjects; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.Reflection; +using Robust.Shared.IoC; +using Robust.Shared.Log; +using Robust.Shared.Maths; +using Robust.Shared.Players; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.Utility; +using Robust.Shared.ViewVariables; + +namespace Content.Server.GameObjects.Components.Body +{ + /// + /// Component representing a collection of + /// attached to each other. + /// + [RegisterComponent] + [ComponentReference(typeof(IDamageableComponent))] + [ComponentReference(typeof(IBodyManagerComponent))] + public class BodyManagerComponent : SharedBodyManagerComponent, IBodyPartContainer, IRelayMoveInput + { +#pragma warning disable CS0649 + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly IBodyNetworkFactory _bodyNetworkFactory = default!; + [Dependency] private readonly IReflectionManager _reflectionManager = default!; +#pragma warning restore + + [ViewVariables] private string _presetName = default!; + + private readonly Dictionary _parts = new Dictionary(); + + [ViewVariables] private readonly Dictionary _networks = new Dictionary(); + + /// + /// All with + /// that are currently affecting move speed, mapped to how big that leg + /// they're on is. + /// + [ViewVariables] + private readonly Dictionary _activeLegs = new Dictionary(); + + /// + /// The that this + /// is adhering to. + /// + [ViewVariables] + public BodyTemplate Template { get; private set; } = default!; + + /// + /// The that this + /// is adhering to. + /// + [ViewVariables] + public BodyPreset Preset { get; private set; } = default!; + + /// + /// Maps slot name to the + /// object filling it (if there is one). + /// + [ViewVariables] + public IReadOnlyDictionary Parts => _parts; + + /// + /// List of all slots in this body, taken from the keys of + /// slots. + /// + public IEnumerable AllSlots => Template.Slots.Keys; + + /// + /// List of all occupied slots in this body, taken from the values of + /// . + /// + public IEnumerable OccupiedSlots => Parts.Keys; + + public override void ExposeData(ObjectSerializer serializer) + { + base.ExposeData(serializer); + + serializer.DataReadWriteFunction( + "baseTemplate", + "bodyTemplate.Humanoid", + template => + { + if (!_prototypeManager.TryIndex(template, out BodyTemplatePrototype templateData)) + { + // Invalid prototype + throw new InvalidOperationException( + $"No {nameof(BodyTemplatePrototype)} found with name {template}"); + } + + Template = new BodyTemplate(templateData); + }, + () => Template.Name); + + serializer.DataReadWriteFunction( + "basePreset", + "bodyPreset.BasicHuman", + preset => + { + if (!_prototypeManager.TryIndex(preset, out BodyPresetPrototype presetData)) + { + // Invalid prototype + throw new InvalidOperationException( + $"No {nameof(BodyPresetPrototype)} found with name {preset}"); + } + + Preset = new BodyPreset(presetData); + }, + () => _presetName); + } + + public override void Initialize() + { + base.Initialize(); + + LoadBodyPreset(Preset); + + foreach (var behavior in Owner.GetAllComponents()) + { + HealthChangedEvent += behavior.OnHealthChanged; + } + } + + protected override void Startup() + { + base.Startup(); + + // Just in case something activates at default health. + ForceHealthChangedEvent(); + } + + private void LoadBodyPreset(BodyPreset preset) + { + _presetName = preset.Name; + + foreach (var slotName in Template.Slots.Keys) + { + // For each slot in our BodyManagerComponent's template, + // try and grab what the ID of what the preset says should be inside it. + if (!preset.PartIDs.TryGetValue(slotName, out var partId)) + { + // If the preset doesn't define anything for it, continue. + continue; + } + + // Get the BodyPartPrototype corresponding to the BodyPart ID we grabbed. + if (!_prototypeManager.TryIndex(partId, out BodyPartPrototype newPartData)) + { + throw new InvalidOperationException($"No {nameof(BodyPartPrototype)} prototype found with ID {partId}"); + } + + // Try and remove an existing limb if that exists. + RemoveBodyPart(slotName, false); + + // Add a new BodyPart with the BodyPartPrototype as a baseline to our + // BodyComponent. + var addedPart = new BodyPart(newPartData); + AddBodyPart(addedPart, slotName); + } + + OnBodyChanged(); // TODO: Duplicate code + } + + /// + /// Changes the current to the given + /// . + /// Attempts to keep previous if there is a slot for + /// them in both . + /// + public void ChangeBodyTemplate(BodyTemplatePrototype newTemplate) + { + foreach (var part in Parts) + { + // TODO: Make this work. + } + + OnBodyChanged(); + } + + /// + /// This method is called by before + /// is called. + /// + public void PreMetabolism(float frameTime) + { + if (CurrentDamageState == DamageState.Dead) + { + return; + } + + foreach (var part in Parts.Values) + { + part.PreMetabolism(frameTime); + } + + foreach (var network in _networks.Values) + { + network.Update(frameTime); + } + } + + /// + /// This method is called by after + /// is called. + /// + public void PostMetabolism(float frameTime) + { + if (CurrentDamageState == DamageState.Dead) + { + return; + } + + foreach (var part in Parts.Values) + { + part.PostMetabolism(frameTime); + } + + foreach (var network in _networks.Values) + { + network.Update(frameTime); + } + } + + /// + /// Called when the layout of this body changes. + /// + private void OnBodyChanged() + { + // Calculate move speed based on this body. + if (Owner.HasComponent()) + { + _activeLegs.Clear(); + var legParts = Parts.Values.Where(x => x.HasProperty(typeof(LegProperty))); + + foreach (var part in legParts) + { + var footDistance = DistanceToNearestFoot(this, part); + + if (Math.Abs(footDistance - float.MinValue) > 0.001f) + { + _activeLegs.Add(part, footDistance); + } + } + + CalculateSpeed(); + } + } + + private void CalculateSpeed() + { + if (!Owner.TryGetComponent(out MovementSpeedModifierComponent playerMover)) + { + return; + } + + float speedSum = 0; + foreach (var part in _activeLegs.Keys) + { + if (!part.HasProperty()) + { + _activeLegs.Remove(part); + } + } + + foreach (var (key, value) in _activeLegs) + { + if (key.TryGetProperty(out LegProperty legProperty)) + { + // Speed of a leg = base speed * (1+log1024(leg length)) + speedSum += legProperty.Speed * (1 + (float) Math.Log(value, 1024.0)); + } + } + + if (speedSum <= 0.001f || _activeLegs.Count <= 0) + { + // Case: no way of moving. Fall down. + StandingStateHelper.Down(Owner); + playerMover.BaseWalkSpeed = 0.8f; + playerMover.BaseSprintSpeed = 2.0f; + } + else + { + // Case: have at least one leg. Set move speed. + StandingStateHelper.Standing(Owner); + + // Extra legs stack diminishingly. + // Final speed = speed sum/(leg count-log4(leg count)) + playerMover.BaseWalkSpeed = + speedSum / (_activeLegs.Count - (float) Math.Log(_activeLegs.Count, 4.0)); + + playerMover.BaseSprintSpeed = playerMover.BaseWalkSpeed * 1.75f; + } + } + + void IRelayMoveInput.MoveInputPressed(ICommonSession session) + { + if (CurrentDamageState == DamageState.Dead) + { + new Ghost().Execute(null, (IPlayerSession) session, null); + } + } + + #region BodyPart Functions + + /// + /// Recursively searches for if is connected to + /// the center. Not efficient (O(n^2)), but most bodies don't have a ton + /// of s. + /// + /// The body part to find the center for. + /// True if it is connected to the center, false otherwise. + private bool ConnectedToCenterPart(BodyPart target) + { + var searchedSlots = new List(); + + return TryGetSlotName(target, out var result) && + ConnectedToCenterPartRecursion(searchedSlots, result); + } + + private bool ConnectedToCenterPartRecursion(ICollection searchedSlots, string slotName) + { + TryGetBodyPart(slotName, out var part); + + if (part == null) + { + return false; + } + + if (part == GetCenterBodyPart()) + { + return true; + } + + searchedSlots.Add(slotName); + + if (!TryGetBodyPartConnections(slotName, out List connections)) + { + return false; + } + + foreach (var connection in connections) + { + if (!searchedSlots.Contains(connection) && + ConnectedToCenterPartRecursion(searchedSlots, connection)) + { + return true; + } + } + + return false; + } + + /// + /// Finds the central , if any, of this body based on + /// the . For humans, this is the torso. + /// + /// The if one exists, null otherwise. + private BodyPart? GetCenterBodyPart() + { + Parts.TryGetValue(Template.CenterSlot, out var center); + return center!; + } + + /// + /// Returns whether the given slot name exists within the current + /// . + /// + private bool SlotExists(string slotName) + { + return Template.SlotExists(slotName); + } + + /// + /// Finds the in the given if + /// one exists. + /// + /// The slot to search in. + /// The body part in that slot, if any. + /// True if found, false otherwise. + private bool TryGetBodyPart(string slotName, [NotNullWhen(true)] out BodyPart result) + { + return Parts.TryGetValue(slotName, out result!); + } + + /// + /// Finds the slotName that the given resides in. + /// + /// The to find the slot for. + /// The slot found, if any. + /// True if a slot was found, false otherwise + private bool TryGetSlotName(BodyPart part, [NotNullWhen(true)] out string result) + { + // We enforce that there is only one of each value in the dictionary, + // so we can iterate through the dictionary values to get the key from there. + result = Parts.FirstOrDefault(x => x.Value == part).Key; + return result != null; + } + + /// + /// Finds the in the given + /// if one exists. + /// + /// The slot to search in. + /// + /// The of that slot, if any. + /// + /// True if found, false otherwise. + public bool TryGetSlotType(string slotName, out BodyPartType result) + { + return Template.Slots.TryGetValue(slotName, out result); + } + + /// + /// Finds the names of all slots connected to the given + /// for the template. + /// + /// The slot to search in. + /// The connections found, if any. + /// True if the connections are found, false otherwise. + private bool TryGetBodyPartConnections(string slotName, [NotNullWhen(true)] out List connections) + { + return Template.Connections.TryGetValue(slotName, out connections!); + } + + /// + /// Grabs all occupied slots connected to the given slot, + /// regardless of whether the given is occupied. + /// + /// The slot name to find connections from. + /// The connected body parts, if any. + /// + /// True if successful, false if there was an error or no connected + /// s were found. + /// + public bool TryGetBodyPartConnections(string slotName, [NotNullWhen(true)] out List result) + { + result = null!; + + if (!Template.Connections.TryGetValue(slotName, out var connections)) + { + return false; + } + + var toReturn = new List(); + foreach (var connection in connections) + { + if (TryGetBodyPart(connection, out var bodyPartResult)) + { + toReturn.Add(bodyPartResult); + } + } + + if (toReturn.Count <= 0) + { + return false; + } + + result = toReturn; + return true; + } + + /// + /// Grabs all parts connected to the given , regardless + /// of whether the given is occupied. + /// + /// + /// True if successful, false if there was an error or no connected + /// s were found. + /// + private bool TryGetBodyPartConnections(BodyPart part, [NotNullWhen(true)] out List result) + { + result = null!; + + return TryGetSlotName(part, out var slotName) && + TryGetBodyPartConnections(slotName, out result); + } + + /// + /// Grabs all of the given type in this body. + /// + public List GetBodyPartsOfType(BodyPartType type) + { + var toReturn = new List(); + + foreach (var part in Parts.Values) + { + if (part.PartType == type) + { + toReturn.Add(part); + } + } + + return toReturn; + } + + /// + /// Installs the given into the given slot. + /// + /// True if successful, false otherwise. + public bool InstallBodyPart(BodyPart part, string slotName) + { + DebugTools.AssertNotNull(part); + + // Make sure the given slot exists + if (!SlotExists(slotName)) + { + return false; + } + + // And that nothing is in it + if (TryGetBodyPart(slotName, out _)) + { + return false; + } + + AddBodyPart(part, slotName); // TODO: Sort this duplicate out + OnBodyChanged(); + + return true; + } + + /// + /// Installs the given into the + /// given slot, deleting the afterwards. + /// + /// True if successful, false otherwise. + public bool InstallDroppedBodyPart(DroppedBodyPartComponent part, string slotName) + { + DebugTools.AssertNotNull(part); + + if (!InstallBodyPart(part.ContainedBodyPart, slotName)) + { + return false; + } + + part.Owner.Delete(); + return true; + } + + /// + /// Disconnects the given reference, potentially + /// dropping other BodyParts if they were hanging + /// off of it. + /// + /// + /// The representing the dropped + /// , or null if none was dropped. + /// + public IEntity? DropPart(BodyPart part) + { + DebugTools.AssertNotNull(part); + + if (!_parts.ContainsValue(part)) + { + return null; + } + + if (!RemoveBodyPart(part, out var slotName)) + { + return null; + } + + // Call disconnect on all limbs that were hanging off this limb. + if (TryGetBodyPartConnections(slotName, out List connections)) + { + // This loop is an unoptimized travesty. TODO: optimize to be less shit + foreach (var connectionName in connections) + { + if (TryGetBodyPart(connectionName, out var result) && !ConnectedToCenterPart(result)) + { + DisconnectBodyPart(connectionName, true); + } + } + } + + part.SpawnDropped(out var dropped); + + OnBodyChanged(); + return dropped; + } + + /// + /// Disconnects the given reference, potentially + /// dropping other BodyParts if they were hanging + /// off of it. + /// + public void DisconnectBodyPart(BodyPart part, bool dropEntity) + { + DebugTools.AssertNotNull(part); + + if (!_parts.ContainsValue(part)) + { + return; + } + + var slotName = Parts.FirstOrDefault(x => x.Value == part).Key; + RemoveBodyPart(slotName, dropEntity); + + // Call disconnect on all limbs that were hanging off this limb + if (TryGetBodyPartConnections(slotName, out List connections)) + { + // TODO: Optimize + foreach (var connectionName in connections) + { + if (TryGetBodyPart(connectionName, out var result) && !ConnectedToCenterPart(result)) + { + DisconnectBodyPart(connectionName, dropEntity); + } + } + } + + OnBodyChanged(); + } + + /// + /// Disconnects a body part in the given slot if one exists, + /// optionally dropping it. + /// + /// The slot to remove the body part from + /// + /// Whether or not to drop the body part as an entity if it exists. + /// + private void DisconnectBodyPart(string slotName, bool dropEntity) + { + DebugTools.AssertNotNull(slotName); + + if (!TryGetBodyPart(slotName, out var part)) + { + return; + } + + if (part == null) + { + return; + } + + RemoveBodyPart(slotName, dropEntity); + + if (TryGetBodyPartConnections(slotName, out List connections)) + { + foreach (var connectionName in connections) + { + if (TryGetBodyPart(connectionName, out var result) && !ConnectedToCenterPart(result)) + { + DisconnectBodyPart(connectionName, dropEntity); + } + } + } + + OnBodyChanged(); + } + + private void AddBodyPart(BodyPart part, string slotName) + { + DebugTools.AssertNotNull(part); + DebugTools.AssertNotNull(slotName); + + _parts.Add(slotName, part); + + part.Body = this; + + var argsAdded = new BodyPartAddedEventArgs(part, slotName); + + foreach (var component in Owner.GetAllComponents().ToArray()) + { + component.BodyPartAdded(argsAdded); + } + + if (!Template.Layers.TryGetValue(slotName, out var partMap) || + !_reflectionManager.TryParseEnumReference(partMap, out var partEnum)) + { + Logger.Warning($"Template {Template.Name} has an invalid RSI map key {partMap} for body part {part.Name}."); + return; + } + + part.RSIMap = partEnum; + + var partMessage = new BodyPartAddedMessage(part.RSIPath, part.RSIState, partEnum); + + SendNetworkMessage(partMessage); + + foreach (var mechanism in part.Mechanisms) + { + if (!Template.MechanismLayers.TryGetValue(mechanism.Id, out var mechanismMap)) + { + continue; + } + + if (!_reflectionManager.TryParseEnumReference(mechanismMap, out var mechanismEnum)) + { + Logger.Warning($"Template {Template.Name} has an invalid RSI map key {mechanismMap} for mechanism {mechanism.Id}."); + continue; + } + + var mechanismMessage = new MechanismSpriteAddedMessage(mechanismEnum); + + SendNetworkMessage(mechanismMessage); + } + } + + /// + /// Removes the body part in slot from this body, + /// if one exists. + /// + /// The slot to remove it from. + /// + /// Whether or not to drop the removed . + /// + /// + private bool RemoveBodyPart(string slotName, bool drop) + { + DebugTools.AssertNotNull(slotName); + + if (!_parts.Remove(slotName, out var part)) + { + return false; + } + + IEntity? dropped = null; + if (drop) + { + part.SpawnDropped(out dropped); + } + + part.Body = null; + + var args = new BodyPartRemovedEventArgs(part, slotName); + + foreach (var component in Owner.GetAllComponents()) + { + component.BodyPartRemoved(args); + } + + if (part.RSIMap != null) + { + var message = new BodyPartRemovedMessage(part.RSIMap, dropped?.Uid); + SendNetworkMessage(message); + } + + foreach (var mechanism in part.Mechanisms) + { + if (!Template.MechanismLayers.TryGetValue(mechanism.Id, out var mechanismMap)) + { + continue; + } + + if (!_reflectionManager.TryParseEnumReference(mechanismMap, out var mechanismEnum)) + { + Logger.Warning($"Template {Template.Name} has an invalid RSI map key {mechanismMap} for mechanism {mechanism.Id}."); + continue; + } + + var mechanismMessage = new MechanismSpriteRemovedMessage(mechanismEnum); + + SendNetworkMessage(mechanismMessage); + } + + return true; + } + + /// + /// Removes the body part from this body, if one exists. + /// + /// The part to remove from this body. + /// The slot that the part was in, if any. + /// True if was removed, false otherwise. + private bool RemoveBodyPart(BodyPart part, [NotNullWhen(true)] out string slotName) + { + DebugTools.AssertNotNull(part); + + slotName = _parts.FirstOrDefault(pair => pair.Value == part).Key; + + if (slotName == null) + { + return false; + } + + return RemoveBodyPart(slotName, false); + } + + #endregion + + #region BodyNetwork Functions + + private bool EnsureNetwork(BodyNetwork network) + { + DebugTools.AssertNotNull(network); + + if (_networks.ContainsKey(network.GetType())) + { + return false; + } + + _networks.Add(network.GetType(), network); + network.OnAdd(Owner); + + return true; + } + + /// + /// Attempts to add a of the given type to this body. + /// + /// + /// True if successful, false if there was an error + /// (such as passing in an invalid type or a network of that type already + /// existing). + /// + public bool EnsureNetwork(Type networkType) + { + DebugTools.Assert(networkType.IsSubclassOf(typeof(BodyNetwork))); + + var network = _bodyNetworkFactory.GetNetwork(networkType); + return EnsureNetwork(network); + } + + /// + /// Attempts to add a of the given type to + /// this body. + /// + /// The type of network to add. + /// + /// True if successful, false if there was an error + /// (such as passing in an invalid type or a network of that type already + /// existing). + /// + public bool EnsureNetwork() where T : BodyNetwork + { + return EnsureNetwork(typeof(T)); + } + + /// + /// Attempts to add a of the given name to + /// this body. + /// + /// + /// True if successful, false if there was an error + /// (such as passing in an invalid type or a network of that type already + /// existing). + /// + private bool EnsureNetwork(string networkName) + { + DebugTools.AssertNotNull(networkName); + + var network = _bodyNetworkFactory.GetNetwork(networkName); + return EnsureNetwork(network); + } + + /// + /// Removes the of the given type in this body, + /// if there is one. + /// + /// The type of the network to remove. + public void RemoveNetwork(Type type) + { + DebugTools.AssertNotNull(type); + + if (_networks.Remove(type, out var network)) + { + network.OnRemove(); + } + } + + /// + /// Removes the of the given type in this body, + /// if one exists. + /// + /// The type of the network to remove. + public void RemoveNetwork() where T : BodyNetwork + { + RemoveNetwork(typeof(T)); + } + + /// + /// Removes the with the given name in this body, + /// if there is one. + /// + private void RemoveNetwork(string networkName) + { + var type = _bodyNetworkFactory.GetNetwork(networkName).GetType(); + + if (_networks.Remove(type, out var network)) + { + network.OnRemove(); + } + } + + /// + /// Attempts to get the of the given type in this body. + /// + /// The type to search for. + /// + /// The if found, null otherwise. + /// + /// True if found, false otherwise. + public bool TryGetNetwork(Type networkType, [NotNullWhen(true)] out BodyNetwork result) + { + return _networks.TryGetValue(networkType, out result!); + } + + #endregion + + #region Recursion Functions + + /// + /// Returns the combined length of the distance to the nearest with a + /// . Returns + /// if there is no foot found. If you consider a a node map, then it will look for + /// a foot node from the given node. It can + /// only search through BodyParts with . + /// + private static float DistanceToNearestFoot(BodyManagerComponent body, BodyPart source) + { + if (source.HasProperty() && source.TryGetProperty(out var property)) + { + return property.ReachDistance; + } + + return LookForFootRecursion(body, source, new List()); + } + + private static float LookForFootRecursion(BodyManagerComponent body, BodyPart current, + ICollection searchedParts) + { + if (!current.TryGetProperty(out var extProperty)) + { + return float.MinValue; + } + + // Get all connected parts if the current part has an extension property + if (!body.TryGetBodyPartConnections(current, out var connections)) + { + return float.MinValue; + } + + // If a connected BodyPart is a foot, return this BodyPart's length. + foreach (var connection in connections) + { + if (!searchedParts.Contains(connection) && connection.HasProperty()) + { + return extProperty.ReachDistance; + } + } + + // Otherwise, get the recursion values of all connected BodyParts and + // store them in a list. + var distances = new List(); + foreach (var connection in connections) + { + if (!searchedParts.Contains(connection)) + { + continue; + } + + var result = LookForFootRecursion(body, connection, searchedParts); + + if (Math.Abs(result - float.MinValue) > 0.001f) + { + distances.Add(result); + } + } + + // If one or more of the searches found a foot, return the smallest one + // and add this ones length. + if (distances.Count > 0) + { + return distances.Min() + extProperty.ReachDistance; + } + + return float.MinValue; + + // No extension property, no go. + } + + #endregion + } + + public interface IBodyManagerHealthChangeParams + { + BodyPartType Part { get; } + } + + public class BodyManagerHealthChangeParams : HealthChangeParams, IBodyManagerHealthChangeParams + { + public BodyManagerHealthChangeParams(BodyPartType part) + { + Part = part; + } + + public BodyPartType Part { get; } + } +} diff --git a/Content.Server/GameObjects/Components/Body/BodyScannerComponent.cs b/Content.Server/GameObjects/Components/Body/BodyScannerComponent.cs new file mode 100644 index 0000000000..2c49665757 --- /dev/null +++ b/Content.Server/GameObjects/Components/Body/BodyScannerComponent.cs @@ -0,0 +1,73 @@ +using System.Collections.Generic; +using Content.Server.Body; +using Content.Shared.Body.Scanner; +using Content.Shared.Interfaces.GameObjects.Components; +using Robust.Server.GameObjects.Components.UserInterface; +using Robust.Server.Interfaces.GameObjects; +using Robust.Shared.GameObjects; + +namespace Content.Server.GameObjects.Components.Body +{ + [RegisterComponent] + [ComponentReference(typeof(IActivate))] + public class BodyScannerComponent : Component, IActivate + { + private BoundUserInterface _userInterface; + public sealed override string Name => "BodyScanner"; + + void IActivate.Activate(ActivateEventArgs eventArgs) + { + if (!eventArgs.User.TryGetComponent(out IActorComponent actor) || + actor.playerSession.AttachedEntity == null) + { + return; + } + + if (actor.playerSession.AttachedEntity.TryGetComponent(out BodyManagerComponent attempt)) + { + var state = InterfaceState(attempt.Template, attempt.Parts); + _userInterface.SetState(state); + } + + _userInterface.Open(actor.playerSession); + } + + public override void Initialize() + { + base.Initialize(); + _userInterface = Owner.GetComponent() + .GetBoundUserInterface(BodyScannerUiKey.Key); + _userInterface.OnReceiveMessage += UserInterfaceOnOnReceiveMessage; + } + + private void UserInterfaceOnOnReceiveMessage(ServerBoundUserInterfaceMessage serverMsg) { } + + /// + /// Copy BodyTemplate and BodyPart data into a common data class that the client can read. + /// + private BodyScannerInterfaceState InterfaceState(BodyTemplate template, IReadOnlyDictionary bodyParts) + { + var partsData = new Dictionary(); + + foreach (var (slotName, part) in bodyParts) + { + var mechanismData = new List(); + + foreach (var mechanism in part.Mechanisms) + { + mechanismData.Add(new BodyScannerMechanismData(mechanism.Name, mechanism.Description, + mechanism.RSIPath, + mechanism.RSIState, mechanism.MaxDurability, mechanism.CurrentDurability)); + } + + partsData.Add(slotName, + new BodyScannerBodyPartData(part.Name, part.RSIPath, part.RSIState, part.MaxDurability, + part.CurrentDurability, mechanismData)); + } + + var templateData = new BodyScannerTemplateData(template.Name, template.Slots); + + return new BodyScannerInterfaceState(partsData, templateData); + } + } +} diff --git a/Content.Server/GameObjects/Components/Body/Circulatory/BloodstreamComponent.cs b/Content.Server/GameObjects/Components/Body/Circulatory/BloodstreamComponent.cs new file mode 100644 index 0000000000..9bf5f7e906 --- /dev/null +++ b/Content.Server/GameObjects/Components/Body/Circulatory/BloodstreamComponent.cs @@ -0,0 +1,83 @@ +using Content.Server.Atmos; +using Content.Server.GameObjects.Components.Chemistry; +using Content.Server.GameObjects.Components.Metabolism; +using Content.Server.Interfaces; +using Content.Shared.Chemistry; +using Robust.Shared.GameObjects; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; + +namespace Content.Server.GameObjects.Components.Body.Circulatory +{ + [RegisterComponent] + public class BloodstreamComponent : Component, IGasMixtureHolder + { + public override string Name => "Bloodstream"; + + /// + /// Max volume of internal solution storage + /// + [ViewVariables] private ReagentUnit _initialMaxVolume; + + /// + /// Internal solution for reagent storage + /// + [ViewVariables] private SolutionComponent _internalSolution; + + /// + /// Empty volume of internal solution + /// + [ViewVariables] public ReagentUnit EmptyVolume => _internalSolution.EmptyVolume; + + [ViewVariables] public GasMixture Air { get; set; } = new GasMixture(6); + + [ViewVariables] public SolutionComponent Solution => _internalSolution; + + public override void Initialize() + { + base.Initialize(); + + _internalSolution = Owner.EnsureComponent(); + _internalSolution.MaxVolume = _initialMaxVolume; + } + + public override void ExposeData(ObjectSerializer serializer) + { + base.ExposeData(serializer); + + serializer.DataField(ref _initialMaxVolume, "maxVolume", ReagentUnit.New(250)); + } + + /// + /// Attempt to transfer provided solution to internal solution. + /// Only supports complete transfers + /// + /// Solution to be transferred + /// Whether or not transfer was a success + public bool TryTransferSolution(Solution solution) + { + // For now doesn't support partial transfers + if (solution.TotalVolume + _internalSolution.CurrentVolume > _internalSolution.MaxVolume) + { + return false; + } + + _internalSolution.TryAddSolution(solution, false, true); + return true; + } + + public void PumpToxins(GasMixture into, float pressure) + { + if (!Owner.TryGetComponent(out MetabolismComponent metabolism)) + { + Air.PumpGasTo(into, pressure); + return; + } + + var toxins = metabolism.Clean(this); + + toxins.PumpGasTo(into, pressure); + Air.Merge(toxins); + } + } +} diff --git a/Content.Server/GameObjects/Components/Nutrition/StomachComponent.cs b/Content.Server/GameObjects/Components/Body/Digestive/StomachComponent.cs similarity index 65% rename from Content.Server/GameObjects/Components/Nutrition/StomachComponent.cs rename to Content.Server/GameObjects/Components/Body/Digestive/StomachComponent.cs index db6e16831e..fa6b76caea 100644 --- a/Content.Server/GameObjects/Components/Nutrition/StomachComponent.cs +++ b/Content.Server/GameObjects/Components/Body/Digestive/StomachComponent.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Linq; +using Content.Server.GameObjects.Components.Body.Circulatory; using Content.Server.GameObjects.Components.Chemistry; -using Content.Server.GameObjects.Components.Metabolism; using Content.Shared.Chemistry; using Content.Shared.GameObjects.Components.Nutrition; using Robust.Shared.GameObjects; @@ -11,7 +11,7 @@ using Robust.Shared.Log; using Robust.Shared.Serialization; using Robust.Shared.ViewVariables; -namespace Content.Server.GameObjects.Components.Nutrition +namespace Content.Server.GameObjects.Components.Body.Digestive { /// /// Where reagents go when ingested. Tracks ingested reagents over time, and @@ -25,7 +25,7 @@ namespace Content.Server.GameObjects.Components.Nutrition #pragma warning restore 649 /// - /// Max volume of internal solution storage + /// Max volume of internal solution storage /// public ReagentUnit MaxVolume { @@ -34,33 +34,29 @@ namespace Content.Server.GameObjects.Components.Nutrition } /// - /// Internal solution storage + /// Internal solution storage /// [ViewVariables] private SolutionComponent _stomachContents; /// - /// Initial internal solution storage volume + /// Initial internal solution storage volume /// [ViewVariables] private ReagentUnit _initialMaxVolume; /// - /// Time in seconds between reagents being ingested and them being transferred to + /// Time in seconds between reagents being ingested and them being transferred + /// to /// [ViewVariables] private float _digestionDelay; /// - /// Used to track how long each reagent has been in the stomach + /// Used to track how long each reagent has been in the stomach /// private readonly List _reagentDeltas = new List(); - /// - /// Reference to bloodstream where digested reagents are transferred to - /// - private BloodstreamComponent _bloodstream; - public override void ExposeData(ObjectSerializer serializer) { base.ExposeData(serializer); @@ -70,14 +66,10 @@ namespace Content.Server.GameObjects.Components.Nutrition protected override void Startup() { + base.Startup(); + _stomachContents = Owner.GetComponent(); _stomachContents.MaxVolume = _initialMaxVolume; - if (!Owner.TryGetComponent(out _bloodstream)) - { - Logger.Warning(_localizationManager.GetString( - "StomachComponent entity does not have a BloodstreamComponent, which is required for it to function. Owner entity name: {0}", - Owner.Name)); - } } public bool TryTransferSolution(Solution solution) @@ -88,9 +80,9 @@ namespace Content.Server.GameObjects.Components.Nutrition return false; } - //Add solution to _stomachContents + // Add solution to _stomachContents _stomachContents.TryAddSolution(solution, false, true); - //Add each reagent to _reagentDeltas. Used to track how long each reagent has been in the stomach + // Add each reagent to _reagentDeltas. Used to track how long each reagent has been in the stomach foreach (var reagent in solution.Contents) { _reagentDeltas.Add(new ReagentDelta(reagent.ReagentId, reagent.Quantity)); @@ -100,23 +92,26 @@ namespace Content.Server.GameObjects.Components.Nutrition } /// - /// Updates digestion status of ingested reagents. Once reagents surpass _digestionDelay - /// they are moved to the bloodstream, where they are then metabolized. + /// Updates digestion status of ingested reagents. + /// Once reagents surpass _digestionDelay they are moved to the bloodstream, + /// where they are then metabolized. /// - /// The time since the last update in seconds. - public void OnUpdate(float tickTime) + /// The time since the last update in seconds. + public void Update(float frameTime) { - if (_bloodstream == null) + if (!Owner.TryGetComponent(out BloodstreamComponent bloodstream)) { return; } - //Add reagents ready for transfer to bloodstream to transferSolution + // Add reagents ready for transfer to bloodstream to transferSolution var transferSolution = new Solution(); - foreach (var delta in _reagentDeltas.ToList()) //Use ToList here to remove entries while iterating + + // Use ToList here to remove entries while iterating + foreach (var delta in _reagentDeltas.ToList()) { //Increment lifetime of reagents - delta.Increment(tickTime); + delta.Increment(frameTime); if (delta.Lifetime > _digestionDelay) { _stomachContents.TryRemoveReagent(delta.ReagentId, delta.Quantity); @@ -124,12 +119,13 @@ namespace Content.Server.GameObjects.Components.Nutrition _reagentDeltas.Remove(delta); } } - //Transfer digested reagents to bloodstream - _bloodstream.TryTransferSolution(transferSolution); + + // Transfer digested reagents to bloodstream + bloodstream.TryTransferSolution(transferSolution); } /// - /// Used to track quantity changes when ingesting & digesting reagents + /// Used to track quantity changes when ingesting & digesting reagents /// private class ReagentDelta { diff --git a/Content.Server/Health/BodySystem/BodyPart/DroppedBodyPartComponent.cs b/Content.Server/GameObjects/Components/Body/DroppedBodyPartComponent.cs similarity index 52% rename from Content.Server/Health/BodySystem/BodyPart/DroppedBodyPartComponent.cs rename to Content.Server/GameObjects/Components/Body/DroppedBodyPartComponent.cs index a49ba2c656..431f60e026 100644 --- a/Content.Server/Health/BodySystem/BodyPart/DroppedBodyPartComponent.cs +++ b/Content.Server/GameObjects/Components/Body/DroppedBodyPartComponent.cs @@ -1,10 +1,9 @@ using System.Collections.Generic; -using System.Globalization; using System.Linq; -using Content.Shared.Health.BodySystem; -using Content.Shared.Health.BodySystem.Surgery; using Content.Shared.Interfaces; using Content.Shared.Interfaces.GameObjects.Components; +using Content.Server.Body; +using Content.Shared.Body.Surgery; using Robust.Server.GameObjects; using Robust.Server.GameObjects.Components.UserInterface; using Robust.Server.Interfaces.Player; @@ -14,98 +13,114 @@ using Robust.Shared.IoC; using Robust.Shared.Localization; using Robust.Shared.ViewVariables; -namespace Content.Server.Health.BodySystem.BodyPart +namespace Content.Server.GameObjects.Components.Body { - /// - /// Component representing a dropped, tangible entity. + /// Component representing a dropped, tangible entity. /// [RegisterComponent] public class DroppedBodyPartComponent : Component, IAfterInteract, IBodyPartContainer { - #pragma warning disable 649 [Dependency] private readonly ISharedNotifyManager _sharedNotifyManager; #pragma warning restore 649 - public sealed override string Name => "DroppedBodyPart"; - - [ViewVariables] - public BodyPart ContainedBodyPart { get; set; } + private readonly Dictionary _optionsCache = new Dictionary(); + private BodyManagerComponent _bodyManagerComponentCache; + private int _idHash; + private IEntity _performerCache; private BoundUserInterface _userInterface; - private Dictionary _optionsCache = new Dictionary(); - private IEntity _performerCache; - private BodyManagerComponent _bodyManagerComponentCache; - private int _idHash = 0; - public override void Initialize() - { - base.Initialize(); - _userInterface = Owner.GetComponent().GetBoundUserInterface(GenericSurgeryUiKey.Key); - _userInterface.OnReceiveMessage += UserInterfaceOnOnReceiveMessage; - } + public sealed override string Name => "DroppedBodyPart"; - public void TransferBodyPartData(BodyPart data) - { - ContainedBodyPart = data; - Owner.Name = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(ContainedBodyPart.Name); - if (Owner.TryGetComponent(out SpriteComponent component)) - { - component.LayerSetRSI(0, data.RSIPath); - component.LayerSetState(0, data.RSIState); - } - } + [ViewVariables] public BodyPart ContainedBodyPart { get; private set; } void IAfterInteract.AfterInteract(AfterInteractEventArgs eventArgs) { if (eventArgs.Target == null) + { return; + } CloseAllSurgeryUIs(); _optionsCache.Clear(); _performerCache = null; _bodyManagerComponentCache = null; - if (eventArgs.Target.TryGetComponent(out BodyManagerComponent bodyManager)) + if (eventArgs.Target.TryGetComponent(out BodyManagerComponent bodyManager)) { SendBodySlotListToUser(eventArgs, bodyManager); } } - private void SendBodySlotListToUser(AfterInteractEventArgs eventArgs, BodyManagerComponent bodyManager) + public override void Initialize() { - var toSend = new Dictionary(); //Create dictionary to send to client (text to be shown : data sent back if selected) + base.Initialize(); - //Here we are trying to grab a list of all empty BodySlots adjancent to an existing BodyPart that can be attached to. i.e. an empty left hand slot, connected to an occupied left arm slot would be valid. - List unoccupiedSlots = bodyManager.AllSlots.ToList().Except(bodyManager.OccupiedSlots.ToList()).ToList(); - foreach (string slot in unoccupiedSlots) + _userInterface = Owner.GetComponent() + .GetBoundUserInterface(GenericSurgeryUiKey.Key); + _userInterface.OnReceiveMessage += UserInterfaceOnOnReceiveMessage; + } + + public void TransferBodyPartData(BodyPart data) + { + ContainedBodyPart = data; + Owner.Name = Loc.GetString(ContainedBodyPart.Name); + + if (Owner.TryGetComponent(out SpriteComponent component)) { - if (bodyManager.TryGetSlotType(slot, out BodyPartType typeResult) && typeResult == ContainedBodyPart.PartType) + component.LayerSetRSI(0, data.RSIPath); + component.LayerSetState(0, data.RSIState); + + if (data.RSIColor.HasValue) { - if (bodyManager.TryGetBodyPartConnections(slot, out List bodypartResult)) - { - foreach (BodyPart connectedPart in bodypartResult) - { - if (connectedPart.CanAttachBodyPart(ContainedBodyPart)) - { - _optionsCache.Add(_idHash, slot); - toSend.Add(slot, _idHash++); - } - } - } + component.LayerSetColor(0, data.RSIColor.Value); } } + } + + private void SendBodySlotListToUser(AfterInteractEventArgs eventArgs, BodyManagerComponent bodyManager) + { + // Create dictionary to send to client (text to be shown : data sent back if selected) + var toSend = new Dictionary(); + + // Here we are trying to grab a list of all empty BodySlots adjacent to an existing BodyPart that can be + // attached to. i.e. an empty left hand slot, connected to an occupied left arm slot would be valid. + var unoccupiedSlots = bodyManager.AllSlots.ToList().Except(bodyManager.OccupiedSlots.ToList()).ToList(); + foreach (var slot in unoccupiedSlots) + { + if (!bodyManager.TryGetSlotType(slot, out var typeResult) || + typeResult != ContainedBodyPart.PartType || + !bodyManager.TryGetBodyPartConnections(slot, out var parts)) + { + continue; + } + + foreach (var connectedPart in parts) + { + if (!connectedPart.CanAttachBodyPart(ContainedBodyPart)) + { + continue; + } + + _optionsCache.Add(_idHash, slot); + toSend.Add(slot, _idHash++); + } + } + if (_optionsCache.Count > 0) { OpenSurgeryUI(eventArgs.User.GetComponent().playerSession); - UpdateSurgeryUIBodyPartSlotRequest(eventArgs.User.GetComponent().playerSession, toSend); + UpdateSurgeryUIBodyPartSlotRequest(eventArgs.User.GetComponent().playerSession, + toSend); _performerCache = eventArgs.User; _bodyManagerComponentCache = bodyManager; } - else //If surgery cannot be performed, show message saying so. + else // If surgery cannot be performed, show message saying so. { - _sharedNotifyManager.PopupMessage(eventArgs.Target, eventArgs.User, Loc.GetString("You see no way to install {0:theName}.", Owner)); + _sharedNotifyManager.PopupMessage(eventArgs.Target, eventArgs.User, + Loc.GetString("You see no way to install {0:theName}.", Owner)); } } @@ -115,47 +130,50 @@ namespace Content.Server.Health.BodySystem.BodyPart private void HandleReceiveBodyPartSlot(int key) { CloseSurgeryUI(_performerCache.GetComponent().playerSession); - //TODO: sanity checks to see whether user is in range, user is still able-bodied, target is still the same, etc etc - if (!_optionsCache.TryGetValue(key, out object targetObject)) + + // TODO: sanity checks to see whether user is in range, user is still able-bodied, target is still the same, etc etc + if (!_optionsCache.TryGetValue(key, out var targetObject)) { - _sharedNotifyManager.PopupMessage(_bodyManagerComponentCache.Owner, _performerCache, Loc.GetString("You see no useful way to attach {0:theName} anymore.", Owner)); - } - string target = targetObject as string; - if (!_bodyManagerComponentCache.InstallDroppedBodyPart(this, target)) - { - _sharedNotifyManager.PopupMessage(_bodyManagerComponentCache.Owner, _performerCache, Loc.GetString("You can't attach it!")); - } - else - { - _sharedNotifyManager.PopupMessage(_bodyManagerComponentCache.Owner, _performerCache, Loc.GetString("You attach {0:theName}.", ContainedBodyPart)); + _sharedNotifyManager.PopupMessage(_bodyManagerComponentCache.Owner, _performerCache, + Loc.GetString("You see no useful way to attach {0:theName} anymore.", Owner)); } + + var target = targetObject as string; + + _sharedNotifyManager.PopupMessage( + _bodyManagerComponentCache.Owner, + _performerCache, + !_bodyManagerComponentCache.InstallDroppedBodyPart(this, target) + ? Loc.GetString("You can't attach it!") + : Loc.GetString("You attach {0:theName}.", ContainedBodyPart)); } - - public void OpenSurgeryUI(IPlayerSession session) + private void OpenSurgeryUI(IPlayerSession session) { _userInterface.Open(session); } - public void UpdateSurgeryUIBodyPartSlotRequest(IPlayerSession session, Dictionary options) + + private void UpdateSurgeryUIBodyPartSlotRequest(IPlayerSession session, Dictionary options) { _userInterface.SendMessage(new RequestBodyPartSlotSurgeryUIMessage(options), session); } - public void CloseSurgeryUI(IPlayerSession session) + + private void CloseSurgeryUI(IPlayerSession session) { _userInterface.Close(session); } - public void CloseAllSurgeryUIs() + + private void CloseAllSurgeryUIs() { _userInterface.CloseAll(); } - private void UserInterfaceOnOnReceiveMessage(ServerBoundUserInterfaceMessage message) { switch (message.Message) { case ReceiveBodyPartSlotSurgeryUIMessage msg: - HandleReceiveBodyPartSlot(msg.SelectedOptionID); + HandleReceiveBodyPartSlot(msg.SelectedOptionId); break; } } diff --git a/Content.Server/Health/BodySystem/Mechanism/DroppedMechanismComponent.cs b/Content.Server/GameObjects/Components/Body/DroppedMechanismComponent.cs similarity index 60% rename from Content.Server/Health/BodySystem/Mechanism/DroppedMechanismComponent.cs rename to Content.Server/GameObjects/Components/Body/DroppedMechanismComponent.cs index 788082c0d9..58cab75d74 100644 --- a/Content.Server/Health/BodySystem/Mechanism/DroppedMechanismComponent.cs +++ b/Content.Server/GameObjects/Components/Body/DroppedMechanismComponent.cs @@ -1,9 +1,9 @@ using System; using System.Collections.Generic; -using System.Globalization; -using Content.Server.Health.BodySystem.BodyPart; -using Content.Shared.Health.BodySystem.Mechanism; -using Content.Shared.Health.BodySystem.Surgery; +using Content.Server.Body; +using Content.Server.Body.Mechanisms; +using Content.Shared.Body.Mechanism; +using Content.Shared.Body.Surgery; using Content.Shared.Interfaces; using Content.Shared.Interfaces.GameObjects.Components; using Robust.Server.GameObjects; @@ -18,15 +18,14 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.ViewVariables; -namespace Content.Server.Health.BodySystem.Mechanism { - +namespace Content.Server.GameObjects.Components.Body +{ /// - /// Component representing a dropped, tangible entity. + /// Component representing a dropped, tangible entity. /// [RegisterComponent] public class DroppedMechanismComponent : Component, IAfterInteract { - #pragma warning disable 649 [Dependency] private readonly ISharedNotifyManager _sharedNotifyManager; [Dependency] private IPrototypeManager _prototypeManager; @@ -34,98 +33,120 @@ namespace Content.Server.Health.BodySystem.Mechanism { public sealed override string Name => "DroppedMechanism"; - [ViewVariables] - public Mechanism ContainedMechanism { get; private set; } + private readonly Dictionary _optionsCache = new Dictionary(); + + private BodyManagerComponent _bodyManagerComponentCache; + + private int _idHash; + + private IEntity _performerCache; private BoundUserInterface _userInterface; - private Dictionary _optionsCache = new Dictionary(); - private IEntity _performerCache; - private BodyManagerComponent _bodyManagerComponentCache; - private int _idHash = 0; - public override void Initialize() - { - base.Initialize(); - _userInterface = Owner.GetComponent().GetBoundUserInterface(GenericSurgeryUiKey.Key); - _userInterface.OnReceiveMessage += UserInterfaceOnOnReceiveMessage; - } - - public void InitializeDroppedMechanism(Mechanism data) - { - ContainedMechanism = data; - Owner.Name = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(ContainedMechanism.Name); - if (Owner.TryGetComponent(out SpriteComponent component)) - { - component.LayerSetRSI(0, data.RSIPath); - component.LayerSetState(0, data.RSIState); - } - } + [ViewVariables] public Mechanism ContainedMechanism { get; private set; } void IAfterInteract.AfterInteract(AfterInteractEventArgs eventArgs) { if (eventArgs.Target == null) + { return; + } CloseAllSurgeryUIs(); _optionsCache.Clear(); _performerCache = null; _bodyManagerComponentCache = null; - if (eventArgs.Target.TryGetComponent(out BodyManagerComponent bodyManager)) + if (eventArgs.Target.TryGetComponent(out var bodyManager)) { SendBodyPartListToUser(eventArgs, bodyManager); } - else if (eventArgs.Target.TryGetComponent(out DroppedBodyPartComponent droppedBodyPart)) + else if (eventArgs.Target.TryGetComponent(out var droppedBodyPart)) { if (droppedBodyPart.ContainedBodyPart == null) { - Logger.Debug("Installing a mechanism was attempted on an IEntity with a DroppedBodyPartComponent that doesn't have a BodyPart in it!"); + Logger.Debug( + "Installing a mechanism was attempted on an IEntity with a DroppedBodyPartComponent that doesn't have a BodyPart in it!"); throw new InvalidOperationException("A DroppedBodyPartComponent exists without a BodyPart in it!"); } + if (!droppedBodyPart.ContainedBodyPart.TryInstallDroppedMechanism(this)) { - _sharedNotifyManager.PopupMessage(eventArgs.Target, eventArgs.User, Loc.GetString("You can't fit it in!")); + _sharedNotifyManager.PopupMessage(eventArgs.Target, eventArgs.User, + Loc.GetString("You can't fit it in!")); } } } + public override void Initialize() + { + base.Initialize(); + + _userInterface = Owner.GetComponent() + .GetBoundUserInterface(GenericSurgeryUiKey.Key); + _userInterface.OnReceiveMessage += UserInterfaceOnOnReceiveMessage; + } + + public void InitializeDroppedMechanism(Mechanism data) + { + ContainedMechanism = data; + Owner.Name = Loc.GetString(ContainedMechanism.Name); + + if (Owner.TryGetComponent(out SpriteComponent component)) + { + component.LayerSetRSI(0, data.RSIPath); + component.LayerSetState(0, data.RSIState); + } + } + public override void ExposeData(ObjectSerializer serializer) { - //This is a temporary way to have spawnable hard-coded DroppedMechanismComponent prototypes - //In the future (when it becomes possible) DroppedMechanismComponent should be auto-generated from the Mechanism prototypes - string debugLoadMechanismData = ""; + // This is a temporary way to have spawnable hard-coded DroppedMechanismComponent prototypes + // In the future (when it becomes possible) DroppedMechanismComponent should be auto-generated from + // the Mechanism prototypes + var debugLoadMechanismData = ""; base.ExposeData(serializer); + serializer.DataField(ref debugLoadMechanismData, "debugLoadMechanismData", ""); + if (serializer.Reading && debugLoadMechanismData != "") { _prototypeManager.TryIndex(debugLoadMechanismData, out MechanismPrototype data); - InitializeDroppedMechanism(new Mechanism(data)); + + var mechanism = new Mechanism(data); + mechanism.EnsureInitialize(); + + InitializeDroppedMechanism(mechanism); } } - - private void SendBodyPartListToUser(AfterInteractEventArgs eventArgs, BodyManagerComponent bodyManager) { - var toSend = new Dictionary(); //Create dictionary to send to client (text to be shown : data sent back if selected) - foreach (var (key, value) in bodyManager.PartDictionary) - { //For each limb in the target, add it to our cache if it is a valid option. + // Create dictionary to send to client (text to be shown : data sent back if selected) + var toSend = new Dictionary(); + + foreach (var (key, value) in bodyManager.Parts) + { + // For each limb in the target, add it to our cache if it is a valid option. if (value.CanInstallMechanism(ContainedMechanism)) { _optionsCache.Add(_idHash, value); toSend.Add(key + ": " + value.Name, _idHash++); } } + if (_optionsCache.Count > 0) { OpenSurgeryUI(eventArgs.User.GetComponent().playerSession); - UpdateSurgeryUIBodyPartRequest(eventArgs.User.GetComponent().playerSession, toSend); + UpdateSurgeryUIBodyPartRequest(eventArgs.User.GetComponent().playerSession, + toSend); _performerCache = eventArgs.User; _bodyManagerComponentCache = bodyManager; } - else //If surgery cannot be performed, show message saying so. + else // If surgery cannot be performed, show message saying so. { - _sharedNotifyManager.PopupMessage(eventArgs.Target, eventArgs.User, Loc.GetString("You see no way to install the {0}.", Owner.Name)); + _sharedNotifyManager.PopupMessage(eventArgs.Target, eventArgs.User, + Loc.GetString("You see no way to install the {0}.", Owner.Name)); } } @@ -135,52 +156,55 @@ namespace Content.Server.Health.BodySystem.Mechanism { private void HandleReceiveBodyPart(int key) { CloseSurgeryUI(_performerCache.GetComponent().playerSession); - //TODO: sanity checks to see whether user is in range, user is still able-bodied, target is still the same, etc etc - if (!_optionsCache.TryGetValue(key, out object targetObject)) + + // TODO: sanity checks to see whether user is in range, user is still able-bodied, target is still the same, etc etc + if (!_optionsCache.TryGetValue(key, out var targetObject)) { - _sharedNotifyManager.PopupMessage(_bodyManagerComponentCache.Owner, _performerCache, Loc.GetString("You see no useful way to use the {0} anymore.", Owner.Name)); - } - BodyPart.BodyPart target = targetObject as BodyPart.BodyPart; - if (!target.TryInstallDroppedMechanism(this)) - { - _sharedNotifyManager.PopupMessage(_bodyManagerComponentCache.Owner, _performerCache, Loc.GetString("You can't fit it in!")); - } - else - { - _sharedNotifyManager.PopupMessage(_bodyManagerComponentCache.Owner, _performerCache, Loc.GetString("You jam the {1} inside {0:them}.", _performerCache, ContainedMechanism.Name)); + _sharedNotifyManager.PopupMessage(_bodyManagerComponentCache.Owner, _performerCache, + Loc.GetString("You see no useful way to use the {0} anymore.", Owner.Name)); + return; } + + var target = targetObject as BodyPart; + + _sharedNotifyManager.PopupMessage( + _bodyManagerComponentCache.Owner, + _performerCache, + !target.TryInstallDroppedMechanism(this) + ? Loc.GetString("You can't fit it in!") + : Loc.GetString("You jam the {1} inside {0:them}.", _performerCache, ContainedMechanism.Name)); + + // TODO: {1:theName} } - - - - public void OpenSurgeryUI(IPlayerSession session) + private void OpenSurgeryUI(IPlayerSession session) { _userInterface.Open(session); } - public void UpdateSurgeryUIBodyPartRequest(IPlayerSession session, Dictionary options) + + private void UpdateSurgeryUIBodyPartRequest(IPlayerSession session, Dictionary options) { _userInterface.SendMessage(new RequestBodyPartSurgeryUIMessage(options), session); } - public void CloseSurgeryUI(IPlayerSession session) + + private void CloseSurgeryUI(IPlayerSession session) { _userInterface.Close(session); } - public void CloseAllSurgeryUIs() + + private void CloseAllSurgeryUIs() { _userInterface.CloseAll(); } - private void UserInterfaceOnOnReceiveMessage(ServerBoundUserInterfaceMessage message) { switch (message.Message) { case ReceiveBodyPartSurgeryUIMessage msg: - HandleReceiveBodyPart(msg.SelectedOptionID); + HandleReceiveBodyPart(msg.SelectedOptionId); break; } } } } - diff --git a/Content.Server/GameObjects/Components/Body/Respiratory/LungComponent.cs b/Content.Server/GameObjects/Components/Body/Respiratory/LungComponent.cs new file mode 100644 index 0000000000..eb625d7a64 --- /dev/null +++ b/Content.Server/GameObjects/Components/Body/Respiratory/LungComponent.cs @@ -0,0 +1,127 @@ +using System; +using Content.Server.Atmos; +using Content.Server.GameObjects.Components.Body.Circulatory; +using Content.Server.Interfaces; +using Content.Shared.Atmos; +using Robust.Shared.GameObjects; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; + +namespace Content.Server.GameObjects.Components.Body.Respiratory +{ + [RegisterComponent] + public class LungComponent : Component, IGasMixtureHolder + { + public override string Name => "Lung"; + + private float _accumulatedFrameTime; + + /// + /// The pressure that this lung exerts on the air around it + /// + [ViewVariables(VVAccess.ReadWrite)] private float Pressure { get; set; } + + [ViewVariables] public GasMixture Air { get; set; } = new GasMixture(); + + [ViewVariables] public LungStatus Status { get; set; } + + public override void ExposeData(ObjectSerializer serializer) + { + base.ExposeData(serializer); + + serializer.DataReadWriteFunction( + "volume", + 6, + vol => Air.Volume = vol, + () => Air.Volume); + serializer.DataField(this, l => l.Pressure, "pressure", 100); + } + + public void Update(float frameTime) + { + if (Status == LungStatus.None) + { + Status = LungStatus.Inhaling; + } + + _accumulatedFrameTime += Status switch + { + LungStatus.Inhaling => frameTime, + LungStatus.Exhaling => -frameTime, + _ => throw new ArgumentOutOfRangeException() + }; + + var absoluteTime = Math.Abs(_accumulatedFrameTime); + if (absoluteTime < 2) + { + return; + } + + switch (Status) + { + case LungStatus.Inhaling: + Inhale(absoluteTime); + Status = LungStatus.Exhaling; + break; + case LungStatus.Exhaling: + Exhale(absoluteTime); + Status = LungStatus.Inhaling; + break; + default: + throw new ArgumentOutOfRangeException(); + } + + _accumulatedFrameTime = absoluteTime - 2; + } + + public void Inhale(float frameTime) + { + if (!Owner.TryGetComponent(out BloodstreamComponent bloodstream)) + { + return; + } + + if (!Owner.Transform.GridPosition.TryGetTileAir(out var tileAir)) + { + return; + } + + var amount = Atmospherics.BreathPercentage * frameTime; + var volumeRatio = amount / tileAir.Volume; + var temp = tileAir.RemoveRatio(volumeRatio); + + temp.PumpGasTo(Air, Pressure); + Air.PumpGasTo(bloodstream.Air, Pressure); + tileAir.Merge(temp); + } + + public void Exhale(float frameTime) + { + if (!Owner.TryGetComponent(out BloodstreamComponent bloodstream)) + { + return; + } + + if (!Owner.Transform.GridPosition.TryGetTileAir(out var tileAir)) + { + return; + } + + bloodstream.PumpToxins(Air, Pressure); + + var amount = Atmospherics.BreathPercentage * frameTime; + var volumeRatio = amount / tileAir.Volume; + var temp = tileAir.RemoveRatio(volumeRatio); + + temp.PumpGasTo(tileAir, Pressure); + Air.Merge(temp); + } + } + + public enum LungStatus + { + None = 0, + Inhaling, + Exhaling + } +} diff --git a/Content.Server/Health/BodySystem/Surgery/Surgeon/SurgeryToolComponent.cs b/Content.Server/GameObjects/Components/Body/SurgeryToolComponent.cs similarity index 55% rename from Content.Server/Health/BodySystem/Surgery/Surgeon/SurgeryToolComponent.cs rename to Content.Server/GameObjects/Components/Body/SurgeryToolComponent.cs index 42e9e3f2ca..7f4ece43a0 100644 --- a/Content.Server/Health/BodySystem/Surgery/Surgeon/SurgeryToolComponent.cs +++ b/Content.Server/GameObjects/Components/Body/SurgeryToolComponent.cs @@ -1,14 +1,16 @@ using System; using System.Collections.Generic; -using Content.Server.Health.BodySystem.BodyPart; -using Content.Server.Health.BodySystem.Mechanism; +using Content.Server.Body; +using Content.Server.Body.Mechanisms; +using Content.Server.Body.Surgery; +using Content.Shared.Body.Surgery; using Content.Shared.GameObjects; -using Content.Shared.Health.BodySystem; -using Content.Shared.Health.BodySystem.Surgery; +using Content.Shared.GameObjects.Components.Body; using Content.Shared.Interfaces; using Content.Shared.Interfaces.GameObjects.Components; using Robust.Server.GameObjects; using Robust.Server.GameObjects.Components.UserInterface; +using Robust.Server.Interfaces.GameObjects; using Robust.Server.Interfaces.Player; using Robust.Shared.GameObjects; using Robust.Shared.Interfaces.GameObjects; @@ -17,110 +19,136 @@ using Robust.Shared.Localization; using Robust.Shared.Log; using Robust.Shared.Serialization; -namespace Content.Server.Health.BodySystem.Surgery.Surgeon +namespace Content.Server.GameObjects.Components.Body { - //TODO: add checks to close UI if user walks too far away from tool or target. + // TODO: add checks to close UI if user walks too far away from tool or target. /// - /// Server-side component representing a generic tool capable of performing surgery. For instance, the scalpel. + /// Server-side component representing a generic tool capable of performing surgery. + /// For instance, the scalpel. /// [RegisterComponent] public class SurgeryToolComponent : Component, ISurgeon, IAfterInteract { - public override string Name => "SurgeryTool"; - public override uint? NetID => ContentNetIDs.SURGERY; - #pragma warning disable 649 [Dependency] private readonly ISharedNotifyManager _sharedNotifyManager; #pragma warning restore 649 - public float BaseOperationTime { get => _baseOperateTime; set => _baseOperateTime = value; } + public override string Name => "SurgeryTool"; + public override uint? NetID => ContentNetIDs.SURGERY; + + private readonly Dictionary _optionsCache = new Dictionary(); + private float _baseOperateTime; - private SurgeryType _surgeryType; - private HashSet _subscribedSessions = new HashSet(); - private BoundUserInterface _userInterface; - private Dictionary _optionsCache = new Dictionary(); - private IEntity _performerCache; private BodyManagerComponent _bodyManagerComponentCache; - private ISurgeon.MechanismRequestCallback _callbackCache; - private int _idHash = 0; - public override void Initialize() - { - base.Initialize(); - _userInterface = Owner.GetComponent().GetBoundUserInterface(GenericSurgeryUiKey.Key); - _userInterface.OnReceiveMessage += UserInterfaceOnOnReceiveMessage; - } + private ISurgeon.MechanismRequestCallback _callbackCache; + + private int _idHash; + + private IEntity _performerCache; + + private SurgeryType _surgeryType; + + private BoundUserInterface _userInterface; void IAfterInteract.AfterInteract(AfterInteractEventArgs eventArgs) { if (eventArgs.Target == null) + { return; + } + + if (!eventArgs.User.TryGetComponent(out IActorComponent actor)) + { + return; + } CloseAllSurgeryUIs(); _optionsCache.Clear(); + _performerCache = null; _bodyManagerComponentCache = null; _callbackCache = null; - if (eventArgs.Target.TryGetComponent(out BodyManagerComponent bodyManager)) //Attempt surgery on a BodyManagerComponent by sending a list of operatable BodyParts to the client to choose from + // Attempt surgery on a BodyManagerComponent by sending a list of operable BodyParts to the client to choose from + if (eventArgs.Target.TryGetComponent(out BodyManagerComponent body)) { - var toSend = new Dictionary(); //Create dictionary to send to client (text to be shown : data sent back if selected) - foreach (var(key, value) in bodyManager.PartDictionary) { //For each limb in the target, add it to our cache if it is a valid option. + // Create dictionary to send to client (text to be shown : data sent back if selected) + var toSend = new Dictionary(); + + foreach (var (key, value) in body.Parts) + { + // For each limb in the target, add it to our cache if it is a valid option. if (value.SurgeryCheck(_surgeryType)) { _optionsCache.Add(_idHash, value); toSend.Add(key + ": " + value.Name, _idHash++); } } + if (_optionsCache.Count > 0) { - OpenSurgeryUI(eventArgs.User.GetComponent().playerSession); - UpdateSurgeryUIBodyPartRequest(eventArgs.User.GetComponent().playerSession, toSend); - _performerCache = eventArgs.User; //Also, cache the data. - _bodyManagerComponentCache = bodyManager; + OpenSurgeryUI(actor.playerSession); + UpdateSurgeryUIBodyPartRequest(actor.playerSession, toSend); + _performerCache = eventArgs.User; // Also, cache the data. + _bodyManagerComponentCache = body; } - else //If surgery cannot be performed, show message saying so. + else // If surgery cannot be performed, show message saying so. { SendNoUsefulWayToUsePopup(); } } - else if (eventArgs.Target.TryGetComponent(out DroppedBodyPartComponent droppedBodyPart)) //Attempt surgery on a DroppedBodyPart - there's only one possible target so no need for selection UI + else if (eventArgs.Target.TryGetComponent(out var droppedBodyPart)) { + // Attempt surgery on a DroppedBodyPart - there's only one possible target so no need for selection UI _performerCache = eventArgs.User; - if (droppedBodyPart.ContainedBodyPart == null) //Throw error if the DroppedBodyPart has no data in it. + + if (droppedBodyPart.ContainedBodyPart == null) { - Logger.Debug("Surgery was attempted on an IEntity with a DroppedBodyPartComponent that doesn't have a BodyPart in it!"); + // Throw error if the DroppedBodyPart has no data in it. + Logger.Debug( + "Surgery was attempted on an IEntity with a DroppedBodyPartComponent that doesn't have a BodyPart in it!"); throw new InvalidOperationException("A DroppedBodyPartComponent exists without a BodyPart in it!"); } - if (droppedBodyPart.ContainedBodyPart.SurgeryCheck(_surgeryType)) //If surgery can be performed... - { - if (!droppedBodyPart.ContainedBodyPart.AttemptSurgery(_surgeryType, droppedBodyPart, this, eventArgs.User)) //...do the surgery. - { - Logger.Debug("Error when trying to perform surgery on bodypart " + eventArgs.User.Name + "!"); //Log error if the surgery fails somehow. - throw new InvalidOperationException(); - } - } - else //If surgery cannot be performed, show message saying so. + + // If surgery can be performed... + if (!droppedBodyPart.ContainedBodyPart.SurgeryCheck(_surgeryType)) { SendNoUsefulWayToUsePopup(); + return; } + + //...do the surgery. + if (droppedBodyPart.ContainedBodyPart.AttemptSurgery(_surgeryType, droppedBodyPart, this, + eventArgs.User)) + { + return; + } + + // Log error if the surgery fails somehow. + Logger.Debug($"Error when trying to perform surgery on ${nameof(BodyPart)} {eventArgs.User.Name}"); + throw new InvalidOperationException(); } } - public void RequestMechanism(List options, ISurgeon.MechanismRequestCallback callback) + public float BaseOperationTime { get => _baseOperateTime; set => _baseOperateTime = value; } + + public void RequestMechanism(IEnumerable options, ISurgeon.MechanismRequestCallback callback) { - var toSend = new Dictionary (); - foreach (Mechanism.Mechanism mechanism in options) + var toSend = new Dictionary(); + foreach (var mechanism in options) { _optionsCache.Add(_idHash, mechanism); toSend.Add(mechanism.Name, _idHash++); } + if (_optionsCache.Count > 0) { OpenSurgeryUI(_performerCache.GetComponent().playerSession); - UpdateSurgeryUIMechanismRequest(_performerCache.GetComponent().playerSession, toSend); + UpdateSurgeryUIMechanismRequest(_performerCache.GetComponent().playerSession, + toSend); _callbackCache = callback; } else @@ -130,95 +158,112 @@ namespace Content.Server.Health.BodySystem.Surgery.Surgeon } } + public override void Initialize() + { + base.Initialize(); + _userInterface = Owner.GetComponent() + .GetBoundUserInterface(GenericSurgeryUiKey.Key); + _userInterface.OnReceiveMessage += UserInterfaceOnOnReceiveMessage; + } - - - - - public void OpenSurgeryUI(IPlayerSession session) + private void OpenSurgeryUI(IPlayerSession session) { _userInterface.Open(session); } - public void UpdateSurgeryUIBodyPartRequest(IPlayerSession session, Dictionary options) + + private void UpdateSurgeryUIBodyPartRequest(IPlayerSession session, Dictionary options) { _userInterface.SendMessage(new RequestBodyPartSurgeryUIMessage(options), session); } - public void UpdateSurgeryUIMechanismRequest(IPlayerSession session, Dictionary options) + + private void UpdateSurgeryUIMechanismRequest(IPlayerSession session, Dictionary options) { _userInterface.SendMessage(new RequestMechanismSurgeryUIMessage(options), session); } - public void CloseSurgeryUI(IPlayerSession session) + + private void CloseSurgeryUI(IPlayerSession session) { _userInterface.Close(session); } - public void CloseAllSurgeryUIs() + + private void CloseAllSurgeryUIs() { _userInterface.CloseAll(); } - - - private void UserInterfaceOnOnReceiveMessage(ServerBoundUserInterfaceMessage message) { switch (message.Message) { case ReceiveBodyPartSurgeryUIMessage msg: - HandleReceiveBodyPart(msg.SelectedOptionID); + HandleReceiveBodyPart(msg.SelectedOptionId); break; case ReceiveMechanismSurgeryUIMessage msg: - HandleReceiveMechanism(msg.SelectedOptionID); + HandleReceiveMechanism(msg.SelectedOptionId); break; } } /// - /// Called after the client chooses from a list of possible BodyParts that can be operated on. + /// Called after the client chooses from a list of possible + /// that can be operated on. /// private void HandleReceiveBodyPart(int key) { CloseSurgeryUI(_performerCache.GetComponent().playerSession); - //TODO: sanity checks to see whether user is in range, user is still able-bodied, target is still the same, etc etc - if (!_optionsCache.TryGetValue(key, out object targetObject)) - { - SendNoUsefulWayToUseAnymorePopup(); - } - BodyPart.BodyPart target = targetObject as BodyPart.BodyPart; - if (!target.AttemptSurgery(_surgeryType, _bodyManagerComponentCache, this, _performerCache)) + // TODO: sanity checks to see whether user is in range, user is still able-bodied, target is still the same, etc etc + if (!_optionsCache.TryGetValue(key, out var targetObject)) { SendNoUsefulWayToUseAnymorePopup(); } - } - /// - /// Called after the client chooses from a list of possible Mechanisms to choose from. - /// - private void HandleReceiveMechanism(int key) - { - //TODO: sanity checks to see whether user is in range, user is still able-bodied, target is still the same, etc etc - if (!_optionsCache.TryGetValue(key, out object targetObject)) + var target = targetObject as BodyPart; + + if (!target.AttemptSurgery(_surgeryType, _bodyManagerComponentCache, this, _performerCache)) { SendNoUsefulWayToUseAnymorePopup(); } - Mechanism.Mechanism target = targetObject as Mechanism.Mechanism; + } + + /// + /// Called after the client chooses from a list of possible + /// to choose from. + /// + private void HandleReceiveMechanism(int key) + { + // TODO: sanity checks to see whether user is in range, user is still able-bodied, target is still the same, etc etc + if (!_optionsCache.TryGetValue(key, out var targetObject)) + { + SendNoUsefulWayToUseAnymorePopup(); + } + + var target = targetObject as Mechanism; + CloseSurgeryUI(_performerCache.GetComponent().playerSession); _callbackCache(target, _bodyManagerComponentCache, this, _performerCache); } private void SendNoUsefulWayToUsePopup() { - _sharedNotifyManager.PopupMessage(_bodyManagerComponentCache.Owner, _performerCache, Loc.GetString("You see no useful way to use {0:theName}.", Owner)); + _sharedNotifyManager.PopupMessage( + _bodyManagerComponentCache.Owner, + _performerCache, + Loc.GetString("You see no useful way to use {0:theName}.", Owner)); } private void SendNoUsefulWayToUseAnymorePopup() { - _sharedNotifyManager.PopupMessage(_bodyManagerComponentCache.Owner, _performerCache, Loc.GetString("You see no useful way to use {0:theName} anymore.", Owner)); + _sharedNotifyManager.PopupMessage( + _bodyManagerComponentCache.Owner, + _performerCache, + Loc.GetString("You see no useful way to use {0:theName} anymore.", Owner)); } public override void ExposeData(ObjectSerializer serializer) { base.ExposeData(serializer); + serializer.DataField(ref _surgeryType, "surgeryType", SurgeryType.Incision); serializer.DataField(ref _baseOperateTime, "baseOperateTime", 5); } diff --git a/Content.Server/GameObjects/Components/Buckle/BuckleComponent.cs b/Content.Server/GameObjects/Components/Buckle/BuckleComponent.cs index 5c9870c53f..877a0c2727 100644 --- a/Content.Server/GameObjects/Components/Buckle/BuckleComponent.cs +++ b/Content.Server/GameObjects/Components/Buckle/BuckleComponent.cs @@ -373,9 +373,9 @@ namespace Content.Server.GameObjects.Components.Buckle StandingStateHelper.Standing(Owner); } - if (Owner.TryGetComponent(out SpeciesComponent species)) + if (Owner.TryGetComponent(out MobStateManagerComponent stateManager)) { - species.CurrentDamageState.EnterState(Owner); + stateManager.CurrentMobState.EnterState(Owner); } BuckleStatus(); diff --git a/Content.Server/GameObjects/Components/Chemistry/InjectorComponent.cs b/Content.Server/GameObjects/Components/Chemistry/InjectorComponent.cs index 9f78004304..03ac3855e7 100644 --- a/Content.Server/GameObjects/Components/Chemistry/InjectorComponent.cs +++ b/Content.Server/GameObjects/Components/Chemistry/InjectorComponent.cs @@ -1,5 +1,5 @@ using System; -using Content.Server.GameObjects.Components.Metabolism; +using Content.Server.GameObjects.Components.Body.Circulatory; using Content.Server.Interfaces; using Content.Server.Utility; using Content.Shared.Chemistry; @@ -134,7 +134,8 @@ namespace Content.Server.GameObjects.Components.Chemistry } else //Handle injecting into bloodstream { - if (targetEntity.TryGetComponent(out var bloodstream) && _toggleState == InjectorToggleMode.Inject) + if (targetEntity.TryGetComponent(out BloodstreamComponent bloodstream) && + _toggleState == InjectorToggleMode.Inject) { TryInjectIntoBloodstream(bloodstream, eventArgs.User); } diff --git a/Content.Server/GameObjects/Components/Chemistry/PillComponent.cs b/Content.Server/GameObjects/Components/Chemistry/PillComponent.cs index 6d682e594f..7ff05c4398 100644 --- a/Content.Server/GameObjects/Components/Chemistry/PillComponent.cs +++ b/Content.Server/GameObjects/Components/Chemistry/PillComponent.cs @@ -1,4 +1,5 @@ -using Content.Server.GameObjects.Components.Nutrition; +using Content.Server.GameObjects.Components.Body.Digestive; +using Content.Server.GameObjects.Components.Nutrition; using Content.Server.GameObjects.Components.Utensil; using Content.Server.Utility; using Content.Shared.Chemistry; diff --git a/Content.Server/GameObjects/Components/Chemistry/SolutionComponent.cs b/Content.Server/GameObjects/Components/Chemistry/SolutionComponent.cs index 5218f996ce..53e3ca2463 100644 --- a/Content.Server/GameObjects/Components/Chemistry/SolutionComponent.cs +++ b/Content.Server/GameObjects/Components/Chemistry/SolutionComponent.cs @@ -27,7 +27,7 @@ namespace Content.Server.GameObjects.Components.Chemistry /// ECS component that manages a liquid solution of reagents. /// [RegisterComponent] - internal class SolutionComponent : SharedSolutionComponent, IExamine + public class SolutionComponent : SharedSolutionComponent, IExamine { #pragma warning disable 649 [Dependency] private readonly IPrototypeManager _prototypeManager; diff --git a/Content.Server/GameObjects/Components/Damage/BreakableComponent.cs b/Content.Server/GameObjects/Components/Damage/BreakableComponent.cs index 0a9e53e03a..15ad3e8a35 100644 --- a/Content.Server/GameObjects/Components/Damage/BreakableComponent.cs +++ b/Content.Server/GameObjects/Components/Damage/BreakableComponent.cs @@ -1,39 +1,59 @@ using System.Collections.Generic; -using Content.Server.GameObjects.EntitySystems; -using Content.Server.Interfaces.GameObjects; using Content.Shared.GameObjects.Components.Damage; +using Content.Shared.GameObjects.EntitySystems; +using Robust.Server.GameObjects.EntitySystems; using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Systems; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.Random; using Robust.Shared.IoC; using Robust.Shared.Random; -using Robust.Shared.Serialization; namespace Content.Server.GameObjects.Components.Damage { + // TODO: Repair needs to set CurrentDamageState to DamageState.Alive, but it doesn't exist... should be easy enough if it's just an interface you can slap on BreakableComponent + + /// + /// When attached to an , allows it to take damage and sets it to a "broken state" after taking + /// enough damage. + /// [RegisterComponent] - public class BreakableComponent : Component, IOnDamageBehavior, IExAct + [ComponentReference(typeof(IDamageableComponent))] + public class BreakableComponent : RuinableComponent, IExAct { - - #pragma warning disable 649 +#pragma warning disable 649 [Dependency] private readonly IEntitySystemManager _entitySystemManager; - #pragma warning restore 649 - /// - public override string Name => "Breakable"; - public DamageThreshold Threshold { get; private set; } + [Dependency] private readonly IRobustRandom _random; +#pragma warning restore 649 - public DamageType damageType = DamageType.Total; - public int damageValue = 0; - public bool broken = false; + public override string Name => "Breakable"; private ActSystem _actSystem; + private DamageState _currentDamageState; - public override void ExposeData(ObjectSerializer serializer) + public override List SupportedDamageStates => + new List {DamageState.Alive, DamageState.Dead}; + + public override DamageState CurrentDamageState => _currentDamageState; + + void IExAct.OnExplosion(ExplosionEventArgs eventArgs) { - base.ExposeData(serializer); + switch (eventArgs.Severity) + { + case ExplosionSeverity.Destruction: + PerformDestruction(); + break; + case ExplosionSeverity.Heavy: + PerformDestruction(); + break; + case ExplosionSeverity.Light: + if (_random.Prob(0.5f)) + { + PerformDestruction(); + } - serializer.DataField(ref damageValue, "thresholdvalue", 100); - serializer.DataField(ref damageType, "thresholdtype", DamageType.Total); + break; + } } public override void Initialize() @@ -42,38 +62,21 @@ namespace Content.Server.GameObjects.Components.Damage _actSystem = _entitySystemManager.GetEntitySystem(); } - public List GetAllDamageThresholds() + // Might want to move this down and have a more standardized method of revival + public void FixAllDamage() { - Threshold = new DamageThreshold(damageType, damageValue, ThresholdType.Breakage); - return new List() {Threshold}; + Heal(); + _currentDamageState = DamageState.Alive; } - public void OnDamageThresholdPassed(object obj, DamageThresholdPassedEventArgs e) + protected override void DestructionBehavior() { - if (e.Passed && e.DamageThreshold == Threshold && broken == false) + _actSystem.HandleBreakage(Owner); + if (!Owner.Deleted && DestroySound != string.Empty) { - broken = true; - _actSystem.HandleBreakage(Owner); + var pos = Owner.Transform.GridPosition; + EntitySystem.Get().PlayAtCoords(DestroySound, pos); } } - - public void OnExplosion(ExplosionEventArgs eventArgs) - { - var prob = IoCManager.Resolve(); - switch (eventArgs.Severity) - { - case ExplosionSeverity.Destruction: - _actSystem.HandleBreakage(Owner); - break; - case ExplosionSeverity.Heavy: - _actSystem.HandleBreakage(Owner); - break; - case ExplosionSeverity.Light: - if(prob.Prob(0.4f)) - _actSystem.HandleBreakage(Owner); - break; - } - } - } } diff --git a/Content.Server/GameObjects/Components/Damage/DamageOnHighSpeedImpactComponent.cs b/Content.Server/GameObjects/Components/Damage/DamageOnHighSpeedImpactComponent.cs index 0dff2a90f2..756e417e0e 100644 --- a/Content.Server/GameObjects/Components/Damage/DamageOnHighSpeedImpactComponent.cs +++ b/Content.Server/GameObjects/Components/Damage/DamageOnHighSpeedImpactComponent.cs @@ -1,6 +1,7 @@ using System; using Content.Server.GameObjects.Components.Mobs; using Content.Shared.Audio; +using Content.Shared.Damage; using Content.Shared.GameObjects.Components.Damage; using Robust.Server.GameObjects.EntitySystems; using Robust.Shared.GameObjects; @@ -23,7 +24,7 @@ namespace Content.Server.GameObjects.Components.Damage public override string Name => "DamageOnHighSpeedImpact"; - public DamageType Damage { get; set; } = DamageType.Brute; + public DamageType Damage { get; set; } = DamageType.Blunt; public float MinimumSpeed { get; set; } = 20f; public int BaseDamage { get; set; } = 5; public float Factor { get; set; } = 0.75f; @@ -38,7 +39,7 @@ namespace Content.Server.GameObjects.Components.Damage { base.ExposeData(serializer); - serializer.DataField(this, x => Damage, "damage", DamageType.Brute); + serializer.DataField(this, x => Damage, "damage", DamageType.Blunt); serializer.DataField(this, x => MinimumSpeed, "minimumSpeed", 20f); serializer.DataField(this, x => BaseDamage, "baseDamage", 5); serializer.DataField(this, x => Factor, "factor", 1f); @@ -51,7 +52,7 @@ namespace Content.Server.GameObjects.Components.Damage public void CollideWith(IEntity collidedWith) { - if (!Owner.TryGetComponent(out ICollidableComponent collidable) || !Owner.TryGetComponent(out DamageableComponent damageable)) return; + if (!Owner.TryGetComponent(out ICollidableComponent collidable) || !Owner.TryGetComponent(out IDamageableComponent damageable)) return; var speed = collidable.LinearVelocity.Length; @@ -70,7 +71,7 @@ namespace Content.Server.GameObjects.Components.Damage if (Owner.TryGetComponent(out StunnableComponent stun) && _robustRandom.Prob(StunChance)) stun.Stun(StunSeconds); - damageable.TakeDamage(Damage, damage, collidedWith, Owner); + damageable.ChangeDamage(Damage, damage, false, collidedWith); } } } diff --git a/Content.Server/GameObjects/Components/Damage/DamageOnToolInteractComponent.cs b/Content.Server/GameObjects/Components/Damage/DamageOnToolInteractComponent.cs index 836dd9d000..034d92c9cf 100644 --- a/Content.Server/GameObjects/Components/Damage/DamageOnToolInteractComponent.cs +++ b/Content.Server/GameObjects/Components/Damage/DamageOnToolInteractComponent.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; using Content.Server.GameObjects.Components.Interactable; -using Content.Shared.GameObjects.Components.Damage; +using Content.Shared.Damage; using Content.Shared.GameObjects.Components.Interactable; using Content.Shared.Interfaces.GameObjects.Components; using Robust.Shared.GameObjects; @@ -9,7 +9,7 @@ using Robust.Shared.Serialization; namespace Content.Server.GameObjects.Components.Damage { [RegisterComponent] - class DamageOnToolInteractComponent : Component, IInteractUsing + public class DamageOnToolInteractComponent : Component, IInteractUsing { public override string Name => "DamageOnToolInteract"; @@ -29,7 +29,7 @@ namespace Content.Server.GameObjects.Components.Damage public override void Initialize() { base.Initialize(); - Owner.EnsureComponent(); + Owner.EnsureComponent(); } public bool InteractUsing(InteractUsingEventArgs eventArgs) @@ -40,12 +40,12 @@ namespace Content.Server.GameObjects.Components.Damage { if (tool.HasQuality(ToolQuality.Welding) && toolQuality == ToolQuality.Welding) { - if (eventArgs.Using.TryGetComponent(out WelderComponent welder)) - { + if (eventArgs.Using.TryGetComponent(out WelderComponent welder)) + { if (welder.WelderLit) return CallDamage(eventArgs, tool); - } + } break; //If the tool quality is welding and its not lit or its not actually a welder that can be lit then its pointless to continue. - } + } if (tool.HasQuality(toolQuality)) return CallDamage(eventArgs, tool); } @@ -55,14 +55,17 @@ namespace Content.Server.GameObjects.Components.Damage protected bool CallDamage(InteractUsingEventArgs eventArgs, ToolComponent tool) { - if (eventArgs.Target.TryGetComponent(out var damageable)) + if (eventArgs.Target.TryGetComponent(out var damageable)) { - if(tool.HasQuality(ToolQuality.Welding)) damageable.TakeDamage(DamageType.Heat, Damage, eventArgs.Using, eventArgs.User); - else - damageable.TakeDamage(DamageType.Brute, Damage, eventArgs.Using, eventArgs.User); + damageable.ChangeDamage(tool.HasQuality(ToolQuality.Welding) + ? DamageType.Heat + : DamageType.Blunt, + Damage, false, eventArgs.User); + return true; } - return false; + + return false; } } } diff --git a/Content.Server/GameObjects/Components/Damage/DamageThreshold.cs b/Content.Server/GameObjects/Components/Damage/DamageThreshold.cs deleted file mode 100644 index 1efd2ba7a4..0000000000 --- a/Content.Server/GameObjects/Components/Damage/DamageThreshold.cs +++ /dev/null @@ -1,98 +0,0 @@ -using System; -using Content.Shared.GameObjects.Components.Damage; -using Robust.Shared.Interfaces.GameObjects; - -namespace Content.Server.GameObjects.Components.Damage -{ - /// - /// Triggers an event when values rise above or drop below this threshold - /// - public struct DamageThreshold - { - public DamageType DamageType { get; } - public int Value { get; } - public ThresholdType ThresholdType { get; } - - public DamageThreshold(DamageType damageType, int value, ThresholdType thresholdType) - { - DamageType = damageType; - Value = value; - ThresholdType = thresholdType; - } - - public override bool Equals(Object obj) - { - return obj is DamageThreshold threshold && this == threshold; - } - public override int GetHashCode() - { - return DamageType.GetHashCode() ^ Value.GetHashCode(); - } - public static bool operator ==(DamageThreshold x, DamageThreshold y) - { - return x.DamageType == y.DamageType && x.Value == y.Value; - } - public static bool operator !=(DamageThreshold x, DamageThreshold y) - { - return !(x == y); - } - } - - public enum ThresholdType - { - None, - Destruction, - Death, - Critical, - HUDUpdate, - Breakage, - } - - public class DamageThresholdPassedEventArgs : EventArgs - { - public DamageThreshold DamageThreshold { get; } - public bool Passed { get; } - public int ExcessDamage { get; } - - public DamageThresholdPassedEventArgs(DamageThreshold threshold, bool passed, int excess) - { - DamageThreshold = threshold; - Passed = passed; - ExcessDamage = excess; - } - } - - public class DamageEventArgs : EventArgs - { - /// - /// Type of damage. - /// - public DamageType Type { get; } - - /// - /// Change in damage. - /// - public int Damage { get; } - - /// - /// The entity that damaged this one. - /// Could be null. - /// - public IEntity Source { get; } - - /// - /// The mob entity that damaged this one. - /// Could be null. - /// - public IEntity SourceMob { get; } - - public DamageEventArgs(DamageType type, int damage, IEntity source, IEntity sourceMob) - { - Type = type; - Damage = damage; - Source = source; - SourceMob = sourceMob; - } - } -} - diff --git a/Content.Server/GameObjects/Components/Damage/DamageableComponent.cs b/Content.Server/GameObjects/Components/Damage/DamageableComponent.cs deleted file mode 100644 index 613355bce2..0000000000 --- a/Content.Server/GameObjects/Components/Damage/DamageableComponent.cs +++ /dev/null @@ -1,212 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Content.Server.Interfaces.GameObjects; -using Content.Server.Interfaces.GameObjects.Components.Damage; -using Content.Shared.GameObjects.Components.Damage; -using Robust.Shared.GameObjects; -using Robust.Shared.Interfaces.GameObjects; -using Robust.Shared.Serialization; -using Robust.Shared.ViewVariables; - -namespace Content.Server.GameObjects.Components.Damage -{ - //TODO: add support for component add/remove - - /// - /// A component that handles receiving damage and healing, - /// as well as informing other components of it. - /// - [RegisterComponent] - public class DamageableComponent : SharedDamageableComponent, IDamageableComponent - { - /// - public override string Name => "Damageable"; - - /// - /// The resistance set of this object. - /// Affects receiving damage of various types. - /// - [ViewVariables] - public ResistanceSet Resistances { get; private set; } - - [ViewVariables] - public IReadOnlyDictionary CurrentDamage => _currentDamage; - private Dictionary _currentDamage = new Dictionary(); - - [ViewVariables] - public Dictionary> Thresholds = new Dictionary>(); - - public event EventHandler DamageThresholdPassed; - public event EventHandler Damaged; - - public override ComponentState GetComponentState() - { - return new DamageComponentState(_currentDamage); - } - - public override void ExposeData(ObjectSerializer serializer) - { - base.ExposeData(serializer); - serializer.DataField(this, x => Resistances, "resistances", ResistanceSet.DefaultResistanceSet); - } - - public bool IsDead() - { - var currentDamage = _currentDamage[DamageType.Total]; - foreach (var threshold in Thresholds[DamageType.Total]) - { - if (threshold.Value <= currentDamage) - { - if (threshold.ThresholdType != ThresholdType.Death) continue; - return true; - } - } - - return false; - } - - /// - public override void Initialize() - { - base.Initialize(); - InitializeDamageType(DamageType.Total); - - foreach (var damagebehavior in Owner.GetAllComponents()) - { - AddThresholdsFrom(damagebehavior); - Damaged += damagebehavior.OnDamaged; - } - - RecalculateComponentThresholds(); - } - - /// - public void TakeDamage(DamageType damageType, int amount, IEntity source = null, IEntity sourceMob = null) - { - if (damageType == DamageType.Total) - { - foreach (DamageType e in Enum.GetValues(typeof(DamageType))) - { - if (e == damageType) continue; - TakeDamage(e, amount, source, sourceMob); - } - - return; - } - InitializeDamageType(damageType); - - int oldValue = _currentDamage[damageType]; - int oldTotalValue = -1; - - if (amount == 0) - { - return; - } - - amount = Resistances.CalculateDamage(damageType, amount); - _currentDamage[damageType] = Math.Max(0, _currentDamage[damageType] + amount); - UpdateForDamageType(damageType, oldValue); - - Damaged?.Invoke(this, new DamageEventArgs(damageType, amount, source, sourceMob)); - - if (Resistances.AppliesToTotal(damageType)) - { - oldTotalValue = _currentDamage[DamageType.Total]; - _currentDamage[DamageType.Total] = Math.Max(0, _currentDamage[DamageType.Total] + amount); - UpdateForDamageType(DamageType.Total, oldTotalValue); - } - } - - /// - public void TakeHealing(DamageType damageType, int amount, IEntity source = null, IEntity sourceMob = null) - { - if (damageType == DamageType.Total) - { - throw new ArgumentException("Cannot heal for DamageType.Total"); - } - TakeDamage(damageType, -amount, source, sourceMob); - } - - public void HealAllDamage() - { - var values = Enum.GetValues(typeof(DamageType)).Cast(); - foreach (var damageType in values) - { - if (CurrentDamage.ContainsKey(damageType) && damageType != DamageType.Total) - { - TakeHealing(damageType, CurrentDamage[damageType]); - } - } - } - - void UpdateForDamageType(DamageType damageType, int oldValue) - { - int change = _currentDamage[damageType] - oldValue; - - if (change == 0) - { - return; - } - - int changeSign = Math.Sign(change); - - foreach (var threshold in Thresholds[damageType]) - { - var value = threshold.Value; - if (((value * changeSign) > (oldValue * changeSign)) && ((value * changeSign) <= (_currentDamage[damageType] * changeSign))) - { - var excessDamage = change - value; - var typeOfDamage = damageType; - if (change - value < 0) - { - excessDamage = 0; - } - var args = new DamageThresholdPassedEventArgs(threshold, (changeSign > 0), excessDamage); - DamageThresholdPassed?.Invoke(this, args); - } - } - } - - void RecalculateComponentThresholds() - { - foreach (IOnDamageBehavior onDamageBehaviorComponent in Owner.GetAllComponents()) - { - AddThresholdsFrom(onDamageBehaviorComponent); - } - } - - void AddThresholdsFrom(IOnDamageBehavior onDamageBehavior) - { - if (onDamageBehavior == null) - { - throw new ArgumentNullException(nameof(onDamageBehavior)); - } - - List thresholds = onDamageBehavior.GetAllDamageThresholds(); - - if (thresholds == null) - return; - - foreach (DamageThreshold threshold in thresholds) - { - if (!Thresholds[threshold.DamageType].Contains(threshold)) - { - Thresholds[threshold.DamageType].Add(threshold); - } - } - - DamageThresholdPassed += onDamageBehavior.OnDamageThresholdPassed; - } - - void InitializeDamageType(DamageType damageType) - { - if (!_currentDamage.ContainsKey(damageType)) - { - _currentDamage.Add(damageType, 0); - Thresholds.Add(damageType, new List()); - } - } - } -} - diff --git a/Content.Server/GameObjects/Components/Damage/DestructibleComponent.cs b/Content.Server/GameObjects/Components/Damage/DestructibleComponent.cs index 86a7abb03f..b808bc6c76 100644 --- a/Content.Server/GameObjects/Components/Damage/DestructibleComponent.cs +++ b/Content.Server/GameObjects/Components/Damage/DestructibleComponent.cs @@ -1,55 +1,49 @@ -using System.Collections.Generic; -using Content.Server.GameObjects.EntitySystems; -using Content.Server.Interfaces.GameObjects; -using Content.Shared.GameObjects.Components.Damage; +using Content.Shared.GameObjects.Components.Damage; +using Content.Shared.GameObjects.EntitySystems; using Robust.Server.GameObjects.EntitySystems; using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Systems; using Robust.Shared.Interfaces.GameObjects; -using Robust.Shared.Interfaces.Random; using Robust.Shared.IoC; -using Robust.Shared.Random; using Robust.Shared.Serialization; -using Robust.Shared.ViewVariables; namespace Content.Server.GameObjects.Components.Damage { /// - /// Deletes the entity once a certain damage threshold has been reached. + /// When attached to an , allows it to take damage and deletes it after taking enough damage. /// [RegisterComponent] - public class DestructibleComponent : Component, IOnDamageBehavior, IDestroyAct, IExAct + [ComponentReference(typeof(IDamageableComponent))] + public class DestructibleComponent : RuinableComponent, IDestroyAct { - #pragma warning disable 649 +#pragma warning disable 649 [Dependency] private readonly IEntitySystemManager _entitySystemManager; - #pragma warning restore 649 +#pragma warning restore 649 + + protected ActSystem _actSystem; + + protected string _spawnOnDestroy; /// public override string Name => "Destructible"; /// - /// Damage threshold calculated from the values - /// given in the prototype declaration. + /// Entity spawned upon destruction. /// - [ViewVariables] - public DamageThreshold Threshold { get; private set; } + public string SpawnOnDestroy => _spawnOnDestroy; - public DamageType damageType = DamageType.Total; - public int damageValue = 0; - public string spawnOnDestroy = ""; - public string destroySound = ""; - public bool destroyed = false; - - ActSystem _actSystem; + void IDestroyAct.OnDestroy(DestructionEventArgs eventArgs) + { + if (!string.IsNullOrWhiteSpace(_spawnOnDestroy) && eventArgs.IsSpawnWreck) + { + Owner.EntityManager.SpawnEntity(_spawnOnDestroy, Owner.Transform.GridPosition); + } + } public override void ExposeData(ObjectSerializer serializer) { base.ExposeData(serializer); - - serializer.DataField(ref damageValue, "thresholdvalue", 100); - serializer.DataField(ref damageType, "thresholdtype", DamageType.Total); - serializer.DataField(ref spawnOnDestroy, "spawnondestroy", ""); - serializer.DataField(ref destroySound, "destroysound", ""); + serializer.DataField(ref _spawnOnDestroy, "spawnondestroy", string.Empty); } public override void Initialize() @@ -58,57 +52,18 @@ namespace Content.Server.GameObjects.Components.Damage _actSystem = _entitySystemManager.GetEntitySystem(); } - /// - List IOnDamageBehavior.GetAllDamageThresholds() - { - Threshold = new DamageThreshold(damageType, damageValue, ThresholdType.Destruction); - return new List() { Threshold }; - } - /// - void IOnDamageBehavior.OnDamageThresholdPassed(object obj, DamageThresholdPassedEventArgs e) + protected override void DestructionBehavior() { - if (e.Passed && e.DamageThreshold == Threshold && destroyed == false) + if (!Owner.Deleted) { - destroyed = true; var pos = Owner.Transform.GridPosition; - _actSystem.HandleDestruction(Owner, true); - if(destroySound != string.Empty) + _actSystem.HandleDestruction(Owner, + true); //This will call IDestroyAct.OnDestroy on this component (and all other components on this entity) + if (DestroySound != string.Empty) { - EntitySystem.Get().PlayAtCoords(destroySound, pos); + EntitySystem.Get().PlayAtCoords(DestroySound, pos); } - - - } - - } - - void IExAct.OnExplosion(ExplosionEventArgs eventArgs) - { - var prob = IoCManager.Resolve(); - switch (eventArgs.Severity) - { - case ExplosionSeverity.Destruction: - _actSystem.HandleDestruction(Owner, false); - break; - case ExplosionSeverity.Heavy: - var spawnWreckOnHeavy = prob.Prob(0.5f); - _actSystem.HandleDestruction(Owner, spawnWreckOnHeavy); - break; - case ExplosionSeverity.Light: - if (prob.Prob(0.4f)) - _actSystem.HandleDestruction(Owner, true); - break; - } - - } - - - void IDestroyAct.OnDestroy(DestructionEventArgs eventArgs) - { - if (!string.IsNullOrWhiteSpace(spawnOnDestroy) && eventArgs.IsSpawnWreck) - { - Owner.EntityManager.SpawnEntity(spawnOnDestroy, Owner.Transform.GridPosition); } } } diff --git a/Content.Server/GameObjects/Components/Damage/ResistanceSet.cs b/Content.Server/GameObjects/Components/Damage/ResistanceSet.cs deleted file mode 100644 index e9a5e941a1..0000000000 --- a/Content.Server/GameObjects/Components/Damage/ResistanceSet.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; -using System.Collections.Generic; -using Content.Shared.GameObjects.Components.Damage; -using Robust.Shared.Interfaces.Serialization; -using Robust.Shared.Serialization; -using Robust.Shared.ViewVariables; - -namespace Content.Server.GameObjects.Components.Damage -{ - /// - /// Resistance set used by damageable objects. - /// For each damage type, has a coefficient, damage reduction and "included in total" value. - /// - public class ResistanceSet : IExposeData - { - public static ResistanceSet DefaultResistanceSet = new ResistanceSet(); - - [ViewVariables] - private readonly Dictionary _resistances = new Dictionary(); - - public ResistanceSet() - { - foreach (DamageType damageType in Enum.GetValues(typeof(DamageType))) - { - _resistances[damageType] = new ResistanceSetSettings(); - } - } - - public void ExposeData(ObjectSerializer serializer) - { - foreach (DamageType damageType in Enum.GetValues(typeof(DamageType))) - { - var resistanceName = damageType.ToString().ToLower(); - serializer.DataReadFunction(resistanceName, new ResistanceSetSettings(), resistanceSetting => - { - _resistances[damageType] = resistanceSetting; - }); - } - } - - /// - /// Adjusts input damage with the resistance set values. - /// - /// Type of the damage. - /// Incoming amount of the damage. - /// Damage adjusted by the resistance set. - public int CalculateDamage(DamageType damageType, int amount) - { - if (amount > 0) //if it's damage, reduction applies - { - amount -= _resistances[damageType].DamageReduction; - - if (amount <= 0) - return 0; - } - - amount = (int)Math.Floor(amount * _resistances[damageType].Coefficient); - - return amount; - } - - public bool AppliesToTotal(DamageType damageType) - { - //Damage that goes straight to total (for whatever reason) never applies twice - - return damageType != DamageType.Total && _resistances[damageType].AppliesToTotal; - } - - /// - /// Settings for a specific damage type in a resistance set. - /// - public class ResistanceSetSettings : IExposeData - { - public float Coefficient { get; private set; } = 1; - public int DamageReduction { get; private set; } = 0; - public bool AppliesToTotal { get; private set; } = true; - - public void ExposeData(ObjectSerializer serializer) - { - serializer.DataField(this, x => Coefficient, "coefficient", 1); - serializer.DataField(this, x => DamageReduction, "damageReduction", 0); - serializer.DataField(this, x => AppliesToTotal, "appliesToTotal", true); - } - } - } -} diff --git a/Content.Server/GameObjects/Components/Damage/RuinableComponent.cs b/Content.Server/GameObjects/Components/Damage/RuinableComponent.cs new file mode 100644 index 0000000000..7137171f34 --- /dev/null +++ b/Content.Server/GameObjects/Components/Damage/RuinableComponent.cs @@ -0,0 +1,84 @@ +using System.Collections.Generic; +using Content.Shared.GameObjects.Components.Damage; +using Robust.Server.GameObjects.EntitySystems; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Systems; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Serialization; + +namespace Content.Server.GameObjects.Components.Damage +{ + /// + /// When attached to an , allows it to take damage and + /// "ruins" or "destroys" it after enough damage is taken. + /// + [ComponentReference(typeof(IDamageableComponent))] + public abstract class RuinableComponent : DamageableComponent + { + private DamageState _currentDamageState; + + /// + /// How much HP this component can sustain before triggering + /// . + /// + public int MaxHp { get; private set; } + + /// + /// Sound played upon destruction. + /// + protected string DestroySound { get; private set; } + + public override List SupportedDamageStates => + new List {DamageState.Alive, DamageState.Dead}; + + public override DamageState CurrentDamageState => _currentDamageState; + + public override void Initialize() + { + base.Initialize(); + HealthChangedEvent += OnHealthChanged; + } + + public override void ExposeData(ObjectSerializer serializer) + { + base.ExposeData(serializer); + + serializer.DataField(this, ruinable => ruinable.MaxHp, "maxHP", 100); + serializer.DataField(this, ruinable => ruinable.DestroySound, "destroySound", string.Empty); + } + + public override void OnRemove() + { + base.OnRemove(); + HealthChangedEvent -= OnHealthChanged; + } + + private void OnHealthChanged(HealthChangedEventArgs e) + { + if (CurrentDamageState != DamageState.Dead && TotalDamage >= MaxHp) + { + PerformDestruction(); + } + } + + /// + /// Destroys the Owner , setting + /// to + /// + /// + protected void PerformDestruction() + { + _currentDamageState = DamageState.Dead; + + if (!Owner.Deleted && DestroySound != string.Empty) + { + var pos = Owner.Transform.GridPosition; + EntitySystem.Get().PlayAtCoords(DestroySound, pos); + } + + DestructionBehavior(); + } + + protected abstract void DestructionBehavior(); + } +} diff --git a/Content.Server/GameObjects/Components/Disposal/DisposalHolderComponent.cs b/Content.Server/GameObjects/Components/Disposal/DisposalHolderComponent.cs index f74eecb284..ee39a57d76 100644 --- a/Content.Server/GameObjects/Components/Disposal/DisposalHolderComponent.cs +++ b/Content.Server/GameObjects/Components/Disposal/DisposalHolderComponent.cs @@ -1,7 +1,7 @@ #nullable enable using System.Linq; using Content.Server.GameObjects.Components.Items.Storage; -using Content.Server.GameObjects.Components.Mobs; +using Content.Shared.GameObjects.Components.Body; using Robust.Server.GameObjects.Components.Container; using Robust.Shared.Containers; using Robust.Shared.GameObjects; @@ -49,7 +49,7 @@ namespace Content.Server.GameObjects.Components.Disposal } return entity.HasComponent() || - entity.HasComponent(); + entity.HasComponent(); } public bool TryInsert(IEntity entity) diff --git a/Content.Server/GameObjects/Components/Disposal/DisposalTubeComponent.cs b/Content.Server/GameObjects/Components/Disposal/DisposalTubeComponent.cs index 29d5132925..37b2f2275e 100644 --- a/Content.Server/GameObjects/Components/Disposal/DisposalTubeComponent.cs +++ b/Content.Server/GameObjects/Components/Disposal/DisposalTubeComponent.cs @@ -1,9 +1,9 @@ #nullable enable using System; using System.Linq; -using Content.Server.GameObjects.EntitySystems; using Content.Shared.GameObjects.Components.Disposal; using Content.Shared.GameObjects.Verbs; +using Content.Shared.GameObjects.EntitySystems; using Content.Shared.Interfaces; using Robust.Server.Console; using Robust.Server.GameObjects; diff --git a/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs b/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs index 89a6049b66..3fd51adb20 100644 --- a/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs +++ b/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs @@ -5,10 +5,10 @@ using System.Linq; using System.Threading; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; -using Content.Server.GameObjects.Components.Mobs; using Content.Server.GameObjects.Components.Power.ApcNetComponents; using Content.Server.Interfaces; using Content.Server.Interfaces.GameObjects.Components.Items; +using Content.Shared.GameObjects.Components.Body; using Content.Shared.GameObjects.Components.Disposal; using Content.Shared.GameObjects.EntitySystems; using Content.Shared.GameObjects.Verbs; @@ -122,7 +122,7 @@ namespace Content.Server.GameObjects.Components.Disposal } if (!entity.HasComponent() && - !entity.HasComponent()) + !entity.HasComponent()) { return false; } diff --git a/Content.Server/GameObjects/Components/Doors/ServerDoorComponent.cs b/Content.Server/GameObjects/Components/Doors/ServerDoorComponent.cs index 7f4228b272..ba2bc39377 100644 --- a/Content.Server/GameObjects/Components/Doors/ServerDoorComponent.cs +++ b/Content.Server/GameObjects/Components/Doors/ServerDoorComponent.cs @@ -3,9 +3,10 @@ using System.Linq; using System.Threading; using Content.Server.GameObjects.Components.Access; using Content.Server.GameObjects.Components.Atmos; -using Content.Server.GameObjects.Components.Damage; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Mobs; +using Content.Shared.Damage; +using Content.Shared.GameObjects.Components.Body; using Content.Shared.GameObjects.Components.Damage; using Content.Shared.GameObjects.Components.Doors; using Content.Shared.GameObjects.Components.Movement; @@ -113,7 +114,7 @@ namespace Content.Server.GameObjects.Components.Doors // Disabled because it makes it suck hard to walk through double doors. - if (entity.HasComponent(typeof(SpeciesComponent))) + if (entity.HasComponent()) { if (!entity.TryGetComponent(out var mover)) return; @@ -237,7 +238,7 @@ namespace Content.Server.GameObjects.Components.Doors foreach (var e in collidesWith) { if (!e.TryGetComponent(out StunnableComponent stun) - || !e.TryGetComponent(out DamageableComponent damage) + || !e.TryGetComponent(out IDamageableComponent damage) || !e.TryGetComponent(out ICollidableComponent otherBody) || !Owner.TryGetComponent(out ICollidableComponent body)) continue; @@ -247,7 +248,7 @@ namespace Content.Server.GameObjects.Components.Doors if (percentage < 0.1f) continue; - damage.TakeDamage(DamageType.Brute, DoorCrushDamage); + damage.ChangeDamage(DamageType.Blunt, DoorCrushDamage, false, Owner); stun.Paralyze(DoorStunTime); hitSomeone = true; } diff --git a/Content.Server/GameObjects/Components/Explosion/ExplosiveComponent.cs b/Content.Server/GameObjects/Components/Explosion/ExplosiveComponent.cs index f23c611e24..39b49c13fb 100644 --- a/Content.Server/GameObjects/Components/Explosion/ExplosiveComponent.cs +++ b/Content.Server/GameObjects/Components/Explosion/ExplosiveComponent.cs @@ -1,5 +1,6 @@ using Content.Server.Explosions; using Content.Server.GameObjects.EntitySystems; +using Content.Shared.GameObjects.EntitySystems; using Robust.Shared.GameObjects; using Robust.Shared.Serialization; diff --git a/Content.Server/GameObjects/Components/Explosion/FlashExplosiveComponent.cs b/Content.Server/GameObjects/Components/Explosion/FlashExplosiveComponent.cs index a547e5f0b3..c8d6120edd 100644 --- a/Content.Server/GameObjects/Components/Explosion/FlashExplosiveComponent.cs +++ b/Content.Server/GameObjects/Components/Explosion/FlashExplosiveComponent.cs @@ -1,6 +1,7 @@ using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Weapon; using Content.Server.GameObjects.EntitySystems; +using Content.Shared.GameObjects.EntitySystems; using Robust.Server.GameObjects.EntitySystems; using Robust.Shared.Containers; using Robust.Shared.GameObjects; diff --git a/Content.Server/GameObjects/Components/GUI/HandsComponent.cs b/Content.Server/GameObjects/Components/GUI/HandsComponent.cs index 6336845970..572e504f53 100644 --- a/Content.Server/GameObjects/Components/GUI/HandsComponent.cs +++ b/Content.Server/GameObjects/Components/GUI/HandsComponent.cs @@ -8,11 +8,11 @@ using Content.Server.GameObjects.Components.Mobs; using Content.Server.GameObjects.Components.Movement; using Content.Server.GameObjects.EntitySystems.Click; using Content.Server.Interfaces.GameObjects.Components.Interaction; +using Content.Shared.GameObjects.Components.Body; using Content.Server.Interfaces.GameObjects.Components.Items; using Content.Shared.GameObjects.Components.Items; using Content.Shared.GameObjects.Components.Mobs; using Content.Shared.GameObjects.EntitySystems; -using Content.Shared.Health.BodySystem; using Content.Shared.Physics.Pull; using Robust.Server.GameObjects; using Robust.Server.GameObjects.Components.Container; diff --git a/Content.Server/GameObjects/Components/Gravity/GravityGeneratorComponent.cs b/Content.Server/GameObjects/Components/Gravity/GravityGeneratorComponent.cs index 637933dd06..d47f94fd93 100644 --- a/Content.Server/GameObjects/Components/Gravity/GravityGeneratorComponent.cs +++ b/Content.Server/GameObjects/Components/Gravity/GravityGeneratorComponent.cs @@ -5,6 +5,7 @@ using Content.Server.GameObjects.EntitySystems; using Content.Server.Interfaces; using Content.Shared.GameObjects.Components.Gravity; using Content.Shared.GameObjects.Components.Interactable; +using Content.Shared.GameObjects.EntitySystems; using Content.Shared.Interfaces.GameObjects.Components; using Robust.Server.GameObjects; using Robust.Server.GameObjects.Components.UserInterface; @@ -18,7 +19,7 @@ using Robust.Shared.Serialization; namespace Content.Server.GameObjects.Components.Gravity { [RegisterComponent] - public class GravityGeneratorComponent: SharedGravityGeneratorComponent, IInteractUsing, IBreakAct, IInteractHand + public class GravityGeneratorComponent : SharedGravityGeneratorComponent, IInteractUsing, IBreakAct, IInteractHand { private BoundUserInterface _userInterface; @@ -106,10 +107,8 @@ namespace Content.Server.GameObjects.Components.Gravity return false; // Repair generator - var damageable = Owner.GetComponent(); var breakable = Owner.GetComponent(); - damageable.HealAllDamage(); - breakable.broken = false; + breakable.FixAllDamage(); _intact = true; var notifyManager = IoCManager.Resolve(); @@ -130,13 +129,16 @@ namespace Content.Server.GameObjects.Components.Gravity if (!Intact) { MakeBroken(); - } else if (!Powered) + } + else if (!Powered) { MakeUnpowered(); - } else if (!SwitchedOn) + } + else if (!SwitchedOn) { MakeOff(); - } else + } + else { MakeOn(); } diff --git a/Content.Server/GameObjects/Components/Healing/HealingComponent.cs b/Content.Server/GameObjects/Components/Healing/HealingComponent.cs deleted file mode 100644 index 65bbf4154a..0000000000 --- a/Content.Server/GameObjects/Components/Healing/HealingComponent.cs +++ /dev/null @@ -1,71 +0,0 @@ -using Content.Server.GameObjects.Components.Damage; -using Content.Server.GameObjects.Components.Stack; -using Content.Server.Utility; -using Content.Shared.GameObjects.Components.Damage; -using Content.Shared.Interfaces.GameObjects.Components; -using Robust.Shared.GameObjects; -using Robust.Shared.Serialization; - -namespace Content.Server.GameObjects.Components.Healing -{ - [RegisterComponent] - public class HealingComponent : Component, IAfterInteract, IUse - { - public override string Name => "Healing"; - - public int Heal = 100; - public DamageType Damage = DamageType.Brute; - - public override void ExposeData(ObjectSerializer serializer) - { - base.ExposeData(serializer); - - serializer.DataField(ref Heal, "heal", 100); - serializer.DataField(ref Damage, "damage", DamageType.Brute); - } - - void IAfterInteract.AfterInteract(AfterInteractEventArgs eventArgs) - { - if (!InteractionChecks.InRangeUnobstructed(eventArgs)) return; - - if (eventArgs.Target == null) - { - return; - } - - if (!eventArgs.Target.TryGetComponent(out DamageableComponent damagecomponent)) return; - if (Owner.TryGetComponent(out StackComponent stackComponent)) - { - if (!stackComponent.Use(1)) - { - Owner.Delete(); - return; - } - - damagecomponent.TakeHealing(Damage, Heal); - return; - } - damagecomponent.TakeHealing(Damage, Heal); - Owner.Delete(); - } - - bool IUse.UseEntity(UseEntityEventArgs eventArgs) - { - if (!eventArgs.User.TryGetComponent(out DamageableComponent damagecomponent)) return false; - if (Owner.TryGetComponent(out StackComponent stackComponent)) - { - if (!stackComponent.Use(1)) - { - Owner.Delete(); - return false; - } - - damagecomponent.TakeHealing(Damage, Heal); - return false; - } - damagecomponent.TakeHealing(Damage, Heal); - Owner.Delete(); - return false; - } - } -} diff --git a/Content.Server/GameObjects/Components/Interactable/WelderComponent.cs b/Content.Server/GameObjects/Components/Interactable/WelderComponent.cs index f85e7b64ea..3b96b57733 100644 --- a/Content.Server/GameObjects/Components/Interactable/WelderComponent.cs +++ b/Content.Server/GameObjects/Components/Interactable/WelderComponent.cs @@ -239,8 +239,9 @@ namespace Content.Server.GameObjects.Components.Interactable chat.EntityMe(victim, Loc.GetString("welds {0:their} every orifice closed! It looks like {0:theyre} trying to commit suicide!", victim)); //TODO: theyre macro return SuicideKind.Heat; } + chat.EntityMe(victim, Loc.GetString("bashes {0:themselves} with the {1}!", victim, Owner.Name)); - return SuicideKind.Brute; + return SuicideKind.Blunt; } public void SolutionChanged(SolutionChangeEventArgs eventArgs) diff --git a/Content.Server/GameObjects/Components/Items/Storage/EntityStorageComponent.cs b/Content.Server/GameObjects/Components/Items/Storage/EntityStorageComponent.cs index 73d1fd09ca..df502ee9aa 100644 --- a/Content.Server/GameObjects/Components/Items/Storage/EntityStorageComponent.cs +++ b/Content.Server/GameObjects/Components/Items/Storage/EntityStorageComponent.cs @@ -1,10 +1,12 @@ using System; using System.Linq; +using Content.Server.GameObjects.Components.Body; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Interactable; using Content.Server.GameObjects.Components.Mobs; using Content.Server.GameObjects.EntitySystems; using Content.Shared.GameObjects.Components.Interactable; +using Content.Shared.GameObjects.Components.Mobs; using Content.Shared.GameObjects.Components.Storage; using Content.Shared.GameObjects.EntitySystems; using Content.Shared.GameObjects.Verbs; @@ -168,7 +170,8 @@ namespace Content.Server.GameObjects.Components.Items.Storage continue; // only items that can be stored in an inventory, or a mob, can be eaten by a locker - if (!entity.HasComponent() && !entity.HasComponent()) + if (!entity.HasComponent() && + !entity.HasComponent()) continue; if (!AddToContents(entity)) diff --git a/Content.Server/GameObjects/Components/Items/Storage/ItemComponent.cs b/Content.Server/GameObjects/Components/Items/Storage/ItemComponent.cs index 67eca347f2..a82183da4f 100644 --- a/Content.Server/GameObjects/Components/Items/Storage/ItemComponent.cs +++ b/Content.Server/GameObjects/Components/Items/Storage/ItemComponent.cs @@ -91,7 +91,7 @@ namespace Content.Server.GameObjects.Components.Items.Storage return false; } - if (Owner.TryGetComponent(out CollidableComponent physics) && + if (Owner.TryGetComponent(out ICollidableComponent physics) && physics.Anchored) { return false; diff --git a/Content.Server/GameObjects/Components/Kitchen/MicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/MicrowaveComponent.cs index 51b79141f9..672f09c14a 100644 --- a/Content.Server/GameObjects/Components/Kitchen/MicrowaveComponent.cs +++ b/Content.Server/GameObjects/Components/Kitchen/MicrowaveComponent.cs @@ -1,18 +1,20 @@ using System; using System.Collections.Generic; using System.Linq; +using Content.Server.GameObjects.Components.Body; +using Robust.Shared.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.ViewVariables; using Content.Server.GameObjects.Components.Chemistry; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Power.ApcNetComponents; using Content.Server.GameObjects.EntitySystems; -using Content.Server.Health.BodySystem; using Content.Server.Interfaces; using Content.Server.Interfaces.Chat; using Content.Server.Interfaces.GameObjects; using Content.Shared.Chemistry; using Content.Shared.GameObjects.Components.Power; -using Content.Shared.Health.BodySystem; using Content.Shared.Interfaces; using Content.Shared.Interfaces.GameObjects.Components; using Content.Shared.Kitchen; @@ -23,14 +25,12 @@ using Robust.Server.GameObjects.Components.UserInterface; using Robust.Server.GameObjects.EntitySystems; using Robust.Server.Interfaces.GameObjects; using Robust.Shared.Audio; -using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Systems; +using Content.Shared.GameObjects.Components.Body; using Robust.Shared.Interfaces.GameObjects; -using Robust.Shared.IoC; using Robust.Shared.Localization; using Robust.Shared.Serialization; using Robust.Shared.Timers; -using Robust.Shared.ViewVariables; namespace Content.Server.GameObjects.Components.Kitchen { @@ -456,13 +456,19 @@ namespace Content.Server.GameObjects.Components.Kitchen public SuicideKind Suicide(IEntity victim, IChatManager chat) { - int headCount = 0; + var headCount = 0; if (victim.TryGetComponent(out var bodyManagerComponent)) { var heads = bodyManagerComponent.GetBodyPartsOfType(BodyPartType.Head); foreach (var head in heads) { - var droppedHead = bodyManagerComponent.DropBodyPart(head); + var droppedHead = bodyManagerComponent.DropPart(head); + + if (droppedHead == null) + { + continue; + } + _storage.Insert(droppedHead); headCount++; } diff --git a/Content.Server/GameObjects/Components/Medical/MedicalScannerComponent.cs b/Content.Server/GameObjects/Components/Medical/MedicalScannerComponent.cs index c6a051b2c4..4e36ffed71 100644 --- a/Content.Server/GameObjects/Components/Medical/MedicalScannerComponent.cs +++ b/Content.Server/GameObjects/Components/Medical/MedicalScannerComponent.cs @@ -1,7 +1,5 @@ using System; using System.Collections.Generic; -using Content.Server.GameObjects.Components.Damage; -using Content.Server.GameObjects.Components.Mobs; using Content.Server.GameObjects.Components.Power.ApcNetComponents; using Content.Shared.GameObjects.Components.Damage; using Content.Shared.GameObjects.Components.Medical; @@ -15,7 +13,8 @@ using Robust.Server.Interfaces.GameObjects; using Robust.Shared.GameObjects; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Maths; -using Robust.Shared.Utility; +using Content.Shared.Damage; +using Robust.Shared.Localization; namespace Content.Server.GameObjects.Components.Medical { @@ -35,19 +34,21 @@ namespace Content.Server.GameObjects.Components.Medical public override void Initialize() { base.Initialize(); + _appearance = Owner.GetComponent(); _userInterface = Owner.GetComponent() .GetBoundUserInterface(MedicalScannerUiKey.Key); _bodyContainer = ContainerManagerComponent.Ensure($"{Name}-bodyContainer", Owner); _powerReceiver = Owner.GetComponent(); + UpdateUserInterface(); } private static readonly MedicalScannerBoundUserInterfaceState EmptyUIState = new MedicalScannerBoundUserInterfaceState( - 0, - 0, - null); + null, + new Dictionary(), + new Dictionary()); private MedicalScannerBoundUserInterfaceState GetUserInterfaceState() { @@ -58,49 +59,36 @@ namespace Content.Server.GameObjects.Components.Medical return EmptyUIState; } - var damageable = body.GetComponent(); - var species = body.GetComponent(); - var deathThreshold = - species.DamageTemplate.DamageThresholds.FirstOrNull(x => x.ThresholdType == ThresholdType.Death); - if (!deathThreshold.HasValue) + if (!body.TryGetComponent(out IDamageableComponent damageable) || + damageable.CurrentDamageState == DamageState.Dead) { return EmptyUIState; } - var deathThresholdValue = deathThreshold.Value.Value; - var currentHealth = damageable.CurrentDamage[DamageType.Total]; + var classes = new Dictionary(damageable.DamageClasses); + var types = new Dictionary(damageable.DamageTypes); - var dmgDict = new Dictionary(); - - foreach (var dmgType in (DamageType[]) Enum.GetValues(typeof(DamageType))) - { - if (damageable.CurrentDamage.TryGetValue(dmgType, out var amount)) - { - dmgDict[dmgType.ToString()] = amount; - } - } - - return new MedicalScannerBoundUserInterfaceState( - deathThresholdValue - currentHealth, - deathThresholdValue, - dmgDict); + return new MedicalScannerBoundUserInterfaceState(body.Uid, classes, types); } private void UpdateUserInterface() { if (!Powered) + { return; + } + var newState = GetUserInterfaceState(); _userInterface.SetState(newState); } - private MedicalScannerStatus GetStatusFromDamageState(IDamageState damageState) + private MedicalScannerStatus GetStatusFromDamageState(DamageState damageState) { switch (damageState) { - case NormalState _: return MedicalScannerStatus.Green; - case CriticalState _: return MedicalScannerStatus.Red; - case DeadState _: return MedicalScannerStatus.Death; + case DamageState.Alive: return MedicalScannerStatus.Green; + case DamageState.Critical: return MedicalScannerStatus.Red; + case DamageState.Dead: return MedicalScannerStatus.Death; default: throw new ArgumentException(nameof(damageState)); } } @@ -109,7 +97,7 @@ namespace Content.Server.GameObjects.Components.Medical var body = _bodyContainer.ContainedEntity; return body == null ? MedicalScannerStatus.Open - : GetStatusFromDamageState(body.GetComponent().CurrentDamageState); + : GetStatusFromDamageState(body.GetComponent().CurrentDamageState); } private void UpdateAppearance() @@ -141,7 +129,7 @@ namespace Content.Server.GameObjects.Components.Medical return; } - data.Text = "Enter"; + data.Text = Loc.GetString("Enter"); data.Visibility = component.IsOccupied ? VerbVisibility.Invisible : VerbVisibility.Visible; } @@ -162,7 +150,7 @@ namespace Content.Server.GameObjects.Components.Medical return; } - data.Text = "Eject"; + data.Text = Loc.GetString("Eject"); data.Visibility = component.IsOccupied ? VerbVisibility.Visible : VerbVisibility.Invisible; } @@ -195,6 +183,7 @@ namespace Content.Server.GameObjects.Components.Medical // There's no need to update if there's no one inside return; } + UpdateUserInterface(); UpdateAppearance(); } diff --git a/Content.Server/GameObjects/Components/Metabolism/BloodstreamComponent.cs b/Content.Server/GameObjects/Components/Metabolism/BloodstreamComponent.cs deleted file mode 100644 index e428c72f17..0000000000 --- a/Content.Server/GameObjects/Components/Metabolism/BloodstreamComponent.cs +++ /dev/null @@ -1,111 +0,0 @@ -using System.Linq; -using Content.Server.GameObjects.Components.Chemistry; -using Content.Server.GameObjects.EntitySystems; -using Content.Shared.Chemistry; -using Robust.Shared.GameObjects; -using Robust.Shared.IoC; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization; -using Robust.Shared.ViewVariables; - -namespace Content.Server.GameObjects.Components.Metabolism -{ - /// - /// Handles all metabolism for mobs. All delivery methods eventually bring reagents - /// to the bloodstream. For example, injectors put reagents directly into the bloodstream, - /// and the stomach does with some delay. - /// - [RegisterComponent] - public class BloodstreamComponent : Component - { -#pragma warning disable 649 - [Dependency] private readonly IPrototypeManager _prototypeManager; -#pragma warning restore 649 - - public override string Name => "Bloodstream"; - - /// - /// Internal solution for reagent storage - /// - [ViewVariables] - private SolutionComponent _internalSolution; - - /// - /// Max volume of internal solution storage - /// - [ViewVariables] - private ReagentUnit _initialMaxVolume; - - /// - /// Empty volume of internal solution - /// - public ReagentUnit EmptyVolume => _internalSolution.EmptyVolume; - - public override void ExposeData(ObjectSerializer serializer) - { - base.ExposeData(serializer); - serializer.DataField(ref _initialMaxVolume, "maxVolume", ReagentUnit.New(250)); - } - - protected override void Startup() - { - base.Startup(); - _internalSolution = Owner.GetComponent(); - _internalSolution.MaxVolume = _initialMaxVolume; - } - - /// - /// Attempt to transfer provided solution to internal solution. Only supports complete transfers - /// - /// Solution to be transferred - /// Whether or not transfer was a success - public bool TryTransferSolution(Solution solution) - { - //For now doesn't support partial transfers - if (solution.TotalVolume + _internalSolution.CurrentVolume > _internalSolution.MaxVolume) - { - return false; - } - - _internalSolution.TryAddSolution(solution, false, true); - return true; - } - - /// - /// Loops through each reagent in _internalSolution, and calls the IMetabolizable for each of them./> - /// - /// The time since the last metabolism tick in seconds. - private void Metabolize(float tickTime) - { - if (_internalSolution.CurrentVolume == 0) - { - return; - } - - //Run metabolism for each reagent, remove metabolized reagents - foreach (var reagent in _internalSolution.ReagentList.ToList()) //Using ToList here lets us edit reagents while iterating - { - if (!_prototypeManager.TryIndex(reagent.ReagentId, out ReagentPrototype proto)) - { - continue; - } - - //Run metabolism code for each reagent - foreach (var metabolizable in proto.Metabolism) - { - var reagentDelta = metabolizable.Metabolize(Owner, reagent.ReagentId, tickTime); - _internalSolution.TryRemoveReagent(reagent.ReagentId, reagentDelta); - } - } - } - - /// - /// Triggers metabolism of the reagents inside _internalSolution. Called by - /// - /// The time since the last metabolism tick in seconds. - public void OnUpdate(float tickTime) - { - Metabolize(tickTime); - } - } -} diff --git a/Content.Server/GameObjects/Components/Metabolism/MetabolismComponent.cs b/Content.Server/GameObjects/Components/Metabolism/MetabolismComponent.cs new file mode 100644 index 0000000000..913d571dd6 --- /dev/null +++ b/Content.Server/GameObjects/Components/Metabolism/MetabolismComponent.cs @@ -0,0 +1,249 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Content.Server.Atmos; +using Content.Server.GameObjects.Components.Atmos; +using Content.Server.GameObjects.Components.Body.Circulatory; +using Content.Shared.Atmos; +using Content.Shared.Chemistry; +using Content.Shared.Damage; +using Content.Shared.GameObjects.Components.Damage; +using Content.Shared.Interfaces.Chemistry; +using Robust.Shared.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; + +namespace Content.Server.GameObjects.Components.Metabolism +{ + [RegisterComponent] + public class MetabolismComponent : Component + { +#pragma warning disable 649 + [Dependency] private readonly IPrototypeManager _prototypeManager; +#pragma warning restore 649 + + public override string Name => "Metabolism"; + + private float _accumulatedFrameTime; + + [ViewVariables(VVAccess.ReadWrite)] private int _suffocationDamage; + + [ViewVariables] public Dictionary NeedsGases { get; set; } + + [ViewVariables] public Dictionary ProducesGases { get; set; } + + [ViewVariables] public Dictionary DeficitGases { get; set; } + + [ViewVariables] public bool Suffocating => SuffocatingPercentage() > 0; + + public override void ExposeData(ObjectSerializer serializer) + { + base.ExposeData(serializer); + + serializer.DataField(this, b => b.NeedsGases, "needsGases", new Dictionary()); + serializer.DataField(this, b => b.ProducesGases, "producesGases", new Dictionary()); + serializer.DataField(this, b => b.DeficitGases, "deficitGases", new Dictionary()); + serializer.DataField(ref _suffocationDamage, "suffocationDamage", 1); + } + + private Dictionary NeedsAndDeficit(float frameTime) + { + var needs = new Dictionary(NeedsGases); + foreach (var (gas, amount) in DeficitGases) + { + var newAmount = (needs.GetValueOrDefault(gas) + amount) * frameTime; + needs[gas] = newAmount; + } + + return needs; + } + + private void ClampDeficit() + { + var deficitGases = new Dictionary(DeficitGases); + + foreach (var (gas, deficit) in deficitGases) + { + if (!NeedsGases.TryGetValue(gas, out var need)) + { + DeficitGases.Remove(gas); + continue; + } + + if (deficit > need) + { + DeficitGases[gas] = need; + } + } + } + + private float SuffocatingPercentage() + { + var percentages = new float[Atmospherics.TotalNumberOfGases]; + + foreach (var (gas, deficit) in DeficitGases) + { + if (!NeedsGases.TryGetValue(gas, out var needed)) + { + percentages[(int) gas] = 1; + continue; + } + + percentages[(int) gas] = deficit / needed; + } + + return percentages.Average(); + } + + private float GasProducedMultiplier(Gas gas, float usedAverage) + { + if (!NeedsGases.TryGetValue(gas, out var needs) || + !ProducesGases.TryGetValue(gas, out var produces)) + { + return 0; + } + + return needs * produces * usedAverage; + } + + private Dictionary GasProduced(float usedAverage) + { + return ProducesGases.ToDictionary(pair => pair.Key, pair => GasProducedMultiplier(pair.Key, usedAverage)); + } + + private void ProcessGases(float frameTime) + { + if (!Owner.TryGetComponent(out BloodstreamComponent bloodstream)) + { + return; + } + + var usedPercentages = new float[Atmospherics.TotalNumberOfGases]; + var needs = NeedsAndDeficit(frameTime); + foreach (var (gas, amountNeeded) in needs) + { + var bloodstreamAmount = bloodstream.Air.GetMoles(gas); + var deficit = 0f; + + if (bloodstreamAmount >= amountNeeded) + { + bloodstream.Air.AdjustMoles(gas, -amountNeeded); + } + else + { + deficit = amountNeeded - bloodstreamAmount; + bloodstream.Air.SetMoles(gas, 0); + } + + DeficitGases[gas] = deficit; + + var used = amountNeeded - deficit; + usedPercentages[(int) gas] = used / amountNeeded; + } + + var usedAverage = usedPercentages.Average(); + var produced = GasProduced(usedAverage); + + foreach (var (gas, amountProduced) in produced) + { + bloodstream.Air.AdjustMoles(gas, amountProduced); + } + + ClampDeficit(); + } + + /// + /// Loops through each reagent in _internalSolution, + /// and calls for each of them. + /// + /// The time since the last metabolism tick in seconds. + private void ProcessNutrients(float frameTime) + { + if (!Owner.TryGetComponent(out BloodstreamComponent bloodstream)) + { + return; + } + + if (bloodstream.Solution.CurrentVolume == 0) + { + return; + } + + // Run metabolism for each reagent, remove metabolized reagents + // Using ToList here lets us edit reagents while iterating + foreach (var reagent in bloodstream.Solution.ReagentList.ToList()) + { + if (!_prototypeManager.TryIndex(reagent.ReagentId, out ReagentPrototype prototype)) + { + continue; + } + + // Run metabolism code for each reagent + foreach (var metabolizable in prototype.Metabolism) + { + var reagentDelta = metabolizable.Metabolize(Owner, reagent.ReagentId, frameTime); + bloodstream.Solution.TryRemoveReagent(reagent.ReagentId, reagentDelta); + } + } + } + + /// + /// Processes gases in the bloodstream and triggers metabolism of the + /// reagents inside of it. + /// + /// + /// The time since the last metabolism tick in seconds. + /// + public void Update(float frameTime) + { + _accumulatedFrameTime += frameTime; + + if (_accumulatedFrameTime < 1) + { + return; + } + + _accumulatedFrameTime -= 1; + + ProcessGases(frameTime); + ProcessNutrients(frameTime); + + if (Suffocating && + Owner.TryGetComponent(out IDamageableComponent damageable)) + { + damageable.ChangeDamage(DamageClass.Airloss, _suffocationDamage, false); + } + } + + public void Transfer(BloodstreamComponent @from, GasMixture to, Gas gas, float pressure) + { + var transfer = new GasMixture(); + var molesInBlood = @from.Air.GetMoles(gas); + + transfer.SetMoles(gas, molesInBlood); + transfer.ReleaseGasTo(to, pressure); + + @from.Air.Merge(transfer); + } + + public GasMixture Clean(BloodstreamComponent bloodstream, float pressure = 100) + { + var gasMixture = new GasMixture(bloodstream.Air.Volume); + + for (Gas gas = 0; gas < (Gas) Atmospherics.TotalNumberOfGases; gas++) + { + if (NeedsGases.TryGetValue(gas, out var needed) && + bloodstream.Air.GetMoles(gas) < needed * 1.5f) + { + continue; + } + + Transfer(bloodstream, gasMixture, gas, pressure); + } + + return gasMixture; + } + } +} diff --git a/Content.Server/GameObjects/Components/Mining/AsteroidRockComponent.cs b/Content.Server/GameObjects/Components/Mining/AsteroidRockComponent.cs index a7fee5d76b..ec174cca63 100644 --- a/Content.Server/GameObjects/Components/Mining/AsteroidRockComponent.cs +++ b/Content.Server/GameObjects/Components/Mining/AsteroidRockComponent.cs @@ -1,6 +1,6 @@ -using Content.Server.GameObjects.Components.Damage; -using Content.Server.GameObjects.Components.Weapon.Melee; +using Content.Server.GameObjects.Components.Weapon.Melee; using Content.Shared.GameObjects.Components.Damage; +using Content.Shared.Damage; using Content.Shared.Interfaces.GameObjects.Components; using Robust.Server.GameObjects; using Robust.Server.GameObjects.EntitySystems; @@ -35,7 +35,7 @@ namespace Content.Server.GameObjects.Components.Mining var item = eventArgs.Using; if (!item.TryGetComponent(out MeleeWeaponComponent meleeWeaponComponent)) return false; - Owner.GetComponent().TakeDamage(DamageType.Brute, meleeWeaponComponent.Damage, item, eventArgs.User); + Owner.GetComponent().ChangeDamage(DamageType.Blunt, meleeWeaponComponent.Damage, false, item); if (!item.TryGetComponent(out PickaxeComponent pickaxeComponent)) return true; if (!string.IsNullOrWhiteSpace(pickaxeComponent.MiningSound)) diff --git a/Content.Server/GameObjects/Components/Mobs/DamageStates.cs b/Content.Server/GameObjects/Components/Mobs/DamageStates.cs deleted file mode 100644 index 89aea5beb8..0000000000 --- a/Content.Server/GameObjects/Components/Mobs/DamageStates.cs +++ /dev/null @@ -1,275 +0,0 @@ -using Content.Server.Mobs; -using Content.Shared.GameObjects.Components.Mobs; -using Content.Shared.GameObjects.EntitySystems; -using Robust.Server.GameObjects; -using Robust.Shared.GameObjects.Components; -using Robust.Shared.Interfaces.GameObjects; - -namespace Content.Server.GameObjects.Components.Mobs -{ - /// - /// Defines the blocking effect of each damage state, and what effects to apply upon entering or exiting the state - /// - public interface IDamageState : IActionBlocker - { - void EnterState(IEntity entity); - - void ExitState(IEntity entity); - - bool IsConscious { get; } - } - - /// - /// Standard state that a species is at with no damage or negative effect - /// - public struct NormalState : IDamageState - { - public void EnterState(IEntity entity) - { - entity.TryGetComponent(out AppearanceComponent appearanceComponent); - appearanceComponent?.SetData(DamageStateVisuals.State, DamageStateVisualData.Normal); - } - - public void ExitState(IEntity entity) - { - } - - public bool IsConscious => true; - - bool IActionBlocker.CanInteract() - { - return true; - } - - bool IActionBlocker.CanMove() - { - return true; - } - - bool IActionBlocker.CanUse() - { - return true; - } - - bool IActionBlocker.CanThrow() - { - return true; - } - - bool IActionBlocker.CanSpeak() - { - return true; - } - - bool IActionBlocker.CanDrop() - { - return true; - } - - bool IActionBlocker.CanPickup() - { - return true; - } - - bool IActionBlocker.CanEmote() - { - return true; - } - - bool IActionBlocker.CanAttack() - { - return true; - } - - bool IActionBlocker.CanEquip() - { - return true; - } - - bool IActionBlocker.CanUnequip() - { - return true; - } - - bool IActionBlocker.CanChangeDirection() - { - return true; - } - } - - /// - /// A state in which you are disabled from acting due to damage - /// - public struct CriticalState : IDamageState - { - public void EnterState(IEntity entity) - { - if(entity.TryGetComponent(out StunnableComponent stun)) - stun.CancelAll(); - - entity.TryGetComponent(out AppearanceComponent appearanceComponent); - appearanceComponent?.SetData(DamageStateVisuals.State, DamageStateVisualData.Crit); - StandingStateHelper.Down(entity); - } - - public void ExitState(IEntity entity) - { - StandingStateHelper.Standing(entity); - } - - public bool IsConscious => false; - - bool IActionBlocker.CanInteract() - { - return false; - } - - bool IActionBlocker.CanMove() - { - return false; - } - - bool IActionBlocker.CanUse() - { - return false; - } - - bool IActionBlocker.CanThrow() - { - return false; - } - - bool IActionBlocker.CanSpeak() - { - return false; - } - - bool IActionBlocker.CanDrop() - { - return false; - } - - bool IActionBlocker.CanPickup() - { - return false; - } - - bool IActionBlocker.CanEmote() - { - return false; - } - - bool IActionBlocker.CanAttack() - { - return false; - } - - bool IActionBlocker.CanEquip() - { - return false; - } - - bool IActionBlocker.CanUnequip() - { - return false; - } - - bool IActionBlocker.CanChangeDirection() - { - return true; - } - } - - /// - /// A damage state which will allow ghosting out of mobs - /// - public struct DeadState : IDamageState - { - public void EnterState(IEntity entity) - { - if(entity.TryGetComponent(out StunnableComponent stun)) - stun.CancelAll(); - - StandingStateHelper.Down(entity); - entity.TryGetComponent(out AppearanceComponent appearanceComponent); - appearanceComponent?.SetData(DamageStateVisuals.State, DamageStateVisualData.Dead); - - if (entity.TryGetComponent(out ICollidableComponent collidable)) - { - collidable.CanCollide = false; - } - } - - public void ExitState(IEntity entity) - { - StandingStateHelper.Standing(entity); - - if (entity.TryGetComponent(out ICollidableComponent collidable)) - { - collidable.CanCollide = true; - } - } - - public bool IsConscious => false; - - bool IActionBlocker.CanInteract() - { - return false; - } - - bool IActionBlocker.CanMove() - { - return false; - } - - bool IActionBlocker.CanUse() - { - return false; - } - - bool IActionBlocker.CanThrow() - { - return false; - } - - bool IActionBlocker.CanSpeak() - { - return false; - } - - bool IActionBlocker.CanDrop() - { - return false; - } - - bool IActionBlocker.CanPickup() - { - return false; - } - - bool IActionBlocker.CanEmote() - { - return false; - } - - bool IActionBlocker.CanAttack() - { - return false; - } - - bool IActionBlocker.CanEquip() - { - return false; - } - - bool IActionBlocker.CanUnequip() - { - return false; - } - - bool IActionBlocker.CanChangeDirection() - { - return false; - } - } -} diff --git a/Content.Server/GameObjects/Components/Mobs/DamageThresholdTemplates/DamageThresholdTemplates.cs b/Content.Server/GameObjects/Components/Mobs/DamageThresholdTemplates/DamageThresholdTemplates.cs deleted file mode 100644 index 80295df021..0000000000 --- a/Content.Server/GameObjects/Components/Mobs/DamageThresholdTemplates/DamageThresholdTemplates.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System.Collections.Generic; -using Content.Server.GameObjects.Components.Damage; -using Content.Shared.GameObjects.Components.Damage; - -namespace Content.Server.GameObjects.Components.Mobs.DamageThresholdTemplates -{ - /// - /// Defines the threshold values for each damage state for any kind of species - /// - public abstract class DamageTemplates - { - public abstract List HealthHudThresholds { get; } - - /// - /// Changes the hud state when a threshold is reached - /// - /// - /// - public abstract void ChangeHudState(DamageableComponent damage); - - //public abstract ResistanceSet resistanceset { get; } - - /// - /// Shows allowed states, ordered by priority, closest to last value to have threshold reached is preferred - /// - public abstract List<(DamageType, int, ThresholdType)> AllowedStates { get; } - - /// - /// Map of ALL POSSIBLE damage states to the threshold enum value that will trigger them, normal state wont be triggered by this value but is a default that is fell back onto - /// - public static Dictionary StateThresholdMap = new Dictionary() - { - { ThresholdType.None, new NormalState() }, - { ThresholdType.Critical, new CriticalState() }, - { ThresholdType.Death, new DeadState() } - }; - - public List DamageThresholds - { - get - { - List thresholds = new List(); - foreach (var element in AllowedStates) - { - thresholds.Add(new DamageThreshold(element.Item1, element.Item2, element.Item3)); - } - return thresholds; - } - } - - public ThresholdType CalculateDamageState(DamageableComponent damage) - { - ThresholdType healthstate = ThresholdType.None; - foreach(var element in AllowedStates) - { - if(damage.CurrentDamage[element.Item1] >= element.Item2) - { - healthstate = element.Item3; - } - } - - return healthstate; - } - } -} diff --git a/Content.Server/GameObjects/Components/Mobs/DamageThresholdTemplates/HumanTemplate.cs b/Content.Server/GameObjects/Components/Mobs/DamageThresholdTemplates/HumanTemplate.cs deleted file mode 100644 index 8045758b89..0000000000 --- a/Content.Server/GameObjects/Components/Mobs/DamageThresholdTemplates/HumanTemplate.cs +++ /dev/null @@ -1,97 +0,0 @@ -using System; -using System.Collections.Generic; -using Content.Server.GameObjects.Components.Damage; -using Content.Shared.GameObjects.Components.Damage; -using Content.Shared.GameObjects.Components.Mobs; -using JetBrains.Annotations; - -namespace Content.Server.GameObjects.Components.Mobs.DamageThresholdTemplates -{ - [UsedImplicitly] - public class Human : DamageTemplates - { - int critvalue = 200; - int normalstates = 6; - //string startsprite = "human0"; - - public override List<(DamageType, int, ThresholdType)> AllowedStates => new List<(DamageType, int, ThresholdType)>() - { - (DamageType.Total, critvalue-1, ThresholdType.None), - (DamageType.Total, critvalue, ThresholdType.Critical), - (DamageType.Total, 300, ThresholdType.Death), - }; - - public override List HealthHudThresholds - { - get - { - List thresholds = new List(); - thresholds.Add(new DamageThreshold(DamageType.Total, 1, ThresholdType.HUDUpdate)); - for (var i = 1; i <= normalstates; i++) - { - thresholds.Add(new DamageThreshold(DamageType.Total, i * critvalue / normalstates, ThresholdType.HUDUpdate)); - } - return thresholds; //we don't need to respecify the state damage thresholds since we'll update hud on damage state changes as well - } - } - - // for shared string dict, since we don't define these anywhere in content - [UsedImplicitly] - public static readonly string[] _humanStatusImages = - { - "/Textures/Interface/StatusEffects/Human/human0.png", - "/Textures/Interface/StatusEffects/Human/human1.png", - "/Textures/Interface/StatusEffects/Human/human2.png", - "/Textures/Interface/StatusEffects/Human/human3.png", - "/Textures/Interface/StatusEffects/Human/human4.png", - "/Textures/Interface/StatusEffects/Human/human5.png", - "/Textures/Interface/StatusEffects/Human/human6-0.png", - "/Textures/Interface/StatusEffects/Human/human6-1.png", - "/Textures/Interface/StatusEffects/Human/humancrit-0.png", - "/Textures/Interface/StatusEffects/Human/humancrit-1.png", - "/Textures/Interface/StatusEffects/Human/humandead.png", - }; - - public override void ChangeHudState(DamageableComponent damage) - { - ThresholdType healthstate = CalculateDamageState(damage); - damage.Owner.TryGetComponent(out ServerStatusEffectsComponent statusEffectsComponent); - damage.Owner.TryGetComponent(out ServerOverlayEffectsComponent overlayComponent); - switch (healthstate) - { - case ThresholdType.None: - var totaldamage = damage.CurrentDamage[DamageType.Total]; - if (totaldamage > critvalue) - { - throw new InvalidOperationException(); //these should all be below the crit value, possibly going over multiple thresholds at once? - } - var modifier = totaldamage / (critvalue / normalstates); //integer division floors towards zero - statusEffectsComponent?.ChangeStatusEffectIcon(StatusEffect.Health, - "/Textures/Interface/StatusEffects/Human/human" + modifier + ".png"); - - overlayComponent?.RemoveOverlay(SharedOverlayID.GradientCircleMaskOverlay); - overlayComponent?.RemoveOverlay(SharedOverlayID.CircleMaskOverlay); - - return; - case ThresholdType.Critical: - statusEffectsComponent?.ChangeStatusEffectIcon( - StatusEffect.Health, - "/Textures/Interface/StatusEffects/Human/humancrit-0.png"); - overlayComponent?.AddOverlay(SharedOverlayID.GradientCircleMaskOverlay); - overlayComponent?.RemoveOverlay(SharedOverlayID.CircleMaskOverlay); - - return; - case ThresholdType.Death: - statusEffectsComponent?.ChangeStatusEffectIcon( - StatusEffect.Health, - "/Textures/Interface/StatusEffects/Human/humandead.png"); - overlayComponent?.RemoveOverlay(SharedOverlayID.GradientCircleMaskOverlay); - overlayComponent?.AddOverlay(SharedOverlayID.CircleMaskOverlay); - - return; - default: - throw new InvalidOperationException(); - } - } - } -} diff --git a/Content.Server/GameObjects/Components/Mobs/HeatResistanceComponent.cs b/Content.Server/GameObjects/Components/Mobs/HeatResistanceComponent.cs index 7d21ba3124..b0423e455b 100644 --- a/Content.Server/GameObjects/Components/Mobs/HeatResistanceComponent.cs +++ b/Content.Server/GameObjects/Components/Mobs/HeatResistanceComponent.cs @@ -13,10 +13,9 @@ namespace Content.Server.GameObjects.Components.Mobs public int GetHeatResistance() { - if (Owner.GetComponent().TryGetSlotItem(EquipmentSlotDefines.Slots.GLOVES, itemComponent: out ClothingComponent gloves) - | Owner.TryGetComponent(out SpeciesComponent speciesComponent)) + if (Owner.GetComponent().TryGetSlotItem(EquipmentSlotDefines.Slots.GLOVES, itemComponent: out ClothingComponent gloves)) { - return Math.Max(gloves?.HeatResistance ?? int.MinValue, speciesComponent?.HeatResistance ?? int.MinValue); + return gloves?.HeatResistance ?? int.MinValue; } return int.MinValue; } diff --git a/Content.Server/GameObjects/Components/Mobs/MindComponent.cs b/Content.Server/GameObjects/Components/Mobs/MindComponent.cs index fe033e2231..fd2fed7f5f 100644 --- a/Content.Server/GameObjects/Components/Mobs/MindComponent.cs +++ b/Content.Server/GameObjects/Components/Mobs/MindComponent.cs @@ -2,6 +2,7 @@ using Content.Server.GameObjects.Components.Observer; using Content.Server.Interfaces.GameTicking; using Content.Server.Mobs; +using Content.Shared.GameObjects.Components.Damage; using Content.Shared.GameObjects.EntitySystems; using Robust.Shared.GameObjects; using Robust.Shared.Interfaces.GameObjects; @@ -126,8 +127,8 @@ namespace Content.Server.GameObjects.Components.Mobs } var dead = - Owner.TryGetComponent(out var species) && - species.CurrentDamageState is DeadState; + Owner.TryGetComponent(out var damageable) && + damageable.CurrentDamageState == DamageState.Dead; if (!HasMind) { diff --git a/Content.Server/GameObjects/Components/Mobs/MobStateManager.cs b/Content.Server/GameObjects/Components/Mobs/MobStateManager.cs new file mode 100644 index 0000000000..acb501a1ea --- /dev/null +++ b/Content.Server/GameObjects/Components/Mobs/MobStateManager.cs @@ -0,0 +1,488 @@ +using System.Collections.Generic; +using Content.Server.GameObjects.Components.Body; +using Content.Server.GameObjects.Components.Damage; +using Content.Server.Mobs; +using Content.Shared.GameObjects.Components.Damage; +using Content.Shared.GameObjects.Components.Mobs; +using Content.Shared.GameObjects.EntitySystems; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Components; +using Robust.Shared.Interfaces.GameObjects; + +namespace Content.Server.GameObjects.Components.Mobs +{ + /// + /// When attacked to an , this component will handle critical and death behaviors + /// for mobs. + /// Additionally, it handles sending effects to clients (such as blur effect for unconsciousness) and managing the + /// health HUD. + /// + [RegisterComponent] + internal class MobStateManagerComponent : Component, IOnHealthChangedBehavior, IActionBlocker + { + private readonly Dictionary _behavior = new Dictionary + { + {DamageState.Alive, new NormalState()}, + {DamageState.Critical, new CriticalState()}, + {DamageState.Dead, new DeadState()} + }; + + public override string Name => "MobStateManager"; + + private DamageState _currentDamageState; + + public IMobState CurrentMobState { get; private set; } = new NormalState(); + + bool IActionBlocker.CanInteract() + { + return CurrentMobState.CanInteract(); + } + + bool IActionBlocker.CanMove() + { + return CurrentMobState.CanMove(); + } + + bool IActionBlocker.CanUse() + { + return CurrentMobState.CanUse(); + } + + bool IActionBlocker.CanThrow() + { + return CurrentMobState.CanThrow(); + } + + bool IActionBlocker.CanSpeak() + { + return CurrentMobState.CanSpeak(); + } + + bool IActionBlocker.CanDrop() + { + return CurrentMobState.CanDrop(); + } + + bool IActionBlocker.CanPickup() + { + return CurrentMobState.CanPickup(); + } + + bool IActionBlocker.CanEmote() + { + return CurrentMobState.CanEmote(); + } + + bool IActionBlocker.CanAttack() + { + return CurrentMobState.CanAttack(); + } + + bool IActionBlocker.CanEquip() + { + return CurrentMobState.CanEquip(); + } + + bool IActionBlocker.CanUnequip() + { + return CurrentMobState.CanUnequip(); + } + + bool IActionBlocker.CanChangeDirection() + { + return CurrentMobState.CanChangeDirection(); + } + + public void OnHealthChanged(HealthChangedEventArgs e) + { + if (e.Damageable.CurrentDamageState != _currentDamageState) + { + _currentDamageState = e.Damageable.CurrentDamageState; + CurrentMobState.ExitState(Owner); + CurrentMobState = _behavior[_currentDamageState]; + CurrentMobState.EnterState(Owner); + } + + CurrentMobState.UpdateState(Owner); + } + + public override void Initialize() + { + base.Initialize(); + + _currentDamageState = DamageState.Alive; + CurrentMobState = _behavior[_currentDamageState]; + CurrentMobState.EnterState(Owner); + CurrentMobState.UpdateState(Owner); + } + + public override void OnRemove() + { + // TODO: Might want to add an OnRemove() to IMobState since those are where these components are being used + base.OnRemove(); + + if (Owner.TryGetComponent(out ServerStatusEffectsComponent status)) + { + status.RemoveStatusEffect(StatusEffect.Health); + } + + if (Owner.TryGetComponent(out ServerOverlayEffectsComponent overlay)) + { + overlay.ClearOverlays(); + } + } + } + + /// + /// Defines the blocking effects of an associated + /// (i.e. Normal, Critical, Dead) and what effects to apply upon entering or + /// exiting the state. + /// + public interface IMobState : IActionBlocker + { + /// + /// Called when this state is entered. + /// + void EnterState(IEntity entity); + + /// + /// Called when this state is left for a different state. + /// + void ExitState(IEntity entity); + + /// + /// Called when this state is updated. + /// + void UpdateState(IEntity entity); + } + + /// + /// The standard state an entity is in; no negative effects. + /// + public struct NormalState : IMobState + { + public void EnterState(IEntity entity) + { + UpdateState(entity); + } + + public void ExitState(IEntity entity) { } + + public void UpdateState(IEntity entity) + { + if (!entity.TryGetComponent(out ServerStatusEffectsComponent status)) + { + return; + } + + if (!entity.TryGetComponent(out IDamageableComponent damageable)) + { + status.ChangeStatusEffectIcon(StatusEffect.Health, + "/Textures/Interface/StatusEffects/Human/human0.png"); + return; + } + + // TODO + switch (damageable) + { + case RuinableComponent ruinable: + { + var modifier = (int) (ruinable.TotalDamage / (ruinable.MaxHp / 7f)); + + status.ChangeStatusEffectIcon(StatusEffect.Health, + "/Textures/Interface/StatusEffects/Human/human" + modifier + ".png"); + + break; + } + case BodyManagerComponent body: + { + // TODO: Declare body max normal damage (currently 100) + var modifier = (int) (body.TotalDamage / (100f / 7f)); + + status.ChangeStatusEffectIcon(StatusEffect.Health, + "/Textures/Interface/StatusEffects/Human/human" + modifier + ".png"); + + break; + } + default: + { + status.ChangeStatusEffectIcon(StatusEffect.Health, + "/Textures/Interface/StatusEffects/Human/human0.png"); + break; + } + } + } + + bool IActionBlocker.CanInteract() + { + return true; + } + + bool IActionBlocker.CanMove() + { + return true; + } + + bool IActionBlocker.CanUse() + { + return true; + } + + bool IActionBlocker.CanThrow() + { + return true; + } + + bool IActionBlocker.CanSpeak() + { + return true; + } + + bool IActionBlocker.CanDrop() + { + return true; + } + + bool IActionBlocker.CanPickup() + { + return true; + } + + bool IActionBlocker.CanEmote() + { + return true; + } + + bool IActionBlocker.CanAttack() + { + return true; + } + + bool IActionBlocker.CanEquip() + { + return true; + } + + bool IActionBlocker.CanUnequip() + { + return true; + } + + bool IActionBlocker.CanChangeDirection() + { + return true; + } + } + + /// + /// A state in which an entity is disabled from acting due to sufficient damage (considered unconscious). + /// + public struct CriticalState : IMobState + { + public void EnterState(IEntity entity) + { + if (entity.TryGetComponent(out ServerStatusEffectsComponent status)) + { + status.ChangeStatusEffectIcon(StatusEffect.Health, + "/Textures/Interface/StatusEffects/Human/humancrit-0.png"); //Todo: combine humancrit-0 and humancrit-1 into a gif and display it + } + + if (entity.TryGetComponent(out ServerOverlayEffectsComponent overlay)) + { + overlay.AddOverlay(SharedOverlayID.GradientCircleMaskOverlay); + } + + if (entity.TryGetComponent(out StunnableComponent stun)) + { + stun.CancelAll(); + } + + StandingStateHelper.Down(entity); + } + + public void ExitState(IEntity entity) + { + StandingStateHelper.Standing(entity); + + if (entity.TryGetComponent(out ServerOverlayEffectsComponent overlay)) + { + overlay.ClearOverlays(); + } + } + + public void UpdateState(IEntity entity) + { + } + + bool IActionBlocker.CanInteract() + { + return false; + } + + bool IActionBlocker.CanMove() + { + return false; + } + + bool IActionBlocker.CanUse() + { + return false; + } + + bool IActionBlocker.CanThrow() + { + return false; + } + + bool IActionBlocker.CanSpeak() + { + return false; + } + + bool IActionBlocker.CanDrop() + { + return false; + } + + bool IActionBlocker.CanPickup() + { + return false; + } + + bool IActionBlocker.CanEmote() + { + return false; + } + + bool IActionBlocker.CanAttack() + { + return false; + } + + bool IActionBlocker.CanEquip() + { + return false; + } + + bool IActionBlocker.CanUnequip() + { + return false; + } + + bool IActionBlocker.CanChangeDirection() + { + return false; + } + } + + /// + /// The state representing a dead entity; allows for ghosting. + /// + public struct DeadState : IMobState + { + public void EnterState(IEntity entity) + { + if (entity.TryGetComponent(out ServerStatusEffectsComponent status)) + { + status.ChangeStatusEffectIcon(StatusEffect.Health, + "/Textures/Interface/StatusEffects/Human/humandead.png"); + } + + if (entity.TryGetComponent(out ServerOverlayEffectsComponent overlayComponent)) + { + overlayComponent.AddOverlay(SharedOverlayID.CircleMaskOverlay); + } + + if (entity.TryGetComponent(out StunnableComponent stun)) + { + stun.CancelAll(); + } + + StandingStateHelper.Down(entity); + + if (entity.TryGetComponent(out CollidableComponent collidable)) + { + collidable.CanCollide = false; + } + } + + public void ExitState(IEntity entity) + { + StandingStateHelper.Standing(entity); + + if (entity.TryGetComponent(out CollidableComponent collidable)) + { + collidable.CanCollide = true; + } + + if (entity.TryGetComponent(out ServerOverlayEffectsComponent overlay)) + { + overlay.ClearOverlays(); + } + } + + public void UpdateState(IEntity entity) + { + } + + bool IActionBlocker.CanInteract() + { + return false; + } + + bool IActionBlocker.CanMove() + { + return false; + } + + bool IActionBlocker.CanUse() + { + return false; + } + + bool IActionBlocker.CanThrow() + { + return false; + } + + bool IActionBlocker.CanSpeak() + { + return false; + } + + bool IActionBlocker.CanDrop() + { + return false; + } + + bool IActionBlocker.CanPickup() + { + return false; + } + + bool IActionBlocker.CanEmote() + { + return false; + } + + bool IActionBlocker.CanAttack() + { + return false; + } + + bool IActionBlocker.CanEquip() + { + return false; + } + + bool IActionBlocker.CanUnequip() + { + return false; + } + + bool IActionBlocker.CanChangeDirection() + { + return false; + } + } +} diff --git a/Content.Server/GameObjects/Components/Mobs/SpeciesComponent.cs b/Content.Server/GameObjects/Components/Mobs/SpeciesComponent.cs deleted file mode 100644 index 61e1f671fe..0000000000 --- a/Content.Server/GameObjects/Components/Mobs/SpeciesComponent.cs +++ /dev/null @@ -1,247 +0,0 @@ -using System; -using System.Collections.Generic; -using Content.Server.GameObjects.Components.Damage; -using Content.Server.GameObjects.Components.Mobs.DamageThresholdTemplates; -using Content.Server.GameObjects.EntitySystems; -using Content.Server.Interfaces.GameObjects; -using Content.Server.Observer; -using Content.Shared.GameObjects.Components.Damage; -using Content.Shared.GameObjects.Components.Mobs; -using Content.Shared.GameObjects.Components.Movement; -using Content.Shared.GameObjects.EntitySystems; -using Robust.Server.GameObjects; -using Robust.Server.Interfaces.Player; -using Robust.Shared.GameObjects; -using Robust.Shared.Interfaces.GameObjects; -using Robust.Shared.Players; -using Robust.Shared.Serialization; - -namespace Content.Server.GameObjects.Components.Mobs -{ - [RegisterComponent] - [ComponentReference(typeof(SharedSpeciesComponent))] - public class SpeciesComponent : SharedSpeciesComponent, IActionBlocker, IOnDamageBehavior, IExAct, IRelayMoveInput - { - /// - /// Damagestates are reached by reaching a certain damage threshold, they will block actions after being reached - /// - public IDamageState CurrentDamageState { get; private set; } = new NormalState(); - - /// - /// Damage state enum for current health, set only via change damage state //TODO: SETTER - /// - private ThresholdType currentstate = ThresholdType.None; - - /// - /// Holds the damage template which controls the threshold and resistance settings for this species type - /// - public DamageTemplates DamageTemplate { get; private set; } - - /// - /// Variable for serialization - /// - private string templatename; - - private int _heatResistance; - public int HeatResistance => _heatResistance; - - public override void ExposeData(ObjectSerializer serializer) - { - base.ExposeData(serializer); - - serializer.DataField(ref templatename, "Template", "Human"); - - var type = typeof(SpeciesComponent).Assembly.GetType("Content.Server.GameObjects.Components.Mobs.DamageThresholdTemplates." + templatename); - DamageTemplate = (DamageTemplates) Activator.CreateInstance(type); - serializer.DataFieldCached(ref _heatResistance, "HeatResistance", 323); - } - - public override void HandleMessage(ComponentMessage message, IComponent component) - { - base.HandleMessage(message, component); - - switch (message) - { - case PlayerAttachedMsg _: - if (CanReceiveStatusEffect(Owner)) { - DamageableComponent damage = Owner.GetComponent(); - DamageTemplate.ChangeHudState(damage); - } - break; - case PlayerDetachedMsg _: - break; - } - } - - public override void OnRemove() - { - base.OnRemove(); - Owner.TryGetComponent(out ServerStatusEffectsComponent statusEffectsComponent); - statusEffectsComponent?.RemoveStatusEffect(StatusEffect.Health); - - Owner.TryGetComponent(out ServerOverlayEffectsComponent overlayEffectsComponent); - overlayEffectsComponent?.ClearOverlays(); - } - - bool IActionBlocker.CanMove() - { - return CurrentDamageState.CanMove(); - } - - bool IActionBlocker.CanInteract() - { - return CurrentDamageState.CanInteract(); - } - - bool IActionBlocker.CanUse() - { - return CurrentDamageState.CanUse(); - } - - bool IActionBlocker.CanThrow() - { - return CurrentDamageState.CanThrow(); - } - - bool IActionBlocker.CanSpeak() - { - return CurrentDamageState.CanSpeak(); - } - - bool IActionBlocker.CanDrop() - { - return CurrentDamageState.CanDrop(); - } - - bool IActionBlocker.CanPickup() - { - return CurrentDamageState.CanPickup(); - } - - bool IActionBlocker.CanEmote() - { - return CurrentDamageState.CanEmote(); - } - - bool IActionBlocker.CanAttack() - { - return CurrentDamageState.CanAttack(); - } - - bool IActionBlocker.CanEquip() - { - return CurrentDamageState.CanEquip(); - } - - bool IActionBlocker.CanUnequip() - { - return CurrentDamageState.CanUnequip(); - } - - bool IActionBlocker.CanChangeDirection() - { - return CurrentDamageState.CanChangeDirection(); - } - - List IOnDamageBehavior.GetAllDamageThresholds() - { - var thresholdlist = DamageTemplate.DamageThresholds; - thresholdlist.AddRange(DamageTemplate.HealthHudThresholds); - return thresholdlist; - } - - void IOnDamageBehavior.OnDamageThresholdPassed(object damageable, DamageThresholdPassedEventArgs e) - { - DamageableComponent damage = (DamageableComponent) damageable; - - if (e.DamageThreshold.ThresholdType != ThresholdType.HUDUpdate) - { - ChangeDamageState(DamageTemplate.CalculateDamageState(damage)); - } - - //specifies if we have a client to update the hud for - if (CanReceiveStatusEffect(Owner)) - { - DamageTemplate.ChangeHudState(damage); - } - } - - private bool CanReceiveStatusEffect(IEntity user) - { - if (!user.HasComponent() && - !user.HasComponent()) - { - return false; - } - if (user.HasComponent()) - { - return true; - } - - return false; - } - - private void ChangeDamageState(ThresholdType threshold) - { - if (threshold == currentstate) - { - return; - } - - CurrentDamageState.ExitState(Owner); - CurrentDamageState = DamageTemplates.StateThresholdMap[threshold]; - CurrentDamageState.EnterState(Owner); - - currentstate = threshold; - - var toRaise = new MobDamageStateChangedMessage(this); - Owner.EntityManager.EventBus.RaiseEvent(EventSource.Local, toRaise); - } - - void IExAct.OnExplosion(ExplosionEventArgs eventArgs) - { - var burnDamage = 0; - var bruteDamage = 0; - switch(eventArgs.Severity) - { - case ExplosionSeverity.Destruction: - bruteDamage += 250; - burnDamage += 250; - break; - case ExplosionSeverity.Heavy: - bruteDamage += 60; - burnDamage += 60; - break; - case ExplosionSeverity.Light: - bruteDamage += 30; - break; - } - Owner.GetComponent().TakeDamage(DamageType.Brute, bruteDamage, null); - Owner.GetComponent().TakeDamage(DamageType.Heat, burnDamage, null); - } - - void IRelayMoveInput.MoveInputPressed(ICommonSession session) - { - if (CurrentDamageState is DeadState) - { - new Ghost().Execute(null, (IPlayerSession) session, null); - } - } - } - - /// - /// Fired when changes. - /// - public sealed class MobDamageStateChangedMessage : EntitySystemMessage - { - public MobDamageStateChangedMessage(SpeciesComponent species) - { - Species = species; - } - - /// - /// The species component that was changed. - /// - public SpeciesComponent Species { get; } - } -} diff --git a/Content.Server/GameObjects/Components/Nutrition/DrinkComponent.cs b/Content.Server/GameObjects/Components/Nutrition/DrinkComponent.cs index 482d460886..a52ebc1d48 100644 --- a/Content.Server/GameObjects/Components/Nutrition/DrinkComponent.cs +++ b/Content.Server/GameObjects/Components/Nutrition/DrinkComponent.cs @@ -1,4 +1,5 @@ -using Content.Server.GameObjects.Components.Chemistry; +using Content.Server.GameObjects.Components.Body.Digestive; +using Content.Server.GameObjects.Components.Chemistry; using Content.Server.GameObjects.Components.Fluids; using Content.Server.GameObjects.EntitySystems; using Content.Shared.Audio; diff --git a/Content.Server/GameObjects/Components/Nutrition/FoodComponent.cs b/Content.Server/GameObjects/Components/Nutrition/FoodComponent.cs index 3354839430..e4440aefa9 100644 --- a/Content.Server/GameObjects/Components/Nutrition/FoodComponent.cs +++ b/Content.Server/GameObjects/Components/Nutrition/FoodComponent.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Content.Server.GameObjects.Components.Body.Digestive; using Content.Server.GameObjects.Components.Chemistry; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; diff --git a/Content.Server/GameObjects/Components/Nutrition/HungerComponent.cs b/Content.Server/GameObjects/Components/Nutrition/HungerComponent.cs index 47643417bb..0633289de8 100644 --- a/Content.Server/GameObjects/Components/Nutrition/HungerComponent.cs +++ b/Content.Server/GameObjects/Components/Nutrition/HungerComponent.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -using Content.Server.GameObjects.Components.Damage; using Content.Server.GameObjects.Components.Mobs; +using Content.Shared.Damage; using Content.Shared.GameObjects.Components.Damage; using Content.Shared.GameObjects.Components.Mobs; using Content.Shared.GameObjects.Components.Movement; @@ -180,11 +180,11 @@ namespace Content.Server.GameObjects.Components.Nutrition } if (_currentHungerThreshold == HungerThreshold.Dead) { - if (Owner.TryGetComponent(out DamageableComponent damage)) + if (Owner.TryGetComponent(out IDamageableComponent damageable)) { - if (!damage.IsDead()) + if (damageable.CurrentDamageState != DamageState.Dead) { - damage.TakeDamage(DamageType.Brute, 2); + damageable.ChangeDamage(DamageType.Blunt, 2, true, null); } } } diff --git a/Content.Server/GameObjects/Components/Nutrition/ThirstComponent.cs b/Content.Server/GameObjects/Components/Nutrition/ThirstComponent.cs index 94f7b5e022..379432e4f1 100644 --- a/Content.Server/GameObjects/Components/Nutrition/ThirstComponent.cs +++ b/Content.Server/GameObjects/Components/Nutrition/ThirstComponent.cs @@ -1,7 +1,7 @@ using System; using System.Collections.Generic; -using Content.Server.GameObjects.Components.Damage; using Content.Server.GameObjects.Components.Mobs; +using Content.Shared.Damage; using Content.Shared.GameObjects.Components.Damage; using Content.Shared.GameObjects.Components.Mobs; using Content.Shared.GameObjects.Components.Movement; @@ -181,11 +181,11 @@ namespace Content.Server.GameObjects.Components.Nutrition if (_currentThirstThreshold == ThirstThreshold.Dead) { - if (Owner.TryGetComponent(out DamageableComponent damage)) + if (Owner.TryGetComponent(out IDamageableComponent damageable)) { - if (!damage.IsDead()) + if (damageable.CurrentDamageState != DamageState.Dead) { - damage.TakeDamage(DamageType.Brute, 2); + damageable.ChangeDamage(DamageType.Blunt, 2, true, null); } } } diff --git a/Content.Server/GameObjects/Components/Power/ApcNetComponents/PowerReceiverUsers/PoweredLightComponent.cs b/Content.Server/GameObjects/Components/Power/ApcNetComponents/PowerReceiverUsers/PoweredLightComponent.cs index a8d60ea43d..a6d81eed88 100644 --- a/Content.Server/GameObjects/Components/Power/ApcNetComponents/PowerReceiverUsers/PoweredLightComponent.cs +++ b/Content.Server/GameObjects/Components/Power/ApcNetComponents/PowerReceiverUsers/PoweredLightComponent.cs @@ -1,11 +1,11 @@ using System; -using Content.Server.GameObjects.Components.Damage; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Mobs; using Content.Server.GameObjects.EntitySystems; using Content.Server.Interfaces; using Content.Shared.GameObjects.Components.Damage; +using Content.Shared.Damage; using Content.Shared.Interfaces.GameObjects.Components; using Robust.Server.GameObjects; using Robust.Server.GameObjects.Components.Container; @@ -76,7 +76,7 @@ namespace Content.Server.GameObjects.Components.Power.ApcNetComponents.PowerRece public bool InteractHand(InteractHandEventArgs eventArgs) { - if (!eventArgs.User.TryGetComponent(out DamageableComponent damageableComponent)) + if (!eventArgs.User.TryGetComponent(out IDamageableComponent damageableComponent)) { Eject(); return false; @@ -99,7 +99,7 @@ namespace Content.Server.GameObjects.Components.Power.ApcNetComponents.PowerRece void Burn() { - damageableComponent.TakeDamage(DamageType.Heat, 20, Owner); + damageableComponent.ChangeDamage(DamageType.Heat, 20, false, Owner); var audioSystem = EntitySystem.Get(); audioSystem.PlayFromEntity("/Audio/Effects/lightburn.ogg", Owner); } diff --git a/Content.Server/GameObjects/Components/Power/PowerNetComponents/SolarPanelComponent.cs b/Content.Server/GameObjects/Components/Power/PowerNetComponents/SolarPanelComponent.cs index a86dff1b87..6f63859193 100644 --- a/Content.Server/GameObjects/Components/Power/PowerNetComponents/SolarPanelComponent.cs +++ b/Content.Server/GameObjects/Components/Power/PowerNetComponents/SolarPanelComponent.cs @@ -1,5 +1,6 @@ using System; using Content.Server.GameObjects.EntitySystems; +using Content.Shared.GameObjects.EntitySystems; using Robust.Server.GameObjects; using Robust.Shared.GameObjects; using Robust.Shared.Interfaces.Timing; diff --git a/Content.Server/GameObjects/Components/Projectiles/HitscanComponent.cs b/Content.Server/GameObjects/Components/Projectiles/HitscanComponent.cs index 4d0bde9372..509de63d73 100644 --- a/Content.Server/GameObjects/Components/Projectiles/HitscanComponent.cs +++ b/Content.Server/GameObjects/Components/Projectiles/HitscanComponent.cs @@ -1,5 +1,5 @@ using System; -using Content.Shared.GameObjects.Components.Damage; +using Content.Shared.Damage; using Content.Shared.Physics; using Robust.Server.GameObjects.EntitySystems; using Robust.Shared.GameObjects; diff --git a/Content.Server/GameObjects/Components/Projectiles/ProjectileComponent.cs b/Content.Server/GameObjects/Components/Projectiles/ProjectileComponent.cs index 9b633dc688..d3395a5ca2 100644 --- a/Content.Server/GameObjects/Components/Projectiles/ProjectileComponent.cs +++ b/Content.Server/GameObjects/Components/Projectiles/ProjectileComponent.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -using Content.Server.GameObjects.Components.Damage; using Content.Server.GameObjects.Components.Mobs; +using Content.Shared.Damage; using Content.Shared.GameObjects.Components.Damage; using Content.Shared.GameObjects.Components.Projectiles; using Robust.Server.GameObjects.EntitySystems; @@ -71,9 +71,11 @@ namespace Content.Server.GameObjects.Components.Projectiles return; } else + { _deleteOnCollide = true; + } - if (_soundHitSpecies != null && entity.HasComponent()) + if (_soundHitSpecies != null && entity.HasComponent()) { EntitySystem.Get().PlayAtCoords(_soundHitSpecies, entity.Transform.GridPosition); } else if (_soundHit != null) @@ -81,13 +83,13 @@ namespace Content.Server.GameObjects.Components.Projectiles EntitySystem.Get().PlayAtCoords(_soundHit, entity.Transform.GridPosition); } - if (entity.TryGetComponent(out DamageableComponent damage)) + if (entity.TryGetComponent(out IDamageableComponent damage)) { Owner.EntityManager.TryGetEntity(_shooter, out var shooter); foreach (var (damageType, amount) in _damages) { - damage.TakeDamage(damageType, amount, Owner, shooter); + damage.ChangeDamage(damageType, amount, false, shooter); } } diff --git a/Content.Server/GameObjects/Components/Projectiles/ThrownItemComponent.cs b/Content.Server/GameObjects/Components/Projectiles/ThrownItemComponent.cs index b072072bc5..df97af93e8 100644 --- a/Content.Server/GameObjects/Components/Projectiles/ThrownItemComponent.cs +++ b/Content.Server/GameObjects/Components/Projectiles/ThrownItemComponent.cs @@ -1,5 +1,5 @@ -using Content.Server.GameObjects.Components.Damage; -using Content.Server.GameObjects.EntitySystems.Click; +using Content.Server.GameObjects.EntitySystems.Click; +using Content.Shared.Damage; using Content.Shared.GameObjects; using Content.Shared.GameObjects.Components.Damage; using Content.Shared.Physics; @@ -40,9 +40,9 @@ namespace Content.Server.GameObjects.Components.Projectiles _shouldStop = true; // hit something hard => stop after this collision } - if (entity.TryGetComponent(out DamageableComponent damage)) + if (entity.TryGetComponent(out IDamageableComponent damage)) { - damage.TakeDamage(DamageType.Brute, 10, Owner, User); + damage.ChangeDamage(DamageType.Blunt, 10, false, Owner); } // Stop colliding with mobs, this mimics not having enough velocity to do damage diff --git a/Content.Server/GameObjects/Components/Recycling/RecyclerComponent.cs b/Content.Server/GameObjects/Components/Recycling/RecyclerComponent.cs index 8b2f31c6c4..124911e98d 100644 --- a/Content.Server/GameObjects/Components/Recycling/RecyclerComponent.cs +++ b/Content.Server/GameObjects/Components/Recycling/RecyclerComponent.cs @@ -5,7 +5,10 @@ using Content.Server.GameObjects.Components.Mobs; using Content.Server.GameObjects.Components.Power.ApcNetComponents; using Content.Server.GameObjects.EntitySystems; using Content.Shared.Construction; +using Content.Shared.GameObjects.Components.Body; +using Content.Shared.GameObjects.Components.Mobs; using Content.Shared.GameObjects.Components.Recycling; +using Content.Shared.GameObjects.Components.Rotation; using Content.Shared.Physics; using Robust.Server.GameObjects; using Robust.Shared.Containers; @@ -65,9 +68,7 @@ namespace Content.Server.GameObjects.Components.Recycling private bool CanGib(IEntity entity) { - return entity.HasComponent() && - !_safe && - Powered; + return entity.HasComponent() && !_safe && Powered; } private bool CanRecycle(IEntity entity, [MaybeNullWhen(false)] out ConstructionPrototype prototype) diff --git a/Content.Server/GameObjects/Components/Suspicion/SuspicionRoleComponent.cs b/Content.Server/GameObjects/Components/Suspicion/SuspicionRoleComponent.cs index 833169a223..d982130afa 100644 --- a/Content.Server/GameObjects/Components/Suspicion/SuspicionRoleComponent.cs +++ b/Content.Server/GameObjects/Components/Suspicion/SuspicionRoleComponent.cs @@ -1,5 +1,6 @@ using Content.Server.GameObjects.Components.Mobs; using Content.Server.Mobs.Roles; +using Content.Shared.GameObjects.Components.Damage; using Content.Shared.GameObjects.EntitySystems; using Robust.Shared.GameObjects; using Robust.Shared.Localization; @@ -14,8 +15,8 @@ namespace Content.Server.GameObjects.Components.Suspicion public bool IsDead() { - return Owner.TryGetComponent(out SpeciesComponent species) && - species.CurrentDamageState is DeadState; + return Owner.TryGetComponent(out IDamageableComponent damageable) && + damageable.CurrentDamageState == DamageState.Dead; } public bool IsTraitor() diff --git a/Content.Server/GameObjects/Components/Temperature/TemperatureComponent.cs b/Content.Server/GameObjects/Components/Temperature/TemperatureComponent.cs index 4e7e901ff2..3c80f17bca 100644 --- a/Content.Server/GameObjects/Components/Temperature/TemperatureComponent.cs +++ b/Content.Server/GameObjects/Components/Temperature/TemperatureComponent.cs @@ -1,5 +1,5 @@ using System; -using Content.Server.GameObjects.Components.Damage; +using Content.Shared.Damage; using Content.Shared.GameObjects.Components.Damage; using Content.Shared.Maths; using Robust.Shared.GameObjects; @@ -44,16 +44,16 @@ namespace Content.Server.GameObjects.Components.Temperature /// public void OnUpdate(float frameTime) { - int fireDamage = + var fireDamage = (int) Math.Floor(Math.Max(0, CurrentTemperature - _fireDamageThreshold) / _fireDamageCoefficient); _secondsSinceLastDamageUpdate += frameTime; - Owner.TryGetComponent(out DamageableComponent component); + Owner.TryGetComponent(out IDamageableComponent component); while (_secondsSinceLastDamageUpdate >= 1) { - component?.TakeDamage(DamageType.Heat, fireDamage); + component?.ChangeDamage(DamageType.Heat, fireDamage, false, null); _secondsSinceLastDamageUpdate -= 1; } } diff --git a/Content.Server/GameObjects/Components/Weapon/Melee/MeleeWeaponComponent.cs b/Content.Server/GameObjects/Components/Weapon/Melee/MeleeWeaponComponent.cs index e0dc32b98f..5d055f8d4a 100644 --- a/Content.Server/GameObjects/Components/Weapon/Melee/MeleeWeaponComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Melee/MeleeWeaponComponent.cs @@ -1,10 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; -using Content.Server.GameObjects.Components.Damage; using Content.Server.GameObjects.EntitySystems; -using Content.Server.Interfaces.GameObjects.Components.Interaction; -using Content.Shared.GameObjects; using Content.Shared.GameObjects.Components.Damage; using Content.Shared.GameObjects.Components.Items; using Robust.Server.GameObjects.EntitySystems; @@ -18,6 +15,7 @@ using Robust.Shared.IoC; using Robust.Shared.Maths; using Robust.Shared.Serialization; using Robust.Shared.ViewVariables; +using Content.Shared.Damage; using Content.Shared.Interfaces.GameObjects.Components; namespace Content.Server.GameObjects.Components.Weapon.Melee @@ -116,9 +114,9 @@ namespace Content.Server.GameObjects.Components.Weapon.Melee if (!entity.Transform.IsMapTransform || entity == eventArgs.User) continue; - if (entity.TryGetComponent(out DamageableComponent damageComponent)) + if (entity.TryGetComponent(out IDamageableComponent damageComponent)) { - damageComponent.TakeDamage(DamageType.Brute, Damage, Owner, eventArgs.User); + damageComponent.ChangeDamage(DamageType.Blunt, Damage, false, Owner); hitEntities.Add(entity); } } diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerBatteryBarrelComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerBatteryBarrelComponent.cs index bdb9b88761..f68aa0758c 100644 --- a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerBatteryBarrelComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerBatteryBarrelComponent.cs @@ -4,7 +4,7 @@ using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Power; using Content.Server.GameObjects.Components.Projectiles; -using Content.Shared.GameObjects.Components.Damage; +using Content.Shared.Damage; using Content.Shared.GameObjects.Components.Weapons.Ranged.Barrels; using Content.Shared.Interfaces.GameObjects.Components; using Robust.Server.GameObjects; diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerRangedBarrelComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerRangedBarrelComponent.cs index 4b0553fe2b..0d1188505b 100644 --- a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerRangedBarrelComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerRangedBarrelComponent.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.Linq; -using Content.Server.GameObjects.Components.Damage; using Content.Server.GameObjects.Components.Mobs; using Content.Server.GameObjects.Components.Projectiles; using Content.Server.GameObjects.Components.Weapon.Ranged.Ammunition; @@ -15,7 +14,6 @@ using Robust.Shared.Audio; using Robust.Shared.GameObjects.Components; using Robust.Shared.GameObjects.Systems; using Robust.Shared.Interfaces.GameObjects; -using Robust.Shared.Interfaces.Map; using Robust.Shared.Interfaces.Physics; using Robust.Shared.Interfaces.Random; using Robust.Shared.Interfaces.Timing; @@ -28,6 +26,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Serialization; using Robust.Shared.Utility; +using Content.Shared.GameObjects.Components.Damage; namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels { @@ -430,16 +429,12 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels var distance = result.HitEntity != null ? result.Distance : hitscan.MaxLength; hitscan.FireEffects(shooter, distance, angle, result.HitEntity); - if (result.HitEntity == null || !result.HitEntity.TryGetComponent(out DamageableComponent damageable)) + if (result.HitEntity == null || !result.HitEntity.TryGetComponent(out IDamageableComponent damageable)) { return; } - damageable.TakeDamage( - hitscan.DamageType, - (int)Math.Round(hitscan.Damage, MidpointRounding.AwayFromZero), - Owner, - shooter); + damageable.ChangeDamage(hitscan.DamageType, (int)Math.Round(hitscan.Damage, MidpointRounding.AwayFromZero), false, Owner); //I used Math.Round over Convert.toInt32, as toInt32 always rounds to //even numbers if halfway between two numbers, rather than rounding to nearest } diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/ServerRangedWeaponComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/ServerRangedWeaponComponent.cs index e87bacbe71..5c8370b7e8 100644 --- a/Content.Server/GameObjects/Components/Weapon/Ranged/ServerRangedWeaponComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Ranged/ServerRangedWeaponComponent.cs @@ -1,9 +1,8 @@ using System; -using Content.Server.GameObjects.Components.Damage; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Mobs; using Content.Server.GameObjects.Components.Weapon.Ranged.Barrels; -using Content.Shared.GameObjects; +using Content.Shared.Damage; using Content.Shared.GameObjects.Components.Damage; using Content.Shared.GameObjects.Components.Weapons.Ranged; using Content.Shared.GameObjects.EntitySystems; @@ -168,10 +167,10 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged soundSystem.PlayAtCoords("/Audio/Weapons/Guns/Gunshots/bang.ogg", Owner.Transform.GridPosition, AudioParams.Default, 5); - if (user.TryGetComponent(out DamageableComponent health)) + if (user.TryGetComponent(out IDamageableComponent health)) { - health.TakeDamage(DamageType.Brute, 10); - health.TakeDamage(DamageType.Heat, 5); + health.ChangeDamage(DamageType.Blunt, 10, false, user); + health.ChangeDamage(DamageType.Heat, 5, false, user); } if (user.TryGetComponent(out StunnableComponent stun)) diff --git a/Content.Server/GameObjects/EntitySystems/BloodstreamSystem.cs b/Content.Server/GameObjects/EntitySystems/BloodstreamSystem.cs deleted file mode 100644 index fc6a69f325..0000000000 --- a/Content.Server/GameObjects/EntitySystems/BloodstreamSystem.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Content.Server.GameObjects.Components.Metabolism; -using JetBrains.Annotations; -using Robust.Shared.GameObjects.Systems; - -namespace Content.Server.GameObjects.EntitySystems -{ - /// - /// Triggers metabolism updates for - /// - [UsedImplicitly] - internal sealed class BloodstreamSystem : EntitySystem - { - private float _accumulatedFrameTime; - - public override void Update(float frameTime) - { - //Trigger metabolism updates at most once per second - _accumulatedFrameTime += frameTime; - if (_accumulatedFrameTime > 1.0f) - { - foreach (var component in ComponentManager.EntityQuery()) - { - component.OnUpdate(_accumulatedFrameTime); - } - _accumulatedFrameTime -= 1.0f; - } - } - } -} diff --git a/Content.Server/GameObjects/EntitySystems/BodySystem.cs b/Content.Server/GameObjects/EntitySystems/BodySystem.cs new file mode 100644 index 0000000000..32467e1844 --- /dev/null +++ b/Content.Server/GameObjects/EntitySystems/BodySystem.cs @@ -0,0 +1,29 @@ +using Content.Server.GameObjects.Components.Body; +using Content.Server.GameObjects.Components.Metabolism; +using JetBrains.Annotations; +using Robust.Shared.GameObjects.Systems; + +namespace Content.Server.GameObjects.EntitySystems +{ + [UsedImplicitly] + public class BodySystem : EntitySystem + { + public override void Update(float frameTime) + { + foreach (var body in ComponentManager.EntityQuery()) + { + body.PreMetabolism(frameTime); + } + + foreach (var metabolism in ComponentManager.EntityQuery()) + { + metabolism.Update(frameTime); + } + + foreach (var body in ComponentManager.EntityQuery()) + { + body.PostMetabolism(frameTime); + } + } + } +} diff --git a/Content.Server/GameObjects/EntitySystems/DoAfter/DoAfter.cs b/Content.Server/GameObjects/EntitySystems/DoAfter/DoAfter.cs index 2a409d0bfe..3e00f334fd 100644 --- a/Content.Server/GameObjects/EntitySystems/DoAfter/DoAfter.cs +++ b/Content.Server/GameObjects/EntitySystems/DoAfter/DoAfter.cs @@ -5,6 +5,7 @@ using Content.Server.GameObjects.Components.Damage; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Mobs; +using Content.Shared.GameObjects.Components.Damage; using Robust.Shared.Interfaces.Timing; using Robust.Shared.IoC; using Robust.Shared.Map; @@ -63,7 +64,7 @@ namespace Content.Server.GameObjects.EntitySystems.DoAfter AsTask = Tcs.Task; } - public void HandleDamage(object? sender, DamageEventArgs eventArgs) + public void HandleDamage(HealthChangedEventArgs args) { _tookDamage = true; } diff --git a/Content.Server/GameObjects/EntitySystems/DoAfter/DoAfterSystem.cs b/Content.Server/GameObjects/EntitySystems/DoAfter/DoAfterSystem.cs index 1c01a789a0..1383dfa8e8 100644 --- a/Content.Server/GameObjects/EntitySystems/DoAfter/DoAfterSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/DoAfter/DoAfterSystem.cs @@ -3,7 +3,7 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; using Content.Server.GameObjects.Components; -using Content.Server.GameObjects.Components.Damage; +using Content.Shared.GameObjects.Components.Damage; using JetBrains.Annotations; using Robust.Server.Interfaces.Timing; using Robust.Shared.GameObjects.Systems; @@ -73,19 +73,19 @@ namespace Content.Server.GameObjects.EntitySystems.DoAfter // Caller's gonna be responsible for this I guess var doAfterComponent = eventArgs.User.GetComponent(); doAfterComponent.Add(doAfter); - DamageableComponent? damageableComponent = null; + IDamageableComponent? damageableComponent = null; // TODO: If the component's deleted this may not get unsubscribed? if (eventArgs.BreakOnDamage && eventArgs.User.TryGetComponent(out damageableComponent)) { - damageableComponent.Damaged += doAfter.HandleDamage; + damageableComponent.HealthChangedEvent += doAfter.HandleDamage; } await doAfter.AsTask; if (damageableComponent != null) { - damageableComponent.Damaged -= doAfter.HandleDamage; + damageableComponent.HealthChangedEvent -= doAfter.HandleDamage; } return doAfter.Status; diff --git a/Content.Server/GameObjects/EntitySystems/HungerSystem.cs b/Content.Server/GameObjects/EntitySystems/HungerSystem.cs index cddc2b76dd..bd8cd6a866 100644 --- a/Content.Server/GameObjects/EntitySystems/HungerSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/HungerSystem.cs @@ -5,20 +5,21 @@ using Robust.Shared.GameObjects.Systems; namespace Content.Server.GameObjects.EntitySystems { [UsedImplicitly] - internal sealed class HungerSystem : EntitySystem + public class HungerSystem : EntitySystem { private float _accumulatedFrameTime; - + public override void Update(float frameTime) { _accumulatedFrameTime += frameTime; - if (_accumulatedFrameTime > 1.0f) + + if (_accumulatedFrameTime > 1) { foreach (var comp in ComponentManager.EntityQuery()) { comp.OnUpdate(_accumulatedFrameTime); } - _accumulatedFrameTime -= 1.0f; + _accumulatedFrameTime -= 1; } } } diff --git a/Content.Server/GameObjects/EntitySystems/StationEvents/RadiationPulseSystem.cs b/Content.Server/GameObjects/EntitySystems/StationEvents/RadiationPulseSystem.cs index 2e48bf7120..a40029da44 100644 --- a/Content.Server/GameObjects/EntitySystems/StationEvents/RadiationPulseSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/StationEvents/RadiationPulseSystem.cs @@ -2,7 +2,9 @@ using System.Collections.Generic; using Content.Server.GameObjects.Components.Damage; using Content.Server.GameObjects.Components.Mobs; using Content.Server.GameObjects.Components.StationEvents; +using Content.Shared.Damage; using Content.Shared.GameObjects; +using Content.Shared.GameObjects.Components.Body; using Content.Shared.GameObjects.Components.Damage; using JetBrains.Annotations; using Robust.Shared.GameObjects; @@ -28,13 +30,13 @@ namespace Content.Server.GameObjects.EntitySystems.StationEvents private const int DamageThreshold = 10; private Dictionary _accumulatedDamage = new Dictionary(); - + public override void Initialize() { base.Initialize(); - _speciesQuery = new TypeEntityQuery(typeof(SpeciesComponent)); + _speciesQuery = new TypeEntityQuery(typeof(IBodyManagerComponent)); } - + public override void Update(float frameTime) { base.Update(frameTime); @@ -72,7 +74,7 @@ namespace Content.Server.GameObjects.EntitySystems.StationEvents var damageMultiple = (int) (totalDamage / DamageThreshold); _accumulatedDamage[species] = totalDamage % DamageThreshold; - damageableComponent.TakeDamage(DamageType.Heat, damageMultiple * DamageThreshold, comp.Owner, comp.Owner); + damageableComponent.ChangeDamage(DamageType.Heat, damageMultiple * DamageThreshold, false, comp.Owner); } } @@ -80,10 +82,10 @@ namespace Content.Server.GameObjects.EntitySystems.StationEvents { return; } - + // probably don't need to worry about clearing this at roundreset unless you have a radiation pulse at roundstart // (which is currently not possible) _accumulatedDamage.Clear(); } } -} \ No newline at end of file +} diff --git a/Content.Server/GameObjects/EntitySystems/StomachSystem.cs b/Content.Server/GameObjects/EntitySystems/StomachSystem.cs deleted file mode 100644 index ffc16af206..0000000000 --- a/Content.Server/GameObjects/EntitySystems/StomachSystem.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Content.Server.GameObjects.Components.Nutrition; -using JetBrains.Annotations; -using Robust.Shared.GameObjects.Systems; - -namespace Content.Server.GameObjects.EntitySystems -{ - /// - /// Triggers digestion updates on - /// - [UsedImplicitly] - internal sealed class StomachSystem : EntitySystem - { - private float _accumulatedFrameTime; - - public override void Update(float frameTime) - { - //Update at most once per second - _accumulatedFrameTime += frameTime; - if (_accumulatedFrameTime > 1.0f) - { - foreach (var component in ComponentManager.EntityQuery()) - { - component.OnUpdate(_accumulatedFrameTime); - } - _accumulatedFrameTime -= 1.0f; - } - } - } -} diff --git a/Content.Server/GameObjects/EntitySystems/ThirstSystem.cs b/Content.Server/GameObjects/EntitySystems/ThirstSystem.cs index b6047a273c..dbb8816a49 100644 --- a/Content.Server/GameObjects/EntitySystems/ThirstSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/ThirstSystem.cs @@ -5,20 +5,21 @@ using Robust.Shared.GameObjects.Systems; namespace Content.Server.GameObjects.EntitySystems { [UsedImplicitly] - internal sealed class ThirstSystem : EntitySystem + public class ThirstSystem : EntitySystem { private float _accumulatedFrameTime; public override void Update(float frameTime) { _accumulatedFrameTime += frameTime; - if (_accumulatedFrameTime > 1.0f) + + if (_accumulatedFrameTime > 1) { foreach (var component in ComponentManager.EntityQuery()) { component.OnUpdate(_accumulatedFrameTime); } - _accumulatedFrameTime -= 1.0f; + _accumulatedFrameTime -= 1; } } } diff --git a/Content.Server/GameTicking/GameRules/RuleDeathMatch.cs b/Content.Server/GameTicking/GameRules/RuleDeathMatch.cs index 05b84f8a1b..cd108324e0 100644 --- a/Content.Server/GameTicking/GameRules/RuleDeathMatch.cs +++ b/Content.Server/GameTicking/GameRules/RuleDeathMatch.cs @@ -1,8 +1,8 @@ using System; using System.Threading; -using Content.Server.GameObjects.Components.Mobs; using Content.Server.Interfaces.Chat; using Content.Server.Interfaces.GameTicking; +using Content.Shared.GameObjects.Components.Damage; using Robust.Server.Interfaces.Player; using Robust.Server.Player; using Robust.Shared.Enums; @@ -34,7 +34,7 @@ namespace Content.Server.GameTicking.GameRules { _chatManager.DispatchServerAnnouncement("The game is now a death match. Kill everybody else to win!"); - _entityManager.EventBus.SubscribeEvent(EventSource.Local, this, _onMobDamageStateChanged); + _entityManager.EventBus.SubscribeEvent(EventSource.Local, this, OnHealthChanged); _playerManager.PlayerStatusChanged += PlayerManagerOnPlayerStatusChanged; } @@ -42,11 +42,11 @@ namespace Content.Server.GameTicking.GameRules { base.Removed(); - _entityManager.EventBus.UnsubscribeEvent(EventSource.Local, this); + _entityManager.EventBus.UnsubscribeEvent(EventSource.Local, this); _playerManager.PlayerStatusChanged -= PlayerManagerOnPlayerStatusChanged; } - private void _onMobDamageStateChanged(MobDamageStateChangedMessage message) + private void OnHealthChanged(HealthChangedEventArgs message) { _runDelayedCheck(); } @@ -59,12 +59,12 @@ namespace Content.Server.GameTicking.GameRules foreach (var playerSession in _playerManager.GetAllPlayers()) { if (playerSession.AttachedEntity == null - || !playerSession.AttachedEntity.TryGetComponent(out SpeciesComponent species)) + || !playerSession.AttachedEntity.TryGetComponent(out IDamageableComponent damageable)) { continue; } - if (!species.CurrentDamageState.IsConscious) + if (damageable.CurrentDamageState != DamageState.Alive) { continue; } diff --git a/Content.Server/GameTicking/GameRules/RuleSuspicion.cs b/Content.Server/GameTicking/GameRules/RuleSuspicion.cs index a3d830412e..553df745a2 100644 --- a/Content.Server/GameTicking/GameRules/RuleSuspicion.cs +++ b/Content.Server/GameTicking/GameRules/RuleSuspicion.cs @@ -1,10 +1,10 @@ using System; using System.Threading; -using Content.Server.GameObjects.Components.Mobs; using Content.Server.Interfaces.Chat; using Content.Server.Interfaces.GameTicking; using Content.Server.Mobs.Roles; using Content.Server.Players; +using Content.Shared.GameObjects.Components.Damage; using Robust.Server.Interfaces.Player; using Robust.Shared.GameObjects; using Robust.Shared.IoC; @@ -30,6 +30,8 @@ namespace Content.Server.GameTicking.GameRules public override void Added() { + _chatManager.DispatchServerAnnouncement("There are traitors on the station! Find them, and kill them!"); + Timer.SpawnRepeating(DeadCheckDelay, _checkWinConditions, _checkTimerCancel.Token); } @@ -48,12 +50,12 @@ namespace Content.Server.GameTicking.GameRules foreach (var playerSession in _playerManager.GetAllPlayers()) { if (playerSession.AttachedEntity == null - || !playerSession.AttachedEntity.TryGetComponent(out SpeciesComponent species)) + || !playerSession.AttachedEntity.TryGetComponent(out IDamageableComponent damageable)) { continue; } - if (!species.CurrentDamageState.IsConscious) + if (damageable.CurrentDamageState != DamageState.Alive) { continue; } diff --git a/Content.Server/GameTicking/GameTickerCommands.cs b/Content.Server/GameTicking/GameTickerCommands.cs index 1d37695a78..a43f2d9498 100644 --- a/Content.Server/GameTicking/GameTickerCommands.cs +++ b/Content.Server/GameTicking/GameTickerCommands.cs @@ -1,12 +1,7 @@ using System; using System.Collections.Generic; -using System.Linq; -using Content.Server.Health.BodySystem; -using Content.Server.Health.BodySystem.BodyPart; using Content.Server.Interfaces.GameTicking; using Content.Server.Players; -using Content.Shared.Health.BodySystem; -using Content.Shared.Health.BodySystem.BodyPart; using Content.Shared.Maps; using Content.Shared.Roles; using Robust.Server.Interfaces.Console; @@ -14,12 +9,10 @@ using Robust.Server.Interfaces.Player; using Robust.Shared.GameObjects.Components.Transform; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.Map; -using Robust.Shared.Interfaces.Random; using Robust.Shared.IoC; using Robust.Shared.Map; using Robust.Shared.Network; using Robust.Shared.Prototypes; -using Robust.Shared.Random; using Robust.Shared.Utility; namespace Content.Server.GameTicking @@ -334,80 +327,6 @@ namespace Content.Server.GameTicking } } - class AddHandCommand : IClientCommand - { - public string Command => "addhand"; - public string Description => "Adds a hand to your entity."; - public string Help => $"Usage: {Command}"; - - public void Execute(IConsoleShell shell, IPlayerSession player, string[] args) - { - if (player == null) - { - shell.SendText((IPlayerSession) null, "Only a player can run this command."); - return; - } - - if (player.AttachedEntity == null) - { - shell.SendText(player, "You have no entity."); - return; - } - - if (!player.AttachedEntity.TryGetComponent(out BodyManagerComponent body)) - { - var random = IoCManager.Resolve(); - var text = $"You have no body{(random.Prob(0.2f) ? " and you must scream." : ".")}"; - - shell.SendText(player, text); - return; - } - - var prototypeManager = IoCManager.Resolve(); - prototypeManager.TryIndex("bodyPart.Hand.BasicHuman", out BodyPartPrototype prototype); - - var part = new BodyPart(prototype); - var slot = part.GetHashCode().ToString(); - - body.Template.Slots.Add(slot, BodyPartType.Hand); - body.InstallBodyPart(part, slot); - } - } - - class RemoveHandCommand : IClientCommand - { - public string Command => "removehand"; - public string Description => "Removes a hand from your entity."; - public string Help => $"Usage: {Command}"; - - public void Execute(IConsoleShell shell, IPlayerSession player, string[] args) - { - if (player == null) - { - shell.SendText((IPlayerSession) null, "Only a player can run this command."); - return; - } - - if (player.AttachedEntity == null) - { - shell.SendText(player, "You have no entity."); - return; - } - - var manager = player.AttachedEntity.GetComponent(); - var hand = manager.PartDictionary.FirstOrDefault(x => x.Value.PartType == BodyPartType.Hand); - if (hand.Value == null) - { - shell.SendText(player, "You have no hands."); - return; - } - else - { - manager.DisconnectBodyPart(hand.Value, true); - } - } - } - class TileWallsCommand : IClientCommand { // ReSharper disable once StringLiteralTypo diff --git a/Content.Server/GlobalVerbs/RejuvenateVerb.cs b/Content.Server/GlobalVerbs/RejuvenateVerb.cs index 5f074e085b..8d49222da8 100644 --- a/Content.Server/GlobalVerbs/RejuvenateVerb.cs +++ b/Content.Server/GlobalVerbs/RejuvenateVerb.cs @@ -1,6 +1,6 @@ -using Content.Server.GameObjects.Components.Damage; -using Content.Server.GameObjects.Components.Mobs; +using Content.Server.GameObjects.Components.Mobs; using Content.Server.GameObjects.Components.Nutrition; +using Content.Shared.GameObjects.Components.Damage; using Content.Shared.GameObjects.Verbs; using Robust.Server.Console; using Robust.Server.Interfaces.GameObjects; @@ -28,7 +28,7 @@ namespace Content.Server.GlobalVerbs if (user.TryGetComponent(out var player)) { - if (!target.HasComponent() && !target.HasComponent() && + if (!target.HasComponent() && !target.HasComponent() && !target.HasComponent()) { return; @@ -50,20 +50,24 @@ namespace Content.Server.GlobalVerbs PerformRejuvenate(target); } } + public static void PerformRejuvenate(IEntity target) { - if (target.TryGetComponent(out DamageableComponent damage)) + if (target.TryGetComponent(out IDamageableComponent damage)) { - damage.HealAllDamage(); + damage.Heal(); } + if (target.TryGetComponent(out HungerComponent hunger)) { hunger.ResetFood(); } + if (target.TryGetComponent(out ThirstComponent thirst)) { thirst.ResetThirst(); } + if (target.TryGetComponent(out StunnableComponent stun)) { stun.ResetStuns(); diff --git a/Content.Server/Health/BodySystem/BodyManagerComponent.cs b/Content.Server/Health/BodySystem/BodyManagerComponent.cs deleted file mode 100644 index c60ed9091c..0000000000 --- a/Content.Server/Health/BodySystem/BodyManagerComponent.cs +++ /dev/null @@ -1,402 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Content.Server.Health.BodySystem.BodyPart; -using Content.Server.Health.BodySystem.BodyPreset; -using Content.Server.Health.BodySystem.BodyTemplate; -using Content.Server.Interfaces.GameObjects.Components.Interaction; -using Content.Shared.Health.BodySystem; -using Content.Shared.Health.BodySystem.BodyPart; -using Content.Shared.Health.BodySystem.BodyPreset; -using Content.Shared.Health.BodySystem.BodyTemplate; -using Robust.Shared.GameObjects; -using Robust.Shared.Interfaces.GameObjects; -using Robust.Shared.IoC; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization; -using Robust.Shared.ViewVariables; - -namespace Content.Server.Health.BodySystem { - - /// - /// Component representing a collection of BodyParts attached to each other. - /// - [RegisterComponent] - public class BodyManagerComponent : Component, IBodyPartContainer { - - public sealed override string Name => "BodyManager"; -#pragma warning disable CS0649 - [Dependency] private IPrototypeManager _prototypeManager; -#pragma warning restore - - [ViewVariables] - private BodyTemplate.BodyTemplate _template; - - [ViewVariables] - private string _presetName; - - [ViewVariables] - private Dictionary _partDictionary = new Dictionary(); - - /// - /// The that this BodyManagerComponent is adhering to. - /// - public BodyTemplate.BodyTemplate Template => _template; - - /// - /// Maps slot name to the object filling it (if there is one). - /// - public Dictionary PartDictionary => _partDictionary; - - /// - /// List of all occupied slots in this body, taken from the values of _parts. - /// - public IEnumerable AllSlots - { - get - { - return _template.Slots.Keys; - } - } - - /// - /// List of all occupied slots in this body, taken from the values of _parts. - /// - public IEnumerable OccupiedSlots - { - get - { - return _partDictionary.Keys; - } - } - - /// - /// List of all BodyParts in this body, taken from the keys of _parts. - /// - public IEnumerable Parts { - get { - return _partDictionary.Values; - } - } - - /// - /// Recursive search that returns whether a given is connected to the center . - /// Not efficient (O(n^2)), but most bodies don't have a ton of BodyParts. - /// - public bool ConnectedToCenterPart(BodyPart.BodyPart target) { - List searchedSlots = new List { }; - if (TryGetSlotName(target, out string result)) - return false; - return ConnectedToCenterPartRecursion(searchedSlots, result); - } - private bool ConnectedToCenterPartRecursion(List searchedSlots, string slotName) { - TryGetBodyPart(slotName, out BodyPart.BodyPart part); - if (part != null && part == GetCenterBodyPart()) - return true; - searchedSlots.Add(slotName); - if (TryGetBodyPartConnections(slotName, out List connections)) { - foreach (string connection in connections) { - if (!searchedSlots.Contains(connection) && ConnectedToCenterPartRecursion(searchedSlots, connection)) - return true; - } - } - return false; - - } - - /// - /// Returns the central of this body based on the . For humans, this is the torso. Returns null if not found. - /// - public BodyPart.BodyPart GetCenterBodyPart() { - _partDictionary.TryGetValue(_template.CenterSlot, out BodyPart.BodyPart center); - return center; - } - - /// - /// Returns whether the given slot name exists within the current . - /// - public bool SlotExists(string slotName) - { - return _template.SlotExists(slotName); - } - - - /// - /// Grabs the in the given slotName if there is one. Returns true if a is found, - /// false otherwise. If false, result will be null. - /// - public bool TryGetBodyPart(string slotName, out BodyPart.BodyPart result) { - return _partDictionary.TryGetValue(slotName, out result); - } - - /// - /// Grabs the slotName that the given resides in. Returns true if the is - /// part of this body and a slot is found, false otherwise. If false, result will be null. - /// - public bool TryGetSlotName(BodyPart.BodyPart part, out string result) { - result = _partDictionary.FirstOrDefault(x => x.Value == part).Key; //We enforce that there is only one of each value in the dictionary, so we can iterate through the dictionary values to get the key from there. - return result == null; - } - - /// - /// Grabs the of the given slotName if there is one. Returns true if the slot is found, false otherwise. If false, result will be null. - /// - public bool TryGetSlotType(string slotName, out BodyPartType result) - { - return _template.Slots.TryGetValue(slotName, out result); - } - - /// - /// Grabs the names of all connected slots to the given slotName from the template. Returns true if connections are found to the slotName, false otherwise. If false, connections will be null. - /// - public bool TryGetBodyPartConnections(string slotName, out List connections) { - return _template.Connections.TryGetValue(slotName, out connections); - } - - /// - /// Grabs all occupied slots connected to the given slot, regardless of whether the target slot is occupied. Returns true if successful, false if there was an error or no connected BodyParts were found. - /// - public bool TryGetBodyPartConnections(string slotName, out List result) - { - result = null; - if (!_template.Connections.TryGetValue(slotName, out List connections)) - return false; - List toReturn = new List(); - foreach (string connection in connections) - { - if (TryGetBodyPart(connection, out BodyPart.BodyPart bodyPartResult)) - { - toReturn.Add(bodyPartResult); - } - } - if (toReturn.Count <= 0) - return false; - result = toReturn; - return true; - } - - - - - - - - ///////// - ///////// Server-specific stuff - ///////// - - public override void ExposeData(ObjectSerializer serializer) { - base.ExposeData(serializer); - - serializer.DataReadWriteFunction( - "BaseTemplate", - "bodyTemplate.Humanoid", - template => - { - if (!_prototypeManager.TryIndex(template, out BodyTemplatePrototype templateData)) - { - throw new InvalidOperationException("No BodyTemplatePrototype was found with the name " + template + " while loading a BodyTemplate!"); //Should never happen unless you fuck up the prototype. - } - - _template = new BodyTemplate.BodyTemplate(templateData); - }, - () => _template.Name); - - serializer.DataReadWriteFunction( - "BasePreset", - "bodyPreset.BasicHuman", - preset => - { - if (!_prototypeManager.TryIndex(preset, out BodyPresetPrototype presetData)) - { - throw new InvalidOperationException("No BodyPresetPrototype was found with the name " + preset + " while loading a BodyPreset!"); //Should never happen unless you fuck up the prototype. - } - - LoadBodyPreset(new BodyPreset.BodyPreset(presetData)); - }, - () => _presetName); - } - - /// - /// Loads the given - forcefully changes all limbs found in both the preset and this template! - /// - public void LoadBodyPreset(BodyPreset.BodyPreset preset) - { - _presetName = preset.Name; - - foreach (var (slotName, type) in _template.Slots) { - if (!preset.PartIDs.TryGetValue(slotName, out string partID)) { //For each slot in our BodyManagerComponent's template, try and grab what the ID of what the preset says should be inside it. - continue; //If the preset doesn't define anything for it, continue. - } - if (!_prototypeManager.TryIndex(partID, out BodyPartPrototype newPartData)) { //Get the BodyPartPrototype corresponding to the BodyPart ID we grabbed. - throw new InvalidOperationException("BodyPart prototype with ID " + partID + " could not be found!"); - } - - //Try and remove an existing limb if that exists. - if (_partDictionary.Remove(slotName, out var removedPart)) - { - BodyPartRemoved(removedPart, slotName); - } - - var addedPart = new BodyPart.BodyPart(newPartData); - _partDictionary.Add(slotName, addedPart); //Add a new BodyPart with the BodyPartPrototype as a baseline to our BodyComponent. - BodyPartAdded(addedPart, slotName); - } - } - - /// - /// Changes the current to the given . Attempts to keep previous BodyParts - /// if there is a slot for them in both . - /// - public void ChangeBodyTemplate(BodyTemplatePrototype newTemplate) { - foreach (KeyValuePair part in _partDictionary) { - //TODO: Make this work. - } - } - - /// - /// Grabs all BodyParts of the given type in this body. - /// - public List GetBodyPartsOfType(BodyPartType type) { - List toReturn = new List(); - foreach (var (slotName, bodyPart) in _partDictionary) { - if (bodyPart.PartType == type) - toReturn.Add(bodyPart); - } - return toReturn; - } - - - - /// - /// Installs the given into the given slot. Returns true if successful, false otherwise. - /// - public bool InstallBodyPart(BodyPart.BodyPart part, string slotName) - { - if (!SlotExists(slotName)) //Make sure the given slot exists - return false; - if (TryGetBodyPart(slotName, out BodyPart.BodyPart result)) //And that nothing is in it - return false; - _partDictionary.Add(slotName, part); - BodyPartAdded(part, slotName); - - return true; - } - /// - /// Installs the given into the given slot, deleting the afterwards. Returns true if successful, false otherwise. - /// - public bool InstallDroppedBodyPart(DroppedBodyPartComponent part, string slotName) - { - if (!InstallBodyPart(part.ContainedBodyPart, slotName)) - return false; - part.Owner.Delete(); - return true; - } - - - - /// - /// Disconnects the given reference, potentially dropping other BodyParts - /// if they were hanging off it. Returns the IEntity representing the dropped BodyPart. - /// - public IEntity DropBodyPart(BodyPart.BodyPart part) - { - if (!_partDictionary.ContainsValue(part)) - return null; - if (part != null) - { - string slotName = _partDictionary.FirstOrDefault(x => x.Value == part).Key; - _partDictionary.Remove(slotName); - if (TryGetBodyPartConnections(slotName, out List connections)) //Call disconnect on all limbs that were hanging off this limb. - { - foreach (string connectionName in connections) //This loop is an unoptimized travesty. TODO: optimize to be less shit - { - if (TryGetBodyPart(connectionName, out BodyPart.BodyPart result) && !ConnectedToCenterPart(result)) - { - DisconnectBodyPartByName(connectionName, true); - } - } - } - var partEntity = Owner.EntityManager.SpawnEntity("BaseDroppedBodyPart", Owner.Transform.GridPosition); - partEntity.GetComponent().TransferBodyPartData(part); - return partEntity; - } - return null; - } - - /// - /// Disconnects the given reference, potentially dropping other BodyParts if they were hanging off it. - /// - public void DisconnectBodyPart(BodyPart.BodyPart part, bool dropEntity) { - if (!_partDictionary.ContainsValue(part)) - return; - if (part != null) { - string slotName = _partDictionary.FirstOrDefault(x => x.Value == part).Key; - if (_partDictionary.Remove(slotName, out var partRemoved)) - { - BodyPartRemoved(partRemoved, slotName); - } - - if (TryGetBodyPartConnections(slotName, out List connections)) //Call disconnect on all limbs that were hanging off this limb. - { - foreach (string connectionName in connections) //This loop is an unoptimized travesty. TODO: optimize to be less shit - { - if (TryGetBodyPart(connectionName, out BodyPart.BodyPart result) && !ConnectedToCenterPart(result)) { - DisconnectBodyPartByName(connectionName, dropEntity); - } - } - } - if (dropEntity) { - var partEntity = Owner.EntityManager.SpawnEntity("BaseDroppedBodyPart", Owner.Transform.GridPosition); - partEntity.GetComponent().TransferBodyPartData(part); - } - } - } - - /// - /// Internal string version of DisconnectBodyPart for performance purposes. Yes, it is actually more performant. - /// - private void DisconnectBodyPartByName(string name, bool dropEntity) { - if (!TryGetBodyPart(name, out BodyPart.BodyPart part)) - return; - if (part != null) { - if (_partDictionary.Remove(name, out var partRemoved)) - { - BodyPartRemoved(partRemoved, name); - } - - if (TryGetBodyPartConnections(name, out List connections)) { - foreach (string connectionName in connections) { - if (TryGetBodyPart(connectionName, out BodyPart.BodyPart result) && !ConnectedToCenterPart(result)) { - DisconnectBodyPartByName(connectionName, dropEntity); - } - } - } - if (dropEntity) { - var partEntity = Owner.EntityManager.SpawnEntity("BaseDroppedBodyPart", Owner.Transform.GridPosition); - partEntity.GetComponent().TransferBodyPartData(part); - } - } - } - - private void BodyPartAdded(BodyPart.BodyPart part, string slotName) - { - var argsAdded = new BodyPartAddedEventArgs(part, slotName); - - foreach (var component in Owner.GetAllComponents().ToArray()) - { - component.BodyPartAdded(argsAdded); - } - } - - private void BodyPartRemoved(BodyPart.BodyPart part, string slotName) - { - var args = new BodyPartRemovedEventArgs(part, slotName); - - foreach (var component in Owner.GetAllComponents()) - { - component.BodyPartRemoved(args); - } - } - } -} diff --git a/Content.Server/Health/BodySystem/BodyPart/BodyPart.cs b/Content.Server/Health/BodySystem/BodyPart/BodyPart.cs deleted file mode 100644 index 92addbbebd..0000000000 --- a/Content.Server/Health/BodySystem/BodyPart/BodyPart.cs +++ /dev/null @@ -1,260 +0,0 @@ -using System; -using System.Collections.Generic; -using Content.Server.Health.BodySystem.Mechanism; -using Content.Server.Health.BodySystem.Surgery.Surgeon; -using Content.Server.Health.BodySystem.Surgery.SurgeryData; -using Content.Shared.Health.BodySystem; -using Content.Shared.Health.BodySystem.BodyPart; -using Content.Shared.Health.BodySystem.Mechanism; -using Content.Shared.Health.DamageContainer; -using Robust.Shared.Interfaces.GameObjects; -using Robust.Shared.Interfaces.Serialization; -using Robust.Shared.IoC; -using Robust.Shared.Prototypes; -using Robust.Shared.ViewVariables; - -namespace Content.Server.Health.BodySystem.BodyPart -{ - - - /// - /// Data class representing a singular limb such as an arm or a leg. Typically held within either a , - /// which coordinates functions between BodyParts, or a . - /// - public class BodyPart - { - - [ViewVariables] - private ISurgeryData _surgeryData; - - [ViewVariables] - private List _mechanisms = new List(); - - [ViewVariables] - private int _sizeUsed = 0; - - /// - /// The name of this BodyPart, often displayed to the user. For example, it could be named "advanced robotic arm". - /// - [ViewVariables] - public string Name { get; set; } - - /// - /// Plural version of this BodyPart name. - /// - [ViewVariables] - public string Plural { get; set; } - - /// - /// Path to the RSI that represents this BodyPart. - /// - [ViewVariables] - public string RSIPath { get; set; } - - /// - /// RSI state that represents this BodyPart. - /// - [ViewVariables] - public string RSIState { get; set; } - - /// - /// that this BodyPart is considered to be. For example, BodyPartType.Arm. - /// - [ViewVariables] - public BodyPartType PartType { get; set; } - - /// - /// Max HP of this BodyPart. - /// - [ViewVariables] - public int MaxDurability { get; set; } - - /// - /// Current HP of this BodyPart based on sum of all damage types. - /// - [ViewVariables] - public int CurrentDurability => MaxDurability - CurrentDamages.Damage; - - /// - /// Current damage dealt to this BodyPart. - /// - [ViewVariables] - public AbstractDamageContainer CurrentDamages { get; set; } - - /// - /// At what HP this BodyPartis completely destroyed. - /// - [ViewVariables] - public int DestroyThreshold { get; set; } - - /// - /// Armor of this BodyPart against attacks. - /// - [ViewVariables] - public float Resistance { get; set; } - - /// - /// Determines many things: how many mechanisms can be fit inside this BodyPart, whether a body can fit through tiny crevices, etc. - /// - [ViewVariables] - public int Size { get; set; } - - /// - /// What types of BodyParts this BodyPart can easily attach to. For the most part, most limbs aren't universal and require extra work to attach between types. - /// - [ViewVariables] - public BodyPartCompatibility Compatibility { get; set; } - - /// - /// List of properties, allowing for additional data classes to be attached to a limb, such as a "length" class to an arm. - /// - [ViewVariables] - public List Properties { get; set; } - - /// - /// List of all Mechanisms currently inside this BodyPart. - /// - [ViewVariables] - public List Mechanisms => _mechanisms; - - public BodyPart() { } - - public BodyPart(BodyPartPrototype data) - { - LoadFromPrototype(data); - } - - - - - - - public bool CanAttachBodyPart(BodyPart toBeConnected) - { - return _surgeryData.CanAttachBodyPart(toBeConnected); - } - - - - - - - /// - /// Returns whether the given can be installed on this BodyPart. - /// - public bool CanInstallMechanism(Mechanism.Mechanism mechanism) - { - if (_sizeUsed + mechanism.Size > Size) - return false; //No space - return _surgeryData.CanInstallMechanism(mechanism); - } - - /// - /// Attempts to add a . Returns true if successful, false if there was an error (e.g. not enough room in BodyPart). Call InstallDroppedMechanism instead if you want to easily install an IEntity with a DroppedMechanismComponent. - /// - public bool TryInstallMechanism(Mechanism.Mechanism mechanism) - { - if (CanInstallMechanism(mechanism)) - { - _mechanisms.Add(mechanism); - _sizeUsed += mechanism.Size; - return true; - } - return false; - } - - /// - /// Attempts to install a into the given limb, potentially deleting the dropped . Returns true if successful, false if there was an error (e.g. not enough room in BodyPart). - /// - public bool TryInstallDroppedMechanism(DroppedMechanismComponent droppedMechanism) - { - if (!TryInstallMechanism(droppedMechanism.ContainedMechanism)) - return false; //Installing the mechanism failed for some reason. - droppedMechanism.Owner.Delete(); - return true; - } - - /// - /// Tries to remove the given reference from this BodyPart. Returns null if there was an error in spawning the entity or removing the mechanism, otherwise returns a reference to the on the newly spawned entity. - /// - public DroppedMechanismComponent DropMechanism(IEntity dropLocation, Mechanism.Mechanism mechanismTarget) - { - if (!_mechanisms.Contains(mechanismTarget)) - return null; - _mechanisms.Remove(mechanismTarget); - _sizeUsed -= mechanismTarget.Size; - IEntityManager entityManager = IoCManager.Resolve(); - var mechanismEntity = entityManager.SpawnEntity("BaseDroppedMechanism", dropLocation.Transform.GridPosition); - var droppedMechanism = mechanismEntity.GetComponent(); - droppedMechanism.InitializeDroppedMechanism(mechanismTarget); - return droppedMechanism; - } - - /// - /// Tries to destroy the given in the given BodyPart. Returns false if there was an error, true otherwise. Does NOT spawn a dropped entity. - /// - public bool DestroyMechanism(BodyPart bodyPartTarget, Mechanism.Mechanism mechanismTarget) - { - if (!_mechanisms.Contains(mechanismTarget)) - return false; - _mechanisms.Remove(mechanismTarget); - _sizeUsed -= mechanismTarget.Size; - return true; - } - - - - - - /// - /// Returns whether the given can be used on the current state of this BodyPart. - /// - public bool SurgeryCheck(SurgeryType toolType) - { - return _surgeryData.CheckSurgery(toolType); - } - - /// - /// Attempts to perform surgery on this BodyPart with the given tool. Returns false if there was an error, true if successful. - /// - public bool AttemptSurgery(SurgeryType toolType, IBodyPartContainer target, ISurgeon surgeon, IEntity performer) - { - return _surgeryData.PerformSurgery(toolType, target, surgeon, performer); - } - - - - - - /// - /// Loads the given - current data on this will be overwritten! - /// - public virtual void LoadFromPrototype(BodyPartPrototype data) - { - Name = data.Name; - Plural = data.Plural; - PartType = data.PartType; - RSIPath = data.RSIPath; - RSIState = data.RSIState; - MaxDurability = data.Durability; - CurrentDamages = new BiologicalDamageContainer(); - Resistance = data.Resistance; - Size = data.Size; - Compatibility = data.Compatibility; - Properties = data.Properties; - //_surgeryData = (ISurgeryData) Activator.CreateInstance(null, data.SurgeryDataName); - //TODO: figure out a way to convert a string name in the YAML to the proper class (reflection won't work for reasons) - _surgeryData = new BiologicalSurgeryData(this); - IPrototypeManager prototypeManager = IoCManager.Resolve(); - foreach (string mechanismPrototypeID in data.Mechanisms) - { - if (!prototypeManager.TryIndex(mechanismPrototypeID, out MechanismPrototype mechanismData)) - { - throw new InvalidOperationException("No MechanismPrototype was found with the name " + mechanismPrototypeID + " while loading a BodyPartPrototype!"); - } - _mechanisms.Add(new Mechanism.Mechanism(mechanismData)); - } - - } - } -} diff --git a/Content.Server/Health/BodySystem/BodyPreset/BodyPreset.cs b/Content.Server/Health/BodySystem/BodyPreset/BodyPreset.cs deleted file mode 100644 index 83bd17a1b8..0000000000 --- a/Content.Server/Health/BodySystem/BodyPreset/BodyPreset.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Collections.Generic; -using Content.Server.Health.BodySystem.BodyPart; -using Content.Shared.Health.BodySystem.BodyPart; -using Content.Shared.Health.BodySystem.BodyPreset; -using Robust.Shared.ViewVariables; - -namespace Content.Server.Health.BodySystem.BodyPreset { - - /// - /// Stores data on what BodyPartPrototypes should fill a BodyTemplate. Used for loading complete body presets, like a "basic human" with all human limbs. - /// - public class BodyPreset { - private string _name; - private Dictionary _partIDs; - - [ViewVariables] - public string Name => _name; - - /// - /// Maps a template slot to the ID of the that should fill it. E.g. "right arm" : "BodyPart.arm.basic_human". - /// - [ViewVariables] - public Dictionary PartIDs => _partIDs; - - public BodyPreset(BodyPresetPrototype data) - { - LoadFromPrototype(data); - } - - public virtual void LoadFromPrototype(BodyPresetPrototype data) - { - _name = data.Name; - _partIDs = data.PartIDs; - } - } -} diff --git a/Content.Server/Health/BodySystem/BodyScanner/BodyScannerComponent.cs b/Content.Server/Health/BodySystem/BodyScanner/BodyScannerComponent.cs deleted file mode 100644 index ee0f7a34c6..0000000000 --- a/Content.Server/Health/BodySystem/BodyScanner/BodyScannerComponent.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System.Collections.Generic; -using Content.Shared.Health.BodySystem.BodyScanner; -using Content.Shared.Interfaces.GameObjects.Components; -using Robust.Server.GameObjects.Components.UserInterface; -using Robust.Server.Interfaces.GameObjects; -using Robust.Shared.GameObjects; - -namespace Content.Server.Health.BodySystem.BodyScanner -{ - [RegisterComponent] - [ComponentReference(typeof(IActivate))] - public class BodyScannerComponent : Component, IActivate - { - public sealed override string Name => "BodyScanner"; - - private BoundUserInterface _userInterface; - - public override void Initialize() - { - base.Initialize(); - _userInterface = Owner.GetComponent().GetBoundUserInterface(BodyScannerUiKey.Key); - _userInterface.OnReceiveMessage += UserInterfaceOnOnReceiveMessage; - } - - private void UserInterfaceOnOnReceiveMessage(ServerBoundUserInterfaceMessage serverMsg) - { - - } - - void IActivate.Activate(ActivateEventArgs eventArgs) - { - if (!eventArgs.User.TryGetComponent(out IActorComponent actor)) - { - return; - } - - if (actor.playerSession.AttachedEntity.TryGetComponent(out BodyManagerComponent attempt)) - { - _userInterface.SetState(PrepareBodyScannerInterfaceState(attempt.Template, attempt.PartDictionary)); - } - _userInterface.Open(actor.playerSession); - } - - - /// - /// Copy BodyTemplate and BodyPart data into a common data class that the client can read. - /// - private BodyScannerInterfaceState PrepareBodyScannerInterfaceState(BodyTemplate.BodyTemplate template, Dictionary bodyParts) - { - Dictionary partsData = new Dictionary(); - foreach (var(slotname, bpart) in bodyParts) { - List mechanismData = new List(); - foreach (var mech in bpart.Mechanisms) - { - mechanismData.Add(new BodyScannerMechanismData(mech.Name, mech.Description, mech.RSIPath, mech.RSIState, mech.MaxDurability, mech.CurrentDurability)); - } - partsData.Add(slotname, new BodyScannerBodyPartData(bpart.Name, bpart.RSIPath, bpart.RSIState, bpart.MaxDurability, bpart.CurrentDurability, mechanismData)); - } - BodyScannerTemplateData templateData = new BodyScannerTemplateData(template.Name, template.Slots); - return new BodyScannerInterfaceState(partsData, templateData); - } - - } -} diff --git a/Content.Server/Health/BodySystem/BodyTemplate/BodyTemplate.cs b/Content.Server/Health/BodySystem/BodyTemplate/BodyTemplate.cs deleted file mode 100644 index a5a7498543..0000000000 --- a/Content.Server/Health/BodySystem/BodyTemplate/BodyTemplate.cs +++ /dev/null @@ -1,113 +0,0 @@ -using System; -using System.Collections.Generic; -using Content.Shared.Health.BodySystem; -using Content.Shared.Health.BodySystem.BodyTemplate; -using Robust.Shared.ViewVariables; - -namespace Content.Server.Health.BodySystem.BodyTemplate { - - /// - /// This class is a data capsule representing the standard format of a . For instance, the "humanoid" BodyTemplate - /// defines two arms, each connected to a torso and so on. Capable of loading data from a . - /// - public class BodyTemplate { - - [ViewVariables] - public string Name; - - /// - /// The name of the center BodyPart. For humans, this is set to "torso". Used in many calculations. - /// - [ViewVariables] - public string CenterSlot { get; set; } - - /// - /// Maps all parts on this template to its BodyPartType. For instance, "right arm" is mapped to "BodyPartType.arm" on the humanoid template. - /// - [ViewVariables] - public Dictionary Slots { get; set; } - - /// - /// Maps limb name to the list of their connections to other limbs. For instance, on the humanoid template "torso" is mapped to a list containing "right arm", "left arm", - /// "left leg", and "right leg". This is mapped both ways during runtime, but in the prototype only one way has to be defined, i.e., "torso" to "left arm" will automatically - /// map "left arm" to "torso". - /// - [ViewVariables] - public Dictionary> Connections { get; set; } - - public BodyTemplate() - { - Name = "empty"; - Slots = new Dictionary(); - Connections = new Dictionary>(); - CenterSlot = ""; - } - - public BodyTemplate(BodyTemplatePrototype data) - { - LoadFromPrototype(data); - } - - public bool Equals(BodyTemplate other) - { - return GetHashCode() == other.GetHashCode(); - } - - /// - /// Returns whether the given slot exists in this BodyTemplate. - /// - public bool SlotExists(string slotName) - { - foreach (string slot in Slots.Keys) - { - if (slot == slotName) //string comparison xd - return true; - } - return false; - } - - /// - /// Returns an integer unique to this BodyTemplate's layout. It does not matter in which order the Connections or Slots are defined. - /// - public override int GetHashCode() - { - int slotsHash = 0; - int connectionsHash = 0; - - foreach (var(key, value) in Slots) - { - int slot = key.GetHashCode(); - slot = HashCode.Combine(slot, value.GetHashCode()); - slotsHash = slotsHash ^ slot; - } - - List connections = new List(); - foreach (var (key, value) in Connections) - { - foreach (var targetBodyPart in value) - { - int connection = key.GetHashCode() ^ targetBodyPart.GetHashCode(); - if (!connections.Contains(connection)) - connections.Add(connection); - } - } - foreach (int connection in connections) - { - connectionsHash = connectionsHash ^ connection; - } - - int hash = HashCode.Combine(slotsHash, connectionsHash, CenterSlot.GetHashCode()); - if (hash == 0) //One of the unit tests considers 0 to be an error, but it will be 0 if the BodyTemplate is empty, so let's shift that up to 1. - hash++; - return hash; - } - - public virtual void LoadFromPrototype(BodyTemplatePrototype data) - { - Name = data.Name; - CenterSlot = data.CenterSlot; - Slots = data.Slots; - Connections = data.Connections; - } - } -} diff --git a/Content.Server/Health/BodySystem/IBodyPartContainer.cs b/Content.Server/Health/BodySystem/IBodyPartContainer.cs deleted file mode 100644 index c23b8ec1f5..0000000000 --- a/Content.Server/Health/BodySystem/IBodyPartContainer.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Content.Server.Health.BodySystem.Surgery.SurgeryData; - -namespace Content.Server.Health.BodySystem -{ - - /// - /// Making a class inherit from this interface allows you to do many things with it in the class. This includes passing - /// it as an argument to a delegate, as to later typecast it back to the original class type. Every BodyPart also needs an - /// IBodyPartContainer to be its parent (i.e. the BodyManagerComponent holds many BodyParts, each of which have an upward reference to it). - /// - - public interface IBodyPartContainer - { - - } -} diff --git a/Content.Server/Health/BodySystem/Mechanism/Mechanism.cs b/Content.Server/Health/BodySystem/Mechanism/Mechanism.cs deleted file mode 100644 index 1ea508a782..0000000000 --- a/Content.Server/Health/BodySystem/Mechanism/Mechanism.cs +++ /dev/null @@ -1,105 +0,0 @@ -using Content.Server.Health.BodySystem.BodyPart; -using Content.Shared.Health.BodySystem; -using Content.Shared.Health.BodySystem.Mechanism; -using Robust.Shared.ViewVariables; - -namespace Content.Server.Health.BodySystem.Mechanism { - - /// - /// Data class representing a persistent item inside a . This includes livers, eyes, cameras, brains, explosive implants, binary communicators, and other things. - /// - public class Mechanism { - - [ViewVariables] - public string Name { get; set; } - - /// - /// Professional description of the Mechanism. - /// - [ViewVariables] - public string Description { get; set; } - - /// - /// The message to display upon examining a mob with this Mechanism installed. If the string is empty (""), no message will be displayed. - /// - [ViewVariables] - public string ExamineMessage { get; set; } - - /// - /// Path to the RSI that represents this Mechanism. - /// - [ViewVariables] - public string RSIPath { get; set; } - - /// - /// RSI state that represents this Mechanism. - /// - [ViewVariables] - public string RSIState { get; set; } - - /// - /// Max HP of this Mechanism. - /// - [ViewVariables] - public int MaxDurability { get; set; } - - /// - /// Current HP of this Mechanism. - /// - [ViewVariables] - public int CurrentDurability { get; set; } - - /// - /// At what HP this Mechanism is completely destroyed. - /// - [ViewVariables] - public int DestroyThreshold { get; set; } - - /// - /// Armor of this Mechanism against attacks. - /// - [ViewVariables] - public int Resistance { get; set; } - - /// - /// Determines a handful of things - mostly whether this Mechanism can fit into a BodyPart. - /// - [ViewVariables] - public int Size { get; set; } - - /// - /// What kind of BodyParts this Mechanism can be easily installed into. - /// - [ViewVariables] - public BodyPartCompatibility Compatibility { get; set; } - - public Mechanism(MechanismPrototype data) - { - LoadFromPrototype(data); - } - - - - - - - /// - /// Loads the given - current data on this Mechanism will be overwritten! - /// - public void LoadFromPrototype(MechanismPrototype data) - { - Name = data.Name; - Description = data.Description; - ExamineMessage = data.ExamineMessage; - RSIPath = data.RSIPath; - RSIState = data.RSIState; - MaxDurability = data.Durability; - CurrentDurability = MaxDurability; - DestroyThreshold = data.DestroyThreshold; - Resistance = data.Resistance; - Size = data.Size; - Compatibility = data.Compatibility; - } - } -} - diff --git a/Content.Server/Health/BodySystem/Surgery/Surgeon/ISurgeon.cs b/Content.Server/Health/BodySystem/Surgery/Surgeon/ISurgeon.cs deleted file mode 100644 index 6d586b01e5..0000000000 --- a/Content.Server/Health/BodySystem/Surgery/Surgeon/ISurgeon.cs +++ /dev/null @@ -1,29 +0,0 @@ -using System.Collections.Generic; -using Content.Server.Health.BodySystem.Surgery.SurgeryData; -using Robust.Shared.Interfaces.GameObjects; - -namespace Content.Server.Health.BodySystem.Surgery.Surgeon -{ - - /// - /// Interface representing an entity capable of performing surgery (performing operations on an class). - /// For an example see , which inherits from this class. - /// - public interface ISurgeon - { - /// - /// How long it takes to perform a single surgery step (in seconds). - /// - public float BaseOperationTime { get; set; } - - - public delegate void MechanismRequestCallback(Mechanism.Mechanism target, IBodyPartContainer container, ISurgeon surgeon, IEntity performer); - - /// - /// When performing a surgery, the may sometimes require selecting from a set of Mechanisms to operate on. - /// This function is called in that scenario, and it is expected that you call the callback with one mechanism from the provided list. - /// - public void RequestMechanism(List options, MechanismRequestCallback callback); - } - -} diff --git a/Content.Server/Health/BodySystem/Surgery/SurgeryData/BiologicalSurgeryData.cs b/Content.Server/Health/BodySystem/Surgery/SurgeryData/BiologicalSurgeryData.cs deleted file mode 100644 index bb3917a7dc..0000000000 --- a/Content.Server/Health/BodySystem/Surgery/SurgeryData/BiologicalSurgeryData.cs +++ /dev/null @@ -1,193 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using Content.Server.Health.BodySystem.Surgery.Surgeon; -using Content.Shared.Health.BodySystem; -using Content.Shared.Interfaces; -using Robust.Shared.Interfaces.GameObjects; -using Robust.Shared.Localization; - -namespace Content.Server.Health.BodySystem.Surgery.SurgeryData -{ - - /// - /// Data class representing the surgery state of a biological entity. - /// - public class BiologicalSurgeryData : ISurgeryData - { - - protected bool _skinOpened = false; - protected bool _vesselsClamped = false; - protected bool _skinRetracted = false; - protected List _disconnectedOrgans = new List(); - - public BiologicalSurgeryData(BodyPart.BodyPart parent) : base(parent) { } - - public override SurgeryAction GetSurgeryStep(SurgeryType toolType) - { - if (toolType == SurgeryType.Amputation) - { - return RemoveBodyPartSurgery; - } - if (!_skinOpened) //Case: skin is normal. - { - if (toolType == SurgeryType.Incision) - return OpenSkinSurgery; - } - else if (!_vesselsClamped) //Case: skin is opened, but not clamped. - { - if (toolType == SurgeryType.VesselCompression) - return ClampVesselsSurgery; - else if (toolType == SurgeryType.Cauterization) - return CautizerizeIncisionSurgery; - } - else if (!_skinRetracted) //Case: skin is opened and clamped, but not retracted. - { - if (toolType == SurgeryType.Retraction) - return RetractSkinSurgery; - else if (toolType == SurgeryType.Cauterization) - return CautizerizeIncisionSurgery; - } - else //Case: skin is fully open. - { - if (_parent.Mechanisms.Count > 0 && toolType == SurgeryType.VesselCompression && (_disconnectedOrgans.Except(_parent.Mechanisms).Count() != 0 || _parent.Mechanisms.Except(_disconnectedOrgans).Count() != 0)) - return LoosenOrganSurgery; - else if (_disconnectedOrgans.Count > 0 && toolType == SurgeryType.Incision) - return RemoveOrganSurgery; - else if (toolType == SurgeryType.Cauterization) - return CautizerizeIncisionSurgery; - } - return null; - } - - public override string GetDescription(IEntity target) - { - string toReturn = ""; - if (_skinOpened && !_vesselsClamped) //Case: skin is opened, but not clamped. - { - toReturn += Loc.GetString("The skin on {0:their} {1} has an incision, but it is prone to bleeding.\n", target, _parent.Name); - } - else if (_skinOpened && _vesselsClamped && !_skinRetracted) //Case: skin is opened and clamped, but not retracted. - { - toReturn += Loc.GetString("The skin on {0:their} {1} has an incision, but it is not retracted.\n", target, _parent.Name); - } - else if (_skinOpened && _vesselsClamped && _skinRetracted) //Case: skin is fully open. - { - toReturn += Loc.GetString("There is an incision on {0:their} {1}.\n", target, _parent.Name); - foreach (Mechanism.Mechanism mechanism in _disconnectedOrgans) - { - toReturn += Loc.GetString("{0:their} {1} is loose.\n", target, mechanism.Name); - } - } - return toReturn; - } - - public override bool CanInstallMechanism(Mechanism.Mechanism toBeInstalled) - { - return _skinOpened && _vesselsClamped && _skinRetracted; - } - - public override bool CanAttachBodyPart(BodyPart.BodyPart toBeConnected) - { - return true; - //TODO: if a bodypart is disconnected, you should have to do some surgery to allow another bodypart to be attached. - } - - - - - - - protected void OpenSkinSurgery(IBodyPartContainer container, ISurgeon surgeon, IEntity performer) - { - performer.PopupMessage(performer, Loc.GetString("Cut open the skin...")); - //Delay? - _skinOpened = true; - } - - - protected void ClampVesselsSurgery(IBodyPartContainer container, ISurgeon surgeon, IEntity performer) - { - performer.PopupMessage(performer, Loc.GetString("Clamp the vessels...")); - //Delay? - _vesselsClamped = true; - } - - - protected void RetractSkinSurgery(IBodyPartContainer container, ISurgeon surgeon, IEntity performer) - { - performer.PopupMessage(performer, Loc.GetString("Retract the skin...")); - //Delay? - _skinRetracted = true; - } - - - protected void CautizerizeIncisionSurgery(IBodyPartContainer container, ISurgeon surgeon, IEntity performer) - { - performer.PopupMessage(performer, Loc.GetString("Cauterize the incision...")); - //Delay? - _skinOpened = false; - _vesselsClamped = false; - _skinRetracted = false; - } - - - protected void LoosenOrganSurgery(IBodyPartContainer container, ISurgeon surgeon, IEntity performer) - { - if (_parent.Mechanisms.Count <= 0) - return; - List toSend = new List(); - foreach (Mechanism.Mechanism mechanism in _parent.Mechanisms) - { - if (!_disconnectedOrgans.Contains(mechanism)) - toSend.Add(mechanism); - } - if (toSend.Count > 0) - surgeon.RequestMechanism(toSend, LoosenOrganSurgeryCallback); - } - public void LoosenOrganSurgeryCallback(Mechanism.Mechanism target, IBodyPartContainer container, ISurgeon surgeon, IEntity performer) - { - if (target != null && _parent.Mechanisms.Contains(target)) - { - performer.PopupMessage(performer, Loc.GetString("Loosen the organ...")); - //Delay? - _disconnectedOrgans.Add(target); - } - } - - - protected void RemoveOrganSurgery(IBodyPartContainer container, ISurgeon surgeon, IEntity performer) - { - if (_disconnectedOrgans.Count <= 0) - return; - if (_disconnectedOrgans.Count == 1) - RemoveOrganSurgeryCallback(_disconnectedOrgans[0], container, surgeon, performer); - else - surgeon.RequestMechanism(_disconnectedOrgans, RemoveOrganSurgeryCallback); - - - } - public void RemoveOrganSurgeryCallback(Mechanism.Mechanism target, IBodyPartContainer container, ISurgeon surgeon, IEntity performer) - { - if (target != null && _parent.Mechanisms.Contains(target)) - { - performer.PopupMessage(performer, Loc.GetString("Remove the organ...")); - //Delay? - _parent.DropMechanism(performer, target); - _disconnectedOrgans.Remove(target); - } - } - - - protected void RemoveBodyPartSurgery(IBodyPartContainer container, ISurgeon surgeon, IEntity performer) - { - if (!(container is BodyManagerComponent)) //This surgery requires a DroppedBodyPartComponent. - return; - BodyManagerComponent bmTarget = (BodyManagerComponent) container; - performer.PopupMessage(performer, Loc.GetString("Saw off the limb!")); - //Delay? - bmTarget.DisconnectBodyPart(_parent, true); - } - - - } -} diff --git a/Content.Server/Health/BodySystem/Surgery/SurgeryData/ISurgeryData.cs b/Content.Server/Health/BodySystem/Surgery/SurgeryData/ISurgeryData.cs deleted file mode 100644 index 47a0aba4c1..0000000000 --- a/Content.Server/Health/BodySystem/Surgery/SurgeryData/ISurgeryData.cs +++ /dev/null @@ -1,81 +0,0 @@ -using Content.Server.Health.BodySystem.BodyPart; -using Content.Server.Health.BodySystem.Mechanism; -using Content.Server.Health.BodySystem.Surgery.Surgeon; -using Content.Shared.Health.BodySystem; -using Robust.Shared.Interfaces.GameObjects; - -namespace Content.Server.Health.BodySystem.Surgery.SurgeryData -{ - - - - /// - /// This data class represents the state of a in regards to everything surgery related - whether there's an incision on it, whether the bone is broken, etc. - /// - public abstract class ISurgeryData - { - - /// - /// The this surgeryData is attached to. The ISurgeryData class should not exist without a that it - /// represents, and will throw errors if it is null. - /// - protected BodyPart.BodyPart _parent; - - /// - /// The of the parent . - /// - protected BodyPartType _parentType => _parent.PartType; - - public delegate void SurgeryAction(IBodyPartContainer container, ISurgeon surgeon, IEntity performer); - - - - public ISurgeryData(BodyPart.BodyPart parent) - { - _parent = parent; - } - - /// - /// Returns the description of this current to be shown upon observing the given entity. - /// - public abstract string GetDescription(IEntity target); - - /// - /// Returns whether a can be installed into the this ISurgeryData represents. - /// - public abstract bool CanInstallMechanism(Mechanism.Mechanism toBeInstalled); - - /// - /// Returns whether the given can be connected to the this ISurgeryData represents. - /// - public abstract bool CanAttachBodyPart(BodyPart.BodyPart toBeConnected); - - /// - /// Gets the delegate corresponding to the surgery step using the given . Returns null if no surgery step can be performed. - /// - public abstract SurgeryAction GetSurgeryStep(SurgeryType toolType); - - /// - /// Returns whether the given can be used to perform a surgery on the BodyPart this represents. - /// - public bool CheckSurgery(SurgeryType toolType) - { - return GetSurgeryStep(toolType) != null; - } - - /// - /// Attempts to perform surgery of the given . Returns whether the operation was successful. - /// - /// The used for this surgery. - /// The entity performing the surgery. - public bool PerformSurgery(SurgeryType surgeryType, IBodyPartContainer container, ISurgeon surgeon, IEntity performer) - { - SurgeryAction step = GetSurgeryStep(surgeryType); - if (step == null) - return false; - step(container, surgeon, performer); - return true; - } - - } -} diff --git a/Content.Server/Interfaces/GameObjects/Components/Damage/IDamageableComponent.cs b/Content.Server/Interfaces/GameObjects/Components/Damage/IDamageableComponent.cs deleted file mode 100644 index ad88349bdd..0000000000 --- a/Content.Server/Interfaces/GameObjects/Components/Damage/IDamageableComponent.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using Content.Server.GameObjects.Components.Damage; -using Content.Shared.GameObjects.Components.Damage; -using Robust.Shared.Interfaces.GameObjects; - -namespace Content.Server.Interfaces.GameObjects.Components.Damage -{ - public interface IDamageableComponent : IComponent - { - event EventHandler DamageThresholdPassed; - ResistanceSet Resistances { get; } - - /// - /// The function that handles receiving damage. - /// Converts damage via the resistance set then applies it - /// and informs components of thresholds passed as necessary. - /// - /// Type of damage being received. - /// Amount of damage being received. - /// Entity that damaged this entity. - /// Mob that damaged this entity. - void TakeDamage(DamageType damageType, int amount, IEntity source, IEntity sourceMob); - - /// - /// Handles receiving healing. - /// Converts healing via the resistance set then applies it - /// and informs components of thresholds passed as necessary. - /// - /// Type of healing being received. - /// Amount of healing being received. - /// Entity that healed this entity. - /// Mob that healed this entity. - void TakeHealing(DamageType damageType, int amount, IEntity source, IEntity sourceMob); - } -} diff --git a/Content.Server/Interfaces/GameObjects/Components/Interaction/IBodyPartAdded.cs b/Content.Server/Interfaces/GameObjects/Components/Interaction/IBodyPartAdded.cs index 0cca658e90..f261d6edc5 100644 --- a/Content.Server/Interfaces/GameObjects/Components/Interaction/IBodyPartAdded.cs +++ b/Content.Server/Interfaces/GameObjects/Components/Interaction/IBodyPartAdded.cs @@ -1,5 +1,5 @@ using System; -using Content.Server.Health.BodySystem.BodyPart; +using Content.Server.Body; namespace Content.Server.Interfaces.GameObjects.Components.Interaction { diff --git a/Content.Server/Interfaces/GameObjects/IOnDamageBehavior.cs b/Content.Server/Interfaces/GameObjects/IOnDamageBehavior.cs deleted file mode 100644 index 911d30b031..0000000000 --- a/Content.Server/Interfaces/GameObjects/IOnDamageBehavior.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System.Collections.Generic; -using Content.Server.GameObjects.Components.Damage; - -namespace Content.Server.Interfaces.GameObjects -{ - /// - /// Any component/entity that has behaviour linked to taking damage should implement this interface. - /// TODO: Don't know how to work around this currently, but due to how events work - /// you need to hook it up to the DamageableComponent via Initialize(). - /// See DestructibleComponent.Initialize() for an example. - /// - interface IOnDamageBehavior - { - /// - /// Gets a list of all DamageThresholds this component/entity are interested in. - /// - /// List of DamageThresholds to be added to DamageableComponent for watching. - List GetAllDamageThresholds() => null; - - /// - /// Damage threshold passed event hookup. - /// - /// Damageable component. - /// Damage threshold and whether it's passed in one way or another. - void OnDamageThresholdPassed(object obj, DamageThresholdPassedEventArgs e) { } - - /// - /// Called when the entity is damaged. - /// - /// Damageable component. - /// DamageEventArgs - void OnDamaged(object obj, DamageEventArgs e) { } - } -} diff --git a/Content.Server/Interfaces/GameObjects/ISuicideAct.cs b/Content.Server/Interfaces/GameObjects/ISuicideAct.cs index fb6ed4ade5..78d0d9974f 100644 --- a/Content.Server/Interfaces/GameObjects/ISuicideAct.cs +++ b/Content.Server/Interfaces/GameObjects/ISuicideAct.cs @@ -13,11 +13,13 @@ namespace Content.Server.Interfaces.GameObjects Special, //Doesn't damage the mob, used for "weird" suicides like gibbing //Damage type suicides - Brute, + Blunt, + Piercing, Heat, - Cold, - Acid, - Toxic, - Electric + Disintegration, + Cellular, + DNA, + Asphyxiation + } } diff --git a/Content.Server/Mobs/StandingStateHelper.cs b/Content.Server/Mobs/StandingStateHelper.cs index 1f6f692a0f..f008b6ccc9 100644 --- a/Content.Server/Mobs/StandingStateHelper.cs +++ b/Content.Server/Mobs/StandingStateHelper.cs @@ -1,6 +1,6 @@ using Content.Server.Interfaces.GameObjects.Components.Items; using Content.Shared.Audio; -using Content.Shared.GameObjects.Components.Mobs; +using Content.Shared.GameObjects.Components.Rotation; using Content.Shared.GameObjects.EntitySystems; using Robust.Server.GameObjects; using Robust.Server.GameObjects.EntitySystems; @@ -31,12 +31,12 @@ namespace Content.Server.Mobs return false; } - var newState = SharedSpeciesComponent.MobState.Down; - appearance.TryGetData(SharedSpeciesComponent.MobVisuals.RotationState, out var oldState); + var newState = RotationState.Horizontal; + appearance.TryGetData(RotationVisuals.RotationState, out var oldState); if (newState != oldState) { - appearance.SetData(SharedSpeciesComponent.MobVisuals.RotationState, newState); + appearance.SetData(RotationVisuals.RotationState, newState); } if (playSound) @@ -61,12 +61,12 @@ namespace Content.Server.Mobs public static bool Standing(IEntity entity) { if (!entity.TryGetComponent(out AppearanceComponent appearance)) return false; - appearance.TryGetData(SharedSpeciesComponent.MobVisuals.RotationState, out var oldState); - var newState = SharedSpeciesComponent.MobState.Standing; + appearance.TryGetData(RotationVisuals.RotationState, out var oldState); + var newState = RotationState.Vertical; if (newState == oldState) return false; - appearance.SetData(SharedSpeciesComponent.MobVisuals.RotationState, newState); + appearance.SetData(RotationVisuals.RotationState, newState); return true; } diff --git a/Content.Server/Observer/Ghost.cs b/Content.Server/Observer/Ghost.cs index 004f5951ee..6c71882c9e 100644 --- a/Content.Server/Observer/Ghost.cs +++ b/Content.Server/Observer/Ghost.cs @@ -1,8 +1,8 @@ -using Content.Server.GameObjects.Components.Damage; using Content.Server.GameObjects.Components.Mobs; using Content.Server.GameObjects.Components.Observer; using Content.Server.Interfaces.GameTicking; using Content.Server.Players; +using Content.Shared.Damage; using Content.Shared.GameObjects.Components.Damage; using Content.Shared.GameObjects.Components.Mobs; using Robust.Server.Interfaces.Console; @@ -42,19 +42,16 @@ namespace Content.Server.Observer var position = player.AttachedEntity?.Transform.GridPosition ?? IoCManager.Resolve().GetObserverSpawnPoint(); - - - if (canReturn && player.AttachedEntity.TryGetComponent(out SpeciesComponent species)) + if (canReturn && player.AttachedEntity.TryGetComponent(out IDamageableComponent damageable)) { - switch (species.CurrentDamageState) + switch (damageable.CurrentDamageState) { - case DeadState _: + case DamageState.Dead: canReturn = true; break; - case CriticalState _: + case DamageState.Critical: canReturn = true; - if (!player.AttachedEntity.TryGetComponent(out DamageableComponent damageable)) break; - damageable.TakeDamage(DamageType.Total, 100); // TODO: Use airloss/oxyloss instead + damageable.ChangeDamage(DamageType.Asphyxiation, 100, true, null); //todo: what if they dont breathe lol break; default: canReturn = false; diff --git a/Content.Server/ServerContentIoC.cs b/Content.Server/ServerContentIoC.cs index c9d618b004..0083b4c8bd 100644 --- a/Content.Server/ServerContentIoC.cs +++ b/Content.Server/ServerContentIoC.cs @@ -1,5 +1,6 @@ using Content.Server.AI.Utility.Considerations; using Content.Server.AI.WorldState; +using Content.Server.Body.Network; using Content.Server.Cargo; using Content.Server.Chat; using Content.Server.GameObjects.Components.NodeContainer.NodeGroups; @@ -39,6 +40,7 @@ namespace Content.Server IoCManager.Register(); IoCManager.Register(); IoCManager.Register(); + IoCManager.Register(); } } } diff --git a/Content.Shared/Atmos/Atmospherics.cs b/Content.Shared/Atmos/Atmospherics.cs index 2b1e2a5dc6..6872999f85 100644 --- a/Content.Shared/Atmos/Atmospherics.cs +++ b/Content.Shared/Atmos/Atmospherics.cs @@ -58,6 +58,12 @@ namespace Content.Shared.Atmos ///

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 zop�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 P00000NkvXXu0mjfv?IPx diff --git a/Resources/Textures/Mobs/Animals/unusuallylargefunnyrabbit.rsi/dead.png b/Resources/Textures/Mobs/Animals/unusuallylargefunnyrabbit.rsi/dead.png deleted file mode 100644 index 25dd2ead4b9bc7b31d9cfc2df9ceb14b71301d56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 848 zcmV-W1F!svP)!L}$WL6R;)l!}?P9y+ud1)-v~WQ$O!WDpg~D(#XWbTCp3VzbPm z4Ix>xg9raBsbF}C17%PLPYPCeYTnDVYRH> zBSowQb)9z`hK&}uTI+>Hgd|ljRyTplzY=1npW7`#G+(a3#N-GQkv*<+hb1wC>VuER z`Mt1GiMnbGUIpO-94)~w-aotExb^7v^&tJG5 zFA=u6*F(CML{8Y1b^^t>a(N> zms<-J3|mOnXBQ$;gf%a?pPZv{#_*DpG|z4v-7N-;rYGY~UI9*z4VYGw4oM+|jG_|w z%RPAdq!W?eknV;QNsdXhR~4Gp^E5nwQh2hMmC{Zi>p$*x@XMZ`pZIANu^yx_nI}YU zCB4-4Qhq(RO%5#1zd}!50oT1>lMqZ*`d7jxtN2d>kRPUOW|+E$i?#$979B1C!)m@@g)CMSX^ zA_P$^Cm{``ZiFU>xqbfa6#M|5PmQn>L_*}9{tHoqMmb;#0VPt|*Z^LLFhqkmwmAVM z9`4Tq@Q5A2pDahF=bCBPNUX|%1BZ@cW?K82%4IuN=KJ-*gMCf0?{8Vm a0Pq{pbWqA!(o**T0000 Date: Mon, 17 Aug 2020 01:42:42 +0200 Subject: [PATCH 30/81] Bodysystem and damagesystem rework (#1544) * Things and stuff with grids, unfinished w/ code debug changes. * Updated submodule and also lost some progress cause I fucked it up xd * First unfinished draft of the BodySystem. Doesn't compile. * More changes to make it compile, but still just a framework. Doesn't do anything at the moment. * Many cleanup changes. * Revert "Merge branch 'master' of https://github.com/GlassEclipse/space-station-14 into body_system" This reverts commit ddd4aebbc76cf2a0b7b102f72b93d55a0816c88c, reversing changes made to 12d0dd752706bdda8879393bd8191a1199a0c978. * Commit human.yml * Updated a lot of things to be more classy, more progress overall, etc. etc. * Latest update with many changes * Minor changes * Fixed Travis build bug * Adds first draft of Body Scanner console, apparently I also forgot to tie Mechanisms into body parts so now a heart just sits in the Torso like a good boy :) * Commit rest of stuff * Latest changes * Latest changes again * 14 naked cowboys * Yay! * Latest changes (probably doesnt compile) * Surgery!!!!!!!!!~1116y * Cleaned some stuff up * More cleanup * Refactoring of code. Basic surgery path now done. * Removed readme, has been added to HackMD * Fixes typo (and thus test errors) * WIP changes, committing so I can pull latest master changes * Still working on that god awful merge * Latest changes * Latest changes!! * Beginning of refactor to BoundUserInterface * Surgery! * Latest changes - fixes pr change requests and random fixes * oops * Fixes bodypart recursion * Beginning of work on revamping the damage system. * More latest changes * Latest changes * Finished merge * Commit before removing old healthcode * Almost done with removing speciescomponent... * It compiles!!! * yahoo more work * Fixes to make it work * Merge conflict fixes * Deleting species visualizer was a mistake * IDE warnings are VERBOTEN * makes the server not kill itself on startup, some cleanup (#1) * Namespaces, comments and exception fixes * Fix conveyor and conveyor switch serialization SS14 in reactive when * Move damage, acts and body to shared Damage cleanup Comment cleanup * Rename SpeciesComponent to RotationComponent and cleanup Damage cleanup Comment cleanup * Fix nullable warnings * Address old reviews Fix off welder suicide damage type, deathmatch and suspicion * Fix new test fail with units being able to accept items when unpowered * Remove RotationComponent, change references to IBodyManagerComponent * Add a bloodstream to humans * More cleanups * Add body conduits, connections, connectors substances and valves * Revert "Add body conduits, connections, connectors substances and valves" This reverts commit 9ab0b50e6b15fe98852d7b0836c0cdbf4bd76d20. * Implement the heart mechanism behavior with the circulatory network * Added network property to mechanism behaviors * Changed human organ sprites and added missing ones * Fix tests * Add individual body part sprite rendering * Fix error where dropped mechanisms are not initialized * Implement client/server body damage * Make DamageContainer take care of raising events * Reimplement medical scanner with the new body system * Improve the medical scanner ui * Merge conflict fixes * Fix crash when colliding with something * Fix microwave suicides and eyes sprite rendering * Fix nullable reference error * Fix up surgery client side * Fix missing using from merge conflict * Add breathing *inhale * Merge conflict fixes * Fix accumulatedframetime being reset to 0 instead of decreased by the threshold https://github.com/space-wizards/space-station-14/pull/1617 * Use and add to the new AtmosHelpers * Fix feet * Add proper coloring to dropped body parts * Fix Urist's lungs being too strong * Merge conflict fixes * Merge conflict fixes * Merge conflict fixes Co-authored-by: GlassEclipse Co-authored-by: Pieter-Jan Briers Co-authored-by: AJCM-git <60196617+AJCM-git@users.noreply.github.com> --- .../Components/Body/BodyManagerComponent.cs | 71 ++ .../Scanner}/BodyScannerBoundUserInterface.cs | 20 +- .../Body/Scanner/BodyScannerDisplay.cs | 164 +++ .../GenericSurgeryBoundUserInterface.cs | 45 +- .../Body}/Surgery/GenericSurgeryWindow.cs | 97 +- .../Components/DamageableComponent.cs | 29 - .../MedicalScannerBoundUserInterface.cs | 2 + .../MedicalScanner/MedicalScannerWindow.cs | 38 +- .../Mobs/HumanoidAppearanceComponent.cs | 4 +- .../Components/Mobs/SpeciesComponent.cs | 22 - .../RotationVisualizer.cs} | 16 +- .../BodyScanner/BodyScannerDisplay.cs | 155 --- Content.Client/IgnoredComponents.cs | 2 +- .../AI/Utility/AiLogic/UtilityAI.cs | 29 +- .../Considerations/Combat/TargetHealthCon.cs | 7 +- .../Considerations/Combat/TargetIsCritCon.cs | 8 +- .../Considerations/Combat/TargetIsDeadCon.cs | 8 +- .../Melee/MeleeAttackNearbyPlayerExp.cs | 6 +- .../Melee/MeleeAttackNearbySpeciesExp.cs | 2 +- .../Melee/UnarmedAttackNearbyPlayerExp.cs | 6 +- ...bySpeciesState.cs => NearbyBodiesState.cs} | 10 +- .../States/Mobs/NearbyPlayersState.cs | 6 +- Content.Server/Body/BodyCommands.cs | 147 +++ Content.Server/Body/BodyPart.cs | 602 ++++++++++ Content.Server/Body/BodyPreset.cs | 36 + Content.Server/Body/BodyTemplate.cs | 145 +++ Content.Server/Body/IBodyPartContainer.cs | 19 + .../Mechanisms/Behaviors/BrainBehavior.cs | 9 + .../Mechanisms/Behaviors/HeartBehavior.cs | 38 + .../Body/Mechanisms/Behaviors/LungBehavior.cs | 27 + .../Mechanisms/Behaviors/MechanismBehavior.cs | 185 +++ .../Mechanisms/Behaviors/StomachBehavior.cs | 36 + Content.Server/Body/Mechanisms/Mechanism.cs | 249 ++++ Content.Server/Body/Network/BodyNetwork.cs | 76 ++ .../Body/Network/BodyNetworkFactory.cs | 88 ++ .../Body/Network/CirculatoryNetwork.cs | 25 + .../Body/Network/DigestiveNetwork.cs | 28 + .../Body/Network/IBodyNetworkFactory.cs | 13 + .../Body/Network/RespiratoryNetwork.cs | 25 + .../Body/Surgery/BiologicalSurgeryData.cs | 250 ++++ Content.Server/Body/Surgery/ISurgeon.cs | 34 + Content.Server/Body/Surgery/SurgeryData.cs | 91 ++ Content.Server/Chat/ChatCommands.cs | 36 +- Content.Server/EntryPoint.cs | 5 +- Content.Server/Explosions/ExplosionHelper.cs | 2 +- .../Components/Atmos/BarotraumaComponent.cs | 8 +- .../Components/Atmos/GasMixtureComponent.cs | 4 +- .../Components/Body/BodyManagerComponent.cs | 1015 +++++++++++++++++ .../Components/Body/BodyScannerComponent.cs | 73 ++ .../Body/Circulatory/BloodstreamComponent.cs | 83 ++ .../Digestive}/StomachComponent.cs | 58 +- .../Body}/DroppedBodyPartComponent.cs | 160 +-- .../Body}/DroppedMechanismComponent.cs | 162 +-- .../Body/Respiratory/LungComponent.cs | 127 +++ .../Components/Body}/SurgeryToolComponent.cs | 207 ++-- .../Components/Buckle/BuckleComponent.cs | 4 +- .../Components/Chemistry/InjectorComponent.cs | 5 +- .../Components/Chemistry/PillComponent.cs | 3 +- .../Components/Chemistry/SolutionComponent.cs | 2 +- .../Components/Damage/BreakableComponent.cs | 89 +- .../DamageOnHighSpeedImpactComponent.cs | 9 +- .../Damage/DamageOnToolInteractComponent.cs | 27 +- .../Components/Damage/DamageThreshold.cs | 98 -- .../Components/Damage/DamageableComponent.cs | 212 ---- .../Damage/DestructibleComponent.cs | 99 +- .../Components/Damage/ResistanceSet.cs | 86 -- .../Components/Damage/RuinableComponent.cs | 84 ++ .../Disposal/DisposalHolderComponent.cs | 4 +- .../Disposal/DisposalTubeComponent.cs | 2 +- .../Disposal/DisposalUnitComponent.cs | 4 +- .../Components/Doors/ServerDoorComponent.cs | 9 +- .../Explosion/ExplosiveComponent.cs | 1 + .../Explosion/FlashExplosiveComponent.cs | 1 + .../Components/GUI/HandsComponent.cs | 2 +- .../Gravity/GravityGeneratorComponent.cs | 16 +- .../Components/Healing/HealingComponent.cs | 71 -- .../Interactable/WelderComponent.cs | 3 +- .../Items/Storage/EntityStorageComponent.cs | 5 +- .../Components/Items/Storage/ItemComponent.cs | 2 +- .../Components/Kitchen/MicrowaveComponent.cs | 20 +- .../Medical/MedicalScannerComponent.cs | 57 +- .../Metabolism/BloodstreamComponent.cs | 111 -- .../Metabolism/MetabolismComponent.cs | 249 ++++ .../Mining/AsteroidRockComponent.cs | 6 +- .../Components/Mobs/DamageStates.cs | 275 ----- .../DamageThresholdTemplates.cs | 65 -- .../DamageThresholdTemplates/HumanTemplate.cs | 97 -- .../Mobs/HeatResistanceComponent.cs | 5 +- .../Components/Mobs/MindComponent.cs | 5 +- .../Components/Mobs/MobStateManager.cs | 488 ++++++++ .../Components/Mobs/SpeciesComponent.cs | 247 ---- .../Components/Nutrition/DrinkComponent.cs | 3 +- .../Components/Nutrition/FoodComponent.cs | 1 + .../Components/Nutrition/HungerComponent.cs | 8 +- .../Components/Nutrition/ThirstComponent.cs | 8 +- .../PoweredLightComponent.cs | 6 +- .../PowerNetComponents/SolarPanelComponent.cs | 1 + .../Projectiles/HitscanComponent.cs | 2 +- .../Projectiles/ProjectileComponent.cs | 10 +- .../Projectiles/ThrownItemComponent.cs | 8 +- .../Components/Recycling/RecyclerComponent.cs | 7 +- .../Suspicion/SuspicionRoleComponent.cs | 5 +- .../Temperature/TemperatureComponent.cs | 8 +- .../Weapon/Melee/MeleeWeaponComponent.cs | 8 +- .../Barrels/ServerBatteryBarrelComponent.cs | 2 +- .../Barrels/ServerRangedBarrelComponent.cs | 11 +- .../Ranged/ServerRangedWeaponComponent.cs | 9 +- .../EntitySystems/BloodstreamSystem.cs | 29 - .../GameObjects/EntitySystems/BodySystem.cs | 29 + .../EntitySystems/DoAfter/DoAfter.cs | 3 +- .../EntitySystems/DoAfter/DoAfterSystem.cs | 8 +- .../GameObjects/EntitySystems/HungerSystem.cs | 9 +- .../StationEvents/RadiationPulseSystem.cs | 14 +- .../EntitySystems/StomachSystem.cs | 29 - .../GameObjects/EntitySystems/ThirstSystem.cs | 7 +- .../GameTicking/GameRules/RuleDeathMatch.cs | 12 +- .../GameTicking/GameRules/RuleSuspicion.cs | 8 +- .../GameTicking/GameTickerCommands.cs | 81 -- Content.Server/GlobalVerbs/RejuvenateVerb.cs | 14 +- .../Health/BodySystem/BodyManagerComponent.cs | 402 ------- .../Health/BodySystem/BodyPart/BodyPart.cs | 260 ----- .../BodySystem/BodyPreset/BodyPreset.cs | 36 - .../BodyScanner/BodyScannerComponent.cs | 64 -- .../BodySystem/BodyTemplate/BodyTemplate.cs | 113 -- .../Health/BodySystem/IBodyPartContainer.cs | 16 - .../Health/BodySystem/Mechanism/Mechanism.cs | 105 -- .../BodySystem/Surgery/Surgeon/ISurgeon.cs | 29 - .../SurgeryData/BiologicalSurgeryData.cs | 193 ---- .../Surgery/SurgeryData/ISurgeryData.cs | 81 -- .../Components/Damage/IDamageableComponent.cs | 35 - .../Components/Interaction/IBodyPartAdded.cs | 2 +- .../GameObjects/IOnDamageBehavior.cs | 34 - .../Interfaces/GameObjects/ISuicideAct.cs | 12 +- Content.Server/Mobs/StandingStateHelper.cs | 14 +- Content.Server/Observer/Ghost.cs | 15 +- Content.Server/ServerContentIoC.cs | 2 + Content.Shared/Atmos/Atmospherics.cs | 6 + .../Mechanism/MechanismPrototype.cs | 59 +- Content.Shared/Body/Part/BodyPartPrototype.cs | 100 ++ .../Body/Part/Properties/BodyPartProperty.cs | 23 + .../Part/Properties/Movement/FootProperty.cs | 11 + .../Part/Properties/Movement/LegProperty.cs | 23 + .../Properties/Other/ExtensionProperty.cs | 21 + .../Part/Properties/Other/GraspProperty.cs | 10 + .../Preset}/BodyPresetPrototype.cs | 25 +- .../Scanner}/BodyScannerSharedValues.cs | 42 +- .../Surgery/GenericSurgeryUIMessages.cs | 59 +- .../Body/Template/BodyTemplatePrototype.cs | 87 ++ Content.Shared/Damage/DamageClass.cs | 41 + .../Damage/DamageContainer/DamageContainer.cs | 293 +++++ .../DamageContainerPrototype.cs | 32 + Content.Shared/Damage/DamageType.cs | 66 ++ .../Damage/ResistanceSet/ResistanceSet.cs | 73 ++ .../ResistanceSet/ResistanceSetPrototype.cs | 46 + .../Components/Body/IBodyManagerComponent.cs | 9 + .../Body/SharedBodyManagerComponent.cs | 120 ++ .../Components/Damage/DamageState.cs | 20 + .../Components/Damage/DamageableComponent.cs | 239 +++- .../Components/Damage/IDamageableComponent.cs | 223 ++++ .../Damage/IOnHealthChangedBehavior.cs | 22 + .../Medical/SharedMedicalScannerComponent.cs | 24 +- .../Components/Mobs/SharedSpeciesComponent.cs | 31 - .../MovementSpeedModifierComponent.cs | 3 +- .../SharedPlayerInputMoverComponent.cs | 4 +- .../Components/Rotation/RotationComponent.cs | 26 + Content.Shared/GameObjects/ContentNetIDs.cs | 3 +- .../GameObjects/EntitySystems/ActSystem.cs | 3 +- .../EntitySystems/ActionBlockerSystem.cs | 3 + .../BodyPart/BodyPartProperties/ArmLength.cs | 15 - .../BodySystem/BodyPart/BodyPartPrototype.cs | 94 -- .../BodyTemplate/BodyTemplatePrototype.cs | 71 -- .../Health/BodySystem/BodysystemValues.cs | 20 - .../AbstractDamageContainer.cs | 109 -- .../BiologicalDamageContainer.cs | 15 - .../Appearance/HumanoidCharacterAppearance.cs | 7 + .../{ => BodySystem}/BodyTemplateTest.cs | 19 +- Resources/Groups/groups.yml | 2 + .../Mechanisms/basic_human_organs.yml | 53 +- .../Mechanisms/basic_tests.yml | 6 +- .../Prototypes/Body/Parts/humanoid_parts.yml | 192 ++++ .../Prototypes/Body/Presets/basic_human.yml | 14 + .../Prototypes/Body/Templates/humanoid.yml | 44 + .../Templates}/quadrupedal.yml | 20 +- .../BodySystem/BodyParts/humanoid_parts.yml | 95 -- .../BodySystem/BodyPresets/basic_human.yml | 15 - .../BodySystem/BodyTemplates/humanoid.yml | 33 - .../Prototypes/Damage/damage_containers.yml | 13 + .../Prototypes/Damage/resistance_sets.yml | 56 + .../Constructible/Ground/instruments.yml | 3 +- .../Constructible/Ground/pilot_chair.yml | 2 +- .../Entities/Constructible/Ground/table.yml | 10 +- .../Constructible/Power/gravity_generator.yml | 3 +- .../Constructible/Power/medical_scanner.yml | 3 +- .../Entities/Constructible/Power/power.yml | 6 +- .../Constructible/Power/vending_machines.yml | 2 +- .../Constructible/Storage/Closets/closet.yml | 3 +- .../Storage/StorageTanks/storage_tank.yml | 5 +- .../Constructible/Storage/crate_base.yml | 3 +- .../Entities/Constructible/Walls/asteroid.yml | 3 +- .../Entities/Constructible/Walls/girder.yml | 5 +- .../Entities/Constructible/Walls/low_wall.yml | 3 +- .../Entities/Constructible/Walls/walls.yml | 79 +- .../Entities/Constructible/Walls/windows.yml | 3 +- .../Prototypes/Entities/Mobs/NPCs/mimic.yml | 9 +- .../Prototypes/Entities/Mobs/NPCs/xeno.yml | 10 +- .../Entities/Mobs/Species/human.yml | 134 +-- .../Mobs}/body_system_dropped_abstract.yml | 6 +- .../Entities/Objects/Specific/medical.yml | 14 +- .../Objects/Tools}/surgery_tools.yml | 28 +- .../Ammunition/AntiMaterial/projectiles.yml | 2 +- .../Guns/Ammunition/ClRifle/projectiles.yml | 10 +- .../Guns/Ammunition/LRifle/projectiles.yml | 10 +- .../Guns/Ammunition/Magnum/projectiles.yml | 10 +- .../Guns/Ammunition/Pistol/projectiles.yml | 10 +- .../Guns/Ammunition/SRifle/projectiles.yml | 10 +- .../Guns/Ammunition/Shotgun/projectiles.yml | 12 +- .../Guns/Ammunition/Toy/projectiles.yml | 4 +- .../Weapons/Guns/Explosives/grenades.yml | 9 +- .../Weapons/Guns/Projectiles/hitscan.yml | 3 + .../Weapons/Guns/Projectiles/projectiles.yml | 12 +- .../Human/{human6-0.png => human6.png} | Bin .../Human/{human6-1.png => human7.png} | Bin .../Mobs/Parts/body_human.rsi/head_m.png | Bin 573 -> 0 bytes .../Mobs/Parts/body_human.rsi/l_arm.png | Bin 307 -> 0 bytes .../Mobs/Parts/body_human.rsi/l_foot.png | Bin 211 -> 0 bytes .../Mobs/Parts/body_human.rsi/l_hand.png | Bin 294 -> 0 bytes .../Mobs/Parts/body_human.rsi/l_leg.png | Bin 275 -> 0 bytes .../Mobs/Parts/body_human.rsi/meta.json | 81 -- .../Mobs/Parts/body_human.rsi/r_arm.png | Bin 327 -> 0 bytes .../Mobs/Parts/body_human.rsi/r_foot.png | Bin 276 -> 0 bytes .../Mobs/Parts/body_human.rsi/r_hand.png | Bin 266 -> 0 bytes .../Mobs/Parts/body_human.rsi/r_leg.png | Bin 275 -> 0 bytes .../Mobs/Parts/body_human.rsi/torso_m.png | Bin 1195 -> 0 bytes .../Textures/Mobs/Parts/eyes_advanced.png | Bin 163 -> 0 bytes Resources/Textures/Mobs/Parts/eyes_grey.png | Bin 165 -> 0 bytes .../Textures/Mobs/Parts/kidneys_advanced.png | Bin 197 -> 0 bytes .../Textures/Mobs/Parts/lungs_advanced.png | Bin 336 -> 0 bytes Resources/Textures/Mobs/Parts/lungs_vox.png | Bin 233 -> 0 bytes .../Parts/organs_human.rsi/brain_human.png | Bin 708 -> 0 bytes .../Parts/organs_human.rsi/eyes_human.png | Bin 160 -> 0 bytes .../Parts/organs_human.rsi/heart_human.png | Bin 155 -> 0 bytes .../Parts/organs_human.rsi/kidneys_human.png | Bin 193 -> 0 bytes .../Parts/organs_human.rsi/liver_human.png | Bin 174 -> 0 bytes .../Parts/organs_human.rsi/lungs_human.png | Bin 233 -> 0 bytes .../Mobs/Parts/organs_human.rsi/meta.json | 53 - .../Species/Human/organs.rsi/appendix.png | Bin 0 -> 258 bytes .../Human/organs.rsi/appendixinflamed.png | Bin 0 -> 282 bytes .../Mobs/Species/Human/organs.rsi/brain.png | Bin 0 -> 461 bytes .../Mobs/Species/Human/organs.rsi/ears.png | Bin 0 -> 619 bytes .../Species/Human/organs.rsi/eyeballs.png | Bin 0 -> 574 bytes .../Species/Human/organs.rsi/heart-off.png | Bin 0 -> 242 bytes .../Species/Human/organs.rsi/heart-on.png | Bin 0 -> 436 bytes .../Mobs/Species/Human/organs.rsi/kidneys.png | Bin 0 -> 351 bytes .../Mobs/Species/Human/organs.rsi/liver.png | Bin 0 -> 290 bytes .../Mobs/Species/Human/organs.rsi/lungs.png | Bin 0 -> 359 bytes .../Mobs/Species/Human/organs.rsi/meta.json | 121 ++ .../Mobs/Species/Human/organs.rsi/stomach.png | Bin 0 -> 370 bytes .../Species/Human/organs.rsi/tonguenormal.png | Bin 0 -> 375 bytes .../parts.rsi/full.png} | Bin .../parts.rsi/head_f.png} | Bin .../parts.rsi/head_m.png} | Bin .../parts.rsi/l_arm.png} | Bin .../Mobs/Species/Human/parts.rsi/l_foot.png | Bin 0 -> 398 bytes .../parts.rsi/l_hand.png} | Bin .../Mobs/Species/Human/parts.rsi/l_leg.png | Bin 0 -> 6361 bytes .../Mobs/Species/Human/parts.rsi/meta.json | 236 ++++ .../parts.rsi/r_arm.png} | Bin .../Mobs/Species/Human/parts.rsi/r_foot.png | Bin 0 -> 398 bytes .../parts.rsi/r_hand.png} | Bin .../Mobs/Species/Human/parts.rsi/r_leg.png | Bin 0 -> 6343 bytes .../parts.rsi/torso_f.png} | Bin .../parts.rsi/torso_m.png} | Bin .../Mobs/Species/human.rsi/human_l_leg.png | Bin 354 -> 0 bytes .../Mobs/Species/human.rsi/human_r_leg.png | Bin 349 -> 0 bytes .../Textures/Mobs/Species/human.rsi/meta.json | 1 - SpaceStation14.sln.DotSettings | 6 +- 276 files changed, 7853 insertions(+), 4737 deletions(-) create mode 100644 Content.Client/GameObjects/Components/Body/BodyManagerComponent.cs rename Content.Client/{Health/BodySystem/BodyScanner => GameObjects/Components/Body/Scanner}/BodyScannerBoundUserInterface.cs (76%) create mode 100644 Content.Client/GameObjects/Components/Body/Scanner/BodyScannerDisplay.cs rename Content.Client/{Health/BodySystem => GameObjects/Components/Body}/Surgery/GenericSurgeryBoundUserInterface.cs (72%) rename Content.Client/{Health/BodySystem => GameObjects/Components/Body}/Surgery/GenericSurgeryWindow.cs (57%) delete mode 100644 Content.Client/GameObjects/Components/DamageableComponent.cs delete mode 100644 Content.Client/GameObjects/Components/Mobs/SpeciesComponent.cs rename Content.Client/GameObjects/Components/{Mobs/SpeciesVisualizer.cs => Rotation/RotationVisualizer.cs} (81%) delete mode 100644 Content.Client/Health/BodySystem/BodyScanner/BodyScannerDisplay.cs rename Content.Server/AI/WorldState/States/Mobs/{NearbySpeciesState.cs => NearbyBodiesState.cs} (70%) create mode 100644 Content.Server/Body/BodyCommands.cs create mode 100644 Content.Server/Body/BodyPart.cs create mode 100644 Content.Server/Body/BodyPreset.cs create mode 100644 Content.Server/Body/BodyTemplate.cs create mode 100644 Content.Server/Body/IBodyPartContainer.cs create mode 100644 Content.Server/Body/Mechanisms/Behaviors/BrainBehavior.cs create mode 100644 Content.Server/Body/Mechanisms/Behaviors/HeartBehavior.cs create mode 100644 Content.Server/Body/Mechanisms/Behaviors/LungBehavior.cs create mode 100644 Content.Server/Body/Mechanisms/Behaviors/MechanismBehavior.cs create mode 100644 Content.Server/Body/Mechanisms/Behaviors/StomachBehavior.cs create mode 100644 Content.Server/Body/Mechanisms/Mechanism.cs create mode 100644 Content.Server/Body/Network/BodyNetwork.cs create mode 100644 Content.Server/Body/Network/BodyNetworkFactory.cs create mode 100644 Content.Server/Body/Network/CirculatoryNetwork.cs create mode 100644 Content.Server/Body/Network/DigestiveNetwork.cs create mode 100644 Content.Server/Body/Network/IBodyNetworkFactory.cs create mode 100644 Content.Server/Body/Network/RespiratoryNetwork.cs create mode 100644 Content.Server/Body/Surgery/BiologicalSurgeryData.cs create mode 100644 Content.Server/Body/Surgery/ISurgeon.cs create mode 100644 Content.Server/Body/Surgery/SurgeryData.cs create mode 100644 Content.Server/GameObjects/Components/Body/BodyManagerComponent.cs create mode 100644 Content.Server/GameObjects/Components/Body/BodyScannerComponent.cs create mode 100644 Content.Server/GameObjects/Components/Body/Circulatory/BloodstreamComponent.cs rename Content.Server/GameObjects/Components/{Nutrition => Body/Digestive}/StomachComponent.cs (65%) rename Content.Server/{Health/BodySystem/BodyPart => GameObjects/Components/Body}/DroppedBodyPartComponent.cs (52%) rename Content.Server/{Health/BodySystem/Mechanism => GameObjects/Components/Body}/DroppedMechanismComponent.cs (60%) create mode 100644 Content.Server/GameObjects/Components/Body/Respiratory/LungComponent.cs rename Content.Server/{Health/BodySystem/Surgery/Surgeon => GameObjects/Components/Body}/SurgeryToolComponent.cs (55%) delete mode 100644 Content.Server/GameObjects/Components/Damage/DamageThreshold.cs delete mode 100644 Content.Server/GameObjects/Components/Damage/DamageableComponent.cs delete mode 100644 Content.Server/GameObjects/Components/Damage/ResistanceSet.cs create mode 100644 Content.Server/GameObjects/Components/Damage/RuinableComponent.cs delete mode 100644 Content.Server/GameObjects/Components/Healing/HealingComponent.cs delete mode 100644 Content.Server/GameObjects/Components/Metabolism/BloodstreamComponent.cs create mode 100644 Content.Server/GameObjects/Components/Metabolism/MetabolismComponent.cs delete mode 100644 Content.Server/GameObjects/Components/Mobs/DamageStates.cs delete mode 100644 Content.Server/GameObjects/Components/Mobs/DamageThresholdTemplates/DamageThresholdTemplates.cs delete mode 100644 Content.Server/GameObjects/Components/Mobs/DamageThresholdTemplates/HumanTemplate.cs create mode 100644 Content.Server/GameObjects/Components/Mobs/MobStateManager.cs delete mode 100644 Content.Server/GameObjects/Components/Mobs/SpeciesComponent.cs delete mode 100644 Content.Server/GameObjects/EntitySystems/BloodstreamSystem.cs create mode 100644 Content.Server/GameObjects/EntitySystems/BodySystem.cs delete mode 100644 Content.Server/GameObjects/EntitySystems/StomachSystem.cs delete mode 100644 Content.Server/Health/BodySystem/BodyManagerComponent.cs delete mode 100644 Content.Server/Health/BodySystem/BodyPart/BodyPart.cs delete mode 100644 Content.Server/Health/BodySystem/BodyPreset/BodyPreset.cs delete mode 100644 Content.Server/Health/BodySystem/BodyScanner/BodyScannerComponent.cs delete mode 100644 Content.Server/Health/BodySystem/BodyTemplate/BodyTemplate.cs delete mode 100644 Content.Server/Health/BodySystem/IBodyPartContainer.cs delete mode 100644 Content.Server/Health/BodySystem/Mechanism/Mechanism.cs delete mode 100644 Content.Server/Health/BodySystem/Surgery/Surgeon/ISurgeon.cs delete mode 100644 Content.Server/Health/BodySystem/Surgery/SurgeryData/BiologicalSurgeryData.cs delete mode 100644 Content.Server/Health/BodySystem/Surgery/SurgeryData/ISurgeryData.cs delete mode 100644 Content.Server/Interfaces/GameObjects/Components/Damage/IDamageableComponent.cs delete mode 100644 Content.Server/Interfaces/GameObjects/IOnDamageBehavior.cs rename Content.Shared/{Health/BodySystem => Body}/Mechanism/MechanismPrototype.cs (60%) create mode 100644 Content.Shared/Body/Part/BodyPartPrototype.cs create mode 100644 Content.Shared/Body/Part/Properties/BodyPartProperty.cs create mode 100644 Content.Shared/Body/Part/Properties/Movement/FootProperty.cs create mode 100644 Content.Shared/Body/Part/Properties/Movement/LegProperty.cs create mode 100644 Content.Shared/Body/Part/Properties/Other/ExtensionProperty.cs create mode 100644 Content.Shared/Body/Part/Properties/Other/GraspProperty.cs rename Content.Shared/{Health/BodySystem/BodyPreset => Body/Preset}/BodyPresetPrototype.cs (56%) rename Content.Shared/{Health/BodySystem/BodyScanner => Body/Scanner}/BodyScannerSharedValues.cs (79%) rename Content.Shared/{Health/BodySystem => Body}/Surgery/GenericSurgeryUIMessages.cs (71%) create mode 100644 Content.Shared/Body/Template/BodyTemplatePrototype.cs create mode 100644 Content.Shared/Damage/DamageClass.cs create mode 100644 Content.Shared/Damage/DamageContainer/DamageContainer.cs create mode 100644 Content.Shared/Damage/DamageContainer/DamageContainerPrototype.cs create mode 100644 Content.Shared/Damage/DamageType.cs create mode 100644 Content.Shared/Damage/ResistanceSet/ResistanceSet.cs create mode 100644 Content.Shared/Damage/ResistanceSet/ResistanceSetPrototype.cs create mode 100644 Content.Shared/GameObjects/Components/Body/IBodyManagerComponent.cs create mode 100644 Content.Shared/GameObjects/Components/Body/SharedBodyManagerComponent.cs create mode 100644 Content.Shared/GameObjects/Components/Damage/DamageState.cs create mode 100644 Content.Shared/GameObjects/Components/Damage/IDamageableComponent.cs create mode 100644 Content.Shared/GameObjects/Components/Damage/IOnHealthChangedBehavior.cs delete mode 100644 Content.Shared/GameObjects/Components/Mobs/SharedSpeciesComponent.cs create mode 100644 Content.Shared/GameObjects/Components/Rotation/RotationComponent.cs rename {Content.Server => Content.Shared}/GameObjects/EntitySystems/ActSystem.cs (98%) delete mode 100644 Content.Shared/Health/BodySystem/BodyPart/BodyPartProperties/ArmLength.cs delete mode 100644 Content.Shared/Health/BodySystem/BodyPart/BodyPartPrototype.cs delete mode 100644 Content.Shared/Health/BodySystem/BodyTemplate/BodyTemplatePrototype.cs delete mode 100644 Content.Shared/Health/BodySystem/BodysystemValues.cs delete mode 100644 Content.Shared/Health/DamageContainer/AbstractDamageContainer.cs delete mode 100644 Content.Shared/Health/DamageContainer/BiologicalDamageContainer.cs rename Content.Tests/Shared/{ => BodySystem}/BodyTemplateTest.cs (80%) rename Resources/Prototypes/{BodySystem => Body}/Mechanisms/basic_human_organs.yml (58%) rename Resources/Prototypes/{BodySystem => Body}/Mechanisms/basic_tests.yml (95%) create mode 100644 Resources/Prototypes/Body/Parts/humanoid_parts.yml create mode 100644 Resources/Prototypes/Body/Presets/basic_human.yml create mode 100644 Resources/Prototypes/Body/Templates/humanoid.yml rename Resources/Prototypes/{BodySystem/BodyTemplates => Body/Templates}/quadrupedal.yml (69%) delete mode 100644 Resources/Prototypes/BodySystem/BodyParts/humanoid_parts.yml delete mode 100644 Resources/Prototypes/BodySystem/BodyPresets/basic_human.yml delete mode 100644 Resources/Prototypes/BodySystem/BodyTemplates/humanoid.yml create mode 100644 Resources/Prototypes/Damage/damage_containers.yml create mode 100644 Resources/Prototypes/Damage/resistance_sets.yml rename Resources/Prototypes/{BodySystem => Entities/Mobs}/body_system_dropped_abstract.yml (79%) rename Resources/Prototypes/{BodySystem/Surgery => Entities/Objects/Tools}/surgery_tools.yml (98%) rename Resources/Textures/Interface/StatusEffects/Human/{human6-0.png => human6.png} (100%) rename Resources/Textures/Interface/StatusEffects/Human/{human6-1.png => human7.png} (100%) delete mode 100644 Resources/Textures/Mobs/Parts/body_human.rsi/head_m.png delete mode 100644 Resources/Textures/Mobs/Parts/body_human.rsi/l_arm.png delete mode 100644 Resources/Textures/Mobs/Parts/body_human.rsi/l_foot.png delete mode 100644 Resources/Textures/Mobs/Parts/body_human.rsi/l_hand.png delete mode 100644 Resources/Textures/Mobs/Parts/body_human.rsi/l_leg.png delete mode 100644 Resources/Textures/Mobs/Parts/body_human.rsi/meta.json delete mode 100644 Resources/Textures/Mobs/Parts/body_human.rsi/r_arm.png delete mode 100644 Resources/Textures/Mobs/Parts/body_human.rsi/r_foot.png delete mode 100644 Resources/Textures/Mobs/Parts/body_human.rsi/r_hand.png delete mode 100644 Resources/Textures/Mobs/Parts/body_human.rsi/r_leg.png delete mode 100644 Resources/Textures/Mobs/Parts/body_human.rsi/torso_m.png delete mode 100644 Resources/Textures/Mobs/Parts/eyes_advanced.png delete mode 100644 Resources/Textures/Mobs/Parts/eyes_grey.png delete mode 100644 Resources/Textures/Mobs/Parts/kidneys_advanced.png delete mode 100644 Resources/Textures/Mobs/Parts/lungs_advanced.png delete mode 100644 Resources/Textures/Mobs/Parts/lungs_vox.png delete mode 100644 Resources/Textures/Mobs/Parts/organs_human.rsi/brain_human.png delete mode 100644 Resources/Textures/Mobs/Parts/organs_human.rsi/eyes_human.png delete mode 100644 Resources/Textures/Mobs/Parts/organs_human.rsi/heart_human.png delete mode 100644 Resources/Textures/Mobs/Parts/organs_human.rsi/kidneys_human.png delete mode 100644 Resources/Textures/Mobs/Parts/organs_human.rsi/liver_human.png delete mode 100644 Resources/Textures/Mobs/Parts/organs_human.rsi/lungs_human.png delete mode 100644 Resources/Textures/Mobs/Parts/organs_human.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Species/Human/organs.rsi/appendix.png create mode 100644 Resources/Textures/Mobs/Species/Human/organs.rsi/appendixinflamed.png create mode 100644 Resources/Textures/Mobs/Species/Human/organs.rsi/brain.png create mode 100644 Resources/Textures/Mobs/Species/Human/organs.rsi/ears.png create mode 100644 Resources/Textures/Mobs/Species/Human/organs.rsi/eyeballs.png create mode 100644 Resources/Textures/Mobs/Species/Human/organs.rsi/heart-off.png create mode 100644 Resources/Textures/Mobs/Species/Human/organs.rsi/heart-on.png create mode 100644 Resources/Textures/Mobs/Species/Human/organs.rsi/kidneys.png create mode 100644 Resources/Textures/Mobs/Species/Human/organs.rsi/liver.png create mode 100644 Resources/Textures/Mobs/Species/Human/organs.rsi/lungs.png create mode 100644 Resources/Textures/Mobs/Species/Human/organs.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Species/Human/organs.rsi/stomach.png create mode 100644 Resources/Textures/Mobs/Species/Human/organs.rsi/tonguenormal.png rename Resources/Textures/Mobs/Species/{human.rsi/human_basic.png => Human/parts.rsi/full.png} (100%) rename Resources/Textures/Mobs/Species/{human.rsi/human_head_f.png => Human/parts.rsi/head_f.png} (100%) rename Resources/Textures/Mobs/Species/{human.rsi/human_head_m.png => Human/parts.rsi/head_m.png} (100%) rename Resources/Textures/Mobs/Species/{human.rsi/human_l_arm.png => Human/parts.rsi/l_arm.png} (100%) create mode 100644 Resources/Textures/Mobs/Species/Human/parts.rsi/l_foot.png rename Resources/Textures/Mobs/Species/{human.rsi/human_l_hand.png => Human/parts.rsi/l_hand.png} (100%) create mode 100644 Resources/Textures/Mobs/Species/Human/parts.rsi/l_leg.png create mode 100644 Resources/Textures/Mobs/Species/Human/parts.rsi/meta.json rename Resources/Textures/Mobs/Species/{human.rsi/human_r_arm.png => Human/parts.rsi/r_arm.png} (100%) create mode 100644 Resources/Textures/Mobs/Species/Human/parts.rsi/r_foot.png rename Resources/Textures/Mobs/Species/{human.rsi/human_r_hand.png => Human/parts.rsi/r_hand.png} (100%) create mode 100644 Resources/Textures/Mobs/Species/Human/parts.rsi/r_leg.png rename Resources/Textures/Mobs/Species/{human.rsi/human_chest_f.png => Human/parts.rsi/torso_f.png} (100%) rename Resources/Textures/Mobs/Species/{human.rsi/human_chest_m.png => Human/parts.rsi/torso_m.png} (100%) delete mode 100644 Resources/Textures/Mobs/Species/human.rsi/human_l_leg.png delete mode 100644 Resources/Textures/Mobs/Species/human.rsi/human_r_leg.png delete mode 100644 Resources/Textures/Mobs/Species/human.rsi/meta.json diff --git a/Content.Client/GameObjects/Components/Body/BodyManagerComponent.cs b/Content.Client/GameObjects/Components/Body/BodyManagerComponent.cs new file mode 100644 index 0000000000..2948c9191e --- /dev/null +++ b/Content.Client/GameObjects/Components/Body/BodyManagerComponent.cs @@ -0,0 +1,71 @@ +#nullable enable +using Content.Client.GameObjects.Components.Disposal; +using Content.Client.Interfaces.GameObjects.Components.Interaction; +using Content.Shared.GameObjects.Components.Body; +using Content.Shared.GameObjects.Components.Damage; +using Robust.Client.Interfaces.GameObjects.Components; +using Robust.Shared.GameObjects; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.Network; +using Robust.Shared.IoC; +using Robust.Shared.Players; + +namespace Content.Client.GameObjects.Components.Body +{ + [RegisterComponent] + [ComponentReference(typeof(IDamageableComponent))] + [ComponentReference(typeof(IBodyManagerComponent))] + public class BodyManagerComponent : SharedBodyManagerComponent, IClientDraggable + { +#pragma warning disable 649 + [Dependency] private readonly IEntityManager _entityManager = default!; +#pragma warning restore 649 + + public bool ClientCanDropOn(CanDropEventArgs eventArgs) + { + return eventArgs.Target.HasComponent(); + } + + public bool ClientCanDrag(CanDragEventArgs eventArgs) + { + return true; + } + + public override void HandleNetworkMessage(ComponentMessage message, INetChannel netChannel, ICommonSession? session = null) + { + if (!Owner.TryGetComponent(out ISpriteComponent sprite)) + { + return; + } + + switch (message) + { + case BodyPartAddedMessage partAdded: + sprite.LayerSetVisible(partAdded.RSIMap, true); + sprite.LayerSetRSI(partAdded.RSIMap, partAdded.RSIPath); + sprite.LayerSetState(partAdded.RSIMap, partAdded.RSIState); + break; + case BodyPartRemovedMessage partRemoved: + sprite.LayerSetVisible(partRemoved.RSIMap, false); + + if (!partRemoved.Dropped.HasValue || + !_entityManager.TryGetEntity(partRemoved.Dropped.Value, out var entity) || + !entity.TryGetComponent(out ISpriteComponent droppedSprite)) + { + break; + } + + var color = sprite[partRemoved.RSIMap].Color; + + droppedSprite.LayerSetColor(0, color); + break; + case MechanismSpriteAddedMessage mechanismAdded: + sprite.LayerSetVisible(mechanismAdded.RSIMap, true); + break; + case MechanismSpriteRemovedMessage mechanismRemoved: + sprite.LayerSetVisible(mechanismRemoved.RSIMap, false); + break; + } + } + } +} diff --git a/Content.Client/Health/BodySystem/BodyScanner/BodyScannerBoundUserInterface.cs b/Content.Client/GameObjects/Components/Body/Scanner/BodyScannerBoundUserInterface.cs similarity index 76% rename from Content.Client/Health/BodySystem/BodyScanner/BodyScannerBoundUserInterface.cs rename to Content.Client/GameObjects/Components/Body/Scanner/BodyScannerBoundUserInterface.cs index 5bf9bec18b..5b2f5b7abc 100644 --- a/Content.Client/Health/BodySystem/BodyScanner/BodyScannerBoundUserInterface.cs +++ b/Content.Client/GameObjects/Components/Body/Scanner/BodyScannerBoundUserInterface.cs @@ -1,11 +1,13 @@ using System.Collections.Generic; -using Content.Shared.Health.BodySystem.BodyScanner; +using Content.Shared.Body.Scanner; +using JetBrains.Annotations; using Robust.Client.GameObjects.Components.UserInterface; using Robust.Shared.GameObjects.Components.UserInterface; using Robust.Shared.ViewVariables; -namespace Content.Client.Health.BodySystem.BodyScanner +namespace Content.Client.GameObjects.Components.Body.Scanner { + [UsedImplicitly] public class BodyScannerBoundUserInterface : BoundUserInterface { [ViewVariables] @@ -17,9 +19,7 @@ namespace Content.Client.Health.BodySystem.BodyScanner [ViewVariables] private Dictionary _parts; - public BodyScannerBoundUserInterface(ClientUserInterfaceComponent owner, object uiKey) : base(owner, uiKey) - { - } + public BodyScannerBoundUserInterface(ClientUserInterfaceComponent owner, object uiKey) : base(owner, uiKey) { } protected override void Open() { @@ -34,7 +34,9 @@ namespace Content.Client.Health.BodySystem.BodyScanner base.UpdateState(state); if (!(state is BodyScannerInterfaceState scannerState)) + { return; + } _template = scannerState.Template; _parts = scannerState.Parts; @@ -45,7 +47,13 @@ namespace Content.Client.Health.BodySystem.BodyScanner protected override void Dispose(bool disposing) { base.Dispose(disposing); - } + if (disposing) + { + _display.Dispose(); + _template = null; + _parts.Clear(); + } + } } } diff --git a/Content.Client/GameObjects/Components/Body/Scanner/BodyScannerDisplay.cs b/Content.Client/GameObjects/Components/Body/Scanner/BodyScannerDisplay.cs new file mode 100644 index 0000000000..c5dfe18f44 --- /dev/null +++ b/Content.Client/GameObjects/Components/Body/Scanner/BodyScannerDisplay.cs @@ -0,0 +1,164 @@ +using System.Collections.Generic; +using System.Globalization; +using Content.Shared.Body.Scanner; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.CustomControls; +using Robust.Shared.IoC; +using Robust.Shared.Localization; +using Robust.Shared.Maths; +using static Robust.Client.UserInterface.Controls.ItemList; + +namespace Content.Client.GameObjects.Components.Body.Scanner +{ + public sealed class BodyScannerDisplay : SS14Window + { + private BodyScannerTemplateData _template; + + private Dictionary _parts; + + private List _slots; + + private BodyScannerBodyPartData _currentBodyPart; + + public BodyScannerDisplay(BodyScannerBoundUserInterface owner) + { + IoCManager.InjectDependencies(this); + Owner = owner; + Title = Loc.GetString("Body Scanner"); + + var hSplit = new HBoxContainer + { + Children = + { + // Left half + new ScrollContainer + { + SizeFlagsHorizontal = SizeFlags.FillExpand, + Children = + { + (BodyPartList = new ItemList()) + } + }, + // Right half + new VBoxContainer + { + SizeFlagsHorizontal = SizeFlags.FillExpand, + Children = + { + // Top half of the right half + new VBoxContainer + { + SizeFlagsVertical = SizeFlags.FillExpand, + Children = + { + (BodyPartLabel = new Label()), + new HBoxContainer + { + Children = + { + new Label + { + Text = "Health: " + }, + (BodyPartHealth = new Label()) + } + }, + new ScrollContainer + { + SizeFlagsVertical = SizeFlags.FillExpand, + Children = + { + (MechanismList = new ItemList()) + } + } + } + }, + // Bottom half of the right half + (MechanismInfoLabel = new RichTextLabel + { + SizeFlagsVertical = SizeFlags.FillExpand + }) + } + } + } + }; + + Contents.AddChild(hSplit); + + BodyPartList.OnItemSelected += BodyPartOnItemSelected; + MechanismList.OnItemSelected += MechanismOnItemSelected; + } + + public BodyScannerBoundUserInterface Owner { get; } + + protected override Vector2? CustomSize => (800, 600); + + private ItemList BodyPartList { get; } + + private Label BodyPartLabel { get; } + + private Label BodyPartHealth { get; } + + private ItemList MechanismList { get; } + + private RichTextLabel MechanismInfoLabel { get; } + + public void UpdateDisplay(BodyScannerTemplateData template, Dictionary parts) + { + _template = template; + _parts = parts; + _slots = new List(); + BodyPartList.Clear(); + + foreach (var slotName in _parts.Keys) + { + // We have to do this since ItemLists only return the index of what item is + // selected and dictionaries don't allow you to explicitly grab things by index. + // So we put the contents of the dictionary into a list so + // that we can grab the list by index. I don't know either. + _slots.Add(slotName); + + BodyPartList.AddItem(Loc.GetString(slotName)); + } + } + + public void BodyPartOnItemSelected(ItemListSelectedEventArgs args) + { + if (_parts.TryGetValue(_slots[args.ItemIndex], out _currentBodyPart)) { + UpdateBodyPartBox(_currentBodyPart, _slots[args.ItemIndex]); + } + } + + private void UpdateBodyPartBox(BodyScannerBodyPartData part, string slotName) + { + BodyPartLabel.Text = $"{Loc.GetString(slotName)}: {Loc.GetString(part.Name)}"; + BodyPartHealth.Text = $"{part.CurrentDurability}/{part.MaxDurability}"; + + MechanismList.Clear(); + foreach (var mechanism in part.Mechanisms) { + MechanismList.AddItem(mechanism.Name); + } + } + + public void MechanismOnItemSelected(ItemListSelectedEventArgs args) + { + UpdateMechanismBox(_currentBodyPart.Mechanisms[args.ItemIndex]); + } + + private void UpdateMechanismBox(BodyScannerMechanismData mechanism) + { + // TODO: Improve UI + if (mechanism == null) + { + MechanismInfoLabel.SetMessage(""); + return; + } + + var message = + Loc.GetString( + $"{mechanism.Name}\nHealth: {mechanism.CurrentDurability}/{mechanism.MaxDurability}\n{mechanism.Description}"); + + MechanismInfoLabel.SetMessage(message); + } + } +} diff --git a/Content.Client/Health/BodySystem/Surgery/GenericSurgeryBoundUserInterface.cs b/Content.Client/GameObjects/Components/Body/Surgery/GenericSurgeryBoundUserInterface.cs similarity index 72% rename from Content.Client/Health/BodySystem/Surgery/GenericSurgeryBoundUserInterface.cs rename to Content.Client/GameObjects/Components/Body/Surgery/GenericSurgeryBoundUserInterface.cs index 04c0246e83..e44f368221 100644 --- a/Content.Client/Health/BodySystem/Surgery/GenericSurgeryBoundUserInterface.cs +++ b/Content.Client/GameObjects/Components/Body/Surgery/GenericSurgeryBoundUserInterface.cs @@ -1,29 +1,30 @@ -using Content.Shared.Health.BodySystem.Surgery; +#nullable enable +using Content.Shared.Body.Surgery; +using JetBrains.Annotations; using Robust.Client.GameObjects.Components.UserInterface; using Robust.Shared.GameObjects.Components.UserInterface; -namespace Content.Client.Health.BodySystem.Surgery +namespace Content.Client.GameObjects.Components.Body.Surgery { - - //TODO : Make window close if target or surgery tool gets too far away from user. + // TODO : Make window close if target or surgery tool gets too far away from user. ///

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 zop�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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Back/corgi_back.rsi/cardborg.png b/Resources/Textures/Clothing/Mobs/Back/corgi_back.rsi/cardborg.png new file mode 100644 index 0000000000000000000000000000000000000000..f0c14cb8362285cb8a7cc8b93dcf72b65890bb28 GIT binary patch literal 792 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 ig+^2xr)hJazWfCo?31~RP}Lp)00006 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Back/corgi_back.rsi/meta.json b/Resources/Textures/Clothing/Mobs/Back/corgi_back.rsi/meta.json new file mode 100644 index 0000000000..157fe60c95 --- /dev/null +++ b/Resources/Textures/Clothing/Mobs/Back/corgi_back.rsi/meta.json @@ -0,0 +1 @@ +{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/tgstation/tgstation/commit/53d1f1477d22a11a99c6c6924977cd431075761b", "states": [{"name": "armor", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "cardborg", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "deathsquad", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "fire_extinguisher0", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "fire_extinguisher1", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "ian", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "oxygen", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "petcollar", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "walkietalkie", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}]} \ No newline at end of file diff --git a/Resources/Textures/Clothing/Mobs/Back/corgi_back.rsi/oxygen.png b/Resources/Textures/Clothing/Mobs/Back/corgi_back.rsi/oxygen.png new file mode 100644 index 0000000000000000000000000000000000000000..4e1ba4acbb032bda948e73fcfd5f1bd9db97eed0 GIT binary patch literal 585 zcmV-P0=E5$P)Q{Y>G#NACOk@p2j71Bi%-h=_=Yh;A4o z>i~nWY*&KMr(5q5)pBcianfbkuK1IWU_YJ%0DJ=^NfXRr2TOz2S^!{au7X+X0JGLX zX#85!TCV}X^7^J23ooU-vLWS_4Ow2_l=Jf!mD_hf@DrGsyaxc-`T8-@dmwiW2)6l$ z!`tu+MaXyw#;S04zRV!0R{fLt{ygrU%uXFDe_*J74UCWxMih?G*rEd+!kK zW*twb@8HwU@6fu&&mS;5t<;-f*{=A7B4!>u42=gF$EM0C-JbveynV46n=kTyfKp1n z7mEK1??uK-@RL+9px|6EPPy;-2s=cVIXFw1s?_)f9{4Sx-vF)_hEKgh$`jrrqP}qG4@n@?Tw3eQ&)`$d5cRMun=p(#xx6NqnNisC{p2Ad5si*B XhNsCThrCTx00000NkvXXu0mjf>GKa< literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Back/corgi_back.rsi/petcollar.png b/Resources/Textures/Clothing/Mobs/Back/corgi_back.rsi/petcollar.png new file mode 100644 index 0000000000000000000000000000000000000000..a41aa29918d7bb4307ea5df5f113324bb25039ad GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Cp}#pLn`LHy|tJ3kbywk!_7xT z65FQmOt3s8!}HMcgVc`GO!FAm7m5gK{Nc!PZW7t=FYI0R>F1J?awVW{AXw4;^E+!- z<@)WVJ&!lP-~9S!O8c=Nb{bE8R%Tx`>?*nY`TO$Uoj+5j&tYl(9Cz!kXHj#wV#H#r z4z}zspI=U0wW|VR43J!4c5k)C_L%+)mV0OO|2UK%eUtU?&y;g3P0sG9GnEd=*cbQj zG0#EA&6}D`Z{_tHxnJzQ?6|4^`lNE8-i8wKNG|^)hnUm*LFRe7`njxgN@xNAniXwi literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Back/corgi_back.rsi/walkietalkie.png b/Resources/Textures/Clothing/Mobs/Back/corgi_back.rsi/walkietalkie.png new file mode 100644 index 0000000000000000000000000000000000000000..5a5ff60380bfda086048ed24a728de09676ad958 GIT binary patch literal 433 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV65X>&B>g7 z>HAHlop-9^^&19lh!TaYQ9T?ocdK$|&34exuXk`;*nz-c@dzxB6zNg!_Ey)ZeRZ_r2OA#=ozA z2P1>cL&@BVP4AUNy7h}}-7KwUFlFETc)I(ZMa}7OCWh(94kt}`{Kf0xU)Kpesq0xY zetLE3xSBECJ}ug|P$D_&dcFCvj?+6C@}(2`I)fQ6nXI)szJF($R&0Zc=Nz?LtkZMc z|8q{UQ{5J$m%Woa#(3&I#>i<0qh6cbG>gohm>T)Aa4C1daruOW=Wcean75DN`rp>q UCbxB^flFVdQ&MBb@0B3r-6aWAK literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/beret.png b/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/beret.png new file mode 100644 index 0000000000000000000000000000000000000000..5c2725e910f0853309cd66afe7b0fe342237fc63 GIT binary patch literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEVAS+O?sSP{)^QlsAB)7`h|7dau3S5);B)BkPv?3Nc20s z@Sq((W6r*K$P9Ei6x1K}y|-lB;sY+(JpM7O6IXtg4R%WLnskq2>yq%~wN)X`uj0>| zA5-z@d(E`u;?$*j!7@ve6qKvpnCEpr*v7EB^Tnxq0r~nbEsJv!S4@ArjbW;u{vPRV v)2z7_?610O#Y z$?DpEwPEpp?;LR1Kl`j{cj4sQdmA#oefh6#I+I@^ibn~k83+zU8y;JRe4IFxl>9sQd{0W76f`R;d7Fo(@2aSftt|p6kz$6MP4^eC(~SGf zWFw`cq_mYm&~oX|T;5etMdw}{8^7+l8oOcDw9RFEm(Hu4H#_U+E8icUXWw7k%Me~T zlND&r-usPu?*HGNE1D?`aRiY3XOgmRyX+(xTWy)S+2svyTUnmpxx8mzY0z)4+*{TA zpRM@zOk!8`)(ZknPv(^SPuQ;fjZla~Cpsm|`nTQ|I2+POEYXU^vj&-e?E*)E)z pXD_q&FB8xA`F;C2)EOAwy=8aloMy{)L|77Jqo=E%%Q~loCIC$nm0|z@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/bunny.png b/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/bunny.png new file mode 100644 index 0000000000000000000000000000000000000000..63dd9d103adbda1697d8a40b7d6698c05ab8115e GIT binary patch literal 508 zcmV2WN7zgmjb>K-TE1rtIt{3U2@Kfhg6ffC17pYK$I*JF$4qb-Y)y?>%FZTa~Vm+8V zd6M`VB7mpn*&HOL)aL(sy|yZY)0lW(Z7Y47&uL#2X93s*F~p_1n(++r!V}gh0P_<< z=)aE`PD-hp^>DCGKv>tU{e4mV^uQ*L&w6Ss(|A)C7waj|^&SNDaX7FB*X5#Ywgeci z=6|zX&e3H(1-#|b>)U@6gM*e*>TYlJ?Q{E2?+>Ye^c1+oeL!EG+$UcE0DuX5$h$Wq z&vWhjK2=pkVHjGqh5cFJntb1jPYs%eFv* z=oDlWMVv*pY~q-G@daxFnxvGP<2&6h%k(bGoPFK1(GE3OcKUWN|Egdx;i05?|dD50+Uj* zUkRLzfZyC>PhK?v_vq;pz|PewQP*VyJgL@YDbI6VmL<(*Gg_@ycX!De<5JsN&jPxx yX|Y&L@^ka0wzU%Qc|5kZQ!?eY0RR91fQ>I($K`)xTBH^L00004%P)8uy*U)fIs7RS{0P+(ThRLg@B!vY_yP!Q^+H1kvI+eJQ}c7PQ(_xKY4@B3*E?7LD71NG zhgyy^Nz!thDYC=jrJ81J?4oW@QMac}XDWXl(m&_}cu8t>f4ftXnp4VzYqj@}0eij31 zyFUN`000000001h<4y@M{6+ZUvZ=y;hc-#Kl6FBglGMo9fs>jGU!0T=_=&NxI}A{S zY?u3I%HfM9w%u!;0e;|~4^XV~A*R~{TDN-f8P&KqrXDt8#000000N;E96IGzTPa`p@00000NkvXX Hu0mjfo20vq literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/cardborg_h.png b/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/cardborg_h.png new file mode 100644 index 0000000000000000000000000000000000000000..2a8fd7fcf755e93347d644d0973b4b512f97ff02 GIT binary patch literal 505 zcmVIw_5g;7EM2`sx2QYdBqakGh8y9?phR_?-g(;RY({}1q zZ2bRLEgjyQdF3n21Bi%-h^RQv?L~RVb;)m)N$z>q%Im(rfIpjR$30j6OO4zS080n~ z-(M&P2_fLmribww@z0W9rvMg!XtUWM?+z4AuBnpz7bPYE02qxY7>y?<$LVo~6^&cT zTj0o`Ka?KVjdlUTaF6-?0|4;${(7kN?af`Z+wBmBdxO)<&ab+zL-#FkkX*d%ye>)= zK(*L97NK?%?zFqPKXz8@W$o5QL_|bHL_|bHL`3upjQxL}Y)(k-&&QAJ_6*3Lr^@jY zMuOxuEdY9r3#Q{`DZM+K6gMsSvnf2cryldwxKKErOq@d}UKS$-h?^FK5O{uh!sEmJ z$(XFJ4pqFg(RhMEe+b8EXvND?dUsgHaT*x(hv{aClk*~EG2+FWWV8UlcM+1xG*HN5 zm|i?!=tHp6?nbTFmGXKJY_)f6tB5IM{1uQ^cA~5G(h7oY6;nD=c>(@9Bi{nH-Gu48 v<+;5m4EM^ow%x>Py)>GWh=_=Yi2jdHX4u&1uk<<&00000NkvXXu0mjfjT7sl literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/cargosoft.png b/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/cargosoft.png new file mode 100644 index 0000000000000000000000000000000000000000..a64e36d6f2e405a5413873331deb93573515f732 GIT binary patch literal 412 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU`+OOaSW-L^Y)gZ_hAPKwg=|h zrj@NSbH2m%DB#SM{SV(vGyNg$rMCRie1%IF^YnrWic5J#CaEfgu$;Xxt!c(0-RDy# z9ntVDx^nP)B$N2Nv(tA^cxuDNN+ zuk`L5XVq$*X1sg%Z*!AZsy@%POxl2{Kn5DEUoPL-P`L2+_o*4e&ew{6Ke>~!ZcWtE%|5<7Rc9lfw^`?KmfsM{ zl$G88wB_@n$IWrZ!ROS!Wa>mRte zQj6iir>aT6lpg+_DE{D;+TUXTYBoU_$bG|oNuu@PpBTxRz))xKboFyt=akR{0AA_6 AsQ>@~ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/chef.png b/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/chef.png new file mode 100644 index 0000000000000000000000000000000000000000..edd84cbd84ea341477463c530f36a177e58ac4da GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=J)SO(Ar*7p-ZJDnWWeKaQK|5T z%*pVRnX_iM^se-H5Vf%B`!v6)y6Jy!voY+^R(iJYeet=>6q&UHl~D3lU}Vgr9|PQ pSE}WvMNXRb4yij7nm|e#iuh&KerYXbRXz#gdb;|#taD0e0svyDOBVnD literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/christmasscarf.png b/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/christmasscarf.png new file mode 100644 index 0000000000000000000000000000000000000000..e179cc20691e98ba90beada6a3187b7006159c36 GIT binary patch literal 366 zcmV-!0g?WRP)9APeNctZ4gU^h~L6SO2 zUsK#UekbWQAcv@A=PH|48ve$$;YS)i%0K)vhb7ZWzwd=#fHYR2X4UVpQ$BCCa;fpX zhlu(9lk6pDwVoGXCAY7c&)RN)bp3y!2)m-{r)Xk-__^KY%mV-b00000005MirIF}& zWJ-64bH_?P!0*Ss=)7N_t5a*I7#lCfEHy^fYWZ^mr=!$7r_BvCz1)0;X~(tGG4CzQ zeqF6MH{h*B#jzLqkFjS}v&OD*Rco6YsP5r!fPLiZOO>ZI003$J0oP_@(`K!;EdT%j M07*qoM6N<$g6$}#^8f$< literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/clown.png b/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/clown.png new file mode 100644 index 0000000000000000000000000000000000000000..50f6fc3854b670b194bc2c20941f0ceb95eecc20 GIT binary patch literal 547 zcmV+;0^I$HP)3-(4ts#||1FT~^}D<8S{UvFh=_>jP$|=n(}$|W-@VpId!K1PTdu}8nqWF;T6zGJ zKAUnme&OVFfrpLGO54TDO>T_eBtbWRHm+&EtYg~=O~$k2d(9632mpmaFG{YRouAl- zwU%9!*BYsHNzgem9cVJ1B@3K2-v9tgEf&A{{Ao}3E%SFEj;)L7wMHtvK_&_l5C_h- z)qEc!3V=XFq2~KW_u0zZfFd>ter54mBlUiJ znmpd^c3ZmL?sc|by6anjb(!w1=B{r8h1)c>+wTO0q;m79}_OVu(NW3KUh9 ztlDm=P0YGT%Er2?l2wuXr&i@ l6$E=TFCro$A|m>qz5$ggP_AceLInT-002ovPDHLkV1le={dE8U literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/detective.png b/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/detective.png new file mode 100644 index 0000000000000000000000000000000000000000..f3b40d19da9f56d0e42d6539405cb52e0a4bfd87 GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=dpunnLn`LHy=BOC$Uubc!HWlK z7MyWMohw-MA3S^a;T1}H5JWIH%lA&zktJ(TK+ROV#e8#4|;!F$^lDEf& zeJt+y>Ym$u{M&NxvbgxKo6TzMa#kHr`S-c@*Phm^-){W$*NEJI@lkzvuHnA+*V*4H z-#;?@5-Sh19tav1zFN{Mvwh?3Z7aRgu4+oncy<4I-ky@Uxk-*ISM~~gQZx5@zEp(M pb8g7HD{gbX&lNOgWdiBz-OG5&AtIu++Ta0*>*?y}vd$@?2>?2ZX~O^j literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/festive.png b/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/festive.png new file mode 100644 index 0000000000000000000000000000000000000000..dc3dccf6c9b23aea492fb63668a65c09ccfec49c GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU^Mh}aSW-L^Y+$8FJ?!P)`!jl zJqh|Zo-@ALcJtUd_D_mIQIW@|ZxD7A*rd?3#AxZe0|`Axd<=ZLvM1)uoFMy%>sS5R z17gqb?fp6tXs~SAyqPMoH$I*Hl{V?h`DyR{S3e6WUTwQ-@2iZZIuD$tOkF*Hd-UWb zHpbGf(}lusYgj$KDj4>8?U^&J5!TuIsf_l~9&xigE`9tIJ;OF@j?lD(Js-HZ*VoSV zn53q6>gUxsQ&rgo(H5oaZhczb{;Oig^m+DQP4%wK<_~_9^?K*Jd$(m}@9g!eTOfY6 zq*B;K=UML=cA!V0;7|7MoII1OPM%pEYc{Xk8TjnyweIPadA?f%CUFV9&dJK#)4HLw zuRkzrMeC-^%s~E}t$o|hRnGD&jr|dyyAWzh{T1_b_paPbULl|c67h8Pb6Mw<&;$TC C!JwxA literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/hardhat0_cakehat.png b/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/hardhat0_cakehat.png new file mode 100644 index 0000000000000000000000000000000000000000..b521d905f73aea773855a938d468aab0eb79dd77 GIT binary patch literal 289 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=FFaiwLn`LHy|q!W$w8p?Vd=30 zOd5?F8MPO%{8Cidk>#P$$dz+oVT<;GH#!F<-agto`Qv{fp^ECw6F#~yFueYHX?guT zeWjpZ4Dn~}Bjqc~V#^+=vJ}5le6~E%!|>RWopP!BGJ_4>N((|m-{mKE|4cv4=)@6p zz4Y6@%6YmQU7xSMe<^p?rDU0_2d{6NT77v(E$h3o29?aazeg4v+d8|C!eX~w+-@4S49@e)~VWUcT+=eM)Hk*rLwyn_B&+y`& e7YQ}z-W~?Vh0lIY`LReFB;x7n=d#Wzp$PzYYIukM literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/hardhat0_reindeer.png b/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/hardhat0_reindeer.png new file mode 100644 index 0000000000000000000000000000000000000000..635cc731f1651f086f3d9c9b4a323a355c681e84 GIT binary patch literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Up!qLLn`LHz2(T&L)&i>Y@{(?pBz-E@XRoNcq0=L*Ex^Qb}MQMtv@miTY{l8tN{reN)xvl;z3?F7b zOGt=m?4 z4_1Es8dhz4TfFFu{-#?wvU7LszqDV7bzax=%gfaT&o9^FvQd7&FZVCwgZwR4dQ&{U zUM-Ef_A9bq5$IwtxDXuc*EwUBh2TY*2|wJAF}*1AIdYU6bA55aqopv3I&H+=o^#_+EHE9-NBb=(+2GmM5{01;I1y}QqT^iZxCop5QK{q znlaOLkQ=V}uZ=fd{C;qUn}l;tPA-`aKtx28TC?G*f0@78a8;=QTVk&)C`B1^|@H<>XqmTD4NUl_1~!=-OTj v#bWVKIi!@z9KA7d42Fn^h=_=Yh$w|OK7#nsmL36N00000NkvXXu0mjflw0Q> literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/hardhat0_yellow.png b/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/hardhat0_yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..90c5a20b5ea5f72aafcd829ca0b02dd675605af8 GIT binary patch literal 527 zcmV+q0`UEbP)cfQbA=EL?T05cK1|L8ZTPyC0sr}AshULA}leyfQkUCjEC z#UVCVcPnB2$dc~pE1?)a>5?D5@x4ERYY$T9XWgpL&${tA4ffMNj?e0^%B7gy^);x? z)FJx`!374%9`~LeJv)k0EXKdSICbp)yWYV_0Gy?Y}Lv4zGm)e7wFx;X%9(-BLJY^b`* zP+B$*Uu^ZpMP9u9HgxaN^9-K~czl0&eTs9JRSBgh0N~c8D*)Vl`RUkmr~MzC)Z_E! z&Q$zu4yT+vTHCMV5ms77e){ktkpANO&6sZkHL_|bHL_|cy!!NxRx+yor RK1~1s002ovPDHLkV1m+%0Q>*| literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/hardhat1_cakehat.png b/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/hardhat1_cakehat.png new file mode 100644 index 0000000000000000000000000000000000000000..12296b1d4615cc7c820d8e55d93f0a5b50cb5c9e GIT binary patch literal 459 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7xzrV4URX;uumf=k1-1xlD#44T5!&fY!w<4>*ctS5Ei`cJDB85nF7 z-j!|qBCVma&S}q_e#3Q68x?oV>0ipe;cMMT_80sgCjDl=fBWs-2hrD4>%;dq)!liU zbpN~I)8%!tf7f`v{B8I1aQD%qFPc~6_y3>uxnbSwLq$9H{H|VpS@ZekU#!1R2LCFw zII{jPP}%$0zCU8tyZ_d|pnsbk=mQu?J5k%vwv%7LX+@1~4Ilpn`2)2Ke@lw*^ylw= zZ|Cs1_B*50``!Et_+jcn^nMGOiw5n=P8?J3^UgTT{6)BDmrcd%ii1EDKb8Nm~a_9S#I=KOW|S0uYq-p=wp39G=o#Xc#oJ~plF6MHfJEi;n2{%6+JAAa+z zT|g`H>%7m*U(`RnpBHg?_q(;p#unG^{s%Y1 a<_UWb`~FkKo~ti_#5`U7T-G@yGywof8_+cX literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/hardhat1_white.png b/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/hardhat1_white.png new file mode 100644 index 0000000000000000000000000000000000000000..adc52987b43d8b858c8def7ac96c5c5b6cc2f849 GIT binary patch literal 496 zcmVYU6bA55mx4=+kR?m$(g$$K;35STf;zZa5V{sRB~ht;0{>1vgQJ6rpe_Y<^#Sf+ z>6k^@LE%ov>4sEWO=DUVz8~D--dxT(Igm^TAR;14&G!QN&-rJ6li0Q(@2}6WEy%PR zVe&sdJxo8p?*-yGj?`-vk+&DA*DB&T&eV!9`P=Pww5FEd_X5#ci`H6f3sSFD#I_Kf zO}Yr*3nUCf(OOFwhS4(nar3AC1ooRPY;6aan_s}zc7Xk6D{ZJ$dcEGa`=n;Zxg78A z?%oaxg~C7qhX+T|{^ay{tk~n`U*A~!^8D)ZdZPJ>h=_=Yh=_=Yh=_=Yh$v1eC1(9* zUcmPPiO0&aMkDonz$i*7$>;Mh3jk~j(x|$LU!YNS#kL>-5RWyfCS*n_H88EAloIpu z{eC}D6XJJm3odM9a4cbp?;5;6? zTrOu)d*%%QfKI0a0Jyuo|8noA$&F$EjFr`806?i!iq8I214jMm%ot5BmrIpLYb~Eg mZ{j!xLqtSGL_|bHl)?w2(;YzD&S*XW0000*OFP>eeENjxOR* z+#D*j3c;;|y5%^8)YQ*5ra|F-;0{SH_q{zNUG4#hh=>9+4ak4aSAG+$sgQx81T+;A zbs@a`ijC;=O#?ElLo$mAk*Bg`785e8N4E(tKWBB;M`Zb?0g)SBq!bfPb&H^>5Gln( zZuGWq!ZaY2f}2+A3_5$%i_c}_|d;8n#W_7eO*7<;T6|u3}_=5V^4(oFWy#N3(-!lpTnA^MhFz=`TgU@<=4j0A%00$4(^?QG+ z0ADpG<<@|{-WWPY>_9nEib?g}ZfL#nV;c++5fKp)5fM=UuX9x6co9qH6aWAK07*qo IM6N<$g21Tl)Bpeg literal 0 HcmV?d00001 diff --git a/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/helmet.png b/Resources/Textures/Clothing/Mobs/Hats/corgi_hats.rsi/helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..f75f4365f71c68bd9ab432afedee080f17441626 GIT binary patch literal 632 zcmV-;0*C#HP)lAX(b0U{zI`d{5KJy8guT*pa{`-1^G zosMz6ztz8B+Pq$`BM5?IERJIUP^(x3-5&sgAke*y`rkEa?m7;nlu6?_jv=Ll>o^cX zsJu1v_7B4lQp%(^07xkjhGFjhxqmI+E336N7xxO;Q-9tn^m=`qb-yp|U+{c?UjabL z^D^I^ce?<9k4Hyy_cwY3uC6Yz{^rZO%=pWv2d;bHq-1XTW*3!v0s8$PL&vR#e^`Bg z_IA?uww+&GKyQBi!5|qQH?}nE4<3$v&L)l9?k$8+qtCh?Tg5db7c%X5mAx0ahJ`jO z-zz5#m$~r~5fKp)5fKp)5fKsDVEtvrXm9~A3oqEJGmFvN;YrfLiBxDon>)Oa4nSzB znpQ&?xdRfDj0;YrMNu?YctHrEqA1FYFDry$Z6$YVHC3rrQ7je#{7!7NTdmBzZzm^H zd+yX~nVTC|cUGNwS$zbw<7PAYeEaIdaFC+mPd#^Ze&O|t1HF)scXusa;UCr>0Ub;@ zZZ=Wc+(2n_1J^gbp*gLFe>kho=$z}DUQ$mltj!RF)g4vu1CJ^d0Kn%@Ul)FD?t5kR zZ0`vG;I!Rdc^uD(@0FF#4x}>#CUr*Z{gbvT+iI(_J@*adolitWL_|bHl+Q0IjRS#b SI?A2^0000Lm^9CvNSuE%AOG@ z5Sl9R%Btzmf8A|9@<=5~mKeh5T)oUc2{&XhLQ5vbf#*PwZd8 z_PIY>HC~f(^P>Mz)(i|Yvjusc%kN=eD5z#z^PYj>&t+wc-|c}ls}`6(by&Chz>$>t zJ=a;^_;Y<`eH(rt_i7*)ljtf=#{67y3wz0x;STj1rzr={;C%10o_miSqyE2)`jE~J zB=F+=srLq#i!S*WT;>Zbtut2HJo%Wp!G4Ktv#Yg2EXxAVorq*i`FWt5Dg5e&T(d

public const float CellVolume = 2500f; + // Liters in a normal breath + public const float BreathVolume = 0.5f; + + // Amount of air to take from a tile + public const float BreathPercentage = BreathVolume / CellVolume; + /// /// Moles in a 2.5 m^3 cell at 101.325 kPa and 20ºC /// diff --git a/Content.Shared/Health/BodySystem/Mechanism/MechanismPrototype.cs b/Content.Shared/Body/Mechanism/MechanismPrototype.cs similarity index 60% rename from Content.Shared/Health/BodySystem/Mechanism/MechanismPrototype.cs rename to Content.Shared/Body/Mechanism/MechanismPrototype.cs index acf2711f28..fc84807182 100644 --- a/Content.Shared/Health/BodySystem/Mechanism/MechanismPrototype.cs +++ b/Content.Shared/Body/Mechanism/MechanismPrototype.cs @@ -1,63 +1,56 @@ using System; +using System.Collections.Generic; +using Content.Shared.GameObjects.Components.Body; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.ViewVariables; using YamlDotNet.RepresentationModel; -namespace Content.Shared.Health.BodySystem.Mechanism +namespace Content.Shared.Body.Mechanism { - /// - /// Prototype for the Mechanism class. + /// Prototype for the Mechanism class. /// [Prototype("mechanism")] - [NetSerializable, Serializable] + [Serializable, NetSerializable] public class MechanismPrototype : IPrototype, IIndexedPrototype { + private List _behaviorClasses; + private BodyPartCompatibility _compatibility; + private string _description; + private int _destroyThreshold; + private int _durability; + private string _examineMessage; private string _id; private string _name; - private string _description; - private string _examineMessage; + private int _resistance; private string _rsiPath; private string _rsiState; - private int _durability; - private int _destroyThreshold; - private int _resistance; private int _size; - private BodyPartCompatibility _compatibility; - [ViewVariables] - public string ID => _id; + [ViewVariables] public string Name => _name; - [ViewVariables] - public string Name => _name; + [ViewVariables] public string Description => _description; - [ViewVariables] - public string Description => _description; + [ViewVariables] public string ExamineMessage => _examineMessage; - [ViewVariables] - public string ExamineMessage => _examineMessage; + [ViewVariables] public string RSIPath => _rsiPath; - [ViewVariables] - public string RSIPath => _rsiPath; + [ViewVariables] public string RSIState => _rsiState; - [ViewVariables] - public string RSIState => _rsiState; + [ViewVariables] public int Durability => _durability; - [ViewVariables] - public int Durability => _durability; + [ViewVariables] public int DestroyThreshold => _destroyThreshold; - [ViewVariables] - public int DestroyThreshold => _destroyThreshold; + [ViewVariables] public int Resistance => _resistance; - [ViewVariables] - public int Resistance => _resistance; + [ViewVariables] public int Size => _size; - [ViewVariables] - public int Size => _size; + [ViewVariables] public BodyPartCompatibility Compatibility => _compatibility; - [ViewVariables] - public BodyPartCompatibility Compatibility => _compatibility; + [ViewVariables] public List BehaviorClasses => _behaviorClasses; + + [ViewVariables] public string ID => _id; public virtual void LoadFrom(YamlMappingNode mapping) { @@ -74,7 +67,7 @@ namespace Content.Shared.Health.BodySystem.Mechanism serializer.DataField(ref _resistance, "resistance", 0); serializer.DataField(ref _size, "size", 2); serializer.DataField(ref _compatibility, "compatibility", BodyPartCompatibility.Universal); + serializer.DataField(ref _behaviorClasses, "behaviors", new List()); } } } - diff --git a/Content.Shared/Body/Part/BodyPartPrototype.cs b/Content.Shared/Body/Part/BodyPartPrototype.cs new file mode 100644 index 0000000000..7d6158dce3 --- /dev/null +++ b/Content.Shared/Body/Part/BodyPartPrototype.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Content.Shared.GameObjects.Components.Body; +using Robust.Shared.Interfaces.Serialization; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; +using YamlDotNet.RepresentationModel; + +namespace Content.Shared.Body.Part +{ + /// + /// Prototype for the BodyPart class. + /// + [Prototype("bodyPart")] + [Serializable, NetSerializable] + public class BodyPartPrototype : IPrototype, IIndexedPrototype + { + private BodyPartCompatibility _compatibility; + private string _damageContainerPresetId; + private int _destroyThreshold; + private int _durability; + private string _id; + private List _mechanisms; + private string _name; + private BodyPartType _partType; + private string _plural; + private List _properties; + private float _resistance; + private string _resistanceSetId; + private string _rsiPath; + private string _rsiState; + private int _size; + private string _surgeryDataName; + + [ViewVariables] public string Name => _name; + + [ViewVariables] public string Plural => _plural; + + [ViewVariables] public string RSIPath => _rsiPath; + + [ViewVariables] public string RSIState => _rsiState; + + [ViewVariables] public BodyPartType PartType => _partType; + + [ViewVariables] public int Durability => _durability; + + [ViewVariables] public int DestroyThreshold => _destroyThreshold; + + [ViewVariables] public float Resistance => _resistance; + + [ViewVariables] public int Size => _size; + + [ViewVariables] public BodyPartCompatibility Compatibility => _compatibility; + + [ViewVariables] public string DamageContainerPresetId => _damageContainerPresetId; + + [ViewVariables] public string ResistanceSetId => _resistanceSetId; + + [ViewVariables] public string SurgeryDataName => _surgeryDataName; + + [ViewVariables] public List Properties => _properties; + + [ViewVariables] public List Mechanisms => _mechanisms; + + [ViewVariables] public string ID => _id; + + public virtual void LoadFrom(YamlMappingNode mapping) + { + var serializer = YamlObjectSerializer.NewReader(mapping); + + serializer.DataField(ref _name, "name", string.Empty); + serializer.DataField(ref _id, "id", string.Empty); + serializer.DataField(ref _plural, "plural", string.Empty); + serializer.DataField(ref _rsiPath, "rsiPath", string.Empty); + serializer.DataField(ref _rsiState, "rsiState", string.Empty); + serializer.DataField(ref _partType, "partType", BodyPartType.Other); + serializer.DataField(ref _surgeryDataName, "surgeryDataType", "BiologicalSurgeryData"); + serializer.DataField(ref _durability, "durability", 50); + serializer.DataField(ref _destroyThreshold, "destroyThreshold", -50); + serializer.DataField(ref _resistance, "resistance", 0f); + serializer.DataField(ref _size, "size", 0); + serializer.DataField(ref _compatibility, "compatibility", BodyPartCompatibility.Universal); + serializer.DataField(ref _damageContainerPresetId, "damageContainer", string.Empty); + serializer.DataField(ref _resistanceSetId, "resistances", string.Empty); + serializer.DataField(ref _properties, "properties", new List()); + serializer.DataField(ref _mechanisms, "mechanisms", new List()); + + foreach (var property in _properties) + { + if (_properties.Count(x => x.GetType() == property.GetType()) > 1) + { + throw new InvalidOperationException( + $"Multiple {nameof(BodyPartPrototype)} of the same type were defined in prototype {ID}"); + } + } + } + } +} diff --git a/Content.Shared/Body/Part/Properties/BodyPartProperty.cs b/Content.Shared/Body/Part/Properties/BodyPartProperty.cs new file mode 100644 index 0000000000..8da251a565 --- /dev/null +++ b/Content.Shared/Body/Part/Properties/BodyPartProperty.cs @@ -0,0 +1,23 @@ +using Robust.Shared.Interfaces.Serialization; +using Robust.Shared.Serialization; + +namespace Content.Shared.Body.Part.Properties +{ + /// + /// Property attachable to a . + /// For example, this is used to define the speed capabilities of a + /// leg. The movement system will look for a LegProperty on all BodyParts. + /// + public abstract class BodyPartProperty : IExposeData + { + /// + /// Whether this property is currently active. + /// + public bool Active; + + public virtual void ExposeData(ObjectSerializer serializer) + { + serializer.DataField(ref Active, "active", true); + } + } +} diff --git a/Content.Shared/Body/Part/Properties/Movement/FootProperty.cs b/Content.Shared/Body/Part/Properties/Movement/FootProperty.cs new file mode 100644 index 0000000000..95432cbfe6 --- /dev/null +++ b/Content.Shared/Body/Part/Properties/Movement/FootProperty.cs @@ -0,0 +1,11 @@ +namespace Content.Shared.Body.Part.Properties.Movement +{ + /// + /// Defines the leg-based locomotion ability of a BodyPart. Required for humanoid-like movement. Must be connected to a + /// with + /// and to work. + /// + public class FootProperty : BodyPartProperty + { + } +} diff --git a/Content.Shared/Body/Part/Properties/Movement/LegProperty.cs b/Content.Shared/Body/Part/Properties/Movement/LegProperty.cs new file mode 100644 index 0000000000..77ba06f888 --- /dev/null +++ b/Content.Shared/Body/Part/Properties/Movement/LegProperty.cs @@ -0,0 +1,23 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Body.Part.Properties.Movement +{ + /// + /// Defines the speed of humanoid-like movement. Must be connected to a + /// with and have + /// on the same organ and down to the foot to work. + /// + public class LegProperty : BodyPartProperty + { + /// + /// Speed (in tiles per second). + /// + public float Speed; + + public override void ExposeData(ObjectSerializer serializer) + { + base.ExposeData(serializer); + serializer.DataField(ref Speed, "speed", 1f); + } + } +} diff --git a/Content.Shared/Body/Part/Properties/Other/ExtensionProperty.cs b/Content.Shared/Body/Part/Properties/Other/ExtensionProperty.cs new file mode 100644 index 0000000000..52d5965083 --- /dev/null +++ b/Content.Shared/Body/Part/Properties/Other/ExtensionProperty.cs @@ -0,0 +1,21 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Body.Part.Properties.Other +{ + /// + /// Defines the extension ability of a BodyPart. Used to determine things like reach distance and running speed. + /// + public class ExtensionProperty : BodyPartProperty + { + /// + /// Current reach distance (in tiles). + /// + public float ReachDistance; + + public override void ExposeData(ObjectSerializer serializer) + { + base.ExposeData(serializer); + serializer.DataField(ref ReachDistance, "reachDistance", 2f); + } + } +} diff --git a/Content.Shared/Body/Part/Properties/Other/GraspProperty.cs b/Content.Shared/Body/Part/Properties/Other/GraspProperty.cs new file mode 100644 index 0000000000..b3a774918e --- /dev/null +++ b/Content.Shared/Body/Part/Properties/Other/GraspProperty.cs @@ -0,0 +1,10 @@ +namespace Content.Shared.Body.Part.Properties.Other +{ + /// + /// Defines the item grasping ability of a BodyPart. Distance is determined by the + /// ExtensionProperties of the current BodyPart or attached BodyParts. + /// + public class GraspProperty : BodyPartProperty + { + } +} diff --git a/Content.Shared/Health/BodySystem/BodyPreset/BodyPresetPrototype.cs b/Content.Shared/Body/Preset/BodyPresetPrototype.cs similarity index 56% rename from Content.Shared/Health/BodySystem/BodyPreset/BodyPresetPrototype.cs rename to Content.Shared/Body/Preset/BodyPresetPrototype.cs index f36202a5a4..6fb56cc3ba 100644 --- a/Content.Shared/Health/BodySystem/BodyPreset/BodyPresetPrototype.cs +++ b/Content.Shared/Body/Preset/BodyPresetPrototype.cs @@ -5,32 +5,31 @@ using Robust.Shared.Serialization; using Robust.Shared.ViewVariables; using YamlDotNet.RepresentationModel; -namespace Content.Shared.Health.BodySystem.BodyPreset { - +namespace Content.Shared.Body.Preset +{ /// /// Prototype for the BodyPreset class. /// [Prototype("bodyPreset")] - [NetSerializable, Serializable] - public class BodyPresetPrototype : IPrototype, IIndexedPrototype { + [Serializable, NetSerializable] + public class BodyPresetPrototype : IPrototype, IIndexedPrototype + { private string _id; private string _name; - private Dictionary _partIDs; + private Dictionary _partIDs; - [ViewVariables] - public string ID => _id; + [ViewVariables] public string ID => _id; - [ViewVariables] - public string Name => _name; + [ViewVariables] public string Name => _name; - [ViewVariables] - public Dictionary PartIDs => _partIDs; + [ViewVariables] public Dictionary PartIDs => _partIDs; - public virtual void LoadFrom(YamlMappingNode mapping){ + public virtual void LoadFrom(YamlMappingNode mapping) + { var serializer = YamlObjectSerializer.NewReader(mapping); serializer.DataField(ref _id, "id", string.Empty); serializer.DataField(ref _name, "name", string.Empty); - serializer.DataField(ref _partIDs, "partIDs", new Dictionary()); + serializer.DataField(ref _partIDs, "partIDs", new Dictionary()); } } } diff --git a/Content.Shared/Health/BodySystem/BodyScanner/BodyScannerSharedValues.cs b/Content.Shared/Body/Scanner/BodyScannerSharedValues.cs similarity index 79% rename from Content.Shared/Health/BodySystem/BodyScanner/BodyScannerSharedValues.cs rename to Content.Shared/Body/Scanner/BodyScannerSharedValues.cs index 0f9f83cf6c..83b11556ba 100644 --- a/Content.Shared/Health/BodySystem/BodyScanner/BodyScannerSharedValues.cs +++ b/Content.Shared/Body/Scanner/BodyScannerSharedValues.cs @@ -1,40 +1,43 @@ using System; using System.Collections.Generic; +using Content.Shared.GameObjects.Components.Body; using Robust.Shared.GameObjects.Components.UserInterface; using Robust.Shared.Serialization; -namespace Content.Shared.Health.BodySystem.BodyScanner +namespace Content.Shared.Body.Scanner { - - - [NetSerializable, Serializable] + [Serializable, NetSerializable] public enum BodyScannerUiKey { Key } - [NetSerializable, Serializable] + [Serializable, NetSerializable] public class BodyScannerInterfaceState : BoundUserInterfaceState { public readonly Dictionary Parts; public readonly BodyScannerTemplateData Template; - public BodyScannerInterfaceState(Dictionary parts, BodyScannerTemplateData template) + + public BodyScannerInterfaceState(Dictionary parts, + BodyScannerTemplateData template) { Template = template; Parts = parts; } } - [NetSerializable, Serializable] + [Serializable, NetSerializable] public class BodyScannerBodyPartData { + public readonly int CurrentDurability; + public readonly int MaxDurability; + public readonly List Mechanisms; public readonly string Name; public readonly string RSIPath; public readonly string RSIState; - public readonly int MaxDurability; - public readonly int CurrentDurability; - public readonly List Mechanisms; - public BodyScannerBodyPartData(string name, string rsiPath, string rsiState, int maxDurability, int currentDurability, List mechanisms) + + public BodyScannerBodyPartData(string name, string rsiPath, string rsiState, int maxDurability, + int currentDurability, List mechanisms) { Name = name; RSIPath = rsiPath; @@ -45,16 +48,18 @@ namespace Content.Shared.Health.BodySystem.BodyScanner } } - [NetSerializable, Serializable] + [Serializable, NetSerializable] public class BodyScannerMechanismData { - public readonly string Name; + public readonly int CurrentDurability; public readonly string Description; + public readonly int MaxDurability; + public readonly string Name; public readonly string RSIPath; public readonly string RSIState; - public readonly int MaxDurability; - public readonly int CurrentDurability; - public BodyScannerMechanismData(string name, string description, string rsiPath, string rsiState, int maxDurability, int currentDurability) + + public BodyScannerMechanismData(string name, string description, string rsiPath, string rsiState, + int maxDurability, int currentDurability) { Name = name; Description = description; @@ -65,11 +70,12 @@ namespace Content.Shared.Health.BodySystem.BodyScanner } } - [NetSerializable, Serializable] + [Serializable, NetSerializable] public class BodyScannerTemplateData { public readonly string Name; public readonly Dictionary Slots; + public BodyScannerTemplateData(string name, Dictionary slots) { Name = name; @@ -77,5 +83,3 @@ namespace Content.Shared.Health.BodySystem.BodyScanner } } } - - diff --git a/Content.Shared/Health/BodySystem/Surgery/GenericSurgeryUIMessages.cs b/Content.Shared/Body/Surgery/GenericSurgeryUIMessages.cs similarity index 71% rename from Content.Shared/Health/BodySystem/Surgery/GenericSurgeryUIMessages.cs rename to Content.Shared/Body/Surgery/GenericSurgeryUIMessages.cs index eee26afde0..6a6f224bb1 100644 --- a/Content.Shared/Health/BodySystem/Surgery/GenericSurgeryUIMessages.cs +++ b/Content.Shared/Body/Surgery/GenericSurgeryUIMessages.cs @@ -3,31 +3,38 @@ using System.Collections.Generic; using Robust.Shared.GameObjects.Components.UserInterface; using Robust.Shared.Serialization; -namespace Content.Shared.Health.BodySystem.Surgery +namespace Content.Shared.Body.Surgery { - - [Serializable, NetSerializable] + [Serializable] + [NetSerializable] public class RequestBodyPartSurgeryUIMessage : BoundUserInterfaceMessage { public Dictionary Targets; + public RequestBodyPartSurgeryUIMessage(Dictionary targets) { Targets = targets; } } - [Serializable, NetSerializable] + + [Serializable] + [NetSerializable] public class RequestMechanismSurgeryUIMessage : BoundUserInterfaceMessage { public Dictionary Targets; + public RequestMechanismSurgeryUIMessage(Dictionary targets) { Targets = targets; } } - [Serializable, NetSerializable] + + [Serializable] + [NetSerializable] public class RequestBodyPartSlotSurgeryUIMessage : BoundUserInterfaceMessage { public Dictionary Targets; + public RequestBodyPartSlotSurgeryUIMessage(Dictionary targets) { Targets = targets; @@ -35,43 +42,47 @@ namespace Content.Shared.Health.BodySystem.Surgery } - - - - [Serializable, NetSerializable] + [Serializable] + [NetSerializable] public class ReceiveBodyPartSurgeryUIMessage : BoundUserInterfaceMessage { - public int SelectedOptionID; - public ReceiveBodyPartSurgeryUIMessage(int selectedOptionID) + public int SelectedOptionId; + + public ReceiveBodyPartSurgeryUIMessage(int selectedOptionId) { - SelectedOptionID = selectedOptionID; + SelectedOptionId = selectedOptionId; } } - [Serializable, NetSerializable] + + [Serializable] + [NetSerializable] public class ReceiveMechanismSurgeryUIMessage : BoundUserInterfaceMessage { - public int SelectedOptionID; - public ReceiveMechanismSurgeryUIMessage(int selectedOptionID) + public int SelectedOptionId; + + public ReceiveMechanismSurgeryUIMessage(int selectedOptionId) { - SelectedOptionID = selectedOptionID; + SelectedOptionId = selectedOptionId; } } - [Serializable, NetSerializable] + + [Serializable] + [NetSerializable] public class ReceiveBodyPartSlotSurgeryUIMessage : BoundUserInterfaceMessage { - public int SelectedOptionID; - public ReceiveBodyPartSlotSurgeryUIMessage(int selectedOptionID) + public int SelectedOptionId; + + public ReceiveBodyPartSlotSurgeryUIMessage(int selectedOptionId) { - SelectedOptionID = selectedOptionID; + SelectedOptionId = selectedOptionId; } } - - - [NetSerializable, Serializable] + [NetSerializable] + [Serializable] public enum GenericSurgeryUiKey { - Key, + Key } } diff --git a/Content.Shared/Body/Template/BodyTemplatePrototype.cs b/Content.Shared/Body/Template/BodyTemplatePrototype.cs new file mode 100644 index 0000000000..d899432cdd --- /dev/null +++ b/Content.Shared/Body/Template/BodyTemplatePrototype.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Content.Shared.GameObjects.Components.Body; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; +using YamlDotNet.RepresentationModel; + +namespace Content.Shared.Body.Template +{ + /// + /// Prototype for the BodyTemplate class. + /// + [Prototype("bodyTemplate")] + [Serializable, NetSerializable] + public class BodyTemplatePrototype : IPrototype, IIndexedPrototype + { + private string _id; + private string _name; + private string _centerSlot; + private Dictionary _slots; + private Dictionary> _connections; + private Dictionary _layers; + private Dictionary _mechanismLayers; + + [ViewVariables] public string ID => _id; + + [ViewVariables] public string Name => _name; + + [ViewVariables] public string CenterSlot => _centerSlot; + + [ViewVariables] public Dictionary Slots => new Dictionary(_slots); + + [ViewVariables] + public Dictionary> Connections => + _connections.ToDictionary(x => x.Key, x => x.Value.ToList()); + + [ViewVariables] public Dictionary Layers => new Dictionary(_layers); + + [ViewVariables] public Dictionary MechanismLayers => new Dictionary(_mechanismLayers); + + public virtual void LoadFrom(YamlMappingNode mapping) + { + var serializer = YamlObjectSerializer.NewReader(mapping); + serializer.DataField(ref _id, "id", string.Empty); + serializer.DataField(ref _name, "name", string.Empty); + serializer.DataField(ref _centerSlot, "centerSlot", string.Empty); + serializer.DataField(ref _slots, "slots", new Dictionary()); + serializer.DataField(ref _connections, "connections", new Dictionary>()); + serializer.DataField(ref _layers, "layers", new Dictionary()); + serializer.DataField(ref _mechanismLayers, "mechanismLayers", new Dictionary()); + + //Our prototypes don't force the user to define a BodyPart connection twice. E.g. Head: Torso v.s. Torso: Head. + //The user only has to do one. We want it to be that way in the code, though, so this cleans that up. + var cleanedConnections = new Dictionary>(); + foreach (var targetSlotName in _slots.Keys) + { + var tempConnections = new List(); + foreach (var (slotName, slotConnections) in _connections) + { + if (slotName == targetSlotName) + { + foreach (var connection in slotConnections) + { + if (!tempConnections.Contains(connection)) + { + tempConnections.Add(connection); + } + } + } + else if (slotConnections.Contains(targetSlotName)) + { + tempConnections.Add(slotName); + } + } + + if (tempConnections.Count > 0) + { + cleanedConnections.Add(targetSlotName, tempConnections); + } + } + + _connections = cleanedConnections; + } + } +} diff --git a/Content.Shared/Damage/DamageClass.cs b/Content.Shared/Damage/DamageClass.cs new file mode 100644 index 0000000000..393b999486 --- /dev/null +++ b/Content.Shared/Damage/DamageClass.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using Robust.Shared.Serialization; + +namespace Content.Shared.Damage +{ + [Serializable, NetSerializable] + public enum DamageClass + { + Brute, + Burn, + Toxin, + Airloss + } + + public static class DamageClassExtensions + { + private static readonly ImmutableDictionary> ClassToType = + new Dictionary> + { + {DamageClass.Brute, new List {DamageType.Blunt, DamageType.Piercing}}, + {DamageClass.Burn, new List {DamageType.Heat, DamageType.Disintegration}}, + {DamageClass.Toxin, new List {DamageType.Cellular, DamageType.DNA}}, + {DamageClass.Airloss, new List {DamageType.Asphyxiation}} + }.ToImmutableDictionary(); + + public static List ToTypes(this DamageClass @class) + { + return ClassToType[@class]; + } + + public static Dictionary ToDictionary() + { + return Enum.GetValues(typeof(DamageClass)) + .Cast() + .ToDictionary(@class => @class, type => 0); + } + } +} diff --git a/Content.Shared/Damage/DamageContainer/DamageContainer.cs b/Content.Shared/Damage/DamageContainer/DamageContainer.cs new file mode 100644 index 0000000000..1f185a7c38 --- /dev/null +++ b/Content.Shared/Damage/DamageContainer/DamageContainer.cs @@ -0,0 +1,293 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using Content.Shared.GameObjects.Components.Damage; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; + +namespace Content.Shared.Damage.DamageContainer +{ + /// + /// Holds the information regarding the various forms of damage an object has + /// taken (i.e. brute, burn, or toxic damage). + /// + [Serializable, NetSerializable] + public class DamageContainer + { + private Dictionary _damageList = DamageTypeExtensions.ToDictionary(); + + public delegate void HealthChangedDelegate(List changes); + + [NonSerialized] public readonly HealthChangedDelegate OnHealthChanged; + + public DamageContainer(HealthChangedDelegate onHealthChanged, DamageContainerPrototype data) + { + OnHealthChanged = onHealthChanged; + SupportedClasses = data.ActiveDamageClasses; + } + + public DamageContainer(HealthChangedDelegate onHealthChanged, List supportedClasses) + { + OnHealthChanged = onHealthChanged; + SupportedClasses = supportedClasses; + } + + public DamageContainer(HealthChangedDelegate onHealthChanged) + { + OnHealthChanged = onHealthChanged; + } + + [ViewVariables] public virtual List SupportedClasses { get; } + + [ViewVariables] + public virtual List SupportedTypes + { + get + { + var toReturn = new List(); + foreach (var @class in SupportedClasses) + { + toReturn.AddRange(@class.ToTypes()); + } + + return toReturn; + } + } + + /// + /// Sum of all damages kept on record. + /// + [ViewVariables] + public int TotalDamage => _damageList.Values.Sum(); + + public IReadOnlyDictionary DamageClasses => + DamageTypeExtensions.ToClassDictionary(DamageTypes); + + public IReadOnlyDictionary DamageTypes => _damageList; + + public bool SupportsDamageClass(DamageClass @class) + { + return SupportedClasses.Contains(@class); + } + + public bool SupportsDamageType(DamageType type) + { + return SupportedClasses.Contains(type.ToClass()); + } + + /// + /// Attempts to grab the damage value for the given . + /// + /// + /// False if the container does not support that type, true otherwise. + /// + public bool TryGetDamageValue(DamageType type, [NotNullWhen(true)] out int damage) + { + return _damageList.TryGetValue(type, out damage); + } + + /// + /// Grabs the damage value for the given . + /// + public int GetDamageValue(DamageType type) + { + return TryGetDamageValue(type, out var damage) ? damage : 0; + } + + /// + /// Attempts to grab the sum of damage values for the given + /// . + /// + /// The class to get the sum for. + /// The resulting amount of damage, if any. + /// + /// True if the class is supported in this container, false otherwise. + /// + public bool TryGetDamageClassSum(DamageClass @class, [NotNullWhen(true)] out int damage) + { + damage = 0; + + if (SupportsDamageClass(@class)) + { + foreach (var type in @class.ToTypes()) + { + damage += GetDamageValue(type); + } + + return true; + } + + return false; + } + + /// + /// Grabs the sum of damage values for the given . + /// + public int GetDamageClassSum(DamageClass damageClass) + { + var sum = 0; + + foreach (var type in damageClass.ToTypes()) + { + sum += GetDamageValue(type); + } + + return sum; + } + + /// + /// Attempts to change the damage value for the given + /// + /// + /// + /// True if successful, false if this container does not support that type. + /// + public bool TryChangeDamageValue(DamageType type, int delta) + { + var damageClass = type.ToClass(); + + if (SupportsDamageClass(damageClass)) + { + var current = _damageList[type]; + current = _damageList[type] = current + delta; + + if (_damageList[type] < 0) + { + _damageList[type] = 0; + delta = -current; + current = 0; + } + + var datum = new HealthChangeData(type, current, delta); + var data = new List {datum}; + + OnHealthChanged(data); + + return true; + } + + return false; + } + + /// + /// Changes the damage value for the given . + /// + /// The type of damage to change. + /// The amount to change it by. + /// + /// Whether or not to suppress the health change event. + /// + /// + /// True if successful, false if this container does not support that type. + /// + public bool ChangeDamageValue(DamageType type, int delta, bool quiet = false) + { + if (!_damageList.TryGetValue(type, out var current)) + { + return false; + } + + _damageList[type] = current + delta; + + if (_damageList[type] < 0) + { + _damageList[type] = 0; + delta = -current; + } + + current = _damageList[type]; + + var datum = new HealthChangeData(type, current, delta); + var data = new List {datum}; + + OnHealthChanged(data); + + return true; + } + + /// + /// Attempts to set the damage value for the given . + /// + /// + /// True if successful, false if this container does not support that type. + /// + public bool TrySetDamageValue(DamageType type, int newValue) + { + if (newValue < 0) + { + return false; + } + + var damageClass = type.ToClass(); + + if (SupportedClasses.Contains(damageClass)) + { + var old = _damageList[type] = newValue; + _damageList[type] = newValue; + + var delta = newValue - old; + var datum = new HealthChangeData(type, newValue, delta); + var data = new List {datum}; + + OnHealthChanged(data); + + return true; + } + + return false; + } + + /// + /// Tries to set the damage value for the given . + /// + /// The type of damage to set. + /// The value to set it to. + /// + /// Whether or not to suppress the health changed event. + /// + /// True if successful, false otherwise. + public bool SetDamageValue(DamageType type, int newValue, bool quiet = false) + { + if (newValue < 0) + { + return false; + } + + if (!_damageList.ContainsKey(type)) + { + return false; + } + + var old = _damageList[type]; + _damageList[type] = newValue; + + if (!quiet) + { + var delta = newValue - old; + var datum = new HealthChangeData(type, 0, delta); + var data = new List {datum}; + + OnHealthChanged(data); + } + + return true; + } + + public void Heal() + { + var data = new List(); + + foreach (var type in SupportedTypes) + { + var delta = -GetDamageValue(type); + var datum = new HealthChangeData(type, 0, delta); + + data.Add(datum); + SetDamageValue(type, 0, true); + } + + OnHealthChanged(data); + } + } +} diff --git a/Content.Shared/Damage/DamageContainer/DamageContainerPrototype.cs b/Content.Shared/Damage/DamageContainer/DamageContainerPrototype.cs new file mode 100644 index 0000000000..cde45fb999 --- /dev/null +++ b/Content.Shared/Damage/DamageContainer/DamageContainerPrototype.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; +using YamlDotNet.RepresentationModel; + +namespace Content.Shared.Damage.DamageContainer +{ + /// + /// Prototype for the DamageContainer class. + /// + [Prototype("damageContainer")] + [NetSerializable] + [Serializable] + public class DamageContainerPrototype : IPrototype, IIndexedPrototype + { + private List _activeDamageClasses; + private string _id; + + [ViewVariables] public List ActiveDamageClasses => _activeDamageClasses; + + [ViewVariables] public string ID => _id; + + public virtual void LoadFrom(YamlMappingNode mapping) + { + var serializer = YamlObjectSerializer.NewReader(mapping); + serializer.DataField(ref _id, "id", string.Empty); + serializer.DataField(ref _activeDamageClasses, "activeDamageClasses", new List()); + } + } +} diff --git a/Content.Shared/Damage/DamageType.cs b/Content.Shared/Damage/DamageType.cs new file mode 100644 index 0000000000..96cfb2eecb --- /dev/null +++ b/Content.Shared/Damage/DamageType.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Linq; +using Robust.Shared.Serialization; + +namespace Content.Shared.Damage +{ + [Serializable, NetSerializable] + public enum DamageType + { + Blunt, + Piercing, + Heat, + Disintegration, + Cellular, + DNA, + Asphyxiation + } + + public static class DamageTypeExtensions + { + // TODO: Automatically generate this + private static readonly ImmutableDictionary TypeToClass = + new Dictionary + { + {DamageType.Blunt, DamageClass.Brute}, + {DamageType.Piercing, DamageClass.Brute}, + {DamageType.Heat, DamageClass.Burn}, + {DamageType.Disintegration, DamageClass.Burn}, + {DamageType.Cellular, DamageClass.Toxin}, + {DamageType.DNA, DamageClass.Toxin}, + {DamageType.Asphyxiation, DamageClass.Airloss} + }.ToImmutableDictionary(); + + public static DamageClass ToClass(this DamageType type) + { + return TypeToClass[type]; + } + + public static Dictionary ToDictionary() + { + return Enum.GetValues(typeof(DamageType)) + .Cast() + .ToDictionary(type => type, type => 0); + } + + public static Dictionary ToClassDictionary(IReadOnlyDictionary types) + { + var classes = DamageClassExtensions.ToDictionary(); + + foreach (var @class in classes.Keys.ToList()) + foreach (var type in @class.ToTypes()) + { + if (!types.TryGetValue(type, out var damage)) + { + continue; + } + + classes[@class] += damage; + } + + return classes; + } + } +} diff --git a/Content.Shared/Damage/ResistanceSet/ResistanceSet.cs b/Content.Shared/Damage/ResistanceSet/ResistanceSet.cs new file mode 100644 index 0000000000..8aa29edf3d --- /dev/null +++ b/Content.Shared/Damage/ResistanceSet/ResistanceSet.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; + +namespace Content.Shared.Damage.ResistanceSet +{ + /// + /// Set of resistances used by damageable objects. Each DamageType has a multiplier and flat damage reduction value. + /// + [NetSerializable] + [Serializable] + public class ResistanceSet + { + [ViewVariables] + private Dictionary _resistances = + new Dictionary(); + + public ResistanceSet() + { + foreach (var damageType in (DamageType[]) Enum.GetValues(typeof(DamageType))) + { + _resistances.Add(damageType, new ResistanceSetSettings(1f, 0)); + } + } + + public ResistanceSet(ResistanceSetPrototype data) + { + _resistances = data.Resistances; + } + + /// + /// Adjusts input damage with the resistance set values. Only applies reduction if the amount is damage (positive), not + /// healing (negative). + /// + /// Type of damage. + /// Incoming amount of damage. + public int CalculateDamage(DamageType damageType, int amount) + { + if (amount > 0) //Only apply reduction if it's healing, not damage. + { + amount -= _resistances[damageType].FlatReduction; + + if (amount <= 0) + { + return 0; + } + } + + amount = (int) Math.Ceiling(amount * _resistances[damageType].Coefficient); + + return amount; + } + } + + /// + /// Settings for a specific damage type in a resistance set. Flat reduction is applied before the coefficient. + /// + [NetSerializable] + [Serializable] + public struct ResistanceSetSettings + { + [ViewVariables] public float Coefficient { get; private set; } + + [ViewVariables] public int FlatReduction { get; private set; } + + public ResistanceSetSettings(float coefficient, int flatReduction) + { + Coefficient = coefficient; + FlatReduction = flatReduction; + } + } +} diff --git a/Content.Shared/Damage/ResistanceSet/ResistanceSetPrototype.cs b/Content.Shared/Damage/ResistanceSet/ResistanceSetPrototype.cs new file mode 100644 index 0000000000..27ae9a0db7 --- /dev/null +++ b/Content.Shared/Damage/ResistanceSet/ResistanceSetPrototype.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; +using YamlDotNet.RepresentationModel; + +namespace Content.Shared.Damage.ResistanceSet +{ + /// + /// Prototype for the BodyPart class. + /// + [Prototype("resistanceSet")] + [NetSerializable] + [Serializable] + public class ResistanceSetPrototype : IPrototype, IIndexedPrototype + { + private Dictionary _coefficients; + private Dictionary _flatReductions; + private string _id; + + [ViewVariables] public Dictionary Coefficients => _coefficients; + + [ViewVariables] public Dictionary FlatReductions => _flatReductions; + + [ViewVariables] public Dictionary Resistances { get; private set; } + + [ViewVariables] public string ID => _id; + + public virtual void LoadFrom(YamlMappingNode mapping) + { + var serializer = YamlObjectSerializer.NewReader(mapping); + + serializer.DataField(ref _id, "id", string.Empty); + serializer.DataField(ref _coefficients, "coefficients", null); + serializer.DataField(ref _flatReductions, "flatReductions", null); + + Resistances = new Dictionary(); + foreach (var damageType in (DamageType[]) Enum.GetValues(typeof(DamageType))) + { + Resistances.Add(damageType, + new ResistanceSetSettings(_coefficients[damageType], _flatReductions[damageType])); + } + } + } +} diff --git a/Content.Shared/GameObjects/Components/Body/IBodyManagerComponent.cs b/Content.Shared/GameObjects/Components/Body/IBodyManagerComponent.cs new file mode 100644 index 0000000000..bc3ee631f2 --- /dev/null +++ b/Content.Shared/GameObjects/Components/Body/IBodyManagerComponent.cs @@ -0,0 +1,9 @@ +using Content.Shared.GameObjects.Components.Damage; +using Robust.Shared.Interfaces.GameObjects; + +namespace Content.Shared.GameObjects.Components.Body +{ + public interface IBodyManagerComponent : IDamageableComponent + { + } +} diff --git a/Content.Shared/GameObjects/Components/Body/SharedBodyManagerComponent.cs b/Content.Shared/GameObjects/Components/Body/SharedBodyManagerComponent.cs new file mode 100644 index 0000000000..dcc3ae7dc5 --- /dev/null +++ b/Content.Shared/GameObjects/Components/Body/SharedBodyManagerComponent.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; +using Content.Shared.GameObjects.Components.Damage; +using Robust.Shared.GameObjects; +using Robust.Shared.Serialization; + +namespace Content.Shared.GameObjects.Components.Body +{ + public abstract class SharedBodyManagerComponent : DamageableComponent, IBodyManagerComponent + { + public override string Name => "BodyManager"; + + public override uint? NetID => ContentNetIDs.BODY_MANAGER; + + public override List SupportedDamageStates => new List {DamageState.Alive, DamageState.Critical, DamageState.Dead}; + + public override DamageState CurrentDamageState => + CurrentDamageState = TotalDamage > 200 + ? DamageState.Dead + : TotalDamage > 100 + ? DamageState.Critical + : DamageState.Alive; + } + + [Serializable, NetSerializable] + public sealed class BodyPartAddedMessage : ComponentMessage + { + public readonly string RSIPath; + public readonly string RSIState; + public readonly Enum RSIMap; + + public BodyPartAddedMessage(string rsiPath, string rsiState, Enum rsiMap) + { + Directed = true; + RSIPath = rsiPath; + RSIState = rsiState; + RSIMap = rsiMap; + } + } + + [Serializable, NetSerializable] + public sealed class BodyPartRemovedMessage : ComponentMessage + { + public readonly Enum RSIMap; + public readonly EntityUid? Dropped; + + public BodyPartRemovedMessage(Enum rsiMap, EntityUid? dropped = null) + { + Directed = true; + RSIMap = rsiMap; + Dropped = dropped; + } + } + + [Serializable, NetSerializable] + public sealed class MechanismSpriteAddedMessage : ComponentMessage + { + public readonly Enum RSIMap; + + public MechanismSpriteAddedMessage(Enum rsiMap) + { + Directed = true; + RSIMap = rsiMap; + } + } + + [Serializable, NetSerializable] + public sealed class MechanismSpriteRemovedMessage : ComponentMessage + { + public readonly Enum RSIMap; + + public MechanismSpriteRemovedMessage(Enum rsiMap) + { + Directed = true; + RSIMap = rsiMap; + } + } + + /// + /// Used to determine whether a BodyPart can connect to another BodyPart. + /// + [Serializable, NetSerializable] + public enum BodyPartCompatibility + { + Universal = 0, + Biological, + Mechanical + } + + /// + /// Each BodyPart has a BodyPartType used to determine a variety of things. + /// For instance, what slots it can fit into. + /// + [Serializable, NetSerializable] + public enum BodyPartType + { + Other = 0, + Torso, + Head, + Arm, + Hand, + Leg, + Foot + } + + /// + /// Defines a surgery operation that can be performed. + /// + [Serializable, NetSerializable] + public enum SurgeryType + { + None = 0, + Incision, + Retraction, + Cauterization, + VesselCompression, + Drilling, + Amputation + } +} diff --git a/Content.Shared/GameObjects/Components/Damage/DamageState.cs b/Content.Shared/GameObjects/Components/Damage/DamageState.cs new file mode 100644 index 0000000000..843c97be57 --- /dev/null +++ b/Content.Shared/GameObjects/Components/Damage/DamageState.cs @@ -0,0 +1,20 @@ +using Robust.Shared.Interfaces.GameObjects; + +namespace Content.Shared.GameObjects.Components.Damage +{ + // TODO: Fix summary + /// + /// Defines what state an with a + /// is in. + /// Not all states must be supported - for instance, the + /// only supports + /// and , + /// as inanimate objects don't go into crit. + /// + public enum DamageState + { + Alive, + Critical, + Dead + } +} diff --git a/Content.Shared/GameObjects/Components/Damage/DamageableComponent.cs b/Content.Shared/GameObjects/Components/Damage/DamageableComponent.cs index 13cf0b0e93..614bf90abd 100644 --- a/Content.Shared/GameObjects/Components/Damage/DamageableComponent.cs +++ b/Content.Shared/GameObjects/Components/Damage/DamageableComponent.cs @@ -1,40 +1,227 @@ -using System; +#nullable enable +using System; using System.Collections.Generic; +using Content.Shared.Damage; +using Content.Shared.Damage.DamageContainer; +using Content.Shared.Damage.ResistanceSet; using Robust.Shared.GameObjects; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; namespace Content.Shared.GameObjects.Components.Damage { - public abstract class SharedDamageableComponent : Component + /// + /// Component that allows attached entities to take damage. + /// This basic version never dies (thus can take an indefinite amount of damage). + /// + [ComponentReference(typeof(IDamageableComponent))] + public class DamageableComponent : Component, IDamageableComponent { +#pragma warning disable 649 + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; +#pragma warning restore 649 + public override string Name => "Damageable"; - public sealed override uint? NetID => ContentNetIDs.DAMAGEABLE; - } - // The IDs of the items get synced over the network. - [Serializable, NetSerializable] - public class DamageComponentState : ComponentState - { - public Dictionary CurrentDamage = new Dictionary(); + public event Action HealthChangedEvent = default!; - public DamageComponentState(Dictionary damage) : base(ContentNetIDs.DAMAGEABLE) + [ViewVariables] private ResistanceSet Resistance { get; set; } = default!; + + [ViewVariables] private DamageContainer Damage { get; set; } = default!; + + public virtual List SupportedDamageStates => new List {DamageState.Alive}; + + public virtual DamageState CurrentDamageState { get; protected set; } = DamageState.Alive; + + [ViewVariables] public int TotalDamage => Damage.TotalDamage; + + public IReadOnlyDictionary DamageClasses => Damage.DamageClasses; + + public IReadOnlyDictionary DamageTypes => Damage.DamageTypes; + + public override void ExposeData(ObjectSerializer serializer) { - CurrentDamage = damage; + base.ExposeData(serializer); + + if (serializer.Reading) + { + // Doesn't write to file, TODO? + // Yes, TODO + var containerId = "biologicalDamageContainer"; + var resistanceId = "defaultResistances"; + + serializer.DataField(ref containerId, "damageContainer", "biologicalDamageContainer"); + serializer.DataField(ref resistanceId, "resistances", "defaultResistances"); + + if (!_prototypeManager.TryIndex(containerId!, out DamageContainerPrototype damage)) + { + throw new InvalidOperationException( + $"No {nameof(DamageContainerPrototype)} found with name {containerId}"); + } + + Damage = new DamageContainer(OnHealthChanged, damage); + + if (!_prototypeManager.TryIndex(resistanceId!, out ResistanceSetPrototype resistance)) + { + throw new InvalidOperationException( + $"No {nameof(ResistanceSetPrototype)} found with name {resistanceId}"); + } + + Resistance = new ResistanceSet(resistance); + } + } + + public bool TryGetDamage(DamageType type, out int damage) + { + return Damage.TryGetDamageValue(type, out damage); + } + + public bool ChangeDamage(DamageType type, int amount, bool ignoreResistances, + IEntity? source = null, + HealthChangeParams? extraParams = null) + { + if (Damage.SupportsDamageType(type)) + { + var finalDamage = amount; + if (!ignoreResistances) + { + finalDamage = Resistance.CalculateDamage(type, amount); + } + + Damage.ChangeDamageValue(type, finalDamage); + + return true; + } + + return false; + } + + public bool ChangeDamage(DamageClass @class, int amount, bool ignoreResistances, + IEntity? source = null, + HealthChangeParams? extraParams = null) + { + if (Damage.SupportsDamageClass(@class)) + { + var types = @class.ToTypes(); + + if (amount < 0) + { + // Changing multiple types is a bit more complicated. Might be a better way (formula?) to do this, + // but essentially just loops between each damage category until all healing is used up. + var healingLeft = amount; + var healThisCycle = 1; + + // While we have healing left... + while (healingLeft > 0 && healThisCycle != 0) + { + // Infinite loop fallback, if no healing was done in a cycle + // then exit + healThisCycle = 0; + + int healPerType; + if (healingLeft > -types.Count && healingLeft < 0) + { + // Say we were to distribute 2 healing between 3 + // this will distribute 1 to each (and stop after 2 are given) + healPerType = -1; + } + else + { + // Say we were to distribute 62 healing between 3 + // this will distribute 20 to each, leaving 2 for next loop + healPerType = healingLeft / types.Count; + } + + foreach (var type in types) + { + var healAmount = + Math.Max(Math.Max(healPerType, -Damage.GetDamageValue(type)), + healingLeft); + + Damage.ChangeDamageValue(type, healAmount); + healThisCycle += healAmount; + healingLeft -= healAmount; + } + } + + return true; + } + + var damageLeft = amount; + + while (damageLeft > 0) + { + int damagePerType; + + if (damageLeft < types.Count && damageLeft > 0) + { + damagePerType = 1; + } + else + { + damagePerType = damageLeft / types.Count; + } + + foreach (var type in types) + { + var damageAmount = Math.Min(damagePerType, damageLeft); + Damage.ChangeDamageValue(type, damageAmount); + damageLeft -= damageAmount; + } + } + + return true; + } + + return false; + } + + public bool SetDamage(DamageType type, int newValue, IEntity? source = null, + HealthChangeParams? extraParams = null) + { + if (Damage.SupportsDamageType(type)) + { + Damage.SetDamageValue(type, newValue); + + return true; + } + + return false; + } + + public void Heal() + { + Damage.Heal(); + } + + public void ForceHealthChangedEvent() + { + var data = new List(); + + foreach (var type in Damage.SupportedTypes) + { + var damage = Damage.GetDamageValue(type); + var datum = new HealthChangeData(type, damage, 0); + data.Add(datum); + } + + OnHealthChanged(data); + } + + private void OnHealthChanged(List changes) + { + var args = new HealthChangedEventArgs(this, changes); + OnHealthChanged(args); + } + + protected virtual void OnHealthChanged(HealthChangedEventArgs e) + { + Owner.EntityManager.EventBus.RaiseEvent(EventSource.Local, e); + HealthChangedEvent?.Invoke(e); + Dirty(); } } - - /// - /// Damage types used in-game. - /// Total should never be used directly - it's a derived value. - /// - public enum DamageType - { - Total, - Brute, - Heat, - Cold, - Acid, - Toxic, - Electric - } } diff --git a/Content.Shared/GameObjects/Components/Damage/IDamageableComponent.cs b/Content.Shared/GameObjects/Components/Damage/IDamageableComponent.cs new file mode 100644 index 0000000000..f979d326c6 --- /dev/null +++ b/Content.Shared/GameObjects/Components/Damage/IDamageableComponent.cs @@ -0,0 +1,223 @@ +#nullable enable +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using Content.Shared.Damage; +using Content.Shared.GameObjects.Components.Body; +using Content.Shared.GameObjects.EntitySystems; +using Robust.Shared.Interfaces.GameObjects; + +namespace Content.Shared.GameObjects.Components.Damage +{ + public interface IDamageableComponent : IComponent, IExAct + { + /// + /// Called when the entity's values change. + /// Of note is that a "deal 0 damage" call will still trigger this event + /// (including both damage negated by resistance or simply inputting 0 as + /// the amount of damage to deal). + /// + event Action HealthChangedEvent; + + /// + /// List of all DamageStates that + /// can be. + /// + List SupportedDamageStates { get; } + + /// + /// The currently representing this component. + /// + DamageState CurrentDamageState { get; } + + /// + /// Sum of all damages taken. + /// + int TotalDamage { get; } + + /// + /// The amount of damage mapped by . + /// + IReadOnlyDictionary DamageClasses { get; } + + /// + /// The amount of damage mapped by . + /// + IReadOnlyDictionary DamageTypes { get; } + + /// + /// Gets the amount of damage of a type. + /// + /// The type to get the damage of. + /// The amount of damage of that type. + /// + /// True if the given is supported, false otherwise. + /// + bool TryGetDamage(DamageType type, [NotNullWhen(true)] out int damage); + + /// + /// Changes the specified , applying + /// resistance values only if it is damage. + /// + /// Type of damage being changed. + /// + /// Amount of damage being received (positive for damage, negative for heals). + /// + /// + /// Whether or not to ignore resistances. + /// Healing always ignores resistances, regardless of this input. + /// + /// + /// The entity that dealt or healed the damage, if any. + /// + /// + /// Extra parameters that some components may require, such as a specific limb to target. + /// + /// + /// False if the given type is not supported or improper + /// were provided; true otherwise. + /// + bool ChangeDamage(DamageType type, int amount, bool ignoreResistances, IEntity? source = null, + HealthChangeParams? extraParams = null); + + /// + /// Changes the specified , applying + /// resistance values only if it is damage. + /// Spreads amount evenly between the s + /// represented by that class. + /// + /// Class of damage being changed. + /// + /// Amount of damage being received (positive for damage, negative for heals). + /// + /// + /// Whether to ignore resistances. + /// Healing always ignores resistances, regardless of this input. + /// + /// Entity that dealt or healed the damage, if any. + /// + /// Extra parameters that some components may require, + /// such as a specific limb to target. + /// + /// + /// Returns false if the given class is not supported or improper + /// were provided; true otherwise. + /// + bool ChangeDamage(DamageClass @class, int amount, bool ignoreResistances, IEntity? source = null, + HealthChangeParams? extraParams = null); + + /// + /// Forcefully sets the specified to the given + /// value, ignoring resistance values. + /// + /// Type of damage being changed. + /// New damage value to be set. + /// Entity that set the new damage value. + /// + /// Extra parameters that some components may require, + /// such as a specific limb to target. + /// + /// + /// Returns false if the given type is not supported or improper + /// were provided; true otherwise. + /// + bool SetDamage(DamageType type, int newValue, IEntity? source = null, HealthChangeParams? extraParams = null); + + /// + /// Sets all damage values to zero. + /// + void Heal(); + + /// + /// Invokes the HealthChangedEvent with the current values of health. + /// + void ForceHealthChangedEvent(); + + void IExAct.OnExplosion(ExplosionEventArgs eventArgs) + { + var damage = eventArgs.Severity switch + { + ExplosionSeverity.Light => 20, + ExplosionSeverity.Heavy => 60, + ExplosionSeverity.Destruction => 250, + _ => throw new ArgumentOutOfRangeException() + }; + + ChangeDamage(DamageType.Piercing, damage, false, null); + ChangeDamage(DamageType.Heat, damage, false, null); + } + } + + /// + /// Data class with information on how to damage a + /// . + /// While not necessary to damage for all instances, classes such as + /// may require it for extra data + /// (such as selecting which limb to target). + /// + public class HealthChangeParams : EventArgs + { + } + + /// + /// Data class with information on how the + /// values of a have changed. + /// + public class HealthChangedEventArgs : EventArgs + { + /// + /// Reference to the that invoked the event. + /// + public readonly IDamageableComponent Damageable; + + /// + /// List containing data on each that was changed. + /// + public readonly List Data; + + public HealthChangedEventArgs(IDamageableComponent damageable, List data) + { + Damageable = damageable; + Data = data; + } + + public HealthChangedEventArgs(IDamageableComponent damageable, DamageType type, int newValue, int delta) + { + Damageable = damageable; + + var datum = new HealthChangeData(type, newValue, delta); + var data = new List {datum}; + + Data = data; + } + } + + /// + /// Data class with information on how the value of a + /// single has changed. + /// + public struct HealthChangeData + { + /// + /// Type of damage that changed. + /// + public DamageType Type; + + /// + /// The new current value for that damage. + /// + public int NewValue; + + /// + /// How much the health value changed from its last value (negative is heals, positive is damage). + /// + public int Delta; + + public HealthChangeData(DamageType type, int newValue, int delta) + { + Type = type; + NewValue = newValue; + Delta = delta; + } + } +} diff --git a/Content.Shared/GameObjects/Components/Damage/IOnHealthChangedBehavior.cs b/Content.Shared/GameObjects/Components/Damage/IOnHealthChangedBehavior.cs new file mode 100644 index 0000000000..64d31971c9 --- /dev/null +++ b/Content.Shared/GameObjects/Components/Damage/IOnHealthChangedBehavior.cs @@ -0,0 +1,22 @@ +using Robust.Shared.Interfaces.GameObjects; + +namespace Content.Shared.GameObjects.Components.Damage +{ + // TODO + /// + /// Component interface that gets triggered after the values of a + /// on the same change. + /// + public interface IOnHealthChangedBehavior + { + /// + /// Called when the entity's + /// is healed or hurt. + /// Of note is that a "deal 0 damage" call will still trigger + /// this function (including both damage negated by resistance or + /// simply inputting 0 as the amount of damage to deal). + /// + /// Details of how the health changed. + public void OnHealthChanged(HealthChangedEventArgs e); + } +} diff --git a/Content.Shared/GameObjects/Components/Medical/SharedMedicalScannerComponent.cs b/Content.Shared/GameObjects/Components/Medical/SharedMedicalScannerComponent.cs index ee0a4f029a..8573a50c63 100644 --- a/Content.Shared/GameObjects/Components/Medical/SharedMedicalScannerComponent.cs +++ b/Content.Shared/GameObjects/Components/Medical/SharedMedicalScannerComponent.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Content.Shared.Damage; using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Components.UserInterface; using Robust.Shared.Serialization; @@ -13,18 +14,23 @@ namespace Content.Shared.GameObjects.Components.Medical [Serializable, NetSerializable] public class MedicalScannerBoundUserInterfaceState : BoundUserInterfaceState { - public readonly int CurrentHealth; - public readonly int MaxHealth; - public readonly Dictionary DamageDictionary; + public readonly EntityUid? Entity; + public readonly Dictionary DamageClasses; + public readonly Dictionary DamageTypes; public MedicalScannerBoundUserInterfaceState( - int currentHealth, - int maxHealth, - Dictionary damageDictionary) + EntityUid? entity, + Dictionary damageClasses, + Dictionary damageTypes) { - CurrentHealth = currentHealth; - MaxHealth = maxHealth; - DamageDictionary = damageDictionary; + Entity = entity; + DamageClasses = damageClasses; + DamageTypes = damageTypes; + } + + public bool HasDamage() + { + return DamageClasses.Count > 0 || DamageTypes.Count > 0; } } diff --git a/Content.Shared/GameObjects/Components/Mobs/SharedSpeciesComponent.cs b/Content.Shared/GameObjects/Components/Mobs/SharedSpeciesComponent.cs deleted file mode 100644 index 0f23bbda31..0000000000 --- a/Content.Shared/GameObjects/Components/Mobs/SharedSpeciesComponent.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System; -using Robust.Shared.GameObjects; -using Robust.Shared.Serialization; - -namespace Content.Shared.GameObjects.Components.Mobs -{ - public abstract class SharedSpeciesComponent : Component - { - public sealed override string Name => "Species"; - - [Serializable, NetSerializable] - public enum MobVisuals - { - RotationState - } - - [Serializable, NetSerializable] - public enum MobState - { - /// - /// Mob is standing up - /// - Standing, - - /// - /// Mob is laying down - /// - Down, - } - } -} diff --git a/Content.Shared/GameObjects/Components/Movement/MovementSpeedModifierComponent.cs b/Content.Shared/GameObjects/Components/Movement/MovementSpeedModifierComponent.cs index cdc70f8435..dd9a1e391a 100644 --- a/Content.Shared/GameObjects/Components/Movement/MovementSpeedModifierComponent.cs +++ b/Content.Shared/GameObjects/Components/Movement/MovementSpeedModifierComponent.cs @@ -1,4 +1,4 @@ -using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects; using Robust.Shared.Serialization; using Robust.Shared.ViewVariables; @@ -10,6 +10,7 @@ namespace Content.Shared.GameObjects.Components.Movement public const float DefaultBaseWalkSpeed = 4.0f; public const float DefaultBaseSprintSpeed = 7.0f; + public override string Name => "MovementSpeedModifier"; private float _cachedWalkSpeedModifier = 1.0f; diff --git a/Content.Shared/GameObjects/Components/Movement/SharedPlayerInputMoverComponent.cs b/Content.Shared/GameObjects/Components/Movement/SharedPlayerInputMoverComponent.cs index 9c74d666bc..6d47299c4d 100644 --- a/Content.Shared/GameObjects/Components/Movement/SharedPlayerInputMoverComponent.cs +++ b/Content.Shared/GameObjects/Components/Movement/SharedPlayerInputMoverComponent.cs @@ -1,6 +1,8 @@ #nullable enable using System; +using Content.Shared.GameObjects.Components.Body; using Content.Shared.GameObjects.Components.Mobs; +using Content.Shared.GameObjects.Components.Rotation; using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Components; using Robust.Shared.Interfaces.Configuration; @@ -268,7 +270,7 @@ namespace Content.Shared.GameObjects.Components.Movement bool ICollideSpecial.PreventCollide(IPhysBody collidedWith) { // Don't collide with other mobs - return collidedWith.Entity.HasComponent(); + return collidedWith.Entity.HasComponent(); } [Serializable, NetSerializable] diff --git a/Content.Shared/GameObjects/Components/Rotation/RotationComponent.cs b/Content.Shared/GameObjects/Components/Rotation/RotationComponent.cs new file mode 100644 index 0000000000..150ed62a30 --- /dev/null +++ b/Content.Shared/GameObjects/Components/Rotation/RotationComponent.cs @@ -0,0 +1,26 @@ +using System; +using Robust.Shared.GameObjects; +using Robust.Shared.Serialization; + +namespace Content.Shared.GameObjects.Components.Rotation +{ + [Serializable, NetSerializable] + public enum RotationVisuals + { + RotationState + } + + [Serializable, NetSerializable] + public enum RotationState + { + /// + /// Standing up + /// + Vertical, + + /// + /// Laying down + /// + Horizontal, + } +} diff --git a/Content.Shared/GameObjects/ContentNetIDs.cs b/Content.Shared/GameObjects/ContentNetIDs.cs index 9ecd4a918b..337a543627 100644 --- a/Content.Shared/GameObjects/ContentNetIDs.cs +++ b/Content.Shared/GameObjects/ContentNetIDs.cs @@ -3,7 +3,7 @@ // Starting from 1000 to avoid crossover with engine. public static class ContentNetIDs { - public const uint DAMAGEABLE = 1000; + // 1000 public const uint DESTRUCTIBLE = 1001; public const uint MAGAZINE_BARREL = 1002; public const uint HANDS = 1003; @@ -64,6 +64,7 @@ public const uint GAS_ANALYZER = 1057; public const uint DO_AFTER = 1058; public const uint RADIATION_PULSE = 1059; + public const uint BODY_MANAGER = 1060; // Net IDs for integration tests. public const uint PREDICTION_TEST = 10001; diff --git a/Content.Server/GameObjects/EntitySystems/ActSystem.cs b/Content.Shared/GameObjects/EntitySystems/ActSystem.cs similarity index 98% rename from Content.Server/GameObjects/EntitySystems/ActSystem.cs rename to Content.Shared/GameObjects/EntitySystems/ActSystem.cs index 56be8389ea..a5e6aea7e7 100644 --- a/Content.Server/GameObjects/EntitySystems/ActSystem.cs +++ b/Content.Shared/GameObjects/EntitySystems/ActSystem.cs @@ -5,7 +5,7 @@ using Robust.Shared.GameObjects.Systems; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Map; -namespace Content.Server.GameObjects.EntitySystems +namespace Content.Shared.GameObjects.EntitySystems { /// private const int SpeechBubbleCap = 4; + /// + /// The max amount of characters an entity can send in one message + /// + private int _maxMessageLength = 1000; + private const char ConCmdSlash = '/'; private const char OOCAlias = '['; private const char MeAlias = '@'; @@ -89,11 +98,15 @@ namespace Content.Client.Chat public void Initialize() { _netManager.RegisterNetMessage(MsgChatMessage.NAME, _onChatMessage); + _netManager.RegisterNetMessage(ChatMaxMsgLengthMessage.NAME, _onMaxLengthReceived); _speechBubbleRoot = new LayoutContainer(); LayoutContainer.SetAnchorPreset(_speechBubbleRoot, LayoutContainer.LayoutPreset.Wide); _userInterfaceManager.StateRoot.AddChild(_speechBubbleRoot); _speechBubbleRoot.SetPositionFirst(); + + // When connexion is achieved, request the max chat message length + _netManager.Connected += new EventHandler(RequestMaxLength); } public void FrameUpdate(FrameEventArgs delta) @@ -213,6 +226,15 @@ namespace Content.Client.Chat if (string.IsNullOrWhiteSpace(text)) return; + // Check if message is longer than the character limit + if (text.Length > _maxMessageLength) + { + string locWarning = Loc.GetString("Your message exceeds {0} character limit", _maxMessageLength); + _currentChatBox?.AddLine(locWarning, ChatChannel.Server, Color.Orange); + _currentChatBox.ClearOnEnter = false; // The text shouldn't be cleared if it hasn't been sent + return; + } + switch (text[0]) { case ConCmdSlash: @@ -345,6 +367,17 @@ namespace Content.Client.Chat } } + private void _onMaxLengthReceived(ChatMaxMsgLengthMessage msg) + { + _maxMessageLength = msg.MaxMessageLength; + } + + private void RequestMaxLength(object sender, NetChannelArgs args) + { + ChatMaxMsgLengthMessage msg = _netManager.CreateNetMessage(); + _netManager.ClientSendMessage(msg); + } + private void AddSpeechBubble(MsgChatMessage msg, SpeechBubble.SpeechType speechType) { if (!_entityManager.TryGetEntity(msg.SenderEntity, out var entity)) diff --git a/Content.Server/Chat/ChatManager.cs b/Content.Server/Chat/ChatManager.cs index 1a035fbb5c..a6e0296b04 100644 --- a/Content.Server/Chat/ChatManager.cs +++ b/Content.Server/Chat/ChatManager.cs @@ -5,7 +5,9 @@ using Content.Server.Interfaces; using Content.Server.Interfaces.Chat; using Content.Shared.Chat; using Content.Shared.GameObjects.EntitySystems; +using NFluidsynth; using Robust.Server.Console; +using Robust.Server.Interfaces.GameObjects; using Robust.Server.Interfaces.Player; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.Network; @@ -19,8 +21,18 @@ namespace Content.Server.Chat /// /// This interface gives components behavior on getting destoyed. @@ -100,6 +100,7 @@ namespace Content.Server.GameObjects.EntitySystems } } } + public enum ExplosionSeverity { Light, diff --git a/Content.Shared/GameObjects/EntitySystems/ActionBlockerSystem.cs b/Content.Shared/GameObjects/EntitySystems/ActionBlockerSystem.cs index b5e1b50281..c06963d53f 100644 --- a/Content.Shared/GameObjects/EntitySystems/ActionBlockerSystem.cs +++ b/Content.Shared/GameObjects/EntitySystems/ActionBlockerSystem.cs @@ -26,8 +26,11 @@ namespace Content.Shared.GameObjects.EntitySystems bool CanEmote() => true; bool CanAttack() => true; + bool CanEquip() => true; + bool CanUnequip() => true; + bool CanChangeDirection() => true; } diff --git a/Content.Shared/Health/BodySystem/BodyPart/BodyPartProperties/ArmLength.cs b/Content.Shared/Health/BodySystem/BodyPart/BodyPartProperties/ArmLength.cs deleted file mode 100644 index 617bd45050..0000000000 --- a/Content.Shared/Health/BodySystem/BodyPart/BodyPartProperties/ArmLength.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using Robust.Shared.Interfaces.Serialization; -using Robust.Shared.Serialization; - -namespace Content.Shared.Health.BodySystem.BodyPart.BodyPartProperties { - - [NetSerializable, Serializable] - class ArmLength : IExposeData { - private float _length; - - public void ExposeData(ObjectSerializer serializer){ - serializer.DataField(ref _length, "length", 2f); - } - } -} diff --git a/Content.Shared/Health/BodySystem/BodyPart/BodyPartPrototype.cs b/Content.Shared/Health/BodySystem/BodyPart/BodyPartPrototype.cs deleted file mode 100644 index d400501f6d..0000000000 --- a/Content.Shared/Health/BodySystem/BodyPart/BodyPartPrototype.cs +++ /dev/null @@ -1,94 +0,0 @@ -using System; -using System.Collections.Generic; -using Robust.Shared.Interfaces.Serialization; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization; -using Robust.Shared.ViewVariables; -using YamlDotNet.RepresentationModel; - -namespace Content.Shared.Health.BodySystem.BodyPart { - - - /// - /// Prototype for the BodyPart class. - /// - [Prototype("bodyPart")] - [NetSerializable, Serializable] - public class BodyPartPrototype : IPrototype, IIndexedPrototype { - private string _id; - private string _name; - private string _plural; - private string _rsiPath; - private string _rsiState; - private BodyPartType _partType; - private int _durability; - private int _destroyThreshold; - private float _resistance; - private int _size; - private BodyPartCompatibility _compatibility; - private string _surgeryDataName; - private List _properties; - private List _mechanisms; - - [ViewVariables] - public string ID => _id; - - [ViewVariables] - public string Name => _name; - - [ViewVariables] - public string Plural => _plural; - - [ViewVariables] - public string RSIPath => _rsiPath; - - [ViewVariables] - public string RSIState => _rsiState; - - [ViewVariables] - public BodyPartType PartType => _partType; - - [ViewVariables] - public int Durability => _durability; - - [ViewVariables] - public int DestroyThreshold => _destroyThreshold; - - [ViewVariables] - public float Resistance => _resistance; - - [ViewVariables] - public int Size => _size; - - [ViewVariables] - public BodyPartCompatibility Compatibility => _compatibility; - - [ViewVariables] - public string SurgeryDataName => _surgeryDataName; - - [ViewVariables] - public List Properties => _properties; - - [ViewVariables] - public List Mechanisms => _mechanisms; - - public virtual void LoadFrom(YamlMappingNode mapping){ - var serializer = YamlObjectSerializer.NewReader(mapping); - - serializer.DataField(ref _name, "name", string.Empty); - serializer.DataField(ref _id, "id", string.Empty); - serializer.DataField(ref _plural, "plural", string.Empty); - serializer.DataField(ref _rsiPath, "rsiPath", string.Empty); - serializer.DataField(ref _rsiState, "rsiState", string.Empty); - serializer.DataField(ref _partType, "partType", BodyPartType.Other); - serializer.DataField(ref _surgeryDataName, "surgeryDataType", "BiologicalSurgeryData"); - serializer.DataField(ref _durability, "durability", 50); - serializer.DataField(ref _destroyThreshold, "destroyThreshold", -50); - serializer.DataField(ref _resistance, "resistance", 0f); - serializer.DataField(ref _size, "size", 0); - serializer.DataField(ref _compatibility, "compatibility", BodyPartCompatibility.Universal); - serializer.DataField(ref _properties, "properties", new List()); - serializer.DataField(ref _mechanisms, "mechanisms", new List()); - } - } -} diff --git a/Content.Shared/Health/BodySystem/BodyTemplate/BodyTemplatePrototype.cs b/Content.Shared/Health/BodySystem/BodyTemplate/BodyTemplatePrototype.cs deleted file mode 100644 index 50ac37c065..0000000000 --- a/Content.Shared/Health/BodySystem/BodyTemplate/BodyTemplatePrototype.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.Collections.Generic; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization; -using Robust.Shared.ViewVariables; -using YamlDotNet.RepresentationModel; - -namespace Content.Shared.Health.BodySystem.BodyTemplate { - - /// - /// Prototype for the BodyTemplate class. - /// - [Prototype("bodyTemplate")] - [NetSerializable, Serializable] - public class BodyTemplatePrototype : IPrototype, IIndexedPrototype { - private string _id; - private string _name; - private string _centerSlot; - private Dictionary _slots; - private Dictionary> _connections; - - [ViewVariables] - public string ID => _id; - - [ViewVariables] - public string Name => _name; - - [ViewVariables] - public string CenterSlot => _centerSlot; - - [ViewVariables] - public Dictionary Slots => _slots; - - [ViewVariables] - public Dictionary> Connections => _connections; - - public virtual void LoadFrom(YamlMappingNode mapping){ - var serializer = YamlObjectSerializer.NewReader(mapping); - serializer.DataField(ref _name, "name", string.Empty); - serializer.DataField(ref _id, "id", string.Empty); - serializer.DataField(ref _centerSlot, "centerSlot", string.Empty); - serializer.DataField(ref _slots, "slots", new Dictionary()); - serializer.DataField(ref _connections, "connections", new Dictionary>()); - - - //Our prototypes don't force the user to define a BodyPart connection twice. E.g. Head: Torso v.s. Torso: Head. - //The user only has to do one. We want it to be that way in the code, though, so this cleans that up. - Dictionary> cleanedConnections = new Dictionary>(); - foreach (var (targetSlotName, slotType) in _slots) - { - List tempConnections = new List(); - foreach (var (slotName, slotConnections) in _connections) - { - if (slotName == targetSlotName){ - foreach (string connection in slotConnections) { - if (!tempConnections.Contains(connection)) - tempConnections.Add(connection); - } - } - else if (slotConnections.Contains(targetSlotName)) - { - tempConnections.Add(slotName); - } - } - if(tempConnections.Count > 0) - cleanedConnections.Add(targetSlotName, tempConnections); - } - _connections = cleanedConnections; - } - } -} diff --git a/Content.Shared/Health/BodySystem/BodysystemValues.cs b/Content.Shared/Health/BodySystem/BodysystemValues.cs deleted file mode 100644 index ce16122f8d..0000000000 --- a/Content.Shared/Health/BodySystem/BodysystemValues.cs +++ /dev/null @@ -1,20 +0,0 @@ - -namespace Content.Shared.Health.BodySystem -{ - /// - /// Used to determine whether a BodyPart can connect to another BodyPart. - /// - public enum BodyPartCompatibility { Universal, Biological, Mechanical }; - - /// - /// Each BodyPart has a BodyPartType used to determine a variety of things - for instance, what slots it can fit into. - /// - public enum BodyPartType { Other, Torso, Head, Arm, Hand, Leg, Foot }; - - /// - /// Defines a surgery operation that can be performed. - /// - public enum SurgeryType { Incision, Retraction, Cauterization, VesselCompression, Drilling, Amputation } - - -} diff --git a/Content.Shared/Health/DamageContainer/AbstractDamageContainer.cs b/Content.Shared/Health/DamageContainer/AbstractDamageContainer.cs deleted file mode 100644 index fb146adf46..0000000000 --- a/Content.Shared/Health/DamageContainer/AbstractDamageContainer.cs +++ /dev/null @@ -1,109 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using Robust.Shared.Serialization; -using Robust.Shared.ViewVariables; - -namespace Content.Shared.Health.DamageContainer -{ - public enum DamageClass { Brute, Burn, Toxin, Airloss } - public enum DamageType { Blunt, Piercing, Heat, Disintegration, Cellular, DNA, Airloss } - - public static class DamageContainerValues - { - public static readonly Dictionary> DamageClassToType = new Dictionary> - { - { DamageClass.Brute, new List{ DamageType.Blunt, DamageType.Piercing }}, - { DamageClass.Burn, new List{ DamageType.Heat, DamageType.Disintegration }}, - { DamageClass.Toxin, new List{ DamageType.Cellular, DamageType.DNA}}, - { DamageClass.Airloss, new List{ DamageType.Airloss }} - }; - - //TODO: autogenerate this lol - public static readonly Dictionary DamageTypeToClass = new Dictionary - { - { DamageType.Blunt, DamageClass.Brute }, - { DamageType.Piercing, DamageClass.Brute }, - { DamageType.Heat, DamageClass.Burn }, - { DamageType.Disintegration, DamageClass.Burn }, - { DamageType.Cellular, DamageClass.Toxin }, - { DamageType.DNA, DamageClass.Toxin }, - { DamageType.Airloss, DamageClass.Airloss } - }; - } - - /// - /// Abstract class for all damage container classes. - /// - [NetSerializable, Serializable] - public abstract class AbstractDamageContainer - { - [ViewVariables] - abstract public List SupportedDamageClasses { get; } - - private Dictionary _damageList = new Dictionary(); - [ViewVariables] - public Dictionary DamageList => _damageList; - - /// - /// Sum of all damages kept on record. - /// - [ViewVariables] - public int Damage - { - get - { - return _damageList.Sum(x => x.Value); - } - } - - public AbstractDamageContainer() - { - foreach(DamageClass damageClass in SupportedDamageClasses){ - DamageContainerValues.DamageClassToType.TryGetValue(damageClass, out List childrenDamageTypes); - foreach (DamageType damageType in childrenDamageTypes) - { - _damageList.Add(damageType, 0); - } - } - } - - - - /// - /// Attempts to grab the damage value for the given DamageType - returns false if the container does not support that type. - /// - public bool TryGetDamageValue(DamageType type, out int damage) - { - return _damageList.TryGetValue(type, out damage); - } - - /// - /// Attempts to set the damage value for the given DamageType - returns false if the container does not support that type. - /// - public bool TrySetDamageValue(DamageType type, int target) - { - DamageContainerValues.DamageTypeToClass.TryGetValue(type, out DamageClass classType); - if (SupportedDamageClasses.Contains(classType)) - { - _damageList[type] = target; - return true; - } - return false; - } - - /// - /// Attempts to change the damage value for the given DamageType - returns false if the container does not support that type. - /// - public bool TryChangeDamageValue(DamageType type, int delta) - { - DamageContainerValues.DamageTypeToClass.TryGetValue(type, out DamageClass classType); - if (SupportedDamageClasses.Contains(classType)) - { - _damageList[type] = _damageList[type] + delta; - return true; - } - return false; - } - } -} diff --git a/Content.Shared/Health/DamageContainer/BiologicalDamageContainer.cs b/Content.Shared/Health/DamageContainer/BiologicalDamageContainer.cs deleted file mode 100644 index e2b26b04e5..0000000000 --- a/Content.Shared/Health/DamageContainer/BiologicalDamageContainer.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using Robust.Shared.Serialization; - -namespace Content.Shared.Health.DamageContainer -{ - [NetSerializable, Serializable] - public class BiologicalDamageContainer : AbstractDamageContainer - { - public override List SupportedDamageClasses { - get { return new List { DamageClass.Brute, DamageClass.Burn, DamageClass.Toxin, DamageClass.Airloss }; } - } - } -} - diff --git a/Content.Shared/Preferences/Appearance/HumanoidCharacterAppearance.cs b/Content.Shared/Preferences/Appearance/HumanoidCharacterAppearance.cs index 265803fb5e..72b53675c1 100644 --- a/Content.Shared/Preferences/Appearance/HumanoidCharacterAppearance.cs +++ b/Content.Shared/Preferences/Appearance/HumanoidCharacterAppearance.cs @@ -1,17 +1,24 @@ +using System; +using Robust.Shared.Serialization; + namespace Content.Shared.Preferences.Appearance { + [Serializable, NetSerializable] public enum HumanoidVisualLayers { Hair, FacialHair, Chest, Head, + Eyes, RArm, LArm, RHand, LHand, RLeg, LLeg, + RFoot, + LFoot, StencilMask } } diff --git a/Content.Tests/Shared/BodyTemplateTest.cs b/Content.Tests/Shared/BodySystem/BodyTemplateTest.cs similarity index 80% rename from Content.Tests/Shared/BodyTemplateTest.cs rename to Content.Tests/Shared/BodySystem/BodyTemplateTest.cs index 87b3455989..df0240b8d4 100644 --- a/Content.Tests/Shared/BodyTemplateTest.cs +++ b/Content.Tests/Shared/BodySystem/BodyTemplateTest.cs @@ -1,23 +1,22 @@ using System.Collections.Generic; -using Content.Server.Health.BodySystem.BodyTemplate; -using Content.Shared.Health.BodySystem; +using Content.Server.Body; +using Content.Shared.GameObjects.Components.Body; using NUnit.Framework; using Robust.UnitTesting; -namespace Content.Tests.Shared +namespace Content.Tests.Shared.BodySystem { [TestFixture, Parallelizable, TestOf(typeof(BodyTemplate))] public class BodyTemplateTest : RobustUnitTest { [Test] - public void CheckBodyTemplateHashingWorks() + public void BodyTemplateHashCodeTest() { - - BodyTemplate a = new BodyTemplate(); - BodyTemplate b = new BodyTemplate(); - BodyTemplate c = new BodyTemplate(); - BodyTemplate d = new BodyTemplate(); - BodyTemplate e = new BodyTemplate(); + var a = new BodyTemplate(); + var b = new BodyTemplate(); + var c = new BodyTemplate(); + var d = new BodyTemplate(); + var e = new BodyTemplate(); a.Slots.Add("torso", BodyPartType.Torso); a.Slots.Add("left arm", BodyPartType.Arm); diff --git a/Resources/Groups/groups.yml b/Resources/Groups/groups.yml index 1cf921b5f8..ea45d9a588 100644 --- a/Resources/Groups/groups.yml +++ b/Resources/Groups/groups.yml @@ -95,6 +95,7 @@ - tubeconnections - tilewalls - events + - destroymechanism CanViewVar: true CanAdminPlace: true @@ -184,6 +185,7 @@ - setatmostemp - tilewalls - events + - destroymechanism CanViewVar: true CanAdminPlace: true CanScript: true diff --git a/Resources/Prototypes/BodySystem/Mechanisms/basic_human_organs.yml b/Resources/Prototypes/Body/Mechanisms/basic_human_organs.yml similarity index 58% rename from Resources/Prototypes/BodySystem/Mechanisms/basic_human_organs.yml rename to Resources/Prototypes/Body/Mechanisms/basic_human_organs.yml index 86a6df972f..49a4c025ce 100644 --- a/Resources/Prototypes/BodySystem/Mechanisms/basic_human_organs.yml +++ b/Resources/Prototypes/Body/Mechanisms/basic_human_organs.yml @@ -4,32 +4,33 @@ name: "human heart (debug)" components: - type: Sprite - sprite: Mobs/Parts/organs_human.rsi - state: heart_human + sprite: Mobs/Species/Human/organs.rsi + state: heart-on - type: Icon - sprite: Mobs/Parts/organs_human.rsi - state: heart_human + sprite: Mobs/Species/Human/organs.rsi + state: heart-on - type: DroppedMechanism debugLoadMechanismData: mechanism.Heart.BasicHuman - - - + behaviors: + - Content.Server.Body.Mechanisms.Behaviors.HeartBehavior - type: mechanism id: mechanism.Brain.BasicHuman name: "human brain" - rsiPath: Mobs/Parts/organs_human.rsi + rsiPath: Mobs/Species/Human/organs.rsi rsiState: "brain_human" description: "The source of incredible, unending intelligence. Honk." durability: 10 size: 1 compatibility: Biological + behaviors: + - Content.Server.Body.Mechanisms.Behaviors.BrainBehavior - type: mechanism id: mechanism.Eyes.BasicHuman name: "human eyes" - rsiPath: Mobs/Parts/organs_human.rsi - rsiState: "eyes_human" + rsiPath: Mobs/Species/Human/organs.rsi + rsiState: "eyeballs" description: "Ocular organ capable of turning light into a colorful visual." durability: 10 size: 1 @@ -38,28 +39,44 @@ - type: mechanism id: mechanism.Heart.BasicHuman name: "human heart" - rsiPath: Mobs/Parts/organs_human.rsi - rsiState: "heart_human" + rsiPath: Mobs/Species/Human/organs.rsi + rsiState: "heart-on" description: "Pumps blood throughout a body. Essential for any entity with blood." durability: 10 size: 1 compatibility: Biological + behaviors: + - Content.Server.Body.Mechanisms.Behaviors.HeartBehavior - type: mechanism id: mechanism.Lungs.BasicHuman name: "human lungs" - rsiPath: Mobs/Parts/organs_human.rsi - rsiState: "lungs_human" + rsiPath: Mobs/Species/Human/organs.rsi + rsiState: "lungs" description: "Filters oxygen from an atmosphere, which is then sent into the bloodstream to be used as an electron carrier." durability: 13 size: 1 compatibility: Biological + behaviors: + - Content.Server.Body.Mechanisms.Behaviors.LungBehavior + +- type: mechanism + id: mechanism.Stomach.BasicHuman + name: "human stomach" + rsiPath: Mobs/Species/Human/organs.rsi + rsiState: "stomach" + description: "Gross. This is hard to stomach." + durability: 13 + size: 1 + compatibility: Biological + behaviors: + - Content.Server.Body.Mechanisms.Behaviors.StomachBehavior - type: mechanism id: mechanism.Liver.BasicHuman name: "human liver" - rsiPath: Mobs/Parts/organs_human.rsi - rsiState: "liver_human" + rsiPath: Mobs/Species/Human/organs.rsi + rsiState: "liver" description: "Filters impurities out of a bloodstream and provides other important functionality to a human." durability: 15 size: 1 @@ -68,8 +85,8 @@ - type: mechanism id: mechanism.Kidneys.BasicHuman name: "human kidneys" - rsiPath: Mobs/Parts/organs_human.rsi - rsiState: "kidneys_human" + rsiPath: Mobs/Species/Human/organs.rsi + rsiState: "kidneys" description: "Filters toxins out of a bloodstream." durability: 20 size: 1 diff --git a/Resources/Prototypes/BodySystem/Mechanisms/basic_tests.yml b/Resources/Prototypes/Body/Mechanisms/basic_tests.yml similarity index 95% rename from Resources/Prototypes/BodySystem/Mechanisms/basic_tests.yml rename to Resources/Prototypes/Body/Mechanisms/basic_tests.yml index 4114a322f6..2c591bbfcd 100644 --- a/Resources/Prototypes/BodySystem/Mechanisms/basic_tests.yml +++ b/Resources/Prototypes/Body/Mechanisms/basic_tests.yml @@ -6,9 +6,8 @@ size: 4 compatibility: Universal implantableParts: - - Arm - - Hand - + - Arm + - Hand - type: mechanism id: mechanism.HonkModule @@ -17,4 +16,3 @@ durability: 50 size: 3 compatibility: Universal - diff --git a/Resources/Prototypes/Body/Parts/humanoid_parts.yml b/Resources/Prototypes/Body/Parts/humanoid_parts.yml new file mode 100644 index 0000000000..5437b3e6a3 --- /dev/null +++ b/Resources/Prototypes/Body/Parts/humanoid_parts.yml @@ -0,0 +1,192 @@ +- type: bodyPart + id: bodyPart.Torso.BasicHuman + name: "human torso" + plural: "human torsos" + rsiPath: Mobs/Species/Human/parts.rsi + rsiState: "torso_m" + partType: Torso + durability: 100 + destroyThreshold: -150 + size: 14 + compatibility: Biological + damageContainer: biologicalDamageContainer + resistances: defaultResistances + surgeryDataType: Content.Server.Body.Surgery.BiologicalSurgeryData + mechanisms: + - mechanism.Heart.BasicHuman + - mechanism.Lungs.BasicHuman + - mechanism.Stomach.BasicHuman + - mechanism.Liver.BasicHuman + - mechanism.Kidneys.BasicHuman + +- type: bodyPart + id: bodyPart.Head.BasicHuman + name: "human head" + plural: "human heads" + rsiPath: Mobs/Species/Human/parts.rsi + rsiState: head_m + partType: Head + durability: 50 + destroyThreshold: -120 + size: 7 + compatibility: Biological + damageContainer: biologicalDamageContainer + resistances: defaultResistances + surgeryDataType: Content.Server.Body.Surgery.BiologicalSurgeryData + mechanisms: + - mechanism.Brain.BasicHuman + - mechanism.Eyes.BasicHuman + +- type: bodyPart + id: bodyPart.LArm.BasicHuman + name: "left human arm" + plural: "left human arms" + rsiPath: Mobs/Species/Human/parts.rsi + rsiState: l_arm + partType: Arm + durability: 40 + destroyThreshold: -80 + size: 5 + compatibility: Biological + damageContainer: biologicalDamageContainer + resistances: defaultResistances + surgeryDataType: Content.Server.Body.Surgery.BiologicalSurgeryData + properties: + - !type:ExtensionProperty + active: true + reachDistance: 2.4 + +- type: bodyPart + id: bodyPart.RArm.BasicHuman + name: "right human arm" + plural: "right human arms" + rsiPath: Mobs/Species/Human/parts.rsi + rsiState: r_arm + partType: Arm + durability: 40 + destroyThreshold: -80 + size: 5 + compatibility: Biological + damageContainer: biologicalDamageContainer + resistances: defaultResistances + surgeryDataType: Content.Server.Body.Surgery.BiologicalSurgeryData + properties: + - !type:ExtensionProperty + active: true + reachDistance: 2.4 + +- type: bodyPart + id: bodyPart.LHand.BasicHuman + name: "left human hand" + plural: "left human hands" + rsiPath: Mobs/Species/Human/parts.rsi + rsiState: l_hand + partType: Hand + durability: 30 + destroyThreshold: -60 + size: 3 + compatibility: Biological + damageContainer: biologicalDamageContainer + resistances: defaultResistances + surgeryDataType: Content.Server.Body.Surgery.BiologicalSurgeryData + properties: + - !type:GraspProperty + active: true + +- type: bodyPart + id: bodyPart.RHand.BasicHuman + name: "right human hand" + plural: "right human hands" + rsiPath: Mobs/Species/Human/parts.rsi + rsiState: r_hand + partType: Hand + durability: 30 + destroyThreshold: -60 + size: 3 + compatibility: Biological + damageContainer: biologicalDamageContainer + resistances: defaultResistances + surgeryDataType: Content.Server.Body.Surgery.BiologicalSurgeryData + properties: + - !type:GraspProperty + active: true + +- type: bodyPart + id: bodyPart.LLeg.BasicHuman + name: "left human leg" + plural: "left human legs" + rsiPath: Mobs/Species/Human/parts.rsi + rsiState: l_leg + partType: Leg + durability: 45 + destroyThreshold: -90 + size: 6 + compatibility: Biological + damageContainer: biologicalDamageContainer + resistances: defaultResistances + surgeryDataType: Content.Server.Body.Surgery.BiologicalSurgeryData + properties: + - !type:ExtensionProperty + active: true + reachDistance: 3.0 + - !type:LegProperty + active: true + speed: 2.6 + +- type: bodyPart + id: bodyPart.RLeg.BasicHuman + name: "right human leg" + plural: "right human legs" + rsiPath: Mobs/Species/Human/parts.rsi + rsiState: r_leg + partType: Leg + durability: 45 + destroyThreshold: -90 + size: 6 + compatibility: Biological + damageContainer: biologicalDamageContainer + resistances: defaultResistances + surgeryDataType: Content.Server.Body.Surgery.BiologicalSurgeryData + properties: + - !type:ExtensionProperty + active: true + reachDistance: 3.0 + - !type:LegProperty + active: true + speed: 2.6 + +- type: bodyPart + id: bodyPart.LFoot.BasicHuman + name: "left human foot" + plural: "left human feet" + rsiPath: Mobs/Species/Human/parts.rsi + rsiState: l_foot + partType: Foot + durability: 30 + destroyThreshold: -60 + size: 2 + compatibility: Biological + damageContainer: biologicalDamageContainer + resistances: defaultResistances + surgeryDataType: Content.Server.Body.Surgery.BiologicalSurgeryData + properties: + - !type:FootProperty + active: true + +- type: bodyPart + id: bodyPart.RFoot.BasicHuman + name: "right human foot" + plural: "right human feet" + rsiPath: Mobs/Species/Human/parts.rsi + rsiState: r_foot + partType: Foot + durability: 30 + destroyThreshold: -60 + size: 2 + compatibility: Biological + damageContainer: biologicalDamageContainer + resistances: defaultResistances + surgeryDataType: Content.Server.Body.Surgery.BiologicalSurgeryData + properties: + - !type:FootProperty + active: true diff --git a/Resources/Prototypes/Body/Presets/basic_human.yml b/Resources/Prototypes/Body/Presets/basic_human.yml new file mode 100644 index 0000000000..38e65813df --- /dev/null +++ b/Resources/Prototypes/Body/Presets/basic_human.yml @@ -0,0 +1,14 @@ +- type: bodyPreset + name: "basic human" + id: bodyPreset.BasicHuman + partIDs: + head: bodyPart.Head.BasicHuman + torso: bodyPart.Torso.BasicHuman + right arm: bodyPart.RArm.BasicHuman + left arm: bodyPart.LArm.BasicHuman + right hand: bodyPart.RHand.BasicHuman + left hand: bodyPart.LHand.BasicHuman + right leg: bodyPart.RLeg.BasicHuman + left leg: bodyPart.LLeg.BasicHuman + right foot: bodyPart.RFoot.BasicHuman + left foot: bodyPart.LFoot.BasicHuman diff --git a/Resources/Prototypes/Body/Templates/humanoid.yml b/Resources/Prototypes/Body/Templates/humanoid.yml new file mode 100644 index 0000000000..856c995139 --- /dev/null +++ b/Resources/Prototypes/Body/Templates/humanoid.yml @@ -0,0 +1,44 @@ +- type: bodyTemplate + id: bodyTemplate.Humanoid + name: "humanoid" + centerSlot: "torso" + slots: + head: Head + torso: Torso + left arm: Arm + left hand: Hand + right arm: Arm + right hand: Hand + left leg: Leg + left foot: Foot + right leg: Leg + right foot: Foot + connections: + head: + - torso + torso: + - left arm + - right arm + - left leg + - right leg + left arm: + - left hand + right arm: + - right hand + left leg: + - left foot + right leg: + - right foot + layers: + head: "enum.HumanoidVisualLayers.Head" + torso: "enum.HumanoidVisualLayers.Chest" + left arm: "enum.HumanoidVisualLayers.LArm" + left hand: "enum.HumanoidVisualLayers.LHand" + right arm: "enum.HumanoidVisualLayers.RArm" + right hand: "enum.HumanoidVisualLayers.RHand" + left leg: "enum.HumanoidVisualLayers.LLeg" + left foot: "enum.HumanoidVisualLayers.LFoot" + right leg: "enum.HumanoidVisualLayers.RLeg" + right foot: "enum.HumanoidVisualLayers.RFoot" + mechanismLayers: + mechanism.Eyes.BasicHuman: "enum.HumanoidVisualLayers.Eyes" diff --git a/Resources/Prototypes/BodySystem/BodyTemplates/quadrupedal.yml b/Resources/Prototypes/Body/Templates/quadrupedal.yml similarity index 69% rename from Resources/Prototypes/BodySystem/BodyTemplates/quadrupedal.yml rename to Resources/Prototypes/Body/Templates/quadrupedal.yml index 6229e57c69..2eec9a12b6 100644 --- a/Resources/Prototypes/BodySystem/BodyTemplates/quadrupedal.yml +++ b/Resources/Prototypes/Body/Templates/quadrupedal.yml @@ -15,19 +15,17 @@ right hind paw: Foot connections: head: - - torso + - torso torso: - - left front leg - - right front leg - - left hind leg - - right hind paw + - left front leg + - right front leg + - left hind leg + - right hind paw left front leg: - - left front paw + - left front paw right front leg: - - right front paw + - right front paw left hind leg: - - left hind paw + - left hind paw right hind leg: - - right hind paw - - + - right hind paw diff --git a/Resources/Prototypes/BodySystem/BodyParts/humanoid_parts.yml b/Resources/Prototypes/BodySystem/BodyParts/humanoid_parts.yml deleted file mode 100644 index 6af6e71493..0000000000 --- a/Resources/Prototypes/BodySystem/BodyParts/humanoid_parts.yml +++ /dev/null @@ -1,95 +0,0 @@ -- type: bodyPart - id: bodyPart.Torso.BasicHuman - name: "human torso" - plural: "human torsos" - rsiPath: Mobs/Parts/body_human.rsi - rsiState: "torso_m" - partType: Torso - durability: 100 - destroyThreshold: -150 - resistance: 4.0 - size: 14 - compatibility: Biological - surgeryDataType: BiologicalsurgeryDataType - mechanisms: - - mechanism.Heart.BasicHuman - - mechanism.Lungs.BasicHuman - - mechanism.Liver.BasicHuman - - mechanism.Kidneys.BasicHuman - -- type: bodyPart - id: bodyPart.Head.BasicHuman - name: "human head" - plural: "human heads" - rsiPath: Mobs/Parts/body_human.rsi - rsiState: head_m - partType: Head - durability: 50 - destroyThreshold: -120 - resistance: 7.0 - size: 7 - compatibility: Biological - surgeryDataType: BiologicalsurgeryDataType - mechanisms: - - mechanism.Brain.BasicHuman - - mechanism.Eyes.BasicHuman - -- type: bodyPart - id: bodyPart.Arm.BasicHuman - name: "human arm" - plural: "human arms" - rsiPath: Mobs/Parts/body_human.rsi - rsiState: r_arm - partType: Arm - durability: 40 - destroyThreshold: -80 - resistance: 3.0 - size: 5 - compatibility: Biological - surgeryDataType: BiologicalsurgeryDataType - properties: - - !type:ArmLength - length: 2.4 - -- type: bodyPart - id: bodyPart.Hand.BasicHuman - name: "human hand" - plural: "human hands" - rsiPath: Mobs/Parts/body_human.rsi - rsiState: r_hand - partType: Hand - durability: 30 - destroyThreshold: -60 - resistance: 2.0 - size: 3 - compatibility: Biological - surgeryDataType: BiologicalsurgeryDataType - -- type: bodyPart - id: bodyPart.Leg.BasicHuman - name: "human leg" - plural: "human legs" - rsiPath: Mobs/Parts/body_human.rsi - rsiState: r_leg - partType: Leg - durability: 45 - destroyThreshold: -90 - resistance: 2.0 - size: 6 - compatibility: Biological - surgeryDataType: BiologicalsurgeryDataType - -- type: bodyPart - id: bodyPart.Foot.BasicHuman - name: "human foot" - plural: "human feet" - rsiPath: Mobs/Parts/body_human.rsi - rsiState: r_foot - partType: Foot - durability: 30 - destroyThreshold: -60 - resistance: 3.0 - size: 2 - compatibility: Biological - surgeryDataType: BiologicalsurgeryDataType - diff --git a/Resources/Prototypes/BodySystem/BodyPresets/basic_human.yml b/Resources/Prototypes/BodySystem/BodyPresets/basic_human.yml deleted file mode 100644 index 032a315804..0000000000 --- a/Resources/Prototypes/BodySystem/BodyPresets/basic_human.yml +++ /dev/null @@ -1,15 +0,0 @@ -- type: bodyPreset - name: "basic human" - id: bodyPreset.BasicHuman - partIDs: - head: bodyPart.Head.BasicHuman - torso: bodyPart.Torso.BasicHuman - right arm: bodyPart.Arm.BasicHuman - left arm: bodyPart.Arm.BasicHuman - right hand: bodyPart.Hand.BasicHuman - left hand: bodyPart.Hand.BasicHuman - right leg: bodyPart.Leg.BasicHuman - left leg: bodyPart.Leg.BasicHuman - right foot: bodyPart.Foot.BasicHuman - left foot: bodyPart.Foot.BasicHuman - diff --git a/Resources/Prototypes/BodySystem/BodyTemplates/humanoid.yml b/Resources/Prototypes/BodySystem/BodyTemplates/humanoid.yml deleted file mode 100644 index f583a7781a..0000000000 --- a/Resources/Prototypes/BodySystem/BodyTemplates/humanoid.yml +++ /dev/null @@ -1,33 +0,0 @@ -- type: bodyTemplate - id: bodyTemplate.Humanoid - name: "humanoid" - centerSlot: "torso" - slots: - head: Head - torso: Torso - left arm: Arm - left hand: Hand - right arm: Arm - right hand: Hand - left leg: Leg - left foot: Foot - right leg: Leg - right foot: Foot - connections: - head: - - torso - torso: - - left arm - - right arm - - left leg - - right leg - left arm: - - left hand - right arm: - - right hand - left leg: - - left foot - right leg: - - right foot - - diff --git a/Resources/Prototypes/Damage/damage_containers.yml b/Resources/Prototypes/Damage/damage_containers.yml new file mode 100644 index 0000000000..bb950b47f1 --- /dev/null +++ b/Resources/Prototypes/Damage/damage_containers.yml @@ -0,0 +1,13 @@ +- type: damageContainer + id: biologicalDamageContainer + activeDamageClasses: + - Brute + - Burn + - Toxin + - Airloss + +- type: damageContainer + id: metallicDamageContainer + activeDamageClasses: + - Brute + - Burn diff --git a/Resources/Prototypes/Damage/resistance_sets.yml b/Resources/Prototypes/Damage/resistance_sets.yml new file mode 100644 index 0000000000..5b829d48df --- /dev/null +++ b/Resources/Prototypes/Damage/resistance_sets.yml @@ -0,0 +1,56 @@ +- type: resistanceSet + id: defaultResistances + coefficients: + Blunt: 1.0 + Piercing: 1.0 + Heat: 1.0 + Disintegration: 1.0 + Cellular: 1.0 + DNA: 1.0 + Asphyxiation: 1.0 + flatReductions: + Blunt: 0 + Piercing: 0 + Heat: 0 + Disintegration: 0 + Cellular: 0 + DNA: 0 + Asphyxiation: 0 + +- type: resistanceSet + id: dionaResistances + coefficients: + Blunt: 0.5 + Piercing: 0.7 + Heat: 1.8 + Disintegration: 1.8 + Cellular: 1.0 + DNA: 1.0 + Asphyxiation: 1.0 + flatReductions: + Blunt: 0 + Piercing: 0 + Heat: 0 + Disintegration: 0 + Cellular: 0 + DNA: 0 + Asphyxiation: 0 + +- type: resistanceSet + id: metallicResistances + coefficients: + Blunt: 0.7 + Piercing: 0.7 + Heat: 1.0 + Disintegration: 1.0 + Cellular: 0.0 + DNA: 0.0 + Asphyxiation: 0.0 + flatReductions: + Blunt: 0 + Piercing: 0 + Heat: 0 + Disintegration: 0 + Cellular: 0 + DNA: 0 + Asphyxiation: 0 \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Constructible/Ground/instruments.yml b/Resources/Prototypes/Entities/Constructible/Ground/instruments.yml index 2b2c34f589..2d4fb5b564 100644 --- a/Resources/Prototypes/Entities/Constructible/Ground/instruments.yml +++ b/Resources/Prototypes/Entities/Constructible/Ground/instruments.yml @@ -17,9 +17,8 @@ - VaultImpassable - type: SnapGrid offset: Center - - type: Damageable - type: Destructible - thresholdvalue: 50 + maxHP: 50 - type: UserInterface interfaces: - key: enum.InstrumentUiKey.Key diff --git a/Resources/Prototypes/Entities/Constructible/Ground/pilot_chair.yml b/Resources/Prototypes/Entities/Constructible/Ground/pilot_chair.yml index 2789e1ce21..1a9307108f 100644 --- a/Resources/Prototypes/Entities/Constructible/Ground/pilot_chair.yml +++ b/Resources/Prototypes/Entities/Constructible/Ground/pilot_chair.yml @@ -15,7 +15,7 @@ - type: InteractionOutline - type: Damageable - type: Destructible - thresholdvalue: 100 + maxHP: 100 - type: Physics - type: ShuttleController - type: Strap diff --git a/Resources/Prototypes/Entities/Constructible/Ground/table.yml b/Resources/Prototypes/Entities/Constructible/Ground/table.yml index 8c28f0aef9..568a1f958d 100644 --- a/Resources/Prototypes/Entities/Constructible/Ground/table.yml +++ b/Resources/Prototypes/Entities/Constructible/Ground/table.yml @@ -22,10 +22,9 @@ - type: IconSmooth key: generic base: solid_ - - type: Damageable - type: Destructible - thresholdvalue: 50 - spawnondestroy: SteelSheet1 + maxHP: 50 + spawnOnDestroy: SteelSheet1 # TODO: drop wood instead of steel when destroyed when that's added - type: entity @@ -39,7 +38,6 @@ - type: IconSmooth key: wood base: wood_ - - type: Damageable - type: Destructible - thresholdvalue: 50 - spawnondestroy: SteelSheet1 + maxHP: 50 + spawnOnDestroy: SteelSheet1 diff --git a/Resources/Prototypes/Entities/Constructible/Power/gravity_generator.yml b/Resources/Prototypes/Entities/Constructible/Power/gravity_generator.yml index 35c0b773cf..4163f5dfdd 100644 --- a/Resources/Prototypes/Entities/Constructible/Power/gravity_generator.yml +++ b/Resources/Prototypes/Entities/Constructible/Power/gravity_generator.yml @@ -28,9 +28,8 @@ - VaultImpassable - type: Clickable - type: InteractionOutline - - type: Damageable - type: Breakable - threshold: 150 + maxHP: 150 - type: GravityGenerator - type: UserInterface interfaces: diff --git a/Resources/Prototypes/Entities/Constructible/Power/medical_scanner.yml b/Resources/Prototypes/Entities/Constructible/Power/medical_scanner.yml index 481080a288..390cdca4d0 100644 --- a/Resources/Prototypes/Entities/Constructible/Power/medical_scanner.yml +++ b/Resources/Prototypes/Entities/Constructible/Power/medical_scanner.yml @@ -34,9 +34,8 @@ - type: SnapGrid offset: Center - type: MedicalScanner - - type: Damageable - type: Destructible - thresholdvalue: 100 + maxHP: 100 - type: Appearance visuals: - type: MedicalScannerVisualizer diff --git a/Resources/Prototypes/Entities/Constructible/Power/power.yml b/Resources/Prototypes/Entities/Constructible/Power/power.yml index dde2124bad..3c7b740fbd 100644 --- a/Resources/Prototypes/Entities/Constructible/Power/power.yml +++ b/Resources/Prototypes/Entities/Constructible/Power/power.yml @@ -50,9 +50,8 @@ nodeGroupID: HVPower - type: PowerConsumer drawRate: 50 - - type: Damageable - type: Breakable - thresholdvalue: 100 + maxHP: 100 - type: Anchorable - type: entity @@ -290,9 +289,8 @@ supply: 1500 - type: SnapGrid offset: Center - - type: Damageable - type: Breakable - thresholdvalue: 100 + maxHP: 100 #Depriciated, to be removed from maps diff --git a/Resources/Prototypes/Entities/Constructible/Power/vending_machines.yml b/Resources/Prototypes/Entities/Constructible/Power/vending_machines.yml index 83b0f92fa1..3042c86ce9 100644 --- a/Resources/Prototypes/Entities/Constructible/Power/vending_machines.yml +++ b/Resources/Prototypes/Entities/Constructible/Power/vending_machines.yml @@ -30,8 +30,8 @@ - SmallImpassable - type: SnapGrid offset: Center - - type: Damageable - type: Breakable + maxHP: 50 - type: UserInterface interfaces: - key: enum.VendingMachineUiKey.Key diff --git a/Resources/Prototypes/Entities/Constructible/Storage/Closets/closet.yml b/Resources/Prototypes/Entities/Constructible/Storage/Closets/closet.yml index 2833854a0d..21f2f49e97 100644 --- a/Resources/Prototypes/Entities/Constructible/Storage/Closets/closet.yml +++ b/Resources/Prototypes/Entities/Constructible/Storage/Closets/closet.yml @@ -41,9 +41,8 @@ anchored: false - type: EntityStorage - type: PlaceableSurface - - type: Damageable - type: Destructible - thresholdvalue: 100 + maxHP: 100 - type: Appearance visuals: - type: StorageVisualizer diff --git a/Resources/Prototypes/Entities/Constructible/Storage/StorageTanks/storage_tank.yml b/Resources/Prototypes/Entities/Constructible/Storage/StorageTanks/storage_tank.yml index 87a316a0b1..44f8c3180f 100644 --- a/Resources/Prototypes/Entities/Constructible/Storage/StorageTanks/storage_tank.yml +++ b/Resources/Prototypes/Entities/Constructible/Storage/StorageTanks/storage_tank.yml @@ -24,10 +24,9 @@ IsScrapingFloor: true - type: Physics mass: 15 - anchored: false - - type: Damageable + Anchored: false - type: Destructible - thresholdvalue: 10 + maxHP: 10 - type: Solution maxVol: 1500 caps: 2 diff --git a/Resources/Prototypes/Entities/Constructible/Storage/crate_base.yml b/Resources/Prototypes/Entities/Constructible/Storage/crate_base.yml index 711f2f4ac9..6c4047f99c 100644 --- a/Resources/Prototypes/Entities/Constructible/Storage/crate_base.yml +++ b/Resources/Prototypes/Entities/Constructible/Storage/crate_base.yml @@ -36,9 +36,8 @@ capacity: 60 CanWeldShut: false - type: PlaceableSurface - - type: Damageable - type: Destructible - thresholdvalue: 100 + maxHP: 100 - type: Appearance visuals: - type: StorageVisualizer diff --git a/Resources/Prototypes/Entities/Constructible/Walls/asteroid.yml b/Resources/Prototypes/Entities/Constructible/Walls/asteroid.yml index 448ff223d6..73437dc525 100644 --- a/Resources/Prototypes/Entities/Constructible/Walls/asteroid.yml +++ b/Resources/Prototypes/Entities/Constructible/Walls/asteroid.yml @@ -16,9 +16,8 @@ shapes: - !type:PhysShapeAabb layer: [MobMask] - - type: Damageable - type: Destructible - thresholdvalue: 100 + maxHP: 100 - type: Occluder sizeX: 32 sizeY: 32 diff --git a/Resources/Prototypes/Entities/Constructible/Walls/girder.yml b/Resources/Prototypes/Entities/Constructible/Walls/girder.yml index c19ff0eb6e..50a4dfa3f2 100644 --- a/Resources/Prototypes/Entities/Constructible/Walls/girder.yml +++ b/Resources/Prototypes/Entities/Constructible/Walls/girder.yml @@ -14,10 +14,9 @@ shapes: - !type:PhysShapeAabb layer: [MobMask, Opaque] - - type: Damageable - type: Destructible - thresholdvalue: 50 - spawnondestroy: SteelSheet1 + maxHP: 50 + spawnOnDestroy: SteelSheet1 - type: SnapGrid offset: Edge diff --git a/Resources/Prototypes/Entities/Constructible/Walls/low_wall.yml b/Resources/Prototypes/Entities/Constructible/Walls/low_wall.yml index c381fae699..7c1bb1e5a4 100644 --- a/Resources/Prototypes/Entities/Constructible/Walls/low_wall.yml +++ b/Resources/Prototypes/Entities/Constructible/Walls/low_wall.yml @@ -24,9 +24,8 @@ layer: - VaultImpassable - SmallImpassable - - type: Damageable - type: Destructible - thresholdvalue: 100 + maxHP: 100 - type: SnapGrid offset: Center - type: LowWall diff --git a/Resources/Prototypes/Entities/Constructible/Walls/walls.yml b/Resources/Prototypes/Entities/Constructible/Walls/walls.yml index 7f82a01ce2..9e8d69252f 100644 --- a/Resources/Prototypes/Entities/Constructible/Walls/walls.yml +++ b/Resources/Prototypes/Entities/Constructible/Walls/walls.yml @@ -25,10 +25,9 @@ - MobImpassable - VaultImpassable - SmallImpassable - - type: Damageable - type: Destructible - thresholdvalue: 100 - spawnondestroy: Girder + maxHP: 100 + spawnOnDestroy: Girder - type: Occluder sizeX: 32 sizeY: 32 @@ -50,8 +49,8 @@ - type: Icon sprite: Constructible/Structures/Walls/brick.rsi - type: Destructible - thresholdvalue: 100 - spawnondestroy: Girder + health: 100 + spawnOnDestroy: Girder - type: IconSmooth key: walls base: brick @@ -66,8 +65,8 @@ - type: Icon sprite: Constructible/Structures/Walls/clock.rsi - type: Destructible - thresholdvalue: 100 - spawnondestroy: Girder + health: 100 + spawnOnDestroy: Girder - type: IconSmooth key: walls base: clock @@ -82,8 +81,8 @@ - type: Icon sprite: Constructible/Structures/Walls/clown.rsi - type: Destructible - thresholdvalue: 100 - spawnondestroy: Girder + health: 100 + spawnOnDestroy: Girder - type: IconSmooth key: walls base: clown @@ -99,8 +98,8 @@ - type: Icon sprite: Constructible/Structures/Walls/cult.rsi - type: Destructible - thresholdvalue: 100 - spawnondestroy: Girder + health: 100 + spawnOnDestroy: Girder - type: IconSmooth key: walls base: cult @@ -115,8 +114,8 @@ - type: Icon sprite: Constructible/Structures/Walls/debug.rsi - type: Destructible - thresholdvalue: 100 - spawnondestroy: Girder + health: 100 + spawnOnDestroy: Girder - type: IconSmooth key: walls base: debug @@ -131,8 +130,8 @@ - type: Icon sprite: Constructible/Structures/Walls/diamond.rsi - type: Destructible - thresholdvalue: 100 - spawnondestroy: Girder + health: 100 + spawnOnDestroy: Girder - type: IconSmooth key: walls base: diamond @@ -148,8 +147,8 @@ - type: Icon sprite: Constructible/Structures/Walls/gold.rsi - type: Destructible - thresholdvalue: 100 - spawnondestroy: Girder + health: 100 + spawnOnDestroy: Girder - type: IconSmooth key: walls base: gold @@ -164,8 +163,8 @@ - type: Icon sprite: Constructible/Structures/Walls/ice.rsi - type: Destructible - thresholdvalue: 100 - spawnondestroy: Girder + health: 100 + spawnOnDestroy: Girder - type: IconSmooth key: walls base: ice @@ -180,8 +179,8 @@ - type: Icon sprite: Constructible/Structures/Walls/metal.rsi - type: Destructible - thresholdvalue: 100 - spawnondestroy: Girder + health: 100 + spawnOnDestroy: Girder - type: IconSmooth key: walls base: metal @@ -196,8 +195,8 @@ - type: Icon sprite: Constructible/Structures/Walls/plasma.rsi - type: Destructible - thresholdvalue: 100 - spawnondestroy: Girder + health: 100 + spawnOnDestroy: Girder - type: IconSmooth key: walls base: plasma @@ -212,8 +211,8 @@ - type: Icon sprite: Constructible/Structures/Walls/plastic.rsi - type: Destructible - thresholdvalue: 100 - spawnondestroy: Girder + health: 100 + spawnOnDestroy: Girder - type: IconSmooth key: walls base: plastic @@ -230,8 +229,8 @@ sprite: Constructible/Structures/Walls/solid.rsi state: rgeneric - type: Destructible - thresholdvalue: 300 - spawnondestroy: Girder + health: 300 + spawnOnDestroy: Girder - type: ReinforcedWall key: walls base: solid @@ -248,8 +247,8 @@ - type: Icon sprite: Constructible/Structures/Walls/riveted.rsi - type: Destructible - thresholdvalue: 100 - spawnondestroy: Girder + health: 100 + spawnOnDestroy: Girder - type: IconSmooth key: walls base: riveted @@ -264,8 +263,8 @@ - type: Icon sprite: Constructible/Structures/Walls/sandstone.rsi - type: Destructible - thresholdvalue: 100 - spawnondestroy: Girder + health: 100 + spawnOnDestroy: Girder - type: IconSmooth key: walls base: sandstone @@ -280,8 +279,8 @@ - type: Icon sprite: Constructible/Structures/Walls/silver.rsi - type: Destructible - thresholdvalue: 100 - spawnondestroy: Girder + health: 100 + spawnOnDestroy: Girder - type: IconSmooth key: walls base: silver @@ -297,9 +296,9 @@ - type: Icon sprite: Constructible/Structures/Walls/solid.rsi - type: Destructible - thresholdvalue: 100 - spawnondestroy: Girder - destroysound: /Audio/Effects/metalbreak.ogg + health: 100 + spawnOnDestroy: Girder + destroySound: /Audio/effects/metalbreak.ogg - type: IconSmooth key: walls base: solid @@ -314,8 +313,8 @@ - type: Icon sprite: Constructible/Structures/Walls/uranium.rsi - type: Destructible - thresholdvalue: 100 - spawnondestroy: Girder + health: 100 + spawnOnDestroy: Girder - type: IconSmooth key: walls base: uranium @@ -330,8 +329,8 @@ - type: Icon sprite: Constructible/Structures/Walls/wood.rsi - type: Destructible - thresholdvalue: 100 - spawnondestroy: Girder + health: 100 + spawnOnDestroy: Girder - type: IconSmooth key: walls base: wood diff --git a/Resources/Prototypes/Entities/Constructible/Walls/windows.yml b/Resources/Prototypes/Entities/Constructible/Walls/windows.yml index 280139d3e6..e0f231f161 100644 --- a/Resources/Prototypes/Entities/Constructible/Walls/windows.yml +++ b/Resources/Prototypes/Entities/Constructible/Walls/windows.yml @@ -27,9 +27,8 @@ - MobImpassable - VaultImpassable - SmallImpassable - - type: Damageable - type: Destructible - thresholdvalue: 100 + maxHP: 100 - type: SnapGrid offset: Center - type: Airtight diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/mimic.yml b/Resources/Prototypes/Entities/Mobs/NPCs/mimic.yml index 1b3fecdafb..9f34c6b0a8 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/mimic.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/mimic.yml @@ -34,14 +34,11 @@ layer: - Opaque - MobImpassable - - type: Species - Template: Human - HeatResistance: 323 - type: BodyManager - BaseTemplate: bodyTemplate.Humanoid - BasePreset: bodyPreset.BasicHuman + baseTemplate: bodyTemplate.Humanoid + basePreset: bodyPreset.BasicHuman + - type: MobStateManager - type: HeatResistance - - type: Damageable - type: CombatMode - type: Teleportable - type: CharacterInfo diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml index ff041ce591..f048fefc25 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml @@ -36,14 +36,12 @@ layer: - Opaque - MobImpassable - - type: Species - Template: Human - HeatResistance: 323 - type: BodyManager - BaseTemplate: bodyTemplate.Humanoid - BasePreset: bodyPreset.BasicHuman + baseTemplate: bodyTemplate.Humanoid + basePreset: bodyPreset.BasicHuman + - type: Metabolism + - type: MobStateManager - type: HeatResistance - - type: Damageable - type: CombatMode - type: Teleportable - type: FootstepSound diff --git a/Resources/Prototypes/Entities/Mobs/Species/human.yml b/Resources/Prototypes/Entities/Mobs/Species/human.yml index 9259c28043..040ff8e983 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/human.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/human.yml @@ -28,7 +28,7 @@ digestionDelay: 20 # StatusEffects - type: Stunnable - # EndStatusEffects + # Other - type: Inventory - type: Clickable - type: InteractionOutline @@ -38,34 +38,35 @@ layers: - map: ["enum.HumanoidVisualLayers.Chest"] color: "#e8b59b" - sprite: Mobs/Species/human.rsi - state: human_chest_m + sprite: Mobs/Species/Human/parts.rsi + state: torso_m - map: ["enum.HumanoidVisualLayers.Head"] color: "#e8b59b" - sprite: Mobs/Species/human.rsi - state: human_head_m - - sprite: Mobs/Customization/eyes.rsi - state: eyes + sprite: Mobs/Species/Human/parts.rsi + state: head_m + - map: ["enum.HumanoidVisualLayers.Eyes"] color: "#008800" + sprite: Mobs/Customization/eyes.rsi + state: eyes - map: ["enum.HumanoidVisualLayers.RArm"] color: "#e8b59b" - sprite: Mobs/Species/human.rsi - state: human_r_arm + sprite: Mobs/Species/Human/parts.rsi + state: r_arm - map: ["enum.HumanoidVisualLayers.LArm"] color: "#e8b59b" - sprite: Mobs/Species/human.rsi - state: human_l_arm + sprite: Mobs/Species/Human/parts.rsi + state: l_arm - map: ["enum.HumanoidVisualLayers.RLeg"] color: "#e8b59b" - sprite: Mobs/Species/human.rsi - state: human_r_leg + sprite: Mobs/Species/Human/parts.rsi + state: r_leg - map: ["enum.HumanoidVisualLayers.LLeg"] color: "#e8b59b" - sprite: Mobs/Species/human.rsi - state: human_l_leg + sprite: Mobs/Species/Human/parts.rsi + state: l_leg - shader: StencilClear - sprite: Mobs/Species/human.rsi - state: human_l_leg + sprite: Mobs/Species/Human/parts.rsi + state: l_leg - shader: StencilMask map: ["enum.HumanoidVisualLayers.StencilMask"] sprite: Mobs/Customization/masking_helpers.rsi @@ -75,12 +76,20 @@ shader: StencilDraw - map: ["enum.HumanoidVisualLayers.LHand"] color: "#e8b59b" - sprite: Mobs/Species/human.rsi - state: human_l_hand + sprite: Mobs/Species/Human/parts.rsi + state: l_hand - map: ["enum.HumanoidVisualLayers.RHand"] color: "#e8b59b" - sprite: Mobs/Species/human.rsi - state: human_r_hand + sprite: Mobs/Species/Human/parts.rsi + state: r_hand + - map: ["enum.HumanoidVisualLayers.LFoot"] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: l_foot + - map: ["enum.HumanoidVisualLayers.RFoot"] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: r_foot - map: ["enum.Slots.IDCARD"] - map: ["enum.Slots.GLOVES"] - map: ["enum.Slots.SHOES"] @@ -101,8 +110,8 @@ - map: ["hand-left"] - map: ["hand-right"] - type: Icon - sprite: Mobs/Species/human.rsi - state: human_basic + sprite: Mobs/Species/Human/parts.rsi + state: full - type: Physics mass: 85 - type: Collidable @@ -116,17 +125,20 @@ layer: - Opaque - MobImpassable - - type: Species - Template: Human - HeatResistance: 323 - type: BodyManager - BaseTemplate: bodyTemplate.Humanoid - BasePreset: bodyPreset.BasicHuman + baseTemplate: bodyTemplate.Humanoid + basePreset: bodyPreset.BasicHuman + - type: Metabolism + needsGases: + Oxygen: 0.006365740 + producesGases: + Oxygen: 0.004774305 + CarbonDioxide: 0.001591435 + - type: MobStateManager - type: HeatResistance - - type: Damageable - type: Appearance visuals: - - type: SpeciesVisualizer + - type: RotationVisualizer - type: BuckleVisualizer - type: CombatMode - type: Teleportable @@ -163,55 +175,51 @@ - type: Sprite netsync: false drawdepth: Mobs - layers: - map: ["enum.HumanoidVisualLayers.Chest"] color: "#e8b59b" - sprite: Mobs/Species/human.rsi - state: human_chest_m + sprite: Mobs/Species/Human/parts.rsi + state: torso_m - map: ["enum.HumanoidVisualLayers.Head"] color: "#e8b59b" - sprite: Mobs/Species/human.rsi - state: human_head_m - - sprite: Mobs/Customization/eyes.rsi - state: eyes + sprite: Mobs/Species/Human/parts.rsi + state: head_m + - map: ["enum.HumanoidVisualLayers.Eyes"] color: "#008800" + sprite: Mobs/Customization/eyes.rsi + state: eyes - map: ["enum.HumanoidVisualLayers.RArm"] color: "#e8b59b" - sprite: Mobs/Species/human.rsi - state: human_r_arm + sprite: Mobs/Species/Human/parts.rsi + state: r_arm - map: ["enum.HumanoidVisualLayers.LArm"] color: "#e8b59b" - sprite: Mobs/Species/human.rsi - state: human_l_arm + sprite: Mobs/Species/Human/parts.rsi + state: l_arm - map: ["enum.HumanoidVisualLayers.RLeg"] color: "#e8b59b" - sprite: Mobs/Species/human.rsi - state: human_r_leg + sprite: Mobs/Species/Human/parts.rsi + state: r_leg - map: ["enum.HumanoidVisualLayers.LLeg"] color: "#e8b59b" - sprite: Mobs/Species/human.rsi - state: human_l_leg - + sprite: Mobs/Species/Human/parts.rsi + state: l_leg - shader: StencilClear - shader: StencilMask map: ["enum.HumanoidVisualLayers.StencilMask"] sprite: Mobs/Customization/masking_helpers.rsi state: female_full visible: false - - map: ["enum.Slots.INNERCLOTHING"] shader: StencilDraw - - map: ["enum.HumanoidVisualLayers.LHand"] color: "#e8b59b" - sprite: Mobs/Species/human.rsi - state: human_l_hand + sprite: Mobs/Species/Human/parts.rsi + state: l_hand - map: ["enum.HumanoidVisualLayers.RHand"] color: "#e8b59b" - sprite: Mobs/Species/human.rsi - state: human_r_hand - + sprite: Mobs/Species/Human/parts.rsi + state: r_hand - map: ["enum.Slots.IDCARD"] - map: ["enum.Slots.GLOVES"] - map: ["enum.Slots.SHOES"] @@ -231,14 +239,11 @@ - map: ["enum.Slots.HEAD"] - map: ["hand-left"] - map: ["hand-right"] - - type: Icon - sprite: Mobs/Species/human.rsi - state: human_basic - + sprite: Mobs/Species/Human/parts.rsi + state: full - type: Physics mass: 85 - - type: Collidable shapes: - !type:PhysShapeAabb @@ -250,17 +255,14 @@ - SmallImpassable layer: - MobImpassable - - - type: Species - Template: Human - HeatResistance: 323 + - type: BodyManager + baseTemplate: bodyTemplate.Humanoid + basePreset: bodyPreset.BasicHuman + - type: MobStateManager - type: Damageable - - type: Appearance visuals: - - type: SpeciesVisualizer - + - type: RotationVisualizer - type: HumanoidAppearance - - type: Grammar proper: true diff --git a/Resources/Prototypes/BodySystem/body_system_dropped_abstract.yml b/Resources/Prototypes/Entities/Mobs/body_system_dropped_abstract.yml similarity index 79% rename from Resources/Prototypes/BodySystem/body_system_dropped_abstract.yml rename to Resources/Prototypes/Entities/Mobs/body_system_dropped_abstract.yml index 4ebfd084ef..2ba5ab2934 100644 --- a/Resources/Prototypes/BodySystem/body_system_dropped_abstract.yml +++ b/Resources/Prototypes/Entities/Mobs/body_system_dropped_abstract.yml @@ -6,7 +6,7 @@ components: - type: DroppedBodyPart - type: Sprite - texture: Mobs/Parts/Organs/eyes_grey.png + texture: Mobs/Species/Human/parts.rsi/torso_m.png - type: Icon - type: UserInterface interfaces: @@ -21,9 +21,9 @@ components: - type: DroppedMechanism - type: Sprite - texture: Mobs/Parts/Organs/eyes_grey.png + texture: Mobs/Parts/Organs/eyeballs.png - type: Icon - type: UserInterface interfaces: - key: enum.GenericSurgeryUiKey.Key - type: GenericSurgeryBoundUserInterface \ No newline at end of file + type: GenericSurgeryBoundUserInterface diff --git a/Resources/Prototypes/Entities/Objects/Specific/medical.yml b/Resources/Prototypes/Entities/Objects/Specific/medical.yml index f004518590..5e7b8af68c 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/medical.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/medical.yml @@ -27,7 +27,7 @@ components: - type: Stack - type: Item - - type: Healing + #- type: Healing - type: entity name: ointment @@ -39,9 +39,9 @@ texture: Objects/Specific/Medical/ointment.png - type: Icon texture: Objects/Specific/Medical/ointment.png - - type: Healing - heal: 10 - damage: Heat + #- type: Healing + # heal: 10 + # damage: Heat - type: Stack max: 5 count: 5 @@ -57,9 +57,9 @@ texture: Objects/Specific/Medical/brutepack.png - type: Icon texture: Objects/Specific/Medical/brutepack.png - - type: Healing - heal: 10 - damage: Brute + #- type: Healing + # heal: 10 + # damage: Brute - type: Stack max: 5 count: 5 diff --git a/Resources/Prototypes/BodySystem/Surgery/surgery_tools.yml b/Resources/Prototypes/Entities/Objects/Tools/surgery_tools.yml similarity index 98% rename from Resources/Prototypes/BodySystem/Surgery/surgery_tools.yml rename to Resources/Prototypes/Entities/Objects/Tools/surgery_tools.yml index 3e490290df..5e1ecf0b39 100644 --- a/Resources/Prototypes/BodySystem/Surgery/surgery_tools.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/surgery_tools.yml @@ -11,9 +11,6 @@ - key: enum.GenericSurgeryUiKey.Key type: GenericSurgeryBoundUserInterface - - - - type: entity name: scalpel parent: BaseSurgeryTool @@ -23,19 +20,15 @@ - type: SurgeryTool surgeryType: Incision baseOperateTime: 3 - - type: Sprite sprite: Objects/Specific/Medical/surgery_tools.rsi state: scalpel - type: Icon sprite: Objects/Specific/Medical/surgery_tools.rsi state: scalpel - - type: ItemCooldown - type: MeleeWeapon - - - type: entity name: retractor parent: BaseSurgeryTool @@ -45,19 +38,15 @@ - type: SurgeryTool surgeryType: Retraction baseOperateTime: 3 - - type: Sprite sprite: Objects/Specific/Medical/surgery_tools.rsi state: retractor - type: Icon sprite: Objects/Specific/Medical/surgery_tools.rsi state: retractor - - type: ItemCooldown - type: MeleeWeapon - - - type: entity name: cautery parent: BaseSurgeryTool @@ -67,19 +56,15 @@ - type: SurgeryTool surgeryType: Cauterization baseOperateTime: 3 - - type: Sprite sprite: Objects/Specific/Medical/surgery_tools.rsi state: cautery - type: Icon sprite: Objects/Specific/Medical/surgery_tools.rsi state: cautery - - type: ItemCooldown - type: MeleeWeapon - - - type: entity name: drill parent: BaseSurgeryTool @@ -89,19 +74,15 @@ - type: SurgeryTool surgeryType: Drilling baseOperateTime: 3 - - type: Sprite sprite: Objects/Specific/Medical/surgery_tools.rsi state: drill - type: Icon sprite: Objects/Specific/Medical/surgery_tools.rsi state: drill - - type: ItemCooldown - type: MeleeWeapon - - - type: entity name: bone saw parent: BaseSurgeryTool @@ -111,19 +92,15 @@ - type: SurgeryTool surgeryType: Amputation baseOperateTime: 3 - - type: Sprite sprite: Objects/Specific/Medical/surgery_tools.rsi state: bone_saw - type: Icon sprite: Objects/Specific/Medical/surgery_tools.rsi state: bone_saw - - type: ItemCooldown - type: MeleeWeapon - - - type: entity name: hemostat parent: BaseSurgeryTool @@ -133,14 +110,11 @@ - type: SurgeryTool surgeryType: VesselCompression baseOperateTime: 3 - - type: Sprite sprite: Objects/Specific/Medical/surgery_tools.rsi state: hemostat - type: Icon sprite: Objects/Specific/Medical/surgery_tools.rsi state: hemostat - - type: ItemCooldown - - type: MeleeWeapon - + - type: MeleeWeapon \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/AntiMaterial/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/AntiMaterial/projectiles.yml index 8459ae653d..1cef82866c 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/AntiMaterial/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/AntiMaterial/projectiles.yml @@ -6,4 +6,4 @@ components: - type: Projectile damages: - Brute: 70 + Piercing: 70 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/ClRifle/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/ClRifle/projectiles.yml index b1f01dcc2b..3eae35edfa 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/ClRifle/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/ClRifle/projectiles.yml @@ -6,7 +6,7 @@ components: - type: Projectile damages: - Brute: 27 + Piercing: 27 - type: entity id: BulletClRifleFlash @@ -16,7 +16,7 @@ components: - type: Projectile damages: - Brute: 27 + Piercing: 27 - type: entity id: BulletClRifleHV @@ -26,7 +26,7 @@ components: - type: Projectile damages: - Brute: 32 + Piercing: 32 - type: entity id: BulletClRiflePractice @@ -36,7 +36,7 @@ components: - type: Projectile damages: - Brute: 2 + Blunt: 2 - type: entity id: BulletClRifleRubber @@ -46,4 +46,4 @@ components: - type: Projectile damages: - Brute: 3 + Blunt: 3 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/LRifle/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/LRifle/projectiles.yml index 5752d74505..082f492862 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/LRifle/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/LRifle/projectiles.yml @@ -6,7 +6,7 @@ components: - type: Projectile damages: - Brute: 28 + Piercing: 28 - type: entity id: BulletLRifleFlash @@ -16,7 +16,7 @@ components: - type: Projectile damages: - Brute: 28 + Piercing: 28 - type: entity id: BulletLRifleHV @@ -26,7 +26,7 @@ components: - type: Projectile damages: - Brute: 30 + Piercing: 30 - type: entity id: BulletLRiflePractice @@ -36,7 +36,7 @@ components: - type: Projectile damages: - Brute: 2 + Blunt: 2 - type: entity id: BulletLRifleRubber @@ -46,4 +46,4 @@ components: - type: Projectile damages: - Brute: 3 + Blunt: 3 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magnum/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magnum/projectiles.yml index 63b79a8161..041120110e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magnum/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magnum/projectiles.yml @@ -6,7 +6,7 @@ components: - type: Projectile damages: - Brute: 32 + Piercing: 32 - type: entity id: BulletMagnumFlash @@ -16,7 +16,7 @@ components: - type: Projectile damages: - Brute: 32 + Piercing: 32 - type: entity id: BulletMagnumHV @@ -26,7 +26,7 @@ components: - type: Projectile damages: - Brute: 35 + Piercing: 35 - type: entity id: BulletMagnumPractice @@ -36,7 +36,7 @@ components: - type: Projectile damages: - Brute: 1 + Blunt: 1 - type: entity id: BulletMagnumRubber @@ -46,4 +46,4 @@ components: - type: Projectile damages: - Brute: 3 + Blunt: 3 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Pistol/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Pistol/projectiles.yml index 3af7a3e30a..47394893de 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Pistol/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Pistol/projectiles.yml @@ -6,7 +6,7 @@ components: - type: Projectile damages: - Brute: 24 + Piercing: 24 - type: entity id: BulletPistolFlash @@ -16,7 +16,7 @@ components: - type: Projectile damages: - Brute: 24 + Piercing: 24 - type: entity id: BulletPistolHV @@ -26,7 +26,7 @@ components: - type: Projectile damages: - Brute: 28 + Piercing: 28 - type: entity id: BulletPistolPractice @@ -36,7 +36,7 @@ components: - type: Projectile damages: - Brute: 2 + Blunt: 2 - type: entity id: BulletPistolRubber @@ -46,4 +46,4 @@ components: - type: Projectile damages: - Brute: 3 + Blunt: 3 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/SRifle/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/SRifle/projectiles.yml index a5f687aad9..a86bde78ba 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/SRifle/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/SRifle/projectiles.yml @@ -6,7 +6,7 @@ components: - type: Projectile damages: - Brute: 25 + Piercing: 25 - type: entity id: BulletSRifleFlash @@ -16,7 +16,7 @@ components: - type: Projectile damages: - Brute: 25 + Piercing: 25 - type: entity id: BulletSRifleHV @@ -26,7 +26,7 @@ components: - type: Projectile damages: - Brute: 30 + Piercing: 30 - type: entity id: BulletSRiflePractice @@ -36,7 +36,7 @@ components: - type: Projectile damages: - Brute: 2 + Blunt: 2 - type: entity id: BulletSRifleRubber @@ -46,4 +46,4 @@ components: - type: Projectile damages: - Brute: 3 + Blunt: 3 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Shotgun/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Shotgun/projectiles.yml index 9b5fb5fef3..238d47d201 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Shotgun/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Shotgun/projectiles.yml @@ -9,7 +9,7 @@ state: base - type: Projectile damages: - Brute: 13 + Piercing: 13 - type: entity id: PelletShotgunBeanbag @@ -22,7 +22,7 @@ state: base - type: Projectile damages: - Brute: 10 + Blunt: 10 - type: StunnableProjectile - type: entity @@ -36,7 +36,7 @@ state: base - type: Projectile damages: - Brute: 13 + Piercing: 13 - type: entity id: PelletShotgunFlash @@ -49,7 +49,7 @@ state: base - type: Projectile damages: - Brute: 13 + Blunt: 13 - type: entity id: PelletShotgunIncendiary @@ -62,7 +62,7 @@ state: base - type: Projectile damages: - Brute: 13 + Blunt: 13 - type: entity id: PelletShotgunPractice @@ -75,4 +75,4 @@ state: base - type: Projectile damages: - Brute: 1 + Blunt: 1 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Toy/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Toy/projectiles.yml index 4f5a5c3267..4951cc008a 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Toy/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Toy/projectiles.yml @@ -6,7 +6,7 @@ components: - type: Projectile damages: - Brute: 1 + Blunt: 1 - type: entity id: BulletDonkSoft @@ -27,4 +27,4 @@ state: foamdart - type: Projectile damages: - Brute: 1 + Blunt: 1 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Explosives/grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Explosives/grenades.yml index 3e945ab5aa..e8b4a9dd96 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Explosives/grenades.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Explosives/grenades.yml @@ -21,9 +21,8 @@ heavyImpactRange: 2 lightImpactRange: 4 flashRange: 7 - - type: Damageable - type: Destructible - thresholdvalue: 10 + maxHP: 10 - type: Appearance visuals: - type: TimerTriggerVisualizer @@ -48,9 +47,8 @@ - type: OnUseTimerTrigger delay: 3.5 - type: FlashExplosive - - type: Damageable - type: Destructible - thresholdvalue: 10 + maxHP: 10 - type: Appearance visuals: - type: TimerTriggerVisualizer @@ -79,9 +77,8 @@ heavyImpactRange: 5 lightImpactRange: 7 flashRange: 10 - - type: Damageable - type: Destructible - thresholdvalue: 10 + maxHP: 10 - type: Appearance visuals: - type: TimerTriggerVisualizer diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/hitscan.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/hitscan.yml index a2778f7e50..f3513ded94 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/hitscan.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/hitscan.yml @@ -7,6 +7,7 @@ spriteName: Objects/Weapons/Guns/Projectiles/laser.png muzzleFlash: Objects/Weapons/Guns/Projectiles/laser_muzzle.png impactFlash: Objects/Weapons/Guns/Projectiles/laser_impact.png + damageType: Heat damage: 10 - type: entity @@ -18,6 +19,7 @@ spriteName: Objects/Weapons/Guns/Projectiles/heavy_laser.png muzzleFlash: Objects/Weapons/Guns/Projectiles/heavy_laser_muzzle.png impactFlash: Objects/Weapons/Guns/Projectiles/heavy_laser_impact.png + damageType: Heat damage: 30 - type: entity @@ -29,4 +31,5 @@ spriteName: Objects/Weapons/Guns/Projectiles/xray.png muzzleFlash: Objects/Weapons/Guns/Projectiles/xray_muzzle.png impactFlash: Objects/Weapons/Guns/Projectiles/xray_impact.png + damageType: Heat damage: 60 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml index 0aac56f67c..a0eeec12a4 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml @@ -28,7 +28,7 @@ - type: Projectile soundHit: /Audio/Weapons/Guns/Hits/bullet_hit.ogg damages: - Brute: 20 + Piercing: 20 - type: entity id: BulletBaseFlash @@ -39,7 +39,7 @@ - type: Projectile soundHit: /Audio/Weapons/Guns/Hits/snap.ogg damages: - Brute: 10 + Piercing: 10 - type: FlashProjectile range: 1 @@ -51,7 +51,7 @@ components: - type: Projectile damages: - Brute: 12 + Piercing: 12 - type: entity id: BulletBasePractice @@ -61,7 +61,7 @@ components: - type: Projectile damages: - Brute: 2 + Blunt: 2 - type: entity id: BulletBaseRubber @@ -72,7 +72,7 @@ - type: Projectile soundHit: /Audio/Weapons/Guns/Hits/snap.ogg damages: - Brute: 3 + Blunt: 3 - type: StunnableProjectile paralyzeAmount: 2 @@ -222,7 +222,7 @@ deleteOnCollide: true soundHit: /Audio/Guns/Hits/snap.ogg damages: - Brute: 2 + Blunt: 2 - type: entity id: BulletCap diff --git a/Resources/Textures/Interface/StatusEffects/Human/human6-0.png b/Resources/Textures/Interface/StatusEffects/Human/human6.png similarity index 100% rename from Resources/Textures/Interface/StatusEffects/Human/human6-0.png rename to Resources/Textures/Interface/StatusEffects/Human/human6.png diff --git a/Resources/Textures/Interface/StatusEffects/Human/human6-1.png b/Resources/Textures/Interface/StatusEffects/Human/human7.png similarity index 100% rename from Resources/Textures/Interface/StatusEffects/Human/human6-1.png rename to Resources/Textures/Interface/StatusEffects/Human/human7.png diff --git a/Resources/Textures/Mobs/Parts/body_human.rsi/head_m.png b/Resources/Textures/Mobs/Parts/body_human.rsi/head_m.png deleted file mode 100644 index 51661693b29ad61c87eb19fe5ee728a5ed73bbcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 573 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU}EufaSW-L^Y)fu{w)Uywg=bC zJY=LcyJUR~>1^YZl~_}e>?OXd?DesZEB7a824A&*u<^g5^X3#TX`!h`lQe?V6oSO$ z1-MM#1F!!I9{j%{ZlO=v^ zd~7Zz^l!gk+p_aF8-sz}?^QDP#mk>QQH^aDV5{2`{F@~?`E~x|?r?$h z_$iNOM>d~+^1Z&sFIIN_%vsYaIhgIYX|un4!kA#w5^EXIH9wPqAwi3cq2b%T#8+Ck zKZ_ka;KL*M|JTf#w4@G?LhIltrq(Rx?u)!#kEDd3o1U3FeMbD8jA*9TQ`IxBrCr+A zkv1cKuGZ1;do0{n-HO(0|NQ-N`~A8DN^CyNJ6_k;PpMZz0*n5iiaN*6@asIs8tr{W znP-Y@MeasjTK2i;Kv8GiC42WP@1MoXO+Pq&GJAv5)```XF~|1DPiJXZ6y5x^s_N9^ z)jmfVzMfuOYV&IT75)BeVSV=lUW$C(J%iz-&W5>0x2oHLLDYT@rU#yCf&+yFgjzMePdSMb71`Z%c$O;l92=M{Mso(MSJpzkhlC@@2i{N(0jRc-E>ZinLepp z@BII#7_H6lzalN5_WIb(C96!&t4%eCG!N+x+vCHaCAGdGOblc&2sG>u&%VEH?zfzD zgGpf*_Q}fi?S1q5)uz=mMFlmxW6EYPEm6ODdS}*qHvQwZca`NIPdZy^`6@g9{iC@$ ze!LppcYZeQ+mTk3b>Oe`2j3XukM&?fAMnRAS~B<_VD7&b2NLjf^>bP0l+XkKsB3_@ diff --git a/Resources/Textures/Mobs/Parts/body_human.rsi/l_foot.png b/Resources/Textures/Mobs/Parts/body_human.rsi/l_foot.png deleted file mode 100644 index ace230831a46fdcf3a5ff34c3b16ec646e91cb12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=vpiiKLn`LHy|j_@P=G}1#nl=& zj@)96aoAA6e0)R6k}22x9`H4B?`T-NQ84I;SI!YNeixhchWB=LaZEtnK=6T`t(Mt$ z@0(+vOVzIGY`?7MX>?bvy8QlI70<0Vp49DLVk_VErstRa+oe%ClT>`?u6rUltLmoh z?WLlY4%K!`bOnDs__-Tm6vKnl>wbrR&z3$sX=D5shDm`c$^WkX>jX)9y85}Sb4q9e E02h!|d;kCd diff --git a/Resources/Textures/Mobs/Parts/body_human.rsi/l_hand.png b/Resources/Textures/Mobs/Parts/body_human.rsi/l_hand.png deleted file mode 100644 index 0981260733ce090e3b63ef9d699084a224fac3ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 294 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Z#`WcLn`LHy}2>#uz`r%L;JGj z$5^&XN(iGkrj>CDJuP34i3PNglqowoAk<I?(S(i0AF7RsC)y2<9R;#1FNUHK)w*z(-2^Y^SO1GCDz mCcpc^&-$M2??0f{9clKFE*>ZNpD9cR8RY5e=d#Wzp$P!a4S=iw diff --git a/Resources/Textures/Mobs/Parts/body_human.rsi/l_leg.png b/Resources/Textures/Mobs/Parts/body_human.rsi/l_leg.png deleted file mode 100644 index 362a0eb9438880d579c31cc409d8cb6aa108feb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=w>(`OLn`LHy|tICDL~@bNB8Mc zS9D)mF}1&2rkn5aLF(46UCj>Lx4mF0^3`l;4YNH*AiTqd^wsNHABtrfYe`k$Xa?HCwUcI)Ixh9%`3ldhPBu79e!k9U{s zfyY%+F^9bvw%`4={y&Fj(3EL$rFM0D*>@HFViLRP^SQusMcZXY28lPUX$2OGFXRZ6 Pg6!~g^>bP0l+XkKk+X1> diff --git a/Resources/Textures/Mobs/Parts/body_human.rsi/meta.json b/Resources/Textures/Mobs/Parts/body_human.rsi/meta.json deleted file mode 100644 index d0c6866a45..0000000000 --- a/Resources/Textures/Mobs/Parts/body_human.rsi/meta.json +++ /dev/null @@ -1,81 +0,0 @@ -{ - "version": 1, - "size": { - "x": 32, - "y": 32 - }, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13", - "states": [ - { - "name": "head_m", - "directions": 4, - "delays": [ - [1.0], [1.0], [1.0], [1.0] - ] - }, - { - "name": "torso_m", - "directions": 4, - "delays": [ - [1.0], [1.0], [1.0], [1.0] - ] - }, - { - "name": "l_arm", - "directions": 4, - "delays": [ - [1.0], [1.0], [1.0], [1.0] - ] - }, - { - "name": "r_arm", - "directions": 4, - "delays": [ - [1.0], [1.0], [1.0], [1.0] - ] - }, - { - "name": "l_hand", - "directions": 4, - "delays": [ - [1.0], [1.0], [1.0], [1.0] - ] - }, - { - "name": "r_hand", - "directions": 4, - "delays": [ - [1.0], [1.0], [1.0], [1.0] - ] - }, - { - "name": "l_leg", - "directions": 4, - "delays": [ - [1.0], [1.0], [1.0], [1.0] - ] - }, - { - "name": "r_leg", - "directions": 4, - "delays": [ - [1.0], [1.0], [1.0], [1.0] - ] - }, - { - "name": "l_foot", - "directions": 4, - "delays": [ - [1.0], [1.0], [1.0], [1.0] - ] - }, - { - "name": "r_foot", - "directions": 4, - "delays": [ - [1.0], [1.0], [1.0], [1.0] - ] - } - ] -} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Parts/body_human.rsi/r_arm.png b/Resources/Textures/Mobs/Parts/body_human.rsi/r_arm.png deleted file mode 100644 index f9024dbdba443e738232116f666420f29984625b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEVC3_3aSW-L^Y)f~UsHg<@sAgC zb2h}~zST8&XZnq6n%eE^j<>!#dz-Fb@NmrEE#Yl=%x&Y1fK{K{?3?QBP5JA1m__^TE>%#j!zB-e#W*ws`$!-IQV|`amTAthi2>>Ex9RFU=Qtt(keRt{!aW1KC){ XH#`Ax6BcoN0||J#`njxgN@xNA1x}FZ diff --git a/Resources/Textures/Mobs/Parts/body_human.rsi/r_foot.png b/Resources/Textures/Mobs/Parts/body_human.rsi/r_foot.png deleted file mode 100644 index 8e93a2e157a86dad6a5c49c1f4bd11862999eab4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 276 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=w>@1PLn`LHy|tICDM8}sM`6*H zgyJ}d)y)rVOC+vne`x1p(??{_l+O-a_D@c8H4Z=yZN zANyXloO-8K=KOS<{a1bVt$w!8snl=n{Y`og>MU37kXdX0?p5$_F8&W?9@4D4rM81i N^>p=fS?83{1OO&}aufgn diff --git a/Resources/Textures/Mobs/Parts/body_human.rsi/r_hand.png b/Resources/Textures/Mobs/Parts/body_human.rsi/r_hand.png deleted file mode 100644 index b73ac3dd0b7261e4d6c7ab358925316ab0bc6d28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=7d>4ZLn`LHy=BOC$U&g>p{ulF zgofCy$|jCO^G*g=G=6E^+s6KZNmJ(ybD5_ihx8&xj%58=9ueWp|HJjI`xAFbE(Mwb z1P#;ITukbn7XLislIr6HZyQxM-uV_Ssdw$}g3M1hhNygPELau2O{g$dYv@Or6;O<+t=W;_(J90Yrh-R z_T{ssoj&k${#@yTvwipS+0HG$l)ZQRC5@E-d_YIct7fR37g)_)9kmZ+f~TvW%Q~lo FCIHM}Xd3_k diff --git a/Resources/Textures/Mobs/Parts/body_human.rsi/r_leg.png b/Resources/Textures/Mobs/Parts/body_human.rsi/r_leg.png deleted file mode 100644 index cc7fc1a1447061cadde06fe17df7f0510135562b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=w>(`OLn`LHy=BPPWFXP@FkVQR zd4uPU2KN^ac=vS1bu3xDdG>OHgGUaY6+V&Gd2Fp8pPJ5=jL>`ODnCyjpT5jnkP&DI z2y8Kqij1CWR?=s-O>6DNRmIy*JWaj+_S0&w4<{doI81r+=+ZZ9iM2UXo}Bya$NEQ@ zi$hky1V}(MgGhO!S5^sIHa))i=xO8}u}d=7CawK8_d54k%@3PfEOcF5>b^a8-68!& z|3R7Ew~5LU>zUs9>VC}>Px&2h_BpQZ;zun7Kkk`nlkJLFjDHw2NbF!wa57r_{A9W< O$Z$_rKbLh*2~7YH!*8Pi diff --git a/Resources/Textures/Mobs/Parts/body_human.rsi/torso_m.png b/Resources/Textures/Mobs/Parts/body_human.rsi/torso_m.png deleted file mode 100644 index 556a567143c51271aead12adc240ac1e85eb211d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1195 zcmV;c1XTNpP)9w=%A&;yX;k}Azc4|bsMO0j9GJBo4*+z${$9?9?j@#DS7`v8GJ zAP@)y0!9u2$NN7?zVc}92h^8%E;7mmN69YX&+mT(07O1>kXqm4vc;=EweUIq`0jpS zeWr_ya=`%rCA)+{r$x&ni5YaCxz2L z$^|ExU#0uD*`V8MGDEk`+D<4zAo{l1gsjA&sA+nv|Jp*YYaxE=IntXYgRy zrkc#qpO?V{Y3%*N$x4yxtI1h<^QXtZ0s!QghWMrH0DxqEmDZF|7%2b*?^A!<@l6(^ zBk;UZMY>Xz{Q6Pt+8g!9UIR7(q$^d4w0ooW!_aZEKj^fOu2iKvoSo~x@yVGzqTm1h z$UWc;hV}=Y7R=fXlkMmzCy^WK*K4o<#IiSrj>ob$VAT)Muh*EwS?Sknup<)G*$>?U z$&Isoc^-E27xe2j=KhDN2@w44-oGCz+BDsiBGEUNv%nRA{|kfHR$vIZ?ud6436&mYyULXIU6)vgYevl1u(nw|@Cd0@uz0GI=y>A8OhTlIs9 z1*6}7!c_iWFbx^|fb(&6iw=3o{3^`a4rD!#C(GM(ybcTU=J)>Y8US}#l=VCS_kEQ=R zJaPm4`ayl*`Y39Y3sm@Ir8w~*5dGPeA^=x&^=u0I=A&(qKFYBGbH#S)GdH=tyf@ZwgE$p_{pFzB@C z`v22niIz`tk;JP-eAonr(so9Lxd{NkZC{(S%?1XY*4a1uJsy)IBkOrs^#eo_Gfb^v?aouG1M9?F$@0B$vmBxWYk5A^Fbdh>oico^I2@Fa5t#;L^>fbQLg=)Q8( zQo8mDE$^g07>iSH!>d8GyRVMWz59^M9#a6OQ*kQva(Nr}<9jq?%QhQG7>~G|U?E{V zqRCK-nuh)O9$qeQ18^VAbSlndkGTf4i#D2-DgZYnj=<9c^WxPaJ~S&;w2L;gEv`|3 z%)-2AdJg74P6+GYc4GJ`I&bTG(N9QZp3-Dmg1%N6!>`qQ@#8IGP7OL%VrxdC1d0f)Sd z*=7S%iyPr*i~AiQ+mpU|zy5jo0N{MS2Y9v5Q(qtu2m}|MzX0&>!~L*{AXa8$#BNW$;rUL zfPo>6;mm&r2ZvX8n%jVC7)yfuf*Bm1-ADs+EInNuLo_BPCrI3JXxPxfq$t|s^@6F1 z>sW@;sdbDin9eNZJW-S8%od`%@MuO`8|z}u4N?oNb2yk7Qg*ULJl2|$0yKod)78&q Iol`;+06#!6wEzGB diff --git a/Resources/Textures/Mobs/Parts/eyes_grey.png b/Resources/Textures/Mobs/Parts/eyes_grey.png deleted file mode 100644 index 2d2e8472ef26a691c2a4ea12feb6e9bb83e89e99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv(Ey(i*8>L*{AXa8$#BNO!C~35 zWu2X!+1c513-%TO6)=_r`2{mLJiCzwVS)*8>L*I5;@y=;#Co2OA{i zGo1PV@Z_NnH!l8v{(vPp&K9VQu_VYZn8D%MjWi%9!qdeuL}Oxdf<&4_fPjYq7uSIw zKF7{EY}>S1F~&iKMPq@G5{I||%jyCbApx=EgkZ52ZUYU?jm8^{H8mA(9zGb*m}O|~ r%)E-h-H~zDZK(?(1_EJ*7Z@1AlQ{MCAKZBaw1dIZ)z4*}Q$iB}d_O&d diff --git a/Resources/Textures/Mobs/Parts/lungs_advanced.png b/Resources/Textures/Mobs/Parts/lungs_advanced.png deleted file mode 100644 index 2186b3fe032dbeedb1a70973d277f84081a39930..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 336 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyX#qYVt_Kbr`2YODhZ`5e!^3TC zYzzzx%+1Zcy}ixM%-r4G9UL5Vb#?Xi_3iBJ^z`&}baWgY9gU2P9-cg8VPRowYinX+ z;^E<8l3r|(ly6s1Ym`#RaOS^aaDqW{espwnaBy&Ze7v)>bN+9?LqHoDOM?7@862M7 zNCR?ac)B=-SoA)f5Y69Yz|(qMCeG>s16SOPMgRZ%-_moDzjoAJICt8Xmp{w4U7I1_ z^GG;h|LYA!PiM)Roy!fabzizZC-F5~K;t&%3$yFad#dvJhTKwQ?@oU&#C8*A5 zQ}9fSRWEo((-*-dUX8!B_?Qa9WR6Kc;TKe}yfxvow8!%u_8v{EXJq=_`w;Ptai;5@ fTRUCL*{D1!7!;OpUw%ROM zX1?p7%fpk0_8$#uXw{i8&2Xz<_zs{-#*!evU3NZ5RHk+2@BK(9K-__ zM6hmdZZhs_*f@DYF~g>&0CThJK`M-wKM9CkE>cll_Hf~uWe*uWtehN~IBeHEJjlp% zY#|5Zv~JtXaX@q7u>$8=&CbjcR&!$?GRYiV=Fq5ltUy=hn5;w6Ce}l; fvb+XK9~c<8CP=)TW$xt)bOeK^tDnm{r-UW|5&c!F diff --git a/Resources/Textures/Mobs/Parts/organs_human.rsi/brain_human.png b/Resources/Textures/Mobs/Parts/organs_human.rsi/brain_human.png deleted file mode 100644 index ba49b3e5e6646bec209b37b9e53b902e5f4da896..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 708 zcmV;#0z3VQP)DJ$>i^Mj{eBw>UE3SFjDJvjD8z0+b~l7tkmUlh}JGp)h3SI77u^b+{-+w5 zUU0r&aj_;su_r>XCqu9&La-)6uqH#kUU0D|L#ib}t0h3TTWq&mZMR!&q$ED0BtE1h zJ+D}3uvclYSZJdpJ+D`2uvlrHB0H&6WvEnSs8nU0B0H&6WS1d1m?1f%QDCA`V4_iB zk{~yoPF<5AH(Ee8Y)wL%aAS{XTW3l?W=TGXVpdy0H<4*v7#~C000001bW%=J06^y0 zW&i*IMoC0LR5*>zk!w?eP!NV)yAU1kq?S^lnb=JX$}lrjgt9tjfdOn1QT}|kRqg02(c__Sn{UX)TjaL8=G7vi@2>Em(3Bl z%y!Nt+f9l#jhcJUp? z_qaR0D8n#J029n!&+HoyeRE>hmSx-INCVpt{+fo~@AAL*{AXa8$#CZXnKS>F zE&KofzcB-Yywm0gpaRB{AirP+hi5m^fE-It7sn8diOC5PcN`ivbTBE3_ISNuYT`PU zp>%2;;|iuT3pr2Jq&c&N=q@~$(bmSgm~(^F0_z+OCI-uyEE*D@-oFMK!rL*)GxUFRxBtyaZMhZ z@)saN+blaDmbHfQiV| z^RrfnG-xHPTGF5;Ak~uAk*%?7rCx=MWe+36(l0EBq7^Pq1nOt-boFyt=akR{00|#3 AEdT%j diff --git a/Resources/Textures/Mobs/Parts/organs_human.rsi/kidneys_human.png b/Resources/Textures/Mobs/Parts/organs_human.rsi/kidneys_human.png deleted file mode 100644 index 0b324e81bab1a52f0fddbfd17bff6c3103e8e046..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv=>VS)*8>L*oLp9ZV{6;$j>uip zGyXq+FsIV%!;Om%Pac|Mes2;`8DmM1UoeBivm0qZPKc+AV~EDY?%I@k;hTCBJZum;H-mb`J;M}R4Z^9|1$p3D>9HW-C0h&pphpg}F5 oLG8eW20eib4eOX<6BaNs6ghKxZJe`_6KFnzr>mdKI;Vst051+gg8%>k diff --git a/Resources/Textures/Mobs/Parts/organs_human.rsi/liver_human.png b/Resources/Textures/Mobs/Parts/organs_human.rsi/liver_human.png deleted file mode 100644 index efa7e75f768b607f33c743455be129c28b9266f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvi2$Dv*8>L*e7JG(TyD|+xa1A~ zA$MyU|3825@Z_QYiE8XXHH;-ee!&b5&u*jvIWC?qjv*QolM^Hu9RdWVo?oJ~rbp?4 z)D)3d4M)-gdHuqI9Ih=~rSqm~P4iKYn=(f^#FB+Wyd!*MF0fqq!NViL)XdMoFsF_6 U=raZuYoK`yp00i_>zopr0Igd*E&u=k diff --git a/Resources/Textures/Mobs/Parts/organs_human.rsi/lungs_human.png b/Resources/Textures/Mobs/Parts/organs_human.rsi/lungs_human.png deleted file mode 100644 index 6e644517a7d5a8f960c4e5e62753bff86fb7b7ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvxd5LK*8>L*{D1!7!;Om{Y8xNs z75(p-@bKiJ|Fh>G4hXpvpB&3A@einyu_VYZn8D%MjWi&q($mE;L}Oxd!UA;x2l0Rf z5v-e=n~b{}Hcp;U%&@5`z})P5kP74FPXc0>i&RvXJzRKZ*+WJTDIx` zTgbsU?LrVc+w%(nI~E6|lWChL&2iS>}I fEU!V*2L=YN2@)@7nR~ec9l_w~>gTe~DWM4f=U`Ub diff --git a/Resources/Textures/Mobs/Parts/organs_human.rsi/meta.json b/Resources/Textures/Mobs/Parts/organs_human.rsi/meta.json deleted file mode 100644 index 46bbb3c601..0000000000 --- a/Resources/Textures/Mobs/Parts/organs_human.rsi/meta.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "version": 1, - "size": { - "x": 32, - "y": 32 - }, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13", - "states": [ - { - "name": "brain_human", - "directions": 1, - "delays": [ - [1.0] - ] - }, - { - "name": "eyes_human", - "directions": 1, - "delays": [ - [1.0] - ] - }, - { - "name": "heart_human", - "directions": 1, - "delays": [ - [1.0] - ] - }, - { - "name": "kidneys_human", - "directions": 1, - "delays": [ - [1.0] - ] - }, - { - "name": "liver_human", - "directions": 1, - "delays": [ - [1.0] - ] - }, - { - "name": "lungs_human", - "directions": 1, - "delays": [ - [1.0] - ] - }, - ] -} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Species/Human/organs.rsi/appendix.png b/Resources/Textures/Mobs/Species/Human/organs.rsi/appendix.png new file mode 100644 index 0000000000000000000000000000000000000000..4d4fa1293a08c4f55d37b1818558ed8e2e599357 GIT binary patch literal 258 zcmV+d0sa1oP)dK@L!FCoxEZz^M7?^L~d(40kLJ0BCRMy~b9ofhIYjc$8F6Yp09obsyv3)t92A>$u zQ0evvE*55_UGG~|0&#Uv|g zsYhWFvHxhGZHbdD{!Ie_!8pbwD{^xPE**S>QteQkY?1q_xB5=c>U4PXHMRb=d<(Y2 g%pX_?A%u7;zxkaUiFf&c&j07*qoM6N<$f<3``CjbBd literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Human/organs.rsi/brain.png b/Resources/Textures/Mobs/Species/Human/organs.rsi/brain.png new file mode 100644 index 0000000000000000000000000000000000000000..04d04890f6b4a831e8889c40f264d284b61fca71 GIT binary patch literal 461 zcmV;;0W$uHP)amXX`z%|4S0FqahNyry%`1+3WY+UxM#Gm55By4E0N*uU$OPw zz0h^~3Q=;Krc@ z`VyZs&EKtvFrAEISOq%2CK!p>=m{OC?t~J!_5A{Dq>?f>^MEVw3O%7?l`O2Y4qHWY z@K^9Jwu+`^6fOb$=3%+h1o~{GlKyJK{9d6@C;)x~p-rXfm=&9b00000NkvXXu0mjf DKDXCd literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Human/organs.rsi/ears.png b/Resources/Textures/Mobs/Species/Human/organs.rsi/ears.png new file mode 100644 index 0000000000000000000000000000000000000000..ae9ab068ebcd284332fdf3905f688d2d3b56dfa8 GIT binary patch literal 619 zcmV-x0+juUP)&VUCG9{xw%Wz)`GHtoE{ zSw6RkHyO(T2nB-t`P%~E!+V2|Uw^nhV`JQ8EGGfJ1o-kP(~)sLWp3?+wodYOHZ86S z_gc#yZ@VhoueE;>-Yr|mr%Y9uB$Ujpm5+lqt?rrU3X> zyw&!@2Q-=^3|(O8f<$zWZS98@&+zi}#DR(Zjpm4WEJ7#{1fVw@(6TkY6mQiT*H%*X z&Gh_60_KHC@||5jFV7=-!vU3Qhl^U>Cy5PRsC}|=UlZa=<>l##6OTmzW<>ld{boOW zfT0UD5AgClZs0{O&BOIO?sPk9ED7SV2>ouGP#{S8;fYe&rc}1+4F~M(`UwSs^tfQwq) z_h`?G0F;PCbPq!pO2mB5)&drZkXIs!E7gfONh)8;n+RAYqEhXsCurz`O0`2g7MW?> zW!U%|mH)$`K8_#l$=abliC0y>m4JC6^LUNeg9i^1{{ZSoB6z)o*qQ(U002ovPDHLk FV1iDUAwU2C literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Human/organs.rsi/eyeballs.png b/Resources/Textures/Mobs/Species/Human/organs.rsi/eyeballs.png new file mode 100644 index 0000000000000000000000000000000000000000..301158f76bb6b306a14f6c71d3a3ca4c4d8faea9 GIT binary patch literal 574 zcmV-E0>S->P)+l{v~p)`Va?;pH)rZf_- z&dzu(D6#+SNt~D%!;y0%O+oMIBKp&ae%EMQ_cN&}o*z90`~4ceeyL-9(L!N*7Pm_I zW?s@TS)&Z>gkJ}u?ZmHKo&>px-rgQmm)<}-dKkkK7opt)Z~ib569RfmnWSMdCIsA; zT9SmHNnh8Av_$}TG};fa0om9D>(lF^2t5K?G2h*2YU?TmRl$$KSe8N(3-gn`u`8lpFmsrg| zr0QY<3fFKZHAMh8cqoq3XU2XR|M|lrck4aP=Z2KHdi;X&743>bHbcr)Cejwg-B;{O zRp@+MVL3Oa)P=zBKoA21aR9($yAE78@oCFNBocuh->;P4wE=7S9ROfYOvB#WPcd>} z7XV=8t=(;Db#mDZUB@QnDqY8BKAY+IAJUbHj~f-{{)Tu+NXS3UcabXmbdP+@AOHXW M07*qoM6N<$f*J?{;{X5v literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Human/organs.rsi/heart-off.png b/Resources/Textures/Mobs/Species/Human/organs.rsi/heart-off.png new file mode 100644 index 0000000000000000000000000000000000000000..b2c6562c8ffd731b5d34aa7e101ce61523a9537a GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJot`d^Ar*6y6C_v{Cy4YkEo6Ho z9`o;in9d9Pt!I*zLJ#*gn@dXB$D~wfi@AulPk6(?1_TEqr6oXu0(D#a3LRt?giJo3 zprdwtL%^|#`xJrX$Nyemd3nA^sTuzGBb4&tr>e(BWe>i_53?D0yi6+#_MO*v^m?Oy zmoaYlaw7vE$Vsd|e*g$B{CKGJS4QA}iv8o8;r$P4W+=0BfFy!`|#GSrjI zbF^7sDoB=`xS{C(AWFt-TF*lL2e(`~oaQTBSQ;$LywqYxDMxJs-=(FJw-%;wvCNIl zYfsuRvub_V&WHcaSpW7PUwzt^K@bT3p8fOC_syD4i)nv^Z*t#@zt+*kW1W4;Tlv3IwcGrn^!QaXI|Tjqr=4f{S%m3q*^cma4kHF_Wvk);GNT#pNgQrvLAyoJsm?Px<%mnL1tJZo}#4)(j3=PZ%0j zoCw)GHRR`4skrU&r@l|lI*_wj>dN6&OuLF^#9!T@VLzq5?UXoMn>K?9SH99V+d$LB z>!msnpfC3RXU5#id3FnOqt3B!@qER&?0P@bkDCj=cnhzbn7l1A^DfIv(SZB&-&ff^ zu=g-cu=Fyp-~ZE8eu4GMr`12U{k`N8k`nd)oR_$q#5#%S!+$rv`_GWt_^>O>tpQ?- chyMM~n^rnpzA$Y8Fg6%GUHx3vIVCg!0E67gmjD0& literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Human/organs.rsi/kidneys.png b/Resources/Textures/Mobs/Species/Human/organs.rsi/kidneys.png new file mode 100644 index 0000000000000000000000000000000000000000..4296d5d33a4eac02c7ff79f6398ef91f2bb02ce9 GIT binary patch literal 351 zcmV-l0igbgP)XA0f)y^c}3cL*Az9BXqGm6(Q822`B_rYUOU2q1bg1 z$R-pjq5GC7_UZ2b?=Ardf*^>7WO1b3XH#0ok<*;B(7-%Nt<&*z!oGX|6+wY{lIp?j zEBc)t0AMy>p{`1BAz2nj`s(@yqhS{S@Vt4!qG$z+@Qxr)Qtc);nBrVWTgcpxhTVgX z{78VCxZmkn_wMqIrxP}tuWW~0p+16lz{R-E;z<9=SFql!0qmT8Y%dp*nH@0BP5e;= z)Kv+!RrdYiaRFfG-t2*U4ghMaP*-J;0PhI6kSs%_fhV*t+waNMK}=nhxH#VzUl#i@ x`3M>T7m_Ut;O_qON*Fo{3aju&wTFy4BgIweGJR(Pjf8@{h;_7U*FcVJR`jf0O)q^ zHq9}ig8~-Y0x5L40rvLx|07*qoM6N<$f)QGJ-2eap literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Human/organs.rsi/lungs.png b/Resources/Textures/Mobs/Species/Human/organs.rsi/lungs.png new file mode 100644 index 0000000000000000000000000000000000000000..7a2a48e218af19c09c1e6ae91590829df903b261 GIT binary patch literal 359 zcmV-t0hs=YP)YE0LFh22N9%%mXP!n6qkle%lunihkaf1 z>zgZp65zdf+t6+hM%<6GG8d9tZ#-m|N*F`Bn zqhdr7WAz72XAuC?S%lReAd(nBy9MP2N|_;&7|(Hu0v~|z>GKXmfsg07h$Pl-K`DSt z1&c7KO+3d%rh>`bw`3|>`XUUFsn~6Ripr#_`zKum!AE;+?}4ZZuVsETPkw~gTe6U`2fTbp|vl{WuO26002ovPDHLk FV1fr-ryKwP literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Human/organs.rsi/meta.json b/Resources/Textures/Mobs/Species/Human/organs.rsi/meta.json new file mode 100644 index 0000000000..13310de52c --- /dev/null +++ b/Resources/Textures/Mobs/Species/Human/organs.rsi/meta.json @@ -0,0 +1,121 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation/blob/7489d8e74693f9ca811e4f8a921de10ed96c619e/icons/obj/surgery.dmi", + "states": [ + { + "name": "appendix", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "appendixinflamed", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "brain", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "ears", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "eyeballs", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "heart-off", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "heart-on", + "directions": 1, + "delays": [ + [ + 0.6, + 0.1, + 0.1 + ] + ] + }, + { + "name": "kidneys", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "liver", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "lungs", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "stomach", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "tonguenormal", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Species/Human/organs.rsi/stomach.png b/Resources/Textures/Mobs/Species/Human/organs.rsi/stomach.png new file mode 100644 index 0000000000000000000000000000000000000000..0d7be9bfe42b6030736154d907c1e527e3dd8e54 GIT binary patch literal 370 zcmV-&0ge8NP)1t`JXt{D5s+nOKjCOHHM=>~Fzi2UQ?nDr5dHuLfg)KZku%Ez0?#$=F3T+D z5agOd3G{kRmXSWH{o4E9_uBU^2Ne|+4g|v2TNQu5ztyfL_FM*QwQ?EmZlDZy*MN#8 zG77)c0^wU{V!xh)V38`(!|)tB*xg(3Kl`6)GtI(3U#qMcpJqVa1;b_RPYv@9D5Cdiy*qFR2Msy z;!ui|8e0ss$H~r#i_7_K2j27W^6-KrNs=T<|4fPd;c#U`qzxNQ)9LqnD2W7yp>uS1 z9Xks^i!*$-z9SYqfAoG2hq&1cSIDNj2wTK#Z@OZT-+=LE*?N2c=9a+CIG`2w@ofiy!rVN??JcTTRnnHj-hLSs zMARl?)pfAABn)MYT*}3=EPUG`p{OJslhmX|v)*8+D%2Wv&R^~$WyiXK%ePkrppq{L zz1L_1ORb002ovPDHLkV1gRrsQ>@~ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/human.rsi/human_basic.png b/Resources/Textures/Mobs/Species/Human/parts.rsi/full.png similarity index 100% rename from Resources/Textures/Mobs/Species/human.rsi/human_basic.png rename to Resources/Textures/Mobs/Species/Human/parts.rsi/full.png diff --git a/Resources/Textures/Mobs/Species/human.rsi/human_head_f.png b/Resources/Textures/Mobs/Species/Human/parts.rsi/head_f.png similarity index 100% rename from Resources/Textures/Mobs/Species/human.rsi/human_head_f.png rename to Resources/Textures/Mobs/Species/Human/parts.rsi/head_f.png diff --git a/Resources/Textures/Mobs/Species/human.rsi/human_head_m.png b/Resources/Textures/Mobs/Species/Human/parts.rsi/head_m.png similarity index 100% rename from Resources/Textures/Mobs/Species/human.rsi/human_head_m.png rename to Resources/Textures/Mobs/Species/Human/parts.rsi/head_m.png diff --git a/Resources/Textures/Mobs/Species/human.rsi/human_l_arm.png b/Resources/Textures/Mobs/Species/Human/parts.rsi/l_arm.png similarity index 100% rename from Resources/Textures/Mobs/Species/human.rsi/human_l_arm.png rename to Resources/Textures/Mobs/Species/Human/parts.rsi/l_arm.png diff --git a/Resources/Textures/Mobs/Species/Human/parts.rsi/l_foot.png b/Resources/Textures/Mobs/Species/Human/parts.rsi/l_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..c448837af238a4f9dcce79ddc7fb56b1b59efd93 GIT binary patch literal 398 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE)2IAwlHkEYZvhvD8gCb z5n0T@pr;JNj1^1m%YcIHC7!;n>`yp&xQ&f#Jl}LNFfdAcx;TbZ+vKC literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/human.rsi/human_l_hand.png b/Resources/Textures/Mobs/Species/Human/parts.rsi/l_hand.png similarity index 100% rename from Resources/Textures/Mobs/Species/human.rsi/human_l_hand.png rename to Resources/Textures/Mobs/Species/Human/parts.rsi/l_hand.png diff --git a/Resources/Textures/Mobs/Species/Human/parts.rsi/l_leg.png b/Resources/Textures/Mobs/Species/Human/parts.rsi/l_leg.png new file mode 100644 index 0000000000000000000000000000000000000000..b3ce27ba862cd732dd30ee70688b6ab071e3a10d GIT binary patch literal 6361 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/Human/parts.rsi/meta.json b/Resources/Textures/Mobs/Species/Human/parts.rsi/meta.json new file mode 100644 index 0000000000..33281d6f3e --- /dev/null +++ b/Resources/Textures/Mobs/Species/Human/parts.rsi/meta.json @@ -0,0 +1,236 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/tgstation/tgstation/blob/8024397cc81c5f47f74cf4279e35728487d0a1a7/icons/mob/human_parts_greyscale.dmi and modified by DrSmugleaf", + "states": [ + { + "name": "full", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "head_f", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "head_m", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "l_arm", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "l_foot", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "l_hand", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "l_leg", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "r_arm", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "r_foot", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "r_hand", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "r_leg", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "torso_f", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "torso_m", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + } + ] +} diff --git a/Resources/Textures/Mobs/Species/human.rsi/human_r_arm.png b/Resources/Textures/Mobs/Species/Human/parts.rsi/r_arm.png similarity index 100% rename from Resources/Textures/Mobs/Species/human.rsi/human_r_arm.png rename to Resources/Textures/Mobs/Species/Human/parts.rsi/r_arm.png diff --git a/Resources/Textures/Mobs/Species/Human/parts.rsi/r_foot.png b/Resources/Textures/Mobs/Species/Human/parts.rsi/r_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..8d51a591a454f47a7336b4d8457b511d9a242d57 GIT binary patch literal 398 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE)2IAwlHkEYZvhvD8gCb z5n0T@pr;JNj1^1m%YcIHC7!;n>`yp&xJ}qnckjz%U|^K?ba4!+xb^n-#;ijDBF8?y z_j;lBLcl7G!+b&i1kLIbr>EIDsJn01a+8%g>X^A*Z@IVC6s04#C%Jw4zl~>l@sGRC zMt7vc?d>y9NM=4@1loZg)E!Zosjuz*>Cmj_c1I@dF^CU~x4nBM{K~ct{nc^rpWH56 zemqCb)9PCG%s%&eVQc4n?Q=o3bMBW$>|wdiKd<5Gv(QN*=__aLW{!=W0dz>$<}cCm l3kw_fpa1{7w$Xm=Urzs9=9On}eUJy)=jrO_vd$@?2>`*Fj9LHy literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/human.rsi/human_r_hand.png b/Resources/Textures/Mobs/Species/Human/parts.rsi/r_hand.png similarity index 100% rename from Resources/Textures/Mobs/Species/human.rsi/human_r_hand.png rename to Resources/Textures/Mobs/Species/Human/parts.rsi/r_hand.png diff --git a/Resources/Textures/Mobs/Species/Human/parts.rsi/r_leg.png b/Resources/Textures/Mobs/Species/Human/parts.rsi/r_leg.png new file mode 100644 index 0000000000000000000000000000000000000000..67917397a1e5bec83352b90b0e214c940d42832d GIT binary patch literal 6343 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 diff --git a/Resources/Textures/Mobs/Species/human.rsi/human_r_leg.png b/Resources/Textures/Mobs/Species/human.rsi/human_r_leg.png deleted file mode 100644 index 941b96e032ebaea72e0063ca9185840c2ba7e397..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 349 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU{vvRaSW-L^Y+$WzrzM1Z4a59 z0;h+q?7E`up<1Q=Cnkr(I@q?5nU7~p$d(CyXNx3Oc?c?8y^-0o==;suKQE;x9du^_ z8U_Y`j*0DDwd$Su)LTl|Z&bSQ&9uvXIrrrsk%dVf%aYd@H)|x6Sbn#&?qG5XaCpP8 z(Ng?F{Jvku|Cl~+eSP80uWR~&{;NJkKI_&Nw0shK=g!=nbBeVbT$a@A_})`iwSM*S z8-g&4By^&m?7AOvtK(zVm8 za~3d7dKodvQ%dI0>vx{7_KICTX0A};FiW@kzU&6qb(!1Vd_FawvB&V%wQ$a}@7E{x saPGQYY5!pN&EHnH&N=+P7x`d~zOv=)H;Y(w4}l!u>FVdQ&MBb@0N4SYvH$=8 diff --git a/Resources/Textures/Mobs/Species/human.rsi/meta.json b/Resources/Textures/Mobs/Species/human.rsi/meta.json deleted file mode 100644 index 99a7d1ab13..0000000000 --- a/Resources/Textures/Mobs/Species/human.rsi/meta.json +++ /dev/null @@ -1 +0,0 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "states": [{"name": "human_basic", "directions": 1, "delays": [[1.0]]}, {"name": "human_chest_f", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "human_chest_m", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "human_head_f", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "human_head_m", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "human_l_arm", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "human_l_hand", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "human_l_leg", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "human_r_arm", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "human_r_hand", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "human_r_leg", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}]} \ No newline at end of file diff --git a/SpaceStation14.sln.DotSettings b/SpaceStation14.sln.DotSettings index 14abc1df09..9a0e2799ef 100644 --- a/SpaceStation14.sln.DotSettings +++ b/SpaceStation14.sln.DotSettings @@ -52,6 +52,7 @@ True True True + True True True True @@ -59,6 +60,7 @@ True True True + True True True True @@ -68,9 +70,11 @@ True True True + True True True True + True True True True @@ -79,7 +83,7 @@ True True True + True True True True - \ No newline at end of file From 0e6f55a23db07b0a188e6d54a322957ba0d2781e Mon Sep 17 00:00:00 2001 From: Clement-O Date: Mon, 17 Aug 2020 14:45:02 +0200 Subject: [PATCH 31/81] Added character limit for chat (#1586) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added character limit for chat * Changed buffer reading from Int16 to Int32 Co-authored-by: Clément --- Content.Client/Chat/ChatBox.cs | 10 ++- Content.Client/Chat/ChatManager.cs | 35 +++++++++- Content.Server/Chat/ChatManager.cs | 70 ++++++++++++++++++- .../Chat/ChatMaxMsgLengthMessage.cs | 39 +++++++++++ 4 files changed, 151 insertions(+), 3 deletions(-) create mode 100644 Content.Shared/Chat/ChatMaxMsgLengthMessage.cs diff --git a/Content.Client/Chat/ChatBox.cs b/Content.Client/Chat/ChatBox.cs index eb37c86703..dbe24f1d76 100644 --- a/Content.Client/Chat/ChatBox.cs +++ b/Content.Client/Chat/ChatBox.cs @@ -35,6 +35,8 @@ namespace Content.Client.Chat public bool ReleaseFocusOnEnter { get; set; } = true; + public bool ClearOnEnter { get; set; } = true; + public ChatBox() { /*MarginLeft = -475.0f; @@ -166,12 +168,18 @@ namespace Content.Client.Chat private void Input_OnTextEntered(LineEdit.LineEditEventArgs args) { + // We set it there to true so it's set to false by TextSubmitted.Invoke if necessary + ClearOnEnter = true; + if (!string.IsNullOrWhiteSpace(args.Text)) { TextSubmitted?.Invoke(this, args.Text); } - Input.Clear(); + if (ClearOnEnter) + { + Input.Clear(); + } if (ReleaseFocusOnEnter) { diff --git a/Content.Client/Chat/ChatManager.cs b/Content.Client/Chat/ChatManager.cs index 21be7769ae..61dbdc28f1 100644 --- a/Content.Client/Chat/ChatManager.cs +++ b/Content.Client/Chat/ChatManager.cs @@ -1,17 +1,21 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using Content.Client.Interfaces.Chat; using Content.Shared.Chat; using Robust.Client.Console; using Robust.Client.Interfaces.Graphics.ClientEye; using Robust.Client.Interfaces.UserInterface; +using Robust.Client.Player; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Shared.GameObjects; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.Network; using Robust.Shared.IoC; +using Robust.Shared.Localization; using Robust.Shared.Log; using Robust.Shared.Maths; +using Robust.Shared.Network; using Robust.Shared.Timing; using Robust.Shared.Utility; @@ -45,6 +49,11 @@ namespace Content.Client.Chat ///

internal sealed class ChatManager : IChatManager { + /// + /// The maximum length a player-sent message can be sent + /// + public int MaxMessageLength = 1000; + private const int VoiceRange = 7; // how far voice goes in world units + /// + /// The message displayed to the player when it exceeds the chat character limit + /// + private const string MaxLengthExceededMessage = "Your message exceeded {0} character limit"; + #pragma warning disable 649 [Dependency] private readonly IEntitySystemManager _entitySystemManager; [Dependency] private readonly IServerNetManager _netManager; @@ -33,6 +45,12 @@ namespace Content.Server.Chat public void Initialize() { _netManager.RegisterNetMessage(MsgChatMessage.NAME); + _netManager.RegisterNetMessage(ChatMaxMsgLengthMessage.NAME, _onMaxLengthRequest); + + // Tell all the connected players the chat's character limit + var msg = _netManager.CreateNetMessage(); + msg.MaxMessageLength = MaxMessageLength; + _netManager.ServerSendToAll(msg); } public void DispatchServerAnnouncement(string message) @@ -69,6 +87,17 @@ namespace Content.Server.Chat return; } + // Get entity's PlayerSession + IPlayerSession playerSession = source.GetComponent().playerSession; + + // Check if message exceeds the character limit if the sender is a player + if (playerSession != null) + if (message.Length > MaxMessageLength) + { + DispatchServerMessage(playerSession, Loc.GetString(MaxLengthExceededMessage, MaxMessageLength)); + return; + } + var pos = source.Transform.GridPosition; var clients = _playerManager.GetPlayersInRange(pos, VoiceRange).Select(p => p.ConnectedClient); @@ -90,6 +119,17 @@ namespace Content.Server.Chat return; } + // Check if entity is a player + IPlayerSession playerSession = source.GetComponent().playerSession; + + // Check if message exceeds the character limit + if (playerSession != null) + if (action.Length > MaxMessageLength) + { + DispatchServerMessage(playerSession, Loc.GetString(MaxLengthExceededMessage, MaxMessageLength)); + return; + } + var pos = source.Transform.GridPosition; var clients = _playerManager.GetPlayersInRange(pos, VoiceRange).Select(p => p.ConnectedClient); @@ -103,6 +143,13 @@ namespace Content.Server.Chat public void SendOOC(IPlayerSession player, string message) { + // Check if message exceeds the character limi + if (message.Length > MaxMessageLength) + { + DispatchServerMessage(player, Loc.GetString(MaxLengthExceededMessage, MaxMessageLength)); + return; + } + var msg = _netManager.CreateNetMessage(); msg.Channel = ChatChannel.OOC; msg.Message = message; @@ -114,6 +161,13 @@ namespace Content.Server.Chat public void SendDeadChat(IPlayerSession player, string message) { + // Check if message exceeds the character limit + if (message.Length > MaxMessageLength) + { + DispatchServerMessage(player, Loc.GetString(MaxLengthExceededMessage, MaxMessageLength)); + return; + } + var clients = _playerManager.GetPlayersBy(x => x.AttachedEntity != null && x.AttachedEntity.HasComponent()).Select(p => p.ConnectedClient);; var msg = _netManager.CreateNetMessage(); @@ -126,7 +180,14 @@ namespace Content.Server.Chat public void SendAdminChat(IPlayerSession player, string message) { - if(!_conGroupController.CanCommand(player, "asay")) + // Check if message exceeds the character limit + if (message.Length > MaxMessageLength) + { + DispatchServerMessage(player, Loc.GetString(MaxLengthExceededMessage, MaxMessageLength)); + return; + } + + if (!_conGroupController.CanCommand(player, "asay")) { SendOOC(player, message); return; @@ -149,5 +210,12 @@ namespace Content.Server.Chat msg.MessageWrap = $"OOC: (D){sender}: {{0}}"; _netManager.ServerSendToAll(msg); } + + private void _onMaxLengthRequest(ChatMaxMsgLengthMessage msg) + { + var response = _netManager.CreateNetMessage(); + response.MaxMessageLength = MaxMessageLength; + _netManager.ServerSendMessage(response, msg.MsgChannel); + } } } diff --git a/Content.Shared/Chat/ChatMaxMsgLengthMessage.cs b/Content.Shared/Chat/ChatMaxMsgLengthMessage.cs new file mode 100644 index 0000000000..6e183ebca6 --- /dev/null +++ b/Content.Shared/Chat/ChatMaxMsgLengthMessage.cs @@ -0,0 +1,39 @@ +using Lidgren.Network; +using Robust.Shared.Interfaces.Network; +using Robust.Shared.Network; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Content.Shared.Chat +{ + /// + /// This message is sent by the server to let clients know what is the chat's character limit for this server. + /// It is first sent by the client as a request + /// + public sealed class ChatMaxMsgLengthMessage : NetMessage + { + #region REQUIRED + + public const MsgGroups GROUP = MsgGroups.Command; + public const string NAME = nameof(ChatMaxMsgLengthMessage); + public ChatMaxMsgLengthMessage(INetChannel channel) : base(NAME, GROUP) { } + + #endregion + + /// + /// The max length a player-sent message can get + /// + public int MaxMessageLength { get; set; } + + public override void ReadFromBuffer(NetIncomingMessage buffer) + { + MaxMessageLength = buffer.ReadInt32(); + } + + public override void WriteToBuffer(NetOutgoingMessage buffer) + { + buffer.Write(MaxMessageLength); + } + } +} From f54ba4b6d574074f396f5cb12d3c625cd67933cf Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Tue, 18 Aug 2020 00:12:21 +1000 Subject: [PATCH 32/81] Gas overlay chunking (#1678) Co-authored-by: Metal Gear Sloth --- Content.Client/Atmos/GasTileOverlay.cs | 7 +- .../Components/Atmos/CanSeeGasesComponent.cs | 35 -- .../EntitySystems/GasTileOverlaySystem.cs | 111 ++-- Content.Server/Atmos/Hotspot.cs | 2 +- Content.Server/Atmos/TileAtmosphere.cs | 3 +- .../Atmos/GasTileOverlaySystem.cs | 475 ++++++++++++++++++ .../EntitySystems/GasTileOverlaySystem.cs | 145 ------ Content.Server/GameTicking/GameTicker.cs | 4 +- Content.Server/IgnoredComponents.cs | 1 - Content.Shared/Atmos/Atmospherics.cs | 17 +- Content.Shared/Atmos/GasPrototype.cs | 17 - .../EntitySystems/Atmos/GasOverlayChunk.cs | 103 ++++ .../Atmos/SharedGasTileOverlaySystem.cs | 98 ++++ .../SharedGasTileOverlaySystem.cs | 72 --- .../Entities/Mobs/Player/observer.yml | 1 - .../Entities/Mobs/Species/human.yml | 1 - 16 files changed, 786 insertions(+), 306 deletions(-) delete mode 100644 Content.Client/GameObjects/Components/Atmos/CanSeeGasesComponent.cs create mode 100644 Content.Server/GameObjects/EntitySystems/Atmos/GasTileOverlaySystem.cs delete mode 100644 Content.Server/GameObjects/EntitySystems/GasTileOverlaySystem.cs create mode 100644 Content.Shared/GameObjects/EntitySystems/Atmos/GasOverlayChunk.cs create mode 100644 Content.Shared/GameObjects/EntitySystems/Atmos/SharedGasTileOverlaySystem.cs delete mode 100644 Content.Shared/GameObjects/EntitySystems/SharedGasTileOverlaySystem.cs diff --git a/Content.Client/Atmos/GasTileOverlay.cs b/Content.Client/Atmos/GasTileOverlay.cs index 8f852d0ed1..16a55249e4 100644 --- a/Content.Client/Atmos/GasTileOverlay.cs +++ b/Content.Client/Atmos/GasTileOverlay.cs @@ -40,7 +40,12 @@ namespace Content.Client.Atmos foreach (var mapGrid in _mapManager.FindGridsIntersecting(mapId, worldBounds)) { - foreach (var tile in mapGrid.GetTilesIntersecting(worldBounds)) + if (!_gasTileOverlaySystem.HasData(mapGrid.Index)) + continue; + + var gridBounds = new Box2(mapGrid.WorldToLocal(worldBounds.BottomLeft), mapGrid.WorldToLocal(worldBounds.TopRight)); + + foreach (var tile in mapGrid.GetTilesIntersecting(gridBounds)) { foreach (var (texture, color) in _gasTileOverlaySystem.GetOverlays(mapGrid.Index, tile.GridIndices)) { diff --git a/Content.Client/GameObjects/Components/Atmos/CanSeeGasesComponent.cs b/Content.Client/GameObjects/Components/Atmos/CanSeeGasesComponent.cs deleted file mode 100644 index d95748f72b..0000000000 --- a/Content.Client/GameObjects/Components/Atmos/CanSeeGasesComponent.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Content.Client.Atmos; -using Robust.Client.GameObjects; -using Robust.Client.Interfaces.Graphics.Overlays; -using Robust.Shared.GameObjects; -using Robust.Shared.Interfaces.GameObjects; -using Robust.Shared.IoC; - -namespace Content.Client.GameObjects.Components.Atmos -{ - [RegisterComponent] - public class CanSeeGasesComponent : Component - { - [Dependency] private readonly IOverlayManager _overlayManager = default!; - - public override string Name => "CanSeeGases"; - - public override void HandleMessage(ComponentMessage message, IComponent component) - { - base.HandleMessage(message, component); - - switch (message) - { - case PlayerAttachedMsg _: - if(!_overlayManager.HasOverlay(nameof(GasTileOverlay))) - _overlayManager.AddOverlay(new GasTileOverlay()); - break; - - case PlayerDetachedMsg _: - if(!_overlayManager.HasOverlay(nameof(GasTileOverlay))) - _overlayManager.RemoveOverlay(nameof(GasTileOverlay)); - break; - } - } - } -} diff --git a/Content.Client/GameObjects/EntitySystems/GasTileOverlaySystem.cs b/Content.Client/GameObjects/EntitySystems/GasTileOverlaySystem.cs index a3eeadd0d3..253563f527 100644 --- a/Content.Client/GameObjects/EntitySystems/GasTileOverlaySystem.cs +++ b/Content.Client/GameObjects/EntitySystems/GasTileOverlaySystem.cs @@ -1,13 +1,19 @@ -using System; +#nullable enable +using System; using System.Collections.Generic; +using Content.Client.Atmos; +using Content.Client.GameObjects.Components.Atmos; using Content.Shared.Atmos; -using Content.Shared.GameObjects.EntitySystems; +using Content.Shared.GameObjects.EntitySystems.Atmos; using JetBrains.Annotations; +using Robust.Client.GameObjects; +using Robust.Client.GameObjects.EntitySystems; using Robust.Client.Graphics; +using Robust.Client.Interfaces.Graphics.Overlays; using Robust.Client.Interfaces.ResourceManagement; using Robust.Client.ResourceManagement; using Robust.Client.Utility; -using Robust.Shared.GameObjects; +using Robust.Shared.Interfaces.Map; using Robust.Shared.IoC; using Robust.Shared.Map; using Robust.Shared.Maths; @@ -16,8 +22,9 @@ using Robust.Shared.Utility; namespace Content.Client.GameObjects.EntitySystems { [UsedImplicitly] - public sealed class GasTileOverlaySystem : SharedGasTileOverlaySystem + internal sealed class GasTileOverlaySystem : SharedGasTileOverlaySystem { + [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly IResourceCache _resourceCache = default!; private readonly Dictionary _fireCache = new Dictionary(); @@ -36,19 +43,20 @@ namespace Content.Client.GameObjects.EntitySystems private readonly float[][] _fireFrameDelays = new float[FireStates][]; private readonly int[] _fireFrameCounter = new int[FireStates]; private readonly Texture[][] _fireFrames = new Texture[FireStates][]; - - private Dictionary> _overlay = new Dictionary>(); + + private Dictionary> _tileData = + new Dictionary>(); public override void Initialize() { base.Initialize(); - - SubscribeNetworkEvent(new EntityEventHandler(OnTileOverlayMessage)); + SubscribeNetworkEvent(HandleGasOverlayMessage); + _mapManager.OnGridRemoved += OnGridRemoved; for (var i = 0; i < Atmospherics.TotalNumberOfGases; i++) { - var gas = Atmospherics.GetGas(i); - switch (gas.GasOverlay) + var overlay = Atmospherics.GetOverlay(i); + switch (overlay) { case SpriteSpecifier.Rsi animated: var rsi = _resourceCache.GetResource(animated.RsiPath).RSI; @@ -82,13 +90,77 @@ namespace Content.Client.GameObjects.EntitySystems _fireFrameDelays[i] = state.GetDelays(); _fireFrameCounter[i] = 0; } + + var overlayManager = IoCManager.Resolve(); + if(!overlayManager.HasOverlay(nameof(GasTileOverlay))) + overlayManager.AddOverlay(new GasTileOverlay()); + } + + private void HandleGasOverlayMessage(GasOverlayMessage message) + { + foreach (var (indices, data) in message.OverlayData) + { + var chunk = GetOrCreateChunk(message.GridId, indices); + chunk.Update(data, indices); + } + } + + // Slightly different to the server-side system version + private GasOverlayChunk GetOrCreateChunk(GridId gridId, MapIndices indices) + { + if (!_tileData.TryGetValue(gridId, out var chunks)) + { + chunks = new Dictionary(); + _tileData[gridId] = chunks; + } + + var chunkIndices = GetGasChunkIndices(indices); + + if (!chunks.TryGetValue(chunkIndices, out var chunk)) + { + chunk = new GasOverlayChunk(gridId, chunkIndices); + chunks[chunkIndices] = chunk; + } + + return chunk; + } + + public override void Shutdown() + { + base.Shutdown(); + _mapManager.OnGridRemoved -= OnGridRemoved; + var overlayManager = IoCManager.Resolve(); + if(!overlayManager.HasOverlay(nameof(GasTileOverlay))) + overlayManager.RemoveOverlay(nameof(GasTileOverlay)); + } + + private void OnGridRemoved(GridId gridId) + { + if (_tileData.ContainsKey(gridId)) + { + _tileData.Remove(gridId); + } + } + + public bool HasData(GridId gridId) + { + return _tileData.ContainsKey(gridId); } public (Texture, Color color)[] GetOverlays(GridId gridIndex, MapIndices indices) { - if (!_overlay.TryGetValue(gridIndex, out var tiles) || !tiles.TryGetValue(indices, out var overlays)) + if (!_tileData.TryGetValue(gridIndex, out var chunks)) return Array.Empty<(Texture, Color)>(); + + var chunkIndex = GetGasChunkIndices(indices); + if (!chunks.TryGetValue(chunkIndex, out var chunk)) + return Array.Empty<(Texture, Color)>(); + + var overlays = chunk.GetData(indices); + if (overlays.Gas == null) + return Array.Empty<(Texture, Color)>(); + var fire = overlays.FireState != 0; var length = overlays.Gas.Length + (fire ? 1 : 0); @@ -112,23 +184,6 @@ namespace Content.Client.GameObjects.EntitySystems return list; } - private void OnTileOverlayMessage(GasTileOverlayMessage ev) - { - if(ev.ClearAllOtherOverlays) - _overlay.Clear(); - - foreach (var data in ev.OverlayData) - { - if (!_overlay.TryGetValue(data.GridIndex, out var gridOverlays)) - { - gridOverlays = new Dictionary(); - _overlay.Add(data.GridIndex, gridOverlays); - } - - gridOverlays[data.GridIndices] = data.Data; - } - } - public override void FrameUpdate(float frameTime) { base.FrameUpdate(frameTime); diff --git a/Content.Server/Atmos/Hotspot.cs b/Content.Server/Atmos/Hotspot.cs index 2178a6bea8..4597813c6f 100644 --- a/Content.Server/Atmos/Hotspot.cs +++ b/Content.Server/Atmos/Hotspot.cs @@ -23,7 +23,7 @@ namespace Content.Server.Atmos /// State for the fire sprite. ///
[ViewVariables] - public int State; + public byte State; public void Start() { diff --git a/Content.Server/Atmos/TileAtmosphere.cs b/Content.Server/Atmos/TileAtmosphere.cs index cddfc3ee96..b1ad2df3cf 100644 --- a/Content.Server/Atmos/TileAtmosphere.cs +++ b/Content.Server/Atmos/TileAtmosphere.cs @@ -5,6 +5,7 @@ using System.Runtime.CompilerServices; using Content.Server.Atmos.Reactions; using Content.Server.GameObjects.Components.Atmos; using Content.Server.GameObjects.EntitySystems; +using Content.Server.GameObjects.EntitySystems.Atmos; using Content.Server.Interfaces; using Content.Shared.Atmos; using Content.Shared.Audio; @@ -745,7 +746,7 @@ namespace Content.Server.Atmos } else { - Hotspot.State = Hotspot.Volume > Atmospherics.CellVolume * 0.4f ? 2 : 1; + Hotspot.State = (byte) (Hotspot.Volume > Atmospherics.CellVolume * 0.4f ? 2 : 1); } if (Hotspot.Temperature > MaxFireTemperatureSustained) diff --git a/Content.Server/GameObjects/EntitySystems/Atmos/GasTileOverlaySystem.cs b/Content.Server/GameObjects/EntitySystems/Atmos/GasTileOverlaySystem.cs new file mode 100644 index 0000000000..456bb14293 --- /dev/null +++ b/Content.Server/GameObjects/EntitySystems/Atmos/GasTileOverlaySystem.cs @@ -0,0 +1,475 @@ +#nullable enable +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using Content.Server.GameObjects.Components.Atmos; +using Content.Server.Interfaces.GameTicking; +using Content.Shared.Atmos; +using Content.Shared.GameObjects.EntitySystems.Atmos; +using JetBrains.Annotations; +using Robust.Server.Interfaces.Player; +using Robust.Server.Player; +using Robust.Shared.Enums; +using Robust.Shared.Interfaces.Configuration; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.Map; +using Robust.Shared.Interfaces.Timing; +using Robust.Shared.IoC; +using Robust.Shared.Log; +using Robust.Shared.Map; +using Robust.Shared.Maths; +using Robust.Shared.Timing; + +namespace Content.Server.GameObjects.EntitySystems.Atmos +{ + [UsedImplicitly] + internal sealed class GasTileOverlaySystem : SharedGasTileOverlaySystem + { + [Robust.Shared.IoC.Dependency] private readonly IGameTiming _gameTiming = default!; + [Robust.Shared.IoC.Dependency] private readonly IPlayerManager _playerManager = default!; + [Robust.Shared.IoC.Dependency] private readonly IMapManager _mapManager = default!; + [Robust.Shared.IoC.Dependency] private readonly IConfigurationManager _configManager = default!; + + /// + /// The tiles that have had their atmos data updated since last tick + /// + private Dictionary> _invalidTiles = new Dictionary>(); + + private Dictionary _knownPlayerChunks = + new Dictionary(); + + /// + /// Gas data stored in chunks to make PVS / bubbling easier. + /// + private Dictionary> _overlay = + new Dictionary>(); + + /// + /// How far away do we update gas overlays (minimum; due to chunking further away tiles may also be updated). + /// + private float _updateRange; + // Because the gas overlay updates aren't run every tick we need to avoid the pop-in that might occur with + // the regular PVS range. + private const float RangeOffset = 6.0f; + + /// + /// Overlay update ticks per second. + /// + private float _updateCooldown; + + public override void Initialize() + { + base.Initialize(); + + _playerManager.PlayerStatusChanged += OnPlayerStatusChanged; + _mapManager.OnGridRemoved += OnGridRemoved; + _configManager.RegisterCVar("net.gasoverlaytickrate", 3.0f); + } + + public override void Shutdown() + { + base.Shutdown(); + _playerManager.PlayerStatusChanged -= OnPlayerStatusChanged; + _mapManager.OnGridRemoved -= OnGridRemoved; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Invalidate(GridId gridIndex, MapIndices indices) + { + if (!_invalidTiles.TryGetValue(gridIndex, out var existing)) + { + existing = new HashSet(); + _invalidTiles[gridIndex] = existing; + } + + existing.Add(indices); + } + + private GasOverlayChunk GetOrCreateChunk(GridId gridIndex, MapIndices indices) + { + if (!_overlay.TryGetValue(gridIndex, out var chunks)) + { + chunks = new Dictionary(); + _overlay[gridIndex] = chunks; + } + + var chunkIndices = GetGasChunkIndices(indices); + + if (!chunks.TryGetValue(chunkIndices, out var chunk)) + { + chunk = new GasOverlayChunk(gridIndex, chunkIndices); + chunks[chunkIndices] = chunk; + } + + return chunk; + } + + private void OnGridRemoved(GridId gridId) + { + if (_overlay.ContainsKey(gridId)) + { + _overlay.Remove(gridId); + } + } + + public void ResettingCleanup() + { + _invalidTiles.Clear(); + _overlay.Clear(); + + foreach (var (_, data) in _knownPlayerChunks) + { + data.Reset(); + } + } + + private void OnPlayerStatusChanged(object? sender, SessionStatusEventArgs e) + { + if (e.NewStatus != SessionStatus.InGame) + { + if (_knownPlayerChunks.ContainsKey(e.Session)) + { + _knownPlayerChunks.Remove(e.Session); + } + + return; + } + + if (!_knownPlayerChunks.ContainsKey(e.Session)) + { + _knownPlayerChunks[e.Session] = new PlayerGasOverlay(); + } + } + + /// + /// Checks whether the overlay-relevant data for a gas tile has been updated. + /// + /// + /// + /// + /// + /// true if updated + private bool TryRefreshTile(GridAtmosphereComponent gam, GasOverlayData oldTile, MapIndices indices, out GasOverlayData overlayData) + { + var tile = gam.GetTile(indices); + var tileData = new List(); + + for (byte i = 0; i < Atmospherics.TotalNumberOfGases; i++) + { + var gas = Atmospherics.GetGas(i); + var overlay = Atmospherics.GetOverlay(i); + if (overlay == null || tile.Air == null) continue; + + var moles = tile.Air.Gases[i]; + + if (moles < gas.GasMolesVisible) continue; + + var data = new GasData(i, (byte) (FloatMath.Clamp01(moles / gas.GasMolesVisibleMax) * 255)); + tileData.Add(data); + } + + overlayData = new GasOverlayData(tile.Hotspot.State, tile.Hotspot.Temperature, tileData.Count == 0 ? null : tileData.ToArray()); + + if (overlayData.Equals(oldTile)) + { + return false; + } + + return true; + } + + /// + /// Get every chunk in range of our entity that exists, including on other grids. + /// + /// + /// + private List GetChunksInRange(IEntity entity) + { + var inRange = new List(); + + // This is the max in any direction that we can get a chunk (e.g. max 2 chunks away of data). + var (maxXDiff, maxYDiff) = ((int) (_updateRange / ChunkSize) + 1, (int) (_updateRange / ChunkSize) + 1); + + var worldBounds = Box2.CenteredAround(entity.Transform.WorldPosition, + new Vector2(_updateRange, _updateRange)); + + foreach (var grid in _mapManager.FindGridsIntersecting(entity.Transform.MapID, worldBounds)) + { + if (!_overlay.TryGetValue(grid.Index, out var chunks)) + { + continue; + } + + var entityTile = grid.GetTileRef(entity.Transform.GridPosition).GridIndices; + + for (var x = -maxXDiff; x <= maxXDiff; x++) + { + for (var y = -maxYDiff; y <= maxYDiff; y++) + { + var chunkIndices = GetGasChunkIndices(new MapIndices(entityTile.X + x * ChunkSize, entityTile.Y + y * ChunkSize)); + + if (!chunks.TryGetValue(chunkIndices, out var chunk)) continue; + + // Now we'll check if it's in range and relevant for us + // (e.g. if we're on the very edge of a chunk we may need more chunks). + + var (xDiff, yDiff) = (chunkIndices.X - entityTile.X, chunkIndices.Y - entityTile.Y); + if (xDiff > 0 && xDiff > _updateRange || + yDiff > 0 && yDiff > _updateRange || + xDiff < 0 && Math.Abs(xDiff + ChunkSize) > _updateRange || + yDiff < 0 && Math.Abs(yDiff + ChunkSize) > _updateRange) continue; + + inRange.Add(chunk); + } + } + } + + return inRange; + } + + public override void Update(float frameTime) + { + AccumulatedFrameTime += frameTime; + _updateCooldown = 1 / _configManager.GetCVar("net.gasoverlaytickrate"); + + if (AccumulatedFrameTime < _updateCooldown) + { + return; + } + + _updateRange = _configManager.GetCVar("net.maxupdaterange") + RangeOffset; + + // TODO: So in the worst case scenario we still have to send a LOT of tile data per tick if there's a fire. + // If we go with say 15 tile radius then we have up to 900 tiles to update per tick. + // In a saltern fire the worst you'll normally see is around 650 at the moment. + // Need a way to fake this more because sending almost 2,000 tile updates per second to even 50 players is... yikes + // I mean that's as big as it gets so larger maps will have the same but still, that's a lot of data. + + // Some ways to do this are potentially: splitting fire and gas update data so they don't update at the same time + // (gives the illusion of more updates happening), e.g. if gas updates are 3 times a second and fires are 1.6 times a second or something. + // Could also look at updating tiles close to us more frequently (e.g. within 1 chunk every tick). + // Stuff just out of our viewport we need so when we move it doesn't pop in but it doesn't mean we need to update it every tick. + + AccumulatedFrameTime -= _updateCooldown; + + var gridAtmosComponents = new Dictionary(); + var updatedTiles = new Dictionary>(); + + // So up to this point we've been caching the updated tiles for multiple ticks. + // Now we'll go through and check whether the update actually matters for the overlay or not, + // and if not then we won't bother sending the data. + foreach (var (gridId, indices) in _invalidTiles) + { + var gridEntityId = _mapManager.GetGrid(gridId).GridEntityId; + + if (!EntityManager.GetEntity(gridEntityId).TryGetComponent(out GridAtmosphereComponent gam)) + { + continue; + } + + // If it's being invalidated it should have this right? + // At any rate we'll cache it for here + the AddChunk + if (!gridAtmosComponents.ContainsKey(gridId)) + { + gridAtmosComponents[gridId] = gam; + } + + foreach (var invalid in indices) + { + var chunk = GetOrCreateChunk(gridId, invalid); + + if (!TryRefreshTile(gam, chunk.GetData(invalid), invalid, out var data)) continue; + + if (!updatedTiles.TryGetValue(chunk, out var tiles)) + { + tiles = new HashSet(); + updatedTiles[chunk] = tiles; + } + + updatedTiles[chunk].Add(invalid); + chunk.Update(data, invalid); + } + } + + var currentTick = _gameTiming.CurTick; + + // Set the LastUpdate for chunks. + foreach (var (chunk, _) in updatedTiles) + { + chunk.Dirty(currentTick); + } + + // Now we'll go through each player, then through each chunk in range of that player checking if the player is still in range + // If they are, check if they need the new data to send (i.e. if there's an overlay for the gas). + // Afterwards we reset all the chunk data for the next time we tick. + foreach (var (session, overlay) in _knownPlayerChunks) + { + if (session.AttachedEntity == null) continue; + + // Get chunks in range and update if we've moved around or the chunks have new overlay data + var chunksInRange = GetChunksInRange(session.AttachedEntity); + var knownChunks = overlay.GetKnownChunks(); + var chunksToRemove = new List(); + var chunksToAdd = new List(); + + foreach (var chunk in chunksInRange) + { + if (!knownChunks.Contains(chunk)) + { + chunksToAdd.Add(chunk); + } + } + + foreach (var chunk in knownChunks) + { + if (!chunksInRange.Contains(chunk)) + { + chunksToRemove.Add(chunk); + } + } + + foreach (var chunk in chunksToAdd) + { + var message = overlay.AddChunk(currentTick, chunk); + if (message != null) + { + RaiseNetworkEvent(message, session.ConnectedClient); + } + } + + foreach (var chunk in chunksToRemove) + { + overlay.RemoveChunk(chunk); + } + + var clientInvalids = new Dictionary>(); + + // Check for any dirty chunks in range and bundle the data to send to the client. + foreach (var chunk in chunksInRange) + { + if (!updatedTiles.TryGetValue(chunk, out var invalids)) continue; + + if (!clientInvalids.TryGetValue(chunk.GridIndices, out var existingData)) + { + existingData = new List<(MapIndices, GasOverlayData)>(); + clientInvalids[chunk.GridIndices] = existingData; + } + + chunk.GetData(existingData, invalids); + } + + foreach (var (grid, data) in clientInvalids) + { + RaiseNetworkEvent(overlay.UpdateClient(grid, data), session.ConnectedClient); + } + } + + // Cleanup + _invalidTiles.Clear(); + } + private sealed class PlayerGasOverlay + { + private readonly Dictionary> _data = + new Dictionary>(); + + private readonly Dictionary _lastSent = + new Dictionary(); + + public GasOverlayMessage UpdateClient(GridId grid, List<(MapIndices, GasOverlayData)> data) + { + return new GasOverlayMessage(grid, data); + } + + public void Reset() + { + _data.Clear(); + _lastSent.Clear(); + } + + public List GetKnownChunks() + { + var known = new List(); + + foreach (var (_, chunks) in _data) + { + foreach (var (_, chunk) in chunks) + { + known.Add(chunk); + } + } + + return known; + } + + public GasOverlayMessage? AddChunk(GameTick currentTick, GasOverlayChunk chunk) + { + if (!_data.TryGetValue(chunk.GridIndices, out var chunks)) + { + chunks = new Dictionary(); + _data[chunk.GridIndices] = chunks; + } + + if (_lastSent.TryGetValue(chunk, out var last) && last >= chunk.LastUpdate) + { + return null; + } + + _lastSent[chunk] = currentTick; + var message = ChunkToMessage(chunk); + + return message; + } + + public void RemoveChunk(GasOverlayChunk chunk) + { + // Don't need to sync to client as they can manage it themself. + if (!_data.TryGetValue(chunk.GridIndices, out var chunks)) + { + return; + } + + if (chunks.ContainsKey(chunk.MapIndices)) + { + chunks.Remove(chunk.MapIndices); + } + } + + /// + /// Retrieve a whole chunk as a message, only getting the relevant tiles for the gas overlay. + /// + /// + /// + private GasOverlayMessage? ChunkToMessage(GasOverlayChunk chunk) + { + // Chunk data should already be up to date. + // Only send relevant tiles to client. + + var tileData = new List<(MapIndices, GasOverlayData)>(); + + for (var x = 0; x < ChunkSize; x++) + { + for (var y = 0; y < ChunkSize; y++) + { + // TODO: Check could be more robust I think. + var data = chunk.TileData[x, y]; + if ((data.Gas == null || data.Gas.Length == 0) && data.FireState == 0 && data.FireTemperature == 0.0f) + { + continue; + } + + var indices = new MapIndices(chunk.MapIndices.X + x, chunk.MapIndices.Y + y); + tileData.Add((indices, data)); + } + } + + if (tileData.Count == 0) + { + return null; + } + + return new GasOverlayMessage(chunk.GridIndices, tileData); + } + } + } +} diff --git a/Content.Server/GameObjects/EntitySystems/GasTileOverlaySystem.cs b/Content.Server/GameObjects/EntitySystems/GasTileOverlaySystem.cs deleted file mode 100644 index 493ef068ed..0000000000 --- a/Content.Server/GameObjects/EntitySystems/GasTileOverlaySystem.cs +++ /dev/null @@ -1,145 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.CompilerServices; -using Content.Server.GameObjects.Components.Atmos; -using Content.Shared.Atmos; -using Content.Shared.GameObjects.EntitySystems; -using JetBrains.Annotations; -using Robust.Server.Interfaces.Player; -using Robust.Server.Player; -using Robust.Shared.Enums; -using Robust.Shared.Interfaces.GameObjects; -using Robust.Shared.Interfaces.Map; -using Robust.Shared.IoC; -using Robust.Shared.Map; - -namespace Content.Server.GameObjects.EntitySystems -{ - [UsedImplicitly] - public sealed class GasTileOverlaySystem : SharedGasTileOverlaySystem - { - private int _tickTimer = 0; - private HashSet _queue = new HashSet(); - private Dictionary> _invalid = new Dictionary>(); - - private Dictionary> _overlay = - new Dictionary>(); - - [Robust.Shared.IoC.Dependency] private IPlayerManager _playerManager = default!; - - public override void Initialize() - { - base.Initialize(); - - _playerManager.PlayerStatusChanged += OnPlayerStatusChanged; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void Invalidate(GridId gridIndex, MapIndices indices) - { - if (!_invalid.TryGetValue(gridIndex, out var set) || set == null) - { - set = new HashSet(); - _invalid.Add(gridIndex, set); - } - - set.Add(indices); - } - - public void SetTileOverlay(GridId gridIndex, MapIndices indices, GasData[] gasData, int fireState = 0, float fireTemperature = 0f) - { - if(!_overlay.TryGetValue(gridIndex, out var _)) - _overlay[gridIndex] = new Dictionary(); - - _overlay[gridIndex][indices] = new GasOverlayData(fireState, fireTemperature, gasData); - _queue.Add(GetData(gridIndex, indices)); - } - - private void OnPlayerStatusChanged(object sender, SessionStatusEventArgs e) - { - if (e.NewStatus != SessionStatus.InGame) return; - - RaiseNetworkEvent(new GasTileOverlayMessage(GetData(), true), e.Session.ConnectedClient); - } - - private GasTileOverlayData[] GetData() - { - var list = new List(); - - foreach (var (gridId, tiles) in _overlay) - { - foreach (var (indices, _) in tiles) - { - var data = GetData(gridId, indices); - if(data.Data.Gas.Length > 0) - list.Add(data); - } - } - - return list.ToArray(); - } - - private GasTileOverlayData GetData(GridId gridIndex, MapIndices indices) - { - return new GasTileOverlayData(gridIndex, indices, _overlay[gridIndex][indices]); - } - - private void Revalidate() - { - var mapMan = IoCManager.Resolve(); - var entityMan = IoCManager.Resolve(); - var list = new List(); - - foreach (var (gridId, indices) in _invalid) - { - if (!mapMan.GridExists(gridId)) - { - _invalid.Remove(gridId); - return; - } - var grid = entityMan.GetEntity(mapMan.GetGrid(gridId).GridEntityId); - if (!grid.TryGetComponent(out GridAtmosphereComponent gam)) continue; - - foreach (var index in indices) - { - var tile = gam.GetTile(index); - - if (tile?.Air == null) continue; - - list.Clear(); - - for(var i = 0; i < Atmospherics.TotalNumberOfGases; i++) - { - var gas = Atmospherics.GetGas(i); - var overlay = gas.GasOverlay; - if (overlay == null) continue; - var moles = tile.Air.Gases[i]; - if(moles == 0f || moles < gas.GasMolesVisible) continue; - list.Add(new GasData(i, MathF.Max(MathF.Min(1, moles / gas.GasMolesVisibleMax), 0f))); - } - - if (list.Count == 0) continue; - - SetTileOverlay(gridId, index, list.ToArray(), tile.Hotspot.State, tile.Hotspot.Temperature); - } - - indices.Clear(); - } - } - - public override void Update(float frameTime) - { - _tickTimer++; - - Revalidate(); - - if (_tickTimer < 10) return; - - _tickTimer = 0; - if(_queue.Count > 0) - RaiseNetworkEvent(new GasTileOverlayMessage(_queue.ToArray())); - _queue.Clear(); - } - } -} diff --git a/Content.Server/GameTicking/GameTicker.cs b/Content.Server/GameTicking/GameTicker.cs index 42bd24d44c..839844f61f 100644 --- a/Content.Server/GameTicking/GameTicker.cs +++ b/Content.Server/GameTicking/GameTicker.cs @@ -13,6 +13,7 @@ using Content.Server.GameObjects.Components.PDA; using Content.Server.GameObjects.EntitySystems; using Content.Server.GameObjects.EntitySystems.AI.Pathfinding; using Content.Server.GameObjects.EntitySystems.AI.Pathfinding.Accessible; +using Content.Server.GameObjects.EntitySystems.Atmos; using Content.Server.GameObjects.EntitySystems.StationEvents; using Content.Server.GameTicking.GamePresets; using Content.Server.Interfaces; @@ -633,7 +634,8 @@ namespace Content.Server.GameTicking _playerJoinLobby(player); } - + + EntitySystem.Get().ResettingCleanup(); EntitySystem.Get().ResettingCleanup(); EntitySystem.Get().ResettingCleanup(); EntitySystem.Get().ResetLayouts(); diff --git a/Content.Server/IgnoredComponents.cs b/Content.Server/IgnoredComponents.cs index 4aa536c30d..cd9713f35d 100644 --- a/Content.Server/IgnoredComponents.cs +++ b/Content.Server/IgnoredComponents.cs @@ -19,7 +19,6 @@ "Marker", "EmergencyLight", "Clickable", - "CanSeeGases", "RadiatingLight", }; diff --git a/Content.Shared/Atmos/Atmospherics.cs b/Content.Shared/Atmos/Atmospherics.cs index 6872999f85..c39b6b7d5d 100644 --- a/Content.Shared/Atmos/Atmospherics.cs +++ b/Content.Shared/Atmos/Atmospherics.cs @@ -1,6 +1,7 @@ using System.Collections.Generic; using Robust.Shared.IoC; using Robust.Shared.Prototypes; +using Robust.Shared.Utility; namespace Content.Shared.Atmos { @@ -14,10 +15,18 @@ namespace Content.Shared.Atmos var protoMan = IoCManager.Resolve(); GasPrototypes = new GasPrototype[TotalNumberOfGases]; + GasOverlays = new SpriteSpecifier[TotalNumberOfGases]; for (var i = 0; i < TotalNumberOfGases; i++) { - GasPrototypes[i] = protoMan.Index(i.ToString()); + var gasPrototype = protoMan.Index(i.ToString()); + GasPrototypes[i] = gasPrototype; + + if(string.IsNullOrEmpty(gasPrototype.GasOverlaySprite) && !string.IsNullOrEmpty(gasPrototype.GasOverlayTexture)) + GasOverlays[i] = new SpriteSpecifier.Texture(new ResourcePath(gasPrototype.GasOverlayTexture)); + + if(!string.IsNullOrEmpty(gasPrototype.GasOverlaySprite) && !string.IsNullOrEmpty(gasPrototype.GasOverlayState)) + GasOverlays[i] = new SpriteSpecifier.Rsi(new ResourcePath(gasPrototype.GasOverlaySprite), gasPrototype.GasOverlayState); } } @@ -27,6 +36,10 @@ namespace Content.Shared.Atmos public static GasPrototype GetGas(Gas gasId) => GasPrototypes[(int) gasId]; public static IEnumerable Gases => GasPrototypes; + private static readonly SpriteSpecifier[] GasOverlays; + + public static SpriteSpecifier GetOverlay(int overlayId) => GasOverlays[overlayId]; + #region ATMOS /// /// The universal gas constant, in kPa*L/(K*mol) @@ -166,7 +179,7 @@ namespace Content.Shared.Atmos /// /// Total number of gases. Increase this if you want to add more! /// - public const int TotalNumberOfGases = 6; + public const byte TotalNumberOfGases = 6; /// /// Amount of heat released per mole of burnt hydrogen or tritium (hydrogen isotope) diff --git a/Content.Shared/Atmos/GasPrototype.cs b/Content.Shared/Atmos/GasPrototype.cs index 8a71811760..31827d2447 100644 --- a/Content.Shared/Atmos/GasPrototype.cs +++ b/Content.Shared/Atmos/GasPrototype.cs @@ -45,23 +45,6 @@ namespace Content.Shared.Atmos /// public string GasOverlaySprite { get; set; } - /// - /// Sprite specifier for the gas overlay. - /// - public SpriteSpecifier GasOverlay - { - get - { - if(string.IsNullOrEmpty(GasOverlaySprite) && !string.IsNullOrEmpty(GasOverlayTexture)) - return new SpriteSpecifier.Texture(new ResourcePath(GasOverlayTexture)); - - if(!string.IsNullOrEmpty(GasOverlaySprite) && !string.IsNullOrEmpty(GasOverlayState)) - return new SpriteSpecifier.Rsi(new ResourcePath(GasOverlaySprite), GasOverlayState); - - return null; - } - } - /// /// Path to the tile overlay used when this gas appears visible. /// diff --git a/Content.Shared/GameObjects/EntitySystems/Atmos/GasOverlayChunk.cs b/Content.Shared/GameObjects/EntitySystems/Atmos/GasOverlayChunk.cs new file mode 100644 index 0000000000..cc4ce2988c --- /dev/null +++ b/Content.Shared/GameObjects/EntitySystems/Atmos/GasOverlayChunk.cs @@ -0,0 +1,103 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Robust.Shared.Interfaces.Timing; +using Robust.Shared.IoC; +using Robust.Shared.Map; +using Robust.Shared.Timing; +using Robust.Shared.Utility; + +namespace Content.Shared.GameObjects.EntitySystems.Atmos +{ + public sealed class GasOverlayChunk + { + /// + /// Grid for this chunk + /// + public GridId GridIndices { get; } + + /// + /// Origin of this chunk + /// + public MapIndices MapIndices { get; } + + public SharedGasTileOverlaySystem.GasOverlayData[,] TileData = new SharedGasTileOverlaySystem.GasOverlayData[SharedGasTileOverlaySystem.ChunkSize, SharedGasTileOverlaySystem.ChunkSize]; + + public GameTick LastUpdate { get; private set; } + + public GasOverlayChunk(GridId gridIndices, MapIndices mapIndices) + { + GridIndices = gridIndices; + MapIndices = mapIndices; + } + + public void Dirty(GameTick currentTick) + { + LastUpdate = currentTick; + } + + /// + /// Flags Dirty if the data is different. + /// + /// + /// + public void Update(SharedGasTileOverlaySystem.GasOverlayData data, MapIndices indices) + { + DebugTools.Assert(InBounds(indices)); + var (offsetX, offsetY) = (indices.X - MapIndices.X, + indices.Y - MapIndices.Y); + + TileData[offsetX, offsetY] = data; + } + + public void Update(SharedGasTileOverlaySystem.GasOverlayData data, byte x, byte y) + { + DebugTools.Assert(x < SharedGasTileOverlaySystem.ChunkSize && y < SharedGasTileOverlaySystem.ChunkSize); + + TileData[x, y] = data; + } + + public IEnumerable GetAllData() + { + for (var x = 0; x < SharedGasTileOverlaySystem.ChunkSize; x++) + { + for (var y = 0; y < SharedGasTileOverlaySystem.ChunkSize; y++) + { + yield return TileData[x, y]; + } + } + } + + public void GetData(List<(MapIndices, SharedGasTileOverlaySystem.GasOverlayData)> existingData, HashSet indices) + { + foreach (var index in indices) + { + existingData.Add((index, GetData(index))); + } + } + + public IEnumerable GetAllIndices() + { + for (var x = 0; x < SharedGasTileOverlaySystem.ChunkSize; x++) + { + for (var y = 0; y < SharedGasTileOverlaySystem.ChunkSize; y++) + { + yield return new MapIndices(MapIndices.X + x, MapIndices.Y + y); + } + } + } + + public SharedGasTileOverlaySystem.GasOverlayData GetData(MapIndices indices) + { + DebugTools.Assert(InBounds(indices)); + return TileData[indices.X - MapIndices.X, indices.Y - MapIndices.Y]; + } + + private bool InBounds(MapIndices indices) + { + if (indices.X < MapIndices.X || indices.Y < MapIndices.Y) return false; + if (indices.X >= MapIndices.X + SharedGasTileOverlaySystem.ChunkSize || indices.Y >= MapIndices.Y + SharedGasTileOverlaySystem.ChunkSize) return false; + return true; + } + } +} \ No newline at end of file diff --git a/Content.Shared/GameObjects/EntitySystems/Atmos/SharedGasTileOverlaySystem.cs b/Content.Shared/GameObjects/EntitySystems/Atmos/SharedGasTileOverlaySystem.cs new file mode 100644 index 0000000000..6ff74584d0 --- /dev/null +++ b/Content.Shared/GameObjects/EntitySystems/Atmos/SharedGasTileOverlaySystem.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Systems; +using Robust.Shared.Map; +using Robust.Shared.Serialization; +using Robust.Shared.Utility; + +namespace Content.Shared.GameObjects.EntitySystems.Atmos +{ + public abstract class SharedGasTileOverlaySystem : EntitySystem + { + public const byte ChunkSize = 8; + protected float AccumulatedFrameTime; + + public static MapIndices GetGasChunkIndices(MapIndices indices) + { + return new MapIndices((int) Math.Floor((float) indices.X / ChunkSize) * ChunkSize, (int) MathF.Floor((float) indices.Y / ChunkSize) * ChunkSize); + } + + [Serializable, NetSerializable] + public struct GasData + { + public byte Index { get; set; } + public byte Opacity { get; set; } + + public GasData(byte gasId, byte opacity) + { + Index = gasId; + Opacity = opacity; + } + } + + [Serializable, NetSerializable] + public readonly struct GasOverlayData : IEquatable + { + public readonly byte FireState; + public readonly float FireTemperature; + public readonly GasData[] Gas; + + public GasOverlayData(byte fireState, float fireTemperature, GasData[] gas) + { + FireState = fireState; + FireTemperature = fireTemperature; + Gas = gas; + } + + public bool Equals(GasOverlayData other) + { + // TODO: Moony had a suggestion on how to do this faster with the hash + // https://discordapp.com/channels/310555209753690112/310555209753690112/744080145219846204 + // Aside from that I can't really see any low-hanging fruit CPU perf wise. + if (Gas?.Length != other.Gas?.Length) return false; + if (FireState != other.FireState) return false; + if (FireTemperature != other.FireTemperature) return false; + + if (Gas == null) + { + return true; + } + + DebugTools.Assert(other.Gas != null); + + for (var i = 0; i < Gas.Length; i++) + { + var thisGas = Gas[i]; + var otherGas = other.Gas[i]; + + if (!thisGas.Equals(otherGas)) + { + return false; + } + } + + return true; + } + } + + /// + /// Invalid tiles for the gas overlay. + /// No point re-sending every tile if only a subset might have been updated. + /// + [Serializable, NetSerializable] + public sealed class GasOverlayMessage : EntitySystemMessage + { + public GridId GridId { get; } + + public List<(MapIndices, GasOverlayData)> OverlayData { get; } + + public GasOverlayMessage(GridId gridIndices, List<(MapIndices,GasOverlayData)> overlayData) + { + GridId = gridIndices; + OverlayData = overlayData; + } + } + } +} diff --git a/Content.Shared/GameObjects/EntitySystems/SharedGasTileOverlaySystem.cs b/Content.Shared/GameObjects/EntitySystems/SharedGasTileOverlaySystem.cs deleted file mode 100644 index 346f44d733..0000000000 --- a/Content.Shared/GameObjects/EntitySystems/SharedGasTileOverlaySystem.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using Robust.Shared.GameObjects; -using Robust.Shared.GameObjects.Systems; -using Robust.Shared.Map; -using Robust.Shared.Serialization; - -namespace Content.Shared.GameObjects.EntitySystems -{ - public abstract class SharedGasTileOverlaySystem : EntitySystem - { - [Serializable, NetSerializable] - public struct GasData - { - public int Index { get; set; } - public float Opacity { get; set; } - - public GasData(int gasId, float opacity) - { - Index = gasId; - Opacity = opacity; - } - } - - [Serializable, NetSerializable] - public readonly struct GasOverlayData - { - public readonly int FireState; - public readonly float FireTemperature; - public readonly GasData[] Gas; - - public GasOverlayData(int fireState, float fireTemperature, GasData[] gas) - { - FireState = fireState; - FireTemperature = fireTemperature; - Gas = gas; - } - } - - [Serializable, NetSerializable] - public readonly struct GasTileOverlayData - { - public readonly GridId GridIndex; - public readonly MapIndices GridIndices; - public readonly GasOverlayData Data; - - public GasTileOverlayData(GridId gridIndex, MapIndices gridIndices, GasOverlayData data) - { - GridIndex = gridIndex; - GridIndices = gridIndices; - Data = data; - } - - public override int GetHashCode() - { - return GridIndex.GetHashCode() ^ GridIndices.GetHashCode() ^ Data.GetHashCode(); - } - } - - [Serializable, NetSerializable] - public class GasTileOverlayMessage : EntitySystemMessage - { - public GasTileOverlayData[] OverlayData { get; } - public bool ClearAllOtherOverlays { get; } - - public GasTileOverlayMessage(GasTileOverlayData[] overlayData, bool clearAllOtherOverlays = false) - { - OverlayData = overlayData; - ClearAllOtherOverlays = clearAllOtherOverlays; - } - } - } -} diff --git a/Resources/Prototypes/Entities/Mobs/Player/observer.yml b/Resources/Prototypes/Entities/Mobs/Player/observer.yml index 4b6fea353d..ef8f085f0c 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/observer.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/observer.yml @@ -22,7 +22,6 @@ DoRangeCheck: false - type: IgnorePause - type: Ghost - - type: CanSeeGases - type: Sprite netsync: false drawdepth: Ghosts diff --git a/Resources/Prototypes/Entities/Mobs/Species/human.yml b/Resources/Prototypes/Entities/Mobs/Species/human.yml index 040ff8e983..d12d5fd9f0 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/human.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/human.yml @@ -154,7 +154,6 @@ - type: Grammar proper: true - type: Pullable - - type: CanSeeGases - type: DoAfter - type: Strippable - type: UserInterface From 5194dd9a18e28707e94444d97bc51d444a29b0cb Mon Sep 17 00:00:00 2001 From: juliangiebel Date: Mon, 17 Aug 2020 19:12:03 +0200 Subject: [PATCH 33/81] Fix wrong attribute names Change cell capacites --- .../Entities/Objects/Power/powercells.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Resources/Prototypes/Entities/Objects/Power/powercells.yml b/Resources/Prototypes/Entities/Objects/Power/powercells.yml index 102fa7239c..98bb8936e3 100644 --- a/Resources/Prototypes/Entities/Objects/Power/powercells.yml +++ b/Resources/Prototypes/Entities/Objects/Power/powercells.yml @@ -27,8 +27,8 @@ sprite: Objects/Power/PowerCells/power_cell_small_st.rsi state: s_st - type: PowerCell - capacity: 1500 - charge: 1500 + maxCharge: 15000 + startingCharge: 15000 - type: Appearance visuals: - type: PowerCellVisualizer @@ -48,8 +48,8 @@ sprite: Objects/Power/PowerCells/power_cell_small_hi.rsi state: s_hi - type: PowerCell - capacity: 3000 - charge: 3000 + maxCharge: 30000 + startingCharge: 30000 - type: Appearance visuals: - type: PowerCellVisualizer @@ -69,8 +69,8 @@ sprite: Objects/Power/PowerCells/power_cell_small_sup.rsi state: s_sup - type: PowerCell - capacity: 6000 - charge: 6000 + maxCharge: 60000 + startingCharge: 60000 - type: Appearance visuals: - type: PowerCellVisualizer @@ -90,8 +90,8 @@ sprite: Objects/Power/PowerCells/power_cell_small_hy.rsi state: s_hy - type: PowerCell - capacity: 10000 - charge: 10000 + maxCharge: 80000 + startingCharge: 80000 - type: Appearance visuals: - type: PowerCellVisualizer From 32cf0f4c8e33e13ee5cfdba5247ec9903ff7a60a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Aguilera=20Puerto?= Date: Mon, 17 Aug 2020 20:45:48 +0200 Subject: [PATCH 34/81] Fix fillgas indentation. --- Content.Server/Atmos/AtmosCommands.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Atmos/AtmosCommands.cs b/Content.Server/Atmos/AtmosCommands.cs index 29525acaae..c53a0862d8 100644 --- a/Content.Server/Atmos/AtmosCommands.cs +++ b/Content.Server/Atmos/AtmosCommands.cs @@ -138,7 +138,7 @@ namespace Content.Server.Atmos } } - public class FillGas : IClientCommand + public class FillGas : IClientCommand { public string Command => "fillgas"; public string Description => "Adds gas to all tiles in a grid."; From bbc01c7e47b366eb2cbb4796af98dcb41ff17c8b Mon Sep 17 00:00:00 2001 From: DrSmugleaf Date: Tue, 18 Aug 2020 13:32:18 +0200 Subject: [PATCH 35/81] Fix NRE in atmos helpers and add tests (#1775) --- .../Tests/Atmos/AtmosHelpersTest.cs | 160 ++++++++++++++++++ Content.Server/Atmos/AtmosHelpers.cs | 20 ++- 2 files changed, 172 insertions(+), 8 deletions(-) create mode 100644 Content.IntegrationTests/Tests/Atmos/AtmosHelpersTest.cs diff --git a/Content.IntegrationTests/Tests/Atmos/AtmosHelpersTest.cs b/Content.IntegrationTests/Tests/Atmos/AtmosHelpersTest.cs new file mode 100644 index 0000000000..844198ce66 --- /dev/null +++ b/Content.IntegrationTests/Tests/Atmos/AtmosHelpersTest.cs @@ -0,0 +1,160 @@ +using System.Threading.Tasks; +using Content.Server.Atmos; +using NUnit.Framework; +using Robust.Shared.Map; + +namespace Content.IntegrationTests.Tests.Atmos +{ + [TestFixture] + [TestOf(typeof(AtmosHelpersTest))] + public class AtmosHelpersTest : ContentIntegrationTest + { + [Test] + public async Task GetTileAtmosphereGridCoordinatesNullTest() + { + var server = StartServerDummyTicker(); + + server.Assert(() => + { + Assert.DoesNotThrow(() => + { + var atmosphere = default(GridCoordinates).GetTileAtmosphere(); + + Assert.Null(atmosphere); + }); + }); + + await server.WaitIdleAsync(); + } + + [Test] + public async Task GetTileAirGridCoordinatesNullTest() + { + var server = StartServerDummyTicker(); + + server.Assert(() => + { + Assert.DoesNotThrow(() => + { + var air = default(GridCoordinates).GetTileAir(); + + Assert.Null(air); + }); + }); + + await server.WaitIdleAsync(); + } + + [Test] + public async Task TryGetTileAtmosphereGridCoordinatesNullTest() + { + var server = StartServerDummyTicker(); + + server.Assert(() => + { + Assert.DoesNotThrow(() => + { + var hasAtmosphere = default(GridCoordinates).TryGetTileAtmosphere(out var atmosphere); + + Assert.False(hasAtmosphere); + Assert.Null(atmosphere); + }); + }); + + await server.WaitIdleAsync(); + } + + [Test] + public async Task TryGetTileTileAirGridCoordinatesNullTest() + { + var server = StartServerDummyTicker(); + + server.Assert(() => + { + Assert.DoesNotThrow(() => + { + var hasAir = default(GridCoordinates).TryGetTileAir(out var air); + + Assert.False(hasAir); + Assert.Null(air); + }); + }); + + await server.WaitIdleAsync(); + } + + [Test] + public async Task GetTileAtmosphereMapIndicesNullTest() + { + var server = StartServerDummyTicker(); + + server.Assert(() => + { + Assert.DoesNotThrow(() => + { + var atmosphere = default(MapIndices).GetTileAtmosphere(default); + + Assert.Null(atmosphere); + }); + }); + + await server.WaitIdleAsync(); + } + + [Test] + public async Task GetTileAirMapIndicesNullTest() + { + var server = StartServerDummyTicker(); + + server.Assert(() => + { + Assert.DoesNotThrow(() => + { + var air = default(MapIndices).GetTileAir(default); + + Assert.Null(air); + }); + }); + + await server.WaitIdleAsync(); + } + + [Test] + public async Task TryGetTileAtmosphereMapIndicesNullTest() + { + var server = StartServerDummyTicker(); + + server.Assert(() => + { + Assert.DoesNotThrow(() => + { + var hasAtmosphere = default(MapIndices).TryGetTileAtmosphere(default, out var atmosphere); + + Assert.False(hasAtmosphere); + Assert.Null(atmosphere); + }); + }); + + await server.WaitIdleAsync(); + } + + [Test] + public async Task TryGetTileAirMapIndicesNullTest() + { + var server = StartServerDummyTicker(); + + server.Assert(() => + { + Assert.DoesNotThrow(() => + { + var hasAir = default(MapIndices).TryGetTileAir(default, out var air); + + Assert.False(hasAir); + Assert.Null(air); + }); + }); + + await server.WaitIdleAsync(); + } + } +} diff --git a/Content.Server/Atmos/AtmosHelpers.cs b/Content.Server/Atmos/AtmosHelpers.cs index 5561b70639..28c8e165c5 100644 --- a/Content.Server/Atmos/AtmosHelpers.cs +++ b/Content.Server/Atmos/AtmosHelpers.cs @@ -20,14 +20,16 @@ namespace Content.Server.Atmos return coordinates.GetTileAtmosphere()?.Air; } - public static bool TryGetTileAtmosphere(this GridCoordinates coordinates, [NotNullWhen(true)] out TileAtmosphere atmosphere) + public static bool TryGetTileAtmosphere(this GridCoordinates coordinates, [MaybeNullWhen(false)] out TileAtmosphere atmosphere) { - return (atmosphere = coordinates.GetTileAtmosphere()!) != default; + // ReSharper disable once ConditionIsAlwaysTrueOrFalse + return !Equals(atmosphere = coordinates.GetTileAtmosphere()!, default); } - public static bool TryGetTileAir(this GridCoordinates coordinates, [NotNullWhen(true)] out GasMixture air) + public static bool TryGetTileAir(this GridCoordinates coordinates, [MaybeNullWhen(false)] out GasMixture air) { - return !(air = coordinates.GetTileAir()!).Equals(default); + // ReSharper disable once ConditionIsAlwaysTrueOrFalse + return !Equals(air = coordinates.GetTileAir()!, default); } public static TileAtmosphere? GetTileAtmosphere(this MapIndices indices, GridId gridId) @@ -43,14 +45,16 @@ namespace Content.Server.Atmos } public static bool TryGetTileAtmosphere(this MapIndices indices, GridId gridId, - [NotNullWhen(true)] out TileAtmosphere atmosphere) + [MaybeNullWhen(false)] out TileAtmosphere atmosphere) { - return (atmosphere = indices.GetTileAtmosphere(gridId)!) != default; + // ReSharper disable once ConditionIsAlwaysTrueOrFalse + return !Equals(atmosphere = indices.GetTileAtmosphere(gridId)!, default); } - public static bool TryGetTileAir(this MapIndices indices, GridId gridId, [NotNullWhen(true)] out GasMixture air) + public static bool TryGetTileAir(this MapIndices indices, GridId gridId, [MaybeNullWhen(false)] out GasMixture air) { - return !(air = indices.GetTileAir(gridId)!).Equals(default); + // ReSharper disable once ConditionIsAlwaysTrueOrFalse + return !Equals(air = indices.GetTileAir(gridId)!, default); } } } From e076d93e1f279db254756b86b2cea41671c1f275 Mon Sep 17 00:00:00 2001 From: Vince <39844191+Visne@users.noreply.github.com> Date: Tue, 18 Aug 2020 13:46:12 +0200 Subject: [PATCH 36/81] Add test for non abstract entities without icons (#1666) * Add test for non abstract entities without icons Fixes #575. Test will now fail if an entity is added that is not abstract but has no icon. Also added icons or made entities abstract that failed the test. No non abstract entities actually missed textures. Some notes: Changed name of "constructionghost" from "spooky ghost" to "construction ghost", and changed name of "AdminObserver" from "observer" to "admin observer" to avoid overlap in names. * Split up client side and server side tests --- Content.IntegrationTests/Tests/EntityTest.cs | 80 ++++++++++++------- .../Entities/Constructible/Power/turret.yml | 6 ++ .../Entities/Constructible/disposal.yml | 1 + .../Effects/Markers/construction_ghost.yml | 4 +- .../Entities/Effects/Markers/drag_shadow.yml | 1 + .../Entities/Effects/Markers/hover_entity.yml | 1 + .../Entities/Effects/Markers/pointing.yml | 3 + .../Entities/Mobs/Player/admin_ghost.yml | 2 + .../Entities/Mobs/Player/observer.yml | 1 + 9 files changed, 69 insertions(+), 30 deletions(-) diff --git a/Content.IntegrationTests/Tests/EntityTest.cs b/Content.IntegrationTests/Tests/EntityTest.cs index 4df604e4ad..639a2f78b6 100644 --- a/Content.IntegrationTests/Tests/EntityTest.cs +++ b/Content.IntegrationTests/Tests/EntityTest.cs @@ -19,7 +19,7 @@ namespace Content.IntegrationTests.Tests public class EntityTest : ContentIntegrationTest { [Test] - public async Task Test() + public async Task SpawnTest() { var server = StartServerDummyTicker(); await server.WaitIdleAsync(); @@ -41,43 +41,65 @@ namespace Content.IntegrationTests.Tests }); server.Assert(() => + { + var testLocation = new GridCoordinates(new Vector2(0, 0), grid); + + //Generate list of non-abstract prototypes to test + foreach (var prototype in prototypeMan.EnumeratePrototypes()) { - var testLocation = new GridCoordinates(new Vector2(0, 0), grid); - - //Generate list of non-abstract prototypes to test - foreach (var prototype in prototypeMan.EnumeratePrototypes()) + if (prototype.Abstract) { - if (prototype.Abstract) - { - continue; - } - prototypes.Add(prototype); + continue; + } + prototypes.Add(prototype); + } + + //Iterate list of prototypes to spawn + foreach (var prototype in prototypes) + { + try + { + Logger.LogS(LogLevel.Debug, "EntityTest", "Testing: " + prototype.ID); + testEntity = entityMan.SpawnEntity(prototype.ID, testLocation); + server.RunTicks(2); + Assert.That(testEntity.Initialized); + entityMan.DeleteEntity(testEntity.Uid); } - //Iterate list of prototypes to spawn - foreach (var prototype in prototypes) + //Fail any exceptions thrown on spawn + catch (Exception e) { - try - { - Logger.LogS(LogLevel.Debug, "EntityTest", "Testing: " + prototype.ID); - testEntity = entityMan.SpawnEntity(prototype.ID, testLocation); - server.RunTicks(2); - Assert.That(testEntity.Initialized); - entityMan.DeleteEntity(testEntity.Uid); - } - - //Fail any exceptions thrown on spawn - catch (Exception e) - { - Logger.LogS(LogLevel.Error, "EntityTest", "Entity '" + prototype.ID + "' threw: " + e.Message); - //Assert.Fail(); - throw; - } + Logger.LogS(LogLevel.Error, "EntityTest", "Entity '" + prototype.ID + "' threw: " + e.Message); + //Assert.Fail(); + throw; } - }); + } + }); await server.WaitIdleAsync(); } + [Test] + public async Task NotAbstractIconTest() + { + var client = StartClient(); + await client.WaitIdleAsync(); + var prototypeMan = client.ResolveDependency(); + + client.Assert(() => + { + foreach (var prototype in prototypeMan.EnumeratePrototypes()) + { + if (prototype.Abstract) + { + continue; + } + + Assert.That(prototype.Components.ContainsKey("Icon"), $"Entity {prototype.ID} does not have an Icon component, but is not abstract"); + } + }); + + await client.WaitIdleAsync(); + } } } diff --git a/Resources/Prototypes/Entities/Constructible/Power/turret.yml b/Resources/Prototypes/Entities/Constructible/Power/turret.yml index b7f7b86492..33be165066 100644 --- a/Resources/Prototypes/Entities/Constructible/Power/turret.yml +++ b/Resources/Prototypes/Entities/Constructible/Power/turret.yml @@ -9,6 +9,8 @@ - type: Collidable - type: Sprite texture: Constructible/Misc/TurrBase.png + - type: Icon + texture: Constructible/Misc/TurrBase.png - type: entity id: TurretTopGun @@ -23,6 +25,8 @@ drawdepth: WallMountedItems texture: Constructible/Misc/TurrTop.png directional: false + - type: Icon + texture: Constructible/Misc/TurrTop.png - type: entity id: TurretTopLight @@ -35,6 +39,8 @@ drawdepth: WallMountedItems texture: Constructible/Misc/TurrLamp.png directional: false + - type: Icon + texture: Constructible/Misc/TurrLamp.png - type: PointLight radius: 512 mask: flashlight_mask diff --git a/Resources/Prototypes/Entities/Constructible/disposal.yml b/Resources/Prototypes/Entities/Constructible/disposal.yml index 738ec4d1b7..f5fe46c91e 100644 --- a/Resources/Prototypes/Entities/Constructible/disposal.yml +++ b/Resources/Prototypes/Entities/Constructible/disposal.yml @@ -19,6 +19,7 @@ - type: entity id: DisposalHolder + abstract: true name: disposal holder components: - type: DisposalHolder diff --git a/Resources/Prototypes/Entities/Effects/Markers/construction_ghost.yml b/Resources/Prototypes/Entities/Effects/Markers/construction_ghost.yml index d6240e27fb..8a93730b3b 100644 --- a/Resources/Prototypes/Entities/Effects/Markers/construction_ghost.yml +++ b/Resources/Prototypes/Entities/Effects/Markers/construction_ghost.yml @@ -1,6 +1,7 @@ - type: entity - name: spooky ghost + name: construction ghost id: constructionghost + abstract: true components: - type: Sprite color: '#3F38' @@ -12,6 +13,7 @@ - type: entity name: somebody-messed-up frame id: structureconstructionframe + abstract: true components: - type: Sprite - type: Construction diff --git a/Resources/Prototypes/Entities/Effects/Markers/drag_shadow.yml b/Resources/Prototypes/Entities/Effects/Markers/drag_shadow.yml index 29643c4204..e8b4b568bb 100644 --- a/Resources/Prototypes/Entities/Effects/Markers/drag_shadow.yml +++ b/Resources/Prototypes/Entities/Effects/Markers/drag_shadow.yml @@ -1,6 +1,7 @@ - type: entity name: drag shadow id: dragshadow + abstract: true components: - type: Sprite layers: diff --git a/Resources/Prototypes/Entities/Effects/Markers/hover_entity.yml b/Resources/Prototypes/Entities/Effects/Markers/hover_entity.yml index f3eb6bc998..5ba4269602 100644 --- a/Resources/Prototypes/Entities/Effects/Markers/hover_entity.yml +++ b/Resources/Prototypes/Entities/Effects/Markers/hover_entity.yml @@ -1,6 +1,7 @@ - type: entity name: hover entity id: hoverentity + abstract: true components: - type: Sprite layers: diff --git a/Resources/Prototypes/Entities/Effects/Markers/pointing.yml b/Resources/Prototypes/Entities/Effects/Markers/pointing.yml index afceefcbc4..2d21b2804c 100644 --- a/Resources/Prototypes/Entities/Effects/Markers/pointing.yml +++ b/Resources/Prototypes/Entities/Effects/Markers/pointing.yml @@ -6,6 +6,9 @@ netsync: false sprite: Interface/Misc/pointing.rsi state: pointing + - type: Icon + sprite: Interface/Misc/pointing.rsi + state: pointing - type: PointingArrow duration: 4 step: 0.5 diff --git a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml index 736f388b67..f559eaab3d 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml @@ -2,3 +2,5 @@ parent: MobObserver save: false id: AdminObserver + name: admin observer + abstract: true diff --git a/Resources/Prototypes/Entities/Mobs/Player/observer.yml b/Resources/Prototypes/Entities/Mobs/Player/observer.yml index ef8f085f0c..6fb36573fb 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/observer.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/observer.yml @@ -1,6 +1,7 @@ - type: entity id: MobObserver name: observer + abstract: true save: false description: Boo! components: From bbdfe44224f4815c6e05e39836629212bf7b8d2c Mon Sep 17 00:00:00 2001 From: Exp Date: Tue, 18 Aug 2020 14:29:13 +0200 Subject: [PATCH 37/81] Admins can get a list of the StationEvents (#1670) * -GetStationEventsMsg -Fixed random in events help * Don't send on connect * Delete StationEvents on disconnect * Resolve IClientNetManager when needed * :smilethink: * Remove setter * Removed unused imports * Don't resolve twice * Add Event --- Content.Client/ClientContentIoC.cs | 2 + Content.Client/EntryPoint.cs | 2 + .../StationEvents/IStationEventManager.cs | 13 ++++++ .../StationEvents/StationEventManager.cs | 42 +++++++++++++++++ .../StationEvents/StationEventSystem.cs | 42 ++++++++++++++--- .../StationEvents/StationEventCommand.cs | 7 ++- .../StationEvents/SharedStationEvent.cs | 46 +++++++++++++++++++ 7 files changed, 144 insertions(+), 10 deletions(-) create mode 100644 Content.Client/StationEvents/IStationEventManager.cs create mode 100644 Content.Client/StationEvents/StationEventManager.cs create mode 100644 Content.Shared/StationEvents/SharedStationEvent.cs diff --git a/Content.Client/ClientContentIoC.cs b/Content.Client/ClientContentIoC.cs index 9fe86a4b73..8639ea4c24 100644 --- a/Content.Client/ClientContentIoC.cs +++ b/Content.Client/ClientContentIoC.cs @@ -5,6 +5,7 @@ using Content.Client.Interfaces.Chat; using Content.Client.Interfaces.Parallax; using Content.Client.Parallax; using Content.Client.Sandbox; +using Content.Client.StationEvents; using Content.Client.UserInterface; using Content.Client.UserInterface.Stylesheets; using Content.Client.Utility; @@ -31,6 +32,7 @@ namespace Content.Client IoCManager.Register(); IoCManager.Register(); IoCManager.Register(); + IoCManager.Register(); } } } diff --git a/Content.Client/EntryPoint.cs b/Content.Client/EntryPoint.cs index 9a3065d77c..ef26c72a49 100644 --- a/Content.Client/EntryPoint.cs +++ b/Content.Client/EntryPoint.cs @@ -7,6 +7,7 @@ using Content.Client.Interfaces.Parallax; using Content.Client.Parallax; using Content.Client.Sandbox; using Content.Client.State; +using Content.Client.StationEvents; using Content.Client.UserInterface; using Content.Client.UserInterface.Stylesheets; using Content.Shared.GameObjects.Components; @@ -150,6 +151,7 @@ namespace Content.Client IoCManager.Resolve().Initialize(); IoCManager.Resolve().Initialize(); IoCManager.Resolve().Initialize(); + IoCManager.Resolve().Initialize(); _baseClient.RunLevelChanged += (sender, args) => { diff --git a/Content.Client/StationEvents/IStationEventManager.cs b/Content.Client/StationEvents/IStationEventManager.cs new file mode 100644 index 0000000000..828b20e80d --- /dev/null +++ b/Content.Client/StationEvents/IStationEventManager.cs @@ -0,0 +1,13 @@ +#nullable enable +using System; +using System.Collections.Generic; + +namespace Content.Client.StationEvents +{ + public interface IStationEventManager + { + public List? StationEvents { get; } + public void Initialize(); + public event Action OnStationEventsReceived; + } +} diff --git a/Content.Client/StationEvents/StationEventManager.cs b/Content.Client/StationEvents/StationEventManager.cs new file mode 100644 index 0000000000..eb1ce55416 --- /dev/null +++ b/Content.Client/StationEvents/StationEventManager.cs @@ -0,0 +1,42 @@ +#nullable enable +using Content.Shared.StationEvents; +using Robust.Shared.Interfaces.Network; +using Robust.Shared.IoC; +using System; +using System.Collections.Generic; + +namespace Content.Client.StationEvents +{ + class StationEventManager : SharedStationEvent, IStationEventManager + { + private List? _events; + public List? StationEvents + { + get + { + if (_events == null) + RequestEvents(); + return _events; + } + } + public event Action? OnStationEventsReceived; + + public void Initialize() + { + var netManager = IoCManager.Resolve(); + netManager.RegisterNetMessage(nameof(MsgGetStationEvents), EventHandler); + netManager.Disconnect += (sender, msg) => _events = null; + } + + private void EventHandler(MsgGetStationEvents msg) + { + _events = msg.Events; + OnStationEventsReceived?.Invoke(); + } + public void RequestEvents() + { + var netManager = IoCManager.Resolve(); + netManager.ClientSendMessage(netManager.CreateNetMessage()); + } + } +} diff --git a/Content.Server/GameObjects/EntitySystems/StationEvents/StationEventSystem.cs b/Content.Server/GameObjects/EntitySystems/StationEvents/StationEventSystem.cs index 1885b32231..48786d52dc 100644 --- a/Content.Server/GameObjects/EntitySystems/StationEvents/StationEventSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/StationEvents/StationEventSystem.cs @@ -1,23 +1,30 @@ -using System; -using System.Collections.Generic; -using System.Text; -using Content.Server.StationEvents; +using Content.Server.StationEvents; using JetBrains.Annotations; +using Robust.Server.Console; using Robust.Server.Interfaces.Player; using Robust.Shared.GameObjects.Systems; +using Robust.Shared.Interfaces.Network; using Robust.Shared.Interfaces.Random; using Robust.Shared.Interfaces.Reflection; using Robust.Shared.Interfaces.Timing; using Robust.Shared.IoC; using Robust.Shared.Localization; +using System; +using System.Collections.Generic; +using System.Text; +using static Content.Shared.StationEvents.SharedStationEvent; namespace Content.Server.GameObjects.EntitySystems.StationEvents { [UsedImplicitly] public sealed class StationEventSystem : EntitySystem { +#pragma warning disable 649 + [Dependency] private readonly IServerNetManager _netManager; + [Dependency] private readonly IPlayerManager _playerManager; +#pragma warning restore 649 // Somewhat based off of TG's implementation of events - + public StationEvent CurrentEvent { get; private set; } public IReadOnlyCollection StationEvents => _stationEvents; @@ -154,8 +161,31 @@ namespace Content.Server.GameObjects.EntitySystems.StationEvents var stationEvent = (StationEvent) typeFactory.CreateInstance(type); _stationEvents.Add(stationEvent); } + + _netManager.RegisterNetMessage(nameof(MsgGetStationEvents), GetEventReceived); } + private void GetEventReceived(MsgGetStationEvents msg) + { + var player = _playerManager.GetSessionByChannel(msg.MsgChannel); + SendEvents(player); + } + + private void SendEvents(IPlayerSession player) + { + if (!IoCManager.Resolve().CanCommand(player, "events")) + return; + + var newMsg = _netManager.CreateNetMessage(); + newMsg.Events = new List(); + foreach (var e in StationEvents) + { + newMsg.Events.Add(e.Name); + } + _netManager.ServerSendMessage(newMsg, player.ConnectedClient); + } + + public override void Update(float frameTime) { base.Update(frameTime); @@ -318,4 +348,4 @@ namespace Content.Server.GameObjects.EntitySystems.StationEvents CurrentEvent?.Shutdown(); } } -} \ No newline at end of file +} diff --git a/Content.Server/StationEvents/StationEventCommand.cs b/Content.Server/StationEvents/StationEventCommand.cs index 39331c6d5b..6712c8fa46 100644 --- a/Content.Server/StationEvents/StationEventCommand.cs +++ b/Content.Server/StationEvents/StationEventCommand.cs @@ -1,4 +1,4 @@ -#nullable enable +#nullable enable using Content.Server.GameObjects.EntitySystems; using Content.Server.GameObjects.EntitySystems.StationEvents; using JetBrains.Annotations; @@ -14,11 +14,10 @@ namespace Content.Client.Commands { public string Command => "events"; public string Description => "Provides admin control to station events"; - public string Help => "events >\n" + + public string Help => "events >\n" + "list: return all event names that can be run\n " + "pause: stop all random events from running\n" + "resume: allow random events to run again\n" + - "random: choose a random event that is valid and run it\n" + "run: start a particular event now; is case-insensitive and not localized"; public void Execute(IConsoleShell shell, IPlayerSession? player, string[] args) { @@ -99,4 +98,4 @@ namespace Content.Client.Commands return; } } -} \ No newline at end of file +} diff --git a/Content.Shared/StationEvents/SharedStationEvent.cs b/Content.Shared/StationEvents/SharedStationEvent.cs new file mode 100644 index 0000000000..8cecfb14df --- /dev/null +++ b/Content.Shared/StationEvents/SharedStationEvent.cs @@ -0,0 +1,46 @@ +using Lidgren.Network; +using Robust.Shared.Interfaces.Network; +using Robust.Shared.Interfaces.Serialization; +using Robust.Shared.IoC; +using Robust.Shared.Network; +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace Content.Shared.StationEvents +{ + public class SharedStationEvent + { + public class MsgGetStationEvents : NetMessage + { + #region REQUIRED + + public const MsgGroups GROUP = MsgGroups.Command; + public const string NAME = nameof(MsgGetStationEvents); + public MsgGetStationEvents(INetChannel channel) : base(NAME, GROUP) { } + + #endregion + public List Events; + public override void ReadFromBuffer(NetIncomingMessage buffer) + { + var serializer = IoCManager.Resolve(); + var length = buffer.ReadVariableInt32(); + using var stream = buffer.ReadAsStream(length); + Events = serializer.Deserialize>(stream); + } + + public override void WriteToBuffer(NetOutgoingMessage buffer) + { + var serializer = IoCManager.Resolve(); + using (var stream = new MemoryStream()) + { + serializer.Serialize(stream, Events); + buffer.WriteVariableInt32((int)stream.Length); + stream.TryGetBuffer(out var segment); + buffer.Write(segment); + } + } + } + } +} From d9ae9427595b64fee7591a4c6d7ab97cc694ebe7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Aguilera=20Puerto?= <6766154+Zumorica@users.noreply.github.com> Date: Tue, 18 Aug 2020 14:39:08 +0200 Subject: [PATCH 38/81] Make InteractUsing async, make tools use DoAfter. (#1772) * Make IInteractUsing async, make tools use DoAfter. * Disable warning 1998 in Content.Server * Update Content.Server/GameObjects/Components/AnchorableComponent.cs --- .../Tests/Disposal/DisposalUnitTest.cs | 8 ++--- Content.Server/Content.Server.csproj | 1 + .../Components/AnchorableComponent.cs | 29 +++++++++-------- .../Chemistry/ChemMasterComponent.cs | 3 +- .../Components/Chemistry/PourableComponent.cs | 5 +-- .../Chemistry/ReagentDispenserComponent.cs | 3 +- .../Components/Conveyor/ConveyorComponent.cs | 9 +++--- .../Conveyor/ConveyorSwitchComponent.cs | 3 +- .../Damage/DamageOnToolInteractComponent.cs | 3 +- .../Disposal/DisposalUnitComponent.cs | 3 +- .../Components/Doors/AirlockComponent.cs | 32 +++++++++++-------- .../Components/Fluids/BucketComponent.cs | 3 +- .../Gravity/GravityGeneratorComponent.cs | 7 ++-- .../Interactable/HandheldLightComponent.cs | 5 +-- .../Interactable/TilePryingComponent.cs | 4 +-- .../Components/Interactable/ToolComponent.cs | 24 +++++++++++++- .../Interactable/WelderComponent.cs | 32 ++++++++++++++++--- .../Items/Storage/EntityStorageComponent.cs | 6 ++-- .../Items/Storage/ServerStorageComponent.cs | 3 +- .../Components/Kitchen/MicrowaveComponent.cs | 3 +- .../Mining/AsteroidRockComponent.cs | 5 +-- .../Components/PDA/PDAComponent.cs | 3 +- .../Components/Paper/PaperComponent.cs | 5 +-- .../Components/PlaceableSurfaceComponent.cs | 6 ++-- .../Components/PottedPlantHideComponent.cs | 3 +- .../PowerReceiverUsers/BaseCharger.cs | 3 +- .../PoweredLightComponent.cs | 3 +- .../Components/Power/WireComponent.cs | 7 ++-- .../Components/Research/LatheComponent.cs | 4 ++- .../Components/Stack/StackComponent.cs | 3 +- .../Weapon/Melee/StunbatonComponent.cs | 3 +- .../Ranged/Ammunition/AmmoBoxComponent.cs | 3 +- .../Ammunition/RangedMagazineComponent.cs | 3 +- .../Ranged/Ammunition/SpeedLoaderComponent.cs | 3 +- .../Barrels/BoltActionBarrelComponent.cs | 3 +- .../Ranged/Barrels/PumpBarrelComponent.cs | 3 +- .../Ranged/Barrels/RevolverBarrelComponent.cs | 3 +- .../Barrels/ServerBatteryBarrelComponent.cs | 3 +- .../Barrels/ServerMagazineBarrelComponent.cs | 3 +- .../Barrels/ServerRangedBarrelComponent.cs | 4 ++- .../GameObjects/Components/WiresComponent.cs | 5 +-- .../EntitySystems/Click/InteractionSystem.cs | 5 +-- .../EntitySystems/ConstructionSystem.cs | 17 +++++----- .../Construction/ConstructionPrototype.cs | 6 ++-- .../Components/Interaction/IInteractUsing.cs | 3 +- 45 files changed, 195 insertions(+), 100 deletions(-) diff --git a/Content.IntegrationTests/Tests/Disposal/DisposalUnitTest.cs b/Content.IntegrationTests/Tests/Disposal/DisposalUnitTest.cs index 15b2167631..4f6b309bf7 100644 --- a/Content.IntegrationTests/Tests/Disposal/DisposalUnitTest.cs +++ b/Content.IntegrationTests/Tests/Disposal/DisposalUnitTest.cs @@ -66,7 +66,7 @@ namespace Content.IntegrationTests.Tests.Disposal DisposalUnitComponent unit; DisposalEntryComponent entry; - server.Assert(() => + server.Assert(async () => { var mapManager = IoCManager.Resolve(); @@ -86,14 +86,14 @@ namespace Content.IntegrationTests.Tests.Disposal // Can't insert, unanchored and unpowered var disposalUnitAnchorable = disposalUnit.GetComponent(); - disposalUnitAnchorable.TryUnAnchor(human, null, true); + await disposalUnitAnchorable.TryUnAnchor(human, null, true); Assert.False(unit.Anchored); UnitInsertContains(unit, false, human, wrench, disposalUnit, disposalTrunk); // Anchor the disposal unit - disposalUnitAnchorable.TryAnchor(human, null, true); + await disposalUnitAnchorable.TryAnchor(human, null, true); Assert.True(disposalUnit.TryGetComponent(out AnchorableComponent anchorableUnit)); - Assert.True(anchorableUnit.TryAnchor(human, wrench)); + Assert.True(await anchorableUnit.TryAnchor(human, wrench)); Assert.True(unit.Anchored); // No power diff --git a/Content.Server/Content.Server.csproj b/Content.Server/Content.Server.csproj index 0c9be50c54..9eae91acb0 100644 --- a/Content.Server/Content.Server.csproj +++ b/Content.Server/Content.Server.csproj @@ -9,6 +9,7 @@ ..\bin\Content.Server\ true Exe + 1998 diff --git a/Content.Server/GameObjects/Components/AnchorableComponent.cs b/Content.Server/GameObjects/Components/AnchorableComponent.cs index b1d07fbc60..5131dde457 100644 --- a/Content.Server/GameObjects/Components/AnchorableComponent.cs +++ b/Content.Server/GameObjects/Components/AnchorableComponent.cs @@ -1,5 +1,6 @@ #nullable enable using System.Diagnostics.CodeAnalysis; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Interactable; using Content.Shared.GameObjects.Components.Interactable; using Content.Shared.Interfaces.GameObjects.Components; @@ -21,12 +22,12 @@ namespace Content.Server.GameObjects.Components /// /// The user doing the action /// The tool being used, can be null if forcing it - /// The physics component of the owning entity + /// The collidable component of the owning entity /// Whether or not to check if the tool is valid /// true if it is valid, false otherwise - private bool Valid(IEntity user, IEntity? utilizing, [MaybeNullWhen(false)] out ICollidableComponent collidable, bool force = false) + private async Task Valid(IEntity user, IEntity? utilizing, [MaybeNullWhen(false)] bool force = false) { - if (!Owner.TryGetComponent(out collidable)) + if (!Owner.HasComponent()) { return false; } @@ -35,7 +36,7 @@ namespace Content.Server.GameObjects.Components { if (utilizing == null || !utilizing.TryGetComponent(out ToolComponent tool) || - !tool.UseTool(user, Owner, ToolQuality.Anchoring)) + !(await tool.UseTool(user, Owner, 0.5f, ToolQuality.Anchoring))) { return false; } @@ -51,13 +52,14 @@ namespace Content.Server.GameObjects.Components /// The tool being used, if any /// Whether or not to ignore valid tool checks /// true if anchored, false otherwise - public bool TryAnchor(IEntity user, IEntity? utilizing = null, bool force = false) + public async Task TryAnchor(IEntity user, IEntity? utilizing = null, bool force = false) { - if (!Valid(user, utilizing, out var physics, force)) + if (!(await Valid(user, utilizing, force))) { return false; } + var physics = Owner.GetComponent(); physics.Anchored = true; return true; @@ -70,13 +72,14 @@ namespace Content.Server.GameObjects.Components /// The tool being used, if any /// Whether or not to ignore valid tool checks /// true if unanchored, false otherwise - public bool TryUnAnchor(IEntity user, IEntity? utilizing = null, bool force = false) + public async Task TryUnAnchor(IEntity user, IEntity? utilizing = null, bool force = false) { - if (!Valid(user, utilizing, out var physics, force)) + if (!(await Valid(user, utilizing, force))) { return false; } + var physics = Owner.GetComponent(); physics.Anchored = false; return true; @@ -89,7 +92,7 @@ namespace Content.Server.GameObjects.Components /// The tool being used, if any /// Whether or not to ignore valid tool checks /// true if toggled, false otherwise - private bool TryToggleAnchor(IEntity user, IEntity? utilizing = null, bool force = false) + private async Task TryToggleAnchor(IEntity user, IEntity? utilizing = null, bool force = false) { if (!Owner.TryGetComponent(out ICollidableComponent collidable)) { @@ -97,8 +100,8 @@ namespace Content.Server.GameObjects.Components } return collidable.Anchored ? - TryUnAnchor(user, utilizing, force) : - TryAnchor(user, utilizing, force); + await TryUnAnchor(user, utilizing, force) : + await TryAnchor(user, utilizing, force); } public override void Initialize() @@ -107,9 +110,9 @@ namespace Content.Server.GameObjects.Components Owner.EnsureComponent(); } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { - return TryToggleAnchor(eventArgs.User, eventArgs.Using); + return await TryToggleAnchor(eventArgs.User, eventArgs.Using); } } } diff --git a/Content.Server/GameObjects/Components/Chemistry/ChemMasterComponent.cs b/Content.Server/GameObjects/Components/Chemistry/ChemMasterComponent.cs index 68551cc0e2..156b9efefb 100644 --- a/Content.Server/GameObjects/Components/Chemistry/ChemMasterComponent.cs +++ b/Content.Server/GameObjects/Components/Chemistry/ChemMasterComponent.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Power.ApcNetComponents; @@ -376,7 +377,7 @@ namespace Content.Server.GameObjects.Components.Chemistry ///
/// Data relevant to the event such as the actor which triggered it. /// - bool IInteractUsing.InteractUsing(InteractUsingEventArgs args) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs args) { if (!args.User.TryGetComponent(out IHandsComponent hands)) { diff --git a/Content.Server/GameObjects/Components/Chemistry/PourableComponent.cs b/Content.Server/GameObjects/Components/Chemistry/PourableComponent.cs index 13fd1e2081..e11d7d7438 100644 --- a/Content.Server/GameObjects/Components/Chemistry/PourableComponent.cs +++ b/Content.Server/GameObjects/Components/Chemistry/PourableComponent.cs @@ -1,4 +1,5 @@ -using Content.Server.Interfaces; +using System.Threading.Tasks; +using Content.Server.Interfaces; using Content.Shared.Chemistry; using Content.Shared.Interfaces.GameObjects.Components; using Robust.Shared.GameObjects; @@ -50,7 +51,7 @@ namespace Content.Server.GameObjects.Components.Chemistry /// /// Attack event args /// - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { //Get target solution component if (!Owner.TryGetComponent(out var targetSolution)) diff --git a/Content.Server/GameObjects/Components/Chemistry/ReagentDispenserComponent.cs b/Content.Server/GameObjects/Components/Chemistry/ReagentDispenserComponent.cs index ea864a4b40..d32ae288ad 100644 --- a/Content.Server/GameObjects/Components/Chemistry/ReagentDispenserComponent.cs +++ b/Content.Server/GameObjects/Components/Chemistry/ReagentDispenserComponent.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Power.ApcNetComponents; @@ -290,7 +291,7 @@ namespace Content.Server.GameObjects.Components.Chemistry /// /// Data relevant to the event such as the actor which triggered it. /// - bool IInteractUsing.InteractUsing(InteractUsingEventArgs args) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs args) { if (!args.User.TryGetComponent(out IHandsComponent hands)) { diff --git a/Content.Server/GameObjects/Components/Conveyor/ConveyorComponent.cs b/Content.Server/GameObjects/Components/Conveyor/ConveyorComponent.cs index 6d6a192359..ab636c4fe4 100644 --- a/Content.Server/GameObjects/Components/Conveyor/ConveyorComponent.cs +++ b/Content.Server/GameObjects/Components/Conveyor/ConveyorComponent.cs @@ -1,6 +1,7 @@ #nullable enable using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Interactable; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Power.ApcNetComponents; @@ -162,10 +163,10 @@ namespace Content.Server.GameObjects.Components.Conveyor } } - private bool ToolUsed(IEntity user, ToolComponent tool) + private async Task ToolUsed(IEntity user, ToolComponent tool) { if (!Owner.HasComponent() && - tool.UseTool(user, Owner, ToolQuality.Prying)) + await tool.UseTool(user, Owner, 0.5f, ToolQuality.Prying)) { State = ConveyorState.Loose; @@ -244,7 +245,7 @@ namespace Content.Server.GameObjects.Components.Conveyor Disconnect(); } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { if (eventArgs.Using.TryGetComponent(out ConveyorSwitchComponent conveyorSwitch)) { @@ -254,7 +255,7 @@ namespace Content.Server.GameObjects.Components.Conveyor if (eventArgs.Using.TryGetComponent(out ToolComponent tool)) { - return ToolUsed(eventArgs.User, tool); + return await ToolUsed(eventArgs.User, tool); } return false; diff --git a/Content.Server/GameObjects/Components/Conveyor/ConveyorSwitchComponent.cs b/Content.Server/GameObjects/Components/Conveyor/ConveyorSwitchComponent.cs index 208b0ceeec..3c06575fd2 100644 --- a/Content.Server/GameObjects/Components/Conveyor/ConveyorSwitchComponent.cs +++ b/Content.Server/GameObjects/Components/Conveyor/ConveyorSwitchComponent.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Content.Server.GameObjects.EntitySystems; using Content.Shared.GameObjects.Components.Conveyor; using Content.Shared.Interfaces; @@ -193,7 +194,7 @@ namespace Content.Server.GameObjects.Components.Conveyor return NextState(); } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { if (eventArgs.Using.TryGetComponent(out ConveyorComponent conveyor)) { diff --git a/Content.Server/GameObjects/Components/Damage/DamageOnToolInteractComponent.cs b/Content.Server/GameObjects/Components/Damage/DamageOnToolInteractComponent.cs index 034d92c9cf..72043c215a 100644 --- a/Content.Server/GameObjects/Components/Damage/DamageOnToolInteractComponent.cs +++ b/Content.Server/GameObjects/Components/Damage/DamageOnToolInteractComponent.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Interactable; using Content.Shared.Damage; using Content.Shared.GameObjects.Components.Interactable; @@ -32,7 +33,7 @@ namespace Content.Server.GameObjects.Components.Damage Owner.EnsureComponent(); } - public bool InteractUsing(InteractUsingEventArgs eventArgs) + public async Task InteractUsing(InteractUsingEventArgs eventArgs) { if (eventArgs.Using.TryGetComponent(out var tool)) { diff --git a/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs b/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs index 3fd51adb20..399ba6ffbd 100644 --- a/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs +++ b/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Power.ApcNetComponents; @@ -568,7 +569,7 @@ namespace Content.Server.GameObjects.Components.Disposal return true; } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { return TryDrop(eventArgs.User, eventArgs.Using); } diff --git a/Content.Server/GameObjects/Components/Doors/AirlockComponent.cs b/Content.Server/GameObjects/Components/Doors/AirlockComponent.cs index ade77fb937..6f8f94d217 100644 --- a/Content.Server/GameObjects/Components/Doors/AirlockComponent.cs +++ b/Content.Server/GameObjects/Components/Doors/AirlockComponent.cs @@ -1,5 +1,6 @@ using System; using System.Threading; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Interactable; using Content.Server.GameObjects.Components.Power.ApcNetComponents; using Content.Server.GameObjects.Components.VendingMachines; @@ -379,7 +380,7 @@ namespace Content.Server.GameObjects.Components.Doors return _powerReceiver.Powered; } - public bool InteractUsing(InteractUsingEventArgs eventArgs) + public async Task InteractUsing(InteractUsingEventArgs eventArgs) { if (!eventArgs.Using.TryGetComponent(out var tool)) return false; @@ -397,22 +398,27 @@ namespace Content.Server.GameObjects.Components.Doors } } - if (!tool.UseTool(eventArgs.User, Owner, ToolQuality.Prying)) return false; - - if (IsBolted()) + bool AirlockCheck() { - var notify = IoCManager.Resolve(); - notify.PopupMessage(Owner, eventArgs.User, - Loc.GetString("The airlock's bolts prevent it from being forced!")); + if (IsBolted()) + { + var notify = IoCManager.Resolve(); + notify.PopupMessage(Owner, eventArgs.User, + Loc.GetString("The airlock's bolts prevent it from being forced!")); + return false; + } + + if (IsPowered()) + { + var notify = IoCManager.Resolve(); + notify.PopupMessage(Owner, eventArgs.User, Loc.GetString("The powered motors block your efforts!")); + return false; + } + return true; } - if (IsPowered()) - { - var notify = IoCManager.Resolve(); - notify.PopupMessage(Owner, eventArgs.User, Loc.GetString("The powered motors block your efforts!")); - return true; - } + if (!await tool.UseTool(eventArgs.User, Owner, 3f, ToolQuality.Prying, AirlockCheck)) return false; if (State == DoorState.Closed) Open(); diff --git a/Content.Server/GameObjects/Components/Fluids/BucketComponent.cs b/Content.Server/GameObjects/Components/Fluids/BucketComponent.cs index f0e6c07018..11c3281a94 100644 --- a/Content.Server/GameObjects/Components/Fluids/BucketComponent.cs +++ b/Content.Server/GameObjects/Components/Fluids/BucketComponent.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Chemistry; using Content.Shared.Chemistry; using Content.Shared.Interfaces; @@ -70,7 +71,7 @@ namespace Content.Server.GameObjects.Components.Fluids return true; } - public bool InteractUsing(InteractUsingEventArgs eventArgs) + public async Task InteractUsing(InteractUsingEventArgs eventArgs) { if (!eventArgs.Using.TryGetComponent(out MopComponent mopComponent)) { diff --git a/Content.Server/GameObjects/Components/Gravity/GravityGeneratorComponent.cs b/Content.Server/GameObjects/Components/Gravity/GravityGeneratorComponent.cs index d47f94fd93..55e6acfe92 100644 --- a/Content.Server/GameObjects/Components/Gravity/GravityGeneratorComponent.cs +++ b/Content.Server/GameObjects/Components/Gravity/GravityGeneratorComponent.cs @@ -1,4 +1,5 @@ -using Content.Server.GameObjects.Components.Damage; +using System.Threading.Tasks; +using Content.Server.GameObjects.Components.Damage; using Content.Server.GameObjects.Components.Interactable; using Content.Server.GameObjects.Components.Power.ApcNetComponents; using Content.Server.GameObjects.EntitySystems; @@ -98,12 +99,12 @@ namespace Content.Server.GameObjects.Components.Gravity return true; } - public bool InteractUsing(InteractUsingEventArgs eventArgs) + public async Task InteractUsing(InteractUsingEventArgs eventArgs) { if (!eventArgs.Using.TryGetComponent(out WelderComponent tool)) return false; - if (!tool.UseTool(eventArgs.User, Owner, ToolQuality.Welding, 5f)) + if (!await tool.UseTool(eventArgs.User, Owner, 2f, ToolQuality.Welding, 5f)) return false; // Repair generator diff --git a/Content.Server/GameObjects/Components/Interactable/HandheldLightComponent.cs b/Content.Server/GameObjects/Components/Interactable/HandheldLightComponent.cs index f8b7bf1d47..908b01442e 100644 --- a/Content.Server/GameObjects/Components/Interactable/HandheldLightComponent.cs +++ b/Content.Server/GameObjects/Components/Interactable/HandheldLightComponent.cs @@ -1,4 +1,5 @@ -using Content.Server.GameObjects.Components.GUI; +using System.Threading.Tasks; +using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Clothing; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Power; @@ -57,7 +58,7 @@ namespace Content.Server.GameObjects.Components.Interactable [ViewVariables] public bool Activated { get; private set; } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { if (!eventArgs.Using.HasComponent()) return false; diff --git a/Content.Server/GameObjects/Components/Interactable/TilePryingComponent.cs b/Content.Server/GameObjects/Components/Interactable/TilePryingComponent.cs index 2d3d59884b..b2d6cbb98c 100644 --- a/Content.Server/GameObjects/Components/Interactable/TilePryingComponent.cs +++ b/Content.Server/GameObjects/Components/Interactable/TilePryingComponent.cs @@ -34,7 +34,7 @@ namespace Content.Server.GameObjects.Components.Interactable serializer.DataField(ref _toolComponentNeeded, "toolComponentNeeded", true); } - public void TryPryTile(IEntity user, GridCoordinates clickLocation) + public async void TryPryTile(IEntity user, GridCoordinates clickLocation) { if (!Owner.TryGetComponent(out var tool) && _toolComponentNeeded) return; @@ -51,7 +51,7 @@ namespace Content.Server.GameObjects.Components.Interactable if (!tileDef.CanCrowbar) return; - if (_toolComponentNeeded && !tool.UseTool(user, null, ToolQuality.Prying)) + if (_toolComponentNeeded && !await tool!.UseTool(user, null, 0f, ToolQuality.Prying)) return; var underplating = _tileDefinitionManager["underplating"]; diff --git a/Content.Server/GameObjects/Components/Interactable/ToolComponent.cs b/Content.Server/GameObjects/Components/Interactable/ToolComponent.cs index 0b1b6ad0ab..7bc3c0739a 100644 --- a/Content.Server/GameObjects/Components/Interactable/ToolComponent.cs +++ b/Content.Server/GameObjects/Components/Interactable/ToolComponent.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; +using Content.Server.GameObjects.EntitySystems.DoAfter; using Content.Shared.Audio; using Content.Shared.GameObjects.Components.Interactable; using Content.Shared.GameObjects.EntitySystems; @@ -89,11 +91,31 @@ namespace Content.Server.GameObjects.Components.Interactable serializer.DataField(this, collection => UseSoundCollection, "useSoundCollection", string.Empty); } - public virtual bool UseTool(IEntity user, IEntity target, ToolQuality toolQualityNeeded) + public virtual async Task UseTool(IEntity user, IEntity target, float doAfterDelay, ToolQuality toolQualityNeeded, Func doAfterCheck = null) { if (!HasQuality(toolQualityNeeded) || !ActionBlockerSystem.CanInteract(user)) return false; + if (doAfterDelay > 0f) + { + var doAfterSystem = EntitySystem.Get(); + + var doAfterArgs = new DoAfterEventArgs(user, doAfterDelay / SpeedModifier, default, target) + { + ExtraCheck = doAfterCheck, + BreakOnDamage = false, // TODO: Change this to true once breathing is fixed. + BreakOnStun = true, + BreakOnTargetMove = true, + BreakOnUserMove = true, + NeedHand = true, + }; + + var result = await doAfterSystem.DoAfter(doAfterArgs); + + if (result == DoAfterStatus.Cancelled) + return false; + } + PlayUseSound(); return true; diff --git a/Content.Server/GameObjects/Components/Interactable/WelderComponent.cs b/Content.Server/GameObjects/Components/Interactable/WelderComponent.cs index 3b96b57733..785e19e6b0 100644 --- a/Content.Server/GameObjects/Components/Interactable/WelderComponent.cs +++ b/Content.Server/GameObjects/Components/Interactable/WelderComponent.cs @@ -1,5 +1,6 @@ #nullable enable using System; +using System.Threading.Tasks; using Content.Server.Atmos; using Content.Server.GameObjects.Components.Chemistry; using Content.Server.GameObjects.Components.Items.Storage; @@ -97,16 +98,37 @@ namespace Content.Server.GameObjects.Components.Interactable return new WelderComponentState(FuelCapacity, Fuel, WelderLit); } - public override bool UseTool(IEntity user, IEntity target, ToolQuality toolQualityNeeded) + public override async Task UseTool(IEntity user, IEntity target, float doAfterDelay, ToolQuality toolQualityNeeded, Func? doAfterCheck = null) { - var canUse = base.UseTool(user, target, toolQualityNeeded); + bool ExtraCheck() + { + var extraCheck = doAfterCheck?.Invoke() ?? true; + + if (!CanWeld(DefaultFuelCost)) + { + _notifyManager.PopupMessage(target, user, "Can't weld!"); + + return false; + } + + return extraCheck; + } + + var canUse = await base.UseTool(user, target, doAfterDelay, toolQualityNeeded, ExtraCheck); return toolQualityNeeded.HasFlag(ToolQuality.Welding) ? canUse && TryWeld(DefaultFuelCost, user) : canUse; } - public bool UseTool(IEntity user, IEntity target, ToolQuality toolQualityNeeded, float fuelConsumed) + public async Task UseTool(IEntity user, IEntity target, float doAfterDelay, ToolQuality toolQualityNeeded, float fuelConsumed, Func? doAfterCheck = null) { - return base.UseTool(user, target, toolQualityNeeded) && TryWeld(fuelConsumed, user); + bool ExtraCheck() + { + var extraCheck = doAfterCheck?.Invoke() ?? true; + + return extraCheck && CanWeld(fuelConsumed); + } + + return await base.UseTool(user, target, doAfterDelay, toolQualityNeeded, ExtraCheck) && TryWeld(fuelConsumed, user); } private bool TryWeld(float value, IEntity? user = null, bool silent = false) @@ -236,7 +258,7 @@ namespace Content.Server.GameObjects.Components.Interactable if (TryWeld(5, victim, silent: true)) { PlaySoundCollection(WeldSoundCollection); - chat.EntityMe(victim, Loc.GetString("welds {0:their} every orifice closed! It looks like {0:theyre} trying to commit suicide!", victim)); //TODO: theyre macro + chat.EntityMe(victim, Loc.GetString("welds {0:their} every orifice closed! It looks like {0:theyre} trying to commit suicide!", victim)); return SuicideKind.Heat; } diff --git a/Content.Server/GameObjects/Components/Items/Storage/EntityStorageComponent.cs b/Content.Server/GameObjects/Components/Items/Storage/EntityStorageComponent.cs index df502ee9aa..3bb2cd1161 100644 --- a/Content.Server/GameObjects/Components/Items/Storage/EntityStorageComponent.cs +++ b/Content.Server/GameObjects/Components/Items/Storage/EntityStorageComponent.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Body; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Interactable; @@ -359,7 +360,7 @@ namespace Content.Server.GameObjects.Components.Items.Storage return Contents.CanInsert(entity); } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { if (Open) @@ -377,10 +378,9 @@ namespace Content.Server.GameObjects.Components.Items.Storage if (!eventArgs.Using.TryGetComponent(out WelderComponent tool)) return false; - if (!tool.UseTool(eventArgs.User, Owner, ToolQuality.Welding, 1f)) + if (!await tool.UseTool(eventArgs.User, Owner, 1f, ToolQuality.Welding, 1f)) return false; - IsWeldedShut ^= true; return true; } diff --git a/Content.Server/GameObjects/Components/Items/Storage/ServerStorageComponent.cs b/Content.Server/GameObjects/Components/Items/Storage/ServerStorageComponent.cs index 5359953f39..96aef95564 100644 --- a/Content.Server/GameObjects/Components/Items/Storage/ServerStorageComponent.cs +++ b/Content.Server/GameObjects/Components/Items/Storage/ServerStorageComponent.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.EntitySystems; using Content.Server.Interfaces.GameObjects.Components.Items; @@ -435,7 +436,7 @@ namespace Content.Server.GameObjects.Components.Items.Storage /// /// /// true if inserted, false otherwise - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { Logger.DebugS(LoggerName, $"Storage (UID {Owner.Uid}) attacked by user (UID {eventArgs.User.Uid}) with entity (UID {eventArgs.Using.Uid})."); diff --git a/Content.Server/GameObjects/Components/Kitchen/MicrowaveComponent.cs b/Content.Server/GameObjects/Components/Kitchen/MicrowaveComponent.cs index 672f09c14a..470fb19ec6 100644 --- a/Content.Server/GameObjects/Components/Kitchen/MicrowaveComponent.cs +++ b/Content.Server/GameObjects/Components/Kitchen/MicrowaveComponent.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Body; using Robust.Shared.GameObjects; using Robust.Shared.IoC; @@ -206,7 +207,7 @@ namespace Content.Server.GameObjects.Components.Kitchen _userInterface.Open(actor.playerSession); } - public bool InteractUsing(InteractUsingEventArgs eventArgs) + public async Task InteractUsing(InteractUsingEventArgs eventArgs) { if (!_powered) { diff --git a/Content.Server/GameObjects/Components/Mining/AsteroidRockComponent.cs b/Content.Server/GameObjects/Components/Mining/AsteroidRockComponent.cs index ec174cca63..08a4bffd48 100644 --- a/Content.Server/GameObjects/Components/Mining/AsteroidRockComponent.cs +++ b/Content.Server/GameObjects/Components/Mining/AsteroidRockComponent.cs @@ -1,4 +1,5 @@ -using Content.Server.GameObjects.Components.Weapon.Melee; +using System.Threading.Tasks; +using Content.Server.GameObjects.Components.Weapon.Melee; using Content.Shared.GameObjects.Components.Damage; using Content.Shared.Damage; using Content.Shared.Interfaces.GameObjects.Components; @@ -30,7 +31,7 @@ namespace Content.Server.GameObjects.Components.Mining spriteComponent.LayerSetState(0, _random.Pick(SpriteStates)); } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { var item = eventArgs.Using; if (!item.TryGetComponent(out MeleeWeaponComponent meleeWeaponComponent)) return false; diff --git a/Content.Server/GameObjects/Components/PDA/PDAComponent.cs b/Content.Server/GameObjects/Components/PDA/PDAComponent.cs index b3edacdfac..53f3543d62 100644 --- a/Content.Server/GameObjects/Components/PDA/PDAComponent.cs +++ b/Content.Server/GameObjects/Components/PDA/PDAComponent.cs @@ -3,6 +3,7 @@ using System; using System.Collections; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Access; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; @@ -143,7 +144,7 @@ namespace Content.Server.GameObjects.Components.PDA _appearance?.SetData(PDAVisuals.ScreenLit, _lightOn); } - public bool InteractUsing(InteractUsingEventArgs eventArgs) + public async Task InteractUsing(InteractUsingEventArgs eventArgs) { var item = eventArgs.Using; if (!IdSlotEmpty) diff --git a/Content.Server/GameObjects/Components/Paper/PaperComponent.cs b/Content.Server/GameObjects/Components/Paper/PaperComponent.cs index 0f2b48b905..54193918d9 100644 --- a/Content.Server/GameObjects/Components/Paper/PaperComponent.cs +++ b/Content.Server/GameObjects/Components/Paper/PaperComponent.cs @@ -1,4 +1,5 @@ -using Content.Shared.GameObjects.Components; +using System.Threading.Tasks; +using Content.Shared.GameObjects.Components; using Content.Shared.GameObjects.EntitySystems; using Content.Shared.Interfaces.GameObjects.Components; using Robust.Server.GameObjects; @@ -66,7 +67,7 @@ namespace Content.Server.GameObjects.Components.Paper UpdateUserInterface(); } - public bool InteractUsing(InteractUsingEventArgs eventArgs) + public async Task InteractUsing(InteractUsingEventArgs eventArgs) { if (!eventArgs.Using.HasComponent()) return false; diff --git a/Content.Server/GameObjects/Components/PlaceableSurfaceComponent.cs b/Content.Server/GameObjects/Components/PlaceableSurfaceComponent.cs index 54469fb856..ae7947a800 100644 --- a/Content.Server/GameObjects/Components/PlaceableSurfaceComponent.cs +++ b/Content.Server/GameObjects/Components/PlaceableSurfaceComponent.cs @@ -1,4 +1,5 @@ -using Content.Server.GameObjects.Components.GUI; +using System.Threading.Tasks; +using Content.Server.GameObjects.Components.GUI; using Content.Shared.GameObjects.Components; using Content.Shared.Interfaces.GameObjects.Components; using Robust.Shared.GameObjects; @@ -21,7 +22,8 @@ namespace Content.Server.GameObjects.Components serializer.DataField(ref _isPlaceable, "IsPlaceable", true); } - public bool InteractUsing(InteractUsingEventArgs eventArgs) + + public async Task InteractUsing(InteractUsingEventArgs eventArgs) { if (!IsPlaceable) return false; diff --git a/Content.Server/GameObjects/Components/PottedPlantHideComponent.cs b/Content.Server/GameObjects/Components/PottedPlantHideComponent.cs index a25e6730b3..bd7dd1a28b 100644 --- a/Content.Server/GameObjects/Components/PottedPlantHideComponent.cs +++ b/Content.Server/GameObjects/Components/PottedPlantHideComponent.cs @@ -1,3 +1,4 @@ +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.Interfaces.GameObjects.Components.Items; @@ -30,7 +31,7 @@ namespace Content.Server.GameObjects.Components ContainerManagerComponent.Ensure("potted_plant_hide", Owner, out _); } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { if (_itemContainer.ContainedEntity != null) { diff --git a/Content.Server/GameObjects/Components/Power/ApcNetComponents/PowerReceiverUsers/BaseCharger.cs b/Content.Server/GameObjects/Components/Power/ApcNetComponents/PowerReceiverUsers/BaseCharger.cs index 0bfc844474..674a33dd1f 100644 --- a/Content.Server/GameObjects/Components/Power/ApcNetComponents/PowerReceiverUsers/BaseCharger.cs +++ b/Content.Server/GameObjects/Components/Power/ApcNetComponents/PowerReceiverUsers/BaseCharger.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Weapon.Ranged.Barrels; @@ -65,7 +66,7 @@ namespace Content.Server.GameObjects.Components.Power.ApcNetComponents.PowerRece base.OnRemove(); } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { var result = TryInsertItem(eventArgs.Using); if (!result) diff --git a/Content.Server/GameObjects/Components/Power/ApcNetComponents/PowerReceiverUsers/PoweredLightComponent.cs b/Content.Server/GameObjects/Components/Power/ApcNetComponents/PowerReceiverUsers/PoweredLightComponent.cs index a6d81eed88..5f6edb59e6 100644 --- a/Content.Server/GameObjects/Components/Power/ApcNetComponents/PowerReceiverUsers/PoweredLightComponent.cs +++ b/Content.Server/GameObjects/Components/Power/ApcNetComponents/PowerReceiverUsers/PoweredLightComponent.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Mobs; @@ -69,7 +70,7 @@ namespace Content.Server.GameObjects.Components.Power.ApcNetComponents.PowerRece } } - public bool InteractUsing(InteractUsingEventArgs eventArgs) + public async Task InteractUsing(InteractUsingEventArgs eventArgs) { return InsertBulb(eventArgs.Using); } diff --git a/Content.Server/GameObjects/Components/Power/WireComponent.cs b/Content.Server/GameObjects/Components/Power/WireComponent.cs index 7b551c1727..ad9cf19602 100644 --- a/Content.Server/GameObjects/Components/Power/WireComponent.cs +++ b/Content.Server/GameObjects/Components/Power/WireComponent.cs @@ -1,4 +1,5 @@ -using Content.Server.GameObjects.Components.Interactable; +using System.Threading.Tasks; +using Content.Server.GameObjects.Components.Interactable; using Content.Server.GameObjects.Components.Stack; using Content.Shared.GameObjects.Components.Interactable; using Content.Shared.Interfaces.GameObjects.Components; @@ -34,10 +35,10 @@ namespace Content.Server.GameObjects.Components.Power serializer.DataField(ref _wireType, "wireType", WireType.HighVoltage); } - public bool InteractUsing(InteractUsingEventArgs eventArgs) + public async Task InteractUsing(InteractUsingEventArgs eventArgs) { if (!eventArgs.Using.TryGetComponent(out ToolComponent tool)) return false; - if (!tool.UseTool(eventArgs.User, Owner, ToolQuality.Cutting)) return false; + if (!await tool.UseTool(eventArgs.User, Owner, 0.25f, ToolQuality.Cutting)) return false; Owner.Delete(); var droppedEnt = Owner.EntityManager.SpawnEntity(_wireDroppedOnCutPrototype, eventArgs.ClickLocation); diff --git a/Content.Server/GameObjects/Components/Research/LatheComponent.cs b/Content.Server/GameObjects/Components/Research/LatheComponent.cs index e848cb66ee..55b2ddbbcb 100644 --- a/Content.Server/GameObjects/Components/Research/LatheComponent.cs +++ b/Content.Server/GameObjects/Components/Research/LatheComponent.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Power.ApcNetComponents; using Content.Server.GameObjects.Components.Stack; using Content.Shared.GameObjects.Components.Materials; @@ -149,7 +150,8 @@ namespace Content.Server.GameObjects.Components.Research OpenUserInterface(actor.playerSession); } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { if (!Owner.TryGetComponent(out MaterialStorageComponent storage) || !eventArgs.Using.TryGetComponent(out MaterialComponent material)) return false; diff --git a/Content.Server/GameObjects/Components/Stack/StackComponent.cs b/Content.Server/GameObjects/Components/Stack/StackComponent.cs index aedff7d2df..e38af7a857 100644 --- a/Content.Server/GameObjects/Components/Stack/StackComponent.cs +++ b/Content.Server/GameObjects/Components/Stack/StackComponent.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Content.Shared.GameObjects.Components; using Content.Shared.GameObjects.EntitySystems; using Content.Shared.Interfaces; @@ -61,7 +62,7 @@ namespace Content.Server.GameObjects.Components.Stack return false; } - public bool InteractUsing(InteractUsingEventArgs eventArgs) + public async Task InteractUsing(InteractUsingEventArgs eventArgs) { if (eventArgs.Using.TryGetComponent(out var stack)) { diff --git a/Content.Server/GameObjects/Components/Weapon/Melee/StunbatonComponent.cs b/Content.Server/GameObjects/Components/Weapon/Melee/StunbatonComponent.cs index 4d52c9382e..2a3fc9df37 100644 --- a/Content.Server/GameObjects/Components/Weapon/Melee/StunbatonComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Melee/StunbatonComponent.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Mobs; @@ -192,7 +193,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Melee return true; } - public bool InteractUsing(InteractUsingEventArgs eventArgs) + public async Task InteractUsing(InteractUsingEventArgs eventArgs) { if (!eventArgs.Using.HasComponent()) return false; diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/AmmoBoxComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/AmmoBoxComponent.cs index 14d433e616..839c356ecf 100644 --- a/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/AmmoBoxComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/AmmoBoxComponent.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Weapon.Ranged.Barrels; @@ -119,7 +120,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Ammunition return true; } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { if (eventArgs.Using.HasComponent()) { diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/RangedMagazineComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/RangedMagazineComponent.cs index 594d1d6689..5747132bb8 100644 --- a/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/RangedMagazineComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/RangedMagazineComponent.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Weapon.Ranged.Barrels; @@ -136,7 +137,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Ammunition return ammo; } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { return TryInsertAmmo(eventArgs.User, eventArgs.Using); } diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/SpeedLoaderComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/SpeedLoaderComponent.cs index 25696a9e0d..e5bd9de782 100644 --- a/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/SpeedLoaderComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Ammunition/SpeedLoaderComponent.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Weapon.Ranged.Barrels; @@ -204,7 +205,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Ammunition } } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { return TryInsertAmmo(eventArgs.User, eventArgs.Using); } diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/BoltActionBarrelComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/BoltActionBarrelComponent.cs index 75130f5246..913b56027f 100644 --- a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/BoltActionBarrelComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/BoltActionBarrelComponent.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Weapon.Ranged.Ammunition; using Content.Shared.GameObjects.Components.Weapons.Ranged.Barrels; using Content.Shared.GameObjects.EntitySystems; @@ -291,7 +292,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels return true; } - public override bool InteractUsing(InteractUsingEventArgs eventArgs) + public override async Task InteractUsing(InteractUsingEventArgs eventArgs) { return TryInsertBullet(eventArgs.User, eventArgs.Using); } diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/PumpBarrelComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/PumpBarrelComponent.cs index 3c4acb1e04..2139767dc0 100644 --- a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/PumpBarrelComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/PumpBarrelComponent.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Weapon.Ranged.Ammunition; using Content.Shared.GameObjects.Components.Weapons.Ranged.Barrels; using Content.Shared.Interfaces; @@ -206,7 +207,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels return true; } - public override bool InteractUsing(InteractUsingEventArgs eventArgs) + public override async Task InteractUsing(InteractUsingEventArgs eventArgs) { return TryInsertBullet(eventArgs); } diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/RevolverBarrelComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/RevolverBarrelComponent.cs index fe8488952c..004e742b71 100644 --- a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/RevolverBarrelComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/RevolverBarrelComponent.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Weapon.Ranged.Ammunition; using Content.Shared.GameObjects.Components.Weapons.Ranged.Barrels; using Content.Shared.GameObjects.EntitySystems; @@ -231,7 +232,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels return true; } - public override bool InteractUsing(InteractUsingEventArgs eventArgs) + public override async Task InteractUsing(InteractUsingEventArgs eventArgs) { return TryInsertBullet(eventArgs.User, eventArgs.Using); } diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerBatteryBarrelComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerBatteryBarrelComponent.cs index f68aa0758c..486d2071b1 100644 --- a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerBatteryBarrelComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerBatteryBarrelComponent.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Power; @@ -260,7 +261,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels return true; } - public override bool InteractUsing(InteractUsingEventArgs eventArgs) + public override async Task InteractUsing(InteractUsingEventArgs eventArgs) { if (!eventArgs.Using.HasComponent()) { diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerMagazineBarrelComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerMagazineBarrelComponent.cs index 3623c4b5db..ef8b35ca90 100644 --- a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerMagazineBarrelComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerMagazineBarrelComponent.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; using Content.Server.GameObjects.Components.Weapon.Ranged.Ammunition; @@ -344,7 +345,7 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels UpdateAppearance(); } - public override bool InteractUsing(InteractUsingEventArgs eventArgs) + public override async Task InteractUsing(InteractUsingEventArgs eventArgs) { // Insert magazine if (eventArgs.Using.TryGetComponent(out RangedMagazineComponent magazineComponent)) diff --git a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerRangedBarrelComponent.cs b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerRangedBarrelComponent.cs index 0d1188505b..7c53360eb1 100644 --- a/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerRangedBarrelComponent.cs +++ b/Content.Server/GameObjects/Components/Weapon/Ranged/Barrels/ServerRangedBarrelComponent.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Mobs; using Content.Server.GameObjects.Components.Projectiles; using Content.Server.GameObjects.Components.Weapon.Ranged.Ammunition; @@ -186,7 +187,8 @@ namespace Content.Server.GameObjects.Components.Weapon.Ranged.Barrels } public abstract bool UseEntity(UseEntityEventArgs eventArgs); - public abstract bool InteractUsing(InteractUsingEventArgs eventArgs); + + public abstract Task InteractUsing(InteractUsingEventArgs eventArgs); public void ChangeFireSelector(FireRateSelector rateSelector) { diff --git a/Content.Server/GameObjects/Components/WiresComponent.cs b/Content.Server/GameObjects/Components/WiresComponent.cs index cc9b0aba06..d8abb14bc7 100644 --- a/Content.Server/GameObjects/Components/WiresComponent.cs +++ b/Content.Server/GameObjects/Components/WiresComponent.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Interactable; using Content.Server.GameObjects.Components.VendingMachines; using Content.Server.GameObjects.EntitySystems; @@ -468,11 +469,11 @@ namespace Content.Server.GameObjects.Components serializer.DataField(ref _layoutId, "LayoutId", null); } - bool IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) + async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { if (!eventArgs.Using.TryGetComponent(out var tool)) return false; - if (!tool.UseTool(eventArgs.User, Owner, ToolQuality.Screwing)) + if (!await tool.UseTool(eventArgs.User, Owner, 0.5f, ToolQuality.Screwing)) return false; IsPanelOpen = !IsPanelOpen; diff --git a/Content.Server/GameObjects/EntitySystems/Click/InteractionSystem.cs b/Content.Server/GameObjects/EntitySystems/Click/InteractionSystem.cs index 8c6e8f1912..d607e79d59 100644 --- a/Content.Server/GameObjects/EntitySystems/Click/InteractionSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/Click/InteractionSystem.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Mobs; using Content.Server.GameObjects.Components.Movement; @@ -438,7 +439,7 @@ namespace Content.Server.GameObjects.EntitySystems.Click /// Uses a weapon/object on an entity /// Finds components with the InteractUsing interface and calls their function /// - public void Interaction(IEntity user, IEntity weapon, IEntity attacked, GridCoordinates clickLocation) + public async Task Interaction(IEntity user, IEntity weapon, IEntity attacked, GridCoordinates clickLocation) { var attackMsg = new InteractUsingMessage(user, weapon, attacked, clickLocation); RaiseLocalEvent(attackMsg); @@ -458,7 +459,7 @@ namespace Content.Server.GameObjects.EntitySystems.Click { foreach (var attackBy in attackBys) { - if (attackBy.InteractUsing(attackByEventArgs)) + if (await attackBy.InteractUsing(attackByEventArgs)) { // If an InteractUsing returns a status completion we finish our attack return; diff --git a/Content.Server/GameObjects/EntitySystems/ConstructionSystem.cs b/Content.Server/GameObjects/EntitySystems/ConstructionSystem.cs index b054fd5401..2138e559dc 100644 --- a/Content.Server/GameObjects/EntitySystems/ConstructionSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/ConstructionSystem.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Threading.Tasks; using Content.Server.GameObjects.Components.Construction; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Interactable; @@ -76,7 +77,7 @@ namespace Content.Server.GameObjects.EntitySystems TryStartItemConstruction(placingEnt, msg.PrototypeName); } - private void HandleToolInteraction(AfterInteractMessage msg) + private async void HandleToolInteraction(AfterInteractMessage msg) { if(msg.Handled) return; @@ -104,7 +105,7 @@ namespace Content.Server.GameObjects.EntitySystems // the target entity is in the process of being constructed/deconstructed if (msg.Attacked.TryGetComponent(out var constructComp)) { - var result = TryConstructEntity(constructComp, handEnt, msg.User); + var result = await TryConstructEntity(constructComp, handEnt, msg.User); // TryConstructEntity may delete the existing entity @@ -367,7 +368,7 @@ namespace Content.Server.GameObjects.EntitySystems } } - private bool TryConstructEntity(ConstructionComponent constructionComponent, IEntity handTool, IEntity user) + private async Task TryConstructEntity(ConstructionComponent constructionComponent, IEntity handTool, IEntity user) { var constructEntity = constructionComponent.Owner; var spriteComponent = constructEntity.GetComponent(); @@ -384,7 +385,7 @@ namespace Content.Server.GameObjects.EntitySystems var stage = constructPrototype.Stages[constructionComponent.Stage]; - if (TryProcessStep(constructEntity, stage.Forward, handTool, user, transformComponent.GridPosition)) + if (await TryProcessStep(constructEntity, stage.Forward, handTool, user, transformComponent.GridPosition)) { constructionComponent.Stage++; if (constructionComponent.Stage == constructPrototype.Stages.Count - 1) @@ -406,7 +407,7 @@ namespace Content.Server.GameObjects.EntitySystems } } - else if (TryProcessStep(constructEntity, stage.Backward, handTool, user, transformComponent.GridPosition)) + else if (await TryProcessStep(constructEntity, stage.Backward, handTool, user, transformComponent.GridPosition)) { constructionComponent.Stage--; stage = constructPrototype.Stages[constructionComponent.Stage]; @@ -443,7 +444,7 @@ namespace Content.Server.GameObjects.EntitySystems } } - private bool TryProcessStep(IEntity constructEntity, ConstructionStep step, IEntity slapped, IEntity user, GridCoordinates gridCoords) + private async Task TryProcessStep(IEntity constructEntity, ConstructionStep step, IEntity slapped, IEntity user, GridCoordinates gridCoords) { if (step == null) { @@ -473,9 +474,9 @@ namespace Content.Server.GameObjects.EntitySystems // Handle welder manually since tool steps specify fuel amount needed, for some reason. if (toolStep.ToolQuality.HasFlag(ToolQuality.Welding)) return slapped.TryGetComponent(out var welder) - && welder.UseTool(user, constructEntity, toolStep.ToolQuality, toolStep.Amount); + && await welder.UseTool(user, constructEntity, toolStep.DoAfterDelay, toolStep.ToolQuality, toolStep.Amount); - return tool.UseTool(user, constructEntity, toolStep.ToolQuality); + return await tool.UseTool(user, constructEntity, toolStep.DoAfterDelay, toolStep.ToolQuality); default: throw new NotImplementedException(); diff --git a/Content.Shared/Construction/ConstructionPrototype.cs b/Content.Shared/Construction/ConstructionPrototype.cs index 04dd6829df..c32960bf63 100644 --- a/Content.Shared/Construction/ConstructionPrototype.cs +++ b/Content.Shared/Construction/ConstructionPrototype.cs @@ -181,11 +181,13 @@ namespace Content.Shared.Construction public abstract class ConstructionStep { - public readonly int Amount = 1; + public readonly int Amount; + public readonly float DoAfterDelay; - protected ConstructionStep(int amount) + protected ConstructionStep(int amount, float doAfterDelay = 0f) { Amount = amount; + DoAfterDelay = doAfterDelay; } } diff --git a/Content.Shared/Interfaces/GameObjects/Components/Interaction/IInteractUsing.cs b/Content.Shared/Interfaces/GameObjects/Components/Interaction/IInteractUsing.cs index 21c0dacedb..5b28a693e0 100644 --- a/Content.Shared/Interfaces/GameObjects/Components/Interaction/IInteractUsing.cs +++ b/Content.Shared/Interfaces/GameObjects/Components/Interaction/IInteractUsing.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using System.Collections.Generic; using JetBrains.Annotations; using Robust.Shared.GameObjects; @@ -22,7 +23,7 @@ namespace Content.Shared.Interfaces.GameObjects.Components /// /// Called when using one object on another when user is in range of the target entity. /// - bool InteractUsing(InteractUsingEventArgs eventArgs); + Task InteractUsing(InteractUsingEventArgs eventArgs); } public class InteractUsingEventArgs : EventArgs, ITargetedInteractEventArgs From 6fb2a335b1006e6a72e3e4b5d37c4e405c82e21c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Aguilera=20Puerto?= Date: Tue, 18 Aug 2020 14:40:58 +0200 Subject: [PATCH 39/81] Fix anchorable doc --- Content.Server/GameObjects/Components/AnchorableComponent.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Content.Server/GameObjects/Components/AnchorableComponent.cs b/Content.Server/GameObjects/Components/AnchorableComponent.cs index 5131dde457..9837ac04cb 100644 --- a/Content.Server/GameObjects/Components/AnchorableComponent.cs +++ b/Content.Server/GameObjects/Components/AnchorableComponent.cs @@ -22,7 +22,6 @@ namespace Content.Server.GameObjects.Components /// /// The user doing the action /// The tool being used, can be null if forcing it - /// The collidable component of the owning entity /// Whether or not to check if the tool is valid /// true if it is valid, false otherwise private async Task Valid(IEntity user, IEntity? utilizing, [MaybeNullWhen(false)] bool force = false) From 5de57d6cd26c4d07a688e7a8460498c8e04c4b6d Mon Sep 17 00:00:00 2001 From: Exp Date: Tue, 18 Aug 2020 14:52:59 +0200 Subject: [PATCH 40/81] Ready Indicator in the lobby (#1771) * Ready Indicator in the lobby * Use SessionID instead of Name * Don't show ready state when game is already running * Make Ready List not selectable * -Remove disconnected sessions from Ready -Fix showing ReadyStatus when staying in lobby --- .../GameTicking/ClientGameTicker.cs | 19 ++++++- .../Interfaces/IClientGameTicker.cs | 4 ++ Content.Client/State/LobbyState.cs | 38 ++++++++++++- Content.Client/UserInterface/LobbyGui.cs | 23 +++++++- Content.Server/GameTicking/GameTicker.cs | 24 +++++++++ Content.Shared/SharedGameTicker.cs | 54 +++++++++++++++++++ 6 files changed, 157 insertions(+), 5 deletions(-) diff --git a/Content.Client/GameTicking/ClientGameTicker.cs b/Content.Client/GameTicking/ClientGameTicker.cs index cab0608a93..3b58d1c17b 100644 --- a/Content.Client/GameTicking/ClientGameTicker.cs +++ b/Content.Client/GameTicking/ClientGameTicker.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using Content.Client.Interfaces; using Content.Client.State; using Content.Client.UserInterface; @@ -8,6 +9,7 @@ using Robust.Client.Interfaces.Graphics; using Robust.Client.Interfaces.State; using Robust.Shared.Interfaces.Network; using Robust.Shared.IoC; +using Robust.Shared.Network; using Robust.Shared.Utility; using Robust.Shared.ViewVariables; @@ -27,9 +29,11 @@ namespace Content.Client.GameTicking [ViewVariables] public string ServerInfoBlob { get; private set; } [ViewVariables] public DateTime StartTime { get; private set; } [ViewVariables] public bool Paused { get; private set; } + [ViewVariables] public Dictionary Ready { get; private set; } public event Action InfoBlobUpdated; public event Action LobbyStatusUpdated; + public event Action LobbyReadyUpdated; public void Initialize() { @@ -40,12 +44,14 @@ namespace Content.Client.GameTicking _netManager.RegisterNetMessage(nameof(MsgTickerLobbyStatus), LobbyStatus); _netManager.RegisterNetMessage(nameof(MsgTickerLobbyInfo), LobbyInfo); _netManager.RegisterNetMessage(nameof(MsgTickerLobbyCountdown), LobbyCountdown); + _netManager.RegisterNetMessage(nameof(MsgTickerLobbyReady), LobbyReady); _netManager.RegisterNetMessage(nameof(MsgRoundEndMessage), RoundEnd); _netManager.RegisterNetMessage(nameof(MsgRequestWindowAttention), msg => { IoCManager.Resolve().RequestWindowAttention(); }); + Ready = new Dictionary(); _initialized = true; } @@ -62,6 +68,8 @@ namespace Content.Client.GameTicking IsGameStarted = message.IsRoundStarted; AreWeReady = message.YouAreReady; Paused = message.Paused; + if (IsGameStarted) + Ready.Clear(); LobbyStatusUpdated?.Invoke(); } @@ -84,9 +92,18 @@ namespace Content.Client.GameTicking Paused = message.Paused; } + private void LobbyReady(MsgTickerLobbyReady message) + { + // Merge the Dictionaries + foreach (var p in message.PlayerReady) + { + Ready[p.Key] = p.Value; + } + LobbyReadyUpdated?.Invoke(); + } + private void RoundEnd(MsgRoundEndMessage message) { - //This is not ideal at all, but I don't see an immediately better fit anywhere else. var roundEnd = new RoundEndSummaryWindow(message.GamemodeTitle, message.RoundDuration, message.AllPlayersEndInfo); diff --git a/Content.Client/Interfaces/IClientGameTicker.cs b/Content.Client/Interfaces/IClientGameTicker.cs index 8d47a0e1dc..0bedce3995 100644 --- a/Content.Client/Interfaces/IClientGameTicker.cs +++ b/Content.Client/Interfaces/IClientGameTicker.cs @@ -1,4 +1,6 @@ +using Robust.Shared.Network; using System; +using System.Collections.Generic; namespace Content.Client.Interfaces { @@ -9,9 +11,11 @@ namespace Content.Client.Interfaces bool AreWeReady { get; } DateTime StartTime { get; } bool Paused { get; } + Dictionary Ready { get; } void Initialize(); event Action InfoBlobUpdated; event Action LobbyStatusUpdated; + event Action LobbyReadyUpdated; } } diff --git a/Content.Client/State/LobbyState.cs b/Content.Client/State/LobbyState.cs index 23f1d28d83..20b4256393 100644 --- a/Content.Client/State/LobbyState.cs +++ b/Content.Client/State/LobbyState.cs @@ -99,7 +99,8 @@ namespace Content.Client.State _playerManager.PlayerListUpdated += PlayerManagerOnPlayerListUpdated; _clientGameTicker.InfoBlobUpdated += UpdateLobbyUi; - _clientGameTicker.LobbyStatusUpdated += UpdateLobbyUi; + _clientGameTicker.LobbyStatusUpdated += LobbyStatusUpdated; + _clientGameTicker.LobbyReadyUpdated += LobbyReadyUpdated; } public override void Shutdown() @@ -149,7 +150,25 @@ namespace Content.Client.State _lobby.StartTime.Text = Loc.GetString("Round Starts In: {0}", text); } - private void PlayerManagerOnPlayerListUpdated(object sender, EventArgs e) => UpdatePlayerList(); + private void PlayerManagerOnPlayerListUpdated(object sender, EventArgs e) + { + // Remove disconnected sessions from the Ready Dict + foreach (var p in _clientGameTicker.Ready) + { + if (!_playerManager.SessionsDict.TryGetValue(p.Key, out _)) + { + _clientGameTicker.Ready.Remove(p.Key); + } + } + UpdatePlayerList(); + } + private void LobbyReadyUpdated() => UpdatePlayerList(); + + private void LobbyStatusUpdated() + { + UpdatePlayerList(); + UpdateLobbyUi(); + } private void UpdateLobbyUi() { @@ -178,10 +197,24 @@ namespace Content.Client.State private void UpdatePlayerList() { _lobby.OnlinePlayerItemList.Clear(); + _lobby.PlayerReadyList.Clear(); foreach (var session in _playerManager.Sessions.OrderBy(s => s.Name)) { _lobby.OnlinePlayerItemList.AddItem(session.Name); + + var readyState = ""; + // Don't show ready state if we're ingame + if (!_clientGameTicker.IsGameStarted) + { + var ready = false; + if (session.SessionId == _playerManager.LocalPlayer.SessionId) + ready = _clientGameTicker.AreWeReady; + else + _clientGameTicker.Ready.TryGetValue(session.SessionId, out ready); + readyState = ready ? Loc.GetString("Ready") : Loc.GetString("Not Ready"); + } + _lobby.PlayerReadyList.AddItem(readyState, null, false); } } @@ -193,6 +226,7 @@ namespace Content.Client.State } _console.ProcessCommand($"toggleready {newReady}"); + UpdatePlayerList(); } } } diff --git a/Content.Client/UserInterface/LobbyGui.cs b/Content.Client/UserInterface/LobbyGui.cs index 2b077446f1..2f8caf3574 100644 --- a/Content.Client/UserInterface/LobbyGui.cs +++ b/Content.Client/UserInterface/LobbyGui.cs @@ -1,4 +1,4 @@ -using Content.Client.Chat; +using Content.Client.Chat; using Content.Client.Interfaces; using Content.Client.UserInterface.Stylesheets; using Content.Client.Utility; @@ -22,6 +22,7 @@ namespace Content.Client.UserInterface public Button LeaveButton { get; } public ChatBox Chat { get; } public ItemList OnlinePlayerItemList { get; } + public ItemList PlayerReadyList { get; } public ServerInfo ServerInfo { get; } public LobbyCharacterPreviewPanel CharacterPreview { get; } @@ -219,7 +220,25 @@ namespace Content.Client.UserInterface MarginBottomOverride = 3, Children = { - (OnlinePlayerItemList = new ItemList()) + new HBoxContainer + { + SizeFlagsHorizontal = SizeFlags.FillExpand, + CustomMinimumSize = (50,50), + Children = + { + (OnlinePlayerItemList = new ItemList + { + SizeFlagsVertical = SizeFlags.FillExpand, + SizeFlagsHorizontal = SizeFlags.FillExpand, + }), + (PlayerReadyList = new ItemList + { + SizeFlagsVertical = SizeFlags.FillExpand, + SizeFlagsHorizontal = SizeFlags.FillExpand, + SizeFlagsStretchRatio = 0.2f + }), + } + } } }, new NanoHeading diff --git a/Content.Server/GameTicking/GameTicker.cs b/Content.Server/GameTicking/GameTicker.cs index 839844f61f..476a7c55f8 100644 --- a/Content.Server/GameTicking/GameTicker.cs +++ b/Content.Server/GameTicking/GameTicker.cs @@ -49,6 +49,7 @@ using Robust.Shared.Localization; using Robust.Shared.Log; using Robust.Shared.Map; using Robust.Shared.Maths; +using Robust.Shared.Network; using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Timing; @@ -138,6 +139,7 @@ namespace Content.Server.GameTicking _netManager.RegisterNetMessage(nameof(MsgTickerLobbyStatus)); _netManager.RegisterNetMessage(nameof(MsgTickerLobbyInfo)); _netManager.RegisterNetMessage(nameof(MsgTickerLobbyCountdown)); + _netManager.RegisterNetMessage(nameof(MsgTickerLobbyReady)); _netManager.RegisterNetMessage(nameof(MsgRoundEndMessage)); _netManager.RegisterNetMessage(nameof(MsgRequestWindowAttention)); @@ -381,6 +383,7 @@ namespace Content.Server.GameTicking _playersInLobby[player] = ready; _netManager.ServerSendMessage(_getStatusMsg(player), player.ConnectedClient); + _netManager.ServerSendToAll(GetReadySingle(player, ready)); } public T AddGameRule() where T : GameRule, new() @@ -871,6 +874,7 @@ namespace Content.Server.GameTicking _netManager.ServerSendMessage(_netManager.CreateNetMessage(), session.ConnectedClient); _netManager.ServerSendMessage(_getStatusMsg(session), session.ConnectedClient); _netManager.ServerSendMessage(GetInfoMsg(), session.ConnectedClient); + _netManager.ServerSendMessage(GetReadyStatus(), session.ConnectedClient); } private void _playerJoinGame(IPlayerSession session) @@ -882,6 +886,26 @@ namespace Content.Server.GameTicking _netManager.ServerSendMessage(_netManager.CreateNetMessage(), session.ConnectedClient); } + private MsgTickerLobbyReady GetReadyStatus() + { + var msg = _netManager.CreateNetMessage(); + msg.PlayerReady = new Dictionary(); + foreach (var player in _playersInLobby.Keys) + { + _playersInLobby.TryGetValue(player, out var ready); + msg.PlayerReady.Add(player.SessionId, ready); + } + return msg; + } + + private MsgTickerLobbyReady GetReadySingle(IPlayerSession player, bool ready) + { + var msg = _netManager.CreateNetMessage(); + msg.PlayerReady = new Dictionary(); + msg.PlayerReady.Add(player.SessionId, ready); + return msg; + } + private MsgTickerLobbyStatus _getStatusMsg(IPlayerSession session) { _playersInLobby.TryGetValue(session, out var ready); diff --git a/Content.Shared/SharedGameTicker.cs b/Content.Shared/SharedGameTicker.cs index 669a6acb93..d7100f93e4 100644 --- a/Content.Shared/SharedGameTicker.cs +++ b/Content.Shared/SharedGameTicker.cs @@ -1,7 +1,10 @@ using System; using System.Collections.Generic; +using System.IO; using Lidgren.Network; using Robust.Shared.Interfaces.Network; +using Robust.Shared.Interfaces.Serialization; +using Robust.Shared.IoC; using Robust.Shared.Network; namespace Content.Shared @@ -152,6 +155,57 @@ namespace Content.Shared } } + protected class MsgTickerLobbyReady : NetMessage + { + #region REQUIRED + + public const MsgGroups GROUP = MsgGroups.Command; + public const string NAME = nameof(MsgTickerLobbyReady); + public MsgTickerLobbyReady(INetChannel channel) : base(NAME, GROUP) { } + + #endregion + + /// + /// The Players Ready (SessionID:ready) + /// + public Dictionary PlayerReady { get; set; } + + public override void ReadFromBuffer(NetIncomingMessage buffer) + { + PlayerReady = new Dictionary(); + var length = buffer.ReadInt32(); + for (int i = 0; i < length; i++) + { + var serializer = IoCManager.Resolve(); + var byteLength = buffer.ReadVariableInt32(); + NetSessionId sessionID; + using (var stream = buffer.ReadAsStream(byteLength)) + { + serializer.DeserializeDirect(stream, out sessionID); + } + var ready = buffer.ReadBoolean(); + PlayerReady.Add(sessionID, ready); + } + } + + public override void WriteToBuffer(NetOutgoingMessage buffer) + { + var serializer = IoCManager.Resolve(); + buffer.Write(PlayerReady.Count); + foreach (var p in PlayerReady) + { + using (var stream = new MemoryStream()) + { + serializer.SerializeDirect(stream, p.Key); + buffer.WriteVariableInt32((int) stream.Length); + stream.TryGetBuffer(out var segment); + buffer.Write(segment); + } + buffer.Write(p.Value); + } + } + } + public struct RoundEndPlayerInfo { From 04bc20c36540fd9228fbd15121e236b03d238889 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Tue, 18 Aug 2020 23:14:55 +1000 Subject: [PATCH 41/81] AI sleeping (#1708) * AI sleeping AI no longer update when dead. * It was easier to merge master and re-apply it. * Update AiControllerComponent.cs Co-authored-by: Metal Gear Sloth Co-authored-by: DrSmugleaf --- .../AI/Utility/AiLogic/UtilityAI.cs | 43 ++++++++++---- .../Movement/AiControllerComponent.cs | 6 +- .../GameObjects/EntitySystems/AI/AiSystem.cs | 56 +++++++++++++------ .../EntitySystems/AI/SleepAiMessage.cs | 24 ++++++++ 4 files changed, 101 insertions(+), 28 deletions(-) create mode 100644 Content.Server/GameObjects/EntitySystems/AI/SleepAiMessage.cs diff --git a/Content.Server/AI/Utility/AiLogic/UtilityAI.cs b/Content.Server/AI/Utility/AiLogic/UtilityAI.cs index 6c15106012..b92d55ce1f 100644 --- a/Content.Server/AI/Utility/AiLogic/UtilityAI.cs +++ b/Content.Server/AI/Utility/AiLogic/UtilityAI.cs @@ -6,10 +6,13 @@ using Content.Server.AI.Utility.Actions; using Content.Server.AI.Utility.BehaviorSets; using Content.Server.AI.WorldState; using Content.Server.AI.WorldState.States.Utility; +using Content.Server.GameObjects.EntitySystems.AI; using Content.Server.GameObjects.EntitySystems.AI.LoadBalancer; using Content.Server.GameObjects.EntitySystems.JobQueues; using Content.Shared.GameObjects.Components.Damage; using Robust.Server.AI; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Systems; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Log; @@ -62,6 +65,13 @@ namespace Content.Server.AI.Utility.AiLogic { SortActions(); } + + if (BehaviorSets.Count == 1 && !EntitySystem.Get().IsAwake(this)) + { + IoCManager.Resolve() + .EventBus + .RaiseEvent(EventSource.Local, new SleepAiMessage(this, false)); + } } public void RemoveBehaviorSet(Type behaviorSet) @@ -73,6 +83,13 @@ namespace Content.Server.AI.Utility.AiLogic BehaviorSets.Remove(behaviorSet); SortActions(); } + + if (BehaviorSets.Count == 0) + { + IoCManager.Resolve() + .EventBus + .RaiseEvent(EventSource.Local, new SleepAiMessage(this, true)); + } } /// @@ -133,7 +150,23 @@ namespace Content.Server.AI.Utility.AiLogic private void DeathHandle(HealthChangedEventArgs eventArgs) { + var oldDeadState = _isDead; _isDead = eventArgs.Damageable.CurrentDamageState == DamageState.Dead || eventArgs.Damageable.CurrentDamageState == DamageState.Critical; + + if (oldDeadState != _isDead) + { + var entityManager = IoCManager.Resolve(); + + switch (_isDead) + { + case true: + entityManager.EventBus.RaiseEvent(EventSource.Local, new SleepAiMessage(this, true)); + break; + case false: + entityManager.EventBus.RaiseEvent(EventSource.Local, new SleepAiMessage(this, false)); + break; + } + } } private void ReceivedAction() @@ -167,16 +200,6 @@ namespace Content.Server.AI.Utility.AiLogic public override void Update(float frameTime) { - // If we can't do anything then there's no point thinking - if (_isDead || BehaviorSets.Count == 0) - { - _actionCancellation?.Cancel(); - _blackboard.GetState().SetValue(0.0f); - CurrentAction?.Shutdown(); - CurrentAction = null; - return; - } - // If we asked for a new action we don't want to dump the existing one. if (_actionRequest != null) { diff --git a/Content.Server/GameObjects/Components/Movement/AiControllerComponent.cs b/Content.Server/GameObjects/Components/Movement/AiControllerComponent.cs index 26b450ca47..ac635153e2 100644 --- a/Content.Server/GameObjects/Components/Movement/AiControllerComponent.cs +++ b/Content.Server/GameObjects/Components/Movement/AiControllerComponent.cs @@ -1,7 +1,9 @@ -using Content.Shared.GameObjects.Components.Movement; +using Content.Server.GameObjects.EntitySystems.AI; +using Content.Shared.GameObjects.Components.Movement; using Robust.Server.AI; using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Components; +using Robust.Shared.GameObjects.Systems; using Robust.Shared.Map; using Robust.Shared.Maths; using Robust.Shared.Serialization; @@ -45,6 +47,8 @@ namespace Content.Server.GameObjects.Components.Movement // This component requires a collidable component. if (!Owner.HasComponent()) Owner.AddComponent(); + + EntitySystem.Get().ProcessorInitialize(this); } /// diff --git a/Content.Server/GameObjects/EntitySystems/AI/AiSystem.cs b/Content.Server/GameObjects/EntitySystems/AI/AiSystem.cs index 01139bf7af..b04aca780e 100644 --- a/Content.Server/GameObjects/EntitySystems/AI/AiSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/AI/AiSystem.cs @@ -1,4 +1,5 @@ -using System; +#nullable enable +using System; using System.Collections.Generic; using Content.Server.GameObjects.Components.Movement; using Content.Shared.GameObjects.Components.Movement; @@ -19,23 +20,31 @@ namespace Content.Server.GameObjects.EntitySystems.AI [UsedImplicitly] internal class AiSystem : EntitySystem { -#pragma warning disable 649 - [Dependency] private readonly IPauseManager _pauseManager; - [Dependency] private readonly IDynamicTypeFactory _typeFactory; - [Dependency] private readonly IReflectionManager _reflectionManager; -#pragma warning restore 649 + [Dependency] private readonly IDynamicTypeFactory _typeFactory = default!; + [Dependency] private readonly IReflectionManager _reflectionManager = default!; private readonly Dictionary _processorTypes = new Dictionary(); + + /// + /// To avoid iterating over dead AI continuously they can wake and sleep themselves when necessary. + /// + private readonly HashSet _awakeAi = new HashSet(); + + // To avoid modifying awakeAi while iterating over it. + private readonly List _queuedSleepMessages = new List(); + public bool IsAwake(AiLogicProcessor processor) => _awakeAi.Contains(processor); + /// public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(HandleAiSleep); var processors = _reflectionManager.GetAllChildren(); foreach (var processor in processors) { - var att = (AiLogicProcessorAttribute)Attribute.GetCustomAttribute(processor, typeof(AiLogicProcessorAttribute)); + var att = (AiLogicProcessorAttribute) Attribute.GetCustomAttribute(processor, typeof(AiLogicProcessorAttribute))!; // Tests should pick this up DebugTools.AssertNotNull(att); _processorTypes.Add(att.SerializeName, processor); @@ -45,23 +54,35 @@ namespace Content.Server.GameObjects.EntitySystems.AI /// public override void Update(float frameTime) { - foreach (var comp in ComponentManager.EntityQuery()) + foreach (var message in _queuedSleepMessages) { - if (_pauseManager.IsEntityPaused(comp.Owner)) + switch (message.Sleep) { - continue; + case true: + _awakeAi.Remove(message.Processor); + break; + case false: + _awakeAi.Add(message.Processor); + break; } - - ProcessorInitialize(comp); - - var processor = comp.Processor; - + } + + _queuedSleepMessages.Clear(); + + foreach (var processor in _awakeAi) + { processor.Update(frameTime); } } + private void HandleAiSleep(SleepAiMessage message) + { + _queuedSleepMessages.Add(message); + } + /// - /// Will start up the controller's processor if not already done so + /// Will start up the controller's processor if not already done so. + /// Also add them to the awakeAi for updates. /// /// public void ProcessorInitialize(AiControllerComponent controller) @@ -70,6 +91,7 @@ namespace Content.Server.GameObjects.EntitySystems.AI controller.Processor = CreateProcessor(controller.LogicName); controller.Processor.SelfEntity = controller.Owner; controller.Processor.Setup(); + _awakeAi.Add(controller.Processor); } private AiLogicProcessor CreateProcessor(string name) @@ -94,7 +116,7 @@ namespace Content.Server.GameObjects.EntitySystems.AI + "\n processorId: Class that inherits AiLogicProcessor and has an AiLogicProcessor attribute." + "\n entityID: Uid of entity to add the AiControllerComponent to. Open its VV menu to find this."; - public void Execute(IConsoleShell shell, IPlayerSession player, string[] args) + public void Execute(IConsoleShell shell, IPlayerSession? player, string[] args) { if(args.Length != 2) { diff --git a/Content.Server/GameObjects/EntitySystems/AI/SleepAiMessage.cs b/Content.Server/GameObjects/EntitySystems/AI/SleepAiMessage.cs new file mode 100644 index 0000000000..28f6674a80 --- /dev/null +++ b/Content.Server/GameObjects/EntitySystems/AI/SleepAiMessage.cs @@ -0,0 +1,24 @@ +using Robust.Server.AI; +using Robust.Shared.GameObjects; + +namespace Content.Server.GameObjects.EntitySystems.AI +{ + /// + /// Indicates whether an AI should be updated by the AiSystem or not. + /// Useful to sleep AI when they die or otherwise should be inactive. + /// + internal sealed class SleepAiMessage : EntitySystemMessage + { + /// + /// Sleep or awake. + /// + public bool Sleep { get; } + public AiLogicProcessor Processor { get; } + + public SleepAiMessage(AiLogicProcessor processor, bool sleep) + { + Processor = processor; + Sleep = sleep; + } + } +} \ No newline at end of file From 8ea9e4cd905bb17cc86628bed27f07d3bd32d97d Mon Sep 17 00:00:00 2001 From: DrSmugleaf Date: Tue, 18 Aug 2020 16:41:35 +0200 Subject: [PATCH 42/81] Fix unknown component errors and duplicate damageable references (#1778) --- Content.Client/IgnoredComponents.cs | 1 + .../GameObjects/Components/Damage/DamageableComponent.cs | 1 + .../Prototypes/Entities/Constructible/Ground/pilot_chair.yml | 1 - Resources/Prototypes/Entities/Constructible/Walls/signs.yml | 1 - Resources/Prototypes/Entities/Constructible/disposal.yml | 1 - Resources/Prototypes/Entities/Mobs/NPCs/animals.yml | 4 ---- Resources/Prototypes/Entities/Mobs/NPCs/carp.yml | 4 ---- Resources/Prototypes/Entities/Mobs/NPCs/pets.yml | 5 ----- Resources/Prototypes/Entities/Mobs/Species/human.yml | 1 - .../Entities/Objects/Weapons/Guns/Explosives/grenades.yml | 1 - 10 files changed, 2 insertions(+), 18 deletions(-) diff --git a/Content.Client/IgnoredComponents.cs b/Content.Client/IgnoredComponents.cs index a032972f02..fd11f67b25 100644 --- a/Content.Client/IgnoredComponents.cs +++ b/Content.Client/IgnoredComponents.cs @@ -157,6 +157,7 @@ "DamageOnHighSpeedImpact", "Barotrauma", "MobStateManager", + "Metabolism", }; } } diff --git a/Content.Shared/GameObjects/Components/Damage/DamageableComponent.cs b/Content.Shared/GameObjects/Components/Damage/DamageableComponent.cs index 614bf90abd..2d31eeb42b 100644 --- a/Content.Shared/GameObjects/Components/Damage/DamageableComponent.cs +++ b/Content.Shared/GameObjects/Components/Damage/DamageableComponent.cs @@ -17,6 +17,7 @@ namespace Content.Shared.GameObjects.Components.Damage /// Component that allows attached entities to take damage. /// This basic version never dies (thus can take an indefinite amount of damage). /// + [RegisterComponent] [ComponentReference(typeof(IDamageableComponent))] public class DamageableComponent : Component, IDamageableComponent { diff --git a/Resources/Prototypes/Entities/Constructible/Ground/pilot_chair.yml b/Resources/Prototypes/Entities/Constructible/Ground/pilot_chair.yml index 1a9307108f..f986636ee2 100644 --- a/Resources/Prototypes/Entities/Constructible/Ground/pilot_chair.yml +++ b/Resources/Prototypes/Entities/Constructible/Ground/pilot_chair.yml @@ -13,7 +13,6 @@ - type: Collidable - type: Clickable - type: InteractionOutline - - type: Damageable - type: Destructible maxHP: 100 - type: Physics diff --git a/Resources/Prototypes/Entities/Constructible/Walls/signs.yml b/Resources/Prototypes/Entities/Constructible/Walls/signs.yml index 3d9cb3c09f..222ff68297 100644 --- a/Resources/Prototypes/Entities/Constructible/Walls/signs.yml +++ b/Resources/Prototypes/Entities/Constructible/Walls/signs.yml @@ -8,7 +8,6 @@ - type: Collidable shapes: - !type:PhysShapeAabb - - type: Damageable - type: Destructible thresholdvalue: 5 - type: Sprite diff --git a/Resources/Prototypes/Entities/Constructible/disposal.yml b/Resources/Prototypes/Entities/Constructible/disposal.yml index f5fe46c91e..5187ce2a88 100644 --- a/Resources/Prototypes/Entities/Constructible/disposal.yml +++ b/Resources/Prototypes/Entities/Constructible/disposal.yml @@ -13,7 +13,6 @@ - type: SnapGrid offset: Center - type: Anchorable - - type: Damageable - type: Breakable - type: Rotatable diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index a321ae397e..9ab31e8bcb 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -39,14 +39,10 @@ layer: - Opaque - MobImpassable - - type: Species - Template: Human - HeatResistance: 50 - type: BodyManager BaseTemplate: bodyTemplate.Humanoid BasePreset: bodyPreset.BasicHuman - type: HeatResistance - - type: Damageable - type: CombatMode - type: Teleportable - type: Stunnable diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml index fe506f344b..00d7371892 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml @@ -34,14 +34,10 @@ layer: - Opaque - MobImpassable - - type: Species - Template: Human - HeatResistance: 323 - type: BodyManager BaseTemplate: bodyTemplate.Humanoid BasePreset: bodyPreset.BasicHuman - type: HeatResistance - - type: Damageable - type: CombatMode - type: Teleportable - type: Stunnable diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml index 284b5124ec..fc01a43eb8 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml @@ -31,14 +31,10 @@ layer: - Opaque - MobImpassable - - type: Species - Template: Human - HeatResistance: 50 - type: BodyManager BaseTemplate: bodyTemplate.Humanoid BasePreset: bodyPreset.BasicHuman - type: HeatResistance - - type: Damageable - type: CombatMode - type: Teleportable - type: Stunnable @@ -64,7 +60,6 @@ drawdepth: Mobs suffix: AI components: - - type: Damageable - type: Sprite drawdepth: Mobs sprite: Mobs/Pets/corgi.rsi diff --git a/Resources/Prototypes/Entities/Mobs/Species/human.yml b/Resources/Prototypes/Entities/Mobs/Species/human.yml index d12d5fd9f0..637f722349 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/human.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/human.yml @@ -258,7 +258,6 @@ baseTemplate: bodyTemplate.Humanoid basePreset: bodyPreset.BasicHuman - type: MobStateManager - - type: Damageable - type: Appearance visuals: - type: RotationVisualizer diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Explosives/grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Explosives/grenades.yml index e8b4a9dd96..ffe5c80017 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Explosives/grenades.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Explosives/grenades.yml @@ -106,7 +106,6 @@ devastationRange: 25 heavyImpactRange: 25 flashRange: 50 - - type: Damageable - type: Destructible thresholdvalue: 50 - type: Appearance From 7664b309510d12e3cbd437fd92b0bd82fa577aa7 Mon Sep 17 00:00:00 2001 From: SoulSloth <67545203+SoulSloth@users.noreply.github.com> Date: Tue, 18 Aug 2020 11:45:49 -0400 Subject: [PATCH 43/81] Add a fire extinguisher (#1685) * added a lantern * Add A Lantern with radiating light * Added a GasVapor system and made a base for extinguisher spray. * switched to using solution component for fire extinguisher * made it so fire extinguisher's can run out of water vapor * Added actual Gas to Gas Vapor, now getting atmosphere for touched tiles. * Made it so gasVapor reacts and dissapates on reacting * GasVapor now dissapates exponentially while traveling * Added in-hands for fire extinguisher * Added Spraysound to gasSprayer and to fire extinguisher prototype * parameterized GasSprayer and GasVapor * removed un-used imports in gasSprayer and gasVapor components and systems * removed accidential threading import into gasmixturecomponent * add a shared extinguisher component for extinguisher spray rotation instead of piggy-backing on RogueArrow * paremeterized fuelCost and fuel name in GasSprayerComponent * Paremeterized gasAmount, removed un-used code from gasVaporComponent * Removed BaseItem Parent from Extinguisher_spray * added GasVapor and GasSprayer to Ingored Components list * reduced offset of spawned extinguisher vapor from player * Update IgnoredComponents.cs * renamed SharedExtinguisherComponent to SharedGasSprayerComponent and removed reference to RoguePointingArrow * renamed shareExtinguisherComponent to SharedGasSprayerComponent * Update Content.Server/Atmos/GasSprayerComponent.cs Added check for solution component on GasSprayer. Co-authored-by: DrSmugleaf * Update Content.Server/Atmos/GasSprayerComponent.cs Co-authored-by: DrSmugleaf --- .../Atmos/ExtinguisherVisualizer.cs | 67 ++++++++++ Content.Client/IgnoredComponents.cs | 2 + Content.Server/Atmos/GasSprayerComponent.cs | 74 +++++++++++ Content.Server/Atmos/GasVaporComponent.cs | 120 ++++++++++++++++++ .../EntitySystems/GasVaporSystem.cs | 20 +++ .../Components/SharedGasSprayerComponent.cs | 17 +++ Content.Shared/Physics/GasVaporController.cs | 16 +++ .../Objects/Misc/extinguisher_spray.yml | 28 ++++ .../Objects/Misc/fire_extinguisher.yml | 29 ++++- .../Textures/Effects/explosion.rsi/meta.json | 26 +++- .../extinguisherSpray.rsi/extinguish.png | Bin 0 -> 55777 bytes .../Effects/extinguisherSpray.rsi/meta.json | 63 +++++++++ .../Objects/Misc/fire_extinguisher.png | Bin 230 -> 0 bytes .../fire_extinguisher_closed.png | Bin 0 -> 429 bytes .../fire_extinguisher_open.png | Bin 0 -> 420 bytes .../fire_extinguisher.rsi/inhand-left.png | Bin 0 -> 284 bytes .../fire_extinguisher.rsi/inhand-right.png | Bin 0 -> 284 bytes .../Misc/fire_extinguisher.rsi/meta.json | 65 ++++++++++ .../Objects/Tools/lantern.rsi/meta.json | 2 +- 19 files changed, 521 insertions(+), 8 deletions(-) create mode 100644 Content.Client/GameObjects/Components/Atmos/ExtinguisherVisualizer.cs create mode 100644 Content.Server/Atmos/GasSprayerComponent.cs create mode 100644 Content.Server/Atmos/GasVaporComponent.cs create mode 100644 Content.Server/GameObjects/EntitySystems/GasVaporSystem.cs create mode 100644 Content.Shared/GameObjects/Components/SharedGasSprayerComponent.cs create mode 100644 Content.Shared/Physics/GasVaporController.cs create mode 100644 Resources/Prototypes/Entities/Objects/Misc/extinguisher_spray.yml create mode 100644 Resources/Textures/Effects/extinguisherSpray.rsi/extinguish.png create mode 100644 Resources/Textures/Effects/extinguisherSpray.rsi/meta.json delete mode 100644 Resources/Textures/Objects/Misc/fire_extinguisher.png create mode 100644 Resources/Textures/Objects/Misc/fire_extinguisher.rsi/fire_extinguisher_closed.png create mode 100644 Resources/Textures/Objects/Misc/fire_extinguisher.rsi/fire_extinguisher_open.png create mode 100644 Resources/Textures/Objects/Misc/fire_extinguisher.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Misc/fire_extinguisher.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Misc/fire_extinguisher.rsi/meta.json diff --git a/Content.Client/GameObjects/Components/Atmos/ExtinguisherVisualizer.cs b/Content.Client/GameObjects/Components/Atmos/ExtinguisherVisualizer.cs new file mode 100644 index 0000000000..6a33b51e00 --- /dev/null +++ b/Content.Client/GameObjects/Components/Atmos/ExtinguisherVisualizer.cs @@ -0,0 +1,67 @@ +using System; +using JetBrains.Annotations; +using Robust.Client.Animations; +using Robust.Client.GameObjects; +using Robust.Client.GameObjects.Components.Animations; +using Robust.Client.Interfaces.GameObjects.Components; +using Robust.Shared.Animations; +using Robust.Shared.Maths; +using Content.Shared.GameObjects.Components; + +namespace Content.Client.GameObjects.Components.Atmos +{ + [UsedImplicitly] + public class ExtinguisherVisualizer : AppearanceVisualizer + { + + public override void OnChangeData(AppearanceComponent component) + { + base.OnChangeData(component); + + if (component.Deleted) + { + return; + } + + if (component.TryGetData(ExtinguisherVisuals.Rotation, out var degrees)) + { + SetRotation(component, Angle.FromDegrees(degrees)); + } + } + + private void SetRotation(AppearanceComponent component, Angle rotation) + { + var sprite = component.Owner.GetComponent(); + + if (!sprite.Owner.TryGetComponent(out AnimationPlayerComponent animation)) + { + sprite.Rotation = rotation; + return; + } + + if (animation.HasRunningAnimation("rotate")) + { + animation.Stop("rotate"); + } + + animation.Play(new Animation + { + Length = TimeSpan.FromSeconds(0.125), + AnimationTracks = + { + new AnimationTrackComponentProperty + { + ComponentType = typeof(ISpriteComponent), + Property = nameof(ISpriteComponent.Rotation), + InterpolationMode = AnimationInterpolationMode.Linear, + KeyFrames = + { + new AnimationTrackProperty.KeyFrame(sprite.Rotation, 0), + new AnimationTrackProperty.KeyFrame(rotation, 0.125f) + } + } + } + }, "rotate"); + } + } +} diff --git a/Content.Client/IgnoredComponents.cs b/Content.Client/IgnoredComponents.cs index fd11f67b25..d4588e5c84 100644 --- a/Content.Client/IgnoredComponents.cs +++ b/Content.Client/IgnoredComponents.cs @@ -156,6 +156,8 @@ "Vapor", "DamageOnHighSpeedImpact", "Barotrauma", + "GasSprayer", + "GasVapor", "MobStateManager", "Metabolism", }; diff --git a/Content.Server/Atmos/GasSprayerComponent.cs b/Content.Server/Atmos/GasSprayerComponent.cs new file mode 100644 index 0000000000..4b78d413a9 --- /dev/null +++ b/Content.Server/Atmos/GasSprayerComponent.cs @@ -0,0 +1,74 @@ +using Content.Server.GameObjects.Components.Chemistry; +using Content.Server.Interfaces; +using Content.Shared.Chemistry; +using Content.Shared.GameObjects.Components; +using Content.Shared.GameObjects.Components.Pointing; +using Content.Shared.Interfaces.GameObjects.Components; +using Robust.Server.GameObjects; +using Robust.Server.GameObjects.EntitySystems; +using Robust.Server.Interfaces.GameObjects; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Systems; +using Robust.Shared.IoC; +using Robust.Shared.Localization; +using Robust.Shared.Maths; +using Robust.Shared.Serialization; + + +namespace Content.Server.Atmos +{ + [RegisterComponent] + public class GasSprayerComponent : Component, IAfterInteract + { +#pragma warning disable 649 + [Dependency] private readonly IServerNotifyManager _notifyManager = default!; + [Dependency] private readonly IServerEntityManager _serverEntityManager = default!; +#pragma warning restore 649 + + //TODO: create a function that can create a gas based on a solution mix + public override string Name => "GasSprayer"; + + private string _spraySound; + private string _sprayType; + private string _fuelType; + private string _fuelName; + private int _fuelCost; + + public override void ExposeData(ObjectSerializer serializer) + { + base.ExposeData(serializer); + serializer.DataField(ref _spraySound, "spraySound", string.Empty); + serializer.DataField(ref _sprayType, "sprayType", string.Empty); + serializer.DataField(ref _fuelType, "fuelType", string.Empty); + serializer.DataField(ref _fuelName, "fuelName", "fuel"); + serializer.DataField(ref _fuelCost, "fuelCost", 50); + } + + public void AfterInteract(AfterInteractEventArgs eventArgs) + { + if (!Owner.TryGetComponent(out SolutionComponent tank)) + return; + + if (tank.Solution.GetReagentQuantity(_fuelType) == 0) + { + _notifyManager.PopupMessage(Owner, eventArgs.User, + Loc.GetString("{0:theName} is out of {1}!", Owner, _fuelName)); + } + else + { + tank.TryRemoveReagent(_fuelType, ReagentUnit.New(_fuelCost)); + + var playerPos = eventArgs.User.Transform.GridPosition; + var direction = (eventArgs.ClickLocation.Position - playerPos.Position).Normalized; + playerPos.Offset(direction/2); + + var spray = _serverEntityManager.SpawnEntity(_sprayType, playerPos); + spray.GetComponent() + .SetData(ExtinguisherVisuals.Rotation, direction.ToAngle().Degrees); + spray.GetComponent().StartMove(direction, 5); + + EntitySystem.Get().PlayFromEntity(_spraySound, Owner); + } + } + } +} diff --git a/Content.Server/Atmos/GasVaporComponent.cs b/Content.Server/Atmos/GasVaporComponent.cs new file mode 100644 index 0000000000..b28d2396a6 --- /dev/null +++ b/Content.Server/Atmos/GasVaporComponent.cs @@ -0,0 +1,120 @@ +using Content.Shared.Physics; +using Content.Server.Atmos.Reactions; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Components; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.Map; +using Robust.Shared.IoC; +using Robust.Shared.Maths; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; +using Content.Server.GameObjects.Components.Atmos; +using Content.Server.Interfaces; +using Content.Shared.Atmos; + +namespace Content.Server.Atmos +{ + [RegisterComponent] + class GasVaporComponent : Component, ICollideBehavior, IGasMixtureHolder + { + [Dependency] private readonly IMapManager _mapManager = default!; + public override string Name => "GasVapor"; + + [ViewVariables] public GasMixture Air { get; set; } + + private bool _running; + private Vector2 _direction; + private float _velocity; + private float _disspateTimer = 0; + private float _dissipationInterval; + private Gas _gas; + private float _gasVolume; + private float _gasTemperature; + private float _gasAmount; + + public override void Initialize() + { + base.Initialize(); + Air = new GasMixture(_gasVolume){Temperature = _gasTemperature}; + Air.SetMoles(_gas,_gasAmount); + } + + public override void ExposeData(ObjectSerializer serializer) + { + base.ExposeData(serializer); + serializer.DataField(ref _dissipationInterval, "dissipationInterval", 1); + serializer.DataField(ref _gas, "gas", Gas.WaterVapor); + serializer.DataField(ref _gasVolume, "gasVolume", 200); + serializer.DataField(ref _gasTemperature, "gasTemperature", Atmospherics.T20C); + serializer.DataField(ref _gasAmount, "gasAmount", 20); + } + + public void StartMove(Vector2 dir, float velocity) + { + _running = true; + _direction = dir; + _velocity = velocity; + + if (Owner.TryGetComponent(out ICollidableComponent collidable)) + { + var controller = collidable.EnsureController(); + controller.Move(_direction, _velocity); + } + } + + public void Update(float frameTime) + { + if (!_running) + return; + + if (Owner.TryGetComponent(out ICollidableComponent collidable)) + { + var worldBounds = collidable.WorldAABB; + var mapGrid = _mapManager.GetGrid(Owner.Transform.GridID); + + var tiles = mapGrid.GetTilesIntersecting(worldBounds); + + foreach (var tile in tiles) + { + var pos = tile.GridIndices.ToGridCoordinates(_mapManager, tile.GridIndex); + var atmos = AtmosHelpers.GetTileAtmosphere(pos); + + if (atmos.Air == null) + { + return; + } + + if (atmos.Air.React(this) != ReactionResult.NoReaction) + { + Owner.Delete(); + } + } + } + + _disspateTimer += frameTime; + if (_disspateTimer > _dissipationInterval) + { + Air.SetMoles(_gas, Air.TotalMoles/2 ); + } + + if (Air.TotalMoles < 1) + { + Owner.Delete(); + } + } + + void ICollideBehavior.CollideWith(IEntity collidedWith) + { + // Check for collision with a impassable object (e.g. wall) and stop + if (collidedWith.TryGetComponent(out ICollidableComponent collidable) && + (collidable.CollisionLayer & (int) CollisionGroup.Impassable) != 0 && + collidable.Hard && + Owner.TryGetComponent(out ICollidableComponent coll)) + { + var controller = coll.EnsureController(); + controller.Stop(); + Owner.Delete(); + } + } + } +} diff --git a/Content.Server/GameObjects/EntitySystems/GasVaporSystem.cs b/Content.Server/GameObjects/EntitySystems/GasVaporSystem.cs new file mode 100644 index 0000000000..a12600f634 --- /dev/null +++ b/Content.Server/GameObjects/EntitySystems/GasVaporSystem.cs @@ -0,0 +1,20 @@ +using Content.Server.Atmos; +using Robust.Shared.GameObjects.Systems; + +namespace Content.Server.GameObjects.EntitySystems +{ + public class GasVaporSystem : EntitySystem + { + /// + public override void Update(float frameTime) + { + foreach (var GasVapor in ComponentManager.EntityQuery()) + { + if (GasVapor.Initialized) + { + GasVapor.Update(frameTime); + } + } + } + } +} diff --git a/Content.Shared/GameObjects/Components/SharedGasSprayerComponent.cs b/Content.Shared/GameObjects/Components/SharedGasSprayerComponent.cs new file mode 100644 index 0000000000..a15f92882c --- /dev/null +++ b/Content.Shared/GameObjects/Components/SharedGasSprayerComponent.cs @@ -0,0 +1,17 @@ +using System; +using Robust.Shared.GameObjects; +using Robust.Shared.Serialization; + +namespace Content.Shared.GameObjects.Components +{ + public class SharedGasSprayerComponent : Component + { + public sealed override string Name => "GasSprayer"; + } + + [Serializable, NetSerializable] + public enum ExtinguisherVisuals + { + Rotation + } +} diff --git a/Content.Shared/Physics/GasVaporController.cs b/Content.Shared/Physics/GasVaporController.cs new file mode 100644 index 0000000000..d58c15176d --- /dev/null +++ b/Content.Shared/Physics/GasVaporController.cs @@ -0,0 +1,16 @@ +using Robust.Shared.Maths; +using Robust.Shared.Physics; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Content.Shared.Physics +{ + public class GasVaporController : VirtualController + { + public void Move(Vector2 velocityDirection, float speed) + { + LinearVelocity = velocityDirection * speed; + } + } +} diff --git a/Resources/Prototypes/Entities/Objects/Misc/extinguisher_spray.yml b/Resources/Prototypes/Entities/Objects/Misc/extinguisher_spray.yml new file mode 100644 index 0000000000..da84fe7e02 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Misc/extinguisher_spray.yml @@ -0,0 +1,28 @@ +- type: entity + name: Extinguisher Spray + id: ExtinguisherSpray + description: Extinguisher Spray + components: + - type: Sprite + sprite: Effects/extinguisherSpray.rsi + layers: + - state: extinguish + - type: Icon + sprite: Effects/extinguisherSpray.rsi + state: extinguish + - type: GasVapor + dissipationInterval: 1 + gas: WaterVapor + gasVolume: 200 + gasTemperature: 293.15 + gasAmount: 20 + - type: Physics + - type: Collidable + shapes: + - !type:PhysShapeAabb + bounds: "-0.25,-0.25,0.25,0.25" + mask: + - Impassable + - type: Appearance + visuals: + - type: ExtinguisherVisualizer diff --git a/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml b/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml index a6c264b1d7..c341ef56d0 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml @@ -4,9 +4,26 @@ id: FireExtinguisher description: Extinguishes fires. components: - - type: Sprite - texture: Objects/Misc/fire_extinguisher.png - - type: Icon - texture: Objects/Misc/fire_extinguisher.png - - type: Item - size: 10 + - type: Sprite + sprite: Objects/Misc/fire_extinguisher.rsi + layers: + - state: fire_extinguisher_open + - type: Icon + sprite: Objects/Misc/fire_extinguisher.rsi + state: fire_extinguisher_open + - type: Item + sprite: Objects/Misc/fire_extinguisher.rsi + size: 10 + - type: Solution + maxVol: 1000 + caps: 9 + contents: + reagents: + - ReagentId: chem.H2O + Quantity: 1000 + - type: GasSprayer + spraySound: /Audio/Effects/spray.ogg + sprayType: ExtinguisherSpray + fuelType: chem.H2O + fuelName: water + fuelCost: 50 diff --git a/Resources/Textures/Effects/explosion.rsi/meta.json b/Resources/Textures/Effects/explosion.rsi/meta.json index d552172063..c70a3e60f8 100644 --- a/Resources/Textures/Effects/explosion.rsi/meta.json +++ b/Resources/Textures/Effects/explosion.rsi/meta.json @@ -1 +1,25 @@ -{"version": 1, "size": {"x": 96, "y": 96}, "states": [{"name": "explosionfast", "directions": 1, "delays": [[0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06, 0.06]]}]} \ No newline at end of file +{ + "version": 1, + "size": { + "x": 96, + "y": 96 + }, + "states": [ + { + "name": "explosionfast", + "directions": 1, + "delays": [ + [ + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06, + 0.06 + ] + ] + } + ] +} diff --git a/Resources/Textures/Effects/extinguisherSpray.rsi/extinguish.png b/Resources/Textures/Effects/extinguisherSpray.rsi/extinguish.png new file mode 100644 index 0000000000000000000000000000000000000000..0eb6d7ebd5400499b1985302c84b78cdd3fa5f98 GIT binary patch literal 55777 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 X=)Z>>r~yxk00000NkvXXu0mjfX^*j% literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/fire_extinguisher_open.png b/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/fire_extinguisher_open.png new file mode 100644 index 0000000000000000000000000000000000000000..7909d14f269cea522d6e0b9033e83d81451f94ca GIT binary patch literal 420 zcmV;V0bBlwP)D?MlYxBSJZ3V}lTyMx)4MCZ6=((O7AT5B zZzErahkRk%q2 z;Rw#MOoLu6OD5|1E@d+nAUJ}tKj?Phxzhpab41tzRCBvO^LB$C&H85P8wNd%I@-DKEoY=CdBuG2M&M++VT# ze!S~iHjkhBp>Llq-NpMth&LnFA^Y9^+kgCPOHO=0#|$x_fnopJl==guMqBRZo=MbK z2(SOm%va60^UgQ+JAMvbAFm#s{)Y8Q(Ovl!hB9C0J>U84@86OcY+Ljem~MZ+@~X`I czl;k`@Y-kuSKmF&c@AWxr>mdKI;Vst0LVXiZvX%Q literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/inhand-right.png b/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..fb697da3566cbff8c83c5fb85a8fd37c93211b3c GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=k3C%+Ln`LHy|t0|kbyw!L-uLa z-x4&-JUqQm3-vtoosf~a>BvO^LB$C&H85P8wNd%I@-DKEoY=CdBuG2M&M++VT# ze!S~iHjkhBp>Llq-NpMth&LnFA^Y9^+kgCPOHO=0#|$x_fnopJl==guMqBRZo=MbK z2(SOm%va60^UgQ+JAMvbAFm#s{)Y8Q(Ovl!hB9C0J>U84@86OcY+Ljem~MZ+@~X`I czl;k`@Y-kuSKmF&c@AWxr>mdKI;Vst0LVXiZvX%Q literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/meta.json b/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/meta.json new file mode 100644 index 0000000000..d4447ddf98 --- /dev/null +++ b/Resources/Textures/Objects/Misc/fire_extinguisher.rsi/meta.json @@ -0,0 +1,65 @@ +{ + "version": 1, + "license": "CC BY-SA 3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation at commit 9bebd81ae0b0a7f952b59886a765c681205de31f", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "fire_extinguisher_open", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "fire_extinguisher_closed", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "inhand-right", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + }, + { + "name": "inhand-left", + "directions": 4, + "delays": [ + [ + 1 + ], + [ + 1 + ], + [ + 1 + ], + [ + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Objects/Tools/lantern.rsi/meta.json b/Resources/Textures/Objects/Tools/lantern.rsi/meta.json index 2205be15d5..745406c95d 100644 --- a/Resources/Textures/Objects/Tools/lantern.rsi/meta.json +++ b/Resources/Textures/Objects/Tools/lantern.rsi/meta.json @@ -1,6 +1,6 @@ { "version": 1, - "license": "CC BY-SA 3.0", + "license": "CC BY-SA 3.0", "copyright": "Taken from https://github.com/tgstation/tgstation at commit 9bebd81ae0b0a7f952b59886a765c681205de31f", "size": { "x": 32, From e68c91a64cb289d9baa9e6f3c03aebeae00f1a35 Mon Sep 17 00:00:00 2001 From: DrSmugleaf Date: Tue, 18 Aug 2020 18:00:36 +0200 Subject: [PATCH 44/81] Increase wall HP (#1713) * Increase all walls hp by 5 times * Increase reinforced and riveted wall hp as well * Revert "Increase reinforced and riveted wall hp as well" This reverts commit a9d95670e3f6c4d7fb2b2cf3c84503496f685e26. * Increase reinforced and riveted wall hp as well * Merge conflict fixes * Reduced wall hp slightly --- .../Damage/DestructibleComponent.cs | 16 ++++---- .../Components/Damage/RuinableComponent.cs | 2 + .../Entities/Constructible/Walls/walls.yml | 40 +++++++++---------- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/Content.Server/GameObjects/Components/Damage/DestructibleComponent.cs b/Content.Server/GameObjects/Components/Damage/DestructibleComponent.cs index b808bc6c76..1d62b1670e 100644 --- a/Content.Server/GameObjects/Components/Damage/DestructibleComponent.cs +++ b/Content.Server/GameObjects/Components/Damage/DestructibleComponent.cs @@ -20,9 +20,7 @@ namespace Content.Server.GameObjects.Components.Damage [Dependency] private readonly IEntitySystemManager _entitySystemManager; #pragma warning restore 649 - protected ActSystem _actSystem; - - protected string _spawnOnDestroy; + protected ActSystem ActSystem; /// public override string Name => "Destructible"; @@ -30,26 +28,26 @@ namespace Content.Server.GameObjects.Components.Damage /// /// Entity spawned upon destruction. /// - public string SpawnOnDestroy => _spawnOnDestroy; + public string SpawnOnDestroy { get; set; } void IDestroyAct.OnDestroy(DestructionEventArgs eventArgs) { - if (!string.IsNullOrWhiteSpace(_spawnOnDestroy) && eventArgs.IsSpawnWreck) + if (!string.IsNullOrWhiteSpace(SpawnOnDestroy) && eventArgs.IsSpawnWreck) { - Owner.EntityManager.SpawnEntity(_spawnOnDestroy, Owner.Transform.GridPosition); + Owner.EntityManager.SpawnEntity(SpawnOnDestroy, Owner.Transform.GridPosition); } } public override void ExposeData(ObjectSerializer serializer) { base.ExposeData(serializer); - serializer.DataField(ref _spawnOnDestroy, "spawnondestroy", string.Empty); + serializer.DataField(this, d => d.SpawnOnDestroy, "spawnondestroy", string.Empty); } public override void Initialize() { base.Initialize(); - _actSystem = _entitySystemManager.GetEntitySystem(); + ActSystem = _entitySystemManager.GetEntitySystem(); } @@ -58,7 +56,7 @@ namespace Content.Server.GameObjects.Components.Damage if (!Owner.Deleted) { var pos = Owner.Transform.GridPosition; - _actSystem.HandleDestruction(Owner, + ActSystem.HandleDestruction(Owner, true); //This will call IDestroyAct.OnDestroy on this component (and all other components on this entity) if (DestroySound != string.Empty) { diff --git a/Content.Server/GameObjects/Components/Damage/RuinableComponent.cs b/Content.Server/GameObjects/Components/Damage/RuinableComponent.cs index 7137171f34..4d94d29f1a 100644 --- a/Content.Server/GameObjects/Components/Damage/RuinableComponent.cs +++ b/Content.Server/GameObjects/Components/Damage/RuinableComponent.cs @@ -5,6 +5,7 @@ using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Systems; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; namespace Content.Server.GameObjects.Components.Damage { @@ -21,6 +22,7 @@ namespace Content.Server.GameObjects.Components.Damage /// How much HP this component can sustain before triggering /// . /// + [ViewVariables(VVAccess.ReadWrite)] public int MaxHp { get; private set; } /// diff --git a/Resources/Prototypes/Entities/Constructible/Walls/walls.yml b/Resources/Prototypes/Entities/Constructible/Walls/walls.yml index 9e8d69252f..a33763fa3d 100644 --- a/Resources/Prototypes/Entities/Constructible/Walls/walls.yml +++ b/Resources/Prototypes/Entities/Constructible/Walls/walls.yml @@ -26,7 +26,7 @@ - VaultImpassable - SmallImpassable - type: Destructible - maxHP: 100 + maxHP: 500 spawnOnDestroy: Girder - type: Occluder sizeX: 32 @@ -49,7 +49,7 @@ - type: Icon sprite: Constructible/Structures/Walls/brick.rsi - type: Destructible - health: 100 + maxHP: 300 spawnOnDestroy: Girder - type: IconSmooth key: walls @@ -65,7 +65,7 @@ - type: Icon sprite: Constructible/Structures/Walls/clock.rsi - type: Destructible - health: 100 + maxHP: 300 spawnOnDestroy: Girder - type: IconSmooth key: walls @@ -81,7 +81,7 @@ - type: Icon sprite: Constructible/Structures/Walls/clown.rsi - type: Destructible - health: 100 + maxHP: 300 spawnOnDestroy: Girder - type: IconSmooth key: walls @@ -98,7 +98,7 @@ - type: Icon sprite: Constructible/Structures/Walls/cult.rsi - type: Destructible - health: 100 + maxHP: 300 spawnOnDestroy: Girder - type: IconSmooth key: walls @@ -114,7 +114,7 @@ - type: Icon sprite: Constructible/Structures/Walls/debug.rsi - type: Destructible - health: 100 + maxHP: 300 spawnOnDestroy: Girder - type: IconSmooth key: walls @@ -130,7 +130,7 @@ - type: Icon sprite: Constructible/Structures/Walls/diamond.rsi - type: Destructible - health: 100 + maxHP: 300 spawnOnDestroy: Girder - type: IconSmooth key: walls @@ -147,7 +147,7 @@ - type: Icon sprite: Constructible/Structures/Walls/gold.rsi - type: Destructible - health: 100 + maxHP: 300 spawnOnDestroy: Girder - type: IconSmooth key: walls @@ -163,7 +163,7 @@ - type: Icon sprite: Constructible/Structures/Walls/ice.rsi - type: Destructible - health: 100 + maxHP: 300 spawnOnDestroy: Girder - type: IconSmooth key: walls @@ -179,7 +179,7 @@ - type: Icon sprite: Constructible/Structures/Walls/metal.rsi - type: Destructible - health: 100 + maxHP: 300 spawnOnDestroy: Girder - type: IconSmooth key: walls @@ -195,7 +195,7 @@ - type: Icon sprite: Constructible/Structures/Walls/plasma.rsi - type: Destructible - health: 100 + maxHP: 300 spawnOnDestroy: Girder - type: IconSmooth key: walls @@ -211,7 +211,7 @@ - type: Icon sprite: Constructible/Structures/Walls/plastic.rsi - type: Destructible - health: 100 + maxHP: 300 spawnOnDestroy: Girder - type: IconSmooth key: walls @@ -229,7 +229,7 @@ sprite: Constructible/Structures/Walls/solid.rsi state: rgeneric - type: Destructible - health: 300 + maxHP: 600 spawnOnDestroy: Girder - type: ReinforcedWall key: walls @@ -247,7 +247,7 @@ - type: Icon sprite: Constructible/Structures/Walls/riveted.rsi - type: Destructible - health: 100 + maxHP: 1000 spawnOnDestroy: Girder - type: IconSmooth key: walls @@ -263,7 +263,7 @@ - type: Icon sprite: Constructible/Structures/Walls/sandstone.rsi - type: Destructible - health: 100 + maxHP: 300 spawnOnDestroy: Girder - type: IconSmooth key: walls @@ -279,7 +279,7 @@ - type: Icon sprite: Constructible/Structures/Walls/silver.rsi - type: Destructible - health: 100 + maxHP: 300 spawnOnDestroy: Girder - type: IconSmooth key: walls @@ -296,9 +296,9 @@ - type: Icon sprite: Constructible/Structures/Walls/solid.rsi - type: Destructible - health: 100 + maxHP: 300 spawnOnDestroy: Girder - destroySound: /Audio/effects/metalbreak.ogg + destroySound: /Audio/Effects/metalbreak.ogg - type: IconSmooth key: walls base: solid @@ -313,7 +313,7 @@ - type: Icon sprite: Constructible/Structures/Walls/uranium.rsi - type: Destructible - health: 100 + maxHP: 300 spawnOnDestroy: Girder - type: IconSmooth key: walls @@ -329,7 +329,7 @@ - type: Icon sprite: Constructible/Structures/Walls/wood.rsi - type: Destructible - health: 100 + maxHP: 300 spawnOnDestroy: Girder - type: IconSmooth key: walls From 259762717ba368f776fd0ff922929902cdea64c2 Mon Sep 17 00:00:00 2001 From: Julian Giebel Date: Tue, 18 Aug 2020 19:33:24 +0200 Subject: [PATCH 45/81] Change cell that spawns with flashlights (#1781) Co-authored-by: Julian Giebel --- .../Components/Interactable/HandheldLightComponent.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/GameObjects/Components/Interactable/HandheldLightComponent.cs b/Content.Server/GameObjects/Components/Interactable/HandheldLightComponent.cs index 908b01442e..e1a0bd2415 100644 --- a/Content.Server/GameObjects/Components/Interactable/HandheldLightComponent.cs +++ b/Content.Server/GameObjects/Components/Interactable/HandheldLightComponent.cs @@ -277,7 +277,7 @@ namespace Content.Server.GameObjects.Components.Interactable return; } - var cell = Owner.EntityManager.SpawnEntity("PowerCellSmallHyper", Owner.Transform.GridPosition); + var cell = Owner.EntityManager.SpawnEntity("PowerCellSmallStandard", Owner.Transform.GridPosition); _cellContainer.Insert(cell); } } From b8fef91922fb67758b4879d09dd784f970703586 Mon Sep 17 00:00:00 2001 From: nuke <47336974+nuke-makes-games@users.noreply.github.com> Date: Wed, 19 Aug 2020 02:54:10 -0400 Subject: [PATCH 46/81] Random events no longer start while in lobby and round ending forces current event to end (#1782) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Random events cannot run in lobby and round ending forces events to end. * Thanks p4merge * Get rid of unused * Apply suggestions from code review Co-authored-by: Víctor Aguilera Puerto <6766154+Zumorica@users.noreply.github.com> --- .../StationEvents/StationEventSystem.cs | 27 ++++++++++++++----- .../StationEvents/StationEventCommand.cs | 1 - 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/Content.Server/GameObjects/EntitySystems/StationEvents/StationEventSystem.cs b/Content.Server/GameObjects/EntitySystems/StationEvents/StationEventSystem.cs index 48786d52dc..c34a502b21 100644 --- a/Content.Server/GameObjects/EntitySystems/StationEvents/StationEventSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/StationEvents/StationEventSystem.cs @@ -1,4 +1,8 @@ -using Content.Server.StationEvents; +using System; +using System.Collections.Generic; +using System.Text; +using Content.Server.StationEvents; +using Content.Server.Interfaces.GameTicking; using JetBrains.Annotations; using Robust.Server.Console; using Robust.Server.Interfaces.Player; @@ -9,25 +13,23 @@ using Robust.Shared.Interfaces.Reflection; using Robust.Shared.Interfaces.Timing; using Robust.Shared.IoC; using Robust.Shared.Localization; -using System; -using System.Collections.Generic; -using System.Text; using static Content.Shared.StationEvents.SharedStationEvent; namespace Content.Server.GameObjects.EntitySystems.StationEvents { [UsedImplicitly] + // Somewhat based off of TG's implementation of events public sealed class StationEventSystem : EntitySystem { #pragma warning disable 649 [Dependency] private readonly IServerNetManager _netManager; [Dependency] private readonly IPlayerManager _playerManager; + [Dependency] private readonly IGameTicker _gameTicker; #pragma warning restore 649 - // Somewhat based off of TG's implementation of events public StationEvent CurrentEvent { get; private set; } - public IReadOnlyCollection StationEvents => _stationEvents; + private List _stationEvents = new List(); private const float MinimumTimeUntilFirstEvent = 600; @@ -194,7 +196,18 @@ namespace Content.Server.GameObjects.EntitySystems.StationEvents { return; } - + + // Stop events from happening in lobby and force active event to end if the round ends + if (_gameTicker.RunLevel != GameTicking.GameRunLevel.InRound) + { + if (CurrentEvent != null) + { + Enabled = false; + } + + return; + } + // Keep running the current event if (CurrentEvent != null) { diff --git a/Content.Server/StationEvents/StationEventCommand.cs b/Content.Server/StationEvents/StationEventCommand.cs index 6712c8fa46..85f335b2ff 100644 --- a/Content.Server/StationEvents/StationEventCommand.cs +++ b/Content.Server/StationEvents/StationEventCommand.cs @@ -1,5 +1,4 @@ #nullable enable -using Content.Server.GameObjects.EntitySystems; using Content.Server.GameObjects.EntitySystems.StationEvents; using JetBrains.Annotations; using Robust.Server.Interfaces.Console; From 2448864035e45e0cadeb3df03c604da70e020dc1 Mon Sep 17 00:00:00 2001 From: Exp Date: Wed, 19 Aug 2020 14:27:51 +0200 Subject: [PATCH 47/81] Fixes sending empty msgs and trims unnecessary whitespaces (#1785) --- Content.Client/Chat/ChatManager.cs | 8 +++++++- Content.Server/Chat/ChatCommands.cs | 32 ++++++++++++++++++++++------- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/Content.Client/Chat/ChatManager.cs b/Content.Client/Chat/ChatManager.cs index 61dbdc28f1..8553c6ed58 100644 --- a/Content.Client/Chat/ChatManager.cs +++ b/Content.Client/Chat/ChatManager.cs @@ -247,13 +247,17 @@ namespace Content.Client.Chat case OOCAlias: { var conInput = text.Substring(1); + if (string.IsNullOrWhiteSpace(conInput)) + return; _console.ProcessCommand($"ooc \"{CommandParsing.Escape(conInput)}\""); break; } case AdminChatAlias: { var conInput = text.Substring(1); - if(_groupController.CanCommand("asay")){ + if (string.IsNullOrWhiteSpace(conInput)) + return; + if (_groupController.CanCommand("asay")){ _console.ProcessCommand($"asay \"{CommandParsing.Escape(conInput)}\""); } else @@ -265,6 +269,8 @@ namespace Content.Client.Chat case MeAlias: { var conInput = text.Substring(1); + if (string.IsNullOrWhiteSpace(conInput)) + return; _console.ProcessCommand($"me \"{CommandParsing.Escape(conInput)}\""); break; } diff --git a/Content.Server/Chat/ChatCommands.cs b/Content.Server/Chat/ChatCommands.cs index 777bba1fe9..c5f194d429 100644 --- a/Content.Server/Chat/ChatCommands.cs +++ b/Content.Server/Chat/ChatCommands.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Items.Storage; @@ -32,9 +32,11 @@ namespace Content.Server.Chat if (args.Length < 1) return; - var chat = IoCManager.Resolve(); + var message = string.Join(" ", args).Trim(); + if (string.IsNullOrEmpty(message)) + return; - var message = string.Join(" ", args); + var chat = IoCManager.Resolve(); if (player.AttachedEntity.HasComponent()) chat.SendDeadChat(player, message); @@ -61,9 +63,11 @@ namespace Content.Server.Chat if (args.Length < 1) return; - var chat = IoCManager.Resolve(); + var action = string.Join(" ", args).Trim(); + if (string.IsNullOrEmpty(action)) + return; - var action = string.Join(" ", args); + var chat = IoCManager.Resolve(); var mindComponent = player.ContentData().Mind; chat.EntityMe(mindComponent.OwnedEntity, action); @@ -78,8 +82,15 @@ namespace Content.Server.Chat public void Execute(IConsoleShell shell, IPlayerSession player, string[] args) { + if (args.Length < 1) + return; + + var message = string.Join(" ", args).Trim(); + if (string.IsNullOrEmpty(message)) + return; + var chat = IoCManager.Resolve(); - chat.SendOOC(player, string.Join(" ", args)); + chat.SendOOC(player, message); } } @@ -91,8 +102,15 @@ namespace Content.Server.Chat public void Execute(IConsoleShell shell, IPlayerSession player, string[] args) { + if (args.Length < 1) + return; + + var message = string.Join(" ", args).Trim(); + if (string.IsNullOrEmpty(message)) + return; + var chat = IoCManager.Resolve(); - chat.SendAdminChat(player, string.Join(" ", args)); + chat.SendAdminChat(player, message); } } From 7be8657417848ee33ef6015ec7069b70b264989c Mon Sep 17 00:00:00 2001 From: Exp Date: Wed, 19 Aug 2020 15:09:16 +0200 Subject: [PATCH 48/81] Fix Suspicion selecting too many traitors (#1790) --- Content.Server/GameTicking/GamePresets/PresetSuspicion.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/GameTicking/GamePresets/PresetSuspicion.cs b/Content.Server/GameTicking/GamePresets/PresetSuspicion.cs index fc09cc14a3..3ce23717d4 100644 --- a/Content.Server/GameTicking/GamePresets/PresetSuspicion.cs +++ b/Content.Server/GameTicking/GamePresets/PresetSuspicion.cs @@ -65,7 +65,7 @@ namespace Content.Server.GameTicking.GamePresets player.AttachedEntity?.EnsureComponent(); } - var numTraitors = FloatMath.Clamp(readyPlayers.Count % PlayersPerTraitor, + var numTraitors = FloatMath.Clamp(readyPlayers.Count / PlayersPerTraitor, MinTraitors, readyPlayers.Count); for (var i = 0; i < numTraitors; i++) From 1292adb001beb0285cd6303f64e8e9d9bc37fcfd Mon Sep 17 00:00:00 2001 From: Julian Giebel Date: Wed, 19 Aug 2020 15:50:06 +0200 Subject: [PATCH 49/81] Disposal routing (#1710) * Implement disposal tagger Implement disposal router Combine sprites to make conpipe-tagger sprite * Implement change requests * Remove nullable * Update DisposalHolderComponent.cs * Update DisposalHolderComponent.cs * Update Content.Server/GameObjects/Components/Disposal/DisposalRouterComponent.cs Co-authored-by: DrSmugleaf Co-authored-by: Julian Giebel Co-authored-by: DrSmugleaf --- .../DisposalRouterBoundUserInterface.cs | 69 ++ .../Disposal/DisposalRouterWindow.cs | 56 ++ .../DisposalTaggerBoundUserInterface.cs | 69 ++ .../Disposal/DisposalTaggerWindow.cs | 56 ++ Content.Client/IgnoredComponents.cs | 2 + .../Disposal/DisposalHolderComponent.cs | 7 + .../Disposal/DisposalRouterComponent.cs | 179 ++++ .../Disposal/DisposalTaggerComponent.cs | 150 ++++ .../Disposal/SharedDisposalRouterComponent.cs | 52 ++ .../Disposal/SharedDisposalTaggerComponent.cs | 53 ++ .../Entities/Constructible/disposal.yml | 82 ++ .../Power/disposal.rsi/conpipe-tagger.png | Bin 0 -> 2549 bytes .../Power/disposal.rsi/meta.json | 780 +++++++++++++++++- .../Power/disposal.rsi/pipe-tagger.png | Bin 2228 -> 2383 bytes 14 files changed, 1554 insertions(+), 1 deletion(-) create mode 100644 Content.Client/GameObjects/Components/Disposal/DisposalRouterBoundUserInterface.cs create mode 100644 Content.Client/GameObjects/Components/Disposal/DisposalRouterWindow.cs create mode 100644 Content.Client/GameObjects/Components/Disposal/DisposalTaggerBoundUserInterface.cs create mode 100644 Content.Client/GameObjects/Components/Disposal/DisposalTaggerWindow.cs create mode 100644 Content.Server/GameObjects/Components/Disposal/DisposalRouterComponent.cs create mode 100644 Content.Server/GameObjects/Components/Disposal/DisposalTaggerComponent.cs create mode 100644 Content.Shared/GameObjects/Components/Disposal/SharedDisposalRouterComponent.cs create mode 100644 Content.Shared/GameObjects/Components/Disposal/SharedDisposalTaggerComponent.cs create mode 100644 Resources/Textures/Constructible/Power/disposal.rsi/conpipe-tagger.png diff --git a/Content.Client/GameObjects/Components/Disposal/DisposalRouterBoundUserInterface.cs b/Content.Client/GameObjects/Components/Disposal/DisposalRouterBoundUserInterface.cs new file mode 100644 index 0000000000..00f30c02ff --- /dev/null +++ b/Content.Client/GameObjects/Components/Disposal/DisposalRouterBoundUserInterface.cs @@ -0,0 +1,69 @@ +#nullable enable +using JetBrains.Annotations; +using Robust.Client.GameObjects.Components.UserInterface; +using Robust.Shared.GameObjects.Components.UserInterface; +using Robust.Shared.Localization; +using static Content.Shared.GameObjects.Components.Disposal.SharedDisposalRouterComponent; + +namespace Content.Client.GameObjects.Components.Disposal +{ + /// + /// Initializes a and updates it when new server messages are received. + /// + [UsedImplicitly] + public class DisposalRouterBoundUserInterface : BoundUserInterface + { + private DisposalRouterWindow? _window; + + public DisposalRouterBoundUserInterface(ClientUserInterfaceComponent owner, object uiKey) : base(owner, uiKey) + { + } + + protected override void Open() + { + base.Open(); + + _window = new DisposalRouterWindow + { + Title = Loc.GetString("Disposal Router"), + }; + + _window.OpenCentered(); + _window.OnClose += Close; + + _window.Confirm.OnPressed += _ => ButtonPressed(UiAction.Ok, _window.TagInput.Text); + + } + + private void ButtonPressed(UiAction action, string tag) + { + SendMessage(new UiActionMessage(action, tag)); + _window?.Close(); + } + + protected override void UpdateState(BoundUserInterfaceState state) + { + base.UpdateState(state); + + if (!(state is DisposalRouterUserInterfaceState cast)) + { + return; + } + + _window?.UpdateState(cast); + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + + if (disposing) + { + _window?.Dispose(); + } + } + + + } + +} diff --git a/Content.Client/GameObjects/Components/Disposal/DisposalRouterWindow.cs b/Content.Client/GameObjects/Components/Disposal/DisposalRouterWindow.cs new file mode 100644 index 0000000000..f9f850ae18 --- /dev/null +++ b/Content.Client/GameObjects/Components/Disposal/DisposalRouterWindow.cs @@ -0,0 +1,56 @@ +using System.Runtime.CompilerServices; +using System.Text.RegularExpressions; +using Content.Shared.GameObjects.Components.Disposal; +using Robust.Client.Graphics.Drawing; +using Robust.Client.UserInterface; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.CustomControls; +using Robust.Shared.Localization; +using Robust.Shared.Maths; +using static Content.Shared.GameObjects.Components.Disposal.SharedDisposalRouterComponent; + +namespace Content.Client.GameObjects.Components.Disposal +{ + /// + /// Client-side UI used to control a + /// + public class DisposalRouterWindow : SS14Window + { + public readonly LineEdit TagInput; + public readonly Button Confirm; + + protected override Vector2? CustomSize => (400, 80); + + private Regex _tagRegex; + + public DisposalRouterWindow() + { + _tagRegex = new Regex("^[a-zA-Z0-9, ]*$", RegexOptions.Compiled); + + Contents.AddChild(new VBoxContainer + { + Children = + { + new Label {Text = Loc.GetString("Tags:")}, + new Control {CustomMinimumSize = (0, 10)}, + new HBoxContainer + { + Children = + { + (TagInput = new LineEdit {SizeFlagsHorizontal = SizeFlags.Expand, CustomMinimumSize = (320, 0), + ToolTip = Loc.GetString("A comma separated list of tags"), IsValid = tags => _tagRegex.IsMatch(tags)}), + new Control {CustomMinimumSize = (10, 0)}, + (Confirm = new Button {Text = Loc.GetString("Confirm")}) + } + } + } + }); + } + + + public void UpdateState(DisposalRouterUserInterfaceState state) + { + TagInput.Text = state.Tags; + } + } +} diff --git a/Content.Client/GameObjects/Components/Disposal/DisposalTaggerBoundUserInterface.cs b/Content.Client/GameObjects/Components/Disposal/DisposalTaggerBoundUserInterface.cs new file mode 100644 index 0000000000..273b8c06ec --- /dev/null +++ b/Content.Client/GameObjects/Components/Disposal/DisposalTaggerBoundUserInterface.cs @@ -0,0 +1,69 @@ +#nullable enable +using JetBrains.Annotations; +using Robust.Client.GameObjects.Components.UserInterface; +using Robust.Shared.GameObjects.Components.UserInterface; +using Robust.Shared.Localization; +using static Content.Shared.GameObjects.Components.Disposal.SharedDisposalTaggerComponent; + +namespace Content.Client.GameObjects.Components.Disposal +{ + /// + /// Initializes a and updates it when new server messages are received. + /// + [UsedImplicitly] + public class DisposalTaggerBoundUserInterface : BoundUserInterface + { + private DisposalTaggerWindow? _window; + + public DisposalTaggerBoundUserInterface(ClientUserInterfaceComponent owner, object uiKey) : base(owner, uiKey) + { + } + + protected override void Open() + { + base.Open(); + + _window = new DisposalTaggerWindow + { + Title = Loc.GetString("Disposal Tagger"), + }; + + _window.OpenCentered(); + _window.OnClose += Close; + + _window.Confirm.OnPressed += _ => ButtonPressed(UiAction.Ok, _window.TagInput.Text); + + } + + private void ButtonPressed(UiAction action, string tag) + { + SendMessage(new UiActionMessage(action, tag)); + _window?.Close(); + } + + protected override void UpdateState(BoundUserInterfaceState state) + { + base.UpdateState(state); + + if (!(state is DisposalTaggerUserInterfaceState cast)) + { + return; + } + + _window?.UpdateState(cast); + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + + if (disposing) + { + _window?.Dispose(); + } + } + + + } + +} diff --git a/Content.Client/GameObjects/Components/Disposal/DisposalTaggerWindow.cs b/Content.Client/GameObjects/Components/Disposal/DisposalTaggerWindow.cs new file mode 100644 index 0000000000..7fb6dc6937 --- /dev/null +++ b/Content.Client/GameObjects/Components/Disposal/DisposalTaggerWindow.cs @@ -0,0 +1,56 @@ +using System.Runtime.CompilerServices; +using System.Text.RegularExpressions; +using Content.Shared.GameObjects.Components.Disposal; +using Robust.Client.Graphics.Drawing; +using Robust.Client.UserInterface; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.CustomControls; +using Robust.Shared.Localization; +using Robust.Shared.Maths; +using static Content.Shared.GameObjects.Components.Disposal.SharedDisposalTaggerComponent; + +namespace Content.Client.GameObjects.Components.Disposal +{ + /// + /// Client-side UI used to control a + /// + public class DisposalTaggerWindow : SS14Window + { + public readonly LineEdit TagInput; + public readonly Button Confirm; + + protected override Vector2? CustomSize => (400, 80); + + private Regex _tagRegex; + + public DisposalTaggerWindow() + { + _tagRegex = new Regex("^[a-zA-Z0-9 ]*$", RegexOptions.Compiled); + + Contents.AddChild(new VBoxContainer + { + Children = + { + new Label {Text = Loc.GetString("Tag:")}, + new Control {CustomMinimumSize = (0, 10)}, + new HBoxContainer + { + Children = + { + (TagInput = new LineEdit {SizeFlagsHorizontal = SizeFlags.Expand, CustomMinimumSize = (320, 0), + IsValid = tag => _tagRegex.IsMatch(tag)}), + new Control {CustomMinimumSize = (10, 0)}, + (Confirm = new Button {Text = Loc.GetString("Confirm")}) + } + } + } + }); + } + + + public void UpdateState(DisposalTaggerUserInterfaceState state) + { + TagInput.Text = state.Tag; + } + } +} diff --git a/Content.Client/IgnoredComponents.cs b/Content.Client/IgnoredComponents.cs index d4588e5c84..6e67d79995 100644 --- a/Content.Client/IgnoredComponents.cs +++ b/Content.Client/IgnoredComponents.cs @@ -142,6 +142,8 @@ "Listening", "Radio", "DisposalHolder", + "DisposalTagger", + "DisposalRouter", "DisposalTransit", "DisposalEntry", "DisposalJunction", diff --git a/Content.Server/GameObjects/Components/Disposal/DisposalHolderComponent.cs b/Content.Server/GameObjects/Components/Disposal/DisposalHolderComponent.cs index ee39a57d76..44c1a1eab3 100644 --- a/Content.Server/GameObjects/Components/Disposal/DisposalHolderComponent.cs +++ b/Content.Server/GameObjects/Components/Disposal/DisposalHolderComponent.cs @@ -1,4 +1,5 @@ #nullable enable +using System.Collections.Generic; using System.Linq; using Content.Server.GameObjects.Components.Items.Storage; using Content.Shared.GameObjects.Components.Body; @@ -41,6 +42,12 @@ namespace Content.Server.GameObjects.Components.Disposal [ViewVariables] public IDisposalTubeComponent? NextTube { get; set; } + /// + /// A list of tags attached to the content, used for sorting + /// + [ViewVariables] + public HashSet Tags { get; set; } = new HashSet(); + private bool CanInsert(IEntity entity) { if (!_contents.CanInsert(entity)) diff --git a/Content.Server/GameObjects/Components/Disposal/DisposalRouterComponent.cs b/Content.Server/GameObjects/Components/Disposal/DisposalRouterComponent.cs new file mode 100644 index 0000000000..1abf3a7b2d --- /dev/null +++ b/Content.Server/GameObjects/Components/Disposal/DisposalRouterComponent.cs @@ -0,0 +1,179 @@ +using Content.Server.Interfaces; +using Content.Server.Interfaces.GameObjects.Components.Items; +using Content.Shared.GameObjects.EntitySystems; +using Content.Shared.Interfaces.GameObjects.Components; +using Robust.Server.GameObjects.Components.UserInterface; +using Robust.Server.GameObjects.EntitySystems; +using Robust.Server.Interfaces.GameObjects; +using Robust.Shared.Audio; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Components; +using Robust.Shared.GameObjects.Systems; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Localization; +using Robust.Shared.Maths; +using Robust.Shared.ViewVariables; +using System; +using System.Collections.Generic; +using static Content.Shared.GameObjects.Components.Disposal.SharedDisposalRouterComponent; + +namespace Content.Server.GameObjects.Components.Disposal +{ + [RegisterComponent] + [ComponentReference(typeof(IActivate))] + [ComponentReference(typeof(IDisposalTubeComponent))] + public class DisposalRouterComponent : DisposalJunctionComponent, IActivate + { +#pragma warning disable 649 + [Dependency] private readonly IServerNotifyManager _notifyManager; +#pragma warning restore 649 + public override string Name => "DisposalRouter"; + + [ViewVariables] + private BoundUserInterface _userInterface; + + [ViewVariables] + private HashSet _tags; + + [ViewVariables] + public bool Anchored => + !Owner.TryGetComponent(out CollidableComponent collidable) || + collidable.Anchored; + + public override Direction NextDirection(DisposalHolderComponent holder) + { + var directions = ConnectableDirections(); + + if (holder.Tags.Overlaps(_tags)) + { + return directions[1]; + } + + return Owner.Transform.LocalRotation.GetDir(); + } + + + public override void Initialize() + { + base.Initialize(); + _userInterface = Owner.GetComponent() + .GetBoundUserInterface(DisposalRouterUiKey.Key); + _userInterface.OnReceiveMessage += OnUiReceiveMessage; + + _tags = new HashSet(); + + UpdateUserInterface(); + } + + /// + /// Handles ui messages from the client. For things such as button presses + /// which interact with the world and require server action. + /// + /// A user interface message from the client. + private void OnUiReceiveMessage(ServerBoundUserInterfaceMessage obj) + { + var msg = (UiActionMessage) obj.Message; + + if (!PlayerCanUseDisposalTagger(obj.Session.AttachedEntity)) + return; + + if (msg.Action == UiAction.Ok) + { + _tags.Clear(); + foreach (var tag in msg.Tags.Split(',', StringSplitOptions.RemoveEmptyEntries)) + { + _tags.Add(tag.Trim()); + } + } + + ClickSound(); + } + + /// + /// Checks whether the player entity is able to use the configuration interface of the pipe tagger. + /// + /// The player entity. + /// Returns true if the entity can use the configuration interface, and false if it cannot. + private bool PlayerCanUseDisposalTagger(IEntity playerEntity) + { + //Need player entity to check if they are still able to use the configuration interface + if (playerEntity == null) + return false; + if (!Anchored) + return false; + //Check if player can interact in their current state + if (!ActionBlockerSystem.CanInteract(playerEntity) || !ActionBlockerSystem.CanUse(playerEntity)) + return false; + + return true; + } + + /// + /// Gets component data to be used to update the user interface client-side. + /// + /// Returns a + private DisposalRouterUserInterfaceState GetUserInterfaceState() + { + if(_tags == null || _tags.Count <= 0) + { + return new DisposalRouterUserInterfaceState(""); + } + + var taglist = new System.Text.StringBuilder(); + + foreach (var tag in _tags) + { + taglist.Append(tag); + taglist.Append(", "); + } + + taglist.Remove(taglist.Length - 2, 2); + + return new DisposalRouterUserInterfaceState(taglist.ToString()); + } + + private void UpdateUserInterface() + { + var state = GetUserInterfaceState(); + _userInterface.SetState(state); + } + + private void ClickSound() + { + EntitySystem.Get().PlayFromEntity("/Audio/Machines/machine_switch.ogg", Owner, AudioParams.Default.WithVolume(-2f)); + } + + /// + /// Called when you click the owner entity with an empty hand. Opens the UI client-side if possible. + /// + /// Data relevant to the event such as the actor which triggered it. + void IActivate.Activate(ActivateEventArgs args) + { + if (!args.User.TryGetComponent(out IActorComponent actor)) + { + return; + } + + if (!args.User.TryGetComponent(out IHandsComponent hands)) + { + _notifyManager.PopupMessage(Owner.Transform.GridPosition, args.User, + Loc.GetString("You have no hands.")); + return; + } + + var activeHandEntity = hands.GetActiveHand?.Owner; + if (activeHandEntity == null) + { + UpdateUserInterface(); + _userInterface.Open(actor.playerSession); + } + } + + public override void OnRemove() + { + _userInterface.CloseAll(); + base.OnRemove(); + } + } +} diff --git a/Content.Server/GameObjects/Components/Disposal/DisposalTaggerComponent.cs b/Content.Server/GameObjects/Components/Disposal/DisposalTaggerComponent.cs new file mode 100644 index 0000000000..f949e37090 --- /dev/null +++ b/Content.Server/GameObjects/Components/Disposal/DisposalTaggerComponent.cs @@ -0,0 +1,150 @@ +using Content.Server.Interfaces; +using Content.Server.Interfaces.GameObjects.Components.Items; +using Content.Shared.GameObjects.EntitySystems; +using Content.Shared.Interfaces.GameObjects.Components; +using Robust.Server.GameObjects.Components.UserInterface; +using Robust.Server.GameObjects.EntitySystems; +using Robust.Server.Interfaces.GameObjects; +using Robust.Shared.Audio; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Components; +using Robust.Shared.GameObjects.Systems; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Localization; +using Robust.Shared.Maths; +using Robust.Shared.ViewVariables; +using static Content.Shared.GameObjects.Components.Disposal.SharedDisposalTaggerComponent; + +namespace Content.Server.GameObjects.Components.Disposal +{ + [RegisterComponent] + [ComponentReference(typeof(IActivate))] + [ComponentReference(typeof(IDisposalTubeComponent))] + public class DisposalTaggerComponent : DisposalTransitComponent, IActivate + { +#pragma warning disable 649 + [Dependency] private readonly IServerNotifyManager _notifyManager; +#pragma warning restore 649 + public override string Name => "DisposalTagger"; + + [ViewVariables] + private BoundUserInterface _userInterface; + + [ViewVariables(VVAccess.ReadWrite)] + private string _tag = ""; + + [ViewVariables] + public bool Anchored => + !Owner.TryGetComponent(out CollidableComponent collidable) || + collidable.Anchored; + + public override Direction NextDirection(DisposalHolderComponent holder) + { + holder.Tags.Add(_tag); + return base.NextDirection(holder); + } + + + public override void Initialize() + { + base.Initialize(); + _userInterface = Owner.GetComponent() + .GetBoundUserInterface(DisposalTaggerUiKey.Key); + _userInterface.OnReceiveMessage += OnUiReceiveMessage; + + UpdateUserInterface(); + } + + /// + /// Handles ui messages from the client. For things such as button presses + /// which interact with the world and require server action. + /// + /// A user interface message from the client. + private void OnUiReceiveMessage(ServerBoundUserInterfaceMessage obj) + { + var msg = (UiActionMessage) obj.Message; + + if (!PlayerCanUseDisposalTagger(obj.Session.AttachedEntity)) + return; + + if (msg.Action == UiAction.Ok) + { + _tag = msg.Tag; + } + + ClickSound(); + } + + /// + /// Checks whether the player entity is able to use the configuration interface of the pipe tagger. + /// + /// The player entity. + /// Returns true if the entity can use the configuration interface, and false if it cannot. + private bool PlayerCanUseDisposalTagger(IEntity playerEntity) + { + //Need player entity to check if they are still able to use the configuration interface + if (playerEntity == null) + return false; + if (!Anchored) + return false; + //Check if player can interact in their current state + if (!ActionBlockerSystem.CanInteract(playerEntity) || !ActionBlockerSystem.CanUse(playerEntity)) + return false; + + return true; + } + + /// + /// Gets component data to be used to update the user interface client-side. + /// + /// Returns a + private DisposalTaggerUserInterfaceState GetUserInterfaceState() + { + return new DisposalTaggerUserInterfaceState(_tag); + } + + private void UpdateUserInterface() + { + var state = GetUserInterfaceState(); + _userInterface.SetState(state); + } + + private void ClickSound() + { + EntitySystem.Get().PlayFromEntity("/Audio/Machines/machine_switch.ogg", Owner, AudioParams.Default.WithVolume(-2f)); + } + + /// + /// Called when you click the owner entity with an empty hand. Opens the UI client-side if possible. + /// + /// Data relevant to the event such as the actor which triggered it. + void IActivate.Activate(ActivateEventArgs args) + { + if (!args.User.TryGetComponent(out IActorComponent actor)) + { + return; + } + + if (!args.User.TryGetComponent(out IHandsComponent hands)) + { + _notifyManager.PopupMessage(Owner.Transform.GridPosition, args.User, + Loc.GetString("You have no hands.")); + return; + } + + var activeHandEntity = hands.GetActiveHand?.Owner; + if (activeHandEntity == null) + { + UpdateUserInterface(); + _userInterface.Open(actor.playerSession); + } + } + + public override void OnRemove() + { + base.OnRemove(); + _userInterface.CloseAll(); + } + } +} diff --git a/Content.Shared/GameObjects/Components/Disposal/SharedDisposalRouterComponent.cs b/Content.Shared/GameObjects/Components/Disposal/SharedDisposalRouterComponent.cs new file mode 100644 index 0000000000..c0323cbaa1 --- /dev/null +++ b/Content.Shared/GameObjects/Components/Disposal/SharedDisposalRouterComponent.cs @@ -0,0 +1,52 @@ +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Components.UserInterface; +using Robust.Shared.Serialization; +using System; + +namespace Content.Shared.GameObjects.Components.Disposal +{ + public class SharedDisposalRouterComponent : Component + { + public override string Name => "DisposalRouter"; + + [Serializable, NetSerializable] + public class DisposalRouterUserInterfaceState : BoundUserInterfaceState + { + public readonly string Tags; + + public DisposalRouterUserInterfaceState(string tags) + { + Tags = tags; + } + } + + [Serializable, NetSerializable] + public class UiActionMessage : BoundUserInterfaceMessage + { + public readonly UiAction Action; + public readonly string Tags = ""; + + public UiActionMessage(UiAction action, string tags) + { + Action = action; + + if (Action == UiAction.Ok) + { + Tags = tags.Substring(0, Math.Min(tags.Length, 150)); + } + } + } + + [Serializable, NetSerializable] + public enum UiAction + { + Ok + } + + [Serializable, NetSerializable] + public enum DisposalRouterUiKey + { + Key + } + } +} diff --git a/Content.Shared/GameObjects/Components/Disposal/SharedDisposalTaggerComponent.cs b/Content.Shared/GameObjects/Components/Disposal/SharedDisposalTaggerComponent.cs new file mode 100644 index 0000000000..d12e9060e9 --- /dev/null +++ b/Content.Shared/GameObjects/Components/Disposal/SharedDisposalTaggerComponent.cs @@ -0,0 +1,53 @@ +#nullable enable +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Components.UserInterface; +using Robust.Shared.Serialization; +using System; + +namespace Content.Shared.GameObjects.Components.Disposal +{ + public class SharedDisposalTaggerComponent : Component + { + public override string Name => "DisposalTagger"; + + [Serializable, NetSerializable] + public class DisposalTaggerUserInterfaceState : BoundUserInterfaceState + { + public readonly string Tag; + + public DisposalTaggerUserInterfaceState(string tag) + { + Tag = tag; + } + } + + [Serializable, NetSerializable] + public class UiActionMessage : BoundUserInterfaceMessage + { + public readonly UiAction Action; + public readonly string Tag = ""; + + public UiActionMessage(UiAction action, string tag) + { + Action = action; + + if (Action == UiAction.Ok) + { + Tag = tag; + } + } + } + + [Serializable, NetSerializable] + public enum UiAction + { + Ok + } + + [Serializable, NetSerializable] + public enum DisposalTaggerUiKey + { + Key + } + } +} diff --git a/Resources/Prototypes/Entities/Constructible/disposal.yml b/Resources/Prototypes/Entities/Constructible/disposal.yml index 5187ce2a88..1d85dd33a6 100644 --- a/Resources/Prototypes/Entities/Constructible/disposal.yml +++ b/Resources/Prototypes/Entities/Constructible/disposal.yml @@ -44,6 +44,31 @@ state_anchored: pipe-s state_broken: pipe-b +- type: entity + id: DisposalTagger + parent: DisposalPipeBase + name: disposal pipe tagger + description: A pipe that tags entities for routing + components: + - type: Sprite + drawdepth: BelowFloor + sprite: Constructible/Power/disposal.rsi + state: conpipe-tagger + - type: Icon + sprite: Constructible/Power/disposal.rsi + state: conpipe-tagger + - type: DisposalTagger + - type: Appearance + visuals: + - type: DisposalVisualizer + state_free: conpipe-tagger + state_anchored: pipe-tagger + state_broken: pipe-b + - type: UserInterface + interfaces: + - key: enum.DisposalTaggerUiKey.Key + type: DisposalTaggerBoundUserInterface + - type: entity id: DisposalTrunk parent: DisposalPipeBase @@ -131,6 +156,63 @@ - key: enum.DisposalUnitUiKey.Key type: DisposalUnitBoundUserInterface +- type: entity + id: DisposalRouter + parent: DisposalPipeBase + name: disposal router + description: A three-way router. Entities with matching tags get routed to the side + components: + - type: Sprite + drawdepth: BelowFloor + sprite: Constructible/Power/disposal.rsi + state: conpipe-j1s + - type: Icon + sprite: Constructible/Power/disposal.rsi + state: conpipe-j1s + - type: DisposalRouter + degrees: + - 0 + - -90 + - 180 + - type: Appearance + visuals: + - type: DisposalVisualizer + state_free: conpipe-j1s + state_anchored: pipe-j1s + state_broken: pipe-b + - type: Flippable + entity: DisposalRouterFlipped + - type: UserInterface + interfaces: + - key: enum.DisposalRouterUiKey.Key + type: DisposalRouterBoundUserInterface + +- type: entity + id: DisposalRouterFlipped + parent: DisposalRouter + name: flipped router junction + components: + - type: Sprite + drawdepth: BelowFloor + sprite: Constructible/Power/disposal.rsi + state: conpipe-j2s + - type: Icon + sprite: Constructible/Power/disposal.rsi + state: conpipe-j2s + - type: DisposalRouter + degrees: + - 0 + - 90 + - 180 + - type: Appearance + visuals: + - type: DisposalVisualizer + state_free: conpipe-j2s + state_anchored: pipe-j2s + state_broken: pipe-b + - type: Flippable + entity: DisposalRouter + - type: entity id: DisposalJunction parent: DisposalPipeBase diff --git a/Resources/Textures/Constructible/Power/disposal.rsi/conpipe-tagger.png b/Resources/Textures/Constructible/Power/disposal.rsi/conpipe-tagger.png new file mode 100644 index 0000000000000000000000000000000000000000..e1c4637244ab4b0390a785d54665da75ce7e54a4 GIT binary patch literal 2549 zcmVPx;uSrBfRCt{2noVyUMHHb3VjwXYY~wfy*wfR~J>6A%m=}AP z3Dc8IgtVETG?Jw%*T3qimwuk73fer_h(;Brrl$1kufI-jPY*&As|z72f0xk!TBEfF z;K$Wf-g@gTjvYJJP@|Fl8*jY9&aSSCHbT^NTyN3VTC=pg%-e6j-B4dP>cEK;Cm0wQ zU}<@o&h6XzVQGmyd-rlZlVSf;PjNky;g2IDWHK2Z>+9o(r6oGIZ^!q2PM$n@m&4xV zOE|ku!@8rRgIFwvX_{Ci-9#cm zEEYp+jcwcH9fzFbVB0pn=i>PRwrz9i(xqS3Hyd@}(xppcaNj=Nwfzxv;FHf~Q3aQr zy}?hnB%nbg;!sFl?xXx+{^ema^wgfeDDFgdv;I=OmtAdcO5o< zHjuJbUn?I3(qI?{r%t`Yv7<);SXo}e z&N+Pc`4_CM-Q?@bm+xuz%M1^v^uf{5ru5g>*GYf*RYU!TX8?dv;qPA1PWg`FE`!mhcA98l*uyX7SM{|KaM@t2I?dM^ZSBLqRKq zG(tDsP#V#+epo^qKuCjVEY8QD7R3{mRaIW@(7ygh5mMIp3HM5~`e6xe04WWGXxwne zwhj=b8EX+j+=YHfnmPlN-*|6zbR>~N(7NH5K2=TXhb8n{(LsRz#ol`5`8bCTR1dYI zV;k{!Jah*_A;f*t4{ZP;B}O#bu%4CNMkLx=18A-9n|}B+z=+gsxMzn2n{*k4&(-yo3t;Qqr<@OF*ljY5lN- zGJs)7RN!wOLPGG`-(Dem`v#H3!^J>FO3X-L(@LQc`qz zWtEp-ewjDleDj_hg5$@J>-XM!k6pdp7=}SC8pAXV3@IyNqEZSK1bBr4z8`@0SzY^y z%U7=4ds6iOJuTjF3n-FimD>XHiNqJw1(-lDWA#VzC$(FJ2@b zkF&VA*b;YGYt7i^O6v=H}**QZhX~jZ%u)*;x$JWPX00cs$N`*A}rX3#A%+ zgb)1HSerI&+O%oYrcIj%o~fxRol2$j@bIuce*AcgGn&PyZg_ZDr&1|BH8oY!{?ycz z9vmFhLqkI?*DfN4?Y6d?uabedhgy)`o=gkWT3gnT{^h?eUkOw6cRnSe6p z)((t~jp4d363xi|rz(}S)_nNkhfOWHzaDyqyz3wky!65#|Ni6?6q2#AF}`11touLd zbeaPP4j`1@a{YhK%n(l`nV+Apnt;s}AOz>monw4_oS@(mkH?Ev*P3@vpRW5R=hyfc zc<$L}FbtDK(jpp(U_|50&CRiU_wJhdLWrWa?<1wSFZv0~Vtjm@@4o%E)&K&Sn3zB* zg}we0zULwh$?1Q*U-wN;Bd%V(%16MF=bx>-=}ROMOiWDhWjbBg0CRJ596o#)0WH^; zhC$r2n4O*F(Jd2Dbq1U{bA}gRd=UgV8#nKGyHkFZQM{Yqi=!mC4CTq?FvgwbpWdDJ98dlF7+QzWDs}N_kaIaB_08bl3=PZMZ}d57+HL&kn0f zeEEh`_o^D;_U)UTI`s~^biF+}Iaz;Hz|71{G2Mo4xjqyR&6$~*s`9E8Ff%j5;lqbf zO3~B13w?*AVy&g`oOX*_3632-%74$#W7~Gk65Ptf#00MEf~MvAXV0F+b={gRSXlvD zYsSaN$vY0JbP*|}Wb(*F-MhF(zyAJy4m~|uc`)g^dGe0K`1p9;Y_X=e1#`Jv?HR*JkJ&*TcNX_-{7x{f>Cx&5y&J!^WT-PBMi;~Y} z(Lxe2BS-{Z-a!SW2hu`ND0t-ad8ClILh|*+FNjACe9t3&u_OK9g?+h9OZ(5w{XG!AO~{!Px5RDv5+u>71r~Ayd8%6q^Cq zFAl)1i?GEc$+qD+O%oY=E38CF3H$ZlyxZJ00000 LNkvXXu0mjf)SB-9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Constructible/Power/disposal.rsi/meta.json b/Resources/Textures/Constructible/Power/disposal.rsi/meta.json index 96aadcfa66..f11b589795 100644 --- a/Resources/Textures/Constructible/Power/disposal.rsi/meta.json +++ b/Resources/Textures/Constructible/Power/disposal.rsi/meta.json @@ -1 +1,779 @@ -{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/discordia-space/CEV-Eris/blob/bbe32606902c90f5290b57d905a3f31b84dc6d7d/icons/obj/pipes/disposal.dmi and modified by DrSmugleaf", "states": [{"name": "condisposal", "directions": 1, "delays": [[1.0]]}, {"name": "conpipe-c", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "conpipe-j1", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "conpipe-j1s", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "conpipe-j2", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "conpipe-j2s", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "conpipe-s", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "conpipe-t", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "conpipe-y", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "disposal", "directions": 1, "delays": [[1.0]]}, {"name": "disposal-charging", "directions": 1, "delays": [[1.0]]}, {"name": "disposal-flush", "directions": 1, "delays": [[0.1, 0.1, 0.1, 0.1, 0.1, 0.5, 0.1, 0.1, 0.1]]}, {"name": "dispover-charge", "directions": 1, "delays": [[0.4, 0.4]]}, {"name": "dispover-full", "directions": 1, "delays": [[0.2, 0.2]]}, {"name": "dispover-handle", "directions": 1, "delays": [[1.0]]}, {"name": "dispover-ready", "directions": 1, "delays": [[1.0]]}, {"name": "intake", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "intake-closing", "directions": 4, "delays": [[0.5, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1], [0.5, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1], [0.5, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1], [0.5, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]]}, {"name": "outlet", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "outlet-open", "directions": 4, "delays": [[0.5, 0.5, 0.5, 0.5, 0.5, 0.1, 1.5, 0.1], [0.5, 0.5, 0.5, 0.5, 0.5, 0.1, 1.5, 0.1], [0.5, 0.5, 0.5, 0.5, 0.5, 0.1, 1.5, 0.1], [0.5, 0.5, 0.5, 0.5, 0.5, 0.1, 1.5, 0.1]]}, {"name": "pipe-b", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "pipe-bf", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "pipe-c", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "pipe-cf", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "pipe-d", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "pipe-j1", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "pipe-j1f", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "pipe-j1s", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "pipe-j1sf", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "pipe-j2", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "pipe-j2f", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "pipe-j2s", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "pipe-j2sf", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "pipe-s", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "pipe-sf", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "pipe-t", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "pipe-tagger", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "pipe-tagger-partial", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "pipe-tf", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "pipe-u", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "pipe-y", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}, {"name": "pipe-yf", "directions": 4, "delays": [[1.0], [1.0], [1.0], [1.0]]}]} \ No newline at end of file +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/discordia-space/CEV-Eris/blob/bbe32606902c90f5290b57d905a3f31b84dc6d7d/icons/obj/pipes/disposal.dmi and modified by DrSmugleaf", + "states": [ + { + "name": "condisposal", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "conpipe-c", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "conpipe-j1", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "conpipe-j1s", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "conpipe-j2", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "conpipe-j2s", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "conpipe-s", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "conpipe-t", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "conpipe-tagger", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "conpipe-y", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "disposal", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "disposal-charging", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "disposal-flush", + "directions": 1, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.5, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "dispover-charge", + "directions": 1, + "delays": [ + [ + 0.4, + 0.4 + ] + ] + }, + { + "name": "dispover-full", + "directions": 1, + "delays": [ + [ + 0.2, + 0.2 + ] + ] + }, + { + "name": "dispover-handle", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "dispover-ready", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "intake", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "intake-closing", + "directions": 4, + "delays": [ + [ + 0.5, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.5, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.5, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.5, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "outlet", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "outlet-open", + "directions": 4, + "delays": [ + [ + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.1, + 1.5, + 0.1 + ], + [ + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.1, + 1.5, + 0.1 + ], + [ + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.1, + 1.5, + 0.1 + ], + [ + 0.5, + 0.5, + 0.5, + 0.5, + 0.5, + 0.1, + 1.5, + 0.1 + ] + ] + }, + { + "name": "pipe-b", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "pipe-bf", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "pipe-c", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "pipe-cf", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "pipe-d", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "pipe-j1", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "pipe-j1f", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "pipe-j1s", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "pipe-j1sf", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "pipe-j2", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "pipe-j2f", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "pipe-j2s", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "pipe-j2sf", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "pipe-s", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "pipe-sf", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "pipe-t", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "pipe-tagger", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "pipe-tagger-partial", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "pipe-tf", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "pipe-u", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "pipe-y", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + }, + { + "name": "pipe-yf", + "directions": 4, + "delays": [ + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ], + [ + 1.0 + ] + ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Constructible/Power/disposal.rsi/pipe-tagger.png b/Resources/Textures/Constructible/Power/disposal.rsi/pipe-tagger.png index a8463fd0c1f57c834a4c27a9acdba9864a389a40..ce48830a50e8f73a57d173e8927f590c0bc92ddb 100644 GIT binary patch delta 2373 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 From cd1afb6582b246a0e148b9bf822c9f7bdd9d0f64 Mon Sep 17 00:00:00 2001 From: DrSmugleaf Date: Wed, 19 Aug 2020 15:54:45 +0200 Subject: [PATCH 50/81] Disable suffocation damage temporarily --- .../GameObjects/Components/Metabolism/MetabolismComponent.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/GameObjects/Components/Metabolism/MetabolismComponent.cs b/Content.Server/GameObjects/Components/Metabolism/MetabolismComponent.cs index 913d571dd6..10e9e2c592 100644 --- a/Content.Server/GameObjects/Components/Metabolism/MetabolismComponent.cs +++ b/Content.Server/GameObjects/Components/Metabolism/MetabolismComponent.cs @@ -213,7 +213,7 @@ namespace Content.Server.GameObjects.Components.Metabolism if (Suffocating && Owner.TryGetComponent(out IDamageableComponent damageable)) { - damageable.ChangeDamage(DamageClass.Airloss, _suffocationDamage, false); + // damageable.ChangeDamage(DamageClass.Airloss, _suffocationDamage, false); } } From dc77c399b9d9fdf5ee8e84bcbbf64de2c99e0432 Mon Sep 17 00:00:00 2001 From: SoulSloth <67545203+SoulSloth@users.noreply.github.com> Date: Wed, 19 Aug 2020 10:23:20 -0400 Subject: [PATCH 51/81] Add 'Scan DNA' function to medical scanner (#1783) * Add art assets for cloning * Added a 'Scan DNA' button to the medical scanner * Made the UI update unconditional for the medical scanner until checks for power changes are in place * Update Medical scanner to reflect powered status and fix #1774 * added a 'scan dna' button the the medical scanner that will add the contained bodies Uid to a list in CloningSystem, fixed an issue with the menu not populating if the scanner starts in an unpowered state * Add disabling logic to 'Scan DNA' button on medical scanner * Removed un-used libraries * changed scan dna button to Scan and Save DNA --- .../MedicalScannerBoundUserInterface.cs | 1 + .../MedicalScanner/MedicalScannerWindow.cs | 29 +++++- .../Medical/MedicalScannerComponent.cs | 51 +++++++--- .../EntitySystems/CloningSystem.cs | 24 +++++ .../EntitySystems/MedicalScannerSystem.cs | 1 + .../Medical/SharedMedicalScannerComponent.cs | 24 ++++- .../Specific/Medical/Cloning.rsi/meta.json | 88 ++++++++++++++++++ .../Specific/Medical/Cloning.rsi/pod_0.png | Bin 0 -> 1319 bytes .../Specific/Medical/Cloning.rsi/scanner.png | Bin 0 -> 1938 bytes .../Cloning.rsi/scanner_maintenance.png | Bin 0 -> 1782 bytes .../Medical/Cloning.rsi/scanner_occupied.png | Bin 0 -> 4782 bytes .../Medical/Cloning.rsi/scanner_open.png | Bin 0 -> 1910 bytes .../Cloning.rsi/scanner_open_maintenance.png | Bin 0 -> 1750 bytes .../Cloning.rsi/scanner_open_unpowered.png | Bin 0 -> 1664 bytes .../Medical/Cloning.rsi/scanner_unpowered.png | Bin 0 -> 1652 bytes 15 files changed, 201 insertions(+), 17 deletions(-) create mode 100644 Content.Server/GameObjects/EntitySystems/CloningSystem.cs create mode 100644 Resources/Textures/Objects/Specific/Medical/Cloning.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Medical/Cloning.rsi/pod_0.png create mode 100644 Resources/Textures/Objects/Specific/Medical/Cloning.rsi/scanner.png create mode 100644 Resources/Textures/Objects/Specific/Medical/Cloning.rsi/scanner_maintenance.png create mode 100644 Resources/Textures/Objects/Specific/Medical/Cloning.rsi/scanner_occupied.png create mode 100644 Resources/Textures/Objects/Specific/Medical/Cloning.rsi/scanner_open.png create mode 100644 Resources/Textures/Objects/Specific/Medical/Cloning.rsi/scanner_open_maintenance.png create mode 100644 Resources/Textures/Objects/Specific/Medical/Cloning.rsi/scanner_open_unpowered.png create mode 100644 Resources/Textures/Objects/Specific/Medical/Cloning.rsi/scanner_unpowered.png diff --git a/Content.Client/GameObjects/Components/MedicalScanner/MedicalScannerBoundUserInterface.cs b/Content.Client/GameObjects/Components/MedicalScanner/MedicalScannerBoundUserInterface.cs index 4b2fa2a1fc..2280406c5b 100644 --- a/Content.Client/GameObjects/Components/MedicalScanner/MedicalScannerBoundUserInterface.cs +++ b/Content.Client/GameObjects/Components/MedicalScanner/MedicalScannerBoundUserInterface.cs @@ -22,6 +22,7 @@ namespace Content.Client.GameObjects.Components.MedicalScanner Title = Owner.Owner.Name, }; _window.OnClose += Close; + _window.ScanButton.OnPressed += _ => SendMessage(new UiButtonPressedMessage(UiButton.ScanDNA)); _window.OpenCentered(); } diff --git a/Content.Client/GameObjects/Components/MedicalScanner/MedicalScannerWindow.cs b/Content.Client/GameObjects/Components/MedicalScanner/MedicalScannerWindow.cs index 61adc113f2..4668854fbf 100644 --- a/Content.Client/GameObjects/Components/MedicalScanner/MedicalScannerWindow.cs +++ b/Content.Client/GameObjects/Components/MedicalScanner/MedicalScannerWindow.cs @@ -12,18 +12,38 @@ namespace Content.Client.GameObjects.Components.MedicalScanner { public class MedicalScannerWindow : SS14Window { + public readonly Button ScanButton; + private readonly Label _diagnostics; protected override Vector2? CustomSize => (485, 90); + public MedicalScannerWindow() + { + Contents.AddChild(new VBoxContainer + { + Children = + { + (ScanButton = new Button + { + Text = "Scan and Save DNA" + }), + (_diagnostics = new Label + { + Text = "" + }) + } + }); + } + public void Populate(MedicalScannerBoundUserInterfaceState state) { - Contents.RemoveAllChildren(); var text = new StringBuilder(); if (!state.Entity.HasValue || !state.HasDamage() || !IoCManager.Resolve().TryGetEntity(state.Entity.Value, out var entity)) { - text.Append(Loc.GetString("No patient data.")); + _diagnostics.Text = Loc.GetString("No patient data."); + ScanButton.Disabled = true; } else { @@ -45,9 +65,10 @@ namespace Content.Client.GameObjects.Components.MedicalScanner text.Append("\n"); } - } - Contents.AddChild(new Label() {Text = text.ToString()}); + _diagnostics.Text = text.ToString(); + ScanButton.Disabled = state.IsScanned; + } } } } diff --git a/Content.Server/GameObjects/Components/Medical/MedicalScannerComponent.cs b/Content.Server/GameObjects/Components/Medical/MedicalScannerComponent.cs index 4e36ffed71..d50513e374 100644 --- a/Content.Server/GameObjects/Components/Medical/MedicalScannerComponent.cs +++ b/Content.Server/GameObjects/Components/Medical/MedicalScannerComponent.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using Content.Server.GameObjects.Components.Power.ApcNetComponents; +using Content.Server.GameObjects.EntitySystems; using Content.Shared.GameObjects.Components.Damage; using Content.Shared.GameObjects.Components.Medical; using Content.Shared.GameObjects.EntitySystems; @@ -38,9 +39,14 @@ namespace Content.Server.GameObjects.Components.Medical _appearance = Owner.GetComponent(); _userInterface = Owner.GetComponent() .GetBoundUserInterface(MedicalScannerUiKey.Key); + _userInterface.OnReceiveMessage += OnUiReceiveMessage; _bodyContainer = ContainerManagerComponent.Ensure($"{Name}-bodyContainer", Owner); _powerReceiver = Owner.GetComponent(); + //TODO: write this so that it checks for a change in power events and acts accordingly. + var newState = GetUserInterfaceState(); + _userInterface.SetState(newState); + UpdateUserInterface(); } @@ -48,7 +54,8 @@ namespace Content.Server.GameObjects.Components.Medical new MedicalScannerBoundUserInterfaceState( null, new Dictionary(), - new Dictionary()); + new Dictionary(), + false); private MedicalScannerBoundUserInterfaceState GetUserInterfaceState() { @@ -68,7 +75,7 @@ namespace Content.Server.GameObjects.Components.Medical var classes = new Dictionary(damageable.DamageClasses); var types = new Dictionary(damageable.DamageTypes); - return new MedicalScannerBoundUserInterfaceState(body.Uid, classes, types); + return new MedicalScannerBoundUserInterfaceState(body.Uid, classes, types, CloningSystem.HasUid(body.Uid)); } private void UpdateUserInterface() @@ -92,12 +99,18 @@ namespace Content.Server.GameObjects.Components.Medical default: throw new ArgumentException(nameof(damageState)); } } + private MedicalScannerStatus GetStatus() { - var body = _bodyContainer.ContainedEntity; - return body == null - ? MedicalScannerStatus.Open - : GetStatusFromDamageState(body.GetComponent().CurrentDamageState); + if (Powered) + { + var body = _bodyContainer.ContainedEntity; + return body == null + ? MedicalScannerStatus.Open + : GetStatusFromDamageState(body.GetComponent().CurrentDamageState); + } + + return MedicalScannerStatus.Off; } private void UpdateAppearance() @@ -178,14 +191,28 @@ namespace Content.Server.GameObjects.Components.Medical public void Update(float frameTime) { - if (_bodyContainer.ContainedEntity == null) - { - // There's no need to update if there's no one inside - return; - } - UpdateUserInterface(); UpdateAppearance(); } + + private void OnUiReceiveMessage(ServerBoundUserInterfaceMessage obj) + { + if (!(obj.Message is UiButtonPressedMessage message)) + { + return; + } + + switch (message.Button) + { + case UiButton.ScanDNA: + if (_bodyContainer.ContainedEntity != null) + { + CloningSystem.AddToScannedUids(_bodyContainer.ContainedEntity.Uid); + } + break; + default: + throw new ArgumentOutOfRangeException(); + } + } } } diff --git a/Content.Server/GameObjects/EntitySystems/CloningSystem.cs b/Content.Server/GameObjects/EntitySystems/CloningSystem.cs new file mode 100644 index 0000000000..469c0f6157 --- /dev/null +++ b/Content.Server/GameObjects/EntitySystems/CloningSystem.cs @@ -0,0 +1,24 @@ +using System.Collections.Generic; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Systems; + +namespace Content.Server.GameObjects.EntitySystems +{ + internal sealed class CloningSystem : EntitySystem + { + public static List scannedUids = new List(); + + public static void AddToScannedUids(EntityUid uid) + { + if (!scannedUids.Contains(uid)) + { + scannedUids.Add(uid); + } + } + + public static bool HasUid(EntityUid uid) + { + return scannedUids.Contains(uid); + } + } +} diff --git a/Content.Server/GameObjects/EntitySystems/MedicalScannerSystem.cs b/Content.Server/GameObjects/EntitySystems/MedicalScannerSystem.cs index 3180063247..01d1cd20ac 100644 --- a/Content.Server/GameObjects/EntitySystems/MedicalScannerSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/MedicalScannerSystem.cs @@ -7,6 +7,7 @@ namespace Content.Server.GameObjects.EntitySystems [UsedImplicitly] internal sealed class MedicalScannerSystem : EntitySystem { + public override void Update(float frameTime) { foreach (var comp in ComponentManager.EntityQuery()) diff --git a/Content.Shared/GameObjects/Components/Medical/SharedMedicalScannerComponent.cs b/Content.Shared/GameObjects/Components/Medical/SharedMedicalScannerComponent.cs index 8573a50c63..10262d1fd2 100644 --- a/Content.Shared/GameObjects/Components/Medical/SharedMedicalScannerComponent.cs +++ b/Content.Shared/GameObjects/Components/Medical/SharedMedicalScannerComponent.cs @@ -17,15 +17,18 @@ namespace Content.Shared.GameObjects.Components.Medical public readonly EntityUid? Entity; public readonly Dictionary DamageClasses; public readonly Dictionary DamageTypes; + public readonly bool IsScanned; public MedicalScannerBoundUserInterfaceState( EntityUid? entity, Dictionary damageClasses, - Dictionary damageTypes) + Dictionary damageTypes, + bool isScanned) { Entity = entity; DamageClasses = damageClasses; DamageTypes = damageTypes; + IsScanned = isScanned; } public bool HasDamage() @@ -56,5 +59,24 @@ namespace Content.Shared.GameObjects.Components.Medical Green, Yellow, } + + [Serializable, NetSerializable] + public enum UiButton + { + ScanDNA, + } + + [Serializable, NetSerializable] + public class UiButtonPressedMessage : BoundUserInterfaceMessage + { + public readonly UiButton Button; + + public UiButtonPressedMessage(UiButton button) + { + Button = button; + } + } + + } } diff --git a/Resources/Textures/Objects/Specific/Medical/Cloning.rsi/meta.json b/Resources/Textures/Objects/Specific/Medical/Cloning.rsi/meta.json new file mode 100644 index 0000000000..36d0f22970 --- /dev/null +++ b/Resources/Textures/Objects/Specific/Medical/Cloning.rsi/meta.json @@ -0,0 +1,88 @@ +{ + "version": 1, + "license": "CC BY-SA 3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation at commit 9bebd81ae0b0a7f952b59886a765c681205de31f", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "pod_0", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "scanner", + "directions": 1, + "delays": [ + [ + 0.2, + 0.2 + ] + ] + }, + { + "name": "scanner_maintenance", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "scanner_occupied", + "directions": 1, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "scanner_open", + "directions": 1, + "delays": [ + [ + 0.2, + 0.2 + ] + ] + }, + { + "name": "scanner_open_maintenance", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "scanner_open_unpowered", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + }, + { + "name": "scanner_unpowered", + "directions": 1, + "delays": [ + [ + 1.0 + ] + ] + } + ] +} diff --git a/Resources/Textures/Objects/Specific/Medical/Cloning.rsi/pod_0.png b/Resources/Textures/Objects/Specific/Medical/Cloning.rsi/pod_0.png new file mode 100644 index 0000000000000000000000000000000000000000..13d289fd6cc923117d0ff7e9e6e78dc6fa29f990 GIT binary patch literal 1319 zcmV+?1=#wDP)kdTld!5zkG*y4t*8g!ux zT_8I#0gVD7DMZ>LrBCqz0)37%(|O#PxsUIDF79+{Tj*SpCVGk6Wg2o13a!jt69B7h7E z5eQ)K{=@R8b6+re?-4sY+W>G}!L`02as`u6C`7y=%9fV(#Ofj(J#r*4L`{G>@mphm zup!Z05qEj6B|&Rq4Oe?75T3{Qw95E&isv`C(iCstVYwm@Kp+Q-Wt+)ln(G6jtZj_*=feqpywO)_I29KgMfIIF%_8ZXi4fij z0+cKOhR1&6L4Aw|6O-igd88)+fsh`WZXl(^c5HG56IZOL17-52iGd(rFiFkka2!N!Ln_N<2ZPpBosF06Qpmq^dwSBJkO(S+kpTAmB14&CEN8EXeyor+j1)6AW;yGi>4V> z7lKA02a1-BW7~+z86aG@Dh}Xzz5|M)peP!`leliMDF_5mFiTjjTRDV$F;!J7-3OZP zm&0#LpQ=zS1_B6F0@wBJ)-?@04>8yMYK31>7UjE?=Ss8^0CvSrR|s6s!?qoN3IIjb z0MHEGcLfFM3CiWt$^nFQ6&m7fNHn7BI+kr$#6U_9JrqJy^-2RuK*21pumjOZn1I{|7rn>!=^$YX5l=o4!!0$Jp#urgy+wSTq^Tt~T*tC8vr+N zjj5rYW%m!%vah_hk1dI32pI;c%q-J?r|G?MV_whD+0?d`STu$ntw&1G41>bdy_$PJ z7GUF!SEXh7Z?j}FMKYP9dCwknO=EmINj6tlvc|DW5RKt^0_jN}j12(ulN1hz_^bcQ zl5#8nm`i@|=t)M$Mwp(S;^6)_u^pGwpPZ@YHLYvKFbpD*NW}qz#&xYc{B>x4uexUe z$e8!p*t!`ZG_1=0|L%(gM2T&?<*5@Na{KlzCMPE;ni&8rtH6PSN3pCj;c$e{&z}Y0 zH7PM%n-t|~hIa0~$3vM80ZD0-OY#OJyST+d9tmav^MK}~DpU)8rhp{b-4IBMGFn50+#Eq?5VEYpR9v5>^AH37erAyz@ z)%7|TFJ7R%y_3<=VcOd}863JpJRWDDzlYB4I~X49Cs&z-T4Naa^JTF+Pm1Q|Mv}>N dP2vAd`~xa+a~}W~hi(7>002ovPDHLkV1hLkWOV=l literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Medical/Cloning.rsi/scanner.png b/Resources/Textures/Objects/Specific/Medical/Cloning.rsi/scanner.png new file mode 100644 index 0000000000000000000000000000000000000000..01b9c37f9e8b00fda6750dd0c4ed6d440969650e GIT binary patch literal 1938 zcmV;D2W|L?P)?6C~HM^LaY{JqdCT(pDg&G5jptVq{LMyE`5Y#9>P>f&v zprRkF2!5z2HAN`6R7#~%iERi}X`0YB4>xJjytA3v_wGFJ+`vCC$B2p>>6_Cqh@rp&X zQdQ-(Qb?sRrt;hC|Nh7A;O{8EdH^<2e}oqxm&@T7i{&h(6{!;1qm~rW zN};E&V!H0Swca(DUuk|z@GpOM0LO7~T#z0(Zut3ymo5U(yD-T19lHRKQW69{Mk#z5 zl=A>&5MZ>TH175?)P)Q0Rhxek_*Du#`ne%yCTDS?4vur(K%9t!>&6&+^&*@?^!5#! z%_Cd+>))Sew&2kjcX{pfS$wVe^ACO&*7^F^NW@~a$6b0lI@sLT%l_TpuHE@2@vB@w zN{P}MTUT153?#U*io72^`wRfbl9ODWo#Tmnw=h1DWY06d)e|{(96G;w?pCPLi3%)Fu z+y1eBj!eyv%;Xs9t=nY7`PPk%N~s6}Ne~2>rCBiAAeS{*l9Q<^-nej?;kDh2Pb4{f z=?Yk)0uJ!@M2ZLQ>ScCuk%I5n?Np=r)h-Z7w9+V{Q1be+5d=XwxRj)r%aO?!@ZvF! zUQ6-6nRz^|m@aq#bjMv>%SH%+l#=OemfX^}6$hZf{3;6oFvg&bL1~TBnji=&lqtz< z!DGtv2t1DyscAeVnabucQetG7_LRiaiu2Pm6tp3AlL2TnzlIA)gb-+@!!=ZeGog(^ z-k`*sSHxbN#|VM16;ru9MoRob0l!cPmB{DGESX&(CCN;#Zs!}#uNef5F$f`0QeiuG z87zZJ6P(UwNh`QGJBwd zZ+@0(B)_H$2vNQM)>3No$@2hAuU-Yl;6|d@SS;o;2q4kghKV=?#^7tiz<=MtzsWM# zXnx%opjViQ)oa$8haY)@Y%WJ21LUD3+&6+JeN?eXRD_0=Ef%mv3_IGw!i%qN6)`gZQx+9D3aZj`(G)*>)CmW^!;+Gv!~*v8=4 z4nhdlcdY@SCtBO+n#H$D@X|fofy48x?&_%d95_4=z`CK02B0MtBe8Tw?{00yI1acj zmg_<^3N0-d$DupX3P8-Z>5NxfKr{JH3BGUt?s8@cw30mZ&=>gEt1sfl<3yY&5!WT| zROF>JtC7Q%6eI}swbO^@s1#wss0n$33r_U+%zw)LT(96e{)_vr7cpwGVa z8-~^;0oecMZ|P-_7RSbQEIQp7LI`?VTA0e^DQ&%k5cIURAcSC*W7F0WCl;x8foAe+ zI^-|LzE^YPhp1k;qOll`yjxUxkKihZgLQ2WYr~gu=q!e zD->AUyN=1!<(hDSuC6|cev!LBv58{QBavt)n@uy7y2kwc3?uj4Usb12$dJ5tg-m*m zj*d>W5f~F5ax&?;3QK4PzhWz#&u0M`-Lj+Ny?JCSt!*6u*p|R7{de=d0sw2edH_fz zFIPQ_3*nmHzN!mt>fiG>gI^I5GU+)0W@l0r@ATp#f$x#aECBHCyR$VrP;d5bMVi6? YKME-2{eM@NKL7v#07*qoM6N<$f+N+!;s5{u literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Medical/Cloning.rsi/scanner_maintenance.png b/Resources/Textures/Objects/Specific/Medical/Cloning.rsi/scanner_maintenance.png new file mode 100644 index 0000000000000000000000000000000000000000..b659cb7f35c244a5481737196924d6888fced1a2 GIT binary patch literal 1782 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 IM6N<$g2$F^TL1t6 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Medical/Cloning.rsi/scanner_open.png b/Resources/Textures/Objects/Specific/Medical/Cloning.rsi/scanner_open.png new file mode 100644 index 0000000000000000000000000000000000000000..4af3b016115cdbbb9d2363751afdb1c8e6e8cb78 GIT binary patch literal 1910 zcmV-+2Z{KJP)Bd~={ zsZhkMRFFah-j_n)2!ZR?{`T&_-@Fz4ZRH0Yuz|)No`zDXgjK2dMM4Tvr;gIye;1A= zupJ9A+Yu=Qa$*cOcE`<)uF3q`@SBBy^$Q6!O+z!lF+nrDpI?1_1c3PTDz45@B)Fpr^BwjlFU9@A_{2 z!MBJXSOSjYAf!ZbSjIg>i`_R zmclBPaLh8l`TKspcK2rjV{a9|t_VsY5Kags)L5XS;V|!Byv(7G&hy-tb})1`$$_DB z6s2I=a{TwUeQE_qC(u7jw~ePS0x;RN1T8bgz>0N56gVuI^Cz&ROX9!Bv2L&pHk;ot0%RR1 zK-bdc?gI}#O0iVJc5IwONyPFVPFx)ZU>TmrtAE?w-AupsmappT`v(Brg|5QQw~}k?&^0>S+lijzz{_@OGinrAz3I7?Tov+i@?a29}-eRsM5ZIKA=Muau-9^6ENv<`)^=TqA4v#+W-D< ziL;6}O~uecbQ=+0Yyb+m*#X45P&7}DmS`#+ZBZh6a0#@MUw1+NYVhfL#q<%}xx$f1 zP3{h$V@VePGxN$K;V?$H@j1YVMgX&^{1Cvm?)?eJF1Q@K;OWrd!4QK7Lu_56uyu{X z;6ZO)Ro}Tc{uKbEs$m!g!{cdw`SfnT(LydeHw(bt=YGM-)Wm`VukznJ?cLR@+^;{- z$31sy{PC^1=(yc{4WL-a@$lv+kU}tc@=xsjw&#c+|5@?B18nWs0l-YjyHiJWFLNt( zjSJZv`<{IUE=|_}&UHx6PNdOw9b3x4Y}MmG_6K<72P)gYbD81Y@bd2eA77cj{cPL5 z6UT9Q_LGrmAV^_}mWe-2Hi`Dn8Po(&;4Y`v({p*i3X$yZ`qT&XZ`kCQNg+5hbduAj-fua-rUT34D;ZCX)`bJaV!c$X3TxMGpi(huZ(mHY zm}eq&jchi}rn~M5)G3z>B(Gheke{Nnvm5CuxUP4}DdeYWBB2%hnxpW{Oc8*A&D(1} zH*VU(qK-}g)R2NZo2#=-FX6Z})&oE)IU0C!)1DYDUJ^sPjr07i;MXWZA@5~WGU-&! wXFiw1woFQeX#hU_FjIE`jb`s=tQGwK0eA#*E6!n-IRF3v07*qoM6N<$g0pJA4FCWD literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Medical/Cloning.rsi/scanner_open_maintenance.png b/Resources/Textures/Objects/Specific/Medical/Cloning.rsi/scanner_open_maintenance.png new file mode 100644 index 0000000000000000000000000000000000000000..513eb24d71fac5d24083355b81a86f45d1b3965f GIT binary patch literal 1750 zcmV;{1}XW8P)`BYZSQ)$U*6f7d++dLykn1d zosu4Dw7d7tz3+S8d(OFMHSW@q-96sjuDO#LA7{~bzjq7($EhKN#FZ|UQW?8eLrK~2 zzLF9lC7u_ad-tDzZ9-r#clK}*DwPUOtriSPCCOa5Kxf~*2uI=y2f0i{Nr{@9!b{xK zbUUpX_}4z4!Y~XB3xo}ZD-Yzx7p6 zw{Cq%COx4w5P0MZy<}%|7*PYmSP{rD4J<3h>9@yW1TER!ZoUwYRgcJISe|-wD8>Nel=fkV>Je@JR?)fE5dk{ov%w z09;DXGL>84@%#5PJe}srmw&D#)6;psHzCT>GS3xNZ?Kb_$-_aw;`3RE2@G}m|p zu0TnJ)Fe`@q>bykL2%WrR;f^0s$$1u49#TFO_QnIVpFw*5X_g$RI2u!2>^JWhw?n6 zQb7Gk8uL3>wVAVRcH1_?xkYxh#@W>x5504vTm@ikK1)@3WIl?35CTopP*Md&MGA@X zJj5Cj3w8~?kjG1OuzQ2Wi4!N#bU)d&& zr1CRimCcvS6eWz$=Q#1oD*>=(g#G%>OUHxnr8URclz_IXJT#NOZbip0JZgEJ$(ZJUM4-E-SIkBQms2TJbVcN zyJoXgDx&R3q4oCSjgO;4Z~=L#6fEQz8NQ5em<{_h4Z^w#tDn`DUzpXdU%M25r;a>^ z7Fh|rW??(7EH`sj-83k0CYveqDSiB^*-;+xjY?-_NLF7b9n%^_kPj? zXoUv-g2g7XfY#fKRw`oZI$f596$>{t2EegXN4amOUwnpc zdK`P?*A1X2-+YPQ?S5rD_1>>Y(nE`(V;K=TtymCj0HwmR1Bnha!w<(zhE7{coR}Ft zf~HyU^V82Z^}LtH3K@;XLcJqE+olcxmR60$qEW2qI(6WQ2Y<-WO^>0QejJ`0fuRxb zM&QWc3mh4I0U&ti!Q__#P`ZI-S&YtR`PsA2gcJx=0FJ--Q!Z!bnmT0wluHF3-Tx#? zN={$?Z7})7w|(GOe|MbU?}hu?4*8x{{5w5n`kk{f4Q}QOoOu2@xV0DpxZb9?HkZXT zO?=1wL&(VW>4P$0|WbsZ)gqv zk`0~z51%^lK*JixakzTrefswH2V+V~MusnQ^~!r%h``q5c4jk^O~C;YiEe66ja|F< zQmfgtwr-?cE;5&yA)n9EfA6Oo)>Nw{(lfUy6&Gl4??ibTp66e3rQ$-k6fZ560T|dn z82a4Te}D~b?EvTz4R5(ubZo!j+??nFAd{YKcnXVtFmBwGKzWT>6pDya(eG$-*-YrO sSSa8+HkHyM03UpiYpT$l)LYN~2ddpSeQimav;Y7A07*qoM6N<$f_lVGJpcdz literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Medical/Cloning.rsi/scanner_open_unpowered.png b/Resources/Textures/Objects/Specific/Medical/Cloning.rsi/scanner_open_unpowered.png new file mode 100644 index 0000000000000000000000000000000000000000..206e0c02aca134280fd9a43e1f81805bd58cacec GIT binary patch literal 1664 zcmV-`27md9P)A6O6~}+?Yy9n*jO~nLf*n;Pbs8%}KBPn@1WFqfS`|brr8GAf4Z{Cb&-p9R{#hZDa=Xp+*a-^#_@4kD^ z|J?um-*fM1Jf=+^m{E`G^C&YviPMjMd>H`Ga|r^0FMJwKotEn&h3FYCg&+_DrQ+ZI z`j=M|5}4xAGgQ!MH1J$E>Jm~=So#-Zv&RWMfggB?b|O*;mq%RXTJTlSd2swDk+gdL(_T%)om%$WO<{+?e!wx$RFcj zxysFl1zJk79qjlX9?P;~J5-u32h;HwJq$=G34}xl5wW0@LIl0ZJg{qgu(`!ldX$Id zDj$`~pc4ZJ_;0z&;eBc9&27B4KK5il2pKW}$S&H25RtMw=DRK}*Tc6g?pAGd)1X}U z6WJ0{;b{S*-9U{DG1+IaaP=yh7Otvhgij?T7cM-D6NC&_nrQ2` zgLY<*z7uwLGXAc3dum`;jcg|q&)#SkDor=gG#$NO4?kqHC>^v)HGH>r3Yx#Gz9c7* z0G@P0JUcQ4BU4+t>e2pcJR&AYQS-haa0jn}NN^ z-08L^cbJI=7c^V3<}dBJe2|R`))P9>*rDY{9g(58%6{Uph~3(umi3(H)B2{R(u(v1U|`Kuiw-e?C-BhX-U092^Oo*37#bN&Y)f|<08AfxQUUat7X6k*EtzkL+;A}VCg!;srXr8cEB%RxfFGFfcCPdpMHUb*M5(cN@3_G zh7|_Y_U}jE*kEWhO+RUB)gs!&1X{C+q3euV7M2;`cqYK*E0=g87gnE@qT=!oe%S+h z<&~c?F;)fOHw(XDk{MElhGl3Br_9*eJ9Z`d-4W)XuG8O_!ZM9m+{8NY^I!iYapn^V zCDJr43_TunB)t!St!lAroQY+`$3a^I-+%F^tP~Y1#ZZS&LF{^mvQ+jiolOn|y$^U@c8h!ld~{o_}O0|8DS4EOMMBh-jx8W_5c zGIffLZNB&7^PE3=F6Q&wcNbW%IT(gXASJpU-vwIt_M1O(YdHk3c>B=8{Axa zM~fwpo1CUtSWN^67#}}?>$!a9@KId1#qjVb^?Hqs!WxxIiMiuvdVHEqhxN7lIJGjF z%otK>C>0)ZPOTg-#oOEAg(83ATKQw8At_qP%mdK7zm+5Z3nyb83G`EeEi0000< KMNUMnLSTYH3KfX} literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Medical/Cloning.rsi/scanner_unpowered.png b/Resources/Textures/Objects/Specific/Medical/Cloning.rsi/scanner_unpowered.png new file mode 100644 index 0000000000000000000000000000000000000000..4d0705aac0731debfd943acfaba62f97cb534dcd GIT binary patch literal 1652 zcmV-)28;QLP)93lX(4rp^YBdKj6LtUk8=)-J2Rf^xeiMCq@%h1&iP*d z?{SU=Pe^m~i}p!n9!JiH5&F(|F9Hw*K2f9zbx6C}qUZY z2NrmIgcjQEHi7RCS=wkStN-A@(hEd^CX51f-w~rV=D}TTX(3geNHe~&Ttq2_bisrm z-FW+NZ$AWJ&MtEH+$#V?QA8L9Sgi@7aL5CQ!VqgTgSgd*sav<+r?Polj5%?rC9;O=zkd^e+R_oSuFHh$ zQka_LBQrDH_|@g1aR9j&60J4HTCBBu_+|{gl~+Fnz{XCUzpmfr#KJ74i3!S|`y_`x zaf*-49%QLFgN{NX-^YXjFMsVz2_30LXpO;Wfe_;bHA}7$R-ZS`SgM)}o_vXYSS;y#MeK3)2Pe)pqz` zs|J#Uae)8Sb~yUfG_7ujpkE*RBA~U25dh2x>{{z#We+IyeR_UC=(^n6sdKm4CbWh| z5Eo;?b8&@42++pR?Dg>bd;2;NhfM6i00CnX&J3s(gfzmCxiH{fD{@HKyM98)z6c=V6i6k}eZzY@q1o%vHSn;}q85gjesnqrb`M1nMmsPu0YJ|r(>R6z zkQh&C&=08FFE(p5SPK?x6oC*iio=52ZRv22zH|rn8OD3(yy_1sA=TgjL{Z;=0Z{~6 zC-jAT=1Y1CL<%p(sn6yYAiuzs?G3ONPdP{g9lwVFGMOwWMFd3FvSKC)s%`%LKOGp< zKi_AbhC$MmGv0K_Pat`XX5tUNLT`+=9-c6=qc>2S<^|Fp+!Bfo56cB(C5@{`lcu8wfQX+(4HlG7v z+DXPN2gV2Qyw#g+rt*`iYxQOufWt?gvj7>#CEJgvkjY?`0@p>lZd{OF%qwK#6uDB8 z^Sp!u&cOJ^OBaUBfua5ArI%jg^6!3$>v<^Ypj;1E1xUxi3W2Z|3Gug7xJsdKyfmI<2blVjmb-Z zZ+_wXtXD1T)!6fAX2sYVptD}Jy!hM~0kA^hdM=fElliGBijx^UDJf+$l(O-6aWcbv zAHR3vPZmlD!wmUpqD)Qp-a|xNB zzjc|-MiZqRB4dy;*#%;>{m!0yg(!;n^_4fqjDP0Dc^dUPckkRB@?QV?1-2(N^`1}8 zb2%br#^kKETo1PJjlnt&Gq<<+^Phe@oP@)q&do2{V@qYCFeDg#P>fKo+h%KPlVeL| z%H@+xOy!3ElD+-bo18lR@iCbo2)MTTPnM1^4|zswZmhk_wbj3igafm4hpARJQjG(Y zO7r-E&$CC5 Date: Wed, 19 Aug 2020 16:49:34 +0200 Subject: [PATCH 52/81] Fix disposals throwing you into the shadow realm (#1792) --- .../Disposal/DisposalHolderComponent.cs | 17 +++++++++++++++++ .../Disposal/DisposalUnitComponent.cs | 6 ++++++ 2 files changed, 23 insertions(+) diff --git a/Content.Server/GameObjects/Components/Disposal/DisposalHolderComponent.cs b/Content.Server/GameObjects/Components/Disposal/DisposalHolderComponent.cs index 44c1a1eab3..b07efbdef1 100644 --- a/Content.Server/GameObjects/Components/Disposal/DisposalHolderComponent.cs +++ b/Content.Server/GameObjects/Components/Disposal/DisposalHolderComponent.cs @@ -6,6 +6,7 @@ using Content.Shared.GameObjects.Components.Body; using Robust.Server.GameObjects.Components.Container; using Robust.Shared.Containers; using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Components; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Maths; using Robust.Shared.ViewVariables; @@ -55,6 +56,12 @@ namespace Content.Server.GameObjects.Components.Disposal return false; } + if (!entity.TryGetComponent(out ICollidableComponent collidable) || + !collidable.CanCollide) + { + return false; + } + return entity.HasComponent() || entity.HasComponent(); } @@ -66,6 +73,11 @@ namespace Content.Server.GameObjects.Components.Disposal return false; } + if (entity.TryGetComponent(out ICollidableComponent collidable)) + { + collidable.CanCollide = false; + } + return true; } @@ -93,6 +105,11 @@ namespace Content.Server.GameObjects.Components.Disposal foreach (var entity in _contents.ContainedEntities.ToArray()) { + if (entity.TryGetComponent(out ICollidableComponent collidable)) + { + collidable.CanCollide = true; + } + _contents.ForceRemove(entity); if (entity.Transform.Parent == Owner.Transform) diff --git a/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs b/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs index 399ba6ffbd..2849bb3c16 100644 --- a/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs +++ b/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs @@ -122,6 +122,12 @@ namespace Content.Server.GameObjects.Components.Disposal return false; } + if (!entity.TryGetComponent(out ICollidableComponent collidable) || + !collidable.CanCollide) + { + return false; + } + if (!entity.HasComponent() && !entity.HasComponent()) { From 81fea61b7228817c6e066804320a863e38bc0d06 Mon Sep 17 00:00:00 2001 From: Exp Date: Wed, 19 Aug 2020 17:02:31 +0200 Subject: [PATCH 53/81] Fix Roundend Summary Overlap (#1789) * Fixed translation * Temp fix * Add "TODO: Remove" Comment --- .../UserInterface/RoundEndSummaryWindow.cs | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/Content.Client/UserInterface/RoundEndSummaryWindow.cs b/Content.Client/UserInterface/RoundEndSummaryWindow.cs index 5f2d736d9c..550c48032f 100644 --- a/Content.Client/UserInterface/RoundEndSummaryWindow.cs +++ b/Content.Client/UserInterface/RoundEndSummaryWindow.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using Content.Client.Utility; +using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Shared.Localization; @@ -17,7 +18,7 @@ namespace Content.Client.UserInterface private TabContainer RoundEndWindowTabs { get; } protected override Vector2? CustomSize => (520, 580); - public RoundEndSummaryWindow(string gm, TimeSpan roundTimeSpan, List info ) + public RoundEndSummaryWindow(string gm, TimeSpan roundTimeSpan, List info) { Title = Loc.GetString("Round End Summary"); @@ -65,30 +66,40 @@ namespace Content.Client.UserInterface //Create labels for each player info. foreach (var plyinfo in manifestSortedList) { - var playerInfoText = new RichTextLabel() { - SizeFlagsVertical = SizeFlags.Fill + SizeFlagsVertical = SizeFlags.Fill, }; //TODO: On Hover display a popup detailing more play info. //For example: their antag goals and if they completed them sucessfully. var icNameColor = plyinfo.Antag ? "red" : "white"; playerInfoText.SetMarkup( - Loc.GetString($"[color=gray]{plyinfo.PlayerOOCName}[/color] was [color={icNameColor}]{plyinfo.PlayerICName}[/color] playing role of [color=orange]{plyinfo.Role}[/color].")); + Loc.GetString("[color=gray]{0}[/color] was [color={1}]{2}[/color] playing role of [color=orange]{3}[/color].", + plyinfo.PlayerOOCName, icNameColor, plyinfo.PlayerICName, Loc.GetString(plyinfo.Role))); innerScrollContainer.AddChild(playerInfoText); } scrollContainer.AddChild(innerScrollContainer); //Attach the entire ScrollContainer that holds all the playerinfo. PlayerManifestoTab.AddChild(scrollContainer); + // TODO: 1240 Overlap, remove once it's fixed. Temp Hack to make the lines not overlap + PlayerManifestoTab.OnVisibilityChanged += PlayerManifestoTab_OnVisibilityChanged; //Finally, display the window. OpenCentered(); MoveToFront(); - } + private void PlayerManifestoTab_OnVisibilityChanged(Control obj) + { + if (obj.Visible) + { + // For some reason the lines get not properly drawn with the right height + // so we just force a update + ForceRunLayoutUpdate(); + } + } } } From f79085d43e05af6d0e2037e1512fa6554dcbf539 Mon Sep 17 00:00:00 2001 From: Swept Date: Wed, 19 Aug 2020 09:24:50 -0700 Subject: [PATCH 54/81] Tones down screenshake (#1794) --- .../GameObjects/Components/Mobs/CameraRecoilComponent.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Client/GameObjects/Components/Mobs/CameraRecoilComponent.cs b/Content.Client/GameObjects/Components/Mobs/CameraRecoilComponent.cs index 68288ff66a..f9c317d2bb 100644 --- a/Content.Client/GameObjects/Components/Mobs/CameraRecoilComponent.cs +++ b/Content.Client/GameObjects/Components/Mobs/CameraRecoilComponent.cs @@ -23,7 +23,7 @@ namespace Content.Client.GameObjects.Components.Mobs private const float RestoreRateRamp = 0.1f; // The maximum magnitude of the kick applied to the camera at any point. - private const float KickMagnitudeMax = 5f; + private const float KickMagnitudeMax = 2f; private Vector2 _currentKick; private float _lastKickTime; From 9306f41bedf576e5ea1da6d7ba12c554276c6285 Mon Sep 17 00:00:00 2001 From: DrSmugleaf Date: Wed, 19 Aug 2020 18:29:48 +0200 Subject: [PATCH 55/81] Update submodule --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index c72ea7194e..1513389fc1 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit c72ea7194e08bba42371a06e353bcd79f5a7c7cc +Subproject commit 1513389fc195442a0f08b0af488a25affb33d410 From 17080a92ee2abbf19ef1df2b6188d3c11885fbdb Mon Sep 17 00:00:00 2001 From: Exp Date: Wed, 19 Aug 2020 20:41:03 +0200 Subject: [PATCH 56/81] Clear the ready list once the lobby is left (#1791) --- Content.Client/State/LobbyState.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Content.Client/State/LobbyState.cs b/Content.Client/State/LobbyState.cs index 20b4256393..b5fc2c35a1 100644 --- a/Content.Client/State/LobbyState.cs +++ b/Content.Client/State/LobbyState.cs @@ -107,7 +107,10 @@ namespace Content.Client.State { _playerManager.PlayerListUpdated -= PlayerManagerOnPlayerListUpdated; _clientGameTicker.InfoBlobUpdated -= UpdateLobbyUi; - _clientGameTicker.LobbyStatusUpdated -= UpdateLobbyUi; + _clientGameTicker.LobbyStatusUpdated -= LobbyStatusUpdated; + _clientGameTicker.LobbyReadyUpdated -= LobbyReadyUpdated; + + _clientGameTicker.Ready.Clear(); _lobby.Dispose(); _characterSetup.Dispose(); From 20ab566f8cfcac6c9c2563b48f01c901c5a68be5 Mon Sep 17 00:00:00 2001 From: Swept Date: Wed, 19 Aug 2020 11:41:33 -0700 Subject: [PATCH 57/81] Switches current PDAs to the /tg/ ones. (#1796) * Switches PDAs with tg ones and renames flashlight component * Which chucklefuck hid the ID cards in the clothing folder * Removes Mime PDA as i'm gonna do that in another PR * Moves EVERY SINGLE PDA over by exactly one pixel so they're aligned perfectly with the UI slot * On second thought moves back the id-cards since I don't want to deal with conflicts --- .../Components/PDA/PDAVisualizer.cs | 12 +- .../Components/PDA/PDAComponent.cs | 2 +- .../Components/PDA/SharedPDAComponent.cs | 4 +- .../Clothing/Belt/identification_cards.yml | 6 +- .../Entities/Objects/Devices/pda.yml | 94 +++-- .../Objects/Devices/pda.rsi/id_overlay.png | Bin 0 -> 90 bytes .../Devices/pda.rsi/insert_overlay.png | Bin 0 -> 117 bytes .../Objects/Devices/pda.rsi/light_overlay.png | Bin 0 -> 763 bytes .../Objects/Devices/pda.rsi/meta.json | 368 +++++++++++++++++- .../Devices/pda.rsi/pai_off_overlay.png | Bin 0 -> 148 bytes .../Objects/Devices/pda.rsi/pai_overlay.png | Bin 0 -> 171 bytes .../Objects/Devices/pda.rsi/pda-atmo.png | Bin 500 -> 0 bytes .../Objects/Devices/pda.rsi/pda-atmos.png | Bin 0 -> 492 bytes .../Objects/Devices/pda.rsi/pda-bar.png | Bin 403 -> 0 bytes .../Objects/Devices/pda.rsi/pda-bartender.png | Bin 0 -> 432 bytes .../Objects/Devices/pda.rsi/pda-c.png | Bin 442 -> 0 bytes .../Objects/Devices/pda.rsi/pda-captain.png | Bin 0 -> 479 bytes .../Objects/Devices/pda.rsi/pda-cargo.png | Bin 417 -> 435 bytes .../Objects/Devices/pda.rsi/pda-ce.png | Bin 482 -> 530 bytes .../Objects/Devices/pda.rsi/pda-chaplain.png | Bin 0 -> 454 bytes .../Objects/Devices/pda.rsi/pda-chef.png | Bin 420 -> 0 bytes .../Objects/Devices/pda.rsi/pda-chem.png | Bin 478 -> 0 bytes .../Objects/Devices/pda.rsi/pda-chemistry.png | Bin 0 -> 479 bytes .../Objects/Devices/pda.rsi/pda-clear.png | Bin 0 -> 516 bytes .../Objects/Devices/pda.rsi/pda-clown.png | Bin 526 -> 453 bytes .../Objects/Devices/pda.rsi/pda-cmo.png | Bin 450 -> 536 bytes .../Objects/Devices/pda.rsi/pda-cook.png | Bin 0 -> 433 bytes .../Objects/Devices/pda.rsi/pda-det.png | Bin 434 -> 0 bytes .../Objects/Devices/pda.rsi/pda-detective.png | Bin 0 -> 432 bytes .../Objects/Devices/pda.rsi/pda-e.png | Bin 500 -> 0 bytes .../Objects/Devices/pda.rsi/pda-engineer.png | Bin 0 -> 490 bytes .../Objects/Devices/pda.rsi/pda-genetics.png | Bin 0 -> 475 bytes .../Objects/Devices/pda.rsi/pda-h.png | Bin 452 -> 0 bytes .../Objects/Devices/pda.rsi/pda-holy.png | Bin 408 -> 0 bytes .../Objects/Devices/pda.rsi/pda-hop.png | Bin 462 -> 488 bytes .../Objects/Devices/pda.rsi/pda-hos.png | Bin 561 -> 503 bytes .../Objects/Devices/pda.rsi/pda-hydro.png | Bin 478 -> 491 bytes .../Objects/Devices/pda.rsi/pda-j.png | Bin 415 -> 0 bytes .../Objects/Devices/pda.rsi/pda-janitor.png | Bin 0 -> 473 bytes .../Devices/pda.rsi/pda-lawyer-old.png | Bin 462 -> 0 bytes .../Objects/Devices/pda.rsi/pda-lawyer.png | Bin 436 -> 446 bytes .../Objects/Devices/pda.rsi/pda-libb.png | Bin 456 -> 0 bytes .../Objects/Devices/pda.rsi/pda-libc.png | Bin 902 -> 0 bytes .../Objects/Devices/pda.rsi/pda-library.png | Bin 0 -> 922 bytes .../Objects/Devices/pda.rsi/pda-m.png | Bin 465 -> 0 bytes .../Objects/Devices/pda.rsi/pda-medical.png | Bin 0 -> 462 bytes .../Objects/Devices/pda.rsi/pda-mime.png | Bin 492 -> 505 bytes .../Objects/Devices/pda.rsi/pda-miner.png | Bin 489 -> 466 bytes .../Objects/Devices/pda.rsi/pda-q.png | Bin 461 -> 0 bytes .../Objects/Devices/pda.rsi/pda-qm.png | Bin 0 -> 478 bytes .../Objects/Devices/pda.rsi/pda-r-library.png | Bin 0 -> 350 bytes .../Objects/Devices/pda.rsi/pda-r.png | Bin 555 -> 353 bytes .../Objects/Devices/pda.rsi/pda-rd.png | Bin 472 -> 565 bytes .../Objects/Devices/pda.rsi/pda-robot.png | Bin 480 -> 0 bytes .../Devices/pda.rsi/pda-roboticist.png | Bin 0 -> 486 bytes .../Objects/Devices/pda.rsi/pda-s.png | Bin 575 -> 0 bytes .../Objects/Devices/pda.rsi/pda-science.png | Bin 0 -> 485 bytes .../Objects/Devices/pda.rsi/pda-security.png | Bin 0 -> 445 bytes .../Objects/Devices/pda.rsi/pda-syn.png | Bin 435 -> 0 bytes .../Objects/Devices/pda.rsi/pda-syndi.png | Bin 0 -> 424 bytes .../Objects/Devices/pda.rsi/pda-tox.png | Bin 463 -> 0 bytes .../Objects/Devices/pda.rsi/pda-transp.png | Bin 534 -> 0 bytes .../Objects/Devices/pda.rsi/pda-v.png | Bin 472 -> 0 bytes .../Objects/Devices/pda.rsi/pda-virology.png | Bin 0 -> 478 bytes .../Objects/Devices/pda.rsi/pda-warden.png | Bin 591 -> 491 bytes .../Textures/Objects/Devices/pda.rsi/pda.png | Bin 416 -> 428 bytes .../Objects/Devices/pda.rsi/pda_pen.png | Bin 129 -> 0 bytes .../Objects/Devices/pda.rsi/pdabox.png | Bin 403 -> 0 bytes .../Devices/pda.rsi/unlit_pda_screen.png | Bin 5834 -> 0 bytes 69 files changed, 425 insertions(+), 61 deletions(-) create mode 100644 Resources/Textures/Objects/Devices/pda.rsi/id_overlay.png create mode 100644 Resources/Textures/Objects/Devices/pda.rsi/insert_overlay.png create mode 100644 Resources/Textures/Objects/Devices/pda.rsi/light_overlay.png create mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pai_off_overlay.png create mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pai_overlay.png delete mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-atmo.png create mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-atmos.png delete mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-bar.png create mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-bartender.png delete mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-c.png create mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-captain.png create mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-chaplain.png delete mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-chef.png delete mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-chem.png create mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-chemistry.png create mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-clear.png create mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-cook.png delete mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-det.png create mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-detective.png delete mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-e.png create mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-engineer.png create mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-genetics.png delete mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-h.png delete mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-holy.png delete mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-j.png create mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-janitor.png delete mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-lawyer-old.png delete mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-libb.png delete mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-libc.png create mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-library.png delete mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-m.png create mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-medical.png delete mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-q.png create mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-qm.png create mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-r-library.png delete mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-robot.png create mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-roboticist.png delete mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-s.png create mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-science.png create mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-security.png delete mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-syn.png create mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-syndi.png delete mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-tox.png delete mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-transp.png delete mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-v.png create mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda-virology.png delete mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pda_pen.png delete mode 100644 Resources/Textures/Objects/Devices/pda.rsi/pdabox.png delete mode 100644 Resources/Textures/Objects/Devices/pda.rsi/unlit_pda_screen.png diff --git a/Content.Client/GameObjects/Components/PDA/PDAVisualizer.cs b/Content.Client/GameObjects/Components/PDA/PDAVisualizer.cs index 019bd03ae1..5ea8bbbbc1 100644 --- a/Content.Client/GameObjects/Components/PDA/PDAVisualizer.cs +++ b/Content.Client/GameObjects/Components/PDA/PDAVisualizer.cs @@ -1,4 +1,4 @@ -using Content.Shared.GameObjects.Components.PDA; +using Content.Shared.GameObjects.Components.PDA; using Robust.Client.GameObjects; using Robust.Client.Interfaces.GameObjects.Components; @@ -10,7 +10,7 @@ namespace Content.Client.GameObjects.Components.PDA private enum PDAVisualLayers { Base, - Unlit + Flashlight } @@ -22,13 +22,13 @@ namespace Content.Client.GameObjects.Components.PDA return; } var sprite = component.Owner.GetComponent(); - sprite.LayerSetVisible(PDAVisualLayers.Unlit, false); - if(!component.TryGetData(PDAVisuals.ScreenLit, out var isScreenLit)) + sprite.LayerSetVisible(PDAVisualLayers.Flashlight, false); + if(!component.TryGetData(PDAVisuals.FlashlightLit, out var isScreenLit)) { return; } - sprite.LayerSetState(PDAVisualLayers.Unlit, "unlit_pda_screen"); - sprite.LayerSetVisible(PDAVisualLayers.Unlit, isScreenLit); + sprite.LayerSetState(PDAVisualLayers.Flashlight, "light_overlay"); + sprite.LayerSetVisible(PDAVisualLayers.Flashlight, isScreenLit); } diff --git a/Content.Server/GameObjects/Components/PDA/PDAComponent.cs b/Content.Server/GameObjects/Components/PDA/PDAComponent.cs index 53f3543d62..91bc92bb3c 100644 --- a/Content.Server/GameObjects/Components/PDA/PDAComponent.cs +++ b/Content.Server/GameObjects/Components/PDA/PDAComponent.cs @@ -141,7 +141,7 @@ namespace Content.Server.GameObjects.Components.PDA private void UpdatePDAAppearance() { - _appearance?.SetData(PDAVisuals.ScreenLit, _lightOn); + _appearance?.SetData(PDAVisuals.FlashlightLit, _lightOn); } public async Task InteractUsing(InteractUsingEventArgs eventArgs) diff --git a/Content.Shared/GameObjects/Components/PDA/SharedPDAComponent.cs b/Content.Shared/GameObjects/Components/PDA/SharedPDAComponent.cs index 8e24cbcd95..cb2fdcd60e 100644 --- a/Content.Shared/GameObjects/Components/PDA/SharedPDAComponent.cs +++ b/Content.Shared/GameObjects/Components/PDA/SharedPDAComponent.cs @@ -1,4 +1,4 @@ -using System; +using System; using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Components.UserInterface; using Robust.Shared.Serialization; @@ -108,7 +108,7 @@ namespace Content.Shared.GameObjects.Components.PDA [NetSerializable, Serializable] public enum PDAVisuals { - ScreenLit, + FlashlightLit, } [NetSerializable, Serializable] diff --git a/Resources/Prototypes/Entities/Clothing/Belt/identification_cards.yml b/Resources/Prototypes/Entities/Clothing/Belt/identification_cards.yml index 0364c3a024..8a2135e601 100644 --- a/Resources/Prototypes/Entities/Clothing/Belt/identification_cards.yml +++ b/Resources/Prototypes/Entities/Clothing/Belt/identification_cards.yml @@ -6,13 +6,13 @@ abstract: true components: - type: Sprite - sprite: Clothing/Belt/id_cards.rsi + sprite: Objects/Misc/id_cards.rsi - type: Icon - sprite: Clothing/Belt/id_cards.rsi + sprite: Objects/Misc/id_cards.rsi - type: Clothing Slots: - idcard - sprite: Clothing/Belt/id_cards.rsi + sprite: Objects/Misc/id_cards.rsi HeldPrefix: default - type: Access - type: IdCard diff --git a/Resources/Prototypes/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/Entities/Objects/Devices/pda.yml index b2395af536..672db4b488 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/pda.yml @@ -21,7 +21,6 @@ type: PDABoundUserInterface - type: LoopingSound - - type: entity name: Assistant PDA parent: BasePDA @@ -39,9 +38,9 @@ layers: - state: pda map: ["enum.PDAVisualLayers.Base"] - - state: unlit_pda_screen + - state: light_overlay shader: unshaded - map: ["enum.PDAVisualLayers.Unlit"] + map: ["enum.PDAVisualLayers.Flashlight"] - type: entity name: Chef PDA @@ -53,16 +52,16 @@ idCard: ChefIDCard - type: Icon sprite: Objects/Devices/pda.rsi - state: pda-chef + state: pda-cook - type: Sprite sprite: Objects/Devices/pda.rsi netsync: false layers: - - state: pda-chef + - state: pda-cook map: ["enum.PDAVisualLayers.Base"] - - state: unlit_pda_screen + - state: light_overlay shader: unshaded - map: ["enum.PDAVisualLayers.Unlit"] + map: ["enum.PDAVisualLayers.Flashlight"] - type: entity name: Clown PDA @@ -81,9 +80,9 @@ layers: - state: pda-clown map: ["enum.PDAVisualLayers.Base"] - - state: unlit_pda_screen + - state: light_overlay shader: unshaded - map: ["enum.PDAVisualLayers.Unlit"] + map: ["enum.PDAVisualLayers.Flashlight"] - type: Slippery paralyzeTime: 4 @@ -104,9 +103,9 @@ layers: - state: pda-cargo map: ["enum.PDAVisualLayers.Base"] - - state: unlit_pda_screen + - state: light_overlay shader: unshaded - map: ["enum.PDAVisualLayers.Unlit"] + map: ["enum.PDAVisualLayers.Flashlight"] - type: entity name: Bartender PDA @@ -118,16 +117,16 @@ idCard: BartenderIDCard - type: Icon sprite: Objects/Devices/pda.rsi - state: pda-bar + state: pda-bartender - type: Sprite sprite: Objects/Devices/pda.rsi netsync: false layers: - - state: pda-bar + - state: pda-bartender map: ["enum.PDAVisualLayers.Base"] - - state: unlit_pda_screen + - state: light_overlay shader: unshaded - map: ["enum.PDAVisualLayers.Unlit"] + map: ["enum.PDAVisualLayers.Flashlight"] - type: entity @@ -140,16 +139,16 @@ idCard: JanitorIDCard - type: Icon sprite: Objects/Devices/pda.rsi - state: pda-j + state: pda-janitor - type: Sprite sprite: Objects/Devices/pda.rsi netsync: false layers: - - state: pda-j + - state: pda-janitor map: ["enum.PDAVisualLayers.Base"] - - state: unlit_pda_screen + - state: light_overlay shader: unshaded - map: ["enum.PDAVisualLayers.Unlit"] + map: ["enum.PDAVisualLayers.Flashlight"] - type: entity name: Captain PDA @@ -161,16 +160,16 @@ idCard: CaptainIDCard - type: Icon sprite: Objects/Devices/pda.rsi - state: pda-c + state: pda-captain - type: Sprite sprite: Objects/Devices/pda.rsi netsync: false layers: - - state: pda-c + - state: pda-captain map: ["enum.PDAVisualLayers.Base"] - - state: unlit_pda_screen + - state: light_overlay shader: unshaded - map: ["enum.PDAVisualLayers.Unlit"] + map: ["enum.PDAVisualLayers.Flashlight"] - type: entity name: HoP PDA @@ -188,9 +187,9 @@ layers: - state: pda-hop map: ["enum.PDAVisualLayers.Base"] - - state: unlit_pda_screen + - state: light_overlay shader: unshaded - map: ["enum.PDAVisualLayers.Unlit"] + map: ["enum.PDAVisualLayers.Flashlight"] - type: entity name: CE PDA @@ -208,9 +207,9 @@ layers: - state: pda-ce map: ["enum.PDAVisualLayers.Base"] - - state: unlit_pda_screen + - state: light_overlay shader: unshaded - map: ["enum.PDAVisualLayers.Unlit"] + map: ["enum.PDAVisualLayers.Flashlight"] - type: entity @@ -222,16 +221,16 @@ idCard: EngineeringIDCard - type: Icon sprite: Objects/Devices/pda.rsi - state: pda-e + state: pda-engineer - type: Sprite sprite: Objects/Devices/pda.rsi netsync: false layers: - - state: pda-e + - state: pda-engineer map: ["enum.PDAVisualLayers.Base"] - - state: unlit_pda_screen + - state: light_overlay shader: unshaded - map: ["enum.PDAVisualLayers.Unlit"] + map: ["enum.PDAVisualLayers.Flashlight"] - type: entity name: CMO PDA @@ -249,10 +248,9 @@ layers: - state: pda-cmo map: ["enum.PDAVisualLayers.Base"] - - state: unlit_pda_screen + - state: light_overlay shader: unshaded - map: ["enum.PDAVisualLayers.Unlit"] - + map: ["enum.PDAVisualLayers.Flashlight"] - type: entity name: Medical PDA @@ -263,16 +261,16 @@ idCard: MedicalIDCard - type: Icon sprite: Objects/Devices/pda.rsi - state: pda-m + state: pda-medical - type: Sprite sprite: Objects/Devices/pda.rsi netsync: false layers: - - state: pda-m + - state: pda-medical map: ["enum.PDAVisualLayers.Base"] - - state: unlit_pda_screen + - state: light_overlay shader: unshaded - map: ["enum.PDAVisualLayers.Unlit"] + map: ["enum.PDAVisualLayers.Flashlight"] - type: entity name: RnD PDA @@ -290,9 +288,9 @@ layers: - state: pda-rd map: ["enum.PDAVisualLayers.Base"] - - state: unlit_pda_screen + - state: light_overlay shader: unshaded - map: ["enum.PDAVisualLayers.Unlit"] + map: ["enum.PDAVisualLayers.Flashlight"] - type: entity name: Science PDA @@ -310,9 +308,9 @@ layers: - state: pda-rd map: ["enum.PDAVisualLayers.Base"] - - state: unlit_pda_screen + - state: light_overlay shader: unshaded - map: ["enum.PDAVisualLayers.Unlit"] + map: ["enum.PDAVisualLayers.Flashlight"] - type: entity name: HoS PDA @@ -330,9 +328,9 @@ layers: - state: pda-hos map: ["enum.PDAVisualLayers.Base"] - - state: unlit_pda_screen + - state: light_overlay shader: unshaded - map: ["enum.PDAVisualLayers.Unlit"] + map: ["enum.PDAVisualLayers.Flashlight"] - type: entity name: Security PDA @@ -343,13 +341,13 @@ idCard: SecurityIDCard - type: Icon sprite: Objects/Devices/pda.rsi - state: pda-s + state: pda-security - type: Sprite sprite: Objects/Devices/pda.rsi netsync: false layers: - - state: pda-s + - state: pda-security map: ["enum.PDAVisualLayers.Base"] - - state: unlit_pda_screen + - state: light_overlay shader: unshaded - map: ["enum.PDAVisualLayers.Unlit"] + map: ["enum.PDAVisualLayers.Flashlight"] diff --git a/Resources/Textures/Objects/Devices/pda.rsi/id_overlay.png b/Resources/Textures/Objects/Devices/pda.rsi/id_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..3f5d310e703db67bf691eb5e9233975a79874bf3 GIT binary patch literal 90 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzMNb#Ukcif|7ae&S7&sUfzK)Ly m{!!4(#lpZ~?~}~+z-8;%cZ~mSC-Z^yFnGH9xvXsQXaTVE0V|J#%x>Lu2 OTn0~9KbLh*2~7Y?(Iv0| literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/pda.rsi/light_overlay.png b/Resources/Textures/Objects/Devices/pda.rsi/light_overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..286a6c32558c5afda2a6acf326230dd34fdc13a2 GIT binary patch literal 763 zcmV=f+5pjwRttMKC|^U0g2r{Lek--gBTxks?Kk z6e&_bFaV%$^9M9%odYhE{_Rr%*h|hafxZ9}?d-%r>G!QwH45Rt;teOfKKANZqu4m^ zwK`60l|r+3rLJdBgk$O%jJLn$S48F;OaUB#BSWvaR@1?{YsyPpbvB!#r6ijs3pKt3 ztsy+Wqv0hI6(<=P8Kb#pSIy7w;D79AuL&2#7>e4fD_I9Mq7p7oaWO(o|(=OeHBcJUXaE`^v5-wdzae z*^Y)xu8q73kypA$9`1fXy7qlZKHa88O_k1v!)T6i@*%_Oodo+}%=4%}9roTa+BbSu z)PO8`*MTg-U=Yi1PcxOro4Dc68ncJ3Fs9dWU=u&+<uuN|8V4XPap= t6Z}$=7AMMG;u>j|+#GLF0lTttI47+kCyqU_w* soz+>~WDU674r+kS;qgCk-~a=I1<%`c2FsmhrR(Ts6$n4=d_#(&aKtnsj#e~<_|NnQ4sJ7MOJ>+b~ z(s8Zh{PKHuo>(`uX0Y3|Ubs9>@yMn{C$@?)ve~e>9n^rD-pI$+Y%0RV|aLiUrw3UCb61F-JZc&+RB#+l8Pn8HWJ6|nBr zQu~@Ge+D0ytS3ALNjL`TQ!b3v`cmsyt&hQ)bJ=qFIj|k;{k9sA^B^Y&;Oo@s`;t14 ze(HQ2$Y~0aBJ_st48EjOQ1x(}!OKoTUiU!B9nf{1wZr?Io8>KFM!5iBCA?$AO`}=k zq6x5C&0Jo&czk{V;Ep*oP2;iJh*fQb{+?alBz^?pdmt1F0T7GKGwE>|A1^J@xVHzu zq{oHTVmwR&fk5E}Y;P{&R~2mS7G~{J07R7tQ6&PvtbGbwy9K|haIn82EI|5AI5a%* qYhJQ>LEnVgg!}~2#$}Z8Z}0)K?WT-mIe?u20000L6Nu$Trq1{jG@^WW4|ji92_r*DyEK3)Z;rfUCZPGyDj^G?k|k)LFi z2BtrL{EH&a&(F-TcvskQhC~$c^o0zr zoU#%JF-8;T0FdRSttAY%9$vzbQLxE=X}WCsu(1;`? za*7`zD9O)YWyXV3&)s{(Wl2J{)&IhLaWDf^wj+lC2-JvW;HCC(fG0000P)BE{Q*zm@Cv2k6~jH!EPi zNQ-#*oRsqKOg{D$Ovhf~!eq28&dF$r^WiO*uAT#zuV-85CwLxIasXK0dNXd-fz4aj zaiG!^)k+*=dncx5b002ovPDHLkV1k0=wr2nU diff --git a/Resources/Textures/Objects/Devices/pda.rsi/pda-bartender.png b/Resources/Textures/Objects/Devices/pda.rsi/pda-bartender.png new file mode 100644 index 0000000000000000000000000000000000000000..c9348a7cf4411de7186525223beea564ac77ba17 GIT binary patch literal 432 zcmV;h0Z;ykP)PU)WId-CV>P(iNUmFQ6hKk zowm~63$1kUeh_-RJMR7a-rfH|p-^Bs@As>}DAw+_JFtUTv(7)4?!R&YA*5=xTGA|e zo`#Se6Azl0Y2C(i{!x?f_sIA26AeOXs`Y4itqo7o$Qjpajt5m)95Y^7{O1 z?&SCsZmw=2&p*NUeQ;e@%n?E$48xUsqXbYM9`D8Y@aTa3j?xT9>394o2(a7L7qGW) zNMm<{L2Uu(Yxw?Fh;K2*@jS1#fQ?pww}9RNil%9s6QDJl(im@nZQJZ>VyNwe(}Oqt z7U3(usWjrag>TRyaluZSRX(+q0ETdZ5^U$%p4GYoB`7`sSm90 zghkO{Mzf488_&(~Gaxe|w18kZgtJ}`vs8dR1G3kuavX;Zus!98XAhAy$JU=?g+lSq a0e~;aP>w&!7SuWb0000XKrmX{JY<&)AbG$r+A^(>| z^O#6=K!&#@JQNbScERaHu3Zd%94AOMjxcV2ZOi-f}MMR1%eM{lLCl#!1e2p#>iwz4@6_+#|OB4*zpw%lNBM2l9MM- z672wzT13GS=?qeg1q?4=Kz#i21w-( k-66ODu@;YlQ7~u#0Q29GN+2DAl>h($07*qoM6N<$f&s#}Gynhq diff --git a/Resources/Textures/Objects/Devices/pda.rsi/pda-captain.png b/Resources/Textures/Objects/Devices/pda.rsi/pda-captain.png new file mode 100644 index 0000000000000000000000000000000000000000..c9880c57a61d84bcb11a0e9f62a696f6d9c1ff1c GIT binary patch literal 479 zcmV<50U-W~P)ABL^@MqX%XwF3TwaEJW!2k7W6O z679kp!XQA%0smJ`1X1{d_vH%)20sf11_2%jUtEHL;piy_hKWld(ME{_z+l>XeTJ`J zzvGnW=H_I`3cQFSCL%iHda;!HF-UT?&=6PLn;@Y+GJx+J3tCe{2=FbYP&NCpfH3;_8g VhGWZSMjrqG002ovPDHLkV1kitw{8Fc literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/pda.rsi/pda-cargo.png b/Resources/Textures/Objects/Devices/pda.rsi/pda-cargo.png index f43bcb24816a23ab18af3d1249dfca3443042827..8477ee86da8fd7a49fd6963aa05548dc424b36b5 100644 GIT binary patch delta 409 zcmV;K0cQT81G58=B!7BIL_t(og<}{6qhJ&e3oOjc{?j6`mQ8x-_%r%prX^K zZ;@p_UInJ6YX8?IX%n>k-FHTY4=*1waC31ou=0vA2yy;rh+TP);lP251npoUXgUJ} z*s!l(zvGnW=H_Hr9IgcAL6Sq3bPnm5fQY5sOp#~o5?qS6pVsVFp>cS0|NllnG$^47An&)00000NkvXXu0mjf Dp7O6> delta 390 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 UB@#n?QUCw|07*qoM6N<$g3(ve{r~^~ diff --git a/Resources/Textures/Objects/Devices/pda.rsi/pda-chemistry.png b/Resources/Textures/Objects/Devices/pda.rsi/pda-chemistry.png new file mode 100644 index 0000000000000000000000000000000000000000..e8a4c7cec5d722fccd26701129298a5fb81f0385 GIT binary patch literal 479 zcmV<50U-W~P)L6Nu$Trq1{jG@^WW4|ji92_r*DyEK3)Z;rfUBuO7jO&CSWMXwhc4 zdXOWeq@)NLO`HQj0AzV-YYD@xhnFzq)a3OTx~qE_HgDX>ATnVBgXRAHa5+%a;fNYI zAUY8qJAHuR&8v4{3>9KvW2T0G}W)K{1C14~VuH28a%UPwzj& zF}fHG9Cvgi*#T4y0az4(5-qWS=n!CIWrbsOF&KbF0Vqd=2B#2ZF3}+X1IUR`L`(?I ze*f+rI0`_yfF>aT%5DtMVCNO!fd~Jy$FJaOU{OHz5C9c4puCPxo&hNeNC^R=902kW zsGw2WoeLMc^_hX;vqK|Z_1U?(SmjA_0H|2Cu(V|Gee{Td<08U9V=)GXABl-L^*wv` zjG*NpK&ZC*UtL)VW`N3eL6Nu$Trq23QEH*!}7lhRB!V1xq(1_l6iimMVGnR>SX0000Q8x-_%r%prX^K zZ;@p_UInJ6YX47l-y~=`!&WrDHv@xXg8{>V0~ZO}!9v({h+$v9e#a@#&CSWMzu^Lk z*op%?86+4a2%1fl13;FSww5s5dUy##PEB5qp}V?=;ibb%hJS;~)(l~D@4)5k80;7h zF&v`M0S=4|45n%f$4(!B3yFvcf$2A|-Z8v+g%JOF|2{GPK>>tw!2w9_;}hhCV;Df^ z$L{+}0|z)j($J^(pWzq=(D|#9RY-OK;V1xwK&d*4PhkLE3>F2TM9bg+(#ucKc%nmq zjg=LSVE~;Ei+=)8jsWEXVgS);00tll4}#GFEDAs&5aHlXB?mx50F>Prpux^7zylBd zXOCaOmBONcln@{)4RALYfb%*o04j(WkfMN;G(dDw3@T^{0r3Oka1|i+(2|hyq8Jnn z;s;2pjlpT)0AY26YODVa4*FmQv2hAZe9(%BpdCb2$0S7AOuqS}U=)mkkqj6Z7yxQo Vh?!)QTNeNT002ovPDHLkV1jJdwD14` delta 500 zcmVOT$1Ief=Sn3bx=NErlYwI2YF-4qbx&11@Ik zpp%2pDN{Ca5TRRKoE0TY1&2bx#o5JDL}}LFt!#Ki<19 z-z5hu@ZS*$a`x2h$a$SoTY>S@;d1psu0E4b-zGi&%kXcrJ- z0)0@N_#eZs2W$imAq%7fO0r58Ue6RMFz$zHGTq!E!(Fd0H~oBTAxdR qTSO2<$b|&Bh4_J&c!34}488$Pl*}5$qfFWW0000Q8x-_%r%prX^K zZ;@p_UInJ6YX2uqTF4+REe+;ZZ@+^g-|DG?q37w-r(k-^rcDg3?d=5ZU?Jo}kmYf4 zz6@W#e#ejto&%w|xj7jYE!qrM4|0T*loTPOiE{u5fGjU+!Z7~cGbU@Um$6)%?`_FJO5iubQv4(4G4B5Hc8EmHLfcZDCu`wu6!vQcr zOb9@tK!<^4O@9`HHYn{7VJ^{WfQ^+Ej?u+nz-CH3nDr-Q8pBo1ETYUM=zs|p)+l^f zLPSoCAh0Ybo#9B%6|j162wa~=9S6VwD7!I0gPm7^2Oj*-9=}3T1<3_HJr^0Ot1l8| zF2OV)CiaMdo7)$h*Kq+*L3Hw1Bg3Odi3|)3HQ<5^0(USAFOnSq0-#b3RM4z`$%i8D z!ukNO`t00X${heIRxKVI`*C71y!+tEWH zRQwZ8i=h<}K|6@5j)_o1iTR^o6pVtA3>X*~09#L)v2pnIVE_OC07*qoM6N<$f=!m% A3;+NC delta 424 zcmV;Z0ayN*1i}N5B!7uXL_t(|oMT`Z1*2eq0VA;rO-u_=@<%s=7M-A>mXe0_wU~fBHHYd=%`RyMf{L%hwF`iH&eEWD7Ml zH5p7yOc)yH*E3w&a+GKXklZHJ^RdRO4rV#AZ9<|QfFbS>T!2`MN5LoL6Nu$Trq1{jG@^WW4|ji92_r*DyEK3)Z;rfUBuO+q%{Jei3%pxVqhzbD^;1lE}DCY3s0nrx20MQ}v>HTLoMi+yDZx}XV0DyrH)W-^}o8Z63igBY=>D4t%wNPK~!~2l+EOuKMF>{C>Y6r bfq?-4=BSCvltDRe00000NkvXXu0mjf{28}P literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/pda.rsi/pda-det.png b/Resources/Textures/Objects/Devices/pda.rsi/pda-det.png deleted file mode 100644 index e93ec473b476cf650016c51773a1763ce004218b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 434 zcmV;j0ZsmiP)C?A}GMj~1%QG`87=E5CAj>ASf#1J>Gfds|glx+wc7Q3%W+GLZ5p5<(*-)65kwMC3B7-n5Bb?2sT>DOPt7I-`vz*vAA!!lDK)7*Ati_{X c6bu>w0K*Y~Tm@W*L6Nu$Trq1{jG@^WW4|ji92_r*DyEK3)Z;rfUC_j9w75{O*fC3~xXG zWf10N2J@9ASQt*-{>dxuE=wdJcivm!NFyX&Vl(|HQ01SW<9t^+|BMg9|0F(=85(1#? z#sCd=UI89>@IQO}3a$ne1q`$Z0Z>5$%Io;#8IYoYln@}w0U#fN3L0VoOnuLRZ`5%> z#>`I)Gt&8pb^r)~>IPx}q1x(yq7yrqL2TI$vlvcS a0|Nl?+JBk5H!4^F00001iHj%*K0ucYE-r#Y6+{$j z+rdGEjv_vau1cvyQ-{*{h}C;rTOIN*_ax`P=lu64CtPsg;E&-FC3dzq=VS^W$5TSJ zg-C_wi%SXs=1e^RXW=jaeq9GZnY#mEe9ROUp@;|om|xhiz4Pn3)%+)JG1Le%f!N6- z0NHEf%e?3034oS1@tRTs4wGH^ptT4g35H=*P5^*unzCDdSHNg*0{|<#X|nZ!4>`BH z2IXqMvI16i(^l-cJF?|pB?$^4VDWL@1C_rynFO{;kE`my`%{L6Nu$Trq1{jG@^WW4|ji92_r*DyEK3)Z;rfUCZPGyDj|5b>i$TM}k z1k)cs{zVbz=VxYEyz~u2|HPLB?O-9~LJ%k_V`2FE^*aLt!xL1AYzW28&B@T$^#?^t zS&4%fqlt3>$nw(G5{6q3FJZ{3$?Gw6SNAX+JN}bFbP@}L>T-m|jt+bb`wx7g+yNkP z?DPQ!5iub!`^~F&aPc><4#3$z@84%&V9+GiNH8Ee7w`%4qVTmebio)I=$s(Ua*`bI z>HTLE{~DVkV&KUBiK5=hk_XNPsn5xONYDL6Nu$Trq1{jG@^WW4|ji92_r*DyEK3)Z;rfUBuO(}oLrVI=W!SkSwLt=Atb22Pi zv>C1*K=y88#gj!=dv+8dgKY014SK< zsDT5b6XCJb2N>SGdI!cZ0Ahp05#TJC1&cCb08t?T0(^qJ1jQabsv+897$7dHzm15~!7hX9O?&0=UpM9>bRs$(M5P-6Zl7zLwXBm)Kp1^`+-n2b;I R2%7)^002ovPDHLkV1h#bx�K literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/pda.rsi/pda-h.png b/Resources/Textures/Objects/Devices/pda.rsi/pda-h.png deleted file mode 100644 index 39b498c96d4117c6d3f75c8a48e5dd7c1a5bccdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 452 zcmV;#0XzPQP)q6z`(HPOc{!}#1AQk znGCc46XOUbVjMtAKvW38z|E^yQ26hm0rKd{GZb+N5h>a@!2Z)Q6#mQw@fd1;|NhOu zAVR#EBsqYAfq~)Qzkj4^p{@fmyd@bJ7#J94Y<safV40mD+CxA5WYrc z(=`N;eN9OSkd+Hyj`%I*gdtDYT)_HlABH@sxqzZ_fbJpi`}c2#shggVZ5hQ55HaMY z*g}dNASx)x!26b;;j{2Z1_lNO1~oPfhUd?p!})NzAH$n=$_TfAn`+rK~6>rZqe26*HPGVGE$J%(2ChaJAmXiVR}R= uUUe|biER@S?ErL#-~z;2JPJm^paB3$>X9eV0FmAR0000T^z{O1(67I-p%Ao?Sj*n`%IqN1y28g(j73y;O6c*cQI!HZ^5H;!9$SRP-~6Z zYz?h-98V_6a}*aQ008>^_V>U61VQp%N+08Kn@VRll11Z~5DG$cptS~LEIw@%GsYmL z4=Hz-l+8p$o(YA>UO;J3ijxE!3i%1Pg)3C}H~0b#%97B2r`=Ql0000Q8x-_%r%prX^K zZ;@p_UInJ6YX6;+0|;9F`u%%`?_a+&aB_2k`J#e?3@7%VW;n2NKS4WK2%65oz;I&4 zPKK{vzvGnW=H_Iuh;T;{lTwu?#%SUk0J6NawS?i;!%G-)YJc*24Bgc|43C~XWAI;o zoZ)=ujFF|;BgXa`Z%F;O;?Z~iD41*2dj0|o{L0CP&1uM?P&BLDyZ07*qoM6N<$ Ef?pNMp#T5? delta 436 zcmV;l0Zabq1I`1GB!87jL_t(|ob6UIOF~f?J*kNpB9f6l#L8cMu0NK~MYE$>bGzbhb}3(P>E;t@e`zs)mXGZLKJU8XvCHbVgAe{^wE~LB#V@!DqSoD-+>8v?$P+t(n z7UVqW$pN5q>VNKdpbm7O+KK}`bwOJMSLRLmfp)=gwP?!Ac7dgPVBijL&arz^>A9F? z0m11J%LOe77z+dtbH{P}b`1cCx#M7r;dS&G0N|_nTd_vxl)eYf?uzi$`~U#PIzObZ z=7-uS%hJ&WZ0&6$q$!9-6r+&ZC<}2kqO@K^M>(Q8x-_%r%prX^K zZ;@p_UInJ6YX7J6$`G{tEFN09jtzTEcMa;Ux??HGg?MhVJSfhAZD+F-*?A z!Z35C6I>1ybvUAiGzWmdvC{|OY!NXbF#YD$JBBx}5aJAHi8YN32k;5<5)_+x#|fKO z${bJ-)Xc!JFp=TY`_FJOSO_4CmD=Vq$Qh(FaQ;3D=HI+}g+bv=FXaw^0b)V`90hs| z3@mH17_>oYhkpoji7trPSXtp1T?_^|^&r0g6EcnAs%92Z<`Q(k1Pf~vJ|y8mFfv#c zl+N&-)f%iG90J#;QO5x=0LpF*&|v2k;DHDKv&XLxilDimr{^L=b@fG}%q6NMBv=q} zb222n`OBaq1}Tg{>KUNr$LZ6zC@%?nn1sOv4Nma=FIJ}dSFacnuHY|(h<1SSzI_Y~ zPNe1WCqI4=rH)W-^}j_$1D4t%wNPK~!~2l+EOuKMF>{C>Y6rfq?-47IKde TNA%8300000NkvXXu0mjf1lQSn delta 536 zcmV+z0_Xkr1F-~ z<%xOIp55-iz<B2Ou^L#a0MNK~v)-A-aQJ*U{2IeT9uLB~Jm5kj;g>$`av_?@;JjFb!{*j-LZaDj1-CMi_oXiY a@Cji?#Sy>~QW>5A0000Q8x-_%TvprX^K zZjog^UIn0F=Q0;&U=?Qu^Y?iCM3Hyd!H%Kl_shRv`rWM$43~FaCuj!?As2!y|Ficq z!`H9h8B8~!%6){=+}xZDEY7@e^&m&^OYsphnm7l50Lb#vmVXk4+Yc{e$f?TfGIZDU zFtFd{U|41<&5-o&69PnSMq;Nc}M zG>8rXHdaKB0az4BN6Ry?YYS4>0Wbhbco2*ZU{L@HfuC33Q`Z5Y?8X2Mc3uG< zc>ASf#1J>Gfds| zglx+wcEAVm`+sou7v1A1ay*wUk$8mb3>Y9O8?uTsGc4AWWMCC%W;knP%CP=V5JTS` zV}`RvrVOm&%nVJOzZh7>nMpB{^l~8f`g4ZbPv03B7#JAtKX?ciul@9$q3$~ysm2lS zfa%ja7<_m_7+A%b;T9FCoMk9dIm^Jnz`#)VosEH2oIRPrhbM$#>C$OLJAmXiVRUpB uUUe|biER@S?ErL#-~z;2JPJm^paB4h4v50pTQ*4m0000vK4p6PNCKTqRk{J8}hRYGUUgvV&G>NgtK!!o8f#In-oBDInXrQ zl_Aclh=GBDf#KgPMC};oRK(D-F^5#+h;I=wFfcIe&brO8XkQ=0qtEvkL6Nu$Trq1{jG@^WW4|ji92_r*DyEK3)Z;rfUD=IGYGs{_*E~hL6AA zgW3FSf(-oZf(-i~Z)aF{e<49TSO}WVz`(GUsh#2L*Y7yxxw$zRg4ruk#FPcpi7}cu z2Y@UuZ7pHA_3#py|LgZ}FwMrw%Ah8%$IxBf!|>?OJqD9ca~WPqx5D*-q7FyYkmdjo zIClB~3ZGAqm*LH;cMNY{A;f>)zt6xRO{|F|IsgRZ6%@eq!v_z*z6Uu18GN)^Mw;!U zW`;i&Vs+=nxP}?UEwd{7W2MyQv^_5J5p`2ZuT;xH`M3*eOevDxEr1 zv|usRDz!1R2z7{;YNfe5%w~RY5Z?QE@8i8o0{Hm&2(Xe)_q?t->UBX;MmTjnMUj~z zU9SlDU>Z;qxu+&Fu9|N518u8`PN$7vFa!VyNm10E$~eC~aqTn4GC;YxJBDdmL-T}4 zSejq^5t|4`n02`gn5KoT{Y_NvZ-3?FcoMm69?!22I6Z1%dpG6e6h$7k8ZiR^py@^D zc_tPG05psy8b&|fzPJLA0xv=aBGX}JY){(|DJk|EwqD+xGZ>>B?39EIcs>ET0;Ti_V10qenhTt|Bg9zf9c`l0B!7iTL_t(og<}{6qhJ&e3oOjc{?j6`mQ8x-_%r%prX^K zZ;@p_UInJ6YX7Zta_}1P>(?KKFW=uW{QUWaft{TPEXKnr#PIm#6^1Q)<`J}mg^&wD z;Ntzc3}3%~$0^Uv&B>rC9giZ$#m+~J(Zo3bWO-?83B#?2mwzzi)a3OTx~qE_-hOz* zuyE=phKfc5xEv_za6}Dh4gi5;rw_o{B4R>d`pv6%3~yc`#J}v`%fP^3fK@-m4&W2y zB`DT%te7OrL4fFN`04#;I7SzPfsXnMBs+krApnblV^^kt6DBc$=n!CIWrbsOF&KbF z0VwN=aXV7i0e>(6Nq7*94q#CL3V~N&_fyvapzOu~4R&4u9(eFSd;AKn1`-9Ng#b}$ z02H5~ypB(v0VxVdNdrVVKwmML;rXk3L>b5c4FQn)RR<B!7EJL_t(|ob8pdO2beThCjs?(l&AxaVV4yg~DCB1d6ZGhp11W zle3HZE`5YLxkwh5f{;N9DU_fWYs{k5Ax#RE=H}XfOMbYJd+y~wf6ht%10_n7Fu+;A zzbu+_zi2{J?B%?-%bREB&$8m`gB})7Ns}tjnPK?dzDF6Tf07*qoM6N<$ Eg3Y$alK=n! diff --git a/Resources/Textures/Objects/Devices/pda.rsi/pda-libb.png b/Resources/Textures/Objects/Devices/pda.rsi/pda-libb.png deleted file mode 100644 index 579c665884e467c5542d7f9a83fda1d4981363a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 456 zcmV;(0XP1MP)!T>nHoH4w)!0R3ZD+dva^Z>M(y(k&o_Aj>k|as!mYwrx;Kc|T24K4yI# zq$^;WrZ5hIfcL{NL>$MMOeXwN!sh6TOAW9(sKy^3?s0l{F2u@$lu{5vU>F8oo}ZKr yDBatDpL=4}L=`5kdM8viP&HDAs_?+T%CG=FtEkOimEX7k0000{O$-@27+T7KPzoU?NEeHXgM%Ory16)ri-S&`o!Y@g9Q*^?K|~h? z7wce$RtPu-DO91ukzO<*6mo@gNZ*&suY2!#d+(hM?+1=I?|ZrT`|$L6-}lnz0W=zo zMxzmOy;5<W=ptm!Fx%p3sEw^u70k>ib7PAL&eL(0CdAHHFJrF-@$K-kE=wauY3>aKV}$-3sQkZMuooA zCa8L?k0O`P_JqH81N62O$eW;_0Z}k)ouB6TCC5(K22iM5Hqx0CnvE838U6jBkQ|`G z01C{}-nQd7d`ZguAxI8TVE`4j(+_igB*$RKanNy`lOG{Ae*>&rHb16RVHTEpc~#-o<0gZDf{nC z_j!4u&>!i5+D;YIrMZ(Yb=TeD#z$O!au0{E-VU_W5ANXa#s}cq;=nvI#I4V80k~$R z=mK!dWiwFQcb#Q@jYgxODZDuY3;> z<>yuJ0V4g#a)WW=mz-4|0XjQ8hS_2ADG;^+GTKbjOFENMe+;THfJ*<{VBN9@YKJJ0 zj={x+5}J(`zY>Pg(=INQq>P~Gr!y&jbsVRsT`sSX=Nzm0fKT|M>jS9zx;{Wa-1+&q c^)+M9KenkZKyBE5q5uE@07*qoM6N<$g2EHC>Hq)$ diff --git a/Resources/Textures/Objects/Devices/pda.rsi/pda-library.png b/Resources/Textures/Objects/Devices/pda.rsi/pda-library.png new file mode 100644 index 0000000000000000000000000000000000000000..6e8ed2bdf2227d03a6e40c0202c249a900022174 GIT binary patch literal 922 zcmV;L17-Y)P)=|az#b}Znzu~$*X*v{B-r`M#Z*o!QNMz%UHMFjlT+GW)~q zmO<$sAB4y#bIj~pDwXow^NBy5RFEa;^lG~;_*1N zS}n+CvyR8L+ig+eaivnp)`?;2pD>@$?RG`^a^(r^?sgr2cw*udXj&H5)>ffd{Nj4t z?Cf<&CX>pG8iu~511i-O(6j|1e(&KT)SK2Rm7Gq&(t~AD7sowXgwJ0;T8_JT;W8}g z%b;l*6rVnZbY=!BAJ!e6{TKc9<|o+P*n-Ka)3CGsTYPsdeM_ltSp?Hp=8XFL>TB5i z@lzOqb!?Y;S2_6H`L$z|Xw;6}ym3c)@j>B0J`*FLB8a}|n2jyN{_O1u!@5e}atp{K(An-7_1L+ymNo(} zS{9=Yp&0?a5hxT2$_@yk553NJYje^+lo>!`WY{4z6NoTp0FAm_lBx7v*8sW@G;^C@ z2ZF2tUiIZ$k4l_{<{9974KOaSw-CvTkzWUb%mA01^-0v{k~uXXyKz`fRv)nZk7!C~qH zyin>mcEIhqyRIkFBj)`4f>I<1gVJ|=8@#XUqSW;m=z7zro1Gv>RN%9?9|omwelgk4 z=kub1FB+;J#OLdJz3zG}3HM$^>@hetr4VHk#C7=~dOhB>-$e!vld z^8?J{oFBmX0m0+*W-wqesQdsq6i>lfFZl_s(P23bPtnLf12{VDH#Uf|crtUFUk8FjhrQ~D79I9F0%1jm{mj5nqQhR}^IjYXGe1Dq!Hy@B z2{k{!ivwZi2gu1;ASG$ZDLSF%2jF%ii{c1j=_NjY82XqF2h#3C13>L=`u}x)z;k$| w)ZzR9r!P1^fb#=Ff%5|xhG7_n84Up7F97S6zpB_{V*mgE07*qoM6N<$g5nms8~^|S literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/pda.rsi/pda-m.png b/Resources/Textures/Objects/Devices/pda.rsi/pda-m.png deleted file mode 100644 index 3adb51ab574fa04281d89a73a722262abb8f32c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 465 zcmV;?0WSWDP)?LLZ>ittA^TRMb#l(4^=tgcwvP z4y_WrrVXWOn%t{t4L-{~FVA_;dG5nKmkSe2@W+@^P4svc8ajou*?XnhX4U55a1@`< z2SDuVuxDOma~A+9B@k<#0&df}&&br9f5>4N2J5TK zqY(g5uh(^d`CS1a|2zPR%QCOCYaN`)WM=y5X0!qlm*rM$soZt(Z<_VAry%5?Z@Cb( zUANYt?V2r1TDRPA4jflEI@S;9c`%Rz@U`pqc&rYz?|K*q2AYDV2*c&=;>S7#Go@4) zuR8@p-2-EHz%UGs&YuTvHnf1~{vH6Q>64!P_R07FiJ`=wtARa$JN{JAHVyyr`u~z7a zg%C(7NhV{;0<_L6Nu$Trq1{jG@^WW4|ji92_r*DyEK3)Z;rfUBuO)2Cp1%ce~Xt?lgu?O-9~LXhQgalQ;+zkbJ%3!Vd^xw$zR7A@KgR}XT8 zl#~=9qlt3>2!JdvZ7pHA_3#pgoSM8ILw9u#!{&_}8M1TP7#=+!Z7~cG9Ri=;e}-dpF&L1O z+fK3rs2T#0DDVU)T4DjwA;8AU3diVTFaV1JP>u)Z2#XsS+7+Mh#w1cSXmjYdb+YBdhvo{;Paz<&dPCS&YHRaGd8BFsT4 z0Frcw!C*Mo&+B!gRJ!_RYq#4-CX>P(t5%x^c=D68V>~qT%N_u+E6goh(Bz_GsJ z6WV0IpBj!{fPXB@$Yc)i_WEwx3sI@{-Up;wP5WL%1Hwt@@mP3F76{m8jH%Ey&}cM-IYL_t(|ob8rBO9L?&#(!!HrGs{pxCsspZb1hJ!BPYf1V2Cq z7ZGpihwuY*u{hOlP(jc^QP9c3Itk+7a*9EUgM)_<+H=r5JPK{nKf3gRBkz$XPo9ML zO#(v<@y{4>;D&?Hwlxq|DisQaf)%-1tx_x&t@N!8NGVCD(|=ZEV+^%g%}PIIX#jwF zy>7+J<#N`V)&@M!Ks0fL%pQo6$wu^y;kv?kQ8x-_%r%prX^K zZ;@p_UInJ6YX7U^9N_#1ixW`f6=D~F=~pkGp@@r#OEH{3eT1QD(KUj0un=+~2uxgi zlHu#u?+gqK2T&yzK`3r+PKNwoa}+5FAr4}UCe8sM%S&5J7=La(yo4dACa=fPUERa* z{O%cspU0-aLxlkng1DlFGzWmdvC|0Oi--w<={K+5F}!(&5I=lsGlN1bu_lt}06sxp zf?~0g-;!oKDcSJT`_FKUE(QbWiIf;X)ewM10VvTD3y2N@Hdan6omYSd9{kT9zk;g)MF9heAwX0b02MT# zypB(v0VxVdNdrVV0OTW3L9=IqJBqkV!A`vDvnJp#got)PK<+Gt4U^LtY|VU8#3hw+ z=ld7$eh_0ceg}Yx(es)t4Cmvt7$okVVK{tB7)74l>M;yXi=h<}K|oY>Oq5C30Ws!} if>AIEMlxVvU;qG1l8{x7cl03u0000wka@Z%GCQ1_p*1Tc0!h z5Vu2-V`gSyV0yfpwhoxF^*Nl)@$wLc{9h8yBRLmjcuT@VA(3kroKEE0#o)(r0-si_ zfT9qX|IH1Bh5*vSfUFQ;U_kg9nN8OaK=w5yAwX6xfH~r~loN(LU2_5Jvwaxyq~-#O z$^p8E!0+F`8Goj3dP25k6g$96?Gv1Ru_X{iPQPY7oc)~yGfB#ZV&YN^2k(7l5EGYT zP&LzJ_z<;(;kN5k230dn1~G9dhBYUjF^Gvvkzyq2<$%2sH^a0|XBZe57#Lo^{soX*{?%d-6PJQpWVE}E!Dx3K14sh{14D?p6oZ(!6vM;6S`15< zP9xd@B)18pqqFd;gIP{&n~-P+pgRN?AlBkhFbW0@005&JkOQu|-x&Y^002ovPDHLk FV1j!!$iDyp diff --git a/Resources/Textures/Objects/Devices/pda.rsi/pda-q.png b/Resources/Textures/Objects/Devices/pda.rsi/pda-q.png deleted file mode 100644 index d90ee0c144b7e46d0ab551c131e895a61418c32c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 461 zcmV;;0W$uHP)M(a~T*I7#JSD`aqnil2mrU-sO`Sl&bp~CO^?3sP^~o-wck_b^tQ?_wOI6S}1n_ zED9JH7#K3VA>Ny@^*O^2aXS=s%*-qdOpkX{-vO{FfLRO!94`-HsQpWl^1hBt1m=HpL!lvnv@jqm1Q-|)zD8!#H3X1-O-Trl?0^h! zNw_0^OF3c4(WtPp@Xgzh2m`}c2#shggVZ5hQ5sMUT%l)57f zW<;AwQZ^LfVQ07`o5Uc(!wzTfWbuUaVQf+W$>o6Z&8ZBBO7}A`FfcH%q@*y&*48pG zFfcG2D&5au^JyKa#u3*fgEhy(a~l}~{%&S?`04|LyqEyIeE?(2iwQ7nVD@ELIk}#J zfq}SY8Od$J@Z3hc>PWGiBnO~71Q#II;!!XP1`PlJ1XGRGGU&pf00000NkvXXu0mjf DkMF?L diff --git a/Resources/Textures/Objects/Devices/pda.rsi/pda-qm.png b/Resources/Textures/Objects/Devices/pda.rsi/pda-qm.png new file mode 100644 index 0000000000000000000000000000000000000000..4b8ac99881b48360981282fb70daf7b07f1b1b47 GIT binary patch literal 478 zcmV<40U`d0P)L6Nu$Trq1{jG@^WW4|ji92_r*DyEK3)Z;rfUD!C27O?`{uV24oh)n6omYSd9{kT9zk;iQL;(##094R`@;W|w2Bat;B?O3a z0LVw6f@W#wSrqZ;a$~&e?K|-oLPR@2CUZRl!}LG~8#`_kaU}&|oO@~07*qoM6N<$f=+D4F#rGn literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/pda.rsi/pda-r-library.png b/Resources/Textures/Objects/Devices/pda.rsi/pda-r-library.png new file mode 100644 index 0000000000000000000000000000000000000000..4d36793ed9779d100a191c86d5a70b7364af17f6 GIT binary patch literal 350 zcmV-k0iphhP)MA8HRf-8P*TPN$-Q; z620E5YOY<>YL6z0zPx-tqaE02)iE3m@V#7OG5bLNCWnh`7JrrU1KQ0_I+1Q5!H3UP zd@dq8pisQV^nGscukr!<-Itx`KGzPE;DrQ#TPoN#-tXIL@X{jI?>zxRRzKIAspg&cu({XWHmb>|=0KM7kM0mtotV@YG>9d#9uU;Sf> zuX>u)JK+BA$v>7oxr{Nt_mj8TLDC}SZkv8B^$tj?_3}r=Cz(H~*8BcG5fKp)5uF$S YKRT^t%lkyyS^xk507*qoM6N<$g3JSd&B!BWrL_t(|ob8r9XcR#d$A52bKW^nrAVoky3lTd(gOExP18Hn5 z1PcqX6Dv_t9B3tkfM9JAu@FR3DItxZy%4dm3FNrKA_o?t5kD?-J7aMlZgkb1#Z3_B z*X-=R$A8}c%?Aq}kH_Qjcs&0p;*xys!bSV19IZ7^mL59k7JsFAamjyL{Sw&)DG^0N%ZR%*4^Nqxfd) z8FA8Z(sXVBY&Tl9=`3k)3;p#A8>^2HlY%vLUOWI%SXCpgHwePmNz=Ijm-amUZG7?L zjH_f}1eibaihu5hx4H3ne3Dz8Q%;(yOd z)59bu%~D4I`i6(QVJFN3WUXC$d5}9N-i*d5`6;Ier5gY{XZ%Mjflp@)qtvv{)!+B3F`@q%Pp)m-)}tW z?}DhF5Y!?!O_yY?wUhYYN0B6Z38R6@%&#yOf*>Y{!rd#+Q8x-_%r%prX^K zZ;@p_UInJ6YX2uqTF4+REe+=Hk>fy-cX{*!L(kKvPr>w-O`8~6+uI4+!9vJ|Aj{+8 zd>Oue{m#H(iYhlf7(#P%b22Piv>C1*gnfM66vZF&r*KfV9VAR;CN7r%DnGK#u}YitbJx!W0Rrs#nA zH?OfVC{V)zFn@p?0_dTE0H7$)VPIL4#h?vJJ4BdEbQFL>02JpSz{bi7=7TVZ4Ffh) z;=!yxA=4PHYGx5-Ea1L?@3mGCX>e$iTo*11`8A z;5+3G00B@b2P$a3p2??hS`4j-2--nZbxedBO3WVxqhJ(_ eWWd0{02Kg$5uZ{uZJZqd0000OF~f;{!#;Ra(RY52%W-zAo>ADAuU3CQ@FVV zwgrLP8{Aw1LwL2dIRq{y4|1?vC6T7WqDwdg4HDeahG$P-R@~#uSHt_@anHTy+;hMC z@y_J{4jlY3rbGiJgnE?3ZQKgw77CIO>Sfe4)XuzVJ-fI90DlMsTBh|vp#UY76(Zph zAuvgJD8bi_E7Sa`FG#&!wuiv#bJa9IJl^hG=f)c69Ba!9lOX^A-ENn<<#!1r<3RvG zuE_8*6E*qVZVy~{XOkt6D>B3OK2}EjZ^V4$DoDnIh6)K^$ruy95;nb;)O6MqIO=Se zMjbQ_#!>(n+<$u5wpD@QTU$|JtSa~*!DrV;{I*uX^n*6yr&fWbcffW9IOjMxy&wB9 z%LMjzcK`sDrLT)8dZ9nlwOUO$C#ei&Sw^$jgoLpEsSUg;Wn->s8f00fq@=$Ce!m|~ z$pZiw8~l(=$s-bpP}7NbL;#Rc(}=}lIGJOR5Jnp}eK)^uZ?%F(Hw1{aW#pc4Kb!h7 oj&eAOz-J=gLG)k;4*m_^0Sx4h5wfHkCjbBd07*qoM6N<$g3rLo4*&oF diff --git a/Resources/Textures/Objects/Devices/pda.rsi/pda-robot.png b/Resources/Textures/Objects/Devices/pda.rsi/pda-robot.png deleted file mode 100644 index 1923f8ee03b52e15ad8fd078d11219280a9536a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 480 zcmV<60U!Q}P)LrPv|pw;cx_@hpY7ykQJ!6OyQ3X3{UO{slDPQ zrC1yJ=nb*`iVB&1ux%TecuLs55deT{wTfoG2mmn6>4j|Oi)b_&)N*Po*<`yZ z^bMTG(l~nS;(RMDre%x?-|?`Ei*5IlQd!H$J7J;k{eWapnv)336Zr|MjROSuH~0dZ WZoWN%Sgn%)0000@P)S5XUEC?MWfQc&bRWwIZ5JVeu}=`T+U}zCrKaeFGmsU!VwuoB0P9$?QjF|C!mHKt@J}E_;Lw{~}m(v(A8_v1XbtSNc~i7!pFj zvMkX#8@xi*+!(XNaLz@q*Xx1jdCEPM0w|@>YPF=ZL>$L~a=9E#NfC@O!Y0iL_0IYJd&|F$XjIDYM+73xvj}gE+Fsg*p2|!1; zjKLwLK#daAO}`kO8YQTX>?H7Cpo3BXI$C!eusMese+E7@#dz3`uZL0j)?wzqJ%=P)14=YnjtQf zQew#BsRgG)iAzI`(=LK=I1#Zs1j&-^_$2>mhx&og_jFJ1o}NzV3rqa(xD$qy&1U=l zalKw2d!Jz#0bZlg(CTXm?&95U*SnTzwZ?Mo%}uX%`8pG;Is>klWm!Df+q=1t$xP%Q znI@G=C1CnCtb{SJNQ6qj#h3H*e{0}f#?W#c$KhE7P3S2z+5c0%F2)Tk@O-P*ga@_^;+lC$ozFgy~tldA)oY8*bz1F zyd!FuYsXRLW=r6;+6tU+5G{kL5`e)|`|IHZ-rS98^`=h1|J1i7@Z$G1ALnhLkWYFh zoO{nl=KWv6LK6Up|NJmA@81CnOTabq*As9YhjR67>|*0E_XJ*j`x=V(`SC*l&gStu zzPK2~D5d1PWg(^X>f`NgZ|v4C-p1pz8yLp@a+$+i4uE!huptj~IUeorN0rmJWa)Ie zFN7e`YOz%;@}yeDwr!-8*tQMe)ly21Op{uvL?@L(DMho{oUJ7jLZFnQlS)x5m7rLh z$oDTUgwV-{>xvD-=qsfF*wA!Er|avU@ws%xeiQ!ju=q4B`4US2`~mYn;WZXEQ{eyr N002ovPDHLkV1j4nBeDPh diff --git a/Resources/Textures/Objects/Devices/pda.rsi/pda-science.png b/Resources/Textures/Objects/Devices/pda.rsi/pda-science.png new file mode 100644 index 0000000000000000000000000000000000000000..c7b103cf24575709e74a236ed74b7e3348feb7a8 GIT binary patch literal 485 zcmVL6Nu$Trq1{jG@^WW4|ji92_r*DyEK3)Z;rfUBuOgnfM^GNdjA=P zf9=L)Fh&M)a@$FE08wdx0WAd3LjwUoQQ!$qw8R3ELI4!!Ai&1T3g&|_hz$dZ2XHo)mHzjD=WbaP}zL6Nu$Trq1{jG@^WW4|ji92_r*DyEK3)Z;rfUDE^U4sk{Nu-u43B^Q zWRPWN2lM&)`5AURdc;t3=MF(TSO}WVz`#)Q?=8dEuitUXbMtaC^ze(Jh{)|B~IW>7bhVJSfhAZD+F-*?A!Z35C6I>1ybvUAiGzWmdvC{|OY!NXb zF#YD$JBBx}5aJAHi8YN32k;5<5)_+x#|fKOynyIz`04#;I7SzPf%NcwBs+krApna4 zP@-iJVP;_XO4wYYLx7Ey6^_xxU;q{cJxsz332*)qWiH7jAtd2JFgk!m0Vo6(fI@(p z4gh60257MJ3h=;#|JmbL2u08+ASDEdN(0>7oZ!5UPoClXUw9Odk_L!!0LVw6f(9q} z{ufjIt5*yOSMV1?L_5HE-#!KgC(`oxlOI2bQb(w^`ro3W0%j0fw!wx9ZZx1XbD(I zQGEONF9sbpb`%;LP^XmxUVHlzRP+1yZ`wJ4fq{YH-@kvPYN4(JGQ1@j7#J8BW^8@V z@I%}VMUI)7g@NhuZrVCv#@6R>Hpk0D81jEfG>_z5kl`%}4~0aoU2r;)YZrqb#|cu6 zqbvmGe{(~jA%L_nAS(nI7!bZjX45qUkbO-_2#}QvV2=1L<%A(m*IdB*Y#)X^skwln za)9n3@cZ{~hN+vLkZl>o4hT7fS@2*3Z>`LTHj|`m`1oN8 d3P!=80RZoHo~Xqfge3p~002ovPDHLkV1jQ6z5M_H diff --git a/Resources/Textures/Objects/Devices/pda.rsi/pda-syndi.png b/Resources/Textures/Objects/Devices/pda.rsi/pda-syndi.png new file mode 100644 index 0000000000000000000000000000000000000000..51fa1bd294e88c66c7d6c868b7df20f870818ec6 GIT binary patch literal 424 zcmV;Z0ayNsP)L6Nu$Trq1{jG@^WT<>o1mh@-@cM%K3)a3T-^VCxOfO!&dP{t%(}o%<+-^z89cANKoQenW5*RLq&om)d1-42!>xyx zFyz$a^%%OVdl(-4`OPr>LpwvKNF7`b6m^6gL6ieP;MnN{aJGn;5SV`R>K((IR|k+( zoh8;d(jCAj$V*VHQ)DB_4j?)ketQ2Ij?u+np!`h}$qt}u2*9EMlmn>l05(=uf?}{J z0A<}T|Nk=__)a(%kX#Z%5*`Gj16UM*LVy^{Npb)vyD>n6omYSd9{kT9zd}+4i2_gv zfXV@408u3&F$Iz4g~tpEERZNcP6LO(eZ^}B(M2(+pdkcc4uGkj{^1=#JBUhzWp7?G zbcu))qZAIV{Q60hIzqJ-ye1?zPGJ@!6~W|30n8CZ*-XCqqhJ(_f{_du7#IM5e2IH6 SyO0C`0000AP6?L2^KCU1}-T?TR0XL z9pPTWl{Q?R+MV_LDO!VHIDYT=KHmGj$M5}ku)qR;j3rS=grDD8YDfkj$tVV78T&H09 zsb=G4r(mjgVD23-41?pd$BC0oE#P2(4}ki*^YBEj%xAjUYzoJe8bei8X|-A?gv_sS z%bQlU{%f@ws;bI_lz#`p;V`c7gE>qM5FdQ@f(CUB7jUbO(K!tG@zppqQl)M zZ`wO;zqJj4*jgsN6K1mMAN^#KO9}WcWE?~jFR;MB!3QSZjvtM^aiRbK002ovPDHLk FV1hE@)QbQB diff --git a/Resources/Textures/Objects/Devices/pda.rsi/pda-transp.png b/Resources/Textures/Objects/Devices/pda.rsi/pda-transp.png deleted file mode 100644 index e140da7f0424359cef9766547892c1761e358226..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 534 zcmV+x0_pvUP)(Yz|-a;EbS&7br@=${=WgzS|W5l(GL)K3y^A`n2PV)@1IR;rbF0c0BB3z zQz~6CHV#dHIQRJ)D8z&ICv!SLsr16vrCF};&Z^FOI(zv(w+sRnb}pHp41)k#tm`@w zVdmrzp%oEYQN@H-By)18_OH1d2>2Wrl|xv-HUj|u=4$dQW8aoX0Jsp_?lYi2J*!n2 zGqA9JDPL?fhj(D$HJ1azWDim@Fk}83I%42MeZ5+hF$2aGgrYG*(HNvPQ{VU}Cp3ik zs~8O!SCBnONfs=O$k6~joxOmhz3F44qW>YUsT_F)_8F+L>?)mbN*dA2U(`^C=`v!LB4DxT(M$>@)xcqI{@ea zR+I9X59je8`O!~x7{)~-Di^xB{k^Do6jgcpCtbZ~2RGKNN?U6HEQMqWi@(5w2M->8 Y0$SXrcYKGE!2kdN07*qoM6N<$g2zqa^Z)<= diff --git a/Resources/Textures/Objects/Devices/pda.rsi/pda-v.png b/Resources/Textures/Objects/Devices/pda.rsi/pda-v.png deleted file mode 100644 index b5c169dde3b8487f355ab34a63a608ceffbbea57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 472 zcmV;}0Vn>6P)NklTCyq#L{}lSV{?`-c&@mR0Q-BN)FU2D zV%s(gb2I%B08p#dbhrGjfVIdZ0DIXo&lB@4oZIce^>EQ&0eji9Gxt`m+W1$^eA->G z7MXNhi22T)G3GmG*_+c%*P8GU>IN`w&HzT5y{ z7=}~y_T>g41X4;enUt~s?LT2On)q>Dy}0V1P+7oNA>To@@DM}%8@vM-JDDZtW2@2t O0000L6Nu$Trq1{jG@^WW4|ji92_r*DyEK3)Z;rfUBuO(}pK{@%G8;BqiFH#aB4qD7nG z>Oqc>l9D21G;t090g&aTttAY%9$vzbQ?|9TJZv+L*Uc<&v1+` z1_N@hYI63@U?_3{UcgV=Fii8%E= zd-jZ=L6Nu$Trq1{jG@^WW4|ji92_ zr*DyEK3)Z;rfUDE^U5Fuy7ocnGA9&uA3uI%c>MDxgDg8cn9tA8&#>dsBZitgcL>_S zLdb<6Q1b6B!`H9h85lBQA@Kx7o|~7Gp@&}#MNEc+gBYWUbAJHH^3v84hFcFWVaTb; z>oIg!_b^=f{)%C8?iGfaD-odsiaH!oLz)9X;MnN{aJGn;5SV`R>K((IR|s*2v&5Q4 zh6DHnc?pWmyyJvTD_%f!HvIJdGaRFf!9aTWK9U_k)ewM10VvTjh%hrSd?joy(ILRb z$_mHmVlV)Uf`1++VTOb^e~B`eVa7dt%wK$qN-z}Ou`O`F@F?{f>AJ%0RsaA0J9I1eX%VDX8-^I07*qo IM6N<$f+2Rzpa1{> delta 567 zcmV-70?7UA1J4AIBYy%GNklr+1l|WsN;9<_eyw^J~_1??1 zSvVk5otL|LK>{>;5$*c}&&*uDPLp(8{4MaA8ou2#D7K17x@${Elj#D6hy^s z3!=iK(cP%&;yJKs&HLIvh~`004#4SGd;5KL!28v49O&s3ND=nbTp-@pQ;_`nDiDu) z3S!*@eRsgNZPs6Y>A6^J0UyN+4#pg9Ul!_}0kRrU}zmxa!Bp+Y^fZw3|#x~H~QnUa7002ovPDHLk FV1i*=918#d diff --git a/Resources/Textures/Objects/Devices/pda.rsi/pda.png b/Resources/Textures/Objects/Devices/pda.rsi/pda.png index 0f0abfbe1e1eb7dff368e26d477a7e8716b33c99..8473ddaab11bf28a875c211c9427c275545e9c73 100644 GIT binary patch delta 402 zcmV;D0d4-E1FQp(B!6>BL_t(og<}{6qhJ&e3oOjc{?j6`mQ8x-_%r%prX^K zZ;@p_UInJ6YX4J`{RvwB=FK~X&!4|DaImv6u(B~Th=>R=EMKvU;lP251npoUXgUJ} z*s!l(zvGnW=H_IGjBrB{v$oQKIRGyp$^jtDOIu4AZaut&A%CYPugB0`-NW$c(K80U zl_wZJlm@}&Kv9PyYT$q<2Y|q_(+A*e5iub!{pQs>hBvPe;y>@-C)PO99l$5ZOHl0l zv|^GSKy)_z^!_s(ql>|SK=(S59YEC(fJFf)(Gm-Y4goe+Ryal%g8^6+fN}&V7Z3x8 z4gnYdB|I2_C4WX307U^P7tkaGK-rA}8tl9RJn-Ou_V^WC4J-<%9s;0(29($F$ul5D z0VyFslmkFM0u?mG0+{;Nwx!f@Kw3sO!>k#lL^}Wkjvl*0lsZDS)qe*EeK3RAIE7h^ wR1e^_gQ)75D4WSQe-w;@Q81DL0|Ns9L(hLRNNx$X01E&B07*qoM6N<$g1T^~^#A|> delta 389 zcmV;00eb$d1E2$tB!6c~L_t(|oMT`Z1*2eq0VA;rO-ED5Ul{rfj5Mv~?L z1_lO(fB*iGs)f1^$nchAU|?Win6dRa!w+#g6gg&Q76zuryMJlxfEin#!`U1!F>}RV z63rty7i4%#!b2gEYZshOky2n_=pvCuCbju>-uEq={1Z{Ri=8 zl9UafKYPu<%6_KF@ch|pIQz|80XQGVCIygO4qUppje(V272=@hNC}c%mErZP^Q0O_ zyaT3B?_dxRGGGwk=Yd=F`qg<9wg5j5gMg3$!_uYGh;{(UZNlj2EWGMqmJ{11B-#P! j4#5S8wRjYaf00000NkvXXu0mjf^aQV) diff --git a/Resources/Textures/Objects/Devices/pda.rsi/pda_pen.png b/Resources/Textures/Objects/Devices/pda.rsi/pda_pen.png deleted file mode 100644 index 324a706220ccfe65071b5fe9076e3f6eae715518..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz4^J1zkcv5P&pGlkDDbd29&in2 zof`PxNo%o31N()RH+%G_=kgv{@1k;6Cw%uurDZA#N>!N$^q4pl8X8tJzKfGyu*&>B cBSX5+*)?n{wH?%(fo3vzy85}Sb4q9e0REOJJpcdz diff --git a/Resources/Textures/Objects/Devices/pda.rsi/pdabox.png b/Resources/Textures/Objects/Devices/pda.rsi/pdabox.png deleted file mode 100644 index 4f5012c89655abedf6834b5c145fba97306ee123..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 403 zcmV;E0c`$>P)?SD*0a*#CA+hoE7ze^&9E^Sfzk;)qap(eJA<;lgTG4?;f@L8w zrEkQk27^5M2jkMS_1*XG@4U9jg@lBJgnwp3RxFnCvpCJWPtVf+09&%~bb2RJu;Yvg zdiGa=Vktj6JURftwrsN5J!zAE{}nx_<4s*Uokt4A0w1GMbOGPqwro^YVK{u3Hc?dt z+p^KLOyHYK1?C$!>KB0;U0$7|Y^$NdR|@zvn@wrmFpSW_p#%V0ZF6C*Qmz3Yg!o&5 zR@-F%So?k!g9+K|Tkhs0qOuwFptw1W73>rE6NtfNErFp0QmGV`a&6%sczOGb{rXo5 zxUPo~f@-z8bdO(iU2pvYdQPX_I73yHrF&X!6W8_7bNY{U#~H^L@X73I(z_$i6{w5ELSKf%1_J8NmVGR zEJ#&It;kGcV5qqDHav2Ysyfe~=OT7YlLVR`ceo1fYwUl&Gbsbzi&%CE&6LGx9fkav&hz z?{1$*f386xgX+#{p(cmtKf1f_+Qq1EHY=Y@O_$4aSZmiK6|e35H(mKeukH?N^ZMu+a>Ru zlcEewm0kbD;!|F4I2JxdWX@WHHWra5UW-CBr8f(TK4fc>nYLL(E}_2+9pvXs=F%c>XyuK|In9^!ji0X21UDn}n^s%YEH;t+Puhzoxsluh82~1rtB)T%l34iuL+! zE*+Q9>fK83wKglWJ8>tKTU@#^@sEd~kGtyc(*KwKKAmAuaP4fxI@g52DZG!P-ds%9 z?YPYKHGJVKhTV-AlVE5@DoOR>YZnSQ?73pC^lAV8 zrtN#TR;MWE{w=bq-|OE${lYuC|O8i@JwW#gaD* zMQzV%y|cByzPw*v&OvM{lkVlpq!%((t8DTrwKgn_4Lq7_@~66ymGw)xZIO9lVCCi} zH9d`gKjsv^eo)vyFU)?{)O}Cf|82fFzxUteUY!EYcQ4~Vb~Bm@xcn<)U|?*?baoE# zbasXnR}2gq6Kf}0dmIiBY5TuS%=H!X8-+&`7FtCLh!$Sa5?Sc9LNuz>VCPHjStcr) zdVNjV2M-=kx_a<7c#NT zZ`9uVbp4ganf{lub#<#)zT`5CU)S}$$*fo2a8TXZEH#`fi1Vk-hdQ_WQ&`#Z8sC}b z=bbH{W5=xNdUHSC3|Nb>C3(BM0BIoj z>AbrhNO2Z;L>4nJ=qZCRW5rT?V6+Knd%8G=L~t@H2;6@URy<0KhQMeDjE2BKh5#ce zmWM>g|0ksW_wU~f8&@qO+FTYw2BORV`}YrBh$2484#@D91Y0;`>vM)5;&v#OGc&U= zFg@OlB1VWqvI9UC!vM$2LogZP$DFh2LAs2OHv{vD+EA}f%zJlJtRYb$bK*&HMn8=M(NQI7!85Z5Eu=CK@|e4vwal~&617= OIm*-3&t;ucLK6U6_+|_M From 7771f584606b040bfd6134e7e7f832f578a5ac48 Mon Sep 17 00:00:00 2001 From: Julian Giebel Date: Wed, 19 Aug 2020 20:43:56 +0200 Subject: [PATCH 58/81] Improve on disposal routing code (#1795) Co-authored-by: Julian Giebel --- .../Disposal/DisposalRouterBoundUserInterface.cs | 6 ++---- .../Components/Disposal/DisposalRouterWindow.cs | 11 +++-------- .../Disposal/DisposalTaggerBoundUserInterface.cs | 6 ++---- .../Components/Disposal/DisposalTaggerWindow.cs | 11 +++-------- .../Components/Disposal/DisposalRouterComponent.cs | 6 +++--- .../Components/Disposal/DisposalTaggerComponent.cs | 6 +++--- .../Disposal/SharedDisposalRouterComponent.cs | 3 +++ .../Disposal/SharedDisposalTaggerComponent.cs | 5 ++++- 8 files changed, 23 insertions(+), 31 deletions(-) diff --git a/Content.Client/GameObjects/Components/Disposal/DisposalRouterBoundUserInterface.cs b/Content.Client/GameObjects/Components/Disposal/DisposalRouterBoundUserInterface.cs index 00f30c02ff..1bb74c1bee 100644 --- a/Content.Client/GameObjects/Components/Disposal/DisposalRouterBoundUserInterface.cs +++ b/Content.Client/GameObjects/Components/Disposal/DisposalRouterBoundUserInterface.cs @@ -23,15 +23,13 @@ namespace Content.Client.GameObjects.Components.Disposal { base.Open(); - _window = new DisposalRouterWindow - { - Title = Loc.GetString("Disposal Router"), - }; + _window = new DisposalRouterWindow(); _window.OpenCentered(); _window.OnClose += Close; _window.Confirm.OnPressed += _ => ButtonPressed(UiAction.Ok, _window.TagInput.Text); + _window.TagInput.OnTextEntered += args => ButtonPressed(UiAction.Ok, args.Text); } diff --git a/Content.Client/GameObjects/Components/Disposal/DisposalRouterWindow.cs b/Content.Client/GameObjects/Components/Disposal/DisposalRouterWindow.cs index f9f850ae18..98e345f124 100644 --- a/Content.Client/GameObjects/Components/Disposal/DisposalRouterWindow.cs +++ b/Content.Client/GameObjects/Components/Disposal/DisposalRouterWindow.cs @@ -1,7 +1,4 @@ -using System.Runtime.CompilerServices; -using System.Text.RegularExpressions; -using Content.Shared.GameObjects.Components.Disposal; -using Robust.Client.Graphics.Drawing; +using Content.Shared.GameObjects.Components.Disposal; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; @@ -21,11 +18,9 @@ namespace Content.Client.GameObjects.Components.Disposal protected override Vector2? CustomSize => (400, 80); - private Regex _tagRegex; - public DisposalRouterWindow() { - _tagRegex = new Regex("^[a-zA-Z0-9, ]*$", RegexOptions.Compiled); + Title = Loc.GetString("Disposal Router"); Contents.AddChild(new VBoxContainer { @@ -38,7 +33,7 @@ namespace Content.Client.GameObjects.Components.Disposal Children = { (TagInput = new LineEdit {SizeFlagsHorizontal = SizeFlags.Expand, CustomMinimumSize = (320, 0), - ToolTip = Loc.GetString("A comma separated list of tags"), IsValid = tags => _tagRegex.IsMatch(tags)}), + ToolTip = Loc.GetString("A comma separated list of tags"), IsValid = tags => TagRegex.IsMatch(tags)}), new Control {CustomMinimumSize = (10, 0)}, (Confirm = new Button {Text = Loc.GetString("Confirm")}) } diff --git a/Content.Client/GameObjects/Components/Disposal/DisposalTaggerBoundUserInterface.cs b/Content.Client/GameObjects/Components/Disposal/DisposalTaggerBoundUserInterface.cs index 273b8c06ec..76d8a4fd48 100644 --- a/Content.Client/GameObjects/Components/Disposal/DisposalTaggerBoundUserInterface.cs +++ b/Content.Client/GameObjects/Components/Disposal/DisposalTaggerBoundUserInterface.cs @@ -23,15 +23,13 @@ namespace Content.Client.GameObjects.Components.Disposal { base.Open(); - _window = new DisposalTaggerWindow - { - Title = Loc.GetString("Disposal Tagger"), - }; + _window = new DisposalTaggerWindow(); _window.OpenCentered(); _window.OnClose += Close; _window.Confirm.OnPressed += _ => ButtonPressed(UiAction.Ok, _window.TagInput.Text); + _window.TagInput.OnTextEntered += args => ButtonPressed(UiAction.Ok, args.Text); } diff --git a/Content.Client/GameObjects/Components/Disposal/DisposalTaggerWindow.cs b/Content.Client/GameObjects/Components/Disposal/DisposalTaggerWindow.cs index 7fb6dc6937..54dec5b807 100644 --- a/Content.Client/GameObjects/Components/Disposal/DisposalTaggerWindow.cs +++ b/Content.Client/GameObjects/Components/Disposal/DisposalTaggerWindow.cs @@ -1,7 +1,4 @@ -using System.Runtime.CompilerServices; -using System.Text.RegularExpressions; -using Content.Shared.GameObjects.Components.Disposal; -using Robust.Client.Graphics.Drawing; +using Content.Shared.GameObjects.Components.Disposal; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; @@ -21,11 +18,9 @@ namespace Content.Client.GameObjects.Components.Disposal protected override Vector2? CustomSize => (400, 80); - private Regex _tagRegex; - public DisposalTaggerWindow() { - _tagRegex = new Regex("^[a-zA-Z0-9 ]*$", RegexOptions.Compiled); + Title = Loc.GetString("Disposal Tagger"); Contents.AddChild(new VBoxContainer { @@ -38,7 +33,7 @@ namespace Content.Client.GameObjects.Components.Disposal Children = { (TagInput = new LineEdit {SizeFlagsHorizontal = SizeFlags.Expand, CustomMinimumSize = (320, 0), - IsValid = tag => _tagRegex.IsMatch(tag)}), + IsValid = tag => TagRegex.IsMatch(tag)}), new Control {CustomMinimumSize = (10, 0)}, (Confirm = new Button {Text = Loc.GetString("Confirm")}) } diff --git a/Content.Server/GameObjects/Components/Disposal/DisposalRouterComponent.cs b/Content.Server/GameObjects/Components/Disposal/DisposalRouterComponent.cs index 1abf3a7b2d..1d3662a85c 100644 --- a/Content.Server/GameObjects/Components/Disposal/DisposalRouterComponent.cs +++ b/Content.Server/GameObjects/Components/Disposal/DisposalRouterComponent.cs @@ -78,16 +78,16 @@ namespace Content.Server.GameObjects.Components.Disposal if (!PlayerCanUseDisposalTagger(obj.Session.AttachedEntity)) return; - if (msg.Action == UiAction.Ok) + //Check for correct message and ignore maleformed strings + if (msg.Action == UiAction.Ok && TagRegex.IsMatch(msg.Tags)) { _tags.Clear(); foreach (var tag in msg.Tags.Split(',', StringSplitOptions.RemoveEmptyEntries)) { _tags.Add(tag.Trim()); + ClickSound(); } } - - ClickSound(); } /// diff --git a/Content.Server/GameObjects/Components/Disposal/DisposalTaggerComponent.cs b/Content.Server/GameObjects/Components/Disposal/DisposalTaggerComponent.cs index f949e37090..3c1ab7bf81 100644 --- a/Content.Server/GameObjects/Components/Disposal/DisposalTaggerComponent.cs +++ b/Content.Server/GameObjects/Components/Disposal/DisposalTaggerComponent.cs @@ -68,12 +68,12 @@ namespace Content.Server.GameObjects.Components.Disposal if (!PlayerCanUseDisposalTagger(obj.Session.AttachedEntity)) return; - if (msg.Action == UiAction.Ok) + //Check for correct message and ignore maleformed strings + if (msg.Action == UiAction.Ok && TagRegex.IsMatch(msg.Tag)) { _tag = msg.Tag; + ClickSound(); } - - ClickSound(); } /// diff --git a/Content.Shared/GameObjects/Components/Disposal/SharedDisposalRouterComponent.cs b/Content.Shared/GameObjects/Components/Disposal/SharedDisposalRouterComponent.cs index c0323cbaa1..f580fcbfbd 100644 --- a/Content.Shared/GameObjects/Components/Disposal/SharedDisposalRouterComponent.cs +++ b/Content.Shared/GameObjects/Components/Disposal/SharedDisposalRouterComponent.cs @@ -2,6 +2,7 @@ using Robust.Shared.GameObjects.Components.UserInterface; using Robust.Shared.Serialization; using System; +using System.Text.RegularExpressions; namespace Content.Shared.GameObjects.Components.Disposal { @@ -9,6 +10,8 @@ namespace Content.Shared.GameObjects.Components.Disposal { public override string Name => "DisposalRouter"; + public static readonly Regex TagRegex = new Regex("^[a-zA-Z0-9, ]*$", RegexOptions.Compiled); + [Serializable, NetSerializable] public class DisposalRouterUserInterfaceState : BoundUserInterfaceState { diff --git a/Content.Shared/GameObjects/Components/Disposal/SharedDisposalTaggerComponent.cs b/Content.Shared/GameObjects/Components/Disposal/SharedDisposalTaggerComponent.cs index d12e9060e9..f20d6248d4 100644 --- a/Content.Shared/GameObjects/Components/Disposal/SharedDisposalTaggerComponent.cs +++ b/Content.Shared/GameObjects/Components/Disposal/SharedDisposalTaggerComponent.cs @@ -3,6 +3,7 @@ using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Components.UserInterface; using Robust.Shared.Serialization; using System; +using System.Text.RegularExpressions; namespace Content.Shared.GameObjects.Components.Disposal { @@ -10,6 +11,8 @@ namespace Content.Shared.GameObjects.Components.Disposal { public override string Name => "DisposalTagger"; + public static readonly Regex TagRegex = new Regex("^[a-zA-Z0-9 ]*$", RegexOptions.Compiled); + [Serializable, NetSerializable] public class DisposalTaggerUserInterfaceState : BoundUserInterfaceState { @@ -33,7 +36,7 @@ namespace Content.Shared.GameObjects.Components.Disposal if (Action == UiAction.Ok) { - Tag = tag; + Tag = tag.Substring(0, Math.Min(tag.Length, 30)); } } } From b7e5aafdbcb92cb6b9a3e4f97804949c2fe8abe7 Mon Sep 17 00:00:00 2001 From: Swept Date: Wed, 19 Aug 2020 11:44:33 -0700 Subject: [PATCH 59/81] My bad (#1797) --- .../Entities/Clothing/Belt/identification_cards.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Resources/Prototypes/Entities/Clothing/Belt/identification_cards.yml b/Resources/Prototypes/Entities/Clothing/Belt/identification_cards.yml index 8a2135e601..0364c3a024 100644 --- a/Resources/Prototypes/Entities/Clothing/Belt/identification_cards.yml +++ b/Resources/Prototypes/Entities/Clothing/Belt/identification_cards.yml @@ -6,13 +6,13 @@ abstract: true components: - type: Sprite - sprite: Objects/Misc/id_cards.rsi + sprite: Clothing/Belt/id_cards.rsi - type: Icon - sprite: Objects/Misc/id_cards.rsi + sprite: Clothing/Belt/id_cards.rsi - type: Clothing Slots: - idcard - sprite: Objects/Misc/id_cards.rsi + sprite: Clothing/Belt/id_cards.rsi HeldPrefix: default - type: Access - type: IdCard From f4909cdb9804a7f4a393022d81d9fd0399e44a60 Mon Sep 17 00:00:00 2001 From: nuke <47336974+nuke-makes-games@users.noreply.github.com> Date: Wed, 19 Aug 2020 18:13:22 -0400 Subject: [PATCH 60/81] Climbing system (#1750) * Initial commit * Climbing uses its own controller now * Missed a check * Get rid of hands check * Cleanup * Get rid of speciescomponent stuff * Remove unneeded check, add separate case for moving other players. * Add DoAfter * IClientDraggable added to ClimbingComponent * Added some basic integration tests. Renamed ClimbMode to Climbing. * oops * Minor fixes * ffff * Table fix * Revamped system so its more predicted, uses proper logic for de-climbing. Get hype!!! * Flag check fix * Distance check and reset numticksblocked * get rid --- .../Components/Movement/ClimbableComponent.cs | 12 + .../Components/Movement/ClimbingComponent.cs | 34 +++ .../Components/Movement/ClimbUnitTest.cs | 64 +++++ .../Components/Movement/ClimbableComponent.cs | 235 ++++++++++++++++++ .../Components/Movement/ClimbingComponent.cs | 78 ++++++ .../GameObjects/EntitySystems/ClimbSystem.cs | 18 ++ .../Movement/SharedClimbableComponent.cs | 11 + .../Movement/SharedClimbingComponent.cs | 66 +++++ Content.Shared/GameObjects/ContentNetIDs.cs | 2 +- .../EntitySystems/ActionBlockerSystem.cs | 8 - Content.Shared/Physics/ClimbController.cs | 87 +++++++ .../Entities/Constructible/Ground/table.yml | 1 + .../Entities/Mobs/Species/human.yml | 1 + 13 files changed, 608 insertions(+), 9 deletions(-) create mode 100644 Content.Client/GameObjects/Components/Movement/ClimbableComponent.cs create mode 100644 Content.Client/GameObjects/Components/Movement/ClimbingComponent.cs create mode 100644 Content.IntegrationTests/Tests/GameObjects/Components/Movement/ClimbUnitTest.cs create mode 100644 Content.Server/GameObjects/Components/Movement/ClimbableComponent.cs create mode 100644 Content.Server/GameObjects/Components/Movement/ClimbingComponent.cs create mode 100644 Content.Server/GameObjects/EntitySystems/ClimbSystem.cs create mode 100644 Content.Shared/GameObjects/Components/Movement/SharedClimbableComponent.cs create mode 100644 Content.Shared/GameObjects/Components/Movement/SharedClimbingComponent.cs create mode 100644 Content.Shared/Physics/ClimbController.cs diff --git a/Content.Client/GameObjects/Components/Movement/ClimbableComponent.cs b/Content.Client/GameObjects/Components/Movement/ClimbableComponent.cs new file mode 100644 index 0000000000..d637853960 --- /dev/null +++ b/Content.Client/GameObjects/Components/Movement/ClimbableComponent.cs @@ -0,0 +1,12 @@ +using Robust.Shared.GameObjects; +using Content.Shared.GameObjects.Components.Movement; + +namespace Content.Client.GameObjects.Components.Movement +{ + [RegisterComponent] + [ComponentReference(typeof(IClimbable))] + public class ClimbableComponent : SharedClimbableComponent + { + + } +} diff --git a/Content.Client/GameObjects/Components/Movement/ClimbingComponent.cs b/Content.Client/GameObjects/Components/Movement/ClimbingComponent.cs new file mode 100644 index 0000000000..07f8c7c5b6 --- /dev/null +++ b/Content.Client/GameObjects/Components/Movement/ClimbingComponent.cs @@ -0,0 +1,34 @@ +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Components; +using Content.Shared.GameObjects.Components.Movement; +using Content.Client.Interfaces.GameObjects.Components.Interaction; +using Content.Shared.Physics; + +namespace Content.Client.GameObjects.Components.Movement +{ + [RegisterComponent] + public class ClimbingComponent : SharedClimbingComponent, IClientDraggable + { + public override void HandleComponentState(ComponentState curState, ComponentState nextState) + { + if (!(curState is ClimbModeComponentState climbModeState) || Body == null) + { + return; + } + + IsClimbing = climbModeState.Climbing; + } + + public override bool IsClimbing { get; set; } + + bool IClientDraggable.ClientCanDropOn(CanDropEventArgs eventArgs) + { + return eventArgs.Target.HasComponent(); + } + + bool IClientDraggable.ClientCanDrag(CanDragEventArgs eventArgs) + { + return true; + } + } +} diff --git a/Content.IntegrationTests/Tests/GameObjects/Components/Movement/ClimbUnitTest.cs b/Content.IntegrationTests/Tests/GameObjects/Components/Movement/ClimbUnitTest.cs new file mode 100644 index 0000000000..7ae95a83af --- /dev/null +++ b/Content.IntegrationTests/Tests/GameObjects/Components/Movement/ClimbUnitTest.cs @@ -0,0 +1,64 @@ +#nullable enable + +using System.Threading.Tasks; +using NUnit.Framework; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.Map; +using Robust.Shared.IoC; +using Robust.Shared.Map; +using Content.Server.GameObjects.Components.Movement; +using Content.Shared.Physics; +using Robust.Shared.GameObjects.Components; + +namespace Content.IntegrationTests.Tests.GameObjects.Components.Movement +{ + [TestFixture] + [TestOf(typeof(ClimbableComponent))] + [TestOf(typeof(ClimbingComponent))] + public class ClimbUnitTest : ContentIntegrationTest + { + [Test] + public async Task Test() + { + var server = StartServerDummyTicker(); + + IEntity human; + IEntity table; + IEntity carpet; + ClimbableComponent climbable; + ClimbingComponent climbing; + + server.Assert(() => + { + var mapManager = IoCManager.Resolve(); + mapManager.CreateNewMapEntity(MapId.Nullspace); + + var entityManager = IoCManager.Resolve(); + + // Spawn the entities + human = entityManager.SpawnEntity("HumanMob_Content", MapCoordinates.Nullspace); + table = entityManager.SpawnEntity("Table", MapCoordinates.Nullspace); + + // Test for climb components existing + // Players and tables should have these in their prototypes. + Assert.True(human.TryGetComponent(out climbing), "Human has no climbing"); + Assert.True(table.TryGetComponent(out climbable), "Table has no climbable"); + + // Now let's make the player enter a climbing transitioning state. + climbing.IsClimbing = true; + climbing.TryMoveTo(human.Transform.WorldPosition, table.Transform.WorldPosition); + human.TryGetComponent(out ICollidableComponent body); + + Assert.True(body.HasController(), "Player has no ClimbController"); + + // Force the player out of climb state. It should immediately remove the ClimbController. + climbing.IsClimbing = false; + + Assert.True(!body.HasController(), "Player wrongly has a ClimbController"); + + }); + + await server.WaitIdleAsync(); + } + } +} diff --git a/Content.Server/GameObjects/Components/Movement/ClimbableComponent.cs b/Content.Server/GameObjects/Components/Movement/ClimbableComponent.cs new file mode 100644 index 0000000000..498f4afffb --- /dev/null +++ b/Content.Server/GameObjects/Components/Movement/ClimbableComponent.cs @@ -0,0 +1,235 @@ + +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Components; +using Robust.Shared.GameObjects.Systems; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Localization; +using Robust.Shared.Serialization; +using Robust.Shared.ViewVariables; +using Robust.Server.Interfaces.Player; +using Content.Server.Interfaces; +using Content.Shared.GameObjects.EntitySystems; +using Content.Shared.Interfaces.GameObjects.Components; +using Content.Shared.GameObjects.Components.Movement; +using Content.Shared.Interfaces; +using Content.Server.GameObjects.Components.Body; +using Content.Server.GameObjects.EntitySystems.DoAfter; +using Robust.Shared.Maths; +using System; + +namespace Content.Server.GameObjects.Components.Movement +{ + [RegisterComponent] + [ComponentReference(typeof(IClimbable))] + public class ClimbableComponent : SharedClimbableComponent, IDragDropOn + { +#pragma warning disable 649 + [Dependency] private readonly IServerNotifyManager _notifyManager = default!; + [Dependency] private readonly IPlayerManager _playerManager = default!; +#pragma warning restore 649 + + /// + /// The range from which this entity can be climbed. + /// + [ViewVariables] + private float _range; + + /// + /// The time it takes to climb onto the entity. + /// + [ViewVariables] + private float _climbDelay; + + private ICollidableComponent _collidableComponent; + private DoAfterSystem _doAfterSystem; + + public override void Initialize() + { + base.Initialize(); + + _collidableComponent = Owner.GetComponent(); + _doAfterSystem = EntitySystem.Get(); + } + + public override void ExposeData(ObjectSerializer serializer) + { + base.ExposeData(serializer); + + serializer.DataField(ref _range, "range", SharedInteractionSystem.InteractionRange / 1.4f); + serializer.DataField(ref _climbDelay, "delay", 0.8f); + } + + bool IDragDropOn.CanDragDropOn(DragDropEventArgs eventArgs) + { + if (!ActionBlockerSystem.CanInteract(eventArgs.User)) + { + _notifyManager.PopupMessage(eventArgs.User, eventArgs.User, Loc.GetString("You can't do that!")); + + return false; + } + + if (eventArgs.User == eventArgs.Dropped) // user is dragging themselves onto a climbable + { + if (!eventArgs.User.HasComponent()) + { + _notifyManager.PopupMessage(eventArgs.User, eventArgs.User, Loc.GetString("You are incapable of climbing!")); + + return false; + } + + var bodyManager = eventArgs.User.GetComponent(); + + if (bodyManager.GetBodyPartsOfType(Shared.GameObjects.Components.Body.BodyPartType.Leg).Count == 0 || + bodyManager.GetBodyPartsOfType(Shared.GameObjects.Components.Body.BodyPartType.Foot).Count == 0) + { + _notifyManager.PopupMessage(eventArgs.User, eventArgs.User, Loc.GetString("You are unable to climb!")); + + return false; + } + + var userPosition = eventArgs.User.Transform.MapPosition; + var climbablePosition = eventArgs.Target.Transform.MapPosition; + var interaction = EntitySystem.Get(); + bool Ignored(IEntity entity) => (entity == eventArgs.Target || entity == eventArgs.User); + + if (!interaction.InRangeUnobstructed(userPosition, climbablePosition, _range, predicate: Ignored)) + { + _notifyManager.PopupMessage(eventArgs.User, eventArgs.User, Loc.GetString("You can't reach there!")); + + return false; + } + } + else // user is dragging some other entity onto a climbable + { + if (eventArgs.Target == null || !eventArgs.Dropped.HasComponent()) + { + _notifyManager.PopupMessage(eventArgs.User, eventArgs.User, Loc.GetString("You can't do that!")); + + return false; + } + + var userPosition = eventArgs.User.Transform.MapPosition; + var otherUserPosition = eventArgs.Dropped.Transform.MapPosition; + var climbablePosition = eventArgs.Target.Transform.MapPosition; + var interaction = EntitySystem.Get(); + bool Ignored(IEntity entity) => (entity == eventArgs.Target || entity == eventArgs.User || entity == eventArgs.Dropped); + + if (!interaction.InRangeUnobstructed(userPosition, climbablePosition, _range, predicate: Ignored) || + !interaction.InRangeUnobstructed(userPosition, otherUserPosition, _range, predicate: Ignored)) + { + _notifyManager.PopupMessage(eventArgs.User, eventArgs.User, Loc.GetString("You can't reach there!")); + + return false; + } + } + + return true; + } + + bool IDragDropOn.DragDropOn(DragDropEventArgs eventArgs) + { + if (eventArgs.User == eventArgs.Dropped) + { + TryClimb(eventArgs.User); + } + else + { + TryMoveEntity(eventArgs.User, eventArgs.Dropped); + } + + return true; + } + + private async void TryMoveEntity(IEntity user, IEntity entityToMove) + { + var doAfterEventArgs = new DoAfterEventArgs(user, _climbDelay, default, entityToMove) + { + BreakOnTargetMove = true, + BreakOnUserMove = true, + BreakOnDamage = true, + BreakOnStun = true + }; + + var result = await _doAfterSystem.DoAfter(doAfterEventArgs); + + if (result != DoAfterStatus.Cancelled && entityToMove.TryGetComponent(out ICollidableComponent body) && body.PhysicsShapes.Count >= 1) + { + var direction = (Owner.Transform.WorldPosition - entityToMove.Transform.WorldPosition).Normalized; + var endPoint = Owner.Transform.WorldPosition; + + var climbMode = entityToMove.GetComponent(); + climbMode.IsClimbing = true; + + if (MathF.Abs(direction.X) < 0.6f) // user climbed mostly vertically so lets make it a clean straight line + { + endPoint = new Vector2(entityToMove.Transform.WorldPosition.X, endPoint.Y); + } + else if (MathF.Abs(direction.Y) < 0.6f) // user climbed mostly horizontally so lets make it a clean straight line + { + endPoint = new Vector2(endPoint.X, entityToMove.Transform.WorldPosition.Y); + } + + climbMode.TryMoveTo(entityToMove.Transform.WorldPosition, endPoint); + // we may potentially need additional logic since we're forcing a player onto a climbable + // there's also the cases where the user might collide with the person they are forcing onto the climbable that i haven't accounted for + + PopupMessageOtherClientsInRange(user, Loc.GetString("{0:them} forces {1:them} onto {2:theName}!", user, entityToMove, Owner), 15); + _notifyManager.PopupMessage(user, user, Loc.GetString("You force {0:them} onto {1:theName}!", entityToMove, Owner)); + } + } + + private async void TryClimb(IEntity user) + { + var doAfterEventArgs = new DoAfterEventArgs(user, _climbDelay, default, Owner) + { + BreakOnTargetMove = true, + BreakOnUserMove = true, + BreakOnDamage = true, + BreakOnStun = true + }; + + var result = await _doAfterSystem.DoAfter(doAfterEventArgs); + + if (result != DoAfterStatus.Cancelled && user.TryGetComponent(out ICollidableComponent body) && body.PhysicsShapes.Count >= 1) + { + var direction = (Owner.Transform.WorldPosition - user.Transform.WorldPosition).Normalized; + var endPoint = Owner.Transform.WorldPosition; + + var climbMode = user.GetComponent(); + climbMode.IsClimbing = true; + + if (MathF.Abs(direction.X) < 0.6f) // user climbed mostly vertically so lets make it a clean straight line + { + endPoint = new Vector2(user.Transform.WorldPosition.X, endPoint.Y); + } + else if (MathF.Abs(direction.Y) < 0.6f) // user climbed mostly horizontally so lets make it a clean straight line + { + endPoint = new Vector2(endPoint.X, user.Transform.WorldPosition.Y); + } + + climbMode.TryMoveTo(user.Transform.WorldPosition, endPoint); + + PopupMessageOtherClientsInRange(user, Loc.GetString("{0:them} jumps onto {1:theName}!", user, Owner), 15); + _notifyManager.PopupMessage(user, user, Loc.GetString("You jump onto {0:theName}!", Owner)); + } + } + + private void PopupMessageOtherClientsInRange(IEntity source, string message, int maxReceiveDistance) + { + var viewers = _playerManager.GetPlayersInRange(source.Transform.GridPosition, maxReceiveDistance); + + foreach (var viewer in viewers) + { + var viewerEntity = viewer.AttachedEntity; + + if (viewerEntity == null || source == viewerEntity) + { + continue; + } + + source.PopupMessage(viewer.AttachedEntity, message); + } + } + } +} diff --git a/Content.Server/GameObjects/Components/Movement/ClimbingComponent.cs b/Content.Server/GameObjects/Components/Movement/ClimbingComponent.cs new file mode 100644 index 0000000000..2ebbdb5397 --- /dev/null +++ b/Content.Server/GameObjects/Components/Movement/ClimbingComponent.cs @@ -0,0 +1,78 @@ +using Robust.Shared.GameObjects; +using Robust.Shared.Maths; +using Robust.Shared.GameObjects.Components; +using Content.Shared.Physics; +using Content.Shared.Maps; +using Robust.Shared.IoC; +using Robust.Shared.Interfaces.GameObjects; +using Content.Shared.GameObjects.Components.Movement; +using Content.Shared.GameObjects.EntitySystems; +using System.Collections.Generic; +using Robust.Shared.Physics; +using System.Diagnostics; + +namespace Content.Server.GameObjects.Components.Movement +{ + [RegisterComponent] + public class ClimbingComponent : SharedClimbingComponent, IActionBlocker + { + private bool _isClimbing = false; + private ClimbController _climbController = default; + + public override bool IsClimbing + { + get + { + return _isClimbing; + } + set + { + if (!value && Body != null) + { + Body.TryRemoveController(); + } + + _isClimbing = value; + Dirty(); + } + } + + /// + /// Make the owner climb from one point to another + /// + public void TryMoveTo(Vector2 from, Vector2 to) + { + if (Body != null) + { + _climbController = Body.EnsureController(); + _climbController.TryMoveTo(from, to); + } + } + + public void Update(float frameTime) + { + if (Body != null && IsClimbing) + { + if (_climbController != null && (_climbController.IsBlocked || !_climbController.IsActive)) + { + if (Body.TryRemoveController()) + { + _climbController = null; + } + } + + if (!IsOnClimbableThisFrame && IsClimbing && _climbController == null) + { + IsClimbing = false; + } + + IsOnClimbableThisFrame = false; + } + } + + public override ComponentState GetComponentState() + { + return new ClimbModeComponentState(_isClimbing); + } + } +} diff --git a/Content.Server/GameObjects/EntitySystems/ClimbSystem.cs b/Content.Server/GameObjects/EntitySystems/ClimbSystem.cs new file mode 100644 index 0000000000..f7d2e37372 --- /dev/null +++ b/Content.Server/GameObjects/EntitySystems/ClimbSystem.cs @@ -0,0 +1,18 @@ +using Content.Server.GameObjects.Components.Movement; +using JetBrains.Annotations; +using Robust.Shared.GameObjects.Systems; + +namespace Content.Server.GameObjects.EntitySystems +{ + [UsedImplicitly] + internal sealed class ClimbSystem : EntitySystem + { + public override void Update(float frameTime) + { + foreach (var comp in ComponentManager.EntityQuery()) + { + comp.Update(frameTime); + } + } + } +} diff --git a/Content.Shared/GameObjects/Components/Movement/SharedClimbableComponent.cs b/Content.Shared/GameObjects/Components/Movement/SharedClimbableComponent.cs new file mode 100644 index 0000000000..951d051ac1 --- /dev/null +++ b/Content.Shared/GameObjects/Components/Movement/SharedClimbableComponent.cs @@ -0,0 +1,11 @@ +using Robust.Shared.GameObjects; + +namespace Content.Shared.GameObjects.Components.Movement +{ + public interface IClimbable { }; + + public class SharedClimbableComponent : Component, IClimbable + { + public sealed override string Name => "Climbable"; + } +} diff --git a/Content.Shared/GameObjects/Components/Movement/SharedClimbingComponent.cs b/Content.Shared/GameObjects/Components/Movement/SharedClimbingComponent.cs new file mode 100644 index 0000000000..3fdb287576 --- /dev/null +++ b/Content.Shared/GameObjects/Components/Movement/SharedClimbingComponent.cs @@ -0,0 +1,66 @@ +using Content.Shared.GameObjects.EntitySystems; +using Content.Shared.Physics; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Components; +using Robust.Shared.Physics; +using Robust.Shared.Serialization; +using System; + +namespace Content.Shared.GameObjects.Components.Movement +{ + public abstract class SharedClimbingComponent : Component, IActionBlocker, ICollideSpecial + { + public sealed override string Name => "Climbing"; + public sealed override uint? NetID => ContentNetIDs.CLIMBING; + + protected ICollidableComponent Body; + protected bool IsOnClimbableThisFrame = false; + + protected bool OwnerIsTransitioning + { + get + { + if (Body.TryGetController(out var controller)) + { + return controller.IsActive; + } + + return false; + } + } + + public abstract bool IsClimbing { get; set; } + + bool IActionBlocker.CanMove() => !OwnerIsTransitioning; + bool IActionBlocker.CanChangeDirection() => !OwnerIsTransitioning; + + bool ICollideSpecial.PreventCollide(IPhysBody collided) + { + if (((CollisionGroup)collided.CollisionLayer).HasFlag(CollisionGroup.VaultImpassable) && collided.Entity.HasComponent()) + { + IsOnClimbableThisFrame = true; + return IsClimbing; + } + + return false; + } + + public override void Initialize() + { + base.Initialize(); + + Owner.TryGetComponent(out Body); + } + + [Serializable, NetSerializable] + protected sealed class ClimbModeComponentState : ComponentState + { + public ClimbModeComponentState(bool climbing) : base(ContentNetIDs.CLIMBING) + { + Climbing = climbing; + } + + public bool Climbing { get; } + } + } +} diff --git a/Content.Shared/GameObjects/ContentNetIDs.cs b/Content.Shared/GameObjects/ContentNetIDs.cs index 337a543627..7d7bcfdc4f 100644 --- a/Content.Shared/GameObjects/ContentNetIDs.cs +++ b/Content.Shared/GameObjects/ContentNetIDs.cs @@ -54,7 +54,6 @@ public const uint STUNNABLE = 1048; public const uint HUNGER = 1049; public const uint THIRST = 1050; - public const uint FLASHABLE = 1051; public const uint BUCKLE = 1052; public const uint PROJECTILE = 1053; @@ -65,6 +64,7 @@ public const uint DO_AFTER = 1058; public const uint RADIATION_PULSE = 1059; public const uint BODY_MANAGER = 1060; + public const uint CLIMBING = 1061; // Net IDs for integration tests. public const uint PREDICTION_TEST = 10001; diff --git a/Content.Shared/GameObjects/EntitySystems/ActionBlockerSystem.cs b/Content.Shared/GameObjects/EntitySystems/ActionBlockerSystem.cs index c06963d53f..e7a32bf4fe 100644 --- a/Content.Shared/GameObjects/EntitySystems/ActionBlockerSystem.cs +++ b/Content.Shared/GameObjects/EntitySystems/ActionBlockerSystem.cs @@ -10,21 +10,13 @@ namespace Content.Shared.GameObjects.EntitySystems public interface IActionBlocker { bool CanMove() => true; - bool CanInteract() => true; - bool CanUse() => true; - bool CanThrow() => true; - bool CanSpeak() => true; - bool CanDrop() => true; - bool CanPickup() => true; - bool CanEmote() => true; - bool CanAttack() => true; bool CanEquip() => true; diff --git a/Content.Shared/Physics/ClimbController.cs b/Content.Shared/Physics/ClimbController.cs new file mode 100644 index 0000000000..8c779aa41d --- /dev/null +++ b/Content.Shared/Physics/ClimbController.cs @@ -0,0 +1,87 @@ +#nullable enable +using Robust.Shared.Maths; +using Robust.Shared.Physics; + +namespace Content.Shared.Physics +{ + /// + /// Movement controller used by the climb system. Lerps the player from A to B. + /// Also does checks to make sure the player isn't blocked. + /// + public class ClimbController : VirtualController + { + private Vector2? _movingTo = null; + private Vector2 _lastKnownPosition = default; + private int _numTicksBlocked = 0; + + /// + /// If 5 ticks have passed and our position has not changed then something is blocking us. + /// + public bool IsBlocked => _numTicksBlocked > 5 || _isMovingWrongDirection; + + /// + /// If the controller is currently moving the player somewhere, it is considered active. + /// + public bool IsActive => _movingTo.HasValue; + + private float _initialDist = default; + private bool _isMovingWrongDirection = false; + + public void TryMoveTo(Vector2 from, Vector2 to) + { + if (ControlledComponent == null) + { + return; + } + + _initialDist = (from - to).Length; + _numTicksBlocked = 0; + _lastKnownPosition = from; + _movingTo = to; + _isMovingWrongDirection = false; + } + + public override void UpdateAfterProcessing() + { + base.UpdateAfterProcessing(); + + if (ControlledComponent == null || _movingTo == null) + { + return; + } + + if ((ControlledComponent.Owner.Transform.WorldPosition - _lastKnownPosition).Length <= 0.05f) + { + _numTicksBlocked++; + } + else + { + _numTicksBlocked = 0; + } + + _lastKnownPosition = ControlledComponent.Owner.Transform.WorldPosition; + + if ((ControlledComponent.Owner.Transform.WorldPosition - _movingTo.Value).Length <= 0.05f) + { + _movingTo = null; + } + + if (_movingTo.HasValue) + { + var dist = (_lastKnownPosition - _movingTo.Value).Length; + + if (dist > _initialDist) + { + _isMovingWrongDirection = true; + } + + var diff = _movingTo.Value - ControlledComponent.Owner.Transform.WorldPosition; + LinearVelocity = diff.Normalized * 5; + } + else + { + LinearVelocity = Vector2.Zero; + } + } + } +} diff --git a/Resources/Prototypes/Entities/Constructible/Ground/table.yml b/Resources/Prototypes/Entities/Constructible/Ground/table.yml index 568a1f958d..1dd92f308e 100644 --- a/Resources/Prototypes/Entities/Constructible/Ground/table.yml +++ b/Resources/Prototypes/Entities/Constructible/Ground/table.yml @@ -22,6 +22,7 @@ - type: IconSmooth key: generic base: solid_ + - type: Climbable - type: Destructible maxHP: 50 spawnOnDestroy: SteelSheet1 diff --git a/Resources/Prototypes/Entities/Mobs/Species/human.yml b/Resources/Prototypes/Entities/Mobs/Species/human.yml index 637f722349..e104ad5ccb 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/human.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/human.yml @@ -141,6 +141,7 @@ - type: RotationVisualizer - type: BuckleVisualizer - type: CombatMode + - type: Climbing - type: Teleportable - type: CharacterInfo - type: FootstepSound From 45380c129b31b76494df4245794cec471a8cadaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Aguilera=20Puerto?= Date: Thu, 20 Aug 2020 01:11:43 +0200 Subject: [PATCH 61/81] Fix traitors not knowing who their friends are. --- .../Mobs/Roles/SuspicionInnocentRole.cs | 2 +- .../Mobs/Roles/SuspicionTraitorRole.cs | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/Content.Server/Mobs/Roles/SuspicionInnocentRole.cs b/Content.Server/Mobs/Roles/SuspicionInnocentRole.cs index e8ab7a96be..570e307c79 100644 --- a/Content.Server/Mobs/Roles/SuspicionInnocentRole.cs +++ b/Content.Server/Mobs/Roles/SuspicionInnocentRole.cs @@ -24,7 +24,7 @@ namespace Content.Server.Mobs.Roles base.Greet(); var chat = IoCManager.Resolve(); - chat.DispatchServerMessage(Mind.Session, $"You're a {Name}!"); + chat.DispatchServerMessage(Mind.Session, $"You're an {Name}!"); chat.DispatchServerMessage(Mind.Session, $"Objective: {Objective}"); } } diff --git a/Content.Server/Mobs/Roles/SuspicionTraitorRole.cs b/Content.Server/Mobs/Roles/SuspicionTraitorRole.cs index 753f5424e1..5279fae886 100644 --- a/Content.Server/Mobs/Roles/SuspicionTraitorRole.cs +++ b/Content.Server/Mobs/Roles/SuspicionTraitorRole.cs @@ -1,5 +1,8 @@ +using Content.Server.GameObjects.Components.Suspicion; using Content.Server.Interfaces.Chat; using Content.Shared.Roles; +using Robust.Shared.GameObjects; +using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.IoC; namespace Content.Server.Mobs.Roles @@ -26,6 +29,19 @@ namespace Content.Server.Mobs.Roles var chat = IoCManager.Resolve(); chat.DispatchServerMessage(Mind.Session, $"You're a {Name}!"); chat.DispatchServerMessage(Mind.Session, $"Objective: {Objective}"); + + var traitors = ""; + + foreach (var sus in IoCManager.Resolve().EntityQuery()) + { + if (!sus.IsTraitor()) continue; + if (traitors.Length > 0) + traitors += $", {sus.Owner.Name}"; + else + traitors += sus.Owner.Name; + } + + chat.DispatchServerMessage(Mind.Session, $"The traitors are: {traitors}"); } } } From 322e38b173a222687ea26af79c1d7dc072bf868d Mon Sep 17 00:00:00 2001 From: nuke <47336974+nuke-makes-games@users.noreply.github.com> Date: Wed, 19 Aug 2020 20:21:15 -0400 Subject: [PATCH 62/81] Fix for climb jank (#1803) Player body was going to sleep, so now we spam WakeBody() at it. --- .../Components/Movement/ClimbingComponent.cs | 12 +++++------- Content.Shared/Physics/ClimbController.cs | 4 +++- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Content.Server/GameObjects/Components/Movement/ClimbingComponent.cs b/Content.Server/GameObjects/Components/Movement/ClimbingComponent.cs index 2ebbdb5397..591cd4c761 100644 --- a/Content.Server/GameObjects/Components/Movement/ClimbingComponent.cs +++ b/Content.Server/GameObjects/Components/Movement/ClimbingComponent.cs @@ -1,15 +1,8 @@ using Robust.Shared.GameObjects; using Robust.Shared.Maths; -using Robust.Shared.GameObjects.Components; using Content.Shared.Physics; -using Content.Shared.Maps; -using Robust.Shared.IoC; -using Robust.Shared.Interfaces.GameObjects; using Content.Shared.GameObjects.Components.Movement; using Content.Shared.GameObjects.EntitySystems; -using System.Collections.Generic; -using Robust.Shared.Physics; -using System.Diagnostics; namespace Content.Server.GameObjects.Components.Movement { @@ -61,6 +54,11 @@ namespace Content.Server.GameObjects.Components.Movement } } + if (IsClimbing) + { + Body.WakeBody(); + } + if (!IsOnClimbableThisFrame && IsClimbing && _climbController == null) { IsClimbing = false; diff --git a/Content.Shared/Physics/ClimbController.cs b/Content.Shared/Physics/ClimbController.cs index 8c779aa41d..a61be77317 100644 --- a/Content.Shared/Physics/ClimbController.cs +++ b/Content.Shared/Physics/ClimbController.cs @@ -50,6 +50,8 @@ namespace Content.Shared.Physics return; } + ControlledComponent.WakeBody(); + if ((ControlledComponent.Owner.Transform.WorldPosition - _lastKnownPosition).Length <= 0.05f) { _numTicksBlocked++; @@ -61,7 +63,7 @@ namespace Content.Shared.Physics _lastKnownPosition = ControlledComponent.Owner.Transform.WorldPosition; - if ((ControlledComponent.Owner.Transform.WorldPosition - _movingTo.Value).Length <= 0.05f) + if ((ControlledComponent.Owner.Transform.WorldPosition - _movingTo.Value).Length <= 0.1f) { _movingTo = null; } From b7de0c9bb3a917b6160fc93af25dda870d8ade5c Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Thu, 20 Aug 2020 19:21:23 +1000 Subject: [PATCH 63/81] Nerf xeno damage (#1806) Still higher than human fists but won't 2 shot you into crit. Co-authored-by: Metal Gear Sloth --- Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml index f048fefc25..ada753f860 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml @@ -50,7 +50,7 @@ range: 1.5 arcwidth: 0 arc: claw - damage: 90 + damage: 10 - type: Appearance visuals: - type: DamageStateVisualizer From f61d891ebc4483cfc446c0dd9379c01716754269 Mon Sep 17 00:00:00 2001 From: py01 <60152240+collinlunn@users.noreply.github.com> Date: Thu, 20 Aug 2020 03:44:39 -0600 Subject: [PATCH 64/81] Power integration tests (#1805) * Power test draft 1 * power tests work * Apc charging test Co-authored-by: py01 --- Content.IntegrationTests/Tests/PowerTest.cs | 150 ++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 Content.IntegrationTests/Tests/PowerTest.cs diff --git a/Content.IntegrationTests/Tests/PowerTest.cs b/Content.IntegrationTests/Tests/PowerTest.cs new file mode 100644 index 0000000000..b53fa69734 --- /dev/null +++ b/Content.IntegrationTests/Tests/PowerTest.cs @@ -0,0 +1,150 @@ +using Content.Server.GameObjects.Components.Power; +using Content.Server.GameObjects.Components.Power.ApcNetComponents; +using Content.Server.GameObjects.Components.Power.PowerNetComponents; +using NUnit.Framework; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.Map; +using Robust.Shared.IoC; +using Robust.Shared.Map; +using Robust.Shared.Maths; +using System.Threading.Tasks; + +namespace Content.IntegrationTests.Tests +{ + [TestFixture] + public class PowerTest : ContentIntegrationTest + { + [Test] + public async Task PowerNetTest() + { + var server = StartServerDummyTicker(); + + PowerSupplierComponent supplier = null; + PowerConsumerComponent consumer1 = null; + PowerConsumerComponent consumer2 = null; + + server.Assert(() => + { + var mapMan = IoCManager.Resolve(); + var entityMan = IoCManager.Resolve(); + mapMan.CreateMap(new MapId(1)); + var grid = mapMan.CreateGrid(new MapId(1)); + + var generatorEnt = entityMan.SpawnEntity("DebugGenerator", new GridCoordinates(new Vector2(0, 0), grid.Index)); + var consumerEnt1 = entityMan.SpawnEntity("DebugConsumer", new GridCoordinates(new Vector2(0, 1), grid.Index)); + var consumerEnt2 = entityMan.SpawnEntity("DebugConsumer", new GridCoordinates(new Vector2(0, 2), grid.Index)); + + Assert.That(generatorEnt.TryGetComponent(out supplier)); + Assert.That(consumerEnt1.TryGetComponent(out consumer1)); + Assert.That(consumerEnt2.TryGetComponent(out consumer2)); + + var supplyRate = 1000; //arbitrary amount of power supply + + supplier.SupplyRate = supplyRate; + consumer1.DrawRate = supplyRate / 2; //arbitrary draw less than supply + consumer2.DrawRate = supplyRate * 2; //arbitrary draw greater than supply + + consumer1.Priority = Priority.First; //power goes to this consumer first + consumer2.Priority = Priority.Last; //any excess power should go to low priority consumer + }); + + server.RunTicks(1); //let run a tick for PowerNet to process power + + server.Assert(() => + { + Assert.That(consumer1.DrawRate, Is.EqualTo(consumer1.ReceivedPower)); //first should be fully powered + Assert.That(consumer2.ReceivedPower, Is.EqualTo(supplier.SupplyRate - consumer1.ReceivedPower)); //second should get remaining power + }); + + await server.WaitIdleAsync(); + } + + [Test] + public async Task ApcChargingTest() + { + var server = StartServerDummyTicker(); + + BatteryComponent apcBattery = null; + PowerSupplierComponent substationSupplier = null; + + server.Assert(() => + { + var mapMan = IoCManager.Resolve(); + var entityMan = IoCManager.Resolve(); + mapMan.CreateMap(new MapId(1)); + var grid = mapMan.CreateGrid(new MapId(1)); + + var generatorEnt = entityMan.SpawnEntity("DebugGenerator", new GridCoordinates(new Vector2(0, 0), grid.Index)); + var substationEnt = entityMan.SpawnEntity("DebugSubstation", new GridCoordinates(new Vector2(0, 1), grid.Index)); + var apcEnt = entityMan.SpawnEntity("DebugApc", new GridCoordinates(new Vector2(0, 2), grid.Index)); + + Assert.That(generatorEnt.TryGetComponent(out var generatorSupplier)); + + Assert.That(substationEnt.TryGetComponent(out substationSupplier)); + Assert.That(substationEnt.TryGetComponent(out var substationStorage)); + Assert.That(substationEnt.TryGetComponent(out var substationDischarger)); + + Assert.That(apcEnt.TryGetComponent(out apcBattery)); + Assert.That(apcEnt.TryGetComponent(out var apcStorage)); + + generatorSupplier.SupplyRate = 1000; //arbitrary nonzero amount of power + substationStorage.ActiveDrawRate = 1000; //arbitrary nonzero power draw + substationDischarger.ActiveSupplyRate = 500; //arbitirary nonzero power supply less than substation storage draw + apcStorage.ActiveDrawRate = 500; //arbitrary nonzero power draw + apcBattery.MaxCharge = 100; //abbitrary nonzero amount of charge + apcBattery.CurrentCharge = 0; //no charge + }); + + server.RunTicks(5); //let run a few ticks for PowerNets to reevaluate and start charging apc + + server.Assert(() => + { + Assert.That(substationSupplier.SupplyRate, Is.Not.EqualTo(0)); //substation should be providing power + Assert.That(apcBattery.CurrentCharge, Is.Not.EqualTo(0)); //apc battery should have gained charge + }); + + await server.WaitIdleAsync(); + } + + [Test] + public async Task ApcNetTest() + { + var server = StartServerDummyTicker(); + + PowerReceiverComponent receiver = null; + + server.Assert(() => + { + var mapMan = IoCManager.Resolve(); + var entityMan = IoCManager.Resolve(); + mapMan.CreateMap(new MapId(1)); + var grid = mapMan.CreateGrid(new MapId(1)); + + var apcEnt = entityMan.SpawnEntity("DebugApc", new GridCoordinates(new Vector2(0, 0), grid.Index)); + var apcExtensionEnt = entityMan.SpawnEntity("ApcExtensionCable", new GridCoordinates(new Vector2(0, 1), grid.Index)); + var powerReceiverEnt = entityMan.SpawnEntity("DebugPowerReceiver", new GridCoordinates(new Vector2(0, 2), grid.Index)); + + Assert.That(apcEnt.TryGetComponent(out var apc)); + Assert.That(apcExtensionEnt.TryGetComponent(out var provider)); + Assert.That(powerReceiverEnt.TryGetComponent(out receiver)); + + provider.PowerTransferRange = 5; //arbitrary range to reach receiver + receiver.PowerReceptionRange = 5; //arbitrary range to reach provider + + apc.Battery.MaxCharge = 10000; //arbitrary nonzero amount of charge + apc.Battery.CurrentCharge = apc.Battery.MaxCharge; //fill battery + + receiver.Load = 1; //arbitrary small amount of power + }); + + server.RunTicks(1); //let run a tick for ApcNet to process power + + server.Assert(() => + { + Assert.That(receiver.Powered); + }); + + await server.WaitIdleAsync(); + } + } +} From c6abeda53b99e0d8d7a0457b0fd771fa6eb04674 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Thu, 20 Aug 2020 21:47:20 +1000 Subject: [PATCH 65/81] Fix AI inventory deleted exc (#1810) Was throwing during eating / drinking. Co-authored-by: Metal Gear Sloth --- .../AI/WorldState/States/Inventory/InventoryState.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Content.Server/AI/WorldState/States/Inventory/InventoryState.cs b/Content.Server/AI/WorldState/States/Inventory/InventoryState.cs index 3f570d58bd..8f9701a9ee 100644 --- a/Content.Server/AI/WorldState/States/Inventory/InventoryState.cs +++ b/Content.Server/AI/WorldState/States/Inventory/InventoryState.cs @@ -16,6 +16,9 @@ namespace Content.Server.AI.WorldState.States.Inventory { foreach (var item in handsComponent.GetAllHeldItems()) { + if (item.Owner.Deleted) + continue; + yield return item.Owner; } } From 599b31621229da3d659c7af687e08264adbd0c8a Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Thu, 20 Aug 2020 21:47:47 +1000 Subject: [PATCH 66/81] Fix AI bool curves (#1809) I was a silly billy. AI were only picking up 1 item because 0.5 was being treated as a fail. Co-authored-by: Metal Gear Sloth --- Content.Server/AI/Utility/Considerations/Consideration.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Server/AI/Utility/Considerations/Consideration.cs b/Content.Server/AI/Utility/Considerations/Consideration.cs index 20afc4dec1..67b76ae559 100644 --- a/Content.Server/AI/Utility/Considerations/Consideration.cs +++ b/Content.Server/AI/Utility/Considerations/Consideration.cs @@ -24,7 +24,7 @@ namespace Content.Server.AI.Utility.Considerations private static float BoolCurve(float x) { // ReSharper disable once CompareOfFloatsByEqualityOperator - return x == 1.0f ? 1.0f : 0.0f; + return x > 0.0f ? 1.0f : 0.0f; } public Func BoolCurve(Blackboard context) @@ -42,7 +42,7 @@ namespace Content.Server.AI.Utility.Considerations private static float InverseBoolCurve(float x) { // ReSharper disable once CompareOfFloatsByEqualityOperator - return x == 1.0f ? 0.0f : 1.0f; + return x == 0.0f ? 1.0f : 0.0f; } public Func InverseBoolCurve(Blackboard context) From d8a78f2de6fba6d67f912da095927c53708a7c65 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Thu, 20 Aug 2020 22:16:12 +1000 Subject: [PATCH 67/81] Geometric mean for AI considerations (#1812) * Geometric mean for AI cons More forgiving for having more considerations for an action. * You had 1 job Co-authored-by: Metal Gear Sloth --- .../AI/Utility/Actions/UtilityAction.cs | 13 ++++--------- .../AI/Utility/Considerations/Consideration.cs | 15 ++++++++++++--- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/Content.Server/AI/Utility/Actions/UtilityAction.cs b/Content.Server/AI/Utility/Actions/UtilityAction.cs index f8be97abaa..b79fa0955a 100644 --- a/Content.Server/AI/Utility/Actions/UtilityAction.cs +++ b/Content.Server/AI/Utility/Actions/UtilityAction.cs @@ -112,19 +112,14 @@ namespace Content.Server.AI.Utility.Actions UpdateBlackboard(context); var considerations = GetConsiderations(context); DebugTools.Assert(considerations.Count > 0); - // I used the IAUS video although I did have some confusion on how to structure it overall - // as some of the slides seemed contradictory - // Ideally we should early-out each action as cheaply as possible if it's not valid - - // We also need some way to tell if the action isn't going to - // have a better score than the current action (if applicable) and early-out that way as well. - - // 23:00 Building a better centaur + // Overall structure is based on Building a better centaur + // Ideally we should early-out each action as cheaply as possible if it's not valid, thus + // the finalScore can only go down over time. + var finalScore = 1.0f; var minThreshold = min / Bonus; context.GetState().SetValue(considerations.Count); - // See 10:09 for this and the adjustments foreach (var consideration in considerations) { diff --git a/Content.Server/AI/Utility/Considerations/Consideration.cs b/Content.Server/AI/Utility/Considerations/Consideration.cs index 67b76ae559..39d125941f 100644 --- a/Content.Server/AI/Utility/Considerations/Consideration.cs +++ b/Content.Server/AI/Utility/Considerations/Consideration.cs @@ -13,10 +13,19 @@ namespace Content.Server.AI.Utility.Considerations private float GetAdjustedScore(Blackboard context) { var score = GetScore(context); + /* + * Now using the geometric mean + * for n scores you take the n-th root of the scores multiplied + * e.g. a, b, c scores you take Math.Pow(a * b * c, 1/3) + * To get the ACTUAL geometric mean at any one stage you'd need to divide by the running consideration count + * however, the downside to this is it will fluctuate up and down over time. + * For our purposes if we go below the minimum threshold we want to cut it off, thus we take a + * "running geometric mean" which can only ever go down (and by the final value will equal the actual geometric mean). + */ + + // Previously we used a makeupvalue method although the geometric mean is less punishing for more considerations var considerationsCount = context.GetState().GetValue(); - var modificationFactor = 1.0f - 1.0f / considerationsCount; - var makeUpValue = (1.0f - score) * modificationFactor; - var adjustedScore = score + makeUpValue * score; + var adjustedScore = MathF.Pow(score, 1 / (float) considerationsCount); return FloatMath.Clamp(adjustedScore, 0.0f, 1.0f); } From d703dc8dccdcf82e768ec6f05e42ba974b41027c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Aguilera=20Puerto?= Date: Thu, 20 Aug 2020 15:19:36 +0200 Subject: [PATCH 68/81] Adds readyall (b)admin command. --- Content.Server/Administration/ReadyAll.cs | 39 +++++++++++++++++++++++ Resources/Groups/groups.yml | 2 ++ 2 files changed, 41 insertions(+) create mode 100644 Content.Server/Administration/ReadyAll.cs diff --git a/Content.Server/Administration/ReadyAll.cs b/Content.Server/Administration/ReadyAll.cs new file mode 100644 index 0000000000..a03a5b447e --- /dev/null +++ b/Content.Server/Administration/ReadyAll.cs @@ -0,0 +1,39 @@ +using Content.Server.GameTicking; +using Content.Server.Interfaces.GameTicking; +using Robust.Server.Interfaces.Console; +using Robust.Server.Interfaces.Player; +using Robust.Shared.IoC; + +namespace Content.Server.Administration +{ + public class ReadyAll : IClientCommand + { + public string Command => "readyall"; + public string Description => "Readies up all players in the lobby."; + public string Help => $"{Command} | ̣{Command} "; + public void Execute(IConsoleShell shell, IPlayerSession? player, string[] args) + { + var ready = true; + + if (args.Length > 0) + { + ready = bool.Parse(args[0]); + } + + var gameTicker = IoCManager.Resolve(); + var playerManager = IoCManager.Resolve(); + + + if (gameTicker.RunLevel != GameRunLevel.PreRoundLobby) + { + shell.SendText(player, "This command can only be ran while in the lobby!"); + return; + } + + foreach (var p in playerManager.GetAllPlayers()) + { + gameTicker.ToggleReady(p, ready); + } + } + } +} diff --git a/Resources/Groups/groups.yml b/Resources/Groups/groups.yml index ea45d9a588..e18adbfd95 100644 --- a/Resources/Groups/groups.yml +++ b/Resources/Groups/groups.yml @@ -96,6 +96,7 @@ - tilewalls - events - destroymechanism + - readyall CanViewVar: true CanAdminPlace: true @@ -186,6 +187,7 @@ - tilewalls - events - destroymechanism + - readyall CanViewVar: true CanAdminPlace: true CanScript: true From 2bdf35928903cb9a768ea36424424023b5aacfa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Aguilera=20Puerto?= Date: Thu, 20 Aug 2020 16:20:08 +0200 Subject: [PATCH 69/81] Fix readyall nullable --- Content.Server/Administration/ReadyAll.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Content.Server/Administration/ReadyAll.cs b/Content.Server/Administration/ReadyAll.cs index a03a5b447e..05d0b48fc8 100644 --- a/Content.Server/Administration/ReadyAll.cs +++ b/Content.Server/Administration/ReadyAll.cs @@ -1,4 +1,5 @@ -using Content.Server.GameTicking; +#nullable enable +using Content.Server.GameTicking; using Content.Server.Interfaces.GameTicking; using Robust.Server.Interfaces.Console; using Robust.Server.Interfaces.Player; From 944ce2cc921e341c776d9fdf01cab228cf27c1fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Aguilera=20Puerto?= <6766154+Zumorica@users.noreply.github.com> Date: Thu, 20 Aug 2020 16:20:48 +0200 Subject: [PATCH 70/81] Allow game presets to disallow latejoining (#1816) * Allow game presets to disallow latejoining * Update Content.Server/GameTicking/GameTicker.cs Co-authored-by: DrSmugleaf Co-authored-by: DrSmugleaf --- .../GameTicking/ClientGameTicker.cs | 8 ++++++ .../Interfaces/IClientGameTicker.cs | 2 ++ Content.Client/State/LobbyState.cs | 8 ++++++ Content.Server/GameTicking/GamePreset.cs | 1 + .../GamePresets/PresetSuspicion.cs | 3 +++ Content.Server/GameTicking/GameTicker.cs | 23 +++++++++++++++-- Content.Shared/SharedGameTicker.cs | 25 +++++++++++++++++++ 7 files changed, 68 insertions(+), 2 deletions(-) diff --git a/Content.Client/GameTicking/ClientGameTicker.cs b/Content.Client/GameTicking/ClientGameTicker.cs index 3b58d1c17b..d618046255 100644 --- a/Content.Client/GameTicking/ClientGameTicker.cs +++ b/Content.Client/GameTicking/ClientGameTicker.cs @@ -26,6 +26,7 @@ namespace Content.Client.GameTicking [ViewVariables] public bool AreWeReady { get; private set; } [ViewVariables] public bool IsGameStarted { get; private set; } + [ViewVariables] public bool DisallowedLateJoin { get; private set; } [ViewVariables] public string ServerInfoBlob { get; private set; } [ViewVariables] public DateTime StartTime { get; private set; } [ViewVariables] public bool Paused { get; private set; } @@ -34,6 +35,7 @@ namespace Content.Client.GameTicking public event Action InfoBlobUpdated; public event Action LobbyStatusUpdated; public event Action LobbyReadyUpdated; + public event Action LobbyLateJoinStatusUpdated; public void Initialize() { @@ -50,11 +52,17 @@ namespace Content.Client.GameTicking { IoCManager.Resolve().RequestWindowAttention(); }); + _netManager.RegisterNetMessage(nameof(MsgTickerLateJoinStatus), LateJoinStatus); Ready = new Dictionary(); _initialized = true; } + private void LateJoinStatus(MsgTickerLateJoinStatus message) + { + DisallowedLateJoin = message.Disallowed; + LobbyLateJoinStatusUpdated?.Invoke(); + } private void JoinLobby(MsgTickerJoinLobby message) diff --git a/Content.Client/Interfaces/IClientGameTicker.cs b/Content.Client/Interfaces/IClientGameTicker.cs index 0bedce3995..e1e584e2f3 100644 --- a/Content.Client/Interfaces/IClientGameTicker.cs +++ b/Content.Client/Interfaces/IClientGameTicker.cs @@ -9,6 +9,7 @@ namespace Content.Client.Interfaces bool IsGameStarted { get; } string ServerInfoBlob { get; } bool AreWeReady { get; } + bool DisallowedLateJoin { get; } DateTime StartTime { get; } bool Paused { get; } Dictionary Ready { get; } @@ -17,5 +18,6 @@ namespace Content.Client.Interfaces event Action InfoBlobUpdated; event Action LobbyStatusUpdated; event Action LobbyReadyUpdated; + event Action LobbyLateJoinStatusUpdated; } } diff --git a/Content.Client/State/LobbyState.cs b/Content.Client/State/LobbyState.cs index b5fc2c35a1..2580dadb64 100644 --- a/Content.Client/State/LobbyState.cs +++ b/Content.Client/State/LobbyState.cs @@ -101,6 +101,7 @@ namespace Content.Client.State _clientGameTicker.InfoBlobUpdated += UpdateLobbyUi; _clientGameTicker.LobbyStatusUpdated += LobbyStatusUpdated; _clientGameTicker.LobbyReadyUpdated += LobbyReadyUpdated; + _clientGameTicker.LobbyLateJoinStatusUpdated += LobbyLateJoinStatusUpdated; } public override void Shutdown() @@ -109,6 +110,7 @@ namespace Content.Client.State _clientGameTicker.InfoBlobUpdated -= UpdateLobbyUi; _clientGameTicker.LobbyStatusUpdated -= LobbyStatusUpdated; _clientGameTicker.LobbyReadyUpdated -= LobbyReadyUpdated; + _clientGameTicker.LobbyLateJoinStatusUpdated -= LobbyLateJoinStatusUpdated; _clientGameTicker.Ready.Clear(); @@ -173,6 +175,11 @@ namespace Content.Client.State UpdateLobbyUi(); } + private void LobbyLateJoinStatusUpdated() + { + _lobby.ReadyButton.Disabled = _clientGameTicker.DisallowedLateJoin; + } + private void UpdateLobbyUi() { if (_lobby == null) @@ -191,6 +198,7 @@ namespace Content.Client.State _lobby.StartTime.Text = ""; _lobby.ReadyButton.Text = Loc.GetString("Ready Up"); _lobby.ReadyButton.ToggleMode = true; + _lobby.ReadyButton.Disabled = false; _lobby.ReadyButton.Pressed = _clientGameTicker.AreWeReady; } diff --git a/Content.Server/GameTicking/GamePreset.cs b/Content.Server/GameTicking/GamePreset.cs index 0e7ce86795..ddde553722 100644 --- a/Content.Server/GameTicking/GamePreset.cs +++ b/Content.Server/GameTicking/GamePreset.cs @@ -12,6 +12,7 @@ namespace Content.Server.GameTicking public abstract bool Start(IReadOnlyList readyPlayers, bool force = false); public virtual string ModeTitle => "Sandbox"; public virtual string Description => "Secret!"; + public virtual bool DisallowLateJoin => false; public Dictionary readyProfiles; } } diff --git a/Content.Server/GameTicking/GamePresets/PresetSuspicion.cs b/Content.Server/GameTicking/GamePresets/PresetSuspicion.cs index 3ce23717d4..c77b8a110e 100644 --- a/Content.Server/GameTicking/GamePresets/PresetSuspicion.cs +++ b/Content.Server/GameTicking/GamePresets/PresetSuspicion.cs @@ -30,6 +30,9 @@ namespace Content.Server.GameTicking.GamePresets public int MinPlayers { get; set; } = 5; public int MinTraitors { get; set; } = 2; public int PlayersPerTraitor { get; set; } = 5; + + public override bool DisallowLateJoin => true; + private static string TraitorID = "SuspicionTraitor"; private static string InnocentID = "SuspicionInnocent"; diff --git a/Content.Server/GameTicking/GameTicker.cs b/Content.Server/GameTicking/GameTicker.cs index 476a7c55f8..34d40c8df3 100644 --- a/Content.Server/GameTicking/GameTicker.cs +++ b/Content.Server/GameTicking/GameTicker.cs @@ -94,6 +94,8 @@ namespace Content.Server.GameTicking [ViewVariables] private GameRunLevel _runLevel; [ViewVariables(VVAccess.ReadWrite)] private GridCoordinates _spawnPoint; + [ViewVariables] private bool DisallowLateJoin { get; set; } = false; + [ViewVariables] private bool LobbyEnabled => _configurationManager.GetCVar("game.lobbyenabled"); [ViewVariables] private bool _updateOnRoundEnd; @@ -142,6 +144,7 @@ namespace Content.Server.GameTicking _netManager.RegisterNetMessage(nameof(MsgTickerLobbyReady)); _netManager.RegisterNetMessage(nameof(MsgRoundEndMessage)); _netManager.RegisterNetMessage(nameof(MsgRequestWindowAttention)); + _netManager.RegisterNetMessage(nameof(MsgTickerLateJoinStatus)); SetStartPreset(_configurationManager.GetCVar("game.defaultpreset")); @@ -285,6 +288,8 @@ namespace Content.Server.GameTicking // Time to start the preset. var preset = MakeGamePreset(profiles); + DisallowLateJoin |= preset.DisallowLateJoin; + if (!preset.Start(assignedJobs.Keys.ToList(), force)) { SetStartPreset(_configurationManager.GetCVar("game.fallbackpreset")); @@ -300,6 +305,13 @@ namespace Content.Server.GameTicking _roundStartTimeSpan = IoCManager.Resolve().RealTime; _sendStatusToAll(); ReqWindowAttentionAll(); + UpdateLateJoinStatus(); + } + + private void UpdateLateJoinStatus() + { + var msg = new MsgTickerLateJoinStatus(null) {Disallowed = DisallowLateJoin}; + _netManager.ServerSendToAll(msg); } private void SendServerMessage(string message) @@ -405,7 +417,7 @@ namespace Content.Server.GameTicking foreach (var rule in _gameRules) { - if (rule.GetType().Equals(t)) + if (rule.GetType().IsAssignableFrom(t)) return true; } @@ -637,7 +649,7 @@ namespace Content.Server.GameTicking _playerJoinLobby(player); } - + EntitySystem.Get().ResettingCleanup(); EntitySystem.Get().ResettingCleanup(); EntitySystem.Get().ResettingCleanup(); @@ -646,6 +658,7 @@ namespace Content.Server.GameTicking _spawnedPositions.Clear(); _manifest.Clear(); + DisallowLateJoin = false; } private void _preRoundSetup() @@ -776,6 +789,12 @@ namespace Content.Server.GameTicking string jobId = null, bool lateJoin = true) { + if (lateJoin && DisallowLateJoin) + { + MakeObserve(session); + return; + } + _playerJoinGame(session); var data = session.ContentData(); diff --git a/Content.Shared/SharedGameTicker.cs b/Content.Shared/SharedGameTicker.cs index d7100f93e4..e180ddb198 100644 --- a/Content.Shared/SharedGameTicker.cs +++ b/Content.Shared/SharedGameTicker.cs @@ -54,6 +54,31 @@ namespace Content.Shared } } + protected class MsgTickerLateJoinStatus : NetMessage + { + #region REQUIRED + + public const MsgGroups GROUP = MsgGroups.Command; + public const string NAME = nameof(MsgTickerLateJoinStatus); + + public bool Disallowed { get; set; } + + public MsgTickerLateJoinStatus(INetChannel channel) : base(NAME, GROUP) { } + + #endregion + + public override void ReadFromBuffer(NetIncomingMessage buffer) + { + Disallowed = buffer.ReadBoolean(); + } + + public override void WriteToBuffer(NetOutgoingMessage buffer) + { + buffer.Write(Disallowed); + } + } + + protected class MsgTickerLobbyStatus : NetMessage { #region REQUIRED From 3372ab050cd5b489b5962c4cb79967ace93b0602 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Thu, 20 Aug 2020 16:47:46 +0200 Subject: [PATCH 71/81] Update submodule. --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index 1513389fc1..d4fc0517c4 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 1513389fc195442a0f08b0af488a25affb33d410 +Subproject commit d4fc0517c4d7bc4c86416da065a2bcb37591a8c9 From ed1a96e536026046c4ad6c2c73f7968f09e1205c Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Thu, 20 Aug 2020 16:48:00 +0200 Subject: [PATCH 72/81] Nullability fixes. --- .../Components/Body/BodyManagerComponent.cs | 4 +- .../Components/ClickableComponent.cs | 2 +- .../Components/Items/HandsComponent.cs | 2 +- .../Components/Mobs/StunnableComponent.cs | 2 +- .../Components/Nutrition/HungerComponent.cs | 2 +- .../Components/Nutrition/ThirstComponent.cs | 2 +- .../EntitySystems/DoAfter/DoAfterGui.cs | 2 +- .../EntitySystems/DoAfter/DoAfterSystem.cs | 4 +- .../GameObjects/EntitySystems/MoverSystem.cs | 2 +- .../UserInterface/CooldownGraphic.cs | 1 + .../Tests/Disposal/DisposalUnitTest.cs | 12 ++-- .../Components/Movement/ClimbUnitTest.cs | 6 +- Content.Server/Body/BodyCommands.cs | 6 +- .../Mechanisms/Behaviors/HeartBehavior.cs | 2 +- .../Body/Mechanisms/Behaviors/LungBehavior.cs | 2 +- .../Mechanisms/Behaviors/StomachBehavior.cs | 2 +- .../Access/AccessReaderComponent.cs | 10 +-- .../Components/AnchorableComponent.cs | 4 +- .../Components/Atmos/GasAnalyzerComponent.cs | 18 ++--- .../Components/Body/BodyManagerComponent.cs | 2 +- .../Components/Buckle/BuckleComponent.cs | 16 ++--- .../Components/Cargo/CargoConsoleComponent.cs | 2 +- .../Components/Conveyor/ConveyorComponent.cs | 14 ++-- .../Conveyor/ConveyorSwitchComponent.cs | 10 +-- .../Components/Disposal/DisposalCommands.cs | 2 +- .../Disposal/DisposalHolderComponent.cs | 6 +- .../Disposal/DisposalTubeComponent.cs | 10 +-- .../Disposal/DisposalUnitComponent.cs | 24 +++---- .../Components/DoAfterComponent.cs | 2 +- .../Components/Fluids/SpillHelper.cs | 2 +- .../Components/GUI/HandsComponent.cs | 10 +-- .../Components/Interactable/ToolCommands.cs | 4 +- .../Items/Storage/ServerStorageComponent.cs | 14 ++-- .../Components/Mobs/MindComponent.cs | 2 +- .../Movement/ShuttleControllerComponent.cs | 12 ++-- .../Components/PDA/PDAComponent.cs | 4 +- .../Pointing/PointingArrowComponent.cs | 2 +- .../Pointing/RoguePointingArrowComponent.cs | 4 +- .../Rotatable/FlippableComponent.cs | 2 +- .../GameObjects/Components/WiresComponent.cs | 2 +- .../Atmos/GasTileOverlaySystem.cs | 66 +++++++++---------- .../EntitySystems/AtmosphereSystem.cs | 2 +- .../EntitySystems/DoAfter/DoAfter.cs | 6 +- .../GameObjects/EntitySystems/MoverSystem.cs | 2 +- .../EntitySystems/PointingSystem.cs | 2 +- .../SharedPlayerInputMoverComponent.cs | 4 +- .../EntitySystems/SharedMoverSystem.cs | 4 +- 47 files changed, 159 insertions(+), 158 deletions(-) diff --git a/Content.Client/GameObjects/Components/Body/BodyManagerComponent.cs b/Content.Client/GameObjects/Components/Body/BodyManagerComponent.cs index 2948c9191e..61049ec7a0 100644 --- a/Content.Client/GameObjects/Components/Body/BodyManagerComponent.cs +++ b/Content.Client/GameObjects/Components/Body/BodyManagerComponent.cs @@ -33,7 +33,7 @@ namespace Content.Client.GameObjects.Components.Body public override void HandleNetworkMessage(ComponentMessage message, INetChannel netChannel, ICommonSession? session = null) { - if (!Owner.TryGetComponent(out ISpriteComponent sprite)) + if (!Owner.TryGetComponent(out ISpriteComponent? sprite)) { return; } @@ -50,7 +50,7 @@ namespace Content.Client.GameObjects.Components.Body if (!partRemoved.Dropped.HasValue || !_entityManager.TryGetEntity(partRemoved.Dropped.Value, out var entity) || - !entity.TryGetComponent(out ISpriteComponent droppedSprite)) + !entity.TryGetComponent(out ISpriteComponent? droppedSprite)) { break; } diff --git a/Content.Client/GameObjects/Components/ClickableComponent.cs b/Content.Client/GameObjects/Components/ClickableComponent.cs index 57d9420167..a92af22451 100644 --- a/Content.Client/GameObjects/Components/ClickableComponent.cs +++ b/Content.Client/GameObjects/Components/ClickableComponent.cs @@ -37,7 +37,7 @@ namespace Content.Client.GameObjects.Components /// True if the click worked, false otherwise. public bool CheckClick(Vector2 worldPos, out int drawDepth, out uint renderOrder) { - if (!Owner.TryGetComponent(out ISpriteComponent sprite) || !sprite.Visible) + if (!Owner.TryGetComponent(out ISpriteComponent? sprite) || !sprite.Visible) { drawDepth = default; renderOrder = default; diff --git a/Content.Client/GameObjects/Components/Items/HandsComponent.cs b/Content.Client/GameObjects/Components/Items/HandsComponent.cs index daa03d74e1..30e32afad3 100644 --- a/Content.Client/GameObjects/Components/Items/HandsComponent.cs +++ b/Content.Client/GameObjects/Components/Items/HandsComponent.cs @@ -148,7 +148,7 @@ namespace Content.Client.GameObjects.Components.Items return; } - if (!entity.TryGetComponent(out ItemComponent item)) return; + if (!entity.TryGetComponent(out ItemComponent? item)) return; var maybeInHands = item.GetInHandStateInfo(hand.Location); diff --git a/Content.Client/GameObjects/Components/Mobs/StunnableComponent.cs b/Content.Client/GameObjects/Components/Mobs/StunnableComponent.cs index 4c02d343cb..9d6ce08f8f 100644 --- a/Content.Client/GameObjects/Components/Mobs/StunnableComponent.cs +++ b/Content.Client/GameObjects/Components/Mobs/StunnableComponent.cs @@ -34,7 +34,7 @@ namespace Content.Client.GameObjects.Components.Mobs WalkModifierOverride = state.WalkModifierOverride; RunModifierOverride = state.RunModifierOverride; - if (Owner.TryGetComponent(out MovementSpeedModifierComponent movement)) + if (Owner.TryGetComponent(out MovementSpeedModifierComponent? movement)) { movement.RefreshMovementSpeedModifiers(); } diff --git a/Content.Client/GameObjects/Components/Nutrition/HungerComponent.cs b/Content.Client/GameObjects/Components/Nutrition/HungerComponent.cs index 8323fb5e7a..6db62b1bb3 100644 --- a/Content.Client/GameObjects/Components/Nutrition/HungerComponent.cs +++ b/Content.Client/GameObjects/Components/Nutrition/HungerComponent.cs @@ -20,7 +20,7 @@ namespace Content.Client.GameObjects.Components.Nutrition _currentHungerThreshold = hunger.CurrentThreshold; - if (Owner.TryGetComponent(out MovementSpeedModifierComponent movement)) + if (Owner.TryGetComponent(out MovementSpeedModifierComponent? movement)) { movement.RefreshMovementSpeedModifiers(); } diff --git a/Content.Client/GameObjects/Components/Nutrition/ThirstComponent.cs b/Content.Client/GameObjects/Components/Nutrition/ThirstComponent.cs index b77d59a34a..a211afe239 100644 --- a/Content.Client/GameObjects/Components/Nutrition/ThirstComponent.cs +++ b/Content.Client/GameObjects/Components/Nutrition/ThirstComponent.cs @@ -20,7 +20,7 @@ namespace Content.Client.GameObjects.Components.Nutrition _currentThirstThreshold = thirst.CurrentThreshold; - if (Owner.TryGetComponent(out MovementSpeedModifierComponent movement)) + if (Owner.TryGetComponent(out MovementSpeedModifierComponent? movement)) { movement.RefreshMovementSpeedModifiers(); } diff --git a/Content.Client/GameObjects/EntitySystems/DoAfter/DoAfterGui.cs b/Content.Client/GameObjects/EntitySystems/DoAfter/DoAfterGui.cs index b46b359ff4..a6724c0f6a 100644 --- a/Content.Client/GameObjects/EntitySystems/DoAfter/DoAfterGui.cs +++ b/Content.Client/GameObjects/EntitySystems/DoAfter/DoAfterGui.cs @@ -143,7 +143,7 @@ namespace Content.Client.GameObjects.EntitySystems.DoAfter { base.FrameUpdate(args); - if (AttachedEntity?.IsValid() != true || !AttachedEntity.TryGetComponent(out DoAfterComponent doAfterComponent)) + if (AttachedEntity?.IsValid() != true || !AttachedEntity.TryGetComponent(out DoAfterComponent? doAfterComponent)) { return; } diff --git a/Content.Client/GameObjects/EntitySystems/DoAfter/DoAfterSystem.cs b/Content.Client/GameObjects/EntitySystems/DoAfter/DoAfterSystem.cs index 8aed094c7f..cc0337a941 100644 --- a/Content.Client/GameObjects/EntitySystems/DoAfter/DoAfterSystem.cs +++ b/Content.Client/GameObjects/EntitySystems/DoAfter/DoAfterSystem.cs @@ -67,7 +67,7 @@ namespace Content.Client.GameObjects.EntitySystems.DoAfter Gui ??= new DoAfterGui(); Gui.AttachedEntity = entity; - if (entity.TryGetComponent(out DoAfterComponent doAfterComponent)) + if (entity.TryGetComponent(out DoAfterComponent? doAfterComponent)) { foreach (var (_, doAfter) in doAfterComponent.DoAfters) { @@ -87,7 +87,7 @@ namespace Content.Client.GameObjects.EntitySystems.DoAfter return; } - if (!_player.TryGetComponent(out DoAfterComponent doAfterComponent)) + if (!_player.TryGetComponent(out DoAfterComponent? doAfterComponent)) { return; } diff --git a/Content.Client/GameObjects/EntitySystems/MoverSystem.cs b/Content.Client/GameObjects/EntitySystems/MoverSystem.cs index cdabb87d7c..db3ad9fc33 100644 --- a/Content.Client/GameObjects/EntitySystems/MoverSystem.cs +++ b/Content.Client/GameObjects/EntitySystems/MoverSystem.cs @@ -25,7 +25,7 @@ namespace Content.Client.GameObjects.EntitySystems { var playerEnt = _playerManager.LocalPlayer?.ControlledEntity; - if (playerEnt == null || !playerEnt.TryGetComponent(out IMoverComponent mover)) + if (playerEnt == null || !playerEnt.TryGetComponent(out IMoverComponent? mover)) { return; } diff --git a/Content.Client/UserInterface/CooldownGraphic.cs b/Content.Client/UserInterface/CooldownGraphic.cs index 777ec9e1d9..c659d2ce19 100644 --- a/Content.Client/UserInterface/CooldownGraphic.cs +++ b/Content.Client/UserInterface/CooldownGraphic.cs @@ -30,6 +30,7 @@ namespace Content.Client.UserInterface protected override void Draw(DrawingHandleScreen handle) { + Span x = stackalloc float[10]; Color color; var lerp = 1f - MathF.Abs(Progress); // for future bikeshedding purposes diff --git a/Content.IntegrationTests/Tests/Disposal/DisposalUnitTest.cs b/Content.IntegrationTests/Tests/Disposal/DisposalUnitTest.cs index 4f6b309bf7..3eb3821634 100644 --- a/Content.IntegrationTests/Tests/Disposal/DisposalUnitTest.cs +++ b/Content.IntegrationTests/Tests/Disposal/DisposalUnitTest.cs @@ -81,8 +81,8 @@ namespace Content.IntegrationTests.Tests.Disposal var disposalTrunk = entityManager.SpawnEntity("DisposalTrunk", disposalUnit.Transform.MapPosition); // Test for components existing - Assert.True(disposalUnit.TryGetComponent(out unit)); - Assert.True(disposalTrunk.TryGetComponent(out entry)); + Assert.True(disposalUnit.TryGetComponent(out unit!)); + Assert.True(disposalTrunk.TryGetComponent(out entry!)); // Can't insert, unanchored and unpowered var disposalUnitAnchorable = disposalUnit.GetComponent(); @@ -92,8 +92,8 @@ namespace Content.IntegrationTests.Tests.Disposal // Anchor the disposal unit await disposalUnitAnchorable.TryAnchor(human, null, true); - Assert.True(disposalUnit.TryGetComponent(out AnchorableComponent anchorableUnit)); - Assert.True(await anchorableUnit.TryAnchor(human, wrench)); + Assert.True(disposalUnit.TryGetComponent(out AnchorableComponent? anchorableUnit)); + Assert.True(await anchorableUnit!.TryAnchor(human, wrench)); Assert.True(unit.Anchored); // No power @@ -118,8 +118,8 @@ namespace Content.IntegrationTests.Tests.Disposal Flush(unit, false, entry, human, wrench); // Remove power need - Assert.True(disposalUnit.TryGetComponent(out PowerReceiverComponent power)); - power.NeedsPower = false; + Assert.True(disposalUnit.TryGetComponent(out PowerReceiverComponent? power)); + power!.NeedsPower = false; Assert.True(unit.Powered); // Flush with a mob and an item diff --git a/Content.IntegrationTests/Tests/GameObjects/Components/Movement/ClimbUnitTest.cs b/Content.IntegrationTests/Tests/GameObjects/Components/Movement/ClimbUnitTest.cs index 7ae95a83af..e55218ef09 100644 --- a/Content.IntegrationTests/Tests/GameObjects/Components/Movement/ClimbUnitTest.cs +++ b/Content.IntegrationTests/Tests/GameObjects/Components/Movement/ClimbUnitTest.cs @@ -41,13 +41,13 @@ namespace Content.IntegrationTests.Tests.GameObjects.Components.Movement // Test for climb components existing // Players and tables should have these in their prototypes. - Assert.True(human.TryGetComponent(out climbing), "Human has no climbing"); - Assert.True(table.TryGetComponent(out climbable), "Table has no climbable"); + Assert.True(human.TryGetComponent(out climbing!), "Human has no climbing"); + Assert.True(table.TryGetComponent(out climbable!), "Table has no climbable"); // Now let's make the player enter a climbing transitioning state. climbing.IsClimbing = true; climbing.TryMoveTo(human.Transform.WorldPosition, table.Transform.WorldPosition); - human.TryGetComponent(out ICollidableComponent body); + var body = human.GetComponent(); Assert.True(body.HasController(), "Player has no ClimbController"); diff --git a/Content.Server/Body/BodyCommands.cs b/Content.Server/Body/BodyCommands.cs index 89d6355203..9809a5845f 100644 --- a/Content.Server/Body/BodyCommands.cs +++ b/Content.Server/Body/BodyCommands.cs @@ -32,7 +32,7 @@ namespace Content.Server.Body return; } - if (!player.AttachedEntity.TryGetComponent(out BodyManagerComponent body)) + if (!player.AttachedEntity.TryGetComponent(out BodyManagerComponent? body)) { var random = IoCManager.Resolve(); var text = $"You have no body{(random.Prob(0.2f) ? " and you must scream." : ".")}"; @@ -72,7 +72,7 @@ namespace Content.Server.Body return; } - if (!player.AttachedEntity.TryGetComponent(out BodyManagerComponent body)) + if (!player.AttachedEntity.TryGetComponent(out BodyManagerComponent? body)) { var random = IoCManager.Resolve(); var text = $"You have no body{(random.Prob(0.2f) ? " and you must scream." : ".")}"; @@ -119,7 +119,7 @@ namespace Content.Server.Body return; } - if (!player.AttachedEntity.TryGetComponent(out BodyManagerComponent body)) + if (!player.AttachedEntity.TryGetComponent(out BodyManagerComponent? body)) { var random = IoCManager.Resolve(); var text = $"You have no body{(random.Prob(0.2f) ? " and you must scream." : ".")}"; diff --git a/Content.Server/Body/Mechanisms/Behaviors/HeartBehavior.cs b/Content.Server/Body/Mechanisms/Behaviors/HeartBehavior.cs index 51366583bd..2229357bfc 100644 --- a/Content.Server/Body/Mechanisms/Behaviors/HeartBehavior.cs +++ b/Content.Server/Body/Mechanisms/Behaviors/HeartBehavior.cs @@ -19,7 +19,7 @@ namespace Content.Server.Body.Mechanisms.Behaviors base.PreMetabolism(frameTime); if (Mechanism.Body == null || - !Mechanism.Body.Owner.TryGetComponent(out BloodstreamComponent bloodstream)) + !Mechanism.Body.Owner.TryGetComponent(out BloodstreamComponent? bloodstream)) { return; } diff --git a/Content.Server/Body/Mechanisms/Behaviors/LungBehavior.cs b/Content.Server/Body/Mechanisms/Behaviors/LungBehavior.cs index 675cc37e76..bc2591c387 100644 --- a/Content.Server/Body/Mechanisms/Behaviors/LungBehavior.cs +++ b/Content.Server/Body/Mechanisms/Behaviors/LungBehavior.cs @@ -16,7 +16,7 @@ namespace Content.Server.Body.Mechanisms.Behaviors base.PreMetabolism(frameTime); if (Mechanism.Body == null || - !Mechanism.Body.Owner.TryGetComponent(out LungComponent lung)) + !Mechanism.Body.Owner.TryGetComponent(out LungComponent? lung)) { return; } diff --git a/Content.Server/Body/Mechanisms/Behaviors/StomachBehavior.cs b/Content.Server/Body/Mechanisms/Behaviors/StomachBehavior.cs index ae1e17b49b..ce6a2bcf43 100644 --- a/Content.Server/Body/Mechanisms/Behaviors/StomachBehavior.cs +++ b/Content.Server/Body/Mechanisms/Behaviors/StomachBehavior.cs @@ -18,7 +18,7 @@ namespace Content.Server.Body.Mechanisms.Behaviors base.PreMetabolism(frameTime); if (Mechanism.Body == null || - !Mechanism.Body.Owner.TryGetComponent(out StomachComponent stomach)) + !Mechanism.Body.Owner.TryGetComponent(out StomachComponent? stomach)) { return; } diff --git a/Content.Server/GameObjects/Components/Access/AccessReaderComponent.cs b/Content.Server/GameObjects/Components/Access/AccessReaderComponent.cs index 4ebfcd20bd..c861074d34 100644 --- a/Content.Server/GameObjects/Components/Access/AccessReaderComponent.cs +++ b/Content.Server/GameObjects/Components/Access/AccessReaderComponent.cs @@ -71,16 +71,16 @@ namespace Content.Server.GameObjects.Components.Access public static ICollection FindAccessTags(IEntity entity) { - if (entity.TryGetComponent(out IAccess accessComponent)) + if (entity.TryGetComponent(out IAccess? accessComponent)) { return accessComponent.Tags; } - if (entity.TryGetComponent(out IHandsComponent handsComponent)) + if (entity.TryGetComponent(out IHandsComponent? handsComponent)) { var activeHandEntity = handsComponent.GetActiveHand?.Owner; if (activeHandEntity != null && - activeHandEntity.TryGetComponent(out IAccess handAccessComponent)) + activeHandEntity.TryGetComponent(out IAccess? handAccessComponent)) { return handAccessComponent.Tags; } @@ -90,11 +90,11 @@ namespace Content.Server.GameObjects.Components.Access return Array.Empty(); } - if (entity.TryGetComponent(out InventoryComponent inventoryComponent)) + if (entity.TryGetComponent(out InventoryComponent? inventoryComponent)) { if (inventoryComponent.HasSlot(EquipmentSlotDefines.Slots.IDCARD) && inventoryComponent.TryGetSlotItem(EquipmentSlotDefines.Slots.IDCARD, out ItemComponent item) && - item.Owner.TryGetComponent(out IAccess idAccessComponent) + item.Owner.TryGetComponent(out IAccess? idAccessComponent) ) { return idAccessComponent.Tags; diff --git a/Content.Server/GameObjects/Components/AnchorableComponent.cs b/Content.Server/GameObjects/Components/AnchorableComponent.cs index 9837ac04cb..224ce59886 100644 --- a/Content.Server/GameObjects/Components/AnchorableComponent.cs +++ b/Content.Server/GameObjects/Components/AnchorableComponent.cs @@ -34,7 +34,7 @@ namespace Content.Server.GameObjects.Components if (!force) { if (utilizing == null || - !utilizing.TryGetComponent(out ToolComponent tool) || + !utilizing.TryGetComponent(out ToolComponent? tool) || !(await tool.UseTool(user, Owner, 0.5f, ToolQuality.Anchoring))) { return false; @@ -93,7 +93,7 @@ namespace Content.Server.GameObjects.Components /// true if toggled, false otherwise private async Task TryToggleAnchor(IEntity user, IEntity? utilizing = null, bool force = false) { - if (!Owner.TryGetComponent(out ICollidableComponent collidable)) + if (!Owner.TryGetComponent(out ICollidableComponent? collidable)) { return false; } diff --git a/Content.Server/GameObjects/Components/Atmos/GasAnalyzerComponent.cs b/Content.Server/GameObjects/Components/Atmos/GasAnalyzerComponent.cs index 066bc0940a..2a6a2be135 100644 --- a/Content.Server/GameObjects/Components/Atmos/GasAnalyzerComponent.cs +++ b/Content.Server/GameObjects/Components/Atmos/GasAnalyzerComponent.cs @@ -116,7 +116,7 @@ namespace Content.Server.GameObjects.Components.Atmos { _pressureDanger = GasAnalyzerDanger.Nominal; } - + Dirty(); _timeSinceSync = 0f; } @@ -131,11 +131,11 @@ namespace Content.Server.GameObjects.Components.Atmos if (session.AttachedEntity == null) return; - if (!session.AttachedEntity.TryGetComponent(out IHandsComponent handsComponent)) + if (!session.AttachedEntity.TryGetComponent(out IHandsComponent? handsComponent)) return; var activeHandEntity = handsComponent?.GetActiveHand?.Owner; - if (activeHandEntity == null || !activeHandEntity.TryGetComponent(out GasAnalyzerComponent gasAnalyzer)) + if (activeHandEntity == null || !activeHandEntity.TryGetComponent(out GasAnalyzerComponent? gasAnalyzer)) { return; } @@ -147,7 +147,7 @@ namespace Content.Server.GameObjects.Components.Atmos // Check if position is out of range => don't update if (!_position.Value.InRange(_mapManager, pos, SharedInteractionSystem.InteractionRange)) return; - + pos = _position.Value; } @@ -195,7 +195,7 @@ namespace Content.Server.GameObjects.Components.Atmos return; } - if (!player.TryGetComponent(out IHandsComponent handsComponent)) + if (!player.TryGetComponent(out IHandsComponent? handsComponent)) { _notifyManager.PopupMessage(Owner.Transform.GridPosition, player, Loc.GetString("You have no hands.")); @@ -203,7 +203,7 @@ namespace Content.Server.GameObjects.Components.Atmos } var activeHandEntity = handsComponent.GetActiveHand?.Owner; - if (activeHandEntity == null || !activeHandEntity.TryGetComponent(out GasAnalyzerComponent gasAnalyzer)) + if (activeHandEntity == null || !activeHandEntity.TryGetComponent(out GasAnalyzerComponent? gasAnalyzer)) { _notifyManager.PopupMessage(serverMsg.Session.AttachedEntity, serverMsg.Session.AttachedEntity, @@ -225,7 +225,7 @@ namespace Content.Server.GameObjects.Components.Atmos return; } - if (eventArgs.User.TryGetComponent(out IActorComponent actor)) + if (eventArgs.User.TryGetComponent(out IActorComponent? actor)) { OpenInterface(actor.playerSession, eventArgs.ClickLocation); //TODO: show other sprite when ui open? @@ -236,7 +236,7 @@ namespace Content.Server.GameObjects.Components.Atmos void IDropped.Dropped(DroppedEventArgs eventArgs) { - if (eventArgs.User.TryGetComponent(out IActorComponent actor)) + if (eventArgs.User.TryGetComponent(out IActorComponent? actor)) { CloseInterface(actor.playerSession); //TODO: if other sprite is shown, change again @@ -245,7 +245,7 @@ namespace Content.Server.GameObjects.Components.Atmos bool IUse.UseEntity(UseEntityEventArgs eventArgs) { - if (eventArgs.User.TryGetComponent(out IActorComponent actor)) + if (eventArgs.User.TryGetComponent(out IActorComponent? actor)) { OpenInterface(actor.playerSession); //TODO: show other sprite when ui open? diff --git a/Content.Server/GameObjects/Components/Body/BodyManagerComponent.cs b/Content.Server/GameObjects/Components/Body/BodyManagerComponent.cs index ac2f427299..5c14e4da0c 100644 --- a/Content.Server/GameObjects/Components/Body/BodyManagerComponent.cs +++ b/Content.Server/GameObjects/Components/Body/BodyManagerComponent.cs @@ -272,7 +272,7 @@ namespace Content.Server.GameObjects.Components.Body private void CalculateSpeed() { - if (!Owner.TryGetComponent(out MovementSpeedModifierComponent playerMover)) + if (!Owner.TryGetComponent(out MovementSpeedModifierComponent? playerMover)) { return; } diff --git a/Content.Server/GameObjects/Components/Buckle/BuckleComponent.cs b/Content.Server/GameObjects/Components/Buckle/BuckleComponent.cs index 877a0c2727..fcb1144b47 100644 --- a/Content.Server/GameObjects/Components/Buckle/BuckleComponent.cs +++ b/Content.Server/GameObjects/Components/Buckle/BuckleComponent.cs @@ -112,7 +112,7 @@ namespace Content.Server.GameObjects.Components.Buckle /// private void BuckleStatus() { - if (Owner.TryGetComponent(out ServerStatusEffectsComponent status)) + if (Owner.TryGetComponent(out ServerStatusEffectsComponent? status)) { status.ChangeStatusEffectIcon(StatusEffect.Buckled, Buckled @@ -291,7 +291,7 @@ namespace Content.Server.GameObjects.Components.Buckle return false; } - if (Owner.TryGetComponent(out AppearanceComponent appearance)) + if (Owner.TryGetComponent(out AppearanceComponent? appearance)) { appearance.SetData(BuckleVisuals.Buckled, true); } @@ -359,12 +359,12 @@ namespace Content.Server.GameObjects.Components.Buckle Owner.Transform.WorldRotation = oldBuckledTo.Owner.Transform.WorldRotation; } - if (Owner.TryGetComponent(out AppearanceComponent appearance)) + if (Owner.TryGetComponent(out AppearanceComponent? appearance)) { appearance.SetData(BuckleVisuals.Buckled, false); } - if (Owner.TryGetComponent(out StunnableComponent stunnable) && stunnable.KnockedDown) + if (Owner.TryGetComponent(out StunnableComponent? stunnable) && stunnable.KnockedDown) { StandingStateHelper.Down(Owner); } @@ -373,14 +373,14 @@ namespace Content.Server.GameObjects.Components.Buckle StandingStateHelper.Standing(Owner); } - if (Owner.TryGetComponent(out MobStateManagerComponent stateManager)) + if (Owner.TryGetComponent(out MobStateManagerComponent? stateManager)) { stateManager.CurrentMobState.EnterState(Owner); } BuckleStatus(); - if (oldBuckledTo.Owner.TryGetComponent(out StrapComponent strap)) + if (oldBuckledTo.Owner.TryGetComponent(out StrapComponent? strap)) { strap.Remove(this); _entitySystem.GetEntitySystem() @@ -535,7 +535,7 @@ namespace Content.Server.GameObjects.Components.Buckle _entityManager.EventBus.UnsubscribeEvents(this); if (BuckledTo != null && - BuckledTo.Owner.TryGetComponent(out StrapComponent strap)) + BuckledTo.Owner.TryGetComponent(out StrapComponent? strap)) { strap.Remove(this); } @@ -552,7 +552,7 @@ namespace Content.Server.GameObjects.Components.Buckle if (BuckledTo != null && Owner.Transform.WorldRotation.GetCardinalDir() == Direction.North && - BuckledTo.Owner.TryGetComponent(out SpriteComponent strapSprite)) + BuckledTo.Owner.TryGetComponent(out SpriteComponent? strapSprite)) { drawDepth = strapSprite.DrawDepth - 1; } diff --git a/Content.Server/GameObjects/Components/Cargo/CargoConsoleComponent.cs b/Content.Server/GameObjects/Components/Cargo/CargoConsoleComponent.cs index 9e263f5795..ca6445e5e6 100644 --- a/Content.Server/GameObjects/Components/Cargo/CargoConsoleComponent.cs +++ b/Content.Server/GameObjects/Components/Cargo/CargoConsoleComponent.cs @@ -159,7 +159,7 @@ namespace Content.Server.GameObjects.Components.Cargo void IActivate.Activate(ActivateEventArgs eventArgs) { - if (!eventArgs.User.TryGetComponent(out IActorComponent actor)) + if (!eventArgs.User.TryGetComponent(out IActorComponent? actor)) { return; } diff --git a/Content.Server/GameObjects/Components/Conveyor/ConveyorComponent.cs b/Content.Server/GameObjects/Components/Conveyor/ConveyorComponent.cs index ab636c4fe4..689e3f8bea 100644 --- a/Content.Server/GameObjects/Components/Conveyor/ConveyorComponent.cs +++ b/Content.Server/GameObjects/Components/Conveyor/ConveyorComponent.cs @@ -60,7 +60,7 @@ namespace Content.Server.GameObjects.Components.Conveyor { _state = value; - if (!Owner.TryGetComponent(out AppearanceComponent appearance)) + if (!Owner.TryGetComponent(out AppearanceComponent? appearance)) { return; } @@ -93,7 +93,7 @@ namespace Content.Server.GameObjects.Components.Conveyor return false; } - if (Owner.TryGetComponent(out PowerReceiverComponent receiver) && + if (Owner.TryGetComponent(out PowerReceiverComponent? receiver) && !receiver.Powered) { return false; @@ -114,7 +114,7 @@ namespace Content.Server.GameObjects.Components.Conveyor return false; } - if (!entity.TryGetComponent(out ICollidableComponent collidable) || + if (!entity.TryGetComponent(out ICollidableComponent? collidable) || collidable.Anchored) { return false; @@ -155,7 +155,7 @@ namespace Content.Server.GameObjects.Components.Conveyor continue; } - if (entity.TryGetComponent(out ICollidableComponent collidable)) + if (entity.TryGetComponent(out ICollidableComponent? collidable)) { var controller = collidable.EnsureController(); controller.Move(direction, _speed * frameTime); @@ -225,7 +225,7 @@ namespace Content.Server.GameObjects.Components.Conveyor continue; } - if (!@switch.TryGetComponent(out ConveyorSwitchComponent component)) + if (!@switch.TryGetComponent(out ConveyorSwitchComponent? component)) { continue; } @@ -247,13 +247,13 @@ namespace Content.Server.GameObjects.Components.Conveyor async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { - if (eventArgs.Using.TryGetComponent(out ConveyorSwitchComponent conveyorSwitch)) + if (eventArgs.Using.TryGetComponent(out ConveyorSwitchComponent? conveyorSwitch)) { conveyorSwitch.Connect(this, eventArgs.User); return true; } - if (eventArgs.Using.TryGetComponent(out ToolComponent tool)) + if (eventArgs.Using.TryGetComponent(out ToolComponent? tool)) { return await ToolUsed(eventArgs.User, tool); } diff --git a/Content.Server/GameObjects/Components/Conveyor/ConveyorSwitchComponent.cs b/Content.Server/GameObjects/Components/Conveyor/ConveyorSwitchComponent.cs index 3c06575fd2..ae5e2c3aa1 100644 --- a/Content.Server/GameObjects/Components/Conveyor/ConveyorSwitchComponent.cs +++ b/Content.Server/GameObjects/Components/Conveyor/ConveyorSwitchComponent.cs @@ -34,7 +34,7 @@ namespace Content.Server.GameObjects.Components.Conveyor { _state = value; - if (Owner.TryGetComponent(out AppearanceComponent appearance)) + if (Owner.TryGetComponent(out AppearanceComponent? appearance)) { appearance.SetData(ConveyorVisuals.State, value); } @@ -145,7 +145,7 @@ namespace Content.Server.GameObjects.Components.Conveyor continue; } - if (!conveyor.TryGetComponent(out ConveyorComponent component)) + if (!conveyor.TryGetComponent(out ConveyorComponent? component)) { continue; } @@ -172,7 +172,7 @@ namespace Content.Server.GameObjects.Components.Conveyor continue; } - if (!@switch.TryGetComponent(out ConveyorSwitchComponent component)) + if (!@switch.TryGetComponent(out ConveyorSwitchComponent? component)) { continue; } @@ -196,13 +196,13 @@ namespace Content.Server.GameObjects.Components.Conveyor async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { - if (eventArgs.Using.TryGetComponent(out ConveyorComponent conveyor)) + if (eventArgs.Using.TryGetComponent(out ConveyorComponent? conveyor)) { Connect(conveyor, eventArgs.User); return true; } - if (eventArgs.Using.TryGetComponent(out ConveyorSwitchComponent otherSwitch)) + if (eventArgs.Using.TryGetComponent(out ConveyorSwitchComponent? otherSwitch)) { SyncWith(otherSwitch, eventArgs.User); return true; diff --git a/Content.Server/GameObjects/Components/Disposal/DisposalCommands.cs b/Content.Server/GameObjects/Components/Disposal/DisposalCommands.cs index 5401182b5b..238b31c737 100644 --- a/Content.Server/GameObjects/Components/Disposal/DisposalCommands.cs +++ b/Content.Server/GameObjects/Components/Disposal/DisposalCommands.cs @@ -41,7 +41,7 @@ namespace Content.Server.GameObjects.Components.Disposal return; } - if (!entity.TryGetComponent(out IDisposalTubeComponent tube)) + if (!entity.TryGetComponent(out IDisposalTubeComponent? tube)) { shell.SendText(player, Loc.GetString("Entity with uid {0} doesn't have a {1} component", id, nameof(IDisposalTubeComponent))); return; diff --git a/Content.Server/GameObjects/Components/Disposal/DisposalHolderComponent.cs b/Content.Server/GameObjects/Components/Disposal/DisposalHolderComponent.cs index b07efbdef1..838cf933d2 100644 --- a/Content.Server/GameObjects/Components/Disposal/DisposalHolderComponent.cs +++ b/Content.Server/GameObjects/Components/Disposal/DisposalHolderComponent.cs @@ -56,7 +56,7 @@ namespace Content.Server.GameObjects.Components.Disposal return false; } - if (!entity.TryGetComponent(out ICollidableComponent collidable) || + if (!entity.TryGetComponent(out ICollidableComponent? collidable) || !collidable.CanCollide) { return false; @@ -73,7 +73,7 @@ namespace Content.Server.GameObjects.Components.Disposal return false; } - if (entity.TryGetComponent(out ICollidableComponent collidable)) + if (entity.TryGetComponent(out ICollidableComponent? collidable)) { collidable.CanCollide = false; } @@ -105,7 +105,7 @@ namespace Content.Server.GameObjects.Components.Disposal foreach (var entity in _contents.ContainedEntities.ToArray()) { - if (entity.TryGetComponent(out ICollidableComponent collidable)) + if (entity.TryGetComponent(out ICollidableComponent? collidable)) { collidable.CanCollide = true; } diff --git a/Content.Server/GameObjects/Components/Disposal/DisposalTubeComponent.cs b/Content.Server/GameObjects/Components/Disposal/DisposalTubeComponent.cs index 37b2f2275e..94dccce0a7 100644 --- a/Content.Server/GameObjects/Components/Disposal/DisposalTubeComponent.cs +++ b/Content.Server/GameObjects/Components/Disposal/DisposalTubeComponent.cs @@ -44,7 +44,7 @@ namespace Content.Server.GameObjects.Components.Disposal [ViewVariables] private bool Anchored => - !Owner.TryGetComponent(out CollidableComponent collidable) || + !Owner.TryGetComponent(out CollidableComponent? collidable) || collidable.Anchored; /// @@ -71,7 +71,7 @@ namespace Content.Server.GameObjects.Components.Disposal var snapGrid = Owner.GetComponent(); var tube = snapGrid .GetInDir(nextDirection) - .Select(x => x.TryGetComponent(out IDisposalTubeComponent c) ? c : null) + .Select(x => x.TryGetComponent(out IDisposalTubeComponent? c) ? c : null) .FirstOrDefault(x => x != null && x != this); if (tube == null) @@ -153,7 +153,7 @@ namespace Content.Server.GameObjects.Components.Disposal foreach (var entity in Contents.ContainedEntities.ToArray()) { - if (!entity.TryGetComponent(out DisposalHolderComponent holder)) + if (!entity.TryGetComponent(out DisposalHolderComponent? holder)) { continue; } @@ -171,7 +171,7 @@ namespace Content.Server.GameObjects.Components.Disposal private void UpdateVisualState() { - if (!Owner.TryGetComponent(out AppearanceComponent appearance)) + if (!Owner.TryGetComponent(out AppearanceComponent? appearance)) { return; } @@ -187,7 +187,7 @@ namespace Content.Server.GameObjects.Components.Disposal private void AnchoredChanged() { - if (!Owner.TryGetComponent(out CollidableComponent collidable)) + if (!Owner.TryGetComponent(out CollidableComponent? collidable)) { return; } diff --git a/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs b/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs index 2849bb3c16..2e420ef91e 100644 --- a/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs +++ b/Content.Server/GameObjects/Components/Disposal/DisposalUnitComponent.cs @@ -86,12 +86,12 @@ namespace Content.Server.GameObjects.Components.Disposal [ViewVariables] public bool Powered => - !Owner.TryGetComponent(out PowerReceiverComponent receiver) || + !Owner.TryGetComponent(out PowerReceiverComponent? receiver) || receiver.Powered; [ViewVariables] public bool Anchored => - !Owner.TryGetComponent(out CollidableComponent collidable) || + !Owner.TryGetComponent(out CollidableComponent? collidable) || collidable.Anchored; [ViewVariables] @@ -122,7 +122,7 @@ namespace Content.Server.GameObjects.Components.Disposal return false; } - if (!entity.TryGetComponent(out ICollidableComponent collidable) || + if (!entity.TryGetComponent(out ICollidableComponent? collidable) || !collidable.CanCollide) { return false; @@ -159,7 +159,7 @@ namespace Content.Server.GameObjects.Components.Disposal { TryQueueEngage(); - if (entity.TryGetComponent(out IActorComponent actor)) + if (entity.TryGetComponent(out IActorComponent? actor)) { _userInterface.Close(actor.playerSession); } @@ -181,7 +181,7 @@ namespace Content.Server.GameObjects.Components.Disposal private bool TryDrop(IEntity user, IEntity entity) { - if (!user.TryGetComponent(out HandsComponent hands)) + if (!user.TryGetComponent(out HandsComponent? hands)) { return false; } @@ -273,7 +273,7 @@ namespace Content.Server.GameObjects.Components.Disposal private void TogglePower() { - if (!Owner.TryGetComponent(out PowerReceiverComponent receiver)) + if (!Owner.TryGetComponent(out PowerReceiverComponent? receiver)) { return; } @@ -352,7 +352,7 @@ namespace Content.Server.GameObjects.Components.Disposal private void UpdateVisualState(bool flush) { - if (!Owner.TryGetComponent(out AppearanceComponent appearance)) + if (!Owner.TryGetComponent(out AppearanceComponent? appearance)) { return; } @@ -488,7 +488,7 @@ namespace Content.Server.GameObjects.Components.Disposal var collidable = Owner.EnsureComponent(); collidable.AnchoredChanged += UpdateVisualState; - if (Owner.TryGetComponent(out PowerReceiverComponent receiver)) + if (Owner.TryGetComponent(out PowerReceiverComponent? receiver)) { receiver.OnPowerStateChanged += PowerStateChanged; } @@ -498,12 +498,12 @@ namespace Content.Server.GameObjects.Components.Disposal public override void OnRemove() { - if (Owner.TryGetComponent(out ICollidableComponent collidable)) + if (Owner.TryGetComponent(out ICollidableComponent? collidable)) { collidable.AnchoredChanged -= UpdateVisualState; } - if (Owner.TryGetComponent(out PowerReceiverComponent receiver)) + if (Owner.TryGetComponent(out PowerReceiverComponent? receiver)) { receiver.OnPowerStateChanged -= PowerStateChanged; } @@ -530,7 +530,7 @@ namespace Content.Server.GameObjects.Components.Disposal switch (message) { case RelayMovementEntityMessage msg: - if (!msg.Entity.TryGetComponent(out HandsComponent hands) || + if (!msg.Entity.TryGetComponent(out HandsComponent? hands) || hands.Count == 0 || _gameTiming.CurTime < _lastExitAttempt + ExitAttemptDelay) { @@ -559,7 +559,7 @@ namespace Content.Server.GameObjects.Components.Disposal return false; } - if (!eventArgs.User.TryGetComponent(out IActorComponent actor)) + if (!eventArgs.User.TryGetComponent(out IActorComponent? actor)) { return false; } diff --git a/Content.Server/GameObjects/Components/DoAfterComponent.cs b/Content.Server/GameObjects/Components/DoAfterComponent.cs index d77fc080d0..2013028ae6 100644 --- a/Content.Server/GameObjects/Components/DoAfterComponent.cs +++ b/Content.Server/GameObjects/Components/DoAfterComponent.cs @@ -60,7 +60,7 @@ namespace Content.Server.GameObjects.Components { connectedClient = null; - if (!Owner.TryGetComponent(out IActorComponent actorComponent)) + if (!Owner.TryGetComponent(out IActorComponent? actorComponent)) { return false; } diff --git a/Content.Server/GameObjects/Components/Fluids/SpillHelper.cs b/Content.Server/GameObjects/Components/Fluids/SpillHelper.cs index 5b85924b8d..e616a7f5f0 100644 --- a/Content.Server/GameObjects/Components/Fluids/SpillHelper.cs +++ b/Content.Server/GameObjects/Components/Fluids/SpillHelper.cs @@ -63,7 +63,7 @@ namespace Content.Server.GameObjects.Components.Fluids foreach (var spillEntity in entityManager.GetEntitiesAt(spillTileMapGrid.ParentMapId, spillGridCoords.Position)) { - if (!spillEntity.TryGetComponent(out PuddleComponent puddleComponent)) + if (!spillEntity.TryGetComponent(out PuddleComponent? puddleComponent)) { continue; } diff --git a/Content.Server/GameObjects/Components/GUI/HandsComponent.cs b/Content.Server/GameObjects/Components/GUI/HandsComponent.cs index 572e504f53..69fe0be734 100644 --- a/Content.Server/GameObjects/Components/GUI/HandsComponent.cs +++ b/Content.Server/GameObjects/Components/GUI/HandsComponent.cs @@ -711,7 +711,7 @@ namespace Content.Server.GameObjects.Components.GUI Dirty(); - if (!message.Entity.TryGetComponent(out ICollidableComponent collidable)) + if (!message.Entity.TryGetComponent(out ICollidableComponent? collidable)) { return; } @@ -724,13 +724,13 @@ namespace Content.Server.GameObjects.Components.GUI private void AddPullingStatuses(IEntity pulled) { - if (pulled.TryGetComponent(out ServerStatusEffectsComponent pulledStatus)) + if (pulled.TryGetComponent(out ServerStatusEffectsComponent? pulledStatus)) { pulledStatus.ChangeStatusEffectIcon(StatusEffect.Pulled, "/Textures/Interface/StatusEffects/Pull/pulled.png"); } - if (Owner.TryGetComponent(out ServerStatusEffectsComponent ownerStatus)) + if (Owner.TryGetComponent(out ServerStatusEffectsComponent? ownerStatus)) { ownerStatus.ChangeStatusEffectIcon(StatusEffect.Pulling, "/Textures/Interface/StatusEffects/Pull/pulling.png"); @@ -739,12 +739,12 @@ namespace Content.Server.GameObjects.Components.GUI private void RemovePullingStatuses(IEntity pulled) { - if (pulled.TryGetComponent(out ServerStatusEffectsComponent pulledStatus)) + if (pulled.TryGetComponent(out ServerStatusEffectsComponent? pulledStatus)) { pulledStatus.RemoveStatusEffect(StatusEffect.Pulled); } - if (Owner.TryGetComponent(out ServerStatusEffectsComponent ownerStatus)) + if (Owner.TryGetComponent(out ServerStatusEffectsComponent? ownerStatus)) { ownerStatus.RemoveStatusEffect(StatusEffect.Pulling); } diff --git a/Content.Server/GameObjects/Components/Interactable/ToolCommands.cs b/Content.Server/GameObjects/Components/Interactable/ToolCommands.cs index 3008f11d44..9dd07ff951 100644 --- a/Content.Server/GameObjects/Components/Interactable/ToolCommands.cs +++ b/Content.Server/GameObjects/Components/Interactable/ToolCommands.cs @@ -106,7 +106,7 @@ namespace Content.Server.GameObjects.Components.Interactable foreach (var entity in entities) { - if (entity.TryGetComponent(out AnchorableComponent anchorable)) + if (entity.TryGetComponent(out AnchorableComponent? anchorable)) { anchorable.TryAnchor(player.AttachedEntity, force: true); } @@ -151,7 +151,7 @@ namespace Content.Server.GameObjects.Components.Interactable foreach (var entity in entities) { - if (entity.TryGetComponent(out AnchorableComponent anchorable)) + if (entity.TryGetComponent(out AnchorableComponent? anchorable)) { anchorable.TryUnAnchor(player.AttachedEntity, force: true); } diff --git a/Content.Server/GameObjects/Components/Items/Storage/ServerStorageComponent.cs b/Content.Server/GameObjects/Components/Items/Storage/ServerStorageComponent.cs index 96aef95564..24272ed72c 100644 --- a/Content.Server/GameObjects/Components/Items/Storage/ServerStorageComponent.cs +++ b/Content.Server/GameObjects/Components/Items/Storage/ServerStorageComponent.cs @@ -101,13 +101,13 @@ namespace Content.Server.GameObjects.Components.Items.Storage { EnsureInitialCalculated(); - if (entity.TryGetComponent(out ServerStorageComponent storage) && + if (entity.TryGetComponent(out ServerStorageComponent? storage) && storage._storageCapacityMax >= _storageCapacityMax) { return false; } - if (entity.TryGetComponent(out StorableComponent store) && + if (entity.TryGetComponent(out StorableComponent? store) && store.ObjectSize > _storageCapacityMax - _storageUsed) { return false; @@ -164,7 +164,7 @@ namespace Content.Server.GameObjects.Components.Items.Storage Logger.DebugS(LoggerName, $"Storage (UID {Owner.Uid}) had entity (UID {message.Entity.Uid}) removed from it."); - if (!message.Entity.TryGetComponent(out StorableComponent storable)) + if (!message.Entity.TryGetComponent(out StorableComponent? storable)) { Logger.WarningS(LoggerName, $"Removed entity {message.Entity.Uid} without a StorableComponent from storage {Owner.Uid} at {Owner.Transform.MapPosition}"); @@ -186,7 +186,7 @@ namespace Content.Server.GameObjects.Components.Items.Storage { EnsureInitialCalculated(); - if (!player.TryGetComponent(out IHandsComponent hands) || + if (!player.TryGetComponent(out IHandsComponent? hands) || hands.GetActiveHand == null) { return false; @@ -317,7 +317,7 @@ namespace Content.Server.GameObjects.Components.Items.Storage private void UpdateDoorState() { - if (Owner.TryGetComponent(out AppearanceComponent appearance)) + if (Owner.TryGetComponent(out AppearanceComponent? appearance)) { appearance.SetData(StorageVisuals.Open, SubscribedSessions.Count != 0); } @@ -382,7 +382,7 @@ namespace Content.Server.GameObjects.Components.Items.Storage var item = entity.GetComponent(); if (item == null || - !player.TryGetComponent(out HandsComponent hands)) + !player.TryGetComponent(out HandsComponent? hands)) { break; } @@ -506,7 +506,7 @@ namespace Content.Server.GameObjects.Components.Items.Storage bool IDragDrop.CanDragDrop(DragDropEventArgs eventArgs) { - return eventArgs.Target.TryGetComponent(out PlaceableSurfaceComponent placeable) && + return eventArgs.Target.TryGetComponent(out PlaceableSurfaceComponent? placeable) && placeable.IsPlaceable; } diff --git a/Content.Server/GameObjects/Components/Mobs/MindComponent.cs b/Content.Server/GameObjects/Components/Mobs/MindComponent.cs index fd2fed7f5f..b5f9eba7e1 100644 --- a/Content.Server/GameObjects/Components/Mobs/MindComponent.cs +++ b/Content.Server/GameObjects/Components/Mobs/MindComponent.cs @@ -79,7 +79,7 @@ namespace Content.Server.GameObjects.Components.Mobs var visiting = Mind?.VisitingEntity; if (visiting != null) { - if (visiting.TryGetComponent(out GhostComponent ghost)) + if (visiting.TryGetComponent(out GhostComponent? ghost)) { ghost.CanReturnToBody = false; } diff --git a/Content.Server/GameObjects/Components/Movement/ShuttleControllerComponent.cs b/Content.Server/GameObjects/Components/Movement/ShuttleControllerComponent.cs index 85bb04b84b..1b39598c2f 100644 --- a/Content.Server/GameObjects/Components/Movement/ShuttleControllerComponent.cs +++ b/Content.Server/GameObjects/Components/Movement/ShuttleControllerComponent.cs @@ -71,7 +71,7 @@ namespace Content.Server.GameObjects.Components.Movement _entityManager.TryGetEntity(grid.GridEntityId, out var gridEntity)) { //TODO: Switch to shuttle component - if (!gridEntity.TryGetComponent(out ICollidableComponent collidable)) + if (!gridEntity.TryGetComponent(out ICollidableComponent? collidable)) { collidable = gridEntity.AddComponent(); collidable.Mass = 1; @@ -137,9 +137,9 @@ namespace Content.Server.GameObjects.Components.Movement private void SetController(IEntity entity) { if (_controller != null || - !entity.TryGetComponent(out MindComponent mind) || + !entity.TryGetComponent(out MindComponent? mind) || mind.Mind == null || - !Owner.TryGetComponent(out ServerStatusEffectsComponent status)) + !Owner.TryGetComponent(out ServerStatusEffectsComponent? status)) { return; } @@ -179,17 +179,17 @@ namespace Content.Server.GameObjects.Components.Movement /// The entity to update private void UpdateRemovedEntity(IEntity entity) { - if (Owner.TryGetComponent(out ServerStatusEffectsComponent status)) + if (Owner.TryGetComponent(out ServerStatusEffectsComponent? status)) { status.RemoveStatusEffect(StatusEffect.Piloting); } - if (entity.TryGetComponent(out MindComponent mind)) + if (entity.TryGetComponent(out MindComponent? mind)) { mind.Mind?.UnVisit(); } - if (entity.TryGetComponent(out BuckleComponent buckle)) + if (entity.TryGetComponent(out BuckleComponent? buckle)) { buckle.TryUnbuckle(entity, true); } diff --git a/Content.Server/GameObjects/Components/PDA/PDAComponent.cs b/Content.Server/GameObjects/Components/PDA/PDAComponent.cs index 91bc92bb3c..1aa9f2f776 100644 --- a/Content.Server/GameObjects/Components/PDA/PDAComponent.cs +++ b/Content.Server/GameObjects/Components/PDA/PDAComponent.cs @@ -164,7 +164,7 @@ namespace Content.Server.GameObjects.Components.PDA void IActivate.Activate(ActivateEventArgs eventArgs) { - if (!eventArgs.User.TryGetComponent(out IActorComponent actor)) + if (!eventArgs.User.TryGetComponent(out IActorComponent? actor)) { return; } @@ -175,7 +175,7 @@ namespace Content.Server.GameObjects.Components.PDA public bool UseEntity(UseEntityEventArgs eventArgs) { - if (!eventArgs.User.TryGetComponent(out IActorComponent actor)) + if (!eventArgs.User.TryGetComponent(out IActorComponent? actor)) { return false; } diff --git a/Content.Server/GameObjects/Components/Pointing/PointingArrowComponent.cs b/Content.Server/GameObjects/Components/Pointing/PointingArrowComponent.cs index 0c95a3d69f..caff655173 100644 --- a/Content.Server/GameObjects/Components/Pointing/PointingArrowComponent.cs +++ b/Content.Server/GameObjects/Components/Pointing/PointingArrowComponent.cs @@ -64,7 +64,7 @@ namespace Content.Server.GameObjects.Components.Pointing { base.Startup(); - if (Owner.TryGetComponent(out SpriteComponent sprite)) + if (Owner.TryGetComponent(out SpriteComponent? sprite)) { sprite.DrawDepth = (int) DrawDepth.Overlays; } diff --git a/Content.Server/GameObjects/Components/Pointing/RoguePointingArrowComponent.cs b/Content.Server/GameObjects/Components/Pointing/RoguePointingArrowComponent.cs index 35706da030..f20f1305d5 100644 --- a/Content.Server/GameObjects/Components/Pointing/RoguePointingArrowComponent.cs +++ b/Content.Server/GameObjects/Components/Pointing/RoguePointingArrowComponent.cs @@ -57,7 +57,7 @@ namespace Content.Server.GameObjects.Components.Pointing private void UpdateAppearance() { if (_chasing == null || - !Owner.TryGetComponent(out AppearanceComponent appearance)) + !Owner.TryGetComponent(out AppearanceComponent? appearance)) { return; } @@ -69,7 +69,7 @@ namespace Content.Server.GameObjects.Components.Pointing { base.Startup(); - if (Owner.TryGetComponent(out SpriteComponent sprite)) + if (Owner.TryGetComponent(out SpriteComponent? sprite)) { sprite.DrawDepth = (int) DrawDepth.Overlays; } diff --git a/Content.Server/GameObjects/Components/Rotatable/FlippableComponent.cs b/Content.Server/GameObjects/Components/Rotatable/FlippableComponent.cs index c986fe04dd..ad524e517c 100644 --- a/Content.Server/GameObjects/Components/Rotatable/FlippableComponent.cs +++ b/Content.Server/GameObjects/Components/Rotatable/FlippableComponent.cs @@ -24,7 +24,7 @@ namespace Content.Server.GameObjects.Components.Rotatable private void TryFlip(IEntity user) { - if (Owner.TryGetComponent(out ICollidableComponent collidable) && + if (Owner.TryGetComponent(out ICollidableComponent? collidable) && collidable.Anchored) { _notifyManager.PopupMessage(Owner.Transform.GridPosition, user, Loc.GetString("It's stuck.")); diff --git a/Content.Server/GameObjects/Components/WiresComponent.cs b/Content.Server/GameObjects/Components/WiresComponent.cs index d8abb14bc7..6867052599 100644 --- a/Content.Server/GameObjects/Components/WiresComponent.cs +++ b/Content.Server/GameObjects/Components/WiresComponent.cs @@ -373,7 +373,7 @@ namespace Content.Server.GameObjects.Components return; } - if (!player.TryGetComponent(out IHandsComponent handsComponent)) + if (!player.TryGetComponent(out IHandsComponent? handsComponent)) { _notifyManager.PopupMessage(Owner.Transform.GridPosition, player, Loc.GetString("You have no hands.")); diff --git a/Content.Server/GameObjects/EntitySystems/Atmos/GasTileOverlaySystem.cs b/Content.Server/GameObjects/EntitySystems/Atmos/GasTileOverlaySystem.cs index 456bb14293..f1cb864dbd 100644 --- a/Content.Server/GameObjects/EntitySystems/Atmos/GasTileOverlaySystem.cs +++ b/Content.Server/GameObjects/EntitySystems/Atmos/GasTileOverlaySystem.cs @@ -30,19 +30,19 @@ namespace Content.Server.GameObjects.EntitySystems.Atmos [Robust.Shared.IoC.Dependency] private readonly IPlayerManager _playerManager = default!; [Robust.Shared.IoC.Dependency] private readonly IMapManager _mapManager = default!; [Robust.Shared.IoC.Dependency] private readonly IConfigurationManager _configManager = default!; - + /// /// The tiles that have had their atmos data updated since last tick /// private Dictionary> _invalidTiles = new Dictionary>(); - - private Dictionary _knownPlayerChunks = + + private Dictionary _knownPlayerChunks = new Dictionary(); - + /// /// Gas data stored in chunks to make PVS / bubbling easier. /// - private Dictionary> _overlay = + private Dictionary> _overlay = new Dictionary>(); /// @@ -52,7 +52,7 @@ namespace Content.Server.GameObjects.EntitySystems.Atmos // Because the gas overlay updates aren't run every tick we need to avoid the pop-in that might occur with // the regular PVS range. private const float RangeOffset = 6.0f; - + /// /// Overlay update ticks per second. /// @@ -164,7 +164,7 @@ namespace Content.Server.GameObjects.EntitySystems.Atmos var moles = tile.Air.Gases[i]; if (moles < gas.GasMolesVisible) continue; - + var data = new GasData(i, (byte) (FloatMath.Clamp01(moles / gas.GasMolesVisibleMax) * 255)); tileData.Add(data); } @@ -175,7 +175,7 @@ namespace Content.Server.GameObjects.EntitySystems.Atmos { return false; } - + return true; } @@ -187,10 +187,10 @@ namespace Content.Server.GameObjects.EntitySystems.Atmos private List GetChunksInRange(IEntity entity) { var inRange = new List(); - + // This is the max in any direction that we can get a chunk (e.g. max 2 chunks away of data). var (maxXDiff, maxYDiff) = ((int) (_updateRange / ChunkSize) + 1, (int) (_updateRange / ChunkSize) + 1); - + var worldBounds = Box2.CenteredAround(entity.Transform.WorldPosition, new Vector2(_updateRange, _updateRange)); @@ -202,7 +202,7 @@ namespace Content.Server.GameObjects.EntitySystems.Atmos } var entityTile = grid.GetTileRef(entity.Transform.GridPosition).GridIndices; - + for (var x = -maxXDiff; x <= maxXDiff; x++) { for (var y = -maxYDiff; y <= maxYDiff; y++) @@ -210,7 +210,7 @@ namespace Content.Server.GameObjects.EntitySystems.Atmos var chunkIndices = GetGasChunkIndices(new MapIndices(entityTile.X + x * ChunkSize, entityTile.Y + y * ChunkSize)); if (!chunks.TryGetValue(chunkIndices, out var chunk)) continue; - + // Now we'll check if it's in range and relevant for us // (e.g. if we're on the very edge of a chunk we may need more chunks). @@ -219,7 +219,7 @@ namespace Content.Server.GameObjects.EntitySystems.Atmos yDiff > 0 && yDiff > _updateRange || xDiff < 0 && Math.Abs(xDiff + ChunkSize) > _updateRange || yDiff < 0 && Math.Abs(yDiff + ChunkSize) > _updateRange) continue; - + inRange.Add(chunk); } } @@ -237,25 +237,25 @@ namespace Content.Server.GameObjects.EntitySystems.Atmos { return; } - + _updateRange = _configManager.GetCVar("net.maxupdaterange") + RangeOffset; - + // TODO: So in the worst case scenario we still have to send a LOT of tile data per tick if there's a fire. // If we go with say 15 tile radius then we have up to 900 tiles to update per tick. // In a saltern fire the worst you'll normally see is around 650 at the moment. // Need a way to fake this more because sending almost 2,000 tile updates per second to even 50 players is... yikes // I mean that's as big as it gets so larger maps will have the same but still, that's a lot of data. - + // Some ways to do this are potentially: splitting fire and gas update data so they don't update at the same time // (gives the illusion of more updates happening), e.g. if gas updates are 3 times a second and fires are 1.6 times a second or something. // Could also look at updating tiles close to us more frequently (e.g. within 1 chunk every tick). // Stuff just out of our viewport we need so when we move it doesn't pop in but it doesn't mean we need to update it every tick. - + AccumulatedFrameTime -= _updateCooldown; var gridAtmosComponents = new Dictionary(); var updatedTiles = new Dictionary>(); - + // So up to this point we've been caching the updated tiles for multiple ticks. // Now we'll go through and check whether the update actually matters for the overlay or not, // and if not then we won't bother sending the data. @@ -263,7 +263,7 @@ namespace Content.Server.GameObjects.EntitySystems.Atmos { var gridEntityId = _mapManager.GetGrid(gridId).GridEntityId; - if (!EntityManager.GetEntity(gridEntityId).TryGetComponent(out GridAtmosphereComponent gam)) + if (!EntityManager.GetEntity(gridEntityId).TryGetComponent(out GridAtmosphereComponent? gam)) { continue; } @@ -286,7 +286,7 @@ namespace Content.Server.GameObjects.EntitySystems.Atmos tiles = new HashSet(); updatedTiles[chunk] = tiles; } - + updatedTiles[chunk].Add(invalid); chunk.Update(data, invalid); } @@ -306,13 +306,13 @@ namespace Content.Server.GameObjects.EntitySystems.Atmos foreach (var (session, overlay) in _knownPlayerChunks) { if (session.AttachedEntity == null) continue; - + // Get chunks in range and update if we've moved around or the chunks have new overlay data var chunksInRange = GetChunksInRange(session.AttachedEntity); var knownChunks = overlay.GetKnownChunks(); var chunksToRemove = new List(); var chunksToAdd = new List(); - + foreach (var chunk in chunksInRange) { if (!knownChunks.Contains(chunk)) @@ -328,7 +328,7 @@ namespace Content.Server.GameObjects.EntitySystems.Atmos chunksToRemove.Add(chunk); } } - + foreach (var chunk in chunksToAdd) { var message = overlay.AddChunk(currentTick, chunk); @@ -342,7 +342,7 @@ namespace Content.Server.GameObjects.EntitySystems.Atmos { overlay.RemoveChunk(chunk); } - + var clientInvalids = new Dictionary>(); // Check for any dirty chunks in range and bundle the data to send to the client. @@ -355,7 +355,7 @@ namespace Content.Server.GameObjects.EntitySystems.Atmos existingData = new List<(MapIndices, GasOverlayData)>(); clientInvalids[chunk.GridIndices] = existingData; } - + chunk.GetData(existingData, invalids); } @@ -370,10 +370,10 @@ namespace Content.Server.GameObjects.EntitySystems.Atmos } private sealed class PlayerGasOverlay { - private readonly Dictionary> _data = + private readonly Dictionary> _data = new Dictionary>(); - - private readonly Dictionary _lastSent = + + private readonly Dictionary _lastSent = new Dictionary(); public GasOverlayMessage UpdateClient(GridId grid, List<(MapIndices, GasOverlayData)> data) @@ -386,11 +386,11 @@ namespace Content.Server.GameObjects.EntitySystems.Atmos _data.Clear(); _lastSent.Clear(); } - + public List GetKnownChunks() { var known = new List(); - + foreach (var (_, chunks) in _data) { foreach (var (_, chunk) in chunks) @@ -414,7 +414,7 @@ namespace Content.Server.GameObjects.EntitySystems.Atmos { return null; } - + _lastSent[chunk] = currentTick; var message = ChunkToMessage(chunk); @@ -444,7 +444,7 @@ namespace Content.Server.GameObjects.EntitySystems.Atmos { // Chunk data should already be up to date. // Only send relevant tiles to client. - + var tileData = new List<(MapIndices, GasOverlayData)>(); for (var x = 0; x < ChunkSize; x++) @@ -467,7 +467,7 @@ namespace Content.Server.GameObjects.EntitySystems.Atmos { return null; } - + return new GasOverlayMessage(chunk.GridIndices, tileData); } } diff --git a/Content.Server/GameObjects/EntitySystems/AtmosphereSystem.cs b/Content.Server/GameObjects/EntitySystems/AtmosphereSystem.cs index 327104a148..a5ffa6e9ce 100644 --- a/Content.Server/GameObjects/EntitySystems/AtmosphereSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/AtmosphereSystem.cs @@ -34,7 +34,7 @@ namespace Content.Server.GameObjects.EntitySystems if (!EntityManager.TryGetEntity(grid.GridEntityId, out var gridEnt)) return null; - return gridEnt.TryGetComponent(out IGridAtmosphereComponent atmos) ? atmos : null; + return gridEnt.TryGetComponent(out IGridAtmosphereComponent? atmos) ? atmos : null; } public override void Update(float frameTime) diff --git a/Content.Server/GameObjects/EntitySystems/DoAfter/DoAfter.cs b/Content.Server/GameObjects/EntitySystems/DoAfter/DoAfter.cs index 3e00f334fd..2f45195624 100644 --- a/Content.Server/GameObjects/EntitySystems/DoAfter/DoAfter.cs +++ b/Content.Server/GameObjects/EntitySystems/DoAfter/DoAfter.cs @@ -54,7 +54,7 @@ namespace Content.Server.GameObjects.EntitySystems.DoAfter // For this we need to stay on the same hand slot and need the same item in that hand slot // (or if there is no item there we need to keep it free). - if (eventArgs.NeedHand && eventArgs.User.TryGetComponent(out HandsComponent handsComponent)) + if (eventArgs.NeedHand && eventArgs.User.TryGetComponent(out HandsComponent? handsComponent)) { _activeHand = handsComponent.ActiveHand; _activeItem = handsComponent.GetActiveHand; @@ -126,7 +126,7 @@ namespace Content.Server.GameObjects.EntitySystems.DoAfter } if (EventArgs.BreakOnStun && - EventArgs.User.TryGetComponent(out StunnableComponent stunnableComponent) && + EventArgs.User.TryGetComponent(out StunnableComponent? stunnableComponent) && stunnableComponent.Stunned) { return true; @@ -134,7 +134,7 @@ namespace Content.Server.GameObjects.EntitySystems.DoAfter if (EventArgs.NeedHand) { - if (!EventArgs.User.TryGetComponent(out HandsComponent handsComponent)) + if (!EventArgs.User.TryGetComponent(out HandsComponent? handsComponent)) { // If we had a hand but no longer have it that's still a paddlin' if (_activeHand != null) diff --git a/Content.Server/GameObjects/EntitySystems/MoverSystem.cs b/Content.Server/GameObjects/EntitySystems/MoverSystem.cs index 84250d4e91..41ded38a03 100644 --- a/Content.Server/GameObjects/EntitySystems/MoverSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/MoverSystem.cs @@ -83,7 +83,7 @@ namespace Content.Server.GameObjects.EntitySystems ev.Entity.RemoveComponent(); } - if (ev.Entity.TryGetComponent(out ICollidableComponent physics) && + if (ev.Entity.TryGetComponent(out ICollidableComponent? physics) && physics.TryGetController(out MoverController controller)) { controller.StopMoving(); diff --git a/Content.Server/GameObjects/EntitySystems/PointingSystem.cs b/Content.Server/GameObjects/EntitySystems/PointingSystem.cs index d27857954f..28efbd4f8a 100644 --- a/Content.Server/GameObjects/EntitySystems/PointingSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/PointingSystem.cs @@ -116,7 +116,7 @@ namespace Content.Server.GameObjects.EntitySystems var arrow = EntityManager.SpawnEntity("pointingarrow", coords); - if (player.TryGetComponent(out VisibilityComponent playerVisibility)) + if (player.TryGetComponent(out VisibilityComponent? playerVisibility)) { var arrowVisibility = arrow.EnsureComponent(); arrowVisibility.Layer = playerVisibility.Layer; diff --git a/Content.Shared/GameObjects/Components/Movement/SharedPlayerInputMoverComponent.cs b/Content.Shared/GameObjects/Components/Movement/SharedPlayerInputMoverComponent.cs index 6d47299c4d..a3b3794d3e 100644 --- a/Content.Shared/GameObjects/Components/Movement/SharedPlayerInputMoverComponent.cs +++ b/Content.Shared/GameObjects/Components/Movement/SharedPlayerInputMoverComponent.cs @@ -56,7 +56,7 @@ namespace Content.Shared.GameObjects.Components.Movement { get { - if (Owner.TryGetComponent(out MovementSpeedModifierComponent component)) + if (Owner.TryGetComponent(out MovementSpeedModifierComponent? component)) { return component.CurrentWalkSpeed; } @@ -69,7 +69,7 @@ namespace Content.Shared.GameObjects.Components.Movement { get { - if (Owner.TryGetComponent(out MovementSpeedModifierComponent component)) + if (Owner.TryGetComponent(out MovementSpeedModifierComponent? component)) { return component.CurrentSprintSpeed; } diff --git a/Content.Shared/GameObjects/EntitySystems/SharedMoverSystem.cs b/Content.Shared/GameObjects/EntitySystems/SharedMoverSystem.cs index 49f77ad735..57c66cb3f5 100644 --- a/Content.Shared/GameObjects/EntitySystems/SharedMoverSystem.cs +++ b/Content.Shared/GameObjects/EntitySystems/SharedMoverSystem.cs @@ -179,7 +179,7 @@ namespace Content.Shared.GameObjects.EntitySystems } private static bool TryGetAttachedComponent(ICommonSession? session, [MaybeNullWhen(false)] out T component) - where T : IComponent + where T : class, IComponent { component = default; @@ -188,7 +188,7 @@ namespace Content.Shared.GameObjects.EntitySystems if (ent == null || !ent.IsValid()) return false; - if (!ent.TryGetComponent(out T comp)) + if (!ent.TryGetComponent(out T? comp)) return false; component = comp; From de61a01703860fc448611e496ff0b579bf3b2db5 Mon Sep 17 00:00:00 2001 From: Visne <39844191+Visne@users.noreply.github.com> Date: Thu, 20 Aug 2020 16:59:59 +0200 Subject: [PATCH 73/81] Fix HasGameRule bug (#1819) --- Content.Server/GameTicking/GameTicker.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/GameTicking/GameTicker.cs b/Content.Server/GameTicking/GameTicker.cs index 34d40c8df3..62d6dfa1a6 100644 --- a/Content.Server/GameTicking/GameTicker.cs +++ b/Content.Server/GameTicking/GameTicker.cs @@ -412,7 +412,7 @@ namespace Content.Server.GameTicking public bool HasGameRule(Type t) { - if (t == null || !t.IsAssignableFrom(typeof(GameRule))) + if (t == null || !typeof(GameRule).IsAssignableFrom(t)) return false; foreach (var rule in _gameRules) From 9e7d698145612ca02658e0ea218de4317db8bf6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Aguilera=20Puerto?= <6766154+Zumorica@users.noreply.github.com> Date: Thu, 20 Aug 2020 18:09:29 +0200 Subject: [PATCH 74/81] Allow specifying a text to be shown to players in the summary when ending the round. (#1818) * Allow specifying a text to be shown to players when ending the round. Also sets text * Fix comment --- .../GameTicking/ClientGameTicker.cs | 2 +- .../UserInterface/RoundEndSummaryWindow.cs | 10 +++++- Content.IntegrationTests/DummyGameTicker.cs | 2 +- .../GameTicking/GameRules/RuleSuspicion.cs | 36 +++++++++++++++---- Content.Server/GameTicking/GameTicker.cs | 3 +- .../Interfaces/GameTicking/IGameTicker.cs | 2 +- Content.Shared/SharedGameTicker.cs | 3 ++ 7 files changed, 47 insertions(+), 11 deletions(-) diff --git a/Content.Client/GameTicking/ClientGameTicker.cs b/Content.Client/GameTicking/ClientGameTicker.cs index d618046255..1ae8bcd8a7 100644 --- a/Content.Client/GameTicking/ClientGameTicker.cs +++ b/Content.Client/GameTicking/ClientGameTicker.cs @@ -113,7 +113,7 @@ namespace Content.Client.GameTicking private void RoundEnd(MsgRoundEndMessage message) { //This is not ideal at all, but I don't see an immediately better fit anywhere else. - var roundEnd = new RoundEndSummaryWindow(message.GamemodeTitle, message.RoundDuration, message.AllPlayersEndInfo); + var roundEnd = new RoundEndSummaryWindow(message.GamemodeTitle, message.RoundEndText, message.RoundDuration, message.AllPlayersEndInfo); } } diff --git a/Content.Client/UserInterface/RoundEndSummaryWindow.cs b/Content.Client/UserInterface/RoundEndSummaryWindow.cs index 550c48032f..8d40c0b8ba 100644 --- a/Content.Client/UserInterface/RoundEndSummaryWindow.cs +++ b/Content.Client/UserInterface/RoundEndSummaryWindow.cs @@ -18,7 +18,7 @@ namespace Content.Client.UserInterface private TabContainer RoundEndWindowTabs { get; } protected override Vector2? CustomSize => (520, 580); - public RoundEndSummaryWindow(string gm, TimeSpan roundTimeSpan, List info) + public RoundEndSummaryWindow(string gm, string roundEnd, TimeSpan roundTimeSpan, List info) { Title = Loc.GetString("Round End Summary"); @@ -50,6 +50,14 @@ namespace Content.Client.UserInterface gamemodeLabel.SetMarkup(Loc.GetString("Round of [color=white]{0}[/color] has ended.", gm)); RoundEndSummaryTab.AddChild(gamemodeLabel); + //Round end text + if (!string.IsNullOrEmpty(roundEnd)) + { + var roundendLabel = new RichTextLabel(); + roundendLabel.SetMarkup(Loc.GetString(roundEnd)); + RoundEndSummaryTab.AddChild(roundendLabel); + } + //Duration var roundTimeLabel = new RichTextLabel(); roundTimeLabel.SetMarkup(Loc.GetString("It lasted for [color=yellow]{0} hours, {1} minutes, and {2} seconds.", diff --git a/Content.IntegrationTests/DummyGameTicker.cs b/Content.IntegrationTests/DummyGameTicker.cs index f135339c75..afe44ed8ff 100644 --- a/Content.IntegrationTests/DummyGameTicker.cs +++ b/Content.IntegrationTests/DummyGameTicker.cs @@ -41,7 +41,7 @@ namespace Content.IntegrationTests { } - public void EndRound() + public void EndRound(string roundEnd) { } diff --git a/Content.Server/GameTicking/GameRules/RuleSuspicion.cs b/Content.Server/GameTicking/GameRules/RuleSuspicion.cs index 553df745a2..026c11516a 100644 --- a/Content.Server/GameTicking/GameRules/RuleSuspicion.cs +++ b/Content.Server/GameTicking/GameRules/RuleSuspicion.cs @@ -1,5 +1,6 @@ using System; using System.Threading; +using Content.Server.GameObjects.Components.Suspicion; using Content.Server.Interfaces.Chat; using Content.Server.Interfaces.GameTicking; using Content.Server.Mobs.Roles; @@ -50,7 +51,8 @@ namespace Content.Server.GameTicking.GameRules foreach (var playerSession in _playerManager.GetAllPlayers()) { if (playerSession.AttachedEntity == null - || !playerSession.AttachedEntity.TryGetComponent(out IDamageableComponent damageable)) + || !playerSession.AttachedEntity.TryGetComponent(out IDamageableComponent damageable) + || !playerSession.AttachedEntity.TryGetComponent(out SuspicionRoleComponent suspicionRole)) { continue; } @@ -69,24 +71,46 @@ namespace Content.Server.GameTicking.GameRules if ((innocentsAlive + traitorsAlive) == 0) { _chatManager.DispatchServerAnnouncement("Everybody is dead, it's a stalemate!"); - EndRound(); + EndRound(Victory.Stalemate); } else if (traitorsAlive == 0) { _chatManager.DispatchServerAnnouncement("The traitors are dead! The innocents win."); - EndRound(); + EndRound(Victory.Innocents); } else if (innocentsAlive == 0) { _chatManager.DispatchServerAnnouncement("The innocents are dead! The traitors win."); - EndRound(); + EndRound(Victory.Traitors); } } - private void EndRound() + private enum Victory { - _gameTicker.EndRound(); + Stalemate, + Innocents, + Traitors + } + + private void EndRound(Victory victory) + { + string text; + + switch (victory) + { + case Victory.Innocents: + text = "The innocents have won!"; + break; + case Victory.Traitors: + text = "The traitors have won!"; + break; + default: + text = "Nobody wins!"; + break; + } + + _gameTicker.EndRound(text); _chatManager.DispatchServerAnnouncement($"Restarting in 10 seconds."); _checkTimerCancel.Cancel(); Timer.Spawn(TimeSpan.FromSeconds(10), () => _gameTicker.RestartRound()); diff --git a/Content.Server/GameTicking/GameTicker.cs b/Content.Server/GameTicking/GameTicker.cs index 62d6dfa1a6..6ff0061c25 100644 --- a/Content.Server/GameTicking/GameTicker.cs +++ b/Content.Server/GameTicking/GameTicker.cs @@ -326,7 +326,7 @@ namespace Content.Server.GameTicking (HumanoidCharacterProfile) (await _prefsManager.GetPreferencesAsync(p.SessionId.Username)) .SelectedCharacter; - public void EndRound() + public void EndRound(string roundEndText = "") { DebugTools.Assert(RunLevel == GameRunLevel.InRound); Logger.InfoS("ticker", "Ending round!"); @@ -336,6 +336,7 @@ namespace Content.Server.GameTicking //Tell every client the round has ended. var roundEndMessage = _netManager.CreateNetMessage(); roundEndMessage.GamemodeTitle = MakeGamePreset(null).ModeTitle; + roundEndMessage.RoundEndText = roundEndText; //Get the timespan of the round. roundEndMessage.RoundDuration = IoCManager.Resolve().RealTime.Subtract(_roundStartTimeSpan); diff --git a/Content.Server/Interfaces/GameTicking/IGameTicker.cs b/Content.Server/Interfaces/GameTicking/IGameTicker.cs index 6ec11e8421..a4e045e2ee 100644 --- a/Content.Server/Interfaces/GameTicking/IGameTicker.cs +++ b/Content.Server/Interfaces/GameTicking/IGameTicker.cs @@ -22,7 +22,7 @@ namespace Content.Server.Interfaces.GameTicking void RestartRound(); void StartRound(bool force = false); - void EndRound(); + void EndRound(string roundEndText = ""); void Respawn(IPlayerSession targetPlayer); void MakeObserve(IPlayerSession player); diff --git a/Content.Shared/SharedGameTicker.cs b/Content.Shared/SharedGameTicker.cs index e180ddb198..d29cc0f84e 100644 --- a/Content.Shared/SharedGameTicker.cs +++ b/Content.Shared/SharedGameTicker.cs @@ -253,6 +253,7 @@ namespace Content.Shared #endregion public string GamemodeTitle; + public string RoundEndText; public TimeSpan RoundDuration; @@ -263,6 +264,7 @@ namespace Content.Shared public override void ReadFromBuffer(NetIncomingMessage buffer) { GamemodeTitle = buffer.ReadString(); + RoundEndText = buffer.ReadString(); var hours = buffer.ReadInt32(); var mins = buffer.ReadInt32(); @@ -289,6 +291,7 @@ namespace Content.Shared public override void WriteToBuffer(NetOutgoingMessage buffer) { buffer.Write(GamemodeTitle); + buffer.Write(RoundEndText); buffer.Write(RoundDuration.Hours); buffer.Write(RoundDuration.Minutes); buffer.Write(RoundDuration.Seconds); From 3203fdfb7ffd3aa6f2580409191a40c80dea8f92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Aguilera=20Puerto?= Date: Thu, 20 Aug 2020 18:18:42 +0200 Subject: [PATCH 75/81] Fix fallback preset DisallowLateJoin not being taken into account --- Content.Server/GameTicking/GameTicker.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Content.Server/GameTicking/GameTicker.cs b/Content.Server/GameTicking/GameTicker.cs index 6ff0061c25..49fb6c7157 100644 --- a/Content.Server/GameTicking/GameTicker.cs +++ b/Content.Server/GameTicking/GameTicker.cs @@ -300,6 +300,9 @@ namespace Content.Server.GameTicking { throw new ApplicationException("Fallback preset failed to start!"); } + + DisallowLateJoin = false; + DisallowLateJoin |= newPreset.DisallowLateJoin; } _roundStartTimeSpan = IoCManager.Resolve().RealTime; From 496b456120b75b0e2da8d2dda95ff15d0abddbbf Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Thu, 20 Aug 2020 18:46:46 +0200 Subject: [PATCH 76/81] Use in-memory SQLite prefs DB when UserData is virtual. --- Content.Server.Database/Configuration.cs | 23 +++++++++++++++---- .../Preferences/ServerPreferencesManager.cs | 8 +++---- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/Content.Server.Database/Configuration.cs b/Content.Server.Database/Configuration.cs index 1541b42ed8..6db9a594d3 100644 --- a/Content.Server.Database/Configuration.cs +++ b/Content.Server.Database/Configuration.cs @@ -1,4 +1,5 @@ -using Microsoft.EntityFrameworkCore; +using Microsoft.Data.Sqlite; +using Microsoft.EntityFrameworkCore; using Npgsql; namespace Content.Server.Database @@ -50,9 +51,10 @@ namespace Content.Server.Database public class SqliteConfiguration : IDatabaseConfiguration { - private readonly string _databaseFilePath; + private readonly string? _databaseFilePath; - public SqliteConfiguration(string databaseFilePath) + /// If null, an in-memory database is used. + public SqliteConfiguration(string? databaseFilePath) { _databaseFilePath = databaseFilePath; } @@ -62,7 +64,20 @@ namespace Content.Server.Database get { var optionsBuilder = new DbContextOptionsBuilder(); - optionsBuilder.UseSqlite($"Data Source={_databaseFilePath}"); + SqliteConnection connection; + if (_databaseFilePath != null) + { + connection = new SqliteConnection($"Data Source={_databaseFilePath}"); + } + else + { + connection = new SqliteConnection("Data Source=:memory:"); + // When using an in-memory DB we have to open it manually + // so EFCore doesn't open, close and wipe it. + connection.Open(); + } + + optionsBuilder.UseSqlite(connection); return optionsBuilder.Options; } } diff --git a/Content.Server/Preferences/ServerPreferencesManager.cs b/Content.Server/Preferences/ServerPreferencesManager.cs index 9b10a7e725..ac9e944f56 100644 --- a/Content.Server/Preferences/ServerPreferencesManager.cs +++ b/Content.Server/Preferences/ServerPreferencesManager.cs @@ -50,11 +50,11 @@ namespace Content.Server.Preferences { case "sqlite": var configPreferencesDbPath = _configuration.GetCVar("database.prefs_sqlite_dbpath"); - var finalPreferencesDbPath = + var inMemory = _resourceManager.UserData.RootDir == null; + var finalPreferencesDbPath = inMemory ? + null : Path.Combine(_resourceManager.UserData.RootDir, configPreferencesDbPath); - dbConfig = new SqliteConfiguration( - finalPreferencesDbPath - ); + dbConfig = new SqliteConfiguration(finalPreferencesDbPath); break; case "postgres": dbConfig = new PostgresConfiguration( From 4cb00400452d95764a793f1afae7c2e7003765c9 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Thu, 20 Aug 2020 18:47:16 +0200 Subject: [PATCH 77/81] Fix some UserData file system usage inconsistencies with map save tests. --- Content.IntegrationTests/Tests/SaveLoadMapTest.cs | 9 ++++++++- Content.IntegrationTests/Tests/SaveLoadSaveTest.cs | 10 +++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/Content.IntegrationTests/Tests/SaveLoadMapTest.cs b/Content.IntegrationTests/Tests/SaveLoadMapTest.cs index 05c3a6f243..e6c685285c 100644 --- a/Content.IntegrationTests/Tests/SaveLoadMapTest.cs +++ b/Content.IntegrationTests/Tests/SaveLoadMapTest.cs @@ -3,8 +3,11 @@ using NUnit.Framework; using Robust.Server.Interfaces.Maps; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.Map; +using Robust.Shared.Interfaces.Resources; +using Robust.Shared.IoC; using Robust.Shared.Map; using Robust.Shared.Maths; +using Robust.Shared.Utility; namespace Content.IntegrationTests.Tests { @@ -14,7 +17,7 @@ namespace Content.IntegrationTests.Tests [Test] public async Task SaveLoadMultiGridMap() { - const string mapPath = @"Maps/Test/TestMap.yml"; + const string mapPath = @"/Maps/Test/TestMap.yml"; var server = StartServer(); await server.WaitIdleAsync(); @@ -24,6 +27,10 @@ namespace Content.IntegrationTests.Tests server.Post(() => { + var dir = new ResourcePath(mapPath).Directory; + IoCManager.Resolve() + .UserData.CreateDir(dir); + var mapId = mapManager.CreateMap(new MapId(5)); { diff --git a/Content.IntegrationTests/Tests/SaveLoadSaveTest.cs b/Content.IntegrationTests/Tests/SaveLoadSaveTest.cs index d462beb279..cb4a8d3ea4 100644 --- a/Content.IntegrationTests/Tests/SaveLoadSaveTest.cs +++ b/Content.IntegrationTests/Tests/SaveLoadSaveTest.cs @@ -38,14 +38,14 @@ namespace Content.IntegrationTests.Tests string one; string two; - var rp1 = new ResourcePath("save load save 1.yml"); + var rp1 = new ResourcePath("/save load save 1.yml"); using (var stream = userData.Open(rp1, FileMode.Open)) using (var reader = new StreamReader(stream)) { one = reader.ReadToEnd(); } - var rp2 = new ResourcePath("save load save 2.yml"); + var rp2 = new ResourcePath("/save load save 2.yml"); using (var stream = userData.Open(rp2, FileMode.Open)) using (var reader = new StreamReader(stream)) { @@ -96,7 +96,7 @@ namespace Content.IntegrationTests.Tests server.Post(() => { - mapLoader.SaveBlueprint(grid.Index, "load save ticks save 2.yml"); + mapLoader.SaveBlueprint(grid.Index, "/load save ticks save 2.yml"); }); await server.WaitIdleAsync(); @@ -105,13 +105,13 @@ namespace Content.IntegrationTests.Tests string one; string two; - using (var stream = userData.Open(new ResourcePath("load save ticks save 1.yml"), FileMode.Open)) + using (var stream = userData.Open(new ResourcePath("/load save ticks save 1.yml"), FileMode.Open)) using (var reader = new StreamReader(stream)) { one = reader.ReadToEnd(); } - using (var stream = userData.Open(new ResourcePath("load save ticks save 2.yml"), FileMode.Open)) + using (var stream = userData.Open(new ResourcePath("/load save ticks save 2.yml"), FileMode.Open)) using (var reader = new StreamReader(stream)) { two = reader.ReadToEnd(); From f57269c5dc1cddab5ee3619cd13b7dc9b560b528 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Thu, 20 Aug 2020 19:22:23 +0200 Subject: [PATCH 78/81] Update submodule. --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index d4fc0517c4..9d1bec9bb2 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit d4fc0517c4d7bc4c86416da065a2bcb37591a8c9 +Subproject commit 9d1bec9bb253f3de029e836d5d342073541d2b48 From 75a7223aa16035a5054d544c2ef46afef54e28db Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Thu, 20 Aug 2020 19:23:16 +0200 Subject: [PATCH 79/81] Integration tests go brrrr --- Content.IntegrationTests/ContentIntegrationTest.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Content.IntegrationTests/ContentIntegrationTest.cs b/Content.IntegrationTests/ContentIntegrationTest.cs index 1970ba9ee7..023cf5fe0f 100644 --- a/Content.IntegrationTests/ContentIntegrationTest.cs +++ b/Content.IntegrationTests/ContentIntegrationTest.cs @@ -4,6 +4,7 @@ using Content.Client; using Content.Client.Interfaces.Parallax; using Content.Server; using Content.Server.Interfaces.GameTicking; +using NUnit.Framework; using Robust.Shared.ContentPack; using Robust.Shared.Interfaces.Network; using Robust.Shared.IoC; @@ -12,6 +13,7 @@ using EntryPoint = Content.Client.EntryPoint; namespace Content.IntegrationTests { + [Parallelizable(ParallelScope.All)] public abstract class ContentIntegrationTest : RobustIntegrationTest { protected sealed override ClientIntegrationInstance StartClient(ClientIntegrationOptions options = null) From ca5002981d026d50dc636e1f2b62af93ad05b9da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Aguilera=20Puerto?= Date: Thu, 20 Aug 2020 20:21:25 +0200 Subject: [PATCH 80/81] Downgrade submodule. --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index 9d1bec9bb2..31ff253fc0 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 9d1bec9bb253f3de029e836d5d342073541d2b48 +Subproject commit 31ff253fc04456bf750d33808e6ab581dfbca83a From 7575e143f64bc531617b5f6e9a65c1bfe4ecdc05 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Thu, 20 Aug 2020 20:32:05 +0200 Subject: [PATCH 81/81] Update submodule again --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index 31ff253fc0..0d7e6a8e1c 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 31ff253fc04456bf750d33808e6ab581dfbca83a +Subproject commit 0d7e6a8e1cbc4931ebfd939cdcbdd42d876ad89b