Plugin Si un joueur change de monde lui donné du stuff avec du délai

joschma

Aventurier
1 Septembre 2020
1
0
1
23
Bonjour,
Je me suis mit à développer un plugin qui donnerais des items quand un joueur change de monde avec 1 seconde de délais.
Sinon les items n'apparaissait pas dans la hotbar du joueur.
Un problème est apparu, SI pendant cette seconde un deuxième joueur change aussi de monde les items ne seront donné, seulement à un joueur (celui qui a changé de monde en dernier).
ps : mon serveur est est 1.14.4
voici mon code:

Java:
float timerCount = 1.0F;
    @EventHandler
    public void onWorldSwitch(PlayerChangedWorldEvent event) {
        Player player = event.getPlayer();
        BukkitTask CountDownId;

        ArrayList<Player> players = new ArrayList<Player>();
        players.add(player);
        timerCount = 1.0F;
        CountDownId = Bukkit.getScheduler().runTask(plugin, new Runnable(){
            public void run(){
                if(timerCount == 1.0F) {
                    --timerCount;
                }
                else if(timerCount <= 0.0F) {
                    int i = 0;
                    player.sendMessage("Il est temps de te donner ton stuff");
                    while( i <= players.size()) {
                        player.sendMessage("while loop");
                        plugin.giveStuff(players.get(i));
                        players.clear();
                    }
                    stopCountdown();
                    timerCount = 5.0F;
                }
            }
        });
        player.sendMessage("world switch");
    }

Java:
 public void giveStuff(Player player) {
    
        ItemStack compass = new ItemStack(Material.COMPASS);
        ItemMeta compassM = compass.getItemMeta();
        compassM.setDisplayName("§5Navigation");
        compass.setItemMeta(compassM);

        switch(player.getWorld().getName()) {
        case "lobby" :
            player.getInventory().setItem(0, compass);
            player.sendMessage("lobby");
            break;
        case "pvp":
            player.getInventory().setItem(0, compass);
            player.sendMessage("pvp");
            break;
        default:
            break;
        }
    }
 
Solution
Bonsoir,

Le problème est que ta variable timerCount est contenue dans ta classe qui écoute l'évènement, et donc tous les joueurs ont le même compte à rebours.
Ta variable players est quant à elle créée lorsqu'un joueur change de monde ; sa taille sera toujours égale à un, et ta liste n'existera plus une fois l'évènement passé.

Je ne comprends pas trop pourquoi tu t'embêtes avec tout ça, moi ce que je ferais :
Java:
public class MyEventHandler implements Listener {
	private static final ItemStack COMPASS;
	
	static {
		COMPASS = new ItemStack(Material.COMPASS);
		
		ItemMeta meta = COMPASS.getItemMeta();
		meta.setDisplayName("§5Navigation");
		
		COMPASS.setItemMeta(meta);
	}
	
	@EventHandler
	public void...

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 087
160
459
247
21
Mìlhüsa
Bonsoir,

Le problème est que ta variable timerCount est contenue dans ta classe qui écoute l'évènement, et donc tous les joueurs ont le même compte à rebours.
Ta variable players est quant à elle créée lorsqu'un joueur change de monde ; sa taille sera toujours égale à un, et ta liste n'existera plus une fois l'évènement passé.

Je ne comprends pas trop pourquoi tu t'embêtes avec tout ça, moi ce que je ferais :
Java:
public class MyEventHandler implements Listener {
	private static final ItemStack COMPASS;
	
	static {
		COMPASS = new ItemStack(Material.COMPASS);
		
		ItemMeta meta = COMPASS.getItemMeta();
		meta.setDisplayName("§5Navigation");
		
		COMPASS.setItemMeta(meta);
	}
	
	@EventHandler
	public void onPlayerChangedWorld(PlayerChangedWorldEvent e) {
		final Player player = e.getPlayer();
		
		Bukkit.getScheduler().runTaskLater(plugin, () -> {
			// 20 ticks (1s) se sont écoulés
			player.getInventory().setItem(0, COMPASS);
		}, 20L);
	}
}

Cordialement,
ShE3py.
 
Solution