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

124 lines
3.7 KiB
GDScript

extends Node
var grab_queue = []
var ungrab_queue = []
func _ready():
pass # Replace with function body.
func grab_character(gch, ch):
if !ch.get_meta("grabbed"):
ch.set_meta("grabbed", true)
ch.set_meta("grabbed_time", 20.0)
if !ch in grab_queue:
grab_queue.push_back([gch, ch])
gch.set_meta("grabbing", true)
gch.do_grab()
func ungrab_character(gch, finisher = null):
if !grab_data.has(gch):
return
var ch = grab_data[gch].item
ch.set_meta("grabbed", false)
ch.set_meta("grabbed_time", 0.0)
if !ch in ungrab_queue:
if finisher:
ungrab_queue.push_back([gch, ch, finisher])
else:
ungrab_queue.push_back([gch, ch])
gch.set_meta("grabbing", false)
gch.do_ungrab()
var grab_data = {}
func get_grabbed(gch):
if grab_data.has(gch):
return grab_data[gch].item
else:
return null
func get_bone_xform(ch, b):
var skel = ch.get_skeleton()
var bone_id = skel.find_bone(b)
assert(bone_id >= 0)
var xform = skel.get_bone_global_pose(bone_id)
return ch.global_transform * xform
func left_arm_ik_enable(m: Spatial, _s: Spatial, target: Spatial):
# var item_skel = s.get_skeleton()
var main_skel = m.get_skeleton()
var ik: = SkeletonIK.new()
# var xf = get_bone_xform(m, "wrist_L")
var conv = target
ik.root_bone = "upperarm01_L"
ik.tip_bone = "wrist_L"
main_skel.add_child(ik)
var tpath = ik.get_path_to(conv)
ik.target_node = tpath
ik.min_distance = 0.01
ik.magnet = Vector3(-8, -10, 0)
ik.use_magnet = true
ik.start()
m.set_meta("left_arm_ik", m.get_path_to(ik))
func left_arm_ik_disable(m):
if m.has_meta("left_arm_ik"):
var ik = m.get_node(m.get_meta("left_arm_ik"))
# print("ik stopped")
ik.interpolation = 0.0
ik.use_magnet = false
ik.stop()
ik.queue_free()
func left_arm_front_neck_ik_enable(m, s):
var target = s.get_front_neck_target()
left_arm_ik_enable(m, s, target)
func left_arm_front_neck_ik_disable(m):
left_arm_ik_disable(m)
func _physics_process(_delta):
while grab_queue.size() > 0:
var characters = grab_queue.pop_front()
var item: KinematicBody = characters[1]
var gch = characters[0]
if grab_data.has(gch):
continue
grab_data[gch] = {}
item.do_stop()
item.do_grabbed()
gch.add_collision_exception_with(item)
item.add_collision_exception_with(gch)
# item.do_disable_collision()
item.global_transform = gch.global_transform
# var grab_xform = Transform()
# grab_xform.origin = gch.calc_offset(item, "neck02")
grab_data[gch].item = item
# grab_data[gch].grab_attachment = gch.add_attachment(gch.grab_bone, grab_xform)
grab_data[gch].grabbed_mask = item.collision_mask
grab_data[gch].grabbed_parent = item.get_parent()
item.collision_mask = 0
item.get_parent().remove_child(item)
# grab_data[gch].grab_attachment.add_child(item)
gch.add_child(item)
item.transform = Transform()
item.orientation.basis = Basis()
var ik_enable = true
if ik_enable:
left_arm_front_neck_ik_enable(gch, item)
while ungrab_queue.size() > 0:
var characters = ungrab_queue.pop_front()
var item: KinematicBody = characters[1]
var gch = characters[0]
var finisher = null
if characters.size() >= 3:
finisher = characters[2]
var tf = item.global_transform
# print("ik disable")
left_arm_front_neck_ik_disable(gch)
# grab_data[gch].grab_attachment.remove_child(item)
gch.remove_child(item)
grab_data[gch].grabbed_parent.add_child(item)
gch.remove_collision_exception_with(item)
item.remove_collision_exception_with(gch)
item.collision_mask = grab_data[gch].grabbed_mask
item.global_transform = tf
if !finisher:
item.do_stop()
item.do_ungrabbed()
else:
# print("finisher: ", finisher)
item.smart_obj(finisher)
item.set_meta("grabbed", false)
grab_data.erase(gch)
for k in grab_data.keys():
grab_data[k].item.transform = Transform()