use of com.minecolonies.coremod.colony.interactionhandling.StandardInteraction in project minecolonies by Minecolonies.
the class EntityAIEatTask method hasFood.
/**
* Checks if the citizen has food in the inventory and makes a decision based on that.
*
* @return the next state to go to.
*/
private boolean hasFood() {
final int slot = InventoryUtils.findFirstSlotInProviderNotEmptyWith(citizen, stack -> CAN_EAT.test(stack) && canEat(citizen.getCitizenData(), stack));
if (slot != -1) {
foodSlot = slot;
return true;
}
final ICitizenData citizenData = citizen.getCitizenData();
if (InventoryUtils.hasItemInItemHandler(citizen.getInventoryCitizen(), ISCOOKABLE)) {
citizenData.triggerInteraction(new StandardInteraction(new TranslationTextComponent(RAW_FOOD), ChatPriority.PENDING));
} else if (InventoryUtils.hasItemInItemHandler(citizen.getInventoryCitizen(), stack -> CAN_EAT.test(stack) && !canEat(citizenData, stack))) {
if (citizenData.isChild()) {
citizenData.triggerInteraction(new StandardInteraction(new TranslationTextComponent(BETTER_FOOD_CHILDREN), ChatPriority.BLOCKING));
} else {
citizenData.triggerInteraction(new StandardInteraction(new TranslationTextComponent(BETTER_FOOD), ChatPriority.BLOCKING));
}
}
return false;
}
use of com.minecolonies.coremod.colony.interactionhandling.StandardInteraction in project minecolonies by Minecolonies.
the class EntityAIWorkEnchanter method decide.
/**
* Decide method of the enchanter. Check if everything is alright to work and then decide between gathering and draining and actually enchanting.
*
* @return the next state to go to.
*/
protected IAIState decide() {
worker.setItemInHand(Hand.MAIN_HAND, ItemStack.EMPTY);
if (walkToBuilding()) {
return DECIDE;
}
final IAIState craftState = getNextCraftingState();
if (craftState != getState() && !WorldUtil.isPastTime(world, 13000)) {
return craftState;
}
if (getPrimarySkillLevel() < building.getBuildingLevel() * MANA_REQ_PER_LEVEL) {
final BuildingEnchanter enchanterBuilding = building;
final EnchanterStationsModule module = enchanterBuilding.getFirstModuleOccurance(EnchanterStationsModule.class);
if (module.getBuildingsToGatherFrom().isEmpty()) {
if (worker.getCitizenData() != null) {
worker.getCitizenData().triggerInteraction(new StandardInteraction(new TranslationTextComponent(NO_WORKERS_TO_DRAIN_SET), ChatPriority.BLOCKING));
}
return IDLE;
}
final int booksInInv = InventoryUtils.getItemCountInItemHandler(worker.getInventoryCitizen(), IS_BOOK);
if (booksInInv <= 0) {
final int numberOfBooksInBuilding = InventoryUtils.hasBuildingEnoughElseCount(building, IS_BOOK, 1);
if (numberOfBooksInBuilding > 0) {
needsCurrently = new Tuple<>(IS_BOOK, 1);
return GATHERING_REQUIRED_MATERIALS;
}
checkIfRequestForItemExistOrCreateAsync(new ItemStack(Items.BOOK, 1));
return IDLE;
}
final BlockPos posToDrainFrom = module.getRandomBuildingToDrainFrom();
if (posToDrainFrom == null) {
return IDLE;
}
job.setBuildingToDrainFrom(posToDrainFrom);
return ENCHANTER_DRAIN;
}
final int ancientTomesInInv = InventoryUtils.getItemCountInItemHandler(worker.getInventoryCitizen(), IS_ANCIENT_TOME);
if (ancientTomesInInv <= 0) {
final int amountOfAncientTomes = InventoryUtils.hasBuildingEnoughElseCount(building, IS_ANCIENT_TOME, 1);
if (amountOfAncientTomes > 0) {
needsCurrently = new Tuple<>(IS_ANCIENT_TOME, 1);
return GATHERING_REQUIRED_MATERIALS;
}
checkIfRequestForItemExistOrCreateAsync(new ItemStack(ModItems.ancientTome, 1), 1, 1, false);
return IDLE;
}
return ENCHANT;
}
use of com.minecolonies.coremod.colony.interactionhandling.StandardInteraction in project minecolonies by Minecolonies.
the class EntityAIWorkFarmer method prepareForFarming.
/**
* Prepares the farmer for farming. Also requests the tools and checks if the farmer has sufficient fields.
*
* @return the next IAIState
*/
@NotNull
private IAIState prepareForFarming() {
if (building == null || building.getBuildingLevel() < 1) {
return PREPARING;
}
if (!job.getTaskQueue().isEmpty() || getActionsDoneUntilDumping() <= job.getActionsDone()) {
return START_WORKING;
}
worker.getCitizenData().setVisibleStatus(VisibleCitizenStatus.WORKING);
final FarmerFieldModule module = building.getFirstModuleOccurance(FarmerFieldModule.class);
module.syncWithColony(world);
if (module.getFarmerFields().size() < building.getBuildingLevel() && !module.assignManually()) {
searchAndAddFields();
}
if (module.getFarmerFields().size() == building.getMaxBuildingLevel()) {
AdvancementUtils.TriggerAdvancementPlayersForColony(building.getColony(), AdvancementTriggers.MAX_FIELDS::trigger);
}
final int amountOfCompostInBuilding = InventoryUtils.hasBuildingEnoughElseCount(building, this::isCompost, 1);
final int amountOfCompostInInv = InventoryUtils.getItemCountInItemHandler(worker.getInventoryCitizen(), this::isCompost);
if (amountOfCompostInBuilding + amountOfCompostInInv <= 0) {
if (building.requestFertilizer() && !building.hasWorkerOpenRequestsOfType(worker.getCitizenData().getId(), TypeToken.of(StackList.class))) {
final List<ItemStack> compostAbleItems = new ArrayList<>();
compostAbleItems.add(new ItemStack(ModItems.compost, 1));
compostAbleItems.add(new ItemStack(Items.BONE_MEAL, 1));
worker.getCitizenData().createRequestAsync(new StackList(compostAbleItems, RequestSystemTranslationConstants.REQUEST_TYPE_FERTILIZER, STACKSIZE, 1));
}
} else if (amountOfCompostInInv <= 0 && amountOfCompostInBuilding > 0) {
needsCurrently = new Tuple<>(this::isCompost, STACKSIZE);
return GATHERING_REQUIRED_MATERIALS;
}
if (module.hasNoFields()) {
if (worker.getCitizenData() != null) {
worker.getCitizenData().triggerInteraction(new StandardInteraction(new TranslationTextComponent(NO_FREE_FIELDS), ChatPriority.BLOCKING));
}
worker.getCitizenData().setIdleAtJob(true);
return PREPARING;
}
worker.getCitizenData().setIdleAtJob(false);
// If the farmer has no currentField and there is no field which needs work, check fields.
if (module.getCurrentField() == null && module.getFieldToWorkOn(world) == null) {
module.resetFields();
return IDLE;
}
@Nullable final BlockPos currentField = module.getCurrentField();
final TileEntity entity = world.getBlockEntity(currentField);
if (entity instanceof ScarecrowTileEntity && ((ScarecrowTileEntity) entity).needsWork()) {
if (((ScarecrowTileEntity) entity).getFieldStage() == ScarecrowFieldStage.PLANTED && checkIfShouldExecute((ScarecrowTileEntity) entity, pos -> this.findHarvestableSurface(pos) != null)) {
return FARMER_HARVEST;
} else if (((ScarecrowTileEntity) entity).getFieldStage() == ScarecrowFieldStage.HOED) {
return canGoPlanting((ScarecrowTileEntity) entity, building);
} else if (((ScarecrowTileEntity) entity).getFieldStage() == ScarecrowFieldStage.EMPTY && checkIfShouldExecute((ScarecrowTileEntity) entity, pos -> this.findHoeableSurface(pos, (ScarecrowTileEntity) entity) != null)) {
return FARMER_HOE;
}
((ScarecrowTileEntity) entity).nextState();
} else {
module.setCurrentField(null);
}
return PREPARING;
}
use of com.minecolonies.coremod.colony.interactionhandling.StandardInteraction in project minecolonies by Minecolonies.
the class EntityAIWorkFlorist method compost.
/**
* Walk to the block to compost and apply compost to it.
*
* @return the next state to go to.
*/
private IAIState compost() {
if (compostPosition == null) {
return START_WORKING;
}
worker.getCitizenData().setVisibleStatus(GARDENING);
if (walkToBlock(compostPosition)) {
return getState();
}
final TileEntity entity = world.getBlockEntity(compostPosition);
if (entity instanceof TileEntityCompostedDirt) {
@Nullable final ItemStack stack = building.getFlowerToGrow();
if (stack != null) {
if (worker.getRandom().nextInt(200 - getPrimarySkillLevel()) < 0 || InventoryUtils.shrinkItemCountInItemHandler(worker.getInventoryCitizen(), IS_COMPOST)) {
((TileEntityCompostedDirt) entity).compost(PERCENT_CHANGE_FOR_GROWTH - (building.getBuildingLevel() * 0.01), building.getFlowerToGrow());
}
} else {
worker.getCitizenData().triggerInteraction(new StandardInteraction(new TranslationTextComponent(NO_FLOWERS_IN_CONFIG), ChatPriority.BLOCKING));
}
}
incrementActionsDone();
worker.decreaseSaturationForContinuousAction();
compostPosition = null;
return START_WORKING;
}
use of com.minecolonies.coremod.colony.interactionhandling.StandardInteraction in project minecolonies by Minecolonies.
the class EntityAIWorkFlorist method decide.
/**
* Main decision method of florist to decide what to do.
*
* @return the next AI state to go to.
*/
private IAIState decide() {
worker.getCitizenData().setVisibleStatus(VisibleCitizenStatus.WORKING);
if (building.getPlantGround().isEmpty()) {
worker.getCitizenData().triggerInteraction(new StandardInteraction(new TranslationTextComponent(NO_PLANT_GROUND_FLORIST), ChatPriority.BLOCKING));
return IDLE;
}
worker.setItemInHand(Hand.MAIN_HAND, ItemStack.EMPTY);
final long distance = BlockPosUtil.getDistance2D(worker.blockPosition(), building.getPosition());
if (distance > MAX_DISTANCE && walkToBuilding()) {
return DECIDE;
}
final int amountOfCompostInInv = InventoryUtils.getItemCountInItemHandler(worker.getInventoryCitizen(), IS_COMPOST);
if (amountOfCompostInInv <= 0) {
final int amountOfCompostInBuilding = InventoryUtils.hasBuildingEnoughElseCount(building, IS_COMPOST, 1);
if (amountOfCompostInBuilding > 0) {
needsCurrently = new Tuple<>(IS_COMPOST, STACKSIZE);
return GATHERING_REQUIRED_MATERIALS;
} else {
checkIfRequestForItemExistOrCreateAsync(new ItemStack(ModItems.compost, COMPOST_REQUEST_QTY));
}
}
harvestPosition = areThereFlowersToGather();
if (harvestPosition != null) {
return FLORIST_HARVEST;
}
if (amountOfCompostInInv <= 0) {
if (!isThereCompostedLand(building, world)) {
worker.getCitizenData().triggerInteraction(new StandardInteraction(new TranslationTextComponent(NO_COMPOST), ChatPriority.BLOCKING));
return START_WORKING;
}
return DECIDE;
} else {
compostPosition = getFirstNotCompostedLand();
return FLORIST_COMPOST;
}
}
Aggregations