BuildCraft Utilsクラス

Minecraft 1.4.7, Minecraft Forge #534, BuildCraft 3.4.2の環境で、非常に便利なbuildcraft.core.utils.Utilsクラスについてまとめる。

BuildCraft 3.4.2のソースコードhttps://github.com/BuildCraft/BuildCraft/tree/6ab8a50b6408a75833a7ddc02e30c61d14f72756 に存在する。

フィールド

pipeMinPos/pipeMaxPos

public static final float pipeMinPos = 0.25F;
public static final float pipeMaxPos = 0.75F;

パイプのサイズ。これを変えると太さを調整できる?(意味は無いが)

pipeNormalSpeed

public static float pipeNormalSpeed = 0.01F;

アイテムがパイプを流れるスピード。

メソッド

addToRandomInventory

public static ItemStack addToRandomInventory(ItemStack stack, World world, int x, int y, int z, ForgeDirection from)

近傍インベントリを検索し、見つかった中からランダムに選んだインベントリへstackを入れ、インベントリに入ったのと同じサイズのItemStackを返す。fromはコード的には恐らく除外すべきDirectionを表しているのだが、BuildCraftの全コードの中でこの引数は全てForgeDirection.UNKNOWNだったので無視しても良いかと思う。これではわかりにくいので、サンプルとしてクァーリーの採掘のメソッドを読んでみる。

build.factory.TileQuarry 444行目〜471行目

   private void mineStack(ItemStack stack) {
        // First, try to add to a nearby chest
        ItemStack added = Utils.addToRandomInventory(stack, worldObj, xCoord, yCoord, zCoord, ForgeDirection.UNKNOWN);
        stack.stackSize -= added.stackSize;

        // Second, try to add to adjacent pipes
        if (stack.stackSize > 0) {
            Utils.addToRandomPipeEntry(this, ForgeDirection.UNKNOWN, stack);
        }

        // Lastly, throw the object away
        if (stack.stackSize > 0) {
            float f = worldObj.rand.nextFloat() * 0.8F + 0.1F;
            float f1 = worldObj.rand.nextFloat() * 0.8F + 0.1F;
            float f2 = worldObj.rand.nextFloat() * 0.8F + 0.1F;

            EntityItem entityitem = new EntityItem(worldObj, xCoord + f, yCoord + f1 + 0.5F, zCoord + f2, stack);

            entityitem.lifespan = BuildCraftCore.itemLifespan;
            entityitem.delayBeforeCanPickup = 10;

            float f3 = 0.05F;
            entityitem.motionX = (float) worldObj.rand.nextGaussian() * f3;
            entityitem.motionY = (float) worldObj.rand.nextGaussian() * f3 + 1.0F;
            entityitem.motionZ = (float) worldObj.rand.nextGaussian() * f3;
            worldObj.spawnEntityInWorld(entityitem);
        }
    }

addToRandomInventoryを呼び出し、帰ってきたItemStack(added)のstackSizeを引いた分が残りのItemStackとなることが分かる。450行目のifでstack.stackSize > 0という条件があるが、これは残りのスタック数のカウントだと取れるため、addToRandomPipeEntry(後述)を用いてパイプへ流している。また、それでも残りがある場合は(455行目)、EntityItemをスポーンさせてドロップアイテムとして出力するようにしている。

getPipeFloorOf

public static float getPipeFloorOf(ItemStack item)

実際にはitemに依らず、pipeMinPosが返される点、PipeItemsObsidianクラスの243行目でEntityPassiveItemのコンストラクタに指定されている点、レンダラクラスでのオフセット指定として使われている点から、パイプ内を流れるアイテムの高さの下限となる値を返すと推測される。

get2dOrientation

public static ForgeDirection get2dOrientation(Position pos1, Position pos2)

pos1から見たpos2の方向をForgeDirectionで返す。この時見られるのはXZのみで、Y軸はここでは無視される(get3dOrientationを利用する。)

get3dOrientation

public static ForgeDirection get3dOrientation(Position pos1, Position pos2)

pos1から見たpos2の方向をForgeDirectionで返す。並行であれば、get2dOrientationが返り、それ以外であればアングルによってForgeDirection.UP/DOWNが返る。

addToRandomPipeEntry

public static boolean addToRandomPipeEntry(TileEntity tile, ForgeDirection from, ItemStack items)

接しているランダムなパイプへItemStackを送出する。送出時点でitems.stackSizeが減算されるため、addToRandomInventoryメソッドのような面倒な処理は不要。

dropItems

public static void dropItems(World world, ItemStack stack, int i, int j, int k)
public static void dropItems(World world, IInventory inventory, int i, int j, int k)

アイテムをワールドへドロップする。IInventoryを指定できるため、インベントリをまるごとドロップすることも可能。

getTile

public static TileEntity getTile(World world, Position pos, ForgeDirection step)

posからstep方向に1つ進んだ先のTileEntityインスタンスを取得する。TileEntityが存在しない場合はWorld#getBlockTileEntityの都合でnullが返る。

getInventory

public static IInventory getInventory(IInventory inv)

IInventoryがTileEntityChestの時、ラージチェストかどうかをチェックして自動的に変換して返す。それ以外は無視なので、基本的にチェストをラージチェストとして扱うためだけにある。

getNearbyAreaProvider

public static IAreaProvider getNearbyAreaProvider(World world, int i, int j, int k)

隣接するIAreaProviderを返す。フィラー・クァーリーでの青マーカーの位置の取得はこれを利用している。

createLaser

public static EntityBlock createLaser(World world, Position p1, Position p2, LaserKind kind)

精密作業台に使うレーザーのEntityを生成する。

createLaserBox

public static EntityBlock[] createLaserBox(World world, double xMin, double yMin, double zMin, double xMax, double yMax, double zMax, LaserKind kind)

青マーカーを右クリックしたりレッドストーン入力したりした際に出るボックスを作る。なので、実は内部的にはあの青/赤線はレーザーと同じもの。

handleBufferedDescription

public static void handleBufferedDescription(ISynchronizedTile tileSynch)

BuildCraftの内部的なTileEntityの同期のためのメソッド。基本外部から使うことはない。

liquidId

public static int liquidId(int blockId)

与えられたブロックIDについて、液体ならそのIDを返し、それ以外なら0を返す。

liquidFromBlockId

public static LiquidStack liquidFromBlockId(int blockId)

ブロックIDからLiquidStackを返す。鉄エンジンのUIにある液体のそれのような感じ。

preDestroyBlock

public static void preDestroyBlock(World world, int i, int j, int k)

ブロック破壊前に呼び出されるメソッド。TileEntityの後始末、IInventoryの中身をdropItemsにかけるなど。

checkPipesConnections

public static boolean checkPipesConnections(TileEntity tile1, TileEntity tile2)
public static boolean checkPipesConnections(IBlockAccess blockAccess, TileEntity tile1, int x2, int y2, int z2)

tile1, tile2がそれぞれ(パイプとして)繋がるかどうかを返す。

checkLegacyPipesConnections

public static boolean checkLegacyPipesConnections(IBlockAccess blockAccess, int x1, int y1, int z1, int x2, int y2, int z2)

checkPipesConnectionsと基本同等だが、こちらは判定方法が異なる(checkPipesConnectionsはTileEntityが特定インターフェースを実装しているかどうかを判断していたのに対し、こちらはBlockのインスタンスが特定のインターフェースを実装しているかどうかで判断している)。クァーリーのフレームで利用されている。

readStacksFromNBT

public static void readStacksFromNBT(NBTTagCompound nbt, String name, ItemStack[] stacks)

NBTからItemStackを読み出し、配列stacksに格納するメソッド

writeStacksToNBT

public static void writeStacksToNBT(NBTTagCompound nbt, String name, ItemStack[] stacks)

NBTにItemStackの配列stacksを書き込むメソッド

consumeItem

public static ItemStack consumeItem(ItemStack stack)

アイテムを使用する際のstackSize減算、コンテナアイテムの扱いをまとめたメソッド

concat

public static <T> T[] concat(T[] first, T[] second)
public static int[] concat(int[] first, int[] second)
public static float[] concat(float[] first, float[] second)

配列の連結を行うメソッド