Files
academy2-game/scripts/modules/character_hurtboxes.gd
Segey Lapin f62e7fa720 Update
2021-12-24 23:56:10 +03:00

85 lines
2.6 KiB
GDScript

extends AIScriptModule
var raycast_queue = []
var blood = preload("res://scenes/decals/blood.tscn")
var blood_decal = preload("res://scenes/decals/blood1-decal.gltf")
var rnd
func init():
var root = get_character()
var queue = [root]
var hurtboxes = []
assert(root.has_meta("skeleton"))
while queue.size() > 0:
var item = queue.pop_front()
if item is Area && item.name.ends_with("_hurt"):
hurtboxes.push_back(item)
for e in item.get_children():
queue.push_back(e)
root.set_meta("hurtboxes", hurtboxes)
for e in hurtboxes:
e.connect("area_entered", self, "area_hit", [e])
rnd = RandomNumberGenerator.new()
rnd.randomize()
func area_hit(area, e):
var root = get_character()
if area.is_in_group("weapon_hit"):
var mo = area.get_meta("owner")
if mo == root:
# var cam = get_character().get_viewport().get_camera()
# var pl = cam.get_meta("player")
# print(mo.name, " ", root.name, " ", e.name)
# print(mo, " ", root, " ", " ", pl)
return
print("HIT")
var bi = blood.instance()
var d = area.global_transform.origin.linear_interpolate(e.global_transform.origin, 0.5)
e.add_child(bi)
bi.global_transform.origin = d
bi.emitting = true
var dcount = 2 + rnd.randi() % 5
var org = d
raycast_queue.push_back(d)
print(dcount)
for rd in range(dcount):
var offt = Vector3()
while offt.length() < 0.05:
offt += Vector3(rnd.randf() * 0.3, 0, rnd.randf() * 0.3)
var xoff = offt.normalized() * 0.04
xoff.y = 0
offt.y = 0
org += xoff + offt
raycast_queue.push_back(org)
yield(root.get_tree().create_timer(8), "timeout")
# TODO: add delay
bi.queue_free()
func update_physics(delta):
var root = get_character()
var space_state: PhysicsDirectSpaceState = root.get_world().direct_space_state
var offsets = [Vector3(0, -2, 0)]
var cam = root.get_viewport().get_camera()
if !cam.has_meta("player"):
return
var player = cam.get_meta("player")
while raycast_queue.size() > 0:
var item = raycast_queue.pop_front()
var a = item
for boff in offsets:
var b = a + boff
var result = {}
if root is PhysicsBody:
result = space_state.intersect_ray(a, b, [root, player])
else:
result = space_state.intersect_ray(a, b)
if result.has("collider"):
var body = result.collider
var normal = result.normal
var position = result.position
var decal = blood_decal.instance()
decal.add_to_group("blood")
body.add_child(decal)
decal.global_transform.origin = position
var scale = 0.5 + rnd.randf() * 2.0
var rot = PI * 2.0 * rnd.randf()
decal.global_transform.basis = Basis(normal).scaled(Vector3(scale, 1.0, scale)).rotated(normal, rot)