ForgeAPI > ArrowLooseEvent

追加矢を通常の弓でも撃てるようにするイベント. 旧IArrowLooseHandler.

クラス

@Cancelable
public class ArrowLooseEvent extends PlayerEvent
{
    public final ItemStack bow;
    public int charge;
 
    public ArrowLooseEvent(EntityPlayer player, ItemStack bow, int charge)
    {
        super(player);
        this.bow = bow;
        this.charge = charge;
    }
}
 

使用例

public class ArrowNockEventHook
{
    @ForgeSubscribe
    public void onArrowLoose(ArrowLooseEvent event)
    {
        EntityPlayer player = event.entityPlayer;
        ItemStack itemstack = event.bow;
        int heldTime        = event.charge;
        World world         = player.worldObj;
 
        boolean isInfinity = player.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, itemstack) > 0;
 
        float baseDamage = (float)heldTime / 20.0F;
        baseDamage = (baseDamage * baseDamage + baseDamage * 2.0F) / 3.0F;
 
        if ((double)baseDamage < 0.1D)
        {
            return;
        }
 
        if (baseDamage > 1.0F)
        {
            baseDamage = 1.0F;
        }
 
        EntityNewArrow entityArrow = new EntityNewArrow(@Mod.proxy.getServerWorld(), player, baseDamage * 2.0);
 
        if (isInfinity || player.inventory.hasItem(@Mod.itemNewArrow.shiftedIndex))
        {            
            if (baseDamage == 1.0F)
            {
                entityArrow.func_70243_d(true);
            }
 
            int powerLevel = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, itemstack);
 
            if (powerLevel > 0)
            {
                entityArrow.setDamage(entityArrow.getDamage() + (double)powerLevel * 0.5D + 0.5D);
            }
 
            int punchLevel = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, itemstack);
 
            if (punchLevel > 0)
            {
                entityArrow.setKnockbackStrength(punchLevel);
            }
 
            if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, itemstack) > 0)
            {
                entityArrow.setFire(100);
            }
 
            itemstack.damageItem(1, player);
            world.playSoundAtEntity(player, "random.bow", 1.0F, 1.0F / (random.nextFloat() * 0.4F + 1.2F) + baseDamage * 0.5F);
 
            if (isInfinity)
            {
                entityArrow.canBePickedUp = 2;
            }
            else
            {
                player.inventory.consumeInventoryItem(@Mod.itemNewArrow.shiftedIndex);
            }
 
            if (!world.isRemote)
            {
                world.spawnEntityInWorld(entityNewArrow);
            }            }
            event.setCanceled(true);
        }
    }
}
 
基本はItemBowのonPlayerStoppedUsingのまま. onArrowNockとセットで使うのが通例. onArrowNockで判定した矢をonArrowLooseで飛ばすというのはハンドラだった過去のバージョンと差異はない.
最終更新:2012年08月25日 22:20