MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    Fonction exécutée à la création de la TE

    Planifier Épinglé Verrouillé Déplacé Résolu 1.7.x
    1.7.10
    19 Messages 3 Publieurs 4.0k Vues 1 Watching
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • RedRelayR Hors-ligne
      RedRelay Moddeurs confirmés
      dernière édition par

      vu que ma fonction fait appel à du contenu se trouvant dans elle même, c’est normal que ça crash

      Ça ne veut rien dire.

      Donne nous le code de ta classe au pire 😉

      Comme je te l’ai dit, tu peux faire une méthode private et l’appeler a la fin du constructeur avec parametre et a la fin de readFromNBT.

      –------------------------------------------------------------------------------------
      Si tu trouves mon intervention pertinente, n'hésite pas a m…

      1 réponse Dernière réponse Répondre Citer 0
      • JustPingoJ Hors-ligne
        JustPingo
        dernière édition par

        TileEntityMultiblockControler, celle qui doit exécuter la fonction TileEntityMultiblock.newMaster() au démarrage :

        package pingo.virtualcraft.common;
        
        import net.minecraft.nbt.NBTTagCompound;
        import net.minecraft.network.NetworkManager;
        import net.minecraft.network.Packet;
        import net.minecraft.network.play.server.S35PacketUpdateTileEntity;
        
        public class TileEntityMultiblockControler extends TileEntityMultiblock {
        
        public boolean initialized = false;
        
        public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt)
        
        {
        
        this.readFromNBT(pkt.func_148857_g());
        
        }
        
        public Packet getDescriptionPacket()
        
        {
        
        NBTTagCompound nbttagcompound = new NBTTagCompound();
        
        this.writeToNBT(nbttagcompound);
        
        return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, 3, nbttagcompound);
        
        }
        
        public void readFromNBT(NBTTagCompound nbttag)
        {
        super.readFromNBT(nbttag);
        }
        
        public void writeToNBT(NBTTagCompound nbttag)
        {
        super.writeToNBT(nbttag);
        }
        
        public double receiveMJs(double energy){
        double energyLeft = energy;
        for (String[] row : this.elements){
        if (row[0] == "battery") {
        energyLeft = ((TileEntityMagneticBattery) worldObj.getTileEntity(xCoord, yCoord + Integer.parseInt(row[1]), zCoord)).addEnergy(energyLeft);
        }
        }
        return energyLeft;
        }
        
        public double receiveEUs(double energy){
        System.out.println("Receiving energy…");
        double energyLeft = energy/VirtualCraft.IC2EURATE;
        for (String[] row : this.elements){
        if (row[0] == "battery") {
        energyLeft = ((TileEntityMagneticBattery) worldObj.getTileEntity(xCoord, yCoord + Integer.parseInt(row[1]), zCoord)).addEnergy(energyLeft);
        }
        }
        return energyLeft * VirtualCraft.IC2EURATE;
        }
        
        }
        

        TileEntityMultiblock :

        package pingo.virtualcraft.common;
        
        import net.minecraft.block.Block;
        import net.minecraft.tileentity.TileEntity;
        import net.minecraft.world.World;
        
        public class TileEntityMultiblock extends TileEntity {
        
        protected boolean destruction = false;
        public int xMaster = 0;
        public int yMaster = 0;
        public int zMaster = 0;
        public boolean hasMaster = false;
        public int elementsCounter = 0;
        public String[][] elements;
        
        public void setMaster(int x, int y, int z){
        xMaster = x;
        yMaster = y;
        zMaster = z;
        hasMaster = true;
        System.out.println("Master set to : " + x + " " + y + " " + z);
        }
        
        public static String getMultiblockType(World world, int x, int y, int z){
        Block checkedBlock = world.getBlock(x, y, z);
        if (checkedBlock != null) {
        
        if (checkedBlock == VirtualCraft.multiblockControler) return "brain";
        if (checkedBlock == VirtualCraft.MJsInjector) return "mjsinjector";
        if (checkedBlock == VirtualCraft.EUsInjector) return "eusinjector";
        if (checkedBlock == VirtualCraft.magneticBattery) return "battery";
        
        }
        return "nothing";
        }
        
        public void linkMe(){
        String type;
        TileEntityMultiblock te;
        if (!worldObj.isRemote){
        type = getMultiblockType(worldObj, xCoord, yCoord + 1, zCoord);
        if (type == "brain") {
        ((TileEntityMultiblock) worldObj.getTileEntity(xCoord, yCoord + 1, zCoord)).elements = ((TileEntityMultiblock) worldObj.getTileEntity(xCoord, yCoord + 1, zCoord)).newMaster();
        } else if (type != "nothing") {
        te = (TileEntityMultiblock) worldObj.getTileEntity(xCoord, yCoord + 1, zCoord);
        if (te.hasMaster) { ((TileEntityMultiblock) worldObj.getTileEntity(te.xMaster, te.yMaster, te.zMaster)).elements = ((TileEntityMultiblock) worldObj.getTileEntity(te.xMaster, te.yMaster, te.zMaster)).newMaster(); }
        } else {
        type = getMultiblockType(worldObj, xCoord, yCoord - 1, zCoord);
        if (type == "brain") {
        ((TileEntityMultiblock) worldObj.getTileEntity(xCoord, yCoord - 1, zCoord)).elements = ((TileEntityMultiblock) worldObj.getTileEntity(xCoord, yCoord - 1, zCoord)).newMaster();
        } else if (type != "nothing") {
        te = (TileEntityMultiblock) worldObj.getTileEntity(xCoord, yCoord - 1, zCoord);
        if (te.hasMaster) { ((TileEntityMultiblock) worldObj.getTileEntity(te.xMaster, te.yMaster, te.zMaster)).elements = ((TileEntityMultiblock) worldObj.getTileEntity(te.xMaster, te.yMaster, te.zMaster)).newMaster(); }
        }
        }
        }
        }
        
        public String[][] newMaster(){
        System.out.println("Setting new master…");
        elementsCounter = 0;
        String[][] elements = new String[256][2];
        if (!worldObj.isRemote){
        boolean loop = true;
        String type;
        int counter = 1;
        int counter2 = 0;
        while (loop) {
        System.out.println("Analysing : " + xCoord + " " + (yCoord+counter) + " " + zCoord);
        type = getMultiblockType(worldObj, xCoord, yCoord + counter, zCoord);
        if (type == "brain") {
        this.selfDestruct();
        loop = false;
        } else if (type == "nothing") {
        loop = false;
        } else {
        System.out.println("Found one : " + type);
        ((TileEntityMultiblock) worldObj.getTileEntity(xCoord, yCoord + counter, zCoord)).setMaster(xCoord, yCoord, zCoord);
        elements[counter2][0] = type;
        elements[counter2][1] = Integer.toString(0+counter);
        counter2++;
        elementsCounter++;
        }
        counter++;
        }
        loop = true;
        counter = 1;
        while (loop) {
        System.out.println("Analysing : " + xCoord + " " + (yCoord-counter) + " " + zCoord);
        type = getMultiblockType(worldObj, xCoord, yCoord - counter, zCoord);
        if (type == "brain") {
        this.selfDestruct();
        loop = false;
        } else if (type == "nothing") {
        loop = false;
        } else {
        ((TileEntityMultiblock) worldObj.getTileEntity(xCoord, yCoord - counter, zCoord)).setMaster(xCoord, yCoord, zCoord);
        elements[counter2][0] = type;
        elements[counter2][1] = Integer.toString(0+counter);
        counter2++;
        elementsCounter++;
        }
        counter++;
        }
        }
        return elements;
        }
        
        public void selfDestruct() {
        destruction = true;
        this.invalidate();
        }
        
        }
        

        @‘Blackout’:

        vu que ma fonction fait appel à du contenu se trouvant dans elle même, c’est normal que ça crash

        Ça ne veut rien dire.

        Cela signifie qu’elle fait appel à des variables déclarées dans la TE, j’avais oublié de préciser TE désolé.


        Über Networking Antennas

        1 réponse Dernière réponse Répondre Citer 0
        • RedRelayR Hors-ligne
          RedRelay Moddeurs confirmés
          dernière édition par

          Pourquoi est ce que tu représentes tes blocs par des chaines de caractère ? ne serait ce pas plus logique/pratique/performant/viable de les représenter par des blocs directement ?
          Ton code n’est pas du tout optimisé, tu as beaucoups trop d’accès mémoire inutile.

          Est ce que tu comptes appeler newMaster depuis un autre fichier ?

          String[][] elements = new String[256][2];
          

          Mon dieu O_o

          
          int counter = 1;
          int counter2 = 0;
          

          Qu’est ce que tu comptes ?

          Bon tu n’as pas de constructeur, donc ça veut dire que tu as un constructeur par defaut.
          Du coups, il faut placer ta fonction a la fin de readFromNBTTag

          –------------------------------------------------------------------------------------
          Si tu trouves mon intervention pertinente, n'hésite pas a m…

          1 réponse Dernière réponse Répondre Citer 0
          • JustPingoJ Hors-ligne
            JustPingo
            dernière édition par

            @‘Blackout’:

            Pourquoi est ce que tu représentes tes blocs par des chaines de caractère ? ne serait ce pas plus logique/pratique/performant/viable de les représenter par des blocs directement ?

            Pour les identifier rapidement. Et en termes de performances, stocker un block complet dans la ram est bien pire qu’une simple chaine (même si je t’accorde que les chaines de caractère en Java c’est pas le top non plus, c’est le moins qu’on puisse dire). D’autant que je dois à la fois stocker le type de block et la distance, dans la même table.

            @‘Blackout’:

            Ton code n’est pas du tout optimisé, tu as beaucoups trop d’accès mémoire inutile.

            Je en comprends pas vraiment où tu veux en venir.

            @‘Blackout’:

            Est ce que tu comptes appeler newMaster depuis un autre fichier ?

            Oui.

            @‘Blackout’:

            String[][] elements = new String[256][2];
            

            Mon dieu O_o

            Cette ligne est une ligne temporaire, dans le sens où à l’avenir je me prendrais la tête à déclarer dynamiquement la taille en fonction du nombre de blocks stockés. Un truc à la con, lors de newMaster, la table locale est de 256, puis ce qui est retourné a pour taille le nombre de case occupée dans la table locale de newMaster.

            @‘Blackout’:

            
            int counter = 1;
            int counter2 = 0;
            

            Qu’est ce que tu comptes ?

            counter : à combien de case on est du master, en premier lieu dans +Y puis dans -Y.
            counter2 : le nombre d’éléments trouvés dans la structure pour l’ajout à la table principale.

            @‘Blackout’:

            Bon tu n’as pas de constructeur, donc ça veut dire que tu as un constructeur par defaut.
            Du coups, il faut placer ta fonction a la fin de readFromNBTTag

            Ok merci.

            EDIT : Après vérification, on dirait que lorsque la fonction est exécutée, worldObj est null, hors j’ai besoin de malgré tout faire du server-side only. Comment puis-je faire une alternative ?


            Über Networking Antennas

            1 réponse Dernière réponse Répondre Citer 0
            • RedRelayR Hors-ligne
              RedRelay Moddeurs confirmés
              dernière édition par

              @‘pingoleon60’:

              @‘Blackout’:

              Pourquoi est ce que tu représentes tes blocs par des chaines de caractère ? ne serait ce pas plus logique/pratique/performant/viable de les représenter par des blocs directement ?

              Pour les identifier rapidement. Et en termes de performances, stocker un block complet dans la ram est bien pire qu’une simple chaine (même si je t’accorde que les chaines de caractère en Java c’est pas le top non plus, c’est le moins qu’on puisse dire). D’autant que je dois à la fois stocker le type de block et la distance, dans la même table.

              Absolument pas. Quand tu stockes un objet, tu stocks ta référence c’est a dire 4 octect qui réprésente son adresse en mémoire quelque soit l’objet tant que tu ne fais pas de new. Les object sont transmis par référence et non par valeur, c’est a dire qu’il n’y a aucune recopie.

              Ici, pour chaque chaine, tu va en instancier une nouvelle a chaque fois. Outre le fait d’appeler un malloc implicitement qui est une opération couteuse, si tu veux parler taille tu stocks : 4 octect pour la taille + 1 octect par charactère de ta chaine.
              Sans compter qu’accessoirement tu dois aussi stocker le type du block non ? Donc 4 octect supplémentaire.
              Ça c’est juste pour la mémoire, concernant le CPU, tu va devoir dès que tu cherches un block parcourir une sorte de registre pour trouver l’équivalence chaine/block.

              @‘pingoleon60’:

              @‘Blackout’:

              Ton code n’est pas du tout optimisé, tu as beaucoups trop d’accès mémoire inutile.

              Je en comprends pas vraiment où tu veux en venir.

              Tu as trop de world.getTileEntity, tu devrais stocker le résultat dans la pile d’éxécution au lieu d’exécuter cette opération en double.
              Ici, ce n’est pas un simple getter qui va te renvoyer un attribut, c’est une méthode qui fait une recherche dans une structure de donné.

              @‘pingoleon60’:

              @‘Blackout’:

              
              int counter = 1;
              int counter2 = 0;
              

              Qu’est ce que tu comptes ?

              counter : à combien de case on est du master, en premier lieu dans +Y puis dans -Y.
              counter2 : le nombre d’éléments trouvés dans la structure pour l’ajout à la table principale.

              Dans ce cas la n’est pas plus évocateur de donner a tes variables le nom yOffset et foundBlock ?

              @‘pingoleon60’:

              EDIT : Après vérification, on dirait que lorsque la fonction est exécutée, worldObj est null, hors j’ai besoin de malgré tout faire du server-side only. Comment puis-je faire une alternative ?

              A mon avis, tu n’as pas besoin du world uniquement pour connaitre la side.
              As-tu bien appeler ta méthode a la fin de readFromNBTTag ?

              –------------------------------------------------------------------------------------
              Si tu trouves mon intervention pertinente, n'hésite pas a m…

              1 réponse Dernière réponse Répondre Citer 0
              • JustPingoJ Hors-ligne
                JustPingo
                dernière édition par

                1. Ah bon, je savais pas. Mais en tout cas, j’ai besoin de stocker la distance avec, et du coup ça impliquerait la création d’un tableau d’Object, est-ce que tu penses que ça en vaut la peine ?

                2. D’accord. En fait, il me semblait que faire ça était plus économique en termes de ressources générales. Je corrigerai.

                3. J’aime obfusquer manuellement mon code.

                public void readFromNBT(NBTTagCompound nbttag)
                {
                super.readFromNBT(nbttag);
                
                this.elements = this.newMaster();
                }
                

                Lorsque je me connecte, ça crash pas. Par contre quand j’essaye de voir des valeurs normalement créées par newMaster, crash.


                Über Networking Antennas

                1 réponse Dernière réponse Répondre Citer 0
                • RedRelayR Hors-ligne
                  RedRelay Moddeurs confirmés
                  dernière édition par

                  1. crée un objet qui contient un block et une distance, tu stocks cet objet dans ta structure de donné.

                  2. On obfusque jamais le code source, même quand on code solo. Quand tu reviendras sur ton code après plusieurs mois sans y avoir touché tu n’y comprendra plus rien et tu perdra du temps a “deobfusquer” ton code manuellement.

                  3. Personnelement j’aurais plus vu l’appel a newMaster dans la classe mère.
                    Après je ne comprend pas vraiment la différence que tu fais entre le TileEntityMultiblock et le TileEntityMultiblockControler.
                    Tu as peut-être des erreurs de conception qui te rendent la tache plus ardue.

                  Si ça ne crash pas, c’est que tu as probablement un problème d’algo dans ta fonction newMaster.
                  Mets des breakpoints et lance le debuggueur.

                  –------------------------------------------------------------------------------------
                  Si tu trouves mon intervention pertinente, n'hésite pas a m…

                  1 réponse Dernière réponse Répondre Citer 0
                  • JustPingoJ Hors-ligne
                    JustPingo
                    dernière édition par

                    1. Ok. En fait l’attribution du pointeur est automatique en Java à ce niveau. Je pensais que c’était une copie pure et simple.

                    2. Ca fait 6 ans que je fais ça, j’ai jamais eu ce genre de problèmes.

                    3. TileEntityMultiblock, c’est un truc général pour tous les blocks multiblocks, que ce soit les maitres ou les esclaves. TileEntityMutiblockControler, c’est la TE d’une des sortes de maitres. Faire comme ça me permet d’avoir une sorte d’API permettant l’interaction entre les blocks qui ont chacun TE et Gui indépendantes, et qui techniquement peuvent fonctionner seuls. Appeler newMaster dans la classe mère rendrait tous les éléments du Multiblock maitres.


                    Über Networking Antennas

                    1 réponse Dernière réponse Répondre Citer 0
                    • RedRelayR Hors-ligne
                      RedRelay Moddeurs confirmés
                      dernière édition par

                      1. Je te dis mon expérience la dessus, j’ai travaillé sur des projets conséquents, sur des logiciels utilisé quotidiennement par des centaines de personne et qui doivent être maintenu pendant plusieurs dixaines d’années, j’ai des diplomes et une expérience professionnel. Après tu prends ou tu prends pas, c’est comme tu veux ^^

                      2. Donc tout tes blocks multiblock on forcément une TileEntity ? Et tout les TileEntityMultiblocks n’appel pas forcément newMaster a leur création ?

                      –------------------------------------------------------------------------------------
                      Si tu trouves mon intervention pertinente, n'hésite pas a m…

                      1 réponse Dernière réponse Répondre Citer 0
                      • JustPingoJ Hors-ligne
                        JustPingo
                        dernière édition par

                        Oui c’est ça. Donc du coup je dois l’exécuter sur la TE du Controler.


                        Über Networking Antennas

                        1 réponse Dernière réponse Répondre Citer 0
                        • 1 / 1
                        • Premier message
                          Dernier message
                        Design by Woryk
                        ContactMentions Légales

                        MINECRAFT FORGE FRANCE © 2024

                        Powered by NodeBB