CommandProcessor.java
Upload User: gwt600
Upload Date: 2021-06-03
Package Size: 704k
Code Size: 13k
Category:

Games

Development Platform:

Java

  1. //zREhYms
  2. package net.sf.odinms.client.messages;
  3. import java.io.File;
  4. import java.io.FileWriter;
  5. import java.io.IOException;
  6. import java.lang.management.ManagementFactory;
  7. import java.sql.Connection;
  8. import java.sql.PreparedStatement;
  9. import java.sql.SQLException;
  10. import java.util.ArrayList;
  11. import java.util.LinkedHashMap;
  12. import java.util.LinkedList;
  13. import java.util.List;
  14. import java.util.Map;
  15. import javax.management.MBeanServer;
  16. import javax.management.ObjectName;
  17. import net.sf.odinms.client.MapleCharacter;
  18. import net.sf.odinms.client.MapleClient;
  19. import net.sf.odinms.client.SkillFactory;
  20. import net.sf.odinms.server.life.MapleLifeFactory;
  21. import net.sf.odinms.database.DatabaseConnection;
  22. import net.sf.odinms.server.life.MapleMonster;
  23. import net.sf.odinms.net.channel.ChannelServer;
  24. import net.sf.odinms.net.channel.handler.GeneralchatHandler;
  25. import net.sf.odinms.server.TimerManager;
  26. import net.sf.odinms.scripting.npc.NPCScriptManager;
  27. import net.sf.odinms.server.maps.MapleMap;
  28. import net.sf.odinms.server.MapleShop;
  29. import net.sf.odinms.server.MapleShopFactory;
  30. import net.sf.odinms.tools.ClassFinder;
  31. import net.sf.odinms.tools.MockIOSession;
  32. import net.sf.odinms.tools.Pair;
  33. import net.sf.odinms.tools.StringUtil;
  34. import org.slf4j.Logger;
  35. import org.slf4j.LoggerFactory;
  36. public class CommandProcessor implements CommandProcessorMBean {
  37.     private static final Logger log = LoggerFactory.getLogger(GeneralchatHandler.class);
  38.     private static List<Pair<MapleCharacter, String>> gmlog = new LinkedList<Pair<MapleCharacter, String>>();
  39.     private Map<String, DefinitionCommandPair> commands = new LinkedHashMap<String, DefinitionCommandPair>();
  40.     private static CommandProcessor instance = new CommandProcessor();
  41.     private static Runnable persister;
  42.     static {
  43.         persister = new PersistingTask();
  44.         TimerManager.getInstance().register(persister, 62000);
  45.     }
  46.     private CommandProcessor() {
  47.         instance = this; // hackydihack
  48.         reloadCommands();
  49.     }
  50.     public static class PersistingTask implements Runnable {
  51.         @Override
  52.         public void run() {
  53.             synchronized (gmlog) {
  54.                 Connection con = DatabaseConnection.getConnection();
  55.                 try {
  56.                     PreparedStatement ps = con.prepareStatement("INSERT INTO gmlog (cid, command) VALUES (?, ?)");
  57.                     for (Pair<MapleCharacter, String> logentry : gmlog) {
  58.                         ps.setInt(1, logentry.getLeft().getId());
  59.                         ps.setString(2, logentry.getRight());
  60.                         ps.executeUpdate();
  61.                     }
  62.                     ps.close();
  63.                 } catch (SQLException e) {
  64.                     log.error("错误的GM命令文档!", e);
  65.                 }
  66.                 gmlog.clear();
  67.             }
  68.         }
  69.     }
  70.     public static boolean makeCustomSummon(MapleClient c, String type, int monsterid, int quantity, int gmlvl) {
  71.         if (c.getPlayer().gmLevel() >= gmlvl) {
  72.             if (type.equals("spawn")) {
  73.                 for (int i = 0; i < quantity; i++) {
  74.                     MapleMonster mob = MapleLifeFactory.getMonster(monsterid);
  75.                     c.getPlayer().getMap().spawnMonsterOnGroudBelow(mob, c.getPlayer().getPosition());
  76.                 }
  77.             } else if (type.equals("npc")) {
  78.                 NPCScriptManager npc = NPCScriptManager.getInstance();
  79.                 npc.start(c, monsterid, null, null);
  80.             } else if (type.equals("shop")) {
  81.                 MapleShopFactory s = MapleShopFactory.getInstance();
  82.                 MapleShop shop = s.getShop(monsterid);
  83.                 shop.sendShop(c);
  84.             } else {
  85.                 c.getPlayer().dropMessage("Custom Command failed");
  86.                 return false;
  87.             }
  88.         } else {
  89.             c.getPlayer().dropMessage("Your GM level isn't high enough.");
  90.         }
  91.         return true;
  92.     }
  93.     public static void registerMBean() {
  94.         MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
  95.         try {
  96.             mBeanServer.registerMBean(instance, new ObjectName("net.sf.odinms.client.messages:name=CommandProcessor"));
  97.         } catch (Exception e) {
  98.             log.error("错误的命令试图载入数据库表,为防止数据库混乱,已被阻止,载入失败!");
  99.         }
  100.     }
  101.     public static String joinAfterString(String splitted[], String str) {
  102.         for (int i = 1; i < splitted.length; i++) {
  103.             if (splitted[i].equalsIgnoreCase(str) && i + 1 < splitted.length) {
  104.                 return StringUtil.joinStringFrom(splitted, i + 1);
  105.             }
  106.         }
  107.         return null;
  108.     }
  109.     public static int getOptionalIntArg(String splitted[], int position, int def) {
  110.         if (splitted.length > position) {
  111.             try {
  112.                 return Integer.parseInt(splitted[position]);
  113.             } catch (NumberFormatException nfe) {
  114.                 return def;
  115.             }
  116.         }
  117.         return def;
  118.     }
  119.     public static String getNamedArg(String splitted[], int startpos, String name) {
  120.         for (int i = startpos; i < splitted.length; i++) {
  121.             if (splitted[i].equalsIgnoreCase(name) && i + 1 < splitted.length) {
  122.                 return splitted[i + 1];
  123.             }
  124.         }
  125.         return null;
  126.     }
  127.     public static Integer getNamedIntArg(String splitted[], int startpos, String name) {
  128.         String arg = getNamedArg(splitted, startpos, name);
  129.         if (arg != null) {
  130.             try {
  131.                 return Integer.parseInt(arg);
  132.             } catch (NumberFormatException nfe) {
  133.             }
  134.         }
  135.         return null;
  136.     }
  137.     public static int getNamedIntArg(String splitted[], int startpos, String name, int def) {
  138.         Integer ret = getNamedIntArg(splitted, startpos, name);
  139.         if (ret == null) {
  140.             return def;
  141.         }
  142.         return ret.intValue();
  143.     }
  144.     public static Double getNamedDoubleArg(String splitted[], int startpos, String name) {
  145.         String arg = getNamedArg(splitted, startpos, name);
  146.         if (arg != null) {
  147.             try {
  148.                 return Double.parseDouble(arg);
  149.             } catch (NumberFormatException nfe) {
  150.             }
  151.         }
  152.         return null;
  153.     }
  154.     public String processCommandJMX(int cserver, int mapid, String command) {
  155.         ChannelServer cserv = ChannelServer.getInstance(cserver);
  156.         if (cserv == null) {
  157.             return "指定的区域不存在这个服务器进程,无法关闭!";
  158.         }
  159.         MapleClient c = new MapleClient(null, null, new MockIOSession());
  160.         MapleCharacter chr = MapleCharacter.getDefault(c, 26023);
  161.         c.setPlayer(chr);
  162.         MapleMap map = cserv.getMapFactory().getMap(mapid);
  163.         if (map != null) {
  164.             chr.setMap(map);
  165.             SkillFactory.getSkill(9101004).getEffect(1).applyTo(chr);
  166.             map.addPlayer(chr);
  167.         }
  168.         cserv.addPlayer(chr);
  169.         MessageCallback mc = new StringMessageCallback();
  170.         try {
  171.             processCommandInternal(c, mc, command);
  172.         } finally {
  173.             if (map != null) {
  174.                 map.removePlayer(chr);
  175.             }
  176.             cserv.removePlayer(chr);
  177.         }
  178.         return mc.toString();
  179.     }
  180.     public boolean processCommand(MapleClient c, String line) {
  181.         return instance.processCommandInternal(c, new ServernoticeMapleClientMessageCallback(c), line);
  182.     }
  183.     public static void forcePersisting() {
  184.         persister.run();
  185.     }
  186.     public static CommandProcessor getInstance() {
  187.         return instance;
  188.     }
  189.     public void reloadCommands() {
  190.         commands.clear();
  191.         try {
  192.             ClassFinder classFinder = new ClassFinder();
  193.             String[] classes = classFinder.listClasses("net.sf.odinms.client.messages.commands", true);
  194.             for (String clazz : classes) {
  195.                 Class<?> clasz = Class.forName(clazz);
  196.                 if (Command.class.isAssignableFrom(clasz)) {
  197.                     try {
  198.                         Command newInstance = (Command) clasz.newInstance();
  199.                         registerCommand(newInstance);
  200.                     } catch (Exception e) {
  201.                         log.error("错误的GM命令!", e);
  202.                     }
  203.                 }
  204.             }
  205.         } catch (ClassNotFoundException e) {
  206.             log.error("注入:", e);
  207.         }
  208.     }
  209.     private void registerCommand(Command command) {
  210.         CommandDefinition[] definition = command.getDefinition();
  211.         for (CommandDefinition def : definition) {
  212.             commands.put(def.getCommand().toLowerCase(), new DefinitionCommandPair(command, def));
  213.         }
  214.     }
  215.     public void dropHelp(MapleCharacter chr, MessageCallback mc, int page) {
  216.         List<DefinitionCommandPair> allCommands = new ArrayList<DefinitionCommandPair>(commands.values());
  217.         int startEntry = (page - 1) * 20;
  218.         mc.dropMessage("命令页码: " + page);
  219.         for (int i = startEntry; i < startEntry + 20 && i < allCommands.size(); i++) {
  220.             CommandDefinition commandDefinition = allCommands.get(i).getDefinition();
  221.             if (chr.getGMLevel() == commandDefinition.getRequiredLevel()) {
  222.                 dropHelpForDefinition(mc, commandDefinition);
  223.             }
  224.         }
  225.     }
  226.     public void writeCommandList() {
  227.         try {
  228.             List<DefinitionCommandPair> allCommands = new ArrayList<DefinitionCommandPair>(commands.values());
  229.             FileWriter fw = new FileWriter(new File("Commands.txt"));
  230.             String lineSeparator = System.getProperty("line.separator");
  231.             fw.flush();
  232.             for (int x = 4; x >= 0; x--) {
  233.                 fw.write("---------------------------------");
  234.                 fw.write(lineSeparator);
  235.                 fw.write("       等级为: " + x + " C的GM命令文档!.");
  236.                 fw.write(lineSeparator);
  237.                 fw.write("---------------------------------");
  238.                 fw.write(lineSeparator);
  239.                 fw.write(lineSeparator);
  240.                 for (int i = 0; i < allCommands.size(); i++) {
  241.                     if (allCommands.get(i).getDefinition().getRequiredLevel() == x) {
  242.                         fw.write(allCommands.get(i).getDefinition().getCommand());
  243.                         fw.write(lineSeparator);
  244.                     }
  245.                 }
  246.             }
  247.             fw.close();
  248.         } catch (IOException e) {
  249.             log.error("注入:", e);
  250.         }
  251.     }
  252.     private void dropHelpForDefinition(MessageCallback mc, CommandDefinition commandDefinition) {
  253.         mc.dropMessage(commandDefinition.getCommand());
  254.     }
  255.     private boolean processCommandInternal(MapleClient c, MessageCallback mc, String line) {
  256.         switch (line.charAt(0)) {
  257.            case '!': // GM commands
  258.             case '@': // Player commands
  259.             case '#': // Interns
  260.             case '$': // VIP?
  261.                 String[] splitted = line.split(" ");
  262.                 if (splitted.length > 0) {
  263.                     DefinitionCommandPair definitionCommandPair = commands.get(splitted[0].toLowerCase().substring(1));
  264.                     if (definitionCommandPair != null && c.getPlayer().getGMLevel() >= definitionCommandPair.getDefinition().getRequiredLevel()) {
  265.                         if (definitionCommandPair.getDefinition().getRequiredLevel() >= 3) {
  266.                             gmlog.add(new Pair<MapleCharacter, String>(c.getPlayer(), line));
  267.                             log.warn("{} 使用命令: {}", c.getPlayer().getName(), line);
  268.                         }
  269.                         try {
  270.                             definitionCommandPair.getCommand().execute(c, mc, splitted);
  271.                         } catch (Exception e) {
  272.                             System.err.println("【警告】:出现错误命令!!为了服务器的稳定,请进入游戏检查!");
  273.                         }
  274.                         return true;
  275.                     }
  276.                 }
  277.         }
  278.         return false;
  279.     }
  280. }
  281. class DefinitionCommandPair {
  282.     private Command command;
  283.     private CommandDefinition definition;
  284.     public DefinitionCommandPair(Command command, CommandDefinition definition) {
  285.         super();
  286.         this.command = command;
  287.         this.definition = definition;
  288.     }
  289.     public Command getCommand() {
  290.         return command;
  291.     }
  292.     public CommandDefinition getDefinition() {
  293.         return definition;
  294.     }
  295. }