I'm writing a Minecraft plugin where I want to work a lot with schedulers and I always get the problem when 2 players carry out an activity at the same time where a scheduler is installed, then the animation of the player who started the activity first breaks off for him and the player who started it last starts it, how can I fix this?
Here is an example where this problem occurs in the code.
public class AutoNick
implements Listener {
Player player;
@EventHandler
public void handlePlayerNick(PlayerInteractEvent event) {
Player player = event.getPlayer();
int taskID = CreateDataPlayer.getPlayerID(player.getUniqueId());
if (event.getAction() == Action.RIGHT_CLICK_BLOCK ||
event.getAction() == Action.RIGHT_CLICK_AIR) {
if (event.getItem().getItemMeta().getDisplayName().equals(StringList.inv_player_i1)) {
taskID = Bukkit.getScheduler().scheduleSyncDelayedTask(LobbySystem.getInstance(), new Runnable() {
@Override
public void run() {
player.getInventory().setBoots(new LootBuilder(Material.GOLD_BOOTS, 1).createDisplayName("§6Aktiviere AutoNick...").build());
player.playSound(player.getLocation(), Sound.EXPLODE, 0.5F, 1.2F);
player.playEffect(player.getLocation(), Effect.EXPLOSION_LARGE, 255);
}
}, 20L);
taskID = Bukkit.getScheduler().scheduleSyncDelayedTask(LobbySystem.getInstance(), new Runnable() {
@Override
public void run() {
player.getInventory().setLeggings(new LootBuilder(Material.GOLD_LEGGINGS, 1).createDisplayName("§6Lade Datenbank...").build());
player.playSound(player.getLocation(), Sound.EXPLODE, 0.5F, 1.2F);
player.playEffect(player.getLocation(), Effect.EXPLOSION_LARGE, 255);
}
}, 40L);
taskID = Bukkit.getScheduler().scheduleSyncDelayedTask(LobbySystem.getInstance(), new Runnable() {
@Override
public void run() {
player.getInventory().setChestplate(new LootBuilder(Material.GOLD_CHESTPLATE, 1).createDisplayName("§6Lade Skin...").build());
player.playSound(player.getLocation(), Sound.EXPLODE, 0.5F, 1.2F);
player.playEffect(player.getLocation(), Effect.EXPLOSION_LARGE, 255);
}
}, 60L);
taskID = Bukkit.getScheduler().scheduleSyncDelayedTask(LobbySystem.getInstance(), new Runnable() {
@Override
public void run() {
player.getInventory().setHelmet(new LootBuilder(Material.GOLD_HELMET, 1).createDisplayName("§6Übertrage Namen...").build());
player.playSound(player.getLocation(), Sound.EXPLODE, 0.5F, 1.2F);
player.playEffect(player.getLocation(), Effect.EXPLOSION_LARGE, 255);
}
}, 80L);
int finalTaskID = taskID;
taskID = Bukkit.getScheduler().scheduleSyncDelayedTask(LobbySystem.getInstance(), new Runnable() {
@Override
public void run() {
player.playSound(player.getLocation(), Sound.LEVEL_UP, 0.5F, 1.2F);
player.playEffect(player.getLocation(), Effect.EXPLOSION_LARGE, 255);
player.getInventory().setHelmet(new LootBuilder(Material.SNOW_BALL, 1).createDisplayName("§fNo animation..").build());
player.getInventory().setChestplate(new LootBuilder(Material.SNOW_BALL, 1).createDisplayName("§fNo animation..").build());
player.getInventory().setLeggings(new LootBuilder(Material.SNOW_BALL, 1).createDisplayName("§fNo animation..").build());
player.getInventory().setBoots(new LootBuilder(Material.SNOW_BALL, 1).createDisplayName("§fNo animation..").build());
player.sendMessage(StringList.nicknames_prefix + "§cKonnte keine Namen/Skins aus Datenbank laden");
}
}, 100L);
}
}
}
}
I gave the player a random ID in the database and call it up every time a scheduler is started and was hoping that the scheduler would only run for the player since it is tied to the player ID.