gpt4 book ai didi

java - Bukkit 谈话无法休眠

转载 作者:行者123 更新时间:2023-12-01 13:22:17 28 4
gpt4 key购买 nike

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

当显示一个提示并且将显示下一个提示时,将调用acceptInput 方法。在第一个提示中,它工作得很好,在其他提示中,这些提示是从该提示中调用的(提示调用其自身的新实例)。除了 sleep 部分之外,一切正常。有解决这个问题的想法吗?

这是我的代码:

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 代替 sleep :

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:http://jd.bukkit.org/dev/apidocs/ ,这里还有一个来自 bukkit 的很好的教程:http://wiki.bukkit.org/Scheduler_Programming

关于java - Bukkit 谈话无法休眠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21957250/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com