def resolve_party_around_caster(casting_spell, target_effect): result = MapManager.get_surrounding_units(casting_spell.spell_caster, True) units = list(result[0].values()) + list(result[1].values()) caster = casting_spell.spell_caster units_in_range = [ caster ] # These spells should most likely include self (battle shout, prayer of healing etc.) if caster.get_type( ) != ObjectTypes.TYPE_PLAYER or not caster.group_manager: return units_in_range # TODO pets etc. should probably be targeted for unit in units: if caster is unit or not caster.group_manager.is_party_member(unit.guid) or \ caster.can_attack_target(unit): # Dueling party members continue distance = caster.location.distance(unit.location) if distance <= target_effect.get_radius(): units_in_range.append(unit) return units_in_range
def select_attacking_target( self, attacking_target: AttackingTarget) -> Optional[UnitManager]: if attacking_target == AttackingTarget.ATTACKING_TARGET_TOPAGGRO: return self.get_hostile_target() else: relevant_holders = self._get_sorted_threat_collection() if relevant_holders and len(relevant_holders) > 0: if attacking_target == AttackingTarget.ATTACKING_TARGET_BOTTOMAGGRO: return relevant_holders[0].unit elif attacking_target == AttackingTarget.ATTACKING_TARGET_RANDOM: return random.choice(relevant_holders).unit elif attacking_target == AttackingTarget.ATTACKING_TARGET_RANDOMNOTTOP: return random.choice(relevant_holders[:-2]).unit if len( relevant_holders) > 1 else None # Farthest or Nearest targets. else: surrounding_units = MapManager.get_surrounding_units( self.owner, include_players=True) units_in_range = list( surrounding_units[0].values()) + list( surrounding_units[1].values()) units_in_aggro_list = [ h.unit for h in relevant_holders if h.unit in units_in_range ] if len(units_in_aggro_list) > 0: # Sort found units by distance. units_in_aggro_list.sort( key=lambda player: player.location.distance( self.owner.location)) if attacking_target == AttackingTarget.ATTACKING_TARGET_NEAREST: return units_in_aggro_list[0] elif attacking_target == AttackingTarget.ATTACKING_TARGET_FARTHEST: return units_in_aggro_list[-1] # No suitable target found. return None
def update_surrounding_quest_status(self): for guid, unit in list(MapManager.get_surrounding_units(self.player_mgr).items()): if WorldDatabaseManager.QuestRelationHolder.creature_involved_quest_get_by_entry( unit.entry) or WorldDatabaseManager.QuestRelationHolder.creature_quest_get_by_entry(unit.entry): quest_status = self.get_dialog_status(unit) self.send_quest_giver_status(guid, quest_status)