Hey, So I have a code to loop something but it gives or broadcast it 6 times in a row. How can I make it that it only goes once? Code:java @EventHandler public void onJoin(PlayerJoinEvent event){ plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() { public void run() { for (Player player : Bukkit.getServer().getOnlinePlayers()) { int ChargeFood = player.getFoodLevel() + 1; if(player.getFoodLevel() != 20) player.setFoodLevel(ChargeFood); } } }, 0L, (2 * 20)); }
Josh014 You are never cancelling the repeating task, also, are you meaning to feed everyone on the whole server each time someone joins? Heal everyone on the server (Move your mouse to reveal the content) Heal everyone on the server (open) Heal everyone on the server (close) Code:text @EventHandlerpublic void onJoin(PlayerJoinEvent event){ plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() { public void run() { int fullFeed = 0; for (Player player : Bukkit.getServer().getOnlinePlayers()) { if(player.getFoodLevel() == 20){ fullFeed++; } else { player.setFoodLevel(player.getFoodLevel() + 1); } } if (fullFeed >= Bukkit.getServer().getOnlinePlayers().size()){ this.cancel(); } } }, 0L, (2 * 20));} Heal only the player that joined (Move your mouse to reveal the content) Heal only the player that joined (open) Heal only the player that joined (close) Code:text @EventHandlerpublic void onJoin(PlayerJoinEvent event){ final player = e.getPlayer() plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() { public void run() { if (player.getFoodLevel > 20){ player.setFoodLevel(player.getFoodLevel() + 1); } else { this.cancel(); } } }, 0L, (2 * 20)); } Haven't checked it but it should work
GusGold I have that now but I need to make a Method for the this.cancel(); thing. My code: Code:java @EventHandler public void onJoin(PlayerJoinEvent event){ final Player player = event.getPlayer(); final int FoodCharge = player.getFoodLevel() + 1; plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() { public void run() { if (player.getFoodLevel() > 20){ player.setFoodLevel(FoodCharge); } else { this.cancel(); } } }, 0L, (2 * 20)); }
Josh014 Sorry, I forgot something, set it out like so: Code:java int taskId;@EventHandlerpublic void onJoin(PlayerJoinEvent event){ final Player player = event.getPlayer(); final int FoodCharge = player.getFoodLevel() + 1; taskId = plugin.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() { public void run() { if (player.getFoodLevel() > 20){ player.setFoodLevel(FoodCharge); } else { plugin.getServer().getScheduler().cancelTask(taskId); } } }, 0L, (2 * 20));}
GusGold Alright, it kinda works but it still spams it 6 times at once instead of giving me half hungerbar every 2 seconds -.-. And every time if I get the half of my food it gives me full food level.
Use just 1 scheduler, whenever the onEnable() method is fired, start a scheduler. You don't really need to start a new scheduler whenever the onJoin is fired..
GaaTavares I want to have each player his own scheduler, because if you use in onEnable() then it will continious loop and it will give quite some lagg.
Just keep one repeating task going, it's not going to cause any noticeable lag. Check every player's hunger, and, if it's low, heal it up a bit.