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

この記事は"Minecraft Forge 1.7.10-10.13.0.1207"を前提MODとしています。

Stone pickaxe.png
中級者向けのチュートリアルです。
C entity.png
Entityに関係のあるチュートリアルです。

解説[編集]

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

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

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;
import net.minecraft.world.gen.structure.MapGenStructureIO;

@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;

	@SidedProxy(clientSide = "addtrade.ClientProxy")
	public static CommonProxy proxy;

	@Mod.EventHandler
	public void init(FMLInitializationEvent event) {
		villager = new VillagerSample();

		/*
		 * 村人の職業IDを登録しています
		 */
                VillagerRegistry.instance().registerVillagerId(sampleVillagerProfession);

		/*
		 * 村人を登録しています
		 */
		VillagerRegistry.instance().registerVillageTradeHandler(sampleVillagerProfession, villager);

		/*
		 * 村人の家を登録しています。ただ村人だけ追加したい場合は「〜"VCHSHP");」まで記述不要です
		 * また、VillageCreationHandleSampleHouseクラスも村人だけ追加したい場合は不要です
		 */
		VillagerRegistry.instance().registerVillageCreationHandler(new VillageCreationHandleSampleHouse());
                /*
                 * #Forge1.7.10-10.13.0.1230現在
                 * 通常は、registerStructureで建物のStructureStartを継承したクラスを登録した後
                 * func_143031_aで建物のStructureComponentを継承したクラスを登録する必要がありますが
                 * 今回は、両方でComponentVillageSampleHouseを登録しています
                 */
                MapGenStructureIO.registerStructure(ComponentVillageSampleHouse.class, "VCHSH");
                MapGenStructureIO.func_143031_a(ComponentVillageSampleHouse.class, "VCHSHP");

                proxy.init();
	}
}

VillagerSampleクラスを作成[編集]

package addtrade;

import java.util.Random;

import net.minecraft.entity.passive.EntityVillager;
import net.minecraft.init.Items;
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(Items.emerald, 1, 0), Items.golden_apple));

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

CommonProxyクラスを作成[編集]

package addtrade;

public class CommonProxy {
    public void init() {

    }
}

ClientProxyクラスを作成[編集]

package addtrade;

import cpw.mods.fml.common.registry.VillagerRegistry;
import net.minecraft.util.ResourceLocation;

public class ClientProxy extends CommonProxy {
    public void init() {
	/*
	 * 村人のテクスチャを指定しています
	 */
        VillagerRegistry.instance().registerVillagerSkin(AddTrade.sampleVillagerProfession, new ResourceLocation("/addtrade/gfx/sample.png"));
    }
}

VillageCreationHandleSampleHouseクラスを作成[編集]

package addtrade;

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

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

public class VillageCreationHandleSampleHouse implements IVillageCreationHandler {

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

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

	@Override
	public Object buildComponent(StructureVillagePieces.PieceWeight villagePiece,
                                 StructureVillagePieces.Start 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.StructureBoundingBox;
import net.minecraft.world.gen.structure.StructureVillagePieces;

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

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

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

	public static Object buildComponent(StructureVillagePieces.Start 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;
	}

}