def update(self, elapsed): if not self.is_ready(): self.remaining_cooldown = max(0, self.remaining_cooldown - elapsed) return # If the trap should be triggered by creatures, search for them along with players. if self.spell_id in TrapManager.TRIGGERED_BY_CREATURES: surrounding_creatures, surrounding_players = MapManager.get_surrounding_units_by_location( self.trap_object.location, self.trap_object.map_, self.radius, include_players=True) surrounding_units = surrounding_creatures | surrounding_players else: # This trap can only be triggered by players. surrounding_units = MapManager.get_surrounding_players_by_location( self.trap_object.location, self.trap_object.map_, self.radius) for unit in surrounding_units.values(): # Keep looping until we find a valid unit. if not self.trap_object.can_attack_target(unit): continue # Valid target found, trigger the trap. In case charges = 1, despawn the trap. if self.trigger(unit) and self.charges == 1: self.trap_object.set_active() self.trap_object.despawn() break
def resolve_all_friendly_in_area(casting_spell, target_effect): target = casting_spell.initial_target if not casting_spell.initial_target_is_terrain(): return [] map_ = casting_spell.spell_caster.map_ result = MapManager.get_surrounding_units_by_location( target, map_, target_effect.get_radius(), True) merged = list(result[0].values()) + list(result[1].values()) return EffectTargets.get_friends_from_unit_list( merged, casting_spell.spell_caster)
def resolve_all_enemy_in_area_instant(casting_spell, target_effect): caster = casting_spell.spell_caster map_ = casting_spell.spell_caster.map_ radius = target_effect.get_radius() if casting_spell.initial_target_is_terrain(): effect_source = casting_spell.initial_target result = MapManager.get_surrounding_units_by_location( effect_source, map_, radius, True) # Ground-targeted AoE. merged = list(result[0].values()) + list(result[1].values()) else: # TODO len(target_effect.targets.resolved_targets_a) == 1 incorrectly resolves to a single target of an AoE spell. effect_source = target_effect.targets.resolved_targets_a[0] if len( target_effect.targets.resolved_targets_a) == 1 else caster target_effect.targets.effect_source = effect_source result = MapManager.get_surrounding_units( effect_source, include_players=True) # Unit-targeted AoE - explosive shot. merged = list(result[0].values()) + list(result[1].values()) merged = [ target for target in merged if target.location.distance(effect_source.location) <= radius ] # Select targets in range. enemies = EffectTargets.get_enemies_from_unit_list( merged, casting_spell.spell_caster) if isinstance(effect_source, ObjectManager) and effect_source in enemies: enemies.remove( effect_source ) # Effect source shouldn't be included in final targets. for enemy in enemies: # Write to impact timestamps to indicate that this target should be instant. # See SpellManager.calculate_impact_delays casting_spell.spell_impact_timestamps[enemy.guid] = -1 if len(enemies) == 0 and len( target_effect.targets.resolved_targets_a) > 0: target_effect.targets.resolved_targets_a = [ ] # As this target specifies on A in some cases, clear out A if no targets exist. return enemies