diff --git a/src/main/kotlin/net/shadowfacts/extrahoppers/ExtraHoppers.kt b/src/main/kotlin/net/shadowfacts/extrahoppers/ExtraHoppers.kt index 36d4012..fa224b1 100644 --- a/src/main/kotlin/net/shadowfacts/extrahoppers/ExtraHoppers.kt +++ b/src/main/kotlin/net/shadowfacts/extrahoppers/ExtraHoppers.kt @@ -9,6 +9,7 @@ import net.minecraftforge.fml.common.Mod import net.minecraftforge.fml.common.event.FMLPreInitializationEvent import net.minecraftforge.fml.common.eventhandler.SubscribeEvent import net.minecraftforge.fml.common.network.NetworkRegistry +import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper import net.minecraftforge.fml.common.registry.GameRegistry import net.minecraftforge.fml.relauncher.Side import net.minecraftforge.fml.relauncher.SideOnly @@ -20,6 +21,8 @@ import net.shadowfacts.extrahoppers.block.inverted.TileEntityInvertedHopper import net.shadowfacts.extrahoppers.block.wooden.TileEntityWoodenHopper import net.shadowfacts.extrahoppers.block.wooden_fluid.TileEntityWoodenFluidHopper import net.shadowfacts.extrahoppers.gui.GUIHandler +import net.shadowfacts.extrahoppers.network.PacketSetHopperFilterMode +import net.shadowfacts.extrahoppers.network.PacketSetHopperRedstoneMode /** * @author shadowfacts @@ -27,6 +30,8 @@ import net.shadowfacts.extrahoppers.gui.GUIHandler @Mod(modid = MOD_ID, name = NAME, version = VERSION, dependencies = "required-after:shadowmc;", modLanguageAdapter = "net.shadowfacts.forgelin.KotlinAdapter", guiFactory = "net.shadowfacts.extrahoppers.gui.EHGUIFactory") object ExtraHoppers { + lateinit var network: SimpleNetworkWrapper private set + // Content val blocks = ModBlocks @@ -36,6 +41,9 @@ object ExtraHoppers { EHConfig.save() NetworkRegistry.INSTANCE.registerGuiHandler(ExtraHoppers, GUIHandler) + network = NetworkRegistry.INSTANCE.newSimpleChannel(MOD_ID) + network.registerMessage(PacketSetHopperRedstoneMode.Handler, PacketSetHopperRedstoneMode::class.java, 0, Side.SERVER) + network.registerMessage(PacketSetHopperFilterMode.Handler, PacketSetHopperFilterMode::class.java, 1, Side.SERVER) } @Mod.EventHandler diff --git a/src/main/kotlin/net/shadowfacts/extrahoppers/block/inventory/GUIInventoryHopper.kt b/src/main/kotlin/net/shadowfacts/extrahoppers/block/inventory/GUIInventoryHopper.kt index 1c9e5b8..c82885f 100644 --- a/src/main/kotlin/net/shadowfacts/extrahoppers/block/inventory/GUIInventoryHopper.kt +++ b/src/main/kotlin/net/shadowfacts/extrahoppers/block/inventory/GUIInventoryHopper.kt @@ -3,8 +3,12 @@ package net.shadowfacts.extrahoppers.block.inventory import net.minecraft.inventory.Container import net.minecraft.inventory.Slot import net.minecraft.util.ResourceLocation +import net.shadowfacts.extrahoppers.ExtraHoppers import net.shadowfacts.extrahoppers.MOD_ID +import net.shadowfacts.extrahoppers.block.advanced.TileEntityAdvancedHopper import net.shadowfacts.extrahoppers.gui.element.UIFilterButton +import net.shadowfacts.extrahoppers.network.PacketSetHopperFilterMode +import net.shadowfacts.extrahoppers.network.PacketSetHopperRedstoneMode import net.shadowfacts.extrahoppers.util.filter.FilterMode import net.shadowfacts.extrahoppers.util.filter.ItemFilter import net.shadowfacts.shadowmc.ui.element.UIRect @@ -33,7 +37,7 @@ class GUIInventoryHopper(container: Container, tile: TileEntityInventoryHopper): add(UIFixedView(176 + 83 * 2, 133, "root").apply { add(UIImage(BG, 176, 133, "bg")) - if (tile.advanced) { + if (tile.advanced && tile is TileEntityAdvancedHopper) { add(UIFixedView(176, 60, "top").apply { add(UIFilterButton({ // TODO @@ -41,7 +45,7 @@ class GUIInventoryHopper(container: Container, tile: TileEntityInventoryHopper): add(UIButtonRedstoneMode(tile.mode, Consumer { tile.mode = it - tile.sync() + ExtraHoppers.network.sendToServer(PacketSetHopperRedstoneMode(tile)) }, "mode")) }) @@ -60,7 +64,7 @@ class GUIInventoryHopper(container: Container, tile: TileEntityInventoryHopper): add(UIFixedView(83, 34, "filter-bottom").apply { add(UIButtonEnum(tile.filterMode, Function(FilterMode::localize), Consumer { tile.filterMode = it.value - tile.sync() + ExtraHoppers.network.sendToServer(PacketSetHopperFilterMode(tile)) }, "filter-mode")) }) }) diff --git a/src/main/kotlin/net/shadowfacts/extrahoppers/block/inventory/TileEntityInventoryHopper.kt b/src/main/kotlin/net/shadowfacts/extrahoppers/block/inventory/TileEntityInventoryHopper.kt index 599b36d..e9ef5b8 100644 --- a/src/main/kotlin/net/shadowfacts/extrahoppers/block/inventory/TileEntityInventoryHopper.kt +++ b/src/main/kotlin/net/shadowfacts/extrahoppers/block/inventory/TileEntityInventoryHopper.kt @@ -72,52 +72,6 @@ abstract class TileEntityInventoryHopper(inverted: Boolean, advanced: Boolean, s } } - private fun push(): Boolean { - if (!inventory.isEmpty) { - val facing = getHopperFacing() - val tile = world.getTileEntity(pos.offset(facing)) - - if (tile is ISidedInventory) { - val slots = tile.getSlotsForFace(facing.opposite) - for (i in slots) { - for (slot in 0.until(inventory.slots)) { - if (inventory[slot].isEmpty) continue - val remainder = tile.insert(inventory.extractItem(slot, 1, true), i) - if (remainder.isEmpty) { - inventory.extractItem(slot, 1, false) - return true - } - } - } - } else if (tile is IInventory) { - for (i in 0.until(tile.sizeInventory)) { - for (slot in 0.until(inventory.slots)) { - if (inventory[slot].isEmpty) continue - val remainder = tile.insert(inventory.extractItem(slot, 1, true), i) - if (remainder.isEmpty) { - inventory.extractItem(slot, 1, false) - return true - } - } - } - } else if (tile != null && tile.hasCapability(ITEM_HANDLER_CAPABILITY, facing.opposite)) { - val handler = tile.getCapability(ITEM_HANDLER_CAPABILITY, facing.opposite)!! - for (i in 0.until(handler.slots)) { - for (slot in 0.until(inventory.slots)) { - if (inventory[slot].isEmpty) continue - val remainder = handler.insertItem(i, inventory.extractItem(slot, 1, true), false) - if (remainder.isEmpty) { - inventory.extractItem(slot, 1, false) - return true - } - } - } - } - } - - return false - } - private fun pull(): Boolean { val items = world.getEntitiesWithinAABB(EntityItem::class.java, box) for (item in items) { @@ -175,7 +129,7 @@ abstract class TileEntityInventoryHopper(inverted: Boolean, advanced: Boolean, s for (i in 0.until(handler.slots)) { for (slot in 0.until(inventory.slots)) { val remainder = inventory.insertItem(slot, handler.extractItem(i, 1, true), false) - if (remainder.isEmpty()) { + if (remainder.isEmpty) { handler.extractItem(i, 1, false) return true } @@ -186,6 +140,52 @@ abstract class TileEntityInventoryHopper(inverted: Boolean, advanced: Boolean, s return false } + private fun push(): Boolean { + if (!inventory.isEmpty) { + val facing = getHopperFacing() + val tile = world.getTileEntity(pos.offset(facing)) + + if (tile is ISidedInventory) { + val slots = tile.getSlotsForFace(facing.opposite) + for (i in slots) { + for (slot in 0.until(inventory.slots)) { + if (inventory[slot].isEmpty) continue + val remainder = tile.insert(inventory.extractItem(slot, 1, true), i) + if (remainder.isEmpty) { + inventory.extractItem(slot, 1, false) + return true + } + } + } + } else if (tile is IInventory) { + for (i in 0.until(tile.sizeInventory)) { + for (slot in 0.until(inventory.slots)) { + if (inventory[slot].isEmpty) continue + val remainder = tile.insert(inventory.extractItem(slot, 1, true), i) + if (remainder.isEmpty) { + inventory.extractItem(slot, 1, false) + return true + } + } + } + } else if (tile != null && tile.hasCapability(ITEM_HANDLER_CAPABILITY, facing.opposite)) { + val handler = tile.getCapability(ITEM_HANDLER_CAPABILITY, facing.opposite)!! + for (i in 0.until(handler.slots)) { + for (slot in 0.until(inventory.slots)) { + if (inventory[slot].isEmpty) continue + val remainder = handler.insertItem(i, inventory.extractItem(slot, 1, true), false) + if (remainder.isEmpty) { + inventory.extractItem(slot, 1, false) + return true + } + } + } + } + } + + return false + } + override fun hasCapability(capability: Capability<*>, facing: EnumFacing?): Boolean { if (capability == ITEM_HANDLER_CAPABILITY) { val side = if (inverted) EnumFacing.DOWN else EnumFacing.UP diff --git a/src/main/kotlin/net/shadowfacts/extrahoppers/network/PacketSetHopperFilterMode.kt b/src/main/kotlin/net/shadowfacts/extrahoppers/network/PacketSetHopperFilterMode.kt new file mode 100644 index 0000000..c8c85a9 --- /dev/null +++ b/src/main/kotlin/net/shadowfacts/extrahoppers/network/PacketSetHopperFilterMode.kt @@ -0,0 +1,55 @@ +package net.shadowfacts.extrahoppers.network + +import io.netty.buffer.ByteBuf +import net.minecraft.util.math.BlockPos +import net.minecraftforge.fml.common.FMLCommonHandler +import net.minecraftforge.fml.common.network.simpleimpl.IMessage +import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext +import net.shadowfacts.extrahoppers.block.advanced.TileEntityAdvancedHopper +import net.shadowfacts.extrahoppers.util.filter.FilterMode + +/** + * @author shadowfacts + */ +class PacketSetHopperFilterMode(): IMessage { + + var dim: Int = 0 + lateinit var pos: BlockPos + lateinit var mode: FilterMode + + constructor(dim: Int, pos: BlockPos, mode: FilterMode): this() { + this.dim = dim + this.pos = pos + this.mode = mode + } + + constructor(tile: TileEntityAdvancedHopper): this(tile.world.provider.dimension, tile.pos, tile.filterMode) + + override fun toBytes(buf: ByteBuf) { + buf.writeInt(dim) + buf.writeLong(pos.toLong()) + buf.writeInt(mode.ordinal) + } + + override fun fromBytes(buf: ByteBuf) { + dim = buf.readInt() + pos = BlockPos.fromLong(buf.readLong()) + mode = FilterMode.values()[buf.readInt()] + } + + object Handler: IMessageHandler { + + override fun onMessage(message: PacketSetHopperFilterMode, ctx: MessageContext): IMessage? { + val world = FMLCommonHandler.instance().minecraftServerInstance.getWorld(message.dim) + val tile = world.getTileEntity(message.pos) + if (tile is TileEntityAdvancedHopper) { + tile.filterMode = message.mode + tile.markDirty() + } + return null + } + + } + +} \ No newline at end of file diff --git a/src/main/kotlin/net/shadowfacts/extrahoppers/network/PacketSetHopperRedstoneMode.kt b/src/main/kotlin/net/shadowfacts/extrahoppers/network/PacketSetHopperRedstoneMode.kt new file mode 100644 index 0000000..b61d0cb --- /dev/null +++ b/src/main/kotlin/net/shadowfacts/extrahoppers/network/PacketSetHopperRedstoneMode.kt @@ -0,0 +1,55 @@ +package net.shadowfacts.extrahoppers.network + +import io.netty.buffer.ByteBuf +import net.minecraft.util.math.BlockPos +import net.minecraftforge.fml.common.FMLCommonHandler +import net.minecraftforge.fml.common.network.simpleimpl.IMessage +import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler +import net.minecraftforge.fml.common.network.simpleimpl.MessageContext +import net.shadowfacts.extrahoppers.block.advanced.TileEntityAdvancedHopper +import net.shadowfacts.shadowmc.util.RedstoneMode + +/** + * @author shadowfacts + */ +class PacketSetHopperRedstoneMode(): IMessage { + + var dim: Int = 0 + lateinit var pos: BlockPos + lateinit var mode: RedstoneMode + + constructor(dim: Int, pos: BlockPos, mode: RedstoneMode): this() { + this.dim = dim + this.pos = pos + this.mode = mode + } + + constructor(tile: TileEntityAdvancedHopper): this(tile.world.provider.dimension, tile.pos, tile.mode) + + override fun toBytes(buf: ByteBuf) { + buf.writeInt(dim) + buf.writeLong(pos.toLong()) + buf.writeInt(mode.ordinal) + } + + override fun fromBytes(buf: ByteBuf) { + dim = buf.readInt() + pos = BlockPos.fromLong(buf.readLong()) + mode = RedstoneMode.values()[buf.readInt()] + } + + object Handler: IMessageHandler { + + override fun onMessage(message: PacketSetHopperRedstoneMode, ctx: MessageContext): IMessage? { + val world = FMLCommonHandler.instance().minecraftServerInstance.getWorld(message.dim) + val tile = world.getTileEntity(message.pos) + if (tile is TileEntityAdvancedHopper) { + tile.mode = message.mode + tile.markDirty() + } + return null + } + + } + +} \ No newline at end of file