237 lines
7.8 KiB
GDScript3
237 lines
7.8 KiB
GDScript3
extends Node
|
|
|
|
|
|
# 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 _ready():
|
|
process_priority = 0
|
|
|
|
func _physics_process(delta):
|
|
var root = get_parent()
|
|
var orientation: Transform
|
|
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
|
|
if characters.handle_cmdq(root):
|
|
return
|
|
var skel = root.get_meta("skeleton")
|
|
if !skel:
|
|
return
|
|
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 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
|
|
characters.set_walk_speed(root, 0.5, 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 target: = Vector3()
|
|
if cmd[1] is Spatial:
|
|
target = cmd[1].global_transform.origin
|
|
else:
|
|
target = cmd[1]
|
|
target.y = root.global_transform.origin.y
|
|
if gt.origin != target:
|
|
gt = gt.looking_at(target, 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]:
|
|
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)
|
|
# animtree["parameters/state/locomotion/loc/blend_position"].x = 0.0
|
|
root.remove_meta("cmdq_walk")
|
|
else:
|
|
characters.set_walk_speed(root, 0.0, 0.0)
|
|
# animtree["parameters/state/locomotion/loc/blend_position"].x = 0.0
|
|
root.remove_meta("cmdq_walk")
|
|
# print(d, " ", timeout, " ", gt)
|
|
"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")
|