Ejemplo n.º 1
0
    def ann(world_session, args):
        ann = str(args)

        for session in WorldSessionStateHandler.get_world_sessions():
            if session.player_mgr and session.player_mgr.is_online:
                ChatManager.send_system_message(session, '[SERVER] %s' % ann)

        return 0, ''
Ejemplo n.º 2
0
 def send_offline_notification(self):
     sessions = WorldSessionStateHandler.get_world_sessions()
     for session in sessions:
         if session and session.player_mgr:
             if session.player_mgr.friends_manager.has_friend(self.owner):
                 data = pack('<BQB', FriendResults.FRIEND_OFFLINE, self.owner.guid, 0)
                 packet = PacketWriter.get_packet(OpCode.SMSG_FRIEND_STATUS, data)
                 session.player_mgr.session.request.sendall(packet)
Ejemplo n.º 3
0
    def worldoff(world_session, args):
        # Prevent more sockets to be opened
        WorldManager.WORLD_ON = False

        # Kick all players
        for session in WorldSessionStateHandler.get_world_sessions():
            if session.player_mgr and session.player_mgr.is_online:
                session.keep_alive = False

        return 0, ''
Ejemplo n.º 4
0
    def worldoff(world_session, args):
        confirmation = str(args)

        if confirmation.strip() != 'confirm':
            return -1, 'this command is DANGEROUS, it will shutdown the server. Write \'.worldoff confirm\' to do it.'

        # Prevent more sockets to be opened
        WorldManager.WORLD_ON = False

        # Kick all players
        for session in WorldSessionStateHandler.get_world_sessions():
            if session.player_mgr and session.player_mgr.online:
                session.disconnect()

        return 0, ''
Ejemplo n.º 5
0
    def handle(world_session, socket, reader):
        if len(reader.data) > 0:  # Avoid handling empty who packet
            # TODO: Search for guild and faction handling
            level_min, level_max = unpack('<2I', reader.data[:8])

            current_size = 8
            player_name = PacketReader.read_string(reader.data, current_size)
            guild_name = PacketReader.read_string(
                reader.data, current_size + len(player_name))

            current_size += len(player_name) + len(guild_name) + 2
            race_mask, class_mask, zone_count = unpack(
                '<3I', reader.data[current_size:current_size + 12])
            if zone_count > 10:
                return 0

            current_size += 12
            zones = []
            for x in range(0, zone_count):
                zone = unpack('<I',
                              reader.data[current_size:current_size + 4])[0]
                zones.append(zone)
                current_size += 4

            user_strings_count = unpack(
                '<I', reader.data[current_size:current_size + 4])[0]
            if user_strings_count > 4:
                return 0

            current_size += 4
            user_strings = []
            for x in range(0, user_strings_count):
                user_string = PacketReader.read_string(reader.data,
                                                       current_size)
                user_strings.append(user_string)
                current_size += len(user_string)

            online_count = 0
            player_count = 0
            player_data = b''
            for session in WorldSessionStateHandler.get_world_sessions():
                if session.player_mgr and session.player_mgr.online:
                    online_count += 1
                    if player_count == 49:
                        continue

                    if session.player_mgr.level < level_min or session.player_mgr.level > level_max:
                        continue
                    if player_name and not player_name.lower(
                    ) in session.player_mgr.player.name.lower:
                        continue
                    if session.player_mgr.guild_manager and guild_name and guild_name.lower(
                    ) not in session.player_mgr.guild_manager.guild_name.lower(
                    ):
                        continue
                    if class_mask != 0xFFFFFFFF and class_mask & session.player_mgr.class_mask != session.player_mgr.class_mask:
                        continue
                    if race_mask != 0xFFFFFFFF and race_mask & session.player_mgr.race_mask != session.player_mgr.race_mask:
                        continue
                    if zone_count > 0:
                        area = WorldDatabaseManager.area_get_by_id(
                            session.player_mgr.zone)
                        if area:
                            skip = True
                            for zone in zones:
                                if zone == area.zone_id or area.zone_id == 0 and zone == area.entry:
                                    skip = False
                                    break
                            if skip:
                                continue
                    if user_strings_count > 0:
                        skip = True
                        for string in user_strings:
                            if string.lower(
                            ) in session.player_mgr.player.name.lower():
                                skip = False
                                break
                        if skip:
                            continue

                    player_name_bytes = PacketWriter.string_to_bytes(
                        session.player_mgr.player.name)

                    player_guild_name = session.player_mgr.guild_manager.guild_name if session.player_mgr.guild_manager else ""
                    guild_name_bytes = PacketWriter.string_to_bytes(
                        player_guild_name)
                    player_data += pack(
                        '<%us%us5I' %
                        (len(player_name_bytes), len(guild_name_bytes)),
                        player_name_bytes, guild_name_bytes,
                        session.player_mgr.level,
                        session.player_mgr.player.class_,
                        session.player_mgr.player.race,
                        session.player_mgr.zone,
                        session.player_mgr.group_status)
                    player_count += 1

            data = pack('<2I', player_count, online_count
                        if online_count > 49 else player_count) + player_data
            socket.sendall(PacketWriter.get_packet(OpCode.SMSG_WHO, data))

        return 0
Ejemplo n.º 6
0
 def send_update_to_friends(self):
     sessions = WorldSessionStateHandler.get_world_sessions()
     for session in sessions:
         if session and session.player_mgr:
             if session.player_mgr.friends_manager.has_friend(self.owner):
                 sessions.player_mgr.friends_manager.send_friends()
Ejemplo n.º 7
0
    def handle(world_session, socket, reader):
        if len(reader.data) > 0:  # Avoid handling empty who packet.
            # TODO: Search for guild and faction handling
            level_min, level_max = unpack('<2I', reader.data[:8])

            current_size = 8
            player_name = PacketReader.read_string(reader.data, current_size)
            guild_name = PacketReader.read_string(
                reader.data, current_size + len(player_name))

            current_size += len(player_name) + len(guild_name) + 2
            race_mask, class_mask, zone_count = unpack(
                '<3I', reader.data[current_size:current_size + 12])
            if zone_count > 10:
                return 0

            current_size += 12
            zones = []
            for x in range(0, zone_count):
                zone = unpack('<I',
                              reader.data[current_size:current_size + 4])[0]
                # Cases like z-'Stormwind City' wont work because the client sends zone_id 0.
                # In this cases, we use the current player zone_id and return players in that area or parent area.
                if zone == 0:
                    zones.append(world_session.player_mgr.zone)
                else:
                    zones.append(zone)
                current_size += 4

            user_strings_count = unpack(
                '<I', reader.data[current_size:current_size + 4])[0]
            if user_strings_count > 4:
                return 0

            current_size += 4
            user_strings = []
            for x in range(0, user_strings_count):
                user_string = PacketReader.read_string(reader.data,
                                                       current_size)
                user_strings.append(user_string)
                current_size += len(user_string)

            online_count = 0
            player_count = 0
            player_data = b''
            for session in WorldSessionStateHandler.get_world_sessions():
                if session.player_mgr and session.player_mgr.online:
                    player_mgr = session.player_mgr
                    online_count += 1
                    if player_count == 49:
                        continue

                    if player_mgr.level < level_min or player_mgr.level > level_max:
                        continue
                    if player_name and not player_name.lower(
                    ) in player_mgr.player.name.lower:
                        continue
                    if player_mgr.guild_manager and guild_name and guild_name.lower(
                    ) not in player_mgr.guild_manager.guild.name.lower():
                        continue
                    if class_mask != 0xFFFFFFFF and class_mask & player_mgr.class_mask != player_mgr.class_mask:
                        continue
                    if race_mask != 0xFFFFFFFF and race_mask & player_mgr.race_mask != player_mgr.race_mask:
                        continue
                    if zone_count > 0:
                        current_areas = [
                            DbcDatabaseManager.area_get_by_id_and_map_id(
                                player_mgr.zone, player_mgr.map_)
                        ]

                        # If the current zone has a parent zone, look for it and add it.
                        if current_areas[
                                0] and current_areas[0].ParentAreaNum > 0:
                            current_areas.append(
                                DbcDatabaseManager.area_get_by_area_number(
                                    current_areas[0].ParentAreaNum,
                                    player_mgr.map_))

                        area_ids = [area.ID for area in current_areas if area]

                        skip = True
                        for zone in zones:
                            if zone in area_ids:
                                skip = False

                        if skip:
                            continue

                    if user_strings_count > 0:
                        skip = True
                        for string in user_strings:
                            if string.lower() in player_mgr.player.name.lower(
                            ):
                                skip = False
                                break
                        if skip:
                            continue

                    player_name_bytes = PacketWriter.string_to_bytes(
                        player_mgr.player.name)

                    player_guild_name = player_mgr.guild_manager.guild.name if player_mgr.guild_manager else ''
                    guild_name_bytes = PacketWriter.string_to_bytes(
                        player_guild_name)
                    player_data += pack(
                        f'<{len(player_name_bytes)}s{len(guild_name_bytes)}s5I',
                        player_name_bytes, guild_name_bytes, player_mgr.level,
                        player_mgr.class_, player_mgr.race, player_mgr.zone,
                        player_mgr.group_status)
                    player_count += 1

            data = pack('<2I', player_count, online_count
                        if online_count > 49 else player_count) + player_data
            world_session.enqueue_packet(
                PacketWriter.get_packet(OpCode.SMSG_WHO, data))

        return 0