AdminEditChar.java 46 KB

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