Package lineage2.gameserver.handler.admincommands.impl

Source Code of lineage2.gameserver.handler.admincommands.impl.AdminEditChar

/*
* 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>&nbsp;<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>&nbsp;<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;
  }
}
TOP

Related Classes of lineage2.gameserver.handler.admincommands.impl.AdminEditChar

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.