Sommaire
Introduction
Dans ce tutoriel, nous allons créer un arc que l’on pourras customisé.
Pré-requis
- Avoir quelque connaissance en java
- s’avoir comment créer un item
- un chwiya de matière grise
Code
La classe principale :
Dans un premier temps nous allons crée l’item et nous allons le register je ne vais pas revenir sur ces points la
Bon voila mon code
obsidianBow= new obsidianBow.setUnlocalizedName("obsidianBow").setTextureName(MODID+ ":obsidian_bow").setCreativeTab(CreativeTabs.tabCombat);
pour le " .setTextureName(MODID+ “:obsidian_bow_”) " on choisit la texture de base de l’arc (celle ou il n’est pas bander)
On auras une erreur donc il faudra créer la classe “obsidianBow” .
La classe de l’arc :
une fois la classe créer on l’extends a ItemBow (en gros nous allons créer un item est le customisé afin d’avoir un arc )
et on y ajoute :
//les variables
public static final String[] bowPullIconNameArray = new String[] {"1", "2", "3"}; // c'est pour les textures
@SideOnly(Side.CLIENT)
private IIcon[] iconArray;
/*
*Le constructeur de l'arc
*/
public obsidianBow( )
{
this.maxStackSize = 1;
this.setMaxDamage(800);
this.setCreativeTab(CreativeTabs.tabCombat);
}
/*
* appelé lorsque le joueur relâche l'item, c'est aussi ici ou son géré les différent enchantement comme l'infinité, c'est la aussi ou l'on vas ajouté des amélioration pour notre arc
*/
public void onPlayerStoppedUsing(ItemStack stack, World world, EntityPlayer player, int par4)
{
int j = this.getMaxItemUseDuration(stack) - par4;
ArrowLooseEvent event = new ArrowLooseEvent(player, stack, j);
MinecraftForge.EVENT_BUS.post(event);
if (event.isCanceled())
{
return;
}
j = event.charge;
boolean flag = player.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, stack) > 0;
if (flag || player.inventory.hasItem(Item.arrow))
{
float f = (float)j / 20.0F;
f = (f * f + f * 2.0F) / 3.0F;
if ((double)f < 0.1D)
{
return;
}
if (f > 1.0F)
{
f = 1.0F;
}
EntityArrow entityarrow = new EntityArrow(world, player, f * 2.0F);
if (f == 1.0F)
{
entityarrow.setIsCritical(true);
}
int k = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, stack);
if (k > 0)
{
entityarrow.setDamage(entityarrow.getDamage() + (double)k * 0.5D + 0.5D);
}
int l = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, stack);
if (l > 0)
{
entityarrow.setKnockbackStrength(l);
}
if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, stack) > 0)
{
entityarrow.setFire(100);
}
stack.damageItem(1, player);
world.playSoundAtEntity(player, "random.bow", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + f * 0.5F);
if (flag)
{
entityarrow.canBePickedUp = 2;
}
else
{
player.inventory.consumeInventoryItem(Item.arrow);
}
if (!world.isRemote)
{
world.spawnEntityInWorld(entityarrow);
}
}
}
/*
* Combien de temps il faut pour utiliser l'item
*/
public int getMaxItemUseDuration(ItemStack stack)
{
return 80000;
}
/*
*renvoie l'action qui spécifie ce que l'animation à jouer lorsque l'item et utilisé
*/
public EnumAction getItemUseAction(ItemStack stack)
{
return EnumAction.bow;
}
/*
* Appelé à chaque fois que cet objet est équipé et le bouton droit de la souris est enfoncé
*/
public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player)
{
ArrowNockEvent event = new ArrowNockEvent(player, stack);
MinecraftForge.EVENT_BUS.post(event);
if (event.isCanceled())
{
return event.result;
}
if (player.capabilities.isCreativeMode || player.inventory.hasItem(Item.arrow))
{
player.setItemInUse(stack, this.getMaxItemUseDuration(stack));
}
return stack;
}
/*
* retourne le niveaux d'enchanbilité de l'arc.
*/
public int getItemEnchantability()
{
return 1;
}
@SideOnly(Side.CLIENT) //vus que le render doit étre sur le client
public void registerIcons(IIconRegister IconRegister)
{
this.itemIcon = IconRegister.registerIcon(this.getIconString());
this.iconArray = new IIcon[bowPullIconNameArray.length];
for (int i = 0; i < this.iconArray.length; ++i)
{
this.iconArray[i] = IconRegister.registerIcon(this.getIconString() + "_" + bowPullIconNameArray[i]);
}
}
/*
* utilisé pour faire défiler les textures en fonction de leur durée utilisée on utilise le tableaux
*/
@Override
public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining)
{
if(usingItem != null && usingItem.getItem().equals(this))
{
int k = usingItem.getMaxItemUseDuration() - useRemaining;
if(k >= 18)
return iconArray[2];
if(k > 13)
return iconArray[1];
if(k > 0)
return iconArray[0];
}
return getIconIndex(stack);
}
}
Quelques explications :
public void onPlayerStoppedUsing(ItemStack stack, World world, EntityPlayer player, int par4)
{
int j = this.getMaxItemUseDuration(stack) - par4;
ArrowLooseEvent event = new ArrowLooseEvent(player, stack, j);
MinecraftForge.EVENT_BUS.post(event);
if (event.isCanceled())
{
return;
}
j = event.charge;
boolean flag = player.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, stack) > 0;
if (flag || player.inventory.hasItem(Item.arrow))
{
float f = (float)j / 20.0F;
f = (f * f + f * 2.0F) / 3.0F;
if ((double)f < 0.1D)
{
return;
}
if (f > 1.0F)
{
f = 1.0F;
}
EntityArrow entityarrow = new EntityArrow(world, player, f * 2.0F);
if (f == 1.0F)
{
entityarrow.setIsCritical(true);
}
int k = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, stack);
if (k > 0)
{
entityarrow.setDamage(entityarrow.getDamage() + (double)k * 0.5D + 0.5D);
}
int l = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, stack);
if (l > 0)
{
entityarrow.setKnockbackStrength(l);
}
if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, stack) > 0)
{
entityarrow.setFire(100);
}
stack.damageItem(1, player);
world.playSoundAtEntity(player, "random.bow", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + f * 0.5F);
if (flag)
{
entityarrow.canBePickedUp = 2;
}
else
{
player.inventory.consumeInventoryItem(Item.arrow);
}
if (!world.isRemote)
{
world.spawnEntityInWorld(entityarrow);
}
}
}
C’est cette méthode qui les différent enchantements , la puissance, la vitesse de bandage de l’arc ainsi que le lancé de la flèche (consommation dans l’inventaire) est aussi ici ou l’on vas pouvoir customisé notre arc .
public void registerIcons(IIconRegister IconRegister)
{
this.itemIcon = IconRegister.registerIcon(this.getIconString());
this.iconArray = new IIcon[bowPullIconNameArray.length];
for (int i = 0; i < this.iconArray.length; ++i)
{
this.iconArray[i] = IconRegister.registerIcon(this.getIconString() + "_" + bowPullIconNameArray[i]);
}
}
Cette méthode registre les nouvelles textures de l’arc grâce aux tableaux créer juste avant elle ajoutes les string enregistré dans le tableaux au nom de la texture de base de l’arc
@Override
public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining)
{
if(usingItem != null && usingItem.getItem().equals(this))
{
int k = usingItem.getMaxItemUseDuration() - useRemaining;
if(k >= 18)
return iconArray[2];
if(k > 13)
return iconArray[1];
if(k > 0)
return iconArray[0];
}
return getIconIndex(stack);
}
Celle la fait défilé les textures enregistré grâce a la méthode précédente en fonction du temps de bandage c’est grâce a cette méthode que l’on change la texture de l’arc
Les textures :
Si vous vous en rappelé le nom de ma texture de base est " obsidian_bow " et dans l’array de la class de l’arc on a utilisé les valeur suivantes " “1”, “2”, “3” " donc mes textures devrais êtres successivement appelé :
" obsidian_bow"
" obsidian_bow_1 "
" obsidian_bow_2 "
" obsidian_bow_3 "
le " _ " vien du faite que l’on ai mis " + “_” + " dans la méthode qui permet de register les différentes textures .
Comme dans cette image :
Résultat
Le commits Github : https://github.com/Yeyvo/Tutorial-Bow-forge/
Crédits
Rédaction :
- Yeyvo
Correction :