Reworked the fieldservice

remotes/checkIfPRContentChanged-1749884192368007736/c_sharp_setup
kziolkowski 9 months ago
parent c200098f0c
commit c73d3ff370

@ -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"]

@ -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)

@ -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;

@ -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<Vector2I, FieldState> fields = new Dictionary<Vector2I, FieldState>();
[Export] private Dictionary<Vector2I, FieldBehaviour> fields = new Dictionary<Vector2I, FieldBehaviour>();
//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);

Loading…
Cancel
Save