本帖最后由 Hueihuea 于 2020-7-30 19:59 编辑 
技术有限 仅供参考
感谢193楼老哥提醒 1.12.2 推荐使用npc提供Forge脚本 而不是使用本方法注册监听器
经过半天的努力
我搞出了监听forge提供事件的办法
嘛 我们先上干货
(好久没发帖了 那就不要排版了)
复制代码嘛 再放一个示例
复制代码
然后我们来说说思路吧
好像也没什么思路 我们先看看register这个方法好吧
可以看到我是这样子写的
event.getListenerList().register(busID,priority,listener);
前两个参数都比较容易理解并且很容易获得
我们来说说第三个参数
第三个参数的类型是IEventListener
IEventListener是一个接口
也就是说 我们需要实现了IEventListener的类
那么怎么做到呢?
我们的Java对象有一个extend方法
他不仅是extends(继承) 还可以implements(实现)
那么我这样子写
复制代码就是实现IEventListener
这样子我们就获得了一个实现了IEventListener的Class对象
而这个Class的invoke方法.会调用listener函数(wsm要屏蔽5555)
然后我们实例化这个Class对象的类(好像有点绕)
最后把他当作参数传过去 就成功用它连监听xx事件了
然后下面是升级版哒!
复制代码
来自群组: CNPC Script Studio
技术有限 仅供参考
感谢193楼老哥提醒 1.12.2 推荐使用npc提供Forge脚本 而不是使用本方法注册监听器
经过半天的努力
我搞出了监听forge提供事件的办法
嘛 我们先上干货
(好久没发帖了 那就不要排版了)
- /**
 
- *void listenEvent(String eventType,String priority,function listener)
 
- *-eventType:你要监听的事件的类路径 如net.minecraftforge.event.ServerChatEvent
 
- *-priority:你的事件优先级 从低到高LOW LOWEST NORMAL HIGHEST HIGH
 
- *-listener:事件方法
 
- *监听事件
 
- */
 
- function listenEvent(eventType,priority,listener){
 
-  var Event=Java.type(eventType);
 
-     try{
 
-      var IEventListener=Java.type("net.minecraftforge.fml.common.eventhandler.IEventListener");
 
-      var EventPriority=Java.type("net.minecraftforge.fml.common.eventhandler.EventPriority");
 
-     }catch(err){
 
-      var IEventListener=Java.type("cpw.mods.fml.common.eventhandler.IEventListener");
 
-      var EventPriority=Java.type("cpw.mods.fml.common.eventhandler.EventPriority");
 
-     }
 
-  var MinecraftForge=Java.type("net.minecraftforge.common.MinecraftForge");
 
-  var event=new Event();
 
-     if(priority=="LOW"){
 
-      priority=EventPriority.LOW;
 
-     }
 
-     if(priority=="HIGH"){
 
-      priority=EventPriority.HIGH;
 
-     }
 
-     if(priority=="NORMAL"){
 
-      priority=EventPriority.NORMAL;
 
-     }
 
-     if(priority=="LOWEST"){
 
-      priority=EventPriority.LOWEST;
 
-     }
 
-     if(priority=="HIGHEST"){
 
-      priority=EventPriority.HIGHEST;
 
-     }
 
-  var EventListener=Java.extend(IEventListener,{
 
-   invoke:listener
 
-  });
 
-  listener=new EventListener();
 
-  var busID=MinecraftForge.EVENT_BUS.class.getDeclaredField("busID");
 
-  busID.setAccessible(true);
 
-  busID=busID.getInt(MinecraftForge.EVENT_BUS);
 
-  event.getListenerList().register(busID,priority,listener);
 
- }
 
- /**
 
- *@author Hueihuea
 
- *著作权属于Hueihuea 2019/6/16起生效
 
- */
- listenEvent("net.minecraftforge.event.ServerChatEvent","HIGH",function(event){
 
- event.setCanceled(true);
 
- });
 
- //让玩家闭嘴了ahhhhh
然后我们来说说思路吧
好像也没什么思路 我们先看看register这个方法好吧
可以看到我是这样子写的
event.getListenerList().register(busID,priority,listener);
前两个参数都比较容易理解并且很容易获得
我们来说说第三个参数
第三个参数的类型是IEventListener
IEventListener是一个接口
也就是说 我们需要实现了IEventListener的类
那么怎么做到呢?
我们的Java对象有一个extend方法
他不仅是extends(继承) 还可以implements(实现)
那么我这样子写
- var EventListener=Java.extend(IEventListener,{
 
-   invoke:listener
 
- });
这样子我们就获得了一个实现了IEventListener的Class对象
而这个Class的invoke方法.会调用listener函数(wsm要屏蔽5555)
然后我们实例化这个Class对象的类(好像有点绕)
最后把他当作参数传过去 就成功用它连监听xx事件了
然后下面是升级版哒!
 
- function Listener(eventType, listener, bus) {
 
-   var MinecraftForge = Java.type("net.minecraftforge.common.MinecraftForge");
 
-   this.eventType = eventType;
 
-   this.listener = listener;
 
-   this.bus = (bus == null) ? MinecraftForge.EVENT_BUS : bus;
 
-   this.getEventType = function () {
 
-     return this.eventType;
 
-   }
 
-   this.getListener = function () {
 
-     return this.listener;
 
-   }
 
-   this.getBus = function () {
 
-     return this.bus;
 
-   }
 
- }
 
- /**
 
- *EventListener listenEvent(String eventType,String priority,function listener)
 
- *-eventType:你要监听的事件的类路径 如net.minecraftforge.event.ServerChatEvent
 
- *-priority:你的事件优先级 从低到高LOWEST LOW NORMAL HIGH HIGHEST
 
- *-listener:事件方法
 
- *-bus:你可以指定EventBus
 
- *Return:
 
- *-Listener:监听器
 
- *监听事件并返回监听对象
 
- */
 
- function listenEvent(eventType, priority, listener, bus) {
 
-   var Event = Java.type(eventType);
 
-   try {
 
-     var IEventListener = Java.type("net.minecraftforge.fml.common.eventhandler.IEventListener");
 
-     var EventPriority = Java.type("net.minecraftforge.fml.common.eventhandler.EventPriority");
 
-   } catch (err) {
 
-     var IEventListener = Java.type("cpw.mods.fml.common.eventhandler.IEventListener");
 
-     var EventPriority = Java.type("cpw.mods.fml.common.eventhandler.EventPriority");
 
-   }
 
-   var MinecraftForge = Java.type("net.minecraftforge.common.MinecraftForge");
 
-   var event = new Event();
 
-   if (priority == "LOW") {
 
-     priority = EventPriority.LOW;
 
-   }
 
-   if (priority == "HIGH") {
 
-     priority = EventPriority.HIGH;
 
-   }
 
-   if (priority == "NORMAL") {
 
-     priority = EventPriority.NORMAL;
 
-   }
 
-   if (priority == "LOWEST") {
 
-     priority = EventPriority.LOWEST;
 
-   }
 
-   if (priority == "HIGHEST") {
 
-     priority = EventPriority.HIGHEST;
 
-   }
 
-   var EventListener = Java.extend(IEventListener, {
 
-     invoke: listener
 
-   });
 
-   listener = new EventListener();
 
-   var bus = (bus == null) ? MinecraftForge.EVENT_BUS : bus;
 
-   var busID = bus.class.getDeclaredField("busID");
 
-   busID.setAccessible(true);
 
-   busID = busID.getInt(bus);
 
-   event.getListenerList().register(busID, priority, listener);
 
-   return new Listener(eventType, listener, bus);
 
- }
 
- /**
 
- *void unListenEvent(String eventType,IEventListener listener,EventBus bus)
 
- *-eventType:事件的类路径 如net.minecraftforge.event.ServerChatEvent
 
- *-listener:事件方法
 
- *-bus:你可以指定EventBus
 
- *取消监听事件
 
- */
 
- function unListenEvent(eventType, listener, bus) {
 
-   var Event = Java.type(eventType);
 
-   var MinecraftForge = Java.type("net.minecraftforge.common.MinecraftForge");
 
-   var event = new Event();
 
-   var bus = (bus == null) ? MinecraftForge.EVENT_BUS : bus;
 
-   var busID = bus.class.getDeclaredField("busID");
 
-   busID.setAccessible(true);
 
-   busID = busID.getInt(bus);
 
-   event.getListenerList().unregister(busID, listener);
 
- }
 
- /**
 
- *@Author Hueihuea
 
- *著作权属于Hueihuea 2019/6/16起生效
 
- */
 
来自群组: CNPC Script Studio
看不懂 吹就是了。。最近正想学脚本魔杖。。
斯国一,谢谢分享
谢谢分享 谢谢
很好的技术贴
掌握新知识
!!!!!!
掌握新知识
!!!!!!
这个有什么用????看不懂qwq