Add LibGui
This commit is contained in:
parent
de97633434
commit
61fb24433d
7 changed files with 84 additions and 118 deletions
17
README.md
17
README.md
|
@ -4,14 +4,17 @@ A computer mod that aims to teach functional programming concepts through
|
||||||
a tutorial book and a simple visual interface.
|
a tutorial book and a simple visual interface.
|
||||||
|
|
||||||
Depends on:
|
Depends on:
|
||||||
- Fabric API
|
- [Fabric API](https://www.curseforge.com/minecraft/mc-mods/fabric-api)
|
||||||
- Fabric Language Kotlin
|
- [Fabric Language Kotlin](https://www.curseforge.com/minecraft/mc-mods/fabric-language-kotlin)
|
||||||
|
- [LibGui](https://github.com/CottonMC/LibGui)
|
||||||
|
|
||||||
Recommended:
|
Recommended:
|
||||||
- Patchouli: The mod uses Patchouli for its documentation. **Don't leave
|
- [Patchouli](https://www.curseforge.com/minecraft/mc-mods/patchouli-fabric):
|
||||||
out Patchouli unless you know what you're doing.**
|
The mod uses Patchouli for its documentation. **Don't leave out Patchouli
|
||||||
|
unless you know what you're doing.**
|
||||||
|
|
||||||
Suggested:
|
Suggested:
|
||||||
- Mod Menu: Shows mod information.
|
- [Mod Menu](https://modrinth.com/mod/modmenu): Shows mod information.
|
||||||
- Polymorph: Adds a recipe conflict resolver. Certain crafting recipes in
|
- [Polymorph](https://www.curseforge.com/minecraft/mc-mods/polymorph-fabric):
|
||||||
MonadMachines may conflict with other mods.
|
Adds a recipe conflict resolver. Certain crafting recipes in MonadMachines
|
||||||
|
may conflict with other mods.
|
||||||
|
|
10
build.gradle
10
build.gradle
|
@ -20,6 +20,12 @@ repositories {
|
||||||
|
|
||||||
// for Patchouli
|
// for Patchouli
|
||||||
maven { url 'https://maven.blamejared.com' }
|
maven { url 'https://maven.blamejared.com' }
|
||||||
|
|
||||||
|
// for LibGui
|
||||||
|
maven {
|
||||||
|
name = "CottonMC"
|
||||||
|
url = "https://server.bbkr.space/artifactory/libs-release"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
@ -34,8 +40,10 @@ dependencies {
|
||||||
modImplementation "net.fabricmc:fabric-language-kotlin:${project.fabric_kotlin_version}"
|
modImplementation "net.fabricmc:fabric-language-kotlin:${project.fabric_kotlin_version}"
|
||||||
|
|
||||||
// Patchouli
|
// Patchouli
|
||||||
// modCompileOnly "vazkii.patchouli:Patchouli:1.16.4-48-FABRIC:api"
|
|
||||||
modImplementation "vazkii.patchouli:Patchouli:1.16.4-48-FABRIC"
|
modImplementation "vazkii.patchouli:Patchouli:1.16.4-48-FABRIC"
|
||||||
|
|
||||||
|
// LibGui
|
||||||
|
modImplementation "io.github.cottonmc:LibGui:3.3.3+1.16.5"
|
||||||
}
|
}
|
||||||
|
|
||||||
processResources {
|
processResources {
|
||||||
|
|
|
@ -4,7 +4,6 @@ import net.fabricmc.api.EnvType
|
||||||
import net.fabricmc.api.Environment
|
import net.fabricmc.api.Environment
|
||||||
import net.fabricmc.fabric.api.client.itemgroup.FabricItemGroupBuilder
|
import net.fabricmc.fabric.api.client.itemgroup.FabricItemGroupBuilder
|
||||||
import net.fabricmc.fabric.api.client.screenhandler.v1.ScreenRegistry
|
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.entity.player.PlayerInventory
|
||||||
import net.minecraft.item.ItemGroup
|
import net.minecraft.item.ItemGroup
|
||||||
import net.minecraft.item.ItemStack
|
import net.minecraft.item.ItemStack
|
||||||
|
@ -13,7 +12,7 @@ import net.minecraft.util.Identifier
|
||||||
import net.minecraft.util.registry.Registry
|
import net.minecraft.util.registry.Registry
|
||||||
import tf.bug.monadmachines.block.ProgramWorkstationBlock
|
import tf.bug.monadmachines.block.ProgramWorkstationBlock
|
||||||
import tf.bug.monadmachines.block.ProgramWorkstationScreen
|
import tf.bug.monadmachines.block.ProgramWorkstationScreen
|
||||||
import tf.bug.monadmachines.block.ProgramWorkstationScreenHandler
|
import tf.bug.monadmachines.block.ProgramWorkstationGuiDescription
|
||||||
import tf.bug.monadmachines.item.MonadMachinesManualItem
|
import tf.bug.monadmachines.item.MonadMachinesManualItem
|
||||||
import tf.bug.monadmachines.item.ProgramCardItem
|
import tf.bug.monadmachines.item.ProgramCardItem
|
||||||
|
|
||||||
|
@ -35,8 +34,8 @@ fun init() {
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
@Environment(EnvType.CLIENT)
|
@Environment(EnvType.CLIENT)
|
||||||
fun clientInit() {
|
fun clientInit() {
|
||||||
ScreenRegistry.register(ProgramWorkstationScreenHandler.type) {
|
ScreenRegistry.register(ProgramWorkstationGuiDescription.type) {
|
||||||
handler: ProgramWorkstationScreenHandler, inventory: PlayerInventory, title: Text ->
|
handler: ProgramWorkstationGuiDescription, inventory: PlayerInventory, title: Text ->
|
||||||
ProgramWorkstationScreen(handler, inventory, title)
|
ProgramWorkstationScreen(handler, inventory.player, title)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,83 +1,58 @@
|
||||||
package tf.bug.monadmachines.block
|
package tf.bug.monadmachines.block
|
||||||
|
|
||||||
import net.minecraft.block.BlockState
|
import net.minecraft.block.BlockState
|
||||||
|
import net.minecraft.block.InventoryProvider
|
||||||
import net.minecraft.block.entity.BlockEntity
|
import net.minecraft.block.entity.BlockEntity
|
||||||
import net.minecraft.block.entity.BlockEntityType
|
import net.minecraft.block.entity.BlockEntityType
|
||||||
|
import net.minecraft.block.entity.LootableContainerBlockEntity
|
||||||
import net.minecraft.entity.player.PlayerEntity
|
import net.minecraft.entity.player.PlayerEntity
|
||||||
import net.minecraft.entity.player.PlayerInventory
|
import net.minecraft.entity.player.PlayerInventory
|
||||||
import net.minecraft.inventory.Inventories
|
import net.minecraft.inventory.Inventories
|
||||||
import net.minecraft.inventory.Inventory
|
import net.minecraft.inventory.Inventory
|
||||||
|
import net.minecraft.inventory.SidedInventory
|
||||||
import net.minecraft.item.ItemStack
|
import net.minecraft.item.ItemStack
|
||||||
import net.minecraft.nbt.CompoundTag
|
import net.minecraft.nbt.CompoundTag
|
||||||
import net.minecraft.screen.NamedScreenHandlerFactory
|
import net.minecraft.screen.NamedScreenHandlerFactory
|
||||||
import net.minecraft.screen.ScreenHandler
|
import net.minecraft.screen.ScreenHandler
|
||||||
|
import net.minecraft.screen.ScreenHandlerContext
|
||||||
import net.minecraft.text.Text
|
import net.minecraft.text.Text
|
||||||
import net.minecraft.text.TranslatableText
|
import net.minecraft.text.TranslatableText
|
||||||
import net.minecraft.util.collection.DefaultedList
|
import net.minecraft.util.collection.DefaultedList
|
||||||
|
import net.minecraft.util.math.BlockPos
|
||||||
|
import net.minecraft.world.WorldAccess
|
||||||
import tf.bug.monadmachines.item.ProgramCardItem
|
import tf.bug.monadmachines.item.ProgramCardItem
|
||||||
|
|
||||||
class ProgramWorkstationBlockEntity : BlockEntity(type), NamedScreenHandlerFactory, Inventory {
|
class ProgramWorkstationBlockEntity : LootableContainerBlockEntity(type) {
|
||||||
|
|
||||||
private val card: DefaultedList<ItemStack> = DefaultedList.ofSize(1, ItemStack.EMPTY)
|
private var card: DefaultedList<ItemStack> = DefaultedList.ofSize(1, ItemStack.EMPTY)
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
val type: BlockEntityType<ProgramWorkstationBlockEntity> =
|
val type: BlockEntityType<ProgramWorkstationBlockEntity> =
|
||||||
BlockEntityType.Builder.create({ ProgramWorkstationBlockEntity() }, ProgramWorkstationBlock).build(null)
|
BlockEntityType.Builder.create({ ProgramWorkstationBlockEntity() }, ProgramWorkstationBlock).build(null)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun createMenu(syncId: Int, inv: PlayerInventory, player: PlayerEntity): ScreenHandler {
|
override fun createScreenHandler(syncId: Int, inv: PlayerInventory): ScreenHandler {
|
||||||
return ProgramWorkstationScreenHandler(syncId, inv, this)
|
return ProgramWorkstationGuiDescription(syncId, inv, ScreenHandlerContext.create(world, pos))
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getDisplayName(): Text {
|
override fun getContainerName(): Text {
|
||||||
return TranslatableText(cachedState.block.translationKey)
|
return TranslatableText(cachedState.block.translationKey)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun clear() {
|
override fun getInvStackList(): DefaultedList<ItemStack> {
|
||||||
card.clear()
|
return card
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun setInvStackList(list: DefaultedList<ItemStack>) {
|
||||||
|
card = list
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun size(): Int {
|
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
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun isValid(slot: Int, stack: ItemStack): Boolean {
|
override fun isValid(slot: Int, stack: ItemStack): Boolean {
|
||||||
return slot == 0 && (stack.item is ProgramCardItem && stack.count <= 1)
|
return stack.isEmpty || stack.item is ProgramCardItem
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun fromTag(state: BlockState, tag: CompoundTag) {
|
override fun fromTag(state: BlockState, tag: CompoundTag) {
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
package tf.bug.monadmachines.block
|
||||||
|
|
||||||
|
import io.github.cottonmc.cotton.gui.SyncedGuiDescription
|
||||||
|
import io.github.cottonmc.cotton.gui.widget.WGridPanel
|
||||||
|
import io.github.cottonmc.cotton.gui.widget.WItemSlot
|
||||||
|
import net.fabricmc.fabric.api.screenhandler.v1.ScreenHandlerRegistry
|
||||||
|
import net.minecraft.entity.player.PlayerInventory
|
||||||
|
import net.minecraft.screen.ScreenHandlerContext
|
||||||
|
import net.minecraft.screen.ScreenHandlerType
|
||||||
|
|
||||||
|
class ProgramWorkstationGuiDescription(syncId: Int, playerInventory: PlayerInventory, context: ScreenHandlerContext) : SyncedGuiDescription(type, syncId, playerInventory, getBlockInventory(context, inventorySize), getBlockPropertyDelegate(context)) {
|
||||||
|
|
||||||
|
init {
|
||||||
|
val root = WGridPanel()
|
||||||
|
setRootPanel(root)
|
||||||
|
root.setSize(300, 200)
|
||||||
|
|
||||||
|
val itemSlot = WItemSlot.of(blockInventory, 0)
|
||||||
|
root.add(itemSlot, 4, 1)
|
||||||
|
|
||||||
|
root.add(this.createPlayerInventoryPanel(), 0, 3)
|
||||||
|
|
||||||
|
root.validate(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val inventorySize: Int = 1
|
||||||
|
|
||||||
|
val type: ScreenHandlerType<ProgramWorkstationGuiDescription> =
|
||||||
|
ScreenHandlerRegistry.registerSimple(ProgramWorkstationBlock.id) { syncId: Int, playerInventory: PlayerInventory ->
|
||||||
|
ProgramWorkstationGuiDescription(
|
||||||
|
syncId,
|
||||||
|
playerInventory,
|
||||||
|
ScreenHandlerContext.EMPTY
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,26 +1,12 @@
|
||||||
package tf.bug.monadmachines.block
|
package tf.bug.monadmachines.block
|
||||||
|
|
||||||
import net.minecraft.client.gui.screen.ingame.HandledScreen
|
import io.github.cottonmc.cotton.gui.GuiDescription
|
||||||
|
import io.github.cottonmc.cotton.gui.client.CottonInventoryScreen
|
||||||
import net.minecraft.client.util.math.MatrixStack
|
import net.minecraft.client.util.math.MatrixStack
|
||||||
|
import net.minecraft.entity.player.PlayerEntity
|
||||||
import net.minecraft.entity.player.PlayerInventory
|
import net.minecraft.entity.player.PlayerInventory
|
||||||
import net.minecraft.text.Text
|
import net.minecraft.text.Text
|
||||||
|
|
||||||
class ProgramWorkstationScreen(handler: ProgramWorkstationScreenHandler, inventory: PlayerInventory, title: Text) : HandledScreen<ProgramWorkstationScreenHandler>(handler, inventory, title) {
|
class ProgramWorkstationScreen(gui: ProgramWorkstationGuiDescription, player: PlayerEntity, title: Text) : CottonInventoryScreen<ProgramWorkstationGuiDescription>(gui, player, 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
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,44 +0,0 @@
|
||||||
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<ProgramWorkstationScreenHandler> =
|
|
||||||
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)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
Loading…
Reference in a new issue