Configuration Résolu Java : Event fait crash le serveur

DiscowZombie

Développeur
Staff
Modérateur
Support
2 Mars 2017
2 659
1
931
298
Alsace
www.discowzombie.fr

Alex Fatta

Commandant de la Flotte et de la Horde
13 Août 2014
1 391
1
191
187
Hey Discow ! :D

En vérité je cherche à récupérer le bloc qui est sous le joueur et non au niveau de ses pieds. Si le joueur tombe sur un bloc, il n'est pas au niveau du dessous du joueur donc ne peut être testé. De mémoire j'avais testé avec -1 ;)

AlexFatta
 

DiscowZombie

Développeur
Staff
Modérateur
Support
2 Mars 2017
2 659
1
931
298
Alsace
www.discowzombie.fr
Re,

du coup pour prendre en compte toutes les situations, le plus simple est de faire une petite méthode :) L'idée est de chercher tous les blocs sous les pieds du joueur "en allant de plus en plus profond" (sachant que l'eau est normalement comptée comme un bloc), jusqu'à trouver le premier bloc qui n'est pas de l'air. Ensuite, en utilisant cette méthode tu n'aurais plus qu'à check que c'est bien de l'eau ! ;)
 

Detobel36

Créateur de plugins (PhoenixRebirth)
Support
17 Août 2012
10 531
24
2 247
347
28
Bruxelles - Belgique
www.phoenix-rebirth.fr
Salut,

Déjà évite les System.out... Tu fais du spigot, pas du java de base xD (bon, ok la c'est moi qui suis un peu chiant :p ).

Ensuite, il me semblait l'avoir déjà écrit, mais je ne sais plus où...
Ceci:
Code:
Block blockToTest = Bukkit.getServer().getWorld(playerLocation.getWorld().getName()).getBlockAt(playerLocation);
Sera quand même plus simple comme ceci:
Code:
Block blockToTest = playerLocation.getWorld().getBlockAt(playerLocation);

Bon, enfin si tu veux le block en dessous du joueur tu peux avoir une méthode comme ceci:
PHP:
private Block getPlayerGroundBlock(final Location loc) {
    while(loc.getY() > 0 && loc.getBlock().getType().equals(Material.AIR)) {
        loc.setY(loc.getY()-1);
    }
    // Peut être rajouter une condition si getY() est == à 0
    return loc.getBlock();
}

Donc dans ton code:
PHP:
   @EventHandler
   public void touchWaterCheck(PlayerMoveEvent event) {
       final Player player = event.getPlayer();

       if (playerList.contains(player)) {
           if (Main.getGameIsJoinable() && Main.getGameIsLaunched()) {

               final Block blockToTest = getPlayerGroundBlock(player.getLocation());

               if (blockToTest.getType().equals(Material.WATER)) {
                   System.out.println("eau");
                   player.teleport(Main.getGroundLocation());
                   blockToTest.setType(Material.WOOL);
                   teleportNextPlayer();

               } else if (blockToTest.getType().equals(Material.WOOL)) {
                   System.out.println("laine");
                   player.teleport(Main.getGroundLocation());
                   playerList.remove(player);
                   incremantator = playerList.size();
                   teleportNextPlayer();
               }
           }
       }
   }


Cordialement,
Detobel36
 

Alex Fatta

Commandant de la Flotte et de la Horde
13 Août 2014
1 391
1
191
187
Bonjour !

Bon ! Ca avance ! Le code que vous avez donné fonctionne.

Toutefois 2 choses : le problème de la boucle while, c'est que la bloc est testé alors que le joueur vient à peine d'arriver dans le vide. Je pense modifier ça afin de vérifier seulement le bloc sous le joueur à 1 blocs au dessus. Et deuxième chose : le Material.WATER ne fonctionne pas. J'ai testé en remplacant WATER par GRASS et ca fonctionne bien sur l'herbe ! Mais avec WATER ca ne fonctionne pas :fou::confused:

Des propositions ? J'ai regardé dans la liste et c'est tout ce qu'il y a pour l'eau :/

AlexFatta

EDIT :

C'est bon problème résolu ! Je sais juste pas ouvrir mes yeux x) Voici le code :) :
Code:
    @EventHandler (priority = EventPriority.LOWEST)
    public void touchWaterCheck(PlayerMoveEvent event) {
        final Player player = event.getPlayer();

        if (playerList.contains(player)) {
            if (Main.getGameIsJoinable() && Main.getGameIsLaunched()) {

                final Location loc = player.getLocation();
                loc.setY(loc.getY());
                final Block blockToTest = player.getWorld().getBlockAt(loc);

                if (blockToTest.getType().equals(Material.STATIONARY_WATER)) {
                    System.out.println("eau");
                    player.teleport(Main.getGroundLocation());
                    blockToTest.setType(Material.WOOL);
                    teleportNextPlayer();

                } else if (blockToTest.getType().equals(Material.WOOL)) {
                    System.out.println("laine");
                    player.teleport(Main.getGroundLocation());
                    playerList.remove(player);
                    incremantator = playerList.size();
                    teleportNextPlayer();
                }
            }
        }
    }
 
Dernière édition:
  • J'aime
Reactions: DiscowZombie