From 83ce705a99e381ea1cb495d81637d8909cfaafce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 29 Aug 2015 15:10:44 +0200 Subject: [PATCH] Finished migrating crop stuff to Geolyzer/converter logic (mostly because I cba to make new graphics >_>). Also added AgriCraft API as JAR lib because getting the Gradle dep to work is a royal pita and I wasted too much time on trying that already... --- ...riCraft-1.7.10-1.4.0-beta-2-1.7.10-api.jar | Bin 0 -> 31863 bytes .../cil/oc/common/item/UpgradeFarming.scala | 5 -- .../scala/li/cil/oc/integration/Mods.scala | 2 +- .../oc/integration/agricraft/ApiHandler.scala | 17 +++++ .../agricraft/ConverterSeeds.scala | 31 ++++++++ .../agricraft/EventHandlerAgriCraft.scala | 31 ++++++++ .../integration/agricraft/ModAgriCraft.scala | 37 +++------- .../li/cil/oc/integration/util/Crop.scala | 26 ------- .../vanilla/EventHandlerVanilla.scala | 28 ++++++++ .../oc/integration/vanilla/ModVanilla.scala | 67 ++---------------- .../oc/server/component/UpgradeFarming.scala | 33 --------- 11 files changed, 122 insertions(+), 155 deletions(-) create mode 100644 libs/AgriCraft-1.7.10-1.4.0-beta-2-1.7.10-api.jar delete mode 100644 src/main/scala/li/cil/oc/common/item/UpgradeFarming.scala create mode 100644 src/main/scala/li/cil/oc/integration/agricraft/ApiHandler.scala create mode 100644 src/main/scala/li/cil/oc/integration/agricraft/ConverterSeeds.scala create mode 100644 src/main/scala/li/cil/oc/integration/agricraft/EventHandlerAgriCraft.scala delete mode 100644 src/main/scala/li/cil/oc/integration/util/Crop.scala create mode 100644 src/main/scala/li/cil/oc/integration/vanilla/EventHandlerVanilla.scala delete mode 100644 src/main/scala/li/cil/oc/server/component/UpgradeFarming.scala diff --git a/libs/AgriCraft-1.7.10-1.4.0-beta-2-1.7.10-api.jar b/libs/AgriCraft-1.7.10-1.4.0-beta-2-1.7.10-api.jar new file mode 100644 index 0000000000000000000000000000000000000000..470234700050a4bdd7b942ca34ef95187615dd64 GIT binary patch literal 31863 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 literal 0 HcmV?d00001 diff --git a/src/main/scala/li/cil/oc/common/item/UpgradeFarming.scala b/src/main/scala/li/cil/oc/common/item/UpgradeFarming.scala deleted file mode 100644 index bbb076041..000000000 --- a/src/main/scala/li/cil/oc/common/item/UpgradeFarming.scala +++ /dev/null @@ -1,5 +0,0 @@ -package li.cil.oc.common.item - -class UpgradeFarming (val parent: Delegator) extends traits.Delegate with traits.ItemTier{ - -} diff --git a/src/main/scala/li/cil/oc/integration/Mods.scala b/src/main/scala/li/cil/oc/integration/Mods.scala index 853beeaa6..2d0d158f4 100644 --- a/src/main/scala/li/cil/oc/integration/Mods.scala +++ b/src/main/scala/li/cil/oc/integration/Mods.scala @@ -19,7 +19,7 @@ object Mods { def All = knownMods.clone() - val AgriCraft = new SimpleMod(IDs.AgriCraft) + val AgriCraft = new SimpleMod(IDs.AgriCraft, version = "@[1.4.0,)") val AppliedEnergistics2 = new SimpleMod(IDs.AppliedEnergistics2, version = "@[rv1,)", providesPower = true) val BattleGear2 = new SimpleMod(IDs.BattleGear2) val BetterRecords = new SimpleMod(IDs.BetterRecords) diff --git a/src/main/scala/li/cil/oc/integration/agricraft/ApiHandler.scala b/src/main/scala/li/cil/oc/integration/agricraft/ApiHandler.scala new file mode 100644 index 000000000..03d5b3bc3 --- /dev/null +++ b/src/main/scala/li/cil/oc/integration/agricraft/ApiHandler.scala @@ -0,0 +1,17 @@ +package li.cil.oc.integration.agricraft + +import com.InfinityRaider.AgriCraft + +object ApiHandler { + lazy val Api = AgriCraft.api.API.getAPI(1) match { + case api: AgriCraft.api.v1.APIv1 if isApiUsable(api) => Option(api) + case _ => None + } + + private def isApiUsable(api: AgriCraft.api.APIBase) = { + val status = api.getStatus + status == AgriCraft.api.APIStatus.OK || + status == AgriCraft.api.APIStatus.BACKLEVEL_OK || + status == AgriCraft.api.APIStatus.BACKLEVEL_LIMITED + } +} diff --git a/src/main/scala/li/cil/oc/integration/agricraft/ConverterSeeds.scala b/src/main/scala/li/cil/oc/integration/agricraft/ConverterSeeds.scala new file mode 100644 index 000000000..e6b4c5a4d --- /dev/null +++ b/src/main/scala/li/cil/oc/integration/agricraft/ConverterSeeds.scala @@ -0,0 +1,31 @@ +package li.cil.oc.integration.agricraft + +import java.util + +import com.InfinityRaider.AgriCraft.api.v1.ISeedStats +import li.cil.oc.api.driver.Converter +import net.minecraft.item.ItemStack + +import scala.collection.convert.WrapAsScala._ + +object ConverterSeeds extends Converter { + override def convert(value: scala.Any, output: util.Map[AnyRef, AnyRef]): Unit = { + value match { + case stack: ItemStack => ApiHandler.Api.foreach(api => { + if (api.isHandledByAgricraft(stack) && stack.hasTagCompound && stack.getTagCompound.getBoolean("analyzed")) api.getSeedStats(stack) match { + case stats: ISeedStats => + output += "agricraft" -> Map( + "gain" -> float2Float(stats.getGain), + "maxGain" -> float2Float(stats.getMaxGain), + "growth" -> float2Float(stats.getGrowth), + "maxGrowth" -> float2Float(stats.getMaxGrowth), + "strength" -> float2Float(stats.getStrength), + "maxStrength" -> float2Float(stats.getMaxStrength) + ) + case _ => + } + }) + case _ => + } + } +} diff --git a/src/main/scala/li/cil/oc/integration/agricraft/EventHandlerAgriCraft.scala b/src/main/scala/li/cil/oc/integration/agricraft/EventHandlerAgriCraft.scala new file mode 100644 index 000000000..5dc941772 --- /dev/null +++ b/src/main/scala/li/cil/oc/integration/agricraft/EventHandlerAgriCraft.scala @@ -0,0 +1,31 @@ +package li.cil.oc.integration.agricraft + +import com.InfinityRaider.AgriCraft.api.v1.ISeedStats +import cpw.mods.fml.common.eventhandler.SubscribeEvent +import li.cil.oc.api.event.GeolyzerEvent + +import scala.collection.convert.WrapAsScala._ + +object EventHandlerAgriCraft { + @SubscribeEvent + def onGeolyzerAnalyze(e: GeolyzerEvent.Analyze) { + val world = e.host.world + + ApiHandler.Api.foreach(api => if (api.isCrops(world, e.x, e.y, e.z)) { + e.data += "growth" -> float2Float(if (api.isMature(world, e.x, e.y, e.z)) 1f else 0f) + + if (api.isAnalyzed(world, e.x, e.y, e.z)) { + api.getStats(world, e.x, e.y, e.z) match { + case stats: ISeedStats => + e.data += "gain" -> float2Float(stats.getGain) + e.data += "maxGain" -> float2Float(stats.getMaxGain) + e.data += "growth" -> float2Float(stats.getGrowth) + e.data += "maxGrowth" -> float2Float(stats.getMaxGrowth) + e.data += "strength" -> float2Float(stats.getStrength) + e.data += "maxStrength" -> float2Float(stats.getMaxStrength) + case _ => // Invalid crop. + } + } + }) + } +} diff --git a/src/main/scala/li/cil/oc/integration/agricraft/ModAgriCraft.scala b/src/main/scala/li/cil/oc/integration/agricraft/ModAgriCraft.scala index c4c82eee0..f3325428f 100644 --- a/src/main/scala/li/cil/oc/integration/agricraft/ModAgriCraft.scala +++ b/src/main/scala/li/cil/oc/integration/agricraft/ModAgriCraft.scala @@ -1,38 +1,17 @@ package li.cil.oc.integration.agricraft -import com.InfinityRaider.AgriCraft.blocks.BlockCrop -import li.cil.oc.integration.util.Crop -import li.cil.oc.integration.util.Crop.CropProvider -import li.cil.oc.integration.{Mods, Mod, ModProxy} -import li.cil.oc.server.component._ -import li.cil.oc.util.BlockPosition -import net.minecraft.block.Block -import net.minecraft.item.Item +import li.cil.oc.api.Driver +import li.cil.oc.integration.Mod +import li.cil.oc.integration.ModProxy +import li.cil.oc.integration.Mods +import net.minecraftforge.common.MinecraftForge -object ModAgriCraft extends ModProxy with CropProvider { +object ModAgriCraft extends ModProxy { override def getMod: Mod = Mods.AgriCraft override def initialize(): Unit = { - Crop.addProvider(this) - } + Driver.add(ConverterSeeds) - override def getInformation(pos: BlockPosition): Array[AnyRef] = { - val world = pos.world.get - val target = world.getBlock(pos.x,pos.y,pos.z) - target match { - case crop:BlockCrop=>{ - val meta = world.getBlockMetadata(pos.x, pos.y, pos.z) - val value = meta * 100 / 2 - result(Item.itemRegistry.getNameForObject(crop.getSeed)) - } - case _=>result(Unit,"not a thing") - } - } - - override def isValidFor(block: Block): Boolean = { - block match { - case _: BlockCrop => true - case _ => false - } + MinecraftForge.EVENT_BUS.register(EventHandlerAgriCraft) } } diff --git a/src/main/scala/li/cil/oc/integration/util/Crop.scala b/src/main/scala/li/cil/oc/integration/util/Crop.scala deleted file mode 100644 index b90b5ff1f..000000000 --- a/src/main/scala/li/cil/oc/integration/util/Crop.scala +++ /dev/null @@ -1,26 +0,0 @@ -package li.cil.oc.integration.util - -import li.cil.oc.util.BlockPosition -import net.minecraft.block.Block - -import scala.collection.mutable - -object Crop { - - - val providers = mutable.Buffer.empty[CropProvider] - - def addProvider(provider: CropProvider): Unit = providers += provider - - def getProviderForBlock(block: Block): Option[CropProvider] = { - providers.find(_.isValidFor(block)) - } - - trait CropProvider { - def getInformation(pos: BlockPosition): Array[AnyRef] - - def isValidFor(block: Block): Boolean - } - - -} diff --git a/src/main/scala/li/cil/oc/integration/vanilla/EventHandlerVanilla.scala b/src/main/scala/li/cil/oc/integration/vanilla/EventHandlerVanilla.scala new file mode 100644 index 000000000..650b9775c --- /dev/null +++ b/src/main/scala/li/cil/oc/integration/vanilla/EventHandlerVanilla.scala @@ -0,0 +1,28 @@ +package li.cil.oc.integration.vanilla + +import cpw.mods.fml.common.eventhandler.SubscribeEvent +import li.cil.oc.api.event.GeolyzerEvent +import net.minecraft.block.BlockCrops +import net.minecraft.init.Blocks + +import scala.collection.convert.WrapAsScala._ + +object EventHandlerVanilla { + @SubscribeEvent + def onGeolyzerAnalyze(e: GeolyzerEvent.Analyze) { + val world = e.host.world + val block = world.getBlock(e.x, e.y, e.z) + if (block.isInstanceOf[BlockCrops] || block == Blocks.melon_stem || block == Blocks.pumpkin_stem || block == Blocks.carrots || block == Blocks.potatoes) { + e.data += "growth" -> float2Float((world.getBlockMetadata(e.x, e.y, e.z) / 7f) max 0 min 1) + } + if (block == Blocks.cocoa) { + e.data += "growth" -> float2Float(((world.getBlockMetadata(e.x, e.y, e.z) >> 2) / 2f) max 0 min 1) + } + if (block == Blocks.nether_wart) { + e.data += "growth" -> float2Float((world.getBlockMetadata(e.x, e.y, e.z) / 3f) max 0 min 1) + } + if (block == Blocks.melon_block || block == Blocks.pumpkin || block == Blocks.cactus || block == Blocks.reeds) { + e.data += "growth" -> float2Float(1f) + } + } +} diff --git a/src/main/scala/li/cil/oc/integration/vanilla/ModVanilla.scala b/src/main/scala/li/cil/oc/integration/vanilla/ModVanilla.scala index 1f3f1a8fd..2c7933aa2 100644 --- a/src/main/scala/li/cil/oc/integration/vanilla/ModVanilla.scala +++ b/src/main/scala/li/cil/oc/integration/vanilla/ModVanilla.scala @@ -4,18 +4,15 @@ import li.cil.oc.Settings import li.cil.oc.api.Driver import li.cil.oc.integration.ModProxy import li.cil.oc.integration.Mods -import li.cil.oc.integration.util.{Crop, BundledRedstone} +import li.cil.oc.integration.util.BundledRedstone import li.cil.oc.integration.util.BundledRedstone.RedstoneProvider -import li.cil.oc.integration.util.Crop.CropProvider -import li.cil.oc.server.component._ import li.cil.oc.util.BlockPosition import li.cil.oc.util.ExtendedWorld._ -import net.minecraft.block._ -import net.minecraft.init.{Items, Blocks} -import net.minecraft.item.Item +import net.minecraft.init.Blocks +import net.minecraftforge.common.MinecraftForge import net.minecraftforge.common.util.ForgeDirection -object ModVanilla extends ModProxy with RedstoneProvider with CropProvider { +object ModVanilla extends ModProxy with RedstoneProvider { def getMod = Mods.Minecraft def initialize() { @@ -48,7 +45,8 @@ object ModVanilla extends ModProxy with RedstoneProvider with CropProvider { RecipeHandler.init() BundledRedstone.addProvider(this) - Crop.addProvider(this) + + MinecraftForge.EVENT_BUS.register(EventHandlerVanilla) } override def computeInput(pos: BlockPosition, side: ForgeDirection): Int = { @@ -58,57 +56,4 @@ object ModVanilla extends ModProxy with RedstoneProvider with CropProvider { } override def computeBundledInput(pos: BlockPosition, side: ForgeDirection): Array[Int] = null - - override def getInformation(pos: BlockPosition): Array[AnyRef] = { - val world = pos.world.get - val target = world.getBlock(pos.x, pos.y, pos.z) - target match { - case crop: BlockBush => { - val meta = world.getBlockMetadata(pos.x, pos.y, pos.z) - var name = crop.getLocalizedName - var modifier = 7 - crop match { - - case Blocks.wheat => { - name = Item.itemRegistry.getNameForObject(Items.wheat) - } - case Blocks.melon_stem => { - //Localize this? - name = "Melon stem" - } - case Blocks.pumpkin_stem => { - name = "Pumpkin stem" - } - case Blocks.nether_wart => { - modifier = 3 - } - case _ => - } - result(name, meta * 100 / modifier) - } - case cocoa: BlockCocoa => { - val meta = world.getBlockMetadata(pos.x, pos.y, pos.z) - val value = meta * 100 / 2 - - result(cocoa.getLocalizedName, Math.min(value, 100)) - } - case _: BlockMelon | _: BlockPumpkin => { - result(target.getLocalizedName, 100) - } - case _: BlockCactus | _: BlockReed => { - val meta = world.getBlockMetadata(pos.x, pos.y, pos.z) - result(target.getLocalizedName, meta) - } - case _ => result(Unit, "Not a crop") - } - } - - override def isValidFor(block: Block): Boolean = { - block match { - //has to be specified for crops otherwise overriding blocks of other mods might not get their own Provider - case _: BlockStem | Blocks.wheat | Blocks.carrots | Blocks.potatoes | _: BlockCocoa | _: BlockMelon | _: BlockPumpkin | _: BlockCactus | _: BlockReed => true - case _ => false - } - - } } diff --git a/src/main/scala/li/cil/oc/server/component/UpgradeFarming.scala b/src/main/scala/li/cil/oc/server/component/UpgradeFarming.scala deleted file mode 100644 index 7224528ef..000000000 --- a/src/main/scala/li/cil/oc/server/component/UpgradeFarming.scala +++ /dev/null @@ -1,33 +0,0 @@ -package li.cil.oc.server.component - -import li.cil.oc.api.driver.EnvironmentHost -import li.cil.oc.api.machine.{Callback, Arguments, Context} -import li.cil.oc.api.network.Visibility -import li.cil.oc.api.{Network, prefab, internal} -import li.cil.oc.integration.util.Crop -import li.cil.oc.integration.util.Crop.CropProvider -import li.cil.oc.util.BlockPosition -import net.minecraft.block._ -import net.minecraft.init.{Items, Blocks} -import net.minecraft.item.Item -import net.minecraftforge.common.IPlantable -import net.minecraftforge.common.util.ForgeDirection - -class UpgradeFarming(val host: EnvironmentHost with internal.Robot) extends prefab.ManagedEnvironment { - override val node = Network.newNode(this, Visibility.Network). - withComponent("farming"). - create() - - @Callback(doc = """function([count:number]):boolean -- checks the ripeness of the seed.""") - def check(context: Context, args: Arguments): Array[AnyRef] = { - val hostPos = BlockPosition(host) - val targetPos = hostPos.offset(ForgeDirection.DOWN) - val target = host.world.getBlock(targetPos.x, targetPos.y, targetPos.z) - Crop.getProviderForBlock(target) match { - case Some(provider) => provider.getInformation(BlockPosition(targetPos.x, targetPos.y, targetPos.z, host.world)) - case _ => result(Unit, "Not a crop") - } - - } - -}