GodotComponentTest/entities/Player.cs

181 lines
5.4 KiB
C#
Raw Normal View History

2022-12-02 21:09:40 +01:00
using Godot;
using System;
2023-04-28 14:19:48 +02:00
using System.Collections.Generic;
using System.Diagnostics;
2023-04-28 14:19:48 +02:00
using System.Linq;
using GodotComponentTest.entities;
2022-12-02 21:09:40 +01:00
public class Player : Entity, IInteractionInterface
2022-12-02 21:09:40 +01:00
{
// public members
public Vector3 TargetPosition = Vector3.Zero;
public int goldCount = 0;
public TaskQueueComponent TaskQueueComponent;
public NavigationComponent Navigation
{
get { return _navigationComponent; }
}
[Signal]
delegate void GoldCountChanged(int goldCount);
// private members
private WorldInfoComponent _worldInfo;
private GroundMotionComponent _groundMotion;
private NavigationComponent _navigationComponent;
2023-04-28 14:19:48 +02:00
private Area _itemAttractorArea;
private Area _itemPickupArea;
private List<Node> _attractedItemList = new List<Node>();
private BoneAttachment _toolAttachement;
private AnimationPlayer _playerAnimationPlayer;
2022-12-02 21:09:40 +01:00
// Called when the node enters the scene tree for the first time.
public override void _Ready()
{
_groundMotion = new GroundMotionComponent();
_worldInfo = (WorldInfoComponent)FindNode("WorldInfo", false);
_navigationComponent = (NavigationComponent)FindNode("Navigation", false);
_navigationComponent.TileWorld = _worldInfo.TileWorld;
TaskQueueComponent = new TaskQueueComponent();
2023-04-28 14:19:48 +02:00
_itemAttractorArea = (Area)FindNode("ItemAttractorArea", false);
if (_itemAttractorArea == null)
{
GD.PushWarning("No ItemAttractorArea node found for " + this.GetClass());
}
else
{
_itemAttractorArea.Connect("body_entered", this, nameof(OnItemAttractorBodyEntered));
_itemAttractorArea.Connect("body_exited", this, nameof(OnItemAttractorBodyExited));
}
_itemPickupArea = (Area)FindNode("ItemPickupArea", false);
if (_itemPickupArea == null)
{
GD.PushWarning("No ItemPickupArea node found for " + this.GetClass());
}
else
{
_itemPickupArea.Connect("body_entered", this, nameof(OnItemPickupAreaBodyEntered));
}
_playerAnimationPlayer = (AnimationPlayer)GetNode<AnimationPlayer>("Geometry/AnimationPlayer");
Debug.Assert(_playerAnimationPlayer != null);
_toolAttachement = (BoneAttachment)FindNode("ToolAttachement");
if (_toolAttachement == null)
{
GD.PushWarning("No ToolAttachement found!");
}
2022-12-02 21:09:40 +01:00
}
2022-12-31 18:36:52 +01:00
public override void _PhysicsProcess(float delta)
{
2022-12-31 18:36:52 +01:00
base._PhysicsProcess(delta);
if (_navigationComponent == null)
{
return;
}
if (TaskQueueComponent != null && TaskQueueComponent.Queue.Count > 0)
{
2023-02-12 21:10:28 +01:00
TaskQueueComponent.Process(this, delta);
if (TaskQueueComponent.Queue.Count > 0)
{
2023-02-12 21:10:28 +01:00
var currentTask = TaskQueueComponent.Queue.Peek();
if (currentTask is TaskQueueComponent.NavigationTask)
{
TaskQueueComponent.NavigationTask navigationTask = (TaskQueueComponent.NavigationTask)currentTask;
2023-05-03 12:10:01 +02:00
_navigationComponent.PlanDirectPath(GlobalTransform, navigationTask.NavigationPoint);
2023-02-12 21:10:28 +01:00
}
}
}
_navigationComponent.UpdateCurrentGoal(GlobalTransform);
_groundMotion.PhysicsProcess(delta, this, _navigationComponent.CurrentGoalPositionWorld, _navigationComponent.CurrentGoalOrientationWorld, _worldInfo.TileWorld);
}
public override void _Process(float delta)
{
if (_navigationComponent != null)
{
_navigationComponent.UpdateCurrentGoal(GlobalTransform);
}
2023-04-28 14:19:48 +02:00
foreach (Node node in _attractedItemList)
{
if (node is GoldBar)
2023-04-28 14:19:48 +02:00
{
GoldBar bar = (GoldBar)node;
2023-04-28 14:19:48 +02:00
bar.SetTarget(GlobalTransform.origin);
}
}
}
public void OnItemAttractorBodyEntered(Node node)
{
GD.Print("Item entered " + node);
_attractedItemList.Add(node);
}
public void OnItemAttractorBodyExited(Node node)
{
GD.Print("Item exited " + node);
if (node is GoldBar)
2023-04-28 14:19:48 +02:00
{
GoldBar bar = (GoldBar)node;
2023-04-28 14:19:48 +02:00
bar.UnsetTarget();
}
_attractedItemList.Remove(node);
}
public void OnItemPickupAreaBodyEntered(Node body)
{
GD.Print("Picking up item: " + body.Name);
if (body is Axe)
{
SetActiveTool("Axe");
}
2023-04-28 14:19:48 +02:00
if (body is GoldBar)
{
goldCount++;
EmitSignal("GoldCountChanged", goldCount);
2023-04-28 14:19:48 +02:00
}
body.QueueFree();
}
public void SetActiveTool(String toolName)
{
Debug.Assert(_toolAttachement != null);
if (toolName == "Axe")
{
_toolAttachement.Visible = true;
} else if (toolName == "")
{
_toolAttachement.Visible = false;
}
}
public void OnInteractionStart()
{
GD.Print("Player Starting Interaction");
_playerAnimationPlayer.CurrentAnimation = "Hit-loop";
_playerAnimationPlayer.Play();
}
public void OnInteractionEnd()
{
GD.Print("Player Stopping Interaction");
_playerAnimationPlayer.CurrentAnimation = "Idle-loop";
}
}