Résolu Zoom arc + puissance trop élevé
-
Bonjour ! Aujourd’hui j’ai crée un arc. Cependant quand je charge, le jeu ne zoom pas. J’ai regardé sur le forum mais le seul tuto que j’ai trouvé c’est en 1.6 et il ne marche pas chez moi
Egalement la puissance de l’arc est trop élevé, je charge à peine, il tire une flèche comme si j’avais chargé
Voilà merci
-
SCAREX - “Je vais utiliser mon pouvoir !”
SCAREX utilise son pouvoir pour savoir ce qui ne va pas dans le code.
L’utilisation a échoué.
SCAREX - “Ah oui c’est vrai, sans le code je peux rien faire.” -
Ah oui, mince x/
Classe principale :
:::
erreur sur TickRegistryTickRegistry.registerTickHandler(new TickClientHandler(), Side.CLIENT);
:::
Classe TickClientHandler :
:::
Partout ou il y a “Tick” et sur getLabel()package com.heartshadow.mod.renders; import java.util.EnumSet; import com.heartshadow.mod.HSMOD; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.common.ObfuscationReflectionHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.client.renderer.EntityRenderer; public class TickClientHandler implements ITickHandler { @Override public void tickStart(EnumSet <ticktype>type, Object… tickData) { final Minecraft minecraft = FMLClientHandler.instance().getClient(); } @Override public void tickEnd(EnumSet <ticktype>type, Object... tickData) { final Minecraft minecraft = FMLClientHandler.instance().getClient(); final EntityPlayerSP player = minecraft.thePlayer; if (type.equals(EnumSet.of(TickType.CLIENT))) { if(HSMOD.zoom) { if(minecraft.gameSettings.thirdPersonView == 0 && minecraft.currentScreen == null) { zoom(6F); } }else { zoom(1.0F); } } } @Override public EnumSet <ticktype>ticks() { return EnumSet.of(TickType.RENDER, TickType.CLIENT); } @Override public String getLabel() { return "TickClientHandler"; } public static void zoom(float value) { ObfuscationReflectionHelper.setPrivateValue(EntityRenderer.class, FMLClientHandler.instance().getClient().entityRenderer, value, "cameraZoom"); } }
:::
Classe de l’arc (pour la puissance) :
:::package com.heartshadow.mod.tools; import com.heartshadow.mod.HSMOD; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.init.Items; import net.minecraft.item.EnumAction; import net.minecraft.item.ItemBow; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.player.ArrowLooseEvent; import net.minecraftforge.event.entity.player.ArrowNockEvent; public class ItemDeldaBow extends ItemBow { private IIcon[] iconbuffer; private static String[] bowpullname = new String[] {"_pull_0", "_pull_1", "_pull_2"}; public ItemDeldaBow() { super(); this.maxStackSize = 1; this.setMaxDamage(384); } @Override public void registerIcons(IIconRegister iconregister) { iconbuffer = new IIcon[bowpullname.length]; itemIcon = iconregister.registerIcon(this.getIconString()); for(int i = 0; i < bowpullname.length; i++) { iconbuffer* = iconregister.registerIcon(this.getIconString() + bowpullname*); } } @Override public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining) { if(usingItem != null && usingItem.getItem().equals(HSMOD.deldaBow)) { int k = usingItem.getMaxItemUseDuration() - useRemaining; if(k >= 18) return iconbuffer[2]; if(k > 13) return iconbuffer[1]; if(k > 0) return iconbuffer[0]; } return getIconIndex(stack); } @Override public void onPlayerStoppedUsing(ItemStack stack, World world, EntityPlayer player, int itemInUseCount) { int charge = this.getMaxItemUseDuration(stack) - itemInUseCount; ArrowLooseEvent event = new ArrowLooseEvent(player, stack, charge); MinecraftForge.EVENT_BUS.post(event); if(event.isCanceled()) { return; } charge = event.charge; boolean creativeOrInfinity = player.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, stack) > 0; if(creativeOrInfinity || player.inventory.hasItem(Items.arrow)) { float power = 20.0F; if((double)power < 0.1D) { return; } if(power > 1.0F) { power = 1.0F; } EntityArrow arrow = new EntityArrow(world, player, power * 4.0F); if(power == 1.0F) { arrow.setIsCritical(true); } int var9 = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, stack); if(var9 > 0) { arrow.setDamage(arrow.getDamage() + (double)var9 * 0.5D + 0.5D); } int var10 = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, stack); if(var10 > 0) { arrow.setKnockbackStrength(var10); } if(EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, stack) > 0) { arrow.setFire(100); } stack.damageItem(1, player); world.playSoundAtEntity(player, "random.bow", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + power * 0.5F); if(creativeOrInfinity) { arrow.canBePickedUp = 2; } else { player.inventory.consumeInventoryItem(Items.arrow); } if(!world.isRemote) { world.spawnEntityInWorld(arrow); } } } @Override public ItemStack onEaten(ItemStack stack, World world, EntityPlayer player) { return stack; } @Override public int getMaxItemUseDuration(ItemStack stack) { return 1200; } @Override public EnumAction getItemUseAction(ItemStack stack) { return EnumAction.bow; } @Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { if(!world.isRemote) { HSMOD.zoom = !HSMOD.zoom; } ArrowNockEvent event = new ArrowNockEvent(player, stack); MinecraftForge.EVENT_BUS.post(event); if(event.isCanceled()) { return event.result; } if(player.capabilities.isCreativeMode || player.inventory.hasItem(Items.arrow)) { player.setItemInUse(stack, this.getMaxItemUseDuration(stack)); } return stack; } @Override public int getItemEnchantability() { return 1; } }
:::
Voilà</ticktype></ticktype></ticktype>
-
Il faut passer par tick event en 1.7, ITickHandler n’existe plus.
-
Ouai, je vois pas trop comment faire et sinon pour la puissance de l’arc ?
-
float power = 20.0F;
Ta variable power vaut toujours 20 et ne prends pas en compte la valeur de charge.Voici le code de Minecraft :
float power = (float)charge / 20.0F; power = (power * power + power * 2.0F) / 3.0F;
-
ça fonctionne mais j’ai pas réussi pour le zoom
-
Tu veux le zoom de base ou tu veux zoomer plus ?
-
Pour zoomer + que la normale avec l’arc, faut passer par un TickHandlerEvent.
Mais sinon, le EnumAction devrait le faire. -
SCAREX ==> Le même type de zoom que l’on a avec l’arc
Elias ==> Euuuh, ouais pas tout compris mais oui ^^’
-
Alors juste mettre çà suffit :
@Override public EnumAction getItemUseAction(ItemStack stack) { return EnumAction.bow; }
Si tu veux plus, pas besoin de passer par un tick handler, il faut juste modifier la variable dans l’entityRenderer de cette façon :
ObfuscationReflectionHelper.setPrivateValue(EntityRenderer.class, Minecraft.getMinecraft().entityRenderer, valeurDuZoom, "cameraZoom", "af", "field_78503_V");
et utiliser les events de forge sur l’utilisation des items (PlayerUseItemEvent.leventVoulut, par exemple si tu veux le modifier lorsque le joueur arrête d’utiliser l’item ce sera PlayerUseItemEvent.Stop).
-
Alors pour la première chose, il y était déjà et pour la deuxieme, je n’ai pas cette variable nul part.
-
Si tu l’as déjà, çà veut dire que minecraft zoom déjà lorsque tu essaies de tirer.
Quelle valeur ? Celle du zoom ? Normal, il faut la mettre, c’est celle que tu veux…