AdminEditChar.java 47 KB

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