From 96fc06a4434a78d478099ebaa0eede4b86f8ed13 Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Thu, 21 Nov 2024 22:01:14 +0300 Subject: [PATCH] Fire update (#602) * fire spread fixes and optimization * fix liquid drops nefty and suffix * some sharedization * melee fire extinguish * clean up fireSpread system * caution popup * cuffable zombies * fix zombie AI * lighter * torch integration attempt * fix torch igniting * yml tweaks * bonus flammable damage --- .../Temperature/CP14ClientFireSpreadSystem.cs | 7 ++ .../Atmos/EntitySystems/FlammableSystem.cs | 23 ++-- Content.Server/Audio/AmbientSoundSystem.cs | 1 + .../CP14DespawnOnExtinguishComponent.cs | 6 - .../_CP14/Temperature/CP14FireSpreadSystem.cs | 95 ++++++++------- .../CP14FlammableAmbientSoundComponent.cs | 9 -- .../Fireplace/CP14FireplaceSystem.cs | 5 - .../CP14ActiveFireSpreadingComponent.cs | 6 + .../CP14DelayedIgnitionSourceComponent.cs | 16 +++ .../CP14DespawnOnExtinguishComponent.cs | 6 + .../Temperature/CP14FireSpreadComponent.cs | 12 +- .../CP14FlammableDamageBonusComponent.cs | 19 +++ .../CP14IgnitionModifierComponent.cs | 14 +++ .../Temperature/CP14SharedFireSpreadSystem.cs | 112 ++++++++++++++++++ .../en-US/_CP14/temperature/temperature.ftl | 2 + .../ru-RU/_CP14/temperature/temperature.ftl | 2 + .../Prototypes/_CP14/Catalog/Fills/crates.yml | 1 + .../Actions/Spells/Fire/T0_flame_creation.yml | 9 +- .../Actions/Spells/Meta/T0_mana_gift.yml | 2 +- .../Spells/Water/T0_water_creation.yml | 5 +- .../Actions/Spells/Water/T1_beer_creation.yml | 1 + .../_CP14/Entities/Mobs/NPC/undead.yml | 4 +- .../_CP14/Entities/Mobs/Species/base.yml | 2 + .../_CP14/Entities/Mobs/Species/zombie.yml | 10 ++ .../_CP14/Entities/Objects/Tools/bucket.yml | 1 - .../_CP14/Entities/Objects/Tools/flint.yml | 15 +++ .../_CP14/Entities/Objects/Tools/torch.yml | 79 ++++++++++++ .../Structures/Flora/grasshighbush.yml | 3 + .../Structures/Furniture/wallmount.yml | 9 +- .../Structures/Specific/Alchemy/heater.yml | 5 +- Resources/Prototypes/_CP14/Entities/fire.yml | 5 +- .../_CP14/Loadouts/Jobs/general.yml | 7 ++ Resources/Prototypes/_CP14/NPCs/base.yml | 40 +++++++ Resources/Prototypes/_CP14/NPCs/zombie.yml | 9 ++ .../_CP14/Objects/Tools/flint.rsi/icon.png | Bin 0 -> 414 bytes .../_CP14/Objects/Tools/flint.rsi/meta.json | 14 +++ .../_CP14/Objects/Tools/torch.rsi/icon.png | Bin 0 -> 551 bytes .../Objects/Tools/torch.rsi/inhand-left.png | Bin 0 -> 606 bytes .../Objects/Tools/torch.rsi/inhand-right.png | Bin 0 -> 606 bytes .../Tools/torch.rsi/lit-inhand-left.png | Bin 0 -> 1244 bytes .../Tools/torch.rsi/lit-inhand-right.png | Bin 0 -> 1333 bytes .../Objects/Tools/torch.rsi/lit-overlay.png | Bin 0 -> 831 bytes .../_CP14/Objects/Tools/torch.rsi/meta.json | 96 +++++++++++++++ .../Objects/Tools/torch.rsi/torch-spent.png | Bin 0 -> 325 bytes .../Objects/Tools/torch.rsi/torch-unlit.png | Bin 0 -> 367 bytes .../Tools/torch.rsi/unlit-inhand-left.png | Bin 0 -> 624 bytes .../Tools/torch.rsi/unlit-inhand-right.png | Bin 0 -> 636 bytes Resources/migration.yml | 2 +- 48 files changed, 554 insertions(+), 100 deletions(-) create mode 100644 Content.Client/_CP14/Temperature/CP14ClientFireSpreadSystem.cs delete mode 100644 Content.Server/_CP14/Temperature/CP14DespawnOnExtinguishComponent.cs create mode 100644 Content.Shared/_CP14/Temperature/CP14ActiveFireSpreadingComponent.cs create mode 100644 Content.Shared/_CP14/Temperature/CP14DelayedIgnitionSourceComponent.cs create mode 100644 Content.Shared/_CP14/Temperature/CP14DespawnOnExtinguishComponent.cs rename {Content.Server => Content.Shared}/_CP14/Temperature/CP14FireSpreadComponent.cs (79%) create mode 100644 Content.Shared/_CP14/Temperature/CP14FlammableDamageBonusComponent.cs create mode 100644 Content.Shared/_CP14/Temperature/CP14IgnitionModifierComponent.cs create mode 100644 Content.Shared/_CP14/Temperature/CP14SharedFireSpreadSystem.cs create mode 100644 Resources/Locale/en-US/_CP14/temperature/temperature.ftl create mode 100644 Resources/Locale/ru-RU/_CP14/temperature/temperature.ftl create mode 100644 Resources/Prototypes/_CP14/Entities/Objects/Tools/flint.yml create mode 100644 Resources/Prototypes/_CP14/Entities/Objects/Tools/torch.yml create mode 100644 Resources/Prototypes/_CP14/NPCs/base.yml create mode 100644 Resources/Prototypes/_CP14/NPCs/zombie.yml create mode 100644 Resources/Textures/_CP14/Objects/Tools/flint.rsi/icon.png create mode 100644 Resources/Textures/_CP14/Objects/Tools/flint.rsi/meta.json create mode 100644 Resources/Textures/_CP14/Objects/Tools/torch.rsi/icon.png create mode 100644 Resources/Textures/_CP14/Objects/Tools/torch.rsi/inhand-left.png create mode 100644 Resources/Textures/_CP14/Objects/Tools/torch.rsi/inhand-right.png create mode 100644 Resources/Textures/_CP14/Objects/Tools/torch.rsi/lit-inhand-left.png create mode 100644 Resources/Textures/_CP14/Objects/Tools/torch.rsi/lit-inhand-right.png create mode 100644 Resources/Textures/_CP14/Objects/Tools/torch.rsi/lit-overlay.png create mode 100644 Resources/Textures/_CP14/Objects/Tools/torch.rsi/meta.json create mode 100644 Resources/Textures/_CP14/Objects/Tools/torch.rsi/torch-spent.png create mode 100644 Resources/Textures/_CP14/Objects/Tools/torch.rsi/torch-unlit.png create mode 100644 Resources/Textures/_CP14/Objects/Tools/torch.rsi/unlit-inhand-left.png create mode 100644 Resources/Textures/_CP14/Objects/Tools/torch.rsi/unlit-inhand-right.png diff --git a/Content.Client/_CP14/Temperature/CP14ClientFireSpreadSystem.cs b/Content.Client/_CP14/Temperature/CP14ClientFireSpreadSystem.cs new file mode 100644 index 0000000000..1ffd123e78 --- /dev/null +++ b/Content.Client/_CP14/Temperature/CP14ClientFireSpreadSystem.cs @@ -0,0 +1,7 @@ +using Content.Shared._CP14.Temperature; + +namespace Content.Client._CP14.Temperature; + +public sealed partial class CP14ClientFireSpreadSystem : CP14SharedFireSpreadSystem +{ +} diff --git a/Content.Server/Atmos/EntitySystems/FlammableSystem.cs b/Content.Server/Atmos/EntitySystems/FlammableSystem.cs index cda8528544..bd03f8831a 100644 --- a/Content.Server/Atmos/EntitySystems/FlammableSystem.cs +++ b/Content.Server/Atmos/EntitySystems/FlammableSystem.cs @@ -1,4 +1,3 @@ -using Content.Server._CP14.Temperature; using Content.Server.Administration.Logs; using Content.Server.Atmos.Components; using Content.Server.IgnitionSource; @@ -6,6 +5,7 @@ using Content.Server.Stunnable; using Content.Server.Temperature.Components; using Content.Server.Temperature.Systems; using Content.Server.Damage.Components; +using Content.Shared._CP14.Temperature; using Content.Shared.ActionBlocker; using Content.Shared.Alert; using Content.Shared.Atmos; @@ -144,15 +144,16 @@ namespace Content.Server.Atmos.EntitySystems { if (args.Handled) return; - var isHotEvent = new IsHotEvent(); RaiseLocalEvent(args.Used, isHotEvent); if (!isHotEvent.IsHot) return; + /* //CP14 disabling igniting via direact interact. Only from DelayedIgnitionSource Ignite(uid, args.Used, flammable, args.User); args.Handled = true; + */ } private void OnExtinguishActivateInWorld(EntityUid uid, ExtinguishOnInteractComponent component, ActivateInWorldEvent args) @@ -263,6 +264,13 @@ namespace Content.Server.Atmos.EntitySystems public void UpdateAppearance(EntityUid uid, FlammableComponent? flammable = null, AppearanceComponent? appearance = null) { + //CrystallEdge bonfire moment + if (!Resolve(uid, ref flammable)) + return; + var ev = new OnFireChangedEvent(flammable.OnFire); + RaiseLocalEvent(uid, ref ev); + //CrystallEdge bonfire moment end + if (!Resolve(uid, ref flammable, ref appearance)) return; @@ -316,12 +324,6 @@ namespace Content.Server.Atmos.EntitySystems _ignitionSourceSystem.SetIgnited(uid, false); - - //CrystallEdge bonfire moment - var ev = new OnFireChangedEvent(flammable.OnFire); - RaiseLocalEvent(uid, ref ev); - //CrystallEdge bonfire moment end - UpdateAppearance(uid, flammable); } @@ -343,11 +345,6 @@ namespace Content.Server.Atmos.EntitySystems else _adminLogger.Add(LogType.Flammable, $"{ToPrettyString(uid):target} set on fire by {ToPrettyString(ignitionSource):actor}"); flammable.OnFire = true; - - //CrystallEdge fireplace moment - var ev = new OnFireChangedEvent(flammable.OnFire); - RaiseLocalEvent(uid, ref ev); - //CrystallEdge fireplace moment end } UpdateAppearance(uid, flammable); diff --git a/Content.Server/Audio/AmbientSoundSystem.cs b/Content.Server/Audio/AmbientSoundSystem.cs index 2eec83c983..843659daad 100644 --- a/Content.Server/Audio/AmbientSoundSystem.cs +++ b/Content.Server/Audio/AmbientSoundSystem.cs @@ -1,6 +1,7 @@ using Content.Server._CP14.Temperature; using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; +using Content.Shared._CP14.Temperature; using Content.Shared.Audio; using Content.Shared.Mobs; using Content.Shared.Power; diff --git a/Content.Server/_CP14/Temperature/CP14DespawnOnExtinguishComponent.cs b/Content.Server/_CP14/Temperature/CP14DespawnOnExtinguishComponent.cs deleted file mode 100644 index 0b101b0d42..0000000000 --- a/Content.Server/_CP14/Temperature/CP14DespawnOnExtinguishComponent.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Content.Server._CP14.Temperature; - -[RegisterComponent, Access(typeof(CP14FireSpreadSystem))] -public sealed partial class CP14DespawnOnExtinguishComponent : Component -{ -} diff --git a/Content.Server/_CP14/Temperature/CP14FireSpreadSystem.cs b/Content.Server/_CP14/Temperature/CP14FireSpreadSystem.cs index 893bc18c45..631ffa4df0 100644 --- a/Content.Server/_CP14/Temperature/CP14FireSpreadSystem.cs +++ b/Content.Server/_CP14/Temperature/CP14FireSpreadSystem.cs @@ -2,7 +2,11 @@ using System.Linq; using System.Numerics; using Content.Server.Atmos.Components; using Content.Server.Atmos.EntitySystems; +using Content.Server.DoAfter; +using Content.Shared._CP14.Temperature; +using Content.Shared.Interaction; using Content.Shared.Maps; +using Content.Shared.Weapons.Melee.Events; using Robust.Shared.Map; using Robust.Shared.Map.Components; using Robust.Shared.Prototypes; @@ -11,7 +15,7 @@ using Robust.Shared.Timing; namespace Content.Server._CP14.Temperature; -public sealed partial class CP14FireSpreadSystem : EntitySystem +public sealed partial class CP14FireSpreadSystem : CP14SharedFireSpreadSystem { [Dependency] private readonly FlammableSystem _flammable = default!; [Dependency] private readonly IGameTiming _gameTiming = default!; @@ -20,29 +24,39 @@ public sealed partial class CP14FireSpreadSystem : EntitySystem [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly SharedMapSystem _mapSystem = default!; [Dependency] private readonly TileSystem _tile = default!; - [Dependency] private readonly ITileDefinitionManager _tiledef = default!; + [Dependency] private readonly ITileDefinitionManager _tileDef = default!; - private EntProtoId _fireProto = "CP14Fire"; + private readonly EntProtoId _fireProto = "CP14Fire"; + + private readonly HashSet> _spreadEnts = new(); public override void Initialize() { - SubscribeLocalEvent(OnCompInit); - SubscribeLocalEvent(OnFireChanged); + base.Initialize(); + + SubscribeLocalEvent(OnFlammableIgnited); + SubscribeLocalEvent(OnFlammableMeleeHit); } - private void OnFireChanged(Entity ent, ref OnFireChangedEvent args) + private void OnFlammableMeleeHit(Entity ent, ref MeleeHitEvent args) { - if (!args.OnFire) - QueueDel(ent); - } - - private void OnCompInit(Entity ent, ref OnFireChangedEvent args) - { - if (!args.OnFire) + if (!TryComp(ent, out var flammable)) return; - var cooldown = _random.NextFloat(ent.Comp.SpreadCooldownMin, ent.Comp.SpreadCooldownMax); - ent.Comp.NextSpreadTime = _gameTiming.CurTime + TimeSpan.FromSeconds(cooldown); + if (!flammable.OnFire) + return; + + args.BonusDamage += ent.Comp.DamagePerStack * flammable.FireStacks; + } + + private void OnFlammableIgnited(Entity ent, ref CP14IgnitionDoAfter args) + { + if (args.Cancelled || args.Handled) + return; + + _flammable.AdjustFireStacks(ent, ent.Comp.FirestacksOnIgnite, ent.Comp, true); + + args.Handled = true; } public override void Update(float frameTime) @@ -76,9 +90,10 @@ public sealed partial class CP14FireSpreadSystem : EntitySystem private void UpdateFireSpread() { - List> spreadUids = new(); - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var spread, out var flammable, out var xform)) + _spreadEnts.Clear(); + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out _, out var spread, out var flammable, out var xform)) { if (!flammable.OnFire) continue; @@ -92,61 +107,57 @@ public sealed partial class CP14FireSpreadSystem : EntitySystem var cooldown = _random.NextFloat(spread.SpreadCooldownMin, spread.SpreadCooldownMax); spread.NextSpreadTime = _gameTiming.CurTime + TimeSpan.FromSeconds(cooldown); - spreadUids.Add(new Entity(uid, spread)); + _spreadEnts.Add(new Entity(uid, spread)); } - foreach (var uid in spreadUids) + foreach (var uid in _spreadEnts) { - IgniteEntities(uid, uid.Comp); - IgniteTiles(uid, uid.Comp); + IgniteEntities(uid); + IgniteTiles(uid); } } - private void IgniteEntities(EntityUid uid, CP14FireSpreadComponent spread) + private void IgniteEntities(Entity spread) { - var targets = _lookup.GetEntitiesInRange(_transform.GetMapCoordinates(uid), - spread.Radius, + var targets = _lookup.GetEntitiesInRange(_transform.GetMapCoordinates(spread), + spread.Comp.Radius, LookupFlags.Uncontained); foreach (var target in targets) { - if (!_random.Prob(spread.Prob)) + if (!_random.Prob(spread.Comp.Prob)) continue; - _flammable.Ignite(target, uid); + _flammable.Ignite(target, spread); } } - private void IgniteTiles(EntityUid uid, CP14FireSpreadComponent spread) + private void IgniteTiles(Entity spread) { - var xform = Transform(uid); - if (!TryComp(xform.GridUid, out var grid)) - return; - + var xform = Transform(spread); // Ignore items inside containers - if (!HasComp(xform.ParentUid)) + if (!TryComp(xform.ParentUid, out var grid)) return; var localPos = xform.Coordinates.Position; - var tileRefs = _mapSystem.GetLocalTilesIntersecting(grid.Owner, + var tileRefs = _mapSystem.GetLocalTilesIntersecting(xform.ParentUid, grid, new Box2( - localPos + new Vector2(-spread.Radius, -spread.Radius), - localPos + new Vector2(spread.Radius, spread.Radius))) + localPos + new Vector2(-spread.Comp.Radius, -spread.Comp.Radius), + localPos + new Vector2(spread.Comp.Radius, spread.Comp.Radius))) .ToList(); - - foreach (var tileref in tileRefs) + foreach (var tileRef in tileRefs) { - if (!_random.Prob(spread.ProbTile)) + if (!_random.Prob(spread.Comp.ProbTile)) continue; - var tile = tileref.Tile.GetContentTileDefinition(); + var tile = tileRef.Tile.GetContentTileDefinition(); if (tile.BurnedTile is null) continue; - Spawn(_fireProto, _mapSystem.ToCenterCoordinates(tileref, grid)); - _tile.ReplaceTile(tileref, (ContentTileDefinition)_tiledef[tile.BurnedTile]); + Spawn(_fireProto, _mapSystem.ToCenterCoordinates(tileRef, grid)); + _tile.ReplaceTile(tileRef, (ContentTileDefinition)_tileDef[tile.BurnedTile]); } } } diff --git a/Content.Server/_CP14/Temperature/CP14FlammableAmbientSoundComponent.cs b/Content.Server/_CP14/Temperature/CP14FlammableAmbientSoundComponent.cs index 548997f81f..bf3984068e 100644 --- a/Content.Server/_CP14/Temperature/CP14FlammableAmbientSoundComponent.cs +++ b/Content.Server/_CP14/Temperature/CP14FlammableAmbientSoundComponent.cs @@ -9,12 +9,3 @@ namespace Content.Server._CP14.Temperature; public sealed partial class CP14FlammableAmbientSoundComponent : Component { } - -/// -/// Raised whenever an FlammableComponen OnFire is Changed -/// -[ByRefEvent] -public readonly record struct OnFireChangedEvent(bool OnFire) -{ - public readonly bool OnFire = OnFire; -} diff --git a/Content.Server/_CP14/Temperature/Fireplace/CP14FireplaceSystem.cs b/Content.Server/_CP14/Temperature/Fireplace/CP14FireplaceSystem.cs index c0d24707eb..bba2430003 100644 --- a/Content.Server/_CP14/Temperature/Fireplace/CP14FireplaceSystem.cs +++ b/Content.Server/_CP14/Temperature/Fireplace/CP14FireplaceSystem.cs @@ -1,15 +1,10 @@ using Content.Server.Atmos.Components; -using Content.Server.Atmos.EntitySystems; -using Content.Server.Popups; using Content.Server.Stack; using Content.Shared._CP14.Temperature; -using Content.Shared.Interaction; using Content.Shared.Stacks; -using Content.Shared.Throwing; using Robust.Server.Audio; using Robust.Server.Containers; using Robust.Server.GameObjects; -using Robust.Shared.Physics.Events; using Robust.Shared.Timing; namespace Content.Server._CP14.Temperature.Fireplace; diff --git a/Content.Shared/_CP14/Temperature/CP14ActiveFireSpreadingComponent.cs b/Content.Shared/_CP14/Temperature/CP14ActiveFireSpreadingComponent.cs new file mode 100644 index 0000000000..8164a4e5e1 --- /dev/null +++ b/Content.Shared/_CP14/Temperature/CP14ActiveFireSpreadingComponent.cs @@ -0,0 +1,6 @@ +namespace Content.Shared._CP14.Temperature; + +[RegisterComponent, Access(typeof(CP14SharedFireSpreadSystem))] +public sealed partial class CP14ActiveFireSpreadingComponent : Component +{ +} diff --git a/Content.Shared/_CP14/Temperature/CP14DelayedIgnitionSourceComponent.cs b/Content.Shared/_CP14/Temperature/CP14DelayedIgnitionSourceComponent.cs new file mode 100644 index 0000000000..4d72d27905 --- /dev/null +++ b/Content.Shared/_CP14/Temperature/CP14DelayedIgnitionSourceComponent.cs @@ -0,0 +1,16 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared._CP14.Temperature; + +/// +/// Allows you to fire entities through interacting with them after a delay. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, Access(typeof(CP14SharedFireSpreadSystem))] +public sealed partial class CP14DelayedIgnitionSourceComponent : Component +{ + [DataField, AutoNetworkedField] + public bool Enabled; + + [DataField] + public TimeSpan Delay = TimeSpan.FromSeconds(3f); +} diff --git a/Content.Shared/_CP14/Temperature/CP14DespawnOnExtinguishComponent.cs b/Content.Shared/_CP14/Temperature/CP14DespawnOnExtinguishComponent.cs new file mode 100644 index 0000000000..fcb5071a4a --- /dev/null +++ b/Content.Shared/_CP14/Temperature/CP14DespawnOnExtinguishComponent.cs @@ -0,0 +1,6 @@ +namespace Content.Shared._CP14.Temperature; + +[RegisterComponent, Access(typeof(CP14SharedFireSpreadSystem))] +public sealed partial class CP14DespawnOnExtinguishComponent : Component +{ +} diff --git a/Content.Server/_CP14/Temperature/CP14FireSpreadComponent.cs b/Content.Shared/_CP14/Temperature/CP14FireSpreadComponent.cs similarity index 79% rename from Content.Server/_CP14/Temperature/CP14FireSpreadComponent.cs rename to Content.Shared/_CP14/Temperature/CP14FireSpreadComponent.cs index 049d4d5c51..7eae565a48 100644 --- a/Content.Server/_CP14/Temperature/CP14FireSpreadComponent.cs +++ b/Content.Shared/_CP14/Temperature/CP14FireSpreadComponent.cs @@ -1,10 +1,10 @@ -namespace Content.Server._CP14.Temperature; +namespace Content.Shared._CP14.Temperature; /// /// A component that allows fire to spread to nearby objects. The basic mechanics of a spreading fire /// -[RegisterComponent, Access(typeof(CP14FireSpreadSystem))] +[RegisterComponent, Access(typeof(CP14SharedFireSpreadSystem))] public sealed partial class CP14FireSpreadComponent : Component { /// @@ -17,25 +17,25 @@ public sealed partial class CP14FireSpreadComponent : Component /// chance of spreading to neighboring properties /// [DataField] - public float Prob = 0.3f; + public float Prob = 0.1f; /// /// chance of tile spreading to neighboring properties /// [DataField] - public float ProbTile = 0.2f; + public float ProbTile = 0.1f; /// /// how often objects will try to set the neighbors on fire. In Seconds /// [DataField] - public float SpreadCooldownMin = 4f; + public float SpreadCooldownMin = 5f; /// /// how often objects will try to set the neighbors on fire. In Seconds /// [DataField] - public float SpreadCooldownMax = 14f; + public float SpreadCooldownMax = 10f; /// /// the time of the next fire spread diff --git a/Content.Shared/_CP14/Temperature/CP14FlammableDamageBonusComponent.cs b/Content.Shared/_CP14/Temperature/CP14FlammableDamageBonusComponent.cs new file mode 100644 index 0000000000..f95b1fd4de --- /dev/null +++ b/Content.Shared/_CP14/Temperature/CP14FlammableDamageBonusComponent.cs @@ -0,0 +1,19 @@ +using Content.Shared.Damage; + +namespace Content.Shared._CP14.Temperature; + +/// +/// Add bonus damage to melee attacks per flammable stack +/// +[RegisterComponent, Access(typeof(CP14SharedFireSpreadSystem))] +public sealed partial class CP14FlammableBonusDamageComponent : Component +{ + [DataField] + public DamageSpecifier DamagePerStack = new() + { + DamageDict = new() + { + {"Heat", 0.3}, + } + }; +} diff --git a/Content.Shared/_CP14/Temperature/CP14IgnitionModifierComponent.cs b/Content.Shared/_CP14/Temperature/CP14IgnitionModifierComponent.cs new file mode 100644 index 0000000000..f01a75d4a0 --- /dev/null +++ b/Content.Shared/_CP14/Temperature/CP14IgnitionModifierComponent.cs @@ -0,0 +1,14 @@ +namespace Content.Shared._CP14.Temperature; + +/// +/// Modifies the burning of this essence. +/// +[RegisterComponent, Access(typeof(CP14SharedFireSpreadSystem))] +public sealed partial class CP14IgnitionModifierComponent : Component +{ + [DataField] + public float IgnitionTimeModifier = 1f; + + [DataField] + public bool HideCaution = false; +} diff --git a/Content.Shared/_CP14/Temperature/CP14SharedFireSpreadSystem.cs b/Content.Shared/_CP14/Temperature/CP14SharedFireSpreadSystem.cs new file mode 100644 index 0000000000..0f4d53b030 --- /dev/null +++ b/Content.Shared/_CP14/Temperature/CP14SharedFireSpreadSystem.cs @@ -0,0 +1,112 @@ +using Content.Shared.DoAfter; +using Content.Shared.IdentityManagement; +using Content.Shared.Interaction; +using Content.Shared.Popups; +using Content.Shared.Weapons.Melee.Events; +using Robust.Shared.Serialization; +using Robust.Shared.Timing; + +namespace Content.Shared._CP14.Temperature; + +public abstract partial class CP14SharedFireSpreadSystem : EntitySystem +{ + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnFireChangedSpread); + SubscribeLocalEvent(OnFireChangedDespawn); + SubscribeLocalEvent(OnIgnitionSourceFireChanged); + SubscribeLocalEvent(OnDelayedIgniteAttempt); + } + + private void OnFireChangedDespawn(Entity ent, ref OnFireChangedEvent args) + { + if (!args.OnFire) + QueueDel(ent); + } + + private void OnFireChangedSpread(Entity ent, ref OnFireChangedEvent args) + { + if (args.OnFire) + { + EnsureComp(ent); + } + else + { + if (HasComp(ent)) + RemCompDeferred(ent); + } + + ent.Comp.NextSpreadTime = _gameTiming.CurTime + TimeSpan.FromSeconds(ent.Comp.SpreadCooldownMax); + } + + private void OnDelayedIgniteAttempt(Entity ent, ref AfterInteractEvent args) + { + if (!args.CanReach || args.Handled || args.Target == null) + return; + + if (!ent.Comp.Enabled) + return; + + var time = ent.Comp.Delay; + var caution = true; + + if (TryComp(args.Target, out var modifier)) + { + time *= modifier.IgnitionTimeModifier; + caution = !modifier.HideCaution; + } + + _doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, + args.User, + time, + new CP14IgnitionDoAfter(), + args.Target, + args.Target, + args.Used) + { + BreakOnDamage = true, + BreakOnMove = true, + BreakOnDropItem = true, + BreakOnHandChange = true, + BlockDuplicate = true, + CancelDuplicate = true + }); + + var selfMessage = Loc.GetString("cp14-attempt-ignite-caution-self", + ("target", MetaData(args.Target.Value).EntityName)); + var otherMessage = Loc.GetString("cp14-attempt-ignite-caution", + ("name", Identity.Entity(args.User, EntityManager)), + ("target", Identity.Entity(args.Target.Value, EntityManager))); + _popup.PopupPredicted(selfMessage, + otherMessage, + args.User, + args.User, + caution ? PopupType.MediumCaution : PopupType.Small); + } + + private void OnIgnitionSourceFireChanged(Entity ent, ref OnFireChangedEvent args) + { + ent.Comp.Enabled = args.OnFire; + Dirty(ent); + } +} + +/// +/// Raised whenever an FlammableComponent OnFire is Changed +/// +[ByRefEvent] +public readonly record struct OnFireChangedEvent(bool OnFire) +{ + public readonly bool OnFire = OnFire; +} + +[Serializable, NetSerializable] +public sealed partial class CP14IgnitionDoAfter : SimpleDoAfterEvent +{ +} diff --git a/Resources/Locale/en-US/_CP14/temperature/temperature.ftl b/Resources/Locale/en-US/_CP14/temperature/temperature.ftl new file mode 100644 index 0000000000..dfaf1425ef --- /dev/null +++ b/Resources/Locale/en-US/_CP14/temperature/temperature.ftl @@ -0,0 +1,2 @@ +cp14-attempt-ignite-caution-self = You start setting {$target} on fire! +cp14-attempt-ignite-caution = {$name} is starting to set {$target} on fire! \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_CP14/temperature/temperature.ftl b/Resources/Locale/ru-RU/_CP14/temperature/temperature.ftl new file mode 100644 index 0000000000..e68c30ac56 --- /dev/null +++ b/Resources/Locale/ru-RU/_CP14/temperature/temperature.ftl @@ -0,0 +1,2 @@ +cp14-attempt-ignite-caution-self = Вы начинаете поджигать {$target}! +cp14-attempt-ignite-caution = {$name} начинает поджигать {$target}! \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Catalog/Fills/crates.yml b/Resources/Prototypes/_CP14/Catalog/Fills/crates.yml index e7707eaa7f..68bd2c962d 100644 --- a/Resources/Prototypes/_CP14/Catalog/Fills/crates.yml +++ b/Resources/Prototypes/_CP14/Catalog/Fills/crates.yml @@ -59,6 +59,7 @@ - id: CP14Rope - id: CP14Nail10 - id: CP14EnergyCrystalSmall + - id: CP14Lighter - id: CP14BaseSharpeningStone - !type:NestedSelector tableId: CP14RandomVials diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Fire/T0_flame_creation.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Fire/T0_flame_creation.yml index c3088bb389..255149d943 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Fire/T0_flame_creation.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Fire/T0_flame_creation.yml @@ -76,7 +76,7 @@ - state: inhand-right shader: unshaded - type: TimedDespawn - lifetime: 60 # 1 min + lifetime: 120 # 2 min - type: Sprite sprite: _CP14/Objects/Misc/artificial_flame.rsi layers: @@ -84,6 +84,8 @@ shader: unshaded - type: PointLight color: "#eea911" + energy: 0.5 + radius: 2.5 - type: Fixtures fixtures: fix1: @@ -138,9 +140,8 @@ variation: 0.250 volume: -12 cPAnimationLength: 0.15 - - type: IgnitionSource - temperature: 400 - ignited: true + - type: CP14DelayedIgnitionSource + enabled: true - type: entity parent: CP14BaseSpellScrollFire diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Meta/T0_mana_gift.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Meta/T0_mana_gift.yml index 8a5fb20cb3..101338222f 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Meta/T0_mana_gift.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Meta/T0_mana_gift.yml @@ -33,7 +33,7 @@ - CP14MagicEnergyCrystalSlot itemIconStyle: BigAction interactOnMiss: false - canTargetSelf: false + canTargetSelf: true sound: !type:SoundPathSpecifier path: /Audio/Magic/rumble.ogg icon: diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Water/T0_water_creation.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Water/T0_water_creation.yml index 67e90d2807..12b2211370 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Water/T0_water_creation.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Water/T0_water_creation.yml @@ -46,9 +46,12 @@ - type: entity id: CP14LiquidDropWater - parent: BaseItem + parent: + - BaseItem + - ItemHeftyBase name: floating liquid drop description: A clot of liquid held in the shape of a ball by magic + suffix: Water categories: [ ForkFiltered ] components: - type: Item diff --git a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Water/T1_beer_creation.yml b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Water/T1_beer_creation.yml index 50be53a0cc..61717be8ea 100644 --- a/Resources/Prototypes/_CP14/Entities/Actions/Spells/Water/T1_beer_creation.yml +++ b/Resources/Prototypes/_CP14/Entities/Actions/Spells/Water/T1_beer_creation.yml @@ -54,6 +54,7 @@ id: CP14LiquidDropBeer parent: CP14LiquidDropWater categories: [ ForkFiltered ] + suffix: Beer components: - type: SolutionContainerManager solutions: diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/NPC/undead.yml b/Resources/Prototypes/_CP14/Entities/Mobs/NPC/undead.yml index eda8dc58fd..f7bd47d491 100644 --- a/Resources/Prototypes/_CP14/Entities/Mobs/NPC/undead.yml +++ b/Resources/Prototypes/_CP14/Entities/Mobs/NPC/undead.yml @@ -7,7 +7,7 @@ components: - type: HTN rootTask: - task: SimpleHostileCompound + task: CP14ZombieCompound blackboard: NavClimb: !type:Bool true @@ -23,7 +23,7 @@ suffix: Zombie. Easy categories: [ HideSpawnMenu ] components: - - type: Loadout + - type: Loadout prototypes: [ CP14MobUndeadEasy1 ] - type: entity diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/Species/base.yml b/Resources/Prototypes/_CP14/Entities/Mobs/Species/base.yml index 10a0c9e967..8086a03439 100644 --- a/Resources/Prototypes/_CP14/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/_CP14/Entities/Mobs/Species/base.yml @@ -223,6 +223,8 @@ - type: CP14DemiplaneStabilizer requireAlive: true - type: CanEnterCryostorage + - type: CP14IgnitionModifier + ignitionTimeModifier: 2.5 - type: entity diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/Species/zombie.yml b/Resources/Prototypes/_CP14/Entities/Mobs/Species/zombie.yml index 2a58373abc..f7765b338e 100644 --- a/Resources/Prototypes/_CP14/Entities/Mobs/Species/zombie.yml +++ b/Resources/Prototypes/_CP14/Entities/Mobs/Species/zombie.yml @@ -41,6 +41,14 @@ - map: [ "head" ] - map: [ "pocket1" ] - map: [ "pocket2" ] + - map: ["enum.HumanoidVisualLayers.Handcuffs"] + color: "#ffffff" + sprite: Objects/Misc/handcuffs.rsi + state: body-overlay-2 + visible: false + - type: Cuffable + - type: Hands + - type: ComplexInteraction - type: Icon sprite: _CP14/Mobs/Species/Zombie/parts.rsi state: full @@ -121,6 +129,8 @@ - type: Climbing - type: ReplacementAccent accent: zombie + - type: FireVisuals + alternateState: Standing #TODO - custom visuals - type: UserInterface interfaces: enum.StrippingUiKey.Key: diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Tools/bucket.yml b/Resources/Prototypes/_CP14/Entities/Objects/Tools/bucket.yml index 5e60287e25..c6f412d4e1 100644 --- a/Resources/Prototypes/_CP14/Entities/Objects/Tools/bucket.yml +++ b/Resources/Prototypes/_CP14/Entities/Objects/Tools/bucket.yml @@ -8,7 +8,6 @@ - type: Drink solution: bucket ignoreEmpty: true - - type: Clickable - type: Sprite sprite: _CP14/Objects/Tools/wooden_bucket.rsi layers: diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Tools/flint.yml b/Resources/Prototypes/_CP14/Entities/Objects/Tools/flint.yml new file mode 100644 index 0000000000..8d73e48a59 --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Objects/Tools/flint.yml @@ -0,0 +1,15 @@ +- type: entity + parent: BaseItem + id: CP14Lighter + name: flint and steel + description: "Setting things on fire. Absolutely, 100% not from minecraft." # TODO: remove minecraft sprite and desc + categories: [ ForkFiltered ] + components: + - type: Item + size: Tiny + - type: Sprite + sprite: _CP14/Objects/Tools/flint.rsi + state: icon + - type: CP14DelayedIgnitionSource + enabled: true + # TODO: Damageable, Ignite attempt self damage, Ignite prob \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Objects/Tools/torch.yml b/Resources/Prototypes/_CP14/Entities/Objects/Tools/torch.yml new file mode 100644 index 0000000000..7d01108acd --- /dev/null +++ b/Resources/Prototypes/_CP14/Entities/Objects/Tools/torch.yml @@ -0,0 +1,79 @@ +- type: entity + id: CP14Torch + parent: BaseItem + name: torch + description: At its core, a stick burning on one side. Used to light up the area. + categories: [ ForkFiltered ] + components: + - type: Sprite + sprite: _CP14/Objects/Tools/torch.rsi + layers: + - state: torch-unlit + map: ["fuel"] + - type: Item + size: Small + - type: CP14FlammableAmbientSound + - type: AmbientSound + enabled: false + volume: -5 + range: 5 + sound: + path: /Audio/Ambience/Objects/fireplace.ogg + - type: Appearance + - type: Reactive + groups: + Flammable: [ Touch ] + Extinguish: [ Touch ] + - type: Flammable + fireSpread: false + canResistFire: false + alwaysCombustible: true + canExtinguish: true + firestacksOnIgnite: 0.5 + damage: + types: + Heat: 0 + - type: CP14Fireplace + maxFuelLimit: 200 + fuel: 200 + - type: FireVisuals + sprite: _CP14/Objects/Tools/torch.rsi + normalState: lit-overlay + - type: ToggleableLightVisuals + spriteLayer: null + inhandVisuals: + left: + - state: lit-inhand-left + shader: unshaded + right: + - state: lit-inhand-right + shader: unshaded + - type: GenericVisualizer + visuals: + enum.FireplaceFuelVisuals.Status: + fuel: + Empty: { state: torch-spent } + Medium: { state: torch-unlit } + Full: { state: torch-unlit } + - type: Damageable + damageContainer: Inorganic + damageModifierSet: Wood + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 50 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] + - type: CP14DelayedIgnitionSource + - type: CP14IgnitionModifier + hideCaution: true + - type: MeleeWeapon + attackRate: 1.5 + wideAnimationRotation: 225 + wideAnimation: CP14WeaponArcSlash + damage: + types: + Blunt: 4 + - type: CP14FlammableBonusDamage \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Flora/grasshighbush.yml b/Resources/Prototypes/_CP14/Entities/Structures/Flora/grasshighbush.yml index 445dae26fe..c68dbe0547 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Flora/grasshighbush.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Flora/grasshighbush.yml @@ -92,6 +92,9 @@ collection: CP14GrassGathering - type: TriggerOnCollide fixtureID: fix1 + - type: CP14IgnitionModifier + ignitionTimeModifier: 0.75 + hideCaution: true - type: entity id: CP14RandomBushOffsetSpawner diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/wallmount.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/wallmount.yml index 3f6f029c7e..b7e517b9bf 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/wallmount.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/wallmount.yml @@ -37,13 +37,6 @@ behaviors: - !type:DoActsBehavior acts: [ "Destruction" ] - - trigger: - !type:DamageTypeTrigger - damageType: Heat - damage: 50 - behaviors: - - !type:DoActsBehavior - acts: [ "Destruction" ] - type: CP14FlammableAmbientSound - type: AmbientSound enabled: false @@ -81,6 +74,8 @@ - type: Construction graph: CP14WallmountTorch node: CP14WallmountTorch + - type: CP14IgnitionModifier + hideCaution: true - type: entity id: CP14WallmountTorchAlwaysPowered diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Specific/Alchemy/heater.yml b/Resources/Prototypes/_CP14/Entities/Structures/Specific/Alchemy/heater.yml index 33bf5aaa55..59d200b6e5 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Specific/Alchemy/heater.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Specific/Alchemy/heater.yml @@ -53,13 +53,16 @@ maxItemSize: Normal grid: - 0,0,2,2 - blacklist: + cP14Ignorelist: components: - IgnitionSource + - CP14DelayedIgnitionSource - type: UserInterface interfaces: enum.StorageUiKey.Key: type: StorageBoundUserInterface + - type: CP14IgnitionModifier + hideCaution: true - type: entity id: CP14AlchemyFurnace diff --git a/Resources/Prototypes/_CP14/Entities/fire.yml b/Resources/Prototypes/_CP14/Entities/fire.yml index f3433b0a0c..dc3c5addea 100644 --- a/Resources/Prototypes/_CP14/Entities/fire.yml +++ b/Resources/Prototypes/_CP14/Entities/fire.yml @@ -6,6 +6,7 @@ placement: mode: SnapgridCenter components: + - type: Clickable - type: Sprite drawdepth: Effects snapCardinals: true @@ -75,9 +76,11 @@ damage: types: Heat: 0 + - type: Damageable - type: CP14Fireplace fuel: 15 - #- type: CP14AutoIgnite + - type: CP14AutoIgnite + - type: CP14ActiveFireSpreading - type: TimedDespawn lifetime: 60 - type: CP14FireSpread diff --git a/Resources/Prototypes/_CP14/Loadouts/Jobs/general.yml b/Resources/Prototypes/_CP14/Loadouts/Jobs/general.yml index 31ed3c1b89..992090b552 100644 --- a/Resources/Prototypes/_CP14/Loadouts/Jobs/general.yml +++ b/Resources/Prototypes/_CP14/Loadouts/Jobs/general.yml @@ -304,6 +304,7 @@ - CP14BaseDagger - CP14BaseSickle - CP14BasePickaxe + - CP14Lighter - type: loadout id: CP14MagicHealingStaff @@ -388,6 +389,12 @@ back: - CP14BasePickaxe +- type: loadout + id: CP14Lighter + storage: + back: + - CP14Lighter + # Spells - type: loadoutGroup diff --git a/Resources/Prototypes/_CP14/NPCs/base.yml b/Resources/Prototypes/_CP14/NPCs/base.yml new file mode 100644 index 0000000000..c7331317ed --- /dev/null +++ b/Resources/Prototypes/_CP14/NPCs/base.yml @@ -0,0 +1,40 @@ +- type: htnCompound + id: CP14MeleeWeaponlessCombatCompound + branches: + - tasks: + - !type:HTNPrimitiveTask + operator: !type:UtilityOperator + proto: NearbyMeleeTargets + - !type:HTNCompoundTask + task: CP14BeforeMeleeAttackTargetWeaponlessCompound + +- type: htnCompound + id: CP14BeforeMeleeAttackTargetWeaponlessCompound + branches: + - preconditions: + - !type:BuckledPrecondition + isBuckled: true + tasks: + - !type:HTNPrimitiveTask + operator: !type:UnbuckleOperator + shutdownState: TaskFinished + + - preconditions: + - !type:PulledPrecondition + isPulled: true + tasks: + - !type:HTNPrimitiveTask + operator: !type:UnPullOperator + shutdownState: TaskFinished + + - preconditions: + - !type:InContainerPrecondition + isInContainer: true + tasks: + - !type:HTNCompoundTask + task: EscapeCompound + + # Melee combat (unarmed or otherwise) + - tasks: + - !type:HTNCompoundTask + task: MeleeAttackTargetCompound \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/NPCs/zombie.yml b/Resources/Prototypes/_CP14/NPCs/zombie.yml new file mode 100644 index 0000000000..ca6434749a --- /dev/null +++ b/Resources/Prototypes/_CP14/NPCs/zombie.yml @@ -0,0 +1,9 @@ +- type: htnCompound + id: CP14ZombieCompound + branches: + - tasks: + - !type:HTNCompoundTask + task: CP14MeleeWeaponlessCombatCompound + - tasks: + - !type:HTNCompoundTask + task: IdleCompound \ No newline at end of file diff --git a/Resources/Textures/_CP14/Objects/Tools/flint.rsi/icon.png b/Resources/Textures/_CP14/Objects/Tools/flint.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f3b04643fa9a1010cabea9dfb6e9ea51df31780e GIT binary patch literal 414 zcmV;P0b%}$P)Px$SV=@dR9J=Wl`)FKKp2JJpDY?H3rRvMn;=t&s24~Z)8s0q)>{M*kpl#451;|@ z0D^^G&_WQ!{97!@cAMF8g@yULf#Lt(y!T)LjYgySZ-imUVHonO=6%R6pH8PBA`lTT zmrGI=VAQ=hnM^oI5*&|5%w{tPAut>cm7S1sz%)&yX^PEeLyyOUtEy7nUta(-<8U~@ zaU1|ZQ54Gd0}>JZ6}1I0Gq&69^BhGHfA2u2)A>~&q--3GMjQkI27>_>iv`x}HF=)L z?RFcjRtvk`4)^Xb2wW}~?Du=V-EJ@G$B($K%j5Bw zvn=CYug8w#aHG+XibA=BaU5elpQ9{G0D$lNXf~U*MJNl%^Bm{%8MbYs+wG#??}Mm* z0?JtlA-F6{oK7bg#@BnU*Xw&a005R{v1M5=`Px$;Ymb6R9Hu2WEfz;IKcKZ3{MBVPSX1?I`0xuo+C;TsnIl`4gguson*|gsQ3s& z#>v|RJxEXiIlkv_@MZY(=o!P;d1o02MFq_q@b~2#hM#9HF$iQH$7=`G9q?hg<$rb) zJqBiR5r*GaZZUjYa}#eUP}KpT_~!~yXJ8T)0y_W%2swgk4!~wP$N_}X0@WM<3VK#~ z83tAzHI#G1LQ#sP7`_WyhN-!m-#&cTozE6)IP#Je}&;ZYH1$IP%|!5gdv z6Gb5qYp?tN-nTytu}ps$V(Sg?S`Kmzwvv%72Y@UF87M2l$ME>gCkE>uKfn$E0Z<5l zKqTi622hp+l>=+9e#coXlk5PHV3P23aSW-5 zdpm2R7qg>4oBD%^4i=8eag&`4#58k`oI7;u)-CamM{7D4q;e@oE$N)WA=lU<9JVZi zgHhGm+;~lO@z=NK-hBVRnce(yQ=9$Tw)yfr4VDWYvaDf|%468gvKGYfJK(k8A=`xC zTs*&Px3AEeaW?Iso_5zE*)++X<(D69UD(vc`r>QVy4!CLRqf?#YG}{jetScVUZUOn z?x)WkJ6S$(h0WzlSsl7zQuDzBf!A7B^}p|C*s)V$*YovUr#A5f-Ir%zd{)Uf`J{`= ze%}BkMu7u?``8yxKcDcmwy2{0hc(0Z>I#|eCt8~{)#{7pFuPxpd*=T0?56u=Gdma- zTzQnAZF6S(_epP-?f;a>u8?^BY|(=j?IO;kO*=LoGoQoEwwu{v(xp3x88R;Q8BViQ za0@jlHex4<?^!U}M`U+1n~d> literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CP14/Objects/Tools/torch.rsi/inhand-right.png b/Resources/Textures/_CP14/Objects/Tools/torch.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..b5689d2b4c47a37d4f2eb87d13e38b952a763c4c GIT binary patch literal 606 zcmV-k0-^nhP)Px%7)eAyRCr$PnlVemKorMc!O%j9U@La%pcsdaieJJn<`;2xc6R6{E)E@x;Ls&v z6%2)z2$44&1Zk7Idw1dP@?5&)?%x0R{_i6E(}Rxx^*XK}7yvt<;{dsDBGgCX;d$MX*>dy>-fLIxWA70Lvwe_&tJqyV_yaY}s*fI=^Xwd{Zpx=7K$4xrErVJ$l# zgf3DvumdRcLRiZV2%(D<4eS64y%5&2148H`MFTs4LNA21>;NCSXfvdB-T}5lTIT^& zLs|?xOlOoN08QDusqwNI(vko)W$&f{*bHg40f>u9d_!P6HNt4_@@xdR_jB!3}fi0x9`?6LzU1|7QPlu@y&pZTUoYnQ_pDu z5E;DbSCT1FD*I>wP&vT$XO#f>^pS)tcqIVhHpXAuuRU1-)aR4|P!Du%Jp*v9BW>5i s4rrUWYv-{8T+H7@-y%Y9K6wN@p;?X8UW zum+>_&^y#CnU9GEu4~dRne+Z9WjUu?_ttKwBRj8&qanC?;SCeYqLZmh>3uV`tYr9S zIbiz-@$zGxv2C=0Nkw&~6R;!jA+r=xh6C%(kMRUPoxzuJA=1x})SJ4n;*BiuYa#|$ z>Ar*tE=w-Hb%wRu|7lL8ECEOXMxw~}_HJwD+}^Bc?G?9Bzex`bmrQ`KfUPcG?yIDY zt!~qqn#y%t?}2W4OjU?nS85hGp1ZF~zFt1IsSbW@z{47ZmZ_UTqe^r-83mpuDkugF zP@pId^Byw53i+b7fZlji)0My(FNzqS1~Z~|Qq9-LRJg%OM-(p5RZ5)bo$;0{C(aNz z<6&4e+409Nf+1!%eV-LlAwh|nsSvO;#7iu51 zWfR&ux(z{R+UgwaUJoCwKM6SWlJxN3nWrTe`9lf&Wu;w$dV{-6gvZL-A&KvsJ|)2D zNa6-8l81qAzF6G8!bn>a2!zT9BQd|$HIu9wO+Q~8LPUUdRw@Ay$&e;hK z*ZgZzrcp;xtiU%hjz%SQxC+s3Fzoc3x930aTdHUvxHj{z30^9#&_3A8|9xh*sP8Lc zn>69HoBs7|{{5WLK~t_lnX0V%tip|nSJbqzYC8%iQ9TVm1?=bPQR3-B}@_-`L2NG|%&k?c7#l8^Ms| z@c(OB%Pl6SOWV~PzTN*f@$Ue*F#Ccdfp^&s{2X!XEyXW%Vo#Z}z9F$^ZGD^82p) zdqW>4kJs7D9isPhJ8b&3Ol{ht<=g#^-pj~!Hmlt!p1D+D;eFNvHnn?xela(zFI+0h zykqy)m7B!7{~b7d`r?;2RR+Jp7=k{^-*Ud_macA=l($T{xAxz|znw=!96Wwqt8TdS zQeaEMKg+fYldm*OdJev7$W9zDllwdPN-DFBl$ByDByb8_XGxo-FsD2B7bEuyh>=0 zXw0f?XP%(zu=?=1ZELTG#;Y<2#i5Fu%<#8@i3Pvg)wL55cb)d6Mi76>tv z8aS+4yN1(M%k;gi-s|-&4zca>F}=FKDyM(7W`6MD=)wO{8rFXvvNRkPXHO1~JS^@i z^n_)>^$(5{xeF@&g}=;YEco&0L%r@4NjptmprZEb{ii>)3p4P=m+;S@BKc2)_kjwJ z{f;~FRkhnzeVxvxARh7kVSAj~uDbnQU#%GpxH(?#sh2jH{xzKGz}87l|9~ESDNKZ4 zFhk)d-;OV_VGq~l|DDJAp_Z{y4VZD{ua;=v+IM|E_kl0}c>46evxK^CU0UzP@oVR? zS=aWzZ4LDhmHPYbh0PL%Pky%RS3TfjoNz9F?cuP=+``ODzHan69WTnJ`t|97NO@~V zwFWhleY+ekMAfS?6hGS++4Ak?@66h_A{j5E8C72T`|2EZ=R574ExqaGZXQP&bIw`7 z-0;W=gdc3kSZuF#&JZ6h>mWy4Rki_JqDg=z+{r=M@+XJede*2K+gtexYmD-bDVXpMd2c NgQu&X%Q~loCICrzR&4+P literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CP14/Objects/Tools/torch.rsi/lit-overlay.png b/Resources/Textures/_CP14/Objects/Tools/torch.rsi/lit-overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..5105dd8c430c843e8bced87a85e2d39840c86c3a GIT binary patch literal 831 zcmV-F1Hk-=P)Px%`AI}URA@u(m(6PvQ53~*Ezu@fs3p}+u^_16M-glhp|}uS__Yvi!9@h?rmjU@ zwq0~#{R7%AOvNmesJIYx;kHmj1*y7FSCt~DK~x%}jWTiuZ+Holc{B1p7=3ROGMVIe z-#O>rd1<46aFx&Ox|o}NKAD8AwI!j*xHWzp?)AC~3yIiUB8p6!0dWGL#eg^k#1&U| zKiJvfJ(L-k)v`C$d@V)(?*^g4gW$d02K3L5Gh{9KD01AKrtGYUU12}~yOklPsKKLd_ zp_qQ|QdtO<84x7CNdeG#sh;kJ^qb@drJwm>2NGolgbASgM8x9`9yB0!X*+gFSTAo95bAck*-#x9uN zyT!|o?xtq`*?bRS|6zP(2HdE25P)37r*gF(=+pb#>E^YvwlM$!RyMD1;G+X!0@kVY zce?YkYLpMrp#}3>b-xk=niCKtJ_^zG&lr6C>qH39fg)eG_?$AFfP%s&<0~})#fYxs zNQxt<&h*tEx_?Z-dl(@;fOVQL@_7v58m0lBJ+jVMVgP`gLWs^w=iCi?V50_HM>k-Z zFkY;K`Ft%($15{HOhTLj{`TY(_B|FNiU2zJaeh;|0de5&ULt3JY8u&w9%?cGGKNH`Hc0d#t$7E6gD{u~Ivx zuewrPQ;OXk;vd$@?2>^W$fkyxU literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CP14/Objects/Tools/torch.rsi/torch-unlit.png b/Resources/Textures/_CP14/Objects/Tools/torch.rsi/torch-unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..cab1ac9665b08102fb36a67dd2c595f65a034a3b GIT binary patch literal 367 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^TArbD$ zDG~_>EDn4#?y*WRVR3T?5^d=mM_6zF51%+aVaMkWtcMqEW&c<;X_X?wCW(+O%{u00 zhKUx{&v+c&1CBBpbRTZ6eK1YvHAj~$!zP&&Lyk2uyIUELuw5)EbXc?Z-T&(Q{|q!v zcQ)#>9JM^dcw%9rzU%~1CWUTCyJ?~ilPmr_6J|amST4Vp$(qe&_w84LJ@peLRje6O zEKei}Fhu@)_F3NG_sQ$}3A6h9+23#oC`@7YC}P;PK2glR;_J+Zzb31zRI^+YP+B2) zGik!I&)@GiehtbpbY!oP%KRt(FqQGR@us7<&&R62$OxKM8Nqvb%EX`fi*z`)$vjKW zitaIIao}Un3=nvnx?t*2mcPx%DoI2^RCr$PnlVd5K@7*Q;99{_oGL0#9URmL4i23K7wOPRKZK)$gCD>T;ntzJ z2+oeeQ^!uCLMJJ8=qfx(;ovQ$mt4}j-piX`F3B(dWJzkK;$N-e`5OhG3aB^%ZGnml zK!>2VfVO}jfy-{EfamWA&(2Dt*!ZO292nLKB+~1inb$m@ncm#>7y7!r>dk;1Wtr&@ z9#P=1@!9_u21R|Ck_-hJH9m0wr-$vLSzj}?W&>48fKZGlW<32fPj5r90*M1?w_3&d z@wR#YoS+f`a0j~$v>jCmB81CHeEm$#a5O^sx#;W{`NuEXjsgJ{n5zTdDuO))oNIjL z|HJ@5|NB%CTF5E~fJn^)5daYU&So9e`}3-2hpE(16ahey;yfD*Q>rD{0Z7QT+zy;@ z;VpIm5G*{5o&4O1xxU8^z}0aq|0#f2DiJCURX`~6vG`R5#8Qb+ai{`9k&nf%Dj=3h zgo;BI5Q=;(epLanR3cOys(?`BWAUpBkgCM8x4hImL=+HW$r%*@%4Qgw0GGl<6hPe! zyF%au%nraNztvn9+wgL>m>2-5RhCr=*B!yi0+VT`J&JJc{qlcy zXXtxO!46=V#|^%B2x7azW$gt)1=-$)@fo=63ZTf@$Hw=5VC4Y-JfD-ABmnp*C^-Pw z1C3+=P!BVb0YGg71wbX2ik&JTl}b|cPz6xQrDCTFNTrh0JpKU-r58|OY}|YR0000< KMNUMnLSTX%+z?a% literal 0 HcmV?d00001 diff --git a/Resources/Textures/_CP14/Objects/Tools/torch.rsi/unlit-inhand-right.png b/Resources/Textures/_CP14/Objects/Tools/torch.rsi/unlit-inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..3802583eb811c04c83d59450e33ccf4ab2ba0aeb GIT binary patch literal 636 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-HD>U^4S`aSW-5 zdppa}`>=z^as3Ck4hGHP((;qN+OT-@10~sAKNbHl@bUH4am=-15kI)IxmlpJ;Dw4- z*`$Dj>ztm5@-2E&R9?B)S?sz;7FTc?*Na5u4ram1Q$$rST|8uioW+@u=PIdS!+U z3L=63tV3p|u`GDkm;CKGgTa@Y6;D}yJWz6DR%dWN-yY@Hz^|8NQow{qV%3UL+okJD znM#_^x=J*#J-D<`YuObIhR~b~U#Cd1F6inw_4A4Qr?)8~{Y(pH@6})Ap2&NIpO(EBwvIG>Kx@u?1xb8$y