java - 在玩家改变世界时,给物品一个 delai - Minecraft - java
问题描述
我开始开发一个插件,当玩家以 1 秒的延迟改变世界时,它会提供物品。
否则物品不会出现在玩家的快捷栏中。
出现了一个问题,如果在这一秒内第二个玩家也改变了世界,那么这些物品只会给一个玩家(最后一个改变世界的人)。
Bw:我的服务器是 1.14.4
这是我的代码:
float timerCount = 1.0F;
@EventHandler
public void onWorldSwitch(PlayerChangedWorldEvent event) {
Player player = event.getPlayer();
BukkitTask CountDownId;
ArrayList<Player> players = new ArrayList<Player>();
players.add(player);
timerCount = 1.0F;
CountDownId = Bukkit.getScheduler().runTask(plugin, new Runnable(){
public void run(){
if(timerCount == 1.0F) {
--timerCount;
}
else if(timerCount <= 0.0F) {
int i = 0;
player.sendMessage("Il est temps de te donner ton stuff");
while( i <= players.size()) {
player.sendMessage("while loop");
plugin.giveStuff(players.get(i));
players.clear();
}
stopCountdown();
timerCount = 5.0F;
}
}
});
player.sendMessage("world switch");
}
送东西:
public void giveStuff(Player player) {
ItemStack compass = new ItemStack(Material.COMPASS);
ItemMeta compassM = compass.getItemMeta();
compassM.setDisplayName("§5Navigation");
compass.setItemMeta(compassM);
switch(player.getWorld().getName()) {
case "lobby" :
player.getInventory().setItem(0, compass);
player.sendMessage("lobby");
break;
case "pvp":
player.getInventory().setItem(0, compass);
player.sendMessage("pvp");
break;
default:
break;
}
}
解决方案
根据此页面,您可以运行匿名 BukkitRunnable,这意味着无需创建具有名称的新类。这是我从您的代码中编辑的代码。我无法测试它,因为我没有足够的带宽来下载打开服务器所需的文件。希望这会奏效。
package net.example;
import org.bukkit.Bukkit;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;
public class MyPlugin extends JavaPlugin implements Listener {
@Override
public void onEnable() {
Bukkit.getServer().getPluginManager().registerEvents(new MyListener(this),this);
}
}
和这里的监听器类
package net.example;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerChangedWorldEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.scheduler.BukkitRunnable;
public class MyListener implements Listener {
private MyPlugin plugin; // A variable for your main method which extends JavaPlugin
//Here we are getting instance of our plugin. We need this because BukkitRunnable have to be registered on a plugin.
public MyListener(MyPlugin instance) {
plugin = instance; //Saving Myplugin instance to our "plugin" variable
}
@EventHandler
public void onWorldSwitch(PlayerChangedWorldEvent event) {
Player player = event.getPlayer();
// Create the task anonymously and schedule to run it once, after 20 ticks
new BukkitRunnable() {
@Override
public void run() {
// What you want to schedule goes here
giveStuff(player);
}
}.runTaskLater(plugin, 20); //Run this task(all the commands within run() method) after 20 server ticks(1 second)
}
public void giveStuff(Player player) {
ItemStack compass = new ItemStack(Material.COMPASS);
ItemMeta compassM = compass.getItemMeta();
compassM.setDisplayName("§5Navigation");
compass.setItemMeta(compassM);
player.getInventory().setItem(0, compass);
// switch(player.getWorld().getName()) {
// case "lobby" :
// player.getInventory().setItem(0, compass);
// player.sendMessage("lobby");
// break;
// case "pvp":
// player.getInventory().setItem(0, compass);
// player.sendMessage("pvp");
// break;
// default:
// break;
}
}
有些陈述可能与 OOP 原则相冲突。这样做是为了增加清晰度。当您需要更多帮助时,请告诉我。
推荐阅读
- javascript - Fulcrum 中可重复部分中的选定选项可以用作标签吗?
- python - 使用etree和LXML在python开头解析带有编码块的XML字符串
- javascript - discord.js 语音频道成员数
- wix - WIX:从对话框复选框设置注册表值
- go - 启动 Beam 时同步 pod 时出错 - 来自 docker 的数据流管道
- kubernetes-helm - ArgoCD Helm 图表 - 无法访问存储库
- jenkins - 为什么 Jenkins 失去了与 Tomcat 服务器的连接
- facebook-marketing-api - Facebook 转换 API 未收到事件
- javascript - 在通过所有页面获取数据后,如何循环排序来自 ajax 调用的数据?
- swift - UIPageViewController + firebase