/*
* 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 3 of the License, 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, see <http://www.gnu.org/licenses/>.
*/
package lineage2.gameserver.handler.admincommands.impl;
import java.text.NumberFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.StringTokenizer;
import lineage2.gameserver.Config;
import lineage2.gameserver.cache.Msg;
import lineage2.gameserver.database.mysql;
import lineage2.gameserver.handler.admincommands.IAdminCommandHandler;
import lineage2.gameserver.model.GameObject;
import lineage2.gameserver.model.GameObjectsStorage;
import lineage2.gameserver.model.Playable;
import lineage2.gameserver.model.Player;
import lineage2.gameserver.model.actor.instances.player.SubClassInfo;
import lineage2.gameserver.model.base.ClassId;
import lineage2.gameserver.model.entity.olympiad.Olympiad;
import lineage2.gameserver.model.instances.NpcInstance;
import lineage2.gameserver.network.serverpackets.ExPCCafePointInfo;
import lineage2.gameserver.network.serverpackets.NpcHtmlMessage;
import lineage2.gameserver.network.serverpackets.components.CustomMessage;
import lineage2.gameserver.tables.SkillTable;
import lineage2.gameserver.utils.HtmlUtils;
import lineage2.gameserver.utils.ItemFunctions;
import lineage2.gameserver.utils.Log;
import lineage2.gameserver.utils.Mentoring;
import lineage2.gameserver.utils.PositionUtils;
import lineage2.gameserver.utils.Util;
import org.apache.commons.lang3.math.NumberUtils;
/**
* @author Mobius
* @version $Revision: 1.0 $
*/
@SuppressWarnings("unused")
public class AdminEditChar implements IAdminCommandHandler
{
/**
* @author Mobius
*/
private static enum Commands
{
/**
* Field admin_edit_character.
*/
admin_edit_character,
/**
* Field admin_character_actions.
*/
admin_character_actions,
/**
* Field admin_current_player.
*/
admin_current_player,
/**
* Field admin_nokarma.
*/
admin_nokarma,
/**
* Field admin_setkarma.
*/
admin_setkarma,
/**
* Field admin_character_list.
*/
admin_character_list,
/**
* Field admin_show_characters.
*/
admin_show_characters,
/**
* Field admin_find_character.
*/
admin_find_character,
/**
* Field admin_save_modifications.
*/
admin_save_modifications,
/**
* Field admin_rec.
*/
admin_rec,
/**
* Field admin_settitle.
*/
admin_settitle,
/**
* Field admin_setclass.
*/
admin_setclass,
/**
* Field admin_setname.
*/
admin_setname,
/**
* Field admin_setsex.
*/
admin_setsex,
/**
* Field admin_setcolor.
*/
admin_setcolor,
/**
* Field admin_add_exp_sp_to_character.
*/
admin_add_exp_sp_to_character,
/**
* Field admin_add_exp_sp.
*/
admin_add_exp_sp,
/**
* Field admin_sethero.
*/
admin_sethero,
/**
* Field admin_setnoble.
*/
admin_setnoble,
/**
* Field admin_trans.
*/
admin_trans,
/**
* Field admin_setsubclass.
*/
admin_setsubclass,
/**
* Field admin_setfame.
*/
admin_setfame,
/**
* Field admin_setbday.
*/
admin_setbday,
/**
* Field admin_give_item.
*/
admin_give_item,
/**
* Field admin_add_bang.
*/
admin_add_bang,
/**
* Field admin_set_bang.
*/
admin_set_bang,
admin_reset_mentor_penalty
}
/**
* Method useAdminCommand.
* @param comm Enum<?>
* @param wordList String[]
* @param fullString String
* @param activeChar Player
* @return boolean * @see lineage2.gameserver.handler.admincommands.IAdminCommandHandler#useAdminCommand(Enum<?>, String[], String, Player)
*/
@Override
public boolean useAdminCommand(Enum<?> comm, String[] wordList, String fullString, Player activeChar)
{
Commands command = (Commands) comm;
if (activeChar.getPlayerAccess().CanRename)
{
if (fullString.startsWith("admin_settitle"))
{
try
{
String val = fullString.substring(15);
GameObject target = activeChar.getTarget();
Player player = null;
if (target == null)
{
return false;
}
if (target.isPlayer())
{
player = (Player) target;
player.setTitle(val);
player.sendMessage("Your title has been changed by a GM");
player.sendChanges();
}
else if (target.isNpc())
{
((NpcInstance) target).setTitle(val);
target.decayMe();
target.spawnMe();
}
return true;
}
catch (StringIndexOutOfBoundsException e)
{
activeChar.sendMessage("You need to specify the new title.");
return false;
}
}
else if (fullString.startsWith("admin_setclass"))
{
try
{
String val = fullString.substring(15);
int id = Integer.parseInt(val.trim());
GameObject target = activeChar.getTarget();
if ((target == null) || !target.isPlayer())
{
target = activeChar;
}
if (id > (ClassId.VALUES.length - 1))
{
activeChar.sendMessage("There are no classes over " + String.valueOf(ClassId.VALUES.length - 1) + " id.");
return false;
}
Player player = target.getPlayer();
player.setClassId(id, true, false);
player.sendMessage("Your class has been changed by a GM");
player.broadcastCharInfo();
return true;
}
catch (StringIndexOutOfBoundsException e)
{
activeChar.sendMessage("You need to specify the new class id.");
return false;
}
}
else if (fullString.startsWith("admin_setname"))
{
try
{
String val = fullString.substring(14);
GameObject target = activeChar.getTarget();
Player player;
if ((target != null) && target.isPlayer())
{
player = (Player) target;
}
else
{
return false;
}
if (mysql.simple_get_int("count(*)", "characters", "`char_name` like '" + val + "'") > 0)
{
activeChar.sendMessage("Name already exist.");
return false;
}
Log.add("Character " + player.getName() + " renamed to " + val + " by GM " + activeChar.getName(), "renames");
player.reName(val);
player.sendMessage("Your name has been changed by a GM");
return true;
}
catch (StringIndexOutOfBoundsException e)
{
activeChar.sendMessage("You need to specify the new name.");
return false;
}
}
}
if (!activeChar.getPlayerAccess().CanEditChar && !activeChar.getPlayerAccess().CanViewChar)
{
return false;
}
if (fullString.equals("admin_current_player"))
{
showCharacterList(activeChar, null);
}
else if (fullString.startsWith("admin_character_list"))
{
try
{
String val = fullString.substring(21);
Player target = GameObjectsStorage.getPlayer(val);
showCharacterList(activeChar, target);
}
catch (StringIndexOutOfBoundsException e)
{
}
}
else if (fullString.startsWith("admin_show_characters"))
{
try
{
String val = fullString.substring(22);
int page = Integer.parseInt(val);
listCharacters(activeChar, page);
}
catch (StringIndexOutOfBoundsException e)
{
}
}
else if (fullString.startsWith("admin_find_character"))
{
try
{
String val = fullString.substring(21);
findCharacter(activeChar, val);
}
catch (StringIndexOutOfBoundsException e)
{
activeChar.sendMessage("You didnt enter a character name to find.");
listCharacters(activeChar, 0);
}
}
else if (!activeChar.getPlayerAccess().CanEditChar)
{
return false;
}
else if (fullString.equals("admin_edit_character"))
{
editCharacter(activeChar);
}
else if (fullString.equals("admin_character_actions"))
{
showCharacterActions(activeChar);
}
else if (fullString.equals("admin_nokarma"))
{
setTargetKarma(activeChar, 0);
}
else if (fullString.startsWith("admin_setkarma"))
{
try
{
String val = fullString.substring(15);
int karma = Integer.parseInt(val);
setTargetKarma(activeChar, karma);
}
catch (StringIndexOutOfBoundsException e)
{
activeChar.sendMessage("Please specify new karma value.");
}
}
else if (fullString.startsWith("admin_save_modifications"))
{
try
{
String val = fullString.substring(24);
adminModifyCharacter(activeChar, val);
}
catch (StringIndexOutOfBoundsException e)
{
activeChar.sendMessage("Error while modifying character.");
listCharacters(activeChar, 0);
}
}
else if (fullString.equals("admin_rec"))
{
GameObject target = activeChar.getTarget();
Player player = null;
if ((target != null) && target.isPlayer())
{
player = (Player) target;
}
else
{
return false;
}
player.setRecomHave(player.getRecomHave() + 1);
player.sendMessage("You have been recommended by a GM");
player.broadcastCharInfo();
}
else if (fullString.startsWith("admin_rec"))
{
try
{
String val = fullString.substring(10);
int recVal = Integer.parseInt(val);
GameObject target = activeChar.getTarget();
Player player = null;
if ((target != null) && target.isPlayer())
{
player = (Player) target;
}
else
{
return false;
}
player.setRecomHave(player.getRecomHave() + recVal);
player.sendMessage("You have been recommended by a GM");
player.broadcastCharInfo();
}
catch (NumberFormatException e)
{
activeChar.sendMessage("Command format is //rec <number>");
}
}
else if (fullString.startsWith("admin_sethero"))
{
GameObject target = activeChar.getTarget();
Player player;
if ((wordList.length > 1) && (wordList[1] != null))
{
player = GameObjectsStorage.getPlayer(wordList[1]);
if (player == null)
{
activeChar.sendMessage("Character " + wordList[1] + " not found in game.");
return false;
}
}
else if ((target != null) && target.isPlayer())
{
player = (Player) target;
}
else
{
activeChar.sendMessage("You must specify the name or target character.");
return false;
}
if (player.isHero())
{
player.setHero(false);
player.updatePledgeClass();
player.removeSkill(SkillTable.getInstance().getInfo(395, 1));
player.removeSkill(SkillTable.getInstance().getInfo(396, 1));
player.removeSkill(SkillTable.getInstance().getInfo(1374, 1));
player.removeSkill(SkillTable.getInstance().getInfo(1375, 1));
player.removeSkill(SkillTable.getInstance().getInfo(1376, 1));
}
else
{
player.setHero(true);
player.updatePledgeClass();
player.addSkill(SkillTable.getInstance().getInfo(395, 1));
player.addSkill(SkillTable.getInstance().getInfo(396, 1));
player.addSkill(SkillTable.getInstance().getInfo(1374, 1));
player.addSkill(SkillTable.getInstance().getInfo(1375, 1));
player.addSkill(SkillTable.getInstance().getInfo(1376, 1));
}
player.sendSkillList();
player.sendMessage("Admin has changed your hero status.");
player.broadcastUserInfo();
}
else if (fullString.startsWith("admin_setnoble"))
{
GameObject target = activeChar.getTarget();
Player player;
if ((wordList.length > 1) && (wordList[1] != null))
{
player = GameObjectsStorage.getPlayer(wordList[1]);
if (player == null)
{
activeChar.sendMessage("Character " + wordList[1] + " not found in game.");
return false;
}
}
else if ((target != null) && target.isPlayer())
{
player = (Player) target;
}
else
{
activeChar.sendMessage("You must specify the name or target character.");
return false;
}
if (player.isNoble())
{
Olympiad.removeNoble(player);
player.setNoble(false);
player.sendMessage("Admin changed your noble status, now you are not nobless.");
}
else
{
Olympiad.addNoble(player);
player.setNoble(true);
player.sendMessage("Admin changed your noble status, now you are Nobless.");
}
player.updatePledgeClass();
player.updateNobleSkills();
player.sendSkillList();
player.broadcastUserInfo();
}
else if (fullString.startsWith("admin_setsex"))
{
GameObject target = activeChar.getTarget();
Player player = null;
if ((target != null) && target.isPlayer())
{
player = (Player) target;
}
else
{
return false;
}
player.changeSex();
player.sendMessage("Your gender has been changed by a GM");
player.broadcastUserInfo();
}
else if (fullString.startsWith("admin_setcolor"))
{
try
{
String val = fullString.substring(15);
GameObject target = activeChar.getTarget();
Player player = null;
if ((target != null) && target.isPlayer())
{
player = (Player) target;
}
else
{
return false;
}
player.setNameColor(Integer.decode("0x" + val));
player.sendMessage("Your name color has been changed by a GM");
player.broadcastUserInfo();
}
catch (StringIndexOutOfBoundsException e)
{
activeChar.sendMessage("You need to specify the new color.");
}
}
else if (fullString.startsWith("admin_add_exp_sp_to_character"))
{
addExpSp(activeChar);
}
else if (fullString.startsWith("admin_add_exp_sp"))
{
try
{
final String val = fullString.substring(16).trim();
String[] vals = val.split(" ");
long exp = NumberUtils.toLong(vals[0], 0L);
int sp = vals.length > 1 ? NumberUtils.toInt(vals[1], 0) : 0;
adminAddExpSp(activeChar, exp, sp);
}
catch (Exception e)
{
activeChar.sendMessage("Usage: //add_exp_sp <exp> <sp>");
}
}
else if (fullString.startsWith("admin_trans"))
{
StringTokenizer st = new StringTokenizer(fullString);
if (st.countTokens() > 1)
{
st.nextToken();
int transformId = 0;
try
{
transformId = Integer.parseInt(st.nextToken());
}
catch (Exception e)
{
activeChar.sendMessage("Specify a valid integer value.");
return false;
}
if ((transformId != 0) && (activeChar.getTransformation() != 0))
{
activeChar.sendPacket(Msg.YOU_ALREADY_POLYMORPHED_AND_CANNOT_POLYMORPH_AGAIN);
return false;
}
activeChar.setTransformation(transformId);
activeChar.sendMessage("Transforming...");
}
else
{
activeChar.sendMessage("Usage: //trans <ID>");
}
}
else if (fullString.startsWith("admin_setsubclass"))
{
final GameObject target = activeChar.getTarget();
if ((target == null) || !target.isPlayer())
{
activeChar.sendPacket(Msg.SELECT_TARGET);
return false;
}
final Player player = (Player) target;
StringTokenizer st = new StringTokenizer(fullString);
if (st.countTokens() > 1)
{
st.nextToken();
int classId = Short.parseShort(st.nextToken());
if (!player.addSubClass(classId, true, 0, 0, false, 0))
{
activeChar.sendMessage(new CustomMessage("lineage2.gameserver.model.instances.L2VillageMasterInstance.SubclassCouldNotBeAdded", activeChar));
return false;
}
player.sendPacket(Msg.CONGRATULATIONS_YOU_HAVE_TRANSFERRED_TO_A_NEW_CLASS);
}
else
{
setSubclass(activeChar, player);
}
}
else if (fullString.startsWith("admin_setfame"))
{
try
{
String val = fullString.substring(14);
int fame = Integer.parseInt(val);
setTargetFame(activeChar, fame);
}
catch (StringIndexOutOfBoundsException e)
{
activeChar.sendMessage("Please specify new fame value.");
}
}
else if (fullString.startsWith("admin_setbday"))
{
String msgUsage = "Usage: //setbday YYYY-MM-DD";
String date = fullString.substring(14);
if ((date.length() != 10) || !Util.isMatchingRegexp(date, "[0-9]{4}-[0-9]{2}-[0-9]{2}"))
{
activeChar.sendMessage(msgUsage);
return false;
}
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
try
{
dateFormat.parse(date);
}
catch (ParseException e)
{
activeChar.sendMessage(msgUsage);
}
if ((activeChar.getTarget() == null) || !activeChar.getTarget().isPlayer())
{
activeChar.sendMessage("Please select a character.");
return false;
}
if (!mysql.set("update characters set createtime = UNIX_TIMESTAMP('" + date + "') where obj_Id = " + activeChar.getTarget().getObjectId()))
{
activeChar.sendMessage(msgUsage);
return false;
}
activeChar.sendMessage("New Birthday for " + activeChar.getTarget().getName() + ": " + date);
activeChar.getTarget().getPlayer().sendMessage("Admin changed your birthday to: " + date);
}
else if (fullString.startsWith("admin_give_item"))
{
if (wordList.length < 3)
{
activeChar.sendMessage("Usage: //give_item id count <target>");
return false;
}
int id = Integer.parseInt(wordList[1]);
int count = Integer.parseInt(wordList[2]);
if ((id < 1) || (count < 1) || (activeChar.getTarget() == null) || !activeChar.getTarget().isPlayer())
{
activeChar.sendMessage("Usage: //give_item id count <target>");
return false;
}
ItemFunctions.addItem(activeChar.getTarget().getPlayer(), id, count, true);
}
else if (fullString.startsWith("admin_add_bang"))
{
if (!Config.ALT_PCBANG_POINTS_ENABLED)
{
activeChar.sendMessage("Error! Pc Bang Points service disabled!");
return true;
}
if (wordList.length < 1)
{
activeChar.sendMessage("Usage: //add_bang count <target>");
return false;
}
int count = Integer.parseInt(wordList[1]);
if ((count < 1) || (activeChar.getTarget() == null) || !activeChar.getTarget().isPlayer())
{
activeChar.sendMessage("Usage: //add_bang count <target>");
return false;
}
Player target = activeChar.getTarget().getPlayer();
target.addPcBangPoints(count, false);
activeChar.sendMessage("You have added " + count + " Pc Bang Points to " + target.getName());
}
else if (fullString.startsWith("admin_set_bang"))
{
if (!Config.ALT_PCBANG_POINTS_ENABLED)
{
activeChar.sendMessage("Error! Pc Bang Points service disabled!");
return true;
}
if (wordList.length < 1)
{
activeChar.sendMessage("Usage: //set_bang count <target>");
return false;
}
int count = Integer.parseInt(wordList[1]);
if ((count < 1) || (activeChar.getTarget() == null) || !activeChar.getTarget().isPlayer())
{
activeChar.sendMessage("Usage: //set_bang count <target>");
return false;
}
Player target = activeChar.getTarget().getPlayer();
target.setPcBangPoints(count);
target.sendMessage("Your Pc Bang Points count is now " + count);
target.sendPacket(new ExPCCafePointInfo(target, count, 1, 2, 12));
activeChar.sendMessage("You have set " + target.getName() + "'s Pc Bang Points to " + count);
}
else if (fullString.startsWith("admin_reset_mentor_penalty"))
{
if (activeChar.getTarget().getPlayer() == null)
{
activeChar.sendMessage("You have no target selected.");
return false;
}
if (Mentoring.getTimePenalty(activeChar.getTargetId()) > 0)
{
Mentoring.setTimePenalty(activeChar.getTargetId(), 0, -1);
activeChar.getTarget().getPlayer().sendMessage("Your mentor penalty has been lifted by a GM.");
activeChar.sendMessage(activeChar.getTarget().getPlayer().getName() + "'s mentor penalty has been lifted.");
}
else
{
activeChar.sendMessage("The selected character has no penalty.");
return false;
}
}
return true;
}
/**
* Method getAdminCommandEnum.
* @return Enum[] * @see lineage2.gameserver.handler.admincommands.IAdminCommandHandler#getAdminCommandEnum()
*/
@Override
public Enum<?>[] getAdminCommandEnum()
{
return Commands.values();
}
/**
* Method listCharacters.
* @param activeChar Player
* @param page int
*/
private void listCharacters(Player activeChar, int page)
{
List<Player> players = GameObjectsStorage.getAllPlayers();
int MaxCharactersPerPage = 20;
int MaxPages = players.size() / MaxCharactersPerPage;
if (players.size() > (MaxCharactersPerPage * MaxPages))
{
MaxPages++;
}
if (page > MaxPages)
{
page = MaxPages;
}
int CharactersStart = MaxCharactersPerPage * page;
int CharactersEnd = players.size();
if ((CharactersEnd - CharactersStart) > MaxCharactersPerPage)
{
CharactersEnd = CharactersStart + MaxCharactersPerPage;
}
NpcHtmlMessage adminReply = new NpcHtmlMessage(5);
StringBuilder replyMSG = new StringBuilder("<html><body>");
replyMSG.append("<table width=260><tr>");
replyMSG.append("<td width=40><button value=\"Main\" action=\"bypass -h admin_admin\" width=40 height=15 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>");
replyMSG.append("<td width=180><center>Character Selection Menu</center></td>");
replyMSG.append("<td width=40><button value=\"Back\" action=\"bypass -h admin_admin\" width=40 height=15 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>");
replyMSG.append("</tr></table>");
replyMSG.append("<br><br>");
replyMSG.append("<table width=270>");
replyMSG.append("<tr><td width=270>You can find a character by writing his name and</td></tr>");
replyMSG.append("<tr><td width=270>clicking Find bellow.<br></td></tr>");
replyMSG.append("<tr><td width=270>Note: Names should be written case sensitive.</td></tr>");
replyMSG.append("</table><br>");
replyMSG.append("<center><table><tr><td>");
replyMSG.append("<edit var=\"character_name\" width=80></td><td><button value=\"Find\" action=\"bypass -h admin_find_character $character_name\" width=40 height=15 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\">");
replyMSG.append("</td></tr></table></center><br><br>");
for (int x = 0; x < MaxPages; x++)
{
int pagenr = x + 1;
replyMSG.append("<center><a action=\"bypass -h admin_show_characters " + x + "\">Page " + pagenr + "</a></center>");
}
replyMSG.append("<br>");
replyMSG.append("<table width=270>");
replyMSG.append("<tr><td width=80>Name:</td><td width=110>Class:</td><td width=40>Level:</td></tr>");
for (int i = CharactersStart; i < CharactersEnd; i++)
{
Player p = players.get(i);
replyMSG.append("<tr><td width=80>" + "<a action=\"bypass -h admin_character_list " + p.getName() + "\">" + p.getName() + "</a></td><td width=110>" + HtmlUtils.htmlClassName(p.getClassId().getId()) + "</td><td width=40>" + p.getLevel() + "</td></tr>");
}
replyMSG.append("</table>");
replyMSG.append("</body></html>");
adminReply.setHtml(replyMSG.toString());
activeChar.sendPacket(adminReply);
}
/**
* Method showCharacterList.
* @param activeChar Player
* @param player Player
*/
public static void showCharacterList(Player activeChar, Player player)
{
if (player == null)
{
GameObject target = activeChar.getTarget();
if ((target != null) && target.isPlayer())
{
player = (Player) target;
}
else
{
return;
}
}
else
{
activeChar.setTarget(player);
}
String clanName = "No Clan";
if (player.getClan() != null)
{
clanName = player.getClan().getName() + "/" + player.getClan().getLevel();
}
NumberFormat df = NumberFormat.getNumberInstance(Locale.ENGLISH);
df.setMaximumFractionDigits(4);
df.setMinimumFractionDigits(1);
NpcHtmlMessage adminReply = new NpcHtmlMessage(5);
StringBuilder replyMSG = new StringBuilder("<html><body>");
replyMSG.append("<table width=260><tr>");
replyMSG.append("<td width=40><button value=\"Main\" action=\"bypass -h admin_admin\" width=40 height=15 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>");
replyMSG.append("<td width=180><center>Character Selection Menu</center></td>");
replyMSG.append("<td width=40><button value=\"Back\" action=\"bypass -h admin_show_characters 0\" width=40 height=15 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>");
replyMSG.append("</tr></table><br>");
replyMSG.append("<table width=270>");
replyMSG.append("<tr><td width=100>Account/IP:</td><td>" + player.getAccountName() + "/" + player.getIP() + "</td></tr>");
replyMSG.append("<tr><td width=100>Name/Level:</td><td>" + player.getName() + "/" + player.getLevel() + "</td></tr>");
replyMSG.append("<tr><td width=100>Class/Id:</td><td>" + HtmlUtils.htmlClassName(player.getClassId().getId()) + "/" + player.getClassId().getId() + "</td></tr>");
replyMSG.append("<tr><td width=100>Clan/Level:</td><td>" + clanName + "</td></tr>");
replyMSG.append("<tr><td width=100>Exp/Sp:</td><td>" + player.getExp() + "/" + player.getSp() + "</td></tr>");
replyMSG.append("<tr><td width=100>Cur/Max Hp:</td><td>" + (int) player.getCurrentHp() + "/" + player.getMaxHp() + "</td></tr>");
replyMSG.append("<tr><td width=100>Cur/Max Mp:</td><td>" + (int) player.getCurrentMp() + "/" + player.getMaxMp() + "</td></tr>");
replyMSG.append("<tr><td width=100>Cur/Max Load:</td><td>" + player.getCurrentLoad() + "/" + player.getMaxLoad() + "</td></tr>");
replyMSG.append("<tr><td width=100>Patk/Matk:</td><td>" + player.getPAtk(null) + "/" + player.getMAtk(null, null) + "</td></tr>");
replyMSG.append("<tr><td width=100>Pdef/Mdef:</td><td>" + player.getPDef(null) + "/" + player.getMDef(null, null) + "</td></tr>");
replyMSG.append("<tr><td width=100>PAtkSpd/MAtkSpd:</td><td>" + player.getPAtkSpd() + "/" + player.getMAtkSpd() + "</td></tr>");
replyMSG.append("<tr><td width=100>Acc/Evas:</td><td>" + player.getAccuracy() + "/" + player.getEvasionRate(null) + "</td></tr>");
replyMSG.append("<tr><td width=100>Crit/MCrit:</td><td>" + player.getCriticalHit(null, null) + "/" + df.format(player.getMagicCriticalRate(null, null)) + "%</td></tr>");
replyMSG.append("<tr><td width=100>CritDmg/MCritDmg:</td><td>" + player.getCriticalDmg(null, null) + "/" + player.getMagicCriticalDmg(null, null) + "</td></tr>");
replyMSG.append("<tr><td width=100>Walk/Run:</td><td>" + player.getWalkSpeed() + "/" + player.getRunSpeed() + "</td></tr>");
replyMSG.append("<tr><td width=100>Karma/Fame:</td><td>" + player.getKarma() + "/" + player.getFame() + "</td></tr>");
replyMSG.append("<tr><td width=100>PvP/PK:</td><td>" + player.getPvpKills() + "/" + player.getPkKills() + "</td></tr>");
replyMSG.append("<tr><td width=100>Coordinates:</td><td>" + player.getX() + "," + player.getY() + "," + player.getZ() + "</td></tr>");
replyMSG.append("<tr><td width=100>Direction:</td><td>" + PositionUtils.getDirectionTo(player, activeChar) + "</td></tr>");
replyMSG.append("</table><br>");
replyMSG.append("<table<tr>");
replyMSG.append("<td><button value=\"Skills\" action=\"bypass -h admin_show_skills\" width=80 height=15 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>");
replyMSG.append("<td><button value=\"Effects\" action=\"bypass -h admin_show_effects\" width=80 height=15 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>");
replyMSG.append("<td><button value=\"Actions\" action=\"bypass -h admin_character_actions\" width=80 height=15 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>");
replyMSG.append("</tr><tr>");
replyMSG.append("<td><button value=\"Stats\" action=\"bypass -h admin_edit_character\" width=80 height=15 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>");
replyMSG.append("<td><button value=\"Exp & Sp\" action=\"bypass -h admin_add_exp_sp_to_character\" width=80 height=15 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>");
replyMSG.append("<td></td>");
replyMSG.append("</tr></table></body></html>");
adminReply.setHtml(replyMSG.toString());
activeChar.sendPacket(adminReply);
}
/**
* Method setTargetKarma.
* @param activeChar Player
* @param newKarma int
*/
private void setTargetKarma(Player activeChar, int newKarma)
{
GameObject target = activeChar.getTarget();
if (target == null)
{
activeChar.sendPacket(Msg.INVALID_TARGET);
return;
}
Player player;
if (target.isPlayer())
{
player = (Player) target;
}
else
{
return;
}
if (newKarma >= 0)
{
int oldKarma = player.getKarma();
player.setKarma(newKarma);
player.sendMessage("Admin has changed your karma from " + oldKarma + " to " + newKarma + ".");
activeChar.sendMessage("Successfully Changed karma for " + player.getName() + " from (" + oldKarma + ") to (" + newKarma + ").");
}
else
{
activeChar.sendMessage("You must enter a value for karma greater than or equal to 0.");
}
}
/**
* Method setTargetFame.
* @param activeChar Player
* @param newFame int
*/
private void setTargetFame(Player activeChar, int newFame)
{
GameObject target = activeChar.getTarget();
if (target == null)
{
activeChar.sendPacket(Msg.INVALID_TARGET);
return;
}
Player player;
if (target.isPlayer())
{
player = (Player) target;
}
else
{
return;
}
if (newFame >= 0)
{
int oldFame = player.getFame();
player.setFame(newFame, "Admin");
player.sendMessage("Admin has changed your fame from " + oldFame + " to " + newFame + ".");
activeChar.sendMessage("Successfully Changed fame for " + player.getName() + " from (" + oldFame + ") to (" + newFame + ").");
}
else
{
activeChar.sendMessage("You must enter a value for fame greater than or equal to 0.");
}
}
/**
* Method adminModifyCharacter.
* @param activeChar Player
* @param modifications String
*/
private void adminModifyCharacter(Player activeChar, String modifications)
{
GameObject target = activeChar.getTarget();
if ((target == null) || !target.isPlayer())
{
activeChar.sendPacket(Msg.SELECT_TARGET);
return;
}
Player player = (Player) target;
String[] strvals = modifications.split("&");
Integer[] vals = new Integer[strvals.length];
for (int i = 0; i < strvals.length; i++)
{
strvals[i] = strvals[i].trim();
vals[i] = strvals[i].isEmpty() ? null : Integer.valueOf(strvals[i]);
}
if (vals[0] != null)
{
player.setCurrentHp(vals[0], false);
}
if (vals[1] != null)
{
player.setCurrentMp(vals[1]);
}
if (vals[2] != null)
{
player.setKarma(vals[2]);
}
if (vals[3] != null)
{
player.setPvpFlag(vals[3]);
}
if (vals[4] != null)
{
player.setPvpKills(vals[4]);
}
if (vals[5] != null)
{
player.setClassId(vals[5], true, false);
}
editCharacter(activeChar);
player.broadcastCharInfo();
player.decayMe();
player.spawnMe(activeChar.getLoc());
}
/**
* Method editCharacter.
* @param activeChar Player
*/
private void editCharacter(Player activeChar)
{
GameObject target = activeChar.getTarget();
if ((target == null) || !target.isPlayer())
{
activeChar.sendPacket(Msg.SELECT_TARGET);
return;
}
Player player = (Player) target;
NpcHtmlMessage adminReply = new NpcHtmlMessage(5);
StringBuilder replyMSG = new StringBuilder("<html><body>");
replyMSG.append("<table width=260><tr>");
replyMSG.append("<td width=40><button value=\"Main\" action=\"bypass -h admin_admin\" width=40 height=15 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>");
replyMSG.append("<td width=180><center>Character Selection Menu</center></td>");
replyMSG.append("<td width=40><button value=\"Back\" action=\"bypass -h admin_current_player\" width=40 height=15 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>");
replyMSG.append("</tr></table>");
replyMSG.append("<br><br>");
replyMSG.append("<center>Editing character: " + player.getName() + "</center><br>");
replyMSG.append("<table width=250>");
replyMSG.append("<tr><td width=40></td><td width=70>Curent:</td><td width=70>Max:</td><td width=70></td></tr>");
replyMSG.append("<tr><td width=40>HP:</td><td width=70>" + player.getCurrentHp() + "</td><td width=70>" + player.getMaxHp() + "</td><td width=70>Karma: " + player.getKarma() + "</td></tr>");
replyMSG.append("<tr><td width=40>MP:</td><td width=70>" + player.getCurrentMp() + "</td><td width=70>" + player.getMaxMp() + "</td><td width=70>Pvp Kills: " + player.getPvpKills() + "</td></tr>");
replyMSG.append("<tr><td width=40>Load:</td><td width=70>" + player.getCurrentLoad() + "</td><td width=70>" + player.getMaxLoad() + "</td><td width=70>Pvp Flag: " + player.getPvpFlag() + "</td></tr>");
replyMSG.append("</table>");
replyMSG.append("<table width=270><tr><td>Class<?> Template Id: " + player.getClassId() + "/" + player.getClassId().getId() + "</td></tr></table><br>");
replyMSG.append("<table width=270>");
replyMSG.append("<tr><td>Note: Fill all values before saving the modifications.</td></tr>");
replyMSG.append("</table><br>");
replyMSG.append("<table width=270>");
replyMSG.append("<tr><td width=50>Hp:</td><td><edit var=\"hp\" width=50></td><td width=50>Mp:</td><td><edit var=\"mp\" width=50></td></tr>");
replyMSG.append("<tr><td width=50>Pvp Flag:</td><td><edit var=\"pvpflag\" width=50></td><td width=50>Karma:</td><td><edit var=\"karma\" width=50></td></tr>");
replyMSG.append("<tr><td width=50>Class<?> Id:</td><td><edit var=\"classid\" width=50></td><td width=50>Pvp Kills:</td><td><edit var=\"pvpkills\" width=50></td></tr>");
replyMSG.append("</table><br>");
replyMSG.append("<center><button value=\"Save Changes\" action=\"bypass -h admin_save_modifications $hp & $mp & $karma & $pvpflag & $pvpkills & $classid &\" width=80 height=15 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></center><br>");
replyMSG.append("</body></html>");
adminReply.setHtml(replyMSG.toString());
activeChar.sendPacket(adminReply);
}
/**
* Method showCharacterActions.
* @param activeChar Player
*/
private void showCharacterActions(Player activeChar)
{
GameObject target = activeChar.getTarget();
Player player;
if ((target != null) && target.isPlayer())
{
player = (Player) target;
}
else
{
return;
}
NpcHtmlMessage adminReply = new NpcHtmlMessage(5);
StringBuilder replyMSG = new StringBuilder("<html><body>");
replyMSG.append("<table width=260><tr>");
replyMSG.append("<td width=40><button value=\"Main\" action=\"bypass -h admin_admin\" width=40 height=15 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>");
replyMSG.append("<td width=180><center>Character Selection Menu</center></td>");
replyMSG.append("<td width=40><button value=\"Back\" action=\"bypass -h admin_current_player\" width=40 height=15 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>");
replyMSG.append("</tr></table><br><br>");
replyMSG.append("<center>Admin Actions for: " + player.getName() + "</center><br>");
replyMSG.append("<center><table width=200><tr>");
replyMSG.append("<td width=100>Argument(*):</td><td width=100><edit var=\"arg\" width=100></td>");
replyMSG.append("</tr></table><br></center>");
replyMSG.append("<table width=270>");
replyMSG.append("<tr><td width=90><button value=\"Teleport\" action=\"bypass -h admin_teleportto " + player.getName() + "\" width=85 height=20 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>");
replyMSG.append("<td width=90><button value=\"Recall\" action=\"bypass -h admin_recall " + player.getName() + "\" width=85 height=20 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>");
replyMSG.append("<td width=90><button value=\"Quests\" action=\"bypass -h admin_quests " + player.getName() + "\" width=85 height=20 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td></tr>");
replyMSG.append("</body></html>");
adminReply.setHtml(replyMSG.toString());
activeChar.sendPacket(adminReply);
}
/**
* Method findCharacter.
* @param activeChar Player
* @param CharacterToFind String
*/
private void findCharacter(Player activeChar, String CharacterToFind)
{
NpcHtmlMessage adminReply = new NpcHtmlMessage(5);
int CharactersFound = 0;
StringBuilder replyMSG = new StringBuilder("<html><body>");
replyMSG.append("<table width=260><tr>");
replyMSG.append("<td width=40><button value=\"Main\" action=\"bypass -h admin_admin\" width=40 height=15 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>");
replyMSG.append("<td width=180><center>Character Selection Menu</center></td>");
replyMSG.append("<td width=40><button value=\"Back\" action=\"bypass -h admin_show_characters 0\" width=40 height=15 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>");
replyMSG.append("</tr></table>");
replyMSG.append("<br><br>");
for (Player element : GameObjectsStorage.getAllPlayersForIterate())
{
if (element.getName().startsWith(CharacterToFind))
{
CharactersFound = CharactersFound + 1;
replyMSG.append("<table width=270>");
replyMSG.append("<tr><td width=80>Name</td><td width=110>Class</td><td width=40>Level</td></tr>");
replyMSG.append("<tr><td width=80><a action=\"bypass -h admin_character_list " + element.getName() + "\">" + element.getName() + "</a></td><td width=110>" + HtmlUtils.htmlClassName(element.getClassId().getId()) + "</td><td width=40>" + element.getLevel() + "</td></tr>");
replyMSG.append("</table>");
}
}
if (CharactersFound == 0)
{
replyMSG.append("<table width=270>");
replyMSG.append("<tr><td width=270>Your search did not find any characters.</td></tr>");
replyMSG.append("<tr><td width=270>Please try again.<br></td></tr>");
replyMSG.append("</table><br>");
replyMSG.append("<center><table><tr><td>");
replyMSG.append("<edit var=\"character_name\" width=80></td><td><button value=\"Find\" action=\"bypass -h admin_find_character $character_name\" width=40 height=15 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\">");
replyMSG.append("</td></tr></table></center>");
}
else
{
replyMSG.append("<center><br>Found " + CharactersFound + " character");
if (CharactersFound == 1)
{
replyMSG.append('.');
}
else if (CharactersFound > 1)
{
replyMSG.append("s.");
}
}
replyMSG.append("</center></body></html>");
adminReply.setHtml(replyMSG.toString());
activeChar.sendPacket(adminReply);
}
/**
* Method addExpSp.
* @param activeChar Player
*/
private void addExpSp(final Player activeChar)
{
final GameObject target = activeChar.getTarget();
Player player;
if ((target != null) && target.isPlayer() && ((activeChar == target) || activeChar.getPlayerAccess().CanEditCharAll))
{
player = (Player) target;
}
else
{
activeChar.sendPacket(Msg.INVALID_TARGET);
return;
}
final NpcHtmlMessage adminReply = new NpcHtmlMessage(5);
final StringBuilder replyMSG = new StringBuilder("<html><body>");
replyMSG.append("<table width=260><tr>");
replyMSG.append("<td width=40><button value=\"Main\" action=\"bypass -h admin_admin\" width=40 height=15 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>");
replyMSG.append("<td width=180><center>Character Selection Menu</center></td>");
replyMSG.append("<td width=40><button value=\"Back\" action=\"bypass -h admin_current_player\" width=40 height=15 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>");
replyMSG.append("</tr></table>");
replyMSG.append("<br><br>");
replyMSG.append("<table width=270><tr><td>Name: " + player.getName() + "</td></tr>");
replyMSG.append("<tr><td>Lv: " + player.getLevel() + " " + HtmlUtils.htmlClassName(player.getClassId().getId()) + "</td></tr>");
replyMSG.append("<tr><td>Exp: " + player.getExp() + "</td></tr>");
replyMSG.append("<tr><td>Sp: " + player.getSp() + "</td></tr></table>");
replyMSG.append("<br><table width=270><tr><td>Note: Dont forget that modifying players skills can</td></tr>");
replyMSG.append("<tr><td>ruin the game...</td></tr></table><br>");
replyMSG.append("<table width=270><tr><td>Note: Fill all values before saving the modifications.,</td></tr>");
replyMSG.append("<tr><td>Note: Use 0 if no changes are needed.</td></tr></table><br>");
replyMSG.append("<center><table><tr>");
replyMSG.append("<td>Exp: <edit var=\"exp_to_add\" width=50></td>");
replyMSG.append("<td>Sp: <edit var=\"sp_to_add\" width=50></td>");
replyMSG.append("<td> <button value=\"Save Changes\" action=\"bypass -h admin_add_exp_sp $exp_to_add & $sp_to_add &\" width=80 height=15 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>");
replyMSG.append("</tr></table></center>");
replyMSG.append("<center><table><tr>");
replyMSG.append("<td>LvL: <edit var=\"lvl\" width=50></td>");
replyMSG.append("<td> <button value=\"Set Level\" action=\"bypass -h admin_setlevel $lvl\" width=80 height=15 back=\"L2UI_CT1.Button_DF_Down\" fore=\"L2UI_CT1.Button_DF\"></td>");
replyMSG.append("</tr></table></center>");
replyMSG.append("</body></html>");
adminReply.setHtml(replyMSG.toString());
activeChar.sendPacket(adminReply);
}
/**
* Method adminAddExpSp.
* @param activeChar Player
* @param exp long
* @param sp int
*/
private void adminAddExpSp(Player activeChar, long exp, int sp)
{
if (!activeChar.getPlayerAccess().CanEditCharAll)
{
activeChar.sendMessage("You have not enough privileges, for use this function.");
return;
}
final GameObject target = activeChar.getTarget();
if (target == null)
{
activeChar.sendPacket(Msg.SELECT_TARGET);
return;
}
if (!target.isPlayable())
{
activeChar.sendPacket(Msg.INVALID_TARGET);
return;
}
Playable playable = (Playable) target;
playable.addExpAndSp(exp, sp);
activeChar.sendMessage("Added " + exp + " experience and " + sp + " SP to " + playable.getName() + ".");
}
/**
* Method setSubclass.
* @param activeChar Player
* @param player Player
*/
private void setSubclass(final Player activeChar, final Player player)
{
StringBuilder content = new StringBuilder("<html><body>");
NpcHtmlMessage html = new NpcHtmlMessage(5);
Set<ClassId> subsAvailable = SubClassInfo.getAvailableSubClasses(player, null, null, true);
if ((subsAvailable != null) && !subsAvailable.isEmpty())
{
content.append("Add Subclass:<br>Which subclass do you wish to add?<br>");
for (ClassId subClass : subsAvailable)
{
content.append("<a action=\"bypass -h admin_setsubclass " + subClass.ordinal() + "\">" + formatClassForDisplay(subClass) + "</a><br>");
}
}
else
{
activeChar.sendMessage(new CustomMessage("lineage2.gameserver.model.instances.L2VillageMasterInstance.NoSubAtThisTime", activeChar));
return;
}
content.append("</body></html>");
html.setHtml(content.toString());
activeChar.sendPacket(html);
}
/**
* Method formatClassForDisplay.
* @param className ClassId
* @return String
*/
private String formatClassForDisplay(ClassId className)
{
String classNameStr = className.toString();
char[] charArray = classNameStr.toCharArray();
for (int i = 1; i < charArray.length; i++)
{
if (Character.isUpperCase(charArray[i]))
{
classNameStr = classNameStr.substring(0, i) + " " + classNameStr.substring(i);
}
}
return classNameStr;
}
}