From de976334344f8bc32888a4c1e4707b81a9074cad Mon Sep 17 00:00:00 2001 From: Aly Date: Thu, 4 Feb 2021 22:22:03 -0800 Subject: [PATCH] Get initial GUI working --- gradle.properties | 12 +-- .../tf/bug/monadmachines/MonadMachines.kt | 33 +++++-- .../bug/monadmachines/ProgramWorkstation.kt | 15 --- .../block/ProgramWorkstationBlock.kt | 80 ++++++++++++++++ .../block/ProgramWorkstationBlockEntity.kt | 93 +++++++++++++++++++ .../block/ProgramWorkstationScreen.kt | 26 ++++++ .../block/ProgramWorkstationScreenHandler.kt | 44 +++++++++ .../MonadMachinesManualItem.kt} | 5 +- .../ProgramCardItem.kt} | 5 +- src/main/resources/fabric.mod.json | 6 ++ 10 files changed, 287 insertions(+), 32 deletions(-) delete mode 100644 src/main/kotlin/tf/bug/monadmachines/ProgramWorkstation.kt create mode 100644 src/main/kotlin/tf/bug/monadmachines/block/ProgramWorkstationBlock.kt create mode 100644 src/main/kotlin/tf/bug/monadmachines/block/ProgramWorkstationBlockEntity.kt create mode 100644 src/main/kotlin/tf/bug/monadmachines/block/ProgramWorkstationScreen.kt create mode 100644 src/main/kotlin/tf/bug/monadmachines/block/ProgramWorkstationScreenHandler.kt rename src/main/kotlin/tf/bug/monadmachines/{MonadMachinesManual.kt => item/MonadMachinesManualItem.kt} (91%) rename src/main/kotlin/tf/bug/monadmachines/{ProgramCard.kt => item/ProgramCardItem.kt} (50%) diff --git a/gradle.properties b/gradle.properties index cb3cda3..92da535 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,12 +3,12 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # Check these on https://modmuss50.me/fabric.html - minecraft_version=1.16.4 - yarn_mappings=1.16.4+build.7 - loader_version=0.10.8 + minecraft_version=1.16.5 + yarn_mappings=1.16.5+build.3 + loader_version=0.11.1 #Fabric api - fabric_version=0.28.1+1.16 + fabric_version=0.30.0+1.16 loom_version=0.5-SNAPSHOT @@ -18,5 +18,5 @@ org.gradle.jvmargs=-Xmx1G archives_base_name = monadmachines # Kotlin - kotlin_version=1.4.21 - fabric_kotlin_version=1.4.21+build.1 + kotlin_version=1.4.30 + fabric_kotlin_version=1.4.30+build.2 diff --git a/src/main/kotlin/tf/bug/monadmachines/MonadMachines.kt b/src/main/kotlin/tf/bug/monadmachines/MonadMachines.kt index b937726..98474dd 100644 --- a/src/main/kotlin/tf/bug/monadmachines/MonadMachines.kt +++ b/src/main/kotlin/tf/bug/monadmachines/MonadMachines.kt @@ -1,23 +1,42 @@ package tf.bug.monadmachines +import net.fabricmc.api.EnvType +import net.fabricmc.api.Environment import net.fabricmc.fabric.api.client.itemgroup.FabricItemGroupBuilder +import net.fabricmc.fabric.api.client.screenhandler.v1.ScreenRegistry +import net.fabricmc.fabric.api.screenhandler.v1.ScreenHandlerRegistry +import net.minecraft.entity.player.PlayerInventory import net.minecraft.item.ItemGroup import net.minecraft.item.ItemStack +import net.minecraft.text.Text import net.minecraft.util.Identifier import net.minecraft.util.registry.Registry +import tf.bug.monadmachines.block.ProgramWorkstationBlock +import tf.bug.monadmachines.block.ProgramWorkstationScreen +import tf.bug.monadmachines.block.ProgramWorkstationScreenHandler +import tf.bug.monadmachines.item.MonadMachinesManualItem +import tf.bug.monadmachines.item.ProgramCardItem val MONADMACHINES_ITEMGROUP: ItemGroup = FabricItemGroupBuilder.build( Identifier("monadmachines", "group") -) { ItemStack(ProgramWorkstation) } +) { ItemStack(ProgramWorkstationBlock) } @Suppress("unused") fun init() { - Registry.register(Registry.ITEM, MonadMachinesManual.id, MonadMachinesManual) - - Registry.register(Registry.BLOCK, ProgramWorkstation.id, ProgramWorkstation) - Registry.register(Registry.ITEM, ProgramWorkstation.id, ProgramWorkstation.item) - - Registry.register(Registry.ITEM, ProgramCard.id, ProgramCard) + Registry.register(Registry.ITEM, MonadMachinesManualItem.id, MonadMachinesManualItem) + Registry.register(Registry.BLOCK, ProgramWorkstationBlock.id, ProgramWorkstationBlock) + Registry.register(Registry.ITEM, ProgramWorkstationBlock.id, ProgramWorkstationBlock.item) + Registry.register(Registry.BLOCK_ENTITY_TYPE, ProgramWorkstationBlock.id, ProgramWorkstationBlock.entityType) + Registry.register(Registry.ITEM, ProgramCardItem.id, ProgramCardItem) +} + +@Suppress("unused") +@Environment(EnvType.CLIENT) +fun clientInit() { + ScreenRegistry.register(ProgramWorkstationScreenHandler.type) { + handler: ProgramWorkstationScreenHandler, inventory: PlayerInventory, title: Text -> + ProgramWorkstationScreen(handler, inventory, title) + } } diff --git a/src/main/kotlin/tf/bug/monadmachines/ProgramWorkstation.kt b/src/main/kotlin/tf/bug/monadmachines/ProgramWorkstation.kt deleted file mode 100644 index d5aa287..0000000 --- a/src/main/kotlin/tf/bug/monadmachines/ProgramWorkstation.kt +++ /dev/null @@ -1,15 +0,0 @@ -package tf.bug.monadmachines - -import net.fabricmc.fabric.api.`object`.builder.v1.block.FabricBlockSettings -import net.minecraft.block.Block -import net.minecraft.block.Material -import net.minecraft.item.BlockItem -import net.minecraft.item.Item -import net.minecraft.util.Identifier - -object ProgramWorkstation : Block(FabricBlockSettings.of(Material.METAL)) { - - val id = Identifier("monadmachines", "program_workstation") - val item = BlockItem(this, Item.Settings().group(MONADMACHINES_ITEMGROUP)) - -} diff --git a/src/main/kotlin/tf/bug/monadmachines/block/ProgramWorkstationBlock.kt b/src/main/kotlin/tf/bug/monadmachines/block/ProgramWorkstationBlock.kt new file mode 100644 index 0000000..a1fbba9 --- /dev/null +++ b/src/main/kotlin/tf/bug/monadmachines/block/ProgramWorkstationBlock.kt @@ -0,0 +1,80 @@ +package tf.bug.monadmachines.block + +import net.fabricmc.fabric.api.`object`.builder.v1.block.FabricBlockSettings +import net.minecraft.block.BlockRenderType +import net.minecraft.block.BlockState +import net.minecraft.block.BlockWithEntity +import net.minecraft.block.Material +import net.minecraft.block.entity.BlockEntity +import net.minecraft.entity.player.PlayerEntity +import net.minecraft.item.BlockItem +import net.minecraft.item.Item +import net.minecraft.screen.ScreenHandler +import net.minecraft.util.ActionResult +import net.minecraft.util.Hand +import net.minecraft.util.Identifier +import net.minecraft.util.ItemScatterer +import net.minecraft.util.hit.BlockHitResult +import net.minecraft.util.math.BlockPos +import net.minecraft.world.BlockView +import net.minecraft.world.World +import tf.bug.monadmachines.MONADMACHINES_ITEMGROUP + +object ProgramWorkstationBlock : BlockWithEntity(FabricBlockSettings.of(Material.METAL)) { + + val id = Identifier("monadmachines", "program_workstation") + val item = BlockItem(this, Item.Settings().group(MONADMACHINES_ITEMGROUP)) + val entityType = ProgramWorkstationBlockEntity.type + + override fun createBlockEntity(world: BlockView?): BlockEntity { + return ProgramWorkstationBlockEntity() + } + + override fun getRenderType(state: BlockState?): BlockRenderType { + return BlockRenderType.MODEL + } + + override fun onUse( + state: BlockState, + world: World, + pos: BlockPos, + player: PlayerEntity?, + hand: Hand?, + hit: BlockHitResult? + ): ActionResult { + if(!world.isClient) { + val screenHandlerFactory = state.createScreenHandlerFactory(world, pos) + + if(screenHandlerFactory != null && player != null) { + player.openHandledScreen(screenHandlerFactory) + } + } + return ActionResult.SUCCESS + } + + override fun onStateReplaced( + state: BlockState, + world: World, + pos: BlockPos, + newState: BlockState, + moved: Boolean + ) { + if(state.block != newState.block) { + val blockEntity = world.getBlockEntity(pos) + if(blockEntity is ProgramWorkstationBlockEntity) { + ItemScatterer.spawn(world, pos, blockEntity) + world.updateComparators(pos, this) + } + super.onStateReplaced(state, world, pos, newState, moved) + } + } + + override fun hasComparatorOutput(state: BlockState): Boolean { + return true + } + + override fun getComparatorOutput(state: BlockState, world: World, pos: BlockPos): Int { + return ScreenHandler.calculateComparatorOutput(world.getBlockEntity(pos)) + } + +} diff --git a/src/main/kotlin/tf/bug/monadmachines/block/ProgramWorkstationBlockEntity.kt b/src/main/kotlin/tf/bug/monadmachines/block/ProgramWorkstationBlockEntity.kt new file mode 100644 index 0000000..c763841 --- /dev/null +++ b/src/main/kotlin/tf/bug/monadmachines/block/ProgramWorkstationBlockEntity.kt @@ -0,0 +1,93 @@ +package tf.bug.monadmachines.block + +import net.minecraft.block.BlockState +import net.minecraft.block.entity.BlockEntity +import net.minecraft.block.entity.BlockEntityType +import net.minecraft.entity.player.PlayerEntity +import net.minecraft.entity.player.PlayerInventory +import net.minecraft.inventory.Inventories +import net.minecraft.inventory.Inventory +import net.minecraft.item.ItemStack +import net.minecraft.nbt.CompoundTag +import net.minecraft.screen.NamedScreenHandlerFactory +import net.minecraft.screen.ScreenHandler +import net.minecraft.text.Text +import net.minecraft.text.TranslatableText +import net.minecraft.util.collection.DefaultedList +import tf.bug.monadmachines.item.ProgramCardItem + +class ProgramWorkstationBlockEntity : BlockEntity(type), NamedScreenHandlerFactory, Inventory { + + private val card: DefaultedList = DefaultedList.ofSize(1, ItemStack.EMPTY) + + companion object { + val type: BlockEntityType = + BlockEntityType.Builder.create({ ProgramWorkstationBlockEntity() }, ProgramWorkstationBlock).build(null) + } + + override fun createMenu(syncId: Int, inv: PlayerInventory, player: PlayerEntity): ScreenHandler { + return ProgramWorkstationScreenHandler(syncId, inv, this) + } + + override fun getDisplayName(): Text { + return TranslatableText(cachedState.block.translationKey) + } + + override fun clear() { + card.clear() + } + + override fun size(): Int { + return card.size + } + + override fun isEmpty(): Boolean { + return card.isEmpty() + } + + override fun getStack(slot: Int): ItemStack { + return card[slot] + } + + override fun removeStack(slot: Int, amount: Int): ItemStack { + val result = Inventories.splitStack(card, slot, amount) + if (!result.isEmpty) { + markDirty() + } + return result + } + + override fun removeStack(slot: Int): ItemStack { + return Inventories.removeStack(card, slot) + } + + override fun setStack(slot: Int, stack: ItemStack) { + card[slot] = stack + if (stack.count > maxCountPerStack) { + stack.count = maxCountPerStack; + } + } + + override fun canPlayerUse(player: PlayerEntity?): Boolean { + return true + } + + override fun getMaxCountPerStack(): Int { + return 1 + } + + override fun isValid(slot: Int, stack: ItemStack): Boolean { + return slot == 0 && (stack.item is ProgramCardItem && stack.count <= 1) + } + + override fun fromTag(state: BlockState, tag: CompoundTag) { + super.fromTag(state, tag) + Inventories.fromTag(tag, card) + } + + override fun toTag(tag: CompoundTag): CompoundTag { + Inventories.toTag(tag, card) + return super.toTag(tag) + } + +} diff --git a/src/main/kotlin/tf/bug/monadmachines/block/ProgramWorkstationScreen.kt b/src/main/kotlin/tf/bug/monadmachines/block/ProgramWorkstationScreen.kt new file mode 100644 index 0000000..2d65835 --- /dev/null +++ b/src/main/kotlin/tf/bug/monadmachines/block/ProgramWorkstationScreen.kt @@ -0,0 +1,26 @@ +package tf.bug.monadmachines.block + +import net.minecraft.client.gui.screen.ingame.HandledScreen +import net.minecraft.client.util.math.MatrixStack +import net.minecraft.entity.player.PlayerInventory +import net.minecraft.text.Text + +class ProgramWorkstationScreen(handler: ProgramWorkstationScreenHandler, inventory: PlayerInventory, title: Text) : HandledScreen(handler, inventory, title) { + + override fun drawBackground(matrices: MatrixStack, delta: Float, mouseX: Int, mouseY: Int) { + // TODO + } + + override fun render(matrices: MatrixStack, mouseX: Int, mouseY: Int, delta: Float) { + renderBackground(matrices) + super.render(matrices, mouseX, mouseY, delta) + drawMouseoverTooltip(matrices, mouseX, mouseY) + } + + override fun init() { + super.init() + + titleX = (backgroundWidth - textRenderer.getWidth(title)) / 2 + } + +} diff --git a/src/main/kotlin/tf/bug/monadmachines/block/ProgramWorkstationScreenHandler.kt b/src/main/kotlin/tf/bug/monadmachines/block/ProgramWorkstationScreenHandler.kt new file mode 100644 index 0000000..3864567 --- /dev/null +++ b/src/main/kotlin/tf/bug/monadmachines/block/ProgramWorkstationScreenHandler.kt @@ -0,0 +1,44 @@ +package tf.bug.monadmachines.block + +import net.fabricmc.fabric.api.screenhandler.v1.ScreenHandlerRegistry +import net.minecraft.entity.player.PlayerEntity +import net.minecraft.entity.player.PlayerInventory +import net.minecraft.inventory.Inventory +import net.minecraft.inventory.SimpleInventory +import net.minecraft.screen.ScreenHandler +import net.minecraft.screen.ScreenHandlerType +import net.minecraft.screen.slot.Slot + +class ProgramWorkstationScreenHandler(syncId: Int, playerInventory: PlayerInventory, inventory: Inventory) : ScreenHandler(type, syncId) { + + private val inventory: Inventory + + init { + checkSize(inventory, 1) + this.inventory = inventory + inventory.onOpen(playerInventory.player) + + for(m in 0..2) { + for(l in 0..8) { + addSlot(Slot(playerInventory, l + m * 9 + 9, 8 + l * 18, 84 + m * 18)) + } + } + } + + companion object { + val type: ScreenHandlerType = + ScreenHandlerRegistry.registerSimple(ProgramWorkstationBlock.id) { syncId: Int, playerInventory: PlayerInventory -> + ProgramWorkstationScreenHandler( + syncId, + playerInventory + ) + } + } + + constructor(syncId: Int, playerInventory: PlayerInventory) : this(syncId, playerInventory, SimpleInventory(1)) + + override fun canUse(player: PlayerEntity?): Boolean { + return this.inventory.canPlayerUse(player) + } + +} diff --git a/src/main/kotlin/tf/bug/monadmachines/MonadMachinesManual.kt b/src/main/kotlin/tf/bug/monadmachines/item/MonadMachinesManualItem.kt similarity index 91% rename from src/main/kotlin/tf/bug/monadmachines/MonadMachinesManual.kt rename to src/main/kotlin/tf/bug/monadmachines/item/MonadMachinesManualItem.kt index b8cddef..4940348 100644 --- a/src/main/kotlin/tf/bug/monadmachines/MonadMachinesManual.kt +++ b/src/main/kotlin/tf/bug/monadmachines/item/MonadMachinesManualItem.kt @@ -1,4 +1,4 @@ -package tf.bug.monadmachines +package tf.bug.monadmachines.item import net.fabricmc.loader.api.FabricLoader import net.minecraft.client.item.TooltipContext @@ -11,9 +11,10 @@ import net.minecraft.text.TextColor import net.minecraft.text.TranslatableText import net.minecraft.util.* import net.minecraft.world.World +import tf.bug.monadmachines.MONADMACHINES_ITEMGROUP import vazkii.patchouli.api.PatchouliAPI -object MonadMachinesManual : Item(Settings().group(MONADMACHINES_ITEMGROUP)) { +object MonadMachinesManualItem : Item(Settings().group(MONADMACHINES_ITEMGROUP)) { val id = Identifier("monadmachines", "manual") diff --git a/src/main/kotlin/tf/bug/monadmachines/ProgramCard.kt b/src/main/kotlin/tf/bug/monadmachines/item/ProgramCardItem.kt similarity index 50% rename from src/main/kotlin/tf/bug/monadmachines/ProgramCard.kt rename to src/main/kotlin/tf/bug/monadmachines/item/ProgramCardItem.kt index c4ad449..97188fd 100644 --- a/src/main/kotlin/tf/bug/monadmachines/ProgramCard.kt +++ b/src/main/kotlin/tf/bug/monadmachines/item/ProgramCardItem.kt @@ -1,10 +1,11 @@ -package tf.bug.monadmachines +package tf.bug.monadmachines.item import net.fabricmc.fabric.api.item.v1.FabricItemSettings import net.minecraft.item.Item import net.minecraft.util.Identifier +import tf.bug.monadmachines.MONADMACHINES_ITEMGROUP -object ProgramCard : Item(FabricItemSettings().group(MONADMACHINES_ITEMGROUP)) { +object ProgramCardItem : Item(FabricItemSettings().group(MONADMACHINES_ITEMGROUP).maxCount(1)) { val id = Identifier("monadmachines", "program_card") diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 91244a5..dde43dd 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -23,6 +23,12 @@ "adapter": "kotlin", "value": "tf.bug.monadmachines.MonadMachinesKt::init" } + ], + "client": [ + { + "adapter": "kotlin", + "value": "tf.bug.monadmachines.MonadMachinesKt::clientInit" + } ] }, "mixins": [],