EmotionMod - Bois, Pluie, Nether



  • Mod Emotion

    Bonjour à tous !

    Aujourd'hui j'ai plusieurs chose à vous demander et c'est pourquoi je vais tacher de rendre ça le plus lisible possible, avec pourquoi pas quelques couleurs funky.

    Bon pour le commencement sachez que je mod un mod qui contiens essentiellement des bloques et des items, une sorte d'extension de Minecraft vanillia à ma sauce, j'ai déjà fait énormément de travail depuis le début dont des minerais, de la nourriture, des fleurs, des "fourtinures" style chaise, table de nuit, table etc… Mais aujourd'hui je me suis retrouvé confronté à plusieurs problèmes que je vais vous lister. Si quelqu'un à la moindre réponse à me donner, la moindre aide, je lui serais grandement reconnaissant.

    - 1er problème -
    Bloc de bois

    Voilà j'ai essayé de refaire un bloc de bois Minecraft, j'ai commencé par tester si je ne pouvais pas utiliser l'EnumHelper de forge pour ajouter une ligne en écrivant ceci dans la classe principale des blocs :

    public EnumType enumTypeCherry = EnumHelper.addEnum(EnumType.class, "CHERRY", 0, "cherry");
    

    Étend donné que ça n'as pas fonctionné j'ai créer moi même les différents blocs "BasePlanks" copie de "BlockPlanks", "BaseLog" copie de "BlockOldLog", "BaseLog2" copie de "BlockLog",  "BaseSapling" copie de "BlockSapling", "BaseLeaf" copie de "BlockOldLeaf" et enfin "BaseLeaves" copie de "BlockLeaves". Bon le pire c'est que ça fonctionne à pars les feuilles de l'arbre qui ne sont pas transparente, le problème c'est quand je veux les enregistrées dans le "ClientProxy" :

    
    Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(Item.getItemFromBlock(EmotionBlocks.emoLog), 0, new ModelResourceLocation(Strings.MODID + ":cherry_log", "inventory"));
    …
    Minecraft.getMinecraft().getRenderItem().getItemModelMesher().getModelManager().getBlockModelShapes().registerBlockWithStateMapper(EmotionBlocks.emoLog, (new StateMap.Builder()).setProperty(BaseLog.VARIANT).setBuilderSuffix("_log").build());
    ...
    

    La première partie m'as permis de voir les bloques dans l'inventaire sous forme d'item, la seconde m'as permis de voir la texture sur le bloc en jeu et que le bloc de bois s’oriente bien dans les différents sens. Malheureusement et comme vous aurez pue le constater la première partie ne s'applique qu'à un seul bloc tandis que la seconde s'adapte à toutes les variances définie dans le bloc "BasePlanks" :

    
    public static enum EnumType implements IStringSerializable
       {
           CHERRY(0, "emomod:cherry");
           private static final BasePlanks.EnumType[] META_LOOKUP = new BasePlanks.EnumType[values().length];
           private final int meta;
           private final String name;
           private final String unlocalizedName;
           ….
    

    Donc voilà j'aurais aimé savoir comment enregistrer un bloc de bois avec différents type et l'enregistrer ou si il y à une méthode plus simples est envisageable que la mienne.

    - 2eme problème -
    Changer la pluie

    J'ai créer plusieurs bâtons magiques qui permettent différentes choses, comme :

    
    IBlockState block; //Type Of Block Who Appear
    Long time = worldIn.getWorldTime();
    IBlockState state = worldIn.getBlockState(pos);
    IBlockState stateWest = worldIn.getBlockState(pos.west());
    IBlockState stateEast = worldIn.getBlockState(pos.east());
    IBlockState stateNorth = worldIn.getBlockState(pos.north());
    IBlockState stateSouth = worldIn.getBlockState(pos.south());
    
    if (this == EmotionItems.blueStaff)
    {
           block = Blocks.water.getDefaultState();
    
           if (playerIn.isSneaking())
           {
                   if (state != Blocks.air.getDefaultState())
                    {
                           worldIn.setBlockState(pos, block);
    
                           stack.damageItem(1, playerIn);
                    }
            }
           else
           {
                   if (state != Blocks.air.getDefaultState())
                   {
                           worldIn.setBlockState(pos, block);
                           worldIn.setBlockState(pos.west(), block);
                           worldIn.setBlockState(pos.east(), block);
                           worldIn.setBlockState(pos.north(), block);
                           worldIn.setBlockState(pos.south(), block);
    
                           stack.damageItem(2, playerIn);
                   }
           }
    }
    

    Et le blanc est censé lancer un éclair, changer le temps en nuit si celui-ci ne l'est pas déjà et enfin enlever la pluie.

    
    else if (this == EmotionItems.whiteStaff)
    {
           if (time >= 13000 || time <= 1000)
           {
                   worldIn.setRainStrength(0.0F);
           }
           else
           {
                   worldIn.setWorldTime(13000);
           }
    
           worldIn.spawnEntityInWorld(new EntityLightningBolt(worldIn, pos.getX(), pos.getY(), pos.getZ()));
           stack.damageItem(2, playerIn);
    }
    

    Malheureusement la commande ".setRainStrength" ne marche qu'une seconde puis remet la pluie, j'aurais voulue savoir si ce ne serait pas plutôt possible d'envoyer directement la commande "/set weather clear" sur le client où peut-être une autre façon de la changer.

    - 3eme problème -
    Génération dans le nether

    Et pour finir j'ai une classe qui me permet de générer mon minerai le "Purpura Lapidem" ici présent :

    
    package mods.emotion.world;
    
    import java.util.Random;
    …
    
    public class WorldGenEmotion implements IWorldGenerator
    {
    public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider)
    {
    switch(world.provider.getDimensionId())
    {
    case -1:
    generateNether(world, rand, chunkX * 16, chunkZ * 16);
    case 0:
    generateSurface(world, rand, chunkX * 16, chunkZ * 16);
    case 1:
    generateEnd(world, rand, chunkX * 16, chunkZ * 16);
    }
    }
    
    private void generateEnd(World world, Random rand, int chunkX, int chunkZ)
    {
    
    }
    
    private void generateSurface(World world, Random rand, int chunkX, int chunkZ)
    {
    for (int i = 0; i < 5; i++)
    {
    final Predicate predicate;
    int yMin = 4;
    int yMax = 10;
    
    int randPosX = chunkX + rand.nextInt(16);
    int randPosY = yMin + rand.nextInt(yMax - yMin);
    int randPosZ = chunkZ + rand.nextInt(16);
    
    (new WorldGenMinable(EmotionBlocks.purpuraOre.getDefaultState(), 3)).generate(world, rand, new BlockPos(randPosX, randPosY, randPosZ));
    }
    }
    
    private void generateNether(World world, Random rand, int chunkX, int chunkZ)
    {
    
    }
    }
    

    Malheuresement quand je place une génération de minerais dans la private void generateNether() le bloc en question en ce trouve nul pars dans le monde mais sans erreurs au lancement.

    %(#3366ff)[Merci d'avance à toutes les personnes qui pourrons peut-être m'aider, je suis dispo sur Steam, Skype et Mumble si besoin. Je suis vraiment bloqué, j'ai chercher partout sur le net sans trouver aucune réponse et presque aucun tuto de modding en 1.8 -_.. Merci encore !

    -EmotionFox -]



  • [size=largePs: J'aurais besoin d'aide sur quelques autres détails, donc si une personne expérimentée à quelque temps à consacrer à un mec qui fais un mod pour lui et sa copine pour lui expliquer certaine chose de la 1.8 n’hésitais pas à m'envoyer un MP.]


  • Administrateurs

    1. Je ne sais pas
    2. Suffit de regarder ce que fait la commande weather clear :
      WorldInfo worldinfo = world.getWorldInfo();

    worldinfo.setCleanWeatherTime((300 + (new Random()).nextInt(600)) * 20);
    worldinfo.setRainTime(0);
    worldinfo.setThunderTime(0);
    worldinfo.setRaining(false);
    worldinfo.setThundering(false);

    1. Il faut ajouter en 4ème argument dans WorldGenMinable Blocks.netherrack.getDefaultState() pour préciser que le bloc doit se générer sur de la netherrack et non sur de la pierre.


    1. Pas de problème merci quand même pour ton aide 🙂
    2. Ah merci beaucoup ! Par contre où a tu trouver les effets de la commande /weather clear ? Ça m’intéresse.
    3. tu veux dire ici ? :
    
    (new WorldGenMinable(EmotionBlocks.purpuraOre.getDefaultState(), 3)).generate(world, rand, new BlockPos(randPosX, randPosY, randPosZ));
    
    

  • Administrateurs

    2. net.minecraft.command.CommandWeather.java
    3. (new WorldGenMinable(EmotionBlocks.purpuraOre.getDefaultState(), 3, Blocks.netherrack.getDefaultState())
    Comme ça.



  • Pour le 1, tu peux passer sur le TS ? si oui, dit moi (par mp) vers quel heure.

    edit : Si tu peux pas donne moi ton skype. Et aussi tu peux envoyer TOUTE la classe de ton bois, les json de ton bois et aussi la classe de l'enum ?



  • Je reviens vers vous pour la solution de la génération dans le Nether, merci à robin pour l'aide précieuse.

    private void generateNether(World world, Random rand, int chunkX, int chunkZ)
    {
    for (int i = 0; i < 50; i++)
    {
    final Predicate predicate;
    int yMin = 4;
    int yMax = 180;
    
    int randPosX = chunkX + rand.nextInt(16);
    int randPosY = yMin + rand.nextInt(yMax - yMin);
    int randPosZ = chunkZ + rand.nextInt(16);
    
    (new WorldGenMinable(EmotionBlocks.purpuraBlock.getDefaultState(), 14,
    BlockHelper.forBlock(Blocks.netherrack))).generate(world, rand, new BlockPos(randPosX, randPosY, randPosZ));
    }
    }