package joshie.harvest.fishing.tile;
import joshie.harvest.api.ticking.DailyTickableBlock;
import joshie.harvest.api.ticking.DailyTickableBlock.Phases;
import joshie.harvest.core.base.render.RenderData;
import joshie.harvest.core.base.tile.TileSingleStack;
import joshie.harvest.core.helpers.SpawnItemHelper;
import joshie.harvest.core.helpers.StackHelper;
import joshie.harvest.fishing.FishingAPI;
import joshie.harvest.fishing.FishingHelper;
import joshie.harvest.fishing.HFFishing;
import joshie.harvest.fishing.block.BlockFloating.Floating;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.play.server.SPacketUpdateTileEntity;
import net.minecraft.util.ITickable;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.List;
public class TileHatchery extends TileSingleStack implements ITickable {
private static final DailyTickableBlock TICKABLE = new DailyTickableBlock(Phases.MAIN) {
@Override
public boolean isStateCorrect(World world, BlockPos pos, IBlockState state) {
return state.getBlock() == HFFishing.FLOATING_BLOCKS && HFFishing.FLOATING_BLOCKS.getEnumFromState(state) == Floating.HATCHERY;
}
@Override
@SuppressWarnings("ConstantConditions")
public void newDay(World world, BlockPos pos, IBlockState state) {
TileHatchery hatchery = (TileHatchery) world.getTileEntity(pos);
if (hatchery.isOnWaterSurface(world, pos.down())) {
ItemStack stack = hatchery.stack;
if (stack != null && stack.stackSize < 10) {
int daysRequired = FishingAPI.INSTANCE.getDaysFor(stack);
if (daysRequired >= 1) {
hatchery.daysPassed++;
if (hatchery.daysPassed >= FishingAPI.INSTANCE.getDaysFor(stack)) {
hatchery.daysPassed = 0;
stack.stackSize++;
hatchery.saveAndRefresh();
}
}
}
}
}
};
public final RenderData render = new RenderData();
private List<ItemStack> renderStacks = new ArrayList<>();
private int daysPassed = 0;
private int breakChance = 100;
private int last;
@Override
public DailyTickableBlock getTickableForTile() {
return TICKABLE;
}
@Override
public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity packet) {
super.onDataPacket(net, packet);
onFishChanged(); //Update the stack size
render.doRenderUpdate(worldObj, pos, last);
}
@Override
public void handleUpdateTag(@Nonnull NBTTagCompound tag) {
super.handleUpdateTag(tag);
onFishChanged(); //Update the stack size
render.doRenderUpdate(worldObj, pos, last);
}
@Override
public boolean onRightClicked(EntityPlayer player, ItemStack place) {
int daysRequired = place == null ? 0 : FishingAPI.INSTANCE.getDaysFor(place);
if (daysRequired <= 0) return removeFish(player);
if (stack != null && (!stack.isItemEqual(place) || stack.stackSize >= 10)) return false;
else {
ItemStack single = place.splitStack(1);
if (stack == null) {
stack = single.copy();
} else stack.stackSize++;
saveAndRefresh();
return true;
}
}
private boolean removeFish(EntityPlayer player) {
if (stack != null) {
if (!worldObj.isRemote) {
boolean broke = false;
if (worldObj.rand.nextInt(100) > breakChance) {
IBlockState state = worldObj.getBlockState(getPos());
if (worldObj.setBlockToAir(getPos())) {
broke = true;
worldObj.playEvent(null, 2001, getPos(), Block.getStateId(state));
}
} else breakChance -= 25;
if (breakChance <= 0) breakChance = 0;
if (stack.stackSize > 1 && !broke) {
SpawnItemHelper.spawnByEntity(player, StackHelper.toStack(stack, stack.stackSize - 1));
stack.stackSize = 1;
} else {
SpawnItemHelper.spawnByEntity(player, stack);
stack = null;
}
saveAndRefresh();
}
return true;
} else return false;
}
private void onFishChanged() {
renderStacks.clear();
if (stack != null) {
for (int i = 0; i < stack.stackSize; i++) {
renderStacks.add(StackHelper.toStack(stack, 1));
}
}
last = renderStacks.size();
}
public List<ItemStack> getFish() {
return renderStacks;
}
@Override
public void update() {
if (worldObj.isRemote) {
render.rotate(worldObj);
}
}
private boolean isOnWaterSurface(World world, BlockPos pos) {
return FishingHelper.isWater(world, pos.east(), pos.west(), pos.north(), pos.south(), pos.east().south(), pos.east().north(), pos.west().north(), pos.west().south());
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
daysPassed = nbt.getInteger("DaysPassed");
breakChance = nbt.getByte("TimesPulled");
}
@Override
@Nonnull
public NBTTagCompound writeToNBT(NBTTagCompound nbt) {
nbt.setInteger("DaysPassed", daysPassed);
nbt.setByte("TimesPulled", (byte) breakChance);
return super.writeToNBT(nbt);
}
}