package openblocks.common;
import com.google.common.collect.MapMaker;
import java.util.Map;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import openblocks.common.entity.EntityMagnet;
public class CraneRegistry {
private static final double MIN_LENGTH = 0.25;
private static final double MAX_LENGTH = 10;
private static final double LENGTH_DELTA = 0.1;
public static class Data {
public boolean isDetected;
public boolean isExtending;
public double length = MIN_LENGTH;
public float prevYaw;
public double prevPosX;
public double prevPosY;
public double prevPosZ;
private Data(EntityPlayer player) {
prevYaw = player.rotationYaw;
prevPosX = player.posX;
prevPosY = player.posY;
prevPosZ = player.posZ;
}
public void updateLength() {
if (isExtending && length < MAX_LENGTH) length += LENGTH_DELTA;
else if (!isExtending && length > MIN_LENGTH) length -= LENGTH_DELTA;
}
}
private Map<EntityPlayer, Data> itemData = new MapMaker().weakKeys().makeMap();
private Map<EntityPlayer, EntityMagnet> playersMagnets = new MapMaker().weakKeys().weakValues().makeMap();
public void ensureMagnetExists(EntityPlayer player) {
EntityMagnet magnet = playersMagnets.get(player);
if (magnet == null || magnet.isDead) {
createMagnetForPlayer(player);
} else if (!magnet.isValid()) {
magnet.setDead();
createMagnetForPlayer(player);
}
}
private static EntityMagnet createMagnetForPlayer(EntityPlayer player) {
EntityMagnet result = new EntityMagnet.PlayerBound(player.worldObj, player);
player.worldObj.spawnEntityInWorld(result);
return result;
}
public EntityMagnet getMagnetForPlayer(EntityPlayer player) {
return playersMagnets.get(player);
}
public void bindMagnetToPlayer(Entity owner, EntityMagnet magnet) {
if (owner instanceof EntityPlayer) playersMagnets.put((EntityPlayer)owner, magnet);
}
public static final double ARM_RADIUS = 2.0;
public final static CraneRegistry instance = new CraneRegistry();
private CraneRegistry() {}
public Data getData(EntityPlayer player, boolean canCreate) {
Data result = itemData.get(player);
if (result == null && canCreate) {
result = new Data(player);
itemData.put(player, result);
}
return result;
}
public double getCraneMagnetDistance(EntityPlayer player) {
Data data = getData(player, false);
return data != null? data.length : MIN_LENGTH;
}
}