106 lines
2.7 KiB
Java
Executable File
106 lines
2.7 KiB
Java
Executable File
package projectzombie.entity;
|
|
|
|
import bdf.types.BdfNamedList;
|
|
import bdf.types.BdfObject;
|
|
import gl_engine.MathHelpers;
|
|
import gl_engine.vec.Vec2d;
|
|
import gl_engine.vec.Vec3d;
|
|
import projectzombie.entity.particle.ParticleSmokeTrail;
|
|
import projectzombie.init.Models;
|
|
import projectzombie.model.Model;
|
|
import projectzombie.world.chunk.Chunk;
|
|
import projectzombie.world.layer.Layer;
|
|
|
|
public class EntityTnt extends Entity implements EntityHoldsEntities
|
|
{
|
|
protected boolean active = true;
|
|
protected int explode_time;
|
|
private int explode_radius;
|
|
private double explode_damage;
|
|
private ParticleSmokeTrail smoke_particles;
|
|
|
|
@Override
|
|
public Entity[] getEntities() {
|
|
return new Entity[] {smoke_particles};
|
|
}
|
|
|
|
public EntityTnt(BdfObject bdf) {
|
|
smoke_particles = new ParticleSmokeTrail(this);
|
|
BdfClassLoad(bdf);
|
|
}
|
|
|
|
@Override
|
|
public void BdfClassLoad(BdfObject bdf) {
|
|
super.BdfClassLoad(bdf);
|
|
|
|
BdfNamedList nl = bdf.getNamedList();
|
|
BdfNamedList explode = nl.get("explosion").getNamedList();
|
|
explode_time = explode.get("time").getInteger();
|
|
explode_radius = explode.get("radius").getInteger();
|
|
explode_damage = explode.get("damage").getDouble();
|
|
}
|
|
|
|
@Override
|
|
public void BdfClassSave(BdfObject bdf) {
|
|
super.BdfClassSave(bdf);
|
|
|
|
BdfNamedList nl = bdf.getNamedList();
|
|
BdfNamedList explode = nl.get("explosion").getNamedList();
|
|
explode.set("time", bdf.newObject().setInteger(explode_time));
|
|
explode.set("radius", bdf.newObject().setInteger(explode_radius));
|
|
explode.set("damage", bdf.newObject().setDouble(explode_damage));
|
|
}
|
|
|
|
public EntityTnt(Vec3d pos, Vec3d velocity, double angle, int explode_radius, double explode_damage) {
|
|
super(pos, velocity.add(new Vec3d(0, 0.1, 0)));
|
|
|
|
Vec2d v = MathHelpers.moveTowards2(0.05, Math.toRadians(angle));
|
|
velocity = velocity.add(new Vec3d(v.x, v.y, 0.01));
|
|
this.explode_radius = explode_radius;
|
|
this.explode_damage = explode_damage;
|
|
this.smoke_particles = new ParticleSmokeTrail(this);
|
|
|
|
// Set to 2.5 seconds
|
|
this.explode_time = 250;
|
|
}
|
|
|
|
protected void explode(Layer layer)
|
|
{
|
|
layer.spawnEntity(new EntityExplosion(getPos(), explode_radius, explode_damage));
|
|
}
|
|
|
|
@Override
|
|
public void tick(Chunk chunk, Layer layer) {
|
|
super.tick(chunk, layer);
|
|
|
|
smoke_particles.tick(chunk, layer);
|
|
|
|
if(!active)
|
|
{
|
|
if(smoke_particles.noMoreParticles()) {
|
|
kill();
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
// Explode if it is time for the tnt to blow up
|
|
explode_time -= 1;
|
|
if(explode_time < 0) {
|
|
smoke_particles.stopParticles();
|
|
active = false;
|
|
explode(layer);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void moveAwayFromSolidEntities(Layer layer) {
|
|
}
|
|
|
|
@Override
|
|
public Model getModel() {
|
|
return active ? Models.ENTITY_TNT : null;
|
|
}
|
|
|
|
}
|