Une armure
-
Maintenant que vous savez faire des items basique, nous allons voir comment faire une armure.
Dans la classe principale
Pour commencer, il faut déclarer les quatre items :
public static Item TutorialHelmet, TutorialChestPlate, TutorialLeggings, TutorialBoots;
En dessous, nous allons déclarer le matériel de l’armure :
static EnumArmorMaterial TutorialArmor = EnumHelper.addArmorMaterial("Tutorial", 20, new int[]{2, 8, 4, 2}, 15);
Chaque code correspond à :
EnumHelper.addArmorMaterial(“nom du matériel”, durabilité de l’armure, new int[]{absorption du casque, du plastron, des jambières, des bottes}, facilité d’enchantement)
Faite un ctrl + clic sur EnumArmorMaterial pour ouvrir la classe si vous souhaitez avoir les valeurs des armures de Minecraft.
N’oubliez pas d’importer net.minecraft.item.EnumArmorMaterial et net.minecraftforge.common.EnumHelperÀ la suite de vos item, ajoutez les quatre morceaux de l’armure :
TutorialHelmet = new ItemTutorialArmor(12002, TutorialArmor, 0,0).setUnlocalizedName("TutorialHelmet").setTextureName("modtutoriel:HelmetTutorial"); TutorialChestPlate = new ItemTutorialArmor(12003, TutorialArmor, 0, 1).setUnlocalizedName("TutorialChestPlate").setTextureName("modtutoriel:ChestPlateTutorial"); TutorialLeggings = new ItemTutorialArmor(12004, TutorialArmor, 0, 2).setUnlocalizedName("TutorialLeggings").setTextureName("modtutoriel:LeggingsTutorial"); TutorialBoots = new ItemTutorialArmor(12005, TutorialArmor, 0, 3).setUnlocalizedName("TutorialBoots").setTextureName("modtutoriel:BootsTutorial");
Comme vous pouvez le voir, nous allons utiliser une seul classe pour les quatre pièces d’armures. Vous devrez connaître tout le code, puisque c’est le même qu’un item basique sauf pour le constructeur :
ItemTutorialArmor(12002, TutorialArmor, 0,0)
12002 est l’id, TutorialArmor est le nom de l’EnumArmorMaterial que nous avons déclaré au dessus, le premier 0 n’a aucun intérêt pour nous, il n’est que utilisé pour les amures de Minecraft, dans notre cas il sert juste à éviter une erreur dans le constructeur que nous allons créer après dans la classe de l’armure. Laissez 0, si vous mettez un nombre supérieur à 4 vous allez avoir un crash. Le second 0 est correspond à morceau de l’armure, 0 pour un casque, 1 pour le plastron, 2 pour les jambières, et 3 pour les bottes.Optionnel, enregistrez vos items à la suite (je répète que ce n’est que pour l’itemTracker de FML, ces codes ne sont pas obligatoire) :
GameRegistry.registerItem(TutorialHelmet, "TutorialHelmet", "ModTutoriel"); GameRegistry.registerItem(TutorialChestPlate, "TutorialChestPlate", "ModTutoriel"); GameRegistry.registerItem(TutorialLeggings, "TutorialLeggings", "ModTutoriel"); GameRegistry.registerItem(TutorialBoots, "TutorialBoots", "ModTutoriel");
Il vous reste une erreur sur new ItemTutorialArmor, créez cette classe
La classe de l’armure
Comme d’habitude, ajoutez l’extends et le constructeur. En revanche, à la place de faire un extends Item, faite un extends ItemArmor :
package tutoriel.common; import net.minecraft.item.ItemArmor; public class ItemTutorialArmor extends ItemArmor { public ItemTutorialArmor(int id, EnumArmorMaterial armorMaterial, int type, int layer) { super(id, armorMaterial, type, layer); } }
Ensuite, ajoutez la fonction getArmor :
public String getArmorTexture(ItemStack stack, Entity entity, int slot, int layer) { if(stack.itemID == ModTutoriel.TutorialLeggings.itemID) { return "modtutoriel:textures/models/armor/tutorial_layer_2.png"; } else { return "modtutoriel:textures/models/armor/tutorial_layer_1.png"; } }
Le code est simple à comprendre, si l’id de l’item est l’id des jambières, il utilise la texture tutorial_layer_2. Sinon, c’est les autres parti de l’armure, donc il utilise la texture tutorial_layer_1
D’ailleurs, nous avons vu avant que le layer des jambières est 2, donc ce code fonctionne aussi :public String getArmorTexture(ItemStack stack, Entity entity, int slot, int layer) { if(layer == 2) { return "modtutoriel:textures/models/armor/tutorial_layer_2.png"; } else { return "modtutoriel:textures/models/armor/tutorial_layer_1.png"; } }
Mais le premier code est plus avantageux, car on peut mettre plusieurs armures dans la même classe, exemple avec deux armures :
public String getArmorTexture(ItemStack stack, Entity entity, int slot, int layer) { if(stack.itemID == ModTutoriel.TutorialLeggings.itemID) { return "modtutoriel:textures/models/armor/tutorial_layer_2.png"; //armure 1, jambières } else if(stack.itemID == ModTutoriel.TutorialHelmet.itemID || stack.itemID == ModTutoriel.TutorialChestPlate.itemID || stack.itemID == ModTutoriel.TutorialBoots.itemID) { return "modtutoriel:textures/models/armor/tutorial_layer_1.png"; //armure 1, casque + plastron + bottes } else if(stack.itemID == ModTutoriel.TutorialLeggings2.itemID) { return "modtutoriel:textures/models/armor/tutorial2_layer_2.png"; //armure 2, jambières } else { return "modtutoriel:textures/models/armor/tutorial2_layer_2.png"; //armure 2, casque + plastron + bottes } }
Pour le chemin de texture, modtutoriel correspond à mon modid sans majuscule, et le reste est le chemin exacte après /assets/modid/
Vous n’êtes pas obligé d’utiliser le même que moi, mais celui-ci est le même que minecraft (Minecraft a les textures d’armures dans assets/minecraft/textures/models/armor/)Pour rendre votre armure réparable dans une enclume ajoutez ce code dans la classe :
public boolean getIsRepairable(ItemStack stack, ItemStack repairItem) { if(stack.getItem().equals(this) && repairItem.getItem().itemID == ModTutoriel.TutorialMetadata.itemID) return true; return false; }
ModTutoriel.TutorialMetadata et l’item avec lequel le l’armure peut être réparé.
Les ressources de l’item (texture + nom)
Pour les textures des items, c’est le même principe qu’un item basique, il faut les mettre dans forge/mcp/src/minecraft/assets/modid/textures/items/
Pour les textures des modèles de l’amure, placez-les dans forge/mcp/src/minecraft/assets/modid/textures/models/armor/
Si vous avez besoin de texture de base pour les modèles :
https://github.com/MCNanotech/ModTutoriel/blob/master/assets/modtutoriel/textures/models/armor/tutorial_layer_1.png
https://github.com/MCNanotech/ModTutoriel/blob/master/assets/modtutoriel/textures/models/armor/tutorial_layer_2.pngPour les noms, c’est comme un item basique, item.nomnonlocalisé.name=nom localisé
item.TutorialHelmet.name=Tutorial Helmet item.TutorialChestPlate.name=Tutorial Chestplate item.TutorialLeggings.name=Tutorial Leggings item.TutorialBoots.name=Tutorial Boots
Dans mon cas.
Rendu final
Voir les changements sur Github
ho, player911 a un skin ! -
Je peux avoir la classe principale en entier ?
Quel erreur s’affiche ? -
l’erreur est “Illegal modifier for parameter ItemTuto; only final is permitted”
et il me propose:“Remove invalid modifiers” ce qui enlève le plublic static.
Sinon pour la class je peut vous la montrer car je ne suis pas chez moi et j’utilise mon téléphone pour vous répondre. -
Tu déclare pas l’item au bon endroit.
Il faut le mettre après l’accolade de ta classe :public class MonMod { tes proxy ton instance public static Item …. @EventHandler public void preInit(FML....
-
OK merci
-
Bonjour a vous moi j’ai un probleme de texture (une fois porté) ça ne veut pas s’afficher sur le personnage et je ne vois pas l’erreur :3
voici le code :package fr.Fanor.TSG.Item; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import fr.Fanor.TSG.TSGMod; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.Entity; import net.minecraft.item.EnumArmorMaterial; import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemStack; public class ArmorTSG extends ItemArmor{ public ArmorTSG(int par1, EnumArmorMaterial par2ArmorMaterial, int par3, int par4){ super(par1, par2ArmorMaterial, par3, par4); } public String getArmorTexture(ItemStack stack, Entity entity, int slot, int layer) { if(stack.itemID == TSGMod.leggingsRubis.itemID) { return "tsg:textures/models/armor/rubis_2.png"; } else { return "tsg:textures/models/armor/rubis_1.png"; } } public boolean getIsRepariable(ItemStack par1ItemStack, ItemStack par2ItemStack){ return true; } }
Merci de vos aide
-
Tu as bien mis tes textures ?
-
Oui j’ai mis les textures dans assets.tsg.textures.models.armor
-
Tu utilise un windows ou un mac ?
Car moi j’ai ue un bug, j’aivais aucune de mes textures qui saffichet puis j’ai férmer eclipse et la toutes mes textures étaient là comme par magie.
Sinon quand tu lance le jeu la console t’affiche quoi ? -
Je suis sous Windows mais j’ai beau fermer eclipse rien ne se passe et je ne pense pas que ca sois un problème de texture car il y aucune texture blanche sur le personnage quand j’équipe mon armure et ca me met plein d’erreur du genre RenderBiped
-
Ton Java est à jour ?
-
Yep dernière version
-
@‘MrCupCakeMonster’:
Ton Java est à jour ?
Aucun rapport.
@‘Fanor79’:Je suis sous Windows mais j’ai beau fermer eclipse rien ne se passe et je ne pense pas que ca sois un problème de texture car il y aucune texture blanche sur le personnage quand j’équipe mon armure et ca me met plein d’erreur du genre RenderBiped
On peut pas les deviner ces erreurs … Il me faut un copier/coller
En passant, je peux avoir un screenshot de l’arborescence de ton dossier où tu as les textures ? -
Et voici le code qui s’affiche en boucle
at net.minecraft.client.renderer.entity.RenderBiped.getArmorResource(RenderBiped.java:92) 2013-08-05 14:27:34 [INFO] [STDERR] at net.minecraft.client.renderer.entity.RenderPlayer.setArmorModel(RenderPlayer.java:72) 2013-08-05 14:27:34 [INFO] [STDERR] at net.minecraft.client.renderer.entity.RenderPlayer.shouldRenderPass(RenderPlayer.java:514) 2013-08-05 14:27:34 [INFO] [STDERR] at net.minecraft.client.renderer.entity.RendererLivingEntity.func_130000_a(RendererLivingEntity.java:162) 2013-08-05 14:27:34 [INFO] [STDERR] at net.minecraft.client.renderer.entity.RenderPlayer.func_130009_a(RenderPlayer.java:166) 2013-08-05 14:27:34 [INFO] [STDERR] at net.minecraft.client.renderer.entity.RenderPlayer.doRender(RenderPlayer.java:553) 2013-08-05 14:27:34 [INFO] [STDERR] at net.minecraft.client.renderer.entity.RenderManager.renderEntityWithPosYaw(RenderManager.java:312) 2013-08-05 14:27:34 [INFO] [STDERR] at net.minecraft.client.gui.inventory.GuiInventory.func_110423_a(GuiInventory.java:121) 2013-08-05 14:27:34 [INFO] [STDERR] at net.minecraft.client.gui.inventory.GuiContainerCreative.drawGuiContainerBackgroundLayer(GuiContainerCreative.java:835) 2013-08-05 14:27:34 [INFO] [STDERR] at net.minecraft.client.gui.inventory.GuiContainer.drawScreen(GuiContainer.java:111) 2013-08-05 14:27:34 [INFO] [STDERR] at net.minecraft.client.renderer.InventoryEffectRenderer.drawScreen(InventoryEffectRenderer.java:43) 2013-08-05 14:27:34 [INFO] [STDERR] at net.minecraft.client.gui.inventory.GuiContainerCreative.drawScreen(GuiContainerCreative.java:669) 2013-08-05 14:27:34 [INFO] [STDERR] at net.minecraft.client.renderer.EntityRenderer.updateCameraAndRender(EntityRenderer.java:1036) 2013-08-05 14:27:34 [INFO] [STDERR] at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:934) 2013-08-05 14:27:34 [INFO] [STDERR] at net.minecraft.client.Minecraft.func_99999_d(Minecraft.java:826) 2013-08-05 14:27:34 [INFO] [STDERR] at net.minecraft.client.main.Main.main(Main.java:93) 2013-08-05 14:27:34 [INFO] [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 2013-08-05 14:27:34 [INFO] [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 2013-08-05 14:27:34 [INFO] [STDERR] at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 2013-08-05 14:27:34 [INFO] [STDERR] at java.lang.reflect.Method.invoke(Unknown Source) 2013-08-05 14:27:34 [INFO] [STDERR] at net.minecraft.launchwrapper.Launch.launch(Launch.java:57) 2013-08-05 14:27:34 [INFO] [STDERR] at net.minecraft.launchwrapper.Launch.main(Launch.java:18)
-
Il trouve pas les fichiers, vérifie que l’extension est bien .png et pas autre chose. Si c’est pas ça je vois vraiment pas d’où peut venir le problème.
-
Oui c’est bien .png je vous passe le code principal en cas ou
package fr.Fanor.TSG; import java.util.HashMap; import net.minecraft.block.Block; import net.minecraft.block.BlockOre; import net.minecraft.block.BlockOreStorage; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.EnumArmorMaterial; import net.minecraft.item.EnumToolMaterial; import net.minecraft.item.Item; import net.minecraft.item.ItemArmor; import net.minecraft.item.ItemAxe; import net.minecraft.item.ItemFood; import net.minecraft.item.ItemHoe; import net.minecraft.item.ItemMultiTextureTile; import net.minecraft.item.ItemPickaxe; import net.minecraft.item.ItemSpade; import net.minecraft.item.ItemSword; import net.minecraftforge.common.EnumHelper; import net.minecraftforge.common.MinecraftForge; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.common.Mod.Init; import cpw.mods.fml.common.Mod.Instance; import cpw.mods.fml.common.Mod.PreInit; import cpw.mods.fml.common.SidedProxy; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.network.NetworkMod; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import fr.Fanor.TSG.Block.Brick; import fr.Fanor.TSG.Block.Fleur; import fr.Fanor.TSG.Block.Lumiere; import fr.Fanor.TSG.Block.Stairs; import fr.Fanor.TSG.Item.ArmorTSG; import fr.Fanor.TSG.Item.ItemTsg; @Mod(modid = "tsg", name = "TheSystemGame", version = "1.1") @NetworkMod(clientSideRequired = true, serverSideRequired = false) public class TSGMod { @Instance("tsg") TSGMod modInstance; public static final CreativeTabs items = new fr.Fanor.TSG.CreativeTabs.Items("Creatif Items"); public static EnumArmorMaterial RUBIS, EMERALD; /* Armure + minerais de Rubis*/ public static Item ingotRubis, helmetRubis, chestplateRubis, leggingsRubis, bootsRubis; @EventHandler public void preInit(FMLPreInitializationEvent event){ RUBIS = EnumHelper.addArmorMaterial("RUBIS", 35, new int[] {3, 10, 6, 4}, 15); } @EventHandler public void Init(FMLInitializationEvent event) { initItem(); } public void initItem(){ ingotRubis = (new ItemTsg(1000)).setUnlocalizedName("ingotRubis").setCreativeTab(items); helmetRubis = (new ArmorTSG(1001, RUBIS, 5, 0)).func_111206_d("tsg:helmetRubis").setUnlocalizedName("helmetRubis").setCreativeTab(items); chestplateRubis = (new ArmorTSG(1002, RUBIS, 5, 1)).func_111206_d("tsg:chestplateRubis").setUnlocalizedName("chestplateRubis").setCreativeTab(items); leggingsRubis = (new ArmorTSG(1003, RUBIS, 5, 2).func_111206_d("tsg:leggingsRubis")).setUnlocalizedName("leggingsRubis").setCreativeTab(items); bootsRubis = (new ArmorTSG(1004, RUBIS, 5, 3).func_111206_d("tsg:bootsRubis")).setUnlocalizedName("bootsRubis").setCreativeTab(items); } }
-
@‘robin4002’:
@‘MrCupCakeMonster’:
Ton Java est à jour ?
Aucun rapport.
Je sais, mais c’était en quelques sortes pour “relancer” son aide
-
Pas très utile, surtout si c’est pour relancer 19 minutes après –’
Je vois vraiment pas d’où vient le problème, tu peux m’envoyer les sources ? -
Oui les voila https://dl.dropboxusercontent.com/u/57092855/Source.zip j’ai aussi mit les textures
-
Sinon moi j’ai les gameRegistery qui font crash le jeu :huh:
GameRegistry.registerItem(ItemTutorial, "ItemTutorial", "ModTutoriel");