Zoom arc



  • Bonjour, j'ai encore un problème avec mon arc, j'ai fait des recherches mais toutes ont abouties à rien donc voilà j'explique mon problème: Mon arc fonctionne entièrement mais il n'y a aucun zoom, l'animation est correcte, le joueur est ralenti dès qu'il tire la flèche mais pas de zoom dès qu'on reste appuyé sur le clic droit… Une solution ?

    Ah oui et le EnumAction bow ne change absolument rien ^^

    Ma classe:

    
    import java.util.EnumSet;
    
    import cpw.mods.fml.relauncher.Side;
    import cpw.mods.fml.relauncher.SideOnly;
    import net.minecraft.client.renderer.texture.IIconRegister;
    import net.minecraft.creativetab.CreativeTabs;
    import net.minecraft.enchantment.Enchantment;
    import net.minecraft.enchantment.EnchantmentHelper;
    import net.minecraft.entity.SharedMonsterAttributes;
    import net.minecraft.entity.ai.attributes.IAttributeInstance;
    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.Item;
    import net.minecraft.item.ItemBow;
    import net.minecraft.item.ItemStack;
    import net.minecraft.util.IIcon;
    import net.minecraft.world.World;
    import net.minecraftforge.client.ForgeHooksClient;
    import net.minecraftforge.common.MinecraftForge;
    import net.minecraftforge.event.entity.player.ArrowLooseEvent;
    import net.minecraftforge.event.entity.player.ArrowNockEvent;
    
    public class ItemmodBow extends ItemBow 
    {
        public static final String[] bowPullIconNameArray = new String[] {"pulling_0", "pulling_1", "pulling_2"};
        @SideOnly(Side.CLIENT)
        private IIcon[] iconArray;
    
        public ItemmodBow()
        {
            this.maxStackSize = 1;
            this.setMaxDamage(384);
            this.setCreativeTab(CreativeTabs.tabCombat);
        }
    
        /**
         * called when the player releases the use item button. Args: itemstack, world, entityplayer, itemInUseCount
         */
        public void onPlayerStoppedUsing(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer, int par4)
        {
            int j = this.getMaxItemUseDuration(par1ItemStack) - par4;
    
            ArrowLooseEvent event = new ArrowLooseEvent(par3EntityPlayer, par1ItemStack, j);
            MinecraftForge.EVENT_BUS.post(event);
            if (event.isCanceled())
            {
                return;
            }
    
            j = event.charge;
    
            boolean flag = par3EntityPlayer.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, par1ItemStack) > 0;
    
            if (flag || par3EntityPlayer.inventory.hasItem(Items.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(par2World, par3EntityPlayer, f * 2.0F);
    
                if (f == 1.0F)
                {
                    entityarrow.setIsCritical(true);
                }
    
                int k = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, par1ItemStack);
    
                if (k > 0)
                {
                    entityarrow.setDamage(entityarrow.getDamage() + (double)k * 0.5D + 0.5D);
                }
    
                int l = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, par1ItemStack);
    
                if (l > 0)
                {
                    entityarrow.setKnockbackStrength(l);
                }
    
                if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, par1ItemStack) > 0)
                {
                    entityarrow.setFire(100);
                }
    
                par1ItemStack.damageItem(1, par3EntityPlayer);
                par2World.playSoundAtEntity(par3EntityPlayer, "random.bow", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + f * 0.5F);
    
                if (flag)
                {
                    entityarrow.canBePickedUp = 2;
                }
                else
                {
                    par3EntityPlayer.inventory.consumeInventoryItem(Items.arrow);
                }
    
                if (!par2World.isRemote)
                {
                    par2World.spawnEntityInWorld(entityarrow);
                }
    
            }
        }
    
        public ItemStack onEaten(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
        {
            return par1ItemStack;
        }
    
        /**
         * How long it takes to use or consume an item
         */
        public int getMaxItemUseDuration(ItemStack par1ItemStack)
        {
            return 72000;
        }
    
        /**
         * returns the action that specifies what animation to play when the items is being used
         */
    
        public EnumAction getItemUseAction(ItemStack par1ItemStack)
        {
            return EnumAction.bow;
        }
    
        /**
         * Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer
         */
        public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer)
        {
            ArrowNockEvent event = new ArrowNockEvent(par3EntityPlayer, par1ItemStack);
            MinecraftForge.EVENT_BUS.post(event);
            if (event.isCanceled())
            {
                return event.result;
            }
    
            if (par3EntityPlayer.capabilities.isCreativeMode || par3EntityPlayer.inventory.hasItem(Items.arrow))
            {
                par3EntityPlayer.setItemInUse(par1ItemStack, this.getMaxItemUseDuration(par1ItemStack));
            }
    
            return par1ItemStack;
        }
    
        /**
         * Return the enchantability factor of the item, most of the time is based on material.
         */
        public int getItemEnchantability()
        {
            return 1;
        }
    
        @SideOnly(Side.CLIENT)
        public void registerIcons(IIconRegister par1IconRegister)
        {
            this.itemIcon = par1IconRegister.registerIcon("mod:mod_bow_standby");
            this.iconArray = new IIcon[bowPullIconNameArray.length];
    
            for (int i = 0; i < this.iconArray.length; ++i)
            {
                this.iconArray* = par1IconRegister.registerIcon("mod:mod_bow_" + bowPullIconNameArray*);
            }
        }
    
        @Override
        @SideOnly(Side.CLIENT)
        public IIcon getIcon (ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining){
        if (usingItem == null) { return itemIcon; }
        int ticksInUse = stack.getMaxItemUseDuration() - useRemaining;
        if (ticksInUse > 17){
        return iconArray[2];
        } else if (ticksInUse > 13){
        return iconArray[1];
        } else if (ticksInUse > 0) {
        return iconArray[0];
        } else{
        return itemIcon;
        }
        }
    
        /**
         * used to cycle through icons based on their used duration, i.e. for the bow
         */
        @SideOnly(Side.CLIENT)
        public IIcon getItemIconForUseDuration(int par1)
        {
            return this.iconArray[par1];
        }
    
    }
    
    

    Merci d'avance à ceux qui auront la gentilesse de m'aider ! 🙂



  • Je sais pas comment tu as fait tes recherches : https://www.minecraftforgefrance.fr/showthread.php?tid=2367&highlight=zoom



  • Je suis déjà tomber sur ce sujet, rien ne marche…

    Le enumaction ne donne rien et l'autre méthode ne fait pas un zoom progressif



  • As-tu essayé de changer de version de minecraft ? Car la 1.7.2 n'est pas stable



  • Je ne veux pas passer en 1.7.10 car les skins cauldron 1.7.10 sont bugués



  • C'est à dire ?

    Car le problème c'est que ton problème peut venir de là



  • Je vais essayé en 1.7.10 mais je ne pense pas que sa vienne de là

    EDIT: Non toujours le même problème, l'arc fonctionne parfaitement sauf le zoom et se que je voulais dire c'est que je préfère rester en 1.7.2 car en 1.7.10 le multijoueur est bugué et n'affiche pas les skins



  • Après quelques recherches, j'ai trouvé l'endroit qui pose problème : EntityPlayerSP:329 (si le numéro de ligne est le même sur ta version). Afin de modifier ça, créer un event handler pour intercepter l'event FOVUpdateEvent pour modifier la valeur en fonction du temps d'utilisation de ton item



  • Heu …. Quoi ? ^^ Je ne suis qu'un débutant tu peux développer s'il te plaît ? 😛 Créer un event jusque là ça va mais après j'ai pas compris ^^



  • Pour savoir comment utiliser les events : https://www.minecraftforgefrance.fr/showthread.php?tid=716

    Tu dois utiliser l'event FOVUpdateEvent afin de modifier le FOV du joueur.


  • Administrateurs

    @'ErkoZ':

    Je ne veux pas passer en 1.7.10 car les skins cauldron 1.7.10 sont bugués

    Les skins fonctionnent en 1.7.10.
    Si ce n'est pas le cas c'est parce que ton serveur est en mode offline. Ce qui n'est pas bien du tout.



  • 
    @SubscribeEvent
    public void onTooltip(FOVUpdateEvent event)
    {
    float f = 1.0F;
    if(event.entity.isUsingItem() && event.entity.getItemInUse().getItem() == mod.emerald_bow)
    {
    int i = event.entity.getItemInUseDuration();
    float f1 = (float)i / 20.0F;
    
    if (f1 > 1.0F)
    {
    f1 = 1.0F;
    }
    else
    {
    f1 *= f1;
    }
    
    f *= 1.0F - f1 * 0.15F;
    }
    
    }
    }
    
    

    J'ai fait un truc comme ça mais ça ne marche pas… Comprend pas 😞



  • As-tu enregistré l'event ?
    Pourquoi avoir appelé ta fonction onTooltip ?
    Ici tu ne fais que des calculs sans jamais spécifié la valeur retournée, regarde les fonctions disponibles



  • onToolTIp car à la base c'est un copié collé du tuto de Robin mais je vais changer et oui j'ai enregistré l'event.

    J'ai fait un truc qui ressemble à ça, j'ai copié du code du fov de l'arc de Minecraft mais il crash:

    
    @SubscribeEvent
    public float onUseBow(FOVUpdateEvent event)
    {
    float f = 1.0F;
    
    if (event.entity.capabilities.isFlying)
    {
    f *= 1.1F;
    }
    
    IAttributeInstance iattributeinstance = event.entity.getEntityAttribute(SharedMonsterAttributes.movementSpeed);
    f = (float)((double)f * ((iattributeinstance.getAttributeValue() / (double)event.entity.capabilities.getWalkSpeed() + 1.0D) / 2.0D));
    
    if (event.entity.capabilities.getWalkSpeed() == 0.0F || Float.isNaN(f) || Float.isInfinite(f))
    {
    f = 1.0F;
    }
    
    if (event.entity.isUsingItem() && event.entity.getItemInUse().getItem() == Items.bow)
    {
    int i = event.entity.getItemInUseDuration();
    float f1 = (float)i / 20.0F;
    
    if (f1 > 1.0F)
    {
    f1 = 1.0F;
    }
    else
    {
    f1 *= f1;
    }
    
    f *= 1.0F - f1 * 0.15F;
    }
    
    return ForgeHooksClient.getOffsetFOV(event.entity, f);
    }
    
    

  • Administrateurs

    Les fonctions d'event doit être des void.



  • Mais si je met void le return ne fonctionne pas alors comment je pourrais faire ?


  • Administrateurs

    Remplaces
    return ForgeHooksClient.getOffsetFOV(event.entity, f);
    par
    event.newfov = f;



  • @'robin4002':

    Remplaces
    return ForgeHooksClient.getOffsetFOV(event.entity, f);
    par
    event.newfov = f;

    Merci ça marche !