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)
配列の連結を行うメソッド。