diff --git a/api-changelog.md b/api-changelog.md index bd472188..7ad08ee7 100644 --- a/api-changelog.md +++ b/api-changelog.md @@ -1,3 +1,6 @@ +### 2.3.0 + * Deprecated IForestryMultiErrorSource - Use IErrorLogicSource from forestry API instead + ### 2.2.0 * Added IConfigLoader - allows other mods to submit configs to be loaded Gendustry @@ -11,4 +14,3 @@ * Added **registries.IMutatronOverrides** and **EnumMutationSetting** - allows overriding what mutations are available Older changes were not recorded, you can see the commits [here](https://github.com/bdew/gendustry/commits/mc1710/src/net/bdew/gendustry/api). - diff --git a/build.properties b/build.properties index 179e0e1c..cda9b3fd 100644 --- a/build.properties +++ b/build.properties @@ -1,5 +1,5 @@ -gendustry.version=1.6.1 -gendustry.api.version=2.2.0 +gendustry.version=1.6.2 +gendustry.api.version=2.3.0 curseforge.id=70492 bdlib.version=1.9.2.104 @@ -13,7 +13,7 @@ ccc.version=1.0.4.35 buildcraft.version=7.0.17 ic2.version=2.2.757-experimental -forestry.version=3.6.3.20 +forestry.version=4.0.8.36 waila.version=1.5.10 cofhlib.cf=2246/918 diff --git a/resources/assets/gendustry/lang/en_US.lang b/resources/assets/gendustry/lang/en_US.lang index 9dc16870..e2cbc341 100644 --- a/resources/assets/gendustry/lang/en_US.lang +++ b/resources/assets/gendustry/lang/en_US.lang @@ -276,6 +276,8 @@ itemGroup.bdew.templates=Genetic Templates itemGroup.bdew.samples=Genetic Samples itemGroup.bdew.hives=Custom Beehives +gendustry.errorstate.ok=No error + for.gendustry.errorstate.disabled.description=Disabled for.gendustry.errorstate.disabled.help=The machine is disabled by it's configuration diff --git a/resources/assets/gendustry/textures/items/error/ok.png b/resources/assets/gendustry/textures/items/error/ok.png new file mode 100644 index 00000000..1d651dd6 Binary files /dev/null and b/resources/assets/gendustry/textures/items/error/ok.png differ diff --git a/src/net/bdew/gendustry/Gendustry.scala b/src/net/bdew/gendustry/Gendustry.scala index 55d998bd..0e7a0d77 100644 --- a/src/net/bdew/gendustry/Gendustry.scala +++ b/src/net/bdew/gendustry/Gendustry.scala @@ -35,7 +35,7 @@ import net.minecraft.command.CommandHandler import net.minecraftforge.oredict.RecipeSorter import org.apache.logging.log4j.Logger -@Mod(modid = Gendustry.modId, version = "GENDUSTRY_VER", name = "Gendustry", dependencies = "required-after:Forestry@[3.6.0.0,);after:BuildCraft|energy;after:BuildCraft|Silicon;after:IC2;after:CoFHCore;after:BinnieCore;after:ExtraBees;after:ExtraTrees;after:MineFactoryReloaded;after:MagicBees;required-after:bdlib@[BDLIB_VER,)", modLanguage = "scala") +@Mod(modid = Gendustry.modId, version = "GENDUSTRY_VER", name = "Gendustry", dependencies = "required-after:Forestry@[4.0.0.0,);after:BuildCraft|energy;after:BuildCraft|Silicon;after:IC2;after:CoFHCore;after:BinnieCore;after:ExtraBees;after:ExtraTrees;after:MineFactoryReloaded;after:MagicBees;required-after:bdlib@[BDLIB_VER,)", modLanguage = "scala") object Gendustry { var log: Logger = null var instance = this diff --git a/src/net/bdew/gendustry/api/blocks/IForestryMultiErrorSource.java b/src/net/bdew/gendustry/api/blocks/IForestryMultiErrorSource.java index 3fc7ea94..160a8329 100644 --- a/src/net/bdew/gendustry/api/blocks/IForestryMultiErrorSource.java +++ b/src/net/bdew/gendustry/api/blocks/IForestryMultiErrorSource.java @@ -13,6 +13,10 @@ import java.util.Set; +/** + * @deprecated use IErrorLogicSource from forestry API instead + */ +@Deprecated public interface IForestryMultiErrorSource { Set getErrorStates(); } diff --git a/src/net/bdew/gendustry/compat/FakeMutatronBeeHousing.scala b/src/net/bdew/gendustry/compat/FakeMutatronBeeHousing.scala index 729d3402..3d12f130 100644 --- a/src/net/bdew/gendustry/compat/FakeMutatronBeeHousing.scala +++ b/src/net/bdew/gendustry/compat/FakeMutatronBeeHousing.scala @@ -9,38 +9,46 @@ package net.bdew.gendustry.compat -import java.util +import java.io.{DataInputStream, DataOutputStream} +import java.lang.Iterable +import java.util.Collections +import com.google.common.collect.ImmutableSet import com.mojang.authlib.GameProfile -import forestry.api.apiculture.{IBee, IBeeGenome, IBeeHousing} -import forestry.api.core.{EnumHumidity, EnumTemperature, ErrorStateRegistry, IErrorState} -import forestry.api.genetics.IIndividual +import forestry.api.apiculture._ +import forestry.api.core._ +import forestry.api.genetics.{AlleleManager, IIndividual} import net.bdew.gendustry.api.blocks.IMutatron import net.minecraft.item.ItemStack import net.minecraft.tileentity.TileEntity +import net.minecraft.util.ChunkCoordinates import net.minecraft.world.World -class FakeMutatronBeeHousing(tile: TileEntity with IMutatron) extends IBeeHousing { +class FakeMutatronBeeHousing(tile: TileEntity with IMutatron) extends IBeeHousing with IBeeModifier with IBeeListener with IBeeHousingInventory with IErrorLogic { + val beeRoot = AlleleManager.alleleRegistry.getSpeciesRoot("rootBees").asInstanceOf[IBeeRoot] + override def getWorld: World = tile.getWorldObj - override def getXCoord: Int = tile.xCoord - override def getYCoord: Int = tile.yCoord - override def getZCoord: Int = tile.zCoord + override def getCoordinates: ChunkCoordinates = new ChunkCoordinates(tile.xCoord, tile.yCoord, tile.zCoord) + + override def getBlockLightValue: Int = getWorld.getBlockLightValue(tile.xCoord, tile.yCoord, tile.zCoord) + override def canBlockSeeTheSky: Boolean = getWorld.canBlockSeeTheSky(tile.xCoord, tile.yCoord, tile.zCoord) - override def getOwnerName: GameProfile = tile.getOwner + override def getBeeListeners: Iterable[IBeeListener] = Collections.singletonList(this) + override def getBeeInventory: IBeeHousingInventory = this + override def getBeeModifiers: Iterable[IBeeModifier] = Collections.singletonList(this) + override def getBeekeepingLogic: IBeekeepingLogic = beeRoot.createBeekeepingLogic(this) + override def getErrorLogic: IErrorLogic = this + + override def getOwner: GameProfile = tile.getOwner override def getDrone: ItemStack = tile.getParent1 override def getQueen: ItemStack = tile.getParent2 - override def setQueen(itemStack: ItemStack): Unit = throw new UnsupportedOperationException("Not supported in mutatron") override def setDrone(itemStack: ItemStack): Unit = throw new UnsupportedOperationException("Not supported in mutatron") - override def canBreed: Boolean = true - override def onQueenDeath(iBee: IBee): Unit = {} + override def onQueenDeath(): Unit = {} override def wearOutEquipment(i: Int): Unit = {} - override def onPostQueenDeath(iBee: IBee): Unit = {} - override def onQueenChange(itemStack: ItemStack): Unit = {} - override def onEggLaid(iBee: IBee): Boolean = false - override def onPollenRetrieved(iBee: IBee, iIndividual: IIndividual, b: Boolean): Boolean = false + override def onPollenRetrieved(iIndividual: IIndividual): Boolean = false override def addProduct(product: ItemStack, all: Boolean): Boolean = false override def isSunlightSimulated: Boolean = false @@ -54,10 +62,13 @@ class FakeMutatronBeeHousing(tile: TileEntity with IMutatron) extends IBeeHousin override def getFloweringModifier(iBeeGenome: IBeeGenome, v: Float): Float = v override def getTerritoryModifier(iBeeGenome: IBeeGenome, v: Float): Float = v - override def setErrorCondition(b: Boolean, iErrorState: IErrorState): Boolean = false - override def getErrorStates: util.Set[IErrorState] = new util.HashSet - override def setErrorState(state: IErrorState): Unit = {} - override def getErrorState: IErrorState = ErrorStateRegistry.getErrorState("Forestry:ok") + override def setCondition(condition: Boolean, errorState: IErrorState): Boolean = false + override def hasErrors: Boolean = false + override def writeData(data: DataOutputStream): Unit = {} + override def readData(data: DataInputStream): Unit = {} + override def contains(state: IErrorState): Boolean = false + override def clearErrors(): Unit = {} + override def getErrorStates: ImmutableSet[IErrorState] = ImmutableSet.of() override def getBiome = tile.getWorldObj.getBiomeGenForCoordsBody(tile.xCoord, tile.zCoord) override def getHumidity: EnumHumidity = EnumHumidity.getFromValue(getBiome.rainfall) diff --git a/src/net/bdew/gendustry/compat/triggers/BaseTrigger.scala b/src/net/bdew/gendustry/compat/triggers/BaseTrigger.scala index 593f0a55..aaa9601a 100644 --- a/src/net/bdew/gendustry/compat/triggers/BaseTrigger.scala +++ b/src/net/bdew/gendustry/compat/triggers/BaseTrigger.scala @@ -10,6 +10,7 @@ package net.bdew.gendustry.compat.triggers import buildcraft.api.statements.{IStatementContainer, IStatementParameter, ITriggerExternal} +import cpw.mods.fml.relauncher.{Side, SideOnly} import net.bdew.gendustry.Gendustry import net.bdew.lib.Misc import net.minecraft.client.renderer.texture.IIconRegister @@ -20,9 +21,14 @@ import net.minecraftforge.common.util.ForgeDirection abstract class BaseTrigger[T](val id: String, ordering: String, tileClass: Class[T]) extends ITriggerExternal { var icon: IIcon = null override def getUniqueTag = "gendustry." + ordering + "." + id + + @SideOnly(Side.CLIENT) override def getIcon = icon + + @SideOnly(Side.CLIENT) override def registerIcons(ir: IIconRegister) = icon = ir.registerIcon(Misc.iconName(Gendustry.modId, "trigger", id)) + override def getDescription = Misc.toLocal("gendustry.trigger." + id) override def rotateLeft() = this diff --git a/src/net/bdew/gendustry/compat/triggers/ForestryErrorTriggers.scala b/src/net/bdew/gendustry/compat/triggers/ForestryErrorTriggers.scala index f92a6e73..9efe0426 100644 --- a/src/net/bdew/gendustry/compat/triggers/ForestryErrorTriggers.scala +++ b/src/net/bdew/gendustry/compat/triggers/ForestryErrorTriggers.scala @@ -10,51 +10,44 @@ package net.bdew.gendustry.compat.triggers import buildcraft.api.statements.StatementManager -import forestry.api.core.{ErrorStateRegistry, IErrorState} +import cpw.mods.fml.relauncher.{Side, SideOnly} +import forestry.api.core.{ForestryAPI, IErrorLogicSource, IErrorState} import net.bdew.gendustry.Gendustry -import net.bdew.gendustry.api.blocks.IForestryMultiErrorSource import net.bdew.lib.Misc import net.minecraft.client.renderer.texture.IIconRegister import net.minecraftforge.common.util.ForgeDirection -case class ForestryErrorTrigger(state: IErrorState) extends BaseTrigger("forestry.error." + state.getID, "y%03d".format(state.getID), classOf[IForestryMultiErrorSource]) { +case class ForestryErrorTrigger(state: IErrorState) extends BaseTrigger("forestry.error." + state.getID, "y%03d".format(state.getID), classOf[IErrorLogicSource]) { override def getIcon = state.getIcon override def getDescription = Misc.toLocal("for." + state.getDescription) override def registerIcons(ir: IIconRegister) {} - override def getState(side: ForgeDirection, tile: IForestryMultiErrorSource) = - if (state.getUniqueName == "Forestry:ok") - tile.getErrorStates.isEmpty - else - tile.getErrorStates.contains(state) + override def getState(side: ForgeDirection, tile: IErrorLogicSource) = + tile.getErrorLogic.contains(state) +} + +object ForestryNoErrorTrigger extends BaseTrigger("forestry.noerror", "_", classOf[IErrorLogicSource]) { + override def getDescription = Misc.toLocal("gendustry.errorstate.ok") + + @SideOnly(Side.CLIENT) + override def registerIcons(ir: IIconRegister): Unit = { + icon = ir.registerIcon("gendustry:error/ok") + } + + override def getState(side: ForgeDirection, tile: IErrorLogicSource) = + !tile.getErrorLogic.hasErrors } object ForestryErrorTriggers { - val apiaryTriggerStates = List( - "Forestry:ok", - "Forestry:invalidBiome", - "Forestry:isRaining", - "Forestry:notGloomy", - "Forestry:notLucid", - "Forestry:notDay", - "Forestry:notNight", - "Forestry:noFlower", - "Forestry:noQueen", - "Forestry:noDrone", - "Forestry:noSky", - "Forestry:noSpace", - "Forestry:noPower", - "Forestry:noRedstone", - "Forestry:disabledRedstone" - ) map ErrorStateRegistry.getErrorState - - val validTriggerStates = apiaryTriggerStates.toSet - val validTriggers = validTriggerStates.map(x => x -> ForestryErrorTrigger(x)).toMap - - val apiaryTriggers = apiaryTriggerStates.map(validTriggers) + import scala.collection.JavaConversions._ + + val errorStateRegistry = ForestryAPI.errorStateRegistry + + val triggers = errorStateRegistry.getErrorStates.map(ForestryErrorTrigger) ++ List(ForestryNoErrorTrigger) def register() { - validTriggers.values.foreach(StatementManager.registerStatement) - Gendustry.logInfo("Created %d BC triggers for Forestry error codes", validTriggers.size) + triggers.foreach(StatementManager.registerStatement) + StatementManager.registerStatement(ForestryNoErrorTrigger) + Gendustry.logInfo("Created %d BC triggers for Forestry error codes", triggers.size) } } diff --git a/src/net/bdew/gendustry/compat/triggers/TriggerProvider.scala b/src/net/bdew/gendustry/compat/triggers/TriggerProvider.scala index 9883d88b..218f15dd 100644 --- a/src/net/bdew/gendustry/compat/triggers/TriggerProvider.scala +++ b/src/net/bdew/gendustry/compat/triggers/TriggerProvider.scala @@ -12,7 +12,7 @@ package net.bdew.gendustry.compat.triggers import java.util import buildcraft.api.statements._ -import net.bdew.gendustry.machines.apiary.TileApiary +import forestry.api.core.IErrorLogicSource import net.bdew.gendustry.power.TilePowered import net.bdew.lib.power.TileBaseProcessor import net.minecraft.tileentity.TileEntity @@ -25,8 +25,8 @@ object TriggerProvider extends ITriggerProvider { import scala.collection.JavaConversions._ val triggers = new util.LinkedList[ITriggerExternal]() - if (tile.isInstanceOf[TileApiary]) - triggers.addAll(ForestryErrorTriggers.apiaryTriggers) + if (tile.isInstanceOf[IErrorLogicSource]) + triggers.addAll(ForestryErrorTriggers.triggers) if (tile.isInstanceOf[TilePowered]) triggers.addAll(PowerTriggers.triggers) diff --git a/src/net/bdew/gendustry/custom/BeeMutation.scala b/src/net/bdew/gendustry/custom/BeeMutation.scala index 6d7b61c6..57f16513 100644 --- a/src/net/bdew/gendustry/custom/BeeMutation.scala +++ b/src/net/bdew/gendustry/custom/BeeMutation.scala @@ -11,7 +11,8 @@ package net.bdew.gendustry.custom import forestry.api.apiculture._ import forestry.api.core.{EnumHumidity, EnumTemperature} -import forestry.api.genetics.{AlleleManager, IAllele, IGenome} +import forestry.api.genetics.{AlleleManager, IAllele} +import net.bdew.gendustry.forestry.BeeModifiers import net.bdew.lib.Misc import net.minecraft.block.Block import net.minecraft.item.ItemStack @@ -29,25 +30,23 @@ class BeeMutation(parent1: IAlleleBeeSpecies, parent2: IAlleleBeeSpecies, result // === IBeeMutation === - def getBlockUnderHousing(h: IBeeHousing) = - if (h.getYCoord > 0) - h.getWorld.getBlock(h.getXCoord, h.getYCoord - 1, h.getZCoord) + def getBlockUnderHousing(h: IBeeHousing) = { + val c = h.getCoordinates + if (c.posY > 0) + h.getWorld.getBlock(c.posX, c.posY - 1, c.posZ) else null + } - def getBlockMetaUnderHousing(h: IBeeHousing) = - if (h.getYCoord > 0) - h.getWorld.getBlockMetadata(h.getXCoord, h.getYCoord - 1, h.getZCoord) + def getBlockMetaUnderHousing(h: IBeeHousing) = { + val c = h.getCoordinates + if (c.posY > 0) + h.getWorld.getBlockMetadata(c.posX, c.posY - 1, c.posZ) else -1 + } def testReq[T](req: Option[T], v: T) = req.isEmpty || req.get == v - override def getChance(housing: IBeeHousing, allele0: IAllele, allele1: IAllele, genome0: IGenome, genome1: IGenome) = - getChanceImpl(housing, allele0.asInstanceOf[IAlleleBeeSpecies], allele1.asInstanceOf[IAlleleBeeSpecies], genome0.asInstanceOf[IBeeGenome], genome1.asInstanceOf[IBeeGenome]) - override def getChance(housing: IBeeHousing, allele0: IAlleleBeeSpecies, allele1: IAlleleBeeSpecies, genome0: IBeeGenome, genome1: IBeeGenome) = - getChanceImpl(housing, allele0, allele1, genome0, genome1) - - def getChanceImpl(housing: IBeeHousing, allele0: IAlleleBeeSpecies, allele1: IAlleleBeeSpecies, genome0: IBeeGenome, genome1: IBeeGenome): Float = if (!((allele0 == parent1 && allele1 == parent2) || (allele0 == parent2 && allele1 == parent1))) 0 else if (!testReq(reqTemperature, housing.getTemperature)) 0 else if (!testReq(reqHumidity, housing.getHumidity)) 0 @@ -57,8 +56,8 @@ class BeeMutation(parent1: IAlleleBeeSpecies, parent2: IAlleleBeeSpecies, result else { val bkm = getRoot.getBeekeepingMode(housing.getWorld) var processedChance = chance - processedChance *= housing.getMutationModifier(genome0, genome1, processedChance) - processedChance *= bkm.getMutationModifier(genome0, genome1, processedChance) + processedChance *= BeeModifiers.from(housing).getMutationModifier(genome0, genome1, processedChance) + processedChance *= bkm.getBeeModifier.getMutationModifier(genome0, genome1, processedChance) processedChance } diff --git a/src/net/bdew/gendustry/custom/BeeSpecies.scala b/src/net/bdew/gendustry/custom/BeeSpecies.scala index fa4d16b6..1534c9b9 100644 --- a/src/net/bdew/gendustry/custom/BeeSpecies.scala +++ b/src/net/bdew/gendustry/custom/BeeSpecies.scala @@ -15,7 +15,7 @@ import com.mojang.authlib.GameProfile import cpw.mods.fml.relauncher.{Side, SideOnly} import forestry.api.apiculture._ import forestry.api.core.{EnumHumidity, EnumTemperature} -import forestry.api.genetics.{AlleleManager, IAllele, IIndividual} +import forestry.api.genetics.{AlleleManager, IAlleleSpecies, IIndividual} import net.bdew.gendustry.Gendustry import net.bdew.gendustry.config.loader.TuningLoader import net.bdew.gendustry.forestry.ForestryItems @@ -85,11 +85,7 @@ class BeeSpecies(cfg: ConfigSection, ident: String) extends IAlleleBeeSpecies { val specialty = prepareLootList("Specialty") specialty.foreach(x => Gendustry.logDebug(" [%.1f%%] %s", x._2, x._1)) - // Old product/specialty maps - will be removed at some point. Manual boxing because java maps can't hold primitive values. - override val getProducts = products.map(x => x._1 -> Int.box((x._2 * 100).round)).asJava - override val getSpecialty = specialty.map(x => x._1 -> Int.box((x._2 * 100).round)).asJava - - // New maps with floats. Ditto about boxing. + // Manual boxing because java maps can't hold primitive values. override def getProductChances = products.map(x => x._1 -> Float.box(x._2)).asJava override def getSpecialtyChances = specialty.map(x => x._1 -> Float.box(x._2)).asJava @@ -98,9 +94,9 @@ class BeeSpecies(cfg: ConfigSection, ident: String) extends IAlleleBeeSpecies { // ==== RESEARCH SYSTEM - override lazy val getComplexity: Int = 1 + getMutationPathLength(this, mutable.Set.empty[IAllele]) + override lazy val getComplexity: Int = 1 + getMutationPathLength(this, mutable.Set.empty) - private def getMutationPathLength(species: IAllele, excludeSpecies: mutable.Set[IAllele]): Int = { + private def getMutationPathLength(species: IAlleleSpecies, excludeSpecies: mutable.Set[IAlleleSpecies]): Int = { var highest = 0 excludeSpecies += species import scala.collection.JavaConversions._ diff --git a/src/net/bdew/gendustry/forestry/BeeModifiers.scala b/src/net/bdew/gendustry/forestry/BeeModifiers.scala new file mode 100644 index 00000000..8543510f --- /dev/null +++ b/src/net/bdew/gendustry/forestry/BeeModifiers.scala @@ -0,0 +1,48 @@ +/* + * Copyright (c) bdew, 2013 - 2015 + * https://github.com/bdew/gendustry + * + * This mod is distributed under the terms of the Minecraft Mod Public + * License 1.0, or MMPL. Please check the contents of the license located in + * http://bdew.net/minecraft-mod-public-license/ + */ + +package net.bdew.gendustry.forestry + +import forestry.api.apiculture.{IBeeGenome, IBeeHousing, IBeeModifier} + +import scala.collection.JavaConversions._ + +/** + * Combines multiple IBeeModifier together + * Conceptually based on BeeHousingModifier from Forestry + * @param modifiers collection of modifiers + */ +case class BeeModifiers(modifiers: Traversable[IBeeModifier]) extends IBeeModifier { + override def getTerritoryModifier(genome: IBeeGenome, currentModifier: Float): Float = + modifiers.foldLeft(1F)((v, m) => m.getTerritoryModifier(genome, v * currentModifier)) + + override def getMutationModifier(genome: IBeeGenome, mate: IBeeGenome, currentModifier: Float): Float = + modifiers.foldLeft(1F)((v, m) => m.getMutationModifier(genome, mate, v * currentModifier)) + + override def getLifespanModifier(genome: IBeeGenome, mate: IBeeGenome, currentModifier: Float): Float = + modifiers.foldLeft(1F)((v, m) => m.getLifespanModifier(genome, mate, v * currentModifier)) + + override def getProductionModifier(genome: IBeeGenome, currentModifier: Float): Float = + modifiers.foldLeft(1F)((v, m) => m.getProductionModifier(genome, v * currentModifier)) + + override def getFloweringModifier(genome: IBeeGenome, currentModifier: Float): Float = + modifiers.foldLeft(1F)((v, m) => m.getFloweringModifier(genome, v * currentModifier)) + + override def getGeneticDecay(genome: IBeeGenome, currentModifier: Float): Float = + modifiers.foldLeft(1F)((v, m) => m.getGeneticDecay(genome, v * currentModifier)) + + override def isSealed: Boolean = modifiers.exists(_.isSealed) + override def isSelfLighted: Boolean = modifiers.exists(_.isSelfLighted) + override def isSunlightSimulated: Boolean = modifiers.exists(_.isSunlightSimulated) + override def isHellish: Boolean = modifiers.exists(_.isHellish) +} + +object BeeModifiers { + def from(beeHousing: IBeeHousing) = BeeModifiers(beeHousing.getBeeModifiers) +} \ No newline at end of file diff --git a/src/net/bdew/gendustry/forestry/GeneticsHelper.scala b/src/net/bdew/gendustry/forestry/GeneticsHelper.scala index ec0d642e..985c6912 100644 --- a/src/net/bdew/gendustry/forestry/GeneticsHelper.scala +++ b/src/net/bdew/gendustry/forestry/GeneticsHelper.scala @@ -80,7 +80,8 @@ object GeneticsHelper { case (EnumMutationSetting.DISABLED, _) => false case (EnumMutationSetting.REQUIREMENTS, beeMutation: IBeeMutation) => //Have to use the deprecated version because of not-updated other mods - beeMutation.getChance(beeHousing, fromSpecies, toSpecies, fromIndividual.getGenome, toIndividual.getGenome) > 0 + beeMutation.getChance(beeHousing, fromSpecies.asInstanceOf[IAlleleBeeSpecies], toSpecies.asInstanceOf[IAlleleBeeSpecies], + fromIndividual.getGenome.asInstanceOf[IBeeGenome], toIndividual.getGenome.asInstanceOf[IBeeGenome]) > 0 case _ => true } } diff --git a/src/net/bdew/gendustry/gui/Textures.scala b/src/net/bdew/gendustry/gui/Textures.scala index 839cfc3a..f7de300e 100644 --- a/src/net/bdew/gendustry/gui/Textures.scala +++ b/src/net/bdew/gendustry/gui/Textures.scala @@ -24,6 +24,7 @@ object Textures { object errors { val noPower = Texture(texture, 32, 0, 16, 16) val disabled = Texture(texture, 48, 0, 16, 16) + val ok = Texture(texture, 65, 35, 14, 14) } object button16 { diff --git a/src/net/bdew/gendustry/items/covers/ErrorSensorCover.scala b/src/net/bdew/gendustry/items/covers/ErrorSensorCover.scala index 1450f518..a3fd2891 100644 --- a/src/net/bdew/gendustry/items/covers/ErrorSensorCover.scala +++ b/src/net/bdew/gendustry/items/covers/ErrorSensorCover.scala @@ -10,9 +10,8 @@ package net.bdew.gendustry.items.covers import cpw.mods.fml.relauncher.{Side, SideOnly} -import forestry.api.core.{ErrorStateRegistry, IErrorState} +import forestry.api.core.{ForestryAPI, IErrorLogicSource, IErrorState} import net.bdew.gendustry.Gendustry -import net.bdew.gendustry.api.blocks.IForestryMultiErrorSource import net.bdew.lib.Misc import net.bdew.lib.covers.{ItemCover, TileCoverable} import net.bdew.lib.helpers.ChatHelper._ @@ -27,28 +26,30 @@ import net.minecraftforge.common.util.ForgeDirection trait ErrorSensor { def id: String def getUnLocalizedName: String - def isActive(te: IForestryMultiErrorSource): Boolean + def isActive(te: IErrorLogicSource): Boolean } object ErrorSensorNoError extends ErrorSensor { override def id: String = "noError" - override def isActive(te: IForestryMultiErrorSource): Boolean = te.getErrorStates.isEmpty + override def isActive(te: IErrorLogicSource): Boolean = !te.getErrorLogic.hasErrors override def getUnLocalizedName: String = "gendustry.cover.error.none" } object ErrorSensorAnyError extends ErrorSensor { override def id: String = "anyError" - override def isActive(te: IForestryMultiErrorSource): Boolean = !te.getErrorStates.isEmpty + override def isActive(te: IErrorLogicSource): Boolean = te.getErrorLogic.hasErrors override def getUnLocalizedName: String = "gendustry.cover.error.any" } case class ErrorSensorForestry(state: IErrorState) extends ErrorSensor { override def id: String = state.getUniqueName - override def isActive(te: IForestryMultiErrorSource): Boolean = te.getErrorStates.contains(state) + override def isActive(te: IErrorLogicSource): Boolean = te.getErrorLogic.contains(state) override def getUnLocalizedName: String = "for." + state.getDescription } object ErrorSensors { + val errorStateRegistry = ForestryAPI.errorStateRegistry + val sensors = List(ErrorSensorAnyError, ErrorSensorNoError) ++ (List( "Forestry:invalidBiome", "Forestry:isRaining", @@ -62,7 +63,7 @@ object ErrorSensors { "Forestry:noSky", "Forestry:noSpace", "Forestry:noPower" - ) map (name => ErrorSensorForestry(ErrorStateRegistry.getErrorState(name)))) + ) map (name => ErrorSensorForestry(errorStateRegistry.getErrorState(name)))) val idMap = sensors.map(x => x.id -> x).toMap } @@ -75,7 +76,7 @@ object ErrorSensorCover extends SimpleItem("ErrorSensorCover") with ItemCover { override def getSpriteNumber = 0 - override def isValidTile(te: TileCoverable, stack: ItemStack) = te.isInstanceOf[IForestryMultiErrorSource] + override def isValidTile(te: TileCoverable, stack: ItemStack) = te.isInstanceOf[IErrorLogicSource] def getErrorSensor(stack: ItemStack): Option[ErrorSensor] = { if (stack.hasTagCompound) { @@ -98,7 +99,7 @@ object ErrorSensorCover extends SimpleItem("ErrorSensorCover") with ItemCover { override def isEmittingSignal(te: TileCoverable, side: ForgeDirection, cover: ItemStack): Boolean = { for { - tile <- Misc.asInstanceOpt(te, classOf[IForestryMultiErrorSource]) + tile <- Misc.asInstanceOpt(te, classOf[IErrorLogicSource]) sensor <- getErrorSensor(cover) } { if (sensor.isActive(tile)) return true diff --git a/src/net/bdew/gendustry/machines/apiary/ContainerApiary.scala b/src/net/bdew/gendustry/machines/apiary/ContainerApiary.scala index 3604a571..7838fa78 100644 --- a/src/net/bdew/gendustry/machines/apiary/ContainerApiary.scala +++ b/src/net/bdew/gendustry/machines/apiary/ContainerApiary.scala @@ -26,7 +26,7 @@ class ContainerApiary(val te: TileApiary, player: EntityPlayer) extends BaseCont addSlotToContainer(new SlotValidating(te, 1, 39, 52)) if (!te.getWorld.isRemote && (te.owner :== null)) { - Gendustry.logInfo("Owner information missing on apiary at (%d,%d,%d), assigning: %s".format(te.getXCoord, te.getYCoord, te.getZCoord, player.getGameProfile)) + Gendustry.logInfo("Owner information missing on apiary at (%d,%d,%d), assigning: %s".format(te.xCoord, te.yCoord, te.zCoord, player.getGameProfile)) te.owner := player.getGameProfile } diff --git a/src/net/bdew/gendustry/machines/apiary/ErrorStates.scala b/src/net/bdew/gendustry/machines/apiary/ErrorStates.scala index c4ca2f38..eb4dabc9 100644 --- a/src/net/bdew/gendustry/machines/apiary/ErrorStates.scala +++ b/src/net/bdew/gendustry/machines/apiary/ErrorStates.scala @@ -10,7 +10,7 @@ package net.bdew.gendustry.machines.apiary import cpw.mods.fml.relauncher.{Side, SideOnly} -import forestry.api.core.{ErrorStateRegistry, IErrorState} +import forestry.api.core.{ForestryAPI, IErrorState} import net.bdew.gendustry.Gendustry import net.bdew.lib.Misc import net.minecraft.client.renderer.texture.IIconRegister @@ -35,13 +35,13 @@ case class GendustryErrorState(name: String, id: Short) extends IErrorState { object GendustryErrorStates { val Disabled = GendustryErrorState("disabled", 500) def init() { - ErrorStateRegistry.registerErrorState(GendustryErrorStates.Disabled) + ForestryAPI.errorStateRegistry.registerErrorState(GendustryErrorStates.Disabled) } } object ForestryErrorStates { - val ok = ErrorStateRegistry.getErrorState("Forestry:ok") - val noPower = ErrorStateRegistry.getErrorState("Forestry:noPower") - val noRedstone = ErrorStateRegistry.getErrorState("Forestry:noRedstone") - val disabledRedstone = ErrorStateRegistry.getErrorState("Forestry:disabledRedstone") + val errorStates = ForestryAPI.errorStateRegistry + val noPower = errorStates.getErrorState("Forestry:noPower") + val noRedstone = errorStates.getErrorState("Forestry:noRedstone") + val disabledRedstone = errorStates.getErrorState("Forestry:disabledRedstone") } \ No newline at end of file diff --git a/src/net/bdew/gendustry/machines/apiary/GuiApiary.scala b/src/net/bdew/gendustry/machines/apiary/GuiApiary.scala index 52b3e515..0c4d50a7 100644 --- a/src/net/bdew/gendustry/machines/apiary/GuiApiary.scala +++ b/src/net/bdew/gendustry/machines/apiary/GuiApiary.scala @@ -23,7 +23,7 @@ class GuiApiary(val te: TileApiary, player: EntityPlayer, cont: ContainerApiary) super.initGui() widgets.add(new WidgetError(155, 5, te)) widgets.add(new WidgetPowerCustom(new Rect(8, 19, 16, 58), Textures.powerFill, te.power)) - widgets.add(new WidgetApiaryProgress(new Rect(69, 22, 36, 15), te.guiBreeding, te.guiProgress)) + widgets.add(new WidgetApiaryProgress(new Rect(69, 22, 36, 15), te.guiProgress)) widgets.add(new WidgetLabel(Misc.toLocal("tile.gendustry.apiary.name"), 8, 6, Color.darkGray)) widgets.add(new WidgetRSModeButton(Point(137, 5), te, cont)) diff --git a/src/net/bdew/gendustry/machines/apiary/Sanity.scala b/src/net/bdew/gendustry/machines/apiary/Sanity.scala deleted file mode 100644 index 76f0edaf..00000000 --- a/src/net/bdew/gendustry/machines/apiary/Sanity.scala +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) bdew, 2013 - 2014 - * https://github.com/bdew/gendustry - * - * This mod is distributed under the terms of the Minecraft Mod Public - * License 1.0, or MMPL. Please check the contents of the license located in - * http://bdew.net/minecraft-mod-public-license/ - */ - -package net.bdew.gendustry.machines.apiary - -import _root_.forestry.api.apiculture.IBeeRoot -import forestry.api.genetics.{AlleleManager, IAllele} -import net.bdew.gendustry.Gendustry -import net.minecraft.util.{ChatComponentTranslation, EnumChatFormatting} - -object Sanity { - var checkDone = false - def check(house: TileApiary): Unit = { - if (checkDone) return - checkDone = true - import scala.collection.JavaConversions._ - try { - val bees = AlleleManager.alleleRegistry.getSpeciesRoot("rootBees").asInstanceOf[IBeeRoot] - val defGenome = bees.templateAsGenome(bees.getDefaultTemplate) - val defSpecies = defGenome.getPrimary - var found = false - for (mutation <- bees.getMutations(false)) { - //Have to use the deprecated version because of not-updated other mods - if (mutation.getChance(house, defSpecies.asInstanceOf[IAllele], defSpecies, defGenome, defGenome) > 0) { - found = true - Gendustry.logWarn("Detected probably bugged mutation! %s+%s (class: %s) doesn't check the species. Please report it to the mod author.", - mutation.getAllele0.getName, mutation.getAllele1.getName, mutation.getClass.getCanonicalName) - } - } - if (found) { - val player = house.getWorld.getClosestPlayer(house.xCoord, house.yCoord, house.zCoord, 20) - if (player != null) { - player.addChatMessage(new ChatComponentTranslation( - EnumChatFormatting.RED + "[Gendustry] WARNING! Possibly bugged mutations detected, check the log for details.")) - } - } - } catch { - case t: Throwable => Gendustry.logWarnException("Error in mutations sanity check", t) - } - } -} diff --git a/src/net/bdew/gendustry/machines/apiary/TileApiary.scala b/src/net/bdew/gendustry/machines/apiary/TileApiary.scala index 2d93929c..cac573af 100644 --- a/src/net/bdew/gendustry/machines/apiary/TileApiary.scala +++ b/src/net/bdew/gendustry/machines/apiary/TileApiary.scala @@ -10,8 +10,9 @@ package net.bdew.gendustry.machines.apiary import java.util -import java.util.Locale +import java.util.{Collections, Locale} +import com.mojang.authlib.GameProfile import forestry.api.apiculture._ import forestry.api.arboriculture.EnumGermlingType import forestry.api.core._ @@ -35,6 +36,7 @@ import net.bdew.lib.tile.TileExtended import net.bdew.lib.tile.inventory.{PersistentInventoryTile, SidedInventory} import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound +import net.minecraft.util.ChunkCoordinates import net.minecraft.world.biome.BiomeGenBase import net.minecraftforge.common.util.ForgeDirection @@ -46,7 +48,10 @@ with TileKeepData with TilePowered with TileRSControllable with TileCoverable -with IIndustrialApiary { +with IIndustrialApiary +with IBeeModifier +with IBeeListener +with IBeeHousingInventory { object slots { val queen = 0 @@ -66,7 +71,6 @@ with IIndustrialApiary { val errorConditions = DataSlotErrorStates("errors", this).setUpdate(UpdateKind.GUI, UpdateKind.SAVE, UpdateKind.WORLD) val owner = DataSlotGameProfile("owner", this).setUpdate(UpdateKind.SAVE) val guiProgress = DataSlotFloat("progress", this) - val guiBreeding = DataSlotFloat("breeding", this) val logic = beeRoot.createBeekeepingLogic(this) @@ -107,11 +111,13 @@ with IIndustrialApiary { } clientTick.listen(() => - if (beeRoot.isMated(queen) && errorConditions.isOk && Config.renderBeeEffects) { - beeRoot.getMember(queen).doFX(logic.getEffectData, this) + if (beeRoot.isMated(queen) && errorConditions.isOk && Config.renderBeeEffects && logic.canDoBeeFX) { + logic.doBeeFX() } ) + sendClientUpdate.listen(tag => logic.syncToClient()) + serverTick.listen(() => { movePrincess = false @@ -119,27 +125,27 @@ with IIndustrialApiary { errorConditions.withSuspendedUpdates { val canWork = logic.canWork val powered = getWorldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord) - setErrorCondition((rsmode :== RSMode.RS_OFF) && powered, ForestryErrorStates.disabledRedstone) - setErrorCondition((rsmode :== RSMode.RS_ON) && !powered, ForestryErrorStates.noRedstone) - setErrorCondition(rsmode :== RSMode.NEVER, GendustryErrorStates.Disabled) - setErrorCondition(power.stored < cfg.baseMjPerTick * mods.energy, ForestryErrorStates.noPower) + errorConditions.setCondition((rsmode :== RSMode.RS_OFF) && powered, ForestryErrorStates.disabledRedstone) + errorConditions.setCondition((rsmode :== RSMode.RS_ON) && !powered, ForestryErrorStates.noRedstone) + errorConditions.setCondition(rsmode :== RSMode.NEVER, GendustryErrorStates.Disabled) + errorConditions.setCondition(power.stored < cfg.baseMjPerTick * mods.energy, ForestryErrorStates.noPower) if (errorConditions.isOk && canWork) { logic.doWork() - if (errorConditions.isOk && (logic.getQueen != null || logic.getBreedingTime > 0)) { - power.extract(cfg.baseMjPerTick * mods.energy, false) - } + power.extract(cfg.baseMjPerTick * mods.energy, false) } } if (movePrincess && getStackInSlot(slots.queen) == null) doMovePrincess() - if (logic.getQueen != null) - guiProgress := 1 - (logic.getQueen.getHealth.toFloat / logic.getQueen.getMaxHealth) - else - guiProgress := -1 - - guiBreeding := logic.getBreedingTime.toFloat / logic.getTotalBreedingTime + if (getQueen == null) { + guiProgress := 0 + } else { + if (beeRoot.getType(getQueen) == EnumBeeType.PRINCESS) + guiProgress := logic.getBeeProgressPercent / 100F + else + guiProgress := 1 - (logic.getBeeProgressPercent / 100F) + } }) errorConditions.onChange.listen(() => { @@ -197,11 +203,15 @@ with IIndustrialApiary { // Misc def getBiome = worldObj.getBiomeGenForCoordsBody(xCoord, zCoord) override def getSizeInventory = 15 + def getModifiedBiome = if (mods.biomeOverride == null) getBiome else mods.biomeOverride + + // SidedInventory override def canInsertItem(slot: Int, stack: ItemStack, side: Int) = slots.bees.contains(slot) && isItemValidForSlot(slot, stack) override def canExtractItem(slot: Int, stack: ItemStack, side: Int) = slots.output.contains(slot) - //IIndustrialApiary + // IIndustrialApiary + override def getUpgrades = { import scala.collection.JavaConversions._ slots.upgrades map inv filterNot (_ == null) @@ -209,17 +219,23 @@ with IIndustrialApiary { override def getModifiers = mods + // IErrorLogicSource + override def getErrorLogic: IErrorLogic = errorConditions + + // IForestryMultiErrorSource + override def getErrorStates: util.Set[IErrorState] = { + import scala.collection.JavaConversions._ + errorConditions.value + } + // IBeeListener - override def onPostQueenDeath(queen: IBee) { + override def onQueenDeath() { if (mods.isAutomated) movePrincess = true } - override def onQueenDeath(queen: IBee) {} override def wearOutEquipment(amount: Int) {} - override def onQueenChange(stack: ItemStack) {} - override def onEggLaid(queen: IBee) = false - override def onPollenRetrieved(queen: IBee, pollen: IIndividual, isHandled: Boolean): Boolean = { - if (isHandled) return true + + override def onPollenRetrieved(pollen: IIndividual): Boolean = { if (!mods.isCollectingPollen) return false val spRoot = pollen.getGenome.getSpeciesRoot val stack = spRoot.getMemberStack(pollen, EnumGermlingType.POLLEN.ordinal()) @@ -239,49 +255,34 @@ with IIndustrialApiary { override def isSunlightSimulated = mods.isSunlightSimulated override def isHellish = getModifiedBiome == BiomeGenBase.hell - // IBeeHousing - override def setQueen(stack: ItemStack) = setInventorySlotContents(0, stack) - override def setDrone(stack: ItemStack) = setInventorySlotContents(1, stack) - override def getQueen = getStackInSlot(slots.queen) - override def getDrone = getStackInSlot(slots.drone) - override def canBreed = true - - def getModifiedBiome = if (mods.biomeOverride == null) getBiome else mods.biomeOverride - // IHousing - override def getWorld = worldObj + override def getCoordinates = new ChunkCoordinates(xCoord, yCoord, zCoord) - @deprecated("use getErrorStates instead", "forestry 3.6.x") - override def getErrorState = errorConditions.headOption.getOrElse(ForestryErrorStates.ok) - - @deprecated("use setErrorCondition instead", "forestry 3.6.x") - override def setErrorState(state: IErrorState) = - if (state == ForestryErrorStates.ok) - errorConditions.clearAll() - else - errorConditions.set(state) - - override def getErrorStates: util.Set[IErrorState] = { - import scala.collection.JavaConversions._ - errorConditions.value - } + // IBeeHousing + override def getBeeInventory: IBeeHousingInventory = this + override def getBeeListeners = Collections.singletonList(this) + override def getBeeModifiers = Collections.singletonList(this) + override def getBeekeepingLogic: IBeekeepingLogic = logic - override def setErrorCondition(condition: Boolean, errorState: IErrorState): Boolean = { - errorConditions.toggle(errorState, condition) - condition - } + override def getBlockLightValue: Int = worldObj.getBlockLightValue(xCoord, yCoord + 1, zCoord) + override def canBlockSeeTheSky: Boolean = worldObj.canBlockSeeTheSky(xCoord, yCoord + 1, zCoord) + override def getOwner: GameProfile = owner - override def getOwnerName = owner - override def getXCoord = xCoord - override def getYCoord = yCoord - override def getZCoord = zCoord override def getTemperature = if (BiomeHelper.isBiomeHellish(getModifiedBiome)) EnumTemperature.HELLISH else EnumTemperature.getFromValue(getModifiedBiome.temperature + mods.temperature) + override def getHumidity = EnumHumidity.getFromValue(getModifiedBiome.rainfall + mods.humidity) + + // IBeeHousingInventory + override def setQueen(stack: ItemStack) = setInventorySlotContents(0, stack) + override def setDrone(stack: ItemStack) = setInventorySlotContents(1, stack) + override def getQueen = getStackInSlot(slots.queen) + override def getDrone = getStackInSlot(slots.drone) + override def addProduct(product: ItemStack, all: Boolean): Boolean = { if (product == null || product.getItem == null) { Gendustry.logError("Industrial Apiary at %d,%d,%d received an invalid bee product, one of your bee-adding mods is borked.", xCoord, yCoord, zCoord) @@ -298,12 +299,6 @@ with IIndustrialApiary { return p == null } - override def validate() { - super.validate() - if (worldObj != null && !worldObj.isRemote) - Sanity.check(this) - } - override def isValidCover(side: ForgeDirection, cover: ItemStack) = true override def afterTileBreakSave(t: NBTTagCompound): NBTTagCompound = { diff --git a/src/net/bdew/gendustry/machines/apiary/WidgetApiaryProgress.scala b/src/net/bdew/gendustry/machines/apiary/WidgetApiaryProgress.scala index a7a37459..964bb1c5 100644 --- a/src/net/bdew/gendustry/machines/apiary/WidgetApiaryProgress.scala +++ b/src/net/bdew/gendustry/machines/apiary/WidgetApiaryProgress.scala @@ -9,30 +9,22 @@ package net.bdew.gendustry.machines.apiary -import net.bdew.gendustry.Gendustry import net.bdew.gendustry.gui.Textures -import net.bdew.lib.Misc import net.bdew.lib.data.DataSlotFloat import net.bdew.lib.gui.widgets.Widget import net.bdew.lib.gui.{Point, Rect} import scala.collection.mutable -class WidgetApiaryProgress(val rect: Rect, breeding: DataSlotFloat, progress: DataSlotFloat) extends Widget { +class WidgetApiaryProgress(val rect: Rect, progress: DataSlotFloat) extends Widget { val texture = Textures.whiteProgress(rect.w) override def handleTooltip(p: Point, tip: mutable.MutableList[String]) { - if (breeding.value > 0) { - tip += "%s - %.0f%%".format(Misc.toLocal(Gendustry.modId + ".label.breeding"), breeding.value * 100) - } else if (progress.value > 0) { - tip += "%s - %.0f%%".format(Misc.toLocal(Gendustry.modId + ".label.working"), progress.value * 100) - } + tip += "%.0f%%".format(progress.value * 100) } override def draw(mouse: Point) { - if (breeding.value > 0) { - parent.drawTextureInterpolate(rect, texture, 0, 0, breeding.value, 1) - } else if (progress.value > 0) { + if (progress.value > 0) { parent.drawTextureInterpolate(rect, texture, 0, 0, progress.value, 1) } } diff --git a/src/net/bdew/gendustry/machines/apiary/WidgetError.scala b/src/net/bdew/gendustry/machines/apiary/WidgetError.scala index 4ef6e194..8ebb11ef 100644 --- a/src/net/bdew/gendustry/machines/apiary/WidgetError.scala +++ b/src/net/bdew/gendustry/machines/apiary/WidgetError.scala @@ -9,6 +9,7 @@ package net.bdew.gendustry.machines.apiary +import net.bdew.gendustry.gui.Textures import net.bdew.lib.gui.widgets.Widget import net.bdew.lib.gui.{Point, Rect, Texture} import net.bdew.lib.{Client, Misc} @@ -22,16 +23,15 @@ class WidgetError(x: Int, y: Int, apiary: TileApiary) extends Widget { def getDisplayedError = { import scala.collection.JavaConversions._ val errors = apiary.getErrorStates - if (errors.isEmpty) { - ForestryErrorStates.ok - } else { - val pos = ((Client.world.getTotalWorldTime / 40) % errors.size()).toInt - errors.toList.sortBy(_.getID).apply(pos) - } + val pos = ((Client.world.getTotalWorldTime / 40) % errors.size()).toInt + errors.toList.sortBy(_.getID).apply(pos) } override def draw(mouse: Point) { - parent.drawTexture(rect, Texture(Texture.ITEMS, getDisplayedError.getIcon)) + if (apiary.errorConditions.isOk) + parent.drawTexture(rect, Textures.errors.ok) + else + parent.drawTexture(rect, Texture(Texture.ITEMS, getDisplayedError.getIcon)) } override def handleTooltip(p: Point, tip: mutable.MutableList[String]) { diff --git a/src/net/bdew/gendustry/misc/DataSlotErrorStates.scala b/src/net/bdew/gendustry/misc/DataSlotErrorStates.scala index 497e6863..4e761d43 100644 --- a/src/net/bdew/gendustry/misc/DataSlotErrorStates.scala +++ b/src/net/bdew/gendustry/misc/DataSlotErrorStates.scala @@ -9,18 +9,52 @@ package net.bdew.gendustry.misc -import forestry.api.core.{ErrorStateRegistry, IErrorState} +import java.io.{DataInputStream, DataOutputStream} + +import com.google.common.collect.ImmutableSet +import forestry.api.core.{IErrorLogic, IErrorState} +import net.bdew.gendustry.machines.apiary.ForestryErrorStates import net.bdew.lib.Event import net.bdew.lib.data.base.{DataSlotContainer, DataSlotVal, UpdateKind} import net.minecraft.nbt.NBTTagCompound import scala.util.DynamicVariable -case class DataSlotErrorStates(name: String, parent: DataSlotContainer) extends DataSlotVal[Set[IErrorState]] { +case class DataSlotErrorStates(name: String, parent: DataSlotContainer) extends DataSlotVal[Set[IErrorState]] with IErrorLogic { override var value: Set[IErrorState] = Set.empty val suspendUpdates = new DynamicVariable(false) + // ==== IErrorLogic + + override def getErrorStates: ImmutableSet[IErrorState] = ImmutableSet.copyOf(value.toArray) + override def setCondition(condition: Boolean, errorState: IErrorState): Boolean = { + if (condition) + set(errorState) + else + clear(errorState) + condition + } + + override def hasErrors: Boolean = !isOk + override def clearErrors(): Unit = clearAll() + override def contains(state: IErrorState): Boolean = value.contains(state) + + override def writeData(data: DataOutputStream): Unit = { + data.writeInt(value.size) + for (x <- value) + data.writeUTF(x.getUniqueName) + } + + override def readData(data: DataInputStream): Unit = { + val errNum = data.readInt() + val errors = for (i <- 0 until errNum) + yield Option(ForestryErrorStates.errorStates.getErrorState(data.readUTF())) + value = errors.flatten.toSet + } + + // ================ + def set(v: IErrorState): Unit = { value += v changed() @@ -65,7 +99,7 @@ case class DataSlotErrorStates(name: String, parent: DataSlotContainer) extends import net.bdew.lib.nbt._ override def load(t: NBTTagCompound, kind: UpdateKind.Value): Unit = { - value = (t.getList[String](name) flatMap { x => Option(ErrorStateRegistry.getErrorState(x)) }).toSet + value = (t.getList[String](name) flatMap { x => Option(ForestryErrorStates.errorStates.getErrorState(x)) }).toSet } override def save(t: NBTTagCompound, kind: UpdateKind.Value): Unit = { diff --git a/src/net/bdew/gendustry/misc/GeneticsCache.scala b/src/net/bdew/gendustry/misc/GeneticsCache.scala index 12f7cb55..f17aa467 100644 --- a/src/net/bdew/gendustry/misc/GeneticsCache.scala +++ b/src/net/bdew/gendustry/misc/GeneticsCache.scala @@ -58,8 +58,8 @@ object GeneticsCache { for ((_, root) <- AlleleManager.alleleRegistry.getSpeciesRoot; mutation <- root.getMutations(false)) { speciesResultMutations(mutation.getTemplate.apply(0).asInstanceOf[IAlleleSpecies]) += mutation - speciesUsedMutations(mutation.getAllele0.asInstanceOf[IAlleleSpecies]) += mutation - speciesUsedMutations(mutation.getAllele1.asInstanceOf[IAlleleSpecies]) += mutation + speciesUsedMutations(mutation.getAllele0) += mutation + speciesUsedMutations(mutation.getAllele1) += mutation } Gendustry.logDebug("Mutations with multiple results from a single combination:")