提供: Minecraft Modding Wiki
この記事は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(