【Modding】Baubles対応アイテムを作ろう その2

2016-07-14_00-06-50.png

Moddingの道は長く険しい。
だがそれだけに、達成したときの喜びも大きい。

・Baublesスロットに置かれているアイテムを調べよう

public static boolean getBaubles(Item par1Item,EntityPlayer player)
{
if(Loader.isModLoaded("Baubles"))
{
IInventory baubles = BaublesApi.getBaubles(player);
boolean bauble = false;
if(baubles != null)
{
for(int i = 0; i < baubles.getSizeInventory(); i++)
{
ItemStack itemstack = baubles.getStackInSlot(i);
if(itemstack != null)
{
if(par1Item == baubles.getStackInSlot(i).getItem())
{
return true;
}
}
}
}
}
return false;
}

こんな感じでメソッドをちゃちゃちゃっと作ってやればあっさり調べられます。
戻り値を変えたりすればItemStackを返すことも出来ますね。

Baublesスロットはプレイヤーインベントリのように見えますが、
実はプレイヤーインベントリではありません。

プレイヤーインベントリでないということは、
当然、player.inventory.hasItem()などで調べることができません。
そういうわけでこういうメソッドを作って調べてあげる必要があります。

・動作を設定しよう
onWornTick()メソッドをオーバーライドして、そのアイテム固有の動作をさせるのもいいでしょう。
ですがonWornTick()メソッドはonUpdate()メソッドとできることがあまり変わりません。

たとえば落下ダメージを無効にしたいときは2つのパターンがありますが、
onWornTick()、onUpdate()内でfallDistanceを0にしつづける方法と、
イベントを登録してインベントリを監視し、所持している時にonPlayerFall内でイベントをキャンセルする方法です。

前者の場合、fallDistanceが0になっているのでどんなに高所から落下してもパーティクルが発生しません。
後者の場合はしっかりパーティクルが飛び散っていきます。
(たしかこういう違いがあったはず)

アイテムの数が少なければ前者の方法でも良いですが、
アイテムが増えてくると前者の方法は少々力技なので更新するときが大変です。
やはりここは後者の方法を使ってソースコードを綺麗にまとめておきたいですね。

public class ARNoFallDamageEventHooks
{
private boolean noFallDamage = false;
@SubscribeEvent//(1.6までは@ForgeSubscribe)
public void LivingUpdate(LivingUpdateEvent event)
{
if(event.entityLiving != null && event.entityLiving instanceof EntityPlayer && event.entityLiving .worldObj.isRemote)
{
EntityPlayerSP player = (EntityPlayerSP) event.entityLiving;
Falling(player);
}
}
private void Falling(EntityPlayerSP player)
{
//クリエイティブでないなら
if(!player.capabilities.isCreativeMode)
{
//飛行が許可されていないなら
if(!player.capabilities.allowFlying)
{
if(equipArmor(ARGetItemRegister("bedrockboots"), player, ARMOR_BOOTS))
{
this.noFallDamage = true;
}
else if(equipArmor(ARGetItemRegister("angelusboots"), player, ARMOR_BOOTS))
{
this.noFallDamage = true;
}
else if(hasItem(ARGetItemRegister("gravitationfeather"), player)||(hasItem(ARGetItemRegister("supergravitationfeather"), player)))
{
this.noFallDamage = true;
}
else if(hasItem(ARGetItemRegister("exchangeiginiton"), player)||(hasItem(ARGetItemRegister("ultimateexchangeiginiton"), player)))
{
this.noFallDamage = true;
}
else if(getBaubles(ARGetItemRegister("gravitationfeather"), player)||getBaubles(ARGetItemRegister("supergravitationfeather"), player))
{
this.noFallDamage = true;
}
else if(getBaubles(ARGetItemRegister("exchangeiginiton"), player)||(getBaubles(ARGetItemRegister("ultimateexchangeiginiton"), player)))
{
this.noFallDamage = true;
}
else
{
this.noFallDamage = false;
}
}
}
}
//落下時ダメージ無効化処理。LivingFallEventが実装されたバージョンのみ
@SubscribeEvent
public void onPlayerFall(LivingFallEvent event)
{
if (event.entityLiving instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer)event.entityLiving;
if (this.noFallDamage)
{
event.setCanceled(true);
}
}
}
}

スポンサーサイト

コメント

コメントの投稿


管理者にだけ表示を許可する