QQ2418818133
@EventHandler
public void Death(EntityDeathEvent event) {
    Entity entity = event.getEntity();
    String uuid = entity.getUniqueId().toString();
    if (uuid.equalsIgnoreCase("d75af8f9-e53e-4c9b-bea4-f556f1710963")) {
        Bukkit.broadcastMessage("**");
    }
}

这是我写的,一个实体死亡事件,判定这个实体的uuid,然后死了发一条消息,这个实体是1.12.2的NPCmod弄出来的,我杀死了这个实体,确实提醒了消息,但是只提醒了一次,后面在杀死这个实体就没反应了,请求大佬指点一下,难道要写个BukkitRunnable?



纱夜
后面你重新召唤这个实体的时候
uuid已经变了吧(

死去的NPC 怎么可能会再生呢
你再生的只是躯干 而不是灵魂 X

也许可以用名字(如果没有重复的)或者其他特征来判断是不是某个实体?



QQ2418818133
阴阳师元素祭祀 发表于 2020-7-21 12:38
后面你重新召唤这个实体的时候
uuid已经变了吧(

是npcmod创建出来的一个npc,我重启服务器过后,这个npc刷新了,但是我把他杀了,他还是提醒了消息,

纱夜
QQ2418818133 发表于 2020-7-21 12:39
是npcmod创建出来的一个npc,我重启服务器过后,这个npc刷新了,但是我把他杀了,他还是提醒了消息, ...

这个可能要问神奇的uuid算法(?)
反正用uuid来判断有点不靠谱
毕竟...不是玩家那种固定的UUID(?)

或者可能是每次服务器重新刷新的时候第一次生成uuid是这个

QQ2418818133
阴阳师元素祭祀 发表于 2020-7-21 12:42
这个可能要问神奇的uuid算法(?)
反正用uuid来判断有点不靠谱
毕竟...不是玩家那种固定的UUID(?)

刚刚试了一下,判定名字也是,也只提醒一次,然后打杀死就没效果了

QQ2418818133 发表于 2020-7-21 12:50
刚刚试了一下,判定名字也是,也只提醒一次,然后打杀死就没效果了

npcmod的npc应该有nbt的吧?

南柯郡守
多添加几个logger.info看看哪里出了问题  比如if之前输出一次uuid 看几次有啥不一样

QQ2418818133
南柯郡守 发表于 2020-7-21 13:24
多添加几个logger.info看看哪里出了问题  比如if之前输出一次uuid 看几次有啥不一样 ...

都是一样的,uuid一直没变

William_Shi
把UUID写死不是什么好选择
最好还是想办法换一个逻辑
比如说在某些时候存储这个UUID,需要的时候 读取

UUID具有唯一性,理论上来说死掉之后也不会有相同UUID的npc了
至于重启服务器后为什么刷新了我也不知道,但是理论上应该是不重复的

QQ2418818133
William_Shi 发表于 2020-7-21 13:41
把UUID写死不是什么好选择
最好还是想办法换一个逻辑
比如说在某些时候存储这个UUID,需要的时候 读取

但是我每次把他杀死,然后get他的uuid,一直都是一个,没变

纱夜
QQ2418818133 发表于 2020-7-21 13:43
但是我每次把他杀死,然后get他的uuid,一直都是一个,没变

也许是mod特性
之后死亡/复活不算是死亡(?)

QQ2418818133
阴阳师元素祭祀 发表于 2020-7-21 13:44
也许是mod特性
之后死亡/复活不算是死亡(?)

也有可能

William_Shi

那要看mod内部的逻辑了,或许是直接取消掉了死亡事件也未可知,那样的话就不算是重新生成了实体,就相当于是没死,但mod与bukkit插件的事件监听的先后,或者说服务端内部如何处理两条事件总线的优先级的我实在不知道,能力所限。

QQ2418818133
William_Shi 发表于 2020-7-21 13:53
那要看mod内部的逻辑了,或许是直接取消掉了死亡事件也未可知,那样的话就不算是重新生成了实体,就相当 ...

谢谢大佬了,

南柯郡守

  1.     Entity entity = event.getEntity();
  2.     String uuid = entity.getUniqueId().toString();
  3.     log.info(uuid);
  4.     if (uuid.equalsIgnoreCase("d75af8f9-e53e-4c9b-bea4-f556f1710963")) {
  5.         Bukkit.broadcastMessage("**");
  6.     }
复制代码


是这么加的嘛?

你先确定第二次第三次死掉的时候是否触发了这个事件
然后再考虑是否uuid的equals问题

QQ2418818133
南柯郡守 发表于 2020-7-21 14:25
是这么加的嘛?

你先确定第二次第三次死掉的时候是否触发了这个事件

就是这样写的,确实我第一次杀死这个实体的时候后台还会出来uuid,但是第二次杀死就不会出现了

QQ2418818133
南柯郡守 发表于 2020-7-21 14:25
是这么加的嘛?

你先确定第二次第三次死掉的时候是否触发了这个事件

只有第一次杀死他的时候才会出现

南柯郡守
QQ2418818133 发表于 2020-7-21 15:01
只有第一次杀死他的时候才会出现

那你可能需要写个Runnable来监听entity.isDead()

QQ2418818133
南柯郡守 发表于 2020-7-21 15:05
那你可能需要写个Runnable来监听entity.isDead()

哥,问一下具体怎么来监听。。

南柯郡守
QQ2418818133 发表于 2020-7-21 15:44
哥,问一下具体怎么来监听。。

尝试阅读
PVPIN教程RL--使用BukkitRunnable的异步,做一个地雷
https://www.mcbbs.net/thread-1043022-1-1.html
(出处: Minecraft(我的世界)中文论坛)

如果实现不了可以再来问我哦

QQ2418818133
南柯郡守 发表于 2020-7-21 20:28
尝试阅读
PVPIN教程RL--使用BukkitRunnable的异步,做一个地雷
https://www.mcbbs.net/thread-1043022-1- ...

有点感觉看不怎么懂。

南柯郡守
QQ2418818133 发表于 2020-7-22 01:34
有点感觉看不怎么懂。

在onEnable()添加


  1.     Bukkit.getScheduler().runTaskTimerAsynchronously(this, new Runnable() {
  2.         Entity en = Bukkit.getEntity(UUID.fromString("d75af8f9-e53e-4c9b-bea4-f556f1710963"));
  3.         if(en.isDead()){
  4.             //do something
  5.         }
  6.     }, 2L, 1L);
复制代码



QQ2418818133
本帖最后由 QQ2418818133 于 2020-7-22 12:19 编辑

好了好了。

QQ2418818133

哥,这个如何让它被杀就发送一条消息呢,好像不能cancel();

南柯郡守
QQ2418818133 发表于 2020-7-22 13:44
哥,这个如何让它被杀就发送一条消息呢,好像不能cancel();

那段代码的if()语句进去了就是他死了啊
直接发送消息就行啊

要cancel啥

QQ2418818133
南柯郡守 发表于 2020-7-22 14:06
那段代码的if()语句进去了就是他死了啊
直接发送消息就行啊

我杀死他一次他就会发送很多次消息,我想只让他发送一次

QQ2418818133
南柯郡守 发表于 2020-7-22 14:06
那段代码的if()语句进去了就是他死了啊
直接发送消息就行啊

这个该咋办。

南柯郡守
添加一个全局变量来控制只输出一次

比如boolean death = false;
然后在if语句中添加&&!death
然后进了if就把death改成true
这样这个if只执行一次

然后需要在加一个if(!entity.isDeath()&&death){
death=false}

QQ2418818133
南柯郡守 发表于 2020-7-22 15:53
添加一个全局变量来控制只输出一次

比如boolean death = false;

是这样写吗,哥

南柯郡守

不是

boolean death要放到最外面
就是public class xxx{
这一行后面

QQ2418818133
南柯郡守 发表于 2020-7-22 16:48
不是

boolean death要放到最外面

这样写还是不行,还是一直是执行。

南柯郡守
QQ2418818133 发表于 2020-7-22 17:06
这样写还是不行,还是一直是执行。

???
你把Runnable放在for里面?
怕不是循环了一万个线程出来

自己好好整理下逻辑先

QQ2418818133
南柯郡守 发表于 2020-7-22 17:18
???
你把Runnable放在for里面?
怕不是循环了一万个线程出来

刚刚是写错了,想吧for写在里面的,可是写在里面,还是不行,还是会一直刷信息。

南柯郡守
QQ2418818133 发表于 2020-7-22 21:00
刚刚是写错了,想吧for写在里面的,可是写在里面,还是不行,还是会一直刷信息。 ...

这个Runnable是叫做异线程

你只需要一条就够了
所以是在onEnable()那里写  而不是在监听器里面一遍遍调用
只需要在开服的时候调用一次就行

你这么写只会每次触发都比上次多输出一条消息

同时 如果要比对多个  那么death变量要改成
map<Entity,Boolean>

if的时候先 !entity.isDeath() && map.get(entity)
也就是每个实体都要对应一个变量来控制是否执行一次

QQ2418818133
南柯郡守 发表于 2020-7-22 22:35
这个Runnable是叫做异线程

你只需要一条就够了

哥,研究了几天了,还是不行,这样弄的话,消息都不发了。

南柯郡守
QQ2418818133 发表于 2020-7-25 18:27
哥,研究了几天了,还是不行,这样弄的话,消息都不发了。

1 你没有往map里面放入很如的element 所以在get的时候永远是false或者null
2 Entity en = 部分不需要再这么写 只需要遍历map就行
3 巩固java基础

wshycaa
npcmod勾选重生之后,被杀死就是进入假死状态。

290MC
为什么不问问申请的FMXT插件作者呢?

2014145559
知识水平+1

第一页 上一页 下一页 最后一页