2025-12-29 11:54:31 +08:00
|
|
|
|
extends LimboHSM
|
|
|
|
|
|
|
|
|
|
|
|
@onready var root: Normal = %Normal
|
|
|
|
|
|
|
|
|
|
|
|
func _setup() -> void:
|
|
|
|
|
|
self.add_event_handler(&"trigger_jump",_handler_trigger_jump)
|
|
|
|
|
|
self.add_event_handler(root.climb_state.EVENT_FINISHED,_handler_climb_state_finished)
|
|
|
|
|
|
self.add_event_handler(root.climb_jump_state.EVENT_FINISHED,_handler_climb_state_finished)
|
|
|
|
|
|
|
|
|
|
|
|
self.add_transition(root.climb_state,root.climb_jump_state,&"want_to_climb_jump")
|
|
|
|
|
|
|
|
|
|
|
|
func _enter() -> void:
|
|
|
|
|
|
if agent.is_on_wall():##如果已经在Wall上,则什么都不做
|
|
|
|
|
|
return
|
|
|
|
|
|
|
2026-01-11 22:32:09 +08:00
|
|
|
|
snap_to_wall()
|
|
|
|
|
|
|
|
|
|
|
|
func snap_to_wall(max_snap_dist := 6.0) -> bool:
|
|
|
|
|
|
var wall_dir : float = sign(agent.wall_detector.wall_direction.x)
|
|
|
|
|
|
|
|
|
|
|
|
var from : Vector2 = agent.global_position
|
|
|
|
|
|
var to : Vector2 = from + Vector2(wall_dir * max_snap_dist, 0)
|
|
|
|
|
|
|
|
|
|
|
|
var query := PhysicsRayQueryParameters2D.create(from, to)
|
|
|
|
|
|
query.exclude = [agent]
|
|
|
|
|
|
query.collision_mask = agent.collision_mask
|
|
|
|
|
|
|
|
|
|
|
|
var result = agent.get_world_2d().direct_space_state.intersect_ray(query)
|
|
|
|
|
|
if result:
|
|
|
|
|
|
var target_x = result.position.x - wall_dir * agent.wall_snap_offset
|
|
|
|
|
|
agent.global_position.x = target_x
|
|
|
|
|
|
return true
|
|
|
|
|
|
|
|
|
|
|
|
return false
|
2025-12-29 11:54:31 +08:00
|
|
|
|
|
|
|
|
|
|
func _handler_climb_state_finished() -> bool:
|
|
|
|
|
|
if agent.is_on_floor():
|
|
|
|
|
|
self.dispatch(&"exit_on_ground")
|
|
|
|
|
|
else:
|
|
|
|
|
|
self.dispatch(&"exit_on_air")
|
|
|
|
|
|
|
|
|
|
|
|
return true
|
|
|
|
|
|
|
|
|
|
|
|
func _handler_trigger_jump() -> bool:
|
|
|
|
|
|
if self.get_active_state() == root.climb_state:
|
2026-01-10 17:36:16 +08:00
|
|
|
|
var input_x: float = agent.m_input_intent_direction.x
|
|
|
|
|
|
var wall_dir: float = agent.get_wall_normal().x
|
|
|
|
|
|
if sign(input_x) * sign(wall_dir) > 0:
|
|
|
|
|
|
root._trigger_climb_cd(.12)
|
|
|
|
|
|
self.get_root().blackboard.set_var(&"want_to_jump",true)
|
|
|
|
|
|
_handler_climb_state_finished()
|
|
|
|
|
|
return true
|
|
|
|
|
|
|
2025-12-29 11:54:31 +08:00
|
|
|
|
self.dispatch(&"want_to_climb_jump")
|
|
|
|
|
|
return true
|