diff --git a/Content.Server/Atmos/Components/FlammableComponent.cs b/Content.Server/Atmos/Components/FlammableComponent.cs index 99ae5b1b5c..e00f5efbdc 100644 --- a/Content.Server/Atmos/Components/FlammableComponent.cs +++ b/Content.Server/Atmos/Components/FlammableComponent.cs @@ -77,18 +77,5 @@ namespace Content.Server.Atmos.Components /// [DataField, ViewVariables(VVAccess.ReadWrite)] public float FirestackFade = -0.1f; - - /// - /// Set FirestackFade on Ingite to this value - /// - [DataField] - public float? FirestackFadeOnIgnite = null; - - /// - /// CrystallPunk moment - /// determines how extinction "FirestackFade" will fade out. it can be used to make "parabolas" of object ignition and decay. - /// - [DataField] - public float FirestackFadeFade = 0; } } diff --git a/Content.Server/Atmos/EntitySystems/FlammableSystem.cs b/Content.Server/Atmos/EntitySystems/FlammableSystem.cs index 3448e5036f..30cdf053e4 100644 --- a/Content.Server/Atmos/EntitySystems/FlammableSystem.cs +++ b/Content.Server/Atmos/EntitySystems/FlammableSystem.cs @@ -334,18 +334,13 @@ namespace Content.Server.Atmos.EntitySystems _adminLogger.Add(LogType.Flammable, $"{ToPrettyString(uid):target} set on fire by {ToPrettyString(ignitionSource):actor}"); flammable.OnFire = true; - //CrystallPunk bonfire moment + //CrystallPunk fireplace moment var ev = new OnFireChangedEvent(flammable.OnFire); RaiseLocalEvent(uid, ref ev); - //CrystallPunk bonfire moment end + //CrystallPunk fireplace moment end } UpdateAppearance(uid, flammable); - - //CrystallPunk bonfire moment - if (flammable.FirestackFadeOnIgnite != null) - flammable.FirestackFade = flammable.FirestackFadeOnIgnite.Value; - //CrystallPunk bonfire moment end } private void OnDamageChanged(EntityUid uid, IgniteOnHeatDamageComponent component, DamageChangedEvent args) @@ -458,11 +453,6 @@ namespace Content.Server.Atmos.EntitySystems _damageableSystem.TryChangeDamage(uid, flammable.Damage * flammable.FireStacks, interruptsDoAfters: false); AdjustFireStacks(uid, flammable.FirestackFade * (flammable.Resisting ? 10f : 1f), flammable); - - //CrystallPunk bonfire moment - if (flammable.FirestackFadeFade != 0) - flammable.FirestackFade += flammable.FirestackFadeFade * frameTime; - //CrystallPunk bonfire moment end } else { diff --git a/Content.Server/Temperature/Systems/EntityHeaterSystem.cs b/Content.Server/Temperature/Systems/EntityHeaterSystem.cs index 48e3ce4f87..358c52bfe3 100644 --- a/Content.Server/Temperature/Systems/EntityHeaterSystem.cs +++ b/Content.Server/Temperature/Systems/EntityHeaterSystem.cs @@ -50,12 +50,12 @@ public sealed class EntityHeaterSystem : EntitySystem //CrystallPunk bonfire var flammbaleQuery = EntityQueryEnumerator(); - while (flammbaleQuery.MoveNext(out var uid, out _, out var placer, out var flammable)) + while (flammbaleQuery.MoveNext(out var uid, out var heater, out var placer, out var flammable)) { if (!flammable.OnFire) return; - var energy = flammable.FireStacks * deltaTime * 300; + var energy = flammable.FireStacks * deltaTime * heater.EnergyPerFireStack; foreach (var ent in placer.PlacedEntities) { _temperature.ChangeHeat(ent, energy); diff --git a/Content.Server/_CP14/Temperature/CP14FlammableEntityHeaterComponent.cs b/Content.Server/_CP14/Temperature/CP14FlammableEntityHeaterComponent.cs index 1fa92fda1d..0a455ad42f 100644 --- a/Content.Server/_CP14/Temperature/CP14FlammableEntityHeaterComponent.cs +++ b/Content.Server/_CP14/Temperature/CP14FlammableEntityHeaterComponent.cs @@ -8,4 +8,6 @@ namespace Content.Server._CP14.Temperature; [RegisterComponent, Access(typeof(EntityHeaterSystem))] public sealed partial class CP14FlammableEntityHeaterComponent : Component { + [DataField] + public float EnergyPerFireStack = 1000f; } diff --git a/Content.Server/_CP14/Temperature/Fireplace/CP14FireplaceComponent.cs b/Content.Server/_CP14/Temperature/Fireplace/CP14FireplaceComponent.cs new file mode 100644 index 0000000000..54cc47b8b1 --- /dev/null +++ b/Content.Server/_CP14/Temperature/Fireplace/CP14FireplaceComponent.cs @@ -0,0 +1,51 @@ +namespace Content.Server._CP14.Temperature.Fireplace; + +/// +/// component for player-controlled fire. Can be fueled. +/// + +[RegisterComponent, Access(typeof(CP14FireplaceSystem))] +public sealed partial class CP14FireplaceComponent : Component +{ + /// + /// The abstract amount of fuel that is used to keep a fire burning + /// + [DataField] + public float MaxFuelLimit = 100f; + + /// + /// how much the flame grows or dies out with the presence or absence of fuel + /// + [DataField] + public float FireFadeDelta = 0.2f; + + /// + /// current fuel quantity + /// + [DataField] + public float CurrentFuel; + + /// + /// how much fuel is wasted every "UpdateFrequency" + /// + [DataField] + public float FuelDrainingPerUpdate = 1f; + + [DataField] + public TimeSpan UpdateFrequency = TimeSpan.FromSeconds(2f); + + /// + /// whether fuel can be added by hand + /// + [DataField] + public bool CanInsertByHand = true; + + /// + /// whether the fuel can be supplied by contact + /// + [DataField] + public bool CanInsertByCollide = false; + + [DataField] + public TimeSpan NextUpdateTime = TimeSpan.Zero; +} diff --git a/Content.Server/_CP14/Temperature/Fireplace/CP14FireplaceFuelComponent.cs b/Content.Server/_CP14/Temperature/Fireplace/CP14FireplaceFuelComponent.cs new file mode 100644 index 0000000000..694eb46650 --- /dev/null +++ b/Content.Server/_CP14/Temperature/Fireplace/CP14FireplaceFuelComponent.cs @@ -0,0 +1,20 @@ +using Robust.Shared.Audio; + +namespace Content.Server._CP14.Temperature.Fireplace; + +/// +/// Allows this object to be used as fuel for a fireplace +/// + +[RegisterComponent, Access(typeof(CP14FireplaceSystem))] +public sealed partial class CP14FireplaceFuelComponent : Component +{ + /// + /// How much fuel will be added in fireplace + /// + [DataField] + public float Fuel = 10f; + + [DataField] + public SoundSpecifier InsertFuelSound = new SoundPathSpecifier("/Audio/_CP14/Items/campfire_whoosh.ogg"); +} diff --git a/Content.Server/_CP14/Temperature/Fireplace/CP14FireplaceSystem.cs b/Content.Server/_CP14/Temperature/Fireplace/CP14FireplaceSystem.cs new file mode 100644 index 0000000000..5f3f57d7b1 --- /dev/null +++ b/Content.Server/_CP14/Temperature/Fireplace/CP14FireplaceSystem.cs @@ -0,0 +1,128 @@ +using Content.Server.Atmos.Components; +using Content.Server.Atmos.EntitySystems; +using Content.Server.Popups; +using Content.Shared._CP14.Temperature; +using Content.Shared.Interaction; +using Content.Shared.Throwing; +using Robust.Server.Audio; +using Robust.Server.GameObjects; +using Robust.Shared.Physics.Events; +using Robust.Shared.Timing; + +namespace Content.Server._CP14.Temperature.Fireplace; + +public sealed partial class CP14FireplaceSystem : EntitySystem +{ + [Dependency] private readonly AppearanceSystem _appearance = default!; + [Dependency] private readonly AudioSystem _audio = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly FlammableSystem _flammable = default!; + [Dependency] private readonly PopupSystem _popupSystem = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnFireChanged); + + SubscribeLocalEvent(OnInteractUsing); + SubscribeLocalEvent(OnCollide); + } + + private void OnFireChanged(Entity fireplace, ref OnFireChangedEvent args) + { + if (!TryComp(fireplace, out var flammable)) + return; + + if (args.OnFire) + flammable.FirestackFade = 0; + } + + private void OnInteractUsing(Entity fireplace, ref InteractUsingEvent args) + { + if (!fireplace.Comp.CanInsertByHand) + return; + + if (!TryComp(args.Used, out var fuel)) + return; + + TryInsertFuel(fireplace, args.Used, fuel); + } + + private void OnCollide(Entity fireplace, ref StartCollideEvent args) + { + if (!fireplace.Comp.CanInsertByCollide) + return; + + if (!TryComp(args.OtherEntity, out var fuel)) + return; + + TryInsertFuel(fireplace, args.OtherEntity, fuel); + } + + private bool TryInsertFuel(Entity fireplace, EntityUid fuelUid, CP14FireplaceFuelComponent fuel) + { + if (fireplace.Comp.CurrentFuel > fireplace.Comp.MaxFuelLimit) + { + _popupSystem.PopupEntity(Loc.GetString("cp14-fireplace-full", ("target", fireplace)), fireplace); + return false; + } + + if (!TryComp(fireplace, out var flammable)) + return false; + + fireplace.Comp.CurrentFuel += fuel.Fuel; + + if (flammable.OnFire) + _audio.PlayPvs(fuel.InsertFuelSound, fireplace); + + UpdateAppearance(fireplace, fireplace.Comp); + QueueDel(fuelUid); + return true; + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = AllEntityQuery(); + while (query.MoveNext(out var uid, out var fireplace, out var flammable)) + { + if (!flammable.OnFire) + continue; + + if (_timing.CurTime <= fireplace.NextUpdateTime) + continue; + + fireplace.NextUpdateTime = _timing.CurTime + fireplace.UpdateFrequency; + + if (fireplace.CurrentFuel >= fireplace.FuelDrainingPerUpdate) + { + fireplace.CurrentFuel -= fireplace.FuelDrainingPerUpdate; + UpdateAppearance(uid, fireplace); + flammable.FirestackFade = fireplace.FireFadeDelta; + } + else + { + flammable.FirestackFade = -fireplace.FireFadeDelta; + } + } + } + + public void UpdateAppearance(EntityUid uid, CP14FireplaceComponent? fireplace = null, AppearanceComponent? appearance = null) + { + if (!Resolve(uid, ref fireplace, ref appearance)) + return; + + if (fireplace.CurrentFuel < fireplace.FuelDrainingPerUpdate) + { + _appearance.SetData(uid, FireplaceFuelVisuals.Status, FireplaceFuelStatus.Empty, appearance); + return; + } + + if (fireplace.CurrentFuel < fireplace.MaxFuelLimit / 2) + _appearance.SetData(uid, FireplaceFuelVisuals.Status, FireplaceFuelStatus.Medium, appearance); + else + _appearance.SetData(uid, FireplaceFuelVisuals.Status, FireplaceFuelStatus.Full, appearance); + } +} diff --git a/Content.Shared/_CP14/Temperature/FireplaceFuelVisuals.cs b/Content.Shared/_CP14/Temperature/FireplaceFuelVisuals.cs new file mode 100644 index 0000000000..24181aedef --- /dev/null +++ b/Content.Shared/_CP14/Temperature/FireplaceFuelVisuals.cs @@ -0,0 +1,18 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared._CP14.Temperature; + +// Appearance Data key +[Serializable, NetSerializable] +public enum FireplaceFuelVisuals : byte +{ + Status, +} + +[Serializable, NetSerializable] +public enum FireplaceFuelStatus : byte +{ + Empty, + Medium, + Full +} diff --git a/Resources/Audio/_CP14/Items/attributions.yml b/Resources/Audio/_CP14/Items/attributions.yml index dbf1a4c548..542085c891 100644 --- a/Resources/Audio/_CP14/Items/attributions.yml +++ b/Resources/Audio/_CP14/Items/attributions.yml @@ -16,4 +16,9 @@ - files: ["sharpening_stone.ogg"] license: "CC-BY-4.0" copyright: 'by tim.kahn of Freesound.org. Cropped and mixed from stereo to mono.' - source: "https://freesound.org/people/tim.kahn/sounds/35827/" \ No newline at end of file + source: "https://freesound.org/people/tim.kahn/sounds/35827/" + +- files: ["campfire_whoosh.ogg"] + license: "CC0-1.0" + copyright: 'by GrimGrum of Freesound.org. Cropped and mixed from stereo to mono.' + source: "https://freesound.org/people/GrimGrum/sounds/412558/" \ No newline at end of file diff --git a/Resources/Audio/_CP14/Items/campfire_whoosh.ogg b/Resources/Audio/_CP14/Items/campfire_whoosh.ogg new file mode 100644 index 0000000000..22c65378a1 Binary files /dev/null and b/Resources/Audio/_CP14/Items/campfire_whoosh.ogg differ diff --git a/Resources/Locale/en-US/_CP14/fireplace/fireplace-component.ftl b/Resources/Locale/en-US/_CP14/fireplace/fireplace-component.ftl new file mode 100644 index 0000000000..a34f452e8f --- /dev/null +++ b/Resources/Locale/en-US/_CP14/fireplace/fireplace-component.ftl @@ -0,0 +1 @@ +cp14-fireplace-full = There's no more room in {$target}! \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_CP14/fireplace/fireplace-component.ftl b/Resources/Locale/ru-RU/_CP14/fireplace/fireplace-component.ftl new file mode 100644 index 0000000000..dc3b303c6d --- /dev/null +++ b/Resources/Locale/ru-RU/_CP14/fireplace/fireplace-component.ftl @@ -0,0 +1 @@ +cp14-fireplace-full = В {$target} больше ничего не влезет! \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/bonfire.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/bonfire.yml index 3db88853b5..1ef21166f2 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/bonfire.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/bonfire.yml @@ -8,7 +8,10 @@ noRot: true sprite: _CP14/Structures/Furniture/bonfire.rsi layers: - - state: bonfire + - state: base + - state: full1 + visible: false + map: ["fuel"] - type: Construction graph: CP14Bonfire node: CP14Bonfire @@ -20,9 +23,12 @@ bounds: "-0.45,-0.45,0.45,0.45" density: 55 mask: - - TableMask + - TabletopMachineMask layer: - - TableLayer + - Impassable + - MidImpassable + - LowImpassable + hard: false - type: Damageable damageContainer: Inorganic damageModifierSet: Wood @@ -49,29 +55,37 @@ sound: path: /Audio/Ambience/Objects/fireplace.ogg - type: Appearance + - type: GenericVisualizer + visuals: + enum.FireplaceFuelVisuals.Status: + fuel: + Empty: { visible: false } + Medium: { visible: true, state: full1 } + Full: { visible: true, state: full2 } - type: Reactive groups: Flammable: [ Touch ] Extinguish: [ Touch ] - type: Flammable - fireSpread: false + fireSpread: true canResistFire: false alwaysCombustible: true canExtinguish: true firestacksOnIgnite: 0.5 - firestackFade: 0.3 - firestackFadeOnIgnite: 0.3 - firestackFadeFade: -0.2 damage: types: - Heat: 0.01 + Heat: 0 - type: FireVisuals sprite: _CP14/Structures/Furniture/bonfire.rsi normalState: burning - type: ItemPlacer maxEntities: 4 - whitelist: - components: - - Temperature - type: CP14FlammableEntityHeater - - type: Climbable + - type: CP14Fireplace + +- type: entity + id: CP14Stick + parent: CP14Bucket + name: Stick!!! + components: + - type: CP14FireplaceFuel \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/wallmount_torch.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/wallmount_torch.yml index 32407da9c7..78e9f5b40d 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/wallmount_torch.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/wallmount_torch.yml @@ -14,6 +14,7 @@ sprite: _CP14/Structures/Furniture/wallmount_torch.rsi layers: - state: base + map: ["fuel"] - type: Damageable damageContainer: Inorganic damageModifierSet: Wood @@ -39,7 +40,6 @@ range: 5 sound: path: /Audio/Ambience/Objects/fireplace.ogg - - type: Appearance - type: Reactive groups: Flammable: [ Touch ] @@ -50,15 +50,24 @@ alwaysCombustible: true canExtinguish: true firestacksOnIgnite: 0.5 - firestackFade: 0.3 - firestackFadeOnIgnite: 0.3 - firestackFadeFade: -0.2 damage: types: - Heat: 0.01 + Heat: 0 + - type: CP14Fireplace + maxFuelLimit: 150 + currentFuel: 150 + canInsertByHand: false - type: FireVisuals sprite: _CP14/Structures/Furniture/wallmount_torch.rsi normalState: fire + - type: Appearance + - type: GenericVisualizer + visuals: + enum.FireplaceFuelVisuals.Status: + fuel: + Empty: { state: burned } + Medium: { state: base } + Full: { state: base } - type: Construction graph: CP14WallmountTorch node: CP14WallmountTorch diff --git a/Resources/Prototypes/_CP14/Entities/base.yml b/Resources/Prototypes/_CP14/Entities/base.yml index 5dd1d8797a..cc2713932d 100644 --- a/Resources/Prototypes/_CP14/Entities/base.yml +++ b/Resources/Prototypes/_CP14/Entities/base.yml @@ -27,8 +27,6 @@ canExtinguish: true firestacksOnIgnite: 0.5 firestackFade: 0.3 - firestackFadeOnIgnite: 0.3 - firestackFadeFade: -0.2 damage: types: Heat: 0.5 diff --git a/Resources/Prototypes/_CP14/Recipes/Construction/furniture.yml b/Resources/Prototypes/_CP14/Recipes/Construction/furniture.yml index 2d2f3681ba..bf4c0890bb 100644 --- a/Resources/Prototypes/_CP14/Recipes/Construction/furniture.yml +++ b/Resources/Prototypes/_CP14/Recipes/Construction/furniture.yml @@ -45,7 +45,7 @@ category: construction-category-furniture icon: sprite: _CP14/Structures/Furniture/bonfire.rsi - state: bonfire + state: base objectType: Structure placementMode: SnapgridCenter canBuildInImpassable: false diff --git a/Resources/Textures/_CP14/Structures/Furniture/bonfire.rsi/base.png b/Resources/Textures/_CP14/Structures/Furniture/bonfire.rsi/base.png new file mode 100644 index 0000000000..ce8128ded2 Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Furniture/bonfire.rsi/base.png differ diff --git a/Resources/Textures/_CP14/Structures/Furniture/bonfire.rsi/bonfire.png b/Resources/Textures/_CP14/Structures/Furniture/bonfire.rsi/bonfire.png deleted file mode 100644 index a34ec61a1c..0000000000 Binary files a/Resources/Textures/_CP14/Structures/Furniture/bonfire.rsi/bonfire.png and /dev/null differ diff --git a/Resources/Textures/_CP14/Structures/Furniture/bonfire.rsi/bonfire_extinguished.png b/Resources/Textures/_CP14/Structures/Furniture/bonfire.rsi/bonfire_extinguished.png deleted file mode 100644 index 3a5d39a209..0000000000 Binary files a/Resources/Textures/_CP14/Structures/Furniture/bonfire.rsi/bonfire_extinguished.png and /dev/null differ diff --git a/Resources/Textures/_CP14/Structures/Furniture/bonfire.rsi/burning.png b/Resources/Textures/_CP14/Structures/Furniture/bonfire.rsi/burning.png index 150c34d525..7ea5602434 100644 Binary files a/Resources/Textures/_CP14/Structures/Furniture/bonfire.rsi/burning.png and b/Resources/Textures/_CP14/Structures/Furniture/bonfire.rsi/burning.png differ diff --git a/Resources/Textures/_CP14/Structures/Furniture/bonfire.rsi/full1.png b/Resources/Textures/_CP14/Structures/Furniture/bonfire.rsi/full1.png new file mode 100644 index 0000000000..f45ff121c9 Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Furniture/bonfire.rsi/full1.png differ diff --git a/Resources/Textures/_CP14/Structures/Furniture/bonfire.rsi/full2.png b/Resources/Textures/_CP14/Structures/Furniture/bonfire.rsi/full2.png new file mode 100644 index 0000000000..57bae22fed Binary files /dev/null and b/Resources/Textures/_CP14/Structures/Furniture/bonfire.rsi/full2.png differ diff --git a/Resources/Textures/_CP14/Structures/Furniture/bonfire.rsi/meta.json b/Resources/Textures/_CP14/Structures/Furniture/bonfire.rsi/meta.json index 8da87ed9b8..909c2dfd3c 100644 --- a/Resources/Textures/_CP14/Structures/Furniture/bonfire.rsi/meta.json +++ b/Resources/Textures/_CP14/Structures/Furniture/bonfire.rsi/meta.json @@ -1,25 +1,30 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from /tg/station at commit 28b476ab6d17014e6f9e18a748d7c96be28de9a1, recolor and edited by TheShuEd for CrystallPunk14", + "copyright": "Created by TheShuEd for CrystallPunk14", "size": { "x": 32, "y": 32 }, "states": [ { - "name": "bonfire" + "name": "base" }, { - "name": "bonfire_extinguished" + "name": "full1" + }, + { + "name": "full2" }, { "name": "burning", "delays": [ [ - 0.3, - 0.3, - 0.3 + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 ] ] }