diff --git a/build.gradle.kts b/build.gradle.kts index 30b095f..55abea5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -27,7 +27,7 @@ repositories { maven("https://maven.shedaniel.me/") maven("https://maven.terraformersmc.com/releases") maven("https://maven.blamejared.com/") - maven("https://ladysnake.jfrog.io/artifactory/mods") + maven("https://maven.ladysnake.org/releases") } dependencies { diff --git a/gradle.properties b/gradle.properties index 79ed5c6..bc5edfd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,42 +1,42 @@ kotlin.code.style = official -org.gradle.jvmargs = -Xmx1G +org.gradle.jvmargs = -Xmx2G run_args = -Dmixin.debug.export=true # Fabric properties -minecraft = 1.19.4 -yarn = 1.19.4+build.2 -fabricLoader = 0.14.19 +minecraft = 1.20.1 +yarn = 1.20.1+build.10 +fabricLoader = 0.15.11 # Mod properties maven_group = com.github.badasintended archives_base_name = slotlink # Dependencies -fabricApi = 0.75.3+1.19.4 -fabricKotlin = 1.9.2+kotlin.1.8.10 -cca = 5.1.0 -trinkets = 3.6.0 -architectury = 8.1.73 -wthit = 7.1.1 -badpackets = 0.4.1 +fabricApi = 0.92.2+1.20.1 +fabricKotlin = 1.10.9+kotlin.1.9.0 +cca = 5.2.2 +trinkets = 3.7.2 +architectury = 9.2.14 +wthit = 8.12.0 +badpackets = 0.4.3 # Recipe Viewer recipeViewer = jei rei = 11.0.593 -jei = 1.19.4-13.0.0.1 +jei = 1.20.1-15.3.0.4 emi = 0.7.1+1.19.4 # CurseForge cf.projectId = 391014 cf.releaseType = release -cf.gameVersion = 1.19.4 +cf.gameVersion = 1.20.1 cf.require = fabric-api, fabric-language-kotlin cf.optional = roughly-enough-items, jei, emi, wthit, trinkets # Modrinth mr.projectId = FTMcNdhv mr.releaseType = release -mr.gameVersion = 1.19.4 +mr.gameVersion = 1.20.1 mr.require = P7dR8mSH, Ha28R6CL mr.optional = 6AQIaxuO, u6dRKJwZ, fRiHVvU7, nfn13YXA, 5aaWibi9 diff --git a/src/main/java/badasintended/slotlink/mixin/CraftingScreenHandlerAccessor.java b/src/main/java/badasintended/slotlink/mixin/CraftingScreenHandlerAccessor.java index bdcd1fd..dbc5777 100644 --- a/src/main/java/badasintended/slotlink/mixin/CraftingScreenHandlerAccessor.java +++ b/src/main/java/badasintended/slotlink/mixin/CraftingScreenHandlerAccessor.java @@ -1,7 +1,7 @@ package badasintended.slotlink.mixin; -import net.minecraft.inventory.CraftingInventory; import net.minecraft.inventory.CraftingResultInventory; +import net.minecraft.inventory.RecipeInputInventory; import net.minecraft.screen.CraftingScreenHandler; import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Mixin; @@ -12,7 +12,7 @@ public interface CraftingScreenHandlerAccessor { @NotNull @Accessor - CraftingInventory getInput(); + RecipeInputInventory getInput(); @NotNull @Accessor diff --git a/src/main/java/badasintended/slotlink/mixin/ServerWorldMixin.java b/src/main/java/badasintended/slotlink/mixin/ServerWorldMixin.java index ac8cdb7..5038496 100644 --- a/src/main/java/badasintended/slotlink/mixin/ServerWorldMixin.java +++ b/src/main/java/badasintended/slotlink/mixin/ServerWorldMixin.java @@ -8,6 +8,7 @@ import net.minecraft.registry.RegistryKey; import net.minecraft.server.MinecraftServer; import net.minecraft.server.WorldGenerationProgressListener; import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.random.RandomSequencesState; import net.minecraft.world.PersistentStateManager; import net.minecraft.world.dimension.DimensionOptions; import net.minecraft.world.level.ServerWorldProperties; @@ -30,7 +31,7 @@ public abstract class ServerWorldMixin implements NetworkStateHolder { private NetworkState networkState; @Inject(method = "", at = @At("TAIL")) - private void slotlink$initNetworkState(MinecraftServer server, Executor workerExecutor, LevelStorage.Session session, ServerWorldProperties properties, RegistryKey worldKey, DimensionOptions dimensionOptions, WorldGenerationProgressListener worldGenerationProgressListener, boolean debugWorld, long seed, List spawners, boolean shouldTickTime, CallbackInfo ci) { + private void slotlink$initNetworkState(MinecraftServer server, Executor workerExecutor, LevelStorage.Session session, ServerWorldProperties properties, RegistryKey worldKey, DimensionOptions dimensionOptions, WorldGenerationProgressListener worldGenerationProgressListener, boolean debugWorld, long seed, List spawners, boolean shouldTickTime, RandomSequencesState randomSequencesState, CallbackInfo ci) { ServerWorld self = (ServerWorld) (Object) this; networkState = getPersistentStateManager().getOrCreate(nbt -> NetworkState.create(self, nbt), NetworkState::new, "slotlink"); } diff --git a/src/main/kotlin/badasintended/slotlink/block/CableBlock.kt b/src/main/kotlin/badasintended/slotlink/block/CableBlock.kt index 8302dda..b6f2924 100644 --- a/src/main/kotlin/badasintended/slotlink/block/CableBlock.kt +++ b/src/main/kotlin/badasintended/slotlink/block/CableBlock.kt @@ -7,7 +7,7 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap import net.fabricmc.fabric.api.`object`.builder.v1.block.FabricBlockSettings import net.minecraft.block.Block import net.minecraft.block.BlockState -import net.minecraft.block.Material +import net.minecraft.block.MapColor import net.minecraft.block.ShapeContext import net.minecraft.item.ItemPlacementContext import net.minecraft.state.StateManager @@ -30,7 +30,8 @@ open class CableBlock(id: String = "cable", be: BlockEntityBuilder = ::CableBloc companion object { val SETTINGS: Settings = FabricBlockSettings - .of(Material.GLASS) + .create() + .mapColor(MapColor.WHITE) .hardness(3f) val PROPERTIES = mapOf( diff --git a/src/main/kotlin/badasintended/slotlink/block/ModBlock.kt b/src/main/kotlin/badasintended/slotlink/block/ModBlock.kt index 526339f..289560a 100644 --- a/src/main/kotlin/badasintended/slotlink/block/ModBlock.kt +++ b/src/main/kotlin/badasintended/slotlink/block/ModBlock.kt @@ -5,14 +5,15 @@ 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.MapColor abstract class ModBlock(id: String, settings: Settings = SETTINGS) : BlockWithEntity(settings) { companion object { val SETTINGS: Settings = FabricBlockSettings - .of(Material.STONE) + .create() + .mapColor(MapColor.WHITE) .hardness(5f) } diff --git a/src/main/kotlin/badasintended/slotlink/client/gui/screen/ConnectorCableScreen.kt b/src/main/kotlin/badasintended/slotlink/client/gui/screen/ConnectorCableScreen.kt index 39ccac2..e481554 100644 --- a/src/main/kotlin/badasintended/slotlink/client/gui/screen/ConnectorCableScreen.kt +++ b/src/main/kotlin/badasintended/slotlink/client/gui/screen/ConnectorCableScreen.kt @@ -7,7 +7,7 @@ import badasintended.slotlink.screen.ConnectorCableScreenHandler import badasintended.slotlink.util.int import net.fabricmc.api.EnvType import net.fabricmc.api.Environment -import net.minecraft.client.util.math.MatrixStack +import net.minecraft.client.gui.DrawContext import net.minecraft.entity.player.PlayerInventory import net.minecraft.text.Text @@ -55,10 +55,10 @@ open class ConnectorCableScreen(h: H, inventory } } - override fun drawForeground(matrices: MatrixStack, mouseX: Int, mouseY: Int) { - super.drawForeground(matrices, mouseX, mouseY) + override fun drawForeground(context: DrawContext, mouseX: Int, mouseY: Int) { + super.drawForeground(context, mouseX, mouseY) - textRenderer.draw(matrices, "$priority", 7 + 2 * 18f, titleY + 31f, 4210752) + context.drawText(textRenderer, "$priority", 7 + 2 * 18, titleY + 31, 4210752, false) } } diff --git a/src/main/kotlin/badasintended/slotlink/client/gui/screen/FilterScreen.kt b/src/main/kotlin/badasintended/slotlink/client/gui/screen/FilterScreen.kt index 9fe6b9f..1abad29 100644 --- a/src/main/kotlin/badasintended/slotlink/client/gui/screen/FilterScreen.kt +++ b/src/main/kotlin/badasintended/slotlink/client/gui/screen/FilterScreen.kt @@ -3,7 +3,6 @@ package badasintended.slotlink.client.gui.screen import badasintended.slotlink.client.gui.widget.ButtonWidget import badasintended.slotlink.client.gui.widget.FilterSlotWidget import badasintended.slotlink.client.util.GuiTextures -import badasintended.slotlink.client.util.bind import badasintended.slotlink.client.util.c2s import badasintended.slotlink.init.Packets.FILTER_SETTINGS import badasintended.slotlink.screen.FilterScreenHandler @@ -11,7 +10,7 @@ import badasintended.slotlink.util.bool import badasintended.slotlink.util.int import net.fabricmc.api.EnvType import net.fabricmc.api.Environment -import net.minecraft.client.util.math.MatrixStack +import net.minecraft.client.gui.DrawContext import net.minecraft.entity.player.PlayerInventory import net.minecraft.text.Text @@ -53,11 +52,10 @@ open class FilterScreen(h: H, inventory: PlayerInventor } } - override fun drawBackground(matrices: MatrixStack, delta: Float, mouseX: Int, mouseY: Int) { - super.drawBackground(matrices, delta, mouseX, mouseY) + override fun drawBackground(context: DrawContext, delta: Float, mouseX: Int, mouseY: Int) { + super.drawBackground(context, delta, mouseX, mouseY) - GuiTextures.FILTER.bind() - drawTexture(matrices, x, y, 0, 0, 176, 166) + context.drawTexture(GuiTextures.FILTER, x, y, 0, 0, 176, 166) } protected open fun sync() { diff --git a/src/main/kotlin/badasintended/slotlink/client/gui/screen/ModScreen.kt b/src/main/kotlin/badasintended/slotlink/client/gui/screen/ModScreen.kt index 78c9a81..6ba0d73 100644 --- a/src/main/kotlin/badasintended/slotlink/client/gui/screen/ModScreen.kt +++ b/src/main/kotlin/badasintended/slotlink/client/gui/screen/ModScreen.kt @@ -5,9 +5,9 @@ import badasintended.slotlink.client.gui.widget.KeyGrabber import badasintended.slotlink.client.gui.widget.TooltipRenderer import net.fabricmc.api.EnvType import net.fabricmc.api.Environment +import net.minecraft.client.gui.DrawContext import net.minecraft.client.gui.screen.ingame.HandledScreen import net.minecraft.client.gui.widget.ClickableWidget -import net.minecraft.client.util.math.MatrixStack import net.minecraft.entity.player.PlayerInventory import net.minecraft.screen.ScreenHandler import net.minecraft.text.Text @@ -27,19 +27,19 @@ abstract class ModScreen(h: H, inventory: PlayerInventory, ti return addDrawableChild(t).apply(func) } - override fun render(matrices: MatrixStack, mouseX: Int, mouseY: Int, delta: Float) { - super.render(matrices, mouseX, mouseY, delta) + override fun render(context: DrawContext, mouseX: Int, mouseY: Int, delta: Float) { + super.render(context, mouseX, mouseY, delta) if (handler.cursorStack.isEmpty && focusedSlot != null && focusedSlot!!.hasStack()) { - this.renderTooltip(matrices, focusedSlot!!.stack, mouseX, mouseY) + context.drawTooltip(this.textRenderer, focusedSlot!!.stack.name, mouseX, mouseY) } else { hoveredElement = hoveredElement(mouseX.toDouble(), mouseY.toDouble()).orElse(null) as? ClickableWidget - (hoveredElement as? TooltipRenderer)?.renderTooltip(matrices, mouseX, mouseY) + (hoveredElement as? TooltipRenderer)?.renderTooltip(context, mouseX, mouseY) } } - override fun drawBackground(matrices: MatrixStack, delta: Float, mouseX: Int, mouseY: Int) { - renderBackground(matrices) + override fun drawBackground(context: DrawContext, delta: Float, mouseX: Int, mouseY: Int) { + renderBackground(context) } override fun mouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean { diff --git a/src/main/kotlin/badasintended/slotlink/client/gui/screen/RequestScreen.kt b/src/main/kotlin/badasintended/slotlink/client/gui/screen/RequestScreen.kt index b042c2a..00ed4da 100644 --- a/src/main/kotlin/badasintended/slotlink/client/gui/screen/RequestScreen.kt +++ b/src/main/kotlin/badasintended/slotlink/client/gui/screen/RequestScreen.kt @@ -1,12 +1,7 @@ package badasintended.slotlink.client.gui.screen -import badasintended.slotlink.client.gui.widget.ButtonWidget -import badasintended.slotlink.client.gui.widget.CraftingResultSlotWidget -import badasintended.slotlink.client.gui.widget.MultiSlotWidget -import badasintended.slotlink.client.gui.widget.ScrollBarWidget -import badasintended.slotlink.client.gui.widget.TextFieldWidget +import badasintended.slotlink.client.gui.widget.* import badasintended.slotlink.client.util.GuiTextures -import badasintended.slotlink.client.util.bind import badasintended.slotlink.client.util.c2s import badasintended.slotlink.compat.invsort.InventorySortButton import badasintended.slotlink.compat.recipe.RecipeViewer @@ -25,10 +20,10 @@ import badasintended.slotlink.util.int import badasintended.slotlink.util.string import net.fabricmc.api.EnvType import net.fabricmc.api.Environment +import net.minecraft.client.gui.DrawContext import net.minecraft.client.gui.Element import net.minecraft.client.gui.Selectable import net.minecraft.client.gui.widget.ClickableWidget -import net.minecraft.client.util.math.MatrixStack import net.minecraft.entity.player.PlayerInventory import net.minecraft.text.Text import org.lwjgl.glfw.GLFW @@ -37,11 +32,19 @@ import badasintended.slotlink.util.backgroundWidth as utilBackgroundWidth import badasintended.slotlink.util.x as utilX import badasintended.slotlink.util.y as utilY +import net.minecraft.client.gui.screen.recipebook.RecipeBookProvider +import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget +import net.minecraft.client.gui.widget.TexturedButtonWidget +import net.minecraft.screen.AbstractRecipeScreenHandler +import net.minecraft.util.Identifier + @Environment(EnvType.CLIENT) class RequestScreen(handler: H, inv: PlayerInventory, title: Text) : - ModScreen(handler, inv, title) { + ModScreen(handler, inv, title), RecipeBookProvider { var craftingGrid by config::showCraftingGrid + private val recipeBook = RecipeBookWidget() + private val RECIPE_BUTTON_TEXTURE = Identifier("textures/gui/recipe_button.png") var arrowX = -1 var arrowY = -1 @@ -88,9 +91,54 @@ class RequestScreen(handler: H, inv: PlayerInventory, playerInventoryTitleY = backgroundHeight - 94 - val x = x + 7 + var x = x + 7 val y = y + titleY + 11 + if (craftingGrid) { + recipeBook.initialize(width, height, client, width < 379, handler as AbstractRecipeScreenHandler<*>) + this.x = recipeBook.findLeftEdge(width, backgroundWidth) + x = this.x + 7 + add(TexturedButtonWidget( + x - 2, y + viewedHeight * 18 + 27, 20, 18, 0, 0, 19, RECIPE_BUTTON_TEXTURE + ) { + recipeBook.toggleOpen() + val oldX = this.x + this.x = recipeBook.findLeftEdge(width, backgroundWidth) + val offset = this.x - oldX + arrowX += offset + for (i in children()) { + if (i is ClickableWidget) { + i.x += offset + if (i is SlotWidget<*>) { + i.offsetX(offset) + } + } + } + }) + addSelectableChild(recipeBook) + setInitialFocus(recipeBook) + + // Crafting output slot + add(CraftingResultSlotWidget(handler, x + 108, y + viewedHeight * 18 + 27)) + + // Clear crafting grid button + add(ButtonWidget(x + 13, y + 18 + viewedHeight * 18, 8)) { + texture = GuiTextures.REQUEST + background = false + u = { 210 } + v = { 16 } + tooltip = { tl("craft.clear") } + onPressed = { + c2s(CLEAR_CRAFTING_GRID) { + int(syncId) + } + } + } + + arrowX = x + 83 + arrowY = y + 32 + viewedHeight * 18 + } + // Linked slot view for (i in 0 until viewedHeight * 9) { add(MultiSlotWidget(handler, i, x + (i % 9) * 18, y + (i / 9) * 18)) @@ -283,36 +331,39 @@ class RequestScreen(handler: H, inv: PlayerInventory, if (searchBar.grab) searchBar.tick() } - override fun drawBackground(matrices: MatrixStack, delta: Float, mouseX: Int, mouseY: Int) { - super.drawBackground(matrices, delta, mouseX, mouseY) + override fun render(context: DrawContext, mouseX: Int, mouseY: Int, delta: Float) { + super.render(context, mouseX, mouseY, delta) + + recipeBook.render(context, mouseX, mouseY, delta) + } + + override fun drawBackground(context: DrawContext, delta: Float, mouseX: Int, mouseY: Int) { + super.drawBackground(context, delta, mouseX, mouseY) - GuiTextures.REQUEST.bind() val viewedH = viewedHeight * 18 - drawTexture(matrices, x, y, 0, 0, 194, viewedH - 18 + 17) - drawTexture(matrices, x, y + viewedH - 18 + 17, 0, 107, 194, 115) + context.drawTexture(GuiTextures.REQUEST, x, y, 0, 0, 194, viewedH - 18 + 17) + context.drawTexture(GuiTextures.REQUEST, x, y + viewedH - 18 + 17, 0, 107, 194, 115) if (craftingGrid) { - GuiTextures.CRAFTING.bind() - drawTexture(matrices, x, y + viewedH + 17 + 7, 0, 0, 176, 157) + context.drawTexture(GuiTextures.CRAFTING, x, y + viewedH + 17 + 7, 0, 0, 176, 157) } } - override fun drawForeground(matrices: MatrixStack, mouseX: Int, mouseY: Int) { - super.drawForeground(matrices, mouseX, mouseY) + override fun drawForeground(context: DrawContext, mouseX: Int, mouseY: Int) { + super.drawForeground(context, mouseX, mouseY) - GuiTextures.REQUEST.bind() handler.slots.forEach { if (it is LockedSlot) { - drawTexture(matrices, it.x, it.y, 240, 0, 16, 16) + context.drawTexture(GuiTextures.REQUEST, it.x, it.y, 240, 0, 16, 16) } } if (craftingGrid) { - textRenderer.draw(matrices, craftingText, titleX + 21f, playerInventoryTitleY - 67f, 0x404040) + context.drawText(textRenderer, craftingText, titleX + 21, playerInventoryTitleY - 67, 0x404040, false) } if (x + titleX < mouseX && mouseX <= x + titleX + titleWidth && y + titleY < mouseY && mouseY <= y + titleY + textRenderer.fontHeight) { - renderTooltip(matrices, tl("slotCount", filledSlots, totalSlots), mouseX - x, mouseY - y) + context.drawTooltip(textRenderer, tl("slotCount", filledSlots, totalSlots), mouseX - x, mouseY - y) } } @@ -359,4 +410,10 @@ class RequestScreen(handler: H, inv: PlayerInventory, super.close() } + override fun refreshRecipeBook() { + recipeBook.refresh() + } + + override fun getRecipeBookWidget(): RecipeBookWidget = recipeBook + } diff --git a/src/main/kotlin/badasintended/slotlink/client/gui/widget/ButtonWidget.kt b/src/main/kotlin/badasintended/slotlink/client/gui/widget/ButtonWidget.kt index ab3a9cf..652bb93 100644 --- a/src/main/kotlin/badasintended/slotlink/client/gui/widget/ButtonWidget.kt +++ b/src/main/kotlin/badasintended/slotlink/client/gui/widget/ButtonWidget.kt @@ -1,14 +1,13 @@ package badasintended.slotlink.client.gui.widget import badasintended.slotlink.client.util.GuiTextures -import badasintended.slotlink.client.util.bind import badasintended.slotlink.client.util.client import net.fabricmc.api.EnvType import net.fabricmc.api.Environment +import net.minecraft.client.gui.DrawContext import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder import net.minecraft.client.gui.tooltip.Tooltip import net.minecraft.client.gui.widget.ClickableWidget -import net.minecraft.client.util.math.MatrixStack import net.minecraft.screen.ScreenTexts import net.minecraft.text.Text @@ -41,7 +40,7 @@ class ButtonWidget(x: Int, y: Int, w: Int, h: Int = w) : ClickableWidget(x, y, w padding.b = b } - override fun renderButton(matrices: MatrixStack, mouseX: Int, mouseY: Int, delta: Float) { + override fun renderButton(context: DrawContext, mouseX: Int, mouseY: Int, delta: Float) { val tooltip = this.tooltip() if (tooltip != lastTooltip) { setTooltip(Tooltip.of(tooltip)) @@ -49,15 +48,14 @@ class ButtonWidget(x: Int, y: Int, w: Int, h: Int = w) : ClickableWidget(x, y, w } if (!visible) return - texture.bind() if (background) { val u = if (hovered) bgU + width else bgU - drawTexture(matrices, x, y, u, bgV, width, height) + context.drawTexture(texture, x, y, u, bgV, width, height) } padding.apply { - drawTexture(matrices, x + l, y + t, u(), v(), width - l - r, height - t - b) + context.drawTexture(texture, x + l, y + t, u(), v(), width - l - r, height - t - b) } } diff --git a/src/main/kotlin/badasintended/slotlink/client/gui/widget/FilterSlotWidget.kt b/src/main/kotlin/badasintended/slotlink/client/gui/widget/FilterSlotWidget.kt index 7812396..094670a 100644 --- a/src/main/kotlin/badasintended/slotlink/client/gui/widget/FilterSlotWidget.kt +++ b/src/main/kotlin/badasintended/slotlink/client/gui/widget/FilterSlotWidget.kt @@ -12,8 +12,8 @@ import badasintended.slotlink.util.stack import net.fabricmc.api.EnvType import net.fabricmc.api.Environment import net.minecraft.client.MinecraftClient +import net.minecraft.client.gui.DrawContext import net.minecraft.client.gui.screen.Screen -import net.minecraft.client.util.math.MatrixStack import net.minecraft.item.ItemStack import net.minecraft.text.Text import net.minecraft.util.Formatting @@ -42,21 +42,21 @@ class FilterSlotWidget( tooltip.add(Text.translatable("container.slotlink.filter.slot.nbt.scroll").formatted(Formatting.GRAY)) } - override fun renderOverlay(matrices: MatrixStack, stack: ItemStack) { - super.renderOverlay(matrices, stack) + override fun renderOverlay(context: DrawContext, stack: ItemStack) { + super.renderOverlay(context, stack) client.apply { - itemRenderer.renderGuiItemOverlay(matrices, textRenderer, stack, x + 1, y + 1, "") + context.drawItemInSlot(textRenderer, stack, x + 1, y + 1, "") - matrices.wrap { - matrices.translate(0.0, 0.0, 250.0) - fill(matrices, x + 1, y + 1, x + 17, y + 17, if (nbt) 0x70aa27ba else 0x408b8b8b) + context.matrices.wrap { + context.matrices.translate(0.0, 0.0, 250.0) + context.fill(x + 1, y + 1, x + 17, y + 17, if (nbt) 0x70aa27ba else 0x408b8b8b) if (nbt) { - textRenderer.drawWithShadow( - matrices, + context.drawTextWithShadow( + textRenderer, "+", - x + 17f - textRenderer.getWidth("+"), - y + 17f - textRenderer.fontHeight, + x + 17 - textRenderer.getWidth("+"), + y + 17 - textRenderer.fontHeight, 0xaa27ba ) } @@ -64,16 +64,17 @@ class FilterSlotWidget( } } - override fun renderTooltip(matrices: MatrixStack, mouseX: Int, mouseY: Int) { - super.renderTooltip(matrices, mouseX, mouseY) + override fun renderTooltip(context: DrawContext, mouseX: Int, mouseY: Int) { + super.renderTooltip(context, mouseX, mouseY) + + if (!handler.cursorStack.isEmpty || RecipeViewer.instance?.isDraggingStack == true) context.matrices.wrap { + context.matrices.translate(0.0, 0.0, +256.0) - if (!handler.cursorStack.isEmpty || RecipeViewer.instance?.isDraggingStack == true) matrices.wrap { - matrices.translate(0.0, 0.0, +256.0) val tlKey = "container.slotlink.filter.slot.tip." + if (Screen.hasControlDown()) "pressed" else if (MinecraftClient.IS_SYSTEM_MAC) "cmd" else "ctrl" - client.currentScreen?.renderTooltip(matrices, Text.translatable(tlKey), mouseX, mouseY) + context.drawTooltip(client.textRenderer, Text.translatable(tlKey), mouseX, mouseY) } } diff --git a/src/main/kotlin/badasintended/slotlink/client/gui/widget/MultiSlotWidget.kt b/src/main/kotlin/badasintended/slotlink/client/gui/widget/MultiSlotWidget.kt index 63062d4..6d648e7 100644 --- a/src/main/kotlin/badasintended/slotlink/client/gui/widget/MultiSlotWidget.kt +++ b/src/main/kotlin/badasintended/slotlink/client/gui/widget/MultiSlotWidget.kt @@ -11,8 +11,8 @@ import badasintended.slotlink.util.toFormattedString import kotlin.math.ceil import net.fabricmc.api.EnvType import net.fabricmc.api.Environment +import net.minecraft.client.gui.DrawContext import net.minecraft.client.gui.screen.Screen -import net.minecraft.client.util.math.MatrixStack import net.minecraft.item.ItemStack import net.minecraft.screen.slot.SlotActionType.CLONE import net.minecraft.screen.slot.SlotActionType.PICKUP @@ -36,21 +36,21 @@ class MultiSlotWidget( private val count get() = handler.itemViews[index].count - override fun renderOverlay(matrices: MatrixStack, stack: ItemStack) { + override fun renderOverlay(context: DrawContext, stack: ItemStack) { client.apply { - itemRenderer.renderGuiItemOverlay(matrices, textRenderer, stack, x + 1, y + 1, "") + context.drawItemInSlot(textRenderer, stack, x + 1, y + 1, "") val factor = window.scaleFactor.toFloat() val scale = (1 / factor) * ceil(factor / 2) val countText = if (count <= 1) "" else count.toFormattedString() - matrices.wrap { - matrices.translate(0.0, 0.0, 250.0) - matrices.scale(scale, scale, 1f) - textRenderer.drawWithShadow( - matrices, countText, ((x + 17 - (textRenderer.getWidth(countText) * scale)) / scale), - ((y + 17 - (textRenderer.fontHeight * scale)) / scale), 0xFFFFFF + context.matrices.wrap { + context.matrices.translate(0.0, 0.0, 250.0) + context.matrices.scale(scale, scale, 1f) + context.drawTextWithShadow( + textRenderer, countText, ((x + 17 - (textRenderer.getWidth(countText) * scale)) / scale).toInt(), + ((y + 17 - (textRenderer.fontHeight * scale)) / scale).toInt(), 0xFFFFFF ) } } diff --git a/src/main/kotlin/badasintended/slotlink/client/gui/widget/ScrollBarWidget.kt b/src/main/kotlin/badasintended/slotlink/client/gui/widget/ScrollBarWidget.kt index 2ee19ea..a790b8f 100644 --- a/src/main/kotlin/badasintended/slotlink/client/gui/widget/ScrollBarWidget.kt +++ b/src/main/kotlin/badasintended/slotlink/client/gui/widget/ScrollBarWidget.kt @@ -1,10 +1,9 @@ package badasintended.slotlink.client.gui.widget import badasintended.slotlink.client.util.GuiTextures -import badasintended.slotlink.client.util.bind import net.fabricmc.api.EnvType import net.fabricmc.api.Environment -import net.minecraft.client.util.math.MatrixStack +import net.minecraft.client.gui.DrawContext @Environment(EnvType.CLIENT) class ScrollBarWidget(x: Int, y: Int, h: Int) : NoSoundWidget(x, y, 14, h.coerceAtLeast(17)) { @@ -18,13 +17,12 @@ class ScrollBarWidget(x: Int, y: Int, h: Int) : NoSoundWidget(x, y, 14, h.coerce private var knobY = 1 private var clicked = false - override fun renderButton(matrices: MatrixStack, mouseX: Int, mouseY: Int, delta: Float) { + override fun renderButton(context: DrawContext, mouseX: Int, mouseY: Int, delta: Float) { if (!visible) return - GuiTextures.REQUEST.bind() knobY = y + 1 + ((height - 17) * knob).toInt() val u = 194 + if (hasKnob.invoke()) 0 else 12 - drawTexture(matrices, x + 1, knobY, u, 0, 12, 15) + context.drawTexture(GuiTextures.REQUEST, x + 1, knobY, u, 0, 12, 15) } override fun mouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean { diff --git a/src/main/kotlin/badasintended/slotlink/client/gui/widget/SlotWidget.kt b/src/main/kotlin/badasintended/slotlink/client/gui/widget/SlotWidget.kt index 34b4479..010b39c 100644 --- a/src/main/kotlin/badasintended/slotlink/client/gui/widget/SlotWidget.kt +++ b/src/main/kotlin/badasintended/slotlink/client/gui/widget/SlotWidget.kt @@ -5,9 +5,9 @@ import badasintended.slotlink.client.util.wrap import badasintended.slotlink.compat.recipe.RecipeViewer import net.fabricmc.api.EnvType import net.fabricmc.api.Environment +import net.minecraft.client.gui.DrawContext import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder import net.minecraft.client.item.TooltipContext -import net.minecraft.client.util.math.MatrixStack import net.minecraft.item.ItemStack import net.minecraft.screen.ScreenHandler import net.minecraft.screen.ScreenTexts @@ -23,25 +23,29 @@ abstract class SlotWidget( val stack get() = stackGetter.invoke() - private val stackX = x - 8 + width / 2 + private var stackX = x - 8 + width / 2 private val stackY = y - 8 + height / 2 + fun offsetX(offset: Int) { + stackX += offset + } + abstract fun onClick(button: Int) protected open fun appendTooltip(tooltip: MutableList) {} - protected open fun renderOverlay(matrices: MatrixStack, stack: ItemStack) { + protected open fun renderOverlay(context: DrawContext, stack: ItemStack) { client.apply { - itemRenderer.renderGuiItemOverlay(matrices, textRenderer, stack, stackX, stackY) + context.drawItemInSlot(textRenderer, stack, stackX, stackY) } } - override fun renderTooltip(matrices: MatrixStack, mouseX: Int, mouseY: Int) { - matrices.wrap { - matrices.translate(0.0, 0.0, +256.0) + override fun renderTooltip(context: DrawContext, mouseX: Int, mouseY: Int) { + context.matrices.wrap { + context.matrices.translate(0.0, 0.0, +256.0) val x = stackX val y = stackY - fill(matrices, x, y, x + 16, y + 16, -2130706433 /*0x80ffffff fuck*/) + context.fill(x, y, x + 16, y + 16, -2130706433 /*0x80ffffff fuck*/) if (!stack.isEmpty && handler.cursorStack.isEmpty && RecipeViewer.instance?.isDraggingStack != true) client.apply { val tooltips = stack.getTooltip( @@ -49,15 +53,15 @@ abstract class SlotWidget( TooltipContext.Default(options.advancedItemTooltips, player?.isCreative ?: false) ) appendTooltip(tooltips) - currentScreen?.renderTooltip(matrices, tooltips, mouseX, mouseY) + context.drawTooltip(textRenderer, tooltips, mouseX, mouseY) } } } - final override fun renderButton(matrices: MatrixStack, mouseX: Int, mouseY: Int, delta: Float) { + final override fun renderButton(context: DrawContext, mouseX: Int, mouseY: Int, delta: Float) { if (!visible) return - client.itemRenderer.renderGuiItemIcon(matrices, stack, stackX, stackY) - renderOverlay(matrices, stack) + context.drawItem(stack, stackX, stackY) + renderOverlay(context, stack) } final override fun mouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean { diff --git a/src/main/kotlin/badasintended/slotlink/client/gui/widget/TextFieldWidget.kt b/src/main/kotlin/badasintended/slotlink/client/gui/widget/TextFieldWidget.kt index 7e39352..3d1bd9d 100644 --- a/src/main/kotlin/badasintended/slotlink/client/gui/widget/TextFieldWidget.kt +++ b/src/main/kotlin/badasintended/slotlink/client/gui/widget/TextFieldWidget.kt @@ -4,8 +4,8 @@ import badasintended.slotlink.client.util.client import badasintended.slotlink.util.focusedTicks import net.fabricmc.api.EnvType import net.fabricmc.api.Environment +import net.minecraft.client.gui.DrawContext import net.minecraft.client.gui.widget.TextFieldWidget -import net.minecraft.client.util.math.MatrixStack import net.minecraft.text.Text @Environment(EnvType.CLIENT) @@ -27,8 +27,8 @@ class TextFieldWidget(bgX: Int, bgY: Int, bgW: Int, bgH: Int, text: Text) : setEditableColor(0xffffff) } - override fun renderTooltip(matrices: MatrixStack, mouseX: Int, mouseY: Int) { - if (visible && !isActive) client.currentScreen?.renderTooltip(matrices, tooltip, mouseX, mouseY) + override fun renderTooltip(context: DrawContext, mouseX: Int, mouseY: Int) { + if (visible && !isActive) context.drawTooltip(client.textRenderer, tooltip, mouseX, mouseY) } override fun mouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean { diff --git a/src/main/kotlin/badasintended/slotlink/client/gui/widget/WidgetUtils.kt b/src/main/kotlin/badasintended/slotlink/client/gui/widget/WidgetUtils.kt index 74b0033..6837238 100644 --- a/src/main/kotlin/badasintended/slotlink/client/gui/widget/WidgetUtils.kt +++ b/src/main/kotlin/badasintended/slotlink/client/gui/widget/WidgetUtils.kt @@ -1,7 +1,7 @@ package badasintended.slotlink.client.gui.widget +import net.minecraft.client.gui.DrawContext import net.minecraft.client.gui.widget.ClickableWidget -import net.minecraft.client.util.math.MatrixStack inline fun ClickableWidget.bounds(action: (Int, Int, Int, Int) -> T): T { return action(x, y, width, height) @@ -21,6 +21,6 @@ interface CharGrabber { interface TooltipRenderer { - fun renderTooltip(matrices: MatrixStack, mouseX: Int, mouseY: Int) + fun renderTooltip(context: DrawContext, mouseX: Int, mouseY: Int) } \ No newline at end of file diff --git a/src/main/kotlin/badasintended/slotlink/init/Items.kt b/src/main/kotlin/badasintended/slotlink/init/Items.kt index 4379e1e..ec6135c 100644 --- a/src/main/kotlin/badasintended/slotlink/init/Items.kt +++ b/src/main/kotlin/badasintended/slotlink/init/Items.kt @@ -6,20 +6,19 @@ import badasintended.slotlink.item.MultiDimRemoteItem import badasintended.slotlink.item.UnlimitedRemoteItem import badasintended.slotlink.util.modId import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup +import net.minecraft.item.ItemGroup import net.minecraft.item.ItemStack +import net.minecraft.registry.Registries import net.minecraft.registry.Registries.ITEM import net.minecraft.registry.Registry +import net.minecraft.registry.RegistryKey +import net.minecraft.registry.RegistryKeys +import net.minecraft.text.Text @Suppress("MemberVisibilityCanBePrivate", "unused") object Items : Initializer { - val GROUP = FabricItemGroup.builder(modId("group")) - .icon { ItemStack(Blocks.MASTER) } - .entries { _, entries -> - Blocks.BLOCKS.forEach { entries.add(ItemStack(it)) } - ITEMS.forEach { entries.add(ItemStack(it)) } - } - .build()!! + val GROUP: RegistryKey = RegistryKey.of(RegistryKeys.ITEM_GROUP, modId("group")) val ITEMS = arrayListOf() @@ -29,6 +28,15 @@ object Items : Initializer { override fun main() { r(MULTI_DIM_REMOTE, UNLIMITED_REMOTE, LIMITED_REMOTE) + + Registry.register(Registries.ITEM_GROUP, GROUP, FabricItemGroup.builder() + .displayName(Text.literal("Slotlink")) + .icon { ItemStack(Blocks.MASTER) } + .entries { _, entries -> + Blocks.BLOCKS.forEach { entries.add(ItemStack(it)) } + ITEMS.forEach { entries.add(ItemStack(it)) } + } + .build()!!) } private fun r(vararg items: ModItem) { diff --git a/src/main/kotlin/badasintended/slotlink/network/Node.kt b/src/main/kotlin/badasintended/slotlink/network/Node.kt index c552422..936be9a 100644 --- a/src/main/kotlin/badasintended/slotlink/network/Node.kt +++ b/src/main/kotlin/badasintended/slotlink/network/Node.kt @@ -10,7 +10,8 @@ interface Node { fun connect(adjacentNode: Node?): Boolean { val other = adjacentNode ?: return false - val side = Direction.fromVector(connection.pos.subtract(other.connection.pos))!! + val vector = connection.pos.subtract(other.connection.pos) + val side = Direction.fromVector(vector.x, vector.y, vector.z)!! connection.sides.add(side.opposite) other.connection.sides.add(side) diff --git a/src/main/kotlin/badasintended/slotlink/screen/RequestScreenHandler.kt b/src/main/kotlin/badasintended/slotlink/screen/RequestScreenHandler.kt index 6200ffe..0f52730 100644 --- a/src/main/kotlin/badasintended/slotlink/screen/RequestScreenHandler.kt +++ b/src/main/kotlin/badasintended/slotlink/screen/RequestScreenHandler.kt @@ -32,6 +32,7 @@ import kotlin.collections.set import kotlin.math.ceil import kotlin.math.min import net.fabricmc.fabric.api.transfer.v1.item.ItemVariant +import net.fabricmc.fabric.api.transfer.v1.storage.StorageUtil import net.fabricmc.fabric.api.transfer.v1.storage.StorageView import net.fabricmc.fabric.api.transfer.v1.transaction.Transaction import net.minecraft.entity.player.PlayerEntity @@ -190,7 +191,7 @@ open class RequestScreenHandler( } QUICK_MOVE -> Transaction.openOuter().use { transaction -> - val stock = storage.simulateExtract(variant, variant.item.maxCount.toLong(), transaction) + val stock = StorageUtil.simulateExtract(storage, variant, variant.item.maxCount.toLong(), transaction) val inserted = player.storage.offer(variant, stock, transaction) storage.extract(variant, inserted, transaction) transaction.commit() @@ -263,7 +264,7 @@ open class RequestScreenHandler( } } } - result.unlockLastRecipe(player) + result.unlockLastRecipe(player, null) // TODO is null okay here result.setStack(0, ItemStack.EMPTY) onContentChanged(input) if (!quickMove || finished) break @@ -296,7 +297,7 @@ open class RequestScreenHandler( if (it.inventory is PlayerInventory && it.index >= 9 && it.canTakeItems(player) - && (cursor.isEmpty || cursor.isItemEqual(it.stack)) + && (cursor.isEmpty || ItemStack.areItemsEqual(cursor, it.stack)) ) { it.stack = moveStackToNetwork(it.stack) } diff --git a/src/main/kotlin/badasintended/slotlink/util/Utils.kt b/src/main/kotlin/badasintended/slotlink/util/Utils.kt index e909372..98a394e 100644 --- a/src/main/kotlin/badasintended/slotlink/util/Utils.kt +++ b/src/main/kotlin/badasintended/slotlink/util/Utils.kt @@ -95,7 +95,7 @@ fun s2c(player: PlayerEntity, packet: Packet<*>) { val ignoredTag: TagKey = TagKey.of(RegistryKeys.BLOCK, modId("ignored")) fun ItemStack.isItemAndTagEqual(other: ItemStack): Boolean { - return ItemStack.areItemsEqual(this, other) && ItemStack.areNbtEqual(this, other) + return ItemStack.canCombine(this, other) } fun ItemStack.merge(from: ItemStack): Pair {