Rechercher dans la communauté

Affichage des résultats pour les étiquettes 'Tutoriels'.

  • Rechercher par étiquettes

    Saisir les étiquettes en les séparant par une virgule.
  • Rechercher par auteur

Type du contenu


Forums

  • Communauté
    • Avant Tout
    • Annonces
    • Présentation des Membres
    • Vos Projets
    • Recrutements
  • Tutoriels
    • La base
    • Vanilla
    • Forge
    • Bukkit
    • Astuces
    • Autre
    • En attente de validation
    • En cours de rédaction
  • Créations
    • Minecraft
    • Jeux & Logiciels
    • Web
    • Suggestions
  • Le Coin Graphique
    • Galeries Personnelles
    • Galeries Publiques
    • Demandes Graphiques
  • Taverne
    • Général
    • Jeux Vidéos
    • Programmation

33 résultats trouvés

  1. Item qui fait spawn un mob en Vanilla -[iNTRODUCTION]- Bonjour à tous ! Dans ce tutoriel, nous allons faire un Item qui fait spawn un mob, commençons sans attendre -[sOMMAIRE]- 1]Création d'un classe ordinaire 2]Création d'une méthode onItemUse 3]Faire spawner le mob 4] Craftbukkit 1]Création d'une classe ordinaire Commençons par créer une class ordinaire. package fr.tonnom.tonmod; public class ItemMob { public ItemMob() { } } Puis nous allons ajouter le stack maximum (pour moi ce sera 1), sa durabilité (pour moi ce sera 5) et l'emplacement dans l'inventaire creatif. Nous allons donc ajouter ces deux lignes : this.setCreativeTab(CreativeTabs.tabMisc); this.setMaxDamage(5); this.setMaxStackSize(1); dans le " public void ItemMob() " 2] Création d'une méthodeonItemUse Commençons par créer notre méthode en boolean, qui va s'éxécuter lors de l'utilisation de l'item. public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) return true; } Ensuite ajoutons-y ce qu'il nous faut, c'est à dire récupérer les informations du bloc clicker public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) { par1ItemStack.damageItem(1, par2EntityPlayer); // ici nous faisons en sorte que la durabilité baisse de 1 après un click droit if (par3World.isClient) // si le mon est Client alors... { return true; // ... ça renvoi true ... } else // ... sinon ... { Block var11 = par3World.getBlock(par4, par5, par6); // on récupère le bloc par4 += Facing.offsetsXForSide[par7]; // ------ par5 += Facing.offsetsYForSide[par7]; // | -- on récupère les coordonnées par6 += Facing.offsetsZForSide[par7]; //------- double var12 = 0.0D; if (par7 == 1 && var11.getRenderType() == 11) { var12 = 0.5D; } Entity var14 = spawnCreature(par3World, 2, (double)par4 + 0.5D, (double)par5 + var12, (double)par6 + 0.5D); if (var14 != null) { if (var14 instanceof EntityLivingBase && par1ItemStack.hasDisplayName()) { ((EntityLiving)var14).setCustomNameTag(par1ItemStack.getDisplayName()); } } return true; } } 3] Faire spawner le mob Ici nous allons créér notre méthode " spawnCreature "en static public static Entity spawnCreature(World par0World, int par1, double par2, double par4, double par6) { } Puis nous allons mettre tout ce qu'il nous faut à lintérieur, c'est à dire la récupération du mob. public static Entity spawnCreature(World par0World, int par1, double par2, double par4, double par6) { Entity var8 = null; for (int var9 = 0; var9 < 1; ++var9) // nous créons une boucle " for " { var8 = EntityList.createEntityByID(50, par0World); // ici nous allons faire spawner un creeper qui a l'id " 50 " donc nous récupérons le mob. if (var8 != null && var8 instanceof EntityLivingBase) // donc si le mob n'est pas = à null et qu'il instance bien EntityLivingBase alors ... { EntityLiving var10 = (EntityLiving)var8; var8.setLocationAndAngles(par2, par4, par6, MathHelper.wrapAngleTo180_float(par0World.rand.nextFloat() * 360.0F), 0.0F); // --------------------------------- var10.rotationYawHead = var10.rotationYaw; // | // on défini les positions du mob. var10.renderYawOffset = var10.rotationYaw; //------------- var10.onSpawnWithEgg((IEntityLivingData)null); par0World.spawnEntityInWorld(var8); // on fait spawn l'entité var10.playLivingSound(); // on émet son bruit. } } return var8; } ce qui nous donne au final : package fr.tonnom.tonmod; public class ItemMob extends Item { public ItemMob() { this.setCreativeTab(CreativeTabs.tabMisc); this.setMaxDamage(5); this.setMaxStackSize(1); } public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10) { par1ItemStack.damageItem(1, par2EntityPlayer); if (par3World.isClient) { return true; } else { Block var11 = par3World.getBlock(par4, par5, par6); par4 += Facing.offsetsXForSide[par7]; par5 += Facing.offsetsYForSide[par7]; par6 += Facing.offsetsZForSide[par7]; double var12 = 0.0D; if (par7 == 1 && var11.getRenderType() == 11) { var12 = 0.5D; } Entity var14 = spawnCreature(par3World, 2, (double)par4 + 0.5D, (double)par5 + var12, (double)par6 + 0.5D); if (var14 != null) { if (var14 instanceof EntityLivingBase && par1ItemStack.hasDisplayName()) { ((EntityLiving)var14).setCustomNameTag(par1ItemStack.getDisplayName()); } } return true; } } public static Entity spawnCreature(World par0World, int par1, double par2, double par4, double par6) { Entity var8 = null; for (int var9 = 0; var9 < 1; ++var9) { var8 = EntityList.createEntityByID(50, par0World); if (var8 != null && var8 instanceof EntityLivingBase) { EntityLiving var10 = (EntityLiving)var8; var8.setLocationAndAngles(par2, par4, par6, MathHelper.wrapAngleTo180_float(par0World.rand.nextFloat() * 360.0F), 0.0F); var10.rotationYawHead = var10.rotationYaw; var10.renderYawOffset = var10.rotationYaw; var10.onSpawnWithEgg((IEntityLivingData)null); par0World.spawnEntityInWorld(var8); var10.playLivingSound(); } } return var8; } } 4] Craftbukkit Pour le craftbukkit c'est le même concept donc je vous donne le code directement : 1.7.2 : package net.minecraft.server; public class ItemMob extends Item { public ItemMob(){ this.maxStackSize = 1; this.setMaxDurability(5); } public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) { itemstack.damage(1, entityhuman); if (world.isStatic || itemstack.getData() == 48 || itemstack.getData() == 49 || itemstack.getData() == 63 || itemstack.getData() == 64) { return true; } else { Block block = world.getType(i, j, k); i += Facing.b[l]; j += Facing.c[l]; k += Facing.d[l]; double d0 = 0.0D; if (l == 1 && block.b() == 11) { d0 = 0.5D; } Entity entity = a(world, 2, (double) i + 0.5D, (double) j + d0, (double) k + 0.5D); if (entity != null) { if (entity instanceof EntityLiving && itemstack.hasName()) { ((EntityInsentient) entity).setCustomName(itemstack.getName()); } } return true; } } public static Entity a(World world, int i, double d0, double d1, double d2) { return spawnCreature(world, i, d0, d1, d2, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG); } public static Entity spawnCreature(World world, int i, double d0, double d1, double d2, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) { Entity entity = null; for (int j = 0; j < 1; ++j) { entity = EntityTypes.a(50, world); if (entity != null && entity instanceof EntityLiving) { EntityInsentient entityinsentient = (EntityInsentient) entity; entity.setPositionRotation(d0, d1, d2, MathHelper.g(world.random.nextFloat() * 360.0F), 0.0F); entityinsentient.aO = entityinsentient.yaw; entityinsentient.aM = entityinsentient.yaw; entityinsentient.a((GroupDataEntity) null); world.addEntity(entity, spawnReason); entityinsentient.r(); } } return entity; } } 1.7.10 : package net.minecraft.server; public class ItemMob extends Item { public ItemMob(){ this.maxStackSize = 1; this.setMaxDurability(5); } public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) { itemstack.damage(1, entityhuman); if (world.isStatic || itemstack.getData() == 48 || itemstack.getData() == 49 || itemstack.getData() == 63 || itemstack.getData() == 64) { return true; } else { Block block = world.getType(i, j, k); i += Facing.b[l]; j += Facing.c[l]; k += Facing.d[l]; double d0 = 0.0D; if (l == 1 && block.b() == 11) { d0 = 0.5D; } Entity entity = a(world, 2, (double) i + 0.5D, (double) j + d0, (double) k + 0.5D); if (entity != null) { if (entity instanceof EntityLiving && itemstack.hasName()) { ((EntityInsentient) entity).setCustomName(itemstack.getName()); } } return true; } } public static Entity a(World world, int i, double d0, double d1, double d2) { return spawnCreature(world, i, d0, d1, d2, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG); } public static Entity spawnCreature(World world, int i, double d0, double d1, double d2, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) { Entity entity = null; for (int j = 0; j < 1; ++j) { entity = EntityTypes.a(50, world); if (entity != null && entity instanceof EntityLiving) { EntityInsentient entityinsentient = (EntityInsentient) entity; entity.setPositionRotation(d0, d1, d2, MathHelper.g(world.random.nextFloat() * 360.0F), 0.0F); entityinsentient.aO = entityinsentient.yaw; entityinsentient.aM = entityinsentient.yaw; entityinsentient.prepare((GroupDataEntity) null); world.addEntity(entity, spawnReason); entityinsentient.r(); } } return entity; } } Et voilà merci d'avoir suivi ce tutoriel et je vous dit à bientôt ! 10/07/2015 21:24 Corrigé et mis en page par Zetsyog 11/07/2015 12:27 Fautes criminelles de convention corrigées par TheShark34
  2. Vanilla

    Hache de Combat -[iNTRODUCTION]- Bonjour à tous ! Dans ce tutoriel, nous allons faire une une hache de combat -[sOMMAIRE]- 1]Création de l'item 2]Création du ItemHacheDeCombat.java 3]Création du EnumHacheDeCombat 3]CraftBukkit 1]Création de l'item la création d'un item c'est pas quelque chose de compliqué il suffis de faire comme ceci : Item.java itemRegistry.addObject(ID, "NOM", (new ItemHacheDeCombat(Item.EnumHacheDeCombat.DIAMOND)).setUnlocalizedName("NOM").setTextureName("NOM_TEXTURE"))); il y a une erreur c'est normal pour le moment Items.java public static final Item NOM = (Item)Item.itemRegistry.getObject("NOM"); 2] Création du ItemHacheDeCombat.java donc comme je fais toujours on part de rien d'un class comme ceci : package votre_package; public class ItemHacheDeCombat { } donc ici on va tout de suite faire un extends de Item, ajouter un public qui va nous diriger vers notre enum un maxStackSize, déclarer notre enum et une durabilité qui sera dans notre enum : package votre_package; public class ItemHacheDeCombat extends Item { private float field_150934_a; private final EnumHacheDeCombat field_150933_b; public ItemHacheDeCombat(Item.EnumHacheDeCombat par1) { this.field_150933_b = par1; // déclaration du enum this.maxStackSize = 1; // stackable pas 1 this.setMaxDamage(par1.getMaxUses()); // durabilité se trouvant dans notre enum this.setCreativeTab(CreativeTabs.tabCombat); // on met notre hache dans le tab Combat du créatif this.field_150934_a = 4.0F + par1.getDamageVsEntity(); } } erreur pour le momentr c'est totalement normal maintenant on va crée quelque public comme l'enchante, une autre déclaration de l'enum si il est réparrable le maxITemUseDuration si l'item est en 3D, quand on casse un bloc si retire de la durabilité parreil pour les entité et faire en sorte que ça casse du bois comme une hache : public float func_150931_i() { return this.field_150933_b.getDamageVsEntity(); // l'item est fais pour tapé des entité } public float func_150893_a(ItemStack par1, Block par2) { Material var3 = par2.getMaterial(); return var3 != Material.wood && var3 != Material.plants && var3 != Material.vine && var3 != Material.field_151572_C ? 1.0F : 1.5F; // l'item peu cassé du bois comme une hache } public boolean hitEntity(ItemStack par1ItemStack, EntityLivingBase par2EntityLivingBase, EntityLivingBase par3EntityLivingBase) // si on tape une entité l'item perd de la durabilité { par1ItemStack.damageItem(1, par3EntityLivingBase); return true; } public boolean onBlockDestroyed(ItemStack par1, World par2, Block par3, int par4, int par5, int par6, EntityLivingBase par7) // si on casse un bloc avec l'item perd de la durabilité { if ((double)par3.getBlockHardness(par2, par4, par5, par6) != 0.0D) { par1.damageItem(2, par7); } return true; } public boolean isFull3D() { return true; } public int getMaxItemUseDuration(ItemStack par1ItemStack) { return 72000; } public int getItemEnchantability() { return this.field_150933_b.getEnchantability(); // l'item est enchantable } public String func_150932_j() { return this.field_150933_b.toString(); // déclaration de notre enum que on fera apres } public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) { return this.field_150933_b.func_150995_f() == par2ItemStack.getItem() ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); // l'item est réparrable } public Multimap getItemAttributeModifiers() { Multimap var1 = super.getItemAttributeModifiers(); var1.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", (double)this.field_150934_a, 0)); return var1; } ce qui nous donne au final : package votre_package; import com.google.common.collect.Multimap; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.EnumAction; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.World; public class ItemHacheDeCombat extends Item { private float field_150934_a; private final EnumHacheDeCombat field_150933_b; public ItemHacheDeCombat(Item.EnumHacheDeCombat par1) { this.field_150933_b = par1; this.maxStackSize = 1; this.setMaxDamage(par1.getMaxUses()); this.setCreativeTab(CreativeTabs.tabCombat); this.field_150934_a = 4.0F + par1.getDamageVsEntity(); } public float func_150931_i() { return this.field_150933_b.getDamageVsEntity(); } public float func_150893_a(ItemStack par1, Block par2) { Material var3 = par2.getMaterial(); return var3 != Material.wood && var3 != Material.plants && var3 != Material.vine && var3 != Material.field_151572_C ? 1.0F : 1.5F; } public boolean hitEntity(ItemStack par1ItemStack, EntityLivingBase par2EntityLivingBase, EntityLivingBase par3EntityLivingBase) { par1ItemStack.damageItem(1, par3EntityLivingBase); return true; } public boolean onBlockDestroyed(ItemStack par1, World par2, Block par3, int par4, int par5, int par6, EntityLivingBase par7) { if ((double)par3.getBlockHardness(par2, par4, par5, par6) != 0.0D) { par1.damageItem(2, par7); } return true; } public boolean isFull3D() { return true; } public int getMaxItemUseDuration(ItemStack par1ItemStack) { return 72000; } public int getItemEnchantability() { return this.field_150933_b.getEnchantability(); } public String func_150932_j() { return this.field_150933_b.toString(); } public boolean getIsRepairable(ItemStack par1ItemStack, ItemStack par2ItemStack) { return this.field_150933_b.func_150995_f() == par2ItemStack.getItem() ? true : super.getIsRepairable(par1ItemStack, par2ItemStack); } public Multimap getItemAttributeModifiers() { Multimap var1 = super.getItemAttributeModifiers(); var1.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", (double)this.field_150934_a, 0)); return var1; } } 3] Création du EnumHacheDeCombat (dans Item.java pour client) donc pour le client l'enum se trouve dans Item tout en bas pour les outils et épée nous allons en crée une donc il suffis de copier et de coller voilà : public static enum EnumHacheDeCombat { WOOD("WOOD", 0, 0, 59, 3.0F, 0.0F, 15), STONE("STONE", 1, 1, 131, 5.0F, 1.0F, 5), IRON("IRON", 2, 2, 250, 7.0F, 2.0F, 14), DIAMOND("DIAMOND", 3, 3, 1561, 8.0F, 2.5F, 10), GOLD("GOLD", 4, 0, 32, 12.0F, 0.0F, 22); private final int harvestLevel; private final int maxUses; private final float efficiencyOnProperMaterial; private final float damageVsEntity; private final int enchantability; private static final Item.EnumHacheDeCombat[] $VALUES = new Item.EnumHacheDeCombat[]{WOOD, STONE, IRON, DIAMOND, GOLD}; private static final String __OBFID = "CL_00000042"; private EnumHacheDeCombat(String par1Str, int par2, int par3, int par4, float par5, float par6, int par7) { this.harvestLevel = par3; this.maxUses = par4; this.efficiencyOnProperMaterial = par5; this.damageVsEntity = par6; this.enchantability = par7; } public int getMaxUses() { return this.maxUses; } public float getEfficiencyOnProperMaterial() { return this.efficiencyOnProperMaterial; } public float getDamageVsEntity() { return this.damageVsEntity; } public int getHarvestLevel() { return this.harvestLevel; } public int getEnchantability() { return this.enchantability; } public Item func_150995_f() { return this == WOOD ? Item.getItemFromBlock(Blocks.planks) : (this == STONE ? Item.getItemFromBlock(Blocks.cobblestone) : (this == GOLD ? Items.gold_ingot : (this == IRON ? Items.iron_ingot : (this == DIAMOND ? Items.diamond : null)))); } } et normalement toutes les erreur devrai disparaître 4]CraftBukkit Item : REGISTRY.a(ID, "NOM", (new ItemHacheDeCombat(EnumHacheDeCombat.DIAMOND)).c("NOM").f("NOM_TEXTURE")); Items : public static final Item NOM = (Item)Item.REGISTRY.a("NOM"); ItemHacheDeCombat.java package net.minecraft.server; import net.minecraft.util.com.google.common.collect.Multimap; public class ItemHacheDeCombat extends Item { private float damage; private final EnumHacheDeCombat b; public ItemHacheDeCombat(EnumHacheDeCombat enumtoolmaterial) { this.b = enumtoolmaterial; this.maxStackSize = 1; this.setMaxDurability(enumtoolmaterial.a()); this.a(CreativeModeTab.j); this.damage = 4.0F + enumtoolmaterial.c(); } public float i() { return this.b.c(); } public float getDestroySpeed(ItemStack itemstack, Block block) { Material material = block.getMaterial(); return material != Material.WOOD && material != Material.PLANT && material != Material.REPLACEABLE_PLANT ? 1.0F : 1.5F; } public boolean a(ItemStack itemstack, EntityLiving entityliving, EntityLiving entityliving1) { itemstack.damage(1, entityliving1); return true; } public boolean a(ItemStack itemstack, World world, Block block, int i, int j, int k, EntityLiving entityliving) { if ((double) block.f(world, i, j, k) != 0.0D) { itemstack.damage(2, entityliving); } return true; } public int d_(ItemStack itemstack) { return 72000; } public int c() { return this.b.e(); } public String j() { return this.b.toString(); } public boolean a(ItemStack itemstack, ItemStack itemstack1) { return this.b.f() == itemstack1.getItem() ? true : super.a(itemstack, itemstack1); } public Multimap k() { Multimap multimap = super.k(); multimap.put(GenericAttributes.e.a(), new AttributeModifier(f, "Weapon modifier", (double) this.damage, 0)); return multimap; } } EnumHacheDeCombat.java package net.minecraft.server; public enum EnumHacheDeCombat { WOOD("WOOD", 0, 0, 59, 3.0F, 0.0F, 15), STONE("STONE", 1, 1, 131, 5.0F, 1.0F, 5), IRON("IRON", 2, 2, 250, 7.0F, 2.0F, 14), DIAMOND("DIAMOND", 3, 3, 1561, 8.0F, 2.5F, 10), GOLD("GOLD", 4, 0, 32, 12.0F, 0.0F, 22); private final int f; private final int g; private final float h; private final float i; private final int j; private static final EnumHacheDeCombat[] k = new EnumHacheDeCombat[] { WOOD, STONE, IRON, DIAMOND, GOLD}; private EnumHacheDeCombat(String s, int i, int j, int k, float f, float f1, int l) { this.f = j; this.g = k; this.h = f; this.i = f1; this.j = l; } public int a() { return this.g; } public float b() { return this.h; } public float c() { return this.i; } public int d() { return this.f; } public int e() { return this.j; } public Item f() { return this == WOOD ? Item.getItemOf(Blocks.WOOD) : (this == STONE ? Item.getItemOf(Blocks.COBBLESTONE) : (this == GOLD ? Items.GOLD_INGOT : (this == IRON ? Items.IRON_INGOT : (this == DIAMOND ? Items.DIAMOND : null)))); } } voilà bon jeu avec vos haches de combats
  3. Créer son propre launcher perso de zéro Cette uvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas dUtilisation Commerciale - Pas de Modification 4.0 International . Tout partage implique que vous citiez l'auteur original. \!/ CE TUTORIEL REQUIRE DES CONNAISSANCE EN JAVA POUR FAIRE VOTRE PROPRE INTERFACE SI VOUS NE L'AVEZ PAS APPRIS, DIRECTION OPEN CLASSROOM \!/ -[INTRODUCTION]- CE TUTORIEL N'EST PLUS A JOUR, IL FAUT SUIVRE LES TUTORIAUX VIDEOS ICI : http://forum.ironcraft.fr/topic/6738-videos-forgevanilla-1-créer-son-launcher-minecraft-de-zéro-entièrement-personalisé/ Salut tout le monde ! Voila un tutoriel qui va être surement fort utile a la communauté, un tutoriel pour créer a partir de rien, son launcher Minecraft personnalisé, pour toute version, et avec compatibilité forge. Ce tutoriel regroupe en fait trois librairies crées de zéro par moi-même ! - OpenAuth pour l'authentification, par Moi-Même - S-Update pour la mise a jour, par Moi-Même - OpenLauncherLib pour le lancement du jeu et un peu l'authentification, par Moi-Même -[SOMMAIRE]- 1] Préparation 2] Création d'une fenêtre de base simple 3] Authentification (OpenAuth) 4] Mise à jour (S-Update) A] Partie Java B] Partie Cloud (Les packs pré-faits sont ici !) C] La Progress Bar 5] Lancement du jeu (OpenLauncherLib) 6] Features en plus A] Créer un bootstrap simple et rapide B] Créer son pack avec n'importe quelle version forge/vanilla C] Sauvegarder le pseudo du joueur D] Faire en sorte de pouvoir bouger la fenêtre en cliquant dessus 7] Exporter son launcher A] En .JAR B] En .EXE C] En .APP 1] Préparation Dans cette partie nous allons préparer le projet avec les librairies et tous le tralala... Spoiler Commencez par télécharger les quatres librairies via ces liens : OpenAuth - Adf.ly (Me supporter) OpenAuth - Direct S-Update - Adf.ly (Me supporter) S-Update - Direct OpenLauncherLib - Adf.ly (Me supporter) OpenLauncherLib - Direct Gson (Par Google, utilisé par OpenAuth) Maintenant ouvrez eclipse et créez un nouveau projet, appelez le comme vous voulez Faites clique droit sur le projet --> Build Path. --> Add External Archives et ajoutez tous les jars obtenus Spoiler Ok maintenant on va préparer l'OpenLauncherLib avec trois constantes. L'objet GameVersion L'objet GameVersion contient les informations à propos de la version de Minecraft. Le nom précis de la version, et le type de la version. Vous avez le choix entre 3 types de version, 1.7.2 ou moins, 1.7.10, et 1.8 ou plus. Créons une classe apelée Launcher. C'est là qu'on rangera tout ce qui n'a pas de rapport avec l'interface. Créons donc notre objet GameVersion : public class Launcher { public static final GameVersion LC_VERSION = new GameVersion("nomdelaversion", "typedelaversion"); } Je l'ai appelée LC_VERSION, LC est l'abréviation de LaunCher, je vous conseille de faire pareil avec le nom de votre serveur, par exemple si votre serveur s'appelle PimpFaction, appeler votre variable PF_VERSION. Après c'est comme vous voulez ^^. Je l'ai mis final donc il faut mettre le nom de la variable en majuscule car c'est la convention ! Pour le premier argument mettez votre version précise (c'est important pour les assets). Par exemple "1.7.10", ou "1.8.3", etc... Pour le deuxieme argument, si votre version est inférieure ou égale à la 1.7.2, mettez GameType.V1_7_2_LOWER. Si votre version est la 1.7.10 mettez GameType.V1_7_10. Si votre version est supérieure ou égale à la 1.8 mettez GameType.V1_8_HIGHER. Si votre version est 1.5.2 ou en dessous, mettez GameType.V1_5_2_LOWER. Par exemple pour un serveur en 1.7.10 mettez : public static final GameVersion LC_VERSION = new GameVersion("1.7.10", GameType.V1_7_10); Pour un serveur en 1.6.4 mettez : public static final GameVersion LC_VERSION = new GameVersion("1.6.4", GameType.V1_7_2_LOWER); Pour un serveur en 1.4.7 mettez public static final GameVersion LC_VERSION = new GameVerison("1.4.7", GameType.V1_5_2_LOWER); L'objet GameInfos L'objet GameInfos contient les informations de Minecraft. Il contient le nom du serveur, votre objet GameVersion, et si forge est activé ou non. Créez donc votre objet GameInfos comme ceci (en dessous de LC_VERSION) : public static final GameInfos LC_INFOS = new GameInfos("NomDuServeur", ObjetGameVersion, tweaksActiveOuNon, tweaks); Remplacez NomDuServeur par le nom de votre serveur par exemple "PimpFaction", remplacez votre ObjetGameVersion pour votre objet GameVersion créé plus haut par exemple LC_VERSION, remplacez tweaks par si vous utilisez des tweaks où non (mettez true si vous êtes en 1.6.4 ou plus et que vous voulez forge, ou en 1.6.4 ou plus et que vous êtes en Vanilla avec Optifine et/ou Shader). Ensuite remplacez tweaks, par si vous avez mis false dans tweaksActiveOuNon mettez new GameTweak[] {} (pas de tweak), après si vous êtes en Forge fous mettez new GameTweak[] {GameTweak.FORGE}, mais si vous êtes en Vanilla, si vous voulez Shader mettez new GameTweak[] {GameTweak.SHADER}, et si vous voulez optifine mettez new GameTweak[] {GameTweak.OPTIFINE}, et si vous voulez les deux, mettez new GameTweak[] {GameTweak.OPTIFINE, GameTweak.SHADER}. Par exemple pour un serveur s'appelant PimpFaction en forge utilisant l'objet GameVersion créé plus haut : public static final GameInfos LC_INFOS = new GameInfos("PimpFaction", LC_VERSION, true, new GameTweak[] {GameTweak.FORGE}); Le dossier de jeu Votre dossier de jeu est généré automatiquement par votre objet GameInfos, c'est génial non ? Il est dans AppData pour Windows, Application Support pour MAC, etc... Je vous conseil de stocker le dossier de jeu dans une variable pour pouvoir y acceder plus rapidement plus tard. Par exemple (en dessous de LC_INFOS) : public static final File LC_DIR = LC_INFOS.getGameDir(); Sinon utilisez tout simplement Launcher.LC_INFOS.getGameDir() à chaque fois 2] Création d'une fenêtre de base simple Spoiler Bon, je vais faire très simple, mais pas moche pour autant, parce que je suis maniaque. Je m'attarde pas trop sur le code, c'est juste a titre d'exemple. Créez une classe appelée LauncherFrame, elle contiendra le code de la fenêtre. Spoiler public class LauncherFrame extends JFrame implements ActionListener { private static LauncherFrame instance; private JLabel titre; private JTextField pseudo; private JPasswordField mdp; private JButton jouer; private JProgressBar pb; private String username = null; private String accessToken = null; private String id = null; public LauncherFrame() { this.setTitle("Mon Launcher Style"); this.setSize(850, 500); this.setUndecorated(true); this.setDefaultCloseOperation(EXIT_ON_CLOSE); this.setLocationRelativeTo(null); this.setLayout(null); this.getContentPane().setBackground(new Color(64, 64, 64)); titre = new JLabel("Mon Launcher Style", SwingConstants.CENTER); titre.setForeground(Color.WHITE); titre.setFont(titre.getFont().deriveFont(60f)); titre.setBounds(0, 20, 850, 100); this.add(titre); pseudo = new JTextField("Pseudo"); pseudo.setBounds(350, 275, 150, 20); this.add(pseudo); mdp = new JPasswordField("Mot de Passe"); mdp.setBounds(350, 305, 150, 20); this.add(mdp); jouer = new JButton("Jouer !"); // Enregistre la fenetre entant qu'ActionListener jouer.addActionListener(this); jouer.setBounds(350, 335, 150, 20); this.add(jouer); pb = new JProgressBar(); pb.setStringPainted(true); pb.setBounds(0, 480, 850, 20); this.add(pb); this.setVisible(true); } @Override public void actionPerformed(ActionEvent e) { Thread t = new Thread() { @Override public void run() { // Ici on appellera les methodes de la class Launcher } }; t.start(); } public static void main(String[] args) { // Astuce pour avoir le style visuel du systeme hôte try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { e.printStackTrace(); } instance = new LauncherFrame(); } // Retourne l'instance de LauncherFrame public static LauncherFrame getInstance() { return instance; } // Retourne l'instance de notre progress bar public JProgressBar getProgressBar() { return pb; } } N'oubliez pas CTRL + SHIFT + O pour les imports Au final ce joli code rend comme ça : Spoiler 3] Authentification (OpenAuth) Spoiler Bon, commençons par remplir notre méthode run() du thread de actionPerformed() dans LauncherFrame // On empeche l'utilisateur de modifier son pseudo/mot de passe ou de reappuyer sur jouer pseudo.setEnabled(false); mdp.setEnabled(false); jouer.setEnabled(false); // On s'authentifie dans un try catch try { Launcher.auth(pseudo.getText(), new String(mdp.getPassword())); } catch (AuthenticationException e) { // Si ça n'a pas marché on réactive tout pseudo.setEnabled(true); mdp.setEnabled(true); jouer.setEnabled(true); // On affiche l'erreur e.printStackTrace(); // Et on affiche un message d'erreur JOptionPane.showMessageDialog(LauncherFrame.this, "Impossible de se connecter : " + e.getErrorModel().getErrorMessage(), "Erreur", JOptionPane.ERROR_MESSAGE); } Et dans notre class Launcher : private static AuthInfos authInfos; public static void auth(String username, String password) throws AuthenticationException { } L'objet AuthInfos nous permettra de stocker les informations reçues. Et dans auth(), on authentifie le joueur. Authenticator authenticator = new Authenticator(Authenticator.MOJANG_AUTH_URL, AuthPoints.NORMAL_AUTH_POINTS); AuthResponse rep = authenticator.authenticate( AuthAgent.MINECRAFT, username, password, ""); authInfos = new AuthInfos(rep.getSelectedProfile().getName(), rep.getAccessToken(), rep.getSelectedProfile().getId()); 4] Mise à jour (S-Update) Donc, dans cette partie nous allons nous attaquer a la partie mise à jour, je vais devoir faire un mini tuto sur comment utiliser S-Update, mais vous allez voir, c'est simplissime. A] Partie Java Spoiler Tous d'abord créons une fonction vide dans Launcher : public static void update() throws IOException { } Puis appelons la dans LauncherFrame dans notre méthode run() de actionPerformed() dans LauncherFrame, après Launcher.auth(), toujours dans le try catch, appelons notre méthode. pb.setString("Verification des mises à jours"); Launcher.update(); Et rajoutez un autre bloc catch après l'autre comme ceci : catch (IOException e) { // Affichage d'un message d'erreur JOptionPane.showMessageDialog(null, "Impossible de mettre a jour mon serveur ! : " + e, "Erreur !", JOptionPane.ERROR_MESSAGE); // On reactive tout pseudo.setEnabled(true); mdp.setEnabled(true); jouer.setEnabled(true); // On affiche l'erreur e.printStackTrace(); } Ensuite initialisons notre objet SUpdate dans la méthode update() qu'on viens de créer : final SUpdate su = new SUpdate("http://monsitestyle.fr/fichiersserveur/", LC_DIR); puis mettons à jour ! LauncherFrame.getInstance().getProgressBar().setString("Mise à jour..."); su.update(); C'est tout pour la partie code ! B] Partie cloud (Les packs pré-faits sont ici !) Spoiler Alors la partie cloud, très courte et très simple depuis S-Update 2 ! Tout d'abord téléchargez l'installateur (installer.php) ici : https://github.com/TheShark34/S-Update-Server/ (si vous ne pouvez pas le télécharger, téléchargez les sources en .zip et prenez juste installer.php). Ensuite sur votre FTP créez ou allez dans un dossier ou sera le serveur S-Update. Mettez-y le fichier installer.php. Ensuite depuis votre navigateur allez sur le fichier installer.php, vous devrez apercevoir le logo S-Update et une barre de chargement (très rapide). Et vous devriez tout d'un coup voir la page de configuration. La page de configuration permet de configurer un pseudo et un mot de passe pour accéder ensuite aux pages protégés dans le dossier protected/. Et l'URL de redirection est là où seront redirigés ceux qui iront sur la page du serveur. Quand vous avez fini cliquer sur le bouton =) Ensuite, vous accédez alors à l'accueil de S-Update (le dossier protected/) après avoir entré votre pseudo mot de passe. Donc voilà c'est bon ! Tout est configuré ! Sur cette page vous voyez le nombre total de connexion et les 5 dernières connexions en détail. Vous pouvez cliquer sur le bouton Configurer pour changer le mot de passe/pseudo/l'url de redirection. Vous avez maintenant juste a mettre les fichiers dans le dossier files/ du dossier de votre serveur sur votre FTP, et vous rendre dans la page d'indexage accessible depuis la page d'acceuil administrateur quand vous avez fini pour appliquer les changements ! Et pour mettre à jour les fichiers, juste changez les dans le dossier files/, et re-allez sur la page d'indexage =). Aussi vous pouvez mettre des zips dans le dossier zips ! Mettez les dans le dossier où ils devraient être extraits, mais attention, ce dossier sera automatiquement ignoré à la vérification ! Voici des packs préfaits à mettre dézipper directement dans le dossier de votre serveur 1.7.10 1.7.10-forge D'autres versions arrivent bientôt =) Si vous avez des packs qui marchent dites-le moi ! C] La Progress Bar Spoiler C'est super simple. Avant su.update(); Créez un nouveau thread qui tourne en boucle et change la barre : Thread t = new Thread() { public void run() { while (true) { LauncherFrame.getInstance().getProgressBar().setMaximum(su.getNumberOfFilesToDownload()); LauncherFrame.getInstance().getProgressBar().setValue(Downloader.getTotalDownloaded()); } } }; t.start(); 5] Lancement du jeu (OpenLauncherLib) Spoiler Commencons par créer une nouvelle méthode launch dans notre class Launcher : public static void launch() { } Pour l'appeler, toujours dans le try catch de notre action listener, après Launcher.update();, mettez : Launcher.launch(); Donc dans notre méthode commencons par créer un objet GameLauncher : GameLauncher gameLauncher = new GameLauncher(ObjetGameInfos, TypeDeGameFolder, authInfos); Remplacez ObjetGameInfos par l'objet GameInfos créé dans la partie 1], TypeDeGameFolder par le type d'organisation de votre dossier (si vous avez pris un pack préfait ou avez suivit le tutoriel de création de pack prenez GameFolder.BASIC). Et en dernier notre objet AuthInfos. Si vous voulez rajouter des arguments JVM (comme -Xms / -Xmx) rajoutez un tableau de String en dernier argument ! Par exemple, avec des arguments JVM -Xms512M et -Xmx1024M, les objets créés plus haut, et une organisation de dossier basique : GameLauncher gameLauncher = new GameLauncher(LC_INFOS, GameFolder.BASIC, authInfos, new String[] {"-Xms512M", "-Xmx1024M"}); Ensuite juste à lancer le jeu ! try { Process p = gameLauncher.launch(); Thread.sleep(5000L); LauncherFrame.getInstance().setVisible(false); p.waitFor(); System.exit(0); } catch (IOException e) { e.printStackTrace(); JOptionPane.showMessageDialog(LauncherFrame.getInstance(), "Impossible de lancer mon serveur ! : " + e, "Erreur", JOptionPane.ERROR_MESSAGE); System.exit(1); } catch (InterruptedException e) { System.exit(0); } ALORS ! Explication : D'abord on run tout dans un try catch. Déjà je lance le jeu et je récupère le processus créé. (1ère ligne : Process p = gameLauncher.launch() . Ensuite j'attends 5 secondes le temps que la fenêtre du jeu s'affiche (2ème ligne : Thread.sleep(5000L) . Ensuite je ferme notre fenêtre de launcher (3ème ligne : LauncherFrame.getInstance().setVisible(false)). J'attends que le processus se termine (4ème ligne : p.waitFor()). Et je quitte manuellement pour être sur que le launcher ne reste pas ouvert (5ème ligne : System.exit(0)). Ensuite dans le catch IOException J'affiche l'erreur (1ère ligne : e.printStackTrace)). J'affiche un message d'erreur (2ème ligne : JoptionPane.showMessageDialog(...)). Et je quitte (3ème ligne : System.exit(1)). Et le dernier catch arrive quand on a pas pu attendre que le processus se soit terminé ou juste pas pu attendre 5 secondes, donc ce n'est pas grave, on quitte juste pour être sur que le launcher ne reste pas ouvert. Voilà ! 6] Features en plus Votre launcher est beau, fonctionnel, mais basique. Voilà une liste de features à ajouter a votre launcher ! Proposez-moi en d'autre ! Cette liste s'embellit constament ! A] Créer un bootstrap simple et rapide Spoiler Donc, pour ceux qui ne savent pas, un bootstrap est un mini programme qui mettera à jour le launcher. C'est un autre programme séparé du launcher, il va télécharger et lancer le launcher. C'est un launcher de launcher, et c'est lui que vous distriburrez publiquement et non votre launcher. Il vous permettera de mettre à jour votre launcher en case de besoins, y compris les librairies car je sort régulièrement des mises à jour, c'est donc fortement conseillé, mais on peut s'en passer. Donc commencez par créer un nouveau projet sur Eclipse. Ajoutez y l'OpenLauncherLib et S-Update. Ensuite créez une nouvelle class, ici on va l'appeler MyBootstrap. (Ne l'appelez pas Bootstrap ou ça va vous faire chier avec l'OpenLauncherLib). Créez une méthode main simple qui lance la méthode start ok ? public class MyBootstrap { public static void main(String[] args) { MyBootstrap myBootstrap = new MyBootstrap(); myBootstrap.start(); } public void start() { } } D'abord déclarez 3 variables en haut de votre classes : private File launcherHome = new File(GameDir.createGameDir("nom_du_serveur"), "Launcher"); private SplashScreen splash; private ErrorUtil errorUtil; Le première sera le dossier ou sera sauvegardé le launcher et tout ça, remplacez nom_du_serveur par le nom de votre serveur, ca generera le dossier .nom_du_serveur dans AppData La deuxième sera notre splash. Et la troisième sera notre instance d'ErrorUtil permettant d'écrire dans un crash report et d'afficher un message d'erreur en une ligne ! Merci l'OpenLauncherLib ! Donc maintenant dans notre méthode start, commençons par initialiser notre objet ErrorUtil (permet d'attraper les erreurs pour faire des crash reports) : errorUtil = new ErrorUtil(launcherHome); Ensuite après, créons notre splash screen et affichons le ! try { splash = new SplashScreen("NomDeVotreServeur", ImageIO.read(getClass().getResourceAsStream("VOTREIMAGEDESPLASH.png"))); } catch (IOException e) { // Ne peut normalement pas arriver errorUtil.catchError(e, "L'image du splash n'existe pas !"); } splash.setVisible(true); Remplacez biensur VOTREIMAGEDESPLASH par le nom de votre image de splash, elle devra être a coté de votre classe !, et NomDeVotreServeur par le nom de votre serveur ! Si vous lancez vous verrez un joli splash apparaître normalement ! Ensuite après, passons à la mise à jour du launcher. Comme d'hab, merci S-Update ! SUpdate su = new SUpdate("http://monurldemiseajourdeBOOTSTRAP/", launcherHome); try { su.update(); } catch (IOException e) { errorUtil.catchError(e, "Impossible de mettre à jour le launcher !"); } Remplacez biensur l'url pas l'url d'un dossier (PAS LE MME QUE CELUI DU LAUNCHER) (créez un nouveau serveur S-Update) ou on mettera les fichiers de mises à jour. Ensuite donc, passons au lancement du launcher ! Grace à l'OpenLauncherLib c'est hyper simple ! LauncherClasspath launcherClasspath = new LauncherClasspath(new File(launcherHome, "launcher.jar"), new File(launcherHome, "Libs/")); LauncherInfos launcherInfos = new LauncherInfos("NOMDUSERVEUR", "CLASSEPRINCIPALEDULAUNCHER"); Bootstrap bootstrap = new Bootstrap(launcherClasspath, launcherInfos); try { Process p = bootstrap.launch(); Thread.sleep(1000L); splash.setVisible(false); p.waitFor(); } catch (IOException e) { errorUtil.catchError(e, "Impossible de lancer le launcher !"); } catch (InterruptedException e) { } System.exit(0); Remplacez biensur NOMDUSERVEUR par le nom de votre Serveur, et CLASSEPRINCIPALEDULAUNCHER par la classe principale de votre launcher. Comment former une classe principale ? Prenez le package ou est la classe qui contient la méthode main(String[] args) (dans le tuto LauncherFrame) et rajoutez le nom de la classe. Par exemple la classe LauncherFrame dans le package fr.pimpfaction.launcher donc on marquera fr.pimpfaction.launcher.LauncherFrame EXPLICATIONS ! 1. Création de l'objet LauncherClasspath contenant le fichier du launcher et le dossier des libs 2. Création de l'objet LauncherInfos qui contient le nom du serveur et la classe principale du launcher 3. Création de l'objet Bootstrap qui contient nos deux objets et qui lancera le jeux ! Dans le try 1. On lance le launcher et récupère le process 2. On attends un peu car sinon ce serait trop rapide et on ne verrait pas le splash 3. On ferme le splash 4. On attends la fin du process Dans le catch on demande a ErrorUtil de gérer l'erreur Et a la fin on quitte manuellement pour être sur que le Bootstrap ne reste pas lancé ! Voilà le code final ! public class MyBootstrap { private File launcherHome = new File(GameDir.createGameDir("nom_du_serveur"), "Launcher"); private SplashScreen splash; private ErrorUtil errorUtil; public static void main(String[] args) { MyBootstrap bootstrap = new MyBootstrap(); bootstrap.start(); } public void start() { errorUtil = new ErrorUtil(launcherHome); try { splash = new SplashScreen("MONSERVEUR", ImageIO.read(MyBootstrap.class.getResourceAsStream("MONIMAGEDESPLASH"))); } catch (IOException e) { } splash.setVisible(true); SUpdate su = new SUpdate("http://monurldemiseajourdeBOOTSTRAP/", launcherHome); try { su.update(); } catch (IOException e) { errorUtil.catchError(e, "Impossible de mettre à jour le launcher !"); } LauncherClasspath launcherClasspath = new LauncherClasspath(new File(launcherHome, "launcher.jar"), new File(launcherHome, "Libs/")); LauncherInfos launcherInfos = new LauncherInfos("MONSERVEUR", "CLASSEPRINCIPALEDULAUNCHER"); Bootstrap bootstrap = new Bootstrap(launcherClasspath, launcherInfos); try { Process p = bootstrap.launch(); Thread.sleep(1000L); splash.setVisible(false); p.waitFor(); } catch (IOException e) { errorUtil.catchError(e, "Impossible de lancer le launcher !"); } catch (InterruptedException e) { } System.exit(0); } Voila =) Simple non ? Merci l'OpenLauncherLib ! Maintenant comment organiser le dossier de mise a jour du bootstrap ? Dans le dossier (donc sur votre FTP). Faite comme dans la partie 4] pour créer votre serveur S-Update (UTILISEZ UN AUTRE QUE CELUI DU LAUNCHER). Et mettez-y vos librairies et votre launcher. Voilà ! B] Créer son pack avec n'importe quelle version forge/vanilla Spoiler Pour créer votre pack ce n'est pas compliqué. Le truc c'est que dans votre .minecraft officiel les versions sont entrelacées. Alors supprimez votre .minecraft officiel (faites une sauvegarde si vous voulez) et avec le launcher officiel téléchargez la version souhaitez. Ensuite si vous voulez Forge pour votre pack, téléchargez forge depuis leur site (http://files.minecraftforge.net/) et installez le, ensuite LANCEZ MINECRAFT CEST TRS IMPORTANT Maintenant dans votre .minecraft copiez tous les dossiers dans un autre dossier, maintenant on va travailler dans ce dossier. Dans ce dossier prenez le fichier versions/<votreversion>/<votreversion>.jar et mettez le a la racine du dossier. Appelez le minecraft.jar Ensuite supprimez le dossier versions/ et resourcepacks/. Maintenant dans le dossier librairies, cherchez dans la barre de recherche *.jar. Prenez tous les fichiers .jar (pas les .jar.sha) et copiez les dans un dossier libs/ qui sera a la racine du dossier de base. Supprimez le dossier librairies/ Téléchargez les natives ici : http://dl.dropbox.com/u/31232797/mcnatives.zip Mettez tout ce qu'il contient dans un dossier natives/ dans votre pack. Maintenant, zippez ce que contient le dossier assets/ dans un fichier zip (osef du nom), et laissez ce zip dans le dossier assets. Maintenant déplacez le dossier assets dans un dossier zips/ qui lui est à côté et non pas dans le dossier files/ Voilà vous devriez avoir un dossier zips avec un dossier assets contenant un fichier assets.zip (mais vous pouvez changez son nom), un dossier files/ avec : un dossier libs/ (avec juste des .jar), un dossier natives/ et un fichier minecraft.jar. Si vous voulez shader/optifine, mettez la lib dans le dossier libs Mettez tous ça dans le dossier de votre serveur S-Update et c'est bon =). C] Sauvegarder le pseudo du joueur Spoiler Dans cette partie, nous allons juste sauvegarder le pseudo de la personne qui se connecte, pour pouvoir le remettre lorsque qu'il relance le launcher. Créons donc un objet UsernameSaver au début de LauncherFrame : private UsernameSaver usernameSaver = new UsernameSaver(VotreObjetGameInfos); Biensur remplacez VotreObjetGameInfos par votre objet GameInfos, par exemple : private UsernameSaver usernameSaver = new UsernameSaver(Launcher.LC_INFOS); Ensuite, dans le constructeur, vous voyez pseudo = new JTextField("Pseudo"); ? Remplacez le par ça : pseudo = new JTextField(usernameSaver.getUsername("Pseudo")); Le "Pseudo" qu'on lui donne est la valeur par défault retournée si le fichier n'existe pas ! Pour enregistrer le pseudo, dans actionPerformed au tout début, vous avez juste à mettre ça : usernameSaver.setUsername(pseudo.getText()); Voilà ! Simple non =) ? D] Faire en sorte de pouvoir bouger la fenêtre en cliquant dessus Spoiler Si vous avez enlevé les bordures de votre fenêtre (fenetre.setUndecorated(true)) vous avez du voir que vous ne pouvez plus la bouger. On va remedier à ca en faisant en sorte que lorsqu'on reste cliqué sur la fenêtre et qu'on bouge la souris, çela bouge aussi la fenêtre. Depuis l'OpenLauncherLib 2 c'est super simple ! Vous avez juste à rajouter ça dans le constructeur de la classe votre fenêtre (LauncherFrame). (Plutot vers la fin). WindowMover mover = new WindowMover(this); this.addMouseListener(mover); this.addMouseMotionListener(mover); Et voilà ! Vous devriez être capable de bouger votre fenêtre en restant cliqué dessus ! 7] Exporter son launcher A] En JAR Spoiler Lisez cette partie attentivement. Bon, c'est une petite partie, mais la plus importante. Dans cette partie nous allons considérer que vous avez éclipse, sinon c'est que vous n'êtes pas un débutant, donc vous comprendrez cette partie quand même . Don faite clique droit sur le projet de votre Bootstrap si vous en avez créé un, ou Launcher sinon, Export --> Java --> Runnable Jar File. Dans Launch Configuration, choisissez l'entrée qui s'appelle : NomDuProjet - NomDeLaMainClass Si vous ne la voyez pas, elle est créé quand vous lancez votre Launcher/Bootstrap pour la première fois. Ensuite si vous avez un boostrap, cochez absolument "Copy required libraries in a sub-folder next to the jar" au lieu de "Extract required libraries into the jar" POUR LE LAUNCHER, et "Extract required libraries into the jar" POUR LE BOOTSTRAP. Un dossier NomDeVotreProjet_lib se crééra, ignorez le. Sinon, cochez "Extract required libraries into the jar" si vous avez un launcher seul, c'est très important ! Et vous pouvez exporter votre launcher ! Voilà vous avez un .jar ! Maintenant, on va faire comme les pros: Créér un .exe pour Windows, et même, un .app pour Mac ! (Si vous avez un Bootstrap c'est lui que vous devez transformer !) B] En .EXE Spoiler Commencez par télécharger Launch4J à cette adresse : http://sourceforge.net/projects/launch4j/files/launch4j-3/3.7/ Ensuite, lancez le. Dans Output File, mettez la déstination du .exe, n'oubliez pas .exe à la fin ! Dans Jar, mettez votre .JAR généré plus haut. Dans icon vous pouvez mettre l'icon de votre programme en format .ico (Pour convertir : http://iconverticons.com/online/) Ensuite allez dans l'onglet JRE et mettez dans Min JRE version 1.6.0 si votre launcher a été compilé avec Java 6, 1.7.0 avec Java 7 etc... Pour savoir, clique droit sur votre projet eclipse --> Properties --> Java Compiler. C'est la version minimum que devra avoir l'utilisateur qui lance votre programme. Je vous conseil très fortemment de prendre Java 6. Même si vous avez Java 8 installé ça marchera si vous changez les paramètres dans eclipse. Voilà ensuite appuyez sur l'écrou en haut et c'est bon ! Si vous voulez sauvegardé votre configuration, appuyez sur la disquette. Vous n'aurez qu'a la restaurer en appuyant sur le dossier après. C] En .APP Spoiler Commencez par télécharger SharkBundler (c'est un logiciel fait par moi ) : Windows : Adf.ly (Me Supporter) - Direct MAC : Adf.ly (Me Supporter) - Direct Autre : Adf.ly (Me Supporter) - Direct Ensuite, dans Jar File mettez votre fichier .JAR généré plus haut. Dans Output mettez le .app a généré (n'oubliez pas le .app à la fin !) (ne vous inquiétez pas les .app sont des dossiers) Dans Icon mettez l'icone si vous voulez au format .icns (Pour convertir : http://iconverticons.com/online/) Dans Minor Java Ver mettez la version de Java de votre programme. Si votre launcher a été compilé avec Java 6, marquez 6, ou 7 avec Java 7 etc... Pour savoir, clique droit sur votre projet eclipse --> Properties --> Java Compiler. C'est la version minimum que devra avoir l'utilisateur qui lance votre programme. Je vous conseil très fortemment de prendre Java 6. Même si vous avez Java 8 installé ça marchera si vous changez les paramètres dans eclipse. Ensuite dans Main Class mettez le package de votre classe principale suivit du nom de la classe. Par exemple si la classe de votre programme qui contient la methode public static void main s'appelle ClassPrincipale et se trouve dans le package fr.theshark34.coolcraft. Mettez fr.theshark34.coolcraft.ClassPrincipale. Ensuite dans App Name mettez le nom de votre Launcher. Et voilà appuyez sur Bundle et c'est bon ! Vous pouvez aussi sauvegarder votre configuration pour la sauvegarder plus tard. Voilà, c'est la fin de ce tutoriel, merci de l'avoir lu ! N'hésitez pas à créer un sujet dans la partie support si vous avez un problème, je me ferais un plaisir d'y repondre !
  4. Créer une nouvelle Armure ! -[iNTRODUCTION]- Dans ce tutoriel nous allons voir comment créé de nouvelles armures ! -[PR-REQUIS]- Un MCP décompilé en 1.7 ! Un Spigot en 1.7 ! -[sOMMAIRE]- 1]Côté MCP -Client- 2]Côté Spigot -Serveur- 1]MCP -Client- Pour commencer, nous allons ouvrir la class Item.java ( elle se trouve dans net.minecraft.item ) ! Allez à la ligne 268 qui dois ressembler à sa ! itemRegistry.addObject(2267, "record_wait", (new ItemRecord("wait")).setUnlocalizedName("record").setTextureName("record_wait")); On vas décomposer un peu les informations ! 2267 est l'ID de l'Item "record_wait" est le nom de que l'on donne à l'item ( pas dans le jeu seulement dans Eclipse ) .setUnlocalizedName("record") est le nom de l'item en jeu ! ( Il s'appelleras en vérité name.record.item ) ! .setTextureName("record_wait") est le nom que vous avez donnez à la textures ! Voilà ! A présent allez à la ligne et déclarons nos pièce d'armure en utilisant se format là : itemRegistry.addObject(ID, "a_helmet", (new ItemArmor(ItemArmor.ArmorMaterial.NOMDEVOTREMATERIAL, 5, 0)).setUnlocalizedName("a_helmet").setTextureName("a_helmet")); Nous allons nous pencher sur cette partie là ! (new ItemArmor(ItemArmor.ArmorMaterial.NOMDEVOTREMATERIAL, 5, 0)) On peut la décomposer ainsi ! NOMDEVOTREMATERIAL est le nom du material utilisé ! 5 est l'ID de votre Materiaux ! 0 correspond à la pièce d'armure qu'esr votre item ( 0=casque, 1=plastron, 2=jambière, 3=bottes ) ! Donc comme vous le savez il faut 4 pièces d'armures dans Minecraft ! Il vas encore falloir créé 3 items en adaptant les valeurs que l'ont viens de voir Vous aurez automatiquement une erreur sur le "NOMDEVOTREMATERIAL" c'est normal nous n'avons pas encore déclarer de matériaux nous y viendrons ! Maintenant que nous avons déclarer nos petites pièces d'armures nous pouvons ouvrir la class Items.java ( net.minecraft.init ) ! Nous allons redéclarer nos belles pièces d'armures dedans ! public static final ItemArmor a_helmet = (ItemArmor)Item.itemRegistry.getObject("a_helmet"); public static final ItemArmor a_chestplate = (ItemArmor)Item.itemRegistry.getObject("a_chestplate"); public static final ItemArmor a_leggings = (ItemArmor)Item.itemRegistry.getObject("a_leggings"); public static final ItemArmor a_boots = (ItemArmor)Item.itemRegistry.getObject("a_boots"); Là on déclare nos armures pour pouvoir les utiliser partout dans Eclipse ( grâce au "public" qui nous permet de les rappellez partout ) ! Maintenant nous allons déclarer la résistance, l'enchantabilité, ect.. De l'armure ! Ouvrez la class ItemArmor.java ! Cherchez la partie qui ressemble à sa ! ( Elle se trouve vers la fin ) ! C'est se qui permet de gérer toutes les caractéristiques de l'armure ! CLOTH("CLOTH", 0, 5, new int[]{1, 3, 2, 1}, 15), CHAIN("CHAIN", 1, 15, new int[]{2, 5, 4, 1}, 12), IRON("IRON", 2, 15, new int[]{2, 6, 5, 2}, 9), GOLD("GOLD", 3, 7, new int[]{2, 5, 3, 1}, 25), DIAMOND("DIAMOND", 4, 33, new int[]{3, 8, 6, 3}, 10); On peut le décomposer ainsi : 0 est L'ID du materiaux donc je parler plus tôt ! 5 la durabilité de l'amure ! {1, 3, 2, 1} correspond au nombre de demi armures que sa vous ajouterais (1=Casque, 3=Plastron, 2=Jambière, 1=Bottes) ! 15 est le niveau d'enchantabilité ( plus il est haut plus on auras de chance d'avoir de bon enchantement ! Maintenant nous allons créé notre propre matériaux en utilisant les données vu juste au dessus Un exemple ! A("A", 5, 50, new int[] {3, 8, 6, 3}, 10); // A=Nom, A=Nom, 5=ID du Material, {3, 8, 6, 3}=Protection, 10=Enchantabilité On le place sous DIAMOND ! Et on ramplace le ;de DIAMOND par une, !! Voilà notre matérial est créé ! N'oubliez pas d'allez mettre le nom de votre material dans vos Item créé dans la class Item.java Astuce ( merci a Riikog pour les valeurs ) : Il peut vous arriver d'avoir un bugg que votre armure vous rend invinsible ! Voici des valeurs optimiser qui outre passe se bugg : A("A", 5, 50, new int[] { 3, 8, 6, 3 }, 10), B("B", 6, 55, new int[] { 4, 8, 6, 3 }, 10), C("C", 7, 60, new int[] { 4, 9, 6, 3 }, 10), D("D", 8, 65, new int[] { 4, 9, 7, 3 }, 10); Vous pouvez tester votre armure mais elle n'auras pas de texture quand vous l'aurez enfilez ! Pour sa rien de plus simple ! Prennez vos textures de models d'armures et vous les renommez ainsi : nomduminerais_layer_1 pour celui avec le casque, plastron, bottes et nomduminerais_layer_2 pour celui avec les jambières ! Ensuite ouvrez la class RenderBiped.java ! ( Dans net.minecraft.client.renderer.entity ) A la ligne : private static final String[] bipedArmorFilenamePrefix = new String[] {"leather", "chainmail", "iron", "diamond", "gold"}; Ajoutez un virgule après "gold" et mettez y le nom de vos layer ( a_layer_1 je met "a" ) En gros ce morceaux de code marche en regardant la valeur donnée et en cherchant des les textures dans le dossier assets/minecraft/textures/models/armor/x_layer_1/ Maintenant vous allez me demander pour mettre vos textures dans le projet Eclipse ! Vous allez dans votre dossier qui contient le mcp, allez dans le dossiers "jars", puis "versions", la vous ouvrez votre version.jar avec WinRaR et suivez les routes ci-dessous pour les différentes textures ! Ajoutez dans textures d'items ( dans l'inventaire ) c'est assets/minecraft/textures/item Ajoutez des textures pour un model ( rendu en F5 ) c'estassets/minecraft/textures/models/armor/x_layer_1/ Voila pour la partie MCP ! 1]Spigot -Serveur- [En cours d'écriture]
  5. Vanilla

    Merci à chaos90 pour son aide par rapport à ce tutoriel! ArmorHUD en Vanilla Cette uvre est mise à disposition selon les termes de laLicence Creative Commons Attribution - Pas dUtilisation Commerciale - Pas de Modification 3.0 non transposé. Tout partage implique que vous citiez l'auteur original. -[iNTRODUCTION]- Nous sommes partis pour un tutoriel pour afficher un ArmorHUD en Vanilla ( code by dermenslof puis modifié par chaos90 ) -[TUTORIEL]- On va commencer par insérer un petit bout de code juste au dessus du ce code ci: public void renderGameOverlay(float par1, boolean par2, int par3, int par4) Nous allons donc ajouter ceci: private void drawItemInToScreen(ItemStack is, int x, int y, float par3, boolean overlay) // On demande au jeu d'afficher l'item sur l'écran { if (is != null) { float an = (float)is.animationsToGo - par3; //On lui dit d'effectuer toute animation par rapport à l'item if (an > 0.0F) { GL11.glPushMatrix(); float dec = 1.0F + an / 5.0F; GL11.glTranslatef((float)(x + 8), (float)(y + 12), 0.0F); GL11.glScalef(1.0F / dec, (dec + 1.0F) / 2.0F, 1.0F); GL11.glTranslatef((float)(-(x + 8)), (float)(-(y + 12)), 0.0F); } itemRenderer.renderItemAndEffectIntoGUI(this.mc.fontRenderer, this.mc.getTextureManager(), is, x, y); //On lui dit de prendre la texture de l'item et de l'afficher sur l'écran if (an > 0.0F) GL11.glPopMatrix(); if (overlay) itemRenderer.renderItemOverlayIntoGUI(this.mc.fontRenderer, this.mc.getTextureManager(), is, 16, y); // Même chose qu'au dessus! } } Nous allons ensuite modifier quelques éléments: if (!this.mc.playerController.enableEverythingIsScrewedUpMode()) // <------- ATTENTION CETTE FONCTION EXISTE DEJA JUSTE A REMPLACER { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.mc.getTextureManager().bindTexture(widgetsTexPath); InventoryPlayer var31 = this.mc.thePlayer.inventory; this.zLevel = -90.0F; this.drawTexturedModalRect(var6 / 2 - 91, var7 - 22, 0, 0, 182, 22); this.drawTexturedModalRect(var6 / 2 - 91 - 1 + var31.currentItem * 20, var7 - 22 - 1, 0, 22, 24, 22); this.mc.getTextureManager().bindTexture(icons); GL11.glEnable(GL11.GL_BLEND); OpenGlHelper.glBlendFunc(775, 769, 1, 0); this.drawTexturedModalRect(var6 / 2 - 7, var7 / 2 - 7, 0, 0, 16, 16); OpenGlHelper.glBlendFunc(770, 771, 1, 0); this.mc.mcProfiler.startSection("bossHealth"); this.renderBossHealth(); this.mc.mcProfiler.endSection(); if (this.mc.playerController.shouldDrawHUD()) { this.func_110327_a(var6, var7); } this.mc.mcProfiler.startSection("actionBar"); GL11.glEnable(GL12.GL_RESCALE_NORMAL); RenderHelper.enableGUIStandardItemLighting(); for (var11 = 0; var11 < 9; ++var11) { var12 = var6 / 2 - 90 + var11 * 20 + 2; var13 = var7 - 16 - 3; this.renderInventorySlot(var11, var12, var13, par1); } Puis, juste en dessous de ces nouveaux éléments, rajouter ceci, qui va faire afficher au jeu le HUD: ItemStack is; //render itemArmor for (int i = 0; i < 4; ++i) { is = this.mc.thePlayer.inventory.armorItemInSlot(4 - i - 1); if (is == null) continue; drawItemInToScreen(is, 0, i * 17, par1, true); this.mc.fontRenderer.drawString("§f§l" + (is.getMaxDamage() - is.getItemDamageForDisplay()), 18, i * 17 + 5, 0); } //render itemInHand is = this.mc.thePlayer.inventory.getCurrentItem(); if (is != null) { Item i = is.getItem(); boolean outils = i instanceof Item; if (!i.isItemTool(is) || outils && !(i instanceof ItemArmor)) { drawItemInToScreen(is, 40, 1 * 5, par1, false); GL11.glDisable(GL11.GL_BLEND); this.mc.fontRenderer.drawString("" + "§n§lDurabilité :§r§c§l " + (is.getMaxDamage() - is.getItemDamageForDisplay()) + " §r§n§lQuantité :§r§c§l " + is.stackSize, 60, 1 * 5 + 5, 553648127); } } RenderHelper.disableStandardItemLighting(); GL11.glDisable(GL12.GL_RESCALE_NORMAL); this.mc.mcProfiler.endSection(); GL11.glDisable(GL11.GL_BLEND); } -[CONCLUSION]- Voilà, votre HUD s'affiche désormais! Je ne me suis pas amuser à tout décoder, mais si l'envie vous en viens, n'hésitez pas! /!\ Je me répète, mais le code est de dermenslof , puis modifié par chaos90, pas de moi! Sur ce, bon jeu avec votre ArmorHUD EDIT de Dermenslof: j'assume rien du tout, à la base c'est mon code mais pas les modifs apportées totalement aberrantes (genre: boolean outils = i instanceof Item; et j'en passe)
  6. Les GUIs dans Minecraft Cette uvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas dUtilisation Commerciale - Pas de Modification 3.0 non transposé . Tout partage implique que vous citiez l'auteur original. -[iNTRODUCTION]- Salut tout le monde ! En ce moment la plupart des demandes d'aide ont rapport avec les GUI. Contrairement à ce que croient la plupart d'entre vous, ce n'est vraiment pas compliqué. Mais un tutoriel sera surement fort utile. Ce tutoriel fonctionne pour la 1.7, la 1.8, et surement (peut-être avec quelques modifications) pour la 1.6, où même peut-être pour la 1.5, ou moins. -[sOMMAIRE]- 1] Préparation 2] Les éléments de GUI 3] Les GUI Containers 4] Créer votre propre objet Gui (composant) 5] Codes et astuces ! 1] Préparation Donc, premièrement, pour créer un menu, il faut créer un GuiScreen, pour ça, il faut créer notre classe qui extends de GuiScreen : public class MonGui extends GuiScreen { } C'est si simple que ça ! Donc, il y a deux méthodes importantes, les voicis : initGui() : @Override public void initGui() { super.initGui(); } Cette méthode n'est exécutée que lorsque le Gui est créé, (quand le Gui s'affiche ou que la fenêtre est redimensionnée) drawScreen(int mouseX, int mouseY, float partialTicks) : @Override public void drawScreen(int mouseX, int mouseY, float partialTicks) { super.drawScreen(mouseX, mouseY, partialTicks); } Le nom des arguments parlent d'eux mêmes ! Cette méthode est exécutée le plus souvent possible (à chaque tour de MC, pour info si les FPS sont à 65 par exemple, cette méthode sera exécutée 65 par seconde !) Voilà ! C'est tout pour cette préparation ! 2] Les éléments de GUI Donc, on va voir les différents éléments de Gui et comment les utiliser ! GuiButton : Pour créer un bouton il suffit de l'enregistrer dans la liste de bouton dans la méthode initGui, comme ceci : this.buttonList.add(new GuiButton(x, y, WIP)); 3] Les GUI Containers 4] Créer votre propre objet Gui (composant) 5] Codes et astuces WORK IN PROGRESS
  7. Afficher un message central Cette uvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas dUtilisation Commerciale - Pas de Modification 3.0 non transposé . Tout partage implique que vous citiez l'auteur original. -[iNTRODUCTION]- Salut tout le monde ! Nous allons expliquer dans cette astuce comment afficher un message au centre de l'écran. Vous verrez, ça n'est pas bien compliqué. -[PR-REQUIS]- -[sOMMAIRE]- 1] Explications pas à pas 2] Résultat final 1] Explications pas à pas Les messages du chat sont reçus par packets lors de la phase de jeu « play ». Lors de leur réception, la méthode NetHandlerPlayerClient.handleChat(S02PacketChat) est appelée. Elle affiche simplement le message reçu dans le chat (via la GuiIngame) : public void handleChat(S02PacketChat packetChat) // Un peu de renommage ne fait pas de mal { this.gameController.ingameGUI.getChatGUI().func_146227_a(packetChat.func_148915_c()); } Ce que nous allons faire, est simplement empêcher le message d'être affiché dans le chat s'il commence par « ~ » ou par «[bROADCAST] ». Le texte non formatté du message (sans les couleurs et autres) peut être récupéré sur le IChatComponent renvoyé par S02PacketChat.func_148915_c(). Nous allons donc remplacer la méthode par : public void handleChat(S02PacketChat packetChat) { /** * Le message qui a été reçu. */ IChatComponent chatComponent = packetChat.func_148915_c(); /** * Le texte non formatté reçu. */ String unformattedText = chatComponent.getUnformattedText(); // Si il s'agit d'un broadcast if (unformattedText.startsWith(" ~") || unformattedText.startsWith("[BROADCAST] ")) { // On l'affiche en tant que tel this.gameController.ingameGUI.showCenterMessage(chatComponent.getFormattedText()); } else { // Sinon on affiche le message dans le chat this.gameController.ingameGUI.getChatGUI().func_146227_a(chatComponent); } } Il nous faut ensuite créer la méthode showCenterMessage(String) dans GuiIngame. public void showCenterMessage(String formattedText) { } Pour la faire fonctionner, nous aurons besoin de 2 fields, qu'il nous faut déclarer au dessus : /** * Dans cette variable sera stocké le message à afficher. */ private String displayedCenterMessage = null; /** * Le temps restant du message à afficher (en ticks). */ private int centerMessageTimer = 0; Nous pouvons maintenant remplir la méthode. Comme vous pouvez le constater, elle ne fait que remplir les fields. public void showCenterMessage(String formattedText) { displayedCenterMessage = formattedText; centerMessageTimer = 3 * 20; // 3 * 20 ticks = 3 secondes } Ensuite, il faut afficher le texte entré dans displayedCenterMessage. Pour cela, nous nous rendons dans GuiIngame.renderGameOverlay, et en dessous du if suivant : if (!this.mc.playerController.enableEverythingIsScrewedUpMode()) On peut ajouter le code de rendu : if (displayedCenterMessage != null) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); // Transparence du message int alpha = centerMessageTimer < 10 ? ((int) (centerMessageTimer * 25)) : 255; // Couleur de base du message (simplement blanc auquel on a ajouté la transparence) int color = 0xffffff | ((alpha & 255) << 24); // On dessine le message centré avec la couleur calculée this.mc.fontRenderer.drawString(displayedCenterMessage, (var6 - this.mc.fontRenderer.getStringWidth(displayedCenterMessage)) / 2, var7 / 2 - 15, color); } Il ne nous reste maintenant plus qu'à décrémenter le timer et à vider la variable displayedCenterMessage si le temps est écoulé. Nous nous rendons dans GuiIngame.updateTick, et nos ajoutons ce code tout au début de la fonction : // Si on est en train d'afficher un message... if (this.centerMessageTimer > 0) { // On réduit le temps restant this.centerMessageTimer--; // Et si le temps est écoulé... if (this.centerMessageTimer == 0) { // On arrête d'afficher le message displayedCenterMessage = null; } } Et c'est tout ! 2] Résultat final Dans NetHandlerPlayerClient.handleChat(S02PacketChat) : public void handleChat(S02PacketChat packetChat) { /** * Le message qui a été reçu. */ IChatComponent chatComponent = packetChat.func_148915_c(); /** * Le texte non formatté reçu. */ String unformattedText = chatComponent.getUnformattedText(); // Si il s'agit d'un broadcast if (unformattedText.startsWith(" ~") || unformattedText.startsWith("[BROADCAST] ")) { // On l'affiche en tant que tel this.gameController.ingameGUI.showCenterMessage(chatComponent.getFormattedText()); } else { // Sinon on affiche le message dans le chat this.gameController.ingameGUI.getChatGUI().func_146227_a(chatComponent); } } Dans GuiIngame : /** * Dans cette variable sera stocké le message à afficher. */ private String displayedCenterMessage = null; /** * Le temps restant du message à afficher (en ticks). */ private int centerMessageTimer = 0; public void showCenterMessage(String formattedText) { displayedCenterMessage = formattedText; centerMessageTimer = 3 * 20; // 3 * 20 ticks = 3 secondes } Dans GuiIngame.renderGameOverlay : if (displayedCenterMessage != null) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); // Transparence du message int alpha = centerMessageTimer < 10 ? ((int) (centerMessageTimer * 25)) : 255; // Couleur de base du message (simplement blanc auquel on a ajouté la transparence) int color = 0xffffff | ((alpha & 255) << 24); // On dessine le message centré avec la couleur calculée this.mc.fontRenderer.drawString(displayedCenterMessage, (var6 - this.mc.fontRenderer.getStringWidth(displayedCenterMessage)) / 2, var7 / 2 - 15, color); } Dans GuiIngame.updateTick : // Si on est en train d'afficher un message... if (this.centerMessageTimer > 0) { // On réduit le temps restant this.centerMessageTimer--; // Et si le temps est écoulé... if (this.centerMessageTimer == 0) { // On arrête d'afficher le message displayedCenterMessage = null; } } Merci d'avoir suivi cette astuce, n'hésitez pas à laisser vos commentaires !
  8. Vanilla

    je sais que tout le monde attendent à ce que quelqu'un fasse un tutoriel en VANILLA pour le StatusEffectHUD alors je l'ai fais et je vous le fais partager StatusEffectHUD en Vanilla -[iNTRODUCTION]- Bonjour à tous ! Dans ce tutoriel, nous allons faire un StatusEffectHUD commençons sans attendre -[sOMMAIRE]- 1]Création d'un "if" 2]Création d'un "for" 3]LesIcônes 4] Afficher les niveaux des effets 1]Création d'un "if" Tout d'abord on va aller dans le GuiIngame.java puis on va aller dans RenderGameOverlay mettre nos codes en dessus de ces 3 int : int var11; int var12; int var13; qui est en dessus de ce if : if (!this.mc.thePlayer.isPotionActive(Potion.confusion)) { float var10 = this.mc.thePlayer.prevTimeInPortal + (this.mc.thePlayer.timeInPortal - this.mc.thePlayer.prevTimeInPortal) * par1; if (var10 > 0.0F) { this.func_130015_b(var10, var6, var7); } } donc maintenant on va mettre notre if qui va dire que si il y a plus de 5 potion d'activer ça les empiles mais pour ça il faut déja mettre notre Collection pour les potions et aussi un int les voici : Collection ph1 = this.mc.thePlayer.getActivePotionEffects(); int ph2 = 33; j'ai mis ph pour PotionHUD maintenant le if c'est : if (ph1.size() > 5) //si les effect de potion activé est supérieur a 5 alors ... { ph2 = 132 / (ph1.size() - 1); ... il s'empile avec ces valeurs } 2]Création d'un "for" pour le "for" on va mettre tout ce qu'il faut pour que les effect de potion s'affiche avec le temps l'icone et le nom de la potion donc pour ça le "for" sera : for (Iterator ph3 = this.mc.thePlayer.getActivePotionEffects().iterator(); ph3.hasNext(); var2 += ph2) { donc ici on a crée un Iterator qui va donc nous permettre d'avencer sauf que normalement vous avez une erreur sur me var2 et nous allons ajouter en même un autre var qui nous servira plus bas donc plus haut avant le if il suffis de mettre ceci : int var2 = 0; int var1 = 0; donc maintenant dans notre for on va rajouter quelque variables pour qu'il aille chercher les effets de potions : PotionEffect ph4 = (PotionEffect)ph3.next(); Potion ph5 = Potion.potionTypes[ph4.getPotionID()]; // ici on va chercher le type de potion qui est actif GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); pour le text c'est avec le niveaux des potion donc c'est plus bas maintenant on a just le nom de la potion qui s'affiche maintenant on veut sa durée : this.mc.fontRenderer.drawStringWithShadow(Potion.getDurationString(ph4), var1 + 10 + 18, var2 + 6 + 10, 8355711); //ici on affiche la duré de l'effet en court ce qui nous donne pour le moment ceci : //début du code PotionEffectHUD int var1 = 0; int var2 = 0; int ph2 = 33; Collection ph1 = this.mc.thePlayer.getActivePotionEffects(); if (ph1.size() > 5) { ph2 = 132 / (ph1.size() - 1); } for (Iterator ph3 = this.mc.thePlayer.getActivePotionEffects().iterator(); ph3.hasNext(); var2 += ph2) { PotionEffect ph4 = (PotionEffect)ph3.next(); Potion ph5 = Potion.potionTypes[ph4.getPotionID()]; GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.mc.fontRenderer.drawStringWithShadow(Potion.getDurationString(ph4), var1 + 10 + 18, var2 + 6 + 10, 8355711); } //fin code PotionEffectHUD 3] LesIcônes maintenant il faut afficher certaine chose comme le contour (ou pas si vous voulez pas il suffis de retirer le code que je vais vous donner) et les icônes donc pour les icônes on va déjà rajouter un bindTexture tout en haut du GuiIngame.java : protected static final ResourceLocation inventory = new ResourceLocation("textures/gui/container/inventory.png"); voilà et dans notre "for" on va rajouter en dessus de : GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); on va mettre : this.mc.getTextureManager().bindTexture(inventory); // ici on va chercher la texture maintenant on va chercher les icônes dans ce .png donc on ajouter un if : if (ph5.hasStatusIcon()) { int ph6 = ph5.getStatusIconIndex(); this.drawTexturedModalRect(var1 + 6, var2 + 7, 0 + ph6 % 8 * 18, 198 + ph6 / 8 * 18, 18, 18); //on va chercher l'icône et on le place ou il faut } si vous voulez le contour il suffis d'ajouter cette ligne au dessus du if des icônes : this.drawTexturedModalRect(var1, var2, 0, 166, 140, 32); // ici on affiche le contour si vous avez envis d'enlever le contour il suffis d'enlever cette ligne 4] Afficher les niveaux des effets donc pour afficher le niveaux des effets on va déja rajouter en dessus de notre deuxième if pour afficher les icônes un String qui va chercher le nom en fonction de leur ID : String ph7 = I18n.format(ph5.getName()/*ici il cherche le nom*/, new Object[0]); maintenant que on a ça on va pouvoir afficher le niveau pour cela rien de plus simple on fais des "if" et des "else if" donc on commence par le niveau 2 car le niveau 1 ne s'affiche pas donc on met : if (ph4.getAmplifier() == 1) // si la potion a un niveau de 1 qui est le niveau 2 car le niveau 1 c'est 0 alors .... { ph7 = ph7 + " II" ;// ... on affiche a coté du nom de la potion "II" } et maintenant on va faire ça pour 4 niveaux donc en dessus de ça on ajoute : else if (ph4.getAmplifier() == 2)// si la potion a un niveau de 2 qui est 3 alors ... { ph7 = ph7 + " III"; // on affiche a coté du nom de la potion "III" } else if (ph4.getAmplifier() == 3) // si la potion a un niveau de 3 qui est 4 alors ... { ph7 = ph7 + " IV"; // on affiche a coté du nom de la potion "IV" } maintenant que on a ça il faut le placer donc en dessous du if on ajoute : this.mc.fontRenderer.drawStringWithShadow(ph7, var1 + 10 + 18, var2 + 6, 16777215); //ici on place le nom de la potion ou il faut ce qui nous donne au finale tout ceci : //début du code PotionEffectHUD int var1 = 0; int var2 = 0; int ph2 = 33; Collection ph1 = this.mc.thePlayer.getActivePotionEffects(); if (ph1.size() > 5) { ph2 = 132 / (ph1.size() - 1); } for (Iterator ph3 = this.mc.thePlayer.getActivePotionEffects().iterator(); ph3.hasNext(); var2 += ph2) { PotionEffect ph4 = (PotionEffect)ph3.next(); Potion ph5 = Potion.potionTypes[ph4.getPotionID()]; GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.mc.getTextureManager().bindTexture(inventory); this.drawTexturedModalRect(var1, var2, 0, 166, 140, 32); if (ph5.hasStatusIcon()) { int ph6 = ph5.getStatusIconIndex(); this.drawTexturedModalRect(var1 + 6, var2 + 7, 0 + ph6 % 8 * 18, 198 + ph6 / 8 * 18, 18, 18); } String ph7 = I18n.format(ph5.getName(), new Object[0]); if (ph4.getAmplifier() == 1) { ph7 = ph7 + " II" ; } else if (ph4.getAmplifier() == 2) { ph7 = ph7 + " III"; } else if (ph4.getAmplifier() == 3) { ph7 = ph7 + " IV"; } this.mc.fontRenderer.drawStringWithShadow(ph7, var1 + 10 + 18, var2 + 6, 16777215); this.mc.fontRenderer.drawStringWithShadow(Potion.getDurationString(ph4), var1 + 10 + 18, var2 + 6 + 10, 8355711); } //fin code PotionEffectHUD voilà le tutoriel est terminé bon jeu avec votre StatusEffectHUD !
  9. Vanilla

    Bonjour a tous, pour commencer, désolé de la mise en page mais je n'ai jamais fait de tutoriel ici. Aujourd'hui, nous allons créer une nouvelle armure. Le matériel : - MCP ( Minecraft Coder Pack ) de la version que vous voulez - Eclipse - Un ordinateur ... Ajout de l'armure : Tout d'abord, rendez-vous dans la classe Item.java Rendez-vous à la fin de la déclaration des items Ensuite, ajoutez ce code : ! Ajoutez le dans Item.java ! itemRegistry.addObject(ID, "NOM", (new ItemArmor(ItemArmor.ArmorMaterial.MINERAIS, 5, 0)).setUnlocalizedName("NOM").setTextureName("NOM-TEXTURE")); itemRegistry.addObject(ID, "NOM", (new ItemArmor(ItemArmor.ArmorMaterial.MINERAIS, 5, 1)).setUnlocalizedName("NOM").setTextureName("NOM-TEXTURE")); itemRegistry.addObject(ID, "NOM", (new ItemArmor(ItemArmor.ArmorMaterial.MINERAIS, 5, 2)).setUnlocalizedName("NOM").setTextureName("NOM-TEXTURE")); itemRegistry.addObject(ID, "NOM", (new ItemArmor(ItemArmor.ArmorMaterial.MINERAIS, 5, 3)).setUnlocalizedName("NOM").setTextureName("NOM-TEXTURE")); Maintenant , ajoutons nos armures dans Items.java public static final ItemArmor NOM = (ItemArmor)Item.itemRegistry.getObject("NOM"); public static final ItemArmor NOM = (ItemArmor)Item.itemRegistry.getObject("NOM"); public static final ItemArmor NOM = (ItemArmor)Item.itemRegistry.getObject("NOM"); public static final ItemArmor NOM = (ItemArmor)Item.itemRegistry.getObject("NOM"); Là, votre armure est créée mais elle n'a pas encore de durabilité La durabilité de votre armure : Donc, rendez-vous dans : ItemArmor.java En dessous de celle du diamant, ajoutez cette ligne : MINERAIS("MINERAIS", 8, 50, new int[]{8, 13, 11, 8}, 6); Vous pouvez remarquer qu'il y a une erreur. Pour y remédier, il suffit de remplacer CA : DIAMOND("DIAMOND", 4, 33, new int[]{3, 8, 6, 3}, 10); PAR CA : DIAMOND("DIAMOND", 4, 33, new int[]{3, 8, 6, 3}, 10), ! Ajoutez toujours votre minerais en dernier ! Ici, on va s'occuper de la durabilité et de la résistance des objets MINERAIS("MINERAIS", 7, 50, new int[]{8, 13, 11, 8}, 6); Remplacez MINERAIS par le nom de votre minerais ! TOUJOURS EN MAJUSCULES ! Le 7 représente son ordre (si le diamant est 4 alors votre minerais devient 5) Là, le 50 représente la durabilité de l'armure Le 8 est la résistance du casque Le 13 est la résistance du plastron Le 11 est la résistance du pantalon Le 8 (le dernier) est la résistance des bottes Le 6, c'est l'enchantement de l'armure (plus c'est bas, plus les enchantements sont rares) Mon exemple : SAPPHIRE("SAPPHIRE", 8, 55, new int[]{9, 18, 17, 6}, 9); Maintenant, vous pouvez remplacer dans votre code le '.MINERAIS' par '.VOTREMINERAIS' Comme ceci : itemRegistry.addObject(ID, "NOM", (new ItemArmor(ItemArmor.ArmorMaterial.SAPPHIRE, 5, 0)).setUnlocalizedName("NOM").setTextureName("NOM-TEXTURE")); itemRegistry.addObject(ID, "NOM", (new ItemArmor(ItemArmor.ArmorMaterial.SAPPHIRE, 5, 1)).setUnlocalizedName("NOM").setTextureName("NOM-TEXTURE")); itemRegistry.addObject(ID, "NOM", (new ItemArmor(ItemArmor.ArmorMaterial.SAPPHIRE, 5, 2)).setUnlocalizedName("NOM").setTextureName("NOM-TEXTURE")); itemRegistry.addObject(ID, "NOM", (new ItemArmor(ItemArmor.ArmorMaterial.SAPPHIRE, 5, 3)).setUnlocalizedName("NOM").setTextureName("NOM-TEXTURE")); Donner une texture quand l'armure est sur vous : Petite astuce : Si vous ne trouvez pas le RenderBiped.java, crivez le puis sélectionnez le puis -> Clique droit -> Open declaration Pour finir , rendez-vous dans la classe : RenderBiped.java Là, vous voyez cette ligne ( normalement ) private static final String[] bipedArmorFilenamePrefix = new String[] {"leather", "chainmail", "iron", "diamond", "gold"}; A la fin, mettez une virgule ( , ) puis entre ( " " ), le nom de votre armure Exemple : Si vos textures d'armure s'appellent : Sapphire_layer_1 et Sapphire_layer_2 Entre les ( " " ) mettez : Sapphire Exemple : private static final String[] bipedArmorFilenamePrefix = new String[] {"leather", "chainmail", "iron", "diamond", "gold", "sapphire"}; Et voilà, vous avez votre armure ! Il ne vous reste que a mettre vos textures ! Infos supplémentaires : En cas de non-compréhension , ajoutez moi sur skype , je vous aiderai comme je peut Mon skype : Anthony.delfleur
  10. Créer son propre launcher personalisé de zéro, tutoriels vidéos Bien le bonjour chers utilisateurs d'Ironcraft ! J'ai créé une série de tutoriels vidéos sur Youtube permettant la création d'un launcher Minecraft à partir de rien (c'est vous qui créez les sources) et donc entièrement personnalisable. Ils sont basé sur mes librairies open-source que vous pouvez retrouver là : https://github.com/Litarvan/ Bon visionnage ^^ Attention, pour la vidéo deux prenez bien l'OpenLauncherLib 2.1, pour la trois il faudra après regarder la vidéo 4.1. Aussi, les liens de téléchargement sont dans la description de la première vidéo. Et GSON est intégré à SUpdate depuis la 3.1 (entièrement compatible) Et, vos avez le droit de vendre un launcher fait avec ce tutoriel sans me citer ni rien me verser, tant que vous ne vous appropriez pas les libs. Épisode 1 : http://youtube.com/watch?v=37a3vK_M6-A Épisode 2 : http://youtube.com/watch?v=V2Q6KcYB2Cw Épisode 3 (optionnel) : http://youtube.com/watch?v=J2HiK0Rnx50 Mises à jour ! Épisode 4.1 : http://youtube.com/watch?v=54jKg_oNsQA Pour tout problème, une FAQ est disponible ici : https://www.dropbox.com/s/dlgauk2fxgs27e1/TheShark34%20-%20Livre%20de%20Support%20%28Decembre%202015%29.pdf?dl=0
  11. Vanilla

    Esque vous vouliez toujours avoir un bloc comme un trampoline ? alors ce tuto est fais pour vous Un Bloc sauteur ! -[iNTRODUCTION]- Bonjour à tous ! Dans ce tutoriel, nous allons faire un bloc qui vous fais sauter ! -[sOMMAIRE]- 1]Création du Bloc 2]Création du BlocSauteur.java 3]CraftBukkit 1]Création du Bloc Bon pour crée un bloc on fais comme d'habitude ce n'est pas nouveau il suffis de mettre dans Block et Blocks : Block.java blockRegistry.addObject(ID, "NOM_DU_BLOC", (new BlockSauteur()).setHardness(1.0F).setStepSound(SON).setBlockName("NOM_DU_BLOC").setBlockTextureName("TEXTURE_DU_BLOC")); Blocks.java public static final Block NOM_DU_BLOC = (Block)Block.blockRegistry.getObject("NOM_DU_BLOC"); 2]Création du BlockSauteur.java Ici on va faire le BlockSauteur.java pour que le joueur sois vachement plus rapide quand il marche sur se Bloc pour ça on va commencer par crée notre class sans rien dessus : package votre_package; public class BlockSauteur{ } ensuite on va déja rajouter un extends du Block.java,mettre un nouveau public ou on va rajouter un material et un emplacement dans le creativetab qui sera celui des Blocs package votre_package; import net.minecraft.block.Block;import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; public class BlockSauteur extends Block { public BlockSauteur() { super(Material.rock); this.setCreativeTab(CreativeTabs.tabBlock); //creative tab, on met le bloc dans l'onglet bloc du creatif } } Maintenant il faut ajouter certaine fonction par exemple pour entrer en contact avec le bloc pour qu'il nous fasse sauter. Nous somme obligé mettre minimum 1 pixel pour entrer dedans voici comment on fais : public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1, int par2, int par3, int par4) { return AxisAlignedBB.getBoundingBox((double)par2, (double)par3, (double)par4, (double)(par2 + 1), (double)((float)(par3 + 1) - 0.125F), (double)(par4 + 1)); //ici on dit que on peu se faire aspirer de 1 pixel par le bloc } et ensuite il suffis de mettre le saut : public void onEntityCollidedWithBlock(World par1, int par2, int par3, int par4, Entity par5) { par5.motionY += 2D; } Alors là on peu remarqué que le joueur saute que si on saute sur le bloc se que nous ne voulons pas alors nous alons rajouter cette ligne par5. par5.ticksExisted = 10; //tout les 10 ticks il saute maintenant ça saute tout le temps mais on perd des dégâts de chute donc on va éviter ça on ajoute : par5.fallDistance *= 0D; // on perd 0 dégats de chute en retombant sur le bloc maintenant si on veut rajouter un bruit de piston : par1.playSoundAtEntity(par5, "tile.piston.in", 1.0F, 1.0F); // bruit de piston joué a l'entity se trouvant a proximité a présent notre bloc est bon mais vous allez me dire comment on fais pour sortir du bloc sans perdre des dégats de chute c'est très simple nous alons entrer un "if" if(par5.onGround && par5.isSneaking()) // si le joueur sneak sur le sol alors { par5.motionY += 0; // fais sauter le joueur a 0 bloc de haut par5.fallDistance += 0D; // on perd 0 dégats de chute en retombant sur le bloc } else //sinon { par5.ticksExisted = 10; par5.motionY += 2D; fais sauter le joueur par1.playSoundAtEntity(par5, "tile.piston.in", 1.0F, 1.0F); // bruit de piston joué a l'entity se trouvant a proximité par5.fallDistance += 0D; // on perd 0 dégats de chute en retombant sur le bloc } se qui nous donne au final : package votre_package; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.Minecraft; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MovementInput; import net.minecraft.world.World; public class BlockSauteur extends Block { public BlockSauteur() { super(Material.rock); this.setCreativeTab(CreativeTabs.tabBlock); } public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1, int par2, int par3, int par4) { return AxisAlignedBB.getBoundingBox((double)par2, (double)par3, (double)par4, (double)(par2 + 1), (double)((float)(par3 + 1) - 0.125F), (double)(par4 + 1)); } public void onEntityCollidedWithBlock(World par1, int par2, int par3, int par4, Entity par5) { if(par5.isSneaking()) // si le joueur sneak alors { par5.motionY += 0; // fais sauter le joueur a 0 bloc de haut par5.fallDistance += 0D; // on perd 0 dégats de chute en retombant sur le bloc } else //sinon { par5.ticksExisted = 10; par5.motionY += 2D; fais sauter le joueur par1.playSoundAtEntity(par5, "tile.piston.in", 1.0F, 1.0F); // bruit de piston joué a l'entity se trouvant a proximité par5.fallDistance += 0D; // on perd 0 dégats de chute en retombant sur le bloc } } } 3]CraftBukkit pour craftbukkit je vous donne tout c'est la même chose Block.java REGISTRY.a(ID, "NOM_DU_BLOC", (new BlockSauteur()).c(1.0F).a(k).c("NOM_DU_BLOC").d("TEXTURE_DU_BLOC")); Blocks.java public static final Block NOM_DU_BLOC = (Block) Block.REGISTRY.a("NOM_DU_BLOC"); et enfin le BlockSauteur.java (1.7.2) package net.minecraft.server; import net.minecraft.server.AxisAlignedBB; import net.minecraft.server.Block; import net.minecraft.server.CreativeModeTab; import net.minecraft.server.Entity; import net.minecraft.server.Material; import net.minecraft.server.World; public class BlockSauteur extends Block { public BlockSauteur() { super(Material.STONE); this.a(CreativeModeTab.; } public AxisAlignedBB a(World world, int i, int j, int k) { return AxisAlignedBB.a().a((double) i, (double) j, (double) k, (double) (i + 1), (double) ((float) (j + 1) - (float) 0.125F), (double) (k + 1)); } public void a(World world, int i, int j, int k, Entity entity) { if(entity.isSneaking()) { entity.motY += 0D; // on fais sauter le joueur entity.fallDistance += 0D; // on perd 0 dégâts de chute } else { entity.motY += 2D; // on fais sauter le joueur entity.fallDistance += 0D; // on perd 0 dégâts de chute entity.ticksLived = 10; // on saute tout les 10 ticks } } } BlockSauteur.java (1.7.10) package net.minecraft.server; import net.minecraft.server.AxisAlignedBB; import net.minecraft.server.Block; import net.minecraft.server.CreativeModeTab; import net.minecraft.server.Entity; import net.minecraft.server.Material; import net.minecraft.server.World; public class BlockSauteur extends Block { public BlockSauteur() { super(Material.STONE); this.a(CreativeModeTab.; } public AxisAlignedBB a(World world, int i, int j, int k) { float f = 0.125F; return AxisAlignedBB.a((double) i, (double) j, (double) k, (double) (i + 1), (double) ((float) (j + 1) - f), (double) (k + 1)); } public void a(World world, int i, int j, int k, Entity entity) { if(entity.isSneaking()) { entity.motY += 0D; // on fais sauter le joueur entity.fallDistance += 0D; // on perd 0 dégâts de chute } else { entity.motY += 2D; // on fais sauter le joueur entity.fallDistance += 0D; // on perd 0 dégâts de chute entity.ticksLived = 10; // on saute tout les 10 ticks } } } Et voilà j'espère que ça vous a plus bon jeu avec votre nouveau bloc
  12. 1.7.x

    Tout sur les blocs ! Cette uvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas dUtilisation Commerciale - Pas de Modification 3.0 non transposé . Tout partage implique que vous citiez l'auteur original. -[iNTRODUCTION]- Bonjour à tous ! Dans ce tutoriel, nous allons explorer les méandres des objets les plus importants dans Minecraft : les blocs ! -[sOMMAIRE]- 1] Mais au fait, c'est quoi un bloc ? 2] Bases du système 3] Créer un bloc A] Un bloc simple B] Les textures et les noms C] Les méta-données D] Quelques méthodes utiles E] Ajouter un bloc avec un rendu complexe 4] Astuces pratiques A] Créer un minerai B] Créer un bloc orientable C] Créer une plante D] Créer un onglet dans le menu créatif E] La génération 5] Entités de blocs (TileEntities) 6]Astuces pratique 2 A]Créer une nouvelle table de craft B]Créer un four C]Créer un coffre 1] Mais au fait, c'est quoi un bloc ? Cette méthode statique est appelé lors du lancement du client Minecraft (depuis le constructeur Minecraft() Bootstrap.func_151354_b()). C'est ici que sont instanciés tous les blocs. Et pour répondre à notre question de départ, on pourra dire simplement qu'un bloc est une instance de la classe Block (captain obvious). 2] Bases du système C'est donc depuis cette classe (grâce au modifieur public), que nous pourrons récupérer les instances de nos blocs précédemment déclarés dans Block. Comme nous l'avons dit précédemment, un bloc est une instance d'une classe fille de Block. Si vous vous rendez dans cette dernière, vous y verrez beaucoup de méthodes, pour la plupart vide. La majorité d'entre elles correpond à des évenements qui surviennent en jeu (quand un joueur casse un, qu'il marche dessus, qu'il clique dessus, etc.). Nous reviendrons plus en détails sur ces méthodes dans la partie 3C. Chaque bloc a donc sa propre classe, et ce pour permettre un paramétrage fin. En résumé, les redéfinitions de méthodes (overrides) sont le nerf de la guerre pour créer des blocs ! 3] Créer un bloc A] Un bloc simple B] Les textures et les noms C] Les méta-données D] Quelques méthodes utiles E] Ajouter un bloc avec un rendu complexe 4] Astuces pratiques Nous voilà maintenant arrivés à la partie que je pense que vous attendiez le plus ! Avant de rentrer dans le vif du sujet, je voudrais quand même préciser quelque chose : libre à vous de copier « brutalement » les codes présentés ici sans aucunement chercher la compréhension, mais je vous conseille d'abord de lire ce qui a été dit au dessus. A] Créer un minerai B] Créer un bloc orientable C] Créer une plante Bientôt... E] La génération 5] Entités de blocs (TileEntities) Par défaut, un bloc de monde n'est pas une entité, en ce sens qu'il ne dispose pas des fonctionnalités utiles de celles, comme par exemple la sauvegarde d'informations spécifiques via NBT. Mais certains blocs aux fonctionnalités particulières on besoin de ces fonctionnalités, comme par exemple les coffres ou les dispensers. Alors, quand on les pose dans un monde, il ne sont plus « seulement » des cubes, mais aussi des entités qui intéragissent avec leur environnement. Voyons comment créer ça ! A] Créer une TileEntity B] Les méthodes disponibles C] Lui attribuer un rendu spécial
  13. vous avez toujours eu envis d'un bâton/sceptre de soin ? et bien se tuto est fait pour vous Bâton/Sceptre de Soin -[iNTRODUCTION]- Bonjour à tous ! Dans ce tutoriel, nous allons faire un Bâton/Sceptre de soin -[sOMMAIRE]- 1]Création de l'item 2]Création du BatonDeSoin.java 3]CraftBukkit 1]Création de l'item la création d'un item c'est pas quelque chose de compliqué il suffis de faire comme ceci : Item.java itemRegistry.addObject(ID, "NOM", (new BatonDeSoin().setUnlocalizedName("NOM").setTextureName("NOM_TEXTURE"))); Items.java public static final Item NOM = (Item)Item.itemRegistry.getObject("NOM"); 2] Création du BatonDeSoin.java alors ici on va commencer par crée notre class normalement vous aurez ceci : package votre_package; public class BatonDeSoin { } alors tout de suite nous alons faire un extends sur Item et donc ajouter un maxStackSize une Durabilité et un emplacement dans le créatif : package votre_package; public class BatonDeSoin extends Item { public BatonDeSoin() { this.maxStackSize = 1; // on lui met un stack de 1 this.setMaxDamage(15); // on met 15 de durabilité this.setCreativeTab(CreativeTabs.tabCombat); // on le met dans le tab Combat du créatif } } une fois ça fais nous allons ajouter une fonction que quand on fais click droit ça fais une action : public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) { return par1ItemStack; } dans cette fonction nous alons ajouter un effect de potion qui est le heal et on va aussi déclarer la durabilité : public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) { par1ItemStack.damageItem(1, par3EntityPlayer); // on déclare la durabilité par3EntityPlayer.addPotionEffect(new PotionEffect(Potion.heal.id, 1, 0)); // on met un effet de heal 1 pendant 1 tick return par1ItemStack; } et puis on rajoute de la 3D : public boolean isFull3D() // on met de la 3D a l'item { return true; } ce qui nous donne au final : package votre_package; public class BatonDeSoin extends Item{ public BatonDeSoin() { this.maxStackSize = 1; this.setMaxDamage(10); this.setCreativeTab(CreativeTabs.tabCombat); } public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) { par1ItemStack.damageItem(1, par3EntityPlayer); par3EntityPlayer.addPotionEffect(new PotionEffect(Potion.heal.id, 1, 0)); return par1ItemStack; } } et voilà passons au craftbukkit qui est la même chose 3] CraftBukkit Item.java REGISTRY.a(ID, "NOM", (new BatonDeSoin()).c("NOM").f("NOM_TEXTURE")); Items.java (Pour 1.7.2) public static final Item NOM = (Item)Item.REGISTRY.a("NOM"); Items.java (Pour 1.7.10) public static final Item NOM = (Item)Item.REGISTRY.get("NOM"); BatonDeSoin.java package net.minecraft.server; import net.minecraft.server.EntityHuman; import net.minecraft.server.Item; import net.minecraft.server.ItemStack; import net.minecraft.server.MobEffect; import net.minecraft.server.MobEffectList; import net.minecraft.server.World; public class BatonDeSoin extends Item { public BatonDeSoin() { this.maxStackSize = 1; this.setMaxDurability(15); } public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) { entityhuman.addEffect(new MobEffect(MobEffectList.HEAL.id, 1, 0)); itemstack.damage(1, entityhuman); return itemstack; } } et voilà bon jeu avec votre bâton de soin
  14. Bonjour à tous, Je poste ce sujet car après avoir découvert hier soir PocketMine, un serveur à la bukkit/spigot mais pour Minecraft Pocket et après avoir vu que les plugins étaient en PHP, j'ai décide de m'y mettre et de faire découvrir ce serveur à la communauté francophone. J'ai donc déjà fait deux vidéos mais je viens de commencer les tutoriels alors je ne pense pas reelement bien expliquer encore. Episode 1 : Préparons le tout ! Episode 2 : Les commandes ? C'est cool ! Je suis ouvert à toutes critiques du moment quelles soient un minimum construite. (oé t vidéo c dla merd, va tpendr) J'sais que c'est pas parfait (Mais alors pas du tout). Aussi, n'hesitez pas à me dire ce que vous voudrez pour les prochains épisode et vos idée de "projet" pour tout le long des vidéos !
  15. Sommaire Par quoi je commence ? Dossier : Tout savoir sur l'installation. Premier mod Les meilleurs mods commencent comme ça. Allo ? Est-ce que ça marche ? Premier build et distribution. Vous pouvez proposer des améliorations sur le topic de discussion.
  16. Installation des outils nécessaires au développement Cette uvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas dUtilisation Commerciale - Pas de Modification 3.0 non transposé . Tout partage implique que vous citiez l'auteur original. -[iNTRODUCTION]- Bonjour les gens, si vous êtes ici c'est sûrement que vous débutez dans le modding Forge, c'est pourquoi je vous fais ce tutoriel en espérant vous donnez tous les outils nécessaires afin de bien débuter vos futures créations. Ce qui va suivre est essentiellement vrai pour des systèmes Windows, toutefois certains points peuvent être vrais pour plusieurs systèmes d'exploitation, il n'est pas non plus bien difficile de transposer ce que je dit dans un autre OS si vous maîtriser un minimum celui-ci. -[sOMMAIRE]- 1] Logiciels 2] Installation de Forge 2] Configuration de l'espace de travail 1] Logiciels Java Developpment Kit : Avant de coder, il faut bien évidemment installer des logiciels vous le permettant tout d'abord vous devez télécharger la "base" pour le modding, je parle bien sur du Java Developpment Kit une fois sur le site il vous faut choisir la version correspondant à votre système d'exploitation et à l'architecture de celui-ci. Le JDK ainsi installé il faut désormais définir les variables d'environnement. Reperez tout d'abord le répertoire où JDK est installé ( C:\Program Files\Java\jre1.8.0_60 pour ma part) Puis rendez-vous dans : Ordinateur --> Propriétés systèmes --> Paramètres systèmes avancés --> Variables d'environnement Vous devriez alors être ici : Ensuite, vous devez créer une nouvelle variable système que vous appelerez JAVA_HOME, sa valeur sera (comme vous pouvez le voir) le repertoire où est installé votre JDK, cherchez après la variable "path", placez vous après un point-virgule et inserez le repertoire où vous avez installé le JDK suivi de \bin et bien sur, d'un point-virgule ( C:\Program Files\Java\jre1.8.0_60\bin; chez moi). Une fois ceci fait votre JDK est opérationnel, pour le vérifier ouvrez donc votre invité de commande et tapez : javac Si la commande vous indique la manière dont il faut utiliser cette commande (et non pas une erreur), votre ordinateur est prêt à coder ! Environnement de developpement: Seulement à moins d'être en parfaite symbiose avec votre ordinateur ainsi que JDK vous n'êtes pas apte à modder ce magnifique jeu qu'est Minecraft, c'est pourquoi vous devez installez un IDE, logiciel qui vous permettra de coder effectivement et de tester les fonctionnalités de votre mod en direct je vous conseille personellement Eclipse car c'est sans doute le plus simple d'utilisation et c'est celui avec lequel j'effectuerai les autres tutoriels; Il faut vous rendre sur le page de téléchargement du site web d'Eclipse (en plus ils viennent juste de sortir une installation automatique, profitez-en ) et de procéder à l'installation, une fois ceci fait restez-en là, nous en reparlerons un peu plus tard. Toutefois sachez qu'il existe d'autres IDE parfois plus complet mais bien souvent plus complexe parmi ceux-ci je vous recommande IntelliJ IDEA, qui intègre directement gradle et Git, cependant il est un petit plus complexe d'utilisation (attention à bien choisir la version community, l'autre version étant payante, ne vous inquietez pas cette dernière contient tout ce dont vous avez besoin). Editeur de texte avancé : Depuis quelques temps déjà Minecraft utilise pas mal de fichier .json c'est pourquoi je vous recommande fortement d'acquérir un editeur de texte un peu plus complexe que le bloc-notes. Je vous recommande encore une fois celui que j'utilise Notepad ++, clair, simple d'utilisation et un simple clic droit vous permet d'éditer tout ce qui est éditable ainsi que PSPad ! Sachez toutefois qu'il en existe bien d'autre et que vous avez l'embarras du choix en matière d'éditeur de texte. (Si vous optez pour N++ vérifiez bien que votre logiciel encode en UTF-8 sans BOM, via l'onglet Encodage). Si vous êtes sur OS X je vous recommande le logiciel Fraise. Logiciels de manipulation graphique : Votre futur mod aura sans doute besoin de textures et de je ne sais quels autres modèles, c'est pourquoi je vous conseille (si ce n'est pas déjà le cas) d'installer des logiciels d'édition/manipulation graphique, je vous propose une liste de logiciels gratuits que je vous conseille : GIMP : http://www.gimp.org/downloads/ Paint.net : http://www.getpaint.net/download.html PhotoFiltre 7 (freeware) : http://www.photofiltre-studio.com/pf7.htm Les adeptes de Photoshop peuvent aussi utiliser ce logiciel, le principal problème avec celui-ci étant son prix. Vous serez aussi peut-être amenés à concevoir des modèles 3D, il vous faudra donc télécharger Techne un outil de modélisation adapté à Minecraft. Il existe aussi CraftStudio qui est lui par contre un outil payant de modélisation 3D (ainsi qu'un moteur de jeu) 2] Installation de Forge Sources de Forge : En effet, il faut d'abord acquérir les sources de forge (et de minecraft) c'est pourquoi vous allez les téléchargez sur le site officiel de Forge, choissisez la version que vous désirez (les versions recommandées sont comme cela le laisse supposer, recommandées, surtout dans le cadre de la création d'un mod), puis faites bien attention à télécharger la version SRC, extrayez ensuite ce dossier là où cela vous arrange. Installation de Forge : Rendez-vous dans le dossier préalablement choisi, vous cliquez dans l'adresse du repertoire, effacez celle-ci et tapez " cmd" une fois l'invité de commande dans le repertoire des sources tapez (uniquement si vous utilisez eclipse) : gradlew setupDecompWorkspace eclipse --info En revanche si vous utilisez IntelliJ IDEA tapez : gradlew setupDecompWorkspace idea --info Si vous êtes sur Mac OS X ou sur une distrib' Linux il vous suffit de rajouter "./" pour executer gradlew (vérifier toutefois que vous avez les permissions de l'executer) 3] Configuration de l'espace de travail Eclipse : Il faut désormais proceder à une rapide configuration d'éclipse, tout d'abord lancez le logiciel : Selectionnez le dossier "eclipse" du repertoire des sources de Forge, lancez le logiciel, puis une fois ceci fait rendez-vous dans : Windows --> Preferences --> General --> Editor Et choissisez autre puis UTF-8, cela permettra d'éviter certains problèmes. IntelliJ IDEA (WIP): Une fois le logiciel installé, lancez-le et accedez aux sources en créant un nouveau projet via : File --> New --> Project from Existing Sources... Une fois ceci fait selectionnez l'endroit ou les sources de minecraft et de forge sont installés, suivez les instructions d'installation et vous êtes prêt à coder ! Merci d'avoir lu, si jamais il y a des erreurs (dans le fond comme dans la forme), merci de me les signaler, Bonne continuation, Cordialement
  17. Vanilla

    J'exposerai ici comment j'ai fait pour mon bloc anti-piston. J'ai vu cette demande dans la catégorie Support, et je trouvais utile de faire un tutoriel, plutôt que de déterrer d'anciens sujets à l'avenir. Créer un bloc anti-piston: Cette uvre est mise à disposition selon les termes de laLicence Creative Commons Attribution - Pas dUtilisation Commerciale - Pas de Modification 3.0 non transposé. Tout partage implique que vous citiez l'auteur original. Sommaire: 1]Préparatifs Pour commencer, il vous faudra un Minecraft décompilé en 1.6 - 1.7 (dans mon cas la 1.7.10) avec MCP(= Minecraft Coder Pack). 2]Mise en place du code On va commencer directement le tutoriel ! Préparez votre espace de travail en démarrant Eclipse avec la workspace habituelle. Une fois ceci fait, ouvrez les packages net.minecraft.block et net.minecraft.block.Material. Vous aurez besoin de deux classes: Block.java et Material.java Dans Block.java, vous devriez repérer ceci à la ligne 388. blockRegistry.addObject(175, "double_plant", new BlockDoublePlant()); Ajoutez ceci juste après, de façon à déclarer un nouveau bloc. blockRegistry.addObject(200, "antipiston_block", (new Block(Material.noPushBlock)).setHardness(5.0F).setResistance(10.0F).setStepSound(soundTypePiston).setBlockName("blockAntiPiston").setCreativeTab(CreativeTabs.tabBlock).setBlockTextureName("antipiston_block")); 200 correspond à l'ID, le String suivant correspond au nom du bloc. "new Block(Material.noPushBlock))" indique que le Block dépendra du Material défini. La suite de la ligne est basique, comme chaque bloc Minecraft. Après avoir rajouté cette ligne dans la classe, vous devriez obtenir une erreur sur le Material. C'est là que la classe ouverte tout à l'heure intervient ! Après cette la ligne ci dessous, rajoutez un nouveau Material, comme montré. public static final Material field_151597_y = (new MaterialLogic(MapColor.field_151666_j)).setReplaceable().setTranslucent().setRequiresTool().setNoPushMobility(); Ajoutez donc cette ligne ci. public static final Material noPushBlock = (new Material(MapColor.field_151665_m)).setRequiresTool().setImmovableMobility(); Grâce à ce nouveau Material, on indique que pour casser le bloc, il faudra des outils, et qu'on ne pourra pas bouger le bloc avec un piston. Vous pouvez dès à présent tester votre nouveau bloc ! N'hésitez pas à reporter des bugs si vous en avez. Le résultat en image:
  18. Sponge : Les bases Cette uvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas dUtilisation Commerciale - Pas de Modification 3.0 non transposé. Tout partage implique que vous citiez l'auteur original. -[iNTRODUCTION]- Salutations chères compagnons ! Certains d'entre vous le savent peut-être déjà, mais la communauté minecraft a encore frappé, et cette fois ci, c'est du lourd ! J'ai l'honneur de vous présenter : -[sOMMAIRE]- 1] Sponge : Qu'est ce que c'est ? 2] Mise en place de l'espace de travail [/goancre]A] Avec Maven B] Avec Gradle 3] Création d'un Plugin simple 4] Création d'un Mod Simple [goancre=infos]5] Liens utiles 1] Sponge : Qu'est ce que c'est ? Sponge est une collaboration entre les API récentes (Spout, Flow's APIs...) implémentée sur forge, à l'aide de la communauté de modding Minecraftienne : Cauldron, Glowstone, Spout... C'est une API universelle : elle s'occupe du coté client et du côté serveur, mais actuellement, seul la face serveur est vraiment développée, la face client étant gérée par Forge. Sponge se divise en 3 parties : Sponge API : C'est l'API de Sponge, celle qui nous permettra de faire des Plugins ou des Mods. Tout est regroupé dans cette API, c'est génial vous ne trouvez pas ? Téléchargeable ici. Sponge Server Implementation : C'est un serveur Minecraft qui charge les Plugins. Sponge Forge Implementation : C'est un client Minecraft qui charge les Mods. Les deux implémentations peuvent être téléchargées ici. Bon, vu comme ça, c'est pas très compréhensible, mais pour faire simple, le serveur, c'est le nouveau Cauldron, et le client, c'est le nouveau Forge. Pour le site officiel, il suffit de cliquer sur Spongy un peu plus haut. Je vous conseil de lire ce récapitulatif des évènements qui explique bien l'utilité de Sponge et l'avenir de Minecraft. Bon alors, ça vous intéresse ? On passe à la suite ? C'est parti ! 2] Mise en place de l'espace de travail A] Avec Maven B] Avec Gradle 3] Création d'un Plugin simple On y est, enfin ! C'est là que ça va devenir intéressant ! On va commencer par les plugins, globalement, si vous avez déjà créé un plugin avec Bukkit, vous allez voir que c'est très similaire, à quelques choses près. Créons tout d'abord notre package : Clique droit sur src/main/java New Package Pour ce tutoriel, ce sera : fr.ironcraft.spongetutorial Passons à notre première classe : PluginTutorial package fr.ironcraft.spongetutorial; public class PluginTutorial { } Maintenant, il faut dire à Sponge que notre classe va être un Plugin, pour se faire, ajouter l'annotation @Plugin. @Plugin(id = "TutorialPlugin", name = "Tutorial", version = "1.0") public class PluginTutorial { } Contrairement à Bukkit, les plugins Sponge ne possède pas (encore) de fichier yml. Il est remplacé par cette annotation. Voici la liste des paramètres : id : L'id de votre plugin, ici TutorialPlugin. name : Le nom du plugin (affiché dans le Logger), ici Tutorial. version : La version du plugin, ici 1.0. dependencies : les dépendences du plugin. a ressemble pas mal à Forge hein ? Bon, pour la suite, on va juste apprendre à faire un Hello World, les plugins fonctionnent de la même façon que sur Bukkit, vous pouvez donc vous servir des tutoriels bukkit et vous documenter pour retrouver les bons Events. Pour récupérer les instance du jeu et du logger, on va passer par google, merci google ! @Inject Game game; @Inject Logger logger; On oublie pas les imports : Ctrl + Shift + O sur Eclipse. Attention pour le Logger, le bon import est : import org.slf4j.Logger; Pour les habitués, il n'existe plus de onEnable() et onDisable(), par contre il y a des Events bien pratique, à la place du onEnable, on va utiliser l'Event ServerStartingEvent : @Subscribe public void onServerStarting(ServerStartingEvent event) { logger.info("Bonjour tout le monde !"); } Et voilà, on a notre Hello World ! Je m'en vais partager ce plugin très très utile dans le monde entier, et à mon retour, on parlera de mods ! ;p PS : Si vous voulez la liste des Events, sachez que la plupart sont les même que Forge. Si vous voulez la doc, la voici. 4] Création d'un Mod simple WIP 5] Liens utiles Site Officiel : https://www.spongepowered.org/ Documentation : https://docs.spongepowered.org/ Forums : https://forums.spongepowered.org/ Github : https://github.com/SpongePowered
  19. \--[iNTRODUCTION]--/ Bonjour Développeur ! Ce tutoriel va vous expliquer comment afficher le Pseudo du joueur dans un GUI, dans un message défilant, ou n'importe où ! \--[PR-REQUIS]--/ Ce tutoriel est compatible avec Minecraft 1.6 ou 1.7! \--[sOMMAIRE]--/ 1]Explications 2]Exemples 3]Effets secondaires 1]Explications Minecraft.getMinecraft().getSession().getUsername() Ce code permet de récupérer le pseudo du joueur depuis n'importe quel endroit du code. Vous pouvez l'ajouter dans un texte comme ceci par exemple : String monTexte = "Bienvenue, " + Minecraft.getMinecraft().getSession().getUsername(); 2]Exemples Nous allons maintenant le tester ! Rendons-nous dans la classe Minecraft.java qui se trouve dans le package net.minecraft.client. Puis, faîtes Ctrl + F (pour chercher quelque chose dans un fichier) et puis vous cherchez : Display.setTitle Vous devriez tomber sur quelque chose comme ça : Display.setTitle("Minecraft 1.7.0"); C'est la ligne définissant le titre de la fenêtre principale du jeu. Vous pouvez par exemple rajouter le pseudo : + Minecraft.getMinecraft().getSession().getUsername() Ce qui nous donne : Display.setTitle("Minecraft " + Minecraft.getMinecraft().getSession().getUsername()); Comme on se trouve directement dans la classe Minecraft, on peut épurer ce code en faisant : Display.setTitle("Minecraft " + this.session.getUsername()); Et voilà le résultat : Maintenant vous pouvez le reproduire sur les GUI par exemple ! 3]Effets secondaires Il n'y a pas d'effets secondaires, le pseudo qui est affiché CHANGE selon le joueur bien sur ! C'est tout pour cette astuce ! Merci de l'avoir lu ! Si vous avez besoin d'une autre astuce vous pouvez me faire part de votre idée dans les commentaires ! - DiaZ0te 03.06.2015 16:20 Corrigé et amélioré par TheShark34 -- Amélioré, mis en page et approuvé par Wytrem le 19.06.2015 à 14h55.
  20. Le login caché Cette uvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas dUtilisation Commerciale - Pas de Modification 3.0 non transposé . Tout partage implique que vous citiez l'auteur original. -[iNTRODUCTION]- Salut tout le monde ! En ce moment, je vois encore des demande d'aide ou les personne demande comment cacher le "MDP" du joueur quand il se login. Ce tutoriel a pour but de vous expliquer comment cacher le login du joueur. Bonne lecture !!! -[sOMMAIRE]- A] Partie A : Cacher le login [A 1] Préparation A] Ajout du code dans GuiTextField.java B] Captures d'écrans A] Ajout du code dans GuiTextField.java Pour commencer, nous allons aller à la ligne +/- 460 dans la fonction drawTextBox en dessous de : int var9 = var7; nous allons ajouter un string nommé str4 comme ceci : String str4 =""; entre les guillemets (" ") nous allons mettre le message à afficher après le mot de passe du joueur. Exemple : ensuite, nous allons ajouter une condition avec un if : if(var4.startsWith("/login ") || var4.startsWith("/l ") || var4.startsWith("/reg ") || var4.startsWith("/register ")) { } cette condition dit que si le message (var4) commence par un /login , /l , /register, /reg; Alors, le code en dessous s'effectue dans cette confition, nous allons ajouter 2 string var (String var51 et String var61) String var51 = var4.substring(0, var4.indexOf(" ")); String var61 = var4.substring(var4.indexOf(" ") + 1); var7 = 0; Le string var met un espace ( ) après le mot de passe du joueur. ensuite, nous allons créer plusieurs condition qui vérifie les caractères qu'il y a dans le mot de passe et la longueur. if(var61.matches(".*[a-z].*")); { ++var7; } if(var61.matches(".*[A-Z].*")); { ++var7; } if(var61.matches(".*[0-9].*")); { ++var7; } if(var61.matches(".*[^a-zA-Z0-9].*")); { ++var7; } if(var61.length() < 6); { ++var7; } if(var61.length() >= 8); { ++var7; } if(var61.length() >= 14); { ++var7; } if(var61.length() >= 25); { ++var7; } if(var61.length() >= 35); { ++var7; } après , on dis au jeu de remplacer tout les . et les * var4 = var51 + " " + var61.replaceAll(".","*"); pour finir, on met notre dernière condition qui dit : Que après le mot de passe du joueur, on affiche le str4 if(var61.length() > 0) { var4 = var4 + " " + str4 + "§r"; } Et voilà, vos mots de passe sont cachés ! B] Captures d'écrans : Bientôt
  21. 1.x

    Installation de MCP Cette uvre est mise à disposition selon les termes de la Licence Creative Commons Attribution - Pas dUtilisation Commerciale - Pas de Modification 3.0 non transposé . Tout partage implique que vous citiez l'auteur original. -[iNTRODUCTION]- Bonjour à tous ! Dans ce tutoriel, je vais vous expliquer comment installer MCP, et en résoudre les bugs les plus courants ! -[sOMMAIRE]- 1] Pré-requis 2] Récupération du code source de Minecraft 3] Problèmes connus 1] Pré-requis Pour commencer le modding Minecraft, vous aurez besoin de plusieurs ressources : Le Java Developement Kit, plus communément nommé JDK. Vous pouvez trouver la version appropriée à votre système sur http://java.com Un Environement de Développement Intégré, ou EDI ou IDE (pour Integrated Development Environment). Dans ces tutos, nous utiliserons Eclipse, disponible gratuitement sur http://www.eclipse.org/downloads/ (choisissez la version appelée « Eclipse IDE for Java Developpers »). Une connaissance du langage de programmation Java. De nombreux cours sont disponibles sur la toile, nous vous invitons à y jeter un coup d'oeil. Une version officielle de Minecraft. 2] Récupération des sources de Minecraft* Pour commencer le modding Minecraft, vous aurez besoin de plusieurs ressources : Le code source de Minecraft s'obtient grâce à un logiciel appelé Mod Coder Pack, ou MCP. Vous pouvez le télécharger ici : http://mcp.ocean-labs.de/download.php. Une fois que vous aurez téléchargé le fichier ZIP contenant MCP, extrayez le dans un dossier, par exemple ModCoderPack. Des fichiers vont être extraits de l'archive, comme ceci : Vous devrez également lancez au moins une fois la version de Minecraft que vous souhaitez modifier depuis le launcher officiel. Si vous voulez également modifier le serveur, il vous faudra ensuite télécharger le fichier JAR du serveur. Vous pouvez trouver le serveur correspondant à votre version à ce lien. Ensuite, il suffira de le glisser dans le dossier « jars ». Puis lancez simplement decompile.sh (ou decompile.bat si vous êtes sous Windows) en double cliquant dessus (ou en console pour les intimes). Le programme va s'occuper de récupérer le code source, puis va créer l'architecture des fichiers nécessaire. Vous devriez vous apparaître des dossiers, pour finalement arriver à la figure suivante : Une fois cette étape terminée, vous pouvez ouvrir Eclipse et choisir comme répertoire de travail le sous dossier « eclipse »précédemment créé dans le dossier ModCoderPack : 3] Problèmes connus JSON non trouvé Si vous avez un message d'erreur tel que celui-ci après avoir lancé l'executable decompile : C'est que vous n'avez pas installé la version de Minecraft pour laquelle MCP a été configuré. Pour résoudre ce problème, lancez Minecraft dans la bonne version via le launcher officiel (dans l'exemple, 1.7.10). Project 'Client' is missing required library [...] Cela arrive lorsque certaines bibliothèques ne sont pas à jour. Pour corriger ce problème, il vous faut vous rendre dans la liste des bibliothèques : « Clic droit sur le projet Client Properties Java Build Path Libraries ». Ensuite, vous devrez sélectionner la ou les bibliothèques qui bloquent (elles sont signalées d'une croix rouges) et les supprimer en cliquant sur « Remove ». Ensuite, vous pourrez les ajouter à nouveau, avec le bon chemin d'accès cette fois. Par exemple, si j'obtiens le message d'erreur : Je dois me rendre dans la liste des bibliothèques, supprimer realms-1.5.4.jar et réajouter la bonne version, dans mon cas « jars/libraries/com/mojang/realms/realms-1.3.5.jar ». !! Missing server jar file. Aborting !! Cette erreur arrive quand vous n'avez pas téléchargé le minecraft_server1.x.x.jar ou que vous ne l'avez pas placé dans le dossier « jars ». Si vous ne souhaitez modifier que le client, ne vous affolez pas, et ne tenez pas compte de ce message, le client est lui décompilé.
  22. Avoir un pseudo fixe sur MCP ! Cette uvre est mise à disposition selon les termes de laLicence Creative Commons Attribution - Pas dUtilisation Commerciale - Pas de Modification 3.0 non transposé. Tout partage implique que vous citiez le/les auteur(s) original/originaux des parties utilisées. Un tutoriel a déjà été fait par un membre du forum, mais il a été archivé, et vu que certains n'ont pas envie de farfouiller, je me permets de refaire le tutoriel. Avec une autre méthode en plus. Voici tout de même le lien pour sa version du tutoriel, en 1.6. -[iNTRODUCTION]- Bonjour/bonsoir cher lecteur ! Ce tutoriel a pour but de t'expliquer comment avoir un pseudo fixe au démarrage de Minecraft via MCP (=Minecraft Coder Pack) ! -[PR-REQUIS]- Pour commencer, le principal est d'avoir un Minecraft en 1.6 ou 1.7 décompilé via MCP ! Et un cerveau aussi, pour pouvoir lire le tutoriel. -[sOMMAIRE]- 1] Méthode 1 : Directement dans le code 2] Méthode 2 : Dans les arguments de lancement d'éclipse (par Shark) 3] Quelques réponses utiles à certaines questions 1] Méthode 1 : Directement dans le code Pour commencer, ouvrez Eclipse si ce n'est pas déjà fait, et utiliser la workspace habituelle pour modder. Jusque là rien de compliqué. Ensuite, il s'agira d'aller chercher une classe nommée Main. Elle se situe dans le package nommé net.minecraft.client.main, pas dans « default package ». En suivant mes indications, vous devriez tomber sur une classe fonctionnant avec un système d'ArgumentAcceptingOptionSpec, allant de 1 à 19. Dans notre cas, cela sera la ligne 11 qui nous intéressera. ArgumentAcceptingOptionSpec var11 = var1.accepts("username").withRequiredArg().defaultsTo("Player" + Minecraft.getSystemTime() % 1000L, new String[0]); Explication: Le jeu accepte l'argument "username", et n'étant pas donné via MCP, il utilise celui par défaut, à savoir Player + les millisecondes du moment du lancement. Pour modifier ce pseudo, il nous suffira de remplacer tout ce que la parenthèse après .defaultsTo par notre pseudo. Le code ressemblera donc à ceci : ArgumentAcceptingOptionSpec var11 = var1.accepts("username").withRequiredArg().defaultsTo("TonPseudo"); Avantage de cette méthode : Simple et rapide Inconvénient de cette méthode : Modifie le code ce qui pourrait gêner certains, surtout lors d'un code partagé (Git ou Saros par exemple) Ca ne risque pas d'affecter Minecraft une fois qu'il sera recompilé ? Et bien non ! On définit ici le pseudonyme par défaut, mais une fois que le jeu est lancé via un launcher, même si la case n'est pas remplie, le pseudo par défaut est défini par NoName, et non pas le pseudo renseigné dans le code si dessus. Vous pouvez tout de même utilise la deuxième méthode si vous n'êtes pas optimiste sur ce point. 2] Méthode 2 : Dans les arguments de lancement d'éclipse (Shark) Pour commencer, ouvrez Eclipse sur votre projet MCP. Une fois cela fait, vous voyez ce petit bouton de lancement vert en haut ? Cliquez sur la flèche sur le côté, ce qui devrait ouvrir un petit menu déroulant. Cliquez donc sur Run Configurations... Une fenêtre devrait apparaître, si ce n'est pas déjà fait, cliquez sur Client dans la partie Java Application du menu à droite. Allez ensuite dans l'onglet Arguments, Dans la partie Program Arguments, marquez tout simplement --username VotrePseudo Cliquez sur Apply, puis Close, et voilà ! Avantages de cette méthode : - Marche pour toutes les versions (normalement), et même peut-être Forge ! - Simple, et propre car cela ne modifie pas le code ! 3] Quelques réponses utiles à certaines questions A quoi ça sert ? Pour être honnête avec vous, à pas grand chose. A part si vous êtes OP sur votre serveur et que vous ne voulez pas réop chaque Player... Et également pour les personnes souhaitant bénéficier de leur skin sur l'espace de développement. Tu as volé le tutoriel d'un autre ! Et bien si cela est votre point de vue, alors si vous voulez. L'ancien tutoriel a été cité plus haut, et le tutoriel a été archivé, cela évitera des recherches dans les archives, qui contiennent un nombre de pages qui m'est inconnu. J'ai tout de même bénéficié de l'accord du rédacteur de l'ancien tutoriel avant de faire celui-ci. Surtout que ce n'est que la partie 1 qui a été reprise. C'est tout pour cette astuce, merci d'avoir lu ! N'hésitez pas à laisser votre avis sur celle ci ! -- Corrigé, mis en page par Wytrem le 02.06.2015 à 21h15. -- Partie 2] ajoutée par TheShark34 le 02.06.2015 à 21h48
  23. Forge

    Générer un block (type minerai) -[iNTRODUCTION]- Dans ce tutoriel, je vais vous montrer comment générer un bloc grâce l'api de forge. -[sOMMAIRE]- 1] Explications 2] Résultat final 1] Explications Dirigeons nous vers notre classe principale pourdéclarez la classe GeneratorOreMod : GeneratorOreMod eventGeneratorManager = new GeneratorOreMod(); Une erreur va apparaître sur les mots GeneratorOreMod, c'est tout à fait normal puisque nous n'avons pas encore créé cette classe. Allez maintenant dans votre fonction preInit et enregistrez ceci : GameRegistry.registerWorldGenerator(eventGeneratorManager, 0); Le 0 est le poids de notre générateur (plus il est grand plus tard sera effectuée la génération). Maintenant, nous allons créer notre classe GeneratorOreMod. On vaimplémenter la classe IWorldGenerator comme ceci : import cpw.mods.fml.common.IWorldGenerator; public class GeneratorOreMod implements IWorldGenerator { } L'erreur qui apparaît demande la déclaration explicite d'une méthode (generate), ce que nous allons faire : @Override public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) { switch(world.provider.dimensionId) { case -1: generateNether(world, random, chunkX * 16, chunkZ * 16); case 0: generateSurface(world, random, chunkX * 16, chunkZ * 16); case 1: generateEnd(world, random, chunkX * 16, chunkZ * 16); } } Ceci sert à différentier ma génération de notre minerai dans les 3 dimensions qui sont le nether, le monde normal et l'end. Les 16 représentent la longueur et la largeur d'un chunk dans minecraft. Il faut bien sûr créer ces méthodes : private void generateNether(World world, Random random, int x, int z) { } private void generateEnd(World world, Random random, int x, int z) { } private void generateSurface(World world, Random random, int x, int z) { } Nous allons ajouter une méthode pour nous simplifier la vie (Ctrl + Shift + O pour résoudre les erreurs d'import) : /** * Génère le bloc passé en argument. * * @param block Le type de bloc à générer. * @param world Le monde dans lequel il faut le générer. * @param random Objet random pour calculer au hasard la position des filons. * @param blockXPos Position X de la génération. * @param blockZPos Position Z de la génération. * @param maxX Position X maximale dans le chunk. * @param maxZ Position Z maximale dans le chunk. * @param maxVeinSize La taille maximale d'un filon. * @param chancesToSpawn Le nombre de filons par chunk. * @param minY La hauteur minimum d'un filon. * @param maxY La hauteur maximum d'un filon. */ public void addOreSpawn(Block block, World world, Random random, int blockXPos, int blockZPos, int maxX, int maxZ, int maxVeinSize, int chancesToSpawn, int minY, int maxY) { int maxPossY = minY + (maxY - 1); assert maxY > minY: "La hauteur maximum doit être plus grande que la hauteur minimum."; assert maxX > 0 && maxX <= 16: "La plus grande position X doit être entre 0 et 16."; assert minY > 0: "La hauteur minimum doit être plus grande que 0."; assert maxY < 256 && maxY > 0: "La hauteur maximum doit être entre 0 et 256."; assert maxZ > 0 && maxZ <= 16: "La plus grande position X doit être entre 0 et 16."; int diffBtwnMinMaxY = maxY - minY; for(int x = 0; x < chancesToSpawn; x++) { int posX = blockXPos + random.nextInt(maxX); int posY = minY + random.nextInt(diffBtwnMinMaxY); int posZ = blockZPos + random.nextInt(maxZ); (new WorldGenMinable(block, maxVeinSize)).generate(world, random, posX, posY, posZ); } } Petit rappel sur les assertions : On peut également ajouter un message dans l'instruction assert : assert numero.charAt(0) == '0' : "Le numéro est invalide.";; Et l'erreur sera la suivante : Pour activer les assertions lors du lancement d'un programme, ajoutez "-ea" à la commande java (ou dans la case VM arguments d'Eclipse). Puis, grâce à cette méthode et dans une des 3 que nous avons créée, on peut générer notre bloc : this.addOreSpawn(Blocks.bedrock, world, random, x, z, 16, 16, 3, 2, 10, 20); Ce code génèrera 2 filons de bloc de bedrock par chunk. Ces filons comporteront 3 blocs maximum, et seront situés entre les couches 10 et 20. 2] Code final Au final, le code final est : import java.util.Random; import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.world.World; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.feature.WorldGenMinable; import cpw.mods.fml.common.IWorldGenerator; public class WorldGeneratorMod implements IWorldGenerator { @Override public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider) { switch (world.provider.dimensionId) { case -1: generateNether(world, random, chunkX * 16, chunkZ * 16); case 0: generateSurface(world, random, chunkX * 16, chunkZ * 16); case 1: generateEnd(world, random, chunkX * 16, chunkZ * 16); } } private void generateNether(World world, Random random, int x, int z) { } private void generateEnd(World world, Random random, int x, int z) { } private void generateSurface(World world, Random random, int x, int z) { this.addOreSpawn(Blocks.bedrock, world, random, x, z, 16, 16, 3, 2, 10, 20); } /** * Génère le bloc passé en argument. * * @param block Le type de bloc à générer. * @param world Le monde dans lequel il faut le générer. * @param random Objet random pour calculer au hasard la position des * filons. * @param blockXPos Position X de la génération. * @param blockZPos Position Z de la génération. * @param maxX Position X maximale dans le chunk. * @param maxZ Position Z maximale dans le chunk. * @param maxVeinSize La taille maximale d'un filon. * @param chancesToSpawn Le nombre de filons par chunk. * @param minY La hauteur minimum d'un filon. * @param maxY La hauteur maximum d'un filon. */ public void addOreSpawn(Block block, World world, Random random, int blockXPos, int blockZPos, int maxX, int maxZ, int maxVeinSize, int chancesToSpawn, int minY, int maxY) { int maxPossY = minY + (maxY - 1); assert maxY > minY : "La hauteur maximum doit être plus grande que la hauteur minimum."; assert maxX > 0 && maxX <= 16 : "La plus grande position X doit être entre 0 et 16."; assert minY > 0 : "La hauteur minimum doit être plus grande que 0."; assert maxY < 256 && maxY > 0 : "La hauteur maximum doit être entre 0 et 256."; assert maxZ > 0 && maxZ <= 16 : "La plus grande position X doit être entre 0 et 16."; int diffBtwnMinMaxY = maxY - minY; for (int x = 0; x < chancesToSpawn; x++) { int posX = blockXPos + random.nextInt(maxX); int posY = minY + random.nextInt(diffBtwnMinMaxY); int posZ = blockZPos + random.nextInt(maxZ); (new WorldGenMinable(block, maxVeinSize)).generate(world, random, posX, posY, posZ); } } } -- Correction et mise en page par Wytrem le 27/05/2015.
  24. Bonjour à toutes et à tous ! Ce sujet a pour but de vous présenter le modèle d'une astuce, au niveau de sa mise en page, mais surtout de son contenu. La règle d'or est que tout code que vous montrez doit absolument être expliqué en détails. Typiquement, il ne suffit pas de dire : Mais bien : De manière générale, lorsque vous proposez un code, expliquez : quoi il sert (en détails) ? Comment fonctionne-t-il ? Pourquoi est-il placé à cet endroit ? (facultatif) Toute astuce présentant ces caractéristiques partira d'un très bon pied pour être acceptée. La mise en page d'une astuce est la même que celle d'un tutoriel.