Search in sources :

Example 6 with ILocation

use of com.minecolonies.api.colony.requestsystem.location.ILocation in project minecolonies by Minecolonies.

the class EntityAIWorkDeliveryman method gatherItems.

/**
 * Gather item from chest.
 * Gathers only one stack of the item.
 *
 * @param request request to gather
 */
private AIState gatherItems(@NotNull final IRequest<? extends Delivery> request) {
    final ILocation location = request.getRequest().getStart();
    if (!location.isReachableFromLocation(worker.getLocation())) {
        ((BuildingDeliveryman) getOwnBuilding()).setBuildingToDeliver(null);
        job.finishRequest(false);
        return START_WORKING;
    }
    final TileEntity tileEntity = world.getTileEntity(location.getInDimensionLocation());
    if (tileEntity instanceof TileEntityChest && !(tileEntity instanceof TileEntityColonyBuilding)) {
        if (((TileEntityChest) tileEntity).numPlayersUsing == 0) {
            this.world.addBlockEvent(tileEntity.getPos(), tileEntity.getBlockType(), 1, 1);
            this.world.notifyNeighborsOfStateChange(tileEntity.getPos(), tileEntity.getBlockType(), true);
            this.world.notifyNeighborsOfStateChange(tileEntity.getPos().down(), tileEntity.getBlockType(), true);
            setDelay(DUMP_AND_GATHER_DELAY);
            return getState();
        }
        this.world.addBlockEvent(tileEntity.getPos(), tileEntity.getBlockType(), 1, 0);
        this.world.notifyNeighborsOfStateChange(tileEntity.getPos(), tileEntity.getBlockType(), true);
        this.world.notifyNeighborsOfStateChange(tileEntity.getPos().down(), tileEntity.getBlockType(), true);
    }
    if (isInTileEntity(tileEntity, request.getRequest().getStack())) {
        setDelay(DUMP_AND_GATHER_DELAY);
        return DELIVERY;
    }
    ((BuildingDeliveryman) getOwnBuilding()).setBuildingToDeliver(null);
    job.finishRequest(true);
    return START_WORKING;
}
Also used : TileEntity(net.minecraft.tileentity.TileEntity) TileEntityChest(net.minecraft.tileentity.TileEntityChest) ILocation(com.minecolonies.api.colony.requestsystem.location.ILocation) TileEntityColonyBuilding(com.minecolonies.coremod.tileentities.TileEntityColonyBuilding)

Example 7 with ILocation

use of com.minecolonies.api.colony.requestsystem.location.ILocation in project minecolonies by Minecolonies.

the class EntityAIWorkDeliveryman method deliver.

/**
 * Deliver the items to the hut.
 *
 * @return the next state.
 */
private AIState deliver() {
    if (job.isReturning()) {
        return DUMPING;
    }
    final BuildingDeliveryman deliveryHut = (getOwnBuilding() instanceof BuildingDeliveryman) ? (BuildingDeliveryman) getOwnBuilding() : null;
    final ILocation buildingToDeliver = deliveryHut == null ? null : deliveryHut.getBuildingToDeliver();
    if (deliveryHut == null) {
        return START_WORKING;
    } else if (buildingToDeliver == null) {
        if (job.getCurrentTask() != null && deliveryHut != null) {
            final IRequest<? extends Delivery> request = job.getCurrentTask();
            deliveryHut.setBuildingToDeliver(request.getRequest().getTarget());
            return getState();
        }
        return START_WORKING;
    }
    worker.setLatestStatus(new TextComponentTranslation("com.minecolonies.coremod.status.delivering"));
    if (!buildingToDeliver.isReachableFromLocation(worker.getLocation())) {
        Log.getLogger().info(worker.getColony().getName() + ": " + worker.getName() + ": Can't inter dimension yet: ");
        return START_WORKING;
    }
    if (!worker.isWorkerAtSiteWithMove(buildingToDeliver.getInDimensionLocation(), MIN_DISTANCE_TO_WAREHOUSE)) {
        return DELIVERY;
    }
    final InvWrapper workerInventory = new InvWrapper(worker.getInventoryCitizen());
    for (int i = 0; i < new InvWrapper(worker.getInventoryCitizen()).getSlots(); i++) {
        final ItemStack stack = workerInventory.extractItem(i, Integer.MAX_VALUE, false);
        if (ItemStackUtils.isEmpty(stack)) {
            continue;
        }
        final TileEntity tileEntity = world.getTileEntity(buildingToDeliver.getInDimensionLocation());
        final ItemStack insertionResultStack;
        if (tileEntity instanceof TileEntityColonyBuilding && ((TileEntityColonyBuilding) tileEntity).getBuilding() instanceof AbstractBuildingWorker) {
            final AbstractBuilding building = ((TileEntityColonyBuilding) tileEntity).getBuilding();
            building.alterPickUpPriority(1);
            insertionResultStack = InventoryUtils.forceItemStackToItemHandler(new InvWrapper((TileEntityColonyBuilding) tileEntity), stack, ((AbstractBuildingWorker) building)::isItemStackInRequest);
        } else {
            insertionResultStack = InventoryUtils.forceItemStackToItemHandler(new InvWrapper((TileEntityColonyBuilding) tileEntity), stack, itemStack -> false);
        }
        if (!ItemStackUtils.isEmpty(insertionResultStack)) {
            if (ItemStack.areItemStacksEqual(insertionResultStack, stack)) {
                // same stack, we could not deliver ?
                if (buildingToDeliver instanceof TileEntityColonyBuilding && ((TileEntityColonyBuilding) tileEntity).getBuilding() instanceof AbstractBuildingWorker) {
                    chatSpamFilter.talkWithoutSpam(COM_MINECOLONIES_COREMOD_JOB_DELIVERYMAN_NAMEDCHESTFULL, ((AbstractBuildingWorker) ((TileEntityColonyBuilding) tileEntity).getBuilding()).getMainWorker().getName());
                } else if (buildingToDeliver instanceof TileEntityColonyBuilding) {
                    chatSpamFilter.talkWithoutSpam(COM_MINECOLONIES_COREMOD_JOB_DELIVERYMAN_CHESTFULL, new TextComponentString(" :" + ((TileEntityColonyBuilding) tileEntity).getBuilding().getSchematicName()));
                } else {
                    chatSpamFilter.talkWithoutSpam(COM_MINECOLONIES_COREMOD_JOB_DELIVERYMAN_CHESTFULL, new TextComponentString(buildingToDeliver.getInDimensionLocation().toString()));
                }
            }
            // Insert the result back into the inventory so we do not loose it.
            workerInventory.insertItem(i, insertionResultStack, false);
        }
    }
    lastDelivery = deliveryHut.getBuildingToDeliver();
    worker.addExperience(1.0D);
    worker.setHeldItem(SLOT_HAND);
    deliveryHut.setBuildingToDeliver(null);
    job.finishRequest(true);
    setDelay(WAIT_DELAY);
    return START_WORKING;
}
Also used : IRequest(com.minecolonies.api.colony.requestsystem.request.IRequest) java.util(java.util) ItemStackUtils(com.minecolonies.api.util.ItemStackUtils) IToken(com.minecolonies.api.colony.requestsystem.token.IToken) Log(com.minecolonies.blockout.Log) TextComponentTranslation(net.minecraft.util.text.TextComponentTranslation) TileEntityChest(net.minecraft.tileentity.TileEntityChest) JobDeliveryman(com.minecolonies.coremod.colony.jobs.JobDeliveryman) ItemStack(net.minecraft.item.ItemStack) InvWrapper(net.minecraftforge.items.wrapper.InvWrapper) AITarget(com.minecolonies.coremod.entity.ai.util.AITarget) ImmutableList(com.google.common.collect.ImmutableList) Delivery(com.minecolonies.api.colony.requestsystem.requestable.Delivery) TICKS_SECOND(com.minecolonies.api.util.constant.Constants.TICKS_SECOND) AbstractEntityAIInteract(com.minecolonies.coremod.entity.ai.basic.AbstractEntityAIInteract) TranslationConstants(com.minecolonies.api.util.constant.TranslationConstants) Colony(com.minecolonies.coremod.colony.Colony) ILocation(com.minecolonies.api.colony.requestsystem.location.ILocation) ItemFood(net.minecraft.item.ItemFood) BlockPos(net.minecraft.util.math.BlockPos) AIState(com.minecolonies.coremod.entity.ai.util.AIState) TileEntityColonyBuilding(com.minecolonies.coremod.tileentities.TileEntityColonyBuilding) Collectors(java.util.stream.Collectors) com.minecolonies.coremod.colony.buildings(com.minecolonies.coremod.colony.buildings) TextComponentString(net.minecraft.util.text.TextComponentString) Nullable(org.jetbrains.annotations.Nullable) InventoryUtils(com.minecolonies.api.util.InventoryUtils) TileEntity(net.minecraft.tileentity.TileEntity) ItemStorage(com.minecolonies.api.crafting.ItemStorage) NotNull(org.jetbrains.annotations.NotNull) Configurations(com.minecolonies.api.configuration.Configurations) TextComponentTranslation(net.minecraft.util.text.TextComponentTranslation) TileEntityColonyBuilding(com.minecolonies.coremod.tileentities.TileEntityColonyBuilding) TextComponentString(net.minecraft.util.text.TextComponentString) TileEntity(net.minecraft.tileentity.TileEntity) ILocation(com.minecolonies.api.colony.requestsystem.location.ILocation) InvWrapper(net.minecraftforge.items.wrapper.InvWrapper) IRequest(com.minecolonies.api.colony.requestsystem.request.IRequest) Delivery(com.minecolonies.api.colony.requestsystem.requestable.Delivery) ItemStack(net.minecraft.item.ItemStack)

Example 8 with ILocation

use of com.minecolonies.api.colony.requestsystem.location.ILocation in project minecolonies by Minecolonies.

the class WarehouseRequestResolver method attemptResolve.

@Nullable
@Override
@SuppressWarnings("squid:LeftCurlyBraceStartLineCheck")
public /**
 * Moving the curly braces really makes the code hard to read.
 */
List<IToken<?>> attemptResolve(@NotNull final IRequestManager manager, @NotNull final IRequest<? extends IDeliverable> request) {
    if (manager.getColony().getWorld().isRemote) {
        return null;
    }
    final Colony colony = (Colony) manager.getColony();
    final Set<TileEntityWareHouse> wareHouses = getWareHousesInColony(colony);
    for (final TileEntityWareHouse wareHouse : wareHouses) {
        ItemStack matchingStack = wareHouse.getFirstMatchingItemStackInWarehouse(itemStack -> request.getRequest().matches(itemStack));
        if (ItemStackUtils.isEmpty(matchingStack)) {
            continue;
        }
        matchingStack = matchingStack.copy();
        matchingStack.setCount(Math.min(request.getRequest().getCount(), matchingStack.getCount()));
        final ItemStack deliveryStack = matchingStack.copy();
        request.setDelivery(deliveryStack.copy());
        final BlockPos itemStackPos = wareHouse.getPositionOfChestWithItemStack(itemStack -> ItemStack.areItemsEqual(itemStack, deliveryStack));
        final ILocation itemStackLocation = manager.getFactoryController().getNewInstance(TypeConstants.ILOCATION, itemStackPos, wareHouse.getWorld().provider.getDimension());
        final Delivery delivery = new Delivery(itemStackLocation, request.getRequester().getRequesterLocation(), deliveryStack.copy());
        final IToken<?> requestToken = manager.createRequest(new WarehouseRequestResolver(request.getRequester().getRequesterLocation(), request.getToken()), delivery);
        return ImmutableList.of(requestToken);
    }
    return Lists.newArrayList();
}
Also used : ILocation(com.minecolonies.api.colony.requestsystem.location.ILocation) TileEntityWareHouse(com.minecolonies.coremod.tileentities.TileEntityWareHouse) Colony(com.minecolonies.coremod.colony.Colony) BlockPos(net.minecraft.util.math.BlockPos) Delivery(com.minecolonies.api.colony.requestsystem.requestable.Delivery) ItemStack(net.minecraft.item.ItemStack) Nullable(org.jetbrains.annotations.Nullable)

Example 9 with ILocation

use of com.minecolonies.api.colony.requestsystem.location.ILocation in project minecolonies by Minecolonies.

the class AbstractBuildingDependentRequestResolver method getBuilding.

@Override
@Nullable
public Optional<IRequester> getBuilding(@NotNull final IRequestManager manager, @NotNull final IToken<?> token) {
    final IRequest request = manager.getRequestForToken(token);
    if (request.getRequester() instanceof BuildingBasedRequester) {
        final BuildingBasedRequester requester = (BuildingBasedRequester) request.getRequester();
        final ILocation requesterLocation = requester.getRequesterLocation();
        if (requesterLocation.equals(getRequesterLocation())) {
            return requester.getBuilding(manager, token);
        }
    }
    return Optional.empty();
}
Also used : BuildingBasedRequester(com.minecolonies.coremod.colony.requestsystem.requesters.BuildingBasedRequester) IBuildingBasedRequester(com.minecolonies.coremod.colony.requestsystem.requesters.IBuildingBasedRequester) ILocation(com.minecolonies.api.colony.requestsystem.location.ILocation) IRequest(com.minecolonies.api.colony.requestsystem.request.IRequest) Nullable(org.jetbrains.annotations.Nullable)

Example 10 with ILocation

use of com.minecolonies.api.colony.requestsystem.location.ILocation in project minecolonies by Minecolonies.

the class BuildingRequestResolverFactory method deserialize.

@NotNull
@Override
public BuildingRequestResolver deserialize(@NotNull final IFactoryController controller, @NotNull final NBTTagCompound nbt) {
    final IToken token = controller.deserialize(nbt.getCompoundTag(NBT_TOKEN));
    final ILocation location = controller.deserialize(nbt.getCompoundTag(NBT_LOCATION));
    return new BuildingRequestResolver(location, token);
}
Also used : ILocation(com.minecolonies.api.colony.requestsystem.location.ILocation) IToken(com.minecolonies.api.colony.requestsystem.token.IToken) BuildingRequestResolver(com.minecolonies.coremod.colony.requestsystem.resolvers.BuildingRequestResolver) NotNull(org.jetbrains.annotations.NotNull)

Aggregations

ILocation (com.minecolonies.api.colony.requestsystem.location.ILocation)14 NotNull (org.jetbrains.annotations.NotNull)10 IToken (com.minecolonies.api.colony.requestsystem.token.IToken)7 Collectors (java.util.stream.Collectors)3 ItemStack (net.minecraft.item.ItemStack)3 Nullable (org.jetbrains.annotations.Nullable)3 TypeToken (com.google.common.reflect.TypeToken)2 IFactory (com.minecolonies.api.colony.requestsystem.factory.IFactory)2 IFactoryController (com.minecolonies.api.colony.requestsystem.factory.IFactoryController)2 IRequestManager (com.minecolonies.api.colony.requestsystem.manager.IRequestManager)2 IRequest (com.minecolonies.api.colony.requestsystem.request.IRequest)2 Delivery (com.minecolonies.api.colony.requestsystem.requestable.Delivery)2 NBTUtils (com.minecolonies.api.util.NBTUtils)2 Colony (com.minecolonies.coremod.colony.Colony)2 BuildingBasedRequester (com.minecolonies.coremod.colony.requestsystem.requesters.BuildingBasedRequester)2 StandardPlayerRequestResolver (com.minecolonies.coremod.colony.requestsystem.resolvers.StandardPlayerRequestResolver)2 TileEntityColonyBuilding (com.minecolonies.coremod.tileentities.TileEntityColonyBuilding)2 TileEntity (net.minecraft.tileentity.TileEntity)2 TileEntityChest (net.minecraft.tileentity.TileEntityChest)2 BlockPos (net.minecraft.util.math.BlockPos)2