use of com.minecolonies.api.util.Tuple in project minecolonies by Minecolonies.
the class SpecialAssignmentModuleWindow method onOpened.
@Override
public void onOpened() {
super.onOpened();
final List<Tuple<String, Integer>> workers = new ArrayList<>();
for (final IAssignmentModuleView module : buildingView.getModuleViews(IAssignmentModuleView.class)) {
for (final int worker : module.getAssignedCitizens()) {
workers.add(new Tuple<>(new TranslationTextComponent(module.getJobEntry().getTranslationKey()).getString(), worker));
}
}
if (findPaneByID(LIST_WORKERS) != null) {
ScrollingList workerList = findPaneOfTypeByID(LIST_WORKERS, ScrollingList.class);
workerList.setDataProvider(new ScrollingList.DataProvider() {
@Override
public int getElementCount() {
return workers.size();
}
@Override
public void updateElement(final int index, @NotNull final Pane rowPane) {
final ICitizenDataView worker = buildingView.getColony().getCitizen(workers.get(index).getB());
if (worker != null) {
rowPane.findPaneOfTypeByID(LABEL_WORKERNAME, Text.class).setText(new TranslationTextComponent(workers.get(index).getA()).getString() + ": " + worker.getName());
}
}
});
}
}
use of com.minecolonies.api.util.Tuple in project minecolonies by Minecolonies.
the class EventHandler method onEntityConverted.
/**
* Gets called when a Hoglin, Pig, Piglin, Villager, or ZombieVillager gets converted to something else.
*
* @param event the event to handle.
*/
@SubscribeEvent
public static void onEntityConverted(@NotNull final LivingConversionEvent.Pre event) {
LivingEntity entity = event.getEntityLiving();
if (entity instanceof ZombieVillagerEntity && event.getOutcome() == EntityType.VILLAGER) {
final World world = entity.getCommandSenderWorld();
final IColony colony = IColonyManager.getInstance().getIColony(world, entity.blockPosition());
if (colony != null && colony.hasBuilding("tavern", 1, false)) {
event.setCanceled(true);
if (ForgeEventFactory.canLivingConvert(entity, ModEntities.VISITOR, null)) {
IVisitorData visitorData = (IVisitorData) colony.getVisitorManager().createAndRegisterCivilianData();
BlockPos tavernPos = colony.getBuildingManager().getRandomBuilding(b -> !b.getModules(TavernBuildingModule.class).isEmpty());
IBuilding tavern = colony.getBuildingManager().getBuilding(tavernPos);
visitorData.setHomeBuilding(tavern);
visitorData.setBedPos(tavernPos);
tavern.getModules(TavernBuildingModule.class).forEach(mod -> mod.getExternalCitizens().add(visitorData.getId()));
int recruitLevel = world.random.nextInt(10 * tavern.getBuildingLevel()) + 15;
List<com.minecolonies.api.util.Tuple<Item, Integer>> recruitCosts = IColonyManager.getInstance().getCompatibilityManager().getRecruitmentCostsWeights();
visitorData.getCitizenSkillHandler().init(recruitLevel);
colony.getVisitorManager().spawnOrCreateCivilian(visitorData, world, entity.blockPosition(), false);
colony.getEventDescriptionManager().addEventDescription(new VisitorSpawnedEvent(entity.blockPosition(), visitorData.getName()));
if (visitorData.getEntity().isPresent()) {
AbstractEntityCitizen visitorEntity = visitorData.getEntity().get();
for (EquipmentSlotType slotType : EquipmentSlotType.values()) {
ItemStack itemstack = entity.getItemBySlot(slotType);
if (slotType.getType() == EquipmentSlotType.Group.ARMOR && !itemstack.isEmpty()) {
visitorEntity.setItemSlot(slotType, itemstack);
}
}
}
if (!entity.isSilent()) {
world.levelEvent((PlayerEntity) null, 1027, entity.blockPosition(), 0);
}
entity.remove();
Tuple<Item, Integer> cost = recruitCosts.get(world.random.nextInt(recruitCosts.size()));
visitorData.setRecruitCosts(new ItemStack(cost.getA(), (int) (recruitLevel * 3.0 / cost.getB())));
visitorData.triggerInteraction(new RecruitmentInteraction(new TranslationTextComponent("com.minecolonies.coremod.gui.chat.recruitstorycured", visitorData.getName().split(" ")[0]), ChatPriority.IMPORTANT));
}
}
}
}
use of com.minecolonies.api.util.Tuple in project minecolonies by Minecolonies.
the class AbstractWarehouseRequestResolver method attemptResolveRequest.
/*
* Moving the curly braces really makes the code hard to read.
*/
@Nullable
@Override
@SuppressWarnings("squid:LeftCurlyBraceStartLineCheck")
public List<IToken<?>> attemptResolveRequest(@NotNull final IRequestManager manager, @NotNull final IRequest<? extends IDeliverable> request) {
if (manager.getColony().getWorld().isClientSide) {
return Lists.newArrayList();
}
if (!(manager.getColony() instanceof Colony)) {
return Lists.newArrayList();
}
final Colony colony = (Colony) manager.getColony();
final List<TileEntityWareHouse> wareHouses = getWareHousesInColony(colony, request.getRequester().getLocation().getInDimensionLocation());
final int totalRequested = request.getRequest().getCount();
int totalAvailable = 0;
if (request.getRequest() instanceof INonExhaustiveDeliverable) {
totalAvailable -= ((INonExhaustiveDeliverable) request.getRequest()).getLeftOver();
}
for (final TileEntityWareHouse tile : wareHouses) {
final List<Tuple<ItemStack, BlockPos>> inv = tile.getMatchingItemStacksInWarehouse(itemStack -> request.getRequest().matches(itemStack));
for (final Tuple<ItemStack, BlockPos> stack : inv) {
if (!stack.getA().isEmpty()) {
totalAvailable += stack.getA().getCount();
}
}
}
if (totalAvailable >= totalRequested || totalAvailable >= request.getRequest().getMinimumCount()) {
return Lists.newArrayList();
}
if (totalAvailable < 0) {
totalAvailable = 0;
}
final int totalRemainingRequired = totalRequested - totalAvailable;
final IDeliverable remainingRequest = request.getRequest().copyWithCount(totalRemainingRequired);
return Lists.newArrayList(manager.createRequest(this, remainingRequest));
}
use of com.minecolonies.api.util.Tuple in project minecolonies by Minecolonies.
the class AbstractWarehouseRequestResolver method getFollowupRequestForCompletion.
@Nullable
@Override
public List<IRequest<?>> getFollowupRequestForCompletion(@NotNull final IRequestManager manager, @NotNull final IRequest<? extends IDeliverable> completedRequest) {
if (manager.getColony().getWorld().isClientSide) {
return null;
}
final Colony colony = (Colony) manager.getColony();
final List<TileEntityWareHouse> wareHouses = getWareHousesInColony(colony, completedRequest.getRequester().getLocation().getInDimensionLocation());
List<IRequest<?>> deliveries = Lists.newArrayList();
int remainingCount = completedRequest.getRequest().getCount();
final Map<ItemStorage, Integer> storages = new HashMap<>();
final int keep = completedRequest.getRequest() instanceof INonExhaustiveDeliverable ? ((INonExhaustiveDeliverable) completedRequest.getRequest()).getLeftOver() : 0;
tileentities: for (final TileEntityWareHouse wareHouse : wareHouses) {
final List<Tuple<ItemStack, BlockPos>> targetStacks = wareHouse.getMatchingItemStacksInWarehouse(itemStack -> completedRequest.getRequest().matches(itemStack));
for (final Tuple<ItemStack, BlockPos> tuple : targetStacks) {
if (ItemStackUtils.isEmpty(tuple.getA())) {
continue;
}
int leftOver = tuple.getA().getCount();
if (keep > 0) {
int kept = storages.getOrDefault(new ItemStorage(tuple.getA()), 0);
if (kept < keep) {
if (leftOver + kept <= keep) {
storages.put(new ItemStorage(tuple.getA()), storages.getOrDefault(new ItemStorage(tuple.getA()), 0) + tuple.getA().getCount());
continue;
}
int toKeep = (leftOver + kept) - keep;
leftOver -= toKeep;
storages.put(new ItemStorage(tuple.getA()), storages.getOrDefault(new ItemStorage(tuple.getA()), 0) + toKeep);
}
}
int count = Math.min(remainingCount, leftOver);
final ItemStack matchingStack = tuple.getA().copy();
matchingStack.setCount(count);
completedRequest.addDelivery(matchingStack);
final ILocation itemStackLocation = manager.getFactoryController().getNewInstance(TypeConstants.ILOCATION, tuple.getB(), wareHouse.getLevel().dimension());
final Delivery delivery = new Delivery(itemStackLocation, completedRequest.getRequester().getLocation(), matchingStack, getDefaultDeliveryPriority(true));
final IToken<?> requestToken = manager.createRequest(manager.getFactoryController().getNewInstance(TypeToken.of(this.getClass()), completedRequest.getRequester().getLocation(), completedRequest.getId()), delivery);
deliveries.add(manager.getRequestForToken(requestToken));
remainingCount -= count;
if (remainingCount <= 0) {
break tileentities;
}
}
}
return deliveries.isEmpty() ? null : deliveries;
}
use of com.minecolonies.api.util.Tuple in project minecolonies by Minecolonies.
the class AbstractEntityAICrafting method checkForItems.
/**
* Check for all items of the required recipe.
*
* @param storage the recipe storage.
* @return the next state to go to.
*/
protected IAIState checkForItems(@NotNull final IRecipeStorage storage) {
final int inProgressCount = getExtendedCount(currentRecipeStorage.getPrimaryOutput());
final int countPerIteration = currentRecipeStorage.getPrimaryOutput().getCount();
final int progressOpsCount = inProgressCount / Math.max(countPerIteration, 1);
final List<ItemStorage> input = storage.getCleanedInput();
for (final ItemStorage inputStorage : input) {
final Predicate<ItemStack> predicate = stack -> !ItemStackUtils.isEmpty(stack) && new Stack(stack, false).matches(inputStorage.getItemStack());
final int invCount = InventoryUtils.getItemCountInItemHandler(worker.getInventoryCitizen(), predicate);
final ItemStack container = inputStorage.getItem().getContainerItem(inputStorage.getItemStack());
final int remaining;
if (!currentRecipeStorage.getCraftingToolsAndSecondaryOutputs().isEmpty() && ItemStackUtils.compareItemStackListIgnoreStackSize(currentRecipeStorage.getCraftingToolsAndSecondaryOutputs(), inputStorage.getItemStack(), false, true)) {
remaining = inputStorage.getAmount();
} else if (!ItemStackUtils.isEmpty(container) && ItemStackUtils.compareItemStacksIgnoreStackSize(inputStorage.getItemStack(), container, false, true)) {
remaining = inputStorage.getAmount();
} else {
remaining = inputStorage.getAmount() * Math.max(job.getMaxCraftingCount(), 1);
}
if (invCount <= 0 || invCount + ((job.getCraftCounter() + progressOpsCount) * inputStorage.getAmount()) < remaining) {
if (InventoryUtils.hasItemInProvider(building, predicate)) {
needsCurrently = new Tuple<>(predicate, remaining);
return GATHERING_REQUIRED_MATERIALS;
}
currentRecipeStorage = null;
currentRequest = null;
return GET_RECIPE;
}
}
return CRAFT;
}
Aggregations