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))
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)
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
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))
def get_surrounding_members(self, player): return [ m for m in GridManager.get_surrounding_players(player).values() if m.guid in self.members ]