From 971d8d461b2e72c58efd0f3ac21a1ad4775b88e5 Mon Sep 17 00:00:00 2001 From: jonathan Date: Wed, 4 Feb 2026 15:32:11 +0100 Subject: [PATCH] Made trash object delete its entity when collected --- Babushka.sln.DotSettings.user | 15 ++------------- prefabs/Interactables/trash_object.tscn | 2 +- project.godot | 2 +- .../CSharp/Common/Interactables/TrashObject.cs | 2 +- .../GameEntity/Entities/PositionalEntity.cs | 3 +++ .../CSharp/GameEntity/Entities/TrashEntity.cs | 17 ++++++++++++++--- .../GameEntity/EntityNodes/TrashEntityNode.cs | 10 +++++++--- .../GameEntity/Management/EntityManager.cs | 8 ++++++++ .../GameEntity/Management/EntityManagerUtil.cs | 10 +++++++++- 9 files changed, 46 insertions(+), 23 deletions(-) diff --git a/Babushka.sln.DotSettings.user b/Babushka.sln.DotSettings.user index d333d51..f9b5097 100644 --- a/Babushka.sln.DotSettings.user +++ b/Babushka.sln.DotSettings.user @@ -18,22 +18,11 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded ForceIncluded ForceIncluded ForceIncluded - ForceIncluded - ForceIncluded - ForceIncluded - ForceIncluded - ForceIncluded - ForceIncluded - ForceIncluded - ForceIncluded - <SessionState ContinuousTestingMode="0" IsActive="True" Name="Tests" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> - <TestAncestor> - <TestId>NUnit3x::A6EF2269-9E64-40D4-BA0A-33CB234E2503::net9.0::BabushkaTest.Tests</TestId> - </TestAncestor> -</SessionState> + \ No newline at end of file diff --git a/prefabs/Interactables/trash_object.tscn b/prefabs/Interactables/trash_object.tscn index 0a9b58f..94c639d 100644 --- a/prefabs/Interactables/trash_object.tscn +++ b/prefabs/Interactables/trash_object.tscn @@ -2,7 +2,7 @@ [ext_resource type="Texture2D" uid="uid://bylgmr0skwtrs" path="res://art/farm/farming/farmobjekte/broken tools atlas.png" id="1_k4ca3"] [ext_resource type="PackedScene" uid="uid://cqc72e4hq6bcd" path="res://prefabs/interactions/interaction_area_2d.tscn" id="2_gcgfd"] -[ext_resource type="Script" uid="uid://c2cgj153m05sp" path="res://scripts/CSharp/Common/Interactables/TrashObject.cs" id="2_u7jgg"] +[ext_resource type="Script" uid="uid://d3n8kwva4pxx5" path="res://scripts/CSharp/GameEntity/EntityNodes/TrashEntityNode.cs" id="2_u7jgg"] [ext_resource type="AudioStream" uid="uid://be6g8b3v3u1ai" path="res://audio/sfx/Kitchen/SFX_Cooking_Knife_PickUp_01.wav" id="3_ktmp7"] [ext_resource type="AudioStream" uid="uid://cgjsajsdrrn0j" path="res://audio/sfx/Kitchen/SFX_Cooking_Knife_PutDown_01.wav" id="4_ic616"] [ext_resource type="AudioStream" uid="uid://br4drgupled6c" path="res://audio/sfx/Kitchen/SFX_Cooking_Pot_01.wav" id="5_dx175"] diff --git a/project.godot b/project.godot index 33b6217..ef0cf21 100644 --- a/project.godot +++ b/project.godot @@ -11,7 +11,7 @@ config_version=5 [application] config/name="Babushka" -run/main_scene="uid://bopv10dqm1knc" +run/main_scene="uid://66pmq4efjip8" config/features=PackedStringArray("4.5", "C#", "Forward Plus") run/max_fps=120 boot_splash/fullsize=false diff --git a/scripts/CSharp/Common/Interactables/TrashObject.cs b/scripts/CSharp/Common/Interactables/TrashObject.cs index b594db9..6d6229e 100644 --- a/scripts/CSharp/Common/Interactables/TrashObject.cs +++ b/scripts/CSharp/Common/Interactables/TrashObject.cs @@ -5,7 +5,7 @@ using Godot.Collections; /// /// Simple collectible scene objects with saveable state. /// -public partial class TrashObject : Sprite2D, ISaveable +public partial class TrashObject : Sprite2D, ISaveable // deprecated { private bool _collected; diff --git a/scripts/CSharp/GameEntity/Entities/PositionalEntity.cs b/scripts/CSharp/GameEntity/Entities/PositionalEntity.cs index 98bc6b8..8deb49b 100644 --- a/scripts/CSharp/GameEntity/Entities/PositionalEntity.cs +++ b/scripts/CSharp/GameEntity/Entities/PositionalEntity.cs @@ -28,5 +28,8 @@ public abstract class PositionalEntity : Entity // Deals with Instantiation of the node public abstract void InstantiateEntityNode(Node2D parent); + + // Deals with Removal of the node before the whole scene is unloaded + public abstract void RemoveEntityNode(); } \ No newline at end of file diff --git a/scripts/CSharp/GameEntity/Entities/TrashEntity.cs b/scripts/CSharp/GameEntity/Entities/TrashEntity.cs index 718db9c..46e2d44 100644 --- a/scripts/CSharp/GameEntity/Entities/TrashEntity.cs +++ b/scripts/CSharp/GameEntity/Entities/TrashEntity.cs @@ -1,3 +1,4 @@ +using Babushka.scripts.CSharp.GameEntity.EntityNodes; using Babushka.scripts.CSharp.GameEntity.Management; using Godot; @@ -8,16 +9,26 @@ public class TrashEntity : PositionalEntity public override string EntityType => OWN_TYPE_NAME; public const string OWN_TYPE_NAME = "TrashEntity"; private EntityNodeCreator _creator; - + private TrashEntityNode? _entityNode; + public TrashEntity() { } - + public override void InstantiateEntityNode(Node2D parent) { - if(_creator == null) _creator = EntityManager.Instance.NodeCreator; + if (_creator == null) _creator = EntityManager.Instance.NodeCreator; var entityNode = _creator.InstantiateNode(EntityType); parent.AddChild(entityNode); entityNode.GlobalPosition = position; + var trashEntityNode = (TrashEntityNode)entityNode; + trashEntityNode.Initialize(this); + _entityNode = trashEntityNode; + } + + public override void RemoveEntityNode() + { + if(_entityNode.IsValid()) + _entityNode!.QueueFree(); } } \ No newline at end of file diff --git a/scripts/CSharp/GameEntity/EntityNodes/TrashEntityNode.cs b/scripts/CSharp/GameEntity/EntityNodes/TrashEntityNode.cs index b546ea4..2aa0dc4 100644 --- a/scripts/CSharp/GameEntity/EntityNodes/TrashEntityNode.cs +++ b/scripts/CSharp/GameEntity/EntityNodes/TrashEntityNode.cs @@ -1,4 +1,5 @@ using Babushka.scripts.CSharp.GameEntity.Entities; +using Babushka.scripts.CSharp.GameEntity.Management; using Godot; namespace Babushka.scripts.CSharp.GameEntity.EntityNodes; @@ -9,8 +10,11 @@ public partial class TrashEntityNode : Node2D public void Initialize(TrashEntity trashEntity) { - _trashEntity = trashEntity; + _trashEntity = trashEntity; + } + + public void Collect() + { + EntityManager.Instance.RemoveEntity(_trashEntity); } - - } \ No newline at end of file diff --git a/scripts/CSharp/GameEntity/Management/EntityManager.cs b/scripts/CSharp/GameEntity/Management/EntityManager.cs index 3e14b1a..749b4c4 100644 --- a/scripts/CSharp/GameEntity/Management/EntityManager.cs +++ b/scripts/CSharp/GameEntity/Management/EntityManager.cs @@ -154,4 +154,12 @@ public partial class EntityManager : Node #endregion + public void RemoveEntity(Entity entity) + { + _allEntities.Remove(entity); + if (entity is PositionalEntity positionalEntity) + { + positionalEntity.RemoveEntityNode(); + } + } } \ No newline at end of file diff --git a/scripts/CSharp/GameEntity/Management/EntityManagerUtil.cs b/scripts/CSharp/GameEntity/Management/EntityManagerUtil.cs index d39d89b..688b21f 100644 --- a/scripts/CSharp/GameEntity/Management/EntityManagerUtil.cs +++ b/scripts/CSharp/GameEntity/Management/EntityManagerUtil.cs @@ -1,4 +1,5 @@ -using PositionalEntity = Babushka.scripts.CSharp.GameEntity.Entities.PositionalEntity; +using Godot; +using PositionalEntity = Babushka.scripts.CSharp.GameEntity.Entities.PositionalEntity; namespace Babushka.scripts.CSharp.GameEntity.Management; @@ -11,4 +12,11 @@ public static class EntityManagerUtil self.AddEntity(entity); } + + public static bool IsValid(this T? node) where T : GodotObject + { + return node != null + && GodotObject.IsInstanceValid(node) + && !node.IsQueuedForDeletion(); + } } \ No newline at end of file -- 2.36.3