From c6a646d2a66cdf2af65666f3a7e1afa9a4b2d67d Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Sat, 14 Jan 2017 21:56:21 -0500 Subject: [PATCH] Wooden Fluid Hopper Closes #8 --- .../net/shadowfacts/extrahoppers/EHConfig.kt | 6 ++- .../shadowfacts/extrahoppers/ExtraHoppers.kt | 6 +++ .../extrahoppers/block/ModBlocks.kt | 3 ++ .../block/fluid/BlockFluidHopper.kt | 9 ++-- .../block/fluid/TileEntityFluidHopper.kt | 30 ++++++++--- .../wooden_fluid/BlockWoodenFluidHopper.kt | 50 ++++++++++++++++++ .../wooden_fluid/GUIWoodenFluidHopper.kt | 52 +++++++++++++++++++ .../TileEntityWoodenFluidHopper.kt | 13 +++++ .../extrahoppers/event/ClientEventHandler.kt | 32 ++++++++++++ .../extrahoppers/gui/GUIHandler.kt | 7 ++- .../blockstates/wooden_fluid_hopper.json | 37 +++++++++++++ .../assets/extrahoppers/lang/en_US.lang | 3 ++ 12 files changed, 233 insertions(+), 15 deletions(-) create mode 100644 src/main/kotlin/net/shadowfacts/extrahoppers/block/wooden_fluid/BlockWoodenFluidHopper.kt create mode 100644 src/main/kotlin/net/shadowfacts/extrahoppers/block/wooden_fluid/GUIWoodenFluidHopper.kt create mode 100644 src/main/kotlin/net/shadowfacts/extrahoppers/block/wooden_fluid/TileEntityWoodenFluidHopper.kt create mode 100644 src/main/kotlin/net/shadowfacts/extrahoppers/event/ClientEventHandler.kt create mode 100644 src/main/resources/assets/extrahoppers/blockstates/wooden_fluid_hopper.json diff --git a/src/main/kotlin/net/shadowfacts/extrahoppers/EHConfig.kt b/src/main/kotlin/net/shadowfacts/extrahoppers/EHConfig.kt index a4c10cd..32ec9c9 100644 --- a/src/main/kotlin/net/shadowfacts/extrahoppers/EHConfig.kt +++ b/src/main/kotlin/net/shadowfacts/extrahoppers/EHConfig.kt @@ -17,9 +17,11 @@ object EHConfig { // Fluid Hopper var fhSize: Int by ConfigInt("fluidHopper", "size", 1000, 1000, 64000, "The size (in millibuckets) of the Fluid Hopper") - var fhPickupWorldFluids: Boolean by ConfigBool("fluidHopper", "fhPickupWorldFluids", true, "If the Fluid Hopper should pickup fluids placed in the world directly above it.") + var fhPickupWorldFluids: Boolean by ConfigBool("fluidHopper", "pickupWorldFluids", true, "If the Fluid Hopper should pickup fluids placed in the world directly above it.") - var fhPlaceFluidsInWorld: Boolean by ConfigBool("fluidHopper", "fhPlaceFluidsInWorld", true, "If the Fluid Hopper should place fluids in the world directly in front of it.") + var fhPlaceFluidsInWorld: Boolean by ConfigBool("fluidHopper", "placeFluidsInWorld", true, "If the Fluid Hopper should place fluids in the world directly in front of it.") + + var wfhMaxTemperature: Int by ConfigInt("woodenFluidHopper", "maxTemperature", 400, 0, Integer.MAX_VALUE, "The maximum temperature (in Kelvin) of the fluid that can be help by the Wooden Fluid Hopper.") fun init(configDir: File) { config = Configuration(File(configDir, "shadowfacts/ExtraHoppers.cfg")) diff --git a/src/main/kotlin/net/shadowfacts/extrahoppers/ExtraHoppers.kt b/src/main/kotlin/net/shadowfacts/extrahoppers/ExtraHoppers.kt index 653b04e..0a0ec36 100644 --- a/src/main/kotlin/net/shadowfacts/extrahoppers/ExtraHoppers.kt +++ b/src/main/kotlin/net/shadowfacts/extrahoppers/ExtraHoppers.kt @@ -1,6 +1,7 @@ package net.shadowfacts.extrahoppers import net.minecraft.item.Item +import net.minecraftforge.common.MinecraftForge import net.minecraftforge.fml.client.registry.ClientRegistry import net.minecraftforge.fml.common.Mod import net.minecraftforge.fml.common.event.FMLMissingMappingsEvent @@ -12,6 +13,8 @@ import net.minecraftforge.fml.relauncher.SideOnly import net.shadowfacts.extrahoppers.block.ModBlocks import net.shadowfacts.extrahoppers.block.fluid.TileEntityFluidHopper import net.shadowfacts.extrahoppers.block.fluid.TESRFluidHopper +import net.shadowfacts.extrahoppers.block.wooden_fluid.TileEntityWoodenFluidHopper +import net.shadowfacts.extrahoppers.event.ClientEventHandler import net.shadowfacts.extrahoppers.gui.GUIHandler /** @@ -39,6 +42,9 @@ object ExtraHoppers { @SideOnly(Side.CLIENT) fun preInitClient(event: FMLPreInitializationEvent) { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFluidHopper::class.java, TESRFluidHopper) + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityWoodenFluidHopper::class.java, TESRFluidHopper) + + MinecraftForge.EVENT_BUS.register(ClientEventHandler) } @Mod.EventHandler diff --git a/src/main/kotlin/net/shadowfacts/extrahoppers/block/ModBlocks.kt b/src/main/kotlin/net/shadowfacts/extrahoppers/block/ModBlocks.kt index 03d0fe9..aebd8c0 100644 --- a/src/main/kotlin/net/shadowfacts/extrahoppers/block/ModBlocks.kt +++ b/src/main/kotlin/net/shadowfacts/extrahoppers/block/ModBlocks.kt @@ -3,6 +3,7 @@ package net.shadowfacts.extrahoppers.block import net.minecraft.block.Block import net.shadowfacts.extrahoppers.block.fluid.BlockFluidHopper import net.shadowfacts.extrahoppers.block.wooden.BlockWoodenHopper +import net.shadowfacts.extrahoppers.block.wooden_fluid.BlockWoodenFluidHopper import net.shadowfacts.shadowmc.block.ModBlocks /** @@ -12,10 +13,12 @@ object ModBlocks: ModBlocks() { val fluidHopper = BlockFluidHopper() val woodenHopper = BlockWoodenHopper() + val woodenFluidHopper = BlockWoodenFluidHopper() override fun init() { register(fluidHopper) register(woodenHopper) + register(woodenFluidHopper) } override fun register(block: T): T { diff --git a/src/main/kotlin/net/shadowfacts/extrahoppers/block/fluid/BlockFluidHopper.kt b/src/main/kotlin/net/shadowfacts/extrahoppers/block/fluid/BlockFluidHopper.kt index f30b27e..78b00e9 100644 --- a/src/main/kotlin/net/shadowfacts/extrahoppers/block/fluid/BlockFluidHopper.kt +++ b/src/main/kotlin/net/shadowfacts/extrahoppers/block/fluid/BlockFluidHopper.kt @@ -11,7 +11,7 @@ import net.minecraft.util.EnumHand import net.minecraft.util.math.BlockPos import net.minecraft.world.World import net.minecraftforge.fluids.FluidUtil -import net.minecraftforge.fluids.capability.CapabilityFluidHandler +import net.minecraftforge.fluids.capability.CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY import net.minecraftforge.fml.common.registry.GameRegistry import net.shadowfacts.extrahoppers.ExtraHoppers import net.shadowfacts.extrahoppers.block.base.BlockHopperBase @@ -20,7 +20,7 @@ import net.shadowfacts.extrahoppers.gui.GUIHandler /** * @author shadowfacts */ -class BlockFluidHopper: BlockHopperBase("fluid_hopper", material = Material.IRON) { +open class BlockFluidHopper(name: String = "fluid_hopper", material: Material = Material.IRON): BlockHopperBase(name, material = material) { init { setHardness(3.5f) @@ -34,14 +34,13 @@ class BlockFluidHopper: BlockHopperBase("fluid_hopper", m } else { val te = getTileEntity(world, pos) val stack = player.getHeldItem(hand) - val result = FluidUtil.interactWithFluidHandler(stack, te.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, EnumFacing.NORTH), player) + val result = FluidUtil.interactWithFluidHandler(stack, te.getCapability(FLUID_HANDLER_CAPABILITY, EnumFacing.NORTH), player) if (result.isSuccess) { player.setHeldItem(hand, result.getResult()) te.save() - return true } } - return false + return true } override fun addInformation(stack: ItemStack, player: EntityPlayer, tooltip: MutableList, advanced: Boolean) { diff --git a/src/main/kotlin/net/shadowfacts/extrahoppers/block/fluid/TileEntityFluidHopper.kt b/src/main/kotlin/net/shadowfacts/extrahoppers/block/fluid/TileEntityFluidHopper.kt index 726773e..3486436 100644 --- a/src/main/kotlin/net/shadowfacts/extrahoppers/block/fluid/TileEntityFluidHopper.kt +++ b/src/main/kotlin/net/shadowfacts/extrahoppers/block/fluid/TileEntityFluidHopper.kt @@ -4,7 +4,11 @@ import net.minecraft.block.BlockLiquid import net.minecraft.nbt.NBTTagCompound import net.minecraft.util.EnumFacing import net.minecraft.util.ITickable +import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.fluids.Fluid.BUCKET_VOLUME +import net.minecraftforge.fluids.FluidStack +import net.minecraftforge.fluids.FluidTank +import net.minecraftforge.fluids.capability.CapabilityFluidHandler import net.minecraftforge.fluids.capability.CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY import net.minecraftforge.fluids.capability.IFluidHandler import net.minecraftforge.fml.common.network.NetworkRegistry @@ -13,24 +17,26 @@ import net.shadowfacts.extrahoppers.EHConfig import net.shadowfacts.extrahoppers.block.base.TileEntityHopperBase import net.shadowfacts.shadowmc.ShadowMC import net.shadowfacts.shadowmc.capability.CapHolder -import net.shadowfacts.shadowmc.fluid.FluidTank -import net.shadowfacts.shadowmc.nbt.AutoSerializeNBT import net.shadowfacts.shadowmc.network.PacketRequestTEUpdate import net.shadowfacts.shadowmc.network.PacketUpdateTE /** * @author shadowfacts */ -class TileEntityFluidHopper: TileEntityHopperBase(), ITickable { +open class TileEntityFluidHopper: TileEntityHopperBase(), ITickable { companion object { val HANDLER_COOLDOWN = 8 val WORLD_COOLDOWN = 40 } - @AutoSerializeNBT - @CapHolder(capabilities = arrayOf(IFluidHandler::class)) - internal var tank = FluidTank(EHConfig.fhSize) + internal var tank = object: FluidTank(EHConfig.fhSize) { + override fun canFillFluidType(fluid: FluidStack): Boolean { + return fluidValiator(fluid) + } + } + + protected open val fluidValiator: (FluidStack) -> Boolean = { true } private var handlerCooldown: Int = HANDLER_COOLDOWN private var worldCooldown: Int = WORLD_COOLDOWN @@ -112,7 +118,7 @@ class TileEntityFluidHopper: TileEntityHopperBase(), ITickable { if (EHConfig.fhPickupWorldFluids && tank.fluidAmount <= tank.capacity - BUCKET_VOLUME) { if (FluidUtils.isFluidBlock(world, pos.up())) { val toDrain = FluidUtils.drainFluidBlock(world, pos.up(), false)!! - if (toDrain.amount <= tank.capacity - tank.fluidAmount) { + if (toDrain.amount <= tank.capacity - tank.fluidAmount && tank.fill(toDrain, false) === 1000) { tank.fill(FluidUtils.drainFluidBlock(world, pos.up(), true), true) return true } @@ -153,4 +159,14 @@ class TileEntityFluidHopper: TileEntityHopperBase(), ITickable { super.readFromNBT(tag) } + override fun hasCapability(capability: Capability<*>, facing: EnumFacing?): Boolean { + if (capability == FLUID_HANDLER_CAPABILITY) return true + else return super.hasCapability(capability, facing) + } + + override fun getCapability(capability: Capability, facing: EnumFacing?): T? { + if (capability == FLUID_HANDLER_CAPABILITY) return tank as T + else return super.getCapability(capability, facing) + } + } diff --git a/src/main/kotlin/net/shadowfacts/extrahoppers/block/wooden_fluid/BlockWoodenFluidHopper.kt b/src/main/kotlin/net/shadowfacts/extrahoppers/block/wooden_fluid/BlockWoodenFluidHopper.kt new file mode 100644 index 0000000..6becb0c --- /dev/null +++ b/src/main/kotlin/net/shadowfacts/extrahoppers/block/wooden_fluid/BlockWoodenFluidHopper.kt @@ -0,0 +1,50 @@ +package net.shadowfacts.extrahoppers.block.wooden_fluid + +import net.minecraft.block.SoundType +import net.minecraft.block.material.Material +import net.minecraft.block.state.IBlockState +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.item.ItemStack +import net.minecraft.util.EnumFacing +import net.minecraft.util.EnumHand +import net.minecraft.util.math.BlockPos +import net.minecraft.world.World +import net.minecraftforge.fml.common.registry.GameRegistry +import net.shadowfacts.extrahoppers.ExtraHoppers +import net.shadowfacts.extrahoppers.block.fluid.BlockFluidHopper +import net.shadowfacts.extrahoppers.block.fluid.TileEntityFluidHopper +import net.shadowfacts.extrahoppers.gui.GUIHandler + +/** + * @author shadowfacts + */ +class BlockWoodenFluidHopper: BlockFluidHopper(name = "wooden_fluid_hopper", material = Material.WOOD) { + + init { + setHardness(1.5f) + setResistance(4f) + soundType = SoundType.WOOD + } + + override fun onBlockActivated(world: World, pos: BlockPos, state: IBlockState, player: EntityPlayer, hand: EnumHand, side: EnumFacing, hitX: Float, hitY: Float, hitZ: Float): Boolean { + if (player.isSneaking) { + GUIHandler.woodenFluidHopperOpen = true + player.openGui(ExtraHoppers, GUIHandler.WOODEN_FLUID_HOPPER, world, pos.x, pos.y, pos.z) + return true + } else { + return super.onBlockActivated(world, pos, state, player, hand, side, hitX, hitY, hitZ) + } + } + + override fun registerTileEntity() { + GameRegistry.registerTileEntity(TileEntityWoodenFluidHopper::class.java, registryName.toString()) + } + + override fun addInformation(stack: ItemStack, player: EntityPlayer, tooltip: MutableList, advanced: Boolean) { + } + + override fun createTileEntity(world: World, state: IBlockState): TileEntityFluidHopper { + return TileEntityWoodenFluidHopper() + } + +} \ No newline at end of file diff --git a/src/main/kotlin/net/shadowfacts/extrahoppers/block/wooden_fluid/GUIWoodenFluidHopper.kt b/src/main/kotlin/net/shadowfacts/extrahoppers/block/wooden_fluid/GUIWoodenFluidHopper.kt new file mode 100644 index 0000000..349af94 --- /dev/null +++ b/src/main/kotlin/net/shadowfacts/extrahoppers/block/wooden_fluid/GUIWoodenFluidHopper.kt @@ -0,0 +1,52 @@ +package net.shadowfacts.extrahoppers.block.wooden_fluid + +import net.minecraft.client.gui.inventory.GuiContainer +import net.minecraft.inventory.Container +import net.minecraft.util.ResourceLocation +import net.shadowfacts.extrahoppers.MOD_ID +import net.shadowfacts.extrahoppers.block.fluid.TileEntityFluidHopper +import net.shadowfacts.extrahoppers.gui.GUIHandler +import net.shadowfacts.extrahoppers.gui.element.UIFluidIndicator +import net.shadowfacts.shadowmc.ui.dsl.* + +/** + * @author shadowfacts + */ +object GUIWoodenFluidHopper { + + private val BG = ResourceLocation("shadowmc", "textures/gui/blank.png") + + fun create(hopper: TileEntityFluidHopper, container: Container): GuiContainer { + return container(container) { + fixed { + id = "root" + width = 176 + height = 166 + + image { + id = "bg" + width = 176 + height = 166 + texture = BG + } + + fixed { + id = "top" + width = 176 + height = 166 / 2 + + add(UIFluidIndicator(hopper.tank, "fluidIndicator")) + } + } + + style("$MOD_ID:fluid_hopper") + updateHandler { + GUIHandler.woodenFluidHopperOpen = true + } + closeHandler { + GUIHandler.woodenFluidHopperOpen = false + } + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/net/shadowfacts/extrahoppers/block/wooden_fluid/TileEntityWoodenFluidHopper.kt b/src/main/kotlin/net/shadowfacts/extrahoppers/block/wooden_fluid/TileEntityWoodenFluidHopper.kt new file mode 100644 index 0000000..721ca5b --- /dev/null +++ b/src/main/kotlin/net/shadowfacts/extrahoppers/block/wooden_fluid/TileEntityWoodenFluidHopper.kt @@ -0,0 +1,13 @@ +package net.shadowfacts.extrahoppers.block.wooden_fluid + +import net.minecraftforge.fluids.FluidStack +import net.shadowfacts.extrahoppers.EHConfig +import net.shadowfacts.extrahoppers.block.fluid.TileEntityFluidHopper + +/** + * @author shadowfacts + */ +class TileEntityWoodenFluidHopper: TileEntityFluidHopper() { + + override val fluidValiator: (FluidStack) -> Boolean = { it.fluid.temperature <= EHConfig.wfhMaxTemperature } +} \ No newline at end of file diff --git a/src/main/kotlin/net/shadowfacts/extrahoppers/event/ClientEventHandler.kt b/src/main/kotlin/net/shadowfacts/extrahoppers/event/ClientEventHandler.kt new file mode 100644 index 0000000..9e008ba --- /dev/null +++ b/src/main/kotlin/net/shadowfacts/extrahoppers/event/ClientEventHandler.kt @@ -0,0 +1,32 @@ +package net.shadowfacts.extrahoppers.event + +import net.minecraft.client.resources.I18n +import net.minecraft.util.text.TextFormatting +import net.minecraftforge.event.entity.player.ItemTooltipEvent +import net.minecraftforge.fluids.capability.CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import net.shadowfacts.extrahoppers.EHConfig +import net.shadowfacts.extrahoppers.gui.GUIHandler + +/** + * @author shadowfacts + */ +object ClientEventHandler { + + @SubscribeEvent + fun itemTooltip(event: ItemTooltipEvent) { + if (GUIHandler.woodenFluidHopperOpen) { + val stack = event.itemStack + if (stack.hasCapability(FLUID_HANDLER_ITEM_CAPABILITY, null)) { + val handler = stack.getCapability(FLUID_HANDLER_ITEM_CAPABILITY, null)!! + val props = handler.tankProperties + val fluid = props[0].contents + if (fluid != null) { + val color = if (fluid.fluid.temperature <= EHConfig.wfhMaxTemperature) TextFormatting.GREEN else TextFormatting.RED + event.toolTip.add(I18n.format("extrahoppers.wooden_fluid_hopper.temperature", color, fluid.fluid.temperature)) + } + } + } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/net/shadowfacts/extrahoppers/gui/GUIHandler.kt b/src/main/kotlin/net/shadowfacts/extrahoppers/gui/GUIHandler.kt index 833cfde..b661a1d 100644 --- a/src/main/kotlin/net/shadowfacts/extrahoppers/gui/GUIHandler.kt +++ b/src/main/kotlin/net/shadowfacts/extrahoppers/gui/GUIHandler.kt @@ -10,6 +10,7 @@ import net.shadowfacts.extrahoppers.block.fluid.TileEntityFluidHopper import net.shadowfacts.extrahoppers.block.wooden.ContainerWoodenHopper import net.shadowfacts.extrahoppers.block.wooden.GUIWoodenHopper import net.shadowfacts.extrahoppers.block.wooden.TileEntityWoodenHopper +import net.shadowfacts.extrahoppers.block.wooden_fluid.GUIWoodenFluidHopper import net.shadowfacts.shadowmc.inventory.ContainerPlayerInv /** @@ -19,12 +20,16 @@ object GUIHandler: IGuiHandler { val FLUID_HOPPER = 0 val WOODEN_HOPPER = 1 + val WOODEN_FLUID_HOPPER = 2 + + var woodenFluidHopperOpen = false override fun getClientGuiElement(ID: Int, player: EntityPlayer, world: World, x: Int, y: Int, z: Int): Any? { val pos = BlockPos(x, y, z) return when (ID) { FLUID_HOPPER -> GUIFluidHopper.create(world.getTileEntity(pos) as TileEntityFluidHopper, getServerGuiElement(ID, player, world, x, y, z)!!) WOODEN_HOPPER -> GUIWoodenHopper(getServerGuiElement(ID, player, world, x, y, z)!!) + WOODEN_FLUID_HOPPER -> GUIWoodenFluidHopper.create(world.getTileEntity(pos) as TileEntityFluidHopper, getServerGuiElement(ID, player, world, x, y, z)!!) else -> null } } @@ -32,7 +37,7 @@ object GUIHandler: IGuiHandler { override fun getServerGuiElement(ID: Int, player: EntityPlayer, world: World, x: Int, y: Int, z: Int): Container? { val pos = BlockPos(x, y, z) return when (ID) { - FLUID_HOPPER -> ContainerPlayerInv(pos, player.inventory) + FLUID_HOPPER, WOODEN_FLUID_HOPPER -> ContainerPlayerInv(pos, player.inventory) WOODEN_HOPPER -> ContainerWoodenHopper(world.getTileEntity(pos) as TileEntityWoodenHopper, player.inventory, pos) else -> null } diff --git a/src/main/resources/assets/extrahoppers/blockstates/wooden_fluid_hopper.json b/src/main/resources/assets/extrahoppers/blockstates/wooden_fluid_hopper.json new file mode 100644 index 0000000..e83c9e5 --- /dev/null +++ b/src/main/resources/assets/extrahoppers/blockstates/wooden_fluid_hopper.json @@ -0,0 +1,37 @@ +{ + "forge_marker": 1, + "defaults": { + "textures": { + "particle": "blocks/planks_oak", + "top": "blocks/planks_oak", + "side": "blocks/planks_oak", + "inside": "blocks/planks_oak" + } + }, + "variants": { + "inventory": { + "model": "hopper_down", + "transform": "forge:default-block" + }, + "facing": { + "down": { + "model": "hopper_down" + }, + "north": { + "model": "hopper_side" + }, + "south": { + "model": "hopper_side", + "y": 180 + }, + "west": { + "model": "hopper_side", + "y": 270 + }, + "east": { + "model": "hopper_side", + "y": 90 + } + } + } +} diff --git a/src/main/resources/assets/extrahoppers/lang/en_US.lang b/src/main/resources/assets/extrahoppers/lang/en_US.lang index d8cbb0d..836ef65 100644 --- a/src/main/resources/assets/extrahoppers/lang/en_US.lang +++ b/src/main/resources/assets/extrahoppers/lang/en_US.lang @@ -1,6 +1,9 @@ tile.extrahoppers:fluid_hopper.name=Fluid Hopper tile.extrahoppers:fluid_hopper.tooltip=Formerly the Funnel tile.extrahoppers:wooden_hopper.name=Wooden Hopper +tile.extrahoppers:wooden_fluid_hopper.name=Wooden Fluid Hopper + +extrahoppers.wooden_fluid_hopper.temperature=Temperature: %s%dK extrahoppers.config.gui.title=Extra Hoppers Config extrahoppers.config.gui.category.general=General \ No newline at end of file