Wizy
有什么办法能在一个没有参数的重写方法内让ICommandsender类的对象适配为entity或者entityplayer的对象, 或者说在没有参数的重写方法中怎么检测指令输入者, 来执行另一个套在这个方法里面的有参方法(比如像图片里面这种)
感谢!


Thehrz
你这是覆写了什么类?

Wizy
Thehrz 发表于 2022-8-20 10:08
你这是覆写了什么类?

重写了EntityMob里面的onkillCommand

Thehrz
Wizy 发表于 2022-8-20 10:12
重写了EntityMob里面的onkillCommand

那执行者不就是 this 吗?

Wizy
Thehrz 发表于 2022-8-20 10:18
那执行者不就是 this 吗?

但是这样执行没有用,是不是什么地方写错了
  1. protected void execute(ICommandSender sender) throws CommandException {

  2.             EntityPlayer entityplayer = getCommandSenderAsPlayer(sender);
  3.         if (sender instanceof EntityPlayer) {
  4.             ProcedureBigBroOnKillCommand.executeProcedure(entityplayer);
  5.         }
  6.     }

  7.     @Override
  8.     public void onKillCommand() {
  9.         MinecraftServer server = this.getServer();
  10.         World worldIn = this.getEntityWorld();
  11.         try {
  12.             EntityPlayer entityPlayer = getCommandSenderAsPlayer(this);
  13.         } catch (PlayerNotFoundException e) {
  14.             e.printStackTrace();
  15.         }
  16.         try {
  17.             execute(this);
  18.         } catch (CommandException e) {
  19.             e.printStackTrace();
  20.         }
  21.     }
复制代码



另一个类:
  1.     public static void executeProcedure(EntityPlayer player) {
  2.         player.setDead();
  3.     }
复制代码

Thehrz
Wizy 发表于 2022-8-20 10:25
但是这样执行没有用,是不是什么地方写错了

我没仔细看代码 Sorry 这个 this 其实是被 Kill 的实体

不能从这里获取到 Sender

这个 onKillCommand 就是直接杀死实体

Entity
  1. public void onKillCommand() {
  2.     this.remove();
  3. }
复制代码


只能从 CommandKill#processCommand() 获取执行Kill命令的执行者

Wizy
本帖最后由 Wizy 于 2022-8-20 10:37 编辑
Thehrz 发表于 2022-8-20 10:30
我没仔细看代码 Sorry 这个 this 其实是被 Kill 的实体

不能从这里获取到 Sender

不能类似写传送指令的方法来获取指令执行者吗(      貌似需要通过execute方法里面的ICommandSender参数

Thehrz
Wizy 发表于 2022-8-20 10:35
不能类似写传送指令的方法来获取指令执行者吗(      貌似需要通过execute方法里面的ICommandSender参数
...

? 那是怎样的

总之就是不能通过onKillCommand 来获取执行者

在后来的MCP名中

这个 onKillCommand 直接变成了 kill 所以说它和命令其实关系不大


Wizy
本帖最后由 Wizy 于 2022-8-20 10:44 编辑
Thehrz 发表于 2022-8-20 10:41
? 那是怎样的

总之就是不能通过onKillCommand 来获取执行者

哦哦, 我意思其实是被onkill的时候执行另一个动作, 而不是被杀死, 直接作用在实体身上的是可以实现的, 但是我想实现反过来作用在玩家身上, 或者能获取范围玩家也行

Thehrz
Wizy 发表于 2022-8-20 10:43
哦哦, 我意思其实是被onkill的时候执行另一个动作, 而不是被杀死, 直接作用在实体身上的是可以实现的, 但 ...

那为什么不监听 LivingDeathEvent 事件?

Wizy
Thehrz 发表于 2022-8-20 11:21
那为什么不监听 LivingDeathEvent 事件?

这个条件需要对象死亡吗

Thehrz
Wizy 发表于 2022-8-20 11:50
这个条件需要对象死亡吗



事件可以 setCancelled

最简单就是监听事件 或者写 CoreMod 注入到 processCommand

Wizy
Thehrz 发表于 2022-8-20 12:09


事件可以 setCancelled

监听LivingDeath的话怎么套用到onkill方法里面呢, onkill里面没有参数而且不能在里面获取玩家的话LivingDeath事件还是不能适用于onkill里面阿

Thehrz
Wizy 发表于 2022-8-20 17:19
监听LivingDeath的话怎么套用到onkill方法里面呢, onkill里面没有参数而且不能在里面获取玩家的话LivingD ...

为什么一定要使用onKillCommand

这个就是直接杀死实体 不一定是命令调用它 Mod如果要杀死实体也可以使用这个

不要因为它的 MCP名 误导了

LivingDeathEvent 确实不能监听到Kill命令

那这种情况下 只能从 CommandKill#processCommand 来达到你想要的

Wizy
Thehrz 发表于 2022-8-20 17:53
为什么一定要使用onKillCommand

这个就是直接杀死实体 不一定是命令调用它 Mod如果要杀死实体也可以使用 ...

已经解决了,之前this对象搞错了,直接get了附近玩家,还是要多看看源码......直接监听有个问题,就和重写setdead方法一样会出问题,直接规避死亡的话会导致实体被刷掉的时候游戏崩溃,不知道是源码的小bug还是啥

Thehrz
Wizy 发表于 2022-8-24 14:14
已经解决了,之前this对象搞错了,直接get了附近玩家,还是要多看看源码......直接监听有个问题,就和重写setd ...

上传游戏崩溃报告看看

Wizy
本帖最后由 Wizy 于 2022-8-25 12:56 编辑
Thehrz 发表于 2022-8-24 17:45
上传游戏崩溃报告看看

应该是这个, 编译器抛了个空指针异常, 但是不知道是哪的问题

Thehrz
Wizy 发表于 2022-8-25 12:51
应该是这个, 编译器抛了个空指针异常, 但是不知道是哪的问题

上传 com.wizy.wizymod.objects.entity.BigBro 类 完整代码

Wizy
本帖最后由 Wizy 于 2022-8-25 13:18 编辑
Thehrz 发表于 2022-8-25 13:06
上传 com.wizy.wizymod.objects.entity.BigBro 类 完整代码

已经改掉了...忘了之前怎么写的了,现在重写setdead没有报错了,但是不能实现isdead=false...........哦不对,重写setdead不对.................还是会报错,我把实体传送到虚空,然后实体死亡,玩家接近虚空就会崩溃

Wizy
Thehrz 发表于 2022-8-25 13:06
上传 com.wizy.wizymod.objects.entity.BigBro 类 完整代码

这是类代码,

Thehrz
  1. EntityPlayer entityPlayer = this.world.getClosestPlayerToEntity(this, 1000.00);
复制代码


entityPlayer 可能是null 但没有判空

Wizy
Thehrz 发表于 2022-8-25 14:46
entityPlayer 可能是null 但没有判空

哦....确实,一般这种对象定义都最好判空一下吗

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