Files
MagicBees/src/main/java/magicbees/tileentity/TileEntityMagicApiary.java
T

782 lines
22 KiB
Java
Raw Normal View History

2014-09-16 20:30:20 +02:00
package magicbees.tileentity;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import magicbees.api.bees.IMagicApiaryAuraProvider;
import magicbees.bees.AuraCharge;
2015-03-18 23:53:22 -07:00
import magicbees.bees.BeeManager;
2015-01-16 22:59:06 +01:00
import magicbees.main.CommonProxy;
2015-03-18 23:53:22 -07:00
import magicbees.main.MagicBees;
import magicbees.main.utils.ChunkCoords;
2015-03-19 13:51:41 -07:00
import magicbees.main.utils.ItemStackUtils;
2015-03-28 02:51:41 -07:00
import magicbees.main.utils.net.EventAuraChargeUpdate;
2015-03-21 20:45:36 -07:00
import magicbees.main.utils.net.NetworkEventHandler;
import net.minecraft.entity.player.EntityPlayer;
2015-01-16 22:59:06 +01:00
import net.minecraft.inventory.Container;
import net.minecraft.inventory.ICrafting;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
2015-01-16 22:59:06 +01:00
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
2015-03-28 02:51:41 -07:00
import net.minecraft.network.Packet;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Vec3;
import net.minecraft.world.ChunkPosition;
import net.minecraft.world.World;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraft.world.chunk.Chunk;
2015-01-16 22:59:06 +01:00
import net.minecraftforge.common.util.Constants;
import com.mojang.authlib.GameProfile;
import forestry.api.apiculture.IBee;
import forestry.api.apiculture.IBeeGenome;
import forestry.api.apiculture.IBeeHousing;
import forestry.api.apiculture.IBeekeepingLogic;
import forestry.api.apiculture.IHiveFrame;
import forestry.api.core.EnumHumidity;
import forestry.api.core.EnumTemperature;
import forestry.api.core.ErrorStateRegistry;
import forestry.api.core.IErrorState;
import forestry.api.genetics.IIndividual;
2015-03-28 02:51:41 -07:00
public class TileEntityMagicApiary extends TileEntity implements ISidedInventory, IBeeHousing, ITileEntityAuraCharged {
2015-01-16 22:59:06 +01:00
2015-03-20 16:52:42 -07:00
public static final String tileEntityName = CommonProxy.DOMAIN + ".magicApiary";
2015-03-19 13:51:41 -07:00
private GameProfile ownerProfile;
2014-09-16 20:30:20 +02:00
2015-01-16 22:59:06 +01:00
// Constants
private static final int SLOT_QUEEN = 0;
private static final int SLOT_DRONE = 1;
private static final int SLOT_FRAME_START = 2;
private static final int SLOT_FRAME_COUNT = 3;
2015-03-19 13:51:41 -07:00
private static final int SLOT_PRODUCTS_START = 5;
private static final int SLOT_PRODUCTS_COUNT = 7;
private static final int AURAPROVIDER_SEARCH_RADIUS = 6;
private IBeekeepingLogic logic;
private IMagicApiaryAuraProvider auraProvider;
private ChunkCoords auraProviderPosition;
2015-01-16 22:59:06 +01:00
private BiomeGenBase biome;
private int displayHealthMax = 0;
private int displayHealth = 0;
private boolean init = false;
2015-03-28 02:51:41 -07:00
private final AuraCharges auraCharges = new AuraCharges();
2015-03-19 13:51:41 -07:00
private IErrorState errorState = ErrorStateRegistry.getErrorState("ok");
private Set<IErrorState> errors = new HashSet<IErrorState>();
2015-01-16 22:59:06 +01:00
private ItemStack[] items;
2015-03-20 16:52:42 -07:00
public TileEntityMagicApiary(){
2015-01-16 22:59:06 +01:00
items = new ItemStack[12];
2015-03-18 23:53:22 -07:00
logic = BeeManager.beeRoot.createBeekeepingLogic(this);
2015-01-16 22:59:06 +01:00
}
2015-03-19 13:51:41 -07:00
public void setOwner(EntityPlayer player) {
this.ownerProfile = player.getGameProfile();
}
2015-01-16 22:59:06 +01:00
@Override
public ItemStack getQueen() {
return getStackInSlot(SLOT_QUEEN);
}
@Override
public ItemStack getDrone() {
return getStackInSlot(SLOT_DRONE);
}
@Override
public void setQueen(ItemStack itemstack) {
setInventorySlotContents(SLOT_QUEEN, itemstack);
}
@Override
public void setDrone(ItemStack itemstack) {
setInventorySlotContents(SLOT_DRONE, itemstack);
}
@Override
public boolean canBreed() {
return true;
}
@Override
public void onQueenChange(ItemStack queenStack) {
2015-03-18 23:53:22 -07:00
if (!worldObj.isRemote) {
MagicBees.object.netHandler.sendInventoryUpdate(this, SLOT_QUEEN, queenStack);
}
2015-01-16 22:59:06 +01:00
}
@Override
public void wearOutEquipment(int amount) {
2015-03-18 23:53:22 -07:00
int wear = Math.round(amount * BeeManager.beeRoot.getBeekeepingMode(worldObj).getWearModifier());
2015-01-16 22:59:06 +01:00
for (int i = SLOT_FRAME_START; i < SLOT_FRAME_START + SLOT_FRAME_COUNT; i++) {
if (getStackInSlot(i) == null) {
2015-01-16 22:59:06 +01:00
continue;
}
if (!(getStackInSlot(i).getItem() instanceof IHiveFrame)) {
2015-01-16 22:59:06 +01:00
continue;
}
2015-01-16 22:59:06 +01:00
setInventorySlotContents(i, ((IHiveFrame) getStackInSlot(i).getItem()).frameUsed(this, getStackInSlot(i),
2015-03-18 23:53:22 -07:00
BeeManager.beeRoot.getMember(getStackInSlot(SLOT_QUEEN)), wear));
2015-01-16 22:59:06 +01:00
}
}
@Override
public void onQueenDeath(IBee queen) {
}
@Override
public void onPostQueenDeath(IBee queen) {
}
@Override
public boolean onPollenRetrieved(IBee queen, IIndividual pollen, boolean isHandled) {
return false;
}
@Override
public boolean onEggLaid(IBee queen) {
return false;
}
2015-03-19 13:51:41 -07:00
private boolean isItemStackFrame(int i) {
return getStackInSlot(i) != null && getStackInSlot(i).getItem() instanceof IHiveFrame;
}
2015-01-16 22:59:06 +01:00
@Override
public float getTerritoryModifier(IBeeGenome genome, float currentModifier) {
float mod = 1.0f;
2015-03-19 13:51:41 -07:00
for (int slotIndex = SLOT_FRAME_START; slotIndex < SLOT_FRAME_START + SLOT_FRAME_COUNT; slotIndex++) {
if (isItemStackFrame(slotIndex)) {
mod *= ((IHiveFrame) getStackInSlot(slotIndex).getItem()).getTerritoryModifier(genome, mod);
}
2015-01-16 22:59:06 +01:00
}
return mod;
}
@Override
public float getMutationModifier(IBeeGenome genome, IBeeGenome mate, float currentModifier) {
float mod = 1.0f;
2015-03-19 13:51:41 -07:00
for (int slotIndex = SLOT_FRAME_START; slotIndex < SLOT_FRAME_START + SLOT_FRAME_COUNT; slotIndex++) {
if (isItemStackFrame(slotIndex)) {
mod *= ((IHiveFrame) getStackInSlot(slotIndex).getItem()).getMutationModifier(genome, mate, mod);
}
2015-01-16 22:59:06 +01:00
}
if (this.isMutationBoosted()) {
mod = mod * 2f;
}
2015-01-16 22:59:06 +01:00
return mod;
}
@Override
public float getLifespanModifier(IBeeGenome genome, IBeeGenome mate, float currentModifier) {
float mod = 1.0f;
2015-03-19 13:51:41 -07:00
for (int slotIndex = SLOT_FRAME_START; slotIndex < SLOT_FRAME_START + SLOT_FRAME_COUNT; slotIndex++) {
if (isItemStackFrame(slotIndex)) {
mod *= ((IHiveFrame) getStackInSlot(slotIndex).getItem()).getLifespanModifier(genome, mate, mod);
}
2015-01-16 22:59:06 +01:00
}
if (this.isDeathRateBoosted()) {
mod = mod / 2f;
}
2015-01-16 22:59:06 +01:00
return mod;
}
@Override
public float getProductionModifier(IBeeGenome genome, float currentModifier) {
2015-03-19 13:51:41 -07:00
float mod = 0.9f;
for (int slotIndex = SLOT_FRAME_START; slotIndex < SLOT_FRAME_START + SLOT_FRAME_COUNT; slotIndex++){
if (isItemStackFrame(slotIndex)) {
mod *= ((IHiveFrame) getStackInSlot(slotIndex).getItem()).getProductionModifier(genome, mod);
}
2015-01-16 22:59:06 +01:00
}
2015-03-21 20:45:36 -07:00
if (this.isProductionBoosted()) {
mod = mod * 2f;
}
2015-01-16 22:59:06 +01:00
return mod;
}
@Override
public float getFloweringModifier(IBeeGenome genome, float currentModifier) {
float mod = 1.0f;
2015-03-19 13:51:41 -07:00
for (int slotIndex = SLOT_FRAME_START; slotIndex < SLOT_FRAME_START + SLOT_FRAME_COUNT; slotIndex++) {
if (isItemStackFrame(slotIndex)) {
mod *= ((IHiveFrame) getStackInSlot(slotIndex).getItem()).getFloweringModifier(genome, mod);
}
2015-01-16 22:59:06 +01:00
}
return mod;
}
@Override
public float getGeneticDecay(IBeeGenome genome, float currentModifier) {
2015-03-19 13:51:41 -07:00
float mod = 0.8f;
for (int slotIndex = SLOT_FRAME_START; slotIndex < SLOT_FRAME_START + SLOT_FRAME_COUNT; slotIndex++) {
if (isItemStackFrame(slotIndex)) {
mod *= ((IHiveFrame) getStackInSlot(slotIndex).getItem()).getGeneticDecay(genome, mod);
}
2015-01-16 22:59:06 +01:00
}
return mod;
}
@Override
public boolean isSealed() {
return false;
}
@Override
public boolean isSelfLighted() {
return false;
}
@Override
public boolean isSunlightSimulated() {
return false;
}
@Override
public boolean isHellish() {
return false;
}
@Override
public GameProfile getOwnerName() {
2015-03-19 13:51:41 -07:00
return this.ownerProfile;
2015-01-16 22:59:06 +01:00
}
@Override
public World getWorld() {
return worldObj;
}
@Override
public int getXCoord() {
return xCoord;
}
@Override
public int getYCoord() {
return yCoord;
}
@Override
public int getZCoord() {
return zCoord;
}
@Override
public BiomeGenBase getBiome() {
return biome;
}
@Override
public EnumTemperature getTemperature() {
return EnumTemperature.getFromValue(getExactTemperature());
}
@Override
public EnumHumidity getHumidity() {
return EnumHumidity.getFromValue(getExactHumidity());
}
@Override
public void setErrorState(IErrorState state) {
2015-03-19 13:51:41 -07:00
this.errorState = state;
2015-01-16 22:59:06 +01:00
}
@Override
public IErrorState getErrorState() {
2015-03-19 13:51:41 -07:00
return this.errorState;
2015-01-16 22:59:06 +01:00
}
@Override
public boolean setErrorCondition(boolean condition, IErrorState errorState) {
if (!condition) {
errors.add(errorState);
}
else {
errors.remove(errorState);
}
return true;
}
@Override
public Set<IErrorState> getErrorStates() {
return errors;
}
2015-01-16 22:59:06 +01:00
@Override
public boolean addProduct(ItemStack product, boolean all) {
2015-03-19 13:51:41 -07:00
int countAdded = ItemStackUtils.addItemToInventory(this, product, SLOT_PRODUCTS_START, SLOT_PRODUCTS_COUNT);
if (all) {
return countAdded == product.stackSize;
}
else {
return countAdded > 0;
}
2015-01-16 22:59:06 +01:00
}
@Override
public int getSizeInventory() {
return items.length;
}
@Override
public ItemStack getStackInSlot(int i) {
return items[i];
}
@Override
public ItemStack decrStackSize(int i, int j) {
ItemStack itemStack = getStackInSlot(i);
if (itemStack != null) {
if (itemStack.stackSize <= j) {
setInventorySlotContents(i, null);
}else{
itemStack = itemStack.splitStack(j);
markDirty();
}
}
return itemStack;
}
@Override
public ItemStack getStackInSlotOnClosing(int i) {
ItemStack item = getStackInSlot(i);
setInventorySlotContents(i, null);
return item;
}
@Override
public void setInventorySlotContents(int i, ItemStack itemStack) {
items[i] = itemStack;
if (itemStack != null && itemStack.stackSize > getInventoryStackLimit()){
itemStack.stackSize = getInventoryStackLimit();
}
markDirty();
}
@Override
public String getInventoryName() {
2015-03-19 13:51:41 -07:00
return tileEntityName;
2015-01-16 22:59:06 +01:00
}
@Override
public boolean hasCustomInventoryName() {
return false;
}
@Override
public int getInventoryStackLimit() {
return 64;
}
@Override
public boolean isUseableByPlayer(EntityPlayer entityPlayer) {
return entityPlayer.getDistanceSq(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5) <= 64;
}
@Override
public void openInventory() {
}
@Override
public void closeInventory() {
}
@Override
public boolean isItemValidForSlot(int i, ItemStack itemStack) {
return true;
}
@Override
public int[] getAccessibleSlotsFromSide(int side) {
if (side == 0 || side == 1) {
return new int[] { SLOT_QUEEN, SLOT_DRONE };
}
else {
int[] slots = new int[SLOT_PRODUCTS_COUNT];
for (int i = 0, slot = SLOT_PRODUCTS_START; i < SLOT_PRODUCTS_COUNT; ++i, ++slot) {
slots[i] = slot;
}
return slots;
}
2015-01-16 22:59:06 +01:00
}
@Override
public boolean canInsertItem(int slot, ItemStack itemStack, int side) {
2015-03-18 23:53:22 -07:00
if(slot == SLOT_QUEEN && BeeManager.beeRoot.isMember(itemStack)
&& !BeeManager.beeRoot.isDrone(itemStack)) {
2015-01-16 22:59:06 +01:00
return true;
2015-03-15 01:06:14 -07:00
}
2015-03-18 23:53:22 -07:00
else if (slot == SLOT_DRONE && BeeManager.beeRoot.isDrone(itemStack)) {
2015-03-15 01:06:14 -07:00
return true;
}
2015-03-18 23:53:22 -07:00
return slot == SLOT_DRONE && BeeManager.beeRoot.isDrone(itemStack);
2015-01-16 22:59:06 +01:00
}
@Override
public boolean canExtractItem(int slot, ItemStack itemStack, int side) {
switch (slot){
case SLOT_FRAME_START:
case SLOT_FRAME_START + 1:
case SLOT_FRAME_START + 2:
return false;
default:
return true;
}
}
private int getHealthDisplay() {
if (getStackInSlot(SLOT_QUEEN) == null) {
2015-01-16 22:59:06 +01:00
return 0;
}
2015-01-16 22:59:06 +01:00
2015-03-18 23:53:22 -07:00
if (BeeManager.beeRoot.isMated(getStackInSlot(SLOT_QUEEN))) {
return BeeManager.beeRoot.getMember(getStackInSlot(SLOT_QUEEN)).getHealth();
}
2015-03-18 23:53:22 -07:00
else if (!BeeManager.beeRoot.isDrone(getStackInSlot(SLOT_QUEEN))) {
2015-01-16 22:59:06 +01:00
return displayHealth;
}
else {
2015-01-16 22:59:06 +01:00
return 0;
}
2015-01-16 22:59:06 +01:00
}
private int getMaxHealthDisplay() {
if (getStackInSlot(SLOT_QUEEN) == null) {
2015-01-16 22:59:06 +01:00
return 0;
}
2015-03-18 23:53:22 -07:00
if (BeeManager.beeRoot.isMated(getStackInSlot(SLOT_QUEEN))) {
return BeeManager.beeRoot.getMember(getStackInSlot(SLOT_QUEEN)).getMaxHealth();
}
2015-03-18 23:53:22 -07:00
else if (!BeeManager.beeRoot.isDrone(getStackInSlot(SLOT_QUEEN))) {
2015-01-16 22:59:06 +01:00
return displayHealthMax;
}
else {
2015-01-16 22:59:06 +01:00
return 0;
}
2015-01-16 22:59:06 +01:00
}
public int getHealthScaled(int i) {
if (getMaxHealthDisplay() == 0) {
2015-01-16 22:59:06 +01:00
return 0;
}
2015-01-16 22:59:06 +01:00
return (getHealthDisplay() * i) / getMaxHealthDisplay();
}
public int getTemperatureScaled(int i) {
return Math.round(i * (getExactTemperature() / 2));
}
public int getHumidityScaled(int i) {
return Math.round(i * getExactHumidity());
}
/* Saving and loading */
@Override
public void writeToNBT(NBTTagCompound compound) {
2015-01-16 22:59:06 +01:00
super.writeToNBT(compound);
NBTTagList items = new NBTTagList();
for (int i = 0; i < getSizeInventory(); i++) {
2015-01-16 22:59:06 +01:00
ItemStack itemStack = getStackInSlot(i);
if (itemStack != null) {
2015-01-16 22:59:06 +01:00
NBTTagCompound item = new NBTTagCompound();
item.setByte("Slot", (byte)i);
itemStack.writeToNBT(item);
items.appendTag(item);
}
}
compound.setTag("Items", items);
2015-01-16 22:59:06 +01:00
compound.setInteger("BiomeId", biome.biomeID);
if (logic != null) {
2015-01-16 22:59:06 +01:00
logic.writeToNBT(compound);
}
2015-01-16 22:59:06 +01:00
ChunkCoords.writeToNBT(this.auraProviderPosition, compound);
2015-03-28 02:51:41 -07:00
auraCharges.writeToNBT(compound);
2015-01-16 22:59:06 +01:00
}
@Override
public void readFromNBT(NBTTagCompound compound) {
2015-01-16 22:59:06 +01:00
super.readFromNBT(compound);
NBTTagList items = compound.getTagList("Items", Constants.NBT.TAG_COMPOUND);
for (int i = 0; i < items.tagCount(); i++) {
2015-03-28 02:51:41 -07:00
NBTTagCompound item = items.getCompoundTagAt(i);
2015-01-16 22:59:06 +01:00
int slot = item.getByte("Slot");
if (slot >= 0 && slot < getSizeInventory()) {
2015-01-16 22:59:06 +01:00
setInventorySlotContents(slot, ItemStack.loadItemStackFromNBT(item));
}
}
int biomeId = compound.getInteger("BiomeId");
biome = BiomeGenBase.getBiome(biomeId);
logic.readFromNBT(compound);
2015-03-28 02:51:41 -07:00
this.auraProviderPosition = ChunkCoords.readFromNBT(compound);
2015-03-28 02:51:41 -07:00
auraCharges.readFromNBT(compound);
}
@Override
public Packet getDescriptionPacket() {
EventAuraChargeUpdate event = new EventAuraChargeUpdate(new ChunkCoords(this), auraCharges);
return event.getPacket();
2015-01-16 22:59:06 +01:00
}
public float getExactTemperature() {
2015-01-16 22:59:06 +01:00
return biome.temperature;
}
public float getExactHumidity() {
2015-01-16 22:59:06 +01:00
return biome.rainfall;
}
@Override
public void updateEntity() {
2015-03-28 02:51:41 -07:00
if (!init) {
2015-01-16 22:59:06 +01:00
init = true;
updateBiome();
}
2015-03-18 23:53:22 -07:00
if (worldObj.isRemote) {
2015-03-19 13:51:41 -07:00
updateClientSide();
}
else {
2015-03-19 13:51:41 -07:00
updateServerSide();
}
2015-01-16 22:59:06 +01:00
}
public void updateBiome() {
if (worldObj != null) {
if (biome == null) {
BiomeGenBase biome = worldObj.getBiomeGenForCoordsBody(xCoord, zCoord);
if (biome != null) {
2015-01-16 22:59:06 +01:00
this.biome = biome;
setErrorState(ErrorStateRegistry.getErrorState("OK"));
}
}
}
}
public void updateClientSide() {
2015-03-18 23:53:22 -07:00
if (BeeManager.beeRoot.isMated(getStackInSlot(SLOT_QUEEN))) {
if (getErrorState() == ErrorStateRegistry.getErrorState("OK") && worldObj.getTotalWorldTime() % 10 == 0) {
IBee displayQueen = BeeManager.beeRoot.getMember(getStackInSlot(SLOT_QUEEN));
2015-01-16 22:59:06 +01:00
displayQueen.doFX(logic.getEffectData(), this);
}
}
}
public void updateServerSide() {
2015-03-21 20:45:36 -07:00
if (this.auraProvider == null) {
findAuraProvider();
}
else {
updateAuraProvider();
}
tickCharges();
if (logic.canWork()) {
logic.doWork();
}
2015-01-16 22:59:06 +01:00
IBee queen = logic.getQueen();
if (queen == null) {
2015-01-16 22:59:06 +01:00
return;
}
2015-01-16 22:59:06 +01:00
2015-03-18 23:53:22 -07:00
if (worldObj.getTotalWorldTime() % 5 == 0) {
2015-01-16 22:59:06 +01:00
onQueenChange(getStackInSlot(SLOT_QUEEN));
}
2015-01-16 22:59:06 +01:00
}
public void getGUINetworkData(int i, int j) {
if (logic == null) {
2015-01-16 22:59:06 +01:00
return;
}
2015-01-16 22:59:06 +01:00
switch(i) {
case 0:
displayHealth = j;
break;
case 1: displayHealthMax = j;
break;
}
}
public void sendGUINetworkData(Container container, ICrafting iCrafting) {
if (logic == null) {
2015-01-16 22:59:06 +01:00
return;
}
2015-01-16 22:59:06 +01:00
iCrafting.sendProgressBarUpdate(container, 0, logic.getBreedingTime());
iCrafting.sendProgressBarUpdate(container, 1, logic.getTotalBreedingTime());
}
2015-03-21 20:45:36 -07:00
public boolean isProductionBoosted() {
return auraCharges.isActive(AuraCharge.PRODUCTION);
}
public boolean isDeathRateBoosted() {
return auraCharges.isActive(AuraCharge.DEATH);
}
public boolean isMutationBoosted() {
return auraCharges.isActive(AuraCharge.MUTATION);
}
private void updateAuraProvider() {
if (worldObj.getTotalWorldTime() % 10 != 0) {
return;
}
2015-03-28 02:51:41 -07:00
if (getAuraProvider(auraProviderPosition) == null) {
this.auraProvider = null;
this.auraProviderPosition = null;
return;
}
2015-03-28 02:51:41 -07:00
boolean auraChargesChanged = false;
for (AuraCharge charge : AuraCharge.values()) {
if (!auraCharges.isActive(charge) && auraProvider.getCharge(charge.type)) {
auraCharges.start(charge, worldObj);
2015-03-28 02:51:41 -07:00
auraChargesChanged = true;
}
}
2015-03-28 02:51:41 -07:00
if (auraChargesChanged) {
NetworkEventHandler.getInstance().sendAuraChargeUpdate(this, auraCharges);
}
}
private void tickCharges() {
2015-03-28 02:51:41 -07:00
boolean auraChargesChanged = false;
for (AuraCharge charge : AuraCharge.values()) {
if (auraCharges.isActive(charge) && auraCharges.isExpired(charge, worldObj) && (auraProvider == null || !auraProvider.getCharge(charge.type))) {
auraCharges.stop(charge);
2015-03-28 02:51:41 -07:00
auraChargesChanged = true;
}
}
if (auraChargesChanged) {
NetworkEventHandler.getInstance().sendAuraChargeUpdate(this, auraCharges);
2015-03-21 20:45:36 -07:00
}
}
private void findAuraProvider() {
if (worldObj.getTotalWorldTime() % 5 != 0) {
return;
}
2015-03-28 02:51:41 -07:00
if (this.auraProviderPosition == null) {
List<Chunk> chunks = getChunksInSearchRange();
for (Chunk chunk : chunks) {
if (searchChunkForBooster(chunk)) {
break;
}
}
} else {
this.auraProvider = getAuraProvider(auraProviderPosition);
if (auraProvider == null) {
this.auraProviderPosition = null;
}
}
}
private List<Chunk> getChunksInSearchRange() {
List<Chunk> chunks = new ArrayList<Chunk>(4);
chunks.add(worldObj.getChunkFromBlockCoords(xCoord - AURAPROVIDER_SEARCH_RADIUS, zCoord - AURAPROVIDER_SEARCH_RADIUS));
Chunk chunk = worldObj.getChunkFromBlockCoords(xCoord + AURAPROVIDER_SEARCH_RADIUS, zCoord - AURAPROVIDER_SEARCH_RADIUS);
if (!chunks.contains(chunk)) {
chunks.add(chunk);
}
chunk = worldObj.getChunkFromBlockCoords(xCoord - AURAPROVIDER_SEARCH_RADIUS, zCoord + AURAPROVIDER_SEARCH_RADIUS);
if (!chunks.contains(chunk)) {
chunks.add(chunk);
}
chunk = worldObj.getChunkFromBlockCoords(xCoord + AURAPROVIDER_SEARCH_RADIUS, zCoord + AURAPROVIDER_SEARCH_RADIUS);
if (!chunks.contains(chunk)) {
chunks.add(chunk);
}
return chunks;
}
2015-04-25 01:27:49 -07:00
@SuppressWarnings("unchecked")
private boolean searchChunkForBooster(Chunk chunk) {
Vec3 apiaryPos = Vec3.createVectorHelper(xCoord, yCoord, zCoord);
for (Map.Entry<ChunkPosition, TileEntity> entry : ((Map<ChunkPosition, TileEntity>)chunk.chunkTileEntityMap).entrySet()) {
TileEntity entity = entry.getValue();
if (entity instanceof IMagicApiaryAuraProvider) {
Vec3 tePos = Vec3.createVectorHelper(entity.xCoord, entity.yCoord, entity.zCoord);
Vec3 result = apiaryPos.subtract(tePos);
if (result.lengthVector() <= AURAPROVIDER_SEARCH_RADIUS) {
saveAuraProviderPosition(entity.xCoord, entity.yCoord, entity.zCoord);
this.auraProvider = (IMagicApiaryAuraProvider)entity;
return true;
}
}
}
return false;
}
private void saveAuraProviderPosition(int x, int y, int z) {
auraProviderPosition = new ChunkCoords(worldObj.provider.dimensionId, x, y, z);
}
2015-03-28 02:51:41 -07:00
private IMagicApiaryAuraProvider getAuraProvider(ChunkCoords coords) {
return getAuraProvider(coords.x, coords.y, coords.z);
}
2015-03-28 02:51:41 -07:00
private IMagicApiaryAuraProvider getAuraProvider(int x, int y, int z) {
Chunk chunk = worldObj.getChunkFromBlockCoords(x, z);
x %= 16;
z %= 16;
if (x < 0) {
x += 16;
}
if (z < 0) {
z += 16;
}
ChunkPosition cPos = new ChunkPosition(x, y, z);
TileEntity entity = (TileEntity)chunk.chunkTileEntityMap.get(cPos);
2015-03-28 02:51:41 -07:00
if (!(entity instanceof IMagicApiaryAuraProvider)) {
return null;
}
return (IMagicApiaryAuraProvider)entity;
}
2015-03-21 20:45:36 -07:00
2015-03-28 02:51:41 -07:00
@Override
public AuraCharges getAuraCharges() {
return auraCharges;
}
2014-09-16 20:30:20 +02:00
}