auracore/src/main/java/dev/tilera/auracore/client/RenderEventHandler.java

140 lines
6.5 KiB
Java

package dev.tilera.auracore.client;
import java.util.Collection;
import org.lwjgl.opengl.GL11;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import dev.tilera.auracore.client.AuraManagerClient.NodeStats;
import dev.tilera.auracore.helper.Utils;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.MathHelper;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.event.RenderWorldLastEvent;
import thaumcraft.client.lib.UtilsFX;
public class RenderEventHandler {
ResourceLocation tx1 = new ResourceLocation("auracore", "textures/misc/aura_1.png");
ResourceLocation tx2 = new ResourceLocation("auracore", "textures/misc/aura_2.png");
ResourceLocation tx3 = new ResourceLocation("auracore", "textures/misc/aura_3.png");
ResourceLocation tx3p = new ResourceLocation("auracore", "textures/misc/pure.png");
ResourceLocation tx3d = new ResourceLocation("auracore", "textures/misc/vortex.png");
ResourceLocation tx3c = new ResourceLocation("auracore", "textures/misc/chaos.png");
ResourceLocation txlock = new ResourceLocation("auracore", "textures/misc/aura_lock.png");
@SideOnly(Side.CLIENT)
@SubscribeEvent
public void renderLast(RenderWorldLastEvent event) {
float partialTicks = event.partialTicks;
Minecraft mc = Minecraft.getMinecraft();
if (Minecraft.getMinecraft().renderViewEntity instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer)Minecraft.getMinecraft().renderViewEntity;
long time = mc.theWorld.getTotalWorldTime();
if (Utils.hasGoggles(player)) {
GL11.glPushMatrix();
GL11.glDepthMask((boolean)false);
GL11.glEnable((int)3042);
GL11.glBlendFunc((int)770, (int)1);
GL11.glDisable((int)2884);
GL11.glDisable((int)2896);
this.renderAuraNodes(event, partialTicks, player, time);
GL11.glDisable((int)3042);
GL11.glEnable((int)2896);
GL11.glDepthMask((boolean)true);
GL11.glPopMatrix();
}
}
}
@SideOnly(value=Side.CLIENT)
public void renderAuraNodes(RenderWorldLastEvent event, float partialTicks, EntityPlayer player, long time) {
GL11.glPushMatrix();
int limit = 0;
Collection<NodeStats> col = AuraManagerClient.auraClientList.values();
for (NodeStats l : col) {
if (l.isVirtual) continue;
float px = (float) l.x;
float py = (float) l.y;
float pz = (float) l.z;
int dim = l.dimension;
short lvl = l.level;
int key = l.key;
boolean lock = l.lock;
byte type = l.type;
if (limit >= 10 || player.dimension != dim || !(player.getDistanceSq((double)px, (double)py, (double)pz) < 4096.0)) continue;
++limit;
AuraManagerClient.NodeRenderInfo nri = (AuraManagerClient.NodeRenderInfo)AuraManagerClient.auraClientMovementList.get(key);
if (nri == null) {
nri = new AuraManagerClient.NodeRenderInfo(px, py, pz);
AuraManagerClient.auraClientMovementList.put(key, nri);
}
float bscale = (float)lvl / 1000.0f;
nri.x += (px - nri.x) / 50.0f * partialTicks;
nri.y += (py - nri.y) / 50.0f * partialTicks;
nri.z += (pz - nri.z) / 50.0f * partialTicks;
AuraManagerClient.auraClientMovementList.put(key, nri);
float rad = (float)Math.PI * 2;
GL11.glColor4f((float)1.0f, (float)1.0f, (float)1.0f, (float)0.1f);
GL11.glPushMatrix();
UtilsFX.bindTexture(tx1);
float scale = MathHelper.sin((float)(((float)time + nri.x) / 14.0f)) * bscale + bscale * 2.0f;
float angle = (float)(time % 500L) / 500.0f * rad;
UtilsFX.renderFacingQuad(nri.x, nri.y, nri.z, angle, scale, 1, 1, 0, partialTicks, 0xFFFFFF);
GL11.glPopMatrix();
GL11.glPushMatrix();
UtilsFX.bindTexture(tx2);
angle = (float)(time % 400L) / -400.0f * rad;
scale = MathHelper.sin((float)(((float)time + nri.y) / 11.0f)) * bscale + bscale * 2.0f;
UtilsFX.renderFacingQuad(nri.x, nri.y, nri.z, angle, scale, 1, 1, 0, partialTicks, 0xFFFFFF);
GL11.glPopMatrix();
GL11.glPushMatrix();
UtilsFX.bindTexture(tx3);
angle = (float)(time % 300L) / 300.0f * rad;
scale = MathHelper.sin((float)(((float)time + nri.z) / 9.0f)) * bscale + bscale * 2.0f;
UtilsFX.renderFacingQuad(nri.x, nri.y, nri.z, angle, scale, 1, 1, 0, partialTicks, 0xFFFFFF);
GL11.glPopMatrix();
if (type == 0) {
GL11.glPushMatrix();
UtilsFX.bindTexture(tx1);
angle = (float)(time % 200L) / -200.0f * rad;
scale = MathHelper.sin((float)(((float)time + nri.x) / 7.0f)) * bscale / 2.0f + bscale * 2.0f;
UtilsFX.renderFacingQuad(nri.x, nri.y, nri.z, angle, scale, 1, 1, 0, partialTicks, 0xFFFFFF);
GL11.glPopMatrix();
} else {
GL11.glPushMatrix();
switch (type) {
case 1: {
UtilsFX.bindTexture(tx3p);
break;
}
case 2: {
GL11.glBlendFunc((int)770, (int)771);
UtilsFX.bindTexture(tx3d);
break;
}
case 3: {
UtilsFX.bindTexture(tx3c);
}
}
angle = (float)(time % 90L) / -90.0f * rad;
scale = MathHelper.sin((float)(((float)time + nri.x) / 10.0f)) * bscale / 4.0f + bscale * 1.75f;
UtilsFX.renderFacingQuad(nri.x, nri.y, nri.z, angle, scale, 1, 1, 0, partialTicks, 0xFFFFFF);
GL11.glPopMatrix();
GL11.glBlendFunc((int)770, (int)1);
}
if (!lock) continue;
GL11.glPushMatrix();
UtilsFX.bindTexture(txlock);
UtilsFX.renderFacingQuad(nri.x, nri.y, nri.z, 0.0f, bscale * 3.5f, 1, 1, 0, partialTicks, 0xFFFFFF);
GL11.glPopMatrix();
}
GL11.glColor4f((float)1.0f, (float)1.0f, (float)1.0f, (float)1.0f);
GL11.glPopMatrix();
}
}