62 lines
1.6 KiB
GDScript
62 lines
1.6 KiB
GDScript
extends Reference
|
|
|
|
const INTERFACES = [preload("res://scripts/player/state/state_interface.tres")]
|
|
const NAME = "interacting"
|
|
|
|
var ctx: KinematicBody = null
|
|
var anim_tree: AnimationTree
|
|
var timer: SceneTreeTimer
|
|
|
|
func _init():
|
|
pass
|
|
|
|
func enter_from(state):
|
|
anim_tree = ctx.get_node("model_transform/DungMan/AnimationTree")
|
|
anim_tree["parameters/Move/playback"].travel("idle")
|
|
anim_tree["parameters/Activate/active"] = true
|
|
timer = ctx.get_tree().create_timer(0.2)
|
|
timer.connect("timeout", self, "_on_timeout", [], CONNECT_ONESHOT)
|
|
|
|
func exit_to(state):
|
|
if timer.is_connected("timeout", self, "_on_timeout"):
|
|
timer.disconnect("timeout", self, "_on_timeout")
|
|
|
|
func physics_process(delta):
|
|
pass
|
|
|
|
func unhandled_input(event):
|
|
pass
|
|
|
|
func _on_timeout():
|
|
for area in ctx.get_node("%TriggerVolume").get_overlapping_areas():
|
|
if try_trigger_interact(area):
|
|
break
|
|
if ctx.state == self:
|
|
ctx.change_state(ctx.StateDefault.new())
|
|
|
|
func try_trigger_interact(area) -> bool:
|
|
var owner = area
|
|
if area.has_meta("owner"):
|
|
owner = area.get_meta("owner")
|
|
|
|
if not owner.has_method("on_player_interact"):
|
|
return false
|
|
|
|
var result = owner.on_player_interact(ctx)
|
|
|
|
if not result:
|
|
print("player failed to interacted with ", owner)
|
|
return false
|
|
|
|
print("player interacted with ", owner)
|
|
return true
|
|
|
|
func on_sleep(made_it_to_bed: bool, hop_position: Spatial):
|
|
ctx.change_state(ctx.StateSleeping.new(made_it_to_bed, hop_position))
|
|
|
|
func on_start_playing_rover_game():
|
|
ctx.change_state(ctx.StatePlayingRoverGame.new())
|
|
|
|
func on_stop_playing_rover_game():
|
|
assert(false, "invalid state")
|