AdminEditChar.java
| Index Score | ||
|---|---|---|
![]() |
![]() |
net.sf.l2j.gameserver.handler.admincommandhandlers |
![]() |
![]() |
L2J |
View: Reasons, Metrics, Source Code
These are the metrics that contribute to the Enerjy Score for this file, ranked by impact. So the metrics listed at the top influence the score to a greater extent that the metrics listed at the bottom.
/*
* $Header: /cvsroot/l2j/L2_Gameserver/java/net/sf/l2j/gameserver/handler/admincommandhandlers/AdminEditChar.java,v 1.3 2004/11/19 08:54:42 l2chef Exp $
*
* $Author: l2chef $
* $Date: 2004/11/19 08:54:42 $
* $Revision: 1.3 $
* $Log: AdminEditChar.java,v $
* Revision 1.3 2004/11/19 08:54:42 l2chef
* database is now used
*
* Revision 1.2 2004/11/07 13:00:20 l2chef
* basemp and effectivemp are now used
*
* Revision 1.1 2004/10/25 16:59:40 dethx
* new admin handler classes (nuocnam)
*
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*
* http://www.gnu.org/copyleft/gpl.html
*/
package net.sf.l2j.gameserver.handler.admincommandhandlers;
import java.io.IOException;
import java.util.StringTokenizer;
import java.util.logging.Logger;
import net.sf.l2j.gameserver.CharTemplateTable;
import net.sf.l2j.gameserver.ClanTable;
import net.sf.l2j.gameserver.handler.IAdminCommandHandler;
import net.sf.l2j.gameserver.model.L2Object;
import net.sf.l2j.gameserver.model.L2PcInstance;
import net.sf.l2j.gameserver.model.L2World;
import net.sf.l2j.gameserver.serverpackets.NpcHtmlMessage;
import net.sf.l2j.gameserver.serverpackets.StatusUpdate;
import net.sf.l2j.gameserver.serverpackets.SystemMessage;
/**
* This class handles following admin commands:
* - edit_character
* - current_player
* - character_list
* - show_characters
* - find_character
* - save_modifications
*
* @version $Revision: 1.3 $ $Date: 2004/11/19 08:54:42 $
*/
public class AdminEditChar implements IAdminCommandHandler {
private static Logger _log = Logger.getLogger(AdminEditChar.class.getName());
private static String[] _adminCommands = {
"admin_edit_character",
"admin_current_player",
"admin_character_list",
"admin_show_characters",
"admin_find_character",
"admin_save_modifications"
};
private static final int REQUIRED_LEVEL = 100;
public boolean useAdminCommand(String command, L2PcInstance activeChar) throws IOException {
if (!(checkLevel(activeChar.getAccessLevel()) && activeChar.isGM())) return false;
if (command.equals("admin_edit_character"))
{
editCharacter(activeChar);
}
else if (command.equals("admin_current_player"))
{
showCharacterList(activeChar);
}
else if (command.startsWith("admin_character_list"))
{
try
{
showCharacterList(activeChar);
}
catch (StringIndexOutOfBoundsException e)
{
//Case of empty character name
}
}
else if (command.startsWith("admin_show_characters"))
{
try
{
String val = command.substring(22);
int page = Integer.parseInt(val);
listCharacters(activeChar, page);
}
catch (StringIndexOutOfBoundsException e)
{
//Case of empty page
}
}
else if (command.startsWith("admin_find_character"))
{
try
{
String val = command.substring(21);
findCharacter(activeChar, val);
}
catch (StringIndexOutOfBoundsException e)
{ //Case of empty character name
SystemMessage sm = new SystemMessage(614);
sm.addString("You didnt enter a character name to find.");
activeChar.sendPacket(sm);
listCharacters(activeChar, 0);
}
}
else if (command.startsWith("admin_save_modifications"))
{
try
{
String val = command.substring(24);
adminModifyCharacter(activeChar, val);
}
catch (StringIndexOutOfBoundsException e)
{ //Case of empty character name
SystemMessage sm = new SystemMessage(614);
sm.addString("Error while modifying character.");
activeChar.sendPacket(sm);
listCharacters(activeChar, 0);
}
}
return true;
}
public String[] getAdminCommandList() {
return _adminCommands;
}
private boolean checkLevel(int level) {
return (level >= REQUIRED_LEVEL);
}
private void listCharacters(L2PcInstance activeChar, int page)
{
L2PcInstance[] players = L2World.getInstance().getAllPlayers();
int MaxCharactersPerPage = 20;
int MaxPages = players.length / MaxCharactersPerPage;
int modulus = players.length % MaxCharactersPerPage;
if (modulus!=0)
{
MaxPages = MaxPages+1;
}
//Check if number of users changed
if (page>MaxPages)
{
page=MaxPages;
}
int CharactersStart = MaxCharactersPerPage*page;
int CharactersEnd = players.length-CharactersStart;
NpcHtmlMessage adminReply = new NpcHtmlMessage(5);
StringBuffer replyMSG = new StringBuffer("<html><title>Characters List</title>");
replyMSG.append("<body>");
for (int x=0; x<MaxPages; x++)
{
replyMSG.append("<a action=\"bypass -h admin_show_characters " + x + "\">Page" + x+1 + "</a>\t");
}
replyMSG.append("<br>");
//List Players in a Table
replyMSG.append("<table>");
replyMSG.append("<tr><td>Name</td><td>Class</td><td>Level</td></tr>");
for (int i = CharactersStart; i < CharactersEnd; i++)
{ //Add player info into new Table row
replyMSG.append("<tr><td>" + "<a action=\"bypass -h admin_character_list " + players[i].getName() + "\">" + players[i].getName() + "</a>" + "</td><td>" + CharTemplateTable.getInstance().getTemplate(players[i].getClassId()).getClassName() + "</td><td>" + players[i].getLevel() + "</td></tr>");
}
replyMSG.append("</table>");
replyMSG.append("---------<p>");
replyMSG.append("You can find a character by writing his name<p> and clicking Find bellow:");
replyMSG.append("<edit var=\"character_name\" width=110>");
replyMSG.append("<button value=\"Find\" action=\"bypass -h admin_find_character $character_name\" width=40 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\">");
replyMSG.append("<center><button value=\"Back\" action=\"bypass -h admin_show\" width=40 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></center>");
replyMSG.append("</body></html>");
adminReply.setHtml(replyMSG.toString());
activeChar.sendPacket(adminReply);
}
private void showCharacterList(L2PcInstance activeChar)
{
L2Object target = activeChar.getTarget();
L2PcInstance player = null;
if (target instanceof L2PcInstance) {
player = (L2PcInstance)target;
} else {
return;
}
NpcHtmlMessage adminReply = new NpcHtmlMessage(5);
StringBuffer replyMSG = new StringBuffer("<html><title>Character Information</title>");
replyMSG.append("<body>");
replyMSG.append("<br>");
replyMSG.append("<center>" + player.getName() + "</center><p>");
replyMSG.append("Clan: " + ClanTable.getInstance().getClan(player.getClanId()) + "<p>");
replyMSG.append("Lv: " + player.getLevel() + " " + CharTemplateTable.getInstance().getTemplate(player.getClassId()).getClassName() + "<p>");
replyMSG.append("Exp: " + player.getExp() + "<p>");
replyMSG.append("<table>");
replyMSG.append("<tr><td>HP</td><td>" + player.getCurrentHp() + " / " + player.getMaxHp() + "</td><td>MP</td><td>" + player.getCurrentMp() + " / " + player.getEffectiveMaxMp() + "</td></tr>");
replyMSG.append("<tr><td>SP</td><td>" + player.getSp() + "</td><td>Load</td><td>" + player.getCurrentLoad() + " / "+player.getMaxLoad()+"</td></tr>");
replyMSG.append("<tr><td>ClassId</td><td>"+player.getClassId()+"</td></tr>");
replyMSG.append("</table>");
replyMSG.append("<br>");
//Combat
replyMSG.append("<table>");
replyMSG.append("<tr><td>Combat</td></tr>");
replyMSG.append("</table>");
replyMSG.append("<table>");
replyMSG.append("<tr><td>P.ATK</td><td>" + player.getPhysicalAttack() + "</td><td>M.ATK</td><td>" + player.getMagicalAttack() + "</td></tr>");
replyMSG.append("<tr><td>P.DEF</td><td>" + player.getPhysicalDefense() + "</td><td>M.DEF</td><td>" + player.getMagicalDefense() + "</td></tr>");
replyMSG.append("<tr><td>Accuracy</td><td>" + player.getAccuracy() + "</td><td>Evasion</td><td>" + player.getEvasionRate() + "</td></tr>");
replyMSG.append("<tr><td>Critical</td><td>" + player.getCriticalHit() + "</td><td>Speed</td><td>" + player.getRunSpeed() + "</td></tr>");
replyMSG.append("<tr><td>ATK Spd</td><td>" + player.getPhysicalSpeed() + "</td><td>Casting Spd</td><td>" + player.getMagicalSpeed() + "</td></tr>");
replyMSG.append("</table>");
replyMSG.append("<br>");
//Basic
replyMSG.append("<table>");
replyMSG.append("<tr><td>Basic</td></tr>");
replyMSG.append("</table>");
replyMSG.append("<table>");
replyMSG.append("<tr><td>STR</td><td>" + player.getStr() + "</td><td>DEX</td><td>" + player.getDex() + "</td><td>CON</td><td>" + player.getCon() + "</td></tr>");
replyMSG.append("<tr><td>INT</td><td>" + player.getInt() + "</td><td>WIT</td><td>" + player.getWit() + "</td><td>MEN</td><td>" + player.getMen() + "</td></tr>");
replyMSG.append("</table>");
replyMSG.append("<br>");
//Social
replyMSG.append("<table>");
replyMSG.append("<tr><td>Social</td></tr>");
replyMSG.append("</table>");
replyMSG.append("<table>");
replyMSG.append("<tr><td>Karma</td><td>" + player.getKarma() + "</td><td>PvP</td><td>" + player.getPvpFlag() + " / " + player.getPvpKills() + "</td></tr>");
replyMSG.append("</table><p>");
replyMSG.append("Character Co-ordinates: " + player.getX() + " " + player.getY() + " " + player.getZ());
replyMSG.append("<br>");
replyMSG.append("<center><button value=\"Logout Character\" action=\"bypass -h admin_character_disconnect\" width=140 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></center>");
replyMSG.append("<br>");
replyMSG.append("<center><button value=\"Teleport Character\" action=\"bypass -h admin_show_teleport\" width=140 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></center>");
replyMSG.append("<center><button value=\"Teleport to Character\" action=\"bypass -h admin_teleport_to_character\" width=140 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></center>");
replyMSG.append("<center><button value=\"Add Xp-Sp to Character\" action=\"bypass -h admin_add_exp_sp_to_character\" width=140 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></center>");
replyMSG.append("<center><button value=\"Edit Character\" action=\"bypass -h admin_edit_character\" width=140 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></center>");
replyMSG.append("<center><button value=\"Manage skills\" action=\"bypass -h admin_show_skills\" width=140 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></center>");
replyMSG.append("<center><button value=\"Switch to inventory\" action=\"bypass -h admin_set_context\" width=140 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></center>");
replyMSG.append("<center><button value=\"Reset inventory\" action=\"bypass -h admin_reset_context\" width=140 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></center>");
replyMSG.append("<br><center><button value=\"Back\" action=\"bypass -h admin_show\" width=40 height=15></center>");
replyMSG.append("</body></html>");
adminReply.setHtml(replyMSG.toString());
activeChar.sendPacket(adminReply);
}
private void adminModifyCharacter(L2PcInstance activeChar, String modifications)
{
L2Object target = activeChar.getTarget();
L2PcInstance player = null;
if (target instanceof L2PcInstance) {
player = (L2PcInstance)target;
} else {
return;
}
StringTokenizer st = new StringTokenizer(modifications);
if (st.countTokens()!=9)
{
editCharacter(player);
}
else
{
String hp = st.nextToken();
String hpmax = st.nextToken();
String mp = st.nextToken();
String mpmax = st.nextToken();
String load = st.nextToken();
String karma = st.nextToken();
String pvpflag = st.nextToken();
String pvpkills = st.nextToken();
String classid = st.nextToken();
int hpval = Integer.parseInt(hp);
int hpmaxval = Integer.parseInt(hpmax);
int mpval = Integer.parseInt(mp);
int mpmaxval = Integer.parseInt(mpmax);
int loadval = Integer.parseInt(load);
int karmaval = Integer.parseInt(karma);
int pvpflagval = Integer.parseInt(pvpflag);
int pvpkillsval = Integer.parseInt(pvpkills);
int classidval = Integer.parseInt(classid);
//Common character information
SystemMessage sm = new SystemMessage(614);
sm.addString("Admin has changed your stats." +
" Hp: "+hpval+" HpMax: "+hpmaxval+" Mp: "+mpval+" MpMax: "+mpmaxval+
" MaxLoad: "+loadval+" Karma: "+karmaval+" Pvp: "+pvpflagval+" / "+pvpkillsval+" ClassId: "+classidval);
player.sendPacket(sm);
player.setCurrentHp(hpval);
player.setCurrentMp(mpval);
player.setMaxHp(hpmaxval);
player.setMaxBaseMp(mpmaxval);
player.setMaxLoad(loadval);
player.setKarma(karmaval);
player.setPvpFlag(pvpflagval);
player.setPvpKills(pvpkillsval);
player.setClassId(classidval);
StatusUpdate su = new StatusUpdate(player.getObjectId());
su.addAttribute(StatusUpdate.CUR_HP, hpval);
su.addAttribute(StatusUpdate.MAX_HP, hpmaxval);
su.addAttribute(StatusUpdate.CUR_MP, mpval);
su.addAttribute(StatusUpdate.MAX_MP, mpmaxval);
su.addAttribute(StatusUpdate.MAX_LOAD, loadval);
su.addAttribute(StatusUpdate.KARMA, karmaval);
su.addAttribute(StatusUpdate.PVP_FLAG, pvpflagval);
player.sendPacket(su);
//Admin information
SystemMessage smA = new SystemMessage(614);
smA.addString("Changed stats of "+player.getName()+". " +
" Hp: "+hpval+" HpMax: "+hpmaxval+" Mp: "+mpval+" MpMax: "+mpmaxval+
" MaxLoad: "+loadval+" Karma: "+karmaval+" Pvp: "+pvpflagval+" / "+pvpkillsval+" ClassId: "+classidval);
activeChar.sendPacket(smA);
_log.fine("[GM]"+activeChar.getName()+" changed stats of "+player.getName()+". " +
" Hp: "+hpval+" HpMax: "+hpmaxval+" Mp: "+mpval+" MpMax: "+mpmaxval+
" MaxLoad: "+loadval+" Karma: "+karmaval+" Pvp: "+pvpflagval+" / "+pvpkillsval+" ClassId: "+classidval);
showCharacterList(activeChar); //Back to start
}
}
private void editCharacter(L2PcInstance activeChar)
{
///FIXME Made it so that you have to enter all values to 'prevent' abuses...
L2Object target = activeChar.getTarget();
L2PcInstance player = null;
if (target instanceof L2PcInstance) {
player = (L2PcInstance)target;
} else {
return;
}
NpcHtmlMessage adminReply = new NpcHtmlMessage(5);
StringBuffer replyMSG = new StringBuffer("<html><title>Editing character " + player.getName() + "</title>");
replyMSG.append("<body>");
replyMSG.append("<br><center>Caution ! Dont forget that modifying players stats can ruin the game...</center><br>");
replyMSG.append("Note: you must type all values to confirm modifications.</center><br>");
replyMSG.append("<br>");
replyMSG.append("<table>");
replyMSG.append("<tr><td>HP</td><td>" + player.getCurrentHp() + " / " + player.getMaxHp() + "</td><td>MP</td><td>" + player.getCurrentMp() + " / " + player.getEffectiveMaxMp() + "</td></tr>");
replyMSG.append("<tr><td>Load</td><td>" + player.getCurrentLoad() + " / "+player.getMaxLoad()+"</td></tr>");
replyMSG.append("</table>");
replyMSG.append("<br>");
//Social
replyMSG.append("<table>");
replyMSG.append("<tr><td>Social</td></tr>");
replyMSG.append("</table>");
replyMSG.append("<table>");
replyMSG.append("<tr><td>Karma</td><td>" + player.getKarma() + "</td><td>PvP</td><td>" + player.getPvpFlag() + " / " + player.getPvpKills() + "</td></tr>");
replyMSG.append("<tr><td>ClassId</td><td>"+player.getClassId()+"</td></tr>");
replyMSG.append("</table><p>");
replyMSG.append("<br>");
replyMSG.append("<center><table>");
replyMSG.append("<tr><td>Hp:</td>");
replyMSG.append("<td><edit var=\"hp\" width=110></td></tr>");
replyMSG.append("<tr><td>HpMax:</td>");
replyMSG.append("<td><edit var=\"hpmax\" width=110></td></tr>");
replyMSG.append("<tr><td>Mp:</td>");
replyMSG.append("<td><edit var=\"mp\" width=110></td></tr>");
replyMSG.append("<tr><td>MpMax:</td>");
replyMSG.append("<td><edit var=\"mpmax\" width=110></td></tr>");
replyMSG.append("<tr><td>MaxLoad:</td>");
replyMSG.append("<td><edit var=\"load\" width=110></td></tr>");
replyMSG.append("<tr><td>Karma:</td>");
replyMSG.append("<td><edit var=\"karma\" width=110></td></tr>");
replyMSG.append("<tr><td>PvpFlag:</td>");
replyMSG.append("<td><edit var=\"pvpflag\" width=110></td></tr>");
replyMSG.append("<tr><td>PvpKills:</td>");
replyMSG.append("<td><edit var=\"pvpkills\" width=110></td></tr>");
replyMSG.append("<tr><td>ClassId:</td>");
replyMSG.append("<td><edit var=\"classid\" width=110></td></tr>");
replyMSG.append("</table></center>");
replyMSG.append("<center><button value=\"Save modifications\" action=\"bypass -h" +
" admin_save_modifications $hp $hpmax $mp $mpmax $load $karma $pvpflag $pvpkills $classid\" width=140 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></center>");
replyMSG.append("<br><center><button value=\"Back\" action=\"bypass -h admin_current_player\" width=40 height=15></center>");
replyMSG.append("</body></html>");
adminReply.setHtml(replyMSG.toString());
activeChar.sendPacket(adminReply);
}
//FIXME: needs removal, whole thing needs to use getTarget()
private void findCharacter(L2PcInstance activeChar, String CharacterToFind)
{
L2PcInstance[] players = L2World.getInstance().getAllPlayers();
NpcHtmlMessage adminReply = new NpcHtmlMessage(5);
int CharactersFound = 0;
StringBuffer replyMSG = new StringBuffer("<html><title>Character Search</title>");
replyMSG.append("<body>");
replyMSG.append("<br>");
replyMSG.append("<table>");
replyMSG.append("<tr><td>Name</td><td>Class</td><td>Level</td></tr>");
for (int i = 0; i < players.length; i++)
{ //Add player info into new Table row
if (players[i].getName().startsWith((CharacterToFind)))
{
CharactersFound = CharactersFound+1;
replyMSG.append("<tr><td>" + "<a action=\"bypass -h admin_character_list " + players[i].getName() + "\">" + players[i].getName() + "</a>" + "</td><td>" + CharTemplateTable.getInstance().getTemplate(players[i].getClassId()).getClassName() + "</td><td>" + players[i].getLevel() + "</td></tr>");
}
}
replyMSG.append("</table>");
if (CharactersFound==0)
{
replyMSG.append("<br>Your search did not find any characters. Please try again:");
replyMSG.append("<edit var=\"character_name\" width=110>");
replyMSG.append("<button value=\"Find\" action=\"bypass -h admin_find_character $character_name\" width=40 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\">");
replyMSG.append("<br>");
}
else
{
replyMSG.append("<br>Found " + CharactersFound + " character");
if (CharactersFound==1)
{
replyMSG.append(".");
}
else
{
if (CharactersFound>1)
{
replyMSG.append("s.");
}
}
}
replyMSG.append("<br>");
replyMSG.append("<center><button value=\"Back\" action=\"bypass -h admin_show\" width=40 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></center>");
replyMSG.append("</body></html>");
adminReply.setHtml(replyMSG.toString());
activeChar.sendPacket(adminReply);
}
}
The table below shows all metrics for AdminEditChar.java.




