AdminEditChar.java 48 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570
  1. /*
  2. * Copyright (C) 2004-2013 L2J DataPack
  3. *
  4. * This file is part of L2J DataPack.
  5. *
  6. * L2J DataPack is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * L2J DataPack is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. package handlers.admincommandhandlers;
  20. import java.sql.Connection;
  21. import java.sql.PreparedStatement;
  22. import java.util.ArrayList;
  23. import java.util.Arrays;
  24. import java.util.Collections;
  25. import java.util.Comparator;
  26. import java.util.HashMap;
  27. import java.util.List;
  28. import java.util.Map;
  29. import java.util.StringTokenizer;
  30. import java.util.logging.Logger;
  31. import com.l2jserver.Config;
  32. import com.l2jserver.L2DatabaseFactory;
  33. import com.l2jserver.gameserver.ai.CtrlIntention;
  34. import com.l2jserver.gameserver.communitybbs.Manager.RegionBBSManager;
  35. import com.l2jserver.gameserver.datatables.CharNameTable;
  36. import com.l2jserver.gameserver.datatables.ClassListData;
  37. import com.l2jserver.gameserver.handler.IAdminCommandHandler;
  38. import com.l2jserver.gameserver.model.L2Object;
  39. import com.l2jserver.gameserver.model.L2World;
  40. import com.l2jserver.gameserver.model.actor.L2Summon;
  41. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  42. import com.l2jserver.gameserver.model.actor.instance.L2PetInstance;
  43. import com.l2jserver.gameserver.model.base.ClassId;
  44. import com.l2jserver.gameserver.network.L2GameClient;
  45. import com.l2jserver.gameserver.network.SystemMessageId;
  46. import com.l2jserver.gameserver.network.communityserver.CommunityServerThread;
  47. import com.l2jserver.gameserver.network.communityserver.writepackets.WorldInfo;
  48. import com.l2jserver.gameserver.network.serverpackets.CharInfo;
  49. import com.l2jserver.gameserver.network.serverpackets.ExBrExtraUserInfo;
  50. import com.l2jserver.gameserver.network.serverpackets.ExVoteSystemInfo;
  51. import com.l2jserver.gameserver.network.serverpackets.GMViewItemList;
  52. import com.l2jserver.gameserver.network.serverpackets.NpcHtmlMessage;
  53. import com.l2jserver.gameserver.network.serverpackets.PartySmallWindowAll;
  54. import com.l2jserver.gameserver.network.serverpackets.PartySmallWindowDeleteAll;
  55. import com.l2jserver.gameserver.network.serverpackets.SetSummonRemainTime;
  56. import com.l2jserver.gameserver.network.serverpackets.StatusUpdate;
  57. import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  58. import com.l2jserver.gameserver.network.serverpackets.UserInfo;
  59. import com.l2jserver.gameserver.util.Comparators;
  60. import com.l2jserver.gameserver.util.Util;
  61. import com.l2jserver.util.StringUtil;
  62. /**
  63. * This class handles following admin commands: - edit_character - current_player - character_list - show_characters - find_character - find_ip - find_account - rec - nokarma - setkarma - settitle - changename - setsex - setclass - fullfood - save_modifications - setcolor - settcolor - setpk -
  64. * setpvp - remove_clan_penalty - summon_info - unsummon - summon_setlvl - show_pet_inv - partyinfo
  65. * @version $Revision: 1.3.2.1.2.10 $ $Date: 2005/04/11 10:06:06 $ Typo fix, rework for admin_tracert, gatherCharacterInfo and editCharacter by Zoey76 28/02/2011
  66. */
  67. public class AdminEditChar implements IAdminCommandHandler
  68. {
  69. private static Logger _log = Logger.getLogger(AdminEditChar.class.getName());
  70. private static final String[] ADMIN_COMMANDS =
  71. {
  72. "admin_edit_character",
  73. "admin_current_player",
  74. "admin_nokarma", // this is to remove karma from selected char...
  75. "admin_setkarma", // sets karma of target char to any amount. //setkarma <karma>
  76. "admin_setfame", // sets fame of target char to any amount. //setfame <fame>
  77. "admin_character_list", // same as character_info, kept for compatibility purposes
  78. "admin_character_info", // given a player name, displays an information window
  79. "admin_show_characters",// list of characters
  80. "admin_find_character", // find a player by his name or a part of it (case-insensitive)
  81. "admin_find_ip", // find all the player connections from a given IPv4 number
  82. "admin_find_account", // list all the characters from an account (useful for GMs w/o DB access)
  83. "admin_find_dualbox", // list all the IPs with more than 1 char logged in (dualbox)
  84. "admin_strict_find_dualbox",
  85. "admin_tracert",
  86. "admin_save_modifications", // consider it deprecated...
  87. "admin_rec", // gives recommendation points
  88. "admin_settitle", // changes char title
  89. "admin_changename", // changes char name
  90. "admin_setsex", // changes characters' sex
  91. "admin_setcolor", // change charnames' color display
  92. "admin_settcolor", // change char title color
  93. "admin_setclass", // changes chars' classId
  94. "admin_setpk", // changes PK count
  95. "admin_setpvp", // changes PVP count
  96. "admin_fullfood", // fulfills a pet's food bar
  97. "admin_remove_clan_penalty", // removes clan penalties
  98. "admin_summon_info", // displays an information window about target summon
  99. "admin_unsummon",
  100. "admin_summon_setlvl",
  101. "admin_show_pet_inv",
  102. "admin_partyinfo",
  103. "admin_setnoble"
  104. };
  105. @Override
  106. public boolean useAdminCommand(String command, L2PcInstance activeChar)
  107. {
  108. if (command.equals("admin_current_player"))
  109. {
  110. showCharacterInfo(activeChar, activeChar);
  111. }
  112. else if (command.startsWith("admin_character_info"))
  113. {
  114. String[] data = command.split(" ");
  115. if ((data.length > 1))
  116. {
  117. showCharacterInfo(activeChar, L2World.getInstance().getPlayer(data[1]));
  118. }
  119. else if (activeChar.getTarget() instanceof L2PcInstance)
  120. {
  121. showCharacterInfo(activeChar, activeChar.getTarget().getActingPlayer());
  122. }
  123. else
  124. {
  125. activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET);
  126. }
  127. }
  128. else if (command.startsWith("admin_character_list"))
  129. {
  130. listCharacters(activeChar, 0);
  131. }
  132. else if (command.startsWith("admin_show_characters"))
  133. {
  134. try
  135. {
  136. String val = command.substring(22);
  137. int page = Integer.parseInt(val);
  138. listCharacters(activeChar, page);
  139. }
  140. catch (StringIndexOutOfBoundsException e)
  141. {
  142. // Case of empty page number
  143. activeChar.sendMessage("Usage: //show_characters <page_number>");
  144. }
  145. }
  146. else if (command.startsWith("admin_find_character"))
  147. {
  148. try
  149. {
  150. String val = command.substring(21);
  151. findCharacter(activeChar, val);
  152. }
  153. catch (StringIndexOutOfBoundsException e)
  154. { // Case of empty character name
  155. activeChar.sendMessage("Usage: //find_character <character_name>");
  156. listCharacters(activeChar, 0);
  157. }
  158. }
  159. else if (command.startsWith("admin_find_ip"))
  160. {
  161. try
  162. {
  163. String val = command.substring(14);
  164. findCharactersPerIp(activeChar, val);
  165. }
  166. catch (Exception e)
  167. { // Case of empty or malformed IP number
  168. activeChar.sendMessage("Usage: //find_ip <www.xxx.yyy.zzz>");
  169. listCharacters(activeChar, 0);
  170. }
  171. }
  172. else if (command.startsWith("admin_find_account"))
  173. {
  174. try
  175. {
  176. String val = command.substring(19);
  177. findCharactersPerAccount(activeChar, val);
  178. }
  179. catch (Exception e)
  180. { // Case of empty or malformed player name
  181. activeChar.sendMessage("Usage: //find_account <player_name>");
  182. listCharacters(activeChar, 0);
  183. }
  184. }
  185. else if (command.startsWith("admin_edit_character"))
  186. {
  187. String[] data = command.split(" ");
  188. if ((data.length > 1))
  189. {
  190. editCharacter(activeChar, data[1]);
  191. }
  192. else if (activeChar.getTarget() instanceof L2PcInstance)
  193. {
  194. editCharacter(activeChar, null);
  195. }
  196. else
  197. {
  198. activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET);
  199. }
  200. }
  201. // Karma control commands
  202. else if (command.equals("admin_nokarma"))
  203. {
  204. setTargetKarma(activeChar, 0);
  205. }
  206. else if (command.startsWith("admin_setkarma"))
  207. {
  208. try
  209. {
  210. String val = command.substring(15);
  211. int karma = Integer.parseInt(val);
  212. setTargetKarma(activeChar, karma);
  213. }
  214. catch (Exception e)
  215. {
  216. if (Config.DEVELOPER)
  217. {
  218. _log.warning("Set karma error: " + e);
  219. }
  220. activeChar.sendMessage("Usage: //setkarma <new_karma_value>");
  221. }
  222. }
  223. else if (command.startsWith("admin_setpk"))
  224. {
  225. try
  226. {
  227. String val = command.substring(12);
  228. int pk = Integer.parseInt(val);
  229. L2Object target = activeChar.getTarget();
  230. if (target instanceof L2PcInstance)
  231. {
  232. L2PcInstance player = (L2PcInstance) target;
  233. player.setPkKills(pk);
  234. player.broadcastUserInfo();
  235. player.sendPacket(new UserInfo(player));
  236. player.sendPacket(new ExBrExtraUserInfo(player));
  237. player.sendMessage("A GM changed your PK count to " + pk);
  238. activeChar.sendMessage(player.getName() + "'s PK count changed to " + pk);
  239. }
  240. else
  241. {
  242. activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET);
  243. }
  244. }
  245. catch (Exception e)
  246. {
  247. if (Config.DEVELOPER)
  248. {
  249. _log.warning("Set pk error: " + e);
  250. }
  251. activeChar.sendMessage("Usage: //setpk <pk_count>");
  252. }
  253. }
  254. else if (command.startsWith("admin_setpvp"))
  255. {
  256. try
  257. {
  258. String val = command.substring(13);
  259. int pvp = Integer.parseInt(val);
  260. L2Object target = activeChar.getTarget();
  261. if (target instanceof L2PcInstance)
  262. {
  263. L2PcInstance player = (L2PcInstance) target;
  264. player.setPvpKills(pvp);
  265. player.broadcastUserInfo();
  266. player.sendPacket(new UserInfo(player));
  267. player.sendPacket(new ExBrExtraUserInfo(player));
  268. player.sendMessage("A GM changed your PVP count to " + pvp);
  269. activeChar.sendMessage(player.getName() + "'s PVP count changed to " + pvp);
  270. }
  271. else
  272. {
  273. activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET);
  274. }
  275. }
  276. catch (Exception e)
  277. {
  278. if (Config.DEVELOPER)
  279. {
  280. _log.warning("Set pvp error: " + e);
  281. }
  282. activeChar.sendMessage("Usage: //setpvp <pvp_count>");
  283. }
  284. }
  285. else if (command.startsWith("admin_setfame"))
  286. {
  287. try
  288. {
  289. String val = command.substring(14);
  290. int fame = Integer.parseInt(val);
  291. L2Object target = activeChar.getTarget();
  292. if (target instanceof L2PcInstance)
  293. {
  294. L2PcInstance player = (L2PcInstance) target;
  295. player.setFame(fame);
  296. player.broadcastUserInfo();
  297. player.sendPacket(new UserInfo(player));
  298. player.sendPacket(new ExBrExtraUserInfo(player));
  299. player.sendMessage("A GM changed your Reputation points to " + fame);
  300. activeChar.sendMessage(player.getName() + "'s Fame changed to " + fame);
  301. }
  302. else
  303. {
  304. activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET);
  305. }
  306. }
  307. catch (Exception e)
  308. {
  309. if (Config.DEVELOPER)
  310. {
  311. _log.warning("Set Fame error: " + e);
  312. }
  313. activeChar.sendMessage("Usage: //setfame <new_fame_value>");
  314. }
  315. }
  316. else if (command.startsWith("admin_save_modifications"))
  317. {
  318. try
  319. {
  320. String val = command.substring(24);
  321. adminModifyCharacter(activeChar, val);
  322. }
  323. catch (StringIndexOutOfBoundsException e)
  324. { // Case of empty character name
  325. activeChar.sendMessage("Error while modifying character.");
  326. listCharacters(activeChar, 0);
  327. }
  328. }
  329. else if (command.startsWith("admin_rec"))
  330. {
  331. try
  332. {
  333. String val = command.substring(10);
  334. int recVal = Integer.parseInt(val);
  335. L2Object target = activeChar.getTarget();
  336. if (target instanceof L2PcInstance)
  337. {
  338. L2PcInstance player = (L2PcInstance) target;
  339. player.setRecomHave(recVal);
  340. player.broadcastUserInfo();
  341. player.sendPacket(new UserInfo(player));
  342. player.sendPacket(new ExBrExtraUserInfo(player));
  343. player.sendPacket(new ExVoteSystemInfo(player));
  344. player.sendMessage("A GM changed your Recommend points to " + recVal);
  345. activeChar.sendMessage(player.getName() + "'s Recommend changed to " + recVal);
  346. }
  347. else
  348. {
  349. activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET);
  350. }
  351. }
  352. catch (Exception e)
  353. {
  354. activeChar.sendMessage("Usage: //rec number");
  355. }
  356. }
  357. else if (command.startsWith("admin_setclass"))
  358. {
  359. try
  360. {
  361. String val = command.substring(15).trim();
  362. int classidval = Integer.parseInt(val);
  363. L2Object target = activeChar.getTarget();
  364. L2PcInstance player = null;
  365. if (target instanceof L2PcInstance)
  366. {
  367. player = (L2PcInstance) target;
  368. }
  369. else
  370. {
  371. return false;
  372. }
  373. boolean valid = false;
  374. for (ClassId classid : ClassId.values())
  375. {
  376. if (classidval == classid.getId())
  377. {
  378. valid = true;
  379. }
  380. }
  381. if (valid && (player.getClassId().getId() != classidval))
  382. {
  383. player.setClassId(classidval);
  384. if (!player.isSubClassActive())
  385. {
  386. player.setBaseClass(classidval);
  387. }
  388. String newclass = ClassListData.getInstance().getClass(player.getClassId()).getClassName();
  389. player.storeMe();
  390. player.sendMessage("A GM changed your class to " + newclass + ".");
  391. player.broadcastUserInfo();
  392. activeChar.sendMessage(player.getName() + " is a " + newclass + ".");
  393. }
  394. else
  395. {
  396. activeChar.sendMessage("Usage: //setclass <valid_new_classid>");
  397. }
  398. }
  399. catch (StringIndexOutOfBoundsException e)
  400. {
  401. AdminHtml.showAdminHtml(activeChar, "charclasses.htm");
  402. }
  403. catch (NumberFormatException e)
  404. {
  405. activeChar.sendMessage("Usage: //setclass <valid_new_classid>");
  406. }
  407. }
  408. else if (command.startsWith("admin_settitle"))
  409. {
  410. try
  411. {
  412. String val = command.substring(15);
  413. L2Object target = activeChar.getTarget();
  414. L2PcInstance player = null;
  415. if (target instanceof L2PcInstance)
  416. {
  417. player = (L2PcInstance) target;
  418. }
  419. else
  420. {
  421. return false;
  422. }
  423. player.setTitle(val);
  424. player.sendMessage("Your title has been changed by a GM");
  425. player.broadcastTitleInfo();
  426. }
  427. catch (StringIndexOutOfBoundsException e)
  428. { // Case of empty character title
  429. activeChar.sendMessage("You need to specify the new title.");
  430. }
  431. }
  432. else if (command.startsWith("admin_changename"))
  433. {
  434. try
  435. {
  436. String val = command.substring(17);
  437. L2Object target = activeChar.getTarget();
  438. L2PcInstance player = null;
  439. if (target instanceof L2PcInstance)
  440. {
  441. player = (L2PcInstance) target;
  442. }
  443. else
  444. {
  445. return false;
  446. }
  447. if (CharNameTable.getInstance().getIdByName(val) > 0)
  448. {
  449. activeChar.sendMessage("Warning, player " + val + " already exists");
  450. return false;
  451. }
  452. player.setName(val);
  453. player.storeMe();
  454. activeChar.sendMessage("Changed name to " + val);
  455. player.sendMessage("Your name has been changed by a GM.");
  456. player.broadcastUserInfo();
  457. CommunityServerThread.getInstance().sendPacket(new WorldInfo(player, null, WorldInfo.TYPE_UPDATE_PLAYER_DATA));
  458. if (player.isInParty())
  459. {
  460. // Delete party window for other party members
  461. player.getParty().broadcastToPartyMembers(player, PartySmallWindowDeleteAll.STATIC_PACKET);
  462. for (L2PcInstance member : player.getParty().getMembers())
  463. {
  464. // And re-add
  465. if (member != player)
  466. {
  467. member.sendPacket(new PartySmallWindowAll(member, player.getParty()));
  468. }
  469. }
  470. }
  471. if (player.getClan() != null)
  472. {
  473. player.getClan().broadcastClanStatus();
  474. }
  475. RegionBBSManager.getInstance().changeCommunityBoard();
  476. }
  477. catch (StringIndexOutOfBoundsException e)
  478. { // Case of empty character name
  479. activeChar.sendMessage("Usage: //setname new_name_for_target");
  480. }
  481. }
  482. else if (command.startsWith("admin_setsex"))
  483. {
  484. L2Object target = activeChar.getTarget();
  485. L2PcInstance player = null;
  486. if (target instanceof L2PcInstance)
  487. {
  488. player = (L2PcInstance) target;
  489. }
  490. else
  491. {
  492. return false;
  493. }
  494. player.getAppearance().setSex(player.getAppearance().getSex() ? false : true);
  495. player.sendMessage("Your gender has been changed by a GM");
  496. player.broadcastUserInfo();
  497. }
  498. else if (command.startsWith("admin_setcolor"))
  499. {
  500. try
  501. {
  502. String val = command.substring(15);
  503. L2Object target = activeChar.getTarget();
  504. L2PcInstance player = null;
  505. if (target instanceof L2PcInstance)
  506. {
  507. player = (L2PcInstance) target;
  508. }
  509. else
  510. {
  511. return false;
  512. }
  513. player.getAppearance().setNameColor(Integer.decode("0x" + val));
  514. player.sendMessage("Your name color has been changed by a GM");
  515. player.broadcastUserInfo();
  516. }
  517. catch (Exception e)
  518. { // Case of empty color or invalid hex string
  519. activeChar.sendMessage("You need to specify a valid new color.");
  520. }
  521. }
  522. else if (command.startsWith("admin_settcolor"))
  523. {
  524. try
  525. {
  526. String val = command.substring(16);
  527. L2Object target = activeChar.getTarget();
  528. L2PcInstance player = null;
  529. if (target instanceof L2PcInstance)
  530. {
  531. player = (L2PcInstance) target;
  532. }
  533. else
  534. {
  535. return false;
  536. }
  537. player.getAppearance().setTitleColor(Integer.decode("0x" + val));
  538. player.sendMessage("Your title color has been changed by a GM");
  539. player.broadcastUserInfo();
  540. }
  541. catch (Exception e)
  542. { // Case of empty color or invalid hex string
  543. activeChar.sendMessage("You need to specify a valid new color.");
  544. }
  545. }
  546. else if (command.startsWith("admin_fullfood"))
  547. {
  548. L2Object target = activeChar.getTarget();
  549. if (target instanceof L2PetInstance)
  550. {
  551. L2PetInstance targetPet = (L2PetInstance) target;
  552. targetPet.setCurrentFed(targetPet.getMaxFed());
  553. targetPet.sendPacket(new SetSummonRemainTime(targetPet.getMaxFed(), targetPet.getCurrentFed()));
  554. }
  555. else
  556. {
  557. activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET);
  558. }
  559. }
  560. else if (command.startsWith("admin_remove_clan_penalty"))
  561. {
  562. try
  563. {
  564. StringTokenizer st = new StringTokenizer(command, " ");
  565. if (st.countTokens() != 3)
  566. {
  567. activeChar.sendMessage("Usage: //remove_clan_penalty join|create charname");
  568. return false;
  569. }
  570. st.nextToken();
  571. boolean changeCreateExpiryTime = st.nextToken().equalsIgnoreCase("create");
  572. String playerName = st.nextToken();
  573. L2PcInstance player = null;
  574. player = L2World.getInstance().getPlayer(playerName);
  575. if (player == null)
  576. {
  577. Connection con = L2DatabaseFactory.getInstance().getConnection();
  578. PreparedStatement ps = con.prepareStatement("UPDATE characters SET " + (changeCreateExpiryTime ? "clan_create_expiry_time" : "clan_join_expiry_time") + " WHERE char_name=? LIMIT 1");
  579. ps.setString(1, playerName);
  580. ps.execute();
  581. }
  582. else
  583. {
  584. // removing penalty
  585. if (changeCreateExpiryTime)
  586. {
  587. player.setClanCreateExpiryTime(0);
  588. }
  589. else
  590. {
  591. player.setClanJoinExpiryTime(0);
  592. }
  593. }
  594. activeChar.sendMessage("Clan penalty successfully removed to character: " + playerName);
  595. }
  596. catch (Exception e)
  597. {
  598. e.printStackTrace();
  599. }
  600. }
  601. else if (command.startsWith("admin_find_dualbox"))
  602. {
  603. int multibox = 2;
  604. try
  605. {
  606. String val = command.substring(19);
  607. multibox = Integer.parseInt(val);
  608. if (multibox < 1)
  609. {
  610. activeChar.sendMessage("Usage: //find_dualbox [number > 0]");
  611. return false;
  612. }
  613. }
  614. catch (Exception e)
  615. {
  616. }
  617. findDualbox(activeChar, multibox);
  618. }
  619. else if (command.startsWith("admin_strict_find_dualbox"))
  620. {
  621. int multibox = 2;
  622. try
  623. {
  624. String val = command.substring(26);
  625. multibox = Integer.parseInt(val);
  626. if (multibox < 1)
  627. {
  628. activeChar.sendMessage("Usage: //strict_find_dualbox [number > 0]");
  629. return false;
  630. }
  631. }
  632. catch (Exception e)
  633. {
  634. }
  635. findDualboxStrict(activeChar, multibox);
  636. }
  637. else if (command.startsWith("admin_tracert"))
  638. {
  639. String[] data = command.split(" ");
  640. L2PcInstance pl = null;
  641. if ((data.length > 1))
  642. {
  643. pl = L2World.getInstance().getPlayer(data[1]);
  644. }
  645. else
  646. {
  647. L2Object target = activeChar.getTarget();
  648. if (target instanceof L2PcInstance)
  649. {
  650. pl = (L2PcInstance) target;
  651. }
  652. }
  653. if (pl == null)
  654. {
  655. activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET);
  656. return false;
  657. }
  658. final L2GameClient client = pl.getClient();
  659. if (client == null)
  660. {
  661. activeChar.sendMessage("Client is null.");
  662. return false;
  663. }
  664. if (client.isDetached())
  665. {
  666. activeChar.sendMessage("Client is detached.");
  667. return false;
  668. }
  669. String ip;
  670. int[][] trace = client.getTrace();
  671. for (int i = 0; i < trace.length; i++)
  672. {
  673. ip = "";
  674. for (int o = 0; o < trace[0].length; o++)
  675. {
  676. ip = ip + trace[i][o];
  677. if (o != (trace[0].length - 1))
  678. {
  679. ip = ip + ".";
  680. }
  681. }
  682. activeChar.sendMessage("Hop" + i + ": " + ip);
  683. }
  684. }
  685. else if (command.startsWith("admin_summon_info"))
  686. {
  687. L2Object target = activeChar.getTarget();
  688. if (target instanceof L2Summon)
  689. {
  690. gatherSummonInfo((L2Summon) target, activeChar);
  691. }
  692. else
  693. {
  694. activeChar.sendMessage("Invalid target.");
  695. }
  696. }
  697. else if (command.startsWith("admin_unsummon"))
  698. {
  699. L2Object target = activeChar.getTarget();
  700. if (target instanceof L2Summon)
  701. {
  702. ((L2Summon) target).unSummon(((L2Summon) target).getOwner());
  703. }
  704. else
  705. {
  706. activeChar.sendMessage("Usable only with Pets/Summons");
  707. }
  708. }
  709. else if (command.startsWith("admin_summon_setlvl"))
  710. {
  711. L2Object target = activeChar.getTarget();
  712. if (target instanceof L2PetInstance)
  713. {
  714. L2PetInstance pet = (L2PetInstance) target;
  715. try
  716. {
  717. String val = command.substring(20);
  718. int level = Integer.parseInt(val);
  719. long newexp, oldexp = 0;
  720. oldexp = pet.getStat().getExp();
  721. newexp = pet.getStat().getExpForLevel(level);
  722. if (oldexp > newexp)
  723. {
  724. pet.getStat().removeExp(oldexp - newexp);
  725. }
  726. else if (oldexp < newexp)
  727. {
  728. pet.getStat().addExp(newexp - oldexp);
  729. }
  730. }
  731. catch (Exception e)
  732. {
  733. }
  734. }
  735. else
  736. {
  737. activeChar.sendMessage("Usable only with Pets");
  738. }
  739. }
  740. else if (command.startsWith("admin_show_pet_inv"))
  741. {
  742. String val;
  743. int objId;
  744. L2Object target;
  745. try
  746. {
  747. val = command.substring(19);
  748. objId = Integer.parseInt(val);
  749. target = L2World.getInstance().getPet(objId);
  750. }
  751. catch (Exception e)
  752. {
  753. target = activeChar.getTarget();
  754. }
  755. if (target instanceof L2PetInstance)
  756. {
  757. activeChar.sendPacket(new GMViewItemList((L2PetInstance) target));
  758. }
  759. else
  760. {
  761. activeChar.sendMessage("Usable only with Pets");
  762. }
  763. }
  764. else if (command.startsWith("admin_partyinfo"))
  765. {
  766. String val;
  767. L2Object target;
  768. try
  769. {
  770. val = command.substring(16);
  771. target = L2World.getInstance().getPlayer(val);
  772. if (target == null)
  773. {
  774. target = activeChar.getTarget();
  775. }
  776. }
  777. catch (Exception e)
  778. {
  779. target = activeChar.getTarget();
  780. }
  781. if (target instanceof L2PcInstance)
  782. {
  783. if (((L2PcInstance) target).isInParty())
  784. {
  785. gatherPartyInfo((L2PcInstance) target, activeChar);
  786. }
  787. else
  788. {
  789. activeChar.sendMessage("Not in party.");
  790. }
  791. }
  792. else
  793. {
  794. activeChar.sendMessage("Invalid target.");
  795. }
  796. }
  797. else if (command.equals("admin_setnoble"))
  798. {
  799. L2PcInstance player = null;
  800. if (activeChar.getTarget() == null)
  801. {
  802. player = activeChar;
  803. }
  804. else if ((activeChar.getTarget() != null) && (activeChar.getTarget() instanceof L2PcInstance))
  805. {
  806. player = (L2PcInstance) activeChar.getTarget();
  807. }
  808. if (player != null)
  809. {
  810. player.setNoble(!player.isNoble());
  811. if (player.getObjectId() != activeChar.getObjectId())
  812. {
  813. activeChar.sendMessage("You've changed nobless status of: " + player.getName());
  814. }
  815. player.sendMessage("GM changed your nobless status!");
  816. }
  817. }
  818. return true;
  819. }
  820. @Override
  821. public String[] getAdminCommandList()
  822. {
  823. return ADMIN_COMMANDS;
  824. }
  825. private void listCharacters(L2PcInstance activeChar, int page)
  826. {
  827. L2PcInstance[] players = L2World.getInstance().getPlayersSortedBy(Comparators.PLAYER_UPTIME_COMPARATOR);
  828. int maxCharactersPerPage = 20;
  829. int maxPages = players.length / maxCharactersPerPage;
  830. if (players.length > (maxCharactersPerPage * maxPages))
  831. {
  832. maxPages++;
  833. }
  834. // Check if number of users changed
  835. if (page > maxPages)
  836. {
  837. page = maxPages;
  838. }
  839. int charactersStart = maxCharactersPerPage * page;
  840. int charactersEnd = players.length;
  841. if ((charactersEnd - charactersStart) > maxCharactersPerPage)
  842. {
  843. charactersEnd = charactersStart + maxCharactersPerPage;
  844. }
  845. final NpcHtmlMessage adminReply = new NpcHtmlMessage();
  846. adminReply.setFile(activeChar.getHtmlPrefix(), "data/html/admin/charlist.htm");
  847. final StringBuilder replyMSG = new StringBuilder(1000);
  848. for (int x = 0; x < maxPages; x++)
  849. {
  850. int pagenr = x + 1;
  851. StringUtil.append(replyMSG, "<center><a action=\"bypass -h admin_show_characters ", String.valueOf(x), "\">Page ", String.valueOf(pagenr), "</a></center>");
  852. }
  853. adminReply.replace("%pages%", replyMSG.toString());
  854. replyMSG.setLength(0);
  855. for (int i = charactersStart; i < charactersEnd; i++)
  856. {
  857. // Add player info into new Table row
  858. StringUtil.append(replyMSG, "<tr><td width=80><a action=\"bypass -h admin_character_info ", players[i].getName(), "\">", players[i].getName(), "</a></td><td width=110>", ClassListData.getInstance().getClass(players[i].getClassId()).getClientCode(), "</td><td width=40>", String.valueOf(players[i].getLevel()), "</td></tr>");
  859. }
  860. adminReply.replace("%players%", replyMSG.toString());
  861. activeChar.sendPacket(adminReply);
  862. }
  863. private void showCharacterInfo(L2PcInstance activeChar, L2PcInstance player)
  864. {
  865. if (player == null)
  866. {
  867. L2Object target = activeChar.getTarget();
  868. if (target instanceof L2PcInstance)
  869. {
  870. player = (L2PcInstance) target;
  871. }
  872. else
  873. {
  874. return;
  875. }
  876. }
  877. else
  878. {
  879. activeChar.setTarget(player);
  880. }
  881. gatherCharacterInfo(activeChar, player, "charinfo.htm");
  882. }
  883. /**
  884. * Retrieve and replace player's info in filename htm file, sends it to activeChar as NpcHtmlMessage.
  885. * @param activeChar
  886. * @param player
  887. * @param filename
  888. */
  889. private void gatherCharacterInfo(L2PcInstance activeChar, L2PcInstance player, String filename)
  890. {
  891. String ip = "N/A";
  892. if (player == null)
  893. {
  894. activeChar.sendMessage("Player is null.");
  895. return;
  896. }
  897. final L2GameClient client = player.getClient();
  898. if (client == null)
  899. {
  900. activeChar.sendMessage("Client is null.");
  901. }
  902. else if (client.isDetached())
  903. {
  904. activeChar.sendMessage("Client is detached.");
  905. }
  906. else
  907. {
  908. ip = client.getConnection().getInetAddress().getHostAddress();
  909. }
  910. final NpcHtmlMessage adminReply = new NpcHtmlMessage();
  911. adminReply.setFile(activeChar.getHtmlPrefix(), "data/html/admin/" + filename);
  912. adminReply.replace("%name%", player.getName());
  913. adminReply.replace("%level%", String.valueOf(player.getLevel()));
  914. adminReply.replace("%clan%", String.valueOf(player.getClan() != null ? "<a action=\"bypass -h admin_clan_info " + player.getObjectId() + "\">" + player.getClan().getName() + "</a>" : null));
  915. adminReply.replace("%xp%", String.valueOf(player.getExp()));
  916. adminReply.replace("%sp%", String.valueOf(player.getSp()));
  917. adminReply.replace("%class%", ClassListData.getInstance().getClass(player.getClassId()).getClientCode());
  918. adminReply.replace("%ordinal%", String.valueOf(player.getClassId().ordinal()));
  919. adminReply.replace("%classid%", String.valueOf(player.getClassId()));
  920. adminReply.replace("%baseclass%", ClassListData.getInstance().getClass(player.getBaseClass()).getClientCode());
  921. adminReply.replace("%x%", String.valueOf(player.getX()));
  922. adminReply.replace("%y%", String.valueOf(player.getY()));
  923. adminReply.replace("%z%", String.valueOf(player.getZ()));
  924. adminReply.replace("%currenthp%", String.valueOf((int) player.getCurrentHp()));
  925. adminReply.replace("%maxhp%", String.valueOf(player.getMaxHp()));
  926. adminReply.replace("%karma%", String.valueOf(player.getKarma()));
  927. adminReply.replace("%currentmp%", String.valueOf((int) player.getCurrentMp()));
  928. adminReply.replace("%maxmp%", String.valueOf(player.getMaxMp()));
  929. adminReply.replace("%pvpflag%", String.valueOf(player.getPvpFlag()));
  930. adminReply.replace("%currentcp%", String.valueOf((int) player.getCurrentCp()));
  931. adminReply.replace("%maxcp%", String.valueOf(player.getMaxCp()));
  932. adminReply.replace("%pvpkills%", String.valueOf(player.getPvpKills()));
  933. adminReply.replace("%pkkills%", String.valueOf(player.getPkKills()));
  934. adminReply.replace("%currentload%", String.valueOf(player.getCurrentLoad()));
  935. adminReply.replace("%maxload%", String.valueOf(player.getMaxLoad()));
  936. adminReply.replace("%percent%", String.valueOf(Util.roundTo(((float) player.getCurrentLoad() / (float) player.getMaxLoad()) * 100, 2)));
  937. adminReply.replace("%patk%", String.valueOf(player.getPAtk(null)));
  938. adminReply.replace("%matk%", String.valueOf(player.getMAtk(null, null)));
  939. adminReply.replace("%pdef%", String.valueOf(player.getPDef(null)));
  940. adminReply.replace("%mdef%", String.valueOf(player.getMDef(null, null)));
  941. adminReply.replace("%accuracy%", String.valueOf(player.getAccuracy()));
  942. adminReply.replace("%evasion%", String.valueOf(player.getEvasionRate(null)));
  943. adminReply.replace("%critical%", String.valueOf(player.getCriticalHit(null, null)));
  944. adminReply.replace("%runspeed%", String.valueOf(player.getRunSpeed()));
  945. adminReply.replace("%patkspd%", String.valueOf(player.getPAtkSpd()));
  946. adminReply.replace("%matkspd%", String.valueOf(player.getMAtkSpd()));
  947. adminReply.replace("%access%", player.getAccessLevel().getLevel() + " (" + player.getAccessLevel().getName() + ")");
  948. adminReply.replace("%account%", player.getAccountName());
  949. adminReply.replace("%ip%", ip);
  950. adminReply.replace("%ai%", String.valueOf(player.getAI().getIntention().name()));
  951. adminReply.replace("%inst%", player.getInstanceId() > 0 ? "<tr><td>InstanceId:</td><td><a action=\"bypass -h admin_instance_spawns " + String.valueOf(player.getInstanceId()) + "\">" + String.valueOf(player.getInstanceId()) + "</a></td></tr>" : "");
  952. adminReply.replace("%noblesse%", player.isNoble() ? "Yes" : "No");
  953. activeChar.sendPacket(adminReply);
  954. }
  955. private void setTargetKarma(L2PcInstance activeChar, int newKarma)
  956. {
  957. // function to change karma of selected char
  958. L2Object target = activeChar.getTarget();
  959. L2PcInstance player = null;
  960. if (target instanceof L2PcInstance)
  961. {
  962. player = (L2PcInstance) target;
  963. }
  964. else
  965. {
  966. return;
  967. }
  968. if (newKarma >= 0)
  969. {
  970. // for display
  971. int oldKarma = player.getKarma();
  972. // update karma
  973. player.setKarma(newKarma);
  974. // Common character information
  975. SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOUR_KARMA_HAS_BEEN_CHANGED_TO_S1);
  976. sm.addNumber(newKarma);
  977. player.sendPacket(sm);
  978. // Admin information
  979. activeChar.sendMessage("Successfully Changed karma for " + player.getName() + " from (" + oldKarma + ") to (" + newKarma + ").");
  980. if (Config.DEBUG)
  981. {
  982. _log.fine("[SET KARMA] [GM]" + activeChar.getName() + " Changed karma for " + player.getName() + " from (" + oldKarma + ") to (" + newKarma + ").");
  983. }
  984. }
  985. else
  986. {
  987. // tell admin of mistake
  988. activeChar.sendMessage("You must enter a value for karma greater than or equal to 0.");
  989. if (Config.DEBUG)
  990. {
  991. _log.fine("[SET KARMA] ERROR: [GM]" + activeChar.getName() + " entered an incorrect value for new karma: " + newKarma + " for " + player.getName() + ".");
  992. }
  993. }
  994. }
  995. private void adminModifyCharacter(L2PcInstance activeChar, String modifications)
  996. {
  997. L2Object target = activeChar.getTarget();
  998. if (!(target instanceof L2PcInstance))
  999. {
  1000. return;
  1001. }
  1002. L2PcInstance player = (L2PcInstance) target;
  1003. StringTokenizer st = new StringTokenizer(modifications);
  1004. if (st.countTokens() != 6)
  1005. {
  1006. editCharacter(activeChar, null);
  1007. return;
  1008. }
  1009. String hp = st.nextToken();
  1010. String mp = st.nextToken();
  1011. String cp = st.nextToken();
  1012. String pvpflag = st.nextToken();
  1013. String pvpkills = st.nextToken();
  1014. String pkkills = st.nextToken();
  1015. int hpval = Integer.parseInt(hp);
  1016. int mpval = Integer.parseInt(mp);
  1017. int cpval = Integer.parseInt(cp);
  1018. int pvpflagval = Integer.parseInt(pvpflag);
  1019. int pvpkillsval = Integer.parseInt(pvpkills);
  1020. int pkkillsval = Integer.parseInt(pkkills);
  1021. // Common character information
  1022. player.sendMessage("Admin has changed your stats." + " HP: " + hpval + " MP: " + mpval + " CP: " + cpval + " PvP Flag: " + pvpflagval + " PvP/PK " + pvpkillsval + "/" + pkkillsval);
  1023. player.setCurrentHp(hpval);
  1024. player.setCurrentMp(mpval);
  1025. player.setCurrentCp(cpval);
  1026. player.setPvpFlag(pvpflagval);
  1027. player.setPvpKills(pvpkillsval);
  1028. player.setPkKills(pkkillsval);
  1029. // Save the changed parameters to the database.
  1030. player.storeMe();
  1031. StatusUpdate su = new StatusUpdate(player);
  1032. su.addAttribute(StatusUpdate.CUR_HP, hpval);
  1033. su.addAttribute(StatusUpdate.MAX_HP, player.getMaxHp());
  1034. su.addAttribute(StatusUpdate.CUR_MP, mpval);
  1035. su.addAttribute(StatusUpdate.MAX_MP, player.getMaxMp());
  1036. su.addAttribute(StatusUpdate.CUR_CP, cpval);
  1037. su.addAttribute(StatusUpdate.MAX_CP, player.getMaxCp());
  1038. player.sendPacket(su);
  1039. // Admin information
  1040. activeChar.sendMessage("Changed stats of " + player.getName() + "." + " HP: " + hpval + " MP: " + mpval + " CP: " + cpval + " PvP: " + pvpflagval + " / " + pvpkillsval);
  1041. if (Config.DEBUG)
  1042. {
  1043. _log.fine("[GM]" + activeChar.getName() + " changed stats of " + player.getName() + ". " + " HP: " + hpval + " MP: " + mpval + " CP: " + cpval + " PvP: " + pvpflagval + " / " + pvpkillsval);
  1044. }
  1045. showCharacterInfo(activeChar, null); // Back to start
  1046. player.broadcastPacket(new CharInfo(player));
  1047. player.sendPacket(new UserInfo(player));
  1048. player.broadcastPacket(new ExBrExtraUserInfo(player));
  1049. player.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
  1050. player.decayMe();
  1051. player.spawnMe(activeChar.getX(), activeChar.getY(), activeChar.getZ());
  1052. }
  1053. private void editCharacter(L2PcInstance activeChar, String targetName)
  1054. {
  1055. L2Object target = null;
  1056. if (targetName != null)
  1057. {
  1058. target = L2World.getInstance().getPlayer(targetName);
  1059. }
  1060. else
  1061. {
  1062. target = activeChar.getTarget();
  1063. }
  1064. if (target instanceof L2PcInstance)
  1065. {
  1066. L2PcInstance player = (L2PcInstance) target;
  1067. gatherCharacterInfo(activeChar, player, "charedit.htm");
  1068. }
  1069. }
  1070. /**
  1071. * @param activeChar
  1072. * @param CharacterToFind
  1073. */
  1074. private void findCharacter(L2PcInstance activeChar, String CharacterToFind)
  1075. {
  1076. int CharactersFound = 0;
  1077. String name;
  1078. final NpcHtmlMessage adminReply = new NpcHtmlMessage();
  1079. adminReply.setFile(activeChar.getHtmlPrefix(), "data/html/admin/charfind.htm");
  1080. final StringBuilder replyMSG = new StringBuilder(1000);
  1081. for (L2PcInstance player : L2World.getInstance().getPlayersSortedBy(Comparators.PLAYER_UPTIME_COMPARATOR))
  1082. { // Add player info into new Table row
  1083. name = player.getName();
  1084. if (name.toLowerCase().contains(CharacterToFind.toLowerCase()))
  1085. {
  1086. CharactersFound = CharactersFound + 1;
  1087. StringUtil.append(replyMSG, "<tr><td width=80><a action=\"bypass -h admin_character_info ", name, "\">", name, "</a></td><td width=110>", ClassListData.getInstance().getClass(player.getClassId()).getClientCode(), "</td><td width=40>", String.valueOf(player.getLevel()), "</td></tr>");
  1088. }
  1089. if (CharactersFound > 20)
  1090. {
  1091. break;
  1092. }
  1093. }
  1094. adminReply.replace("%results%", replyMSG.toString());
  1095. final String replyMSG2;
  1096. if (CharactersFound == 0)
  1097. {
  1098. replyMSG2 = "s. Please try again.";
  1099. }
  1100. else if (CharactersFound > 20)
  1101. {
  1102. adminReply.replace("%number%", " more than 20");
  1103. replyMSG2 = "s.<br>Please refine your search to see all of the results.";
  1104. }
  1105. else if (CharactersFound == 1)
  1106. {
  1107. replyMSG2 = ".";
  1108. }
  1109. else
  1110. {
  1111. replyMSG2 = "s.";
  1112. }
  1113. adminReply.replace("%number%", String.valueOf(CharactersFound));
  1114. adminReply.replace("%end%", replyMSG2);
  1115. activeChar.sendPacket(adminReply);
  1116. }
  1117. /**
  1118. * @param activeChar
  1119. * @param IpAdress
  1120. * @throws IllegalArgumentException
  1121. */
  1122. private void findCharactersPerIp(L2PcInstance activeChar, String IpAdress) throws IllegalArgumentException
  1123. {
  1124. boolean findDisconnected = false;
  1125. if (IpAdress.equals("disconnected"))
  1126. {
  1127. findDisconnected = true;
  1128. }
  1129. else
  1130. {
  1131. 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]))$"))
  1132. {
  1133. throw new IllegalArgumentException("Malformed IPv4 number");
  1134. }
  1135. }
  1136. int CharactersFound = 0;
  1137. L2GameClient client;
  1138. String name, ip = "0.0.0.0";
  1139. final StringBuilder replyMSG = new StringBuilder(1000);
  1140. final NpcHtmlMessage adminReply = new NpcHtmlMessage();
  1141. adminReply.setFile(activeChar.getHtmlPrefix(), "data/html/admin/ipfind.htm");
  1142. for (L2PcInstance player : L2World.getInstance().getPlayersSortedBy(Comparators.PLAYER_UPTIME_COMPARATOR))
  1143. {
  1144. client = player.getClient();
  1145. if (client == null)
  1146. {
  1147. continue;
  1148. }
  1149. if (client.isDetached())
  1150. {
  1151. if (!findDisconnected)
  1152. {
  1153. continue;
  1154. }
  1155. }
  1156. else
  1157. {
  1158. if (findDisconnected)
  1159. {
  1160. continue;
  1161. }
  1162. ip = client.getConnection().getInetAddress().getHostAddress();
  1163. if (!ip.equals(IpAdress))
  1164. {
  1165. continue;
  1166. }
  1167. }
  1168. name = player.getName();
  1169. CharactersFound = CharactersFound + 1;
  1170. StringUtil.append(replyMSG, "<tr><td width=80><a action=\"bypass -h admin_character_info ", name, "\">", name, "</a></td><td width=110>", ClassListData.getInstance().getClass(player.getClassId()).getClientCode(), "</td><td width=40>", String.valueOf(player.getLevel()), "</td></tr>");
  1171. if (CharactersFound > 20)
  1172. {
  1173. break;
  1174. }
  1175. }
  1176. adminReply.replace("%results%", replyMSG.toString());
  1177. final String replyMSG2;
  1178. if (CharactersFound == 0)
  1179. {
  1180. replyMSG2 = "s. Maybe they got d/c? :)";
  1181. }
  1182. else if (CharactersFound > 20)
  1183. {
  1184. adminReply.replace("%number%", " more than " + String.valueOf(CharactersFound));
  1185. replyMSG2 = "s.<br>In order to avoid you a client crash I won't <br1>display results beyond the 20th character.";
  1186. }
  1187. else if (CharactersFound == 1)
  1188. {
  1189. replyMSG2 = ".";
  1190. }
  1191. else
  1192. {
  1193. replyMSG2 = "s.";
  1194. }
  1195. adminReply.replace("%ip%", IpAdress);
  1196. adminReply.replace("%number%", String.valueOf(CharactersFound));
  1197. adminReply.replace("%end%", replyMSG2);
  1198. activeChar.sendPacket(adminReply);
  1199. }
  1200. /**
  1201. * @param activeChar
  1202. * @param characterName
  1203. * @throws IllegalArgumentException
  1204. */
  1205. private void findCharactersPerAccount(L2PcInstance activeChar, String characterName) throws IllegalArgumentException
  1206. {
  1207. if (characterName.matches(Config.CNAME_TEMPLATE))
  1208. {
  1209. String account = null;
  1210. Map<Integer, String> chars;
  1211. L2PcInstance player = L2World.getInstance().getPlayer(characterName);
  1212. if (player == null)
  1213. {
  1214. throw new IllegalArgumentException("Player doesn't exist");
  1215. }
  1216. chars = player.getAccountChars();
  1217. account = player.getAccountName();
  1218. final StringBuilder replyMSG = new StringBuilder(chars.size() * 20);
  1219. final NpcHtmlMessage adminReply = new NpcHtmlMessage();
  1220. adminReply.setFile(activeChar.getHtmlPrefix(), "data/html/admin/accountinfo.htm");
  1221. for (String charname : chars.values())
  1222. {
  1223. StringUtil.append(replyMSG, charname, "<br1>");
  1224. }
  1225. adminReply.replace("%characters%", replyMSG.toString());
  1226. adminReply.replace("%account%", account);
  1227. adminReply.replace("%player%", characterName);
  1228. activeChar.sendPacket(adminReply);
  1229. }
  1230. else
  1231. {
  1232. throw new IllegalArgumentException("Malformed character name");
  1233. }
  1234. }
  1235. /**
  1236. * @param activeChar
  1237. * @param multibox
  1238. */
  1239. private void findDualbox(L2PcInstance activeChar, int multibox)
  1240. {
  1241. Map<String, List<L2PcInstance>> ipMap = new HashMap<>();
  1242. String ip = "0.0.0.0";
  1243. L2GameClient client;
  1244. final Map<String, Integer> dualboxIPs = new HashMap<>();
  1245. for (L2PcInstance player : L2World.getInstance().getPlayersSortedBy(Comparators.PLAYER_UPTIME_COMPARATOR))
  1246. {
  1247. client = player.getClient();
  1248. if ((client == null) || client.isDetached())
  1249. {
  1250. continue;
  1251. }
  1252. ip = client.getConnection().getInetAddress().getHostAddress();
  1253. if (ipMap.get(ip) == null)
  1254. {
  1255. ipMap.put(ip, new ArrayList<L2PcInstance>());
  1256. }
  1257. ipMap.get(ip).add(player);
  1258. if (ipMap.get(ip).size() >= multibox)
  1259. {
  1260. Integer count = dualboxIPs.get(ip);
  1261. if (count == null)
  1262. {
  1263. dualboxIPs.put(ip, multibox);
  1264. }
  1265. else
  1266. {
  1267. dualboxIPs.put(ip, count + 1);
  1268. }
  1269. }
  1270. }
  1271. List<String> keys = new ArrayList<>(dualboxIPs.keySet());
  1272. Collections.sort(keys, new Comparator<String>()
  1273. {
  1274. @Override
  1275. public int compare(String left, String right)
  1276. {
  1277. return dualboxIPs.get(left).compareTo(dualboxIPs.get(right));
  1278. }
  1279. });
  1280. Collections.reverse(keys);
  1281. final StringBuilder results = new StringBuilder();
  1282. for (String dualboxIP : keys)
  1283. {
  1284. StringUtil.append(results, "<a action=\"bypass -h admin_find_ip " + dualboxIP + "\">" + dualboxIP + " (" + dualboxIPs.get(dualboxIP) + ")</a><br1>");
  1285. }
  1286. final NpcHtmlMessage adminReply = new NpcHtmlMessage();
  1287. adminReply.setFile(activeChar.getHtmlPrefix(), "data/html/admin/dualbox.htm");
  1288. adminReply.replace("%multibox%", String.valueOf(multibox));
  1289. adminReply.replace("%results%", results.toString());
  1290. adminReply.replace("%strict%", "");
  1291. activeChar.sendPacket(adminReply);
  1292. }
  1293. private void findDualboxStrict(L2PcInstance activeChar, int multibox)
  1294. {
  1295. Map<IpPack, List<L2PcInstance>> ipMap = new HashMap<>();
  1296. L2GameClient client;
  1297. final Map<IpPack, Integer> dualboxIPs = new HashMap<>();
  1298. for (L2PcInstance player : L2World.getInstance().getPlayersSortedBy(Comparators.PLAYER_UPTIME_COMPARATOR))
  1299. {
  1300. client = player.getClient();
  1301. if ((client == null) || client.isDetached())
  1302. {
  1303. continue;
  1304. }
  1305. IpPack pack = new IpPack(client.getConnection().getInetAddress().getHostAddress(), client.getTrace());
  1306. if (ipMap.get(pack) == null)
  1307. {
  1308. ipMap.put(pack, new ArrayList<L2PcInstance>());
  1309. }
  1310. ipMap.get(pack).add(player);
  1311. if (ipMap.get(pack).size() >= multibox)
  1312. {
  1313. Integer count = dualboxIPs.get(pack);
  1314. if (count == null)
  1315. {
  1316. dualboxIPs.put(pack, multibox);
  1317. }
  1318. else
  1319. {
  1320. dualboxIPs.put(pack, count + 1);
  1321. }
  1322. }
  1323. }
  1324. List<IpPack> keys = new ArrayList<>(dualboxIPs.keySet());
  1325. Collections.sort(keys, new Comparator<IpPack>()
  1326. {
  1327. @Override
  1328. public int compare(IpPack left, IpPack right)
  1329. {
  1330. return dualboxIPs.get(left).compareTo(dualboxIPs.get(right));
  1331. }
  1332. });
  1333. Collections.reverse(keys);
  1334. final StringBuilder results = new StringBuilder();
  1335. for (IpPack dualboxIP : keys)
  1336. {
  1337. StringUtil.append(results, "<a action=\"bypass -h admin_find_ip " + dualboxIP.ip + "\">" + dualboxIP.ip + " (" + dualboxIPs.get(dualboxIP) + ")</a><br1>");
  1338. }
  1339. final NpcHtmlMessage adminReply = new NpcHtmlMessage();
  1340. adminReply.setFile(activeChar.getHtmlPrefix(), "data/html/admin/dualbox.htm");
  1341. adminReply.replace("%multibox%", String.valueOf(multibox));
  1342. adminReply.replace("%results%", results.toString());
  1343. adminReply.replace("%strict%", "strict_");
  1344. activeChar.sendPacket(adminReply);
  1345. }
  1346. private final class IpPack
  1347. {
  1348. String ip;
  1349. int[][] tracert;
  1350. public IpPack(String ip, int[][] tracert)
  1351. {
  1352. this.ip = ip;
  1353. this.tracert = tracert;
  1354. }
  1355. @Override
  1356. public int hashCode()
  1357. {
  1358. final int prime = 31;
  1359. int result = 1;
  1360. result = (prime * result) + ((ip == null) ? 0 : ip.hashCode());
  1361. for (int[] array : tracert)
  1362. {
  1363. result = (prime * result) + Arrays.hashCode(array);
  1364. }
  1365. return result;
  1366. }
  1367. @Override
  1368. public boolean equals(Object obj)
  1369. {
  1370. if (this == obj)
  1371. {
  1372. return true;
  1373. }
  1374. if (obj == null)
  1375. {
  1376. return false;
  1377. }
  1378. if (getClass() != obj.getClass())
  1379. {
  1380. return false;
  1381. }
  1382. IpPack other = (IpPack) obj;
  1383. if (!getOuterType().equals(other.getOuterType()))
  1384. {
  1385. return false;
  1386. }
  1387. if (ip == null)
  1388. {
  1389. if (other.ip != null)
  1390. {
  1391. return false;
  1392. }
  1393. }
  1394. else if (!ip.equals(other.ip))
  1395. {
  1396. return false;
  1397. }
  1398. for (int i = 0; i < tracert.length; i++)
  1399. {
  1400. for (int o = 0; o < tracert[0].length; o++)
  1401. {
  1402. if (tracert[i][o] != other.tracert[i][o])
  1403. {
  1404. return false;
  1405. }
  1406. }
  1407. }
  1408. return true;
  1409. }
  1410. private AdminEditChar getOuterType()
  1411. {
  1412. return AdminEditChar.this;
  1413. }
  1414. }
  1415. private void gatherSummonInfo(L2Summon target, L2PcInstance activeChar)
  1416. {
  1417. final NpcHtmlMessage html = new NpcHtmlMessage();
  1418. html.setFile(activeChar.getHtmlPrefix(), "data/html/admin/petinfo.htm");
  1419. String name = target.getName();
  1420. html.replace("%name%", name == null ? "N/A" : name);
  1421. html.replace("%level%", Integer.toString(target.getLevel()));
  1422. html.replace("%exp%", Long.toString(target.getStat().getExp()));
  1423. String owner = target.getActingPlayer().getName();
  1424. html.replace("%owner%", " <a action=\"bypass -h admin_character_info " + owner + "\">" + owner + "</a>");
  1425. html.replace("%class%", target.getClass().getSimpleName());
  1426. html.replace("%ai%", target.hasAI() ? String.valueOf(target.getAI().getIntention().name()) : "NULL");
  1427. html.replace("%hp%", (int) target.getStatus().getCurrentHp() + "/" + target.getStat().getMaxHp());
  1428. html.replace("%mp%", (int) target.getStatus().getCurrentMp() + "/" + target.getStat().getMaxMp());
  1429. html.replace("%karma%", Integer.toString(target.getKarma()));
  1430. html.replace("%undead%", target.isUndead() ? "yes" : "no");
  1431. if (target instanceof L2PetInstance)
  1432. {
  1433. int objId = target.getActingPlayer().getObjectId();
  1434. html.replace("%inv%", " <a action=\"bypass admin_show_pet_inv " + objId + "\">view</a>");
  1435. }
  1436. else
  1437. {
  1438. html.replace("%inv%", "none");
  1439. }
  1440. if (target instanceof L2PetInstance)
  1441. {
  1442. html.replace("%food%", ((L2PetInstance) target).getCurrentFed() + "/" + ((L2PetInstance) target).getPetLevelData().getPetMaxFeed());
  1443. html.replace("%load%", ((L2PetInstance) target).getInventory().getTotalWeight() + "/" + ((L2PetInstance) target).getMaxLoad());
  1444. }
  1445. else
  1446. {
  1447. html.replace("%food%", "N/A");
  1448. html.replace("%load%", "N/A");
  1449. }
  1450. activeChar.sendPacket(html);
  1451. }
  1452. private void gatherPartyInfo(L2PcInstance target, L2PcInstance activeChar)
  1453. {
  1454. boolean color = true;
  1455. final NpcHtmlMessage html = new NpcHtmlMessage();
  1456. html.setFile(activeChar.getHtmlPrefix(), "data/html/admin/partyinfo.htm");
  1457. StringBuilder text = new StringBuilder(400);
  1458. for (L2PcInstance member : target.getParty().getMembers())
  1459. {
  1460. if (color)
  1461. {
  1462. text.append("<tr><td><table width=270 border=0 bgcolor=131210 cellpadding=2><tr><td width=30 align=right>");
  1463. }
  1464. else
  1465. {
  1466. text.append("<tr><td><table width=270 border=0 cellpadding=2><tr><td width=30 align=right>");
  1467. }
  1468. text.append(member.getLevel() + "</td><td width=130><a action=\"bypass -h admin_character_info " + member.getName() + "\">" + member.getName() + "</a>");
  1469. text.append("</td><td width=110 align=right>" + member.getClassId().toString() + "</td></tr></table></td></tr>");
  1470. color = !color;
  1471. }
  1472. html.replace("%player%", target.getName());
  1473. html.replace("%party%", text.toString());
  1474. activeChar.sendPacket(html);
  1475. }
  1476. }