Files
kicking-high/proto3/godot/ai/walk.gd
2020-04-13 12:45:25 +03:00

175 lines
5.5 KiB
GDScript

extends BTAction
class_name BTWalk
#func npc_stuck(npc, cond):
# if cond:
# if npc.has_meta("stuck"):
# var stuck = npc.get_meta("stuck")
# stuck += 2.0 * get_process_delta_time()
# npc.set_meta("stuck", stuck)
# else:
# npc.set_meta("stuck", 0.4 * get_process_delta_time())
# print(npc.name, " stuck ", npc.get_meta("stuck"))
# else:
# if npc.has_meta("stuck"):
# var stuck = npc.get_meta("stuck")
# stuck -= 0.1 * get_process_delta_time()
# print(npc.name, " unstucking: ", stuck)
# if stuck > 0.0:
# npc.set_meta("stuck", stuck)
# else:
# npc.set_meta("stuck", null)
#func is_npc_stuck(npc):
# if npc.has_meta("stuck"):
# var stuck = npc.get_meta("stuck")
# if stuck > 0.0:
# return true
# return false
func tick(tick: Tick) -> int:
var npc = tick.actor
var bb = tick.blackboard
# npc.disable_gravity = false
if npc.has_meta("walk_cooldown"):
var cd = npc.get_meta("walk_cooldown")
if cd >= 0.0:
cd -= get_process_delta_time()
npc.set_meta("walk_cooldown", cd)
return FAILED
else:
npc.remove_meta("walk_cooldown")
if npc.has_meta("action"):
if npc.get_meta("action") == "run_away":
var p = [["set", "parameters/main/Motion/walk/walking/blend_position", 1.0]]
npc.smart_obj(p)
elif npc.get_meta("action") == "unstuck":
return OK
else:
var p = [["set", "parameters/main/Motion/walk/walking/blend_position", 0.0]]
npc.smart_obj(p)
# var front = - npc.orientation.basis[2]* 0.6
# var up = npc.orientation.basis[1]
# var npc_pos = npc.global_transform.origin
# var space_state = npc.get_world().direct_space_state
# var front_result = space_state.intersect_ray(npc_pos + up, npc_pos + up + front,
# [npc], 0xffff)
var front_result = bb.get("front_result")
# var front_left_result = bb.get("front_left_result")
# var front_right_result = bb.get("front_right_result")
var low_obstacle_result: = {}
for k in ["low_obstacle_result"]:
low_obstacle_result = bb.get("low_obstacle_result")
if low_obstacle_result.has("collider"):
break
var front_col = false
# var left_col = false
# var right_col = false
var low_obstacle = false
if front_result.has("collider"):
var col = front_result.collider
if !col.is_in_group("entry"):
front_col = true
front_col = true
# if front_left_result.has("collider"):
# var col = front_left_result.collider
# if !col.is_in_group("entry"):
# left_col = true
# left_col = true
# if front_right_result.has("collider"):
# var col = front_right_result.collider
# if !col.is_in_group("entry"):
# right_col = true
# right_col = true
if !front_col:
if low_obstacle_result.has("collider"):
var col = low_obstacle_result.collider
if !col.is_in_group("entry"):
low_obstacle = true
if low_obstacle:
# npc.disable_gravity = true
var c = [["set", "parameters/climb_low_obstacle/active", true]]
npc.smart_obj(c)
else:
npc.do_walk()
# if !low_obstacle && !front_col:
## npc_stuck(npc, false)
# npc.do_walk()
## if npc.has_meta("stuck"):
## npc.set_meta("stuck", null)
# return OK
# elif !low_obstacle && front_col:
# var normal = front_result.normal
# var xnormal = npc.global_transform.xform_inv(normal)
# print("xnormal ", xnormal)
# var rot: Basis = npc.orientation.basis
# var ok = false
# if xnormal.z < 0:
# rot = rot.rotated(Vector3(0, 1, 0), deg2rad(-20 + 3.0 * (0.5 - randf())))
# ok = true
# elif xnormal.z > 0:
# rot = rot.rotated(Vector3(0, 1, 0), deg2rad(20 + 3.0 * (0.5 - randf())))
# ok = true
## else:
## rot = rot.rotated(Vector3(0, 1, 0), deg2rad(10 + 10.0 * (0.5 - randf())))
# var cur: Basis = npc.orientation.basis
# cur = cur.slerp(rot, get_process_delta_time())
# npc.orientation.basis = cur
# if ok:
# npc.do_walk()
# return OK
# elif !low_obstacle && left_col && !right_col:
# var rot: Basis = npc.orientation.basis.rotated(Vector3(0, 1, 0), deg2rad(-30))
# var cur: Basis = npc.orientation.basis
# cur = cur.slerp(rot, get_process_delta_time())
# npc.orientation.basis = cur
# npc_stuck(npc, false)
# if !is_npc_stuck(npc):
# npc.do_walk()
# return OK
# elif !low_obstacle && !left_col && right_col:
# var rot: Basis = npc.orientation.basis.rotated(Vector3(0, 1, 0), deg2rad(30))
# var cur: Basis = npc.orientation.basis
# cur = cur.slerp(rot, get_process_delta_time())
# npc.orientation.basis = cur
# npc_stuck(npc, false)
# if !is_npc_stuck(npc):
# npc.do_walk()
# return OK
# elif !low_obstacle && left_col && right_col:
# var rot: Basis = npc.orientation.basis.rotated(Vector3(0, 1, 0), deg2rad(100))
# var cur: Basis = npc.orientation.basis
# cur = cur.slerp(rot, get_process_delta_time())
# npc.orientation.basis = cur
# npc_stuck(npc, false)
# print("correction")
# npc.do_stop()
# if !is_npc_stuck(npc):
# npc.do_walk()
# return OK
# elif !low_obstacle && left_col && right_col:
# var rot: Basis = npc.orientation.basis.rotated(Vector3(0, 1, 0), deg2rad(90))
# var cur: Basis = npc.orientation.basis
# cur = cur.slerp(rot, get_process_delta_time())
# npc.orientation.basis = cur
# npc.do_walk()
# npc_stuck(npc, true)
# return FAILED
# elif !low_obstacle:
# var rot: Basis = npc.orientation.basis.rotated(Vector3(0, 1, 0), deg2rad(-45))
# var cur: Basis = npc.orientation.basis
# cur = cur.slerp(rot, get_process_delta_time())
# npc.orientation.basis = cur
# npc.do_walk()
# if npc.has_meta("stuck"):
# var stuck = npc.get_meta("stuck")
# stuck += 2.0 * get_process_delta_time()
# npc.set_meta("stuck", stuck)
# else:
# npc.set_meta("stuck", 0.0)
# npc_stuck(npc, true)
# return FAILED
return OK
# print(npc.name, " walk")