use of com.minecolonies.coremod.colony.buildings.BuildingBuilder in project minecolonies by Minecolonies.
the class EntityAIStructureBuilder method requestEntityToBuildingIfRequired.
/**
* Adds entities to the builder building if he needs it.
*/
private void requestEntityToBuildingIfRequired(final Template.EntityInfo entityInfo) {
if (entityInfo != null) {
final Entity entity = getEntityFromEntityInfoOrNull(entityInfo);
if (entity != null) {
final List<ItemStack> request = new ArrayList<>();
if (entity instanceof EntityItemFrame) {
final ItemStack stack = ((EntityItemFrame) entity).getDisplayedItem();
if (!InventoryUtils.isItemStackEmpty(stack)) {
stack.setCount(1);
request.add(stack);
}
request.add(new ItemStack(Items.ITEM_FRAME, 1));
} else if (entity instanceof EntityArmorStand) {
request.add(entity.getPickedResult(new RayTraceResult(worker)));
entity.getArmorInventoryList().forEach(request::add);
} else if (entity instanceof EntityMob) {
//Don't try to request the monster.
} else {
request.add(entity.getPickedResult(new RayTraceResult(worker)));
}
for (final ItemStack stack : request) {
final BuildingBuilder building = (BuildingBuilder) getOwnBuilding();
if (stack != null && stack.getItem() != null) {
building.addNeededResource(stack, 1);
}
}
}
}
}
use of com.minecolonies.coremod.colony.buildings.BuildingBuilder in project minecolonies by Minecolonies.
the class EntityAIStructureBuilder method requestMaterials.
/**
* Iterates through all the required resources and stores them in the building.
* Suppressing Sonar Rule Squid:S135
* The rule thinks we should have less continue and breaks.
* But in this case the rule does not apply because code would become unreadable and uneffective without.
*/
@SuppressWarnings(LOOPS_SHOULD_NOT_CONTAIN_MORE_THAN_A_SINGLE_BREAK_OR_CONTINUE_STATEMENT)
private void requestMaterials() {
if (job.getWorkOrder().isRequested()) {
return;
}
final AbstractBuildingWorker buildingWorker = getOwnBuilding();
if (buildingWorker instanceof BuildingBuilder) {
((BuildingBuilder) buildingWorker).resetNeededResources();
}
while (job.getStructure().findNextBlock()) {
@Nullable final Template.BlockInfo blockInfo = job.getStructure().getBlockInfo();
@Nullable final Template.EntityInfo entityInfo = job.getStructure().getEntityinfo();
if (entityInfo != null) {
for (final ItemStack stack : ItemStackUtils.getListOfStackForEntity(entityInfo, world, worker)) {
final BuildingBuilder building = (BuildingBuilder) getOwnBuilding();
if (!ItemStackUtils.isEmpty(stack)) {
building.addNeededResource(stack, 1);
}
}
}
if (blockInfo == null) {
continue;
}
@Nullable IBlockState blockState = blockInfo.blockState;
@Nullable Block block = blockState.getBlock();
if (job.getStructure().isStructureBlockEqualWorldBlock() || (blockState.getBlock() instanceof BlockBed && blockState.getValue(BlockBed.PART).equals(BlockBed.EnumPartType.FOOT)) || (blockState.getBlock() instanceof BlockDoor && blockState.getValue(BlockDoor.HALF).equals(BlockDoor.EnumDoorHalf.UPPER))) {
continue;
}
if (block instanceof BlockSolidSubstitution) {
blockState = getSolidSubstitution(job.getStructure().getBlockPosition());
block = blockState.getBlock();
}
final Block worldBlock = BlockPosUtil.getBlock(world, job.getStructure().getBlockPosition());
if (block != null && block != Blocks.AIR && worldBlock != Blocks.BEDROCK && !(worldBlock instanceof AbstractBlockHut) && !isBlockFree(block, 0)) {
requestBlockToBuildingIfRequired((BuildingBuilder) getOwnBuilding(), blockState);
}
}
job.getWorkOrder().setRequested(true);
}
use of com.minecolonies.coremod.colony.buildings.BuildingBuilder in project minecolonies by Minecolonies.
the class EntityAIStructureBuilder method executeSpecificCompleteActions.
@Override
public void executeSpecificCompleteActions() {
if (job.getStructure() == null && job.hasWorkOrder()) {
// fix for bad structures
job.complete();
}
if (job.getStructure() == null) {
return;
}
final String structureName = job.getStructure().getName();
worker.sendLocalizedChat(COM_MINECOLONIES_COREMOD_ENTITY_BUILDER_BUILDCOMPLETE, structureName);
final WorkOrderBuildDecoration wo = job.getWorkOrder();
if (wo == null) {
Log.getLogger().error(String.format("Builder (%d:%d) ERROR - Finished, but missing work order(%d)", worker.getColony().getID(), worker.getCitizenData().getId(), job.getWorkOrderId()));
} else {
final WorkOrderBuild woh = (wo instanceof WorkOrderBuild) ? (WorkOrderBuild) wo : null;
if (woh != null) {
final AbstractBuilding building = job.getColony().getBuildingManager().getBuilding(wo.getBuildingLocation());
if (building == null) {
Log.getLogger().error(String.format("Builder (%d:%d) ERROR - Finished, but missing building(%s)", worker.getColony().getID(), worker.getCitizenData().getId(), woh.getBuildingLocation()));
} else {
building.setBuildingLevel(woh.getUpgradeLevel());
}
}
job.complete();
}
final BuildingBuilder workerBuilding = (BuildingBuilder) getOwnBuilding();
workerBuilding.resetNeededResources();
resetTask();
}
use of com.minecolonies.coremod.colony.buildings.BuildingBuilder in project minecolonies by Minecolonies.
the class EntityAIStructureBuilder method getTotalRequiredAmount.
@Override
public int getTotalRequiredAmount(final ItemStack deliveredItemStack) {
if (getOwnBuilding() instanceof BuildingBuilder) {
if (ItemStackUtils.isEmpty(deliveredItemStack)) {
return 0;
}
final int hashCode = deliveredItemStack.hasTagCompound() ? deliveredItemStack.getTagCompound().hashCode() : 0;
final BuildingBuilderResource resource = ((BuildingBuilder) getOwnBuilding()).getNeededResources().get(deliveredItemStack.getUnlocalizedName() + ":" + deliveredItemStack.getItemDamage() + "-" + hashCode);
if (resource != null) {
return resource.getAmount();
}
}
return super.getTotalRequiredAmount(deliveredItemStack);
}
Aggregations