如题,想做出如ESSXCHAT的[item]展示物品效果,现在稍微有了点头绪,但是还缺关键的一点,望大佬指正代码部分如下:
复制代码
- /**
- * [url=home.php?mod=space&uid=1231151]@author[/url] Hueihuea
- * [url=home.php?mod=space&uid=2203813]@VERSION[/url] 2020.01.24.00.27
- */
- /**
- * 枚举优先级
- * @enum {*} BukkitEventPriority.LOWEST 最低;
- * @enum {*} BukkitEventPriority.LOW 较低;
- * @enum {*} BukkitEventPriority.NORMAL 正常;
- * @enum {*} BukkitEventPriority.HIGH 较高;
- * @enum {*} BukkitEventPriority.HIGHEST 很高;
- * @enum {*} BukkitEventPriority.MONITOR 最高;
- * @description 注意 在MONITOR优先级下 您不应该对事件进行任何操作 它仅仅是为监听而存在。
- */
- //修改自 灰佬的1.7.10监听bukkit
- function init (e){
- var has =e.npc.world.getTempdata().has("lt")
- function BukkitEventPriority() {
- BukkitEventPriority.LOWEST;
- BukkitEventPriority.LOW;
- BukkitEventPriority.NORMAL;
- BukkitEventPriority.HIGH;
- BukkitEventPriority.HIGHEST;
- BukkitEventPriority.MONITOR;
- }
- {
- var EventPriority = Java.type("org.bukkit.event.EventPriority");
- BukkitEventPriority.LOWEST = EventPriority.LOWEST;
- BukkitEventPriority.LOW = EventPriority.LOW;
- BukkitEventPriority.NORMAL = EventPriority.NORMAL;
- BukkitEventPriority.HIGH = EventPriority.HIGH;
- BukkitEventPriority.HIGHEST = EventPriority.HIGHEST;
- BukkitEventPriority.MONITOR = EventPriority.MONITOR;
- }
- /**
- * 用于构建一个监听器对象
- * @param {String} event 要监听的事件
- * @param {"org.bukkit.event.EventPriority"} priority 优先级
- * @param {Function} executeFunction 执行函数
- * @param {Boolean} ignoreCancelled 可空,是否跳过已撤销的事件
- * @param {"org.bukkit.event.Listener"} listener 可空,监听器对象
- * @param {"org.bukkit.plugin.Plugin"} plugin 可空,插件对象
- * [url=home.php?mod=space&uid=109629]@See[/url] BukkitEventPriority
- */
- function BukkitEventListener(event, priority, executeFunction, ignoreCancelled, listener, plugin) {
- var server = Java.type("org.bukkit.Bukkit").getServer();
- var Class = Java.type("java.lang.Class");
- var eventType = Class.forName(event);
- if (!Class.forName("org.bukkit.event.Event").isAssignableFrom(eventType)) {
- throw new Error("The event isn't a bukkit event.");
- }
- var RegisteredListener = Java.type("org.bukkit.plugin.RegisteredListener");
- ignoreCancelled = (ignoreCancelled == null) ? false : ignoreCancelled;
- listener = Java.extend(Java.type("org.bukkit.event.Listener"), {});
- listener = new listener();
- plugin = Java.extend(Java.type("org.bukkit.plugin.Plugin"), {
- getDescription: function () {
- var PluginDescriptionFile = Java.type("org.bukkit.plugin.PluginDescriptionFile");
- return new PluginDescriptionFile("FakePlugin", "1.0", "null")
- },
- isEnabled: function () {
- return true;
- }
- });
- plugin = new plugin();
- var executor = Java.extend(Java.type("org.bukkit.plugin.EventExecutor"), {
- execute: function (paramListener, paramEvent) {
- try {
- var Class = Java.type("java.lang.Class");
- if (!eventType.isAssignableFrom(paramEvent.getClass())) {
- return;
- }
- var CustomTimingsHandler = Java.type("org.spigotmc.CustomTimingsHandler");
- var timings = new CustomTimingsHandler("World:DIM" + e.npc.world.getMCWorld().field_73011_w.field_149088_a
- + ",Pos:" + e.npc.x + "," + e.npc.y + "," + e.npc.z
- + ",NPCEntityUUID:" + e.npc.getMCEntity().func_110124_au()
- + ",Engine:" + engine
- + ",Context:" + context);
- var isAsync = paramEvent.isAsynchronous();
- if (!isAsync) {
- timings.startTiming();
- }
- executeFunction.call(null, paramEvent);
- if (!isAsync) {
- timings.stopTiming();
- }
- } catch (err) {
- var InvocationTargetException = Java.type("java.lang.reflect.InvocationTargetException");
- var EventException = Java.type("org.bukkit.event.EventException");
- if (err instanceof InvocationTargetException) {
- throw new EventException(err.getCause());
- }
- throw new EventException(err);
- }
- }
- });
- executor = new executor();
- var registeredListener = new RegisteredListener(listener, executor, priority, plugin, ignoreCancelled);
- /**
- * 用于注册这个监听器
- */
- this.register = function () {
- this.getEventListeners().register(registeredListener);
- }
- /**
- * 用于撤销这个监听器
- */
- this.unregister = function () {
- this.getEventListeners().unregister(registeredListener);
- }
- this.getEventListeners = function () {
- var manager = server.getPluginManager();
- var getEventListeners = manager.getClass().getDeclaredMethod("getEventListeners", Class.forName("java.lang.Class"));
- getEventListeners.setAccessible(true);
- return getEventListeners.invoke(manager, eventType);
- }
- }
- function isOp(name,world){
- var ops = world.getMCWorld().func_73046_m().func_184103_al().func_152606_n();
- for(var i in ops){
- if (ops[i] == name) {
- return true;
- }
- }
- return false;
- }
- if(has == null || has == undefined || has == false){
- new BukkitEventListener(
- "org.bukkit.event.player.PlayerChatEvent",
- EventPriority.NORMAL,
- function (event) {
- event.setCancelled(true)
- var asfgw =Java.type("org.bukkit.Bukkit")
- var allplayer =asfgw.getOnlinePlayers();
- var world =e.API.getIWorld(0);
- var w1 =e.API.getIWorld(2);
- var message =event.getMessage()
- var name =event.getPlayer().getName()
- if(event.getMessage() == "[item]" && event.getPlayer().getInventory().getItemInMainHand() != "ItemStack{AIR x 0}"){
- var selfplayer =world.getPlayer(event.getPlayer().getName())
- var selfplayer1 =w1.getPlayer(event.getPlayer().getName())
- for(var i in allplayer){
- if(allplayer[i].getName() != event.getPlayer().getName()){
- var as =""
- var scplayer =world.getPlayer(allplayer[i].getName());
- var scplayer1 =w1.getPlayer(allplayer[i].getName());
- if(scplayer != undefined && scplayer != null && selfplayer != undefined && selfplayer != null){
- scplayer.getMCEntity().func_145747_a(selfplayer.getMainhandItem().getMCItemStack().func_151000_E())
- }
- if(scplayer1 != undefined && scplayer1 != null && selfplayer != undefined && selfplayer != null){
- scplayer1.getMCEntity().func_145747_a(selfplayer.getMainhandItem().getMCItemStack().func_151000_E())
- }
- if(scplayer != undefined && scplayer != null && selfplayer1 != undefined && selfplayer1 != null){
- scplayer.getMCEntity().func_145747_a(selfplayer1.getMainhandItem().getMCItemStack().func_151000_E())
- }
- if(scplayer1 != undefined && scplayer1 != null && selfplayer1 != undefined && selfplayer1 != null){
- scplayer1.getMCEntity().func_145747_a(selfplayer1.getMainhandItem().getMCItemStack().func_151000_E())
- }
- }
- }
- if(selfplayer != undefined && selfplayer != null){
- selfplayer.getMCEntity().func_145747_a(selfplayer.getMainhandItem().getMCItemStack().func_151000_E())
- }else if(selfplayer1 != undefined && selfplayer1 != null){
- selfplayer1.getMCEntity().func_145747_a(selfplayer1.getMainhandItem().getMCItemStack().func_151000_E())//发送TextComponent
- }
- }
- }
- ).register()
- }
- }
兄啊,你不觉得这个写法过于繁杂了吗,你能写到这种程度,也差不多会写插件了,写这个还不如直接去写插件呢
一定要用cnpc的话,监听forge事件简单得多,不过我还是不能用脚本魔杖里的forge事件,只能写这种复制代码虽然cnpc的player事件里也自带了一个chat事件,但听说这个事件在混合端不触发,除非加https://www.mcbbs.net/thread-1081290-1-1.html,如果你能触发的话就用下面这种复制代码
一定要用cnpc的话,监听forge事件简单得多,不过我还是不能用脚本魔杖里的forge事件,只能写这种
- var MinecraftForge=Java.type("net.minecraftforge.common.MinecraftForge")
- var EventPriority=Java.type("net.minecraftforge.fml.common.eventhandler.EventPriority")
- var ServerChatEvent=Java.type("net.minecraftforge.event.ServerChatEvent")
- var busID=MinecraftForge.EVENT_BUS.class.getDeclaredField("busID")
- busID.setAccessible(true)
- new ServerChatEvent().getListenerList().register(busID.getInt(MinecraftForge.EVENT_BUS),EventPriority.LOW,function(event){
- if(event.getMessage()=="[item]"){
- var item=event.getPlayer().func_184614_ca()
- if(item.func_190926_b()){event.setCanceled(true);return}
- var formatArgs=event.getComponent().func_150271_j()
- formatArgs[formatArgs.length-1]=item.func_151000_E()
- }
- })
- var TextComponentTranslation=Java.type("net.minecraft.util.text.TextComponentTranslation")
- function chat(e){
- if(e.message=="[item]"){
- e.setCanceled(true)
- var player=e.player.getMCEntity()
- var item=player.func_184614_ca()
- if(item.func_190926_b())return
- player.func_184102_h().func_184103_al().func_148544_a(new TextComponentTranslation("chat.type.text",player.func_145748_c_(),item.func_151000_E()),false)
- }
- }
无敌三脚猫 发表于 2023-4-16 14:16
兄啊,你不觉得这个写法过于繁杂了吗,你能写到这种程度,也差不多会写插件了,写这个还不如直接去写插件呢 ...
其实用监听bukkit是因为essxchat导致我用serverchat的优先级不够 然后现在把essxchat删了以后我看我写这么多我也懒得用forge写了 感谢大佬~