use of forestry.api.core.IErrorState in project ForestryMC by ForestryMC.
the class Bee method getCanWork.
@Override
public Set<IErrorState> getCanWork(IBeeHousing housing) {
World world = housing.getWorldObj();
Set<IErrorState> errorStates = new HashSet<>();
IBeeModifier beeModifier = BeeManager.beeRoot.createBeeHousingModifier(housing);
// / Rain needs tolerant flyers
if (housing.isRaining() && !canFlyInRain(beeModifier)) {
errorStates.add(EnumErrorCode.IS_RAINING);
}
// / Night or darkness requires nocturnal species
if (world.isDaytime()) {
if (!canWorkDuringDay()) {
errorStates.add(EnumErrorCode.NOT_NIGHT);
}
} else {
if (!canWorkAtNight(beeModifier)) {
errorStates.add(EnumErrorCode.NOT_DAY);
}
}
if (housing.getBlockLightValue() > Constants.APIARY_MIN_LEVEL_LIGHT) {
if (!canWorkDuringDay()) {
errorStates.add(EnumErrorCode.NOT_GLOOMY);
}
} else {
if (!canWorkAtNight(beeModifier)) {
errorStates.add(EnumErrorCode.NOT_BRIGHT);
}
}
// / Check for the sky, except if in hell
if (!world.provider.isNether()) {
if (!housing.canBlockSeeTheSky() && !canWorkUnderground(beeModifier)) {
errorStates.add(EnumErrorCode.NO_SKY);
}
}
// / And finally climate check
IAlleleBeeSpecies species = genome.getPrimary();
{
EnumTemperature actualTemperature = housing.getTemperature();
EnumTemperature beeBaseTemperature = species.getTemperature();
EnumTolerance beeToleranceTemperature = genome.getToleranceTemp();
if (!AlleleManager.climateHelper.isWithinLimits(actualTemperature, beeBaseTemperature, beeToleranceTemperature)) {
if (beeBaseTemperature.ordinal() > actualTemperature.ordinal()) {
errorStates.add(EnumErrorCode.TOO_COLD);
} else {
errorStates.add(EnumErrorCode.TOO_HOT);
}
}
}
{
EnumHumidity actualHumidity = housing.getHumidity();
EnumHumidity beeBaseHumidity = species.getHumidity();
EnumTolerance beeToleranceHumidity = genome.getToleranceHumid();
if (!AlleleManager.climateHelper.isWithinLimits(actualHumidity, beeBaseHumidity, beeToleranceHumidity)) {
if (beeBaseHumidity.ordinal() > actualHumidity.ordinal()) {
errorStates.add(EnumErrorCode.TOO_ARID);
} else {
errorStates.add(EnumErrorCode.TOO_HUMID);
}
}
}
return errorStates;
}
use of forestry.api.core.IErrorState in project ForestryMC by ForestryMC.
the class Butterfly method getCanSpawn.
@Override
public Set<IErrorState> getCanSpawn(IButterflyNursery nursery, @Nullable IButterflyCocoon cocoon) {
World world = nursery.getWorldObj();
Set<IErrorState> errorStates = new HashSet<>();
// / Night or darkness requires nocturnal species
boolean isDaytime = world.isDaytime();
if (!isActiveThisTime(isDaytime)) {
if (isDaytime) {
errorStates.add(EnumErrorCode.NOT_NIGHT);
} else {
errorStates.add(EnumErrorCode.NOT_DAY);
}
}
// / And finally climate check
IAlleleButterflySpecies species = genome.getPrimary();
EnumTemperature actualTemperature = nursery.getTemperature();
EnumTemperature baseTemperature = species.getTemperature();
EnumTolerance toleranceTemperature = genome.getToleranceTemp();
EnumHumidity actualHumidity = nursery.getHumidity();
EnumHumidity baseHumidity = species.getHumidity();
EnumTolerance toleranceHumidity = genome.getToleranceHumid();
ClimateUtil.addClimateErrorStates(actualTemperature, actualHumidity, baseTemperature, toleranceTemperature, baseHumidity, toleranceHumidity, errorStates);
return errorStates;
}
use of forestry.api.core.IErrorState in project ForestryMC by ForestryMC.
the class ContainerEntity method detectAndSendChanges.
@Override
public void detectAndSendChanges() {
super.detectAndSendChanges();
if (entity instanceof IErrorLogicSource) {
IErrorLogicSource errorLogicSource = (IErrorLogicSource) entity;
ImmutableSet<IErrorState> errorStates = errorLogicSource.getErrorLogic().getErrorStates();
if (previousErrorStates == null || !errorStates.equals(previousErrorStates)) {
PacketErrorUpdateEntity packet = new PacketErrorUpdateEntity(entity, errorLogicSource);
sendPacketToListeners(packet);
}
previousErrorStates = errorStates;
}
}
use of forestry.api.core.IErrorState in project ForestryMC by ForestryMC.
the class GreenhouseProviderServer method checkBlocks.
/**
* Check all internal blocks.
*/
private GreenhouseState checkBlocks(Collection<IGreenhouseBlock> blocks) {
IErrorLogic errorLogic = getErrorLogic();
errorLogic.clearErrors();
if (minSize == null || maxSize == null || minSize == Position2D.NULL_POSITION || maxSize == Position2D.NULL_POSITION) {
Position2D maxCoordinates = limits.getMaximumCoordinates();
maxSize = maxCoordinates.add(1, 1).add(centerPos.getX(), centerPos.getZ());
Position2D minCoordinates = limits.getMinimumCoordinates();
minSize = minCoordinates.add(-1, -1).add(centerPos.getX(), centerPos.getZ());
}
int greenhouseHeight = centerPos.getY();
int greenhouseDepth = centerPos.getY();
int height = 0;
int depth = 0;
int maximalHeight = ((IGreenhouseController) container.getParent()).getCenterCoordinates().getY() + limits.getHeight();
GreenhouseLimitsBuilder builder = new GreenhouseLimitsBuilder();
Stack<IGreenhouseBlock> blocksToCheck = new Stack();
blocksToCheck.addAll(blocks);
while (!blocksToCheck.isEmpty()) {
IGreenhouseBlock blockToCheck = blocksToCheck.pop();
if (blockToCheck != null) {
BlockPos position = blockToCheck.getPos();
IGreenhouseBlockHandler handler = blockToCheck.getHandler();
builder.recalculate(position);
List<IGreenhouseBlock> newBlocksToCheck = new LinkedList<>();
IErrorState errorState = handler.checkNeighborBlocks(storage, blockToCheck, newBlocksToCheck);
if (errorState != null) {
errorLogic.setCondition(true, errorState);
break;
}
blocksToCheck.addAll(newBlocksToCheck);
if (blockToCheck instanceof IBlankBlock) {
int positionHeight = getHeight(position, maximalHeight);
int positionDepth = getDepth(position);
if (positionHeight == -1) {
errorLogic.setCondition(true, EnumErrorCode.NOT_CLOSED);
// throw new GreenhouseException(Translator.translateToLocalFormatted("for.multiblock.greenhouse.error.roof.notclosed", position.getX(), position.getY(), position.getZ())).setPos(position);
break;
}
if (positionHeight > greenhouseHeight) {
greenhouseHeight = positionHeight;
}
height += positionHeight - centerPos.getY();
if (positionDepth < greenhouseDepth) {
greenhouseDepth = positionDepth;
}
depth += centerPos.getY() - positionDepth;
}
}
}
if (!unloadedChunks.isEmpty()) {
errorLogic.setCondition(true, EnumErrorCode.NOT_LOADED);
return GreenhouseState.UNLOADED_CHUNK;
}
if (errorLogic.hasErrors()) {
// Remove the state NOT_CLOSED if the logic has the state TOO_LARGE because the state NOT_CLOSED can be caused by the TOO_LARGE state
if (errorLogic.getErrorStates().contains(EnumErrorCode.TOO_LARGE)) {
errorLogic.setCondition(false, EnumErrorCode.NOT_CLOSED);
}
return GreenhouseState.OPEN;
}
this.size = height + depth + storage.getBlockCount();
usedLimits = builder.build(greenhouseHeight, greenhouseDepth);
return GreenhouseState.CLOSED;
}
use of forestry.api.core.IErrorState in project ForestryMC by ForestryMC.
the class BlankBlockHandler method checkBlockFacing.
private IErrorState checkBlockFacing(IGreenhouseBlockStorage storage, IBlankBlock blockToCheck, BlockPos rootPos, EnumFacing facing, List<IGreenhouseBlock> newBlocksToCheck) {
if (!blockToCheck.isFaceTested(facing)) {
BlockPos facingPosition = rootPos.offset(facing);
IGreenhouseProvider provider = storage.getProvider();
IErrorState errorState = provider.checkPosition(facingPosition);
if (errorState != null) {
return errorState;
}
IGreenhouseBlock logicBlock = storage.getBlock(facingPosition);
for (IGreenhouseBlockHandler handler : provider.getHandlers()) {
if (handler.onCheckPosition(storage, blockToCheck, facingPosition, facing, logicBlock, newBlocksToCheck)) {
break;
}
}
}
return null;
}
Aggregations