AdminEditChar.java 45 KB

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