追加矢を通常の弓でも撃てるようにするイベント. 旧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