assemblyline/src/main/java/assemblyline/client/render/RenderCrate.java
2023-02-10 17:51:10 +01:00

223 lines
9.6 KiB
Java

package assemblyline.client.render;
import assemblyline.common.block.TileEntityCrate;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.client.renderer.texture.TextureManager;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraftforge.client.ForgeHooksClient;
import net.minecraftforge.common.util.ForgeDirection;
import org.lwjgl.opengl.GL11;
import universalelectricity.core.vector.Vector3;
public class RenderCrate extends TileEntitySpecialRenderer {
private final RenderBlocks renderBlocks = new RenderBlocks();
@Override
public void
renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float var8) {
Vector3 vec = new Vector3(x, y, z);
double distance = vec.distanceTo(new Vector3(0.0, 0.0, 0.0));
if (tileEntity instanceof TileEntityCrate && distance < 15.0) {
TileEntityCrate tileCrate = (TileEntityCrate) tileEntity;
RenderItem renderItem = (RenderItem
) RenderManager.instance.getEntityClassRenderObject(EntityItem.class);
String itemName = "Empty";
String amount = "";
ItemStack itemStack = tileCrate.getStackInSlot(0);
if (itemStack != null) {
itemName = itemStack.getDisplayName();
amount = Integer.toString(itemStack.stackSize);
}
for (int side = 2; side < 6; ++side) {
ForgeDirection direction = ForgeDirection.getOrientation((int) side);
if (tileCrate.getWorldObj().isSideSolid(
tileCrate.xCoord + direction.offsetX,
tileCrate.yCoord,
tileCrate.zCoord + direction.offsetZ,
direction.getOpposite()
))
continue;
this.setupLight(tileCrate, direction.offsetX, direction.offsetZ);
OpenGlHelper.setLightmapTextureCoords(
(int) OpenGlHelper.lightmapTexUnit, (float) 240.0f, (float) 240.0f
);
if (itemStack != null) {
GL11.glPushMatrix();
switch (side) {
case 2: {
GL11.glTranslated(
(double) (x + 0.65),
(double) (y + 0.9),
(double) (z - 0.01)
);
break;
}
case 3: {
GL11.glTranslated(
(double) (x + 0.35),
(double) (y + 0.9),
(double) (z + 1.01)
);
GL11.glRotatef(
(float) 180.0f, (float) 0.0f, (float) 1.0f, (float) 0.0f
);
break;
}
case 4: {
GL11.glTranslated(
(double) (x - 0.01),
(double) (y + 0.9),
(double) (z + 0.35)
);
GL11.glRotatef(
(float) 90.0f, (float) 0.0f, (float) 1.0f, (float) 0.0f
);
break;
}
case 5: {
GL11.glTranslated(
(double) (x + 1.01),
(double) (y + 0.9),
(double) (z + 0.65)
);
GL11.glRotatef(
(float) -90.0f, (float) 0.0f, (float) 1.0f, (float) 0.0f
);
}
}
float scale = 0.03125f;
GL11.glScalef(
(float) (0.6f * scale), (float) (0.6f * scale), (float) 0.0f
);
GL11.glRotatef(
(float) 180.0f, (float) 0.0f, (float) 0.0f, (float) 1.0f
);
TextureManager renderEngine = Minecraft.getMinecraft().renderEngine;
GL11.glDisable((int) 2896);
if (!ForgeHooksClient.renderInventoryItem(
(RenderBlocks) this.renderBlocks,
renderEngine,
(ItemStack) itemStack,
(boolean) true,
(float) 0.0f,
(float) 0.0f,
(float) 0.0f
)) {
renderItem.renderItemIntoGUI(
this.func_147498_b(), renderEngine, itemStack, 0, 0
);
}
GL11.glEnable((int) 2896);
GL11.glPopMatrix();
}
this.renderText(itemName, side, 0.02f, x, y - (double) 0.35f, z);
if (amount == "")
continue;
this.renderText(amount, side, 0.02f, x, y - (double) 0.15f, z);
}
}
}
private void setupLight(TileEntity tileEntity, int xDifference, int zDifference) {
World world = tileEntity.getWorldObj();
if (world
.getBlock(
tileEntity.xCoord + xDifference,
tileEntity.yCoord,
tileEntity.zCoord + zDifference
)
.isOpaqueCube()) {
return;
}
int br = world.getLightBrightnessForSkyBlocks(
tileEntity.xCoord + xDifference,
tileEntity.yCoord,
tileEntity.zCoord + zDifference,
0
);
int var11 = br % 65536;
int var12 = br / 65536;
float scale = 0.6f;
OpenGlHelper.setLightmapTextureCoords(
(int) OpenGlHelper.lightmapTexUnit,
(float) ((float) var11 * scale),
(float) ((float) var12 * scale)
);
}
private void
renderText(String text, int side, float maxScale, double x, double y, double z) {
GL11.glPushMatrix();
GL11.glPolygonOffset((float) -10.0f, (float) -10.0f);
GL11.glEnable((int) 32823);
float displayX = 0.0f;
float displayY = 0.0f;
float displayWidth = 1.0f;
float displayHeight = 1.0f;
GL11.glTranslated((double) x, (double) y, (double) z);
switch (side) {
case 3: {
GL11.glTranslatef((float) 0.0f, (float) 1.0f, (float) 0.0f);
GL11.glRotatef((float) 0.0f, (float) 0.0f, (float) 1.0f, (float) 0.0f);
GL11.glRotatef((float) 90.0f, (float) 1.0f, (float) 0.0f, (float) 0.0f);
break;
}
case 2: {
GL11.glTranslatef((float) 1.0f, (float) 1.0f, (float) 1.0f);
GL11.glRotatef((float) 180.0f, (float) 0.0f, (float) 1.0f, (float) 0.0f);
GL11.glRotatef((float) 90.0f, (float) 1.0f, (float) 0.0f, (float) 0.0f);
break;
}
case 5: {
GL11.glTranslatef((float) 0.0f, (float) 1.0f, (float) 1.0f);
GL11.glRotatef((float) 90.0f, (float) 0.0f, (float) 1.0f, (float) 0.0f);
GL11.glRotatef((float) 90.0f, (float) 1.0f, (float) 0.0f, (float) 0.0f);
break;
}
case 4: {
GL11.glTranslatef((float) 1.0f, (float) 1.0f, (float) 0.0f);
GL11.glRotatef((float) -90.0f, (float) 0.0f, (float) 1.0f, (float) 0.0f);
GL11.glRotatef((float) 90.0f, (float) 1.0f, (float) 0.0f, (float) 0.0f);
}
}
GL11.glTranslatef(
(float) (displayWidth / 2.0f), (float) 1.0f, (float) (displayHeight / 2.0f)
);
GL11.glRotatef((float) -90.0f, (float) 1.0f, (float) 0.0f, (float) 0.0f);
FontRenderer fontRenderer = super.func_147498_b();
int requiredWidth = Math.max(fontRenderer.getStringWidth(text), 1);
int lineHeight = fontRenderer.FONT_HEIGHT + 2;
int requiredHeight = lineHeight * 1;
float scaler = 0.8f;
float scaleX = displayWidth / (float) requiredWidth;
float scaleY = displayHeight / (float) requiredHeight;
float scale = scaleX * scaler;
if (maxScale > 0.0f) {
scale = Math.min(scale, maxScale);
}
GL11.glScalef((float) scale, (float) (-scale), (float) scale);
GL11.glDepthMask((boolean) false);
int realHeight = (int) Math.floor(displayHeight / scale);
int realWidth = (int) Math.floor(displayWidth / scale);
int offsetX = (realWidth - requiredWidth) / 2;
int offsetY = (realHeight - requiredHeight) / 2;
GL11.glDisable((int) 2896);
fontRenderer.drawString(
"\u00a7f" + text, offsetX - realWidth / 2, 1 + offsetY - realHeight / 2, 1
);
GL11.glEnable((int) 2896);
GL11.glDepthMask((boolean) true);
GL11.glDisable((int) 32823);
GL11.glPopMatrix();
}
}