Plusieurs questions/problèmes



  • Salut
    J'ai plusieurs questions/problèmes concernant les entités, les blocks, le monde, …

    Je vais commencer par expliquer mon "concept" pour que tout paraisse plus logique et compréhensible : j'ai (grâce à vous) créer une variable s'appelant "apocalypse" qui par défault vaut false. Mais quand on rentre dans une dimension perso pour la 1ère fois, ça met la variable à true, ce qui déclenche donc l'apocalypse. Je créerai un boss qu'il faudra tuer pour annuler l'apocalypse (et donc mettre la variable à false).

    1. J'aimerai changer certains blocks par d'autre blocks uniquement pendant l'apocalypse et ensuite les rechanger quand l'apocalypse est fini (je vais prendre l'exemple de l'eau : quand c'est l'apocalypse, je voudrais changer toute l'eau du monde par de la lave (celle que j'ai créer) et ensuite quand c'est fini, rechanger ma lave par de l'eau).

    2. Dans le même style que la question précédente, je voudrais changer certains mobs par d'autre (par exemple changer le loup par un loup garou).

    3. Je voudrais aussi générer des structures. Mais c'est plus complexe que ça : je sais comment générer des structures dans des biomes non visités, mais je ne sais pas comment faire pour des biomes déjà chargés (je voudrais surtout mettre du feu).

    4. J'ai un problème pour désactiver la pluie. J'ai utilisé cette fonction : java    BiomeGenBase.plains.setDisableRain(); ça marche bien. Mais dès que j'ajoute cette condition : ```java
        if(apocalypse == true)
        {
      BiomeGenBase.plains.setDisableRain();
      BiomeGenBase.plains.temperature = 5698F;
        }

    
    5) J'ai aussi un problème pour afficher du texte dans le chat. J'ai utilisé cette fonction :```java
    player.addChatMessage(new ChatComponentTranslation("msg.apocalyspe.start", player.getDisplayName()).setChatStyle((new ChatStyle().setColor(EnumChatFormatting.RED))));
    ``` (c'est celle que j'ai utilisé pour mon mode de Noël), mais rien ne s'affiche dans le chat.
    
    6) Je pense avoir trouvé comment modifier la couleur du ciel : ```java
    package This_is_Halloween.Client;
    
    import net.minecraft.entity.Entity;
    import net.minecraft.util.Vec3;
    import net.minecraft.world.WorldProvider;
    import net.minecraftforge.client.IRenderHandler;
    
    public abstract class ApocalypseWorldProvider extends WorldProvider
    {
    @Override
    public Vec3 getFogColor(float var1, float var2)
    {
    System.out.println("getFogColor called");
           float f3 = 0.7529412F;
           float f4 = 0.84705883F;
           float f5 = 1.0F;
           return Vec3.createVectorHelper((double)f3, (double)f4, (double)f5);
    }
    
    @Override
    public Vec3 getSkyColor(Entity cameraEntity, float partialTicks)
    {
    System.out.println("getSkyColor called");
           float f4 = (float)0 / 255.0F;
           float f5 = (float)0 / 255.0F;
           float f6 = (float)0 / 255.0F;
           return Vec3.createVectorHelper((double)f4, (double)f5, (double)f6);
    }
    
    @Override
    public void setCloudRenderer(IRenderHandler renderer)
    {
    System.out.println("setCloudRenderer called");
    }
    }
    ```(au passage, ça enlèvera aussi les nuages et ça modifiera le brouillard).
    Je l'appelle via : ```java
    @SubscribeEvent
    public void Apocalypse(EntityJoinWorldEvent event)
    {
    if (event.entity != null & event.entity instanceof EntityPlayerMP)
    {
    DimensionManager.unregisterProviderType(0);
    DimensionManager.registerProviderType(0, ApocalypseWorldProvider.class, false);
    }
    }
    ``` mais rien : ça garde le provider par défaut. J'ai peut-être utilisé le mauvais event. Je précise que je l'ai mis dans ma classe d'évent côté client uniquement.
    (au départ, j'avais testé sans désenregistré le provider, mais je l'ai rajouté après pensant que ça réglerait le bug)
    
    7) Je voudrais aussi changer la couleur de l'herbe. J'ai trouvé un sujet qui peut me correspondre ([ici](https://www.minecraftforgefrance.fr/showthread.php?tid=2117)). Je l'ai mis en modifiant les paramètres (BlockPos n'existe pas en 1.7). Dans ma classe d'évent client, j'ai créer une fonction avec comme évent BiomeEvent.GetGrassColor (ce que Robin avait dit), mais après, je ne sais pas comment appeler la classe.
    
    8) Et pour finir, j'aimerai également que quand l'apocalypse vient de finir, il se mette à pleuvoir. J'avais pensé à mettre la fonction addChatMessage avec la commande de la pluie, mais si le joueur n'active pas les commandes, c'est rapé :/
    
    Je sais que je demande beaucoup, certaines sont peut-être infaisable mais bon …
    
    Merci d'avance

  • Rédacteurs

    1. Changer les blocs devrait être un peu lourd, surtout si la map déjà générée est grande, et faudra aussi changer les blocs si un joueur génère du terrain
    2. Celui-ci ne devrait pas être trop compliqué, tu récupère la liste des entitées du monde et tu check voir si il faut remplacer, un truc dans ce genre
    final List <entity>toAdd = new ArrayList<entity>();
    w.loadedEntityList.forEach(new Consumer<entity>() {
    
    @Override
    public void accept(Entity e) {
    if(e instanceof EntityWolf) {
    BlockPos pos = e.getPosition();
    EntityZombie zombie = new EntityZombie(e.getEntityWorld());
    zombie.setPosition(pos.getX(), pos.getY(), pos.getZ());
    zombie.setAngles(e.rotationYaw, e.rotationPitch);
    zombie.motionX = e.motionX;
    zombie.motionY = e.motionY;
    zombie.motionZ = e.motionZ;
    toAdd.add(zombie);
    e.setDead();
    }
    }
    });
    toAdd.forEach(new Consumer<entity>() {
    
    @Override
    public void accept(Entity e) {
    w.loadedEntityList.add(e);
    }
    
    });
    

    Ça remplace les loups par des zombies
    3) Tu génère des coordonnées aléatoires et tu pose tes blocs
    4) Ça dépend où tu as mis ce code, si c'est un code qui est exécuté seulement lors de la génération c'est normal que ça ne marche pas
    5) Je sais pas, mais pour celui là j'ai pas envie de chercher, et il faut aussi voir ce que tu as mis comme message pour 'msg.apocalyspe.start'
    6) Pour la couleur du ciel tout ça je ne connait pas mais je sais que EntityJoinWorldEvent est un event côté serveur

    N'hésite pas, à poser des questions

    EDIT: Pour la 1) je me disais qu'une solution pourrait être de créer ton propre liquide qui remplacerait l'eau dès la génération du monde et ensuite, suivant ta boolean aurait différentes propriétés et une texture différente, il y a cependant un hic, ça veut dire que ça supprime l'eau du monde (et c'est embêtant ça), et j'avais dit que changer tout les blocs d'eau du monde en lave serait lourd, en vérité je ne m'y connait pas très bien en performance, donc faut voir l'avis des autres</entity></entity></entity></entity>



  • Salut

    1. Dans ce cas, est-ce que c'est possible de modifier l'eau (qu'elle nous mette en feu, ne plus qu'elle léteigne) mais uniquement pendant l'apocalypse ?

    2. J'ai ajouté ton code, mais ça crash en me précisant cette ligne :

      world.loadedEntityList.forEach(new Consumer<entity>() {
    

    pour la variable world, j'ai juste fais ```java
    World world;

    De plus, j'ai mis le code dans mon CommonEventHandler comme ça, j'ai juste dû mettre une acollade avant et après sinon ca mettait une erreur.
    
    3) J'ai mis ce code, mais ça ne marche pas : ```java
     @SubscribeEvent
     public void ApocalypseSetFire(PopulateChunkEvent.Populate event)
     {
      if (event.world.provider.getDimensionId() == 0)
      {
       int x = event.chunkX, y = rand.nextInt(128), z = event.chunkZ;
       BlockPos pos = new BlockPos(x, y, z);
       event.world.setBlockState(new BlockPos(pos.getX(), pos.getY(), pos.getZ()), Blocks.fire.getDefaultState());
      }
     }
    ``` Je l'ai mis dans CommonEventHandler et je l'ai trouvé sur Internet en le modifiant un peu.
    
    4) Je l'ai mis dans la fonction load, ce que j'ai aussi fait pour mon mod de Noël. Pourtant, quand j'enlève la condition, la pluie est bien désactiver, mais dès que la remet, ce n'est pas pris en compte.
    
    5) Pour ici, j'ai, encore une fois, fait de la même manière que mon mod de Noël : je l'ai mis dans CommonEventHandler avec l'event EntityJoinWorldEvent, et j'ai mis dans en_US.lang:
    

    msg.apocalypse.start=Félicitation %s ! Tu as laissé le portail ouvert, des tas de monstres sont venus pour tuer et tout détruire. C'est l'apocalypse!

    (je sais que c'est écrit en français alors que le fichier est en anglais, je modifierai plus trard quand ça marchera)
    Mais après je l'ai mis dans une condition, c'est peut-être pour ça :
    ```java
    if (event.entity != null & event.entity instanceof EntityPlayerMP)
      {
       EntityPlayerMP player = (EntityPlayerMP)event.entity;
    
       if(player.dimension == -5)
       {
        WorldDataToSave.load().markDirty();
        This_is_Halloween.apocalypse = true;
        This_is_Halloween.apocalypseByPortail = true;
        //en dessous ne marche pas
        player.addChatMessage(new ChatComponentTranslation("msg.apocalyspe.start", player.getDisplayName()).setChatStyle((new ChatStyle().setColor(EnumChatFormatting.RED))));
       }
       if(player.dimension == -1)
       {
        WorldDataToSave.load().markDirty();
        This_is_Halloween.apocalypse = false;
        //en dessous ne marche pas
        player.addChatMessage(new ChatComponentTranslation("msg.apocalyspe.stop", player.getDisplayName()).setChatStyle((new ChatStyle().setColor(EnumChatFormatting.RED))));
    
       }
      }
    ```mais ce qui parait bizarre, c'est que ça met bien les variables à true, ce qui veut dire que les conditions marchent bien
    
    6) Du coup, ça doit pas être cet event je pense, vu que le rendu du ciel est uniquement client.
    
    PS : je continue le mod en 1.8 et non plus en 1.7 comme j'ai fait au début de ce post. Je vais de ce pas modifié la balise du titre.</entity>

  • Rédacteurs

    1. Via un event tu peux sûrement
    2. C'est normal si tu as fait java World world; Il faut que tu l'exécute dans une fonction qui prend le monde en paramètre, celle qui va déclencher l'apocalipse, au pire tu peut aussi utiliser ```java
      Minecraft.getMinecraft().theWorld;
    3) chunkX et chunkZ sont les coordonnées de chunk, mais faisont les choses les unes après les autres, d'abord la 1)
    4) C'est pas clair, "quand je l'enlève" quand ? Et puis il faut que tu exécute la fonction quand l'apocalipse commence
    5) Euh … Les messages je ne suis pas expert, je verrai après
    6) Quand veux-tu modifier la couleur du ciel ?


  • Je vais corriger quelques trucs qui me semble faux ^^ Je peux me tromper ^^

    @'BrokenSwing':

    1. Changer les blocs devrait être un peu lourd, surtout si la map déjà générée est grande, et faudra aussi changer les blocs si un joueur génère du terrain

    Non parce que normalement tu n'as pas à modifier les chunks qui ne sont pas chargé, donc peut importe la taille de la map, il y a toujours le même nombre de chunk chargés.

    @'BrokenSwing':

    1. Celui-ci ne devrait pas être trop compliqué, tu récupère la liste des entitées du monde et tu check voir si il faut remplacer, un truc dans ce genre

    En utilisant des fonctionnalités Java 8, tu rends incompatible ton mod avec ceux qui n'ont pas un JRE >= 8 et beaucoup sont dans ce cas.

    @'BrokenSwing':

    1. je me disais qu'une solution pourrait être de créer ton propre liquide qui remplacerait l'eau dès la génération du monde

    Si tu fais ça tu lis ton monde a ton mods, tu supprime ton mods, tu n'a plus d'eau du tout dans toute ta dimension.

    @'BrokenSwing':

    Il faut que tu l'exécute dans une fonction qui prend le monde en paramètre, celle qui va déclencher l'apocalipse, au pire tu peut aussi utiliser "Minecraft.getMinecraft().theWorld;"

    Ne marche que coté client, donc ça fera crasher le jeu, tu aura une autre NullPointerException

    J'ai l'impression que tu t'y prend très mal.
    Le concept d'apocalypse et de dimension n'ont rien a voir et peuvent être clairement séparé.
    Tu as d'une part une dimension, ou tu va générer les structures et faire spawner le boss et d'autre part tout le système d'apocalypse.
    Sépare les deux, commence par l'un ou l'autre.

    • Créer une dimension, c'est très documenté, il n'y a pas grand chose a inventer, juste suivre les tutoriels ça suffit.
    • Créer le système d'apocalypse, ce n'est pas documenté, il va falloir que tu fasse tout de 0 quasiment. J'espère que tu as de bonnes bases.

    Je ne t'aiderai pas pour la dimension, il y a des tutos pour ça.
    Par contre pour bien comprendre le système d'apocalypse que tu veux mettre en place, tu as une analyse préalable a faire.
    Pose toi les bonnes question :

    • Qu'est ce qui déclenche l'apocalypse ? : l'entré dans une dimension
    • Qu'est ce qui termine l'apocalypse ? : la mort d'un boss
      Conclusion : tes 2 déclencheurs sont ponctuel et peuvent être simuler.

    Quand tu vas tester ton mod, tu vas t'amuser a créer une nouvelle dimension à chaque fois ? Puis a chaque fois tu va tuer le boss ? Tu n'as pas finis.
    Simplifie le problème, mets de coté les déclencheurs, la création de dimension et du boss. Ça, ça n'a rien a voir avec la fonctionnalité que tu souhaite implémenter. Concentrons nous sur l'apocalypse.
    On va simplifier les déclencheurs, on va créer des déclencheurs de tests :

    • Qu'est ce qui déclenche l'apocalypse ? : la commande /modid apocalypse-on
    • Qu'est ce qui termine l'apocalypse ? : la commande /modid apocalypse-off
      Conclusion : On a 2 déclencheurs ultra simple et rapide a implémenter et taper une simple commande suffit.

    Comme je te l'ai dit le système d'apocalypse est indépendant de la dimension, rien ne t'empêche d'avoir une apocalypse dans l'overworld.
    Restreindre ton apocalypse à ta dimension, ça sera une fonctionnalité que tu ajoutera par la suite.

    Tu dois ensuite te demander ce que tu dois faire lorsque tu déclenche une apocalypse, je vois plusieurs choses :
    1 - Modifier un flag pour indiquer que tu es en apocalypse, ce flag peut par exemple être un boolean dans un WorldSavedData.
    2 - Pour tout les chunk chargés, remplacer l'eau par de la lave.
    3 - Prévoir un handler qui écoute le chargement/déchargement de chunk, afin de remplacer l'eau par de la lave dès qu'un chunk est chargé et que le flag d'apocalypse est à true

    Ensuite tu te pose la même question lorsque l'apocalypse se termine :
    1 - Modifier un flag pour indiquer que tu n'es plus en apocalypse
    2 - Pour tout les chunk chargés, remplacer la lave par de l'eau.
    3 - Prévoir un handler qui écoute le chargement/déchargement de chunk, afin de remplacer la lave par l'eau dès qu'un chunk est chargé et que le flag d'apocalypse est à false

    La ça doit déjà te donner une idée de la structure de ton mods.
    Ensuite tu as plein d'optimisation et d'amélioration à faire :

    • Comment, lorsqu'on sort de l'apocalypse, remplacer uniquement la lave anciennement eau par de l'eau sans toucher à la lave qui était déjà lave à l'origine
    • Comment éviter de remplacer l'eau par la lave et inversement lorsque le traitement à déjà été fait.

    Fait déjà les premières étapes, ensuite je pourrais t'aiguiller d'avantage.
    Tu te lances dans un vrai mod, qui demande un bagage suffisamment solide, et beaucoup d'autonomie.
    Bon courage.


  • Rédacteurs

    @Blackout
    Pour ce qui est de changer l'eau en lave j'avais dis que je savait pas trop
    Pour les entitées que proposes-tu ?
    Pour le Minecraft.getMinecraft().theWorld, c'est totalement vrai, faudrai que je m'y remette correctement avant de poster (je crois que c'est ce que je vais faire :P)

    Sinon les solutions que tu propose me semblent bien (très bien expliquées) et j'ai apprécié ta mise en forme



  • @'BrokenSwing':

    @Blackout
    Pour les entitées que proposes-tu ?

    Une boucle toute simple, un for.



  • Salut
    Désolé du temps de la réponse, j'étais pas mal occupée par le lycée et tout, et j'ai aussi chercher pourquoi mon monde marchait pas, même après recréation de zéro : c'est le World Provider

    Bref, j'ai suivi tes conseil et créé des commandes qui marchent toutes bien. Mais j'ai un problème bizarre quand je veux remplacer l'eau par de la lave (j'ai testé de mettre de la lave normal sans rien pour tester). J'ai mis ce code :

     @SubscribeEvent
     public void waterAndLava(ChunkEvent.Load event)
     {
      if(event.getChunk().isLoaded())
      {
       GameRegistry.registerWorldGenerator(new ApocalypseBlockChangeInWorldGenerator(), 0);
      }
     }
    ``` (c'est peut-être pas le bon évent mais à mon avis, si)
    
    Le ApocalypseBlockChangeInWorldGenerator :
    ```java
    package This_is_Halloween.Generation;
    
    import java.util.Random;
    
    import net.minecraft.util.BlockPos;
    import net.minecraft.world.World;
    import net.minecraft.world.chunk.IChunkProvider;
    import net.minecraftforge.fml.common.IWorldGenerator;
    
    public class ApocalypseBlockChangeInWorldGenerator implements IWorldGenerator
    {
     @Override
     public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider)
     {
      switch(world.provider.getDimensionId())
      {
      case 0:
       generateSurface(world, random, chunkX * 16, chunkZ * 16);
      }
     }
    
     private void generateSurface(World world, Random rand, int x, int z)
     {
      for(int i = 0; i < 40; i ++)
      {
       int randPosX = x + rand.nextInt(16);
       int randPosY = rand.nextInt(128);
       int randPosZ = z + rand.nextInt(16);
       (new ApocalypseBlocksChangeInWorld()).generate(world, rand, new BlockPos(randPosX, randPosY, randPosZ));
      }
     }
    }
    

    qui appelle ApocalypseBlocksChangeInWorld :

    package This_is_Halloween.Generation;
    
    import java.util.Random;
    
    import net.minecraft.block.state.IBlockState;
    import net.minecraft.init.Blocks;
    import net.minecraft.util.BlockPos;
    import net.minecraft.world.World;
    import net.minecraft.world.gen.feature.WorldGenerator;
    
    public class ApocalypseBlocksChangeInWorld extends WorldGenerator
    {
    public boolean generate(World world, Random random, BlockPos pos)
    {
    // There is Apocalypse ?
    if(This_is_Halloween.This_is_Halloween.apocalypse == true)
    {
    // WATER
    if((world.getBlockState(new BlockPos(pos.getX(), pos.getY(), pos.getZ())) == (IBlockState) Blocks.water.getDefaultState()))
    {
    //Still Water
    world.setBlockState(new BlockPos(pos.getX(), pos.getY(), pos.getZ()), Blocks.lava.getDefaultState());
    return true;
    }
    else if((world.getBlockState(new BlockPos(pos.getX(), pos.getY(), pos.getZ())) == (IBlockState) Blocks.flowing_water.getDefaultState()))
    {
    // Flowing Water
    world.setBlockState(new BlockPos(pos.getX(), pos.getY(), pos.getZ()), Blocks.flowing_lava.getDefaultState());
    return true;
    }
    }
    
    else if(This_is_Halloween.This_is_Halloween.apocalypse == false)
    {
    // LAVA
    if((world.getBlockState(new BlockPos(pos.getX(), pos.getY(), pos.getZ())) == (IBlockState) Blocks.lava.getDefaultState()))
    {
    //Still Lava
    world.setBlockState(new BlockPos(pos.getX(), pos.getY(), pos.getZ()), Blocks.water.getDefaultState());
    return true;
    }
    else if((world.getBlockState(new BlockPos(pos.getX(), pos.getY(), pos.getZ())) == (IBlockState) Blocks.flowing_lava.getDefaultState()))
    {
    // Flowing Lava
    world.setBlockState(new BlockPos(pos.getX(), pos.getY(), pos.getZ()), Blocks.flowing_water.getDefaultState());
    return true;
    }
    }
    return false;
    }
    }
    

    Pour moi, malgré les lags que j'étais presque sûr qu'ils existaient si y'avait une grande étendu d'eau (comme par exemple une mer), je pensais que ça changeait toute l'eau par de la lave. et bah voilà ce que ça me fait :

    Je sais pas si vous verrez, mais tout les blocks noirs dans l'eau, c'est de l'obsidienne, résultat de la transformation eau+lave.
    Du coup, ça change seulement une partie de l'eau et non toute

    Et quand j'ai testé de créer un monde uniquement avec de la lave, ça crash carrement à la création.
    Voilà le crash :

    [18:51:17] [main/INFO] [GradleStart]: Extra: []
    [18:51:17] [main/INFO] [GradleStart]: Running with arguments: [–userProperties, {}, --assetsDir, C:/Users/Antonin/.gradle/caches/minecraft/assets, --assetIndex, 1.8, --accessToken{REDACTED}, --version, 1.8, --tweakClass, net.minecraftforge.fml.common.launcher.FMLTweaker, --tweakClass, net.minecraftforge.gradle.tweakers.CoremodTweaker]
    [18:51:17] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.FMLTweaker
    [18:51:17] [main/INFO] [LaunchWrapper]: Using primary tweak class name net.minecraftforge.fml.common.launcher.FMLTweaker
    [18:51:17] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.gradle.tweakers.CoremodTweaker
    [18:51:17] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLTweaker
    [18:51:17] [main/INFO] [FML]: Forge Mod Loader version 11.14.4.1563 for Minecraft 1.8 loading
    [18:51:17] [main/INFO] [FML]: Java is Java HotSpot(TM) 64-Bit Server VM, version 1.8.0_92, running on Windows 10:amd64:10.0, installed at G:\Programmes\Java\jre
    [18:51:17] [main/INFO] [FML]: Managed to load a deobfuscated Minecraft name- we are in a deobfuscated environment. Skipping runtime deobfuscation
    [18:51:17] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.gradle.tweakers.CoremodTweaker
    [18:51:17] [main/INFO] [GradleStart]: Injecting location in coremod net.minecraftforge.fml.relauncher.FMLCorePlugin
    [18:51:17] [main/INFO] [GradleStart]: Injecting location in coremod net.minecraftforge.classloading.FMLForgePlugin
    [18:51:17] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker
    [18:51:17] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.FMLDeobfTweaker
    [18:51:17] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.gradle.tweakers.AccessTransformerTweaker
    [18:51:17] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker
    [18:51:17] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLInjectionAndSortingTweaker
    [18:51:17] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper
    [18:51:18] [main/ERROR] [FML]: The binary patch set is missing. Either you are in a development environment, or things are not going to work!
    [18:51:19] [main/ERROR] [FML]: FML appears to be missing any signature data. This is not a good thing
    [18:51:19] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.relauncher.CoreModManager$FMLPluginWrapper
    [18:51:19] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.FMLDeobfTweaker
    [18:51:20] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.gradle.tweakers.AccessTransformerTweaker
    [18:51:20] [main/INFO] [LaunchWrapper]: Loading tweak class name net.minecraftforge.fml.common.launcher.TerminalTweaker
    [18:51:20] [main/INFO] [LaunchWrapper]: Calling tweak class net.minecraftforge.fml.common.launcher.TerminalTweaker
    [18:51:20] [main/INFO] [LaunchWrapper]: Launching wrapped minecraft {net.minecraft.client.main.Main}
    [18:51:20] [Client thread/INFO]: Setting user: Player1
    [18:51:22] [Client thread/INFO]: LWJGL Version: 2.9.1
    [18:51:23] [Client thread/INFO] [STDOUT]: [net.minecraftforge.fml.client.SplashProgress:start:246]: –-- Minecraft Crash Report ----
    // Hey, that tickles! Hehehe!
    
    Time: 10/06/16 18:51
    Description: Loading screen debug info
    
    This is just a prompt for computer specs to be printed. THIS IS NOT A ERROR
    
    A detailed walkthrough of the error, its code path and all known details is as follows:
    ---------------------------------------------------------------------------------------
    
    -- System Details --
    Details:
    Minecraft Version: 1.8
    Operating System: Windows 10 (amd64) version 10.0
    Java Version: 1.8.0_92, Oracle Corporation
    Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
    Memory: 883830480 bytes (842 MB) / 1038876672 bytes (990 MB) up to 1038876672 bytes (990 MB)
    JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M
    IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
    FML:
    Loaded coremods (and transformers):
    GL info: ' Vendor: 'ATI Technologies Inc.' Version: '4.5.13416 Compatibility Profile Context 15.300.1025.1001' Renderer: 'AMD Radeon R9 200 Series'
    [18:51:23] [Client thread/INFO] [MinecraftForge]: Attempting early MinecraftForge initialization
    [18:51:23] [Client thread/INFO] [FML]: MinecraftForge v11.14.4.1563 Initialized
    [18:51:23] [Client thread/INFO] [FML]: Replaced 204 ore recipies
    [18:51:23] [Client thread/INFO] [MinecraftForge]: Completed early MinecraftForge initialization
    [18:51:23] [Client thread/INFO] [FML]: Found 0 mods from the command line. Injecting into mod discoverer
    [18:51:23] [Client thread/INFO] [FML]: Searching G:\Codage\Minecraft\This_is_Halloween\v1.3\MC 1.8\run\mods for mods
    [18:51:25] [Client thread/INFO] [FML]: Forge Mod Loader has identified 4 mods to load
    [18:51:25] [Client thread/INFO] [FML]: Attempting connection with missing mods [mcp, FML, Forge, This_is_Halloween] at CLIENT
    [18:51:25] [Client thread/INFO] [FML]: Attempting connection with missing mods [mcp, FML, Forge, This_is_Halloween] at SERVER
    [18:51:25] [Client thread/INFO]: Reloading ResourceManager: Default, FMLFileResourcePack:Forge Mod Loader, FMLFileResourcePack:Minecraft Forge, FMLFileResourcePack:This_is_Halloween
    [18:51:25] [Client thread/INFO] [FML]: Processing ObjectHolder annotations
    [18:51:25] [Client thread/INFO] [FML]: Found 384 ObjectHolder annotations
    [18:51:25] [Client thread/INFO] [FML]: Identifying ItemStackHolder annotations
    [18:51:25] [Client thread/INFO] [FML]: Found 0 ItemStackHolder annotations
    [18:51:25] [Client thread/INFO] [FML]: Configured a dormant chunk cache size of 0
    [18:51:25] [Client thread/INFO] [FML]: Applying holder lookups
    [18:51:25] [Forge Version Check/INFO] [ForgeVersionCheck]: [Forge] Starting version check at http://files.minecraftforge.net/maven/net/minecraftforge/forge/promotions_slim.json
    [18:51:25] [Client thread/INFO] [FML]: Holder lookups applied
    [18:51:25] [Client thread/INFO] [FML]: Injecting itemstacks
    [18:51:25] [Client thread/INFO] [FML]: Itemstack injection complete
    [18:51:26] [Sound Library Loader/INFO]: Starting up SoundSystem…
    [18:51:26] [Thread-9/INFO]: Initializing LWJGL OpenAL
    [18:51:26] [Thread-9/INFO]: (The LWJGL binding of OpenAL.  For more information, see http://www.lwjgl.org)
    [18:51:26] [Thread-9/INFO]: OpenAL initialized.
    [18:51:26] [Forge Version Check/INFO] [ForgeVersionCheck]: [Forge] Found status: UP_TO_DATE Target: null
    [18:51:26] [Sound Library Loader/INFO]: Sound engine started
    [18:51:29] [Client thread/INFO] [FML]: Max texture size: 16384
    [18:51:29] [Client thread/INFO]: Created: 16x16 textures-atlas
    [18:51:30] [Client thread/INFO] [FML]: Injecting itemstacks
    [18:51:30] [Client thread/INFO] [FML]: Itemstack injection complete
    [18:51:30] [Client thread/INFO] [FML]: Forge Mod Loader has successfully loaded 4 mods
    [18:51:30] [Client thread/INFO]: Reloading ResourceManager: Default, FMLFileResourcePack:Forge Mod Loader, FMLFileResourcePack:Minecraft Forge, FMLFileResourcePack:This_is_Halloween
    [18:51:30] [Client thread/INFO]: SoundSystem shutting down…
    [18:51:30] [Client thread/WARN]: Author: Paul Lamb, www.paulscode.com
    [18:51:30] [Sound Library Loader/INFO]: Starting up SoundSystem…
    [18:51:30] [Thread-11/INFO]: Initializing LWJGL OpenAL
    [18:51:30] [Thread-11/INFO]: (The LWJGL binding of OpenAL.  For more information, see http://www.lwjgl.org)
    [18:51:30] [Thread-11/INFO]: OpenAL initialized.
    [18:51:30] [Sound Library Loader/INFO]: Sound engine started
    [18:51:32] [Client thread/INFO] [FML]: Max texture size: 16384
    [18:51:33] [Client thread/INFO]: Created: 512x512 textures-atlas
    [18:51:33] [Client thread/ERROR] [TEXTURE ERRORS]: +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
    [18:51:33] [Client thread/ERROR] [TEXTURE ERRORS]: The following texture errors were found.
    [18:51:33] [Client thread/ERROR] [TEXTURE ERRORS]: ==================================================
    [18:51:33] [Client thread/ERROR] [TEXTURE ERRORS]:   DOMAIN this_is_halloween
    [18:51:33] [Client thread/ERROR] [TEXTURE ERRORS]: –------------------------------------------------
    [18:51:33] [Client thread/ERROR] [TEXTURE ERRORS]:   domain this_is_halloween is missing 0 textures
    [18:51:33] [Client thread/ERROR] [TEXTURE ERRORS]:     domain this_is_halloween has 1 location:
    [18:51:33] [Client thread/ERROR] [TEXTURE ERRORS]:       mod This_is_Halloween resources at G:\Codage\Minecraft\This_is_Halloween\v1.3\MC 1.8\bin
    [18:51:33] [Client thread/ERROR] [TEXTURE ERRORS]: –-----------------------
    [18:51:33] [Client thread/ERROR] [TEXTURE ERRORS]:     The following other errors were reported for domain this_is_halloween:
    [18:51:33] [Client thread/ERROR] [TEXTURE ERRORS]: –-----------------------
    [18:51:33] [Client thread/ERROR] [TEXTURE ERRORS]:     Problem: broken aspect ratio and not an animation
    [18:51:33] [Client thread/ERROR] [TEXTURE ERRORS]:       textures/blocks/PortalUnderworld.png
    [18:51:33] [Client thread/ERROR] [TEXTURE ERRORS]: ==================================================
    [18:51:33] [Client thread/ERROR] [TEXTURE ERRORS]: +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
    [18:51:59] [Server thread/INFO]: Starting integrated minecraft server version 1.8
    [18:51:59] [Server thread/INFO]: Generating keypair
    [18:51:59] [Server thread/INFO]: Converting map!
    [18:51:59] [Server thread/INFO]: Scanning folders…
    [18:51:59] [Server thread/INFO]: Total conversion count is 0
    [18:51:59] [Server thread/INFO] [FML]: Injecting existing block and item data into this server instance
    [18:51:59] [Server thread/INFO] [FML]: Applying holder lookups
    [18:51:59] [Server thread/INFO] [FML]: Holder lookups applied
    [18:51:59] [Server thread/INFO] [FML]: Loading dimension 0 (New World) (net.minecraft.server.integrated.IntegratedServer@3c9d2074)
    [18:51:59] [Server thread/WARN]: Unable to find spawn biome
    [18:52:03] [Server thread/ERROR]: Encountered an unexpected exception
    net.minecraft.util.ReportedException: Exception initializing level
    at net.minecraft.world.WorldServer.initialize(WorldServer.java:851) ~[WorldServer.class:?]
    at net.minecraft.server.integrated.IntegratedServer.loadAllWorlds(IntegratedServer.java:92) ~[IntegratedServer.class:?]
    at net.minecraft.server.integrated.IntegratedServer.startServer(IntegratedServer.java:130) ~[IntegratedServer.class:?]
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:500) [MinecraftServer.class:?]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_92]
    Caused by: java.lang.NoClassDefFoundError: net/minecraft/crash/CrashReportCategory$4
    at net.minecraft.crash.CrashReportCategory.addBlockInfo(CrashReportCategory.java:280) ~[CrashReportCategory.class:?]
    at net.minecraft.world.World.notifyBlockOfStateChange(World.java:602) ~[World.class:?]
    at net.minecraft.world.World.notifyNeighborsOfStateChange(World.java:527) ~[World.class:?]
    at net.minecraft.world.World.notifyNeighborsRespectDebug(World.java:480) ~[World.class:?]
    at net.minecraft.world.World.markAndNotifyBlock(World.java:424) ~[World.class:?]
    at net.minecraft.world.World.setBlockState(World.java:406) ~[World.class:?]
    at net.minecraft.world.World.setBlockState(World.java:465) ~[World.class:?]
    at This_is_Halloween.Generation.ApocalypseBlocksChangeInWorld.generate(ApocalypseBlocksChangeInWorld.java:39) ~[ApocalypseBlocksChangeInWorld.class:?]
    at This_is_Halloween.Generation.ApocalypseBlockChangeInWorldGenerator.generateSurface(ApocalypseBlockChangeInWorldGenerator.java:29) ~[ApocalypseBlockChangeInWorldGenerator.class:?]
    at This_is_Halloween.Generation.ApocalypseBlockChangeInWorldGenerator.generate(ApocalypseBlockChangeInWorldGenerator.java:18) ~[ApocalypseBlockChangeInWorldGenerator.class:?]
    at net.minecraftforge.fml.common.registry.GameRegistry.generateWorld(GameRegistry.java:112) ~[GameRegistry.class:?]
    at net.minecraft.world.gen.ChunkProviderServer.populate(ChunkProviderServer.java:293) ~[ChunkProviderServer.class:?]
    at net.minecraft.world.chunk.Chunk.populateChunk(Chunk.java:1192) ~[Chunk.class:?]
    at net.minecraft.world.gen.ChunkProviderServer.originalLoadChunk(ChunkProviderServer.java:196) ~[ChunkProviderServer.class:?]
    at net.minecraft.world.gen.ChunkProviderServer.loadChunk(ChunkProviderServer.java:138) ~[ChunkProviderServer.class:?]
    at net.minecraft.world.gen.ChunkProviderServer.loadChunk(ChunkProviderServer.java:108) ~[ChunkProviderServer.class:?]
    at net.minecraft.world.gen.ChunkProviderServer.provideChunk(ChunkProviderServer.java:209) ~[ChunkProviderServer.class:?]
    at net.minecraft.world.World.getChunkFromChunkCoords(World.java:360) ~[World.class:?]
    at net.minecraft.world.World.getChunkFromBlockCoords(World.java:349) ~[World.class:?]
    at net.minecraft.world.World.getBlockState(World.java:902) ~[World.class:?]
    at net.minecraft.world.World.isAirBlock(World.java:271) ~[World.class:?]
    at net.minecraft.world.World.getGroundAboveSeaLevel(World.java:247) ~[World.class:?]
    at net.minecraft.world.WorldProvider.canCoordinateBeSpawn(WorldProvider.java:87) ~[WorldProvider.class:?]
    at net.minecraft.world.WorldServer.createSpawnPosition(WorldServer.java:910) ~[WorldServer.class:?]
    at net.minecraft.world.WorldServer.initialize(WorldServer.java:829) ~[WorldServer.class:?]
    … 4 more
    [18:52:03] [Server thread/ERROR]: This crash report has been saved to: G:\Codage\Minecraft\This_is_Halloween\v1.3\MC 1.8\run\.\crash-reports\crash-2016-06-10_18.52.03-server.txt
    [18:52:03] [Server thread/INFO] [FML]: Applying holder lookups
    [18:52:03] [Server thread/INFO] [FML]: Holder lookups applied
    [18:52:03] [Server thread/INFO] [FML]: The state engine was in incorrect state SERVER_STARTING and forced into state SERVER_STOPPED. Errors may have been discarded.
    [18:52:05] [Client thread/INFO] [STDOUT]: [net.minecraft.init.Bootstrap:printToSYSOUT:663]: –-- Minecraft Crash Report ----
    // Don't be sad. I'll do better next time, I promise!
    
    Time: 10/06/16 18:52
    Description: Exception initializing level
    
    java.lang.NoClassDefFoundError: net/minecraft/crash/CrashReportCategory$4
    at net.minecraft.crash.CrashReportCategory.addBlockInfo(CrashReportCategory.java:280)
    at net.minecraft.world.World.notifyBlockOfStateChange(World.java:602)
    at net.minecraft.world.World.notifyNeighborsOfStateChange(World.java:527)
    at net.minecraft.world.World.notifyNeighborsRespectDebug(World.java:480)
    at net.minecraft.world.World.markAndNotifyBlock(World.java:424)
    at net.minecraft.world.World.setBlockState(World.java:406)
    at net.minecraft.world.World.setBlockState(World.java:465)
    at This_is_Halloween.Generation.ApocalypseBlocksChangeInWorld.generate(ApocalypseBlocksChangeInWorld.java:39)
    at This_is_Halloween.Generation.ApocalypseBlockChangeInWorldGenerator.generateSurface(ApocalypseBlockChangeInWorldGenerator.java:29)
    at This_is_Halloween.Generation.ApocalypseBlockChangeInWorldGenerator.generate(ApocalypseBlockChangeInWorldGenerator.java:18)
    at net.minecraftforge.fml.common.registry.GameRegistry.generateWorld(GameRegistry.java:112)
    at net.minecraft.world.gen.ChunkProviderServer.populate(ChunkProviderServer.java:293)
    at net.minecraft.world.chunk.Chunk.populateChunk(Chunk.java:1192)
    at net.minecraft.world.gen.ChunkProviderServer.originalLoadChunk(ChunkProviderServer.java:196)
    at net.minecraft.world.gen.ChunkProviderServer.loadChunk(ChunkProviderServer.java:138)
    at net.minecraft.world.gen.ChunkProviderServer.loadChunk(ChunkProviderServer.java:108)
    at net.minecraft.world.gen.ChunkProviderServer.provideChunk(ChunkProviderServer.java:209)
    at net.minecraft.world.World.getChunkFromChunkCoords(World.java:360)
    at net.minecraft.world.World.getChunkFromBlockCoords(World.java:349)
    at net.minecraft.world.World.getBlockState(World.java:902)
    at net.minecraft.world.World.isAirBlock(World.java:271)
    at net.minecraft.world.World.getGroundAboveSeaLevel(World.java:247)
    at net.minecraft.world.WorldProvider.canCoordinateBeSpawn(WorldProvider.java:87)
    at net.minecraft.world.WorldServer.createSpawnPosition(WorldServer.java:910)
    at net.minecraft.world.WorldServer.initialize(WorldServer.java:829)
    at net.minecraft.server.integrated.IntegratedServer.loadAllWorlds(IntegratedServer.java:92)
    at net.minecraft.server.integrated.IntegratedServer.startServer(IntegratedServer.java:130)
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:500)
    at java.lang.Thread.run(Unknown Source)
    
    A detailed walkthrough of the error, its code path and all known details is as follows:
    ---------------------------------------------------------------------------------------
    
    -- Head --
    Stacktrace:
    at net.minecraft.crash.CrashReportCategory.addBlockInfo(CrashReportCategory.java:280)
    at net.minecraft.world.World.notifyBlockOfStateChange(World.java:602)
    at net.minecraft.world.World.notifyNeighborsOfStateChange(World.java:527)
    at net.minecraft.world.World.notifyNeighborsRespectDebug(World.java:480)
    at net.minecraft.world.World.markAndNotifyBlock(World.java:424)
    at net.minecraft.world.World.setBlockState(World.java:406)
    at net.minecraft.world.World.setBlockState(World.java:465)
    at This_is_Halloween.Generation.ApocalypseBlocksChangeInWorld.generate(ApocalypseBlocksChangeInWorld.java:39)
    at This_is_Halloween.Generation.ApocalypseBlockChangeInWorldGenerator.generateSurface(ApocalypseBlockChangeInWorldGenerator.java:29)
    at This_is_Halloween.Generation.ApocalypseBlockChangeInWorldGenerator.generate(ApocalypseBlockChangeInWorldGenerator.java:18)
    at net.minecraftforge.fml.common.registry.GameRegistry.generateWorld(GameRegistry.java:112)
    at net.minecraft.world.gen.ChunkProviderServer.populate(ChunkProviderServer.java:293)
    at net.minecraft.world.chunk.Chunk.populateChunk(Chunk.java:1192)
    at net.minecraft.world.gen.ChunkProviderServer.originalLoadChunk(ChunkProviderServer.java:196)
    at net.minecraft.world.gen.ChunkProviderServer.loadChunk(ChunkProviderServer.java:138)
    at net.minecraft.world.gen.ChunkProviderServer.loadChunk(ChunkProviderServer.java:108)
    at net.minecraft.world.gen.ChunkProviderServer.provideChunk(ChunkProviderServer.java:209)
    at net.minecraft.world.World.getChunkFromChunkCoords(World.java:360)
    at net.minecraft.world.World.getChunkFromBlockCoords(World.java:349)
    at net.minecraft.world.World.getBlockState(World.java:902)
    at net.minecraft.world.World.isAirBlock(World.java:271)
    at net.minecraft.world.World.getGroundAboveSeaLevel(World.java:247)
    at net.minecraft.world.WorldProvider.canCoordinateBeSpawn(WorldProvider.java:87)
    at net.minecraft.world.WorldServer.createSpawnPosition(WorldServer.java:910)
    
    -- Affected level --
    Details:
    Level name: New World
    All players: 0 total; []
    Chunk stats: ServerChunkCache: 1043 Drop: 0
    Level seed: -7992168318150346498
    Level generator: ID 01 - flat, ver 0\. Features enabled: true
    Level generator options: 3;minecraft:bedrock,5*minecraft:stone,5*minecraft:dirt,5*minecraft:sand,90*minecraft:lava;24;oceanmonument,biome_1
    Level spawn location: 0,00,0,00,0,00 - World: (0,0,0), Chunk: (at 0,0,0 in 0,0; contains blocks 0,0,0 to 15,255,15), Region: (0,0; contains chunks 0,0 to 31,31, blocks 0,0,0 to 511,255,511)
    Level time: 0 game time, 0 day time
    Level dimension: 0
    Level storage version: 0x04ABD - Anvil
    Level weather: Rain time: 0 (now: false), thunder time: 0 (now: false)
    Level game mode: Game mode: creative (ID 1). Hardcore: false. Cheats: true
    Stacktrace:
    at net.minecraft.world.WorldServer.initialize(WorldServer.java:829)
    at net.minecraft.server.integrated.IntegratedServer.loadAllWorlds(IntegratedServer.java:92)
    at net.minecraft.server.integrated.IntegratedServer.startServer(IntegratedServer.java:130)
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:500)
    at java.lang.Thread.run(Unknown Source)
    
    -- System Details --
    Details:
    Minecraft Version: 1.8
    Operating System: Windows 10 (amd64) version 10.0
    Java Version: 1.8.0_92, Oracle Corporation
    Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
    Memory: 659648672 bytes (629 MB) / 1038876672 bytes (990 MB) up to 1038876672 bytes (990 MB)
    JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M
    IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
    FML: MCP v9.10 FML v8.0.99.99 Minecraft Forge 11.14.4.1563 4 mods loaded, 4 mods active
    States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored
    UCHIJAA mcp{9.05} [Minecraft Coder Pack] (minecraft.jar)
    UCHIJAA FML{8.0.99.99} [Forge Mod Loader] (forgeSrc-1.8-11.14.4.1563.jar)
    UCHIJAA Forge{11.14.4.1563} [Minecraft Forge] (forgeSrc-1.8-11.14.4.1563.jar)
    UCHIJAA This_is_Halloween{1.3} [This_is_Halloween] (bin)
    Loaded coremods (and transformers):
    GL info: ~~ERROR~~ RuntimeException: No OpenGL context found in the current thread.
    Profiler Position: N/A (disabled)
    Player Count: 0 / 8; []
    Type: Integrated Server (map_client.txt)
    Is Modded: Definitely; Client brand changed to 'fml,forge'
    [18:52:05] [Client thread/INFO] [STDOUT]: [net.minecraft.init.Bootstrap:printToSYSOUT:663]: #@!@# Game crashed! Crash report saved to: #@!@# .\crash-reports\crash-2016-06-10_18.52.03-server.txt
    AL lib: (EE) alc_cleanup: 1 device not closed
    Java HotSpot(TM) 64-Bit Server VM warning: Using incremental CMS is deprecated and will likely be removed in a future release
    
    

    Revoilà le fichier :

    package This_is_Halloween.Generation;
    
    import java.util.Random;
    
    import net.minecraft.block.state.IBlockState;
    import net.minecraft.init.Blocks;
    import net.minecraft.util.BlockPos;
    import net.minecraft.world.World;
    import net.minecraft.world.gen.feature.WorldGenerator;
    
    public class ApocalypseBlocksChangeInWorld extends WorldGenerator
    {
    public boolean generate(World world, Random random, BlockPos pos)
    {
    // There is Apocalypse ?
    if(This_is_Halloween.This_is_Halloween.apocalypse == true)
    {
    // WATER
    if((world.getBlockState(new BlockPos(pos.getX(), pos.getY(), pos.getZ())) == (IBlockState) Blocks.water.getDefaultState()))
    {
    //Still Water
    world.setBlockState(new BlockPos(pos.getX(), pos.getY(), pos.getZ()), Blocks.lava.getDefaultState());
    return true;
    }
    else if((world.getBlockState(new BlockPos(pos.getX(), pos.getY(), pos.getZ())) == (IBlockState) Blocks.flowing_water.getDefaultState()))
    {
    // Flowing Water
    world.setBlockState(new BlockPos(pos.getX(), pos.getY(), pos.getZ()), Blocks.flowing_lava.getDefaultState());
    return true;
    }
    }
    
    else if(This_is_Halloween.This_is_Halloween.apocalypse == false)
    {
    // LAVA
    if((world.getBlockState(new BlockPos(pos.getX(), pos.getY(), pos.getZ())) == (IBlockState) Blocks.lava.getDefaultState()))
    {
    //Still Lava
    world.setBlockState(new BlockPos(pos.getX(), pos.getY(), pos.getZ()), Blocks.water.getDefaultState());
    return true;
    }
    else if((world.getBlockState(new BlockPos(pos.getX(), pos.getY(), pos.getZ())) == (IBlockState) Blocks.flowing_lava.getDefaultState()))
    {
    // Flowing Lava
    world.setBlockState(new BlockPos(pos.getX(), pos.getY(), pos.getZ()), Blocks.flowing_water.getDefaultState());
    return true;
    }
    }
    return false;
    }
    }
    

    Ca pointe à cette ligne : ```java
    world.setBlockState(new BlockPos(pos.getX(), pos.getY(), pos.getZ()), Blocks.water.getDefaultState());

    
    Je comprend pas tout là : ça ne change que la moitié de l'eau par de la lave, mais ça veut pas changer la lave par l'eau.
    
    > - Comment, lorsqu'on sort de l'apocalypse, remplacer uniquement la lave anciennement eau par de l'eau sans toucher à la lave qui était déjà lave à l'origine
    > - Comment éviter de remplacer l'eau par la lave et inversement lorsque le traitement à déjà été fait.
    
    J'avais pensé à faire que si c'est l'apocalypse, ça change l'eau par la lave mais en enregistrant un Tag à l'intèrieur (je ne sais pas pour l'instant comment faire, mais je devrais trouvzer je pense). Quand l'apocalypse sera finie, ça changera la lave par l'eau uniquement si y'a le Tag, s'il n'y est pas, ça ne fait rien. Je ne sais pas si y'a une meilleur option, j'ai trouvé que ça (à part créer une lave custom que j'ai fait en 1.7 mais qui buguait, mais voilà qu'elle ne marche plus en 1.8, et aussi parce que
    
    > > BrokenSwing a écrit :
    > > 1) je me disais qu'une solution pourrait être de créer ton propre liquide qui remplacerait l'eau dès la génération du monde
    > 
    > Si tu fais ça tu lis ton monde a ton mods, tu supprime ton mods, tu n'a plus d'eau du tout dans toute ta dimension.
    
    )
    Vooilà, si vous  avez des idées/améliorations/conseils/solutions, n'hésitez pas.
    
    EDIT : Sinon, l'autrefois quand j'ai parcouru les tuto des membres et ceux non valides, j'ai vu un truc pour pouvoir changer les caractéristiques de l'eau. S'il n'y a vraiment pas d'autre moyen, je pourrais utiliser ça pour mettre des dégâts et le feu. Comme ça, plus de remplacement d'eau par de la lave et plus aucun lag, mais je trouve que ça fera moins bien en laissant la texture de l'eau. Mais en même temps, je me dit aussi qu'on peut laisser l'eau, comme ça, ça fera vraiment eau brulante dû au fait de la haute température (qui est de 5698°). A voir…

  • Administrateurs

    Pour mettre un tag il faut un tile entity. Beaucoup trop lourd. Autant utiliser un bloc de lave custom.

    Remplacer avec le générateur ça ne va pas du tout, car ton code n'est pas exécuté pour toutes la maps mais avec des valeurs aléatoires.
    Il faudrait plutôt passer par un event.

    Et changer directement les propriétés de l'eau serait surement plus simple.



  • Arrête d'utiliser des WorldGenerator, tu n'en a pas besoin dans un premier temps.
    Le WorldGenerator ce sera surement de l'optimisation lorsque tu auras compris les mécaniques internes de chargement de terrain Minecraft.
    Pour l'instant tu n'as besoin que de l'event [c]ChunkEvent.Load event[/c] et de la méthode getBlockState() / setBlockState() de l'attribut event.world.



  • Salut
    Je vais juste ajouter des dégâts à l'eau, ça sera plus simple (je pourrai peut-être me permettre de remplacer l'eau par la lave plus tard, quand j'aurai plus de connaissances).

    J'ai créer ma source de dégâts, mais je ne sais pas comment l'appliquer à l'eau. J'ai regardé la liste des events, mais rien ne semble pouvoir répondre à mon problème. J'ai donc pensé à mettre l'eau vanilla à null et la remplacer par une eau custom, mais 2 problèmes se sont posés à moi :

    1. quand j'ai créer ma lave custom (que j'ai ensuite supprimer) en 1.7, j'ai peiné mais arrivé. Mais quand j'ai voulu la mettre en 1.8, les problèmes commencent. Mais ce n'est pas trop un problème, j'aurai juste qu'à chercher dans les classes vanilla et sur Internet.
    2. comme dit ici

    La réflexion, tu peux avoir quelques problèmes de communication, par exemple railcraft l'utilise pour modifier les items de cart, en conséquence si tu as railcraft en solo tu ne peux pas te connecté à un serveur forge qui n'a pas railcraft (donc pas très cool)

    , ça ne sera pas très bien. Après, je pourrai faire (si c'est possible) une condition qui vérifie sur le serveur a le mod d'installé.

    Du coup, je suis bloqué 😕

    PS : j'aurai aussi une question. Quand j'ai créé mes dégâts, j'ai vu qu'on pouvait mettre .lava après waterDamageSource = new DamageSource("waterDamageSource");. Du coup, ça fait les mêmes dégâts que la lave ou pas ? Je voulais testé directement en jeu, mais vu mes problèmes ci-dessus, …

    EDIT : D'ailleurs, même si je remplace l'eau vanilla par mon eau custom, je saurais quand même pas appliquer ma source de dégâts. Donc dans tous les cas, je sais pas comment faire ...


  • Administrateurs

    Avec LivingUpdateEvent, if(event.living.isInWater()) -> event.living.attackFrom(ton damage source)
    Pas besoin de remplacer l'eau.



  • C'est tout ? J'avais cru que c'était plus compliqué
    Je n'arrive pas à bien créer ma source de dégâts. J'arrive à faire en sorte que ça m'enlève un cœur mais je n'arrive pas à mettre le joueur en feu. J'ai testé :

    .inFire , .onFire , .setFireDamage()
    ``` mais rien ne marche
    J'allais vous demander pourquoi quand je me suis dit que c'est de l'eau. Et le principe de l'eau, c'est d'éteindre le feu. Du coup, je sais pas si ça serait possible de mettre le joueur en feu quand il est dans l'eau.
    
    Concernant la question 2 du 1er post (changer un mob par un autre), j'ai réussi à récupérer la position et la rotation du mob et le tuer, mais je ne sais pas comment faire pour en faire spawner un autre. Voilà ce que j'ai utilisé (je pense que c'est le bon code, mais j'aimerai avoir une confirmation svp) :
    ```java
     @SubscribeEvent
     public void apocalypseMobReplace(EntityJoinWorldEvent event)
     {
      if(This_is_Halloween.apocalypse == true)
      {
       if(event.entity instanceof EntityWolf) 
       {
        EntityWerewolf werewolf;
        int x = event.entity.chunkCoordX;
        int y = event.entity.chunkCoordY;
        int z = event.entity.chunkCoordZ;
        float rotateX = event.entity.rotationPitch;
        float rotateY = event.entity.rotationYaw;
    
        event.entity.setDead();
    
       }
      }
     }
    

    Ensuite pour la question 4 (désactiver la pluie), j'utilise cette ligne :

    BiomeGenBase.plains.setDisableRain();
    ``` (je pense que c'est la bonne, je l'utilise pour mon mod de Noël. De plus, si je met juste celle-là, ça marche)
    Mais dès que j'ajoute la condition :```java
      if(This_is_Halloween.apocalypse == true)
      {
    
      }
    ```, ça marche plus. De plus, j'ai aussi mis un println, mais pas de trace du message. J'ai essayé de la mettre dans la fonction load de la classe principale, mais aussi dans le commonProxy. J'ai aussi essayer de remplacer if par while, mais sans succès. D'ailleurs (même si ce n'est qu'un détail), c'est peut être mieux de mettre while (qui pourrait se traduire par tant que); mais dans les deux cas c'est pareil).
    
    Pour la question 5 (afficher un message), il fallait juste que j'utilise l'event PlayerLoggedInEvent. Mais une autre peut marcher aussi je pense.
    
    Pour la 6 (remplacer le provider de base), j'avoue que j'ai pas du tout chercher. J'ai juste remplacer EntityPlayerMP par EntityPlayer dans la condition. On m'a aussi dit que ce n'est peut être pas l'event EntityJoinWorldEvent, mais si ce n'est pas ça, je ne sais pas laquelle ça serait. De toute façon, je ne peux pas tester pour l'instant puisque dans le code ```java
           return Vec3.createVectorHelper((double)f3, (double)f4, (double)f5);
    ``` createVectorHelper n'existe plus.
    
    Pour la 7 (remplacer la couleur de l'herbe), je bloque totalement pour un biome déjà existant.
    
    Et enfin pour la 8 (mettre la pluie quand l'apocalypse vient de finir, c'est à dire quand la variable apocalypse vient de passer à false), je n'est tout simplement pas chercher. Pour l'instant je m'intéresse plus aux problèmes déjà posées auquel vous m'avez répondu. Je feraient celui là ensuite.
    
    Merci d'avance
    
    PS : désolé d'avoir remis toutes les questions alors qu'au départ, on étais juste sur l'eau. C'est pour pouvoir avancé et éviter de vous embêter trop longtemps ;)

  • Administrateurs

    En effet le joueur ne risque pas de prendre feu de l'eau.
    Pour le spawn, world.spawnEntityInWorld(new TonEntité(….));
    Pour la Q4, il faudrait désactiver la pluie quand tu actives l'apocalypse, et non le désactiver dans la classe principale si c'est l'apocalypse.

    Pour les autres questions je ne sais pas non plus.



  • Pour mettre un joueur en feux : player.setOnFire(true) ?

    if(This_is_Halloween.apocalypse == true) -> if(This_is_Halloween.apocalypse) d'ailleurs je crois que c'est pas la première fois que je le dis mais essaie de respecter la convention java. D'ailleurs je ne sais pas pourquoi tu appelles une valeur statique de ton mod, quel est l'utilité ?

    Pour faire spawner un mob : world.spawnEntityInWorld(entity) ?

    BiomeGenBase.plains.setDisableRain(); -> je doute que ce soit ça car accéder à un biome de façon statique ne risque pas de le changer dans le monde, est-ce que tu as regardé comment c'était fait dans les commandes de minecraft ?

    remplacer la couleur de l'herbe -> fait une recherche sur le forum

    Pour le reste j'attends que tu es un code un peu plus propre et moins de questions



  • Salut
    Je vais essayer de respecter la convention java pour les nouveaux codes et de modifier les anciens.

    Pour le remplacement d'un mob par un autre, y'a quelques problèmes : quand ce n'est pas l'apocalypse je fait spawner un loup ça marche. Jusque là, c'est logique. Mais quand je laisse le loup et que j'active l'apocalypse, le loup ne se transforme pas. Quand j'en fais spawner, il disparaissent à la seconde où ils apparaissent (logique) mais les loup-garoux n'apparaissent pas. J'utilise :

    @SubscribeEvent
     public void apocalypseMobReplace(EntityJoinWorldEvent event)
     {
      if(This_is_Halloween.apocalypse)
      {
       if(event.entity instanceof EntityWolf) 
       {
        EntityWerewolf werewolf = new EntityWerewolf(event.world);
        int x = event.entity.chunkCoordX;
        int y = event.entity.chunkCoordY;
        int z = event.entity.chunkCoordZ;
        float rotateX = event.entity.rotationPitch;
        float rotateY = event.entity.rotationYaw;
    
        System.out.println(x);
        System.out.println(rotateX);
    
        event.entity.setDead();
    
        event.world.spawnEntityInWorld(werewolf);
        werewolf.setPositionAndRotation(x, y, z, rotateX, rotateY);
       }
      }
     }
    ``` J'ai essayer de faire logger les coord sur x et la rotation sur x du loup, mais rien. Du coup, je sais pas du tout si le loup-garou n'apparait pas, ou si il apparaît mais à des coord au hasard.
    
    Pour la pluie, ça marche bien tant que je ne redémarre pas le jeu. J'ai mis la ligne ```java
    BiomeGenBase.plains.setDisableRain();
    ``` dans la fonction juste après les commandes (en gros, quand je fait /halloween apocalypse enable). Quand je fais la commande, ça désactive bien la pluie, j'ai essayé de quitter et revenir dans le monde il ne pleut toujours pas, mais quand j'éteins et je rallume le jeu, il repleut (comme si c'est sauvegarder dans l'instance du jeu et non dans le monde).
    
    > D'ailleurs je ne sais pas pourquoi tu appelles une valeur statique de ton mod, quel est l'utilité ?
    
    C'est la variable qui définit si c'est l'apocalypse ou pas.
    
    Pour l'herbe, j'avais déjà trouvé [ce sujet](https://www.minecraftforgefrance.fr/showthread.php?tid=2117). Au départ, je savais pas comment faire pour un biome qui existe déjà (la plaine par exemple), même avec l'évent donné par Robin. Mais j'ai trouvé comment faire (même si c'est basique j'ai peiné). Mais la couleur de l'herbe ne change pas.
    
    Je continue de chercher pour les autres problèmes
    Pour le feu, vu que c'est de l'eau ça éteint le feu. Mais ton code marche quand même quand l'entité sort de l'eau. Merci


  • Respecter la convention java -> tu peux toujours utiliser le refactor pour changer les noms plus facilement, exemple tu fais clique droit sur le nom du package puis refactor puis change name et tu le changes en thisishalloween (c'est la convention java)

    l'entité ne se re-transforme pas -> où est le code pour faire ça ?

    problème de position -> normal tu récupères les coordonnées du chunk et non de l'entité

    pluie -> c'est pour ça que regarder comment c'est fait dans les commandes de minecraft est une bien meilleure idée

    variable statique -> oui mais il se passe quoi si on redémarre le serveur ? Je te donne la réponse : ça ne marche pas, il faut mettre cette variable autre part, comme par exemple dans le monde : https://www.minecraftforgefrance.fr/showthread.php?tid=2444

    pour l'herbe -> envoi le code correspondant

    pour le feu -> sinon tu peux créer un nouveau type de dégâts mais ça va paraître étrange de mourir enflammer alors qu'on est dans l'eau


  • Administrateurs

    event.world.spawnEntityInWorld(werewolf);
    werewolf.setPositionAndRotation(x, y, z, rotateX, rotateY);
    En plus de ce qu'a dit SCAREX, inverses ses deux lignes.



  • Salut
    Pour les entités, ça marche mais ça en fait spawner 2. De plus, les loups ayant spawner avant l'apocalypse ne change pas.
    Quand je dit qu'elles se transforment, c'est qu'on à l'impression qu'elles se transforment (le loup meurt et le loup-garou apparaît à sa place) mais elles ne se transforment pas vraiment .

    Pour la pluie, j'ai testé ce que tu m'as dit, ça marche, mais pas comme je voudrais. Quand je désactivais la pluie via BiomeGenBase et que je "mettais" la pluie via la commande, il ne pleuvait plus (logique) mais le ciel était gris, et c'est ça que je veux. Mais je ne sais pas comment faire. (j'aimerais plus si c'est possible le ciel de l'orage). Mais j'ai cherché dans le BiomeGenBase, rien trouvé.

    Pour la variable apocalypse, merci de me l'avoir dit, je ne l'avais pas vu avant. J'avais déjà fait ce tuto et ça enregistre bien (j'ai regardé grâce à NBTExplorer). C'était un problème de chargement des données. C'est que en fait, le chargement des données, je l'avais mis dans le CommonProxy alors qu'il fallait le mettre dans la classe principale.

    Pour l'herbe, je ne suis pas du tout sûr de ce que j'ai mis, c'est ce que j'ai compris du post :

     @SubscribeEvent
     public int ApocalypseGrass(BiomeEvent.GetGrassColor event)
     {
      return 0x000000;
     }
    

    Pour le feu, j'avais idée de faire comme une eau à forte température qui enflamme, mais maintenant que tu me le dit, j'y pense et ça fait bizarre. Je vais laisser comme c'est là (c'est à dire qu'on perd de la vie quand on est dans l'eau et que ça nous enflamme quand y sort)


  • Rédacteurs

    Pour changer tout les loup en loup-garous, j'avais donné un code vers le début :

    
    final List <entity>toAdd = new ArrayList<entity>();
    for(int i = 0; i < getWorld().loadedEntityList.size(); i++) {
    if(getWorld().loadedEntityList.get(i) instanceof EntityWolf) {
    BlockPos pos = getWorld().loadedEntityList.get(i).getPosition();
    EntityZombie zombie = new EntityZombie(getWorld().loadedEntityList.get(i).getEntityWorld());
    zombie.setPosition(pos.getX(), pos.getY(), pos.getZ());
    zombie.setAngles(getWorld().loadedEntityList.get(i).rotationYaw, getWorld().loadedEntityList.get(i).rotationPitch);
    zombie.motionX = getWorld().loadedEntityList.get(i).motionX;
    zombie.motionY = getWorld().loadedEntityList.get(i).motionY;
    zombie.motionZ = getWorld().loadedEntityList.get(i).motionZ;
    toAdd.add(zombie);
    getWorld().loadedEntityList.get(i).setDead();
    }
    }
    for(int i = 0; i < toAdd.size(); i++) {
    this.getWorld().spawnEntityInWorld(toAdd.get(i));
    }
    
    

    J'ai pas testé mais ça devrait marcher, il faut le mettre lorsque l'apocalipse commence, qu'il ne s'exécute qu'une seule fois car tu gère déjà le cas où un loup spawn pendant l'apocalipse</entity></entity>