Example #1
0
    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
Example #2
0
 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
Example #3
0
 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)