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
]
]
}