Get initial GUI working
This commit is contained in:
parent
79ffcfbd85
commit
de97633434
10 changed files with 287 additions and 32 deletions
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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))
|
||||
|
||||
}
|
|
@ -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))
|
||||
}
|
||||
|
||||
}
|
|
@ -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<ItemStack> = DefaultedList.ofSize(1, ItemStack.EMPTY)
|
||||
|
||||
companion object {
|
||||
val type: BlockEntityType<ProgramWorkstationBlockEntity> =
|
||||
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)
|
||||
}
|
||||
|
||||
}
|
|
@ -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<ProgramWorkstationScreenHandler>(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
|
||||
}
|
||||
|
||||
}
|
|
@ -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<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)
|
||||
}
|
||||
|
||||
}
|
|
@ -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")
|
||||
|
|
@ -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")
|
||||
|
|
@ -23,6 +23,12 @@
|
|||
"adapter": "kotlin",
|
||||
"value": "tf.bug.monadmachines.MonadMachinesKt::init"
|
||||
}
|
||||
],
|
||||
"client": [
|
||||
{
|
||||
"adapter": "kotlin",
|
||||
"value": "tf.bug.monadmachines.MonadMachinesKt::clientInit"
|
||||
}
|
||||
]
|
||||
},
|
||||
"mixins": [],
|
||||
|
|
Loading…
Reference in a new issue