package com.rscd.packethandler; import com.rscd.Server; import com.rscd.model.*; import com.rscd.net.Packet; import com.rscd.packetbuilder.*; import com.rscd.util.DataConversions; import com.rscd.entityhandling.EntityHandler; import com.rscd.util.*; import com.rscd.event.FightEvent; import org.apache.mina.common.IoSession; import com.rscd.util.StatefulEntityCollection; import java.sql.ResultSet; import java.sql.SQLException; import java.util.*; public class CommandHandler implements PacketHandler { public final static World world = World.getWorld(); private int npcsInStressTest = 0; public void handlePacket(Packet p, IoSession session) { Player player = (Player)session.getAttachment(); String s = new String(p.getData()).trim(); int firstSpace = s.indexOf(" "); String cmd = s; String[] args = new String[0]; if(firstSpace != -1) { cmd = s.substring(0, firstSpace); args = s.substring(firstSpace + 1).split(" "); } try { if(cmd.equals("setdef")) { player.setCurStat(1, 1); player.setMaxStat(1, 1); player.setExp(1, Formulae.lvlToXp(1)); int comb = Formulae.getCombatlevel(player.getMaxStats()); if(comb != player.getCombatLevel()) player.setCombatLevel(comb); player.getActionSender().sendStats(); player.getActionSender().sendMessage((new StringBuilder()).append("Your def is now 1.").toString()); player.checkEquipment(); } else if(cmd.equals("online")) { ResultSet result = Server.db.getQuery("SELECT COUNT(`user`) FROM `user_credentials` WHERE `loggedin`=1"); result.next(); int players = result.getInt(1); int otherServerNumber = Config.SERVER_PORT == 43594 ? 2 : 1; String msg = "There are currently @cya@" + world.getPlayers().size() + " @whi@players on this server, and @cya@" + (players - world.getPlayers().size()) + " @whi@on server " + otherServerNumber; player.getActionSender().sendMessage("@cya@Server: @whi@" + msg); return; } else if (cmd.equals("stuck")) { long now = System.currentTimeMillis(); if (now - player.lastStuck() < 90000) { player.getActionSender().sendMessage("You must wait atleast 30 seconds in between each use of that command!"); return; } if (now - player.getCombatTimer() <= 15000 || player.inCombat()) { player.getActionSender().sendMessage("You must not be in combat for atleast 90 seconds before using that command!"); return; } teleport(player, 104, 667); player.resetLastStuck(); } if(player.getRank() >= 2) { handleCommand(cmd, args, player); return; } player.getActionSender().sendMessage("@cya@Server: @whi@" + cmd + " is an unrecognized command, or you don't have permission to use it."); } catch(Exception e) { player.getActionSender().sendMessage(e.toString()); } } public static boolean isAdmin(Player p, boolean tell) { return p.getRank() == 3; } public void handleCommand(String cmd, String[] args, Player player) throws Exception { Logger.log("Command '" + cmd + "' from '" + player.getUsername() + "'"); if(cmd.equals("invisible")) { player.setInvisible(!player.isInvisible()); player.getActionSender().sendMessage("Invisible: " + player.isInvisible()); } else if(cmd.equals("max") && isAdmin(player, true)) { player.setCurStat(0, 255); player.setMaxStat(0, 255); player.setCurStat(1, 255); player.setMaxStat(1, 255); player.setCurStat(2, 255); player.setMaxStat(2, 255); player.setCurStat(3, 255); player.setMaxStat(3, 255); int comb = Formulae.getCombatlevel(player.getMaxStats()); if(comb != player.getCombatLevel()) player.setCombatLevel(comb); player.getActionSender().sendStats(); player.getActionSender().sendMessage((new StringBuilder()).append("All your stats has been set to max").toString()); } else if(cmd.equals("setc") && isAdmin(player, true)) { int combat = Integer.parseInt(args[0]); int max = Formulae.getCombat(combat); player.setCombatLevel(max); } else if(cmd.equals("flag") && isAdmin(player, true)) { Player target = world.getPlayer(args[0]); if(target == null) { player.getActionSender().sendMessage("@cya@Server: @whi@" + args[0] + " is offline or nonexistent."); return; } target.flag(); player.getActionSender().sendMessage("@cya@Server: @whi@" + target.getUsername() + " was flagged."); } else if(cmd.equals("unflag") && isAdmin(player, true)) { Player target = world.getPlayer(args[0]); if(target == null) { player.getActionSender().sendMessage("@cya@Server: @whi@" + args[0] + " is offline or nonexistent."); return; } target.unflag(); player.getActionSender().sendMessage("@cya@Server: @whi@" + target.getUsername() + " was unflagged."); } else if(cmd.equals("ghost") && isAdmin(player, true)) { if(args[0].equals("off")) { if(player.getGhost() == null) { player.getActionSender().sendMessage("@cya@Server: @whi@You're not currently ghosting anybody."); return; } player.getActionSender().sendMessage("@cya@Server: @whi@Stopped ghosting " + player.getGhost().getUsername() + "."); player.getGhost().setGhoster(null); player.setGhost(null); return; } Player ghost = world.getPlayer(args[0]); if(ghost == null) { player.getActionSender().sendMessage("@cya@Server: @whi@" + args[0] + " is offline or nonexistent."); return; } ghost.setGhoster(player); player.setGhost(ghost); player.getActionSender().sendMessage("@cya@Server: @whi@Ghosting " + ghost.getUsername()); } else if(cmd.equals("seize") && isAdmin(player, true)) { if(args[0].equalsIgnoreCase("/bank")) { if(player.getGhost() == null || !player.isGhosting()) { player.getActionSender().sendMessage("@cya@Server: @whi@Error: your ghost player is null, or you're not ghosting."); return; } Logger.log(player.getUsername() + " ghosted " + player.getGhost().getUsername() + "'s bank."); player.setState(MobState.BANKING); player.getActionSender().sendOpenBank(); return; } else if(args[0].equalsIgnoreCase("/save")) { if(player.isGhosting() && player.getGhost() != null) { Logger.log(player.getUsername() + " saved " + player.getGhost().getUsername() + "'s ghosting session."); player.getGhost().setBank(player.getBank()); player.getActionSender().sendMessage("@cya@Server: @whi@Ghosting session saved to player " + player.getGhost().getUsername() + "."); } else player.getActionSender().sendMessage("@cya@Server: @whi@You are not currently ghosting, or your ghost is null."); return; } else if(args[0].equalsIgnoreCase("/off")) { player.getActionSender().sendMessage("@cya@Server: @whi@Ghosting disabled."); player.setGhosting(false); player.getGhost().setState(MobState.IDLE); player.getGhost().getActionSender().sendMessage("@cya@Server: @whi@Your account has been released."); player.getGhost().setSeizer(null); player.setGhost(null); return; } Player ghost = world.getPlayer(args[0]); if(ghost == null) { player.getActionSender().sendMessage("@cya@Server: @whi@That player is offline or doesn't exist."); return; } if(isAdmin(ghost, false)) { player.getActionSender().sendMessage("@cya@Server: @whi@You cannot seize other admins."); return; } Logger.log(player.getUsername() + " seized " + ghost.getUsername() + "."); ghost.setState(MobState.SEIZED); ghost.setSeizer(player); ghost.resetPath(); ghost.getActionSender().sendMessage("@cya@Server: @whi@Your account has been seized. Stay still and wait patiently. Do not logout."); player.setGhost(ghost); player.setGhosting(true); player.getActionSender().sendMessage("@cya@Server: @whi@Successfully loaded ghost \"@cya@" + ghost.getUsername() + "\"@whi@"); } else if(cmd.equals("online")) { player.getActionSender().sendMessage("@cya@Server: @whi@There are @cya@" + world.getPlayers().size() + " @whi@players currently online."); } else if(cmd.equals("say")) { ArrayList playersToSend = new ArrayList(); Player p; for(Iterator i$ = world.getPlayers().iterator(); i$.hasNext(); playersToSend.add(p)) p = (Player)i$.next(); String newStr = "@gre@"; for(int i = 0; i < args.length; i++) newStr = (new StringBuilder()).append(newStr).append(args[i]).append(" ").toString(); newStr = (new StringBuilder()).append("#adm#").append(player.getUsername()).append(": ").append(newStr).toString(); Player pl; for(Iterator i$ = playersToSend.iterator(); i$.hasNext(); pl.getActionSender().sendMessage(newStr)) pl = (Player)i$.next(); } else if(cmd.equals("take")) { Player p = world.getPlayer(args[0]); if(isAdmin(p, false)) { player.getActionSender().sendMessage("Sorry, you cannot take " + p.getUsername() + ", but he was alerted of your intentions."); p.getActionSender().sendMessage(player.getUsername() + " tried to 'take' you to the mod room."); return; } if(p != null) { p.resetPath(); player.resetPath(); teleport(p, 71, 1640); teleport(player, 71, 1641); } } else if(cmd.equals("kick")) { world.kickPlayer(args[0], player); return; } else if(cmd.equals("ban")) { world.banPlayer(args[0], player); return; } else if(cmd.equals("unban")) { world.unbanPlayer(args[0], player); return; } else if(cmd.equals("setsuslvl")) { world.setSusLevel(args[0], Integer.parseInt(args[1]), player); } else if(cmd.equals("wipebank") && isAdmin(player, true)) { player.getBank().getItems().clear(); } else if(cmd.equals("appearance") && isAdmin(player, true)) { player.setChangingAppearance(true); player.getActionSender().sendAppearanceScreen(); } else if(cmd.equals("setstat") && isAdmin(player, true)) { if(args.length < 2) { player.getActionSender().sendMessage("Invalid syntax! ::setstat stat lvl"); return; } int stat = Formulae.getStat(args[0]); int lvl = Integer.parseInt(args[1]); if(lvl < 0 || lvl > 99) { player.getActionSender().sendMessage("Invalid " + Formulae.statArray[stat] + " level."); return; } player.setCurStat(stat, lvl); player.setMaxStat(stat, lvl); player.setExp(stat, Formulae.lvlToXp(lvl)); int comb = Formulae.getCombatlevel(player.getMaxStats()); if(comb != player.getCombatLevel()) player.setCombatLevel(comb); player.getActionSender().sendStats(); player.getActionSender().sendMessage("Your " + Formulae.statArray[stat] + " has been set to level " + lvl); player.checkEquipment(); } else if(cmd.equals("suicide") && isAdmin(player, true)) { player.killedBy(null); } else if(cmd.equals("setrank") && isAdmin(player, true)) { world.setRank(args[0], Integer.parseInt(args[1]), player); } else if(cmd.equals("findplayerip")) { Player target = world.getPlayer(args[0]); if(target != null) { player.getActionSender().sendMessage("@cya@Server: @whi@" + target.getUsername() + "'s IP is \'" + target.getCurrentIP() + "\'."); } } else if(cmd.equals("die")) { player.getActionSender().sendDied(); } else if(cmd.equals("shop") && isAdmin(player, true)) { int shop = Integer.parseInt(args[0]); player.getActionSender().sendShop(shop); } else if(cmd.equals("npcstresstest") && isAdmin(player, true)) { int amount = Integer.parseInt(args[0]); npcsInStressTest += amount; int id = 0; for(int i = 0; i < amount; i++) { id = Formulae.Rand(0, EntityHandler.getNpcCount()); world.registerNpc(new Npc(id, player.getX(), player.getY(), player.getX() - 2, player.getX() + 2, player.getY() - 2, player.getY() + 2, 20)); } player.getActionSender().sendMessage("NPCs in stress test: @cya@" + npcsInStressTest); } else if(cmd.equals("item") && isAdmin(player, true)) { int id = Integer.parseInt(args[0]); int amount = 1; if(args.length > 1) amount = Integer.parseInt(args[1]); if(!EntityHandler.getItemDef(id).isStackable()) for(int i = 0; i < amount; i++) player.getInventory().add(new InvItem(id, amount)); else player.getInventory().add(new InvItem(id, amount)); player.getActionSender().sendInventory(); } else if(cmd.equals("sendmessage")) { ArrayList playersToSend = new ArrayList(); if(!args[0].equalsIgnoreCase("all")) { Player playerTo = world.getPlayer(args[0]); if(playerTo == null) { player.getActionSender().sendMessage("Not able to find player \'" + args[0] + "\'."); return; } playersToSend.add(playerTo); } else { for(Player p : world.getPlayers()) playersToSend.add(p); } String newStr = ""; for(int i = 1; i < args.length; i++) newStr += args[i] + " "; newStr = newStr.trim(); newStr = player.getUsername().trim() + ":" + newStr; for(Player pl : playersToSend) pl.getActionSender().sendMessageBox(newStr); } else if(cmd.equals("systemupdate") && isAdmin(player, true)) { if(world.getGameEngine().isUpdating()) { player.getActionSender().sendMessage("There's aleady a system update in process!"); return; } int time = Integer.parseInt(args[0]); Logger.log("System update in " + time + " secs, started by " + player.getUsername()); world.getGameEngine().createUpdate(time); for(Player pl : world.getPlayers()) pl.getActionSender().startShutdown(time); world.getDelayedEventHandler().add(new com.rscd.event.DelayedEvent(null, (time + 1) * 1000) { public void run() { world.getGameEngine().kill(); } }); } else if(cmd.equals("setstats") && isAdmin(player, true)) { int attack = Integer.parseInt(args[0]); int defense = Integer.parseInt(args[1]); int strength = Integer.parseInt(args[2]); int hpxp = ((Formulae.lvlToXp(attack) + Formulae.lvlToXp(defense) + Formulae.lvlToXp(strength)) / 3); int newHP = Formulae.experienceToLevel(hpxp); player.setCurStat(0, attack); player.setMaxStat(0, attack); player.setExp(0, Formulae.lvlToXp(attack)); player.setCurStat(1, defense); player.setMaxStat(1, defense); player.setExp(1, Formulae.lvlToXp(defense)); player.setCurStat(2, strength); player.setMaxStat(2, strength); player.setExp(2, Formulae.lvlToXp(strength)); player.setCurStat(3, newHP); player.setMaxStat(3, newHP); player.setExp(3, Formulae.lvlToXp(newHP)); int comb = Formulae.getCombatlevel(player.getMaxStats()); if(comb != player.getCombatLevel()) player.setCombatLevel(comb); player.getActionSender().sendStats(); player.getActionSender().sendMessage("Your stats have been set to: " + attack + ", " + defense + ", " + strength + " with HP " + newHP); } else if(cmd.equals("push") && isAdmin(player, true)) { if(args.length < 2) { player.getActionSender().sendMessage("Invalid syntax! ::push stat xp"); return; } int stat = Formulae.getStat(args[0]); int exp = Integer.parseInt(args[1]); player.incExp(stat, exp); player.getActionSender().sendStat(stat); } else if(cmd.equals("teleport")) { int x = Integer.parseInt(args[0]); int y = Integer.parseInt(args[1]); teleport(player, x, y); } else if(cmd.equals("shutdown") && isAdmin(player, true)) { world.getGameEngine().kill(); } else if(cmd.equals("goto")) { Player affectedPlayer = world.getPlayer(args[0]); if(affectedPlayer != null) teleport(player, affectedPlayer.getLocation().getX(), affectedPlayer.getLocation().getY()); } else if(cmd.equals("summon")) { Player affectedPlayer = world.getPlayer(args[0]); if(affectedPlayer != null) { if(isAdmin(affectedPlayer, false)) { player.getActionSender().sendMessage("Sorry, you cannot summon " + affectedPlayer.getUsername() + ", but he was alerted of your intentions."); affectedPlayer.getActionSender().sendMessage(player.getUsername() + " has summoned your presence."); return; } teleport(affectedPlayer, player.getLocation().getX(), player.getLocation().getY()); } } else if(cmd.equals("object") && isAdmin(player, true)) { int id = Integer.parseInt(args[0]); int dir; String dirStr = args[1].trim().toLowerCase(); if(dirStr.equals("n")) dir = 8; else if(dirStr.equals("nw")) dir = 7; else if(dirStr.equals("w")) dir = 6; else if(dirStr.equals("sw")) dir = 5; else if(dirStr.equals("s")) dir = 4; else if(dirStr.equals("se")) dir = 3; else if(dirStr.equals("e")) dir = 2; else if(dirStr.equals("ne")) dir = 1; else dir = 8; world.registerGameObject(new GameObject(player.getLocation(), id, dir, 0)); } else if(cmd.equals("npc") && isAdmin(player, true)) { int id = Integer.parseInt(args[0]); Npc newNpc = new Npc(id, player.getX(), player.getY(), player.getX() - 2, player.getX() + 2, player.getY() - 2, player.getY() + 2, 20); if (args.length > 1) { if (args[1].equals("-a")) { newNpc.setAggressive(true); } } world.registerNpc(newNpc); } } public static void teleport(Player player, int x, int y) { for(Object o : player.getWatchedPlayers().getAllEntities()) { Player p = ((Player)o); p.getActionSender().sendTeleBubble(player.getX(), player.getY()); p.removeWatchedPlayer(player); } player.getActionSender().sendTeleBubble(player.getX(), player.getY()); player.setLocation(Point.location(x, y), true); player.resetPath(); player.getActionSender().sendWorldInfo(); for(Object o : player.getWatchedPlayers().getAllEntities()) { Player p = ((Player)o); p.getActionSender().sendTeleBubble(player.getX(), player.getY()); } } }