From 31e0dfc10cdcaead9fef5a11f983b38f34d7af3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADctor=20Aguilera=20Puerto?= <6766154+Zumorica@users.noreply.github.com> Date: Tue, 22 Sep 2020 15:40:04 +0200 Subject: [PATCH] Adds FlammableComponent, humans can now catch on fire. (#2115) --- .../Components/Atmos/FireVisualizer.cs | 68 +++++ Content.Server/Atmos/FireEvent.cs | 11 +- Content.Server/Atmos/GasMixture.cs | 2 +- Content.Server/Atmos/ITemperatureExpose.cs | 10 + .../Atmos/Reactions/GasReactionPrototype.cs | 5 +- .../Atmos/Reactions/PhoronFireReaction.cs | 14 +- .../Atmos/Reactions/TritiumFireReaction.cs | 14 +- .../Atmos/TemperatureExposeEvent.cs | 23 -- Content.Server/Atmos/TileAtmosphere.cs | 10 +- .../Components/Atmos/AtmosExposedComponent.cs | 8 +- .../Components/Atmos/FlammableComponent.cs | 237 ++++++++++++++++++ .../Mobs/ServerStatusEffectsComponent.cs | 15 +- .../Temperature/TemperatureComponent.cs | 44 +++- .../EntitySystems/AtmosExposedSystem.cs | 5 +- .../EntitySystems/AtmosphereSystem.cs | 5 + .../Interfaces/IGasReactionEffect.cs | 3 +- .../Atmos/SharedFlammableComponent.cs | 18 ++ .../Mobs/SharedStatusEffectsComponent.cs | 2 + .../Movement/SharedSlipperyComponent.cs | 1 + .../Appearance/HumanoidCharacterAppearance.cs | 3 +- .../Entities/Mobs/Species/human.yml | 11 + .../Interface/StatusEffects/Fire/fire.png | Bin 0 -> 414 bytes .../StatusEffects/Temperature/cold1.png | Bin 0 -> 396 bytes .../StatusEffects/Temperature/cold2.png | Bin 0 -> 388 bytes .../StatusEffects/Temperature/cold3.png | Bin 0 -> 3295 bytes .../StatusEffects/Temperature/hot1.png | Bin 0 -> 365 bytes .../StatusEffects/Temperature/hot2.png | Bin 0 -> 333 bytes .../StatusEffects/Temperature/hot3.png | Bin 0 -> 3121 bytes .../onfire.rsi/Generic_mob_burning.png | Bin 0 -> 1915 bytes .../Effects/onfire.rsi/Monkey_burning.png | Bin 0 -> 3872 bytes .../Mobs/Effects/onfire.rsi/Standing.png | Bin 0 -> 4989 bytes .../Mobs/Effects/onfire.rsi/meta.json | 1 + SpaceStation14.sln.DotSettings | 1 + 33 files changed, 457 insertions(+), 54 deletions(-) create mode 100644 Content.Client/GameObjects/Components/Atmos/FireVisualizer.cs create mode 100644 Content.Server/Atmos/ITemperatureExpose.cs delete mode 100644 Content.Server/Atmos/TemperatureExposeEvent.cs create mode 100644 Content.Server/GameObjects/Components/Atmos/FlammableComponent.cs create mode 100644 Content.Shared/GameObjects/Components/Atmos/SharedFlammableComponent.cs create mode 100644 Resources/Textures/Interface/StatusEffects/Fire/fire.png create mode 100644 Resources/Textures/Interface/StatusEffects/Temperature/cold1.png create mode 100644 Resources/Textures/Interface/StatusEffects/Temperature/cold2.png create mode 100644 Resources/Textures/Interface/StatusEffects/Temperature/cold3.png create mode 100644 Resources/Textures/Interface/StatusEffects/Temperature/hot1.png create mode 100644 Resources/Textures/Interface/StatusEffects/Temperature/hot2.png create mode 100644 Resources/Textures/Interface/StatusEffects/Temperature/hot3.png create mode 100644 Resources/Textures/Mobs/Effects/onfire.rsi/Generic_mob_burning.png create mode 100644 Resources/Textures/Mobs/Effects/onfire.rsi/Monkey_burning.png create mode 100644 Resources/Textures/Mobs/Effects/onfire.rsi/Standing.png create mode 100644 Resources/Textures/Mobs/Effects/onfire.rsi/meta.json diff --git a/Content.Client/GameObjects/Components/Atmos/FireVisualizer.cs b/Content.Client/GameObjects/Components/Atmos/FireVisualizer.cs new file mode 100644 index 0000000000..3ca9ed4388 --- /dev/null +++ b/Content.Client/GameObjects/Components/Atmos/FireVisualizer.cs @@ -0,0 +1,68 @@ +using System; +using Content.Shared.GameObjects.Components.Atmos; +using Robust.Client.GameObjects; +using Robust.Client.Interfaces.GameObjects.Components; +using Robust.Shared.Utility; +using YamlDotNet.RepresentationModel; + +namespace Content.Client.GameObjects.Components.Atmos +{ + public class FireVisualizer : AppearanceVisualizer + { + private int _fireStackAlternateState = 3; + private string _normalState; + private string _alternateState; + + public override void LoadData(YamlMappingNode node) + { + base.LoadData(node); + + if (node.TryGetNode("fireStackAlternateState", out var fireStack)) + { + _fireStackAlternateState = fireStack.AsInt(); + } + + if (node.TryGetNode("normalState", out var normalState)) + { + _normalState = normalState.AsString(); + } + + if (node.TryGetNode("alternateState", out var alternateState)) + { + _alternateState = alternateState.AsString(); + } + } + + public override void OnChangeData(AppearanceComponent component) + { + base.OnChangeData(component); + + if (component.TryGetData(FireVisuals.OnFire, out bool onFire)) + { + var fireStacks = 0f; + + if (component.TryGetData(FireVisuals.FireStacks, out float stacks)) + fireStacks = stacks; + + SetOnFire(component, onFire, fireStacks); + } + } + + private void SetOnFire(AppearanceComponent component, bool onFire, float fireStacks) + { + var sprite = component.Owner.GetComponent(); + + sprite.LayerSetVisible(FireVisualLayers.Fire, onFire); + + if(fireStacks > _fireStackAlternateState && !string.IsNullOrEmpty(_alternateState)) + sprite.LayerSetState(FireVisualLayers.Fire, _alternateState); + else + sprite.LayerSetState(FireVisualLayers.Fire, _normalState); + } + } + + public enum FireVisualLayers + { + Fire + } +} diff --git a/Content.Server/Atmos/FireEvent.cs b/Content.Server/Atmos/FireEvent.cs index 8c1a48abb2..a425fcca6d 100644 --- a/Content.Server/Atmos/FireEvent.cs +++ b/Content.Server/Atmos/FireEvent.cs @@ -2,15 +2,8 @@ namespace Content.Server.Atmos { - public class FireActEvent : EntitySystemMessage + public interface IFireAct { - public float Temperature { get; } - public float Volume { get; } - - public FireActEvent(float temperature, float volume) - { - Temperature = temperature; - Volume = volume; - } + void FireAct(float temperature, float volume); } } diff --git a/Content.Server/Atmos/GasMixture.cs b/Content.Server/Atmos/GasMixture.cs index ff35b50310..c8d795e572 100644 --- a/Content.Server/Atmos/GasMixture.cs +++ b/Content.Server/Atmos/GasMixture.cs @@ -509,7 +509,7 @@ namespace Content.Server.Atmos if (!doReaction) continue; - reaction = prototype.React(this, holder, _atmosphereSystem.EventBus); + reaction = prototype.React(this, holder, _atmosphereSystem.GridTileLookupSystem); if(reaction.HasFlag(ReactionResult.StopReactions)) break; } diff --git a/Content.Server/Atmos/ITemperatureExpose.cs b/Content.Server/Atmos/ITemperatureExpose.cs new file mode 100644 index 0000000000..8b9cfa2d2f --- /dev/null +++ b/Content.Server/Atmos/ITemperatureExpose.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameObjects; +using Robust.Shared.Map; + +namespace Content.Server.Atmos +{ + public interface ITemperatureExpose + { + void TemperatureExpose(GasMixture air, float exposedTemperature, float exposedVolume); + } +} diff --git a/Content.Server/Atmos/Reactions/GasReactionPrototype.cs b/Content.Server/Atmos/Reactions/GasReactionPrototype.cs index 732a39fce4..4259f3f3ae 100644 --- a/Content.Server/Atmos/Reactions/GasReactionPrototype.cs +++ b/Content.Server/Atmos/Reactions/GasReactionPrototype.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using Content.Server.Interfaces; using Content.Shared.Atmos; +using Robust.Server.GameObjects.EntitySystems.TileLookup; using Robust.Shared.GameObjects; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; @@ -65,13 +66,13 @@ namespace Content.Server.Atmos.Reactions serializer.DataField(ref _effects, "effects", new List()); } - public ReactionResult React(GasMixture mixture, IGasMixtureHolder holder, IEventBus eventBus) + public ReactionResult React(GasMixture mixture, IGasMixtureHolder holder, GridTileLookupSystem gridLookup) { var result = ReactionResult.NoReaction; foreach (var effect in _effects) { - result |= effect.React(mixture, holder, eventBus); + result |= effect.React(mixture, holder, gridLookup); } return result; diff --git a/Content.Server/Atmos/Reactions/PhoronFireReaction.cs b/Content.Server/Atmos/Reactions/PhoronFireReaction.cs index e83301338d..cec03ca069 100644 --- a/Content.Server/Atmos/Reactions/PhoronFireReaction.cs +++ b/Content.Server/Atmos/Reactions/PhoronFireReaction.cs @@ -1,8 +1,10 @@ #nullable enable using System; using Content.Server.Interfaces; +using Content.Server.Utility; using Content.Shared.Atmos; using JetBrains.Annotations; +using Robust.Server.GameObjects.EntitySystems.TileLookup; using Robust.Shared.GameObjects; using Robust.Shared.Serialization; @@ -11,7 +13,7 @@ namespace Content.Server.Atmos.Reactions [UsedImplicitly] public class PhoronFireReaction : IGasReactionEffect { - public ReactionResult React(GasMixture mixture, IGasMixtureHolder? holder, IEventBus eventBus) + public ReactionResult React(GasMixture mixture, IGasMixtureHolder? holder, GridTileLookupSystem gridTileLookup) { var energyReleased = 0f; var oldHeatCapacity = mixture.HeatCapacity; @@ -72,7 +74,15 @@ namespace Content.Server.Atmos.Reactions { location.HotspotExpose(temperature, mixture.Volume); - eventBus.QueueEvent(EventSource.Local, new TemperatureExposeEvent(location.GridIndices, location.GridIndex, mixture, temperature, mixture.Volume)); + foreach (var entity in location.GridIndices.GetEntitiesInTileFast(location.GridIndex, gridTileLookup)) + { + foreach (var temperatureExpose in entity.GetAllComponents()) + { + temperatureExpose.TemperatureExpose(mixture, temperature, mixture.Volume); + } + } + + location.TemperatureExpose(mixture, temperature, mixture.Volume); } } diff --git a/Content.Server/Atmos/Reactions/TritiumFireReaction.cs b/Content.Server/Atmos/Reactions/TritiumFireReaction.cs index 29ec566d77..b45222fa32 100644 --- a/Content.Server/Atmos/Reactions/TritiumFireReaction.cs +++ b/Content.Server/Atmos/Reactions/TritiumFireReaction.cs @@ -1,7 +1,9 @@ #nullable enable using Content.Server.Interfaces; +using Content.Server.Utility; using Content.Shared.Atmos; using JetBrains.Annotations; +using Robust.Server.GameObjects.EntitySystems.TileLookup; using Robust.Shared.GameObjects; using Robust.Shared.Serialization; @@ -14,7 +16,7 @@ namespace Content.Server.Atmos.Reactions { } - public ReactionResult React(GasMixture mixture, IGasMixtureHolder? holder, IEventBus eventBus) + public ReactionResult React(GasMixture mixture, IGasMixtureHolder? holder, GridTileLookupSystem gridTileLookup) { var energyReleased = 0f; var oldHeatCapacity = mixture.HeatCapacity; @@ -67,7 +69,15 @@ namespace Content.Server.Atmos.Reactions { location.HotspotExpose(temperature, mixture.Volume); - eventBus.QueueEvent(EventSource.Local, new TemperatureExposeEvent(location.GridIndices, location.GridIndex, mixture, temperature, mixture.Volume)); + foreach (var entity in location.GridIndices.GetEntitiesInTileFast(location.GridIndex, gridTileLookup)) + { + foreach (var temperatureExpose in entity.GetAllComponents()) + { + temperatureExpose.TemperatureExpose(mixture, temperature, mixture.Volume); + } + } + + location.TemperatureExpose(mixture, temperature, mixture.Volume); } } diff --git a/Content.Server/Atmos/TemperatureExposeEvent.cs b/Content.Server/Atmos/TemperatureExposeEvent.cs deleted file mode 100644 index 5401fe0279..0000000000 --- a/Content.Server/Atmos/TemperatureExposeEvent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Robust.Shared.GameObjects; -using Robust.Shared.Map; - -namespace Content.Server.Atmos -{ - public class TemperatureExposeEvent : EntitySystemMessage - { - public MapIndices Indices { get; } - public GridId Grid { get; } - public GasMixture Air { get; } - public float Temperature { get; } - public float Volume { get; } - - public TemperatureExposeEvent(MapIndices indices, GridId gridId, GasMixture air, float temperature, float volume) - { - Indices = indices; - Grid = gridId; - Air = air; - Temperature = temperature; - Volume = volume; - } - } -} diff --git a/Content.Server/Atmos/TileAtmosphere.cs b/Content.Server/Atmos/TileAtmosphere.cs index 1c05e2a552..33f0c790ad 100644 --- a/Content.Server/Atmos/TileAtmosphere.cs +++ b/Content.Server/Atmos/TileAtmosphere.cs @@ -821,8 +821,14 @@ namespace Content.Server.Atmos if (tileRef == null) return; - _gridAtmosphereComponent.Owner.EntityManager. - EventBus.QueueEvent(EventSource.Local, new FireActEvent(Hotspot.Temperature, Hotspot.Volume)); + foreach (var entity in tileRef?.GetEntitiesInTileFast(_gridTileLookupSystem)) + { + foreach (var fireAct in entity.GetAllComponents()) + { + + fireAct.FireAct(Hotspot.Temperature, Hotspot.Volume); + } + } } private bool ConsiderSuperconductivity() diff --git a/Content.Server/GameObjects/Components/Atmos/AtmosExposedComponent.cs b/Content.Server/GameObjects/Components/Atmos/AtmosExposedComponent.cs index 723c0cbe84..4dbea6affc 100644 --- a/Content.Server/GameObjects/Components/Atmos/AtmosExposedComponent.cs +++ b/Content.Server/GameObjects/Components/Atmos/AtmosExposedComponent.cs @@ -5,7 +5,7 @@ using Robust.Shared.GameObjects; namespace Content.Server.GameObjects.Components.Atmos { /// - /// Represents that entity can be exposed to Atmo + /// Represents that entity can be exposed to Atmos /// [RegisterComponent] public class AtmosExposedComponent @@ -13,7 +13,7 @@ namespace Content.Server.GameObjects.Components.Atmos { public override string Name => "AtmosExposed"; - public void Update(TileAtmosphere tile, float timeDelta) + public void Update(TileAtmosphere tile, float frameDelta) { if (Owner.TryGetComponent(out var temperatureComponent)) { @@ -31,6 +31,10 @@ namespace Content.Server.GameObjects.Components.Atmos barotraumaComponent.Update(tile.Air?.Pressure ?? 0); } + if (Owner.TryGetComponent(out var flammableComponent)) + { + flammableComponent.Update(tile); + } } } diff --git a/Content.Server/GameObjects/Components/Atmos/FlammableComponent.cs b/Content.Server/GameObjects/Components/Atmos/FlammableComponent.cs new file mode 100644 index 0000000000..1d9d486bfb --- /dev/null +++ b/Content.Server/GameObjects/Components/Atmos/FlammableComponent.cs @@ -0,0 +1,237 @@ +using System; +using System.Collections.Generic; +using Content.Server.Atmos; +using Content.Server.GameObjects.Components.Mobs; +using Content.Server.GameObjects.Components.Temperature; +using Content.Server.GameObjects.EntitySystems; +using Content.Shared.Atmos; +using Content.Shared.Chemistry; +using Content.Shared.Damage; +using Content.Shared.GameObjects.Components.Atmos; +using Content.Shared.GameObjects.Components.Damage; +using Content.Shared.GameObjects.Components.Mobs; +using Content.Shared.GameObjects.EntitySystems; +using Content.Shared.Interfaces; +using Content.Shared.Interfaces.GameObjects.Components; +using Robust.Server.GameObjects; +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.Timers; +using Robust.Shared.ViewVariables; + +namespace Content.Server.GameObjects.Components.Atmos +{ + [RegisterComponent] + public class FlammableComponent : SharedFlammableComponent, ICollideBehavior, IFireAct, IReagentReaction + { + [Dependency] private IEntityManager _entityManager = default!; + + private bool _resisting = false; + private readonly List _collided = new List(); + + [ViewVariables(VVAccess.ReadWrite)] + public bool OnFire { get; private set; } + + [ViewVariables(VVAccess.ReadWrite)] + public float FireStacks { get; private set; } + + [ViewVariables(VVAccess.ReadWrite)] + public bool FireSpread { get; private set; } = false; + + [ViewVariables(VVAccess.ReadWrite)] + public bool CanResistFire { get; private set; } = false; + + public override void ExposeData(ObjectSerializer serializer) + { + base.ExposeData(serializer); + serializer.DataField(this, x => x.FireSpread, "fireSpread", false); + serializer.DataField(this, x => x.CanResistFire, "canResistFire", false); + } + + public void Ignite() + { + if (FireStacks > 0 && !OnFire) + { + OnFire = true; + + } + + UpdateAppearance(); + } + + public void Extinguish() + { + if (!OnFire) return; + OnFire = false; + FireStacks = 0; + + _collided.Clear(); + + UpdateAppearance(); + } + + public void AdjustFireStacks(float relativeFireStacks) + { + FireStacks = MathF.Max(MathF.Min(-10f, FireStacks + relativeFireStacks), 20f); + if (OnFire && FireStacks <= 0) + Extinguish(); + + UpdateAppearance(); + } + + public void Update(TileAtmosphere tile) + { + // Slowly dry ourselves off if wet. + if (FireStacks < 0) + { + FireStacks = MathF.Min(0, FireStacks + 1); + } + + Owner.TryGetComponent(out ServerStatusEffectsComponent status); + + if (!OnFire) + { + status?.RemoveStatusEffect(StatusEffect.Fire); + return; + } + + status?.ChangeStatusEffect(StatusEffect.Fire, "/Textures/Interface/StatusEffects/Fire/fire.png", null); + + if (FireStacks > 0) + { + if(Owner.TryGetComponent(out TemperatureComponent temp)) + { + temp.ReceiveHeat(200 * FireStacks); + } + + if (Owner.TryGetComponent(out IDamageableComponent damageable)) + { + // TODO ATMOS Fire resistance from armor + var damage = Math.Min((int) (FireStacks * 2.5f), 10); + damageable.ChangeDamage(DamageClass.Burn, damage, false); + } + + AdjustFireStacks(-0.1f * (_resisting ? 10f : 1f)); + } + else + { + Extinguish(); + return; + } + + // If we're in an oxygenless environment, put the fire out. + if (tile?.Air?.GetMoles(Gas.Oxygen) < 1f) + { + Extinguish(); + return; + } + + tile.HotspotExpose(700, 50, true); + + foreach (var uid in _collided.ToArray()) + { + if (!uid.IsValid() || !_entityManager.EntityExists(uid)) + { + _collided.Remove(uid); + continue; + } + + var entity = _entityManager.GetEntity(uid); + var collidable = Owner.GetComponent(); + var otherCollidable = entity.GetComponent(); + + if (!collidable.WorldAABB.Intersects(otherCollidable.WorldAABB)) + { + _collided.Remove(uid); + } + } + } + + public void CollideWith(IEntity collidedWith) + { + if (!collidedWith.TryGetComponent(out FlammableComponent otherFlammable)) + return; + + if (!FireSpread || !otherFlammable.FireSpread) + return; + + if (OnFire) + { + if (otherFlammable.OnFire) + { + var fireSplit = (FireStacks + otherFlammable.FireStacks) / 2; + FireStacks = fireSplit; + otherFlammable.FireStacks = fireSplit; + } + else + { + FireStacks /= 2; + otherFlammable.FireStacks += FireStacks; + otherFlammable.Ignite(); + } + } else if (otherFlammable.OnFire) + { + otherFlammable.FireStacks /= 2; + FireStacks += otherFlammable.FireStacks; + Ignite(); + } + } + + private void UpdateAppearance() + { + if (Owner.Deleted || !Owner.TryGetComponent(out AppearanceComponent appearanceComponent)) return; + appearanceComponent.SetData(FireVisuals.OnFire, OnFire); + appearanceComponent.SetData(FireVisuals.FireStacks, FireStacks); + } + + public void FireAct(float temperature, float volume) + { + AdjustFireStacks(3); + Ignite(); + } + + // This needs some improvements... + public void Resist() + { + if (!OnFire || !ActionBlockerSystem.CanInteract(Owner) || _resisting || !Owner.TryGetComponent(out StunnableComponent stunnable)) return; + + _resisting = true; + + Owner.PopupMessage(Loc.GetString("You stop, drop, and roll!")); + stunnable.Paralyze(2f); + + Timer.Spawn(2000, () => + { + _resisting = false; + FireStacks -= 2f; + UpdateAppearance(); + }); + } + + public ReagentUnit ReagentReactTouch(ReagentPrototype reagent, ReagentUnit volume) + { + switch (reagent.ID) + { + case "chem.H2O": + Extinguish(); + AdjustFireStacks(-1.5f); + return ReagentUnit.Zero; + + case "chem.WeldingFuel": + case "chem.Thermite": + case "chem.Phoron": + case "chem.Ethanol": + AdjustFireStacks(volume.Float() / 10f); + return volume; + + default: + return ReagentUnit.Zero; + } + } + } +} diff --git a/Content.Server/GameObjects/Components/Mobs/ServerStatusEffectsComponent.cs b/Content.Server/GameObjects/Components/Mobs/ServerStatusEffectsComponent.cs index a9cf642938..70cb1a384a 100644 --- a/Content.Server/GameObjects/Components/Mobs/ServerStatusEffectsComponent.cs +++ b/Content.Server/GameObjects/Components/Mobs/ServerStatusEffectsComponent.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Content.Server.GameObjects.Components.Atmos; using Content.Server.GameObjects.Components.Buckle; using Content.Server.GameObjects.Components.GUI; using Content.Server.GameObjects.Components.Movement; @@ -94,28 +95,30 @@ namespace Content.Server.GameObjects.Components.Mobs { case StatusEffect.Buckled: if (!player.TryGetComponent(out BuckleComponent buckle)) - { break; - } buckle.TryUnbuckle(player); break; case StatusEffect.Piloting: if (!player.TryGetComponent(out ShuttleControllerComponent controller)) - { break; - } controller.RemoveController(); break; case StatusEffect.Pulling: if (!player.TryGetComponent(out HandsComponent hands)) - { break; - } hands.StopPull(); break; + + case StatusEffect.Fire: + if (!player.TryGetComponent(out FlammableComponent flammable)) + break; + + flammable.Resist(); + break; + default: player.PopupMessage(msg.Effect.ToString()); break; diff --git a/Content.Server/GameObjects/Components/Temperature/TemperatureComponent.cs b/Content.Server/GameObjects/Components/Temperature/TemperatureComponent.cs index f29abc5d08..555023b17c 100644 --- a/Content.Server/GameObjects/Components/Temperature/TemperatureComponent.cs +++ b/Content.Server/GameObjects/Components/Temperature/TemperatureComponent.cs @@ -1,8 +1,10 @@ using System; using System.Diagnostics; +using Content.Server.GameObjects.Components.Mobs; using Content.Shared.Atmos; using Content.Shared.Damage; using Content.Shared.GameObjects.Components.Damage; +using Content.Shared.GameObjects.Components.Mobs; using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Components; using Robust.Shared.Serialization; @@ -72,11 +74,51 @@ namespace Content.Server.GameObjects.Components.Temperature damageType = DamageType.Cold; } + if (Owner.TryGetComponent(out ServerStatusEffectsComponent status)) + { + switch(CurrentTemperature) + { + // Cold strong. + case var t when t <= 260: + status.ChangeStatusEffect(StatusEffect.Temperature, "/Textures/Interface/StatusEffects/Temperature/cold3.png", null); + break; + + // Cold mild. + case var t when t <= 280 && t > 260: + status.ChangeStatusEffect(StatusEffect.Temperature, "/Textures/Interface/StatusEffects/Temperature/cold2.png", null); + break; + + // Cold weak. + case var t when t <= 292 && t > 280: + status.ChangeStatusEffect(StatusEffect.Temperature, "/Textures/Interface/StatusEffects/Temperature/cold1.png", null); + break; + + // Safe. + case var t when t <= 327 && t > 292: + status.RemoveStatusEffect(StatusEffect.Temperature); + break; + + // Heat weak. + case var t when t <= 335 && t > 327: + status.ChangeStatusEffect(StatusEffect.Temperature, "/Textures/Interface/StatusEffects/Temperature/hot1.png", null); + break; + + // Heat mild. + case var t when t <= 345 && t > 335: + status.ChangeStatusEffect(StatusEffect.Temperature, "/Textures/Interface/StatusEffects/Temperature/hot2.png", null); + break; + + // Heat strong. + case var t when t > 345: + status.ChangeStatusEffect(StatusEffect.Temperature, "/Textures/Interface/StatusEffects/Temperature/hot3.png", null); + break; + } + } + if (!damageType.HasValue) return; if (!Owner.TryGetComponent(out IDamageableComponent component)) return; component.ChangeDamage(damageType.Value, tempDamage, false); - Debug.Write($"Temp is: {CurrentTemperature}"); } /// diff --git a/Content.Server/GameObjects/EntitySystems/AtmosExposedSystem.cs b/Content.Server/GameObjects/EntitySystems/AtmosExposedSystem.cs index 07b67cc560..16f22dfc8d 100644 --- a/Content.Server/GameObjects/EntitySystems/AtmosExposedSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/AtmosExposedSystem.cs @@ -13,13 +13,14 @@ namespace Content.Server.GameObjects.EntitySystems { [Dependency] private readonly IEntityManager _entityManager = default!; - private const float UpdateDelay = 3f; + private const float UpdateDelay = 1f; private float _lastUpdate; + public override void Update(float frameTime) { _lastUpdate += frameTime; if (_lastUpdate < UpdateDelay) return; - var atmosSystem = EntitySystemManager.GetEntitySystem(); + // creadth: everything exposable by atmos should be updated as well foreach (var atmosExposedComponent in EntityManager.ComponentManager.EntityQuery()) { diff --git a/Content.Server/GameObjects/EntitySystems/AtmosphereSystem.cs b/Content.Server/GameObjects/EntitySystems/AtmosphereSystem.cs index c5614f08ad..b356b01fbf 100644 --- a/Content.Server/GameObjects/EntitySystems/AtmosphereSystem.cs +++ b/Content.Server/GameObjects/EntitySystems/AtmosphereSystem.cs @@ -7,9 +7,11 @@ using Content.Server.Atmos.Reactions; using Content.Server.GameObjects.Components.Atmos; using Content.Shared.GameObjects.EntitySystems.Atmos; using JetBrains.Annotations; +using Robust.Server.GameObjects.EntitySystems.TileLookup; using Robust.Server.Interfaces.Timing; using Robust.Shared.GameObjects; using Robust.Shared.GameObjects.Components.Map; +using Robust.Shared.GameObjects.Systems; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.Map; using Robust.Shared.IoC; @@ -29,6 +31,7 @@ namespace Content.Server.GameObjects.EntitySystems private GasReactionPrototype[] _gasReactions = Array.Empty(); private SpaceGridAtmosphereComponent _spaceAtmos = default!; + private GridTileLookupSystem? _gridTileLookup = null; /// /// List of gas reactions ordered by priority. @@ -40,6 +43,8 @@ namespace Content.Server.GameObjects.EntitySystems /// public IEventBus EventBus => _entityManager.EventBus; + public GridTileLookupSystem GridTileLookupSystem => _gridTileLookup ??= Get(); + public override void Initialize() { base.Initialize(); diff --git a/Content.Server/Interfaces/IGasReactionEffect.cs b/Content.Server/Interfaces/IGasReactionEffect.cs index 7d2b991236..819ede8b91 100644 --- a/Content.Server/Interfaces/IGasReactionEffect.cs +++ b/Content.Server/Interfaces/IGasReactionEffect.cs @@ -1,6 +1,7 @@ #nullable enable using Content.Server.Atmos; using Content.Server.Atmos.Reactions; +using Robust.Server.GameObjects.EntitySystems.TileLookup; using Robust.Shared.GameObjects; using Robust.Shared.Interfaces.Serialization; @@ -8,6 +9,6 @@ namespace Content.Server.Interfaces { public interface IGasReactionEffect : IExposeData { - ReactionResult React(GasMixture mixture, IGasMixtureHolder? holder, IEventBus eventBus); + ReactionResult React(GasMixture mixture, IGasMixtureHolder? holder, GridTileLookupSystem gridTileLookup); } } diff --git a/Content.Shared/GameObjects/Components/Atmos/SharedFlammableComponent.cs b/Content.Shared/GameObjects/Components/Atmos/SharedFlammableComponent.cs new file mode 100644 index 0000000000..8eac377717 --- /dev/null +++ b/Content.Shared/GameObjects/Components/Atmos/SharedFlammableComponent.cs @@ -0,0 +1,18 @@ +using System; +using Robust.Shared.GameObjects; +using Robust.Shared.Serialization; + +namespace Content.Shared.GameObjects.Components.Atmos +{ + public class SharedFlammableComponent : Component + { + public override string Name => "Flammable"; + } + + [Serializable, NetSerializable] + public enum FireVisuals + { + OnFire, + FireStacks, + } +} diff --git a/Content.Shared/GameObjects/Components/Mobs/SharedStatusEffectsComponent.cs b/Content.Shared/GameObjects/Components/Mobs/SharedStatusEffectsComponent.cs index c76a275ddd..d6d094ed76 100644 --- a/Content.Shared/GameObjects/Components/Mobs/SharedStatusEffectsComponent.cs +++ b/Content.Shared/GameObjects/Components/Mobs/SharedStatusEffectsComponent.cs @@ -57,6 +57,8 @@ namespace Content.Shared.GameObjects.Components.Mobs Hunger, Thirst, Pressure, + Fire, + Temperature, Stun, Cuffed, Buckled, diff --git a/Content.Shared/GameObjects/Components/Movement/SharedSlipperyComponent.cs b/Content.Shared/GameObjects/Components/Movement/SharedSlipperyComponent.cs index 5f6edd505f..5814ee2904 100644 --- a/Content.Shared/GameObjects/Components/Movement/SharedSlipperyComponent.cs +++ b/Content.Shared/GameObjects/Components/Movement/SharedSlipperyComponent.cs @@ -112,6 +112,7 @@ namespace Content.Shared.GameObjects.Components.Movement { if (!uid.IsValid() || !_entityManager.EntityExists(uid)) { + _slipped.Remove(uid); continue; } diff --git a/Content.Shared/Preferences/Appearance/HumanoidCharacterAppearance.cs b/Content.Shared/Preferences/Appearance/HumanoidCharacterAppearance.cs index d1d57c64df..9de3c6ca93 100644 --- a/Content.Shared/Preferences/Appearance/HumanoidCharacterAppearance.cs +++ b/Content.Shared/Preferences/Appearance/HumanoidCharacterAppearance.cs @@ -20,6 +20,7 @@ namespace Content.Shared.Preferences.Appearance RFoot, LFoot, Handcuffs, - StencilMask + StencilMask, + Fire, } } diff --git a/Resources/Prototypes/Entities/Mobs/Species/human.yml b/Resources/Prototypes/Entities/Mobs/Species/human.yml index dd896b04ba..b85d25d8a9 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/human.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/human.yml @@ -116,6 +116,10 @@ sprite: Effects/creampie.rsi state: creampie_human visible: false + - map: ["enum.FireVisualLayers.Fire"] + sprite: Mobs/Effects/onfire.rsi + state: Generic_mob_burning + visible: false - type: Icon sprite: Mobs/Species/Human/parts.rsi state: full @@ -133,6 +137,9 @@ - Opaque - MobImpassable - type: AtmosExposed + - type: Flammable + fireSpread: true + canResistFire: true - type: Temperature heatDamageThreshold: 360 coldDamageThreshold: 260 @@ -163,6 +170,10 @@ visuals: - type: RotationVisualizer - type: BuckleVisualizer + - type: FireVisualizer + normalState: Generic_mob_burning + alternateState: Standing + fireStackAlternateState: 3 - type: CreamPiedVisualizer - type: CombatMode - type: Climbing diff --git a/Resources/Textures/Interface/StatusEffects/Fire/fire.png b/Resources/Textures/Interface/StatusEffects/Fire/fire.png new file mode 100644 index 0000000000000000000000000000000000000000..cf65084e44e786feff1ed98094f3b0036cb00755 GIT binary patch literal 414 zcmV;P0b%}$P)Zq}6o&tnGK8g4RS#a6ER~rJiJ2Q@>4|!m-hd0Rr7Huw2hU9^MNzr{1!E%H&ndrz z1m^kuALbcjU}HV#4V?4qz09PP3%^+d=log}1(Z_3%^728nq~pUDpLO7ecH) z)B<2I|CBNqz`lnt>Cq=)0^qxhkPx7}0FwRyfHHlawN3Bc1wc=pq(`f`AONPMUmrhC z@g#s-Qe{NyPX?fh43HA10ttXR{A7SM0kS;a24MR1yUKqgoB*b#(|3QWFaHCen`U{8 z_HZ@=1_!W7?lU8-0oDp`7=GV6@Gio)_m`P*md9STVEi92=~Q3P_UF4Q8W*E1kH>Z& zSpy6Zqh9|`^ES`Wju9v>874Pq_MMNUQN zn%qX4|Bx6*KnQ_-K$EpSff0Z)2Bp-^PCjCc8FyQoZ%#MYFTDh2*4cRjjsO4v07*qo IM6N<$f(wDISpWb4 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/StatusEffects/Temperature/cold1.png b/Resources/Textures/Interface/StatusEffects/Temperature/cold1.png new file mode 100644 index 0000000000000000000000000000000000000000..a7408f8e7f3aa8dda5276957eaafa117f27f850b GIT binary patch literal 396 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/StatusEffects/Temperature/hot1.png b/Resources/Textures/Interface/StatusEffects/Temperature/hot1.png new file mode 100644 index 0000000000000000000000000000000000000000..2d3896f7b0562801aa20e39e11c8340a2cee48f2 GIT binary patch literal 365 zcmV-z0h0cSP)b;@5Jf*x3Q(l%2`C4pNE4A0@g{&=2yx(LaUwq3 zch0CFL_x9QWm$sx2=Vj%1)4mlAZ{f9p@uDFD23o-J!N zjj1o;EfO0Rml{*GD~?Iyiq&&LN}bFFmk@0LolHg{MAN=zK)tFC^6HRmMA`O200000 LNkvXXu0mjf&1ah` literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/StatusEffects/Temperature/hot2.png b/Resources/Textures/Interface/StatusEffects/Temperature/hot2.png new file mode 100644 index 0000000000000000000000000000000000000000..7408c204c81f5617bfe2b12d6e1a19a13f6ef47a GIT binary patch literal 333 zcmV-T0kZyyP)dwOGxPnxQ5Z#*in0c*~Dmvg@LSOmz~{6DBNEG zJHvmOgzyI#Sreb8G(oLA1HFSnV#)zf73YMV5bb>dAOcVV*b}u7TsZ>(z!|{Rr}0++TjjbK z10YNwOdw1kOyIvJpvwTZ2{g57g4*^+j9kp)oG=qYYrXpos0AK@DnSdn1x~Jv__gH2PjixW*sHs)Wxxv&s73<`aioN#&lLpxfx)3&iK{g{5 fqVL>iK^;|ZUHyh+Pv_fY00000NkvXXu0mjf{&9`u literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/StatusEffects/Temperature/hot3.png b/Resources/Textures/Interface/StatusEffects/Temperature/hot3.png new file mode 100644 index 0000000000000000000000000000000000000000..d74178208fc62ef2a087c0988b00026df1152c4d GIT binary patch literal 3121 zcmV-149@e3P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3#rcH=q@h5vIEy#!9+upEx(^bUIY{ee>a;;N)$ zS9KJNG9{6~y_XKB{?uJKk;GK)#!Kg)R94H3KIqIS8%~{_Tjc5T%X3La`wUToC}$2&gL}!9t=R9 z-1}&){S43($RAhcSM(oOzku)C-5-9zGTj()@#PICzx0R4H2(9%;bD<~zR|ZGzqxaN z_MT<$b$Qof0?~9U>VWM&hT*{uB)?nb!LOIoel3_SKJ|JVia+_8InODDXG@G9l3IAGWwNZ$0x3SD1M^9`%mF zVE6mO{I8qu9AkG1C6!ep0K|@V~L=j1nr5LHwQb;jLN+~A| zaxI4(v*eU>F1hAbLWxC6D!G(WORK&HVxZJib1k*j*1Ty<)EKMre50rP9(wH3Q_sEh z+S@=rBMup9_>VzkteI+DAU$^sH9Lsd$)$;hwjFEe{>EJMo?qYlX`URt{B+XP z$1-z8aV%W#PpT#jP1e38$CN1g%J^PDTx__Ej<( zW#j0m#N`JVxy^%yQ8*TX>K#13YR%g`f8)OS?0*r5$y3-si5Pp$c3ui&vS)Fdt*qBE z$IPpP++1<3i3pHnud&%m zt+M7Cmgl9y(ie(P4Mw&u=+Uwa*62W&?yS4IcstjYC)axp)|K=uo!1So&jJ*KMORi2 zEZZ!By+sO374Pa0M&=*k%IZqt*xcXT7vj|{!t$PGT=-7A;>8wO$J?zg+ODCyG%R(F zX(aoxduII;BRpOzahx|UXM{qE&?mqXX~;SnV52)}ZKG^9x;?89facgWAxhsga1f~@ z&=I%NoPPJYp(};rRT-NT;R9!5KF^w2;3^V-&KfQr0jLJN+k{Lk={9xZ)pddPJqRwh z3lU)nV;^?I5|Yu&cFsGbx_JyQg+vOMb5d1mGZWl#k657`GV#3CyGj_%p1}5}_&&jF z{sP}8c+C^OucLdQRqY>ef!4f@ts?scu;!1D{Q@}iN63Bwtob8kzYwl@Rk=S2*SxCS zpM-1v0^g_B`~|*G@R~ou_Y2{gSC#vdaLudA{YkjykC6RV+3zCz1+eB-<^CjG^Qv-x z60UhwxjzZl`~|*G@S6X_mUiGZuPXN^;hI;K`;&0ZUu|Y@huTlbl5a4JZRD0afozjO zRTd_}Kjc1Vrw-Y*oO~4*>-1Fyi8%>gr$kh{__7Ojt_6@3J|I6tNZTcWq{-AF!P@}? zoxF@({mP!AW=}hiJTX1Kkk;ZZsbH>doqB-kaD(2){bebR6=oSFPe6@7sUrFHs0(g253hNy zg&7z!VB^Alhn0#q@74_;jGkstNrow-v(uu94wO+Xz3lCywu%Ei4Zp=U)pEJuB_}1f z-Bp3?d6JH9M~aKvVoE~FJ?xYZfK+>w3ka7in(9#yrCODo2{w9?gs8NRQpi9b@c%qflvW~Q7`>vVtS|_pA zDkkW8xTtQ#tUA^bhwS)~BvTo1k7BUu&u&_antPE&x8yQ6+MnBx%19g5AIxfcobv2w zWHoq4*ji#;wMx)Bg?yYUiu&YK9C=cFp9^Yf1y(icR?3!oO=&y6qPLxvKZ^v7GJ*fj zDEFIo&9iu|{awC#CMskNYI)#R2$jyMjCx$$te#8hfp z;sc=y{L_q=t&OPiIiw*gab*tG>Q$Cf&n2r>9dgY%Hp)AKf9N=ph)UjR_1RUKJ`asX zy>}~@95_=b233NimTry!@u8$sY8&W+i-;69qoIm>6-}G#$2zhvwB}ssz>Trxnt~F# zQ2Xiv>BSCAV`#2}==a5Rp?Q zrVh8)MrfKX^q!V%4aw|u2KeuN3|NWJaG(0N-nZ;LtGsW_P@z(M4;yr^^GC~SK&vZh zt&JqvX%%g@J?kjfPr!&*f$cnzRTOp>SDD{%;q;dxwjDE-SzkpweSu#U$z%h=3S~Z?rQiTHiWG4Qg<6}8195gJTISn zU+JVLm9wFA-MY*LLCOb$?*MqgfAc;dQLbO*h+478gVuv6e>gIRk_2Swy&xVuBRcpyDRpN8vF_SJx{K$31<2TNEmj#{~HdD!Y;xMt8 zZ(*f{S;5qZr-&n}rc=I<_E_b-#aSy=SmU1jg~6=8vdndw!-!)MOOPN!K?OyWU?WPa zPKt#j?Z?{qhg`ozE`?l0Fmf!Q3=OjD2mgcL-CDWH2`?!a13F(E=VJs2>;m{fxdT1N7el zJ!@WXjeVRx04eG!aRVG20;74#UT^d6uGZfEJ=5s#2MU97eLaN^$p8QV24YJ`L;(K) z{{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2jmGA4-pJ{fl&fWPoj`U?M{v7sY&eBdmN1`8ljJm7AExx(9u z+%C-AWXa9~oYHUQ10mz!OC4i&ImnxI@KpUs#=2HYkAbWd0_#hAz z2nqxRf&%}gfXM@lDbUv1cmu_Z;XZI?EL)G`F>rP)NAMhhfHi?45!|%KYM`dugp-(3 z)1Po{3~An}WsE89iu+V@b;a~v&=)`13vAXhc0HqZ!=XI0pn8oLUIK#mslZWY00000 LNkvXXu0mjf+9m-y literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Effects/onfire.rsi/Generic_mob_burning.png b/Resources/Textures/Mobs/Effects/onfire.rsi/Generic_mob_burning.png new file mode 100644 index 0000000000000000000000000000000000000000..553b787a45b4ba52840cc7facc18f14e2533a383 GIT binary patch literal 1915 zcmV->2ZZ>EP)004jp1^@s6jALRO000L z!Exg{5JU%iP!0}b)7YDW(8U4i;vgJ~!cY#na1SC_6gU7u3NsCx{i=R#mA}mffgv~~ z22Bw{2qAs0ZTZXUGVAAhf zPG*7~K6RP`HQ1Y7l6YS)lzZJh=G zY!wg@371D0K2L+(lHWB5yqvz=#($0Vs8$kNgi~^zyedE4gp8;=DyrL}gjVbsu`nf!?6>)|~CG<7==I4K3 zP5>=6t8T$5(?dwhTt^{y>?!b+JkSIsr*aKSw0?T4zqGqB*8@hv*Xo zA%u|M2zrT$fH`Ua^mN`mwZ#qeNh9^qRVKN%97?~3DvMGP!u)s4+W{{1LR1{h$G_$I zSHFm!)&*DI0h)Kr_zp0K)$5p-j&Hfvy`>F6{i$D9R>sU3&fxV)w0;lkvp{{3wlCl} zFU76BbhMrUOZwJp!y=fM&Rg|S)zB#IMI%t!@Twi~Ai(v<>X|Jw}Zcc+)|Dy6}_ZP5n~(+ln!$ z3&63)OY;L%gQ0hYNq2bLOIq|Nje97x@%N zCai+V6&G!Auqy6aztUT9cSUqD!0uAqxz>VW?svyt1W^~Yf5cmVksppJOO5{S0G#Il zh=GpzUnvkhZUL&cLuq{R0nn*5e+u-ppEqpVe0xubmhd+BiOvwN&mctU&-Z~W+GR|* zJOWZ*M6y1STlR$PYUq^YgZ%N(`XaMUI7ii|KOiB5kSAR%84(-|fG0>>3?lf>K)?G# zwc)7!zGwiV6w0G0p#*frA*obCmCWrO|LXUE#Q=!DFox@Y#p5dP0$qt~uc+0RnZCPr z)F1mFvi{qHCyAy0T2R5)T|3aX7b(qv4h<;XV$r5J*7`LUfTjMt4O&~=`X8NWqHb|; z-#xVcIKx`Zvh_J&X5G*sLQUwDEzE>>%u z?Ol|rd7^l3Nk9i%+J-&t*-q7 zDw@9Me%PD`9#TJiuRGP7>Br6R+$TZ^AxENz1e^dlY5*Mdyt@HC0BHRPx*dnrN0u0Dqnr(C>cW`UeieuIcsG zOl;{PHNyuVdR98>gF)2aSuykWx8kBWbZvCZNl^M-cqan$vgxy74&Ud?H{#&_dDLh6 zLkJ;+5JCtcgb+dqA>^k6UvFfw0TBUu(0z7Lbph1xq3Q(oP2_n4VB+95bnL&>QV*v?eo@ey)9r@Io8V{C}l|212ESMmq$oTk*xH?<@wpt^!yhX zmPReyARP76vajhgw%YHyI;A=X;Hti-cc5Yq;^~y?t-sLL^wGC!cmu$Ade(HQ@8u_0 zvTijOmqJnwep2&vPDSeH*rNYdNq#8@@F3=Y+CX^PmZ4{S^nRRo{=VIwkU5Tf1HyIr z5aOwi+>a41kAU6}^6p-kw;fWo!OnThazRex^R@(zTRAu9X5PhpdpFg@Jzu|1VJqPT; z3r_@=^TE9kMX=wg8+`y_xBMP_=%|0}e4CJF{09kTl`3{r7!?2j002ovPDHLkV1iU~ BxuXC8 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Effects/onfire.rsi/Monkey_burning.png b/Resources/Textures/Mobs/Effects/onfire.rsi/Monkey_burning.png new file mode 100644 index 0000000000000000000000000000000000000000..cca7c6c66d70f96c9490c8df4b3ed1f1f2bd0e2f GIT binary patch literal 3872 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Effects/onfire.rsi/Standing.png b/Resources/Textures/Mobs/Effects/onfire.rsi/Standing.png new file mode 100644 index 0000000000000000000000000000000000000000..cc0124436437fa0e5f14dfbc8fce319cb2b3ba4d GIT binary patch literal 4989 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 Hu0mjfD20wG literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Effects/onfire.rsi/meta.json b/Resources/Textures/Mobs/Effects/onfire.rsi/meta.json new file mode 100644 index 0000000000..7c5353addc --- /dev/null +++ b/Resources/Textures/Mobs/Effects/onfire.rsi/meta.json @@ -0,0 +1 @@ +{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA 3.0", "copyright": "Taken from https://github.com/tgstation/tgstation at 0d9c9a8233dfc3fc55edc538955a761a6328bee0", "states": [{"name": "Generic_mob_burning", "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]]}, {"name": "Monkey_burning", "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": "Standing", "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]]}]} \ No newline at end of file diff --git a/SpaceStation14.sln.DotSettings b/SpaceStation14.sln.DotSettings index 509a0e8dc3..9bfa9e6c77 100644 --- a/SpaceStation14.sln.DotSettings +++ b/SpaceStation14.sln.DotSettings @@ -131,6 +131,7 @@ True True True + True True True True