Interaction now working with streamed entities. Yay!
parent
b968f9b3b2
commit
187dac2d85
|
@ -1,13 +1,12 @@
|
||||||
using Godot;
|
|
||||||
using System;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using Godot;
|
||||||
using GodotComponentTest.components;
|
using GodotComponentTest.components;
|
||||||
using GodotComponentTest.entities;
|
using GodotComponentTest.entities;
|
||||||
|
|
||||||
public class Chest : Entity, IInteractionInterface
|
public class Chest : Entity, IInteractionInterface
|
||||||
{
|
{
|
||||||
// resources
|
// resources
|
||||||
private PackedScene _goldBarScene = GD.Load<PackedScene>("res://entities/GoldBar.tscn");
|
private readonly PackedScene _goldBarScene = GD.Load<PackedScene>("res://entities/GoldBar.tscn");
|
||||||
|
|
||||||
public enum LidState
|
public enum LidState
|
||||||
{
|
{
|
||||||
|
@ -16,23 +15,18 @@ public class Chest : Entity, IInteractionInterface
|
||||||
}
|
}
|
||||||
|
|
||||||
public LidState State = LidState.Closed;
|
public LidState State = LidState.Closed;
|
||||||
public bool IsMouseOver = false;
|
public bool IsMouseOver;
|
||||||
|
|
||||||
private MeshInstance _mesh;
|
private MeshInstance _mesh;
|
||||||
private AnimationPlayer _animationPlayer;
|
private AnimationPlayer _animationPlayer;
|
||||||
|
|
||||||
private InteractionComponent _interactionComponent;
|
public InteractionComponent InteractionComponent { get; set; }
|
||||||
public InteractionComponent InteractionComponent
|
|
||||||
{
|
|
||||||
get => _interactionComponent;
|
|
||||||
set => _interactionComponent = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
[Signal]
|
[Signal]
|
||||||
delegate void EntityClicked(Entity entity);
|
private delegate void EntityClicked(Entity entity);
|
||||||
|
|
||||||
[Signal]
|
[Signal]
|
||||||
delegate void ChestOpened(Entity entity);
|
private delegate void ChestOpened(Entity entity);
|
||||||
|
|
||||||
// Called when the node enters the scene tree for the first time.
|
// Called when the node enters the scene tree for the first time.
|
||||||
public override void _Ready()
|
public override void _Ready()
|
||||||
|
@ -114,9 +108,9 @@ public class Chest : Entity, IInteractionInterface
|
||||||
GetParent().AddChild(bar);
|
GetParent().AddChild(bar);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_interactionComponent != null)
|
if (InteractionComponent != null)
|
||||||
{
|
{
|
||||||
_interactionComponent.EmitSignal("InteractionEnd");
|
InteractionComponent.EndInteraction();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
using Godot;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
using Godot;
|
||||||
using GodotComponentTest.components;
|
using GodotComponentTest.components;
|
||||||
using GodotComponentTest.entities;
|
using GodotComponentTest.entities;
|
||||||
|
|
||||||
|
@ -8,21 +8,15 @@ public class Tree : StaticBody, IInteractionInterface
|
||||||
{
|
{
|
||||||
[Export] public float ChopDuration = 2;
|
[Export] public float ChopDuration = 2;
|
||||||
public bool IsMouseOver;
|
public bool IsMouseOver;
|
||||||
|
public InteractionComponent InteractionComponent { get; set; }
|
||||||
|
|
||||||
private MeshInstance _geometry;
|
private MeshInstance _geometry;
|
||||||
private AnimationPlayer _animationPlayer;
|
private AnimationPlayer _animationPlayer;
|
||||||
private float _health = 100;
|
private float _health = 100;
|
||||||
private bool _isBeingChopped;
|
private bool _isBeingChopped;
|
||||||
|
|
||||||
private InteractionComponent _interactionComponent;
|
|
||||||
public InteractionComponent InteractionComponent
|
|
||||||
{
|
|
||||||
get => _interactionComponent;
|
|
||||||
set => _interactionComponent = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
[Signal]
|
[Signal]
|
||||||
delegate void EntityClicked(Entity entity);
|
public delegate void EntityClicked(Entity entity);
|
||||||
|
|
||||||
// Called when the node enters the scene tree for the first time.
|
// Called when the node enters the scene tree for the first time.
|
||||||
public override void _Ready()
|
public override void _Ready()
|
||||||
|
@ -51,6 +45,8 @@ public class Tree : StaticBody, IInteractionInterface
|
||||||
|
|
||||||
if (_health == 0)
|
if (_health == 0)
|
||||||
{
|
{
|
||||||
|
InteractionComponent.EndInteraction();
|
||||||
|
InteractionComponent.TargetEntity = null;
|
||||||
QueueFree();
|
QueueFree();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -114,6 +114,8 @@ public class Game : Spatial
|
||||||
if (node.HasSignal("EntityClicked"))
|
if (node.HasSignal("EntityClicked"))
|
||||||
node.Connect("EntityClicked", this, nameof(OnEntityClicked));
|
node.Connect("EntityClicked", this, nameof(OnEntityClicked));
|
||||||
|
|
||||||
|
_world.Connect("EntityClicked", this, nameof(OnEntityClicked));
|
||||||
|
|
||||||
// perform dependency injection
|
// perform dependency injection
|
||||||
//_streamContainer.SetWorld(_tileWorld);Clicked
|
//_streamContainer.SetWorld(_tileWorld);Clicked
|
||||||
var worldInfoComponent = _player.GetNode<WorldInfoComponent>("WorldInfo");
|
var worldInfoComponent = _player.GetNode<WorldInfoComponent>("WorldInfo");
|
||||||
|
|
|
@ -218,8 +218,14 @@ public class World : Spatial
|
||||||
var grassAsset = SelectAsset(offsetCoord, _grassAssets, environmentRandom, 0.15);
|
var grassAsset = SelectAsset(offsetCoord, _grassAssets, environmentRandom, 0.15);
|
||||||
if (grassAsset != null) chunk.Entities.AddChild(grassAsset);
|
if (grassAsset != null) chunk.Entities.AddChild(grassAsset);
|
||||||
|
|
||||||
var treeAsset = SelectAsset(offsetCoord, _treeAssets, environmentRandom, 0.05);
|
Tree treeAsset = SelectAsset(offsetCoord, _treeAssets, environmentRandom, 0.05) as Tree;
|
||||||
if (treeAsset != null) chunk.Entities.AddChild(treeAsset);
|
if (treeAsset != null)
|
||||||
|
{
|
||||||
|
chunk.Entities.AddChild(treeAsset);
|
||||||
|
treeAsset.Connect("EntityClicked", this, nameof(OnEntityClicked));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// TODO: MarkCellUnwalkable(cell);
|
// TODO: MarkCellUnwalkable(cell);
|
||||||
// else if (environmentRandom.NextDouble() < 0.01)
|
// else if (environmentRandom.NextDouble() < 0.01)
|
||||||
// {
|
// {
|
||||||
|
|
|
@ -9,54 +9,54 @@ using NodePair = System.Tuple<Godot.Node, Godot.Node>;
|
||||||
|
|
||||||
public class InteractionSystem : Node
|
public class InteractionSystem : Node
|
||||||
{
|
{
|
||||||
private List<NodePair> _interactionPairs;
|
private List<InteractionComponent> _activeInteractions;
|
||||||
|
|
||||||
// Called when the node enters the scene tree for the first time.
|
// Called when the node enters the scene tree for the first time.
|
||||||
public override void _Ready()
|
public override void _Ready()
|
||||||
{
|
{
|
||||||
_interactionPairs = new List<NodePair>();
|
_activeInteractions = new List<InteractionComponent>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public override void _Process(float delta)
|
public override void _Process(float delta)
|
||||||
{
|
{
|
||||||
base._Process(delta);
|
base._Process(delta);
|
||||||
|
|
||||||
List<NodePair> invalidInteractionPairs = new List<NodePair>();
|
List<NodePair> invalidInteractionPairs = new List<NodePair>();
|
||||||
|
List<InteractionComponent> endedInteractions = new List<InteractionComponent>();
|
||||||
|
|
||||||
foreach (Tuple<Node, Node> pair in _interactionPairs)
|
foreach (InteractionComponent interaction in _activeInteractions)
|
||||||
{
|
{
|
||||||
Node nodeA = pair.Item1;
|
Spatial owningEntity = interaction.OwningEntity;
|
||||||
Node nodeB = pair.Item2;
|
Spatial targetEntity = interaction.TargetEntity;
|
||||||
|
|
||||||
if (nodeA == null || nodeA.IsQueuedForDeletion() || nodeB == null || nodeB.IsQueuedForDeletion()) {
|
if (owningEntity == null || owningEntity.IsQueuedForDeletion() || targetEntity == null || targetEntity.IsQueuedForDeletion())
|
||||||
invalidInteractionPairs.Add(pair);
|
{
|
||||||
|
interaction.hasStopped = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nodeA == null || nodeA.IsQueuedForDeletion())
|
if (interaction.hasStopped)
|
||||||
{
|
{
|
||||||
IInteractionInterface interactableB = nodeB as IInteractionInterface;
|
IInteractionInterface interactableA = owningEntity as IInteractionInterface;
|
||||||
if (interactableB != null)
|
|
||||||
{
|
|
||||||
interactableB.OnInteractionEnd();
|
|
||||||
interactableB.InteractionComponent = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nodeB == null || nodeB.IsQueuedForDeletion())
|
|
||||||
{
|
|
||||||
IInteractionInterface interactableA = nodeA as IInteractionInterface;
|
|
||||||
if (interactableA != null)
|
if (interactableA != null)
|
||||||
{
|
{
|
||||||
interactableA.OnInteractionEnd();
|
interactableA.OnInteractionEnd();
|
||||||
interactableA.InteractionComponent = null;
|
interactableA.InteractionComponent = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IInteractionInterface interactableB = targetEntity as IInteractionInterface;
|
||||||
|
if (interactableB != null)
|
||||||
|
{
|
||||||
|
interactableB.OnInteractionEnd();
|
||||||
|
interactableB.InteractionComponent = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
endedInteractions.Add(interaction);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (NodePair pair in invalidInteractionPairs)
|
foreach (InteractionComponent interaction in endedInteractions)
|
||||||
{
|
{
|
||||||
_interactionPairs.Remove(pair);
|
_activeInteractions.Remove(interaction);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,8 +71,7 @@ public class InteractionSystem : Node
|
||||||
|
|
||||||
interactionComponent.EmitSignal("InteractionStart");
|
interactionComponent.EmitSignal("InteractionStart");
|
||||||
|
|
||||||
NodePair pair = new NodePair(owningEntity, targetEntity);
|
_activeInteractions.Add(interactionComponent);
|
||||||
_interactionPairs.Add(new NodePair(owningEntity, targetEntity));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ConnectInteractionSignals(Entity entity, InteractionComponent interactionComponent)
|
private static void ConnectInteractionSignals(Entity entity, InteractionComponent interactionComponent)
|
||||||
|
|
Loading…
Reference in New Issue