package mekanism.client.render;
import java.util.Random;
import mekanism.api.Coord4D;
import mekanism.api.EnumColor;
import mekanism.api.MekanismAPI;
import mekanism.api.Pos3D;
import mekanism.client.render.particle.EntityJetpackFlameFX;
import mekanism.client.render.particle.EntityJetpackSmokeFX;
import mekanism.client.render.particle.EntityScubaBubbleFX;
import mekanism.common.Mekanism;
import mekanism.common.item.ItemFlamethrower;
import mekanism.common.item.ItemJetpack;
import mekanism.common.item.ItemScubaTank;
import mekanism.common.util.MekanismUtils;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.ScaledResolution;
import net.minecraft.client.particle.Particle;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.EntityEquipmentSlot;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumParticleTypes;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.world.World;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent.Phase;
import net.minecraftforge.fml.common.gameevent.TickEvent.RenderTickEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
@SideOnly(Side.CLIENT)
public class RenderTickHandler
{
public Random rand = new Random();
public Minecraft mc = Minecraft.getMinecraft();
@SubscribeEvent
public void tickEnd(RenderTickEvent event)
{
if(event.phase == Phase.END)
{
if(mc.thePlayer != null && mc.theWorld != null && !mc.isGamePaused())
{
EntityPlayer player = mc.thePlayer;
World world = mc.thePlayer.worldObj;
FontRenderer font = mc.fontRendererObj;
RayTraceResult pos = player.rayTrace(40.0D, 1.0F);
if(font == null)
{
return;
}
if(pos != null)
{
Coord4D obj = new Coord4D(pos.getBlockPos(), world);
Block block = obj.getBlock(world);
if(block != null && MekanismAPI.debug && mc.currentScreen == null && !mc.gameSettings.showDebugInfo)
{
String tileDisplay = "";
if(obj.getTileEntity(world) != null)
{
if(obj.getTileEntity(world).getClass() != null)
{
tileDisplay = obj.getTileEntity(world).getClass().getSimpleName();
}
}
font.drawStringWithShadow("Block: " + block.getUnlocalizedName(), 1, 1, 0x404040);
font.drawStringWithShadow("Metadata: " + obj.getBlockState(world), 1, 10, 0x404040);
font.drawStringWithShadow("Location: " + MekanismUtils.getCoordDisplay(obj), 1, 19, 0x404040);
font.drawStringWithShadow("TileEntity: " + tileDisplay, 1, 28, 0x404040);
font.drawStringWithShadow("Side: " + pos.sideHit, 1, 37, 0x404040);
}
}
if(player != null && mc.currentScreen == null && player.getItemStackFromSlot(EntityEquipmentSlot.CHEST) != null)
{
ItemStack stack = player.getItemStackFromSlot(EntityEquipmentSlot.CHEST);
ScaledResolution scaledresolution = new ScaledResolution(mc);
int x = scaledresolution.getScaledWidth();
int y = scaledresolution.getScaledHeight();
if(stack.getItem() instanceof ItemJetpack)
{
ItemJetpack jetpack = (ItemJetpack)stack.getItem();
font.drawStringWithShadow("Mode: " + jetpack.getMode(stack).getName(), 1, y - 20, 0x404040);
font.drawStringWithShadow("Hydrogen: " + jetpack.getStored(stack), 1, y - 11, 0x404040);
}
else if(stack.getItem() instanceof ItemScubaTank)
{
ItemScubaTank scubaTank = (ItemScubaTank)stack.getItem();
String state = (scubaTank.getFlowing(stack) ? EnumColor.DARK_GREEN + "On" : EnumColor.DARK_RED + "Off");
font.drawStringWithShadow("Mode: " + state, 1, y - 20, 0x404040);
font.drawStringWithShadow("Oxygen: " + scubaTank.getStored(stack), 1, y - 11, 0x404040);
}
}
synchronized(Mekanism.jetpackOn)
{
for(String s : Mekanism.jetpackOn)
{
EntityPlayer p = mc.theWorld.getPlayerEntityByName(s);
if(p == null)
{
continue;
}
Pos3D playerPos = new Pos3D(p).translate(0, 1.7, 0);
float random = (rand.nextFloat() - 0.5F) * 0.1F;
Pos3D vLeft = new Pos3D(-0.43, -0.55, -0.54).rotatePitch(p.isSneaking() ? 20 : 0).rotateYaw(p.renderYawOffset);
Pos3D vRight = new Pos3D(0.43, -0.55, -0.54).rotatePitch(p.isSneaking() ? 20 : 0).rotateYaw(p.renderYawOffset);
Pos3D vCenter = new Pos3D((rand.nextFloat() - 0.5F) * 0.4F, -0.86, -0.30).rotatePitch(p.isSneaking() ? 25 : 0).rotateYaw(p.renderYawOffset);
Pos3D rLeft = vLeft.scale(random);
Pos3D rRight = vRight.scale(random);
Pos3D mLeft = vLeft.scale(0.2).translate(new Pos3D(p.motionX, p.motionY, p.motionZ));
Pos3D mRight = vRight.scale(0.2).translate(new Pos3D(p.motionX, p.motionY, p.motionZ));
Pos3D mCenter = vCenter.scale(0.2).translate(new Pos3D(p.motionX, p.motionY, p.motionZ));
mLeft = mLeft.translate(rLeft);
mRight = mRight.translate(rRight);
Pos3D v = playerPos.translate(vLeft).translate(new Pos3D(p.motionX, p.motionY, p.motionZ));
spawnAndSetParticle(EnumParticleTypes.FLAME, world, v.xCoord, v.yCoord, v.zCoord, mLeft.xCoord, mLeft.yCoord, mLeft.zCoord);
spawnAndSetParticle(EnumParticleTypes.SMOKE_NORMAL, world, v.xCoord, v.yCoord, v.zCoord, mLeft.xCoord, mLeft.yCoord, mLeft.zCoord);
v = playerPos.translate(vRight).translate(new Pos3D(p.motionX, p.motionY, p.motionZ));
spawnAndSetParticle(EnumParticleTypes.FLAME, world, v.xCoord, v.yCoord, v.zCoord, mRight.xCoord, mRight.yCoord, mRight.zCoord);
spawnAndSetParticle(EnumParticleTypes.SMOKE_NORMAL, world, v.xCoord, v.yCoord, v.zCoord, mRight.xCoord, mRight.yCoord, mRight.zCoord);
v = playerPos.translate(vCenter).translate(new Pos3D(p.motionX, p.motionY, p.motionZ));
spawnAndSetParticle(EnumParticleTypes.FLAME, world, v.xCoord, v.yCoord, v.zCoord, mCenter.xCoord, mCenter.yCoord, mCenter.zCoord);
spawnAndSetParticle(EnumParticleTypes.SMOKE_NORMAL, world, v.xCoord, v.yCoord, v.zCoord, mCenter.xCoord, mCenter.yCoord, mCenter.zCoord);
}
}
synchronized(Mekanism.gasmaskOn)
{
if(world.getWorldTime() % 4 == 0)
{
for(String s : Mekanism.gasmaskOn)
{
EntityPlayer p = mc.theWorld.getPlayerEntityByName(s);
if(p == null || !p.isInWater())
{
continue;
}
Pos3D playerPos = new Pos3D(p).translate(0, 1.7, 0);
float xRand = (rand.nextFloat() - 0.5F) * 0.08F;
float yRand = (rand.nextFloat() - 0.5F) * 0.05F;
Pos3D vec = new Pos3D(0.4, 0.4, 0.4).multiply(new Pos3D(p.getLook(1))).translate(0, -0.2, 0);
Pos3D motion = vec.scale(0.2).translate(new Pos3D(p.motionX, p.motionY, p.motionZ));
Pos3D v = playerPos.translate(vec);
spawnAndSetParticle(EnumParticleTypes.WATER_BUBBLE, world, v.xCoord, v.yCoord, v.zCoord, motion.xCoord, motion.yCoord + 0.2, motion.zCoord);
}
}
}
if(world.getWorldTime() % 4 == 0)
{
for(EntityPlayer p : world.playerEntities)
{
if(!Mekanism.flamethrowerActive.contains(p.getName()) && !p.isSwingInProgress && p.inventory.getCurrentItem() != null && p.inventory.getCurrentItem().getItem() instanceof ItemFlamethrower)
{
if(((ItemFlamethrower)p.inventory.getCurrentItem().getItem()).getGas(p.inventory.getCurrentItem()) != null)
{
Pos3D playerPos = new Pos3D(p);
Pos3D flameVec;
double flameXCoord = 0;
double flameYCoord = 1.5;
double flameZCoord = 0;
Pos3D flameMotion = new Pos3D(p.motionX, p.onGround ? 0 : p.motionY, p.motionZ);
if(player == p && mc.gameSettings.thirdPersonView == 0)
{
flameVec = new Pos3D(1, 1, 1).multiply(p.getLook(1)).rotateYaw(5).translate(flameXCoord, flameYCoord+0.1, flameZCoord);
}
else {
flameXCoord += 0.25F;
flameXCoord -= 0.45F;
flameZCoord += 0.15F;
if(p.isSneaking())
{
flameYCoord -= 0.55F;
flameZCoord -= 0.15F;
}
if(player == p)
{
flameYCoord -= 0.5F;
}
else {
flameYCoord -= 0.5F;
}
flameZCoord += 1.05F;
flameVec = new Pos3D(flameXCoord, flameYCoord, flameZCoord).rotateYaw(p.renderYawOffset);
}
Pos3D mergedVec = playerPos.translate(flameVec);
spawnAndSetParticle(EnumParticleTypes.FLAME, world, mergedVec.xCoord, mergedVec.yCoord, mergedVec.zCoord, flameMotion.xCoord, flameMotion.yCoord, flameMotion.zCoord);
}
}
}
}
}
}
}
public void spawnAndSetParticle(EnumParticleTypes s, World world, double x, double y, double z, double velX, double velY, double velZ)
{
Particle fx = null;
if(s.equals(EnumParticleTypes.FLAME))
{
fx = new EntityJetpackFlameFX(world, x, y, z, velX, velY, velZ);
}
else if(s.equals(EnumParticleTypes.SMOKE_NORMAL))
{
fx = new EntityJetpackSmokeFX(world, x, y, z, velX, velY, velZ);
}
else if(s.equals(EnumParticleTypes.WATER_BUBBLE))
{
fx = new EntityScubaBubbleFX(world, x, y, z, velX, velY, velZ);
}
mc.effectRenderer.addEffect(fx);
}
}