fix(projectile): Bug when projectile was already in next target hitbox
This commit is contained in:
parent
e83d1d9f9b
commit
eabe566aca
4 changed files with 28 additions and 14 deletions
|
|
@ -1,6 +1,6 @@
|
||||||
extends Sprite3D
|
extends Sprite3D
|
||||||
|
|
||||||
var impact : GPUParticles3D = preload("res://Towers/Projectiles/ImpactPierre.tscn").instantiate()
|
var impact : GPUParticles3D = preload("res://Projectiles/Draft/ImpactPierre.tscn").instantiate()
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
$SFXCreate.play()
|
$SFXCreate.play()
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,7 @@ var amount : float
|
||||||
var target : PhysicsBody3D
|
var target : PhysicsBody3D
|
||||||
var vectorTarget : Vector3
|
var vectorTarget : Vector3
|
||||||
var bodiesInRange : Array[Node3D]
|
var bodiesInRange : Array[Node3D]
|
||||||
|
var collidingBodies : Array[Node3D]
|
||||||
var affectedTarget : Array[Node3D]
|
var affectedTarget : Array[Node3D]
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -36,8 +37,10 @@ func _physics_process(_delta: float) -> void:
|
||||||
maxTargets = 0 # Ensure queue free in next if
|
maxTargets = 0 # Ensure queue free in next if
|
||||||
|
|
||||||
if shouldQueueFree():
|
if shouldQueueFree():
|
||||||
queue_free()
|
return queue_free()
|
||||||
return
|
|
||||||
|
if not collidingBodies.is_empty() && collidingBodies.has(target):
|
||||||
|
return onBodyCollideWithProjectile(target)
|
||||||
|
|
||||||
var globalPos : Vector3 = vectorTarget if vectorTarget else target.global_position
|
var globalPos : Vector3 = vectorTarget if vectorTarget else target.global_position
|
||||||
if target:
|
if target:
|
||||||
|
|
@ -67,6 +70,9 @@ func onBodyEnteredDamageArea(body: Node3D) -> void:
|
||||||
|
|
||||||
|
|
||||||
func onBodyCollideWithProjectile(body: Node3D) -> void:
|
func onBodyCollideWithProjectile(body: Node3D) -> void:
|
||||||
|
if not collidingBodies.has(body):
|
||||||
|
collidingBodies.push_back(body)
|
||||||
|
|
||||||
if mode != MODE.LOCATION && (body == target || type == TYPE.PIERCING) && targetable(body):
|
if mode != MODE.LOCATION && (body == target || type == TYPE.PIERCING) && targetable(body):
|
||||||
addBodyInRange(body, true)
|
addBodyInRange(body, true)
|
||||||
resolveContact()
|
resolveContact()
|
||||||
|
|
@ -75,12 +81,14 @@ func onBodyCollideWithProjectile(body: Node3D) -> void:
|
||||||
func addBodyInRange(body: Node3D, pushFront: bool = false) -> void:
|
func addBodyInRange(body: Node3D, pushFront: bool = false) -> void:
|
||||||
var idx : int = bodiesInRange.find(body)
|
var idx : int = bodiesInRange.find(body)
|
||||||
|
|
||||||
|
if idx == -1:
|
||||||
if pushFront:
|
if pushFront:
|
||||||
if idx != -1:
|
bodiesInRange.push_front(body)
|
||||||
|
else:
|
||||||
|
bodiesInRange.push_back(body)
|
||||||
|
elif pushFront && idx != 0:
|
||||||
bodiesInRange.remove_at(idx)
|
bodiesInRange.remove_at(idx)
|
||||||
bodiesInRange.push_front(body)
|
bodiesInRange.push_front(body)
|
||||||
elif idx == -1:
|
|
||||||
bodiesInRange.push_back(body)
|
|
||||||
|
|
||||||
|
|
||||||
func targetable(body: Node3D) -> bool:
|
func targetable(body: Node3D) -> bool:
|
||||||
|
|
@ -95,15 +103,16 @@ func resolveContact() -> void:
|
||||||
|
|
||||||
match type:
|
match type:
|
||||||
TYPE.AOE:
|
TYPE.AOE:
|
||||||
for _body in bodiesInRange:
|
for bodyInRange in bodiesInRange:
|
||||||
if is_instance_valid(_body):
|
if is_instance_valid(bodyInRange):
|
||||||
resolveEffect(_body)
|
resolveEffect(bodyInRange, false)
|
||||||
|
|
||||||
TYPE.BOUNCING:
|
TYPE.BOUNCING:
|
||||||
target = null if bodiesInRange.is_empty() else bodiesInRange[0]
|
target = null if bodiesInRange.is_empty() else bodiesInRange[0]
|
||||||
|
|
||||||
|
|
||||||
func resolveEffect(body : Node3D) -> void:
|
func resolveEffect(body : Node3D, erase : bool = true) -> void:
|
||||||
|
if erase:
|
||||||
bodiesInRange.erase(body)
|
bodiesInRange.erase(body)
|
||||||
if affectedTarget.has(body) || body is GameTile:
|
if affectedTarget.has(body) || body is GameTile:
|
||||||
return
|
return
|
||||||
|
|
@ -121,6 +130,10 @@ func removeTarget(body: Node3D) -> void:
|
||||||
bodiesInRange.erase(body)
|
bodiesInRange.erase(body)
|
||||||
|
|
||||||
|
|
||||||
|
func removeCollidingBody(body: Node3D) -> void:
|
||||||
|
collidingBodies.erase(body)
|
||||||
|
|
||||||
|
|
||||||
func shoot(_target: Node3D, globalPos: Vector3) -> void:
|
func shoot(_target: Node3D, globalPos: Vector3) -> void:
|
||||||
target = _target
|
target = _target
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,5 +16,5 @@ collision_mask = 2
|
||||||
[node name="DamageArea" parent="." index="3"]
|
[node name="DamageArea" parent="." index="3"]
|
||||||
collision_mask = 2
|
collision_mask = 2
|
||||||
|
|
||||||
[node name="Node" type="CollisionShape3D" parent="DamageArea" index="0"]
|
[node name="BoucingRange" type="CollisionShape3D" parent="DamageArea" index="0"]
|
||||||
shape = SubResource("SphereShape3D_k24mn")
|
shape = SubResource("SphereShape3D_k24mn")
|
||||||
|
|
|
||||||
|
|
@ -35,5 +35,6 @@ collision_layer = 0
|
||||||
collision_mask = 0
|
collision_mask = 0
|
||||||
|
|
||||||
[connection signal="body_entered" from="HitBox" to="." method="onBodyCollideWithProjectile" flags=3]
|
[connection signal="body_entered" from="HitBox" to="." method="onBodyCollideWithProjectile" flags=3]
|
||||||
|
[connection signal="body_exited" from="HitBox" to="." method="removeCollidingBody"]
|
||||||
[connection signal="body_entered" from="DamageArea" to="." method="onBodyEnteredDamageArea"]
|
[connection signal="body_entered" from="DamageArea" to="." method="onBodyEnteredDamageArea"]
|
||||||
[connection signal="body_exited" from="DamageArea" to="." method="removeTarget"]
|
[connection signal="body_exited" from="DamageArea" to="." method="removeTarget"]
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue