基本上我想要做的是让玩家响应一条消息,在该消息中他们只需要输入数字。从那时起,我可以将 String 解析为 int 并将其用于我的其余代码。另外,我正在尝试使它发生在我的事件方法中。任何帮助是极大的赞赏!
2 回答
您本质上想要做的是将播放器存储在容器中,直到他们下次通话,然后将其移除。这以伪代码表示,如下所示:
on your condition:
add player to collection
on player chat:
does the player exist in the collection?
yes: is input a valid number?
yes: proceed with execution, remove player from collection after
no: print error
no: ignore, let event pass
由于 MineCraft 协议不允许输入验证,因此会出现用户可能提交非数字字符的情况。如果是这种情况,Integer.parseInt 或其兄弟 valueOf 将抛出异常。
为防止内存泄漏,您应该在玩家注销时将其从集合中移除。或者,您可以将它们存储在弱引用容器中。对于这种情况,一个好的方法是 WeakSet,您基本上可以通过Collections.newSetFromMap(new WeakHashMap())
. 如果所有其他引用都被消除,弱引用会被垃圾收集,因此这降低了内存泄漏的风险。
您应该查看 bukkit 对话 API。它正是为了做到这一点。你可以在网上找到教程,但基本上要设置它,你就这样做。
与 ConversationFactory 建立对话
ConversationFactory HudConvo = new ConversationFactory(plugin) .withModality(true) .withEscapeSequence("exit") .withFirstPrompt(new HudConversationMain(plugin, player, 0)) .withLocalEcho(false); Conversation conversation = HudConvo.buildConversation((Conversable) player);
开始对话
conversation.begin();
将第一个提示作为类来扩展输入类型提示(即 StringPrompt)或实现 Prompt 抽象类。
填写方法getPromptText() 和acceptInput()。getPromptText() 构造要显示给玩家的消息,acceptInput() 接受玩家键入的内容并以新的提示对其作出反应。
我希望这会有所帮助。如果您有任何问题,请随时提问。