byxiaobai
本帖最后由 byxiaobai 于 2021-8-26 11:03 编辑

按钮继承了Forge的net.minecraft.client.gui.widget.button.Button
问题原因:覆写了renderButton()却没有覆写isMouseOver()和clicked()方法
  1. @Override
  2.     public boolean isMouseOver(double mouseX, double mouseY) {
  3.         return this.active && this.visible &&
  4.                 mouseX >= (double)this.getRenderX() &&
  5.                 mouseY >= (double)this.getRenderY() &&
  6.                 mouseX < (double)(this.getRenderX() + this.getWidth()) &&
  7.                 mouseY < (double)(this.getRenderY()+ this.getHeight());
  8.     }

  9.     @Override
  10.     protected boolean clicked(double mouseX, double mouseY) {
  11.         return this.active && this.visible &&
  12.                 mouseX >= (double)this.getRenderX() &&
  13.                 mouseY >= (double)this.getRenderY() &&
  14.                 mouseX < (double)(this.getRenderX() + this.getWidth()) &&
  15.                 mouseY < (double)(this.getRenderY()+ this.getHeight());
  16.     }
复制代码


来自群组: 幻境空间站

3TUSK
Forge的net.minecraft.……

醒醒,包名都写着 minecraft,不是 minecraftforge。

当然是在 Button 点击的 callback 里向服务器发送含指令的包。

好,既然没有提游戏版本,那么我们开始推理,首先根据这个类名确定是 1.16 或者 1.15 的 MCP 名,所以确实是 Forge 环境没错,然后我们知道 Button 的构造器可以传入一个 Button.IPressable 对象。因为这是一个 Functional Interface 所以我们可以直接写一个 lambda 进去。

然后,查阅 CChatMessagePacket 的处理流程可知,所有来自客户端且以 / 开头的聊天信息都会被截留并作为命令处理,那么我们只需要:
  1. new Button(x, y, w, h, text, btn -> {
  2.   Minecraft.getInstance().getConnection().send(new CChatMessagePacket("/say hello"));
  3. });
复制代码

done。

byxiaobai
3TUSK 发表于 2021-8-25 16:52
醒醒,包名都写着 minecraft,不是 minecraftforge。

当然是在 Button 点击的 callback 里向服务器发 ...

可是这样写没有执行

3TUSK
byxiaobai 发表于 2021-8-25 21:46
可是这样写没有执行

什么叫「没有执行」?

你的按钮有丢给 Screen.addButton 吗?

byxiaobai
3TUSK 发表于 2021-8-26 03:24
什么叫「没有执行」?

你的按钮有丢给 Screen.addButton 吗?



加了

3TUSK

摇头

你要不要把你的所有代码弄出来,最好是弄上 GitHub 之类的地方。
就现有的信息来说你的情况没办法解释……