114 lines
3.1 KiB
GDScript
114 lines
3.1 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
|
|
var initialized = false
|
|
var root
|
|
func init(tick):
|
|
assert(!initialized)
|
|
if initialized:
|
|
printerr("already initialized")
|
|
return
|
|
root = get_character(tick)
|
|
if !root:
|
|
printerr("no character?")
|
|
return
|
|
var cam = root.get_viewport().get_camera()
|
|
if !cam.has_meta("player"):
|
|
printerr("no player?")
|
|
return
|
|
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()
|
|
print("initialized ok")
|
|
initialized = true
|
|
func area_hit(area, e):
|
|
if area.is_in_group("weapon_hit"):
|
|
var mo = area.get_meta("owner")
|
|
if mo == root:
|
|
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)
|
|
assert(area.has_meta("item_name"))
|
|
combat.emit_signal("event", "damage", [mo, area.get_meta("item_name")])
|
|
yield(root.get_tree().create_timer(8), "timeout")
|
|
# TODO: add delay
|
|
bi.queue_free()
|
|
|
|
func update_physics(tick, delta):
|
|
assert(initialized)
|
|
root = get_character(tick)
|
|
if !root:
|
|
printerr("no character?")
|
|
assert(!initialized)
|
|
return FAILED
|
|
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"):
|
|
printerr("no player?")
|
|
assert(!initialized)
|
|
return FAILED
|
|
var player = cam.get_meta("player")
|
|
raycast_queue.clear()
|
|
# 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)
|
|
return ERR_BUSY
|
|
func stop(tick):
|
|
pass
|
|
# printerr("Why stopped?")
|
|
# assert(false)
|
|
|
|
func update(tick, delta):
|
|
return ERR_BUSY
|
|
|