예제 #1
0
    def send_packet_to_members(self,
                               packet,
                               ignore=None,
                               source=None,
                               use_ignore=False,
                               exclude=None,
                               surrounding_only=False):
        if surrounding_only and source:
            surrounding_players = MapManager.get_surrounding_players(
                source).values()
            members = [
                self.members[player.guid] for player in surrounding_players
                if player.guid in self.members
            ]
        else:
            members = self.members.values()

        for member in members:
            if exclude and member.guid == exclude.guid:
                continue

            player_mgr = WorldSessionStateHandler.find_player_by_guid(
                member.guid)
            if not player_mgr or not player_mgr.online:
                continue
            if ignore and player_mgr.guid in ignore:
                continue
            if use_ignore and source and player_mgr.friends_manager.has_ignore(
                    source.guid):
                continue

            player_mgr.enqueue_packet(packet)
예제 #2
0
    def reward_group_xp(self, player, creature, is_elite):
        surrounding_players = MapManager.get_surrounding_players(player).values()
        surrounding_members = [player for player in surrounding_players if player.guid in self.members]
        surrounding_members.sort(key=lambda players: players.level, reverse=True)  # Highest level on top
        sum_levels = sum(player.level for player in surrounding_members)
        base_xp = Formulas.CreatureFormulas.xp_reward(creature.level, surrounding_members[0].level, is_elite)

        for member in surrounding_members:
            member.give_xp([base_xp * member.level / sum_levels], creature)
예제 #3
0
    def reward_group_creature_or_go(self, player, creature):
        surrounding_players = MapManager.get_surrounding_players(player).values()
        surrounding_members = [player for player in surrounding_players if player.guid in self.members]

        # Party kill log packet, not sure how to display on client but, it is handled.
        data = pack('<2Q', player.guid, creature.guid)  # Player with killing blow and victim guid.
        kill_log_packet = PacketWriter.get_packet(OpCode.SMSG_PARTYKILLLOG, data)

        for member in surrounding_members:
            member.enqueue_packet(kill_log_packet)
            member.quest_manager.reward_creature_or_go(creature)
예제 #4
0
    def reward_group_creature_or_go(self, player, creature):
        surrounding_players = MapManager.get_surrounding_players(
            player).values()
        surrounding_members = [
            player for player in surrounding_players
            if player.guid in self.members
        ]

        for member in surrounding_members:
            member.quest_manager.reward_creature_or_go(creature)
            member.send_update_self()
예제 #5
0
 def get_surrounding_members(self, player):
     return [
         m for m in MapManager.get_surrounding_players(player).values()
         if m.guid in self.members
     ]