ProjectZombie/src/projectzombie/entity/EntityItem.java

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;
}
}