Trapdoor et clé



  • Introduction

    Nous allons faire un système de trapdoor et d'ouverture par clé :

    • Une trapdoor qui retient quelle clé lui est accordée,
    • Une clé.

    Prérequis

    Classe principale

    Créez un item nommé "cle" et un bloc nommé "trapdoor". Si vous voulez que votre bloc soit incassable, juste avec la clé, rajoutez .setBlockUnbreakable() à la définition du bloc.
    Enregistrez votre bloc ainsi que le TileEntity. (voir prérequis)
    Et créez toutes les classes nécessaires : TrapDoor (classe de la trapdoor), Cle (classe de la clé) et TileEntityBlockTrapDoor (classe de l'entité de bloc)

    Classe de la trapdoor

    Copiez/collez le contenu de net.minecraft.src.BlockTrapdoor dans votre classe TrapDoor.
    Corrigez l'erreur du package et de la classe, puis faites Ctrl+Shift+o et sélectionnez net.minecraft.block.Block . (Ctrl+Shift+o organise les import).

    À la fin de la classe, ajoutez :

        public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase living, ItemStack stack) {
            TileEntity te = world.getBlockTileEntity(x, y, z);
            if (te instanceof TileEntityBlockTrapDoor) {
                ((TileEntityBlockTrapDoor) te).setName(stack.getDisplayName());
            }
        }
    
        @Override
        public TileEntity createTileEntity(World world, int metadata) {
            return new TileEntityBlockTrapDoor();
        }
    

    La première fonction va ajouté le "display name"(le nom affiché du bloc), dans le TileEntity, lorsque l'on pose le bloc.
    La deuxième joint le TileEntityBlockTrapDoor avec le bloc.

    Retirez les fonctions : "onBlockClicked()", "onBlockActivated()" et "onPoweredBlockChange()".
    (La première fonction ne sert à rien, la deuxième est appelée quand un joueur fait un clic droit sur le bloc et la troisième est appelée quand un courant de redstone l'active.)

    Dans la fonction "onNeighborBlockChange()", retirez :

        if (flag || par5 > 0 && Block.blocksList[par5].canProvidePower())
        {
            this.onPoweredBlockChange(par1World, par2, par3, par4, flag);
        }
    

    (Le code permettait d'actualisé le bloc en fonction des courants de redstone).

    Fini pour notre class TrapDoor.

    Classe de l'entité de bloc

    Ajoutez (Importez NBTTagCompound):

        public String code = "";
    
        public void readFromNBT(NBTTagCompound nbtTag) {
            super.readFromNBT(nbtTag);
            code = nbtTag.getString("code");
        }
    
        public void writeToNBT(NBTTagCompound nbtTag) {
        super.writeToNBT(nbtTag);
            nbtTag.setString("code", code);
        }
    
        public String getCode() {
            return code;
        }
    
        public void setName(String codeamettre) {
            code = codeamettre;
            worldObj.notifyBlockChange(xCoord, yCoord, zCoord, 2);
        }
    

    "getCode()" renvoie la valeur contenue dans code, c'est-à-dire le nom du bloc.
    "setName()" permet de modifié cette valeur. (Pré-requis pour plus d'informations).
    PS: n'oubliez pas d'extends TileEntity.

    Classe de la clé

    Passons maintenant à la clé.
    Ajoutez ceci dans le constructeur.

        this.setCreativeTab(CreativeTabs.tabTools);
        this.setFull3D();
        this.setMaxStackSize(1);
    

    La première ligne ajoute l'item dans l'onglet créatif avec les outils. La deuxième permet que, dans la main, l'item soit tenu comme une épée, par exemple, et non comme un lingot. La troisième fait que les clés se stack une par une.

    Ajoutez cette fonction :

        public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer player, World par3World, int x, int y, int z, int par7, float par8, float par9, float par10){
        }
    

    Elle est appelée lorsqu'on fait un clic droit avec l'item.

    Tout d'abord, on va voir si l'item que l'on vise avec le clic droit est notre trapdoor.
    Pour ceci, ajoutez dans le "onItemUse()".

        if(par3World.getBlockId(x, y, z) == TutorielMod.trapdoor.blockID) {
        }
    

    Ensuite, ajoutez à l'intérieur de la condition précédente255:

        if(!par3World.isRemote){
        }
    

    C'est pour vérifier que le bloc n'est pas enlevé.

    Là, moment crucial, nous allons vérifié si la clef correspond à la TrapDoor.

        TileEntityBlockTrapDoor te = (TileEntityBlockTrapDoor) par3World.getBlockTileEntity(x, y, z);
        if(te.getCode().equals(par1ItemStack.getDisplayName())){}
    

    Maintenant, on regarde si le joueur sneak ou pas :

        if(player.isSneaking()){
        }
        else{
        }
    

    Si le joueur sneak, on détruit la trapdoor :

        par3World.setBlock(x, y, z, 0);
        ItemStack todrop = new ItemStack(TutorielMod.trapdoor, 1);
        todrop.setItemName(par1ItemStack.getDisplayName());
        par3World.spawnEntityInWorld(new EntityItem(par3World, x, y, z, todrop));
    

    Dans l'ordre, on détruit le bloc (remplacé par un bloc d'air), on crée un nouvel itemstack qui est un itemstack d'une seule trapdoor, on change le nom affiché du bloc par le nom de l'item et on drop l'item.

    Si le joueur ne sneak pas, on ouvre (ou referme) la trapdoor:

        int i1 = par3World.getBlockMetadata(x, y, z);
        par3World.setBlockMetadataWithNotify(x, y, z, i1 ^ 4, 2);
    

    Utilisation en jeu

    Avant de poser votre trapdoor, renommez là. Toutes les clés renommées ayant le même nom que la trapdoor pourront l'ouvrir, si le joueur ne sneak pas, ou la casser si le joueur sneak.

    Fin

    GITHUB
    Merci d'avoir suivi ce tutoriel ^^'
    J'espère avoir bien expliqué, je suis là pour toutes suggestions ainsi que toutes questions.
    PS: J'espère aussi ne pas avoir fait trop de fautes d'orthographe ^^.



  • je n'ai pas un niveau suffisant pour me permettre de dire si ton code est bon ou non, cependant, je pense que tu devrais ajouter les prérequis, et je trouve certains trucs peu suffisamment détailler par exemple tu nous dis de mettre "this.setFull3D()" dans le constructeur de la clé, ouais mais ça sert à quoi?


  • Moddeurs confirmés Rédacteurs Modérateurs Administrateurs

    Réorganise un peu mieux ton tutoriel, explique un peu mieux car ce n'est pas très clair.



  • Merci de respecter la convention Java sur les noms de variables :

    Commence par une minuscule, puis les autres mots par des majuscules.

    Exemple :

    Item cle
    Block trapDoor



  • Voilà, j'ai essayer de mieux expliquer et normalement j'ai respecté les conventions 🙂


  • Moddeurs confirmés Rédacteurs Modérateurs Administrateurs

    Une petite image du rendu en jeu, voir une courte vidéo pourrait être sympa.



  • Je trouve ça déja mieux, un rendu final sur github a la limite si possible?
    une évocation d'autres méthodes que l'on pourrait utiliser?



  • J'ai mis le github à la fin du tutoriel,
    Je ne vois pas quels fonctions je pourrais rajouter 😕
    Et désolé, pas de vidéos et je ne pense pas que des images seront utiles..
    PS: désolé de ne pas avoir répondu plutot, j'étais occupé



  • peut tu montrer comment faire avec une porte? j'ai fait le test par moi meme mais je me suis un peu perdu alors …


Log in to reply