use of com.minecolonies.api.colony.requestsystem.requestable.Delivery in project minecolonies by Minecolonies.
the class DeliveryRequestResolver method attemptResolve.
@Nullable
@Override
public List<IToken<?>> attemptResolve(@NotNull final IRequestManager manager, @NotNull final IRequest<? extends Delivery> request) {
if (manager.getColony().getWorld().isRemote) {
return null;
}
final Colony colony = (Colony) manager.getColony();
// We can do an instant get here, since we are already filtering on anything that has no entity.
final CitizenData freeDeliveryMan = colony.getCitizenManager().getCitizens().stream().filter(citizenData -> citizenData.getCitizenEntity().map(entityCitizen -> request.getRequest().getTarget().isReachableFromLocation(entityCitizen.getLocation())).orElse(false)).filter(c -> c.getJob() instanceof JobDeliveryman).min(Comparator.comparing((CitizenData c) -> ((JobDeliveryman) c.getJob()).getTaskQueue().size()).thenComparing(Comparator.comparing(c -> {
BlockPos targetPos = request.getRequest().getTarget().getInDimensionLocation();
// We can do an instant get here, since we are already filtering on anything that has no entity.
BlockPos entityLocation = c.getCitizenEntity().get().getLocation().getInDimensionLocation();
return BlockPosUtil.getDistanceSquared(targetPos, entityLocation);
}))).orElse(null);
if (freeDeliveryMan == null) {
return null;
}
final JobDeliveryman job = (JobDeliveryman) freeDeliveryMan.getJob();
job.addRequest(request.getToken());
return Lists.newArrayList();
}
use of com.minecolonies.api.colony.requestsystem.requestable.Delivery in project minecolonies by Minecolonies.
the class DeliveryRequestResolver method canResolve.
@Override
public boolean canResolve(@NotNull final IRequestManager manager, final IRequest<? extends Delivery> requestToCheck) {
if (manager.getColony().getWorld().isRemote) {
return false;
}
final Colony colony = (Colony) manager.getColony();
final CitizenData freeDeliveryMan = colony.getCitizenManager().getCitizens().stream().filter(citizenData -> citizenData.getCitizenEntity().map(entityCitizen -> requestToCheck.getRequest().getTarget().isReachableFromLocation(entityCitizen.getLocation())).orElse(false)).filter(c -> c.getJob() instanceof JobDeliveryman).findFirst().orElse(null);
return freeDeliveryMan != null;
}
use of com.minecolonies.api.colony.requestsystem.requestable.Delivery 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.requestable.Delivery 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();
}
Aggregations