Supprimer des biomes



  • Bonjour à tous, je viens vers vous parce que je n'arrive pas a trouver comment on peut supprimer un ou plusieurs biomes vanilla. Je pensait à BiomeManager.removeSpawnBiome mais ça ne fonctionne pas et BiomeManager.removeBiome ne semble pas fonctionner non plus. Je m'y suis peut-être mal pris. Donc comment supprimer un biome ?

    Merci par avance pour votre aide.



  • Ta fonction doit être appelée dans "public void init".

    Exemple :

    
    @EventHandler
    public void init(FMLInitializationEvent event) {
    
        proxy.init(event);
    
        Biome biome = Biomes.OCEAN;
        BiomeManager.removeSpawnBiome(biome);
    }
    
    

    J'ai testé, et dans une map superflat avec que de l'eau ça donne une map dans le vide.



  • J'ai mis ça dans public void init :

    
           BiomeManager.removeSpawnBiome(BiomeGenBase.birchForest);
           BiomeManager.removeSpawnBiome(BiomeGenBase.birchForestHills);
           BiomeManager.removeSpawnBiome(BiomeGenBase.coldBeach);
           BiomeManager.removeSpawnBiome(BiomeGenBase.coldTaiga);
           BiomeManager.removeSpawnBiome(BiomeGenBase.coldTaigaHills);
           BiomeManager.removeSpawnBiome(BiomeGenBase.deepOcean);
           BiomeManager.removeSpawnBiome(BiomeGenBase.desert);
           BiomeManager.removeSpawnBiome(BiomeGenBase.desertHills);
           BiomeManager.removeSpawnBiome(BiomeGenBase.extremeHills);
           BiomeManager.removeSpawnBiome(BiomeGenBase.extremeHillsEdge);
           BiomeManager.removeSpawnBiome(BiomeGenBase.extremeHillsPlus);
           BiomeManager.removeSpawnBiome(BiomeGenBase.forest);
           BiomeManager.removeSpawnBiome(BiomeGenBase.forestHills);
           BiomeManager.removeSpawnBiome(BiomeGenBase.frozenOcean);
           BiomeManager.removeSpawnBiome(BiomeGenBase.frozenRiver);
           BiomeManager.removeSpawnBiome(BiomeGenBase.hell);
           BiomeManager.removeSpawnBiome(BiomeGenBase.iceMountains);
           BiomeManager.removeSpawnBiome(BiomeGenBase.icePlains);
           BiomeManager.removeSpawnBiome(BiomeGenBase.jungle);
           BiomeManager.removeSpawnBiome(BiomeGenBase.jungleEdge);
           BiomeManager.removeSpawnBiome(BiomeGenBase.jungleHills);
           BiomeManager.removeSpawnBiome(BiomeGenBase.megaTaiga);
           BiomeManager.removeSpawnBiome(BiomeGenBase.megaTaigaHills);
           BiomeManager.removeSpawnBiome(BiomeGenBase.mesa);
           BiomeManager.removeSpawnBiome(BiomeGenBase.mesaPlateau);
           BiomeManager.removeSpawnBiome(BiomeGenBase.mesaPlateau_F);
           BiomeManager.removeSpawnBiome(BiomeGenBase.mushroomIsland);
           BiomeManager.removeSpawnBiome(BiomeGenBase.mushroomIslandShore);
           BiomeManager.removeSpawnBiome(BiomeGenBase.plains);
           BiomeManager.removeSpawnBiome(BiomeGenBase.river);
           BiomeManager.removeSpawnBiome(BiomeGenBase.roofedForest);
           BiomeManager.removeSpawnBiome(BiomeGenBase.savanna);
           BiomeManager.removeSpawnBiome(BiomeGenBase.savannaPlateau);
           BiomeManager.removeSpawnBiome(BiomeGenBase.stoneBeach);
           BiomeManager.removeSpawnBiome(BiomeGenBase.swampland);
           BiomeManager.removeSpawnBiome(BiomeGenBase.taiga);
           BiomeManager.removeSpawnBiome(BiomeGenBase.taigaHills);
    
    

    Vu que je n'est pas la class Biomes j'ai mis BiomeGenBase. Le problèmes c'est que ça ne fonctionne toujours pas. Par exemple le biome plaine est bien généré alors qu'il ne devrait pas.



  • Je n'avais pas vu que tu étais en 1.8. Dans cette "vieille" version, il faut utiliser le WorldChunkManager.



  • A la place de BiomeManager ?



  • @'elx9000':

    A la place de BiomeManager ?

    Quelque chose comme ça :

    
    [font=-apple-system, BlinkMacSystemFont,public] static void removeSpawnBiome(BiomeGenBase biome)
    
       {
    
           if (WorldChunkManager.allowedBiomes.contains(biome))
    
           {
    
               WorldChunkManager.allowedBiomes.remove(biome);
    
           }
    
       }
    
    


  • J'ai fait ça :

    
           removeSpawnBiome(BiomeGenBase.birchForest);
           removeSpawnBiome(BiomeGenBase.birchForestHills);
           removeSpawnBiome(BiomeGenBase.coldBeach);
           removeSpawnBiome(BiomeGenBase.coldTaiga);
           removeSpawnBiome(BiomeGenBase.coldTaigaHills);
           removeSpawnBiome(BiomeGenBase.deepOcean);
           removeSpawnBiome(BiomeGenBase.desert);
           removeSpawnBiome(BiomeGenBase.desertHills);
           removeSpawnBiome(BiomeGenBase.extremeHills);
           removeSpawnBiome(BiomeGenBase.extremeHillsEdge);
           removeSpawnBiome(BiomeGenBase.extremeHillsPlus);
           removeSpawnBiome(BiomeGenBase.forest);
           removeSpawnBiome(BiomeGenBase.forestHills);
           removeSpawnBiome(BiomeGenBase.frozenOcean);
           removeSpawnBiome(BiomeGenBase.frozenRiver);
           removeSpawnBiome(BiomeGenBase.hell);
           removeSpawnBiome(BiomeGenBase.iceMountains);
           removeSpawnBiome(BiomeGenBase.icePlains);
           removeSpawnBiome(BiomeGenBase.jungle);
           removeSpawnBiome(BiomeGenBase.jungleEdge);
           removeSpawnBiome(BiomeGenBase.jungleHills);
           removeSpawnBiome(BiomeGenBase.megaTaiga);
           removeSpawnBiome(BiomeGenBase.megaTaigaHills);
           removeSpawnBiome(BiomeGenBase.mesa);
           removeSpawnBiome(BiomeGenBase.mesaPlateau);
           removeSpawnBiome(BiomeGenBase.mesaPlateau_F);
           removeSpawnBiome(BiomeGenBase.mushroomIsland);
           removeSpawnBiome(BiomeGenBase.mushroomIslandShore);
           removeSpawnBiome(BiomeGenBase.plains);
           removeSpawnBiome(BiomeGenBase.river);
           removeSpawnBiome(BiomeGenBase.roofedForest);
           removeSpawnBiome(BiomeGenBase.savanna);
           removeSpawnBiome(BiomeGenBase.savannaPlateau);
           removeSpawnBiome(BiomeGenBase.stoneBeach);
           removeSpawnBiome(BiomeGenBase.swampland);
           removeSpawnBiome(BiomeGenBase.taiga);
           removeSpawnBiome(BiomeGenBase.taigaHills);
       }
    
       public static void removeSpawnBiome(BiomeGenBase biome)
       {
           if (WorldChunkManager.allowedBiomes.contains(biome))
           {
               WorldChunkManager.allowedBiomes.remove(biome);
           }
       }
    
    

    Ceci se trouve dans la classe ou j'enregistre les biomes. Elle est enregistré dans le clientProxy dans registerRenders, qui est enregistré dans la partie init de la classe principale.
    Pourtant, ça ne fonctionne toujours pas ? Comment faire ?
    Merci par avance.



  • Pas d'idée ?



  • @'elx9000':

    Ceci se trouve dans la classe ou j'enregistre les biomes. Elle est enregistré dans le clientProxy dans registerRenders, qui est enregistré dans la partie init de la classe principale.

    Cela n'a rien à voir avec les renders alors ça n'a rien à faire dans la fonction registerRenders et supprimer les biomes côté client seulement ne sert à rien à part faire cracher Minecraft. Donc tu devrais plutôt le mettre dans le common proxy ou dans la class principale.(dans init, je pense que c'est bien)



  • J'ai mis le code précédent dans la classe principale, dans le init comme tu me l'as conseillé (sauf la méthode removeSpawnBiome). Mais ça ne fonctionne toujours pas, les biomes enlevé spawn toujours.

    Merci d'avance.



  • Si tu veux tous les enlever, il devrait y avoir une fonction removeAll dans biomeManager. Je ne peux malheureusement pas tester, car ma version de Minecraft est différente de la tienne.



  • Tous les biomes se trouvent dans le field biomeList,* *dans la class BiomeGenBase.
    biomeList étant private, static et final, tu doit la modifier en utilisant la Reflection :

    
    @EventHandler
    public void preInit (FMLPreInitializationEvent event) {    
       try {
         Field field = BiomeGenBase.class.getDeclaredFields()[14];
         field.setAccessible(true);
         Field modifiersField = Field.class.getDeclaredField("modifiers");
         modifiersField.setAccessible(true);
         modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
         field.set(BiomeGenBase.birchForest, new BiomeGenBase[256]);
       } catch(Exception e){
          e.printStackTrace();
       }
    }
    
    

    Source : https://stackoverflow.com/questions/3301635/change-private-static-final-field-using-java-reflection

    Pour avoir testé, on apparaît dans un monde remplis d'eau et dans le biome Plains, qui doit être le valeur par défaut.



  • J'ai du mal à comprendre la ligne :

    field.set(BiomeGenBase.***[color=#0000c0birchForest]***, [color=#7f0055new] BiomeGenBase[256]);

    Le 256 correspond à quoi ?

    Je voit effectivement qu'on apparaît dans un monde rempli d'eau, avec F3 il y a aussi écrit que je suis dans un biome plaine. Comment changer ceci pour afficher le biome océan ?

    Est-ce que ceci enlève les biomes custom ?

    Merci d'avance.



  • @'elx9000':

    J'ai du mal à comprendre la ligne :

    field.set(BiomeGenBase.***[color=#0000c0birchForest]***, [color=#7f0055new] BiomeGenBase[256]);

    Le 256 correspond à quoi ?

    La capacité du tableau. Je te conseil de (re)voir les bases du Java : https://openclassrooms.com/courses/apprenez-a-programmer-en-java/les-tableaux-3

    @'elx9000':

    Je voit effectivement qu'on apparaît dans un monde rempli d'eau, avec F3 il y a aussi écrit que je suis dans un biome plaine. Comment changer ceci pour afficher le biome océan ?

    2 solutions, une simple, l'autre laborieuse :
    -Rajouter le biome Océan dans le tableau;
    -Modifier le F3 (en utilisant l'event RenderGameOverlayEvent.Text, tu vérifies que gameSettings.showDebugInfo est sur true, puis tu cherches la ligne où se trouve le biome dans la variable event.left et tu le remplaces).

    @'elx9000':

    Est-ce que ceci enlève les biomes custom ?

    Ça dépend si les biomes sont rajoutées avant ou après field.set(BiomeGenBase.birchForest, new BiomeGenBase[256]);



  • Oui, je sais ce qu'est un tableau. Je voulait savoir pourquoi c'est 256 et pas 302 par exemple.
    Ensuite, comment j'ajoute le biome océan au tableau (j'ai était voir sur classroom mais j'ai rien trouvé sur l'ajout de valeur). De telle sorte qu'il n'y ai que mon biome custom et le biome océan.

    Merci d'avance.



  • La classe ArrayUtils devrait pouvoir t'aider 😉



  • J'ai rajouté cette ligne avant le field.set(…) :

    ArrayUtils.add([color=#7f0055new] BiomeGenBase[256], 0, BiomeGenBase.***[color=#0000c0ocean]***);

    Mais le F3 me considère toujours dans le biome plaine.



  • Je ne vois pas de ce qui a de compliqué :

    
    BiomeGenBase[] biomes = new BiomeGenBase[256];
    biomes[0] = BiomeGenBase.ocean;
    biomes[1] = <ton biome="">;
    field.set(BiomeGenBase.birchForest, biomes);
    
    ```</ton>


  • Effectivement, c'est pas compliqué une fois qu'on a compris.
    Il n'y a bien que mon biome et le biome océan qui spawnent.
    Ensuite, comment faire pour que le player spawn dans mon biome et pas dans le biome océan ?
    –-----------------
    Rectification : on ne peut pas changer le fait qu'on spawn dans un monde rempli d'eau et n'avoir que le biome custom sur le monde ?

    Merci d'avance.



  • BiomeProvider#findBiomePosition devrait trouver l'endroit le plus près du spawn où il y a ton biome. Tu peux le tp là-bas.