142 lines
3.2 KiB
Java
Executable File
142 lines
3.2 KiB
Java
Executable File
package projectzombie.entity;
|
|
|
|
import bdf.types.BdfNamedList;
|
|
import bdf.types.BdfObject;
|
|
import projectzombie.display.Camera;
|
|
import projectzombie.init.Models;
|
|
import projectzombie.model.Model;
|
|
import projectzombie.util.gl.GlHelpers;
|
|
import projectzombie.util.gl.texture.TextureReference;
|
|
import projectzombie.util.math.ItemStack;
|
|
import projectzombie.util.math.random.RandomHelpers;
|
|
import gl_engine.vec.Vec2d;
|
|
import projectzombie.world.chunk.Chunk;
|
|
import projectzombie.world.layer.Layer;
|
|
|
|
public class EntityItem extends Entity
|
|
{
|
|
private ItemStack stack;
|
|
private double height = 0;
|
|
private double height_speed;
|
|
private int pickup_time = 200;
|
|
private long age = 0;
|
|
|
|
public double angle;
|
|
|
|
public EntityItem(BdfObject bdf) {
|
|
super(bdf);
|
|
}
|
|
|
|
@Override
|
|
public void BdfClassLoad(BdfObject bdf) {
|
|
super.BdfClassLoad(bdf);
|
|
|
|
BdfNamedList nl = bdf.getNamedList();
|
|
stack = new ItemStack(nl.get("stack"));
|
|
height = nl.get("height").getDouble();
|
|
height_speed = nl.get("speed_h").getDouble();
|
|
pickup_time = nl.get("pickup").getInteger();
|
|
age = nl.get("age").getLong();
|
|
angle = nl.get("angle").getDouble();
|
|
}
|
|
|
|
@Override
|
|
public void BdfClassSave(BdfObject bdf) {
|
|
super.BdfClassSave(bdf);
|
|
|
|
BdfNamedList nl = bdf.getNamedList();
|
|
stack.BdfClassSave(nl.get("stack"));
|
|
nl.set("height", BdfObject.withDouble(height));
|
|
nl.set("speed_h", BdfObject.withDouble(height_speed));
|
|
nl.set("pickup", BdfObject.withInteger(pickup_time));
|
|
nl.set("age", BdfObject.withLong(age));
|
|
nl.set("angle", BdfObject.withDouble(angle));
|
|
}
|
|
|
|
public EntityItem(Vec2d pos, ItemStack stack) {
|
|
super(pos);
|
|
|
|
this.emitsLight = true;
|
|
this.stack = stack;
|
|
this.angle = RandomHelpers.randrange(rand, 360);
|
|
height_speed = RandomHelpers.randrange(rand, 10000) / 200000.0;
|
|
}
|
|
|
|
@Override
|
|
public double getLightLevel() {
|
|
if(this.stack.isEmpty()) return 0;
|
|
return getLightWithHeight(this.stack.item.getLightLevel());
|
|
}
|
|
|
|
@Override
|
|
public void tick(Chunk chunk, Layer layer) {
|
|
super.tick(chunk, layer);
|
|
|
|
age += 1;
|
|
|
|
height += height_speed;
|
|
height_speed -= 0.001;
|
|
|
|
pickup_time -= 1;
|
|
if(pickup_time < 0) {
|
|
pickup_time = 0;
|
|
}
|
|
|
|
if(height <= 0) {
|
|
height_speed = 0;
|
|
}
|
|
|
|
else {
|
|
moveTowards(angle, 0.01);
|
|
}
|
|
|
|
// Merge nearby stacks
|
|
for(Entity e : layer.getNearbyEntities(pos, 1))
|
|
{
|
|
if(e instanceof EntityItem && e != this) {
|
|
EntityItem ei = (EntityItem) e;
|
|
|
|
if(
|
|
ei.stack.meta == this.stack.meta &&
|
|
ei.stack.item == this.stack.item &&
|
|
ei.age > this.age
|
|
) {
|
|
this.pickup_time = 200;
|
|
this.stack.count += ei.stack.count;
|
|
this.pos = new Vec2d(
|
|
ei.pos.x / 2 + this.pos.x / 2,
|
|
ei.pos.y / 2 + this.pos.y / 2);
|
|
this.height = ei.height / 2 + this.height / 2;
|
|
this.height_speed = ei.height_speed / 2 + this.height_speed / 2;
|
|
ei.kill();
|
|
}
|
|
}
|
|
}
|
|
|
|
if(pickup_time == 0)
|
|
{
|
|
for(Entity e : layer.getNearbyEntities(pos, 1))
|
|
{
|
|
if(e instanceof EntityInventory)
|
|
{
|
|
// Pick the stack up if its an inventory
|
|
stack.item.onPickedUp(stack, layer, chunk, e);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Kill this entity if the stack is empty
|
|
if(stack.isEmpty()) {
|
|
kill();
|
|
return;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public Model getModel() {
|
|
return Models.ITEM_NONE;
|
|
}
|
|
|
|
|
|
}
|