提供: defeatedcrow mod wiki
移動先: 案内検索

<目次に戻る>

弾倉アイテムを作る

今の段階ではまだ、仮として弾倉補充にはバニラ火薬を使っているままです。なので、次は弾倉アイテムを作ります。
これについては構想段階からどんなアイテムにするかは決めています。元ネタでは、"デトナイト"なる液状の燃料を燃やして噴出している設定なので、このMODでは色々なMODにある液体燃料を材料にして作成できるようにします。

アイテム作成

  • ItemMagazine.class
package defeatedcrow.flamethrower.item;

import net.minecraft.item.Item;

public class ItemMagazine extends Item {

	public ItemMagazine() {
		this.setMaxStackSize(16);
		this.setMaxDamage(0);
		this.setTextureName("dcsflame:magazine");
	}

}

将来的に拡張するかもというのと、instanceof判定を可能にしたいので、この程度の内容でも一応Itemクラスを作成しています。

  • FlameCore.class

作ったアイテムを登録するため、preInitメソッドに以下を追加。

		this.magazine = new ItemMagazine().setCreativeTab(CreativeTabs.tabCombat).setUnlocalizedName(
				"dcsflame.magazine");
		GameRegistry.registerItem(magazine, "dcsflame.magazine");
  • ItemIgnis.class

inItemRightClickのマガジン関係で使っていたバニラ火薬を追加した弾倉に差し替え

	@Override
	public ItemStack onItemRightClick(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) {

		boolean inf = EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, par1ItemStack) > 0;
		int power = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, par1ItemStack);
		int fire = EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, par1ItemStack);
		int punch = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, par1ItemStack);
		int poison = EnchantmentHelper.getEnchantmentLevel(FlameCore.poisonous.effectId, par1ItemStack);
		int unb = EnchantmentHelper.getEnchantmentLevel(Enchantment.unbreaking.effectId, par1ItemStack);

		boolean creative = par3EntityPlayer.capabilities.isCreativeMode;

		boolean hasCharge = false;
		if (par1ItemStack.getItem() == this) {
			int c2 = this.discharge(par1ItemStack, 1, false);
			if (c2 > 0) {
				hasCharge = true;
				this.discharge(par1ItemStack, 1, true);
			}
		}

		if (creative || hasCharge) {
			float fireDam = 2.0F * fire;
			float powerDam = 0.4F * power;
			float poisonDam = 0.5F * poison;
			float dam = 2.0F + fireDam + powerDam + poisonDam;
			float ram = par2World.rand.nextFloat();
			int cooltime = 0; // 一旦凍結
			// if (cooltime < 0)
			// cooltime = 0;
			float speed = 1.0F + (punch * 1.0F);

			for (int i = 0; i < 4; i++) {
				float f = speed * (i * 0.35F) + ram;
				EntityFlame bullet = new EntityFlame(par2World, par3EntityPlayer, f, 0.0F, dam, 4.0F, cooltime);
				bullet.setFire(100);
				if (poison > 0) {
					bullet.setCorrosion(true);
				}
				if (fire > 0) {
					bullet.setAdvFire(true);
				}
				if (!par2World.isRemote) {
					par2World.spawnEntityInWorld(bullet);
				}
			}
			par2World.playSoundAtEntity(par3EntityPlayer, "dcsflame:flame", 0.6F, 1.6F);

		} else {
			if (par3EntityPlayer.inventory.hasItem(FlameCore.magazine) || inf) { // ...変更箇所(1)
				NBTTagCompound nbt = par1ItemStack.getTagCompound();
				if (nbt != null) {
					nbt.setInteger("magazine", 100 + unb * 50);
					par1ItemStack.setTagCompound(nbt);
				} else {
					NBTTagCompound nbt2 = new NBTTagCompound();
					nbt2.setInteger("magazine", 100 + unb * 50);
					par1ItemStack.setTagCompound(nbt2);
				}
				if (!inf)
					par3EntityPlayer.inventory.consumeInventoryItem(FlameCore.magazine); // ...変更箇所(2)

				par2World.playSoundAtEntity(par3EntityPlayer, "random.door_close", 1.0F,
						1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + 1.3F);
			}
		}
		return par1ItemStack;
	}