Search in sources :

Example 1 with ICraftingBuildingModule

use of com.minecolonies.api.colony.buildings.modules.ICraftingBuildingModule in project minecolonies by Minecolonies.

the class PrivateWorkerCraftingProductionResolver method resolveForBuilding.

@Override
public void resolveForBuilding(@NotNull final IRequestManager manager, @NotNull final IRequest<? extends PrivateCrafting> request, @NotNull final AbstractBuilding building) {
    manager.updateRequestState(request.getId(), RequestState.FINALIZING);
    final IRecipeStorage storage = IColonyManager.getInstance().getRecipeManager().getRecipes().get(request.getRequest().getRecipeID());
    if (storage == null) {
        manager.updateRequestState(request.getId(), RequestState.FAILED);
        return;
    }
    final ICraftingBuildingModule module = building.getCraftingModuleForRecipe(request.getRequest().getRecipeID());
    if (module == null) {
        manager.updateRequestState(request.getId(), RequestState.FAILED);
        return;
    }
    for (int i = 0; i < request.getRequest().getCount(); i++) {
        module.fullFillRecipe(storage);
    }
    manager.updateRequestState(request.getId(), RequestState.RESOLVED);
}
Also used : IRecipeStorage(com.minecolonies.api.crafting.IRecipeStorage) ICraftingBuildingModule(com.minecolonies.api.colony.buildings.modules.ICraftingBuildingModule)

Example 2 with ICraftingBuildingModule

use of com.minecolonies.api.colony.buildings.modules.ICraftingBuildingModule in project minecolonies by Minecolonies.

the class AbstractCraftingProductionResolver method resolveForBuilding.

/**
 * Resolve the request in a building.
 *
 * @param manager  the request manager.
 * @param request  the request.
 * @param building the building.
 */
public void resolveForBuilding(@NotNull final IRequestManager manager, @NotNull final IRequest<? extends C> request, @NotNull final AbstractBuilding building) {
    final AbstractBuilding buildingWorker = (AbstractBuilding) building;
    final ICraftingBuildingModule module = buildingWorker.getCraftingModuleForRecipe(request.getId());
    if (module == null) {
        manager.updateRequestState(request.getId(), RequestState.FAILED);
        return;
    }
    final IRecipeStorage storage = module.getFirstFulfillableRecipe(stack -> ItemStackUtils.compareItemStacksIgnoreStackSize(stack, request.getRequest().getStack()), request.getRequest().getCount(), false);
    if (storage == null) {
        manager.updateRequestState(request.getId(), RequestState.FAILED);
        return;
    }
    final int craftingCount = CraftingUtils.calculateMaxCraftingCount(request.getRequest().getCount(), storage);
    for (int i = 0; i < craftingCount; i++) {
        module.fullFillRecipe(storage);
    }
    manager.updateRequestState(request.getId(), RequestState.RESOLVED);
}
Also used : IRecipeStorage(com.minecolonies.api.crafting.IRecipeStorage) ICraftingBuildingModule(com.minecolonies.api.colony.buildings.modules.ICraftingBuildingModule) AbstractBuilding(com.minecolonies.coremod.colony.buildings.AbstractBuilding)

Example 3 with ICraftingBuildingModule

use of com.minecolonies.api.colony.buildings.modules.ICraftingBuildingModule in project minecolonies by Minecolonies.

the class CustomRecipe method isPrecursorRecipeMissing.

/**
 * Check if a precursor recipe is missing from the building.
 * @param building      The building which would contain the precursor recipe.
 * @return              True if a precursor recipe was required and not present.
 */
private boolean isPrecursorRecipeMissing(IBuilding building) {
    if (mustExist) {
        final IRecipeStorage compareStorage = this.getRecipeStorage();
        final ResourceLocation recipeSource = this.getRecipeId();
        for (final ICraftingBuildingModule module : building.getModules(ICraftingBuildingModule.class)) {
            for (IToken<?> recipeToken : module.getRecipes()) {
                final IRecipeStorage storage = IColonyManager.getInstance().getRecipeManager().getRecipes().get(recipeToken);
                if ((storage.getRecipeSource() != null && storage.getRecipeSource().equals(recipeSource)) || (ItemStackUtils.compareItemStacksIgnoreStackSize(storage.getPrimaryOutput(), compareStorage.getPrimaryOutput(), false, true) && storage.getCleanedInput().containsAll(compareStorage.getCleanedInput()) && compareStorage.getCleanedInput().containsAll(storage.getCleanedInput()))) {
                    return false;
                }
            }
        }
        return true;
    }
    // if no precursor needed.
    return false;
}
Also used : ResourceLocation(net.minecraft.util.ResourceLocation) ICraftingBuildingModule(com.minecolonies.api.colony.buildings.modules.ICraftingBuildingModule)

Example 4 with ICraftingBuildingModule

use of com.minecolonies.api.colony.buildings.modules.ICraftingBuildingModule in project minecolonies by Minecolonies.

the class AbstractEntityAICrafting method craft.

/**
 * The actual crafting logic.
 *
 * @return the next state to go to.
 */
protected IAIState craft() {
    if (currentRecipeStorage == null || job.getCurrentTask() == null) {
        return START_WORKING;
    }
    if (currentRequest == null && job.getCurrentTask() != null) {
        return GET_RECIPE;
    }
    if (walkToBuilding()) {
        return getState();
    }
    job.setProgress(job.getProgress() + 1);
    worker.setItemInHand(Hand.MAIN_HAND, currentRecipeStorage.getCleanedInput().get(worker.getRandom().nextInt(currentRecipeStorage.getCleanedInput().size())).getItemStack().copy());
    worker.setItemInHand(Hand.OFF_HAND, currentRecipeStorage.getPrimaryOutput().copy());
    worker.getCitizenItemHandler().hitBlockWithToolInHand(getOwnBuilding().getPosition());
    currentRequest = job.getCurrentTask();
    if (currentRequest != null && (currentRequest.getState() == RequestState.CANCELLED || currentRequest.getState() == RequestState.FAILED)) {
        currentRequest = null;
        incrementActionsDone(getActionRewardForCraftingSuccess());
        currentRecipeStorage = null;
        return START_WORKING;
    }
    if (job.getProgress() >= getRequiredProgressForMakingRawMaterial()) {
        final IAIState check = checkForItems(currentRecipeStorage);
        if (check == CRAFT) {
            if (!currentRecipeStorage.fullfillRecipe(getLootContext(), ImmutableList.of(worker.getItemHandlerCitizen()))) {
                currentRequest = null;
                incrementActionsDone(getActionRewardForCraftingSuccess());
                job.finishRequest(false);
                resetValues();
                return START_WORKING;
            }
            currentRequest.addDelivery(currentRecipeStorage.getPrimaryOutput());
            job.setCraftCounter(job.getCraftCounter() + 1);
            if (job.getCraftCounter() >= job.getMaxCraftingCount()) {
                incrementActionsDone(getActionRewardForCraftingSuccess());
                final ICraftingBuildingModule module = getOwnBuilding().getCraftingModuleForRecipe(currentRecipeStorage.getToken());
                if (module != null) {
                    module.improveRecipe(currentRecipeStorage, job.getCraftCounter(), worker.getCitizenData());
                }
                currentRecipeStorage = null;
                resetValues();
                if (inventoryNeedsDump()) {
                    if (job.getMaxCraftingCount() == 0 && job.getProgress() == 0 && job.getCraftCounter() == 0 && currentRequest != null) {
                        job.finishRequest(true);
                        worker.getCitizenExperienceHandler().addExperience(currentRequest.getRequest().getCount() / 2.0);
                    }
                }
            } else {
                job.setProgress(0);
                return GET_RECIPE;
            }
        } else {
            currentRequest = null;
            job.finishRequest(false);
            incrementActionsDoneAndDecSaturation();
            resetValues();
        }
        return START_WORKING;
    }
    return getState();
}
Also used : IAIState(com.minecolonies.api.entity.ai.statemachine.states.IAIState) ICraftingBuildingModule(com.minecolonies.api.colony.buildings.modules.ICraftingBuildingModule)

Example 5 with ICraftingBuildingModule

use of com.minecolonies.api.colony.buildings.modules.ICraftingBuildingModule in project minecolonies by ldtteam.

the class AbstractCraftingProductionResolver method resolveForBuilding.

/**
 * Resolve the request in a building.
 *
 * @param manager  the request manager.
 * @param request  the request.
 * @param building the building.
 */
public void resolveForBuilding(@NotNull final IRequestManager manager, @NotNull final IRequest<? extends C> request, @NotNull final AbstractBuilding building) {
    final AbstractBuilding buildingWorker = (AbstractBuilding) building;
    final ICraftingBuildingModule module = buildingWorker.getCraftingModuleForRecipe(request.getId());
    if (module == null) {
        manager.updateRequestState(request.getId(), RequestState.FAILED);
        return;
    }
    final IRecipeStorage storage = module.getFirstFulfillableRecipe(stack -> ItemStackUtils.compareItemStacksIgnoreStackSize(stack, request.getRequest().getStack()), request.getRequest().getCount(), false);
    if (storage == null) {
        manager.updateRequestState(request.getId(), RequestState.FAILED);
        return;
    }
    final int craftingCount = CraftingUtils.calculateMaxCraftingCount(request.getRequest().getCount(), storage);
    for (int i = 0; i < craftingCount; i++) {
        module.fullFillRecipe(storage);
    }
    manager.updateRequestState(request.getId(), RequestState.RESOLVED);
}
Also used : IRecipeStorage(com.minecolonies.api.crafting.IRecipeStorage) ICraftingBuildingModule(com.minecolonies.api.colony.buildings.modules.ICraftingBuildingModule) AbstractBuilding(com.minecolonies.coremod.colony.buildings.AbstractBuilding)

Aggregations

ICraftingBuildingModule (com.minecolonies.api.colony.buildings.modules.ICraftingBuildingModule)17 IRecipeStorage (com.minecolonies.api.crafting.IRecipeStorage)9 IAIState (com.minecolonies.api.entity.ai.statemachine.states.IAIState)7 ItemStorage (com.minecolonies.api.crafting.ItemStorage)5 AITarget (com.minecolonies.api.entity.ai.statemachine.AITarget)4 AIWorkerState (com.minecolonies.api.entity.ai.statemachine.states.AIWorkerState)4 InventoryUtils (com.minecolonies.api.util.InventoryUtils)4 ItemStackUtils (com.minecolonies.api.util.ItemStackUtils)4 AbstractBuilding (com.minecolonies.coremod.colony.buildings.AbstractBuilding)4 ItemStack (net.minecraft.item.ItemStack)4 Hand (net.minecraft.util.Hand)4 NotNull (org.jetbrains.annotations.NotNull)4 ImmutableList (com.google.common.collect.ImmutableList)2 IBuildingModule (com.minecolonies.api.colony.buildings.modules.IBuildingModule)2 BuildingEntry (com.minecolonies.api.colony.buildings.registry.BuildingEntry)2 ChatPriority (com.minecolonies.api.colony.interactionhandling.ChatPriority)2 IRequest (com.minecolonies.api.colony.requestsystem.request.IRequest)2 RequestState (com.minecolonies.api.colony.requestsystem.request.RequestState)2 Stack (com.minecolonies.api.colony.requestsystem.requestable.Stack)2 PublicCrafting (com.minecolonies.api.colony.requestsystem.requestable.crafting.PublicCrafting)2