AdminEditChar.java 25 KB

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