Noel mod



  • Bonjour,
    je suis en train de créer un mod dans le thème de noel et j'ai un problème sur un bloc que j'ai modélisé sur Techne.
    En effet la hitbox du block ne fait que un de haut au lieu de deux, et lorsque je m'approche du bloc et que je lève un peu la tête le bloc disparaît visuellement.

    Voici ma classe principale ModPrincipal:

    package noelmod.common;
    
    import net.minecraft.block.Block;
    import net.minecraft.item.Item;
    import noelmod.proxy.NoelCommonProxy;
    import cpw.mods.fml.common.Mod;
    import cpw.mods.fml.common.Mod.EventHandler;
    import cpw.mods.fml.common.Mod.Instance;
    import cpw.mods.fml.common.SidedProxy;
    import cpw.mods.fml.common.event.FMLInitializationEvent;
    import cpw.mods.fml.common.event.FMLPostInitializationEvent;
    import cpw.mods.fml.common.event.FMLPreInitializationEvent;
    import cpw.mods.fml.common.network.NetworkMod;
    import cpw.mods.fml.common.registry.GameRegistry;
    
    @Mod(modid = "ModPrincipal", name = "Noel", version = "1.0.0")
    @NetworkMod(clientSideRequired = true, serverSideRequired = false)
    
    public class ModPrincipal
    {
    @SidedProxy(clientSide = "noelmod.proxy.NoelClientProxy", serverSide = "noelmod.proxy.NoelCommonProxy")
    public static NoelCommonProxy proxy;
    
    @Instance("ModPrincipal")
    public static ModPrincipal instance;
    public static Block Caisse, Boule, BouleB, BouleV, BouleR, Etoile, CandyGiant;
    public static Item Gingerbread, Candy;
    
    @EventHandler
    public void PreInit(FMLPreInitializationEvent event)
    {
    // Configuration
    
    // Blocks
    Caisse = new Caisse(2000).setHardness(1.0F).setResistance(5.0F).setStepSound(Block.soundWoodFootstep).setUnlocalizedName("Caisse").setTextureName("modprincipal:Caisse");
    GameRegistry.registerBlock(Caisse, "Caisse");
    
    Boule = new Boule(2001).setHardness(1.0F).setResistance(5.0F).setStepSound(Block.soundGlassFootstep).setUnlocalizedName("Boule").setTextureName("modprincipal:Boule");
    GameRegistry.registerBlock(Boule, "BouleOrange");
    
    BouleB = new BouleB(2002).setHardness(1.0F).setResistance(5.0F).setStepSound(Block.soundGlassFootstep).setUnlocalizedName("BouleB").setTextureName("modprincipal:BouleB");
    GameRegistry.registerBlock(BouleB, "BouleBleue");
    
    BouleV = new BouleV(2003).setHardness(1.0F).setResistance(5.0F).setStepSound(Block.soundGlassFootstep).setUnlocalizedName("BouleV").setTextureName("modprincipal:BouleV");
    GameRegistry.registerBlock(BouleV, "BouleVerte");
    
    BouleR = new BouleR(2004).setHardness(1.0F).setResistance(5.0F).setStepSound(Block.soundGlassFootstep).setUnlocalizedName("BouleR").setTextureName("modprincipal:BouleR");
    GameRegistry.registerBlock(BouleR, "BouleRouge");
    
    Etoile = new Etoile(2010).setHardness(1.0F).setResistance(5.0F).setStepSound(Block.soundGlassFootstep).setUnlocalizedName("Etoile").setTextureName("modprincipal:Etoile");
    GameRegistry.registerBlock(Etoile, "Etoile");
    
    CandyGiant = new CandyGiant(2011).setHardness(1.0F).setResistance(5.0F).setStepSound(Block.soundSnowFootstep).setUnlocalizedName("CandyGiant").setTextureName("modprincipal:CandyGiant");
    GameRegistry.registerBlock(CandyGiant, "Giant Candy");
    
    // Items
    Gingerbread = new Gingerbread(13744, 2, 1.5F, false).setUnlocalizedName("Gingerbread").setTextureName("modprincipal:Gingerbread");
    GameRegistry.registerItem(Gingerbread, "Gingerbread", "ModPrincipal");
    
    Candy = new Candy(13745, 3, 1.5F, false).setUnlocalizedName("Candy").setTextureName("modprincipal:Candy");
    GameRegistry.registerItem(Candy, "Candy", "ModPrincipal");
    // Achievements
    }
    
    @EventHandler
    public void Init(FMLInitializationEvent event)
    {
    // Registry
    
    // Mobs
    
    // Render
    proxy.registerRender();
    // NetWork
    
    // Recipe
    }
    
    @EventHandler
    public void PostInit(FMLPostInitializationEvent event)
    {
    // Intégration avec les autres mods
    }
    }
    

    Et voici celle du block CandyGiant qui pose problème :

    package noelmod.common;
    
    import net.minecraft.block.Block;
    import net.minecraft.block.material.Material;
    import net.minecraft.client.renderer.texture.IconRegister;
    import net.minecraft.creativetab.CreativeTabs;
    import net.minecraft.entity.Entity;
    import net.minecraft.entity.item.EntityItem;
    import net.minecraft.entity.item.EntityXPOrb;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.world.World;
    
    public class CandyGiant extends Block
    {
    public CandyGiant(int id)
    {
    super(id, Material.cake);
    this.setCreativeTab(CreativeTabs.tabDecorations);
    }
    
    public void setBlockBoundsForItemRender()
    {
    this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
    }
    
    public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity)
    {
    int prob = world.rand.nextInt(100);
    if(entity instanceof EntityItem)
    {
    if(!world.isRemote)
    {
    entity.setDead();
    if(prob < 15)
    {
    world.spawnEntityInWorld(new EntityXPOrb(world, (double)x + 0.5D, (double)y + 1.5D, (double)z + 0.5D, 1));
    }
    }
    }
    }
    
    @Override
    public TileEntity createTileEntity(World world, int metadata)
    {
    return new TileEntityCandyGiant();
    }
    
    public boolean hasTileEntity(int metadata)
    {
    return true;
    }
    
    public boolean isOpaqueCube()
    {
    return false;
    }
    
    public boolean renderAsNormalBlock()
    {
    return false;
    }
    
    public int getRenderType()
    {
    return -1;
    }
    }
    

    Ainsi que son TileEntityCandyGiantRender :

    package noelmod.common;
    
    import org.lwjgl.opengl.GL11;
    
    import net.minecraft.block.Block;
    import net.minecraft.client.renderer.OpenGlHelper;
    import net.minecraft.client.renderer.Tessellator;
    import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
    import net.minecraft.entity.Entity;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.util.ResourceLocation;
    import net.minecraft.world.World;
    
    public class TileEntityCandyGiantRender extends TileEntitySpecialRenderer
    {
    private final ModelCandyGiantTechne model;
    private final ResourceLocation texture = new ResourceLocation("modprincipal", "textures/blocks/CandyGiant.png");
    
    public TileEntityCandyGiantRender()
    {
    this.model = new ModelCandyGiantTechne();
    }
    
    private void adjustRotatePivotViaMeta(World world, int x, int y, int z)
    {
    int meta = world.getBlockMetadata(x, y, z);
    GL11.glPushMatrix();
    GL11.glRotatef(meta * (-90), 0.0F, 0.0F, 1.0F);
    GL11.glPopMatrix();
    }
    
    @Override
    public void renderTileEntityAt(TileEntity tileentity, double x, double y, double z, float scale)
    {
    this.renderTileEntityAtTechneCandyGiant((TileEntityCandyGiant)tileentity, x, y, z, scale);
    }
    
    public void renderTileEntityAtTechneCandyGiant(TileEntityCandyGiant tileentity, double x, double y, double z, float scale)
    {
    GL11.glPushMatrix();
    GL11.glTranslatef((float)x + 0.5F, (float)y + 1.5F, (float)z + 0.5F);
    this.bindTexture(texture);
    GL11.glPushMatrix();
    GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F);
    this.model.render((Entity)null, 0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F);
    GL11.glPopMatrix();
    GL11.glPopMatrix();
    }
    
    private void adjustLightFixture(World world, int i, int j, int k, Block block)
    {
    Tessellator tess = Tessellator.instance;
    float brightness = block.getBlockBrightness(world, i, j, k);
    int skyLight = world.getLightBrightnessForSkyBlocks(i, j, k, 0);
    int modulousModifier = skyLight % 65536;
    int divModifier = skyLight / 65536;
    tess.setColorOpaque_F(brightness, brightness, brightness);
    OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)modulousModifier, divModifier);
    }
    }
    

    Voilà si quelqu'un peux m'expliquer comment augmenter la hitbox de 1 bloc de haut ainsi que lorsque je pose le bloc il soit orienté en fonction de ma position (Nord, Sud, Est, Ouest) ça serrait vraiment sympa.

    Merci d'avance 🙂


  • Administrateurs

    Déjà, mauvaise section, ensuite, pour le code JAVA, utilise la balise [java][/java] sans les *, et ensuite pour ton problème d'orientation, regarde le tuto qui se trouve ici, pour ce qui est du problème de hitbox, je crois que la méthode à modifié est ```java
    public void setBlockBoundsForItemRender()
    {
    this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
    }

    
    Modifies une des valeurs et regardes ce que ça donne.


  • Quand tu écris du code utilise la balise java. 🙂



  • Le code de Superloup me semble correct.

    A essayer !

    ( Note: Ce que j'ai dis sur la ShoutBox était de mémoire, il est possible que j'y ai fait une erreur )



  • Merci pour vos réponses 🙂

    Alors pour la direction vu que c'est le TileEntityCandyGiantRender qui gère les textures je vois pas comment faire des block icon comme le dit robin.
    Et j'ai testé n'importe quel chifffre aucun changements : S
    J'ai aussi mis en java le code .


  • Administrateurs

    Regardes ce tuto alors.


  • Administrateurs

    http://www.minecraftforgefrance.fr/showthread.php?tid=127
    Dernière partie : Bonus / Pour aller plus loin, tu trouvera ce que tu cherches pour la direction. (le tuto a été refait depuis que tu l'as suivi)

    Pour la hitbox :
    http://www.minecraftforgefrance.fr/showthread.php?tid=136
    c'est la fonction getSelectedBoundingBoxFromPool
    et en bonus, la collision avec getCollisionBoundingBoxFromPool
    En passant, monter la collision devrait corriger ton bug d'affichage.



  • Ok super merci, bon j'ai pas réussi à faire tourner le bloc pas grave.
    Parcontre pour la hitbox j'ai pas compris : je mets ceci :

    @SideOnly(Side.CLIENT)
    public AxisAlignedBB getSelectedBoundingBoxFromPool(World world, int x, int y, int z)
    {
    return AxisAlignedBB.getAABBPool().getAABB((double)x + this.minX, (double)y + this.minY, (double)z + this.minZ, (double)x + this.maxX, (double)y + this.maxY, (double)z + this.maxZ);
    }
    

    Dans ma classe CandyGiant.java ?
    Et si oui je sais pas comment augmenter les valeurs


  • Administrateurs

    Oui, tu remplace this.maxY par 2D par exemple.



  • Ok super ça me montre bien les 2.75D en y mais que lorsque je regarde le premier block du cube en bas (à 1D) et pas à 2D.
    Et sa beug quand je cherche à marcher dessus.


  • Administrateurs

    Pour la collision, tu fais la même chose avec getCollisionBoundingBoxFromPool, ça devrait régler le problème de quand tu marches dessus.

    Pour quand tu regarde le bloc du haut, ça va pas être possible, car la hitbox est cherché en fonction des coordonnées. Ce qui faudrait, c'est mettre un deuxième bloc au coordonnées y + 1.
    Exemple ici :
    https://github.com/FFMT/nanotech_mod/blob/master/common/fr/mcnanotech/kevin_68/nanotech_mod/city/blocks/BlockLamp.java
    https://github.com/FFMT/nanotech_mod/blob/master/common/fr/mcnanotech/kevin_68/nanotech_mod/city/blocks/ItemBlockLamp.java


Log in to reply