Remettre de Hit'n Block en 1.12
Sam 2 Mai - 15:38
Hit n Block en 1.12 !
-[Pré-requis]-
1) Avoir décompilé MCP
1] ItemSword
Pour commencer, nous allons nous rendre dans la classe ItemSword, dans le constructeur, en dessous de this.setMaxDamage(material.getMaxUses()); on va ajouter
- Code:
this.addPropertyOverride(new ResourceLocation("blocking"), new IItemPropertyGetter()
{
public float apply(ItemStack stack, @Nullable World worldIn, @Nullable EntityLivingBase entityIn)
{
return entityIn != null && entityIn.isHandActive() && entityIn.getActiveItemStack() == stack ? 1.0F : 0.0F;
}
});
Maintenant en bas de la classe en dessous de la fonction public Multimap<String, AttributeModifier> getItemAttributeModifiers(EntityEquipmentSlot equipmentSlot) On ajoute trois fonctions
- Code:
public EnumAction getItemUseAction(ItemStack stack)
{
return EnumAction.BLOCK;
}
public int getMaxItemUseDuration(ItemStack stack)
{
return 72000;
}
public ActionResult<ItemStack> onItemRightClick(World itemStackIn, EntityPlayer worldIn, EnumHand playerIn)
{
ItemStack itemstack = worldIn.getHeldItem(playerIn);
worldIn.setActiveHand(playerIn);
return new ActionResult<ItemStack>(EnumActionResult.SUCCESS, itemstack);
}
Si on a des erreurs, on import les classes manquantes.
Maintenant on va se rendre dans la classe ItemRenderer qui se trouve dans le package net.minecraft.client.renderer
On va chercher ceci
- Code:
this.renderItemInFirstPerson(abstractclientplayer, partialTicks, f1, EnumHand.MAIN_HAND, f3, this.itemStackMainHand, f5);
Une fois trouvé, on va remplacer par
- Code:
this.renderItemInFirstPerson(f, abstractclientplayer, partialTicks, f1, EnumHand.MAIN_HAND, f3, this.itemStackMainHand, f5);
On cherche la fonction public void renderItemInFirstPerson(AbstractClientPlayer p_187457_1_, float p_187457_2_, float p_187457_3_, EnumHand p_187457_4_, float p_187457_5_, ItemStack p_187457_6_, float p_187457_7_)
On va remplacer la ligne
- Code:
public void renderItemInFirstPerson(AbstractClientPlayer p_187457_1_, float p_187457_2_, float p_187457_3_, EnumHand p_187457_4_, float p_187457_5_, ItemStack p_187457_6_, float p_187457_7_)
par
- Code:
public void renderItemInFirstPerson(float ticks, AbstractClientPlayer p_187457_1_, float p_187457_2_, float p_187457_3_, EnumHand p_187457_4_, float p_187457_5_, ItemStack p_187457_6_, float p_187457_7_)
La ou il y a écrit
- Code:
boolean flag = p_187457_4_ == EnumHand.MAIN_HAND;
Juste en dessous on mets:
- Code:
EntityPlayerSP entityplayersp = this.mc.player;
float f1_ = entityplayersp.getSwingProgress(p_187457_7_);
On va se rendre à l'endroit ou il y a écrit
- Code:
case BLOCK:
this.transformSideFirstPerson(enumhandside, p_187457_7_);
break;
On remplace par
- Code:
case BLOCK:
if (p_187457_6_.getItem() instanceof ItemShield)
{
this.transformSideFirstPerson(enumhandside, p_187457_7_);
}
else if (p_187457_6_.getItem() instanceof ItemSword && flag1) {
int i = 1;
GlStateManager.translate((float) i * 0.56F, -0.52F + p_187457_7_ * -0.6F, -0.72F);
float f = MathHelper.sin(ticks * ticks * (float) Math.PI);
float f1 = MathHelper.sin(MathHelper.sqrt(ticks) * (float) Math.PI);
GlStateManager.rotate(f * -20.0F, 0.0F, 1.0F, 0.0F);
GlStateManager.rotate(f1 * -20.0F, 0.0F, 0.0F, 1.0F);
GlStateManager.rotate(f1 * -80.0F, 1.0F, 0.0F, 0.0F);
this.transformSwordRotation(true);
}
else if (p_187457_6_.getItem() instanceof ItemSword && !flag1) {
int i = -1;
GlStateManager.translate((float) i * 0.0F, -0.52F + p_187457_7_ * -0.6F, -0.72F);
float f = MathHelper.sin(ticks * ticks * (float) Math.PI);
float f1 = MathHelper.sin(MathHelper.sqrt(ticks) * (float) Math.PI);
GlStateManager.rotate(f * -20.0F, 0.0F, 1.0F, 0.0F);
GlStateManager.rotate(f1 * -20.0F, 0.0F, 0.0F, 1.0F);
GlStateManager.rotate(f1 * -80.0F, 1.0F, 0.0F, 0.0F);
this.transformSwordRotation(false);
} else {
this.transformSideFirstPerson(enumhandside, p_187457_7_);
}
break;
Si on a des erreurs, on import les classes manquantes.
Ce que nous venons d'ajouter sert à faire une rotation de l'item ainsi que de savoir quelle main est utilisée.
Nous avons une erreur sur this.transformSwordRotation();, on ajoute une nouvelle fonction pour résoudre ce problème
- Code:
private void transformSwordRotation(boolean right) {
if (right) {
GlStateManager.translate(-0.2F, 0.2F, 0.0F);
GlStateManager.rotate(30.0F, 1.0F, 1.0F, 0.0F);
GlStateManager.rotate(-130.0F, 1.0F, -1.0F, 0.0F);
GlStateManager.rotate(0.0F, 0.0F, 1.0F, 0.0F);
}
else {
GlStateManager.translate(-0.5F, 0.1F, 0.0F);
GlStateManager.rotate(-30.0F, 1.0F, 1.0F, 0.0F);
GlStateManager.rotate(-90.0F, 1.0F, 1.0F, 1.0F);
GlStateManager.rotate(0.0F, 0.0F, 1.0F, 0.0F);
}
}
Cette fonction servira à faire une rotation de l'item que l'on a en main.
le boolean sert à savoir si c'est à droite ou bien à gauche que nous faisont la rotation
Maintenant que cela est fait, il n'y a plus qu'aller voir le résultat en jeu !
2] Minecraft.java
Maintenant nous allons nous rendre dans la classe Minecraft.java
On va cherche la fonction private void sendClickBlockToController(boolean leftClick)
A la ligne
- Code:
if (this.leftClickCounter <= 0 && !this.player.isHandActive())
On va la modifier pour avoir
- Code:
if (this.leftClickCounter <= 0)
Maintenant que cela est modifié, on retourne en jeu et maintenant nous pouvons avoir l'animation de click infini dans le sol (voir vidéo)
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|