2025-06-03 12:46:21 +03:00

571 lines
18 KiB
Java

package com.hbm.render.tileentity;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
import com.hbm.blocks.generic.BlockBobble.BobbleType;
import com.hbm.blocks.generic.BlockBobble.TileEntityBobble;
import com.hbm.items.ModItems;
import com.hbm.lib.RefStrings;
import com.hbm.main.ResourceManager;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.renderer.ItemRenderer;
import net.minecraft.client.renderer.OpenGlHelper;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.texture.TextureMap;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IIcon;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.model.AdvancedModelLoader;
import net.minecraftforge.client.model.IModelCustom;
public class RenderBobble extends TileEntitySpecialRenderer {
public static RenderBobble instance = new RenderBobble();
public static final IModelCustom bobble = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/trinkets/bobble.obj"));
public static final ResourceLocation socket = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/socket.png");
public static final ResourceLocation glow = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/glow.png");
public static final ResourceLocation lamp = new ResourceLocation(RefStrings.MODID, "textures/blocks/fluorescent_lamp.png");
public static final ResourceLocation bobble_vaultboy = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/vaultboy.png");
public static final ResourceLocation bobble_hbm = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/hbm.png");
public static final ResourceLocation bobble_pu238 = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/pellet.png");
public static final ResourceLocation bobble_frizzle = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/frizzle.png");
public static final ResourceLocation bobble_vt = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/vt.png");
public static final ResourceLocation bobble_doc = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/doctor17ph.png");
public static final ResourceLocation bobble_blue = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/thebluehat.png");
public static final ResourceLocation bobble_pheo = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/pheo.png");
public static final ResourceLocation bobble_adam = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/adam29.png");
public static final ResourceLocation bobble_uffr = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/uffr.png");
public static final ResourceLocation bobble_vaer = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/vaer.png");
public static final ResourceLocation bobble_nos = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/nos.png");
public static final ResourceLocation bobble_drillgon = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/drillgon200.png");
public static final ResourceLocation bobble_cirno = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/cirno.png");
public static final ResourceLocation bobble_microwave = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/microwave.png");
public static final ResourceLocation bobble_peep = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/peep.png");
public static final ResourceLocation bobble_mellow = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/mellowrpg8.png");
public static final ResourceLocation bobble_mellow_glow = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/mellowrpg8_glow.png");
public static final ResourceLocation bobble_abel = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/abel.png");
private long time;
@Override
public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float intero) {
time = System.currentTimeMillis();
GL11.glPushMatrix();
GL11.glTranslated(x + 0.5, y, z + 0.5);
double scale = 0.25D;
GL11.glScaled(scale, scale, scale);
TileEntityBobble te = (TileEntityBobble) tile;
BobbleType type = te.type;
GL11.glRotated(22.5D * tile.getBlockMetadata() + 90, 0, -1, 0);
renderBobble(type);
GL11.glPopMatrix();
}
public void renderBobble(BobbleType type) {
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glEnable(GL12.GL_RESCALE_NORMAL);
bindTexture(socket);
bobble.renderPart("Socket");
switch(type) {
case STRENGTH:
case PERCEPTION:
case ENDURANCE:
case CHARISMA:
case INTELLIGENCE:
case AGILITY:
case LUCK: bindTexture(bobble_vaultboy); break;
case BOB: bindTexture(bobble_hbm); break;
case PU238: bindTexture(bobble_pu238); break;
case FRIZZLE: bindTexture(bobble_frizzle); break;
case VT: bindTexture(bobble_vt); break;
case DOC: bindTexture(bobble_doc); break;
case BLUEHAT: bindTexture(bobble_blue); break;
case PHEO: bindTexture(bobble_pheo); break;
case CIRNO: bindTexture(bobble_cirno); break;
case ADAM29: bindTexture(bobble_adam); break;
case UFFR: bindTexture(bobble_uffr); break;
case VAER: bindTexture(bobble_vaer); break;
case NOS: bindTexture(bobble_nos); break;
case DRILLGON: bindTexture(bobble_drillgon); break;
case MICROWAVE: bindTexture(bobble_microwave); break;
case PEEP: bindTexture(bobble_peep); break;
case MELLOW: bindTexture(bobble_mellow); break;
case ABEL: bindTexture(bobble_abel); break;
default: bindTexture(ResourceManager.universal);
}
switch(type) {
case PU238: renderPellet(type); break;
case UFFR: renderFumo(type); break;
case DRILLGON: renderDrillgon(type); break;
default: renderGuy(type);
}
GL11.glPushMatrix();
renderPost(type);
GL11.glPopMatrix();
renderSocket(type);
}
/*
* RENDER STANDARD PLAYER MODEL
*/
public static double[] rotLeftArm = {0, 0, 0};
public static double[] rotRightArm = {0, 0, 0};
public static double[] rotLeftLeg = {0, 0, 0};
public static double[] rotRightLeg = {0, 0, 0};
public static double rotBody = 0;
public static double[] rotHead = {0, 0, 0};
public void resetFigurineRotation() {
rotLeftArm = new double[]{0, 0, 0};
rotRightArm = new double[]{0, 0, 0};
rotLeftLeg = new double[]{0, 0, 0};
rotRightLeg = new double[]{0, 0, 0};
rotBody = 0;
rotHead = new double[]{0, 0, 0};
}
@SuppressWarnings("incomplete-switch") // shut up
public void setupFigurineRotation(BobbleType type) {
switch(type) {
case STRENGTH:
rotLeftArm = new double[]{0, 25, 135};
rotRightArm = new double[]{0, -45, 135};
rotLeftLeg = new double[]{0, 0, -5};
rotRightLeg = new double[]{0, 0, 5};
rotHead = new double[]{15, 0, 0};
break;
case PERCEPTION:
rotLeftArm = new double[]{0, -15, 135};
rotRightArm = new double[]{-5, 0, 0};
break;
case ENDURANCE:
rotBody = 45;
rotLeftArm = new double[]{0, -25, 30};
rotRightArm = new double[]{0, 45, 30};
rotHead = new double[]{0, -45, 0};
break;
case CHARISMA:
rotBody = 45;
rotRightArm = new double[]{0, -45, 90};
rotLeftLeg = new double[]{0, 0, -5};
rotRightLeg = new double[]{0, 0, 5};
rotHead = new double[]{-5, -45, 0};
break;
case INTELLIGENCE:
rotHead = new double[]{0, 30, 0};
rotLeftArm = new double[]{5, 0, 0};
rotRightArm = new double[]{15, 0, 170};
break;
case AGILITY:
rotLeftArm = new double[]{0, 0, 60};
rotRightArm = new double[]{0, 0, -45};
rotLeftLeg = new double[]{0, 0, -15};
rotRightLeg = new double[]{0, 0, 45};
break;
case LUCK:
rotLeftArm = new double[]{135, 45, 0};
rotRightArm = new double[]{-135, -45, 0};
rotRightLeg = new double[]{-5, 0, 0};
break;
case VT:
rotLeftArm = new double[]{0, -45, 60};
rotRightArm = new double[]{0, 0, 45};
rotLeftLeg = new double[]{2, 0, 0};
rotRightLeg = new double[]{-2, 0, 0};
break;
case BLUEHAT:
rotLeftArm = new double[]{0, 90, 60};
break;
case FRIZZLE:
rotLeftArm = new double[]{0, 15, 45};
rotRightArm = new double[]{0, 0, 80};
break;
case ADAM29:
rotRightArm = new double[]{0, 0, 60};
break;
case PHEO:
rotLeftArm = new double[]{0, 0, 80};
rotRightArm = new double[]{0, 0, 45};
break;
case VAER:
rotLeftArm = new double[]{0, -5, 45};
rotRightArm = new double[]{0, 15, 45};
break;
case PEEP:
rotLeftArm = new double[]{0, 0, 1};
rotRightArm = new double[]{0, 0, 1};
break;
case MELLOW:
rotLeftArm = new double[]{0, 10, 0};
rotRightArm = new double[]{0, -10, 0};
rotLeftLeg = new double[]{3, 5, 2};
rotRightLeg = new double[]{-3, -5, 0};
break;
case ABEL:
rotLeftArm = new double[]{0, 15, 80};
rotRightArm = new double[]{0, 15, 80};
break;
}
}
public void renderGuy(BobbleType type) {
resetFigurineRotation();
setupFigurineRotation(type);
GL11.glPushMatrix();
GL11.glRotated(rotBody, 0, 1, 0);
if(type == BobbleType.PEEP) bobble.renderPart("PeepTail");
GL11.glDisable(GL11.GL_CULL_FACE);
String suffix = type.skinLayers ? "" : "17";
GL11.glEnable(GL11.GL_BLEND);
GL11.glAlphaFunc(GL11.GL_GREATER, 0);
OpenGlHelper.glBlendFunc(770, 771, 1, 0);
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
//LEFT LEG//
GL11.glPushMatrix();
GL11.glTranslated(0, 1, -0.125);
GL11.glRotated(rotLeftLeg[0], 1, 0, 0);
GL11.glRotated(rotLeftLeg[1], 0, 1, 0);
GL11.glRotated(rotLeftLeg[2], 0, 0, 1);
GL11.glTranslated(0, -1, 0.125);
bobble.renderPart("LL" + suffix);
GL11.glPopMatrix();
//RIGHT LEG//
GL11.glPushMatrix();
GL11.glTranslated(0, 1, 0.125);
GL11.glRotated(rotRightLeg[0], 1, 0, 0);
GL11.glRotated(rotRightLeg[1], 0, 1, 0);
GL11.glRotated(rotRightLeg[2], 0, 0, 1);
GL11.glTranslated(0, -1, -0.125);
bobble.renderPart("RL" + suffix);
GL11.glPopMatrix();
//renderOrigin();
//LEFT ARM//
GL11.glPushMatrix();
GL11.glTranslated(0, 1.625, -0.25);
GL11.glRotated(rotLeftArm[0], 1, 0, 0);
GL11.glRotated(rotLeftArm[1], 0, 1, 0);
GL11.glRotated(rotLeftArm[2], 0, 0, 1);
GL11.glTranslated(0, -1.625, 0.25);
bobble.renderPart("LA" + suffix);
GL11.glPopMatrix();
//RIGHT ARM//
GL11.glPushMatrix();
GL11.glTranslated(0, 1.625, 0.25);
GL11.glRotated(rotRightArm[0], 1, 0, 0);
GL11.glRotated(rotRightArm[1], 0, 1, 0);
GL11.glRotated(rotRightArm[2], 0, 0, 1);
GL11.glTranslated(0, -1.625, -0.25);
bobble.renderPart("RA" + suffix);
GL11.glPopMatrix();
//BODY//
bobble.renderPart("Body" + suffix);
//HEAD//
double speed = 0.005;
double amplitude = 1;
GL11.glPushMatrix();
GL11.glTranslated(0, 1.75, 0);
GL11.glRotated(Math.sin(time * speed) * amplitude, 1, 0, 0);
GL11.glRotated(Math.sin(time * speed + (Math.PI * 0.5)) * amplitude, 0, 0, 1);
GL11.glRotated(rotHead[0], 1, 0, 0);
GL11.glRotated(rotHead[1], 0, 1, 0);
GL11.glRotated(rotHead[2], 0, 0, 1);
GL11.glTranslated(0, -1.75, 0);
bobble.renderPart("Head" + suffix);
if(type == BobbleType.VT) bobble.renderPart("Horn");
if(type == BobbleType.PEEP) bobble.renderPart("PeepHat");
if(type == BobbleType.VAER) {
GL11.glTranslated(0.25, 1.9, 0.075);
GL11.glRotated(-60, 0, 0, 1);
GL11.glScaled(0.5, 0.5, 0.5);
this.renderItem(new ItemStack(ModItems.cigarette));
}
if(type == BobbleType.NOS) {
GL11.glTranslated(0, 1.75, 0);
GL11.glRotated(180, 1, 0, 0);
double scale = 0.095D;
GL11.glScaled(scale, scale, scale);
this.bindTexture(ResourceManager.hat);
ResourceManager.armor_hat.renderAll();
}
GL11.glPopMatrix();
GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F);
GL11.glDisable(GL11.GL_BLEND);
GL11.glEnable(GL11.GL_CULL_FACE);
GL11.glPopMatrix();
}
public void renderPellet(BobbleType type) {
GL11.glEnable(GL11.GL_CULL_FACE);
GL11.glPushMatrix();
GL11.glPushAttrib(GL11.GL_LIGHTING_BIT);
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240F, 240F);
GL11.glDisable(GL11.GL_LIGHTING);
bobble.renderPart("Pellet");
GL11.glDisable(GL11.GL_TEXTURE_2D);
GL11.glEnable(GL11.GL_BLEND);
GL11.glAlphaFunc(GL11.GL_GREATER, 0);
OpenGlHelper.glBlendFunc(770, 771, 1, 0);
GL11.glColor4f(1.0F, 1.0F, 0.0F, 0.1F + (float) Math.sin(time * 0.001D) * 0.05F);
bobble.renderPart("PelletShine");
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F);
GL11.glDisable(GL11.GL_BLEND);
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glPopAttrib();
GL11.glPopMatrix();
}
public void renderFumo(BobbleType type) {
GL11.glEnable(GL11.GL_CULL_FACE);
bobble.renderPart("Fumo");
double speed = 0.005;
double amplitude = 1;
GL11.glPushMatrix();
GL11.glTranslated(0, 0.75, 0);
GL11.glRotated(Math.sin(time * speed) * amplitude, 1, 0, 0);
GL11.glRotated(Math.sin(time * speed + (Math.PI * 0.5)) * amplitude, 0, 0, 1);
GL11.glTranslated(0, -0.75, 0);
GL11.glDisable(GL11.GL_CULL_FACE);
bobble.renderPart("FumoHead");
GL11.glPopMatrix();
}
public void renderDrillgon(BobbleType type) {
bobble.renderPart("Drillgon");
}
private ResourceLocation shot_tex = new ResourceLocation(RefStrings.MODID +":textures/models/ModelUboinik.png");
/*
* RENDER ADDITIONAL ITEMS
*/
@SuppressWarnings("incomplete-switch")
public void renderPost(BobbleType type) {
switch(type) {
case BLUEHAT:
double scale = 0.0625D;
GL11.glTranslated(0D, 0.875D, -0.5D);
GL11.glRotated(-90, 0, 1, 0);
GL11.glRotated(-160, 0, 0, 1);
GL11.glScaled(scale, scale, scale);
bindTexture(ResourceManager.hev_helmet);
ResourceManager.armor_hev.renderPart("Head");
break;
case FRIZZLE:
GL11.glPushMatrix();
GL11.glTranslated(0.7, 1.7, 0.4);
GL11.glScaled(0.5, 0.5, 0.5);
GL11.glRotated(-90, 0, 1, 0);
GL11.glRotated(-10, 1, 0, 0);
Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.ff_gun_dark); ResourceManager.ff_nightmare.renderPart("Grip");
Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.ff_gun_normal); ResourceManager.ff_nightmare.renderPart("Dark");
Minecraft.getMinecraft().renderEngine.bindTexture(ResourceManager.ff_gun_bright); ResourceManager.ff_nightmare.renderPart("Light");
GL11.glPopMatrix();
GL11.glTranslated(0.3, 1.4, -0.2);
GL11.glRotated(-100, 1, 0, 0);
GL11.glScaled(0.5, 0.5, 0.5);
renderItem(new ItemStack(ModItems.coin_maskman, 1, 5));
break;
case ADAM29:
GL11.glTranslated(0.4, 1.15, 0.4);
GL11.glScaled(0.5, 0.5, 0.5);
renderItem(new ItemStack(ModItems.can_redbomb));
break;
case PHEO:
GL11.glTranslated(0.5, 1.15, 0.45);
GL11.glRotated(-60, 1, 0, 0);
GL11.glScaled(2, 2, 2);
this.bindTexture(ResourceManager.shimmer_axe_tex);
ResourceManager.shimmer_axe.renderAll();
break;
case BOB:
GL11.glShadeModel(GL11.GL_SMOOTH);
this.bindTexture(ResourceManager.mini_nuke_tex);
GL11.glScaled(0.5, 0.5, 0.5);
GL11.glPushMatrix();
GL11.glTranslated(0.75, 1, 0.9);
for(int i = 0; i < 3; i++) {
ResourceManager.projectiles.renderPart("MiniNuke");
GL11.glTranslated(-0.75, 0, 0);
}
GL11.glPopMatrix();
this.bindTexture(ResourceManager.mini_mirv_tex);
GL11.glTranslated(0, 0.75, -0.9);
GL11.glRotated(90, 0, 1, 0);
GL11.glRotated(90, 1, 0, 0);
ResourceManager.projectiles.renderPart("MiniMIRV");
GL11.glShadeModel(GL11.GL_FLAT);
break;
case VAER:
this.bindTexture(shot_tex);
GL11.glTranslated(0.6, 1.5, 0);
GL11.glRotated(140, 0, 0, 1);
GL11.glRotated(-60, 0, 1, 0);
GL11.glTranslated(-0.2, 0, 0);
GL11.glScaled(0.5, 0.5, 0.5);
//shotgun.renderDud(0.0625F);
break;
case MELLOW:
GL11.glPushAttrib(GL11.GL_LIGHTING_BIT);
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240F, 240F);
bindTexture(bobble_mellow_glow);
renderGuy(type);
GL11.glEnable(GL11.GL_BLEND);
GL11.glAlphaFunc(GL11.GL_GREATER, 0);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE);
this.bindTexture(lamp);
bobble.renderPart("Fluoro");
this.bindTexture(glow);
bobble.renderPart("Glow");
GL11.glAlphaFunc(GL11.GL_GREATER, 0.1F);
GL11.glDisable(GL11.GL_BLEND);
GL11.glPopAttrib();
break;
}
}
private void renderItem(ItemStack stack) {
bindTexture(TextureMap.locationItemsTexture);
IIcon icon = stack.getIconIndex();
float f14 = icon.getMinU();
float f15 = icon.getMaxU();
float f4 = icon.getMinV();
float f5 = icon.getMaxV();
ItemRenderer.renderItemIn2D(Tessellator.instance, f15, f4, f14, f5, icon.getIconWidth(), icon.getIconHeight(), 0.0625F);
}
/*
* Creates a small diamond at 0/0, useful for figuring out where the translation is at
* to determine the rotation point
*/
public void renderOrigin() {
GL11.glDisable(GL11.GL_CULL_FACE);
GL11.glDisable(GL11.GL_TEXTURE_2D);
Tessellator tess = Tessellator.instance;
tess.setColorOpaque_F(1F, 0F, 0F);
tess.startDrawing(GL11.GL_TRIANGLES);
double d = 0.125D;
tess.addVertex(0, d, 0);
tess.addVertex(d, 0, 0);
tess.addVertex(0, 0, d);
tess.addVertex(0, d, 0);
tess.addVertex(-d, 0, 0);
tess.addVertex(0, 0, d);
tess.addVertex(0, d, 0);
tess.addVertex(d, 0, 0);
tess.addVertex(0, 0, -d);
tess.addVertex(0, d, 0);
tess.addVertex(-d, 0, 0);
tess.addVertex(0, 0, -d);
tess.addVertex(0, -d, 0);
tess.addVertex(d, 0, 0);
tess.addVertex(0, 0, d);
tess.addVertex(0, -d, 0);
tess.addVertex(d, 0, 0);
tess.addVertex(0, 0, -d);
tess.addVertex(0, -d, 0);
tess.addVertex(-d, 0, 0);
tess.addVertex(0, 0, d);
tess.addVertex(0, -d, 0);
tess.addVertex(-d, 0, 0);
tess.addVertex(0, 0, -d);
tess.draw();
GL11.glEnable(GL11.GL_TEXTURE_2D);
}
/*
* RENDER BASE PEDESTAL
*/
public void renderSocket(BobbleType type) {
GL11.glDisable(GL11.GL_LIGHTING);
FontRenderer font = Minecraft.getMinecraft().fontRenderer;
float f3 = 0.01F;
GL11.glTranslated(0.63, 0.175F, 0.0);
GL11.glScalef(f3, -f3, f3);
GL11.glTranslated(0, 0, font.getStringWidth(type.label) * 0.5D);
GL11.glRotatef(90, 0, 1, 0);
GL11.glDepthMask(false);
GL11.glTranslatef(0, 1, 0);
font.drawString(type.label, 0, 0, type == BobbleType.VT ? 0xff0000 : 0xffffff);
GL11.glDepthMask(true);
GL11.glEnable(GL11.GL_LIGHTING);
}
/*
* Override with Minecraft.getMinecraft()'s texman to prevent NPEs when invoked statically
*/
@Override
protected void bindTexture(ResourceLocation loc) {
Minecraft.getMinecraft().getTextureManager().bindTexture(loc);
}
}