提供: Minecraft Modding Wiki
移動先: 案内検索

解説

ここで説明するのは新村人の追加と取引の設定を行うサンプルです。

既存の村人に取引を追加する場合は

VillagerRegistry.instance().registerVillageTradeHandler(sampleVillagerProfession, new SampleVillagerTrade());

でsampleVillagerProfessionに既存の職業IDを指定し、追加する取引内容を記述したSampleVillagerTradeクラスを作成してください。

AddTradeクラスを作成

package addtrade;

import cpw.mods.fml.common.Mod;
import cpw.mods.fml.common.event.FMLInitializationEvent;
import cpw.mods.fml.common.registry.VillagerRegistry;

@Mod(modid = AddTrade.modID, name = AddTrade.modID, version = "1.0")
public class AddTrade {
	public static final String modID = "AddTrade";

	public static VillagerSample villager;
	/*
	 * 村人の職業ID
	 * 既存の職業ID(0~4)と重複しない値を設定してください
	 */
	public static int sampleVillagerProfession = 5;

	@Mod.Init
	public void init(FMLInitializationEvent event) {
		villager = new VillagerSample();
		
		/*
		 * 村人を登録しています(村人の職業ID,村人のテクスチャ位置)
		 */
		VillagerRegistry.instance().registerVillagerType(sampleVillagerProfession, "/addtrade/gfx/sample.png");
		
		/*
		 * 村人の取引内容を登録しています(村人の職業ID,IVillageTradeHandlerを実装したクラス)
		 */
		VillagerRegistry.instance().registerVillageTradeHandler(sampleVillagerProfession, villager);
		
		/*
		 * 村人の家を登録しています
		 */
		VillagerRegistry.instance().registerVillageCreationHandler(new VillageCreationHandleSampleHouse());
	}
}

VillagerSampleクラスを作成

package addtrade;

import java.util.Random;

import net.minecraft.entity.passive.EntityVillager;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.village.MerchantRecipe;
import net.minecraft.village.MerchantRecipeList;
import cpw.mods.fml.common.registry.VillagerRegistry.IVillageTradeHandler;
/*
 * 村人との取引を操作するクラスです
 */
public class VillagerSample implements IVillageTradeHandler {

	@Override
	public void manipulateTradesForVillager(EntityVillager villager,
			MerchantRecipeList recipeList, Random random) {
		/*
		 * 今回新しく作成した職業用の取引内容を登録します
		 * 既存の職業に取引を追加したりもできます
		 */
		if(villager.getProfession() == AddTrade.sampleVillagerProfession) {
			/*
			 * エメラルド1個を村人に売って金のリンゴを1個買う取引を登録
			 */
			recipeList.add(new MerchantRecipe( new ItemStack(Item.emerald.itemID, 1, 0), Item.appleGold));

			/*
			 * ブレイズロッド1個を村人に売ってエメラルド2個を買う取引を登録
			 */
			recipeList.add(new MerchantRecipe( new ItemStack(Item.blazeRod), new ItemStack(Item.emerald.itemID, 2, 0)));
		}
	}
}

VillageCreationHandleSampleHouseクラスを作成

package addtrade;

import java.util.List;
import java.util.Random;

import net.minecraft.util.MathHelper;
import net.minecraft.world.gen.structure.ComponentVillageStartPiece;
import net.minecraft.world.gen.structure.StructureVillagePieceWeight;
import cpw.mods.fml.common.registry.VillagerRegistry.IVillageCreationHandler;

public class VillageCreationHandleSampleHouse implements IVillageCreationHandler {

	@Override
	public StructureVillagePieceWeight getVillagePieceWeight(Random random, int i) {
		/*
		 * 詳細不明ですが構造物生成の重み付けをしているようです
		 */
		return new StructureVillagePieceWeight(getComponentClass(), 20, MathHelper.getRandomIntegerInRange(random, i, i+1));
	}

	@Override
	public Class<?> getComponentClass() {
		/*
		 * 実際に構造物を生成するクラスを返却します
		 * ここでは今回新しく追加するサンプル村人用の家生成クラスを返却しています
		 */
		return ComponentVillageSampleHouse.class;
	}

	@Override
	public Object buildComponent(StructureVillagePieceWeight villagePiece,
			ComponentVillageStartPiece startPiece, List pieces, Random random,
			int p1, int p2, int p3, int p4, int p5) {
		/*
		 * 構造物生成のトリガーで呼ばれます
		 * ここでは今回追加したサンプル村人用の家生成メソッドにそのまま処理を丸投げしています
		 */
		return ComponentVillageSampleHouse.buildComponent(startPiece, pieces, random, p1, p2, p3, p4, p5);
	}

}

ComponentVillageSampleHouseクラスを作成

package addtrade;

import java.util.List;
import java.util.Random;

import net.minecraft.world.World;
import net.minecraft.world.gen.structure.ComponentVillage;
import net.minecraft.world.gen.structure.ComponentVillageStartPiece;
import net.minecraft.world.gen.structure.StructureBoundingBox;

/*
 * サンプル村人用の家を生成するクラスです
 * 注意点として、既存のComponentVillageのサブクラス(ComponentVillageHouse1等)継承したクラスを作成しては「いけません」
 * 構造物生成はクラスの一致で見ているのでサブクラスにしてしまうと既存のクラスが優先されてしまい、新しい構造物が生成されません
 */
public class ComponentVillageSampleHouse extends ComponentVillage {

	protected ComponentVillageSampleHouse(
			ComponentVillageStartPiece par1ComponentVillageStartPiece, int par2) {
		super(par1ComponentVillageStartPiece, par2);
		/*
		 * バニラのソースコードのコピーになってしまうのでここは省略
		 * ComponentVillageのサブクラスを参照のこと
		 */
	}

	@Override
	public boolean addComponentParts(World world, Random random,
			StructureBoundingBox structureboundingbox) {
		/*
		 * バニラのソースコードのコピーになってしまうのでここは省略
		 * ComponentVillageのサブクラスを参照のこと
		 */
		return false;
	}

	public static Object buildComponent(ComponentVillageStartPiece startPiece,
			List pieces, Random random, int p1, int p2, int p3, int p4, int p5) {
		/*
		 * バニラのソースコードのコピーになってしまうのでここは省略
		 * ComponentVillageのサブクラスを参照のこと
		 */
		return null;
	}

	@Override
	protected int getVillagerType(int par1) {
		/*
		 * 今回追加した村人用の家であることを示します
		 * このメソッドの戻り値に基いた職業の村人がスポーンします
		 */
		return AddTrade.sampleVillagerProfession;
	}

}