本文介紹了TimeUnit.SECONDS的替代方案(1);SpigotMC/SpigotMC事件未運行的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
遇到此問題時,我正試圖創建一個Minworld插件,但我認為這更像是一個Java討論
所以我嘗試創建一個每秒鐘繁殖一只雞的派生程序(對于測試,當我完成時,它將變成每一分鐘),但當我測試時,事件似乎沒有運行(因為TimeUnit.SECONDS.sleep()
將阻塞MC線程)。那么,我可以有另一個選擇嗎?
我現在使用的延遲是TimeUnit.SECONDS.sleep(*insert some number here*);
,如下所示:
注意:我已經嘗試了使用答案中所示的setTaskTimer
和scheduleSyncRepeatingTask
,但它們似乎不起作用。這是事件問題還是spawnEntity
問題?
package com.TheRealBee.Bows.Event10;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.EntityType;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockPlaceEvent;
import java.util.concurrent.TimeUnit;
public class EventManager10 implements Listener {
@EventHandler
public void onNukePlace(BlockPlaceEvent e){
// Return if it's not TNT, doesn't have ItemMeta or doesn't have a custom dispaly name
if(!e.getBlock().getType().equals(Material.GOLD_BLOCK) || !e.getItemInHand().hasItemMeta() || !e.getItemInHand().getItemMeta().hasDisplayName())
return;
// Return if the item display name is not correct
if(!e.getItemInHand().getItemMeta().getDisplayName().equals(ChatColor.WHITE+"Spawner"))
return;
// Create the explosion
try {
for (int i = 0; i < 300000000; i++) {
e.getBlock().getLocation().getWorld().spawnEntity(e.getBlock().getLocation(), EntityType.CHICKEN);
TimeUnit.SECONDS.sleep(1);
}
}
catch(InterruptedException ex)
{
Thread.currentThread().interrupt();
}
}
}
推薦答案應使用Bukkit.getScheduler().scheduleSyncRepeatingTask(...)
代替For循環和TimeUnit.SECONDS.sleep
Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() {
@Override
public void run() {
e.getBlock().getLocation().getWorld().spawnEntity(e.getBlock().getLocation(), EntityType.CHICKEN);
}
}, 0L, 20L)
Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() {
@Override
public void run() {
e.getBlock().getLocation().getWorld().spawnEntity(e.getBlock().getLocation(), EntityType.CHICKEN);
}
}, 0L, 20L)
plugin
應為您的插件的實例
0L
是運行第一個任務之前的延遲(以刻度為單位)
20L
是運行下一個任務之前的延遲(以刻度為單位)
scheduleSyncRepeatingTask in the Spigot JavaDoc
因為這是一個產卵程序,所以我認為當塊被打破時,您會想要停止產卵。您可以使用任務ID取消任務。TaskID是scheduleSyncRepeatingTask
返回的整數。您應該保存此taskID,因為您可以在稍后(塊中斷時)取消該任務。要取消任務,可以使用cancelTask
:
Bukkit.getServer().getScheduler().cancelTask(taskID);
cancelTask in the Spigot JavaDoc
例如,使用HashMap保存此taskID。當塊放置時,您應該將坐標保存為key,將taskID保存為HashMap中的值。當塊被破壞時(使用塊斷開事件),您應該在該HashMap中查找被破壞的塊的坐標。如果HashMap中存在坐標,則應取消任務并從HashMap中刪除該條目。
這篇關于TimeUnit.SECONDS的替代方案(1);SpigotMC/SpigotMC事件未運行的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,