From 386aca70c73d1f1f6d340f520696819fab4b8950 Mon Sep 17 00:00:00 2001 From: B_Kirill <153602297+B-Kirill@users.noreply.github.com> Date: Fri, 9 Jan 2026 14:00:36 +1000 Subject: [PATCH] Add craft for bonfire and bonfire with stake (#42211) * Add craft for bonfire and bonfire with stake * review * review * nullable MaxFireStacks * retry * retry * review * I will change it and hope that they will agree with me * Revert "I will change it and hope that they will agree with me" This reverts commit 83823692d0116bf9aa9eceb85a10e95c88b51fb9. * construction Merged the graphs Changed the bonfire stake ID to follow the proper naming scheme * add destroy sound * planks Instead of logs * of course I forgot about ftl * Slarti review + Princess review Yes I sneaked an admeme abuse change here * a small fix * clamp firestacks * This was on purpose, leave as is This reverts commit 7d63e38b66cb63e5e50b7fac5030013e2ef508b5. * irrelevant * Fixtures * cleanup --------- Co-authored-by: ScarKy0 Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com> --- .../Buckle/Systems/IgniteOnBuckleSystem.cs | 70 ++++++++++++++++++ .../ActiveIgniteOnBuckleComponent.cs | 41 ++++++++++ .../Components/IgniteOnBuckleComponent.cs | 31 ++++++++ .../Structures/Decoration/bonfire.yml | 62 ++++++++++++++-- .../Recipes/Construction/structures.yml | 28 ++++++- .../Recipes/Crafting/Graphs/bonfire.yml | 42 +++++++++++ .../Decoration/bonfire_stake.rsi/bonfire.png | Bin 0 -> 3359 bytes .../bonfire_extinguished.png | Bin 0 -> 3837 bytes .../Decoration/bonfire_stake.rsi/burning.png | Bin 0 -> 4168 bytes .../bonfire_stake.rsi/legionnaire_bonfire.png | Bin 0 -> 4161 bytes .../Decoration/bonfire_stake.rsi/meta.json | 37 +++++++++ 11 files changed, 302 insertions(+), 9 deletions(-) create mode 100644 Content.Server/Buckle/Systems/IgniteOnBuckleSystem.cs create mode 100644 Content.Shared/Buckle/Components/ActiveIgniteOnBuckleComponent.cs create mode 100644 Content.Shared/Buckle/Components/IgniteOnBuckleComponent.cs create mode 100644 Resources/Prototypes/Recipes/Crafting/Graphs/bonfire.yml create mode 100644 Resources/Textures/Structures/Decoration/bonfire_stake.rsi/bonfire.png create mode 100644 Resources/Textures/Structures/Decoration/bonfire_stake.rsi/bonfire_extinguished.png create mode 100644 Resources/Textures/Structures/Decoration/bonfire_stake.rsi/burning.png create mode 100644 Resources/Textures/Structures/Decoration/bonfire_stake.rsi/legionnaire_bonfire.png create mode 100644 Resources/Textures/Structures/Decoration/bonfire_stake.rsi/meta.json diff --git a/Content.Server/Buckle/Systems/IgniteOnBuckleSystem.cs b/Content.Server/Buckle/Systems/IgniteOnBuckleSystem.cs new file mode 100644 index 0000000000..e7d088df7f --- /dev/null +++ b/Content.Server/Buckle/Systems/IgniteOnBuckleSystem.cs @@ -0,0 +1,70 @@ +using Content.Server.Atmos.EntitySystems; +using Content.Shared.Atmos.Components; +using Content.Shared.Buckle.Components; +using Robust.Shared.Timing; + +namespace Content.Server.Buckle.Systems; + +public sealed class IgniteOnBuckleSystem : EntitySystem +{ + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly FlammableSystem _flammable = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnStrapped); + SubscribeLocalEvent(OnUnstrapped); + + SubscribeLocalEvent(ActiveOnInit); + } + + private void OnStrapped(Entity ent, ref StrappedEvent args) + { + // We cache the values here to the other component. + // This is done so we have to do less lookups + var comp = EnsureComp(args.Buckle); + comp.FireStacks = ent.Comp.FireStacks; + comp.MaxFireStacks = ent.Comp.MaxFireStacks; + comp.IgniteTime = ent.Comp.IgniteTime; + } + + private void ActiveOnInit(Entity ent, ref MapInitEvent args) + { + // Handle this via a separate MapInit so the component can be added by itself if need be. + ent.Comp.NextIgniteTime = _timing.CurTime + ent.Comp.NextIgniteTime; + Dirty(ent); + } + + private void OnUnstrapped(Entity ent, ref UnstrappedEvent args) + { + RemCompDeferred(args.Buckle); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var curTime = _timing.CurTime; + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var igniteComponent, out var flammableComponent)) + { + if (curTime < igniteComponent.NextIgniteTime) + continue; + + igniteComponent.NextIgniteTime += TimeSpan.FromSeconds(igniteComponent.IgniteTime); + Dirty(uid, igniteComponent); + + if (flammableComponent.FireStacks > igniteComponent.MaxFireStacks) + continue; + + var stacks = flammableComponent.FireStacks + igniteComponent.FireStacks; + if (igniteComponent.MaxFireStacks.HasValue) + stacks = Math.Min(stacks, igniteComponent.MaxFireStacks.Value); + + _flammable.SetFireStacks(uid, stacks, flammableComponent, true); + } + } +} diff --git a/Content.Shared/Buckle/Components/ActiveIgniteOnBuckleComponent.cs b/Content.Shared/Buckle/Components/ActiveIgniteOnBuckleComponent.cs new file mode 100644 index 0000000000..f4fd4f59a4 --- /dev/null +++ b/Content.Shared/Buckle/Components/ActiveIgniteOnBuckleComponent.cs @@ -0,0 +1,41 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; + +namespace Content.Shared.Buckle.Components; + +/// +/// Component for entities that are currently being ignited by +/// +[RegisterComponent, NetworkedComponent] +[AutoGenerateComponentPause, AutoGenerateComponentState] +public sealed partial class ActiveIgniteOnBuckleComponent : Component +{ + // We cache data in this component and apply it to those who get buckled to have to do less lookups. + + /// + /// How many fire stacks to add per cycle. + /// + [DataField] + public float FireStacks = 0.5f; + + /// + /// How frequently the ignition should be applied, in seconds. + /// + [DataField] + public float IgniteTime = 1f; + + /// + /// Maximum fire stacks that can be added by this source. + /// If target already has this many or more fire stacks, no additional stacks will be added. + /// Null means unlimited. + /// + [DataField] + public float? MaxFireStacks = 2.5f; + + /// + /// Next time that fire stacks will be applied. + /// + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] + [AutoPausedField, AutoNetworkedField] + public TimeSpan NextIgniteTime = TimeSpan.Zero; +} diff --git a/Content.Shared/Buckle/Components/IgniteOnBuckleComponent.cs b/Content.Shared/Buckle/Components/IgniteOnBuckleComponent.cs new file mode 100644 index 0000000000..61af16f792 --- /dev/null +++ b/Content.Shared/Buckle/Components/IgniteOnBuckleComponent.cs @@ -0,0 +1,31 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; + +namespace Content.Shared.Buckle.Components; + +/// +/// Component that makes an entity ignite entities that are buckled to it. +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class IgniteOnBuckleComponent : Component +{ + /// + /// How many fire stacks to add per cycle. + /// + [DataField] + public float FireStacks = 0.5f; + + /// + /// How frequently the ignition should be applied, in seconds. + /// + [DataField] + public float IgniteTime = 1f; + + /// + /// Maximum fire stacks that can be added by this source. + /// If target already has this many or more fire stacks, no additional stacks will be added. + /// Null means unlimited. + /// + [DataField] + public float? MaxFireStacks = 2.5f; +} diff --git a/Resources/Prototypes/Entities/Structures/Decoration/bonfire.yml b/Resources/Prototypes/Entities/Structures/Decoration/bonfire.yml index b60b2bd943..d28abb2b63 100644 --- a/Resources/Prototypes/Entities/Structures/Decoration/bonfire.yml +++ b/Resources/Prototypes/Entities/Structures/Decoration/bonfire.yml @@ -1,15 +1,22 @@ - type: entity - id: Bonfire + abstract: true parent: BaseStructure - name: bonfire - description: What can be better than a late evening under the sky with guitar and friends? + id: BaseBonfire components: + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.4 + mask: + - Impassable + layer: + - Opaque + - BulletImpassable - type: Sprite noRot: true sprite: Structures/Decoration/bonfire.rsi - layers: - - state: bonfire - - state: burning - type: PointLight radius: 5 energy: 3 @@ -23,6 +30,9 @@ !type:DamageTrigger damage: 50 behaviors: + - !type:PlaySoundBehavior + sound: + collection: WoodDestroy - !type:DoActsBehavior acts: [ "Destruction" ] - type: AmbientSound @@ -31,15 +41,51 @@ sound: path: /Audio/Ambience/Objects/fireplace.ogg - type: AlwaysHot + - type: IgnitionSource + temperature: 700 + ignited: true + +- type: entity + parent: BaseBonfire + id: Bonfire + name: bonfire + description: What can be better than a late evening under the sky with guitar and friends? + components: + - type: Sprite + layers: + - state: burning + - type: Construction + graph: Bonfire + node: bonfire + +- type: entity + parent: BaseBonfire + id: BonfireStake + name: bonfire with stake + description: A sinister bonfire with a stake for... ceremonial purposes. Best not to ask. + components: + - type: Sprite + sprite: Structures/Decoration/bonfire_stake.rsi + layers: + - state: burning + offset: "0, 0.5" + - type: Strap + position: Stand + buckleOffset: "0, 0.5" + buckleDoafterTime: 5 + - type: IgniteOnBuckle + - type: Construction + graph: Bonfire + node: bonfireStake - type: entity + parent: BaseBonfire id: LegionnaireBonfire - parent: Bonfire name: legionnaire bonfire description: There, in the land of lava and ash, place to to cook marshmallow and potato. components: - type: Sprite layers: - - state: legionnaire_bonfire + - state: legionnaire_bonfire - type: PointLight color: "#FF5601" diff --git a/Resources/Prototypes/Recipes/Construction/structures.yml b/Resources/Prototypes/Recipes/Construction/structures.yml index 1f568a1629..5d60a5fc04 100644 --- a/Resources/Prototypes/Recipes/Construction/structures.yml +++ b/Resources/Prototypes/Recipes/Construction/structures.yml @@ -1327,4 +1327,30 @@ canRotate: false canBuildInImpassable: false conditions: - - !type:TileNotBlocked \ No newline at end of file + - !type:TileNotBlocked + +- type: construction + id: Bonfire + graph: Bonfire + startNode: start + targetNode: bonfire + category: construction-category-structures + objectType: Structure + placementMode: SnapgridCenter + canRotate: false + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked + +- type: construction + id: BonfireStake + graph: Bonfire + startNode: start + targetNode: bonfireStake + category: construction-category-structures + objectType: Structure + placementMode: SnapgridCenter + canRotate: false + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked diff --git a/Resources/Prototypes/Recipes/Crafting/Graphs/bonfire.yml b/Resources/Prototypes/Recipes/Crafting/Graphs/bonfire.yml new file mode 100644 index 0000000000..98ec98d46e --- /dev/null +++ b/Resources/Prototypes/Recipes/Crafting/Graphs/bonfire.yml @@ -0,0 +1,42 @@ +- type: constructionGraph + id: Bonfire + start: start + graph: + + - node: start + edges: + - to: bonfire + steps: + - material: WoodPlank + amount: 10 + doAfter: 4 + + - node: bonfire + entity: Bonfire + edges: + - to: start + completed: + - !type:SpawnPrototype + prototype: MaterialWoodPlank1 + amount: 10 + - !type:DeleteEntity { } + steps: + - tool: Prying + doAfter: 4 + - to: bonfireStake + steps: + - material: WoodPlank + amount: 2 + doAfter: 2 + + - node: bonfireStake + entity: BonfireStake + edges: + - to: bonfire + completed: + - !type:SpawnPrototype + prototype: MaterialWoodPlank1 + amount: 2 + steps: + - tool: Prying + doAfter: 1 diff --git a/Resources/Textures/Structures/Decoration/bonfire_stake.rsi/bonfire.png b/Resources/Textures/Structures/Decoration/bonfire_stake.rsi/bonfire.png new file mode 100644 index 0000000000000000000000000000000000000000..f197142c74f90b4d2c9d030caa9fd452db375dc9 GIT binary patch literal 3359 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 b)5EmTy0uxAS&=CG+Coy2W?6P6C({4g*m literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Decoration/bonfire_stake.rsi/burning.png b/Resources/Textures/Structures/Decoration/bonfire_stake.rsi/burning.png new file mode 100644 index 0000000000000000000000000000000000000000..cd5ccf1f1097f8ff027bda0fa4fc04bae4147fba GIT binary patch literal 4168 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 JCGKIV{{hP16wUwu literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Decoration/bonfire_stake.rsi/legionnaire_bonfire.png b/Resources/Textures/Structures/Decoration/bonfire_stake.rsi/legionnaire_bonfire.png new file mode 100644 index 0000000000000000000000000000000000000000..d130f9625203f01200d4ae1a4b96e79dedfa5c66 GIT binary patch literal 4161 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