Modulars Blocks



  • Salut à tous ,
    Je reviens vers vous avec une toute nouvelle idée ! (Attention , ce post s'adresse a ceux qui ont un peu d'imagination , parce que sinon , je ne pourrai pas vous expliquer)

    Je vais prendre un exemple simple , celui d'un four .
    Quel est le principe d'un four ? De chauffer un objet
    Comment produire de la chaleur ? Avec de l'énergie électrique (par exemple)
    Comment produire de la chaleur avec de l'énergie électrique ?
    C'est Là que cela devient intéressant !
    Mon idée est d'exploiter les propriétés d'un matériau afin de construire des objets utiles .
    La réponse à cette question serait donc : La chaleur peut être produite lorsque qu'un courant traverse un conducteur , dépandant de l'épaisseur dudit conducteur et de l'intensité dudit courant
    Ainsi , si de l'énergie électrique traverse , par exemple , un fil de cuivre , il se dégage de la chaleur de ce fil
    Voilà , je viens d'utiliser une propriété du cuivre

    Autre exemple , la propulsion d'un projectile a l'aide d'une explosion :
    Lorsqu'un morceau de silex se frotte a un morceau de fer , il se produit une étincelle
    Si ladite étincelle atteint de la gunpowder , il se produit une explosion
    Si l'explosion atteint un morceau de fer mobile dans un long tuyau , l'explosion se concentre derrière ce morceau , le propulsant à très grande vitesse . Ce système simple permettrait de fabriquer un fusil .

    Imaginez que l'on attribue des propriétés a tout un set de matériaux , on obtiendrait de merveilleuses machines

    Alors , plus concrètement , ce mod consisterait à placer toutes sortes de matériaux possédant des propriétés dans un cube de 161616 slots (la texture d'un bloc classique si l'on considère qu'il est plein)
    Ce cube possédant aussi la possibilité d'inception , ce qui permettrai de répéter plusieurs schémas fonctionnels

    Ou j'en suis actuellement et ce q'il faut que je fasse :
    Faire un tableau de valeurs et d'attributs des materiaux
    Faire une class à materiaux
    Creer un GUI ou l'on peut faire "bouger" un bloc en 3D afin de poser les miniblocs
    Gerer le rendu du Bloc Spécial
    Creer les Miniblocks et leur rendu

    Si quelqu’un est intéressé pour nous aider à le coder gagoi (développeur occasionel) et moi , ce projet pourrait venir au monde et ravir des centaines de joueurs !
    Surtout , j'accepte n'importe quelle idée qui pourrait m'aider à le coder !

    Nwmqpa

    P.S. : Je débute juste en java , je viens a peine d'attaquer la programmation événementielle ^^



  • Très bonne idée ! Cependant, ce doit être extrêmement compliqué à coder (Je suis aussi débutant avec l'API Forge)



  • Merci beaucoup , mais le plus dur a coder sera surement le classe mere materiau et le cube de mini-bloc



  • Il faudrait faire une sorte d'API pour faciliter tout ça 😉



  • Euh , effectivement , ce serait mieux , mauis on ne sait pas le faire



  • Petit up pour vous dire que j'essaie d'avancer , mais que si quelqun est disposé à m'aider , j'aprécierai son aide , en particulier sur l'update des TileEntity
    Voici mon probleme : Grace au tutoriel de robin , j'ai crée une TilEntity capable de changer les valeur avec un clique droit , et en fouillant un peu , j'ai réussi a faire "poser" un bloc de feu , seulement , mon souci est le suivant : Quand la valeur est suppérieure a 12 , un bloc de feu apparait , si je modifie la valeur du bloc , le feu apparait ou disparais , mais je voudrais que quoiqu'il arrive le feu sois présent si valeur > 12 , le véritable probleme , c'est que lorsque j'éteins le feu manuellement , il ne réapparait pas , pourtant , la valeur est toujours supérieure a 12 . Y'aurait t'il un moyen d'update le block tous les ticks ou moins sans cliquer dessus ?



  • Déjà avant de commencer ton projet. Parceque j'ai l'impression que t'es déjà en train de coder alors que c'est pas par là qu'on commence.
    Déjà défini toi tous les objets, propriétés, méthodes et évènements que tu as besoin et fait un diagramme sur papier.
    Ensuite regarde ce qui réuni tous les objets entre eux, construit des interface

    ça sert à rien de se lancer dans un grand projet si c'est pour faire du quick and dirty qui marche qu'à moitié et qui n'est pas extensible à souhait.

    Exemple. J'ai 10 matériaux.
    interface materiau
    conductible
    chaleuremise
    calculchaleuremise retourne chaleuremise
    coefficientderesistance
    destructible
    methode soumisaucourant
    noyé
    .....

    Tu as déjà des pistes pour faire une interface


  • Modérateurs

    @'nwmqpa':

    Petit up pour vous dire que j'essaie d'avancer , mais que si quelqun est disposé à m'aider , j'aprécierai son aide , en particulier sur l'update des TileEntity
    Voici mon probleme : Grace au tutoriel de robin , j'ai crée une TilEntity capable de changer les valeur avec un clique droit , et en fouillant un peu , j'ai réussi a faire "poser" un bloc de feu , seulement , mon souci est le suivant : Quand la valeur est suppérieure a 12 , un bloc de feu apparait , si je modifie la valeur du bloc , le feu apparait ou disparais , mais je voudrais que quoiqu'il arrive le feu sois présent si valeur > 12 , le véritable probleme , c'est que lorsque j'éteins le feu manuellement , il ne réapparait pas , pourtant , la valeur est toujours supérieure a 12 . Y'aurait t'il un moyen d'update le block tous les ticks ou moins sans cliquer dessus ?

    Tu devrais pouvoir gérer dans la TileEntity normalement 😉

    Sinon XcentY, pas forcément besoin d'une interface si 'y a qu'une implémentation.
    Et noter ses idées c'est bien, mais c'est pas nécessaire de faire une liste complète. Beaucoup d'idées viendront lors des tests



  • Alors , merci de ces deux retours !
    @YcentY : Pour les idées , les poser sur papier , ce serait effectivement bien , mais je voulais connaitre le fonctionnement d'une TileEntity , mais t'inquiete pas , je commence deja a noter les propriétés de différents métaux . Pour l'interface , j'y avais deja pensé , en faisant plusieurs par groupe d'attributs , mais quelqun m'a conseillé de le mettre dans une classe mere , et de tout regrouper avec des comment pour plus de lisibilité , a savoir que je vais commencer par les metaux , car rien qu'avec ca , je vais avoir du boulot !

    @jglrxavpok : Euh… d'accord , mais OU et COMMENT . J'ai fouillé énormément avant de poster ici !
    Ensuite , pour le moment je fonctionne avec des idées simples , tres extensibles , mais difficile a mettre en place , je pense que je vais commencer par des attributs simples , puis mettre des fonctionnalitées originales , et ensuite , impleter des attributs plus complexe

    Encore une fois , si vous avez d'autres idées , proposez les moi !


  • Modérateurs

    updateEntity fera ce que tu voudras



  • Petite exception …. :

    et.minecraft.util.ReportedException: Ticking block entity
    at net.minecraft.world.World.updateEntities(World.java:2154) ~[World.class:?]
    at net.minecraft.client.Minecraft.runTick(Minecraft.java:2096) ~[Minecraft.class:?]
    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1038) ~[Minecraft.class:?]
    at net.minecraft.client.Minecraft.run(Minecraft.java:961) [Minecraft.class:?]
    at net.minecraft.client.main.Main.main(Main.java:164) [Main.class:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0]
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:134) [launchwrapper-1.9.jar:?]
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.9.jar:?]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0]
    at GradleStart.bounce(GradleStart.java:107) [start/:?]
    at GradleStart.startClient(GradleStart.java:100) [start/:?]
    at GradleStart.main(GradleStart.java:55) [start/:?]
    Caused by: java.lang.NullPointerException
    at net.modularblocks.common.material.TileEntityMaterial.isHeating(TileEntityMaterial.java:77) ~[TileEntityMaterial.class:?]
    at net.modularblocks.common.material.TileEntityMaterial.updateEntity(TileEntityMaterial.java:80) ~[TileEntityMaterial.class:?]
    at net.minecraft.world.World.updateEntities(World.java:2139) ~[World.class:?]
    … 17 more
    ---- Minecraft Crash Report ----
    // Why is it breaking :(
    
    Time: 05/09/14 14:05
    Description: Ticking block entity
    
    java.lang.NullPointerException: Ticking block entity
    at net.modularblocks.common.material.TileEntityMaterial.isHeating(TileEntityMaterial.java:77)
    at net.modularblocks.common.material.TileEntityMaterial.updateEntity(TileEntityMaterial.java:80)
    at net.minecraft.world.World.updateEntities(World.java:2139)
    at net.minecraft.client.Minecraft.runTick(Minecraft.java:2096)
    at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1038)
    at net.minecraft.client.Minecraft.run(Minecraft.java:961)
    at net.minecraft.client.main.Main.main(Main.java:164)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at net.minecraft.launchwrapper.Launch.launch(Launch.java:134)
    at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at GradleStart.bounce(GradleStart.java:107)
    at GradleStart.startClient(GradleStart.java:100)
    at GradleStart.main(GradleStart.java:55)
    

    Voici mon code :

    public void isHeating() {
    World world = null;
    if(this.getElectricActualVoltage() > this.getCapacityVoltage()){
    world.setBlock(xCoord, yCoord+1, zCoord, Blocks.fire);
    this.updateEntity();
    }
    else
    world.setBlock(xCoord, yCoord+1, zCoord, Blocks.air);
    }
    public void updateEntity() {
    this.isHeating();
    
    }
    
    }
    

    Si quelqun a une solution ...


  • Administrateurs

    World world = null;

    Si l'objet world est null, c'est normal que ça cause un NPE ...
    utilise this.worldObj si tu as besoin de l'instance du monde.



  • Aprs avoir fait ca j'ai encore une erreur …
    C'était bien World world = this.worldObj; qu'i fallait faire ?


  • Administrateurs

    Non, directement this.worldObj.setBlock(xCoord, yCoord+1, zCoord, Blocks.fire)



  • Alors , plus d'erreur , juste , la "surchauffe" ne se produit plus à 13.0 , voici mon code :

    public void isHeating() {
    
    if(this.getElectricActualVoltage() > this.getCapacityVoltage()){
    this.worldObj.setBlock(xCoord, yCoord+1, zCoord, Blocks.fire);
    }
    else
    this.worldObj.setBlock(xCoord, yCoord+1, zCoord, Blocks.air);
    }
    public void updateEntity() {
    this.isHeating();
    
    }
    
    

    Dans ma class Block , j'appelle bien la methode ths.updateEntity();


  • Administrateurs

    Vérifie les valeurs de this.getElectricActualVoltage() et this.getCapacityVoltage()



  • Voila :

    
    player.addChatMessage(new ChatComponentTranslation("Le courant est de : " + tileEntityMaterial.getElectricActualVoltage()));
    tileEntityMaterial.setElectricVoltage(12.0);
    tileEntityMaterial.updateEntity();
    

    La valeur est bien vrai , il m'affiche bien les bonnes valeurs lorsque je clique



  • Bon , j'ai résolu on probleme , il suffisait simplement de mettre le contenu de isHeating() dans updateEntity() au lieu d'appeler isHeating dans updateEntity



  • Est ce qu'un admin voudrait bien déplacer ce sujet dans la zone "En devellopement" ?
    Merci



  • Bonjour , j'ai deux nouveaux problemes :

    1. Mon render spécial de Table ne s'affiche pas , pouvez exactement me dir ou je dois placer le fichier par rapport au ressources ?
    
    package net.modularblocks.proxy;
    
    import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
    import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
    import net.minecraft.tileentity.TileEntity;
    import net.minecraft.util.ResourceLocation;
    import net.modularblocks.client.Table;
    import net.modularblocks.common.microblock.TileEntityTable;
    
    import org.lwjgl.opengl.GL11;
    
    public class TileEntityTableSpecialRender extends TileEntitySpecialRenderer implements IInventoryRenderer {
    private final Table model = new Table();
    public static final ResourceLocation textureLocation = new ResourceLocation("modularblocks" , "textures/blocks/modelTable.png");
    public TileEntityTableSpecialRender()
    {
    this.func_147497_a(TileEntityRendererDispatcher.instance);
    }
    
    @Override
    public void renderInventory(double x, double y, double z)
    {
    this.renderTileEntityTableAt(null, x, y, z, 0.0F);
    }
    
    @Override
    public void renderTileEntityAt(TileEntity te, double x, double y, double z, float tick)
    {
    this.renderTileEntityTableAt((TileEntityTable)te, x, y, z, tick);
    
    }
    public void renderTileEntityTableAt(TileEntityTable te, double x, double y, double z, float tick)
    {
    GL11.glPushMatrix();
    GL11.glTranslated(x + 0.5F, y + 1.5F, z + 0.5F);
    this.bindTexture(textureLocation);
    GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F);
    this.model.render(0.0625F);
    GL11.glPopMatrix();
    
    }
    
    }
    

    Et 2 eme probleeme : je ne trouve pas de tuto récent sur les GUI , du coup , j'ai du me rabattre sur une JFrame 
    Sachant que la JFrame n'est qu'une interface qui sert à construire quelque chose à partir d'objets listés dans le code , y'a t'il 
    des problemes qui peuvent survenir ? (cette fenetre va me servir pour la conception des blocs "spéciaux")