use of com.minecolonies.api.colony.requestsystem.request.IRequest in project minecolonies by Minecolonies.
the class WindowClipBoard method onOpened.
/**
* Called when the window is opened.
* Sets up the buttons for either hut mode or decoration mode.
*/
@Override
public void onOpened() {
resourceList.setDataProvider(() -> getOpenRequests().size(), (index, rowPane) -> {
final ImmutableList<IRequest> openRequests = getOpenRequests();
if (index < 0 || index >= openRequests.size()) {
return;
}
final IRequest request = openRequests.get(index);
final ItemIcon exampleStackDisplay = rowPane.findPaneOfTypeByID(LIST_ELEMENT_ID_REQUEST_STACK, ItemIcon.class);
final List<ItemStack> displayStacks = request.getDisplayStacks();
if (!displayStacks.isEmpty()) {
if (exampleStackDisplay != null) {
exampleStackDisplay.setItem(displayStacks.get((lifeCount / LIFE_COUNT_DIVIDER) % displayStacks.size()));
}
} else {
final Image logo = findPaneOfTypeByID(DELIVERY_IMAGE, Image.class);
logo.setVisible(true);
logo.setImage(request.getDisplayIcon());
}
final ColonyView view = ColonyManager.getColonyView(colonyId);
rowPane.findPaneOfTypeByID(REQUESTER, Label.class).setLabelText(request.getRequester().getDisplayName(view.getRequestManager(), request.getToken()).getFormattedText());
rowPane.findPaneOfTypeByID(REQUEST_SHORT_DETAIL, Label.class).setLabelText(request.getShortDisplayString().getFormattedText().replace("§f", ""));
});
}
use of com.minecolonies.api.colony.requestsystem.request.IRequest 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;
}
use of com.minecolonies.api.colony.requestsystem.request.IRequest in project minecolonies by Minecolonies.
the class AbstractEntityAIBasic method checkForToolOrWeapon.
protected boolean checkForToolOrWeapon(@NotNull final IToolType toolType, final int minimalLevel) {
final ImmutableList<IRequest<? extends Tool>> openToolRequests = getOwnBuilding().getOpenRequestsOfTypeFiltered(worker.getCitizenData(), TypeToken.of(Tool.class), r -> r.getRequest().getToolClass().equals(toolType) && r.getRequest().getMinLevel() >= minimalLevel);
final ImmutableList<IRequest<? extends Tool>> completedToolRequests = getOwnBuilding().getCompletedRequestsOfTypeFiltered(worker.getCitizenData(), TypeToken.of(Tool.class), r -> r.getRequest().getToolClass().equals(toolType) && r.getRequest().getMinLevel() >= minimalLevel);
if (checkForNeededTool(toolType, minimalLevel)) {
if (openToolRequests.isEmpty() && completedToolRequests.isEmpty()) {
final Tool request = new Tool(toolType, minimalLevel, getOwnBuilding().getMaxToolLevel() < minimalLevel ? minimalLevel : getOwnBuilding().getMaxToolLevel());
worker.getCitizenData().createRequest(request);
}
return true;
}
return false;
}
use of com.minecolonies.api.colony.requestsystem.request.IRequest in project minecolonies by Minecolonies.
the class AbstractEntityAIBasic method lookForRequests.
/**
* Utility method to search for items currently needed.
* Poll this until all items are there.
*/
@NotNull
private AIState lookForRequests() {
if (!this.getOwnBuilding().hasWorkerOpenRequestsFiltered(worker.getCitizenData(), r -> !worker.getCitizenData().isRequestAsync(r.getToken())) && !getOwnBuilding().hasCitizenCompletedRequests(worker.getCitizenData())) {
return IDLE;
}
if (!walkToBuilding() && getOwnBuilding().hasCitizenCompletedRequests(worker.getCitizenData())) {
delay += DELAY_RECHECK;
@SuppressWarnings(RAWTYPES) final ImmutableList<IRequest> completedRequests = getOwnBuilding().getCompletedRequests(worker.getCitizenData());
completedRequests.stream().filter(r -> !(r.canBeDelivered())).forEach(r -> getOwnBuilding().markRequestAsAccepted(worker.getCitizenData(), r.getToken()));
@SuppressWarnings(RAWTYPES) final IRequest firstDeliverableRequest = completedRequests.stream().filter(IRequest::canBeDelivered).findFirst().orElse(null);
if (firstDeliverableRequest != null) {
boolean async = false;
if (worker.getCitizenData().isRequestAsync(firstDeliverableRequest.getToken())) {
async = true;
job.getAsyncRequests().remove(firstDeliverableRequest.getToken());
}
getOwnBuilding().markRequestAsAccepted(worker.getCitizenData(), firstDeliverableRequest.getToken());
final ItemStack deliveredItemStack = firstDeliverableRequest.getDelivery();
final int count = InventoryUtils.getItemCountInItemHandler(new InvWrapper(worker.getInventoryCitizen()), stack -> ItemStackUtils.compareItemStacksIgnoreStackSize(deliveredItemStack, stack, true, true));
if (count >= deliveredItemStack.getCount() && getTotalRequiredAmount(deliveredItemStack) <= count) {
return NEEDS_ITEM;
}
// Takes one Stack from the hut if existent
if (InventoryUtils.getItemCountInProvider(getOwnBuilding(), stack -> ItemStackUtils.compareItemStacksIgnoreStackSize(deliveredItemStack, stack, true, true)) >= deliveredItemStack.getCount() && InventoryUtils.transferXOfFirstSlotInProviderWithIntoNextFreeSlotInItemHandler(getOwnBuilding(), stack -> ItemStackUtils.compareItemStacksIgnoreStackSize(deliveredItemStack, stack, true, true), deliveredItemStack.getCount(), new InvWrapper(worker.getInventoryCitizen()))) {
return NEEDS_ITEM;
} else {
// Lets try this again.
if (async) {
worker.getCitizenData().createRequestAsync(firstDeliverableRequest.getRequest());
} else {
worker.getCitizenData().createRequest(firstDeliverableRequest.getRequest());
}
}
}
}
return NEEDS_ITEM;
}
use of com.minecolonies.api.colony.requestsystem.request.IRequest in project minecolonies by Minecolonies.
the class WarehouseRequestResolver method canResolve.
@Override
public boolean canResolve(@NotNull final IRequestManager manager, final IRequest<? extends IDeliverable> requestToCheck) {
if (!manager.getColony().getWorld().isRemote) {
final Colony colony = (Colony) manager.getColony();
final Set<TileEntityWareHouse> wareHouses = getWareHousesInColony(colony);
wareHouses.removeIf(Objects::isNull);
try {
return wareHouses.stream().anyMatch(wareHouse -> wareHouse.hasMatchinItemStackInWarehouse(itemStack -> requestToCheck.getRequest().matches(itemStack)));
} catch (Exception e) {
Log.getLogger().error(e);
}
}
return false;
}
Aggregations