Almost fixed entities

This commit is contained in:
2025-05-12 21:00:13 -05:00
parent 828ff03e56
commit a575b8a47d
13 changed files with 158 additions and 79 deletions

View File

@@ -1 +1,16 @@
class_name BasicNPCEntity extends CharacterBody3D
@export var interactEvent:Event = null
func _ready() -> void:
$Entity/EntityInteractable.onInteract.connect(
self.onEntityInteract
)
func onEntityInteract(
interactor:EntityInteractor,
interactee:EntityInteractable
) -> void:
if interactEvent == null || interactEvent.started:
return
interactEvent.onEntityInteract(interactor, $Entity/EntityInteractable)

View File

@@ -18,6 +18,8 @@ enum Direction {
direction = newDirection;
_updateMaterial();
@export var characterBody:CharacterBody3D = null
func _ready() -> void:
_updateMaterial();
@@ -63,16 +65,19 @@ func updateDirectionFromMovement(movement:Vector2) -> void:
elif (movement.y < 0):
direction = Direction.NORTH;
# func getDirectionToFace(position:Vector3) -> Direction:
# var diff = position - self.position;
# if abs(diff.x) > abs(diff.z):
# if diff.x > 0:
# return Direction.EAST;
# else:
# return Direction.WEST;
# else:
# if diff.z > 0:
# return Direction.SOUTH;
# else:
# return Direction.NORTH;
# return Direction.SOUTH;
func getDirectionToFace(position:Vector3) -> Direction:
if !characterBody:
return Direction.SOUTH;
var diff = position - characterBody.position;
if abs(diff.x) > abs(diff.z):
if diff.x > 0:
return Direction.EAST;
else:
return Direction.WEST;
else:
if diff.z > 0:
return Direction.SOUTH;
else:
return Direction.NORTH;
return Direction.SOUTH;

View File

@@ -1,3 +1,10 @@
class_name EntityInteractable extends Node
signal entityOnInteract(entity:EntityInteractor);
@export var entityDirection:EntityDirection = null
@export var entity:Entity = null
@export var characterBody:CharacterBody3D = null;
signal onInteract(interactor:EntityInteractor, interactable:EntityInteractable)
func interact(interactor:EntityInteractor) -> void:
onInteract.emit(interactor, self)

View File

@@ -1,4 +1,59 @@
class_name EntityInteractor extends Node
func tryInteract() -> EntityInteractable:
return null
enum InteractorType {
PLAYER_INPUT,
UNDECIDED
}
@export var interactorType:InteractorType = InteractorType.UNDECIDED;
@export var entityDirection:EntityDirection = null;
@export var characterBody:CharacterBody3D = null;
@export var interactRange = 0.7;
@export var entity:Entity = null
@export_flags_3d_physics() var interactLayers = 2;
func interactWith(interactable:EntityInteractable) -> void:
interactable.interact(self)
pass
func getRaycastInteractable() -> EntityInteractable:
if !entityDirection or !characterBody:
return null
var rayDirection = entityDirection.getDirectionVector()
var query = PhysicsRayQueryParameters3D.create(
characterBody.position,
characterBody.position + (rayDirection * interactRange)
)
query.collide_with_bodies = true;
query.collide_with_areas = true;
query.collision_mask = interactLayers;
query.exclude = [ characterBody ];
var result = characterBody.get_world_3d().direct_space_state.intersect_ray(query)
if !result or !result.collider:
return null
var coll:Node3D = result.collider;
var interactable:EntityInteractable = coll.find_child("EntityInteractable")
return interactable
func _process(delta: float) -> void:
match interactorType:
InteractorType.PLAYER_INPUT:
_processPlayerInput()
InteractorType.UNDECIDED:
_processUndecided()
_:
assert(false, "Invalid interactor type")
func _processPlayerInput() -> void:
if !Input.is_action_just_pressed("interact"):
return
var interactable:EntityInteractable = getRaycastInteractable()
if interactable:
self.interactWith(interactable)
func _processUndecided() -> void:
pass

View File

@@ -1,27 +1 @@
class_name Rosa extends CharacterBody3D
# var interactRange = 0.7;
# func updateOverworldLogic(delta) -> void:
# # Check if interact button is pressed
# if(Input.is_action_just_pressed("interact")):
# var rayDirection = getDirectionVector();
# # cast ray
# var query = PhysicsRayQueryParameters3D.create(
# position,
# position + (rayDirection * interactRange)
# )
# query.collide_with_areas = true
# query.exclude = [self]
# var result = get_world_3d().direct_space_state.intersect_ray(query)
# if result and result.collider:
# var collider = result.collider
# if(collider.has_method("interact")):
# collider.interact(self)
# if Input.is_action_just_pressed("pause"):
# PAUSE.playerPauseToggle();

View File

@@ -1,6 +1,6 @@
class_name EventEntityTurn extends "res://scripts/Event/Event.gd"
@export var entity:Entity = null
@export var entity:EntityDirection = null
@export var direction:EntityDirection.Direction = EntityDirection.Direction.SOUTH
func start():

View File

@@ -2,11 +2,10 @@ class_name Event extends Node
const Entity = preload("res://scripts/Entity/Entity.gd");
var started:bool = false;
var ended:bool = false;
var interactor:Entity = null
var interactee:Entity = null
var interactor:EntityInteractor = null
var interactee:EntityInteractable = null
# Godot Methods
func _init() -> void:
@@ -43,8 +42,8 @@ func reset() -> void:
interactee = null
func onEntityInteract(
interactor:Entity,
interactee:Entity
interactor:EntityInteractor,
interactee:EntityInteractable
) -> void:
self.reset()
self.interactor = interactor

View File

@@ -12,34 +12,39 @@ class_name EventConversation extends "res://scripts/Event/Flow/EventGroup.gd"
func start() -> void:
# Turn events
if interactee != null && interactor != null:
if pauseInteractee && turnInteractee:
if interactee && interactor:
if turnInteractee && interactee.entityDirection && interactor.characterBody:
var turn = EventEntityTurn.new()
turn.entity = interactee
turn.direction = interactee.getDirectionToFace(interactor.position)
turn.entity = interactee.entityDirection
turn.direction = turn.entity.getDirectionToFace(interactor.characterBody.position)
addExtraEvent(turn, 0)
if pauseInteractor && turnInteractor:
if turnInteractor && interactor.entityDirection && interactee.characterBody:
var turn = EventEntityTurn.new()
turn.entity = interactor
turn.direction = interactor.getDirectionToFace(interactee.position)
turn.entity = interactor.entityDirection
turn.direction = turn.entity.getDirectionToFace(interactee.characterBody.position)
addExtraEvent(turn, 0)
# Create start pause event
var startPause = EventPause.new()
startPause.pauseType = startPauseType
startPause.entities = entities
startPause.includeInteractee = pauseInteractee
startPause.includeInteractor = pauseInteractor
addExtraEvent(startPause, 0)
if (pauseInteractee && interactee.entity) || (pauseInteractor && interactor.entity):
var startPause = EventPause.new()
startPause.pauseType = startPauseType
startPause.entities = entities
if pauseInteractee && interactee.entity:
startPause.includeInteractee = pauseInteractee
if pauseInteractor && interactor.entity:
startPause.includeInteractor = pauseInteractor
addExtraEvent(startPause, 0)
# Create end pause event.
var endPause = EventPause.new()
endPause.pauseType = endPauseType
endPause.entities = entities
endPause.includeInteractee = pauseInteractee
endPause.includeInteractor = pauseInteractor
addExtraEvent(endPause, -1)
# Create end pause event.
var endPause = EventPause.new()
endPause.pauseType = endPauseType
endPause.entities = entities
if pauseInteractee && interactee.entity:
endPause.includeInteractee = pauseInteractee
if pauseInteractor && interactor.entity:
endPause.includeInteractor = pauseInteractor
addExtraEvent(endPause, -1)
# Pass off to event group
super.start()
super.start()

View File

@@ -9,8 +9,8 @@ const PauseSystem = preload("res://scripts/Singleton/Pause.gd")
func start() -> void:
var ents:Array[Entity] = entities
if interactor != null and includeInteractor:
ents.append(interactor)
if interactee != null and includeInteractee:
ents.append(interactee)
if interactor && includeInteractor && interactor.entity:
ents.append(interactor.entity)
if interactee && includeInteractee && interactee.entity:
ents.append(interactee.entity)
PAUSE.pause(pauseType, ents)

View File

@@ -12,7 +12,7 @@ enum PauseType {
};
var pauseType:PauseType = PauseType.NOT_PAUSED;
var entities:Array = [];
var entities:Array[Entity] = [];
var playerPaused:bool = false;
func getPauseState() -> PauseType: