diff --git a/prefabs/Player3D.tscn b/prefabs/Player3D.tscn index 73507af..f381a00 100644 --- a/prefabs/Player3D.tscn +++ b/prefabs/Player3D.tscn @@ -1344,5 +1344,3 @@ _wateringCanSprite = NodePath("../CharacterBody3D/Farming/Watering can") _fieldPrefab = ExtResource("2_oq5hi") _movingPlayer = NodePath("../CharacterBody3D") metadata/_custom_type_script = "uid://b1sscdr4ptec8" - -[connection signal="WaterField" from="FarmingControls" to="." method="UseWateringCan"] diff --git a/scripts/CSharp/Common/Farming/FarmingControls.cs b/scripts/CSharp/Common/Farming/FarmingControls.cs index 737e124..c78f02c 100644 --- a/scripts/CSharp/Common/Farming/FarmingControls.cs +++ b/scripts/CSharp/Common/Farming/FarmingControls.cs @@ -62,20 +62,26 @@ public partial class FarmingControls : Node3D { if(FieldParent == null || _fieldPrefab == null) return; - - Node fieldInstance = _fieldPrefab.Instantiate(); - if (fieldInstance is Node3D field3d) + // get current player position and adjust it to field / dictionary needs + Vector3 playerPos = _movingPlayer.GlobalPosition; + playerPos = new Vector3(AdjustValue(playerPos.X), 0.1f, AdjustValue(playerPos.Z)); + Vector2I intPosition = new Vector2I((int) playerPos.X, (int) playerPos.Z); + + // only instantiate a field if there isn't one already. + if(FieldParent.Get(intPosition) == null) { - Vector3 playerPos = _movingPlayer.GlobalPosition; - playerPos = new Vector3(AdjustValue(playerPos.X), 0.1f, AdjustValue(playerPos.Z)); - field3d.Position = playerPos; - Vector2I intPosition = new Vector2I((int) playerPos.X, (int) playerPos.Z); - FieldParent.AddEntry(intPosition, FieldState.Tilled); + Node fieldInstance = _fieldPrefab.Instantiate(); + if (fieldInstance is Node3D field3d) + { + // add dictionary entry for the field + FieldParent.TryAddEntry(intPosition, field3d as FieldBehaviour); + + // reposition and reparent the instance + field3d.Position = playerPos; + FieldParent.AddChild(fieldInstance); + } } - - - FieldParent.AddChild(fieldInstance); } private float AdjustValue(float value) diff --git a/scripts/CSharp/Common/Farming/FieldBehaviour.cs b/scripts/CSharp/Common/Farming/FieldBehaviour.cs index 23bcde9..0885caf 100644 --- a/scripts/CSharp/Common/Farming/FieldBehaviour.cs +++ b/scripts/CSharp/Common/Farming/FieldBehaviour.cs @@ -7,14 +7,15 @@ public enum FieldState Empty = 0, Tilled = 1, Planted = 2, - Watered = 3 + Watered = 3, + NotFound = 99 } public partial class FieldBehaviour : Sprite3D { [Export] private Texture2D Tilled; [Export] private Texture2D Watered; - [Export] private FieldState FieldState = FieldState.Empty; + [Export] public FieldState FieldState = FieldState.Empty; public Vector2 FieldPosition; diff --git a/scripts/CSharp/Common/Farming/FieldService.cs b/scripts/CSharp/Common/Farming/FieldService.cs index 79834b1..c4469dd 100644 --- a/scripts/CSharp/Common/Farming/FieldService.cs +++ b/scripts/CSharp/Common/Farming/FieldService.cs @@ -1,3 +1,4 @@ +using System.Diagnostics; using Godot; using Godot.Collections; @@ -6,32 +7,41 @@ namespace Babushka.scripts.CSharp.Common.Farming; [GlobalClass] public partial class FieldService : Node3D { - [Export] private Dictionary fields = new Dictionary(); + [Export] private Dictionary fields = new Dictionary(); //Create - - public void AddEntry(Vector2I key, FieldState state) + public bool TryAddEntry(Vector2I key, FieldBehaviour field) { - fields.Add(key, state); + if (!fields.ContainsKey(key)) + { + fields.Add(key, field); + return true; + } + Debug.Print("Added entry: " + key); + return false; } // Read - - public FieldState Get(Vector2I key) + public FieldBehaviour Get(Vector2I key) { - return fields[key]; + Debug.Print($"Getting field at {key}. Found: {fields.ContainsKey(key)}."); + if(fields.TryGetValue(key, out FieldBehaviour field)) + return field; + return null; } //Update - public void UpdateEntry(Vector2I fieldPosition, FieldState state) + public void UpdateEntry(Vector2I fieldPosition, FieldBehaviour state) { + + Debug.Print("Updating entry: " + fieldPosition); if (fields.ContainsKey(fieldPosition)) { fields[fieldPosition] = state; } else { - AddEntry(fieldPosition, state); + TryAddEntry(fieldPosition, state); } } @@ -39,6 +49,7 @@ public partial class FieldService : Node3D public void RemoveEntry(Vector2I fieldPosition) { + Debug.Print("Removing entry: " + fieldPosition); if (fields.ContainsKey(fieldPosition)) { fields.Remove(fieldPosition);