示例#1
0
    def update_surrounding(self, destroy=False):
        if destroy:
            grid = GRIDS[self.current_grid]

            for guid, player in list(grid.players.items()):
                if player.guid != self.guid:
                    self.session.request.sendall(player.get_destroy_packet())

        update_packet = UpdatePacketFactory.compress_if_needed(
            PacketWriter.get_packet(
                OpCode.SMSG_UPDATE_OBJECT,
                self.get_update_packet(update_type=UpdateTypes.UPDATE_FULL,
                                       is_self=False)))
        GridManager.send_surrounding(update_packet, self, include_self=False)
        GridManager.send_surrounding(NameQueryHandler.get_query_details(
            self.player),
                                     self,
                                     include_self=True)

        for guid, player in list(
                GridManager.get_surrounding_players(self).items()):
            if self.guid != guid:
                self.session.request.sendall(
                    PacketWriter.get_packet(
                        OpCode.SMSG_UPDATE_OBJECT,
                        player.get_update_packet(
                            update_type=UpdateTypes.UPDATE_FULL,
                            is_self=False)))
                self.session.request.sendall(
                    NameQueryHandler.get_query_details(player.player))
示例#2
0
    def reward_group_xp(self, player, creature, is_elite):
        surrounding = [m for m in self.members.values() if m in GridManager.get_surrounding_players(player).values()]
        surrounding.sort(key=lambda players: players.level, reverse=True)  # Highest level on top
        sum_levels = sum(player.level for player in surrounding)
        base_xp = Formulas.CreatureFormulas.xp_reward(creature.level, surrounding[0].level, is_elite)

        for member in surrounding:
            member.give_xp([base_xp * member.level / sum_levels], creature)
示例#3
0
    def teleport(self, map_, location):
        if not DbcDatabaseManager.map_get_by_id(map_):
            return False

        self.is_teleporting = True

        for guid, player in list(
                GridManager.get_surrounding_players(self).items()):
            if self.guid == guid:
                continue

            # Always make sure self is destroyed for others
            if not player.destroy_near_object(self.guid):
                player.session.request.sendall(self.get_destroy_packet())

        # Same map and not inside instance
        if self.map_ == map_ and self.map_ <= 1:
            data = pack(
                '<Q9fI',
                self.transport_id,
                self.transport.x,
                self.transport.y,
                self.transport.z,
                self.transport.o,
                location.x,
                location.y,
                location.z,
                location.o,
                0,  # ?
                0  # MovementFlags
            )
            self.session.request.sendall(
                PacketWriter.get_packet(OpCode.MSG_MOVE_TELEPORT_ACK, data))
        # Loading screen
        else:
            self.session.request.sendall(
                PacketWriter.get_packet(OpCode.SMSG_TRANSFER_PENDING))

            data = pack('<B4f', map_, location.x, location.y, location.z,
                        location.o)

            self.session.request.sendall(
                PacketWriter.get_packet(OpCode.SMSG_NEW_WORLD, data))

        self.map_ = map_
        self.location.x = location.x
        self.location.y = location.y
        self.location.z = location.z
        self.location.o = location.o

        return True
示例#4
0
    def reward_group_money(self, player, creature):
        surrounding = [m for m in self.members.values() if m in GridManager.get_surrounding_players(player).values()]
        share = int(creature.loot_manager.current_money / len(surrounding))
        # Append div remainder to the player who killed the creature for now.
        remainder = int(creature.loot_manager.current_money % len(surrounding))

        for member in surrounding:
            player_share = share if member != creature.killed_by else share + remainder
            # TODO: MSG_SPLIT_MONEY seems not to have any effect on the client.
            # data = pack('<Q2I', creature.guid, creature.loot_manager.current_money, ply_share)
            # split_packet = PacketWriter.get_packet(OpCode.MSG_SPLIT_MONEY, data)
            # member.session.request.sendall(split_packet)
            data = pack('<I', player_share)
            member.session.request.sendall(PacketWriter.get_packet(OpCode.SMSG_LOOT_MONEY_NOTIFY, data))
            member.mod_money(player_share)

        creature.loot_manager.clear_money()
        self.send_packet_to_members(PacketWriter.get_packet(OpCode.SMSG_LOOT_CLEAR_MONEY))
示例#5
0
 def get_surrounding_members(self, player):
     return [
         m for m in GridManager.get_surrounding_players(player).values()
         if m.guid in self.members
     ]