diff --git a/build.gradle b/build.gradle index b094d26..b13826a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,8 @@ buildscript { repositories { - jcenter() + maven { + url = "https://maven.aliyun.com/repository/public" + } maven { name = "forge" url = "http://files.minecraftforge.net/maven" @@ -19,6 +21,7 @@ buildscript { classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT' classpath 'co.riiid:gradle-github-plugin:0.4.2' classpath 'gradle.plugin.com.matthewprenger:CurseGradle:1.4.0' + classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.70' } } @@ -74,6 +77,7 @@ minecraft { dependencies { compileOnly "mezz.jei:jei_1.12.2:4.15.0.293:api" compile "net.shadowfacts:Forgelin:1.8.4" + compile "io.reactivex.rxjava3:rxjava:3.0.0" deobfCompile "org.cyclops.commoncapabilities:CommonCapabilities:1.12.2-1.4.0-174:deobf" compileOnly "mcjty.theoneprobe:TheOneProbe-1.12:1.12-1.4.28-17:api" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a95009c..949819d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-bin.zip diff --git a/src/main/java/com/projecturanus/foodcraft/FoodCraftReloaded.kt b/src/main/java/com/projecturanus/foodcraft/FoodCraftReloaded.kt index 050d861..48a0b34 100644 --- a/src/main/java/com/projecturanus/foodcraft/FoodCraftReloaded.kt +++ b/src/main/java/com/projecturanus/foodcraft/FoodCraftReloaded.kt @@ -2,6 +2,7 @@ package com.projecturanus.foodcraft import com.projecturanus.foodcraft.common.GuiHandler import com.projecturanus.foodcraft.common.block.entity.* +import com.projecturanus.foodcraft.common.capability.DefaultCapabilities import com.projecturanus.foodcraft.common.init.RegisterHandler import com.projecturanus.foodcraft.common.network.registerMessages import com.projecturanus.foodcraft.common.recipe.RecipeRegistryHandler @@ -61,6 +62,16 @@ object FoodCraftReloaded { RegisterHandler.mirrorOres("listAlloil", "foodSesameoil") RegisterHandler.mirrorOres("listAlloil", "foodOliveoil") } + + if (!Loader.isModLoaded("commoncapabilities")) { + DefaultCapabilities.registerDefaultCapabilities() + } + } + + @Mod.EventHandler + fun loadComplete(event: FMLLoadCompleteEvent) { + logger.info("Caching Allowed Fluid for Machines") + RecipeRegistryHandler.reloadRecipeFluids() } @Mod.EventHandler diff --git a/src/main/java/com/projecturanus/foodcraft/client/gui/GuiContainerPan.kt b/src/main/java/com/projecturanus/foodcraft/client/gui/GuiContainerPan.kt index ca6e0da..b0a59fc 100644 --- a/src/main/java/com/projecturanus/foodcraft/client/gui/GuiContainerPan.kt +++ b/src/main/java/com/projecturanus/foodcraft/client/gui/GuiContainerPan.kt @@ -1,10 +1,39 @@ package com.projecturanus.foodcraft.client.gui import com.projecturanus.foodcraft.MODID -import com.projecturanus.foodcraft.common.block.container.ContainerMachine +import com.projecturanus.foodcraft.client.gui.widget.WidgetCookBar +import com.projecturanus.foodcraft.client.gui.widget.WidgetHeat +import com.projecturanus.foodcraft.client.gui.widget.WidgetProgressBar +import com.projecturanus.foodcraft.common.block.container.ContainerPan import net.minecraft.util.ResourceLocation val PAN_TEXTURES = ResourceLocation(MODID, "textures/gui/container/pan.png") -class GuiContainerPan(container: ContainerMachine) : GuiContainerMachine(container, PAN_TEXTURES) { +class GuiContainerPan(override val container: ContainerPan) : GuiContainerMachine(container, PAN_TEXTURES) { + val tileEntity by lazy { container.tileEntity } + val heatHandler by lazy { tileEntity.heatHandler } + val progress get() = container.progress / container.minProgress.toDouble() + val overcookProgress get() = (container.progress - container.minProgress) / (container.maxProgress - container.minProgress).toDouble() + + val widgetHeat = WidgetHeat(176, 0, container::heat.getter) + val widgetProgress by lazy { WidgetProgressBar(176, 14, this::progress.getter) } + val widgetCookBar by lazy { WidgetCookBar(176, 31, this::overcookProgress.getter) } + + override fun initGui() { + super.initGui() + widgetHeat.temperature = heatHandler + widgetHeat.setWorldAndResolution(mc, width, height) + widgetProgress.setWorldAndResolution(mc, width, height) + widgetCookBar.setWorldAndResolution(mc, width, height) + } + + override fun drawGuiContainerBackgroundLayer(partialTicks: Float, mouseX: Int, mouseY: Int) { + super.drawGuiContainerBackgroundLayer(partialTicks, mouseX, mouseY) + val i = (width - xSize) / 2 + val j = (height - ySize) / 2 + + widgetHeat.draw(i + 81, j + 19, mouseX, mouseY, partialTicks) + widgetProgress.draw(i + 72, j + 39, mouseX, mouseY, partialTicks) + widgetCookBar.draw(i + 46, j + 62, mouseX, mouseY, partialTicks) + } } diff --git a/src/main/java/com/projecturanus/foodcraft/client/gui/GuiContainerPot.kt b/src/main/java/com/projecturanus/foodcraft/client/gui/GuiContainerPot.kt index 8628106..5331caf 100644 --- a/src/main/java/com/projecturanus/foodcraft/client/gui/GuiContainerPot.kt +++ b/src/main/java/com/projecturanus/foodcraft/client/gui/GuiContainerPot.kt @@ -1,10 +1,39 @@ package com.projecturanus.foodcraft.client.gui import com.projecturanus.foodcraft.MODID -import com.projecturanus.foodcraft.common.block.container.ContainerMachine +import com.projecturanus.foodcraft.client.gui.widget.WidgetCookBar +import com.projecturanus.foodcraft.client.gui.widget.WidgetHeat +import com.projecturanus.foodcraft.client.gui.widget.WidgetProgressBar +import com.projecturanus.foodcraft.common.block.container.ContainerPot import net.minecraft.util.ResourceLocation val POT_TEXTURES = ResourceLocation(MODID, "textures/gui/container/pot.png") -class GuiContainerPot(container: ContainerMachine) : GuiContainerMachine(container, POT_TEXTURES) { +class GuiContainerPot(override val container: ContainerPot) : GuiContainerMachine(container, POT_TEXTURES) { + val tileEntity by lazy { container.tileEntity } + val heatHandler by lazy { tileEntity.heatHandler } + val progress get() = container.progress / container.minProgress.toDouble() + val overcookProgress get() = (container.progress - container.minProgress) / (container.maxProgress - container.minProgress).toDouble() + + val widgetHeat = WidgetHeat(176, 0, container::heat.getter) + val widgetProgress by lazy { WidgetProgressBar(176, 15, this::progress.getter) } + val widgetCookBar by lazy { WidgetCookBar(176, 31, this::overcookProgress.getter) } + + override fun initGui() { + super.initGui() + widgetHeat.temperature = heatHandler + widgetHeat.setWorldAndResolution(mc, width, height) + widgetProgress.setWorldAndResolution(mc, width, height) + widgetCookBar.setWorldAndResolution(mc, width, height) + } + + override fun drawGuiContainerBackgroundLayer(partialTicks: Float, mouseX: Int, mouseY: Int) { + super.drawGuiContainerBackgroundLayer(partialTicks, mouseX, mouseY) + val i = (width - xSize) / 2 + val j = (height - ySize) / 2 + + widgetHeat.draw(i + 81, j + 64, mouseX, mouseY, partialTicks) + widgetProgress.draw(i + 93, j + 20, mouseX, mouseY, partialTicks) + widgetCookBar.draw(i + 48, j + 38, mouseX, mouseY, partialTicks) + } } diff --git a/src/main/java/com/projecturanus/foodcraft/client/gui/widget/WidgetCookBar.kt b/src/main/java/com/projecturanus/foodcraft/client/gui/widget/WidgetCookBar.kt new file mode 100644 index 0000000..b84decb --- /dev/null +++ b/src/main/java/com/projecturanus/foodcraft/client/gui/widget/WidgetCookBar.kt @@ -0,0 +1,23 @@ +package com.projecturanus.foodcraft.client.gui.widget + +import kotlin.reflect.KProperty0 + +class WidgetCookBar(val x: Int, val y: Int, val progress: KProperty0.Getter) : Widget() { + + companion object { + const val WIDTH = 78 + const val HEIGHT = 3 + } + + override fun isMouseIn(x: Int, y: Int, mouseX: Int, mouseY: Int): Boolean { + return mouseX > x && mouseY > y && mouseX < x + WIDTH && mouseY < y + HEIGHT + } + + override fun draw(x: Int, y: Int, mouseX: Int, mouseY: Int, partialTicks: Float) { + val l: Int = (progress.invoke() * WIDTH).toInt() + this.drawTexturedModalRect(x, y, this.x, this.y, l, HEIGHT) + if (isMouseIn(x, y, mouseX, mouseY) && l >= 0) { + this.drawHoveringText(listOf("Overcooked progress: ${progress.invoke()}"), x, y, fontRenderer) + } + } +} diff --git a/src/main/java/com/projecturanus/foodcraft/common/block/container/ContainerPan.kt b/src/main/java/com/projecturanus/foodcraft/common/block/container/ContainerPan.kt index 386038b..6e04fb5 100644 --- a/src/main/java/com/projecturanus/foodcraft/common/block/container/ContainerPan.kt +++ b/src/main/java/com/projecturanus/foodcraft/common/block/container/ContainerPan.kt @@ -1,6 +1,10 @@ package com.projecturanus.foodcraft.common.block.container import com.projecturanus.foodcraft.MODID +import com.projecturanus.foodcraft.common.block.entity.TileEntityPan +import com.projecturanus.foodcraft.common.network.CHANNAL +import com.projecturanus.foodcraft.common.network.S2CContainerHeatUpdate +import net.minecraft.entity.player.EntityPlayerMP import net.minecraft.entity.player.InventoryPlayer import net.minecraft.inventory.Slot import net.minecraft.tileentity.TileEntity @@ -8,13 +12,17 @@ import net.minecraftforge.items.CapabilityItemHandler import net.minecraftforge.items.SlotItemHandler -class ContainerPan(playerInventory: InventoryPlayer, tileEntity: TileEntity) : ContainerMachine(playerInventory, tileEntity) { +class ContainerPan(playerInventory: InventoryPlayer, tileEntity: TileEntity) : ContainerRecipeMachine(playerInventory, tileEntity as TileEntityPan), HeatContainer { + override var heat = 0.0 + var minProgress = 0 + var maxProgress = 0 + init { val itemHandler = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null)!! addSlotToContainer(SlotItemHandler(itemHandler, 0, 45, 39)) - addSlotToContainer(SlotItemHandler(itemHandler, 1, 95, 60)) - addSlotToContainer(SlotItemHandler(itemHandler, 2, 37, 59)) - addSlotToContainer(SlotOutput(playerInventory.player, itemHandler, 3, 130, 31)) +// addSlotToContainer(SlotItemHandler(itemHandler, 1, 95, 60)) TODO unused + addSlotToContainer(SlotOutput(playerInventory.player, itemHandler, 1, 108, 39)) + addSlotToContainer(SlotOutput(playerInventory.player, itemHandler, 2, 137, 39)) for (x in 0 until 3) { for (y in 0 until 9) { @@ -27,5 +35,24 @@ class ContainerPan(playerInventory: InventoryPlayer, tileEntity: TileEntity) : C } } + override fun detectAndSendChanges() { + super.detectAndSendChanges() + listeners.forEach { + if (it is EntityPlayerMP) { + CHANNAL.sendTo(S2CContainerHeatUpdate(tileEntity.heatHandler.temperature), it) + } + it.sendWindowProperty(this, 1, tileEntity.recipe?.minTime ?: 0) + it.sendWindowProperty(this, 2, tileEntity.recipe?.maxTime ?: 0) + } + } + + override fun updateProgressBar(id: Int, data: Int) { + super.updateProgressBar(id, data) + if (id == 1) + minProgress = data + if (id == 2) + maxProgress = data + } + override fun getName(): String = "tile.$MODID.pan.name" } diff --git a/src/main/java/com/projecturanus/foodcraft/common/block/container/ContainerPot.kt b/src/main/java/com/projecturanus/foodcraft/common/block/container/ContainerPot.kt index 377b21e..d479457 100644 --- a/src/main/java/com/projecturanus/foodcraft/common/block/container/ContainerPot.kt +++ b/src/main/java/com/projecturanus/foodcraft/common/block/container/ContainerPot.kt @@ -1,6 +1,10 @@ package com.projecturanus.foodcraft.common.block.container import com.projecturanus.foodcraft.MODID +import com.projecturanus.foodcraft.common.block.entity.TileEntityPot +import com.projecturanus.foodcraft.common.network.CHANNAL +import com.projecturanus.foodcraft.common.network.S2CContainerHeatUpdate +import net.minecraft.entity.player.EntityPlayerMP import net.minecraft.entity.player.InventoryPlayer import net.minecraft.inventory.Slot import net.minecraft.tileentity.TileEntity @@ -8,7 +12,11 @@ import net.minecraftforge.items.CapabilityItemHandler import net.minecraftforge.items.SlotItemHandler -class ContainerPot(playerInventory: InventoryPlayer, tileEntity: TileEntity) : ContainerMachine(playerInventory, tileEntity) { +class ContainerPot(playerInventory: InventoryPlayer, tileEntity: TileEntity) : ContainerRecipeMachine(playerInventory, tileEntity as TileEntityPot), HeatContainer { + override var heat = 0.0 + var minProgress = 0 + var maxProgress = 0 + init { val itemHandler = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null)!! for (i in 0..3) { @@ -31,5 +39,24 @@ class ContainerPot(playerInventory: InventoryPlayer, tileEntity: TileEntity) : C } } + override fun detectAndSendChanges() { + super.detectAndSendChanges() + listeners.forEach { + if (it is EntityPlayerMP) { + CHANNAL.sendTo(S2CContainerHeatUpdate(tileEntity.heatHandler.temperature), it) + } + it.sendWindowProperty(this, 1, tileEntity.recipe?.minTime ?: 0) + it.sendWindowProperty(this, 2, tileEntity.recipe?.maxTime ?: 0) + } + } + + override fun updateProgressBar(id: Int, data: Int) { + super.updateProgressBar(id, data) + if (id == 1) + minProgress = data + if (id == 2) + maxProgress = data + } + override fun getName(): String = "tile.$MODID.pot.name" } diff --git a/src/main/java/com/projecturanus/foodcraft/common/block/entity/TileEntityPan.kt b/src/main/java/com/projecturanus/foodcraft/common/block/entity/TileEntityPan.kt index 6bdae6c..9575321 100644 --- a/src/main/java/com/projecturanus/foodcraft/common/block/entity/TileEntityPan.kt +++ b/src/main/java/com/projecturanus/foodcraft/common/block/entity/TileEntityPan.kt @@ -1,4 +1,76 @@ package com.projecturanus.foodcraft.common.block.entity -class TileEntityPan : TileEntityMachine(4) { +import com.projecturanus.foodcraft.common.heat.FuelHeatHandler +import com.projecturanus.foodcraft.common.init.FCRItems +import com.projecturanus.foodcraft.common.recipe.PAN_RECIPES +import com.projecturanus.foodcraft.common.recipe.PanRecipe +import com.projecturanus.foodcraft.common.util.get +import com.projecturanus.foodcraft.common.util.shrink +import net.minecraft.item.ItemStack +import org.cyclops.commoncapabilities.api.capability.temperature.ITemperature + +class TileEntityPan : TileEntityHeatRecipeMachine(PAN_RECIPES, 0..0, 1..1, 3) { + var waitingExtract = false + + init { + inventory.contentChangedListener += { + if (it == 1 && inventory[1].isEmpty) { + reset() + } + } + } + + override fun update() { + // Don't run tick on client + if (world.isRemote) return + + beforeProgress() + + if (recipe != null) { + // Finish + if (canFinish()) { + consumeInput() + working = false + val stack = recipe?.getRecipeOutput()?.copy()?: ItemStack.EMPTY + inventory.insertItem(1, stack, false) + waitingExtract = true + markDirty() + } else if (waitingExtract && progress > recipe!!.maxTime) { // Overcooked + inventory.shrink(1) + inventory.insertItem(2, ItemStack(FCRItems.OVERCOOKED_FOOD), false) + reset() + } else { + if (canProgress()) + progress++ + working = true + } + } else if (progress > 0) { + progress = 0 + working = false + } + } + + override fun reset() { + waitingExtract = false + progress = 0 + markDirty() + recipe = findRecipe() + } + + override fun beforeProgress() { + heatHandler.update(0.0) + } + + override fun canProgress(): Boolean = heatHandler.temperature > ITemperature.ZERO_CELCIUS + 80 + + override fun canFinish(): Boolean = progress > recipe?.minTime ?: Int.MAX_VALUE && progress < recipe?.maxTime ?: -1 && !waitingExtract + + override fun createFuelHandler(): FuelHeatHandler { + val heatHandler = FuelHeatHandler() + heatHandler.radiation = 0.02 + heatHandler.heatPower = 1.0 + heatHandler.minHeat = ITemperature.ZERO_CELCIUS + heatHandler.setMaxHeat(ITemperature.ZERO_CELCIUS + 160) + return heatHandler + } } diff --git a/src/main/java/com/projecturanus/foodcraft/common/block/entity/TileEntityPot.kt b/src/main/java/com/projecturanus/foodcraft/common/block/entity/TileEntityPot.kt index b5c13aa..7771837 100644 --- a/src/main/java/com/projecturanus/foodcraft/common/block/entity/TileEntityPot.kt +++ b/src/main/java/com/projecturanus/foodcraft/common/block/entity/TileEntityPot.kt @@ -1,3 +1,92 @@ package com.projecturanus.foodcraft.common.block.entity -class TileEntityPot : TileEntityMachine(14) +import com.projecturanus.foodcraft.common.heat.FuelHeatHandler +import com.projecturanus.foodcraft.common.init.FCRItems +import com.projecturanus.foodcraft.common.recipe.POT_RECIPES +import com.projecturanus.foodcraft.common.recipe.PotRecipe +import com.projecturanus.foodcraft.common.util.containIngredients +import com.projecturanus.foodcraft.common.util.get +import com.projecturanus.foodcraft.common.util.shrink +import net.minecraft.item.ItemStack +import org.cyclops.commoncapabilities.api.capability.temperature.ITemperature + +class TileEntityPot : TileEntityHeatRecipeMachine(POT_RECIPES, 0..11, 12..12, 14) { + var waitingExtract = false + + init { + inventory.contentChangedListener += { + if (it == 12 && inventory[12].isEmpty) { // Player took item out of output slot + reset() + } + } + } + + override fun update() { + // Don't run tick on client + if (world.isRemote) return + + beforeProgress() + + if (recipe != null) { + // Finish + if (canFinish()) { + consumeInput() + working = false + val stack = recipe?.getRecipeOutput()?.copy()?: ItemStack.EMPTY + inventory.insertItem(12, stack, false) + waitingExtract = true + markDirty() + } else if (waitingExtract && progress > recipe!!.maxTime) { // Overcooked + inventory.shrink(12) + inventory.insertItem(13, ItemStack(FCRItems.OVERCOOKED_FOOD), false) + reset() + } else { + if (canProgress()) + progress++ + working = true + } + } else if (!waitingExtract && progress > 0) { + progress = 0 + working = false + } + } + + override fun findRecipe(): PotRecipe? { + val validRecipes = recipeRegistry.valuesCollection.asSequence().filter { recipe -> + inventory[0..3].containIngredients(recipe.staples) && inventory[4..11].containIngredients(recipe.ingredients) + } + // Any slot available to insert + if (!validRecipes.any { + val stack = it.getRecipeOutput().copy() + outputSlots.any { slot -> + inventory.insertItem(slot, stack, true).isEmpty + } + }) + return null + return validRecipes.firstOrNull() + } + + override fun reset() { + waitingExtract = false + progress = 0 + markDirty() + recipe = findRecipe() + } + + override fun beforeProgress() { + heatHandler.update(0.0) + } + + override fun canProgress(): Boolean = heatHandler.temperature > ITemperature.ZERO_CELCIUS + 80 + + override fun canFinish(): Boolean = progress > recipe?.minTime ?: Int.MAX_VALUE && progress < recipe?.maxTime ?: -1 && !waitingExtract + + override fun createFuelHandler(): FuelHeatHandler { + val heatHandler = FuelHeatHandler() + heatHandler.radiation = 0.02 + heatHandler.heatPower = 1.0 + heatHandler.minHeat = ITemperature.ZERO_CELCIUS + heatHandler.setMaxHeat(ITemperature.ZERO_CELCIUS + 160) + return heatHandler + } +} diff --git a/src/main/java/com/projecturanus/foodcraft/common/capability/DefaultCapabilities.kt b/src/main/java/com/projecturanus/foodcraft/common/capability/DefaultCapabilities.kt new file mode 100644 index 0000000..13217d5 --- /dev/null +++ b/src/main/java/com/projecturanus/foodcraft/common/capability/DefaultCapabilities.kt @@ -0,0 +1,22 @@ +package com.projecturanus.foodcraft.common.capability + +import net.minecraft.nbt.NBTBase +import net.minecraft.nbt.NBTTagDouble +import net.minecraft.util.EnumFacing +import net.minecraftforge.common.capabilities.Capability +import net.minecraftforge.common.capabilities.CapabilityManager +import org.cyclops.commoncapabilities.api.capability.temperature.DefaultTemperature +import org.cyclops.commoncapabilities.api.capability.temperature.ITemperature + +/** + * Provide basic capabilities while CommonCapabilities is not installed + */ +object DefaultCapabilities { + fun registerDefaultCapabilities() { + CapabilityManager.INSTANCE.register(ITemperature::class.java, object : Capability.IStorage { + override fun readNBT(capability: Capability?, instance: ITemperature?, side: EnumFacing?, nbt: NBTBase?) { + } + override fun writeNBT(capability: Capability?, instance: ITemperature?, side: EnumFacing?): NBTBase? = NBTTagDouble(0.0) + }) { DefaultTemperature() } + } +} diff --git a/src/main/java/com/projecturanus/foodcraft/common/init/FCRItems.java b/src/main/java/com/projecturanus/foodcraft/common/init/FCRItems.java index 03f0f31..65e5c3c 100644 --- a/src/main/java/com/projecturanus/foodcraft/common/init/FCRItems.java +++ b/src/main/java/com/projecturanus/foodcraft/common/init/FCRItems.java @@ -14,6 +14,8 @@ public class FCRItems { public static final Item BREW_BARREL = null; public static final Item FRYING_PAN = null; public static final Item MILL = null; + public static final Item PAN = null; + public static final Item POT = null; public static final Item PRESSURE_COOKER = null; public static final ItemDrink GRAPE_JUICE = null; public static final Item GLASS_CUP = null; diff --git a/src/main/java/com/projecturanus/foodcraft/common/init/RegisterHandler.kt b/src/main/java/com/projecturanus/foodcraft/common/init/RegisterHandler.kt index d6c8c43..1a3a396 100644 --- a/src/main/java/com/projecturanus/foodcraft/common/init/RegisterHandler.kt +++ b/src/main/java/com/projecturanus/foodcraft/common/init/RegisterHandler.kt @@ -191,7 +191,7 @@ object RegisterHandler { itemQueue += ItemSugarLike(greenOnion).apply { setRegistryName(MODID, "green_onion") translationKey = "$MODID.green_onion" - } to arrayOf("foodGreenonion", "listAllgreenveggie") + } to arrayOf("foodGreenonion", "cropGreenonion", "listAllgreenveggie") DEFAULT_MODEL_ITEMS.addAll(itemQueue.map(Pair>::first)) } diff --git a/src/main/java/com/projecturanus/foodcraft/common/integration/jei/JEIIntegration.kt b/src/main/java/com/projecturanus/foodcraft/common/integration/jei/JEIIntegration.kt index a65e6e8..3c938ea 100644 --- a/src/main/java/com/projecturanus/foodcraft/common/integration/jei/JEIIntegration.kt +++ b/src/main/java/com/projecturanus/foodcraft/common/integration/jei/JEIIntegration.kt @@ -18,6 +18,8 @@ class JEIIntegration : IModPlugin { registry.addRecipes(BREW_BARREL_RECIPES.valuesCollection, FcRecipeUids.BREW_BARREL) registry.addRecipes(FRYING_PAN_RECIPES.valuesCollection, FcRecipeUids.FRYING) registry.addRecipes(MILL_RECIPES.valuesCollection, FcRecipeUids.MILLING) + registry.addRecipes(PAN_RECIPES.valuesCollection, FcRecipeUids.PAN) + registry.addRecipes(POT_RECIPES.valuesCollection, FcRecipeUids.POT) registry.addRecipes(PRESSURE_COOKER_RECIPES.valuesCollection, FcRecipeUids.PRESSURE_COOKER) registry.handleRecipes(ChoppingBoardRecipe::class.java, { ChoppingBoardWrapper(registry.jeiHelpers, it) }, FcRecipeUids.CHOPPING) @@ -25,6 +27,8 @@ class JEIIntegration : IModPlugin { registry.handleRecipes(BrewBarrelRecipe::class.java, { BrewBarrelWrapper(registry.jeiHelpers, it) }, FcRecipeUids.BREW_BARREL) registry.handleRecipes(FryingPanRecipe::class.java, { FryingPanWrapper(registry.jeiHelpers, it) }, FcRecipeUids.FRYING) registry.handleRecipes(MillRecipe::class.java, { MillWrapper(registry.jeiHelpers, it) }, FcRecipeUids.MILLING) + registry.handleRecipes(PanRecipe::class.java, { PanWrapper(registry.jeiHelpers, it) }, FcRecipeUids.PAN) + registry.handleRecipes(PotRecipe::class.java, { PotWrapper(registry.jeiHelpers, it) }, FcRecipeUids.POT) registry.handleRecipes(PressureCookerRecipe::class.java, { PressureCookerWrapper(registry.jeiHelpers, it) }, FcRecipeUids.PRESSURE_COOKER) registry.addRecipeClickArea(GuiContainerChoppingBoard::class.java, 96, 43, 18, 13, FcRecipeUids.CHOPPING) @@ -32,6 +36,8 @@ class JEIIntegration : IModPlugin { registry.addRecipeClickArea(GuiContainerBrewBarrel::class.java, 119, 31, 16, 16, FcRecipeUids.BREW_BARREL) registry.addRecipeClickArea(GuiContainerFryingPan::class.java, 92, 30, 18, 13, FcRecipeUids.FRYING) registry.addRecipeClickArea(GuiContainerMill::class.java, 76, 21, 18, 13, FcRecipeUids.MILLING) + registry.addRecipeClickArea(GuiContainerPan::class.java, 72, 39, 18, 13, FcRecipeUids.PAN) + registry.addRecipeClickArea(GuiContainerPot::class.java, 94, 23, 20, 9, FcRecipeUids.POT) registry.addRecipeClickArea(GuiContainerPressureCooker::class.java, 118, 30, 18, 13, FcRecipeUids.PRESSURE_COOKER) registry.addRecipeCatalyst(ItemStack(FCRItems.CHOPPING_BOARD), FcRecipeUids.CHOPPING) @@ -39,6 +45,8 @@ class JEIIntegration : IModPlugin { registry.addRecipeCatalyst(ItemStack(FCRItems.BREW_BARREL), FcRecipeUids.BREW_BARREL) registry.addRecipeCatalyst(ItemStack(FCRItems.FRYING_PAN), FcRecipeUids.FRYING) registry.addRecipeCatalyst(ItemStack(FCRItems.MILL), FcRecipeUids.MILLING) + registry.addRecipeCatalyst(ItemStack(FCRItems.PAN), FcRecipeUids.PAN) + registry.addRecipeCatalyst(ItemStack(FCRItems.POT), FcRecipeUids.POT) registry.addRecipeCatalyst(ItemStack(FCRItems.PRESSURE_COOKER), FcRecipeUids.PRESSURE_COOKER) } @@ -48,6 +56,8 @@ class JEIIntegration : IModPlugin { BrewBarrelCategory(registry.jeiHelpers), FryingPanCategory(registry.jeiHelpers), MillCategory(registry.jeiHelpers), + PanCategory(registry.jeiHelpers), + PotCategory(registry.jeiHelpers), PressureCookerCategory(registry.jeiHelpers) ) } diff --git a/src/main/java/com/projecturanus/foodcraft/common/integration/jei/recipes/Pan.kt b/src/main/java/com/projecturanus/foodcraft/common/integration/jei/recipes/Pan.kt new file mode 100644 index 0000000..f8ac39b --- /dev/null +++ b/src/main/java/com/projecturanus/foodcraft/common/integration/jei/recipes/Pan.kt @@ -0,0 +1,57 @@ +package com.projecturanus.foodcraft.common.integration.jei.recipes + +import com.projecturanus.foodcraft.MODID +import com.projecturanus.foodcraft.common.integration.jei.FcRecipeUids +import com.projecturanus.foodcraft.common.recipe.PanRecipe +import mezz.jei.api.IJeiHelpers +import mezz.jei.api.gui.IDrawable +import mezz.jei.api.gui.IDrawableAnimated +import mezz.jei.api.gui.IDrawableStatic +import mezz.jei.api.gui.IRecipeLayout +import mezz.jei.api.ingredients.IIngredients +import mezz.jei.api.ingredients.VanillaTypes +import mezz.jei.api.recipe.IRecipeCategory +import mezz.jei.api.recipe.IRecipeWrapper +import net.minecraft.client.Minecraft +import net.minecraft.client.resources.I18n +import net.minecraft.util.ResourceLocation +import net.minecraftforge.fml.relauncher.Side +import net.minecraftforge.fml.relauncher.SideOnly + +class PanWrapper(val helper: IJeiHelpers, val recipe: PanRecipe): IRecipeWrapper { + override fun getIngredients(ingredients: IIngredients) { + ingredients.setInputLists(VanillaTypes.ITEM, helper.stackHelper.expandRecipeItemStackInputs(recipe.ingredients)) + ingredients.setOutput(VanillaTypes.ITEM, recipe.getRecipeOutput()) + } +} + +class PanCategory(val helper: IJeiHelpers): IRecipeCategory { + val TEXTURES = ResourceLocation(MODID, "textures/gui/jei/pan.png") + + val staticFlame: IDrawableStatic by lazy { helper.guiHelper.createDrawable(TEXTURES, 176, 0, 14, 14) } + val flame: IDrawableAnimated by lazy { helper.guiHelper.createAnimatedDrawable(staticFlame, 300, IDrawableAnimated.StartDirection.TOP, true) } + + val arrow: IDrawableAnimated = helper.guiHelper.drawableBuilder(TEXTURES, 176, 14, 24, 17) + .buildAnimated(200, IDrawableAnimated.StartDirection.LEFT, false) + + override fun getUid(): String = FcRecipeUids.PAN + + override fun getModName(): String = MODID + + override fun setRecipe(recipeLayout: IRecipeLayout, recipeWrapper: PanWrapper, ingredients: IIngredients) { + val stackGroup = recipeLayout.itemStacks + stackGroup.init(0, true, 41 - 12, 35 - 12) + stackGroup.init(1, false, 104 - 12, 35 - 12) + stackGroup.set(ingredients) + } + + override fun drawExtras(minecraft: Minecraft) { + arrow.draw(minecraft, 69 - 12, 36 - 13) + flame.draw(Minecraft.getMinecraft(), 78 - 12, 16 - 13) + } + + override fun getBackground(): IDrawable = helper.guiHelper.createDrawable(TEXTURES, 12, 13, 141, 46) + + @SideOnly(Side.CLIENT) + override fun getTitle(): String = I18n.format("tile.$MODID.pan.name") +} diff --git a/src/main/java/com/projecturanus/foodcraft/common/integration/jei/recipes/Pot.kt b/src/main/java/com/projecturanus/foodcraft/common/integration/jei/recipes/Pot.kt new file mode 100644 index 0000000..2ef1c71 --- /dev/null +++ b/src/main/java/com/projecturanus/foodcraft/common/integration/jei/recipes/Pot.kt @@ -0,0 +1,70 @@ +package com.projecturanus.foodcraft.common.integration.jei.recipes + +import com.projecturanus.foodcraft.MODID +import com.projecturanus.foodcraft.common.integration.jei.FcRecipeUids +import com.projecturanus.foodcraft.common.recipe.PotRecipe +import mezz.jei.api.IJeiHelpers +import mezz.jei.api.gui.IDrawable +import mezz.jei.api.gui.IDrawableAnimated +import mezz.jei.api.gui.IDrawableStatic +import mezz.jei.api.gui.IRecipeLayout +import mezz.jei.api.ingredients.IIngredients +import mezz.jei.api.ingredients.VanillaTypes +import mezz.jei.api.recipe.IRecipeCategory +import mezz.jei.api.recipe.IRecipeWrapper +import net.minecraft.client.Minecraft +import net.minecraft.client.resources.I18n +import net.minecraft.item.crafting.Ingredient +import net.minecraft.util.ResourceLocation +import net.minecraftforge.fml.relauncher.Side +import net.minecraftforge.fml.relauncher.SideOnly + +class PotWrapper(val helper: IJeiHelpers, val recipe: PotRecipe): IRecipeWrapper { + override fun getIngredients(ingredients: IIngredients) { + ingredients.setInputLists(VanillaTypes.ITEM, helper.stackHelper.expandRecipeItemStackInputs(recipe.ingredients) + helper.stackHelper.expandRecipeItemStackInputs(recipe.staples)) + ingredients.setOutput(VanillaTypes.ITEM, recipe.getRecipeOutput()) + } +} + +class PotCategory(val helper: IJeiHelpers): IRecipeCategory { + val TEXTURES = ResourceLocation(MODID, "textures/gui/jei/pot.png") + + val staticFlame: IDrawableStatic by lazy { helper.guiHelper.createDrawable(TEXTURES, 176, 0, 14, 14) } + val flame: IDrawableAnimated by lazy { helper.guiHelper.createAnimatedDrawable(staticFlame, 300, IDrawableAnimated.StartDirection.TOP, true) } + + val arrow: IDrawableAnimated = helper.guiHelper.drawableBuilder(TEXTURES, 177, 18, 20, 9) + .buildAnimated(200, IDrawableAnimated.StartDirection.LEFT, false) + + override fun getUid(): String = FcRecipeUids.POT + + override fun getModName(): String = MODID + + override fun setRecipe(recipeLayout: IRecipeLayout, recipeWrapper: PotWrapper, ingredients: IIngredients) { + val stackGroup = recipeLayout.itemStacks + + for (x in 0 until 4) { + stackGroup.init(x, true, x * 18, 0) + stackGroup.set(x, recipeWrapper.recipe.staples.getOrElse(x) { Ingredient.EMPTY }.matchingStacks.toList()) + } + + for (x in 0 until 8) { + stackGroup.init(x + 4, true, x * 18, 38 - 16) + stackGroup.set(x + 4, recipeWrapper.recipe.ingredients.getOrElse(x) { Ingredient.EMPTY }.matchingStacks.toList()) + } + + for (x in 0 until 2) { + stackGroup.init(x + 12, false, 125 - 17 + x * 18, 0) + } + stackGroup.set(12, recipeWrapper.recipe.getRecipeOutput()) + } + + override fun drawExtras(minecraft: Minecraft) { + arrow.draw(minecraft, 95 - 17, 21 - 16) + flame.draw(Minecraft.getMinecraft(), 82 - 17, 58 - 16) + } + + override fun getBackground(): IDrawable = helper.guiHelper.createDrawable(TEXTURES, 17, 16, 144, 56) + + @SideOnly(Side.CLIENT) + override fun getTitle(): String = I18n.format("tile.$MODID.pot.name") +} diff --git a/src/main/java/com/projecturanus/foodcraft/common/integration/jei/recipes/PressureCooker.kt b/src/main/java/com/projecturanus/foodcraft/common/integration/jei/recipes/PressureCooker.kt index 1afe98a..8252053 100644 --- a/src/main/java/com/projecturanus/foodcraft/common/integration/jei/recipes/PressureCooker.kt +++ b/src/main/java/com/projecturanus/foodcraft/common/integration/jei/recipes/PressureCooker.kt @@ -35,7 +35,7 @@ class PressureCookerCategory(val helper: IJeiHelpers): IRecipeCategory = ChoppingBoardRecipe::class.java } diff --git a/src/main/java/com/projecturanus/foodcraft/common/recipe/PanRecipe.kt b/src/main/java/com/projecturanus/foodcraft/common/recipe/PanRecipe.kt index 7ca1944..84a6e9e 100644 --- a/src/main/java/com/projecturanus/foodcraft/common/recipe/PanRecipe.kt +++ b/src/main/java/com/projecturanus/foodcraft/common/recipe/PanRecipe.kt @@ -23,12 +23,12 @@ class PanRecipe(context: JsonContext, json: JsonObject): DummyRecipe( */ val register by once { PAN_RECIPES.register(this) } - var minTime = 0f - var maxTime = 0f + var minTime = 0 + var maxTime = 0 override fun init() { - minTime = JsonUtils.getFloat(json, "minTime", 0f) - maxTime = JsonUtils.getFloat(json, "maxTime", Float.MAX_VALUE) + minTime = JsonUtils.getInt(json, "minTime", 0) + maxTime = JsonUtils.getInt(json, "maxTime", Int.MAX_VALUE) inputIngredient = CraftingHelper.getIngredient(JsonUtils.getJsonObject(json, "ingredient"), context) output = CraftingHelper.getItemStack(JsonUtils.getJsonObject(json, "result"), context) diff --git a/src/main/java/com/projecturanus/foodcraft/common/recipe/PanRecipeFactory.kt b/src/main/java/com/projecturanus/foodcraft/common/recipe/PanRecipeFactory.kt new file mode 100644 index 0000000..43b3a5d --- /dev/null +++ b/src/main/java/com/projecturanus/foodcraft/common/recipe/PanRecipeFactory.kt @@ -0,0 +1,10 @@ +package com.projecturanus.foodcraft.common.recipe + +import com.google.gson.JsonObject +import net.minecraft.item.crafting.IRecipe +import net.minecraftforge.common.crafting.IRecipeFactory +import net.minecraftforge.common.crafting.JsonContext + +class PanRecipeFactory : IRecipeFactory { + override fun parse(context: JsonContext, json: JsonObject): IRecipe = PanRecipe(context, json).wrapper +} diff --git a/src/main/java/com/projecturanus/foodcraft/common/recipe/PotRecipe.kt b/src/main/java/com/projecturanus/foodcraft/common/recipe/PotRecipe.kt index b17f9be..936e856 100644 --- a/src/main/java/com/projecturanus/foodcraft/common/recipe/PotRecipe.kt +++ b/src/main/java/com/projecturanus/foodcraft/common/recipe/PotRecipe.kt @@ -21,12 +21,12 @@ class PotRecipe(context: JsonContext, json: JsonObject): DummyRecipe( */ val register by once { POT_RECIPES.register(this) } - var minTime = 0f - var maxTime = 0f + var minTime = 0 + var maxTime = 0 override fun init() { - minTime = JsonUtils.getFloat(json, "minTime", 0f) - maxTime = JsonUtils.getFloat(json, "maxTime", Float.MAX_VALUE) + minTime = JsonUtils.getInt(json, "minTime", 0) + maxTime = JsonUtils.getInt(json, "maxTime", Int.MAX_VALUE) ingredients = JsonUtils.getJsonArray(json, "ingredients").map { CraftingHelper.getIngredient(it, context) } @@ -49,7 +49,7 @@ class PotRecipe(context: JsonContext, json: JsonObject): DummyRecipe( return ret } - override fun getRecipeOutput(): ItemStack = recipeOutput + override fun getRecipeOutput(): ItemStack = recipeOutput.copy() override fun getRegistryType(): Class = PotRecipe::class.java } diff --git a/src/main/java/com/projecturanus/foodcraft/common/recipe/PotRecipeFactory.kt b/src/main/java/com/projecturanus/foodcraft/common/recipe/PotRecipeFactory.kt new file mode 100644 index 0000000..3e631e0 --- /dev/null +++ b/src/main/java/com/projecturanus/foodcraft/common/recipe/PotRecipeFactory.kt @@ -0,0 +1,10 @@ +package com.projecturanus.foodcraft.common.recipe + +import com.google.gson.JsonObject +import net.minecraft.item.crafting.IRecipe +import net.minecraftforge.common.crafting.IRecipeFactory +import net.minecraftforge.common.crafting.JsonContext + +class PotRecipeFactory : IRecipeFactory { + override fun parse(context: JsonContext, json: JsonObject): IRecipe = PotRecipe(context, json).wrapper +} diff --git a/src/main/java/com/projecturanus/foodcraft/common/util/MinecraftUtils.kt b/src/main/java/com/projecturanus/foodcraft/common/util/MinecraftUtils.kt index 629cadb..913e942 100644 --- a/src/main/java/com/projecturanus/foodcraft/common/util/MinecraftUtils.kt +++ b/src/main/java/com/projecturanus/foodcraft/common/util/MinecraftUtils.kt @@ -2,9 +2,18 @@ package com.projecturanus.foodcraft.common.util import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.ItemStack +import net.minecraft.item.crafting.Ingredient import net.minecraftforge.items.IItemHandler import net.minecraftforge.items.IItemHandlerModifiable +fun Iterable.containIngredients(ingredients: List) : Boolean { + return ingredients.filter { it != Ingredient.EMPTY }.all { ingredient -> + this.any { ingredient.apply(it) } + } +} + +operator fun IItemHandler.get(range: IntRange) = range.map { get(it) } + operator fun IItemHandler.get(slot: Int) = getStackInSlot(slot) operator fun IItemHandlerModifiable.set(slot: Int, stack: ItemStack) { setStackInSlot(slot, stack) @@ -17,6 +26,8 @@ fun IItemHandlerModifiable.shrink(slot: Int, amount: Int = 1) { } else { get(slot).shrink(amount) } + if (get(slot).isEmpty && get(slot) != ItemStack.EMPTY) + set(slot, ItemStack.EMPTY) } fun IItemHandlerModifiable.shrinkWithInv(slot: Int, player: EntityPlayer, amount: Int = 1) { diff --git a/src/main/java/com/projecturanus/foodcraft/common/util/observable/ObservableItemHandler.kt b/src/main/java/com/projecturanus/foodcraft/common/util/observable/ObservableItemHandler.kt deleted file mode 100644 index d1dbfc2..0000000 --- a/src/main/java/com/projecturanus/foodcraft/common/util/observable/ObservableItemHandler.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.projecturanus.foodcraft.common.util.observable - -import net.minecraft.item.ItemStack -import net.minecraft.util.NonNullList -import net.minecraftforge.items.ItemStackHandler -import org.cyclops.commoncapabilities.api.capability.inventorystate.IInventoryState - -class ObservableItemHandler : ItemStackHandler, IInventoryState { - val loadListener: MutableList<() -> Unit> = mutableListOf() - val contentChangedListener: MutableList<(Int) -> Unit> = mutableListOf() - var hashInternal: Int = 0 - var validation: ((Int, ItemStack) -> Boolean)? = null - - constructor() : super() - constructor(size: Int) : super(size) - constructor(stacks: NonNullList?) : super(stacks) - - override fun onLoad() { - loadListener.forEach { it() } - } - - override fun onContentsChanged(slot: Int) { - contentChangedListener.forEach { it(slot) } - hashInternal++ - } - - override fun getHash(): Int = hashInternal - override fun isItemValid(slot: Int, stack: ItemStack): Boolean { - return validation?.invoke(slot, stack) ?: true - } -} diff --git a/src/main/resources/assets/foodcraftreloaded/textures/items/Itemfan.png b/src/main/resources/assets/foodcraftreloaded/textures/items/Itemfan.png new file mode 100644 index 0000000..c9ca186 Binary files /dev/null and b/src/main/resources/assets/foodcraftreloaded/textures/items/Itemfan.png differ