package joshie.harvest.fishing.tile;
import joshie.harvest.api.ticking.DailyTickableBlock;
import joshie.harvest.api.ticking.DailyTickableBlock.Phases;
import joshie.harvest.core.base.tile.TileSingleStack;
import joshie.harvest.core.helpers.FakePlayerHelper;
import joshie.harvest.core.helpers.SpawnItemHelper;
import joshie.harvest.core.lib.LootStrings;
import joshie.harvest.fishing.FishingAPI;
import joshie.harvest.fishing.FishingHelper;
import joshie.harvest.fishing.HFFishing;
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.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
import net.minecraft.world.storage.loot.LootContext;
import javax.annotation.Nonnull;
public class TileTrap extends TileSingleStack {
private static final DailyTickableBlock TICKABLE = new DailyTickableBlock(Phases.MAIN) {
@Override
public boolean isStateCorrect(World world, BlockPos pos, IBlockState state) {
return state.getBlock() == HFFishing.AQUATIC_BLOCKS && HFFishing.AQUATIC_BLOCKS.getEnumFromState(state).isTrap();
}
@Override
@SuppressWarnings("ConstantConditions")
public void newDay(World world, BlockPos pos, IBlockState state) {
TileTrap trap = (TileTrap) world.getTileEntity(pos);
if (trap.stack != null && FishingAPI.INSTANCE.isBait(trap.stack)) {
if (trap.isSurroundedByWater(world, pos)) {
LootContext.Builder lootcontext$builder = new LootContext.Builder((WorldServer) world);
lootcontext$builder.withLootedEntity(FakePlayerHelper.getFakePlayerWithPosition((WorldServer) world, pos));
if (FishingHelper.isWater(world, pos.down())) lootcontext$builder.withLuck(1F);
for (ItemStack itemstack : world.getLootTableManager().getLootTableFromLocation(trap.getLootTable()).generateLootForPools(world.rand, lootcontext$builder.build())) {
trap.baited = false;
trap.stack = itemstack.copy();
}
trap.saveAndRefresh();
}
}
}
};
private boolean baited = false;
@Override
public DailyTickableBlock getTickableForTile() {
return TICKABLE;
}
@Override
public boolean onRightClicked(EntityPlayer player, ItemStack place) {
if (stack == null && place != null && FishingAPI.INSTANCE.isBait(place)) {
stack = place.splitStack(1);
baited = true;
saveAndRefresh();
return true;
} else if (stack != null && !FishingAPI.INSTANCE.isBait(stack)) {
FishingHelper.track(stack, player);
SpawnItemHelper.spawnByEntity(player, stack);
baited = false;
stack = null;
saveAndRefresh();
return true;
}
return false;
}
public boolean isBaited() {
return baited;
}
private ResourceLocation getLootTable() {
return worldObj.rand.nextInt(4) == 0 ? FishingHelper.getFishingTable(worldObj, pos) : LootStrings.TRAP_JUNK;
}
private boolean isSurroundedByWater(World world, BlockPos pos) {
return FishingHelper.isWater(world, pos.east(), pos.west(), pos.south(), pos.north(), pos.up());
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
baited = nbt.getBoolean("Baited");
}
@Override
@Nonnull
public NBTTagCompound writeToNBT(NBTTagCompound nbt) {
nbt.setBoolean("Baited", baited);
return super.writeToNBT(nbt);
}
}