/* * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that * it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If * not, see <http://www.gnu.org/licenses/>. */ package silentium.scripts.handlers.admin; import javolution.text.TextBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import silentium.commons.database.DatabaseFactory; import silentium.commons.utils.StringUtil; import silentium.gameserver.configs.MainConfig; import silentium.gameserver.data.html.HtmCache; import silentium.gameserver.data.html.StaticHtmPath; import silentium.gameserver.data.xml.CharTemplateData; import silentium.gameserver.handler.IAdminCommandHandler; import silentium.gameserver.instancemanager.CastleManager; import silentium.gameserver.instancemanager.ClanHallManager; import silentium.gameserver.model.L2Clan; import silentium.gameserver.model.L2Object; import silentium.gameserver.model.L2World; import silentium.gameserver.model.actor.L2Summon; import silentium.gameserver.model.actor.instance.L2PcInstance; import silentium.gameserver.model.actor.instance.L2PetInstance; import silentium.gameserver.model.base.ClassId; import silentium.gameserver.network.L2GameClient; import silentium.gameserver.network.SystemMessageId; import silentium.gameserver.network.clientpackets.Say2; import silentium.gameserver.network.serverpackets.NpcHtmlMessage; import silentium.gameserver.utils.Util; import java.sql.Connection; import java.sql.PreparedStatement; import java.util.*; public class AdminEditChar implements IAdminCommandHandler { private static final Logger _log = LoggerFactory.getLogger(AdminEditChar.class.getName()); private static final String[] ADMIN_COMMANDS = { "admin_edit_character", "admin_current_player", "admin_nokarma", // this is // to // remove // karma // from // selected // char... "admin_setkarma", // sets karma of target char to any amount. //setkarma <karma> "admin_character_list", // same as character_info, kept for compatibility purposes "admin_character_info", // given a player name, displays an information window "admin_show_characters", // list of characters "admin_find_character", // find a player by his name or a part of it (case-insensitive) "admin_find_ip", // find all the player connections from a given IPv4 number "admin_find_account", // list all the characters from an account (useful for GMs w/o DB access) "admin_find_dualbox", // list all IPs with more than 1 char logged in (dualbox) "admin_rec", // gives recommendation points "admin_settitle", // changes char's title "admin_setname", // changes char's name "admin_setsex", // changes char's sex "admin_setcolor", // change char name's color "admin_settcolor", // change char title's color "admin_setclass", // changes char's classId "admin_summon_info", // displays an information window about target summon "admin_unsummon", // unsummon target's pet/summon "admin_summon_setlvl", // set the pet's level "admin_show_pet_inv", // show pet's inventory "admin_fullfood", // fulfills a pet's food bar "admin_party_info", // find party infos of targeted character, if any "admin_clan_info", // find clan infos of the character, if any "admin_remove_clan_penalty" // removes clan penalties }; @Override public boolean useAdminCommand(final String command, final L2PcInstance activeChar) { if ("admin_current_player".equals(command)) showCharacterInfo(activeChar, null); else if (command.startsWith("admin_character_list") || command.startsWith("admin_character_info")) { try { final String val = command.substring(21); final L2PcInstance target = L2World.getInstance().getPlayer(val); if (target != null) showCharacterInfo(activeChar, target); else activeChar.sendPacket(SystemMessageId.CHARACTER_DOES_NOT_EXIST); } catch (StringIndexOutOfBoundsException e) { activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Usage: //character_info <player_name>"); } } else if (command.startsWith("admin_show_characters")) { try { final String val = command.substring(22); final int page = Integer.parseInt(val); listCharacters(activeChar, page); } catch (StringIndexOutOfBoundsException e) { // Case of empty page number activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Usage: //show_characters <page_number>"); } } else if (command.startsWith("admin_find_character")) { try { final String val = command.substring(21); findCharacter(activeChar, val); } catch (StringIndexOutOfBoundsException e) { // Case of empty character name activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Usage: //find_character <character_name>"); listCharacters(activeChar, 0); } } else if (command.startsWith("admin_find_ip")) { try { final String val = command.substring(14); findCharactersPerIp(activeChar, val); } catch (Exception e) { // Case of empty or malformed IP number activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Usage: //find_ip <www.xxx.yyy.zzz>"); listCharacters(activeChar, 0); } } else if (command.startsWith("admin_find_account")) { try { final String val = command.substring(19); findCharactersPerAccount(activeChar, val); } catch (Exception e) { // Case of empty or malformed player name activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Usage: //find_account <player_name>"); listCharacters(activeChar, 0); } } else if (command.startsWith("admin_find_dualbox")) { int multibox = 2; try { final String val = command.substring(19); multibox = Integer.parseInt(val); if (multibox < 1) { activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Usage: //find_dualbox [number > 0]"); return false; } } catch (Exception e) { } findDualbox(activeChar, multibox); } else if ("admin_edit_character".equals(command)) editCharacter(activeChar); // Karma control commands else if ("admin_nokarma".equals(command)) setTargetKarma(activeChar, 0); else if (command.startsWith("admin_setkarma")) { try { final String val = command.substring(15); final int karma = Integer.parseInt(val); setTargetKarma(activeChar, karma); } catch (Exception e) { if (MainConfig.DEVELOPER) _log.warn("Set karma error: " + e); activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Usage: //setkarma <new_karma_value>"); } } else if (command.startsWith("admin_rec")) { try { final String val = command.substring(10); final int recVal = Integer.parseInt(val); final L2Object target = activeChar.getTarget(); L2PcInstance player = null; if (target instanceof L2PcInstance) player = (L2PcInstance) target; else return false; player.setRecomHave(recVal); player.sendMessage("You have been recommended by a GM"); player.broadcastUserInfo(); } catch (Exception e) { activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Usage: //rec number"); } } else if (command.startsWith("admin_setclass")) { try { final String val = command.substring(15); final int classidval = Integer.parseInt(val); final L2Object target = activeChar.getTarget(); L2PcInstance player = null; if (target instanceof L2PcInstance) player = (L2PcInstance) target; else return false; boolean valid = false; for (final ClassId classid : ClassId.values()) if (classidval == classid.getId()) valid = true; if (valid && player.getClassId().getId() != classidval) { player.setClassId(classidval); if (!player.isSubClassActive()) player.setBaseClass(classidval); final String newclass = player.getTemplate().className; player.store(); player.broadcastUserInfo(); // Messages if (player != activeChar) player.sendMessage("A GM changed your class to " + newclass + '.'); activeChar.sendChatMessage(0, Say2.ALL, "SYS", player.getName() + " is now a " + newclass + '.'); } else activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Usage: //setclass <valid classid>"); } catch (StringIndexOutOfBoundsException e) { AdminHelpPage.showHelpPage(activeChar, "charclasses.htm"); } } else if (command.startsWith("admin_settitle")) { try { final String val = command.substring(15); final L2Object target = activeChar.getTarget(); L2PcInstance player = null; if (target instanceof L2PcInstance) player = (L2PcInstance) target; else return false; player.setTitle(val); player.sendMessage("Your title has been changed by a GM."); player.broadcastUserInfo(); } catch (StringIndexOutOfBoundsException e) { // Case of empty character title activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Usage: //settitle title"); } } else if (command.startsWith("admin_setname")) { try { final String val = command.substring(14); if (!Util.isValidPlayerName(val)) { activeChar.sendChatMessage(0, Say2.ALL, "SYS", "The new name doesn't fit with the regex pattern."); return false; } final L2Object target = activeChar.getTarget(); L2PcInstance player = null; if (target instanceof L2PcInstance) player = (L2PcInstance) target; else return false; player.setName(val); player.sendMessage("Your name has been changed by a GM."); player.broadcastUserInfo(); player.store(); } catch (StringIndexOutOfBoundsException e) { // Case of empty character name activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Usage: //setname name"); } } else if (command.startsWith("admin_setsex")) { final L2Object target = activeChar.getTarget(); L2PcInstance player = null; if (target instanceof L2PcInstance) player = (L2PcInstance) target; else return false; player.getAppearance().setSex(!player.getAppearance().getSex()); player.sendMessage("Your gender has been changed by a GM"); player.broadcastUserInfo(); player.decayMe(); player.spawnMe(player.getX(), player.getY(), player.getZ()); } else if (command.startsWith("admin_setcolor")) { try { final String val = command.substring(15); final L2Object target = activeChar.getTarget(); L2PcInstance player = null; if (target instanceof L2PcInstance) player = (L2PcInstance) target; else return false; player.getAppearance().setNameColor(Integer.decode("0x" + val)); player.sendMessage("Your name color has been changed by a GM."); player.broadcastUserInfo(); } catch (Exception e) { // Case of empty color or invalid hex string activeChar.sendChatMessage(0, Say2.ALL, "SYS", "You need to specify a valid new color."); } } else if (command.startsWith("admin_settcolor")) { try { final String val = command.substring(16); final L2Object target = activeChar.getTarget(); L2PcInstance player = null; if (target instanceof L2PcInstance) player = (L2PcInstance) target; else return false; player.getAppearance().setTitleColor(Integer.decode("0x" + val)); player.sendMessage("Your title color has been changed by a GM."); player.broadcastUserInfo(); } catch (Exception e) { // Case of empty color or invalid hex string activeChar.sendChatMessage(0, Say2.ALL, "SYS", "You need to specify a valid new color."); } } else if (command.startsWith("admin_summon_info")) { final L2Object target = activeChar.getTarget(); if (target instanceof L2Summon) gatherSummonInfo((L2Summon) target, activeChar); // Allow to target a player to find his pet - target the pet then. else if (target instanceof L2PcInstance) { final L2Summon pet = ((L2PcInstance) target).getPet(); if (pet != null) { gatherSummonInfo(pet, activeChar); activeChar.setTarget(pet); } else activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET); } else activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET); } else if (command.startsWith("admin_unsummon")) { final L2Object target = activeChar.getTarget(); if (target instanceof L2Summon) ((L2Summon) target).unSummon(((L2Summon) target).getOwner()); else activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET); } else if (command.startsWith("admin_summon_setlvl")) { final L2Object target = activeChar.getTarget(); if (target instanceof L2PetInstance) { final L2PetInstance pet = (L2PetInstance) target; try { final String val = command.substring(20); final int level = Integer.parseInt(val); final long newexp; long oldexp = 0; oldexp = pet.getStat().getExp(); newexp = pet.getStat().getExpForLevel(level); if (oldexp > newexp) pet.getStat().removeExp(oldexp - newexp); else if (oldexp < newexp) pet.getStat().addExp(newexp - oldexp); } catch (Exception e) { } } else activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET); } else if (command.startsWith("admin_show_pet_inv")) { final String val; final int objId; L2Object target; try { val = command.substring(19); objId = Integer.parseInt(val); target = L2World.getInstance().getPet(objId); } catch (Exception e) { target = activeChar.getTarget(); } if (target instanceof L2PetInstance) activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Currently undone."); // FIXME activeChar.sendPacket(new GMViewItemList((L2PetInstance) // target)); else activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET); } else if (command.startsWith("admin_fullfood")) { final L2Object target = activeChar.getTarget(); if (target instanceof L2PetInstance) { final L2PetInstance targetPet = (L2PetInstance) target; targetPet.setCurrentFed(targetPet.getMaxFed()); } else activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET); } else if (command.startsWith("admin_party_info")) { final String val; L2Object target; try { val = command.substring(17); target = L2World.getInstance().getPlayer(val); if (target == null) target = activeChar.getTarget(); } catch (Exception e) { target = activeChar.getTarget(); } if (target instanceof L2PcInstance) { if (((L2PcInstance) target).isInParty()) gatherPartyInfo((L2PcInstance) target, activeChar); else activeChar.sendChatMessage(0, Say2.ALL, "SYS", target.getName() + " isn't in a party."); } else activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET); } else if (command.startsWith("admin_clan_info")) { final String val; final L2PcInstance player; try { val = command.substring(16); player = L2World.getInstance().getPlayer(val); if (player != null) { final L2Clan clan = player.getClan(); if (clan != null) { try { final NpcHtmlMessage msg = new NpcHtmlMessage(0); final String htm = HtmCache.getInstance().getHtm(StaticHtmPath.AdminHtmPath + "claninfo.htm"); msg.setHtml(htm); msg.replace("%clan_name%", clan.getName()); msg.replace("%clan_leader%", clan.getLeaderName()); msg.replace("%clan_level%", String.valueOf(clan.getLevel())); msg.replace("%clan_has_castle%", clan.hasCastle() ? CastleManager.getInstance().getCastleById(clan.getCastleId()).getName() : "No"); msg.replace("%clan_has_clanhall%", clan.hasHideout() ? ClanHallManager.getInstance().getClanHallById(clan.getHideoutId()).getName() : "No"); msg.replace("%clan_points%", String.valueOf(clan.getReputationScore())); msg.replace("%clan_players_count%", String.valueOf(clan.getMembersCount())); msg.replace("%clan_ally%", clan.getAllyId() > 0 ? clan.getAllyName() : "Not in ally"); activeChar.sendPacket(msg); } catch (NullPointerException npe) { npe.printStackTrace(); } } else { activeChar.sendChatMessage(0, Say2.ALL, "SYS", "This player isn't in a clan."); return false; } } else { activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Player is offline."); return false; } } catch (NumberFormatException nfe) { activeChar.sendChatMessage(0, Say2.ALL, "SYS", "This shouldn't happening."); return false; } catch (Exception e) { e.printStackTrace(); } } else if (command.startsWith("admin_remove_clan_penalty")) { try { final StringTokenizer st = new StringTokenizer(command, " "); if (st.countTokens() != 3) { activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Usage: //remove_clan_penalty join|create charname"); return false; } st.nextToken(); final boolean changeCreateExpiryTime = "create".equalsIgnoreCase(st.nextToken()); final String playerName = st.nextToken(); L2PcInstance player = null; player = L2World.getInstance().getPlayer(playerName); if (player == null) { final Connection con = DatabaseFactory.getConnection(); final PreparedStatement ps = con.prepareStatement("UPDATE characters SET " + (changeCreateExpiryTime ? "clan_create_expiry_time" : "clan_join_expiry_time") + " WHERE char_name=? LIMIT 1"); ps.setString(1, playerName); ps.execute(); } else { // removing penalty if (changeCreateExpiryTime) player.setClanCreateExpiryTime(0); else player.setClanJoinExpiryTime(0); } activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Clan penalty is successfully removed for " + playerName + '.'); } catch (Exception e) { e.printStackTrace(); } } return true; } @Override public String[] getAdminCommandList() { return ADMIN_COMMANDS; } private static void listCharacters(final L2PcInstance activeChar, int page) { final Collection<L2PcInstance> allPlayers = L2World.getInstance().getAllPlayers().values(); final L2PcInstance[] players = allPlayers.toArray(new L2PcInstance[allPlayers.size()]); final int MaxCharactersPerPage = 20; int MaxPages = players.length / MaxCharactersPerPage; if (players.length > MaxCharactersPerPage * MaxPages) MaxPages++; // Check if number of users changed if (page > MaxPages) page = MaxPages; final int CharactersStart = MaxCharactersPerPage * page; int CharactersEnd = players.length; if (CharactersEnd - CharactersStart > MaxCharactersPerPage) CharactersEnd = CharactersStart + MaxCharactersPerPage; final NpcHtmlMessage adminReply = new NpcHtmlMessage(5); adminReply.setFile(StaticHtmPath.AdminHtmPath + "charlist.htm", activeChar); final TextBuilder replyMSG = new TextBuilder(); for (int x = 0; x < MaxPages; x++) { final int pagenr = x + 1; replyMSG.append("<center><a action=\"bypass -h admin_show_characters ").append(x).append("\">Page ").append(pagenr).append("</a></center>"); } adminReply.replace("%pages%", replyMSG.toString()); replyMSG.clear(); for (int i = CharactersStart; i < CharactersEnd; i++) { // Add player info into new Table row replyMSG.append("<tr><td width=80><a action=\"bypass -h admin_character_info ").append(players[i].getName()).append("\">").append(players[i].getName()).append("</a></td><td width=110>").append(players[i].getTemplate().className).append("</td><td width=40>").append(players[i].getLevel()).append("</td></tr>"); } adminReply.replace("%players%", replyMSG.toString()); activeChar.sendPacket(adminReply); } private static void showCharacterInfo(final L2PcInstance activeChar, L2PcInstance player) { if (player == null) { final L2Object target = activeChar.getTarget(); if (target instanceof L2PcInstance) player = (L2PcInstance) target; else return; } else activeChar.setTarget(player); gatherCharacterInfo(activeChar, player, "charinfo.htm"); } /** * Gather character informations. * * @param activeChar The player who requested that action. * @param player The target to gather informations from. * @param filename The name of the HTM to send. */ private static void gatherCharacterInfo(final L2PcInstance activeChar, final L2PcInstance player, final String filename) { String ip = "N/A"; String account = "N/A"; try { final String clientInfo = player.getClient().toString(); account = clientInfo.substring(clientInfo.indexOf("Account: ") + 9, clientInfo.indexOf(" - IP: ")); ip = clientInfo.substring(clientInfo.indexOf(" - IP: ") + 7, clientInfo.lastIndexOf(']')); } catch (Exception e) { _log.warn(e.getLocalizedMessage(), e); } final NpcHtmlMessage adminReply = new NpcHtmlMessage(5); adminReply.setFile(StaticHtmPath.AdminHtmPath + filename, activeChar); adminReply.replace("%name%", player.getName()); adminReply.replace("%level%", String.valueOf(player.getLevel())); adminReply.replace("%clan%", String.valueOf(player.getClan() != null ? "<a action=\"bypass -h admin_clan_info " + player.getName() + "\">" + player.getClan().getName() + "</a>" : "none")); adminReply.replace("%xp%", String.valueOf(player.getExp())); adminReply.replace("%sp%", String.valueOf(player.getSp())); adminReply.replace("%class%", player.getTemplate().className); adminReply.replace("%ordinal%", String.valueOf(player.getClassId().ordinal())); adminReply.replace("%classid%", String.valueOf(player.getClassId())); adminReply.replace("%baseclass%", CharTemplateData.getInstance().getClassNameById(player.getBaseClass())); adminReply.replace("%x%", String.valueOf(player.getX())); adminReply.replace("%y%", String.valueOf(player.getY())); adminReply.replace("%z%", String.valueOf(player.getZ())); adminReply.replace("%currenthp%", String.valueOf((int) player.getCurrentHp())); adminReply.replace("%maxhp%", String.valueOf(player.getMaxHp())); adminReply.replace("%karma%", String.valueOf(player.getKarma())); adminReply.replace("%currentmp%", String.valueOf((int) player.getCurrentMp())); adminReply.replace("%maxmp%", String.valueOf(player.getMaxMp())); adminReply.replace("%pvpflag%", String.valueOf(player.getPvpFlag())); adminReply.replace("%currentcp%", String.valueOf((int) player.getCurrentCp())); adminReply.replace("%maxcp%", String.valueOf(player.getMaxCp())); adminReply.replace("%pvpkills%", String.valueOf(player.getPvpKills())); adminReply.replace("%pkkills%", String.valueOf(player.getPkKills())); adminReply.replace("%currentload%", String.valueOf(player.getCurrentLoad())); adminReply.replace("%maxload%", String.valueOf(player.getMaxLoad())); adminReply.replace("%percent%", String.valueOf(Util.roundTo((float) player.getCurrentLoad() / (float) player.getMaxLoad() * 100, 2))); adminReply.replace("%patk%", String.valueOf(player.getPAtk(null))); adminReply.replace("%matk%", String.valueOf(player.getMAtk(null, null))); adminReply.replace("%pdef%", String.valueOf(player.getPDef(null))); adminReply.replace("%mdef%", String.valueOf(player.getMDef(null, null))); adminReply.replace("%accuracy%", String.valueOf(player.getAccuracy())); adminReply.replace("%evasion%", String.valueOf(player.getEvasionRate(null))); adminReply.replace("%critical%", String.valueOf(player.getCriticalHit(null, null))); adminReply.replace("%runspeed%", String.valueOf(player.getRunSpeed())); adminReply.replace("%patkspd%", String.valueOf(player.getPAtkSpd())); adminReply.replace("%matkspd%", String.valueOf(player.getMAtkSpd())); adminReply.replace("%account%", account); adminReply.replace("%ip%", ip); adminReply.replace("%ai%", String.valueOf(player.getAI().getIntention().name())); activeChar.sendPacket(adminReply); } private static void setTargetKarma(final L2PcInstance activeChar, final int newKarma) { // function to change karma of selected char final L2Object target = activeChar.getTarget(); L2PcInstance player = null; if (target instanceof L2PcInstance) player = (L2PcInstance) target; else return; if (newKarma >= 0) { // for display final int oldKarma = player.getKarma(); // update karma player.setKarma(newKarma); // Admin information activeChar.sendChatMessage(0, Say2.ALL, "SYS", "You changed " + player.getName() + "'s karma from " + oldKarma + " to " + newKarma + '.'); _log.debug("[SET KARMA] [GM]" + activeChar.getName() + " changed " + player.getName() + "'s karma from " + oldKarma + " to " + newKarma + '.'); } else { // tell admin of mistake activeChar.sendChatMessage(0, Say2.ALL, "SYS", "The karma value must be greater or equal to 0."); _log.debug("[SET KARMA] ERROR: [GM]" + activeChar.getName() + " entered an incorrect value for new karma: " + newKarma + " for " + player.getName() + '.'); } } private static void editCharacter(final L2PcInstance activeChar) { final L2Object target = activeChar.getTarget(); if (!(target instanceof L2PcInstance)) return; final L2PcInstance player = (L2PcInstance) target; gatherCharacterInfo(activeChar, player, "charedit.htm"); } /** * @param activeChar * @param CharacterToFind */ private static void findCharacter(final L2PcInstance activeChar, final String CharacterToFind) { int CharactersFound = 0; String name; final Collection<L2PcInstance> allPlayers = L2World.getInstance().getAllPlayers().values(); final L2PcInstance[] players = allPlayers.toArray(new L2PcInstance[allPlayers.size()]); final NpcHtmlMessage adminReply = new NpcHtmlMessage(5); adminReply.setFile(StaticHtmPath.AdminHtmPath + "charfind.htm", activeChar); final TextBuilder replyMSG = new TextBuilder(); for (final L2PcInstance player : players) { // Add player info into new Table row name = player.getName(); if (name.toLowerCase().contains(CharacterToFind.toLowerCase())) { CharactersFound += 1; replyMSG.append("<tr><td width=80><a action=\"bypass -h admin_character_list ").append(name).append("\">").append(name).append("</a></td><td width=110>").append(player.getTemplate().className).append("</td><td width=40>").append(player.getLevel()).append("</td></tr>"); } if (CharactersFound > 20) break; } adminReply.replace("%results%", replyMSG.toString()); replyMSG.clear(); if (CharactersFound == 0) replyMSG.append("s. Please try again."); else if (CharactersFound > 20) { adminReply.replace("%number%", " more than 20"); replyMSG.append("s.<br>Please refine your search to see all of the results."); } else if (CharactersFound == 1) replyMSG.append("."); else replyMSG.append("s."); adminReply.replace("%number%", String.valueOf(CharactersFound)); adminReply.replace("%end%", replyMSG.toString()); activeChar.sendPacket(adminReply); } /** * @param activeChar * @param IpAdress * @throws IllegalArgumentException */ private static void findCharactersPerIp(final L2PcInstance activeChar, final String IpAdress) throws IllegalArgumentException { boolean findDisconnected = false; if ("disconnected".equals(IpAdress)) findDisconnected = true; else { if (!IpAdress.matches("^(?:(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2(?:[0-4][0-9]|5[0-5]))\\.){3}(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2(?:[0-4][0-9]|5[0-5]))$")) throw new IllegalArgumentException("Malformed IPv4 number"); } final Collection<L2PcInstance> allPlayers = L2World.getInstance().getAllPlayers().values(); final L2PcInstance[] players = allPlayers.toArray(new L2PcInstance[allPlayers.size()]); int CharactersFound = 0; L2GameClient client; String name, ip = "0.0.0.0"; final StringBuilder replyMSG = new StringBuilder(1000); final NpcHtmlMessage adminReply = new NpcHtmlMessage(5); adminReply.setFile(StaticHtmPath.AdminHtmPath + "ipfind.htm", activeChar); for (final L2PcInstance player : players) { client = player.getClient(); if (client.isDetached()) { if (!findDisconnected) continue; } else { if (findDisconnected) continue; ip = client.getConnection().getInetAddress().getHostAddress(); if (!ip.equals(IpAdress)) continue; } name = player.getName(); CharactersFound += 1; StringUtil.append(replyMSG, "<tr><td width=80><a action=\"bypass -h admin_character_list ", name, "\">", name, "</a></td><td width=110>", player.getTemplate().className, "</td><td width=40>", String.valueOf(player.getLevel()), "</td></tr>"); if (CharactersFound > 20) break; } adminReply.replace("%results%", replyMSG.toString()); final String replyMSG2; if (CharactersFound == 0) replyMSG2 = "s. Maybe they got d/c? :)"; else if (CharactersFound > 20) { adminReply.replace("%number%", " more than " + CharactersFound); replyMSG2 = "s.<br>In order to avoid you a client crash I won't <br1>display results beyond the 20th character."; } else replyMSG2 = CharactersFound == 1 ? "." : "s."; adminReply.replace("%ip%", IpAdress); adminReply.replace("%number%", String.valueOf(CharactersFound)); adminReply.replace("%end%", replyMSG2); activeChar.sendPacket(adminReply); } /** * @param activeChar * @param characterName * @throws IllegalArgumentException */ private static void findCharactersPerAccount(final L2PcInstance activeChar, final String characterName) throws IllegalArgumentException { if (Util.isValidPlayerName(characterName)) { String account = null; final Map<Integer, String> chars; final L2PcInstance player = L2World.getInstance().getPlayer(characterName); if (player == null) throw new IllegalArgumentException("Player doesn't exist."); chars = player.getAccountChars(); account = player.getAccountName(); final TextBuilder replyMSG = new TextBuilder(); final NpcHtmlMessage adminReply = new NpcHtmlMessage(5); adminReply.setFile(StaticHtmPath.AdminHtmPath + "accountinfo.htm", activeChar); for (final String charname : chars.values()) replyMSG.append(charname).append("<br1>"); adminReply.replace("%characters%", replyMSG.toString()); adminReply.replace("%account%", account); adminReply.replace("%player%", characterName); activeChar.sendPacket(adminReply); } else throw new IllegalArgumentException("Malformed character name."); } /** * @param activeChar * @param multibox */ private static void findDualbox(final L2PcInstance activeChar, final int multibox) { final Collection<L2PcInstance> allPlayers = L2World.getInstance().getAllPlayers().values(); final L2PcInstance[] players = allPlayers.toArray(new L2PcInstance[allPlayers.size()]); final Map<String, List<L2PcInstance>> ipMap = new HashMap<>(); String ip = "0.0.0.0"; L2GameClient client; final Map<String, Integer> dualboxIPs = new HashMap<>(); for (final L2PcInstance player : players) { client = player.getClient(); if (client == null || client.isDetached()) continue; ip = client.getConnection().getInetAddress().getHostAddress(); if (ipMap.get(ip) == null) ipMap.put(ip, new ArrayList<L2PcInstance>()); ipMap.get(ip).add(player); if (ipMap.get(ip).size() >= multibox) { final Integer count = dualboxIPs.get(ip); if (count == null) dualboxIPs.put(ip, multibox); else dualboxIPs.put(ip, count + 1); } } final List<String> keys = new ArrayList<>(dualboxIPs.keySet()); Collections.sort(keys, new Comparator<String>() { @Override public int compare(final String left, final String right) { return dualboxIPs.get(left).compareTo(dualboxIPs.get(right)); } }); Collections.reverse(keys); final StringBuilder results = new StringBuilder(); for (final String dualboxIP : keys) StringUtil.append(results, "<a action=\"bypass -h admin_find_ip " + dualboxIP + "\">" + dualboxIP + " (" + dualboxIPs.get(dualboxIP) + ")</a><br1>"); final NpcHtmlMessage adminReply = new NpcHtmlMessage(5); adminReply.setFile(StaticHtmPath.AdminHtmPath + "dualbox.htm", activeChar); adminReply.replace("%multibox%", String.valueOf(multibox)); adminReply.replace("%results%", results.toString()); adminReply.replace("%strict%", ""); activeChar.sendPacket(adminReply); } private static void gatherSummonInfo(final L2Summon target, final L2PcInstance activeChar) { final NpcHtmlMessage html = new NpcHtmlMessage(0); html.setFile(StaticHtmPath.AdminHtmPath + "petinfo.htm", activeChar); final String name = target.getName(); html.replace("%name%", name == null ? "N/A" : name); html.replace("%level%", Integer.toString(target.getLevel())); html.replace("%exp%", Long.toString(target.getStat().getExp())); final String owner = target.getActingPlayer().getName(); html.replace("%owner%", " <a action=\"bypass -h admin_character_info " + owner + "\">" + owner + "</a>"); html.replace("%class%", target.getClass().getSimpleName()); html.replace("%ai%", target.hasAI() ? String.valueOf(target.getAI().getIntention().name()) : "NULL"); html.replace("%hp%", (int) target.getStatus().getCurrentHp() + "/" + target.getStat().getMaxHp()); html.replace("%mp%", (int) target.getStatus().getCurrentMp() + "/" + target.getStat().getMaxMp()); html.replace("%karma%", Integer.toString(target.getKarma())); html.replace("%undead%", target.isUndead() ? "yes" : "no"); if (target instanceof L2PetInstance) { final int objId = target.getActingPlayer().getObjectId(); html.replace("%inv%", " <a action=\"bypass admin_show_pet_inv " + objId + "\">view</a>"); } else html.replace("%inv%", "none"); if (target instanceof L2PetInstance) { html.replace("%food%", ((L2PetInstance) target).getCurrentFed() + "/" + ((L2PetInstance) target).getPetLevelData().getPetMaxFeed()); html.replace("%load%", target.getInventory().getTotalWeight() + "/" + target.getMaxLoad()); } else { html.replace("%food%", "N/A"); html.replace("%load%", "N/A"); } activeChar.sendPacket(html); } private static void gatherPartyInfo(final L2PcInstance target, final L2PcInstance activeChar) { final NpcHtmlMessage html = new NpcHtmlMessage(0); html.setFile(StaticHtmPath.AdminHtmPath + "partyinfo.htm", activeChar); final StringBuilder text = new StringBuilder(400); for (final L2PcInstance member : target.getParty().getPartyMembers()) { if (member.getParty().getPartyLeaderOID() != member.getObjectId()) { text.append("<tr><td><table width=270 border=0 cellpadding=2><tr><td width=30 align=right>"); text.append(member.getLevel()).append("</td><td width=130><a action=\"bypass -h admin_character_info ").append(member.getName()).append("\">").append(member.getName()).append("</a>"); text.append("</td><td width=110 align=right>").append(member.getClassId().toString()).append("</td></tr></table></td></tr>"); } else { text.append("<tr><td><table width=270 border=0 cellpadding=2><tr><td width=30 align=right><font color=\"LEVEL\">"); text.append(member.getLevel()).append("</td><td width=130><a action=\"bypass -h admin_character_info ").append(member.getName()).append("\">").append(member.getName()).append(" (Party leader)</a>"); text.append("</td><td width=110 align=right>").append(member.getClassId().toString()).append("</font></td></tr></table></td></tr>"); } } html.replace("%party%", text.toString()); activeChar.sendPacket(html); } }