Tu n'arrives pas a faire les arcs



  • salut les amis, c'est encore moi pour un nouvel épisode de : tu n'arrives pas a faire les arcs.

    Donc lors de cette épisode vous l'aurez compris, j'ai un soucis d'arc, mais non pas un soucis venant de l'animation ou autre, mais un soucis par rapport à la portée,  j'ai le code ci -dessous

    
     if(creativeOrInfinity || player.inventory.hasItem(Items.arrow))
            {
                float power = (float)charge / 1.0F;
                power = (power* power + power * 2.0F) / 3.0F;
    
                if ((double)power < 1.0D)
                {
                    return;
                }
    
                if (power > 1.0F)
                {
                    power = 1.0F;
                }
                EntityArrow arrow = new EntityArrow(world, player, power * 0.5F);
    
                if(power == 1.0F)
                {
                    arrow.setIsCritical(true);
                }
    
    

    donc en réalité  l'arc ne charge pas, ou presque pas et je ne comprend pas quel valeur il faut changer pour réussir cette exploit …

    j'espère qu'on pourra m'éclairer sur cela.
    cordialement,
    Sventus


  • Correcteurs

    %(#000000)[[font=monospace]EntityArrow]%(#000000)[[font=monospace] arrow ]%(#666600)[[font=monospace]=] %(#7f0055)[[font=monospace]**new**] %(#000000)[[font=monospace]EntityArrow]%(#666600)[[font=monospace](]%(#000000)[[font=monospace]world]%(#666600)[[font=monospace],]%(#000000)[[font=monospace] player]%(#666600)[[font=monospace],]%(#000000)[[font=monospace] power ]%(#666600)[[font=monospace]*] %(#646464)[[font=monospace]0.5F]%(#666600)[[font=monospace]);]
    

    C'est le 0.5F qui règle la portée et la puissance à la fois.



  • oui mais ça ne change pas entre les différentes charges


  • Administrateurs

    Ce qui serait bien c'est d'avoir la classe complète …



  • 
    package fr.craftesys.craftesys.items;
    
    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;
    import fr.craftesys.craftesys.common.Mods;
    
    public class CobaltBow extends ItemBow
    {
    private IIcon[] iconbuffer;
    private static String[] cobaltbow = new String[] {"_pull1", "_pull2", "_pull3"};
    
    public CobaltBow()
    {
    super();
    this.maxStackSize = 1;
    this.setMaxDamage(384);
    }
    
    @Override
    public void registerIcons(IIconRegister iconregister)
    {
    iconbuffer = new IIcon[cobaltbow.length];
    itemIcon = iconregister.registerIcon(this.getIconString());
    for(int i = 0; i < cobaltbow.length; i++)
    {
    iconbuffer* = iconregister.registerIcon(this.getIconString() + cobaltbow*);
    }
    }
    
    @Override
    public IIcon getIcon(ItemStack stack, int renderPass, EntityPlayer player, ItemStack usingItem, int useRemaining)
    {
    if(usingItem != null && usingItem.getItem().equals(Mods.cobaltbow))
    {
    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 = (float)charge / 1.0F;
    power = (power* power + power * 2.0F) / 3.0F;
    
    if ((double)power < 1.0D)
    {
    return;
    }
    
    if (power > 1.0F)
    {
    power = 3.0F;
    }
    EntityArrow arrow = new EntityArrow(world, player, power * 0.5F);
    
    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 72000;
    }
    
    @Override
    public EnumAction getItemUseAction(ItemStack stack)
    {
    return EnumAction.bow;
    }
    
    @Override
    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(Items.arrow))
    {
    player.setItemInUse(stack, this.getMaxItemUseDuration(stack));
    }
    return stack;
    }
    
    @Override
    public int getItemEnchantability()
    {
    return 1;
    }
    }
    

  • Administrateurs

    int charge = this.getMaxItemUseDuration(stack) - itemInUseCount;
    Cette variable est bonne, tu devrais avoir plus de puissance. Étrange.
    print la valeur pour voir ce que ça donne.



  • 2
    2
    1
    1
    2
    2
    2
    2
    24
    24
    7
    7
    2
    2
    17
    17
    25
    25

    on voit bien que la valeur change, pourtant la flèche arrive toujours à la même distance


  • Administrateurs

    if (power > 1.0F)
    {
    power = 3.0F;
    }

    Je viens de voir ça. Tu réaffecte la valeur 3 à chaque fois. Donc normal que ça va toujours à la même distance.



  • puis aussi c'est la charge que je dois regarder, pas la force xD


  • Administrateurs

    float power = (float)charge / 1.0F;
    La force est définie en fonction de la charge. C'est comme ça que la flèche fonctionne …



  • oué j'ai fait comme ça du coup (c'est pas beau, je préviens) :

    
    if(creativeOrInfinity || player.inventory.hasItem(Items.arrow))
    {
    float power = (float)charge / 1.0F;
    power = (power* power + power * 2.0F) / 3.0F;
    
    if ((double)power < 0.01D)
    {
    return;
    }
    if (charge == 1F)
    {
    power = 0.2F;
    }
    if (charge == 2F)
    {
    power = 0.3F;
    }
    if (charge == 3F)
    {
    power = 0.6F;
    }
    if (charge == 4F)
    {
    power = 0.7F;
    }
    if (charge == 5F)
    {
    power = 0.9F;
    }
    if (charge == 6F)
    {
    power = 1.1F;
    }
    if (charge == 7F)
    {
    power = 1.3F;
    }
    if (charge == 8F)
    {
    power = 1.5F;
    }
    if (charge == 9F)
    {
    power = 1.7F;
    }
    if (charge == 10F)
    {
    power = 1.9F;
    }
    if (charge == 11F)
    {
    power = 2.1F;
    }
    if (charge == 12F)
    {
    power = 2.3F;
    }
    if (charge == 13F)
    {
    power = 2.5F;
    }
    if (charge == 14F)
    {
    power = 2.7F;
    }
    if (charge == 15F)
    {
    power = 2.7F;
    }
    if (charge == 16F)
    {
    power = 3.1F;
    }
    if (charge == 17F)
    {
    power = 3.3F;
    }
    if (charge == 18F)
    {
    power = 3.5F;
    }
    if (charge == 19F)
    {
    power = 3.7F;
    }
    if (charge == 20F)
    {
    power = 3.8F;
    }
    if (charge == 21F)
    {
    power = 3.9F;
    }
    if (charge == 22F)
    {
    power = 4.0F;
    }
    if (charge == 23F)
    {
    power = 4.05F;
    }
    if (charge == 24F)
    {
    power = 4.1F;
    }
    if(charge >24F)
    {
    power = 4.15F;
    }
    
    

    il y a donc diverses portées mais les dégâts fait sont toujours identiques et pourtant j'ai changé la valeur la :

    this.setMaxDamage(1000);



  • Des idées sur le souci du coup ?


  • Administrateurs

    Le setMaxDamage dans le constructeur de l'item c'est pour la durabilité de l'arc –'

    Pour les dégâts de la flèche :
    arrow.setDamage(2.0D); <- valeur par défaut



  • Et le D correspond à quoi ? Ainsi que le F. C'est quoi la valeur de base ?


  • Administrateurs

    J'abandonne …


  • Correcteurs

    Oublie le D et le F, ce qui compte c'est la valeur.



  • pourtant même en mettant cela :

    if(var9 > 0)
    {
    arrow.setDamage(2000D);
    }

    les dégâts restent inchangés


  • Administrateurs

    il sort d'où ce var9 ?



  • int var9 = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, stack);

    bon je crois avoir compris 😛


  • Administrateurs

    Du-coup c'est résolu ?