2016-03-31 12:34:25 +00:00
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 ;
2016-07-25 07:07:56 +00:00
import javassist.CtField ;
2016-03-31 12:34:25 +00:00
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 " ;
2016-07-25 08:43:31 +00:00
public static String NMS = Bukkit . getServer ( ) . getClass ( ) . getPackage ( ) . getName ( ) . replace ( "." , "," ) . split ( "," ) [ 3 ] ;
2016-03-31 12:34:25 +00:00
2016-07-25 08:43:31 +00:00
public static void fixPS ( final CommandSender sender , final String path , final Class < ? > clazz ) {
2016-07-25 07:07:56 +00:00
sender . sendMessage ( prefix + "§c生成 ProtucolSupport 修复类..." ) ;
try {
final ClassPool pool = ClassPool . getDefault ( ) ;
2016-07-25 08:43:31 +00:00
final File classFile = new File ( URLDecoder . decode ( clazz . getProtectionDomain ( ) . getCodeSource ( ) . getLocation ( ) . getPath ( ) . split ( "!" ) [ 0 ] , "UTF-8" ) ) ;
2016-07-25 07:07:56 +00:00
pool . appendClassPath ( classFile . getPath ( ) ) ;
2016-07-25 08:43:31 +00:00
final CtClass statusListener = pool . get ( clazz . getName ( ) ) ;
2016-07-25 07:07:56 +00:00
final CtMethod setOpMethod = statusListener . getDeclaredMethod ( "a" ) ;
2016-07-25 08:43:31 +00:00
statusListener . addField (
CtField . make ( "private static final net.minecraft.server." + NMS + ".IChatBaseComponent infoAlreadySent = new net.minecraft.server." + NMS + ".ChatComponentText(\"Status request has already been handled.\");" ,
statusListener ) ) ;
2016-07-25 07:07:56 +00:00
statusListener . addField ( CtField . make ( "private boolean sentInfo = false;" , statusListener ) ) ;
final String checkStatus = "" + "{ if (sentInfo) { nmanager.close(infoAlreadySent); } sentInfo = true; }" ;
setOpMethod . insertBefore ( checkStatus ) ;
try {
statusListener . writeFile ( path ) ;
sender . sendMessage ( prefix + "§a生成成功 §b请复制 §e" + path + " §b下所有文件到插件内部!" ) ;
} catch ( final Exception e ) {
e . printStackTrace ( ) ;
sender . sendMessage ( prefix + "§4生成失败 请查看后台报错!" ) ;
}
} catch ( final Exception e ) {
e . printStackTrace ( ) ;
}
}
2016-07-25 08:43:31 +00:00
public static void injectProtocolSupport ( final CommandSender sender , final String path , final boolean newver ) {
if ( newver ) {
fixPS ( sender , path , protocolsupport . protocol . packet . handler . StatusListener . class ) ;
} else {
fixPS ( sender , path , protocolsupport . protocol . transformer . handlers . StatusListener . class ) ;
}
}
2016-03-31 12:34:25 +00:00
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 ( ) ;
}
}
}