Configuration Résolu (Go direct à la page 4)Java : Check si un joueur est dans une zone

Alex Fatta

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

Alors du coup j'ai incorporé comme je pense il le faudrait. Mais je me heurte encooooore à un nouveau problème que je ne parvient pas à résoudre même en changeant String par World et inversement. Je te met le code en dessous. Le problème apparait dans le main (onEnable()) dans la boucle for, il me dit la chose suivante :

mc1.jpg

Or dans les autres class, aucunes erreurs et toutes les variables sont en World world. J'espère que tu auras compris le problème et que tu auras une solution à proposé, j'ai essayé de remplacer tous les types String par World et inversement dans toutes les class concernées mais rien n'y change.

Aussi :

//Tu créer tes locations à partir de tes coordonnées de région
Bah j'ai pas besoin je ne m'en sers pas vu que la ligne d'après prend automatiquement les valeurs, en tout cas j'ai pas trouvé où les utiliser donc je les aient enlevés :

Code:
    @EventHandler (ignoreCancelled = true, priority = EventPriority.LOWEST)
    public void onBlockPlace(BlockPlaceEvent event) {
        
        new LocationManager().getRegions();
        
        final Player player = event.getPlayer();
        Block block_to_replace = event.getBlockPlaced();
        
        for (LocSaver l : new LocationManager().getRegions().values()) {
            
            boolean isInRegion = new Cuboide(new Location(l.getWorldname(), l.getX1(), 0, l.getZ1()),
                    new Location(l.getWorldname(), l.getX2(), 0, l.getZ2())).isInCube(player);
            
            if (!isInRegion) {
                event.setCancelled(true);
                player.sendMessage(fr.alexfatta.fallenkingdoms.main.getGamePrefix() + ChatColor.RED +
                        "Erreur : tu ne peux pas poser ce block : nom=" + block_to_replace.getType());
            }
        }

AlexFatta
 

DiscowZombie

Développeur
Staff
Modérateur
Support
2 Mars 2017
2 659
1
931
298
Alsace
www.discowzombie.fr
Alors du coup j'ai incorporé comme je pense il le faudrait. Mais je me heurte encooooore à un nouveau problème que je ne parvient pas à résoudre même en changeant String par World et inversement. Je te met le code en dessous. Le problème apparait dans le main (onEnable()) dans la boucle for, il me dit la chose suivante :



Or dans les autres class, aucunes erreurs et toutes les variables sont en World world. J'espère que tu auras compris le problème et que tu auras une solution à proposé, j'ai essayé de remplacer tous les types String par World et inversement dans toutes les class concernées mais rien n'y change.
Salut, c’est tout simple à réglé :)

Vu que la méthode add de LocationManager a besoin d'un World en premier argument, il faut lui donné. Tu doit donc faire :
Code:
new LocationManage(s).add(Bukkit.getWorld(getConfig().getString("Bases."+s+".world")), blabla..
au lieu de :
Code:
new LocationManage(s).add(getConfig().getString("Bases."+s+".world"), blabla...
car sinon tu lui donne un String, et il n'aime pas ;)

Bah j'ai pas besoin je ne m'en sers pas vu que la ligne d'après prend automatiquement les valeurs, en tout cas j'ai pas trouvé où les utiliser donc je les aient enlevés :
Oui, c'est bien comme tu a fait :D
 

Alex Fatta

Commandant de la Flotte et de la Horde
13 Août 2014
1 391
1
191
187
Salut, c’est tout simple à réglé :)

Vu que la méthode add de LocationManager a besoin d'un World en premier argument, il faut lui donné. Tu doit donc faire :
Code:
new LocationManage(s).add(Bukkit.getWorld(getConfig().getString("Bases."+s+".world")), blabla..
au lieu de :
Code:
new LocationManage(s).add(getConfig().getString("Bases."+s+".world"), blabla...
car sinon tu lui donne un String, et il n'aime pas ;)


Oui, c'est bien comme tu a fait :D
Oh mais je suis trop un handicapé xD Pourquoi j'y ai pas pensé xD Bon merci je test ça :p (l'avantage c'est que je saurai pour la suite au moins :p )

AlexFatta

EDIT : @DiscowZombie ca fonctionne pas :( Aucune erreur ni en jeu ni dans la console).

Code:
    @EventHandler (ignoreCancelled = true, priority = EventPriority.LOWEST)
    public void onBlockPlace(BlockPlaceEvent event) {
        
        new LocationManager().getRegions();
        
        final Player player = event.getPlayer();
        Block block_to_replace = event.getBlockPlaced();
        
        for (LocSaver l : new LocationManager().getRegions().values()) {
            
            boolean isInRegion = new Cuboide(new Location(l.getWorldname(), l.getX1(), 0, l.getZ1()),
                    new Location(l.getWorldname(), l.getX2(), 0, l.getZ2())).isInCube(player);
            
            if (!isInRegion) {
                event.setCancelled(true);
                player.sendMessage(fr.alexfatta.fallenkingdoms.main.getGamePrefix() + ChatColor.RED +
                        "Erreur : tu ne peux pas poser ce block : nom=" + block_to_replace.getType());
            }
        }
 
Dernière édition:

DiscowZombie

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

On revient aux bases, est-ce que ton event est déclencher ?


Edit 1: Enfaite je vient de relire ton code, et pourquoi tu met
Code:
if(!isInRegion...
. Pourquoi tu annule l'événement s'il n'est pas dans une région ??
 
Dernière édition:

Alex Fatta

Commandant de la Flotte et de la Horde
13 Août 2014
1 391
1
191
187
Ptdrr xD

On revient aux bases, est-ce que ton event est déclencher ?


Edit 1: Enfaite je vient de relire ton code, et pourquoi tu met
Code:
if(!isInRegion...
. Pourquoi tu annule l'événement s'il n'est pas dans une région ??
Oui mon event est bien déclanché ^^ Ce que je souhaite c'est que les joueurs ne puissent pas poser de block à l'exterieur des zones ! Les zones ce sont leurs bases, et ils ne doivent rien poser en dehors sauf torches, panneaux, eau etc...

J'ai testé ceci aussi mais ça ne fonctionne pas :(

Code:
    @EventHandler (ignoreCancelled = true, priority = EventPriority.LOWEST)
    public void onBlockPlace(BlockPlaceEvent event) {
        
        new LocationManager().getRegions();
        
        final Player player = event.getPlayer();
        Block block_to_replace = event.getBlockPlaced();
        
        System.out.println(player.getInventory().getItemInMainHand().getType());
        
        for (LocSaver l : new LocationManager().getRegions().values()) {
            
            boolean isInRegion = new Cuboide(new Location(l.getWorldname(), l.getX1(), 0, l.getZ1()),
                    new Location(l.getWorldname(), l.getX2(), 0, l.getZ2())).isInCube(player);
            
            if (isInRegion) {
                
            } else {
                if (event.getHand() == EquipmentSlot.HAND) {
                    if (player.getInventory().getItemInMainHand().getType() == Material.TORCH ||
                        player.getInventory().getItemInMainHand().getType() == Material.TNT ||
                        player.getInventory().getItemInMainHand().getType() == Material.REDSTONE_TORCH_ON ||
                        player.getInventory().getItemInMainHand().getType() == Material.LAVA_BUCKET ||
                        player.getInventory().getItemInMainHand().getType() == Material.WATER_BUCKET ||
                        player.getInventory().getItemInMainHand().getType() == Material.ENDER_CHEST ||
                        player.getInventory().getItemInMainHand().getType() == Material.SIGN) {
                        
                    } else {
                        block_to_replace.setType(Material.AIR);
                    }
                }
                player.sendMessage(fr.alexfatta.fallenkingdoms.main.getGamePrefix() + ChatColor.RED +
                        "Erreur : tu ne peux pas poser ce block : nom=" + block_to_replace.getType());
            }
        }

Des idées ? :)

AlexFatta
 

DiscowZombie

Développeur
Staff
Modérateur
Support
2 Mars 2017
2 659
1
931
298
Alsace
www.discowzombie.fr
Ce que je souhaite c'est que les joueurs ne puissent pas poser de block à l'exterieur des zones !
Ha d'accord xD Tu fait l'inverse de WG enfaite ;)

Ton code m'a l'air pas mal, je vais donc te donner quelques conseils de debug :
- Dans ton cas, je te conseille de Sysout le l de LocationSaver (dans ta boucle for). Ensuite, je t'invite à afficher les deux régions créér artificiellement à partir de ton LocationSaver. Enfin, tu peut afficher la valeur de isInRegion.

Cava te donner quelques chose comme ceci :
Code:
:
    @EventHandler (ignoreCancelled = true, priority = EventPriority.LOWEST)
    public void onBlockPlace(BlockPlaceEvent event) {
        
        final Player player = event.getPlayer();
        Block block_to_replace = event.getBlockPlaced();
              System.out.println(player.getInventory().getItemInMainHand().getType());
        
        for (LocSaver l : new LocationManager().getRegions().values()) {
System.out.printLn(l);
Location loc1 = new Location(l.getWorldname(), l.getX1(), 0, l.getZ1());
Location loc2 =new Location(l.getWorldname(), l.getX2(), 0, l.getZ2());
System.out.printLn(loc1);
System.out.printLn(loc2);
            
            boolean isInRegion = new Cuboide(loc1, loc2).isInCube(player);
System.out.printLn(isInRegion);
            
            if (isInRegion) {
                
            } else {
                if (event.getHand() == EquipmentSlot.HAND) {
                    if (player.getInventory().getItemInMainHand().getType() == Material.TORCH ||
                        player.getInventory..

C'est pas la meilleure réponse que j'ai pu t'apporter, mais lorsqu'un de mes codes ne fonctionne pas comme je veut, je fait ceci et en lisant bien tout ce qu'y s'affiche dans la console, j'arrive généralement à debeuger le code assez rapidement :)

J'espère que ça peut t'aider,
Mathéo.
 
  • J'aime
Reactions: Alex Fatta

Alex Fatta

Commandant de la Flotte et de la Horde
13 Août 2014
1 391
1
191
187
Merci ! :D Je m'occupe de ça demain ;)

Bonne nuitée ! :D (J'en ai marre de ce plugin mais j'en ai marre xDD)


AlexFatta

EDIT : Ok donc y'a que le premier SysOutP qui s'affiche, on dirait que ça rentre pas ans la boucle for.
En tout cas ceci : "System.out.println(l);" ne s'affiche pas.

Des idées ? :D

AlexFatta
 
Dernière édition:

Alex Fatta

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

Voici un bout des logs :
Code:
[13:54:36 INFO]: [FallenKingdoms] Enabling FallenKingdoms v1.1.0
[13:54:36 INFO]: {}
[13:54:36 INFO]: [FallenKingdoms] Plugin de FallenKingdoms actif !
[13:54:36 INFO]: Server permissions file permissions.yml is empty, ignoring it
[13:54:36 INFO]: Done (6,615s)! For help, type "help" or "?"

Et le code du onEnable :

Code:
    @Override
    public void onEnable() {
         saveDefaultConfig();
         PluginFile();
         setInt();
         Bukkit.getServer().getPluginManager().registerEvents(new playerJoinListener(), this);
         Bukkit.getServer().getPluginManager().registerEvents(new BlockPlaceManager(), this);
         Bukkit.getServer().getPluginManager().registerEvents(this, this);
         for (String s : getConfig().getStringList("Bases")) {
             new LocationManager(s).add(Bukkit.getWorld(getConfig().getString("Bases."+s+".world")), getConfig().getInt("Bases."+s+".x1"),
                     getConfig().getInt("Bases."+s+".x2"), getConfig().getInt("Bases."+s+".z1"), getConfig().getInt("Bases."+s+".z2"));
         }
         System.out.println(LocationManager.getBases());
         getCommand("fkstart").setExecutor(new FkStart());
         getCommand("fkstop").setExecutor(new FkStop());
         getCommand("fkpause").setExecutor(new FkPause());
         getCommand("fkplay").setExecutor(new FkPlay());
         getCommand("fkhelp").setExecutor(new FkHelp());
         getCommand("fkbase").setExecutor(new FkBase(this));
         INSTANCE = this;
         getLogger().info("Plugin de FallenKingdoms actif !");
        
    }

Bien vu Johnny, la HashMap est vide. Mais pourquoi ?

AlexFatta