Bonjour à tous !
Nouveau tutoriel que je qualifierais plutôt d’astuce qui pourra ravir ceux ayant de gros Mods à coder avec pleins de lignes de code un peu partout et des classes de quelques dizaines de mètres de long
Dans celui-ci nous allons apprendre à alléger le code de notre classe principale. Mais késékécékéça ? Alléger sa classe, veut-dire, déplacer certaines lignes de code afin de pouvoir le rendre plus clair et plus simplifié mais également de retrouver plus facilement ses petits bouts de code disséminés un peu partout dans notre Mod.
Ce que nous allons apprendre :
- Créer une classe RegisterBlock, RegisterItem, RegisterCrafting, RegisterSmelting, etc…
- Le faire de 2 façons : l’une par classe entière, la seconde par méthode de classes (comme la fonction load() par exemple)
Requis pour le tuto :
- Savoir créer un block/Item/Recette/Recette de four, etc…
- Un minimum de logique et quelques connaissances en java, rien de plus
PS : N’oubliez pas les importations de classes (Block, GameRegistry, etc…)
#Une classe par fonction :(Une classe par fonction
Alors, pour commencer, on fais le plus simple, créer un système de “RegisterCeQueVousVoulez” avec une classe par fonction.
Créons la classe de notre mod :
package tuto.forge;
import tuto.forge.CommonProxy;
import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.Mod.EventHandler;
import cpw.mods.fml.common.Mod.Instance;
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;
@Mod(modid="tuto", name="tuto", version="Alpha 1.0")
@NetworkMod(clientSideRequired=true)
public class Tuto
{
@Instance(value = "Tuto")
public static Tuto instance;
@SidedProxy(clientSide="tuto.forge.ClientProxy", serverSide="tuto.forge.CommonProxy")
public static CommonProxy proxy;
@EventHandler
public void preInit(FMLPreInitializationEvent event)
{
}
@EventHandler
public void load(FMLInitializationEvent event)
{
}
@EventHandler
public void postInit(FMLPostInitializationEvent event)
{
}
}
Comme vu dans la plupart des tutos de création de mods, vous savez où enregistrer vos lignes de code en fonction des méthodes de la classe principale. Petit rappel :
- Fonction preInit() : Block/Items/Onglets Créatifs pour la base
- Fonction load() : Enregistrement et langue des blocks/Items + Recettes, four, etc…
- Fonction postInit() : Rien d’intéressant pour nous.
On va commencer par les blocks.
Créons notre nouvelle classe et appelons là RegisterBlock :
package tuto.forge;
public class RegisterBlock
{
}
Elle n’a aucun pré-requis, ceux-ci vont venir au fur et à mesure.
Bon, on déclare nos blocks :
package tuto.forge;
public class RegisterBlock
{
public static Block tuto;
public RegisterBlock()
{
tuto = new BlockTuto(ID, Material).touteslesfonctionsquevousvoulez()
}
}
Comme vu ici, notre block est déclaré, cependant, il n’est pas enregistré et ne sera même pas perçu par le mod
Pour l’enregistrer, c’est très simple, encore une nouvelle classe :
package tuto.forge;
public class GameRegisterBlock
{
public GameRegisterBlock()
{
GameRegistry.addBlock(tuto, "tuto");
}
}
Block enregistré mais toujours pas perçu !
On retourne dans notre classe principale et on ajoute 2 choses :
- Le chargement des blocks dans la classe RegisterBlock dans la fonction preInit()
- L’enregistrement des blocks dans la classe GameRegisterBlock dans la fonction load()
C’est relativement simple. Voici comment assigner la classe où nos blocks sont définis dans la 1ère fonction :
//A introduire dans la fonction preInit()
new RegisterBlock();
//A introduire dans la fonction load()
new GameRegisterBlock();
Pour ce qui est recette et blocks, rien de plus simple : reprenez le système d’enregistrement des blocks et à la place du GameRegister.addBlock, ajoutez vos recettes (GameRegister.addRecipe) et implantez la classe dans la fonction load().
#Une méthode par fonction :(Une méthode par fonction
Ici, seconde partie. Ce qu’on va voir c’est comment à partir d’une seule classe on peut enregistrer nos blocks, nos items, nos recettes, etc… dans une seule classe
Encore une fois, c’est relativement simple. A la place de créer un “RegisterBlock” ou autre, on va directement créer la classe “Register” puisque tout sera dedans :
package tuto.forge;
public class Register
{
public static Block tuto;
public static Item itemTuto;
public static void RegisterBlock()
{
tuto = new BlockTuto(ID, Material).touteslesfonctionsquevousvoulez()
}
public static void RegisterItem()
{
itemTuto = new ItemTuto(ID).touteslesfonctionsquevousvoulez()
}
public static void GameRegisterBlock()
{
GameRegistry.addBlock(tuto, "tuto");
}
public static void GameRegisterItem()
{
GameRegistry.addItem(itemTuto, "itemTuto");
}
public static void GameRegisterCraft()
{
GameRegistry.addRecipe(new ItemStack(this.tuto, 1), new Object[] {"###", "###", "###", '#', this.itemTuto});
}
}
Comme voici, tout est enregistré :
- RegisterBlock() : Permet de définir tout les blocks
**- RegisterItem() **: Permet de définir tout les items
- GameRegisterBlock() : Permet d’enregistrer les blocks
- GameRegisterItem() : Permet d’enregistrer les items
- GameRegisterCraft() : Permet d’enregistrer les crafts
Remarque : Vous pouvez rajouter autant de fonctions que vous voulez ici comme le nom, les fours, etc…
Voilà, notre classe est prête cependant elle n’est pas détectée par le mod ! Pour ceci, il faut faire varier les fonctions de la classe Register en fonction de celles de notre classe Mod :
- Commençant par “Register” : à inclure dans preInit()
- Commençant par “Game” : à inclure dans load()
Le petit bout de code :
//Dans preInit()
Register.RegisterBlock();
Register.RegisterItem()
//Dans load()
Register.GameRegisterBlock();
Register.GameRegisterItem();
Register.GameRegisterCraft()
Et voilà, une fois ceci terminé, vous lancez et voilà ! Suivant ce que vous avez choisi, vous avez une classe pour tout vos blocks/items/recettes ou une classe à chaque fois !
J’espère que ce tuto/astuce vous aura plu, c’est mon premier, n’hésitez pas à me dire les erreurs, une méthode de simplifier la chose ou encore ce que vous n’avez pas compris, je vous répondrais, à bientôt !
PS : Encore une fois, n’oubliez pas les importations, je ne les ai pas fais apparaître dans les classes !