Alternatives for TimeUnit.SECONDS.sleep(1); SpigotMC/ SpigotMC event not running(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事件未运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:TimeUnit.SECONDS的替代方案(1);SpigotMC/SpigotMC事件未运行
				
        
 
            
        - 在 Java 中,如何将 String 转换为 char 或将 char 转换 2022-01-01
 - java.lang.IllegalStateException:Bean 名称“类别"的 BindingResult 和普通目标对象都不能用作请求属性 2022-01-01
 - 如何指定 CORS 的响应标头? 2022-01-01
 - 将 Java Swing 桌面应用程序国际化的最佳实践是什么? 2022-01-01
 - GC_FOR_ALLOC 是否更“严重"?在调查内存使用情况时? 2022-01-01
 - 转换 ldap 日期 2022-01-01
 - 未找到/usr/local/lib 中的库 2022-01-01
 - Eclipse 的最佳 XML 编辑器 2022-01-01
 - 获取数字的最后一位 2022-01-01
 - 如何使 JFrame 背景和 JPanel 透明且仅显示图像 2022-01-01
 
						
						
						
						
						
				
				
				
				