package joshie.harvest.buildings.item;
import joshie.harvest.api.buildings.Building;
import joshie.harvest.buildings.BuildingError;
import joshie.harvest.buildings.BuildingHelper;
import joshie.harvest.buildings.BuildingRegistry;
import joshie.harvest.buildings.HFBuildings;
import joshie.harvest.buildings.render.BuildingKey;
import joshie.harvest.core.HFTab;
import joshie.harvest.core.base.item.ItemHFRegistry;
import joshie.harvest.core.helpers.TextHelper;
import joshie.harvest.core.util.interfaces.ICreativeSorted;
import joshie.harvest.town.TownHelper;
import joshie.harvest.town.data.TownData;
import joshie.harvest.town.data.TownDataServer;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ActionResult;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.List;
public class ItemBlueprint extends ItemHFRegistry<ItemBlueprint, Building> implements ICreativeSorted {
public ItemBlueprint() {
super("Building", BuildingRegistry.REGISTRY, Building.REGISTRY, HFTab.TOWN);
setMaxStackSize(1);
}
@Override
@Nonnull
public ActionResult<ItemStack> onItemRightClick(@Nonnull ItemStack stack, World world, EntityPlayer player, EnumHand hand) {
List<BuildingError> errors = new ArrayList<>();
if (world.provider.getDimension() != 0) errors.add(BuildingError.DIMENSION);
else {
Building building = getObjectFromStack(stack);
RayTraceResult raytrace = BuildingHelper.rayTrace(player, 128D, 0F);
if (raytrace == null || building == null) return new ActionResult<>(EnumActionResult.PASS, stack); //Skip the rest of this
BlockPos pos = raytrace.getBlockPos();
if (player.canPlayerEdit(pos, EnumFacing.DOWN, stack)) {
TownData town = TownHelper.getClosestTownToBlockPos(world, pos, false);
if ((!town.hasBuilding(building) && !town.isBuilding(building)) || building.canHaveMultiple()) {
BuildingKey key = BuildingHelper.getPositioning(stack, world, raytrace, building, player, true);
if (key != null) {
if (!world.isRemote) {
TownDataServer data = TownHelper.getClosestTownToBlockPos(world, pos, true);
data.setBuilding(world, building, key.getPos().down(building.getOffsetY()), key.getRotation());
data.createOrUpdateBuilder((WorldServer) world, pos);
}
stack.splitStack(1); //Decrease the stack size
} else return new ActionResult<>(EnumActionResult.PASS, stack);
} else if (town.hasBuilding(building)) errors.add(BuildingError.DISTANCE);
else errors.add(BuildingError.BUILDING);
} else errors.add(BuildingError.PERMISSION);
}
//Process the errors for the player
if (errors.size() == 0) return new ActionResult<>(EnumActionResult.SUCCESS, stack);
else return BuildingHelper.displayErrors(world, stack, errors);
}
@Override
public Building getDefaultValue() {
return HFBuildings.CARPENTER;
}
@Override
public String getItemStackDisplayName(ItemStack stack) {
return TextHelper.format("harvestfestival.structures.blueprint", getObjectFromStack(stack).getLocalisedName());
}
@Override
public int getSortValue(ItemStack stack) {
return 105;
}
}