L'équipe de Minecraft Forge France ne fait désormais plus de support pour la 1.7.10. La catégorie Cauldron a été archivée, ce type de serveur étant obsolète et plus développé. Plus d'information ici

[1.7.10] Block "Trappe"
Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
#1
Salut,

Après le marteau, j'aimerai aussi créer un bloc "trappe" qui "s'ouvre" quand on fait click droit. J'ai créé ceci :

package com.mod.androria.blocks;

import com.mod.androria.Reference;
import com.trcgames.dbSynchronizer.DatabaseGetter;
import com.trcgames.dbSynchronizer.database.DBFolder;
import com.trcgames.dbSynchronizer.database.Database;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.world.World;

public class Tappe extends Block
{

    public Tappe(Material mat)
    {
        super(mat);
        setHardness(2.0F);
        setResistance(5.0F);
        setBlockTextureName(Reference.MOD_ID + ":trappe");
        // TODO Auto-generated constructor stub
    }

    @Override
    public boolean isOpaqueCube()
    {
        return false;
    }

    @SideOnly(Side.CLIENT)
    public int getRenderBlockPass()
    {
        return 0;
    }

    /**
     * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
     */
    public boolean renderAsNormalBlock()
    {
        return false;
    }

    public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer p_149727_5_, int p_149727_6_, float p_149727_7_, float p_149727_8_, float p_149727_9_)
    {
        if(!world.isRemote)
        {
            if(this.getBlockBoundsMinX() == 0.1F)
            {
                setBlockTextureName(Reference.MOD_ID + ":trappe");
                this.setBlockBounds(0F, 0F, 0F, 1F, 1F, 1F);
            }
            else
            {
                setBlockTextureName(Reference.MOD_ID + ":Invisible_Block");
                this.setBlockBounds(0.1F, 0.1F, 0.1F, 0.2F, 0.2F, 0.2F);
            }
        }
        return true;
    }

}


Cependant, j'ai deux problèmes :
- La texture ne se met à jour que si il y a une update (quand on casse un bloc à coté)
- Quand on faire click droit sur un bloc pour réduire sa boite de collision pour passer, tous les autres bloc voient leur boite de collision réduite

Merci beaucoup d'avance !
Je suis un membre apprécié et joueur, j'ai déjà obtenu 7 point(s) de réputation.

J'ai et je suis triste d'avoir 12 points d'ICRating

Répondre
#2
Salut,
Il faudrait plutôt un bloc avec deux metadatas, un metadata pour l'état ouvert et l'autre pour l'état fermé.
Et ensuite dans ta fonction onBlockActivated change le metadata (avec un world.setBlock(x, y, z, this, metadata, 3) ; )
Répondre
#3
Je vais essayer

Edit :
Mon code :
public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer p_149727_5_, int p_149727_6_, float p_149727_7_, float p_149727_8_, float p_149727_9_)
    {
        if(this.getDamageValue(world, x, y, z) == 1)
        {
            world.setBlock(x, y, z, this, 0, 3);
            setBlockBounds(0F, 0F, 0F, 1F, 1F, 1F);
        }
        else
        {
            world.setBlock(x, y, z, this, 1, 3);
            setBlockBounds(0.1F, 0F, 0.1F, 0.2F, 0.1F, 0.1F);
        }
        return true;
    }


Les métadatas fonctionne mais dès que je trouche au BlockBounds c'est tous les blocs qui sont modifiés et pas que celui où j'ai fait click droit
Je suis un membre apprécié et joueur, j'ai déjà obtenu 7 point(s) de réputation.

J'ai et je suis triste d'avoir 12 points d'ICRating

Répondre
#4
setBlockBounds ne permet pas de définir en fonction du metadata et s'applique sur l'instance du bloc qui est partagé entre tous les blocs.

Tu devrais plutôt override la fonction getCollision (ou que chose comme ça) qui a world, x, y et z en argument, ce qui te permettra de retourner une collision différente en fonction de world.getMetadata(x, y, z).
Répondre
#5
Y a que ces trois fonctions dans la classe Block :
- addCollisionBoxesToList
- getCollisionBoundingBoxFromPool
- collisionRayTrace

EDIT :
J'ai fait ça :
Code :
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z)
    {
        if(world.getBlockMetadata(x, y, z) == 1)
        {
            return AxisAlignedBB.getBoundingBox(0.1, 0, 0.1, 0.2, 0.2, 0.2);
        }
        else
        {
            return AxisAlignedBB.getBoundingBox(0, 0, 0, 1, 1, 1);
        }
        
    }

Mais quelque sois le metadata, je peux traverser le bloc :/

EDIT² : Je viens de me rendre compte avec un System.out.println que la fonction n'est jamais appelé :/
Je suis un membre apprécié et joueur, j'ai déjà obtenu 7 point(s) de réputation.

J'ai et je suis triste d'avoir 12 points d'ICRating

Répondre
#6
Alors ça veut dire que tu as mal renseigné ses paramètres.
Esssayes de mettre un @Override dessus, si ça te met une erreur, supprimes celle là, commence à écrire son nom, fais ctrl+space et eclipse te la proposera.
Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.
N'hésitez pas à m'envoyer des idées de tuto, je compte en faire 1 un de ces jours.

Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.
Répondre
#7
Le @Override ne me signale pas d'erreur :/
Et même avec, toujours aucune collisions avec le bloc
Je suis un membre apprécié et joueur, j'ai déjà obtenu 7 point(s) de réputation.

J'ai et je suis triste d'avoir 12 points d'ICRating

Répondre
#8
extends juste BlockTrapdor non ?
Développeur de CraftingLife V3 <3
Répondre
#9
Tu as mis ton sysout où ? Bien au tout début de la fonction avant le if ?
Si je vous ai aidé, n'oubliez pas d’être heureux, j'aiderai encore +

AymericRed, moddeur expérimenté qui aide sur ce forum et qui peut accepter de faire un mod Forge rémunéré de temps en temps.
N'hésitez pas à m'envoyer des idées de tuto, je compte en faire 1 un de ces jours.

Mes tutos : Table de craft, plugin NEI, plugin JEI, modifier l'overlay
Je suis un membre apprécié et joueur, j'ai déjà obtenu 6 points de réputation.
Répondre
#10
@Yanis : Faudrait que je m'intéresse à cette classe
@Aymeric : Oui Sourire

EDIT : MERCI ! Regarder la classe BlockTrapDoor m'a permis de faire mon truc !
Voici le code pour changer la boite de collision en fonction de la métadata :
Code :
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z)
    {
        this.setBlockBoundsBasedOnState(world, x, y, z);
        return super.getCollisionBoundingBoxFromPool(world, x, y, z);
    }
    
    public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z)
    {
        this.setBounds(world.getBlockMetadata(x, y, z));
    }
    
    public void setBounds(int metadata)
    {

        if (metadata == 1)
        {
            this.setBlockBounds(0.1F, 0.0F, 0.1F, 0.2F,0.2F, 0.2F);
        }
        else
        {
            this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
        }
    }
Je suis un membre apprécié et joueur, j'ai déjà obtenu 7 point(s) de réputation.

J'ai et je suis triste d'avoir 12 points d'ICRating

Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)