/**
* 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.meltdowner.entity;
import cn.academy.core.Resources;
import cn.lambdalib.annoreg.core.Registrant;
import cn.lambdalib.annoreg.mc.RegEntity;
import cn.lambdalib.annoreg.mc.RegInitCallback;
import cn.lambdalib.particle.Particle;
import cn.lambdalib.particle.ParticleFactory;
import cn.lambdalib.particle.decorators.ParticleDecorator;
import cn.lambdalib.util.client.RenderUtils;
import cn.lambdalib.util.entityx.EntityAdvanced;
import cn.lambdalib.util.entityx.EntityCallback;
import cn.lambdalib.util.entityx.MotionHandler;
import cn.lambdalib.util.entityx.event.CollideEvent;
import cn.lambdalib.util.entityx.event.CollideEvent.CollideHandler;
import cn.lambdalib.util.entityx.handlers.Rigidbody;
import cn.lambdalib.util.generic.RandUtils;
import cn.lambdalib.util.helper.GameTimer;
import cn.lambdalib.util.helper.Motion3D;
import cn.lambdalib.util.mc.EntitySelectors;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.renderer.entity.Render;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
import net.minecraftforge.client.model.IModelCustom;
import net.minecraftforge.common.util.ForgeDirection;
import org.lwjgl.opengl.GL11;
/**
* @author WeathFolD
*/
@Registrant
@RegEntity
@RegEntity.HasRender
public class EntitySilbarn extends EntityAdvanced {
@SideOnly(Side.CLIENT)
@RegEntity.Render
public static RenderSibarn render;
@SideOnly(Side.CLIENT)
static ParticleFactory particles;
@SideOnly(Side.CLIENT)
@RegInitCallback
public static void init() {
Particle p = new Particle();
p.texture = Resources.getTexture("entities/silbarn_frag");
p.size = 0.1f;
p.gravity = 0.03f;
p.customRotation = true;
particles = new ParticleFactory(p);
particles.addDecorator(new ParticleDecorator() {
double vx, vy;
final double fac = 25;
{
double phi = RandUtils.nextDouble() * Math.PI * 2;
vx = Math.sin(phi);
vy = Math.cos(phi);
}
@SideOnly(Side.CLIENT)
@Override
public void decorate(Particle particle) {
particle.addMotionHandler(new MotionHandler() {
@Override
public String getID() { return "Rotator"; }
@Override
public void onStart() {
particle.rotationYaw = RandUtils.nextFloat() * 360;
particle.rotationPitch = RandUtils.rangef(-90, 90);
}
@Override
public void onUpdate() {
particle.rotationYaw += vx * fac;
particle.rotationPitch += vy * fac;
}
});
}
});
}
boolean hit;
long createTime;
Vec3 axis = Vec3.createVectorHelper(rand.nextInt(), rand.nextInt(), rand.nextInt());
{
final Rigidbody rigidbody = new Rigidbody();
rigidbody.linearDrag = 0.8;
rigidbody.entitySel = EntitySelectors.nothing();
this.addMotionHandler(rigidbody);
//this.addDaemonHandler(new GravityApply(this, 0.05));
executeAfter(new EntityCallback<EntitySilbarn>() {
@Override
public void execute(EntitySilbarn ent) {
rigidbody.gravity = 0.12;
}
}, 50);
setSize(.4f, .4f);
}
public EntitySilbarn(EntityPlayer player) {
super(player.worldObj);
this.regEventHandler(new CollideHandler() {
@Override
public void onEvent(CollideEvent event) {
if(!hit) {
hit = true;
if(event.result.entityHit instanceof EntitySilbarn)
playSound("academy:entity.silbarn_heavy", .5f, 1f);
else
playSound("academy:entity.silbarn_light", .5f, 1f);
executeAfter(new EntityCallback() {
@Override
public void execute(Entity ent) {
ent.setDead();
}
}, 10);
}
}
});
Motion3D mo = new Motion3D(player, true);
mo.applyToEntity(this);
this.rotationYaw = player.rotationYawHead;
this.isAirBorne = true;
this.onGround = false;
}
@SideOnly(Side.CLIENT)
public EntitySilbarn(World world) {
super(world);
this.createTime = GameTimer.getTime();
this.regEventHandler(new CollideHandler() {
@Override
public void onEvent(CollideEvent event) {
if(!hit) {
MovingObjectPosition res = event.result;
ForgeDirection dir = ForgeDirection.getOrientation(res.sideHit);
final double mul = 0.1;
double tx = res.hitVec.xCoord + dir.offsetX * mul,
ty = res.hitVec.yCoord + dir.offsetY * mul,
tz = res.hitVec.zCoord + dir.offsetZ * mul;
spawnEffects(tx, ty, tz);
setDead();
}
hit = true;
}
});
this.isAirBorne = true;
this.onGround = false;
}
@Override
public void entityInit() {
dataWatcher.addObject(10, Byte.valueOf((byte) 0));
}
public boolean isHit() {
return hit;
}
@Override
public void onUpdate() {
super.onUpdate();
sync();
}
private void sync() {
if(worldObj.isRemote) {
boolean b = dataWatcher.getWatchableObjectByte(10) != 0;
if(!hit && b) {
spawnEffects(posX, posY, posZ);
}
hit = b;
} else {
dataWatcher.updateObject(10, Byte.valueOf((byte) (hit ? 1 : 0)));
}
}
@Override
public boolean canBeCollidedWith() {
return true;
}
@SideOnly(Side.CLIENT)
private void spawnEffects(double tx, double ty, double tz) {
int n = RandUtils.rangei(18, 27);
for(int i = 0; i < n; ++i) {
double vel = RandUtils.ranged(0.08, 0.18),
vsq = vel * vel,
vx = rand.nextDouble() * vel,
vxsq = vx * vx,
vy = rand.nextDouble() * Math.sqrt(vsq - vxsq),
vz = Math.sqrt(vsq - vxsq - vy * vy);
vx *= rand.nextBoolean() ? 1 : -1;
vy *= rand.nextBoolean() ? 1 : -1;
vz *= rand.nextBoolean() ? 1 : -1;
vy += 0.2;
particles.setPosition(posX, posY, posZ);
particles.setVelocity(vx, vy, vz);
worldObj.spawnEntityInWorld(particles.next(worldObj));
}
//TileMatrix
}
@SideOnly(Side.CLIENT)
public static class RenderSibarn extends Render {
private final IModelCustom model = Resources.getModel("silbarn");
private final ResourceLocation tex = Resources.getTexture("models/silbarn");
@Override
public void doRender(Entity var1, double x, double y,
double z, float var8, float var9) {
EntitySilbarn sibarn = (EntitySilbarn) var1;
if(sibarn.hit)
return;
GL11.glPushMatrix();
GL11.glTranslated(x, y, z);
RenderUtils.loadTexture(tex);
double scale = .05;
GL11.glScaled(scale, scale, scale);
GL11.glRotated(0.03 * (GameTimer.getTime() - sibarn.createTime),
sibarn.axis.xCoord, sibarn.axis.yCoord, sibarn.axis.zCoord);
GL11.glRotated(-var1.rotationYaw, 0, 1, 0);
GL11.glRotated(90, 1, 0, 0);
model.renderAll();
GL11.glPopMatrix();
}
@Override
protected ResourceLocation getEntityTexture(Entity var1) {
return null;
}
}
@Override
protected void readEntityFromNBT(NBTTagCompound tag) {
setDead();
}
@Override
protected void writeEntityToNBT(NBTTagCompound tag) {}
}