AdminEditChar.java 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744
  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 net.sf.l2j.gameserver.handler.admincommandhandlers;
  16. import java.util.Collection;
  17. import java.util.Map;
  18. import java.util.StringTokenizer;
  19. import java.util.logging.Logger;
  20. import javolution.text.TextBuilder;
  21. import net.sf.l2j.Config;
  22. import net.sf.l2j.gameserver.ai.CtrlIntention;
  23. import net.sf.l2j.gameserver.communitybbs.Manager.RegionBBSManager;
  24. import net.sf.l2j.gameserver.datatables.ClanTable;
  25. import net.sf.l2j.gameserver.handler.IAdminCommandHandler;
  26. import net.sf.l2j.gameserver.model.L2Object;
  27. import net.sf.l2j.gameserver.model.L2World;
  28. import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  29. import net.sf.l2j.gameserver.model.actor.instance.L2PetInstance;
  30. import net.sf.l2j.gameserver.model.base.ClassId;
  31. import net.sf.l2j.gameserver.network.SystemMessageId;
  32. import net.sf.l2j.gameserver.network.serverpackets.CharInfo;
  33. import net.sf.l2j.gameserver.network.serverpackets.NpcHtmlMessage;
  34. import net.sf.l2j.gameserver.network.serverpackets.PartySmallWindowAll;
  35. import net.sf.l2j.gameserver.network.serverpackets.PartySmallWindowDeleteAll;
  36. import net.sf.l2j.gameserver.network.serverpackets.StatusUpdate;
  37. import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
  38. import net.sf.l2j.gameserver.network.serverpackets.UserInfo;
  39. import net.sf.l2j.gameserver.util.Util;
  40. /**
  41. * This class handles following admin commands:
  42. * - edit_character
  43. * - current_player
  44. * - character_list
  45. * - show_characters
  46. * - find_character
  47. * - find_ip
  48. * - find_account
  49. * - rec
  50. * - nokarma
  51. * - setkarma
  52. * - settitle
  53. * - changename
  54. * - setsex
  55. * - setclass
  56. * - fullfood
  57. * - save_modifications
  58. *
  59. * @version $Revision: 1.3.2.1.2.10 $ $Date: 2005/04/11 10:06:06 $
  60. */
  61. public class AdminEditChar implements IAdminCommandHandler
  62. {
  63. private static Logger _log = Logger.getLogger(AdminEditChar.class.getName());
  64. private static final String[] ADMIN_COMMANDS =
  65. {
  66. "admin_edit_character", "admin_current_player", "admin_nokarma", // this is to remove karma from selected char...
  67. "admin_setkarma", // sets karma of target char to any amount. //setkarma <karma>
  68. "admin_character_list", //same as character_info, kept for compatibility purposes
  69. "admin_character_info", //given a player name, displays an information window
  70. "admin_show_characters",//list of characters
  71. "admin_find_character", //find a player by his name or a part of it (case-insensitive)
  72. "admin_find_ip", // find all the player connections from a given IPv4 number
  73. "admin_find_account", //list all the characters from an account (useful for GMs w/o DB access)
  74. "admin_save_modifications", //consider it deprecated...
  75. "admin_rec", // gives recommendation points
  76. "admin_settitle", // changes char title
  77. "admin_setname", // changes char name
  78. "admin_setsex", // changes characters' sex
  79. "admin_setcolor", // change charnames' color display
  80. "admin_setclass", // changes chars' classId
  81. "admin_fullfood" // fulfills a pet's food bar
  82. };
  83. public boolean useAdminCommand(String command, L2PcInstance activeChar)
  84. {
  85. if (command.equals("admin_current_player"))
  86. {
  87. showCharacterInfo(activeChar, null);
  88. }
  89. else if ((command.startsWith("admin_character_list")) || (command.startsWith("admin_character_info")))
  90. {
  91. try
  92. {
  93. String val = command.substring(21);
  94. L2PcInstance target = L2World.getInstance().getPlayer(val);
  95. if (target != null)
  96. showCharacterInfo(activeChar, target);
  97. else
  98. activeChar.sendPacket(new SystemMessage(SystemMessageId.CHARACTER_DOES_NOT_EXIST));
  99. }
  100. catch (StringIndexOutOfBoundsException e)
  101. {
  102. activeChar.sendMessage("Usage: //character_info <player_name>");
  103. }
  104. }
  105. else if (command.startsWith("admin_show_characters"))
  106. {
  107. try
  108. {
  109. String val = command.substring(22);
  110. int page = Integer.parseInt(val);
  111. listCharacters(activeChar, page);
  112. }
  113. catch (StringIndexOutOfBoundsException e)
  114. {
  115. //Case of empty page number
  116. activeChar.sendMessage("Usage: //show_characters <page_number>");
  117. }
  118. }
  119. else if (command.startsWith("admin_find_character"))
  120. {
  121. try
  122. {
  123. String val = command.substring(21);
  124. findCharacter(activeChar, val);
  125. }
  126. catch (StringIndexOutOfBoundsException e)
  127. { //Case of empty character name
  128. activeChar.sendMessage("Usage: //find_character <character_name>");
  129. listCharacters(activeChar, 0);
  130. }
  131. }
  132. else if (command.startsWith("admin_find_ip"))
  133. {
  134. try
  135. {
  136. String val = command.substring(14);
  137. findCharactersPerIp(activeChar, val);
  138. }
  139. catch (Exception e)
  140. { //Case of empty or malformed IP number
  141. activeChar.sendMessage("Usage: //find_ip <www.xxx.yyy.zzz>");
  142. listCharacters(activeChar, 0);
  143. }
  144. }
  145. else if (command.startsWith("admin_find_account"))
  146. {
  147. try
  148. {
  149. String val = command.substring(19);
  150. findCharactersPerAccount(activeChar, val);
  151. }
  152. catch (Exception e)
  153. { //Case of empty or malformed player name
  154. activeChar.sendMessage("Usage: //find_account <player_name>");
  155. listCharacters(activeChar, 0);
  156. }
  157. }
  158. else if (command.equals("admin_edit_character"))
  159. editCharacter(activeChar);
  160. // Karma control commands
  161. else if (command.equals("admin_nokarma"))
  162. setTargetKarma(activeChar, 0);
  163. else if (command.startsWith("admin_setkarma"))
  164. {
  165. try
  166. {
  167. String val = command.substring(15);
  168. int karma = Integer.parseInt(val);
  169. setTargetKarma(activeChar, karma);
  170. }
  171. catch (Exception e)
  172. {
  173. if (Config.DEVELOPER)
  174. _log.warning("Set karma error: " + e);
  175. activeChar.sendMessage("Usage: //setkarma <new_karma_value>");
  176. }
  177. }
  178. else if (command.startsWith("admin_save_modifications"))
  179. {
  180. try
  181. {
  182. String val = command.substring(24);
  183. adminModifyCharacter(activeChar, val);
  184. }
  185. catch (StringIndexOutOfBoundsException e)
  186. { //Case of empty character name
  187. activeChar.sendMessage("Error while modifying character.");
  188. listCharacters(activeChar, 0);
  189. }
  190. }
  191. else if (command.startsWith("admin_rec"))
  192. {
  193. try
  194. {
  195. String val = command.substring(10);
  196. int recVal = Integer.parseInt(val);
  197. L2Object target = activeChar.getTarget();
  198. L2PcInstance player = null;
  199. if (target instanceof L2PcInstance)
  200. {
  201. player = (L2PcInstance) target;
  202. }
  203. else
  204. {
  205. return false;
  206. }
  207. player.setRecomHave(recVal);
  208. player.sendMessage("You have been recommended by a GM");
  209. player.broadcastUserInfo();
  210. }
  211. catch (Exception e)
  212. {
  213. activeChar.sendMessage("Usage: //rec number");
  214. }
  215. }
  216. else if (command.startsWith("admin_setclass"))
  217. {
  218. try
  219. {
  220. String val = command.substring(15);
  221. int classidval = Integer.parseInt(val);
  222. L2Object target = activeChar.getTarget();
  223. L2PcInstance player = null;
  224. if (target instanceof L2PcInstance)
  225. player = (L2PcInstance) target;
  226. else
  227. return false;
  228. boolean valid = false;
  229. for (ClassId classid : ClassId.values())
  230. if (classidval == classid.getId())
  231. valid = true;
  232. if (valid && (player.getClassId().getId() != classidval))
  233. {
  234. player.setClassId(classidval);
  235. if (!player.isSubClassActive())
  236. player.setBaseClass(classidval);
  237. String newclass = player.getTemplate().className;
  238. player.store();
  239. player.sendMessage("A GM changed your class to " + newclass);
  240. player.broadcastUserInfo();
  241. activeChar.sendMessage(player.getName() + " is a " + newclass);
  242. }
  243. activeChar.sendMessage("Usage: //setclass <valid_new_classid>");
  244. }
  245. catch (StringIndexOutOfBoundsException e)
  246. {
  247. AdminHelpPage.showHelpPage(activeChar, "charclasses.htm");
  248. }
  249. }
  250. else if (command.startsWith("admin_settitle"))
  251. {
  252. try
  253. {
  254. String val = command.substring(15);
  255. L2Object target = activeChar.getTarget();
  256. L2PcInstance player = null;
  257. if (target instanceof L2PcInstance)
  258. {
  259. player = (L2PcInstance) target;
  260. }
  261. else
  262. {
  263. return false;
  264. }
  265. player.setTitle(val);
  266. player.sendMessage("Your title has been changed by a GM");
  267. player.broadcastTitleInfo();
  268. }
  269. catch (StringIndexOutOfBoundsException e)
  270. { //Case of empty character title
  271. activeChar.sendMessage("You need to specify the new title.");
  272. }
  273. }
  274. else if (command.startsWith("admin_changename"))
  275. {
  276. try
  277. {
  278. String val = command.substring(17);
  279. L2Object target = activeChar.getTarget();
  280. L2PcInstance player = null;
  281. if (target instanceof L2PcInstance)
  282. {
  283. player = (L2PcInstance) target;
  284. }
  285. else
  286. {
  287. return false;
  288. }
  289. L2World.getInstance().removeFromAllPlayers(player);
  290. player.setName(val);
  291. player.store();
  292. L2World.getInstance().addToAllPlayers(player);
  293. player.sendMessage("Your name has been changed by a GM.");
  294. player.broadcastUserInfo();
  295. if (player.isInParty())
  296. {
  297. // Delete party window for other party members
  298. player.getParty().broadcastToPartyMembers(player, new PartySmallWindowDeleteAll());
  299. for (L2PcInstance member : player.getParty().getPartyMembers())
  300. {
  301. // And re-add
  302. if (member != player)
  303. member.sendPacket(new PartySmallWindowAll(member, player.getParty().getPartyMembers()));
  304. }
  305. }
  306. if (player.getClan() != null)
  307. {
  308. player.getClan().broadcastClanStatus();
  309. }
  310. RegionBBSManager.getInstance().changeCommunityBoard();
  311. }
  312. catch (StringIndexOutOfBoundsException e)
  313. { //Case of empty character name
  314. activeChar.sendMessage("Usage: //setname new_name_for_target");
  315. }
  316. }
  317. else if (command.startsWith("admin_setsex"))
  318. {
  319. L2Object target = activeChar.getTarget();
  320. L2PcInstance player = null;
  321. if (target instanceof L2PcInstance)
  322. {
  323. player = (L2PcInstance) target;
  324. }
  325. else
  326. {
  327. return false;
  328. }
  329. player.getAppearance().setSex(player.getAppearance().getSex() ? false : true);
  330. player.sendMessage("Your gender has been changed by a GM");
  331. player.broadcastUserInfo();
  332. player.decayMe();
  333. player.spawnMe(player.getX(), player.getY(), player.getZ());
  334. }
  335. else if (command.startsWith("admin_setcolor"))
  336. {
  337. try
  338. {
  339. String val = command.substring(15);
  340. L2Object target = activeChar.getTarget();
  341. L2PcInstance player = null;
  342. if (target instanceof L2PcInstance)
  343. {
  344. player = (L2PcInstance) target;
  345. }
  346. else
  347. {
  348. return false;
  349. }
  350. player.getAppearance().setNameColor(Integer.decode("0x" + val));
  351. player.sendMessage("Your name color has been changed by a GM");
  352. player.broadcastUserInfo();
  353. }
  354. catch (Exception e)
  355. { //Case of empty color or invalid hex string
  356. activeChar.sendMessage("You need to specify a valid new color.");
  357. }
  358. }
  359. else if (command.startsWith("admin_fullfood"))
  360. {
  361. L2Object target = activeChar.getTarget();
  362. if (target instanceof L2PetInstance)
  363. {
  364. L2PetInstance targetPet = (L2PetInstance) target;
  365. targetPet.setCurrentFed(targetPet.getMaxFed());
  366. }
  367. else
  368. activeChar.sendPacket(new SystemMessage(SystemMessageId.INCORRECT_TARGET));
  369. }
  370. return true;
  371. }
  372. public String[] getAdminCommandList()
  373. {
  374. return ADMIN_COMMANDS;
  375. }
  376. private void listCharacters(L2PcInstance activeChar, int page)
  377. {
  378. Collection<L2PcInstance> allPlayers = L2World.getInstance().getAllPlayers().values();
  379. L2PcInstance[] players;
  380. //synchronized (L2World.getInstance().getAllPlayers())
  381. {
  382. players = allPlayers.toArray(new L2PcInstance[allPlayers.size()]);
  383. }
  384. int MaxCharactersPerPage = 20;
  385. int MaxPages = players.length / MaxCharactersPerPage;
  386. if (players.length > MaxCharactersPerPage * MaxPages)
  387. MaxPages++;
  388. //Check if number of users changed
  389. if (page > MaxPages)
  390. page = MaxPages;
  391. int CharactersStart = MaxCharactersPerPage * page;
  392. int CharactersEnd = players.length;
  393. if (CharactersEnd - CharactersStart > MaxCharactersPerPage)
  394. CharactersEnd = CharactersStart + MaxCharactersPerPage;
  395. NpcHtmlMessage adminReply = new NpcHtmlMessage(5);
  396. adminReply.setFile("data/html/admin/charlist.htm");
  397. TextBuilder replyMSG = new TextBuilder();
  398. for (int x = 0; x < MaxPages; x++)
  399. {
  400. int pagenr = x + 1;
  401. replyMSG.append("<center><a action=\"bypass -h admin_show_characters " + x + "\">Page " + pagenr + "</a></center>");
  402. }
  403. adminReply.replace("%pages%", replyMSG.toString());
  404. replyMSG.clear();
  405. for (int i = CharactersStart; i < CharactersEnd; i++)
  406. { //Add player info into new Table row
  407. replyMSG.append("<tr><td width=80><a action=\"bypass -h admin_character_info " + players[i].getName() + "\">" + players[i].getName() + "</a></td><td width=110>" + players[i].getTemplate().className + "</td><td width=40>"
  408. + players[i].getLevel() + "</td></tr>");
  409. }
  410. adminReply.replace("%players%", replyMSG.toString());
  411. activeChar.sendPacket(adminReply);
  412. }
  413. private void showCharacterInfo(L2PcInstance activeChar, L2PcInstance player)
  414. {
  415. if (player == null)
  416. {
  417. L2Object target = activeChar.getTarget();
  418. if (target instanceof L2PcInstance)
  419. player = (L2PcInstance) target;
  420. else
  421. return;
  422. }
  423. else
  424. activeChar.setTarget(player);
  425. gatherCharacterInfo(activeChar, player, "charinfo.htm");
  426. }
  427. /**
  428. * @param activeChar
  429. * @param player
  430. */
  431. private void gatherCharacterInfo(L2PcInstance activeChar, L2PcInstance player, String filename)
  432. {
  433. String ip = "N/A";
  434. String account = "N/A";
  435. try
  436. {
  437. StringTokenizer clientinfo = new StringTokenizer(player.getClient().toString(), " ]:-[");
  438. clientinfo.nextToken();
  439. clientinfo.nextToken();
  440. clientinfo.nextToken();
  441. account = clientinfo.nextToken();
  442. clientinfo.nextToken();
  443. ip = clientinfo.nextToken();
  444. }
  445. catch (Exception e)
  446. {
  447. }
  448. NpcHtmlMessage adminReply = new NpcHtmlMessage(5);
  449. adminReply.setFile("data/html/admin/" + filename);
  450. adminReply.replace("%name%", player.getName());
  451. adminReply.replace("%level%", String.valueOf(player.getLevel()));
  452. adminReply.replace("%clan%", String.valueOf(ClanTable.getInstance().getClan(player.getClanId())));
  453. adminReply.replace("%xp%", String.valueOf(player.getExp()));
  454. adminReply.replace("%sp%", String.valueOf(player.getSp()));
  455. adminReply.replace("%class%", player.getTemplate().className);
  456. adminReply.replace("%ordinal%", String.valueOf(player.getClassId().ordinal()));
  457. adminReply.replace("%classid%", String.valueOf(player.getClassId()));
  458. adminReply.replace("%x%", String.valueOf(player.getX()));
  459. adminReply.replace("%y%", String.valueOf(player.getY()));
  460. adminReply.replace("%z%", String.valueOf(player.getZ()));
  461. adminReply.replace("%currenthp%", String.valueOf((int) player.getCurrentHp()));
  462. adminReply.replace("%maxhp%", String.valueOf(player.getMaxHp()));
  463. adminReply.replace("%karma%", String.valueOf(player.getKarma()));
  464. adminReply.replace("%currentmp%", String.valueOf((int) player.getCurrentMp()));
  465. adminReply.replace("%maxmp%", String.valueOf(player.getMaxMp()));
  466. adminReply.replace("%pvpflag%", String.valueOf(player.getPvpFlag()));
  467. adminReply.replace("%currentcp%", String.valueOf((int) player.getCurrentCp()));
  468. adminReply.replace("%maxcp%", String.valueOf(player.getMaxCp()));
  469. adminReply.replace("%pvpkills%", String.valueOf(player.getPvpKills()));
  470. adminReply.replace("%pkkills%", String.valueOf(player.getPkKills()));
  471. adminReply.replace("%currentload%", String.valueOf(player.getCurrentLoad()));
  472. adminReply.replace("%maxload%", String.valueOf(player.getMaxLoad()));
  473. adminReply.replace("%percent%", String.valueOf(Util.roundTo(((float) player.getCurrentLoad() / (float) player.getMaxLoad()) * 100, 2)));
  474. adminReply.replace("%patk%", String.valueOf(player.getPAtk(null)));
  475. adminReply.replace("%matk%", String.valueOf(player.getMAtk(null, null)));
  476. adminReply.replace("%pdef%", String.valueOf(player.getPDef(null)));
  477. adminReply.replace("%mdef%", String.valueOf(player.getMDef(null, null)));
  478. adminReply.replace("%accuracy%", String.valueOf(player.getAccuracy()));
  479. adminReply.replace("%evasion%", String.valueOf(player.getEvasionRate(null)));
  480. adminReply.replace("%critical%", String.valueOf(player.getCriticalHit(null, null)));
  481. adminReply.replace("%runspeed%", String.valueOf(player.getRunSpeed()));
  482. adminReply.replace("%patkspd%", String.valueOf(player.getPAtkSpd()));
  483. adminReply.replace("%matkspd%", String.valueOf(player.getMAtkSpd()));
  484. adminReply.replace("%access%", String.valueOf(player.getAccessLevel().getLevel()));
  485. adminReply.replace("%account%", account);
  486. adminReply.replace("%ip%", ip);
  487. activeChar.sendPacket(adminReply);
  488. }
  489. private void setTargetKarma(L2PcInstance activeChar, int newKarma)
  490. {
  491. // function to change karma of selected char
  492. L2Object target = activeChar.getTarget();
  493. L2PcInstance player = null;
  494. if (target instanceof L2PcInstance)
  495. player = (L2PcInstance) target;
  496. else
  497. return;
  498. if (newKarma >= 0)
  499. {
  500. // for display
  501. int oldKarma = player.getKarma();
  502. // update karma
  503. player.setKarma(newKarma);
  504. //Common character information
  505. player.sendPacket(new SystemMessage(SystemMessageId.YOUR_KARMA_HAS_BEEN_CHANGED_TO).addString(String.valueOf(newKarma)));
  506. //Admin information
  507. activeChar.sendMessage("Successfully Changed karma for " + player.getName() + " from (" + oldKarma + ") to (" + newKarma + ").");
  508. if (Config.DEBUG)
  509. _log.fine("[SET KARMA] [GM]" + activeChar.getName() + " Changed karma for " + player.getName() + " from (" + oldKarma + ") to (" + newKarma + ").");
  510. }
  511. else
  512. {
  513. // tell admin of mistake
  514. activeChar.sendMessage("You must enter a value for karma greater than or equal to 0.");
  515. if (Config.DEBUG)
  516. _log.fine("[SET KARMA] ERROR: [GM]" + activeChar.getName() + " entered an incorrect value for new karma: " + newKarma + " for " + player.getName() + ".");
  517. }
  518. }
  519. private void adminModifyCharacter(L2PcInstance activeChar, String modifications)
  520. {
  521. L2Object target = activeChar.getTarget();
  522. if (!(target instanceof L2PcInstance))
  523. return;
  524. L2PcInstance player = (L2PcInstance) target;
  525. StringTokenizer st = new StringTokenizer(modifications);
  526. if (st.countTokens() != 6)
  527. {
  528. editCharacter(player);
  529. return;
  530. }
  531. String hp = st.nextToken();
  532. String mp = st.nextToken();
  533. String cp = st.nextToken();
  534. String pvpflag = st.nextToken();
  535. String pvpkills = st.nextToken();
  536. String pkkills = st.nextToken();
  537. int hpval = Integer.parseInt(hp);
  538. int mpval = Integer.parseInt(mp);
  539. int cpval = Integer.parseInt(cp);
  540. int pvpflagval = Integer.parseInt(pvpflag);
  541. int pvpkillsval = Integer.parseInt(pvpkills);
  542. int pkkillsval = Integer.parseInt(pkkills);
  543. //Common character information
  544. player.sendMessage("Admin has changed your stats." + " HP: " + hpval + " MP: " + mpval + " CP: " + cpval + " PvP Flag: " + pvpflagval + " PvP/PK " + pvpkillsval + "/" + pkkillsval);
  545. player.setCurrentHp(hpval);
  546. player.setCurrentMp(mpval);
  547. player.setCurrentCp(cpval);
  548. player.setPvpFlag(pvpflagval);
  549. player.setPvpKills(pvpkillsval);
  550. player.setPkKills(pkkillsval);
  551. // Save the changed parameters to the database.
  552. player.store();
  553. StatusUpdate su = new StatusUpdate(player.getObjectId());
  554. su.addAttribute(StatusUpdate.CUR_HP, hpval);
  555. su.addAttribute(StatusUpdate.MAX_HP, player.getMaxHp());
  556. su.addAttribute(StatusUpdate.CUR_MP, mpval);
  557. su.addAttribute(StatusUpdate.MAX_MP, player.getMaxMp());
  558. su.addAttribute(StatusUpdate.CUR_CP, cpval);
  559. su.addAttribute(StatusUpdate.MAX_CP, player.getMaxCp());
  560. player.sendPacket(su);
  561. //Admin information
  562. player.sendMessage("Changed stats of " + player.getName() + "." + " HP: " + hpval + " MP: " + mpval + " CP: " + cpval + " PvP: " + pvpflagval + " / " + pvpkillsval);
  563. if (Config.DEBUG)
  564. _log.fine("[GM]" + activeChar.getName() + " changed stats of " + player.getName() + ". " + " HP: " + hpval + " MP: " + mpval + " CP: " + cpval + " PvP: " + pvpflagval + " / " + pvpkillsval);
  565. showCharacterInfo(activeChar, null); //Back to start
  566. player.broadcastPacket(new CharInfo(player));
  567. player.sendPacket(new UserInfo(player));
  568. player.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
  569. player.decayMe();
  570. player.spawnMe(activeChar.getX(), activeChar.getY(), activeChar.getZ());
  571. }
  572. private void editCharacter(L2PcInstance activeChar)
  573. {
  574. L2Object target = activeChar.getTarget();
  575. if (!(target instanceof L2PcInstance))
  576. return;
  577. L2PcInstance player = (L2PcInstance) target;
  578. gatherCharacterInfo(activeChar, player, "charedit.htm");
  579. }
  580. /**
  581. * @param activeChar
  582. * @param CharacterToFind
  583. */
  584. private void findCharacter(L2PcInstance activeChar, String CharacterToFind)
  585. {
  586. int CharactersFound = 0;
  587. String name;
  588. Collection<L2PcInstance> allPlayers = L2World.getInstance().getAllPlayers().values();
  589. L2PcInstance[] players;
  590. //synchronized (L2World.getInstance().getAllPlayers())
  591. {
  592. players = allPlayers.toArray(new L2PcInstance[allPlayers.size()]);
  593. }
  594. NpcHtmlMessage adminReply = new NpcHtmlMessage(5);
  595. adminReply.setFile("data/html/admin/charfind.htm");
  596. TextBuilder replyMSG = new TextBuilder();
  597. for (int i = 0; i < players.length; i++)
  598. { //Add player info into new Table row
  599. name = players[i].getName();
  600. if (name.toLowerCase().contains(CharacterToFind.toLowerCase()))
  601. {
  602. CharactersFound = CharactersFound + 1;
  603. replyMSG.append("<tr><td width=80><a action=\"bypass -h admin_character_list " + name + "\">" + name + "</a></td><td width=110>" + players[i].getTemplate().className + "</td><td width=40>" + players[i].getLevel()
  604. + "</td></tr>");
  605. }
  606. if (CharactersFound > 20)
  607. break;
  608. }
  609. adminReply.replace("%results%", replyMSG.toString());
  610. replyMSG.clear();
  611. if (CharactersFound == 0)
  612. replyMSG.append("s. Please try again.");
  613. else if (CharactersFound > 20)
  614. {
  615. adminReply.replace("%number%", " more than 20");
  616. replyMSG.append("s.<br>Please refine your search to see all of the results.");
  617. }
  618. else if (CharactersFound == 1)
  619. replyMSG.append(".");
  620. else
  621. replyMSG.append("s.");
  622. adminReply.replace("%number%", String.valueOf(CharactersFound));
  623. adminReply.replace("%end%", replyMSG.toString());
  624. activeChar.sendPacket(adminReply);
  625. }
  626. /**
  627. * @param activeChar
  628. * @param IpAdress
  629. * @throws IllegalArgumentException
  630. */
  631. private void findCharactersPerIp(L2PcInstance activeChar, String IpAdress) throws IllegalArgumentException
  632. {
  633. 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]))$"))
  634. throw new IllegalArgumentException("Malformed IPv4 number");
  635. Collection<L2PcInstance> allPlayers = L2World.getInstance().getAllPlayers().values();
  636. L2PcInstance[] players;
  637. //synchronized (L2World.getInstance().getAllPlayers())
  638. {
  639. players = allPlayers.toArray(new L2PcInstance[allPlayers.size()]);
  640. }
  641. int CharactersFound = 0;
  642. String name, ip = "0.0.0.0";
  643. TextBuilder replyMSG = new TextBuilder();
  644. NpcHtmlMessage adminReply = new NpcHtmlMessage(5);
  645. adminReply.setFile("data/html/admin/ipfind.htm");
  646. for (int i = 0; i < players.length; i++)
  647. {
  648. ip = players[i].getClient().getConnection().getSocket().getInetAddress().getHostAddress();
  649. if (ip.equals(IpAdress))
  650. {
  651. name = players[i].getName();
  652. CharactersFound = CharactersFound + 1;
  653. replyMSG.append("<tr><td width=80><a action=\"bypass -h admin_character_list " + name + "\">" + name + "</a></td><td width=110>" + players[i].getTemplate().className + "</td><td width=40>" + players[i].getLevel()
  654. + "</td></tr>");
  655. }
  656. if (CharactersFound > 20)
  657. break;
  658. }
  659. adminReply.replace("%results%", replyMSG.toString());
  660. replyMSG.clear();
  661. if (CharactersFound == 0)
  662. replyMSG.append("s. Maybe they got d/c? :)");
  663. else if (CharactersFound > 20)
  664. {
  665. adminReply.replace("%number%", " more than " + String.valueOf(CharactersFound));
  666. replyMSG.append("s.<br>In order to avoid you a client crash I won't <br1>display results beyond the 20th character.");
  667. }
  668. else if (CharactersFound == 1)
  669. replyMSG.append(".");
  670. else
  671. replyMSG.append("s.");
  672. adminReply.replace("%ip%", ip);
  673. adminReply.replace("%number%", String.valueOf(CharactersFound));
  674. adminReply.replace("%end%", replyMSG.toString());
  675. activeChar.sendPacket(adminReply);
  676. }
  677. /**
  678. * @param activeChar
  679. * @param characterName
  680. * @throws IllegalArgumentException
  681. */
  682. private void findCharactersPerAccount(L2PcInstance activeChar, String characterName) throws IllegalArgumentException
  683. {
  684. if (characterName.matches(Config.CNAME_TEMPLATE))
  685. {
  686. String account = null;
  687. Map<Integer, String> chars;
  688. L2PcInstance player = L2World.getInstance().getPlayer(characterName);
  689. if (player == null)
  690. throw new IllegalArgumentException("Player doesn't exist");
  691. chars = player.getAccountChars();
  692. account = player.getAccountName();
  693. TextBuilder replyMSG = new TextBuilder();
  694. NpcHtmlMessage adminReply = new NpcHtmlMessage(5);
  695. adminReply.setFile("data/html/admin/accountinfo.htm");
  696. for (String charname : chars.values())
  697. replyMSG.append(charname + "<br1>");
  698. adminReply.replace("%characters%", replyMSG.toString());
  699. adminReply.replace("%account%", account);
  700. adminReply.replace("%player%", characterName);
  701. activeChar.sendPacket(adminReply);
  702. }
  703. else
  704. throw new IllegalArgumentException("Malformed character name");
  705. }
  706. }