Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Bukkit对话无法入睡_Java_Bukkit - Fatal编程技术网

Java Bukkit对话无法入睡

Java Bukkit对话无法入睡,java,bukkit,Java,Bukkit,我正在尝试使用Bukkit对话,它已经可以工作了,但是当我使用TimeUnit.SECONDS.sleep(integer value)时,它工作一次,然后在控制台中失败,出现以下错误:java.lang.InterruptedException:sleep interrupted 当显示一个提示并且将显示下一个提示时,将调用acceptInput方法。在第一个提示中,它可以正常工作,在其他提示中,它将在此提示中调用(该提示将调用自身的新实例)。除了睡眠部分,其他都可以。有办法解决这个问题吗 这

我正在尝试使用Bukkit对话,它已经可以工作了,但是当我使用
TimeUnit.SECONDS.sleep(integer value)
时,它工作一次,然后在控制台中失败,出现以下错误:
java.lang.InterruptedException:sleep interrupted

当显示一个提示并且将显示下一个提示时,将调用acceptInput方法。在第一个提示中,它可以正常工作,在其他提示中,它将在此提示中调用(该提示将调用自身的新实例)。除了睡眠部分,其他都可以。有办法解决这个问题吗

这是我的密码:

package dbx12.Test1.Tutorial.Prompts;


import java.util.concurrent.TimeUnit;

import org.bukkit.conversations.ConversationContext;
import org.bukkit.conversations.Prompt;
import org.bukkit.entity.Player;


public class Text implements Prompt {

    @Override
    public Prompt acceptInput(ConversationContext context, String input) {
        int thisPrompt = (int) context.getSessionData("step");
        context.setSessionData("step", thisPrompt+1);
        Player p = (Player) context.getForWhom();

        boolean type;

        try {
            TimeUnit.SECONDS.sleep(dbx12.Test1.Utils.Prompt_List.delay.get(thisPrompt));
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            e.printStackTrace(); //DEBUG
        }       

        try {
            type = dbx12.Test1.Utils.Prompt_List.promptType.get(thisPrompt+1);
        } catch (Exception e) {
            return new Finish();
        }

        if(dbx12.Test1.Utils.Prompt_List.hasLocation.get(thisPrompt+1) == true)
            p.teleport(dbx12.Test1.Utils.Prompt_List.location.get(thisPrompt+1));

        if(type==true)
        {
            System.out.println("return a text");
            return new Text();
        }
        else
        {
            System.out.println("return a interaction");
            return new Interaction();
        }
    }

    @Override
    public boolean blocksForInput(ConversationContext context) {
        return false;
    }

    @Override
    public String getPromptText(ConversationContext context) {
        return dbx12.Test1.Utils.Prompt_List.promptText.get(context.getSessionData("step"));
    }

}

sleep
将导致整个服务器在x秒内停止任何操作。使用
SyncDelayedTask
,而不是睡眠:

this.getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable(){
    public void run(){
        //what you want to do here
    }
},delayInSeconds * 20);
例如,假设您想将
test1
发送到服务器,然后在5秒钟后将
test2
发送到服务器,您可以使用:

int repeats;

public void sendMessages(){
    this.getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable(){

    public void run(){
        if(repeats == 0){ //if it's the first time running
            Bukkit.getServer.broadcastMessage("test1");
            repeats++; //add to repeats
            sendMessages(); //call the method again
        }
        else if(repeats == 1){ //if it is the second time being called
            Bukkit.getServer.broadcastMessage("test2");
        }
    }
},5 * 20);//wait 5 seconds 
因此,使用上述代码,您可以创建如下方法:

public void startSendingMessages(){
    repeats = 0;
    sendMessages();
}
其中,当您调用
startSendingMessages()
时,将发送
test1
,然后在5秒后发送
test2

我们将时间(以秒为单位)乘以20的原因是,它必须以滴答声或minecraft时间为单位,并且
1秒=20滴答声


还有很多其他的调度器类型,比如
SyncRepeatingTasks
。要了解更多信息,请查看bukkit
JavaDocs
:,这里还有一个很好的bukkit教程:

你想在这里做什么?设置延迟?这个插件将要做什么?也许有更好的方法可以做到这一点。我尝试通过提示来显示信息。经过一定延迟后,将显示下一个提示。延迟在第一次工作,但在接下来的x提示中失败。我将下一个提示符作为此提示符的新实例调用。这不会以我希望的方式工作。也许我不够精确;)我想在我使用
try{TimeUnit.SECONDS.sleep(dbx12.Test1.Utils.Prompt_List.delay.get(thisprimpt));}catch(InterruptedException e){Thread.currentThread().interrupt();e.printStackTrace();//DEBUG}时延迟执行
因此,我尝试等待指定的时间结束,然后返回新的“完成”或“文本”或“交互”。返回提示时,将显示此提示。因此,我想延迟此提示的显示。很抱歉,格式不正确,但是stackoverflow取消了我的编辑,因为我超过了5分钟。离题:预览或更长的编辑时间会更好。@DBX12同样的原则适用,您可以在底部更改时间,这里:
,5*20)
您想要的时间*20