75 lines
2.8 KiB
GDScript
75 lines
2.8 KiB
GDScript
extends Node
|
|
|
|
@onready var role_system: Node = get_node("../RoleSystem")
|
|
@onready var cooldown_system: Node = get_node("../CooldownSystem")
|
|
|
|
var _accum: float = 0.0
|
|
|
|
func _ready() -> void:
|
|
if multiplayer.multiplayer_peer != null and not multiplayer.is_server() and not (multiplayer.multiplayer_peer is OfflineMultiplayerPeer):
|
|
set_physics_process(false)
|
|
else:
|
|
set_physics_process(true)
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
if not multiplayer.is_server() and multiplayer.multiplayer_peer != null:
|
|
return
|
|
_accum += delta
|
|
if _accum < 0.10:
|
|
return
|
|
_accum = 0.0
|
|
for player in get_tree().get_nodes_in_group("player"):
|
|
if not Stats.has(player):
|
|
continue
|
|
if int(Stats.get_stat(player, "health", 0.0)) <= 0:
|
|
continue
|
|
if not cooldown_system.is_aa_ready(player):
|
|
continue
|
|
var role: int = int(Stats.get_stat(player, "role", GameState.ROLE_DAMAGE))
|
|
var set: AbilitySet = role_system.get_set(role)
|
|
if set == null:
|
|
continue
|
|
var target: Node = _pick_target(player, set)
|
|
if target == null:
|
|
continue
|
|
var dist: float = (player as Node3D).global_position.distance_to((target as Node3D).global_position)
|
|
if dist > set.aa_range:
|
|
continue
|
|
var dmg_mult: float = float(Stats.get_stat(player, "buff_damage", 1.0))
|
|
var heal_mult: float = float(Stats.get_stat(player, "buff_heal", 1.0))
|
|
if set.aa_is_heal:
|
|
EventBus.heal_requested.emit(player, target, set.aa_damage * heal_mult)
|
|
else:
|
|
EventBus.damage_requested.emit(player, target, set.aa_damage * dmg_mult, Element.NONE)
|
|
cooldown_system.set_aa(player, float(Stats.get_stat(player, "aa_cooldown", 0.5)))
|
|
|
|
func _pick_target(player: Node, set: AbilitySet) -> Node:
|
|
if set.aa_is_heal:
|
|
var lowest: Node = null
|
|
var lowest_pct: float = 2.0
|
|
for ally in get_tree().get_nodes_in_group("player"):
|
|
if not Stats.has(ally):
|
|
continue
|
|
var hp: float = float(Stats.get_stat(ally, "health", 0.0))
|
|
var max_hp: float = float(Stats.get_stat(ally, "max_health", 1.0))
|
|
if hp <= 0.0:
|
|
continue
|
|
var pct: float = hp / max_hp
|
|
if pct < lowest_pct and (player as Node3D).global_position.distance_to((ally as Node3D).global_position) <= set.aa_range:
|
|
lowest = ally
|
|
lowest_pct = pct
|
|
return lowest
|
|
var current_var: Variant = (player as Node).get("current_target")
|
|
if current_var != null and is_instance_valid(current_var) and current_var is Node and Stats.has(current_var):
|
|
return current_var
|
|
var nearest: Node = null
|
|
var nearest_dist: float = INF
|
|
for foe in Stats.entities_in_group(&"enemies"):
|
|
if not is_instance_valid(foe):
|
|
continue
|
|
var d: float = (foe as Node3D).global_position.distance_to((player as Node3D).global_position)
|
|
if d < nearest_dist and d <= set.aa_range:
|
|
nearest = foe
|
|
nearest_dist = d
|
|
return nearest
|