/*
* 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 silentium.scripts.handlers.admin;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import silentium.commons.utils.StringUtil;
import silentium.gameserver.data.html.StaticHtmPath;
import silentium.gameserver.handler.IAdminCommandHandler;
import silentium.gameserver.model.L2Clan;
import silentium.gameserver.model.L2Object;
import silentium.gameserver.model.L2Skill;
import silentium.gameserver.model.actor.L2Character;
import silentium.gameserver.model.actor.instance.L2PcInstance;
import silentium.gameserver.network.SystemMessageId;
import silentium.gameserver.network.clientpackets.Say2;
import silentium.gameserver.network.serverpackets.MagicSkillUse;
import silentium.gameserver.network.serverpackets.NpcHtmlMessage;
import silentium.gameserver.network.serverpackets.PledgeSkillList;
import silentium.gameserver.network.serverpackets.SystemMessage;
import silentium.gameserver.tables.SkillTable;
import java.util.StringTokenizer;
/**
* This class handles following admin commands: - show_skills - remove_skills - skill_list - skill_index - add_skill - remove_skill - get_skills
* - reset_skills - give_all_skills - remove_all_skills - add_clan_skills
*/
public class AdminSkill implements IAdminCommandHandler {
private static final Logger _log = LoggerFactory.getLogger(AdminSkill.class.getName());
private static final String[] ADMIN_COMMANDS = { "admin_show_skills", "admin_remove_skills", "admin_skill_list", "admin_skill_index", "admin_add_skill", "admin_remove_skill", "admin_get_skills", "admin_reset_skills", "admin_give_all_skills", "admin_remove_all_skills", "admin_add_clan_skill", "admin_st" };
private static L2Skill[] adminSkills;
@Override
public boolean useAdminCommand(final String command, final L2PcInstance activeChar) {
if ("admin_show_skills".equals(command))
showMainPage(activeChar);
else if (command.startsWith("admin_remove_skills")) {
try {
final String val = command.substring(20);
removeSkillsPage(activeChar, Integer.parseInt(val));
} catch (StringIndexOutOfBoundsException e) {
}
} else if (command.startsWith("admin_skill_list")) {
AdminHelpPage.showHelpPage(activeChar, "skills.htm");
} else if (command.startsWith("admin_skill_index")) {
try {
final String val = command.substring(18);
AdminHelpPage.showHelpPage(activeChar, "skills/" + val + ".htm");
} catch (StringIndexOutOfBoundsException e) {
}
} else if (command.startsWith("admin_add_skill")) {
try {
final String val = command.substring(15);
adminAddSkill(activeChar, val);
} catch (Exception e) {
activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Usage: //add_skill <skill_id> <level>");
}
} else if (command.startsWith("admin_remove_skill")) {
try {
final String id = command.substring(19);
final int idval = Integer.parseInt(id);
adminRemoveSkill(activeChar, idval);
} catch (Exception e) {
activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Usage: //remove_skill <skill_id>");
}
} else if ("admin_get_skills".equals(command)) {
adminGetSkills(activeChar);
} else if ("admin_reset_skills".equals(command))
adminResetSkills(activeChar);
else if ("admin_give_all_skills".equals(command))
adminGiveAllSkills(activeChar);
else if ("admin_remove_all_skills".equals(command)) {
if (activeChar.getTarget() instanceof L2PcInstance) {
final L2PcInstance player = (L2PcInstance) activeChar.getTarget();
for (final L2Skill skill : player.getAllSkills())
player.removeSkill(skill);
activeChar.sendChatMessage(0, Say2.ALL, "SYS", "You removed all skills from " + player.getName() + '.');
if (player != activeChar)
player.sendMessage("Admin removed all skills from you.");
player.sendSkillList();
}
} else if (command.startsWith("admin_add_clan_skill")) {
try {
final String[] val = command.split(" ");
adminAddClanSkill(activeChar, Integer.parseInt(val[1]), Integer.parseInt(val[2]));
} catch (Exception e) {
activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Usage: //add_clan_skill <skill_id> <level>");
}
} else if (command.startsWith("admin_st")) {
try {
final StringTokenizer st = new StringTokenizer(command);
st.nextToken();
final int id = Integer.parseInt(st.nextToken());
adminTestSkill(activeChar, id);
} catch (Exception e) {
activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Used to test skills' visual effect, format : //st <ID>");
}
}
return true;
}
private static void adminTestSkill(final L2PcInstance activeChar, final int id) {
final L2Character player;
final L2Object target = activeChar.getTarget();
player = !(target instanceof L2Character) ? activeChar : (L2Character) target;
player.broadcastPacket(new MagicSkillUse(activeChar, player, id, 1, 1, 1));
}
/**
* This function will give all the skills that the target can learn at his/her level
*
* @param activeChar The GM char.
*/
private static void adminGiveAllSkills(final L2PcInstance activeChar) {
final L2Object target = activeChar.getTarget();
L2PcInstance player = null;
if (target instanceof L2PcInstance)
player = (L2PcInstance) target;
else {
activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET);
return;
}
// Notify player and admin
activeChar.sendChatMessage(0, Say2.ALL, "SYS", "You gave " + player.giveAvailableSkills() + " skills to " + player.getName() + '.');
player.sendSkillList();
}
private static void removeSkillsPage(final L2PcInstance activeChar, int page) {
final L2Object target = activeChar.getTarget();
L2PcInstance player = null;
if (target instanceof L2PcInstance)
player = (L2PcInstance) target;
else {
activeChar.sendPacket(SystemMessageId.TARGET_IS_INCORRECT);
return;
}
final L2Skill[] skills = player.getAllSkills();
final int maxSkillsPerPage = 10;
int maxPages = skills.length / maxSkillsPerPage;
if (skills.length > maxSkillsPerPage * maxPages)
maxPages++;
if (page > maxPages)
page = maxPages;
final int skillsStart = maxSkillsPerPage * page;
int skillsEnd = skills.length;
if (skillsEnd - skillsStart > maxSkillsPerPage)
skillsEnd = skillsStart + maxSkillsPerPage;
final NpcHtmlMessage adminReply = new NpcHtmlMessage(5);
final StringBuilder replyMSG = StringUtil.startAppend(500 + maxPages * 50 + (skillsEnd - skillsStart + 1) * 50, "<html><body>" + "<table width=270><tr>" + "<td width=45><button value=\"Main\" action=\"bypass -h admin_admin\" width=40 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>" + "<td width=180><center>Delete Skills Menu</center></td>" + "<td width=45><button value=\"Back\" action=\"bypass -h admin_show_skills\" width=40 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td>" + "</tr></table>" + "<br><br>" + "<center>Editing <font color=\"LEVEL\">", player.getName(), "</font>" + ", ", player.getTemplate().className, " lvl ",
String.valueOf(player.getLevel()), ".<br><center><table width=270><tr>");
for (int x = 0; x < maxPages; x++) {
final int pagenr = x + 1;
StringUtil.append(replyMSG, "<td><a action=\"bypass -h admin_remove_skills ", String.valueOf(x), "\">Page ", String.valueOf(pagenr), "</a></td>");
}
replyMSG.append("</tr></table></center>" + "<br><table width=270>" + "<tr><td width=80>Name:</td><td width=60>Level:</td><td width=40>Id:</td></tr>");
for (int i = skillsStart; i < skillsEnd; i++) {
StringUtil.append(replyMSG, "<tr><td width=80><a action=\"bypass -h admin_remove_skill ", String.valueOf(skills[i].getId()), "\">", skills[i].getName(), "</a></td><td width=60>", String.valueOf(skills[i].getLevel()), "</td><td width=40>", String.valueOf(skills[i].getId()), "</td></tr>");
}
replyMSG.append("</table>" + "<br><center><table width=200>" + "<tr><td width=50 align=right>Id: </td>" + "<td><edit var=\"id_to_remove\" width=55></td>" + "<td width=100><button value=\"Remove skill\" action=\"bypass -h admin_remove_skill $id_to_remove\" width=95 height=21 back=\"bigbutton_over\" fore=\"bigbutton\"></td></tr>" + "<tr><td></td><td></td>" + "<td><button value=\"Back to stats\" action=\"bypass -h admin_current_player\" width=95 height=21 back=\"bigbutton_over\" fore=\"bigbutton\"></td>" + "</tr></table></center>" + "</body></html>");
adminReply.setHtml(replyMSG.toString());
activeChar.sendPacket(adminReply);
}
private static void showMainPage(final L2PcInstance activeChar) {
final L2Object target = activeChar.getTarget();
L2PcInstance player = null;
if (target instanceof L2PcInstance)
player = (L2PcInstance) target;
else {
activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET);
return;
}
final NpcHtmlMessage adminReply = new NpcHtmlMessage(5);
adminReply.setFile(StaticHtmPath.AdminHtmPath + "charskills.htm", player);
adminReply.replace("%name%", player.getName());
adminReply.replace("%level%", String.valueOf(player.getLevel()));
adminReply.replace("%class%", player.getTemplate().className);
activeChar.sendPacket(adminReply);
}
private static void adminGetSkills(final L2PcInstance activeChar) {
final L2Object target = activeChar.getTarget();
L2PcInstance player = null;
if (target instanceof L2PcInstance)
player = (L2PcInstance) target;
else {
activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET);
return;
}
if (player == activeChar)
player.sendPacket(SystemMessageId.CANNOT_USE_ON_YOURSELF);
else {
L2Skill[] skills = player.getAllSkills();
adminSkills = activeChar.getAllSkills();
for (final L2Skill skill : adminSkills)
activeChar.removeSkill(skill);
for (final L2Skill skill : skills)
activeChar.addSkill(skill, true);
activeChar.sendChatMessage(0, Say2.ALL, "SYS", "You ninjaed " + player.getName() + "'s skills list.");
activeChar.sendSkillList();
skills = null;
}
}
private static void adminResetSkills(final L2PcInstance activeChar) {
if (adminSkills == null)
activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Ninja first skills of someone to use that command.");
else {
L2Skill[] skills = activeChar.getAllSkills();
for (final L2Skill skill : skills)
activeChar.removeSkill(skill);
for (final L2Skill skill : adminSkills)
activeChar.addSkill(skill, true);
activeChar.sendChatMessage(0, Say2.ALL, "SYS", "All your skills have been returned back.");
activeChar.sendSkillList();
adminSkills = null;
skills = null;
}
}
private static void adminAddSkill(final L2PcInstance activeChar, final String val) {
final L2Object target = activeChar.getTarget();
L2PcInstance player = null;
if (target instanceof L2PcInstance)
player = (L2PcInstance) target;
else {
showMainPage(activeChar);
activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET);
return;
}
final StringTokenizer st = new StringTokenizer(val);
if (st.countTokens() != 2)
showMainPage(activeChar);
else {
L2Skill skill = null;
try {
final String id = st.nextToken();
final String level = st.nextToken();
final int idval = Integer.parseInt(id);
final int levelval = Integer.parseInt(level);
skill = SkillTable.getInstance().getInfo(idval, levelval);
} catch (Exception e) {
}
if (skill != null) {
final String name = skill.getName();
player.addSkill(skill, true);
player.sendMessage("Admin gave you the skill " + name + '.');
if (player != activeChar)
activeChar.sendChatMessage(0, Say2.ALL, "SYS", "You gave the skill " + name + " to " + player.getName() + '.');
_log.warn("[GM]" + activeChar.getName() + " gave skill " + name + " to " + player.getName() + '.');
player.sendSkillList();
} else
activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Error: there is no such skill.");
showMainPage(activeChar); // Back to start
}
}
private static void adminRemoveSkill(final L2PcInstance activeChar, final int idval) {
final L2Object target = activeChar.getTarget();
L2PcInstance player = null;
if (target instanceof L2PcInstance)
player = (L2PcInstance) target;
else {
activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET);
return;
}
final L2Skill skill = SkillTable.getInstance().getInfo(idval, player.getSkillLevel(idval));
if (skill != null) {
final String skillname = skill.getName();
player.removeSkill(skill);
activeChar.sendChatMessage(0, Say2.ALL, "SYS", "You removed the skill " + skillname + " from " + player.getName() + '.');
if (player != activeChar)
player.sendMessage("Admin removed the skill " + skillname + " from your skills list.");
_log.warn("[GM]" + activeChar.getName() + " removed skill " + skillname + " from " + player.getName() + '.');
player.sendSkillList();
} else
activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Error: there is no such skill.");
removeSkillsPage(activeChar, 0); // Back to previous page
}
private static void adminAddClanSkill(final L2PcInstance activeChar, final int id, final int level) {
final L2Object target = activeChar.getTarget();
L2PcInstance player = null;
if (target instanceof L2PcInstance)
player = (L2PcInstance) target;
else {
activeChar.sendPacket(SystemMessageId.INCORRECT_TARGET);
showMainPage(activeChar);
return;
}
if (!player.isClanLeader()) {
activeChar.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.S1_IS_NOT_A_CLAN_LEADER).addPcName(player));
showMainPage(activeChar);
return;
}
if (id < 370 || id > 391 || level < 1 || level > 3) {
activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Usage: //add_clan_skill <skill_id> <level>");
showMainPage(activeChar);
return;
}
final L2Skill skill = SkillTable.getInstance().getInfo(id, level);
if (skill == null) {
activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Error: there is no such skill.");
return;
}
// The previous check on CL checks already if player is/isn't in a clan.
final L2Clan clanTarget = player.getClan();
clanTarget.addNewSkill(skill);
clanTarget.broadcastToOnlineMembers(SystemMessage.getSystemMessage(SystemMessageId.CLAN_SKILL_S1_ADDED).addSkillName(id));
clanTarget.broadcastToOnlineMembers(new PledgeSkillList(clanTarget));
for (final L2PcInstance member : clanTarget.getOnlineMembers(0))
member.sendSkillList();
activeChar.sendChatMessage(0, Say2.ALL, "SYS", "You gave " + skill.getName() + " Clan Skill to " + clanTarget.getName() + " clan.");
showMainPage(activeChar);
}
@Override
public String[] getAdminCommandList() {
return ADMIN_COMMANDS;
}
}