提供: Minecraft Modding Wiki
2012年3月22日 (木) 08:03時点におけるYykimoto (トーク | 投稿記録)による版
移動先: 案内検索

この記事はModLoaderを前提MODとしています。

ソース解説

mod_hogeliquidクラスを作成

package net.minecraft.src;

public class mod_hogeliquid extends BaseMod
{
	/*
	 * 動く部分のBlockIDと、水源部分のBlockIDの2つで1つの液体となります。
	 */
	public static Block hogeLiquidMoving;
	public static Block hogeLiquidStill;
	
	public mod_hogeliquid()
	{
	}
	
	public String getVersion()
	{
		return "1.1";
	}
	
	public void load()
	{
		/*
		 * 長々と定義していますがやってることは単純です。
		 * BlockFlowingHogeクラスでBlockIDを100で設定し、水と同じ動作をさせます。
		 * 全く新しいものを作るのであれば、Materialを基本に別クラスから取得させる。
		 * setHardnessで100Fを設定(壊すものじゃないので)
		 * setLightOpacityは溶岩のように光るかどうかをintで設定します。
		 */
		hogeLiquidMoving = new BlockFlowingHoge(100, Material.water);
		hogeLiquidMoving.setHardness(100F);
		hogeLiquidMoving.setLightOpacity(3);
		hogeLiquidMoving.setBlockName("Hoge Moving");
		hogeLiquidMoving.disableStats();
		hogeLiquidMoving.setRequiresSelfNotify();
		
		/*
		 * 上とおなじ。
		 */
		hogeLiquidStill = new BlockStationaryHoge(101, Material.water);
		hogeLiquidStill.setHardness(100F);
		hogeLiquidStill.setLightOpacity(3);
		hogeLiquidStill.setBlockName("Hoge Still");
		hogeLiquidStill.disableStats();
		hogeLiquidStill.setRequiresSelfNotify();
		
		/*
		 * ブロックとして登録する。
		 */
		ModLoader.RegisterBlock(hogeLiquidMoving);
		ModLoader.RegisterBlock(hogeLiquidStill);
		/*
		 * 表示名を設定する。
		 */
		ModLoader.AddName(hogeLiquidMoving, "Hoge Moving");
		ModLoader.AddName(hogeLiquidStill, "Hoge Still");
	}
}

BlockFlowingHogeクラスを作成

長々と書きますがやってることは単純です。 既存の「BlockFlowing」クラスをコピペし、クラス名に依存してる部分修正。 <source lang="java"> package net.minecraft.src;

import java.util.Random;

public class BlockFlowingHoge extends BlockFluid {

   int numAdjacentSources;
   boolean isOptimalFlowDirection[];
   int flowCost[];
   protected BlockFlowingHoge(int i, Material material)
   {
       super(i, material);
       numAdjacentSources = 0;
       isOptimalFlowDirection = new boolean[4];
       flowCost = new int[4];
   }
   
   /*
    *コピペだけじゃ芸がないので、ここ液体の色を設定できます。
    */
   public int colorMultiplier(IBlockAccess iblockaccess, int i, int j, int k)
   {
       return 0xffffff;
   }
   private void updateFlow(World world, int i, int j, int k)
   {
       int l = world.getBlockMetadata(i, j, k);
       world.setBlockAndMetadata(i, j, k, blockID + 1, l);
       world.markBlocksDirty(i, j, k, i, j, k);
       world.markBlockNeedsUpdate(i, j, k);
   }
   public void updateTick(World world, int i, int j, int k, Random random)
   {
       int l = getFlowDecay(world, i, j, k);
       byte byte0 = 1;
       if (blockMaterial == Material.lava && !world.worldProvider.isHellWorld)
       {
           byte0 = 2;
       }
       boolean flag = true;
       if (l > 0)
       {
           int i1 = -100;
           numAdjacentSources = 0;
           i1 = getSmallestFlowDecay(world, i - 1, j, k, i1);
           i1 = getSmallestFlowDecay(world, i + 1, j, k, i1);
           i1 = getSmallestFlowDecay(world, i, j, k - 1, i1);
           i1 = getSmallestFlowDecay(world, i, j, k + 1, i1);
           int j1 = i1 + byte0;
           if (j1 >= 8 || i1 < 0)
           {
               j1 = -1;
           }
           if (getFlowDecay(world, i, j + 1, k) >= 0)
           {
               int l1 = getFlowDecay(world, i, j + 1, k);
               if (l1 >= 8)
               {
                   j1 = l1;
               }
               else
               {
                   j1 = l1 + 8;
               }
           }
           if (numAdjacentSources >= 2 && blockMaterial == Material.water)
           {
               if (world.getBlockMaterial(i, j - 1, k).isSolid())
               {
                   j1 = 0;
               }
               else if (world.getBlockMaterial(i, j - 1, k) == blockMaterial && world.getBlockMetadata(i, j, k) == 0)
               {
                   j1 = 0;
               }
           }
           if (blockMaterial == Material.lava && l < 8 && j1 < 8 && j1 > l && random.nextInt(4) != 0)
           {
               j1 = l;
               flag = false;
           }
           if (j1 != l)
           {
               l = j1;
               if (l < 0)
               {
                   world.setBlockWithNotify(i, j, k, 0);
               }
               else
               {
                   world.setBlockMetadataWithNotify(i, j, k, l);
                   world.scheduleBlockUpdate(i, j, k, blockID, tickRate());
                   world.notifyBlocksOfNeighborChange(i, j, k, blockID);
               }
           }
           else if (flag)
           {
               updateFlow(world, i, j, k);
           }
       }
       else
       {
           updateFlow(world, i, j, k);
       }
       if (liquidCanDisplaceBlock(world, i, j - 1, k))
       {
           if (blockMaterial == Material.lava && world.getBlockMaterial(i, j - 1, k) == Material.water)
           {
               world.setBlockWithNotify(