2024-02-18 17:52:42 +01:00

127 lines
3.4 KiB
Java

package com.hbm.wiaj;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraftforge.common.util.ForgeDirection;
/**
* A hastily put together implementation of IBlockAccess in order to render things using ISBRH...
* It can handle blocks, and not a whole lot else.
* @author hbm
*/
public class WorldInAJar implements IBlockAccess {
public int sizeX;
public int sizeY;
public int sizeZ;
private Block[][][] blocks;
private short[][][] meta;
private TileEntity[][][] tiles;
public WorldInAJar(int x, int y, int z) {
this.sizeX = x;
this.sizeY = y;
this.sizeZ = z;
this.blocks = new Block[x][y][z];
this.meta = new short[x][y][z];
this.tiles = new TileEntity[x][y][z];
}
public void nuke() {
this.blocks = new Block[sizeX][sizeY][sizeZ];
this.meta = new short[sizeX][sizeY][sizeZ];
this.tiles = new TileEntity[sizeX][sizeY][sizeZ];
}
@Override
public Block getBlock(int x, int y, int z) {
if(x < 0 || x >= sizeX || y < 0 || y >= sizeY || z < 0 || z >= sizeZ)
return Blocks.air;
return this.blocks[x][y][z] != null ? this.blocks[x][y][z] : Blocks.air;
}
public void setBlock(int x, int y, int z, Block b, int meta) {
if(x < 0 || x >= sizeX || y < 0 || y >= sizeY || z < 0 || z >= sizeZ)
return;
this.blocks[x][y][z] = b;
this.meta[x][y][z] = (short)meta;
}
@Override
public int getBlockMetadata(int x, int y, int z) {
if(x < 0 || x >= sizeX || y < 0 || y >= sizeY || z < 0 || z >= sizeZ)
return 0;
return this.meta[x][y][z];
}
//shaky, we may kick tile entities entirely and rely on outside-the-world tile actors for rendering
//might still come in handy for manipulating things using dummy tiles, like cable connections
@Override
public TileEntity getTileEntity(int x, int y, int z) {
if(x < 0 || x >= sizeX || y < 0 || y >= sizeY || z < 0 || z >= sizeZ)
return null;
return this.tiles[x][y][z];
}
public void setTileEntity(int x, int y, int z, TileEntity tile) {
if(x < 0 || x >= sizeX || y < 0 || y >= sizeY || z < 0 || z >= sizeZ)
return;
this.tiles[x][y][z] = tile;
}
//always render fullbright, if the situation requires it we could add a very rudimentary system that
//darkens blocks if there is a solid one above
@Override
@SideOnly(Side.CLIENT)
public int getLightBrightnessForSkyBlocks(int x, int y, int z, int blockBrightness) {
return 15; //always be on fullbright
}
//redstone could theoretically be implemented, but we will wait for now
@Override
public int isBlockProvidingPowerTo(int x, int y, int z, int dir) {
return 0;
}
@Override
public boolean isAirBlock(int x, int y, int z) {
return this.getBlock(x, y, z).isAir(this, x, y, z);
}
//biomes don't matter to us, if the situation requires it we could implement a primitive biome mask
@Override
@SideOnly(Side.CLIENT)
public BiomeGenBase getBiomeGenForCoords(int x, int z) {
return BiomeGenBase.plains;
}
@Override
@SideOnly(Side.CLIENT)
public int getHeight() {
return this.sizeY;
}
@Override
public boolean extendedLevelsInChunkCache() {
return false;
}
@Override
public boolean isSideSolid(int x, int y, int z, ForgeDirection side, boolean _default) {
return getBlock(x, y, z).isSideSolid(this, x, y, z, side);
}
}