Row0
本帖最后由 Row0 于 2019-8-9 23:17 编辑

Forge mod开发,1.12
自己新建的GUI,想实现当玩家键盘按下Z键时打开这个GUI,就像按E打开物品栏一样

Container和GuiContainer都写好了,就是键盘的部分十分有问题

我是注册了KeyBinding并监听了InputEvent.KeyInputEvent事件,关键是在openGui()方法中不知如何传入EntityPlayer参数

InputEvent.KeyInputEvent下并没有player的field或是getPlayer(),于是无奈用了Minecraft.getMinecraft().player
但是使用这个player会在打开的GUI物品槽中出现十分混乱的情况,具体不好描述,图片我可以再上传(但觉得不需要...

测试过了,应该就是openGui()方法player或world传入的参数问题(World我传入了Minecraft.getMinecraft().world)
但是实在不知道该从哪里拉过来一个EntityPlayer和World传进去啊!!!!!

困扰太久,只好来这里求助,谢谢!


森林蝙蝠
传入KeyBoardInputEvent,然后event.getGui().mc.player即可。

Row0
森林蝙蝠 发表于 2019-8-9 23:37
传入KeyBoardInputEvent,然后event.getGui().mc.player即可。

呃,不太明白,可否详细一些?
谢谢!

森林蝙蝠
Row0 发表于 2019-8-10 00:00
呃,不太明白,可否详细一些?
谢谢!

你不是要player吗?不要监听KeyInputEvent,而是KeyBoardInputEvent,然后如上获取player。

Row0
森林蝙蝠 发表于 2019-8-10 01:11
你不是要player吗?不要监听KeyInputEvent,而是KeyBoardInputEvent,然后如上获取player。 ...

这样做了后按下按键就没反应了...
不太明白,是GuiScreenEvent.KeyBoardInputEvent吗
但是GuiScreenEvent是什么意思呢,是打开某个GUI后的键盘鼠标输入事件吗
那如果在没有打开一个GUI时的键盘按键事件呢

森林蝙蝠
本帖最后由 森林蝙蝠 于 2019-8-10 11:56 编辑
Row0 发表于 2019-8-10 09:57
这样做了后按下按键就没反应了...
不太明白,是GuiScreenEvent.KeyBoardInputEvent吗
但是GuiScreenEvent ...

不好意思搞错了,要重写一下GuiContainer的keyTyped()方法。
public class YourGuiContainer extends GuiContainer{
     @Override
     public void keyTyped(char typedChar,int keyCode){
            //keyCode是什么可以在org.lwjgl.input.KeyBoard查询到对应表
            drawScreen(yourMouseX,yourMouseY,0);
     }
}
监听玩家按键在桌面打开gui只在客户端发生,而不在服务器发生,和玩家本身没什么关系。

Row0
森林蝙蝠 发表于 2019-8-10 10:46
不好意思搞错了,要重写一下GuiContainer的keyTyped()方法。
public class YourGuiContainer{
     @Overr ...

还是不太...明白
这个keyTyped()方法是在GUI打开时按下按键触发吗?
那还需要监听KeyBoardInputEvent吗
我覆写后还是啥反应也没有

森林蝙蝠
https://harbinger.covertdragon.team/chapter-14/

Row0
森林蝙蝠 发表于 2019-8-10 13:13
https://harbinger.covertdragon.team/chapter-14/

就是在openGui时不知player如何获取,使用Minecraft.getMinecraft().player的话只是一个客户端上的EntityPlayerSP

清晨w
openGui的第一个参数传入Mod的实例,第二个参数传入我们想要打开的硬编码的ID,第三个参数至第六个参数传入一个World实例,和打开GUI所在的位置,后面四个参数都会传入IGuiHandler的两个方法中。

如果在客户端调用这个方法,则只会在客户端生成一个GuiContainer的实例,如果在服务端调用这个方法,则不仅会在服务端生成一个Container的实例,还会通知客户端生成一个GuiContainer的实例,所以一般情况下,应该总是在服务端调用这个方法,这里通过检查worldIn.isRemote以确保这一点。引用自https://fmltutor.ustc-zzzz.net/3 ... 95%8C%E9%9D%A2.html

所以我采取的办法是监听按键事件,用SimpleImpl向服务端发包打开GuiContainer.
https://github.com/Dawncraft/Dawncraft-Mod/tree/mc-1.8.9/src/main/java/io/github/dawncraft/client/event第64行
https://github.com/Dawncraft/Dawncraft-Mod/blob/mc-1.8.9/src/main/java/io/github/dawncraft/network/MessageOpenSkillInventory.java第31行的serverPlayer即为服务端玩家

3TUSK
https://paste.ubuntu.com/p/6jp3rzyjSj/

yzhyzh520
感谢分享

Row0
清晨w 发表于 2019-8-11 18:09
所以我采取的办法是监听按键事件,用SimpleImpl向服务端发包打开GuiContainer.
https://github.com/Dawncra ...

谢谢谢谢,我已经解决啦,就是使用同样的方法

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