AdminEditChar.java 47 KB

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