Admin Scan Players command

Trance

Vassal
Hi,

Admin command, scans a specified range around the admin. It gathers about players within the specified range, including their clan names, party leaders, and class names. Counting all players around can be a helpful task for admins. You could limit the scanning to players within the same region or zone as the admin - this would reduce the number of players to be processed and improve performance.

image.jpg


Java:
package handler.admincommands;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.stream.Collectors;

import l2.gameserver.handler.admincommands.IAdminCommandHandler;
import l2.gameserver.model.GameObjectsStorage;
import l2.gameserver.model.Player;
import l2.gameserver.model.World;
import l2.gameserver.model.pledge.Clan;
import l2.gameserver.scripts.ScriptFile;
import l2.gameserver.tables.ClanTable;
import l2.gameserver.utils.Location;
import util.UtilExt;

/**
 * Scans a specified range around the admin.
 * It gathers about players within the specified range, including their clan names, party leaders, and class names.
 * @author Trance
 */
public class AdminScan extends ScriptAdminCommand implements IAdminCommandHandler, ScriptFile
{

    @Override
    public Enum<?>[] getAdminCommandEnum()
    {
        return Commands.values();
    }

    @Override
    public boolean useAdminCommand(@SuppressWarnings("rawtypes") Enum comm, String[] args, String fullString, Player player)
    {
        final Commands command = (Commands) comm;
        if (!player.getPlayerAccess().CanViewChar)
            return false;
       
        switch (command)
        {
            case admin_scan_players:
            {
                StringTokenizer st = new StringTokenizer(fullString);
                st.nextToken();
                if (st.hasMoreTokens())
                {
                    String rangeStr = st.nextToken();
                    scanPlayers(player, rangeStr);
                }
                else
                {
                    player.sendMessage("Usage: //admin_scan_players <range>");
                }
                break;
            }
        }
        return true;
    }
   
    private void scanPlayers(Player player, String rangeStr)
    {
        // Parse the range from the command arguments
        int range = UtilExt.parseNextInt(rangeStr, 0);
       
        // Get the player's location
        Location playerLocation = player.getLoc();
       
        // Initialize data structures for storing the scan results
        Map<String, Set<String>> clanMembers = new HashMap<>();
        Map<String, Set<String>> partyMembers = new HashMap<>();
        Map<String, List<String>> classMembers = new HashMap<>();
       
        // Iterate through all players in the world
        for (Player otherPlayer : GameObjectsStorage.getAllPlayers())
        {
            // Check if the other player is within the specified range of the player
            if (playerLocation.distance(otherPlayer.getLoc()) <= range)
            {
                // Gather data for clans, parties, and classes
                String clanName = otherPlayer.getClan() != null ? otherPlayer.getClan().getName() : "No Clan";
                String partyLeaderName = otherPlayer.getParty() != null ? otherPlayer.getParty().getPartyLeader().getName() : null;
                String className = otherPlayer.getClassId().name();
               
                // Update the player lists for clans, parties, and classes
                clanMembers.computeIfAbsent(clanName, k -> new HashSet<>()).add(otherPlayer.getName());
                if (partyLeaderName != null)
                {
                    partyMembers.computeIfAbsent(partyLeaderName, k -> new HashSet<>()).add(otherPlayer.getName());
                }
                classMembers.computeIfAbsent(className, k -> new ArrayList<>()).add(otherPlayer.getName());
            }
        }
       
        // Display the scan results to the player
        player.sendMessage("Scan Results:");
        player.sendMessage("Range: " + range);
        player.sendMessage("Clans (" + clanMembers.size() + "):");;
        for (Map.Entry<String, Set<String>> entry : clanMembers.entrySet())
        {
            String clanLeaderName = "Unknown";
            Clan clan = ClanTable.getInstance().getClanByName(entry.getKey());
            if (clan != null)
            {
                Player clanLeader = World.getPlayer(clan.getLeaderId());
                if (clanLeader != null)
                {
                    clanLeaderName = clanLeader.getName();
                }
            }
            player.sendMessage(" - " + entry.getKey() + " (Leader: " + clanLeaderName + "): " + entry.getValue().size() + " members");
            player.sendMessage("   Members: " + String.join(", ", entry.getValue()));
        }
        player.sendMessage("Parties (" + partyMembers.size() + "):");
        for (Map.Entry<String, Set<String>> entry : partyMembers.entrySet())
        {
            player.sendMessage(" - Leader: " + entry.getKey() + ", " + entry.getValue().size() + " members");
            player.sendMessage("   Members: " + String.join(", ", entry.getValue()));
        }
        player.sendMessage("Classes (" + classMembers.size() + "):");
        for (Map.Entry<String, List<String>> entry : classMembers.entrySet())
        {
            player.sendMessage(" - " + entry.getKey() + ": " + entry.getValue().size() + " players " + entry.getValue().stream().collect(Collectors.joining(", ", "(", ")")));
        }
    }
   
    private enum Commands
    {
        admin_scan_players
    }
}

Java:
package util;

/**
 * @author Trance
 */
public class UtilExt
{
    public static int parseNextInt(String value, int defaultValue)
    {
        try
        {
            return Integer.parseInt(value);
        }
        catch (NumberFormatException e)
        {
            return defaultValue;
        }
    }
}
 
Back
Top