update
This commit is contained in:
@@ -23,8 +23,12 @@ func _update_combat_timers(delta: float) -> void:
|
||||
|
||||
func _decay_aggro(enemy: Node, delta: float) -> void:
|
||||
var table: Dictionary = tracker.aggro_tables[enemy]
|
||||
var base: BaseStats = Stats.get_base(enemy)
|
||||
var aggro_decay: float = base.aggro_decay if base is EnemyStats else 1.0
|
||||
var data_source: Node = tracker._get_data_source(enemy)
|
||||
var aggro_decay: float = 1.0
|
||||
if data_source:
|
||||
var base: EnemyStats = data_source.get_base(enemy)
|
||||
if base:
|
||||
aggro_decay = base.aggro_decay
|
||||
for player in table.keys():
|
||||
if is_in_combat(player):
|
||||
continue
|
||||
@@ -58,10 +62,11 @@ func spread_aggro(source: Node, attacker: Node, amount: float) -> void:
|
||||
func alert_nearby(enemy: Node, target: Node) -> void:
|
||||
var radius: float = tracker.get_alert_radius(enemy)
|
||||
for other in tracker.get_enemies_in_radius(enemy, radius):
|
||||
if "state" in other and other.state == other.State.IDLE:
|
||||
var data_source: Node = tracker._get_data_source(other)
|
||||
if data_source and data_source.get_stat(other, "state") == 0:
|
||||
tracker.add_aggro(other, target, 1.0)
|
||||
other.target = target
|
||||
other.state = other.State.CHASE
|
||||
data_source.set_stat(other, "target", target)
|
||||
data_source.set_stat(other, "state", 1)
|
||||
EventBus.enemy_engaged.emit(other, target)
|
||||
|
||||
func erase_entity(entity: Node) -> void:
|
||||
|
||||
@@ -14,14 +14,16 @@ func _ready() -> void:
|
||||
func _on_enemy_detected(enemy: Node, player: Node) -> void:
|
||||
if not enemy.is_in_group("enemies"):
|
||||
return
|
||||
if "state" in enemy:
|
||||
if enemy.state == enemy.State.CHASE or enemy.state == enemy.State.ATTACK:
|
||||
var data_source: Node = tracker._get_data_source(enemy)
|
||||
if data_source:
|
||||
var state: int = data_source.get_stat(enemy, "state")
|
||||
if state == 1 or state == 2:
|
||||
return
|
||||
tracker.add_player_in_range(enemy, player)
|
||||
tracker.add_aggro(enemy, player, 1.0)
|
||||
if "state" in enemy:
|
||||
enemy.target = player
|
||||
enemy.state = enemy.State.CHASE
|
||||
if data_source:
|
||||
data_source.set_stat(enemy, "target", player)
|
||||
data_source.set_stat(enemy, "state", 1)
|
||||
EventBus.enemy_engaged.emit(enemy, player)
|
||||
decay.alert_nearby(enemy, player)
|
||||
|
||||
@@ -33,8 +35,7 @@ func _on_damage_dealt(attacker: Node, target: Node, amount: float) -> void:
|
||||
return
|
||||
decay.reset_combat_timer(attacker)
|
||||
var multiplier := 1.0
|
||||
var role: Node = attacker.get_node_or_null("Role")
|
||||
if role and role.current_role == 0:
|
||||
if PlayerData.current_role == PlayerData.Role.TANK:
|
||||
multiplier = config.tank_multiplier
|
||||
var aggro: float = amount * multiplier
|
||||
tracker.add_aggro(target, attacker, aggro)
|
||||
|
||||
@@ -43,17 +43,19 @@ func get_top_target(table: Dictionary) -> Node:
|
||||
return top
|
||||
|
||||
func update_target(enemy: Node) -> void:
|
||||
if not "state" in enemy:
|
||||
return
|
||||
var table: Dictionary = aggro_tables[enemy]
|
||||
var top: Node = get_top_target(table)
|
||||
if top and top != enemy.target:
|
||||
enemy.target = top
|
||||
if enemy.state == enemy.State.IDLE or enemy.state == enemy.State.RETURN:
|
||||
enemy.state = enemy.State.CHASE
|
||||
elif not top and enemy.state != enemy.State.IDLE and enemy.state != enemy.State.RETURN:
|
||||
enemy.target = null
|
||||
enemy.state = enemy.State.RETURN
|
||||
var data_source: Node = _get_data_source(enemy)
|
||||
if not data_source:
|
||||
return
|
||||
var state: int = data_source.get_stat(enemy, "state")
|
||||
if top and top != data_source.get_stat(enemy, "target"):
|
||||
data_source.set_stat(enemy, "target", top)
|
||||
if state == 0 or state == 3:
|
||||
data_source.set_stat(enemy, "state", 1)
|
||||
elif not top and state != 0 and state != 3:
|
||||
data_source.set_stat(enemy, "target", null)
|
||||
data_source.set_stat(enemy, "state", 3)
|
||||
|
||||
func get_enemies_in_radius(source: Node, radius: float) -> Array:
|
||||
var result: Array = []
|
||||
@@ -65,8 +67,12 @@ func get_enemies_in_radius(source: Node, radius: float) -> Array:
|
||||
return result
|
||||
|
||||
func get_alert_radius(entity: Node) -> float:
|
||||
var base: BaseStats = Stats.get_base(entity)
|
||||
return base.alert_radius if base is EnemyStats else 10.0
|
||||
var data_source: Node = _get_data_source(entity)
|
||||
if data_source:
|
||||
var base: EnemyStats = data_source.get_base(entity)
|
||||
if base:
|
||||
return base.alert_radius
|
||||
return 10.0
|
||||
|
||||
func erase_entity(entity: Node) -> void:
|
||||
aggro_tables.erase(entity)
|
||||
@@ -74,9 +80,17 @@ func erase_entity(entity: Node) -> void:
|
||||
for enemy in aggro_tables:
|
||||
if is_instance_valid(enemy):
|
||||
aggro_tables[enemy].erase(entity)
|
||||
if "target" in enemy and entity == enemy.target:
|
||||
enemy.target = null
|
||||
enemy.state = enemy.State.RETURN
|
||||
var data_source: Node = _get_data_source(enemy)
|
||||
if data_source and data_source.get_stat(enemy, "target") == entity:
|
||||
data_source.set_stat(enemy, "target", null)
|
||||
data_source.set_stat(enemy, "state", 3)
|
||||
for enemy in players_in_range:
|
||||
if is_instance_valid(enemy):
|
||||
players_in_range[enemy].erase(entity)
|
||||
|
||||
func _get_data_source(entity: Node) -> Node:
|
||||
if entity.is_in_group("boss"):
|
||||
return BossData
|
||||
elif entity.is_in_group("enemies"):
|
||||
return EnemyData
|
||||
return null
|
||||
|
||||
Reference in New Issue
Block a user