/**
* Copyright (c) Lambda Innovation, 2013-2016
* This file is part of the AcademyCraft mod.
* https://github.com/LambdaInnovation/AcademyCraft
* Licensed under GPLv3, see project root for more information.
*/
package cn.academy.vanilla.electromaster.entity;
import cn.academy.core.client.render.ray.RendererRayComposite;
import cn.academy.core.entity.EntityRayBase;
import cn.academy.vanilla.electromaster.client.effect.ArcFactory;
import cn.academy.vanilla.electromaster.client.effect.ArcFactory.Arc;
import cn.academy.vanilla.electromaster.client.effect.SubArcHandler;
import cn.lambdalib.annoreg.core.Registrant;
import cn.lambdalib.annoreg.mc.RegEntity;
import cn.lambdalib.util.deprecated.ViewOptimize;
import cn.lambdalib.util.deprecated.ViewOptimize.IAssociatePlayer;
import cn.lambdalib.util.generic.MathUtils;
import cn.lambdalib.util.generic.RandUtils;
import cn.lambdalib.util.generic.VecUtils;
import cn.lambdalib.util.helper.Motion3D;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.MathHelper;
import net.minecraft.util.Vec3;
import org.lwjgl.opengl.GL11;
/**
* @author WeAthFolD
*
*/
@Registrant
@RegEntity(clientOnly = true)
@SideOnly(Side.CLIENT)
@RegEntity.HasRender
public class EntityRailgunFX extends EntityRayBase {
static final int ARC_SIZE = 15;
@RegEntity.Render
public static RailgunRender renderer;
static Arc[] templates;
static {
ArcFactory factory = new ArcFactory();
factory.widthShrink = 0.9;
factory.maxOffset = 0.8;
factory.passes = 3;
factory.width = 0.3;
factory.branchFactor = 0.7;
templates = new Arc[ARC_SIZE];
for(int i = 0; i < ARC_SIZE; ++i) {
templates[i] = factory.generate(RandUtils.ranged(2, 3));
}
}
SubArcHandler arcHandler = new SubArcHandler(templates);
public EntityRailgunFX(EntityPlayer player, double length) {
super(player);
new Motion3D(player, true).applyToEntity(this);
this.life = 50;
this.blendInTime = 150;
this.widthShrinkTime = 800;
this.widthWiggleRadius = 0.3;
this.maxWiggleSpeed = 0.8;
this.blendOutTime = 1000;
this.length = length;
ignoreFrustumCheck = true;
//Build the arc list
{
double cur = 1.0;
double len = this.length;
while(cur <= len) {
float theta = RandUtils.rangef(0, MathUtils.PI_F * 2);
double r = RandUtils.ranged(0.1, 0.25);
Vec3 vec = VecUtils.vec(cur, r * MathHelper.sin(theta), r * MathHelper.cos(theta));
vec.rotateAroundZ(rotationPitch * MathUtils.PI_F / 180);
vec.rotateAroundY((270 - rotationYaw) * MathUtils.PI_F / 180);
arcHandler.generateAt(vec);
cur += RandUtils.ranged(1, 2);
}
}
}
@Override
protected void onFirstUpdate() {
super.onFirstUpdate();
worldObj.playSound(posX, posY, posZ, "academy:em.railgun", 0.5f, 1.0f, false);
}
@Override
public void onUpdate() {
super.onUpdate();
if(ticksExisted == 30)
arcHandler.clear();
arcHandler.tick();
}
public static class RailgunRender extends RendererRayComposite {
Arc[] arcs;
public RailgunRender() {
super("railgun");
glow.startFix = -0.3;
glow.endFix = 0.3;
glow.width = 1.1;
cylinderIn.color.setColor4i(241, 240, 222, 200);
cylinderIn.width = 0.09;
cylinderOut.color.setColor4i(236, 170, 93, 60);
cylinderOut.width = 0.13;
ArcFactory factory = new ArcFactory();
factory.widthShrink = 0.9;
factory.maxOffset = 0.8;
factory.passes = 3;
factory.width = 0.3;
factory.branchFactor = 0.7;
arcs = new Arc[ARC_SIZE];
for(int i = 0; i < ARC_SIZE; ++i) {
arcs[i] = factory.generate(RandUtils.ranged(2, 3));
}
}
@Override
public void doRender(Entity ent, double x,
double y, double z, float a, float b) {
GL11.glPushMatrix();
GL11.glTranslated(x, y, z);
ViewOptimize.fix((IAssociatePlayer) ent);
EntityRailgunFX railgun = (EntityRailgunFX) ent;
railgun.arcHandler.drawAll();
GL11.glPopMatrix();
super.doRender(ent, x, y, z, a, b);
}
}
}