Beispiel #1
0
    def add_ignore(self, player_guid):
        if player_guid not in self.friends:
            self.friends[player_guid] = self._create_friend(player_guid, ignored=True)
            RealmDatabaseManager.character_add_friend(self.friends[player_guid])
        else:
            self.friends[player_guid].ignore = True
            RealmDatabaseManager.character_update_social([self.friends[player_guid]])

        data = pack('<BQ', FriendResults.FRIEND_IGNORE_ADDED, player_guid)
        packet = PacketWriter.get_packet(OpCode.SMSG_FRIEND_STATUS, data)
        self.owner.session.enqueue_packet(packet)
        self.send_ignores()
Beispiel #2
0
    def load_items(self):
        character_inventory = RealmDatabaseManager.character_get_inventory(
            self.owner.guid)

        # First load bags
        for item_instance in character_inventory:
            item_template = WorldDatabaseManager.ItemTemplateHolder.item_template_get_by_entry(
                item_instance.item_template)
            if item_template and item_template.inventory_type == InventoryTypes.BAG:
                container_mgr = ContainerManager(owner=self.owner.guid,
                                                 item_template=item_template,
                                                 item_instance=item_instance)
                if self.is_bag_pos(container_mgr.current_slot):
                    if item_instance.bag > 23:
                        low_guid = container_mgr.guid & ~HighGuid.HIGHGUID_CONTAINER
                        Logger.warning(
                            f'Invalid bag slot {item_instance.bag} for guid {low_guid} owner {self.owner.guid}'
                        )
                        continue
                    self.containers[item_instance.bag].sorted_slots[
                        container_mgr.current_slot] = container_mgr
                    self.containers[container_mgr.current_slot] = container_mgr

        # Then load items
        for item_instance in character_inventory:
            item_template = WorldDatabaseManager.ItemTemplateHolder.item_template_get_by_entry(
                item_instance.item_template)
            if item_template:
                if item_template.display_id > MAX_3368_ITEM_DISPLAY_ID and \
                        self.is_equipment_pos(item_instance.bag, item_instance.slot):
                    Logger.error(
                        f'Character {self.owner.player.name} has an equipped item ({item_template.entry} - {item_template.name}) '
                        f'with out of bounds display_id ({item_template.display_id}), '
                        f'deleting in order to prevent crashes.')
                    RealmDatabaseManager.character_inventory_delete(
                        item_instance)
                    continue

                if item_template.inventory_type == InventoryTypes.BAG:
                    if self.is_bag_pos(item_instance.slot):
                        continue

                    item_mgr = ContainerManager(owner=self.owner.guid,
                                                item_template=item_template,
                                                item_instance=item_instance)
                else:
                    item_mgr = ItemManager(item_template=item_template,
                                           item_instance=item_instance)

                if item_instance.bag in self.containers and self.containers[
                        item_instance.bag]:
                    self.containers[item_instance.bag].sorted_slots[
                        item_mgr.current_slot] = item_mgr
Beispiel #3
0
    def add_new_offline_member(self, character):
        rank = GuildRank.GUILDRANK_INITIATE
        guild_member = self._create_new_member(character.guid, rank)
        self.members[character.guid] = guild_member

        data = pack('<2B', GuildEvents.GUILD_EVENT_JOINED, 1)
        name_bytes = PacketWriter.string_to_bytes(character.name)
        data += pack(f'<{len(name_bytes)}s', name_bytes)

        packet = PacketWriter.get_packet(OpCode.SMSG_GUILD_EVENT, data)
        self.send_message_to_guild(packet, GuildChatMessageTypes.G_MSGTYPE_ALL)
        RealmDatabaseManager.character_update(character)
    def load_items(self):
        # Add backpack
        self.containers[InventorySlots.SLOT_INBACKPACK] = ContainerManager(
            is_backpack=True, owner=self.owner.guid)

        character_inventory = RealmDatabaseManager.character_get_inventory(
            self.owner.guid)

        # First load bags
        for item_instance in character_inventory:
            item_template = WorldDatabaseManager.item_template_get_by_entry(
                item_instance.item_template)
            if item_template and item_template.inventory_type == InventoryTypes.BAG:
                container_mgr = ContainerManager(owner=self.owner.guid,
                                                 item_template=item_template,
                                                 item_instance=item_instance)
                if self.is_bag_pos(container_mgr.current_slot):
                    self.containers[item_instance.bag].sorted_slots[
                        container_mgr.current_slot] = container_mgr
                    self.containers[container_mgr.current_slot] = container_mgr

        # Then load items
        for item_instance in character_inventory:
            item_template = WorldDatabaseManager.item_template_get_by_entry(
                item_instance.item_template)
            if item_template:
                if item_template.display_id > MAX_3368_ITEM_DISPLAY_ID and \
                        self.is_equipment_pos(item_instance.bag, item_instance.slot):
                    Logger.error(
                        'Character %s has an equipped item (%u - %s) with out of bounds display_id (%u), '
                        'deleting in order to prevent crashes.' %
                        (self.owner.player.name, item_template.entry,
                         item_template.name, item_template.display_id))
                    RealmDatabaseManager.character_inventory_delete(
                        item_instance)
                    continue

                if item_template.inventory_type == InventoryTypes.BAG:
                    if self.is_bag_pos(item_instance.slot):
                        continue

                    item_mgr = ContainerManager(owner=self.owner.guid,
                                                item_template=item_template,
                                                item_instance=item_instance)
                else:
                    item_mgr = ItemManager(item_template=item_template,
                                           item_instance=item_instance)
                if item_instance.bag in self.containers:
                    self.containers[item_instance.bag].sorted_slots[
                        item_mgr.current_slot] = item_mgr

        self.set_base_attack_time()
Beispiel #5
0
 def _create_guild(motd, name, bg_color, b_color, b_style, e_color, e_style, leader_guid):
     guild = Guild()
     guild.motd = motd
     guild.name = name
     guild.background_color = bg_color
     guild.border_color = b_color
     guild.border_style = b_style
     guild.emblem_color = e_color
     guild.emblem_style = e_style
     guild.leader_guid = leader_guid
     guild.creation_date = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
     RealmDatabaseManager.guild_create(guild)
     return guild
Beispiel #6
0
    def add_friend(self, player_guid):
        if player_guid not in self.friends:
            self.friends[player_guid] = self._create_friend(player_guid)
            player_mgr = WorldSessionStateHandler.find_player_by_guid(player_guid)
            RealmDatabaseManager.character_add_friend(self.friends[player_guid])
            status = FriendResults.FRIEND_ADDED_ONLINE if player_mgr else FriendResults.FRIEND_ADDED_OFFLINE
            data = pack('<BQ', status, player_guid)

            if player_mgr and player_mgr.online:  # Player is online.
                data += pack('<B3I', 1, player_mgr.zone, player_mgr.level, player_mgr.player.class_)

            self.owner.session.enqueue_packet(PacketWriter.get_packet(OpCode.SMSG_FRIEND_STATUS, data))
            self.send_friends()
Beispiel #7
0
    def set_leader(self, player_guid):
        # First, demote previous leader.
        GroupManager._remove_leader_flag(self.members[self.group.leader_guid])
        # Second, promote new leader.
        GroupManager._set_leader_flag(self.members[player_guid])
        self.group.leader_guid = player_guid
        RealmDatabaseManager.group_update(self.group)

        leader_name_bytes = PacketWriter.string_to_bytes(self.members[player_guid].character.name)
        data = pack(f'<{len(leader_name_bytes)}s', leader_name_bytes)
        packet = PacketWriter.get_packet(OpCode.SMSG_GROUP_SET_LEADER, data)
        self.send_packet_to_members(packet)
        self.send_update()
Beispiel #8
0
    def handle(world_session, socket, reader):
        if len(reader.data) >= 17:  # Avoid handling empty sell item packet.
            vendor_guid, item_guid, sell_amount = unpack('<QQB', reader.data[:17])
            container_slot, container, slot, item = world_session.player_mgr.inventory.get_item_info_by_guid(item_guid)

            if vendor_guid > 0:
                if not item:
                    world_session.player_mgr.inventory.send_sell_error(SellResults.SELL_ERR_CANT_FIND_ITEM,
                                                                       item_guid, vendor_guid)
                    return 0

                owner = world_session.player_mgr.guid
                if owner != item.item_instance.owner:
                    world_session.player_mgr.inventory.send_sell_error(SellResults.SELL_ERR_YOU_DONT_OWN_THAT_ITEM,
                                                                       item_guid, vendor_guid)
                    return 0

                stack_count = item.item_instance.stackcount

                # Client seems to send zero at least when simply right clicking, default to selling whole stack.
                if sell_amount <= 0:
                    sell_amount = stack_count

                if sell_amount > stack_count:
                    world_session.player_mgr.inventory.send_sell_error(SellResults.SELL_ERR_CANT_FIND_ITEM,
                                                                       item_guid, vendor_guid)
                    return 0

                price = item.item_template.sell_price
                if price == 0:  # Item is unsellable
                    world_session.player_mgr.inventory.send_sell_error(SellResults.SELL_ERR_CANT_SELL_ITEM,
                                                                       item_guid, vendor_guid)
                    return 0

                # Check if player is attempting to sell a bag with something in it
                if world_session.player_mgr.inventory.is_bag_pos(slot) and not item.is_empty():
                    world_session.player_mgr.inventory.send_sell_error(SellResults.SELL_ERR_ONLY_EMPTY_BAG,
                                                                       item_guid, vendor_guid)
                    return 0

                if sell_amount < stack_count:
                    item.item_instance.stackcount -= sell_amount
                    RealmDatabaseManager.character_inventory_update_item(item.item_instance)
                else:
                    world_session.player_mgr.inventory.mark_as_removed(item)
                    world_session.enqueue_packet(item.get_destroy_packet())
                    world_session.player_mgr.inventory.containers[container_slot].remove_item_in_slot(slot)
                    RealmDatabaseManager.character_inventory_delete(item.item_instance)

                world_session.player_mgr.mod_money(price * sell_amount, reload_items=True)
        return 0
    def modify_reputation(self, faction, amount):
        if faction.index not in self.reputations:
            return

        self.reputations[faction.index].standing += amount
        RealmDatabaseManager.character_update_reputation(
            self.reputations[faction.index])

        # Notify the client
        data = pack('<3i', 0x1, faction.index,
                    self.reputations[faction.index].standing)
        packet = PacketWriter.get_packet(OpCode.SMSG_SET_FACTION_STANDING,
                                         data)
        self.player_mgr.session.enqueue_packet(packet)
Beispiel #10
0
    def generate_item(item_template, owner, bag, slot, creator=0, count=1):
        if item_template and item_template.entry > 0:
            item = CharacterInventory(owner=owner,
                                      creator=creator,
                                      item_template=item_template.entry,
                                      stackcount=count,
                                      slot=slot,
                                      bag=bag)
            RealmDatabaseManager.character_inventory_add_item(item)

            item_mgr = ItemManager(item_template=item_template,
                                   item_instance=item)
            return item_mgr
        return None
Beispiel #11
0
    def load_guild_members(self):
        members = RealmDatabaseManager.guild_get_members(self.guild)

        for member in members:
            self.members[member.guid] = member
            if member.rank == 0:
                self.guild_master = member

        # Destroy guilds that for some reason have 0 members.
        if not self.has_members(ignore_gm=False):
            RealmDatabaseManager.guild_destroy(self.guild)
            return False

        return True
Beispiel #12
0
    def try_add_member(self, player_mgr, invite):
        # Check if we have space.
        if self.is_full():
            GroupManager.send_group_operation_result(
                player_mgr, PartyOperations.PARTY_OP_INVITE, '',
                PartyResults.ERR_GROUP_FULL)
            return False

        if invite:
            self.invites[player_mgr.guid] = player_mgr
            player_mgr.group_manager = self
            player_mgr.has_pending_group_invite = True
            return True
        else:
            if len(self.members
                   ) == 0:  # Party just formed, store the group and params.
                leader_player = WorldSessionStateHandler.find_player_by_guid(
                    self.group.leader_guid)
                if leader_player:  # If online, we set leader group status.
                    RealmDatabaseManager.group_create(self.group)
                    GroupManager.GROUPS[self.group.group_id] = self
                    leader = GroupManager._create_new_member(
                        self.group, leader_player)
                    RealmDatabaseManager.group_add_member(leader)
                    self.members[self.group.leader_guid] = leader
                    leader_player.group_status = WhoPartyStatus.WHO_PARTY_STATUS_IN_PARTY
                    GroupManager._set_leader_flag(leader)
                else:  # Leader went offline after sending the invite.
                    return False

            new_member = GroupManager._create_new_member(
                self.group, player_mgr)
            new_member = RealmDatabaseManager.group_add_member(new_member)
            self.members[player_mgr.guid] = new_member

            # Update newly added member group_manager ref, party status and pending invite flag.
            player_mgr.group_manager = self
            player_mgr.group_status = WhoPartyStatus.WHO_PARTY_STATUS_IN_PARTY
            player_mgr.has_pending_group_invite = False

            query_details_packet = NameQueryHandler.get_query_details(
                player_mgr.player)
            self.send_packet_to_members(query_details_packet)

            if len(self.members) > 1:
                self.send_update()
                self.send_party_members_stats()

            return True
Beispiel #13
0
    def handle_add_quest(self, quest_id, quest_giver_guid):
        active_quest = ActiveQuest(self.create_db_quest_status(quest_id))
        self.active_quests[quest_id] = active_quest
        self.send_quest_query_response(active_quest)

        if self.can_complete_quest(active_quest):
            self.complete_quest(active_quest)

        self.update_surrounding_quest_status()

        self.build_update()
        self.player_mgr.send_update_self()

        RealmDatabaseManager.character_add_quest_status(
            active_quest.quest_db_status)
Beispiel #14
0
    def load_guild_members(self):
        members = RealmDatabaseManager.guild_get_members(self.guild)

        for member in members:
            self.members[member.guid] = member
            if member.rank == 0:
                self.guild_master = member
    def handle(world_session, socket, reader):
        if len(reader.data
               ) >= 8:  # Avoid handling empty group uninvite guid packet
            guid = unpack('<Q', reader.data[:8])[0]
            target_player_mgr = RealmDatabaseManager.character_get_by_guid(
                guid)

            if not world_session.player_mgr.group_manager:
                GroupManager.send_group_operation_result(
                    world_session.player_mgr, PartyOperations.PARTY_OP_LEAVE,
                    '', PartyResults.ERR_NOT_IN_GROUP)
            elif not target_player_mgr:
                GroupManager.send_group_operation_result(
                    world_session.player_mgr, PartyOperations.PARTY_OP_LEAVE,
                    'Player', PartyResults.ERR_BAD_PLAYER_NAME_S)
            elif not world_session.player_mgr.group_manager.is_party_member(
                    target_player_mgr.guid):
                GroupManager.send_group_operation_result(
                    world_session.player_mgr, PartyOperations.PARTY_OP_LEAVE,
                    target_player_mgr.name,
                    PartyResults.ERR_TARGET_NOT_IN_YOUR_GROUP_S)
            else:
                world_session.player_mgr.group_manager.un_invite_player(
                    world_session.player_mgr.guid, target_player_mgr.guid)

        return 0
Beispiel #16
0
    def add_new_member(self, player_mgr, is_guild_master=False):
        rank = GuildRank.GUILDRANK_GUILD_MASTER if is_guild_master else GuildRank.GUILDRANK_INITIATE
        guild_member = self._create_new_member(player_mgr.guid, rank)

        player_mgr.guild_manager = self
        self.members[player_mgr.guid] = guild_member

        data = pack('<2B', GuildEvents.GUILD_EVENT_JOINED, 1)
        name_bytes = PacketWriter.string_to_bytes(player_mgr.player.name)
        data += pack(f'<{len(name_bytes)}s', name_bytes)

        self.build_update(player_mgr)

        packet = PacketWriter.get_packet(OpCode.SMSG_GUILD_EVENT, data)
        self.send_message_to_guild(packet, GuildChatMessageTypes.G_MSGTYPE_ALL)
        RealmDatabaseManager.character_update(player_mgr.player)
Beispiel #17
0
    def handle(world_session, socket, reader):
        target_name = PacketReader.read_string(reader.data, 0).strip()
        online_player = WorldSessionStateHandler.find_player_by_name(
            target_name)
        offline_player = None
        friend_result_error = None

        # Try to pull the character from DB.
        if not online_player:
            offline_player = RealmDatabaseManager.character_get_by_name(
                target_name)

        target_guid = online_player.guid if online_player else offline_player.guid if offline_player else None
        target_team = online_player.team if online_player else PlayerManager.get_team_for_race(
            offline_player.race) if offline_player else None

        if not online_player and not offline_player:
            friend_result_error = FriendResults.FRIEND_NOT_FOUND
        elif world_session.player_mgr.team != target_team:
            friend_result_error = FriendResults.FRIEND_ENEMY
        elif world_session.player_mgr.guid == target_guid:
            friend_result_error = FriendResults.FRIEND_SELF
        elif world_session.player_mgr.friends_manager.has_friend(target_guid):
            friend_result_error = FriendResults.FRIEND_ALREADY

        if not friend_result_error:
            world_session.player_mgr.friends_manager.add_friend(target_guid)
        else:
            data = pack('<B', friend_result_error)
            world_session.enqueue_packet(
                PacketWriter.get_packet(OpCode.SMSG_FRIEND_STATUS, data))

        return 0
    def handle(world_session, socket, reader):
        player = world_session.player_mgr

        if not player.guild_manager:
            GuildManager.send_guild_command_result(
                player, GuildTypeCommand.GUILD_CREATE_S, '',
                GuildCommandResults.GUILD_PLAYER_NOT_IN_GUILD)
        else:
            guild_name = PacketWriter.string_to_bytes(
                player.guild_manager.guild.name)
            data = pack(f'<{len(guild_name)}s', guild_name)

            # Members count
            data += pack('<I', len(player.guild_manager.members))
            accounts = RealmDatabaseManager.guild_get_accounts(
                guild_id=player.guild_manager.guild.guild_id)
            data += pack('<I', len(accounts))

            for member in player.guild_manager.members.values():
                player_name = PacketWriter.string_to_bytes(
                    member.character.name)
                data += pack(f'<{len(player_name)}sI', player_name,
                             member.rank)

            player.enqueue_packet(
                PacketWriter.get_packet(OpCode.SMSG_GUILD_ROSTER, data))

        return 0
Beispiel #19
0
    def leave(self, player_guid):
        member = self.members[player_guid]

        data = pack('<2B', GuildEvents.GUILD_EVENT_LEFT, 1)
        leaver_name_bytes = PacketWriter.string_to_bytes(member.character.name)
        data += pack(f'<{len(leaver_name_bytes)}s', leaver_name_bytes)

        packet = PacketWriter.get_packet(OpCode.SMSG_GUILD_EVENT, data)
        self.send_message_to_guild(packet, GuildChatMessageTypes.G_MSGTYPE_ALL)

        RealmDatabaseManager.guild_remove_member(member)
        self.members.pop(player_guid)
        player_mgr = WorldSessionStateHandler.find_player_by_guid(player_guid)
        if player_mgr:
            self.build_update(player_mgr, unset=True)
            player_mgr.guild_manager = None
Beispiel #20
0
    def handle(world_session, socket, reader):
        if len(reader.data) > 1:  # Avoid handling empty Guild Demote packet.
            target_name = PacketReader.read_string(reader.data, 0).strip()
            target_player_mgr = RealmDatabaseManager.character_get_by_name(
                target_name)
            player_mgr = world_session.player_mgr

            if not player_mgr.guild_manager:
                GuildManager.send_guild_command_result(
                    player_mgr, GuildTypeCommand.GUILD_INVITE_S, '',
                    GuildCommandResults.GUILD_PLAYER_NOT_IN_GUILD)
            elif player_mgr.guild_manager.get_rank(
                    player_mgr.guid) > GuildRank.GUILDRANK_OFFICER:
                GuildManager.send_guild_command_result(
                    player_mgr, GuildTypeCommand.GUILD_INVITE_S, '',
                    GuildCommandResults.GUILD_PERMISSIONS)
            elif not target_player_mgr:
                GuildManager.send_guild_command_result(
                    player_mgr, GuildTypeCommand.GUILD_INVITE_S, target_name,
                    GuildCommandResults.GUILD_PLAYER_NOT_FOUND)
            elif not player_mgr.guild_manager.has_member(
                    target_player_mgr.guid):
                GuildManager.send_guild_command_result(
                    player_mgr, GuildTypeCommand.GUILD_INVITE_S, target_name,
                    GuildCommandResults.GUILD_PLAYER_NOT_IN_GUILD)
            elif not player_mgr.guild_manager.demote_rank(
                    target_player_mgr.guid):
                GuildManager.send_guild_command_result(
                    player_mgr, GuildTypeCommand.GUILD_INVITE_S, '',
                    GuildCommandResults.GUILD_INTERNAL)

        return 0
Beispiel #21
0
    def handle(world_session, socket, reader):
        if len(reader.data
               ) > 1:  # Avoid handling empty Group Set Leader packet.
            target_name = PacketReader.read_string(reader.data, 0).strip()
            target_player_mgr = RealmDatabaseManager.character_get_by_name(
                target_name)

            if not world_session.player_mgr.group_manager:
                GroupManager.send_group_operation_result(
                    world_session.player_mgr, PartyOperations.PARTY_OP_LEAVE,
                    '', PartyResults.ERR_NOT_IN_GROUP)
            elif not target_player_mgr:
                GroupManager.send_group_operation_result(
                    world_session.player_mgr, PartyOperations.PARTY_OP_LEAVE,
                    target_name, PartyResults.ERR_BAD_PLAYER_NAME_S)
            elif not world_session.player_mgr.group_manager.is_party_member(
                    target_player_mgr.guid):
                GroupManager.send_group_operation_result(
                    world_session.player_mgr, PartyOperations.PARTY_OP_LEAVE,
                    target_name, PartyResults.ERR_TARGET_NOT_IN_YOUR_GROUP_S)
            else:
                world_session.player_mgr.group_manager.set_party_leader(
                    world_session.player_mgr.guid, target_player_mgr.guid)

        return 0
Beispiel #22
0
    def _build_party_member_stats(group_member):
        player_mgr = WorldSessionStateHandler.find_player_by_guid(
            group_member.guid)
        character = None

        # If player is offline, build stats based on db information.
        if not player_mgr or not player_mgr.online:
            player_mgr = None
            character = RealmDatabaseManager.character_get_by_guid(
                group_member.guid)

        data = pack(
            '<Q2IB6I3f',
            player_mgr.guid if player_mgr else character.guid,
            player_mgr.health if player_mgr else 0,
            player_mgr.max_health if player_mgr else 0,
            player_mgr.power_type if player_mgr else 0,
            player_mgr.get_power_type_value() if player_mgr else 0,
            player_mgr.get_max_power_value() if player_mgr else 0,
            player_mgr.level if player_mgr else character.level,
            player_mgr.map_ if player_mgr else character.map,
            # Client expects an AreaNumber from AreaTable, not a zone id.
            MapManager.get_area_number_by_zone_id(
                player_mgr.zone if player_mgr else character.zone),
            player_mgr.class_ if player_mgr else character.class_,
            player_mgr.location.x if player_mgr else character.position_x,
            player_mgr.location.y if player_mgr else character.position_y,
            player_mgr.location.z if player_mgr else character.position_z,
        )

        return PacketWriter.get_packet(OpCode.SMSG_PARTY_MEMBER_STATS, data)
    def handle(world_session, socket, reader):
        if len(reader.data
               ) >= 12:  # Avoid handling empty group loot method packet.
            loot_method, loot_master = unpack('<IQ', reader.data[:12])
            target_player_mgr = None

            if not world_session.player_mgr.group_manager:
                GroupManager.send_group_operation_result(
                    world_session.player_mgr, PartyOperations.PARTY_OP_LEAVE,
                    '', PartyResults.ERR_NOT_IN_GROUP)
            if world_session.player_mgr.guid != world_session.player_mgr.group_manager.group.leader_guid:
                GroupManager.send_group_operation_result(
                    world_session.player_mgr, PartyOperations.PARTY_OP_INVITE,
                    '', PartyResults.ERR_NOT_LEADER)

            if loot_master > 0:
                target_player_mgr = RealmDatabaseManager.character_get_by_guid(
                    loot_master)

            if target_player_mgr:
                world_session.player_mgr.group_manager.set_loot_method(
                    loot_method, master_looter_guid=target_player_mgr.guid)
            else:
                world_session.player_mgr.group_manager.set_loot_method(
                    loot_method)

        return 0
Beispiel #24
0
    def load_items(self):
        # Add backpack
        self.containers[InventorySlots.SLOT_INBACKPACK] = ContainerManager(
            is_backpack=True, owner=self.owner.guid)

        character_inventory = RealmDatabaseManager.character_get_inventory(
            self.owner.guid)

        # First load bags
        for item_instance in character_inventory:
            item_template = WorldDatabaseManager.item_template_get_by_entry(
                item_instance.item_template)
            if item_template and item_template.inventory_type == InventoryTypes.BAG:
                container_mgr = ContainerManager(owner=self.owner.guid,
                                                 item_template=item_template,
                                                 item_instance=item_instance)
                if self.is_bag_pos(container_mgr.current_slot):
                    self.containers[item_instance.bag].sorted_slots[
                        container_mgr.current_slot] = container_mgr
                    self.containers[container_mgr.current_slot] = container_mgr

        # Then load items
        for item_instance in character_inventory:
            item_template = WorldDatabaseManager.item_template_get_by_entry(
                item_instance.item_template)
            if item_template:
                item_mgr = ItemManager(item_template=item_template,
                                       item_instance=item_instance)
                if item_mgr.is_container() and self.is_bag_pos(
                        item_mgr.current_slot):
                    continue
                if item_instance.bag in self.containers:
                    self.containers[item_instance.bag].sorted_slots[
                        item_mgr.current_slot] = item_mgr
    def goplayer(world_session, args):
        player_name = args
        is_online = True

        player = WorldSessionStateHandler.find_player_by_name(player_name)
        player_location = None
        map_ = 0

        if player:
            player_location = player.location
            map_ = player.map_
        else:
            is_online = False
            player = RealmDatabaseManager.character_get_by_name(player_name)

        if player:
            if not is_online:
                player_location = Vector(float(player.position_x),
                                         float(player.position_y),
                                         float(player.position_z))
                map_ = player.map
        else:
            return -1, 'player not found.'

        world_session.player_mgr.teleport(int(map_), player_location)

        return 0, 'Teleported to player %s (%s).' % (
            player_name.capitalize(), 'Online' if is_online else 'Offline')
Beispiel #26
0
 def load_petition(player_mgr):
     petition = RealmDatabaseManager.guild_petition_get_by_owner(
         player_mgr.guid)
     if petition:
         petition_item = player_mgr.inventory.get_first_item_by_entry(
             PetitionManager.CHARTER_ENTRY)
         if petition_item:
             petition_item.set_enchantment(0, petition.petition_id, 0, 0)
 def tickets(world_session, args):
     tickets = RealmDatabaseManager.ticket_get_all()
     for ticket in tickets:
         ticket_color = '|cFFFF0000' if ticket.is_bug else '|cFF00FFFF'
         ticket_title = 'Bug report' if ticket.is_bug else 'Suggestion'
         ticket_text = f'{ticket_color}[{ticket.id}]|r {ticket.submit_time}: {ticket_title} from {ticket.character_name}.'
         ChatManager.send_system_message(world_session, ticket_text)
     return 0, f'{len(tickets)} tickets shown.'
Beispiel #28
0
 def send_update_to_friends(self):
     have_me_as_friend = RealmDatabaseManager.character_get_friends_of(
         self.owner.guid)
     for friend in have_me_as_friend:
         player_mgr = WorldSessionStateHandler.find_player_by_guid(
             friend.guid)
         if player_mgr:
             player_mgr.friends_manager.send_friends()
Beispiel #29
0
    def handle(world_session, socket, reader):
        if len(reader.data) >= 8:  # Avoid handling empty binder activate packet
            binder_guid = unpack('<Q', reader.data[:8])[0]
            if binder_guid > 0:
                world_session.player_mgr.deathbind.creature_binder_guid = binder_guid & ~HighGuid.HIGHGUID_UNIT
                world_session.player_mgr.deathbind.deathbind_map = world_session.player_mgr.map_
                world_session.player_mgr.deathbind.deathbind_zone = world_session.player_mgr.zone
                world_session.player_mgr.deathbind.deathbind_position_x = world_session.player_mgr.location.x
                world_session.player_mgr.deathbind.deathbind_position_y = world_session.player_mgr.location.y
                world_session.player_mgr.deathbind.deathbind_position_z = world_session.player_mgr.location.z
                RealmDatabaseManager.character_update_deathbind(world_session.player_mgr.deathbind)
                socket.sendall(world_session.player_mgr.get_deathbind_packet())

                data = pack('<Q', binder_guid)
                socket.sendall(PacketWriter.get_packet(OpCode.SMSG_PLAYERBOUND, data))

        return 0
Beispiel #30
0
    def leave_party(self, player_guid, force_disband=False, is_kicked=False):
        disband = player_guid == self.group.leader_guid or len(self.members) == 2 or force_disband
        was_formed = self.is_party_formed()

        #  Group was disbanded before even existing.
        if disband and player_guid == self.group.leader_guid and len(self.members) == 0:
            leader_player = WorldSessionStateHandler.find_player_by_guid(self.group.leader_guid)
            if leader_player:
                leader_player.group_manager = None
                leader_player.has_pending_invite = False
        else:
            for member in list(self.members.values()):  # Avoid mutability.
                if disband or member.guid == player_guid:
                    member_player = WorldSessionStateHandler.find_player_by_guid(member.guid)
                    if member_player:
                        member_player.has_pending_group_invite = False
                        member_player.group_manager = None
                        member_player.group_status = WhoPartyStatus.WHO_PARTY_STATUS_NOT_IN_PARTY

                    if member.guid == self.group.leader_guid:
                        GroupManager._remove_leader_flag(member)

                    if not disband:
                        self._set_previous_looter(member.guid)

                    RealmDatabaseManager.group_remove_member(member)
                    self.members.pop(member.guid)

                    if was_formed and member_player and disband and not is_kicked and member.guid != player_guid:
                        disband_packet = PacketWriter.get_packet(OpCode.SMSG_GROUP_DESTROYED)
                        member_player.enqueue_packet(disband_packet)
                    elif was_formed and member_player and disband and member.guid != player_guid:
                        disband_packet = PacketWriter.get_packet(OpCode.SMSG_GROUP_DESTROYED)
                        member_player.enqueue_packet(disband_packet)
                    elif was_formed and member_player and not is_kicked:
                        GroupManager.send_group_operation_result(member_player, PartyOperations.PARTY_OP_LEAVE, member_player.player.name,
                                                                 PartyResults.ERR_PARTY_RESULT_OK)

                    if member_player and is_kicked and member.guid == player_guid:  # 'You have been removed from the group.' message
                        packet = PacketWriter.get_packet(OpCode.SMSG_GROUP_UNINVITE)
                        member_player.enqueue_packet(packet)

        if disband:
            self.flush()
        else:
            self.send_update()