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