package silentium.scripts.handlers.admin; import silentium.commons.utils.StringUtil; import silentium.gameserver.configs.MainConfig; import silentium.gameserver.handler.IAdminCommandHandler; import silentium.gameserver.model.L2Effect; import silentium.gameserver.model.L2World; 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.NpcHtmlMessage; import silentium.gameserver.network.serverpackets.SkillCoolTime; import silentium.gameserver.utils.GMAudit; import java.util.StringTokenizer; public class AdminBuffs implements IAdminCommandHandler { private static final int PAGE_LIMIT = 20; private static final String[] ADMIN_COMMANDS = { "admin_getbuffs", "admin_stopbuff", "admin_stopallbuffs", "admin_areacancel", "admin_removereuse" }; @Override public boolean useAdminCommand(String command, final L2PcInstance activeChar) { if (command.startsWith("admin_getbuffs")) { final StringTokenizer st = new StringTokenizer(command, " "); command = st.nextToken(); if (st.hasMoreTokens()) { final String playername = st.nextToken(); final L2PcInstance player = L2World.getInstance().getPlayer(playername); if (player == null) { activeChar.sendPacket(SystemMessageId.TARGET_IS_NOT_FOUND_IN_THE_GAME); return false; } int page = 1; if (st.hasMoreTokens()) page = Integer.parseInt(st.nextToken()); showBuffs(activeChar, player, page); return true; } else if (activeChar.getTarget() != null && activeChar.getTarget() instanceof L2Character) { showBuffs(activeChar, (L2Character) activeChar.getTarget(), 1); return true; } else { activeChar.sendPacket(SystemMessageId.TARGET_IS_INCORRECT); return false; } } else if (command.startsWith("admin_stopbuff")) { try { final StringTokenizer st = new StringTokenizer(command, " "); st.nextToken(); final int objectId = Integer.parseInt(st.nextToken()); final int skillId = Integer.parseInt(st.nextToken()); removeBuff(activeChar, objectId, skillId); return true; } catch (Exception e) { activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Failed removing effect: " + e.getMessage()); activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Usage: //stopbuff <objectId> <skillId>"); return false; } } else if (command.startsWith("admin_stopallbuffs")) { try { final StringTokenizer st = new StringTokenizer(command, " "); st.nextToken(); final int objectId = Integer.parseInt(st.nextToken()); removeAllBuffs(activeChar, objectId); return true; } catch (Exception e) { activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Failed removing all effects: " + e.getMessage()); activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Usage: //stopallbuffs <objectId>"); return false; } } else if (command.startsWith("admin_areacancel")) { try { final StringTokenizer st = new StringTokenizer(command, " "); st.nextToken(); final String val = st.nextToken(); final int radius = Integer.parseInt(val); for (final L2Character knownChar : activeChar.getKnownList().getKnownCharactersInRadius(radius)) { if (knownChar instanceof L2PcInstance && !knownChar.equals(activeChar)) knownChar.stopAllEffects(); } activeChar.sendChatMessage(0, Say2.ALL, "SYS", "All effects canceled within radius " + radius + '.'); return true; } catch (Exception e) { activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Usage: //areacancel <radius>"); return false; } } else if (command.startsWith("admin_removereuse")) { final StringTokenizer st = new StringTokenizer(command, " "); command = st.nextToken(); L2PcInstance player = null; if (st.hasMoreTokens()) { final String playername = st.nextToken(); try { player = L2World.getInstance().getPlayer(playername); } catch (Exception e) { } if (player == null) { activeChar.sendChatMessage(0, Say2.ALL, "SYS", "The player " + playername + " is not online."); return false; } } else if (activeChar.getTarget() instanceof L2PcInstance) player = (L2PcInstance) activeChar.getTarget(); else { activeChar.sendPacket(SystemMessageId.TARGET_IS_INCORRECT); return false; } try { player.getReuseTimeStamp().clear(); player.getDisabledSkills().clear(); player.sendPacket(new SkillCoolTime(player)); activeChar.sendChatMessage(0, Say2.ALL, "SYS", player.getName() + "'s skills reuse time is now cleaned."); return true; } catch (NullPointerException e) { return false; } } else return true; } @Override public String[] getAdminCommandList() { return ADMIN_COMMANDS; } public static void showBuffs(final L2PcInstance activeChar, final L2Character target, final int page) { final L2Effect[] effects = target.getAllEffects(); if (page > effects.length / PAGE_LIMIT + 1 || page < 1) return; int max = effects.length / PAGE_LIMIT; if (effects.length > PAGE_LIMIT * max) max++; final StringBuilder html = StringUtil.startAppend(500 + effects.length * 200, "<html><table width=\"100%\"><tr><td width=45><button value=\"Main\" action=\"bypass -h admin_admin\" width=45 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td><td width=180><center><font color=\"LEVEL\">Effects of ", target.getName(), "</font></td><td width=45><button value=\"Back\" action=\"bypass -h admin_current_player\" width=45 height=15 back=\"sek.cbui94\" fore=\"sek.cbui92\"></td></tr></table><br><table width=\"100%\"><tr><td width=160>Skill</td><td width=60>Time Left</td><td width=60>Action</td></tr>"); final int start = (page - 1) * PAGE_LIMIT; final int end = Math.min((page - 1) * PAGE_LIMIT + PAGE_LIMIT, effects.length); for (int i = start; i < end; i++) { final L2Effect e = effects[i]; if (e != null) { StringUtil.append(html, "<tr><td>", e.getSkill().getName(), "</td><td>", e.getSkill().isToggle() ? "toggle" : e.getPeriod() - e.getTime() + "s", "</td><td><a action=\"bypass -h admin_stopbuff ", Integer.toString(target.getObjectId()), " ", String.valueOf(e.getSkill().getId()), "\">Remove</a></td></tr>"); } } html.append("</table><br><table width=\"100%\" bgcolor=444444><tr>"); for (int x = 0; x < max; x++) { final int pagenr = x + 1; if (page == pagenr) { html.append("<td>Page "); html.append(pagenr); html.append("</td>"); } else { html.append("<td><a action=\"bypass -h admin_getbuffs "); html.append(target.getName()); html.append(' '); html.append(x + 1); html.append("\"> Page "); html.append(pagenr); html.append(" </a></td>"); } } html.append("</tr></table>"); StringUtil.append(html, "<br><center><button value=\"Remove All\" action=\"bypass -h admin_stopallbuffs ", Integer.toString(target.getObjectId()), "\" width=75 height=21 back=\"L2UI_ch3.Btn1_normalOn\" fore=\"L2UI_ch3.Btn1_normal\"></html>"); final NpcHtmlMessage ms = new NpcHtmlMessage(1); ms.setHtml(html.toString()); activeChar.sendPacket(ms); if (MainConfig.GMAUDIT) GMAudit.auditGMAction(activeChar.getName() + " [" + activeChar.getObjectId() + ']', "getbuffs", target.getName() + " (" + Integer.toString(target.getObjectId()) + ')', ""); } private static void removeBuff(final L2PcInstance activeChar, final int objId, final int skillId) { L2Character target = null; try { target = (L2Character) L2World.getInstance().findObject(objId); } catch (Exception e) { } if (target != null && skillId > 0) { final L2Effect[] effects = target.getAllEffects(); for (final L2Effect e : effects) { if (e != null && e.getSkill().getId() == skillId) { e.exit(); activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Removed " + e.getSkill().getName() + " level " + e.getSkill().getLevel() + " from " + target.getName() + " (" + objId + ')'); } } showBuffs(activeChar, target, 1); if (MainConfig.GMAUDIT) GMAudit.auditGMAction(activeChar.getName() + " [" + activeChar.getObjectId() + ']', "stopbuff", target.getName() + " (" + objId + ')', Integer.toString(skillId)); } } private static void removeAllBuffs(final L2PcInstance activeChar, final int objId) { L2Character target = null; try { target = (L2Character) L2World.getInstance().findObject(objId); } catch (Exception e) { } if (target != null) { target.stopAllEffects(); activeChar.sendChatMessage(0, Say2.ALL, "SYS", "Removed all effects from " + target.getName() + " (" + objId + ')'); showBuffs(activeChar, target, 1); if (MainConfig.GMAUDIT) GMAudit.auditGMAction(activeChar.getName() + " [" + activeChar.getObjectId() + ']', "stopallbuffs", target.getName() + " (" + objId + ')', ""); } } }