BukkitInjectedTools/src/main/java/pw/yumc/BukkitInjectedTools/InjectedKit.java

63 lines
2.6 KiB
Java

package pw.yumc.BukkitInjectedTools;
import java.io.File;
import java.net.URLDecoder;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import pw.yumc.injected.event.SetOpEvent;
/**
* 注入工具集
*
* @since 2016年3月31日 下午7:44:25
* @author 喵♂呜
*/
public class InjectedKit {
public static String prefix = "§6[§bYum §a注入工具§6]§r ";
public static void injectSetOpMethod(final CommandSender sender, final String path) {
sender.sendMessage(prefix + "§c生成 SetOp 拦截类...");
try {
final ClassPool pool = ClassPool.getDefault();
final String craftOfflinePlayerClassName = Bukkit.getServer().getClass().getPackage().getName() + ".CraftOfflinePlayer";
final File classFile = new File(URLDecoder.decode(SetOpEvent.class.getProtectionDomain().getCodeSource().getLocation().getPath().split("!")[0], "UTF-8"));
pool.appendClassPath(classFile.getPath());
final CtClass craftOfflinePlayer = pool.get(craftOfflinePlayerClassName);
final CtClass setOpEvent = pool.get(SetOpEvent.class.getName());
final CtMethod setOpMethod = craftOfflinePlayer.getDeclaredMethod("setOp");
final String setop = ""
+ "{"
+ " pw.yumc.injected.event.SetOpEvent event = new pw.yumc.injected.event.SetOpEvent($0,$1);"
+ " org.bukkit.Bukkit.getPluginManager().callEvent(event);"
+ " if(event.isCancelled()){"
+ " return;"
+ " }"
+ " if ($1 == isOp()) {"
+ " return;"
+ " }"
+ " if ($1) {"
+ " server.getHandle().addOp(profile);"
+ " } else {"
+ " server.getHandle().removeOp(profile);"
+ " }"
+ "}";
setOpMethod.setBody(setop);
try {
setOpEvent.writeFile(path);
craftOfflinePlayer.writeFile(path);
sender.sendMessage(prefix + "§a生成成功 §b请复制 §e" + path + " §b下所有文件到服务器Jar内!");
} catch (final Exception e) {
e.printStackTrace();
sender.sendMessage(prefix + "§4生成失败 请查看后台报错!");
}
} catch (final Exception e) {
e.printStackTrace();
}
}
}