diff --git a/api/forestry b/api/forestry index 4c416da9d..e3fbf6587 160000 --- a/api/forestry +++ b/api/forestry @@ -1 +1 @@ -Subproject commit 4c416da9d0d71002f9f9ea1c1603d8840a83f46f +Subproject commit e3fbf65873ef668d3da7c95cc2001a412c47d9c7 diff --git a/src/main/java/forestry/apiculture/BeekeepingLogic.java b/src/main/java/forestry/apiculture/BeekeepingLogic.java index 48830daf8..ea984bfca 100755 --- a/src/main/java/forestry/apiculture/BeekeepingLogic.java +++ b/src/main/java/forestry/apiculture/BeekeepingLogic.java @@ -49,6 +49,10 @@ public class BeekeepingLogic implements IBeekeepingLogic { private int attemptedPollinations = 0; private final Stack spawn = new Stack(); + // Cached flowers check + private Boolean hasFlowersCached = false; + private int hasFlowersCooldown = 0; + public BeekeepingLogic(IBeeHousing housing) { this.housing = housing; @@ -118,9 +122,9 @@ public class BeekeepingLogic implements IBeekeepingLogic { } /* UPDATING */ - @Override - public void update() { + @Override + public boolean canWork() { if (housingSupportsMultipleErrorStates) { Set errorStates = housing.getErrorStates(); for (IErrorState errorState : errorStates) { @@ -130,19 +134,50 @@ public class BeekeepingLogic implements IBeekeepingLogic { this.queen = null; - if (!addPendingProducts()) { - return; - } - - if (tryBreedingPrincess() || !hasHealthyQueen()) { - return; + Boolean canWork = addPendingProducts(); + + if (!hasBreedablePrincess()) { + canWork = hasHealthyQueen() && (canWork & queenCanWork()) && hasFlowers(); } - if (!queenCanWork()) { - return; + return canWork; + } + + @Override + public void doWork() { + if (hasBreedablePrincess()) { + tickBreed(); + } else if (queen != null) { + queenWorkTick(); + } + } + + @Override + public void update() { + if (canWork()) { + doWork(); + } + } + + private Boolean hasFlowers() { + if (hasFlowersCooldown<=0) { + hasFlowersCached = queen.hasFlower(housing); + hasFlowersCooldown = PluginApiculture.ticksPerBeeWorkCycle; + } else { + hasFlowersCooldown--; } - queenWorkTick(); + if (housingSupportsMultipleErrorStates) { + housing.setErrorCondition(!hasFlowersCached, EnumErrorCode.NOFLOWER); + } else { + if (hasFlowersCached) { + housing.setErrorState(EnumErrorCode.OK); + } else { + housing.setErrorState(EnumErrorCode.NOFLOWER); + } + } + + return hasFlowersCached; } private void queenWorkTick() { @@ -154,22 +189,6 @@ public class BeekeepingLogic implements IBeekeepingLogic { if (queenWorkCycleThrottle >= PluginApiculture.ticksPerBeeWorkCycle) { queenWorkCycleThrottle = 0; - boolean hasFlower = queen.hasFlower(housing); - - if (housingSupportsMultipleErrorStates) { - housing.setErrorCondition(!hasFlower, EnumErrorCode.NOFLOWER); - } else { - if (hasFlower) { - housing.setErrorState(EnumErrorCode.OK); - } else { - housing.setErrorState(EnumErrorCode.NOFLOWER); - } - } - - if (!hasFlower) { - return; - } - doProduction(); queen.plantFlowerRandom(housing); doPollination(); @@ -270,11 +289,9 @@ public class BeekeepingLogic implements IBeekeepingLogic { return hasQueen; } - - private boolean tryBreedingPrincess() { - boolean isBreedingPrincess = false; - // Princess available? Try to breed! + private boolean hasBreedablePrincess() { + boolean isBreedingPrincess = false; if (ForestryItem.beePrincessGE.isItemEqual(housing.getQueen())) { boolean hasDrone = ForestryItem.beeDroneGE.isItemEqual(housing.getDrone()); if (housingSupportsMultipleErrorStates) { @@ -286,7 +303,6 @@ public class BeekeepingLogic implements IBeekeepingLogic { housing.setErrorState(EnumErrorCode.NODRONE); } } - tickBreed(); isBreedingPrincess = true; } diff --git a/src/main/java/forestry/apiculture/gadgets/TileAlvearyPlain.java b/src/main/java/forestry/apiculture/gadgets/TileAlvearyPlain.java index 485f8c692..353092501 100755 --- a/src/main/java/forestry/apiculture/gadgets/TileAlvearyPlain.java +++ b/src/main/java/forestry/apiculture/gadgets/TileAlvearyPlain.java @@ -136,7 +136,8 @@ public class TileAlvearyPlain extends TileAlveary implements ISidedInventory, IB return; } - beekeepingLogic.update(); + if (beekeepingLogic.canWork()) + beekeepingLogic.doWork(); // Equalize humidity and temperature equalizeTemperature(); diff --git a/src/main/java/forestry/apiculture/gadgets/TileBeehouse.java b/src/main/java/forestry/apiculture/gadgets/TileBeehouse.java index ba1f95fd1..4d4adcda7 100755 --- a/src/main/java/forestry/apiculture/gadgets/TileBeehouse.java +++ b/src/main/java/forestry/apiculture/gadgets/TileBeehouse.java @@ -169,7 +169,8 @@ public class TileBeehouse extends TileBase implements IBeeHousing, IClimatised { @Override public void updateServerSide() { - logic.update(); + if (logic.canWork()) + logic.doWork(); IBee queen = logic.getQueen(); if (queen == null) {