0

基本上我想要做的是让玩家响应一条消息,在该消息中他们只需要输入数字。从那时起,我可以将 String 解析为 int 并将其用于我的其余代码。另外,我正在尝试使它发生在我的事件方法中。任何帮助是极大的赞赏!

4

2 回答 2

0

您本质上想要做的是将播放器存储在容器中,直到他们下次通话,然后将其移除。这以伪代码表示,如下所示:

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()). 如果所有其他引用都被消除,弱引用会被垃圾收集,因此这降低了内存泄漏的风险。

于 2013-06-28T15:50:49.513 回答
0

您应该查看 bukkit 对话 API。它正是为了做到这一点。你可以在网上找到教程,但基本上要设置它,你就这样做。

  1. 与 ConversationFactory 建立对话

    ConversationFactory HudConvo = new ConversationFactory(plugin)
    .withModality(true)
    .withEscapeSequence("exit")
    .withFirstPrompt(new HudConversationMain(plugin, player, 0))
    .withLocalEcho(false);
    
    
    Conversation conversation = HudConvo.buildConversation((Conversable) player);
    
  2. 开始对话

    conversation.begin();
    
  3. 将第一个提示作为类来扩展输入类型提示(即 StringPrompt)或实现 Prompt 抽象类。

  4. 填写方法getPromptText() 和acceptInput()。getPromptText() 构造要显示给玩家的消息,acceptInput() 接受玩家键入的内容并以新的提示对其作出反应。

我希望这会有所帮助。如果您有任何问题,请随时提问。

于 2013-07-07T21:25:16.833 回答