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.

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.

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;
}
}
}