use of micdoodle8.mods.galacticraft.core.tile.TileEntityFluidTank in project Galacticraft by micdoodle8.
the class TileEntityFluidTankRenderer method renderTileEntityAt.
@Override
public void renderTileEntityAt(TileEntityFluidTank tank, double x, double y, double z, float partialTicks, int destroyStage) {
FluidTankInfo[] info = tank.getTankInfo(EnumFacing.DOWN);
if (info.length != 1) {
return;
}
FluidStack tankFluid = info[0].fluid;
if (tankFluid == null || tankFluid.getFluid() == null || (!tankFluid.getFluid().isGaseous() && tankFluid.amount == 0)) {
return;
}
TileEntityFluidTank tankAbove = tank.getNextTank(tank.getPos());
TileEntityFluidTank tankBelow = tank.getPreviousTank(tank.getPos());
this.bindTexture(TextureMap.locationBlocksTexture);
TextureAtlasSprite sprite = Minecraft.getMinecraft().getTextureMapBlocks().getAtlasSprite(tankFluid.getFluid().getStill().toString());
final double uMin = sprite.getMinU();
final double uMax = sprite.getMaxU();
final double vMin = sprite.getMinV();
final double vMax = sprite.getMaxV();
GL11.glPushMatrix();
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
GL11.glTranslatef((float) x, (float) y + 1.5F, (float) z + 1.0F);
GL11.glScalef(1.0F, -1.0F, -1.0F);
GL11.glTranslatef(0.5F, 0.5F, 0.5F);
GlStateManager.disableLighting();
GlStateManager.enableBlend();
GlStateManager.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
Tessellator tess = Tessellator.getInstance();
WorldRenderer worldRenderer = tess.getWorldRenderer();
float level = 1.0F;
float levelInv = 0.0F;
float opacity = 1.0F;
boolean compositeGaseous = tankFluid.getFluid().isGaseous();
if (compositeGaseous) {
opacity = Math.min(tankFluid.amount / (float) info[0].capacity * 0.8F + 0.2F, 1F);
} else {
level = tank.fluidTank.getFluidAmount() / 16400.0F;
if (level <= 0.012F) {
// Empty tanks render empty - see #3222
levelInv = 1.0F;
} else {
// 1.2% inset from each end of the tank, to avoid z-fighting with blocks above/below
levelInv = 0.988F - level;
}
}
GL11.glColor4f(1.0F, 1.0F, 1.0F, opacity);
if (levelInv < 1.0F) {
// North
worldRenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX);
worldRenderer.pos(-0.4, levelInv, -0.399).tex(uMin, vMin).endVertex();
worldRenderer.pos(-0.4, 1.0, -0.399).tex(uMin, vMin + (vMax - vMin) * level).endVertex();
worldRenderer.pos(0.4, 1.0, -0.399).tex(uMax, vMin + (vMax - vMin) * level).endVertex();
worldRenderer.pos(0.4, levelInv, -0.399).tex(uMax, vMin).endVertex();
tess.draw();
// South
worldRenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX);
worldRenderer.pos(0.4, levelInv, 0.399).tex(uMax, vMin).endVertex();
worldRenderer.pos(0.4, 1.0, 0.399).tex(uMax, vMin + (vMax - vMin) * level).endVertex();
worldRenderer.pos(-0.4, 1.0, 0.399).tex(uMin, vMin + (vMax - vMin) * level).endVertex();
worldRenderer.pos(-0.4, levelInv, 0.399).tex(uMin, vMin).endVertex();
tess.draw();
// West
worldRenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX);
worldRenderer.pos(-0.399, 1.0, -0.4).tex(uMin, vMin + (vMax - vMin) * level).endVertex();
worldRenderer.pos(-0.399, levelInv, -0.4).tex(uMin, vMin).endVertex();
worldRenderer.pos(-0.399, levelInv, 0.4).tex(uMax, vMin).endVertex();
worldRenderer.pos(-0.399, 1.0, 0.4).tex(uMax, vMin + (vMax - vMin) * level).endVertex();
tess.draw();
// East
worldRenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX);
worldRenderer.pos(0.399, 1.0, 0.4).tex(uMax, vMin + (vMax - vMin) * level).endVertex();
worldRenderer.pos(0.399, levelInv, 0.4).tex(uMax, vMin).endVertex();
worldRenderer.pos(0.399, levelInv, -0.4).tex(uMin, vMin).endVertex();
worldRenderer.pos(0.399, 1.0, -0.4).tex(uMin, vMin + (vMax - vMin) * level).endVertex();
tess.draw();
if (tankAbove == null || (tankAbove.fluidTank.getFluidAmount() == 0 && !compositeGaseous)) {
worldRenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX);
worldRenderer.pos(0.4, 0.01 + levelInv, 0.4).tex(uMax, vMax).endVertex();
worldRenderer.pos(-0.4, 0.01 + levelInv, 0.4).tex(uMax, vMin).endVertex();
worldRenderer.pos(-0.4, 0.01 + levelInv, -0.4).tex(uMin, vMin).endVertex();
worldRenderer.pos(0.4, 0.01 + levelInv, -0.4).tex(uMin, vMax).endVertex();
tess.draw();
}
if (tankBelow == null || (tankBelow.fluidTank.getFluidAmount() == 0 && !compositeGaseous)) {
worldRenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_TEX);
worldRenderer.pos(0.4, 0.99, 0.4).tex(uMax, vMax).endVertex();
worldRenderer.pos(0.4, 0.99, -0.4).tex(uMin, vMax).endVertex();
worldRenderer.pos(-0.4, 0.99, -0.4).tex(uMin, vMin).endVertex();
worldRenderer.pos(-0.4, 0.99, 0.4).tex(uMax, vMin).endVertex();
tess.draw();
}
}
GlStateManager.enableLighting();
GlStateManager.disableBlend();
GL11.glPopMatrix();
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
}
use of micdoodle8.mods.galacticraft.core.tile.TileEntityFluidTank in project Galacticraft by micdoodle8.
the class BaseRoom method buildRoomContents.
/**
* Room contents boundaries are:
* x from 1 to maxX
* y from 1 to this.sizeY - 1
* z from 1 to maxZ
*/
private void buildRoomContents(World worldIn, int x, int y, int z, int maxX, int maxZ, BlockPos blockpos, int randomInt) {
IBlockState state = Blocks.air.getDefaultState();
int semirand = ((blockpos.getY() * 379 + blockpos.getX()) * 373 + blockpos.getZ()) * 7 & 15;
int facing = 0;
int facing1 = 0;
int facing2 = 0;
int facingLamp = 2;
int facingScreen = 2;
switch(this.direction) {
case WEST:
facing1 = 3;
facing2 = 2;
facingLamp = 3;
facingScreen = 5;
break;
case EAST:
facing = 2;
facing1 = 1;
facing2 = 0;
facingLamp = 2;
facingScreen = 4;
break;
case NORTH:
facing = 3;
facing1 = 2;
facing2 = 1;
facingLamp = 5;
facingScreen = 2;
break;
case SOUTH:
facing = 1;
facing1 = 0;
facing2 = 3;
facingLamp = 4;
facingScreen = 3;
}
// Offset from centre - used for some rooms
int ox = maxX / 2 - 3;
int xx = x - ox;
switch(this.type) {
case EMPTY:
// Pillars in corners
if ((z == 1 || z == maxZ - 1) && (x == 2 || x == maxX - 1)) {
state = GCBlocks.wallGC.getStateFromMeta(2);
} else if (y == 1) {
// Some random Netherwart
if (semirand < 2) {
state = AsteroidBlocks.spaceWart.getStateFromMeta(semirand);
}
}
break;
case STORE:
if (maxX >= 6 && y == 1 && maxZ >= 5) {
// An actual landing pad (indoors!)
if (xx >= 3 && xx <= 5 && z >= 2 && z <= 4) {
state = GCBlocks.landingPad.getDefaultState();
} else if (xx == 2) {
// Cargo loaders and unloaders, these will contain treasure items but only accessible when powered
switch(z) {
case 2:
state = GCBlocks.cargoLoader.getStateFromMeta(facing);
break;
case 3:
state = GCBlocks.aluminumWire.getStateFromMeta(1);
break;
case 4:
state = GCBlocks.cargoLoader.getStateFromMeta(4 + (facing ^ 2));
break;
default:
}
}
}
break;
case POWER:
facing = (facing + 1) % 4;
switch(y) {
case 1:
// Layer 1: wall blocks with sealable alu wire in the centre
if (z == 3 && xx >= 4 && x <= maxX - 2)
state = GCBlocks.sealableBlock.getStateFromMeta(14);
else if (xx >= 3 && z > 1 && (z < maxZ - 1 || z == 4))
state = this.configuration.getWallBlock();
break;
case 2:
// Layer 2: tier 1 storage and alu wire and a switch
if (z == 2) {
if (xx == 3)
state = GCBlocks.machineTiered.getStateFromMeta(0 + facing);
else if (xx > 3 && x < maxX - 2)
state = GCBlocks.aluminumWire.getStateFromMeta(0);
else if (x == maxX - 2)
state = GCBlocks.aluminumWire.getStateFromMeta(2);
else if ((xx == 3 || x == maxX - 1))
state = AsteroidBlocks.blockMinerBase.getDefaultState();
} else if (z == 3 && x == maxX - 2)
state = GCBlocks.aluminumWire.getStateFromMeta(0);
else // An industrial looking frame for the whole structure
if (z == 4 && (xx == 3 || x == maxX - 1))
state = AsteroidBlocks.blockMinerBase.getDefaultState();
break;
case 3:
// Layer 3: tier 2 storage and alu wire
if (z == 2 && xx == 4)
state = GCBlocks.aluminumWire.getStateFromMeta(0);
else if (z == 3 && x == maxX - 2)
state = GCBlocks.machineTiered.getStateFromMeta(8 + (facing ^ 2));
else if (z == 3 && x == maxX - 1)
state = GCBlocks.aluminumWire.getStateFromMeta(1);
else if (z == 3 && xx >= 4 && x < maxX - 2)
state = GCBlocks.aluminumWire.getStateFromMeta(0);
else // An industrial looking frame for the whole structure
if ((z == 2 || z == 4) && (xx == 3 || x == maxX - 1))
state = AsteroidBlocks.blockMinerBase.getDefaultState();
break;
case 4:
// Layer 4: tier 2 storage and alu wire
if (z == 3) {
if (x == maxX - 3)
state = GCBlocks.machineTiered.getStateFromMeta(8 + facing);
else if (x == maxX - 1 || x == maxX - 2)
state = GCBlocks.aluminumWire.getStateFromMeta(1);
} else // An industrial looking frame for the whole structure
if ((z == 2 || z == 4) && xx >= 3 && x < maxX)
state = AsteroidBlocks.blockMinerBase.getDefaultState();
break;
}
break;
case ENGINEERING:
if (y == 1) {
int closerz = (maxZ <= 5) ? 2 : 3;
if ((z == maxZ - 2 && x == maxX / 2 + 1 || (z == closerz && (x == 2 || x == maxX - 1) && maxX > 5)) && maxZ > 3) {
state = GCBlocks.nasaWorkbench.getDefaultState();
} else {
state = AsteroidBlocks.blockBasic.getStateFromMeta(6);
}
}
break;
case MEDICAL:
int zTable = maxZ - 3;
int zTank = maxZ - 1;
int zLight = zTable;
if (zTable <= 1) {
if (zTable < 0) {
// Too small to build the room
break;
}
// Small medical room: bring everything closer together
zTable++;
zLight++;
zTank = maxZ;
}
if (y == 1) {
// Operating table at y == 1
if (z == zTable && x <= maxX - 1 && x >= maxX - 3) {
state = GCBlocks.crafting.getStateFromMeta(1);
} else
// Tiled floor
state = Blocks.iron_trapdoor.getDefaultState();
} else if (y == 2 || y == 3) {
// Operating table at y == 2
if (y == 2 && z == zTable && x <= maxX - 1 && x >= maxX - 3) {
state = GCBlocks.landingPad.getDefaultState();
} else if (z == zTank) {
// Fluid tanks, 2 tanks high - these will be filled with Bacterial Sludge below
if ((maxX - x) % 2 == 1) {
state = GCBlocks.fluidTank.getDefaultState();
}
}
} else if ((y == 4 || y == 5) && (z == zLight || z == zLight - 1)) {
// Lighting
if (x == maxX)
state = GCBlocks.concealedDetector.getStateFromMeta(8 + facing + (this.configuration.getDeckType() == EnumBaseType.HUMANOID ? 0 : 4));
else if (x == maxX - 1)
state = GCBlocks.brightLamp.getStateFromMeta(facingLamp);
}
break;
case CREW:
if (y == 1) {
if (x == 2 || x == maxX - 1) {
if ((z % 2) == 1) {
state = GCBlocks.wallGC.getStateFromMeta((z == 1) ? 3 : 2);
}
} else {
state = Blocks.carpet.getStateFromMeta(7);
}
} else if (y == 2) {
if (x == 2 || x == maxX - 1) {
if (z == 1) {
state = Blocks.brewing_stand.getDefaultState();
} else if (z > 2 && z < maxZ) {
state = GCBlocks.landingPad.getStateFromMeta(1);
}
}
}
break;
case CONTROL:
if (y == 1) {
if (x == maxX / 2 + 1 && z == maxZ - 2) {
state = AsteroidBlocks.blockBasic.getStateFromMeta(6);
} else {
state = GCBlocks.slabGCHalf.getStateFromMeta(6);
}
} else if (y <= 3) {
if ((x == 1 || x == maxX) && !(z == 0 || z == maxZ)) {
state = GCBlocks.telemetry.getDefaultState();
} else if ((x == 2 || x == maxX - 1) && !(z == 0 || z == maxZ)) {
state = GCBlocks.screen.getStateFromMeta((x == 2 ? facingLamp : facingLamp ^ 1));
} else if (z == maxZ && x > 2 && x < maxX - 1) {
state = GCBlocks.screen.getStateFromMeta(facingScreen);
} else if (x == maxX / 2 + 1 && z == maxZ - 2 && y == 2) {
state = GCBlocks.landingPad.getStateFromMeta(1);
}
}
break;
case CRYO:
boolean xEntrance = maxX > 5 ? (x > 2 && x < maxX - 1) : (x > 1 && x < maxX);
boolean highEntrance = this.configuration.isHangarDeck() && this.configuration.getDeckType() == EnumBaseType.AVIAN;
if (y == 1) {
// Build a dark plinth for it all at y == 1
if (z == 1 && x > 1 && x < maxX) {
state = GCBlocks.slabGCHalf.getStateFromMeta(6);
} else if (z != 0 || !xEntrance || highEntrance) {
state = AsteroidBlocks.blockBasic.getStateFromMeta(6);
}
} else if (z == 0 && (y > (highEntrance ? 5 : 3) || !xEntrance)) {
// Dark ceiling and entrance wall
state = AsteroidBlocks.blockBasic.getStateFromMeta(6);
} else if (y <= 4 && (z == maxZ || x == 1 || x == maxX)) {
// Around the walls: Cryo Chambers alternated with dark blocks
if (z == maxZ && x % 2 == 0 && x < maxX) {
if (y == 2) {
state = MarsBlocks.machine.getStateFromMeta(BlockMachineMars.CRYOGENIC_CHAMBER_METADATA + facing1);
}
} else if (z < maxZ && z > 1 && (maxZ - z) % 2 == 0) {
if (y == 2) {
state = MarsBlocks.machine.getStateFromMeta(BlockMachineMars.CRYOGENIC_CHAMBER_METADATA + (x == 1 ? facing : facing2));
}
} else {
state = AsteroidBlocks.blockBasic.getStateFromMeta(6);
}
} else if (y > 5 || y == this.configuration.getRoomHeight() || (z == maxZ || x == 1 || x == maxX)) {
// Dark top section of walls and ceiling
state = AsteroidBlocks.blockBasic.getStateFromMeta(6);
}
break;
default:
}
worldIn.setBlockState(blockpos, state, 2);
if (state.getBlock() instanceof ITileEntityProvider) {
TileEntity tile = worldIn.getTileEntity(blockpos);
if (tile instanceof IMultiBlock) {
List<BlockPos> positions = new LinkedList<>();
((IMultiBlock) tile).getPositions(blockpos, positions);
for (BlockPos pos : positions) {
worldIn.setBlockState(pos, GCBlocks.fakeBlock.getDefaultState().withProperty(BlockMulti.MULTI_TYPE, ((IMultiBlock) tile).getMultiType()), 2);
}
}
if (tile instanceof TileEntityFluidTank) {
((TileEntityFluidTank) tile).fill(null, new FluidStack(MarsModule.sludge, 16000), true);
} else if (tile instanceof TileEntityCargoLoader) {
TileEntityCargoLoader loader = (TileEntityCargoLoader) tile;
loader.locked = true;
// Looks like the food supplies have gone off!
loader.addCargo(new ItemStack(Items.poisonous_potato, 64, 0), true);
loader.addCargo(new ItemStack(Items.poisonous_potato, 64, 0), true);
loader.addCargo(new ItemStack(Items.poisonous_potato, 64, 0), true);
loader.addCargo(new ItemStack(Items.poisonous_potato, 64, 0), true);
loader.addCargo(new ItemStack(Items.rotten_flesh, 64, 0), true);
loader.addCargo(new ItemStack(GCItems.flagPole, semirand % 31 + 2, 0), true);
// Slimeling Inventory Bag
loader.addCargo(new ItemStack(MarsItems.marsItemBasic, semirand % 2 + 1, 4), true);
// Thermal cloth
loader.addCargo(new ItemStack(AsteroidsItems.basicItem, semirand % 23 + 41, 7), true);
loader.addCargo(new ItemStack(GCItems.oilCanister, 1, ItemCanisterGeneric.EMPTY), true);
loader.addCargo(new ItemStack(GCItems.oilCanister, 1, ItemCanisterGeneric.EMPTY), true);
loader.addCargo(new ItemStack(GCItems.oilCanister, 1, ItemCanisterGeneric.EMPTY), true);
loader.addCargo(new ItemStack(GCItems.oilCanister, 1, ItemCanisterGeneric.EMPTY), true);
loader.addCargo(new ItemStack(GCItems.oilCanister, 1, ItemCanisterGeneric.EMPTY), true);
loader.addCargo(this.configuration.getDeckType().treasure.copy(), true);
} else if (tile instanceof TileEntityCrafting) {
switch(semirand % 4) {
case 0:
break;
case 1:
((TileEntityCrafting) tile).craftMatrix.setInventorySlotContents(1, new ItemStack(Items.iron_ingot));
((TileEntityCrafting) tile).craftMatrix.setInventorySlotContents(3, new ItemStack(Items.iron_ingot));
break;
case 2:
// Creeper or Zombie head
int slot = semirand % 9;
((TileEntityCrafting) tile).craftMatrix.setInventorySlotContents(slot, new ItemStack(Items.skull, 1, (semirand % 13 < 6) ? 4 : 2));
break;
case 3:
((TileEntityCrafting) tile).craftMatrix.setInventorySlotContents(0, new ItemStack(Items.iron_ingot));
((TileEntityCrafting) tile).craftMatrix.setInventorySlotContents(1, new ItemStack(Items.iron_ingot));
((TileEntityCrafting) tile).craftMatrix.setInventorySlotContents(3, new ItemStack(Items.iron_ingot));
((TileEntityCrafting) tile).craftMatrix.setInventorySlotContents(4, new ItemStack(Items.stick));
((TileEntityCrafting) tile).craftMatrix.setInventorySlotContents(7, new ItemStack(Items.stick));
break;
}
} else if (tile instanceof TileEntityBrewingStand) {
TileEntityBrewingStand stand = (TileEntityBrewingStand) tile;
// Poison
stand.setInventorySlotContents(0, new ItemStack(Items.potionitem, 1, 8196));
// Weakness
stand.setInventorySlotContents(1, new ItemStack(Items.potionitem, 1, 8200));
// Harming
stand.setInventorySlotContents(2, new ItemStack(Items.potionitem, 1, 8204));
} else if (tile instanceof TileEntityEnergyStorageModule) {
TileEntityEnergyStorageModule store = (TileEntityEnergyStorageModule) tile;
if (semirand % 3 == 1) {
store.setInventorySlotContents(1, new ItemStack(GCItems.battery, 1, 100));
}
}
}
if (this.type == EnumRoomType.ENGINEERING && y == (this.configuration.getRoomHeight() <= 4 ? 2 : 3) && z == maxZ && (x == 3 || x == 6)) {
EnumFacing hangingDirection = this.direction;
if (hangingDirection == EnumFacing.WEST || hangingDirection == EnumFacing.EAST) {
// Apparently we have our North and our South reversed ? So we don't want the opposite for North and South!
hangingDirection = hangingDirection.getOpposite();
}
EntityHangingSchematic entityhanging = new EntityHangingSchematic(worldIn, blockpos, hangingDirection, x / 3 - 1);
if (entityhanging != null) {
worldIn.spawnEntityInWorld(entityhanging);
entityhanging.setSendToClient();
}
}
}
Aggregations