Files
academy2-game/scripts/modules/cmdq.gd
2022-01-09 02:40:04 +03:00

263 lines
8.7 KiB
GDScript3

extends AIScriptModule
# Declare member variables here. Examples:
# var a = 2
# var b = "text"
# Called when the node enters the scene tree for the first time.
var animtree: AnimationTree
var root_motion_track
func init(tick):
# process_priority = 0
pass
func can_walk_there(tick: AITick, dest: Vector3) -> bool:
var root = get_character(tick)
var space: PhysicsDirectSpaceState = root.get_world().get_direct_space_state()
var result = space.intersect_ray(root.global_transform.origin, dest, [root])
if result.has("collider"):
return false
else:
return true
func update_physics(tick, delta):
var root = get_character(tick)
var orientation: Transform
assert(root.has_meta("skeleton"))
if root.has_meta("orientation"):
orientation = root.get_meta("orientation")
if !animtree:
animtree = root.get_meta("animation_tree")
if animtree:
root_motion_track = animtree.root_motion_track
else:
return FAILED
var skel = root.get_meta("skeleton")
if !skel:
return FAILED
if characters.handle_cmdq(root):
return ERR_BUSY
if root.has_meta("cmdqueue"):
var cmds = root.get_meta("cmdqueue")
var cmd = cmds.pop_front()
match cmd[0]:
# "disable_physics":
# var owners = get_shape_owners()
# for e in owners:
# shape_owner_set_disabled(e, true)
# $CollisionShape.disabled = true
"vehicle_mode_on":
if root.has_meta("vehicle"):
var v = root.get_meta("vehicle")
assert(v is VehicleBody)
if root is PhysicsBody:
root.add_collision_exception_with(v)
if v is PhysicsBody:
v.add_collision_exception_with(root)
"vehicle_mode_off":
if root.has_meta("vehicle"):
var v = root.get_meta("vehicle")
assert(v is VehicleBody)
if root is PhysicsBody:
root.remove_collision_exception_with(v)
if v is PhysicsBody:
v.remove_collision_exception_with(root)
root.remove_meta("seat")
root.remove_meta("vehicle")
root.remove_meta("orig_parent")
v.remove_meta("driver")
"jumpto":
root.global_transform = cmd[1]
orientation.basis = root.global_transform.basis
if root.has_meta("vehicle"):
var v = root.get_meta("vehicle")
var et = root.global_transform
var vt = v.global_transform
var offset = vt.affine_inverse() * et
root.set_meta("vehicle_offset", offset)
root.set_meta("orientation", orientation)
# "jump_to_obj":
# var obj = cmd[1]
# root.global_transform = obj.global_transform
# orientation.basis = root.global_transform.basis
# root.set_meta("orientation", orientation)
# "jump_to_obj_rot":
# var obj = cmd[1]
# var xform = Transform()
# xform.origin = obj.global_transform.origin
# xform.basis = obj.global_transform.basis.rotated(Vector3(0, 1, 0), PI)
# root.global_transform = xform
# orientation.basis = root.global_transform.basis
# root.set_meta("orientation", orientation)
# "anim_state":
# characters.animation_node_travel(root, cmd[1])
"parent_to_vehicle":
pass
# if has_meta("vehicle"):
# var v = get_meta("vehicle")
# var et = global_transform.origin
# var vt = v.global_transform.origin
# var offset = et - vt
# set_meta("vehicle_offset", offset)
"col_ex_add", "add_col_exception":
root.add_collision_exception_with(cmd[1])
"col_ex_rm", "remove_col_exception":
root.remove_collision_exception_with(cmd[1])
"until_end":
var check = cmd[1]
var cur = characters.get_animation_node(root)
var p = animtree["parameters/state/playback"].get_current_play_position()
var l = animtree["parameters/state/playback"].get_current_length()
if check == cur && p < l - 0.05:
cmds.push_front(["until_end", cmd[1]])
# "delay":
# var d = cmd[1]
# if d > 0:
# d = d - 1
# cmds.push_front(["delay", d])
"disable_collision":
if root is PhysicsBody:
var mask = root.collision_mask
root.set_meta("orig_mask", mask)
root.collision_mask = 0
root.set_meta("physics", false)
animtree.root_motion_track = ""
"enable_collision":
if root is PhysicsBody:
var mask = root.get_meta("orig_mask")
root.collision_mask = mask
root.remove_meta("orig_mask")
root.set_meta("physics", true)
animtree.root_motion_track = root_motion_track
"show_marker":
if skel.has_node(cmd[1]):
skel.get_node(cmd[1]).show()
"hide_marker":
if skel.has_node(cmd[1]):
skel.get_node(cmd[1]).hide()
"register_marker":
if skel.has_node(cmd[2]):
markers.init_marker(cmd[1], skel.get_node(cmd[2]), cmd[3])
# "anim_param":
# animtree["parameters/" + cmd[1]] = cmd[2]
"equip":
inventory.equip(skel.get_node(cmd[1]), cmd[2])
"walkto":
if !root.has_meta("cmdq_walk"):
root.set_meta("cmdq_walk", true)
var can_walk = true
var fwd_probe = characters.forward_probe(root, 0.5, 0.05, 1.9, 0.2)
var climb = false
if fwd_probe < 0.1:
if !characters.get_animation_node(root) == "climb1":
characters.animation_node_travel(root, "locomotion");
climb = false
# print("NO climb!!!")
elif fwd_probe < 1.2:
# print("trying climb!!!")
climb = true
else:
can_walk = false
if can_walk:
characters.set_walk_speed(root, 0.4, 0)
else:
characters.set_walk_speed(root, 0.0, 0)
# animtree["parameters/state/locomotion/loc/blend_position"].x = 0.5
# animtree["parameters/state/locomotion/loc/blend_position"].y = 0
var gt: Transform = root.global_transform
var mp: Transform = root.global_transform
var target: = Vector3()
if cmd[1] is Spatial:
target = cmd[1].global_transform.origin
else:
target = cmd[1]
target.y = root.global_transform.origin.y
var current_dir = root.global_transform.xform(Vector3(0, 0, -1))
var locnav_probe = characters.locnav_probe(root, 3.0, (target - mp.origin).normalized(), 0.15)
# var where_to = target.linear_interpolate(gt.origin + locnav_probe, 0.3)
# var where_to = mp.origin + current_dir * 0.8 + locnav_probe * 0.0 + (target - mp.origin).normalized() * 0.2
var where_to = mp.origin + (target - mp.origin).normalized()
if gt.origin != where_to:
gt = gt.looking_at(where_to, Vector3.UP)
gt.origin = Vector3()
# print("target: ", target)
var timeout = cmd[3]
timeout -= delta
orientation.basis = gt.basis
root.set_meta("orientation", orientation)
root.global_transform.basis = gt.basis
var d = root.global_transform.origin.distance_to(target)
if climb:
var cmd_new = ["walkto", cmd[1], cmd[2], timeout + delta]
cmds.push_front(cmd_new)
cmd_new = ["climb", "1"]
cmds.push_front(cmd_new)
elif timeout >= 0.0 && d > cmd[2]:
if can_walk:
var cmd_new = ["walkto", cmd[1], cmd[2], timeout]
cmds.push_front(cmd_new)
elif d > cmd[2]:
var dir = target - root.global_transform.origin
dir = dir.normalized() * (d - cmd[2])
root.global_transform.origin += dir
characters.set_walk_speed(root, 0.0, 0.0)
root.remove_meta("cmdq_walk")
else:
characters.set_walk_speed(root, 0.0, 0.0)
root.remove_meta("cmdq_walk")
"set_other":
var cmdq_other = []
if cmd[1].has_meta("cmdqueue"):
cmdq_other = cmd[1].get_meta("cmdqueue")
cmdq_other.push_back(cmd[2])
cmd[1].set_meta("cmdqueue", cmdq_other)
"wait_for_completion":
if !cmd[1].has_meta("complete_" + cmd[2]):
cmds.push_front([cmd[0], cmd[1], cmd[2]])
cmd[1].remove_meta("complete_" + cmd[2])
"complete":
root.set_meta("complete_" + cmd[1], true)
"set_transforms":
var master_xform: Transform = cmd[1].global_transform
var slave_xform = master_xform
slave_xform.basis = master_xform.basis.rotated(Vector3.UP, PI)
slave_xform.origin = master_xform.origin - master_xform.basis[2] * 0.375
var slave_orientation = slave_xform
slave_orientation.origin = Vector3()
cmd[2].set_meta("orientation", slave_orientation)
cmd[2].global_transform = slave_xform
"climb":
if !root.has_meta("last_climb"):
characters.animation_node_travel(root, "climb" + cmd[1])
root.set_meta("last_climb", "climb" + cmd[1])
elif root.get_meta("last_climb") == "climb" + cmd[1]:
characters.animation_node_travel(root, "climb" + cmd[1] + "a")
root.set_meta("last_climb", "climb" + cmd[1] + "a")
else:
characters.animation_node_travel(root, "climb" + cmd[1])
root.set_meta("last_climb", "climb" + cmd[1])
cmds.push_front(["climb_wait", cmd[1]])
root.set_meta("climb", true)
"climb_wait":
var cur = characters.get_animation_node(root)
if cur.begins_with("climb" + cmd[1]):
cmds.push_front(["climb_wait", cmd[1]])
else:
root.remove_meta("climb")
if cmds.size() > 0:
root.set_meta("cmdqueue", cmds)
else:
root.remove_meta("cmdqueue")
return ERR_BUSY
func update(tick, delta):
return ERR_BUSY