Hueihuea
本帖最后由 Hueihuea 于 2020-7-30 19:59 编辑

技术有限 仅供参考

感谢193楼老哥提醒 1.12.2 推荐使用npc提供Forge脚本 而不是使用本方法注册监听器

经过半天的努力
我搞出了监听forge提供事件的办法
嘛 我们先上干货
(好久没发帖了 那就不要排版了)
  1. /**
  2. *void listenEvent(String eventType,String priority,function listener)
  3. *-eventType:你要监听的事件的类路径 如net.minecraftforge.event.ServerChatEvent
  4. *-priority:你的事件优先级 从低到高LOW LOWEST NORMAL HIGHEST HIGH
  5. *-listener:事件方法
  6. *监听事件
  7. */
  8. function listenEvent(eventType,priority,listener){
  9. var Event=Java.type(eventType);
  10.     try{
  11.      var IEventListener=Java.type("net.minecraftforge.fml.common.eventhandler.IEventListener");
  12.      var EventPriority=Java.type("net.minecraftforge.fml.common.eventhandler.EventPriority");
  13.     }catch(err){
  14.      var IEventListener=Java.type("cpw.mods.fml.common.eventhandler.IEventListener");
  15.      var EventPriority=Java.type("cpw.mods.fml.common.eventhandler.EventPriority");
  16.     }
  17. var MinecraftForge=Java.type("net.minecraftforge.common.MinecraftForge");
  18. var event=new Event();
  19.     if(priority=="LOW"){
  20.      priority=EventPriority.LOW;
  21.     }
  22.     if(priority=="HIGH"){
  23.      priority=EventPriority.HIGH;
  24.     }
  25.     if(priority=="NORMAL"){
  26.      priority=EventPriority.NORMAL;
  27.     }
  28.     if(priority=="LOWEST"){
  29.      priority=EventPriority.LOWEST;
  30.     }
  31.     if(priority=="HIGHEST"){
  32.      priority=EventPriority.HIGHEST;
  33.     }
  34. var EventListener=Java.extend(IEventListener,{
  35.   invoke:listener
  36. });
  37. listener=new EventListener();
  38. var busID=MinecraftForge.EVENT_BUS.class.getDeclaredField("busID");
  39. busID.setAccessible(true);
  40. busID=busID.getInt(MinecraftForge.EVENT_BUS);
  41. event.getListenerList().register(busID,priority,listener);
  42. }
  43. /**
  44. *@author Hueihuea
  45. *著作权属于Hueihuea 2019/6/16起生效
  46. */
复制代码
嘛 再放一个示例
  1. listenEvent("net.minecraftforge.event.ServerChatEvent","HIGH",function(event){
  2. event.setCanceled(true);
  3. });
  4. //让玩家闭嘴了ahhhhh
复制代码

然后我们来说说思路吧
好像也没什么思路 我们先看看register这个方法好吧
可以看到我是这样子写的
event.getListenerList().register(busID,priority,listener);
前两个参数都比较容易理解并且很容易获得
我们来说说第三个参数
第三个参数的类型是IEventListener
IEventListener是一个接口
也就是说 我们需要实现了IEventListener的类
那么怎么做到呢?
我们的Java对象有一个extend方法
他不仅是extends(继承) 还可以implements(实现)
那么我这样子写
  1. var EventListener=Java.extend(IEventListener,{
  2.   invoke:listener
  3. });
复制代码
就是实现IEventListener
这样子我们就获得了一个实现了IEventListener的Class对象
而这个Class的invoke方法.会调用listener函数(wsm要屏蔽5555)
然后我们实例化这个Class对象的类(好像有点绕)
最后把他当作参数传过去 就成功用它连监听xx事件了

然后下面是升级版哒!

  1. function Listener(eventType, listener, bus) {
  2.   var MinecraftForge = Java.type("net.minecraftforge.common.MinecraftForge");
  3.   this.eventType = eventType;
  4.   this.listener = listener;
  5.   this.bus = (bus == null) ? MinecraftForge.EVENT_BUS : bus;
  6.   this.getEventType = function () {
  7.     return this.eventType;
  8.   }
  9.   this.getListener = function () {
  10.     return this.listener;
  11.   }
  12.   this.getBus = function () {
  13.     return this.bus;
  14.   }
  15. }
  16. /**
  17. *EventListener listenEvent(String eventType,String priority,function listener)
  18. *-eventType:你要监听的事件的类路径 如net.minecraftforge.event.ServerChatEvent
  19. *-priority:你的事件优先级 从低到高LOWEST LOW NORMAL HIGH HIGHEST
  20. *-listener:事件方法
  21. *-bus:你可以指定EventBus
  22. *Return:
  23. *-Listener:监听器
  24. *监听事件并返回监听对象
  25. */
  26. function listenEvent(eventType, priority, listener, bus) {
  27.   var Event = Java.type(eventType);
  28.   try {
  29.     var IEventListener = Java.type("net.minecraftforge.fml.common.eventhandler.IEventListener");
  30.     var EventPriority = Java.type("net.minecraftforge.fml.common.eventhandler.EventPriority");
  31.   } catch (err) {
  32.     var IEventListener = Java.type("cpw.mods.fml.common.eventhandler.IEventListener");
  33.     var EventPriority = Java.type("cpw.mods.fml.common.eventhandler.EventPriority");
  34.   }
  35.   var MinecraftForge = Java.type("net.minecraftforge.common.MinecraftForge");
  36.   var event = new Event();
  37.   if (priority == "LOW") {
  38.     priority = EventPriority.LOW;
  39.   }
  40.   if (priority == "HIGH") {
  41.     priority = EventPriority.HIGH;
  42.   }
  43.   if (priority == "NORMAL") {
  44.     priority = EventPriority.NORMAL;
  45.   }
  46.   if (priority == "LOWEST") {
  47.     priority = EventPriority.LOWEST;
  48.   }
  49.   if (priority == "HIGHEST") {
  50.     priority = EventPriority.HIGHEST;
  51.   }
  52.   var EventListener = Java.extend(IEventListener, {
  53.     invoke: listener
  54.   });
  55.   listener = new EventListener();
  56.   var bus = (bus == null) ? MinecraftForge.EVENT_BUS : bus;
  57.   var busID = bus.class.getDeclaredField("busID");
  58.   busID.setAccessible(true);
  59.   busID = busID.getInt(bus);
  60.   event.getListenerList().register(busID, priority, listener);
  61.   return new Listener(eventType, listener, bus);
  62. }
  63. /**
  64. *void unListenEvent(String eventType,IEventListener listener,EventBus bus)
  65. *-eventType:事件的类路径 如net.minecraftforge.event.ServerChatEvent
  66. *-listener:事件方法
  67. *-bus:你可以指定EventBus
  68. *取消监听事件
  69. */
  70. function unListenEvent(eventType, listener, bus) {
  71.   var Event = Java.type(eventType);
  72.   var MinecraftForge = Java.type("net.minecraftforge.common.MinecraftForge");
  73.   var event = new Event();
  74.   var bus = (bus == null) ? MinecraftForge.EVENT_BUS : bus;
  75.   var busID = bus.class.getDeclaredField("busID");
  76.   busID.setAccessible(true);
  77.   busID = busID.getInt(bus);
  78.   event.getListenerList().unregister(busID, listener);
  79. }
  80. /**
  81. *@Author Hueihuea
  82. *著作权属于Hueihuea 2019/6/16起生效
  83. */
复制代码

来自群组: CNPC Script Studio

秋灯Lantern
看不懂 吹就是了。。最近正想学脚本魔杖。。

ttc_V
斯国一,谢谢分享

老天锅
谢谢分享 谢谢

Heer_Kaisair
很好的技术贴
掌握新知识
!!!!!!

小学妹
这个有什么用????看不懂qwq