2017-06-16 95 views
-11

我正在尝试创建一个minecraft插件,在射击之间用10个刻度延迟拍摄箭头5次。我的世界Bukkit Runnable

不幸的是,我对Java没有太多的经验,但我会尽我所能去理解答案。

这是我的代码:

public void run() { 
    for (int i = 0; i <5; i++){ 
     player.playSound(player.getLocation(), Sound.SHOOT_ARROW, 1.0f, 1.0f); 
     Arrow arrow = player.launchProjectile(Arrow.class); 
     Events.removeArrows.put(arrow.getEntityId(), (byte) 1); 
    } 
} 

在此代码段“笋” 5个箭无延迟的时刻。现在我遇到了添加延迟的问题。

+0

这段代码是什么,你的问题是什么? – Pickle

+0

如何给我的世界Bukkit插件延迟?我已经给'Bukkit.getServer()。getScheduler()。scheduleAsyncDelayedTask(this,new Runnable(){'但是我得到错误'无法通过事件PlayerInteractEvent' –

+0

你还没有回答我的问题。这是什么代码为什么它是不完整的)?你只是把一半的课程放入盒子中如果你希望我们帮助请至少尊重我们至少格式化你的代码 – Pickle

回答

0
BukkitScheduler scheduler = getServer().getScheduler(); 
scheduler.scheduleSyncRepeatingTask(yourPlugin, new Runnable() { 
    @Override 
    public void run() { 
     //Execute Arrow Code here 
    } 
}, 10L); 

这将每10个滴答执行run()方法中的代码,直到停止。为此,请在Runnable中使用this.cancel();

0

可能做到这一点,最简单的方法是用一个异步任务:

//Asynchronous Task 
Bukkit.getScheduler().runTaskAsynchronously(plugin,() -> { 
    for (int i = 0; i <5; i++){ 

     player.playSound(player.getLocation(), Sound.SHOOT_ARROW, 1.0f, 1.0f); 
     Arrow arrow = player.launchProjectile(Arrow.class); 
     Events.removeArrows.put(arrow.getEntityId(), (byte) 1); 

     try { 
      //pause the task for 10 ticks/half a second 
      Thread.sleep(500); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

}); 

此代码笋然后一个箭头等待10个蜱,直到for循环结束后重新开始。

通常情况下,您不应将Thread.sleep()放入您的代码中,因为它会在您定义的时间内停止整个服务器。但由于这个功能是异步的,我们不会面临这个问题。