提供: defeatedcrow mod wiki
2016年3月7日 (月) 10:57時点におけるDefeatedcrow (トーク | 投稿記録)による版 (エンチャントの登録)

移動先: 案内検索

強化機能を作る

元ネタの武器には強化システムがあります。簡単に述べると、強化パーツを枠(8個)に付けて性能を伸ばして使用します。 また、強化パーツの育成、経験値による武器の育成、それぞれ育成要素があります。
マイクラの場合はプレイヤーに入るEXPを流用するのが合っていそうですが、それならEXPを消費して強化するエンチャントシステムで代用できそうです。今回の方針として、独自のアイテムや装置をあまり増やすより、バニラにあるものを利用する方針にも合っています。(可能であればバニラ要素の拡張のほうが、他の拡張系MODと合わせてシナジーを期待しやすいので。)

というわけで、火炎放射器アイテムにエンチャントを付けると撃たれる弾が強化状態になるようにします。
理想的には本家同様、"ビルドをよく考えて構築することで見違えるように強くなる"なのですが、マイクラのエンチャントは本を使わない限りランダム付与なので、そこも後々考えたいところです。

ひとまずエンチャントの効果を考えます。独断と偏見によりアレンジを加えているので、本家の厳密な再現などは考えず。

射撃ダメージ増強
本家ではダメージ増加+ダメージ発生間隔を短くするのだが、マイクラのダメージの間隔(というかダメージ発生後の無敵時間)がうまく微調整できなかったため、ダメージ増加にとどめる。無敵時間はエンチャント無関係に0.0Fに。
パンチ
ノックバック強化ですが、射程延長に効果を変更。弾速を上げれば60tickでより遠くまで届くので、弾速を上げる効果として作る。
フレイム
本家は元々火炎属性の武器に火炎効果を上乗せするとダメージが上がります。ということで、ダメージ増加+着火効果でも付与しようかなと。
無限
本家には対応できそうな物がないのでマイクラ準拠のマガジン無限化でしょうか。ただ、本家は敵を倒せば弾薬はぽこぽこドロップするので、有限であることにあまり拘らなくてもいい気がします。
耐久力
マガジンの上限を伸ばす

これに加えて、新規にエンチャントも追加してみます。

毒エンチャント
通常は毒ポーション付与の追加効果。火炎放射器に付けると火炎+毒の複合属性となり、どちらでもない腐食属性としてアーマー貫通攻撃+弱体化ポーション付与の追加効果に変わる。
榴弾エンチャント
モブに当たった場合に爆発の追加効果の発生。火炎放射器の場合は、本家の効果やバランスを考えてキル時にのみ爆発。

毒と火炎の複合属性は本来ガス属性なのですが、イマイチ再現するありがたみがないので腐食に変更。一応、当初は電気や氷のエンチャントも追加する構想はあったのですが、複合属性含めて状態異常効果の再現に苦慮したのでポシャりました。

エンチャント効果を追加する

毒と榴弾はバニラエンチャントではなく、独自のエンチャントとして追加します。

Enchantment継承クラスを作る

  • EnchantPoisonous.class

Poisonousは弓用の毒エンチャント。見ての通りエンチャントのクラスには効果は全く入っていない。効果は、別途ヒット時イベントを利用して作る。

package defeatedcrow.flamethrower.enchant;

import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.EnumEnchantmentType;

// 毒のエンチャント
public class EnchantPoisonous extends Enchantment {
	public EnchantPoisonous(int id, int weight) {
		// superに送るパラメータは、エンチャントのID、エンチャント台での出現頻度、エンチャント対象のタイプ。
		super(id, weight, EnumEnchantmentType.bow);
	}

	// Enchantabilityは素材やレベルによって決まる出現エンチャントの補正値。このメソッドは下限を設定する。
	@Override
	public int getMinEnchantability(int par1) {
		return 10;
	}

	// こちらはエンチャント補正値の上限。
	@Override
	public int getMaxEnchantability(int par1) {
		return super.getMinEnchantability(par1) + 50;
	}

	// エンチャントの最高レベル。
	@Override
	public int getMaxLevel() {
		return 2;
	}
}

今回は他のエンチャントも同様で、エンチャント自体は効果は持たせていない。エンチャントクラスが持っているのは他に、同じアイテムに同時に付けられないエンチャントの制限や、特定ダメージソースからのダメージカット量などの設定は可能。(詳しくはEnchantment.classを参照されたし。)

  • EnchantVenomous.class

ベノムスも毒エンチャントだが、付けられる対象は弓ではなく近接武器。

package defeatedcrow.flamethrower.enchant;

import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.EnumEnchantmentType;

public class EnchantVenomous extends Enchantment {
	public EnchantVenomous(int id, int weight) {
		super(id, weight, EnumEnchantmentType.weapon);
	}

	@Override
	public int getMinEnchantability(int par1) {
		return 15;
	}

	@Override
	public int getMaxEnchantability(int par1) {
		return super.getMinEnchantability(par1) + 50;
	}

	@Override
	public int getMaxLevel() {
		return 2;
	}
}
  • EnchantThunderbolt.class

榴弾エンチャント。英名のサンダーボルトは元ネタに由来している。

package defeatedcrow.flamethrower.enchant;

import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.EnumEnchantmentType;

public class EnchantThunderbolt extends Enchantment {
	public EnchantThunderbolt(int id, int weight) {
		super(id, weight, EnumEnchantmentType.bow);
	}

	@Override
	public int getMinEnchantability(int par1) {
		return 20;
	}

	@Override
	public int getMaxEnchantability(int par1) {
		return super.getMinEnchantability(par1) + 50;
	}

	@Override
	public int getMaxLevel() {
		return 4;
	}
}

エンチャントの登録

これもメインクラスで登録が必要。
注意点として、1.7.10時点ではこれは数値IDが必要であり、他MODと使用IDが被らないようにする。IDチェッカーやNEIのdamp機能を利用してある程度は空いていそうなIDに目星を付けておくが、完璧ではないのでコンフィグでIDを変更可能にしておく。

  • FlameCore.class

まずエンチャントのインスタンスと初期IDの宣言。無機能アイテム追加時に追加したItemインスタンスの下あたりに追加しておく。

public static Item flamethrower;

	public static Enchantment poisonous;
	public static Enchantment venomous;
	public static Enchantment explosive;

	public static int poisonID = 160;
	public static int venomID = 161;
	public static int explosiveID = 162;

	@EventHandler
	public void preInit(FMLPreInitializationEvent event) { ...

次にpreInitメソッドのコンフィグ部分にID変更機能を追加。
注意点として、コンフィグ項目はまだ作られていなかった初回のみ項目を生成し、二回目以降はコンフィグファイルにある値を読み取る。よって、リリース後のバージョンアップで初期値を変えても、既にMODを入れてコンフィグファイルを生成した後では古い初期値が入ったままになったり、新バージョンで削除済みの不要項目が残ったままになってしまう。

@EventHandler
	public void preInit(FMLPreInitializationEvent event) {

		// conf
		Configuration cfg = new Configuration(event.getSuggestedConfigurationFile());
		try {
			cfg.load();
                        // Property(コンフィグの項目)を追加。カテゴリ名、コンフィグ項目名、初期値。
			Property e1ID = cfg.get("enchantment", "Poisonous ID", poisonID);
			Property e2ID = cfg.get("enchantment", "Venomous ID", venomID);
			Property e3ID = cfg.get("enchantment", "Explosive ID", explosiveID);

                        // 項目に入っている値を取得してIDに入れる。
			poisonID = e1ID.getInt();
			venomID = e2ID.getInt();
			explosiveID = e3ID.getInt();

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			cfg.save();
		}

                // 以降、Item登録処理など
       }

そして、initメソッドでエンチャントの登録処理。

@EventHandler
	public void init(FMLInitializationEvent event) throws IOException {

		// entity
		int idFlame = 1;
		EntityRegistry.registerModEntity(EntityFlame.class, "dcsflame.entity_flame", idFlame, this, 128, 5, true);

		// render
		proxy.registerRenderers();

		// ここが追加部分。enchantmentの登録
		poisonous = new EnchantPoisonous(poisonID, 2).setName("dcs.poisonous");
		venomous = new EnchantVenomous(venomID, 5).setName("dcs.venomous");
		explosive = new EnchantThunderbolt(explosiveID, 2).setName("dcs.explosive");
	}