diff --git a/build.gradle.kts b/build.gradle.kts index 746334c..9cd8fb4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,8 +6,10 @@ plugins { version = "${property("mod.version")}+${stonecutter.current.version}" base.archivesName = property("mod.id") as String +group = "dev.wekend" repositories { + mavenLocal() /** * Restricts dependency search of the given [groups] to the [maven URL][url], * improving the setup speed. @@ -42,7 +44,10 @@ dependencies { modImplementation("com.terraformersmc:modmenu:${property("deps.modmenu")}") modImplementation("dev.isxander:yet-another-config-lib:${property("deps.yacl")}") include(modImplementation("de.siphalor.amecs-api:amecs-api-mc${stonecutter.current.version}:${property("deps.amecs")}")!!) + include(modImplementation("llc.redstone:SystemAPI:0.0.1+1.21.9")!!) + implementation("com.github.shynixn.mccoroutine:mccoroutine-fabric-api:2.22.0") + implementation("com.github.shynixn.mccoroutine:mccoroutine-fabric-core:2.22.0") fapi("fabric-lifecycle-events-v1", "fabric-resource-loader-v0", "fabric-content-registries-v0") @@ -68,6 +73,18 @@ java { sourceCompatibility = javaVersion } +publishing { + + publications { + create("mavenJava") { + from(components["java"]) + groupId = project.group.toString() + artifactId = "HousingToolbox" + version = project.version.toString() + } + } +} + tasks { processResources { val props = mapOf( diff --git a/gradle.properties b/gradle.properties index 354b060..7a22a4a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,11 +4,12 @@ org.gradle.parallel=true org.gradle.configuration-cache=true # Mod properties -mod.version=0.2.2 +mod.version=0.2.3 mod.group=dev.wekend mod.id=housingtoolbox mod.name=Housing Toolbox # Global dependencies deps.fabric_loader=0.17.3 -deps.fabric_language_kotlin=1.13.6+kotlin.2.2.20 \ No newline at end of file +deps.fabric_language_kotlin=1.13.6+kotlin.2.2.20 +deps.knbt=0.11.8 \ No newline at end of file diff --git a/src/main/java/dev/wekend/housingtoolbox/mixins/menu/AnvilScreenMixin.java b/src/main/java/dev/wekend/housingtoolbox/mixins/menu/AnvilScreenMixin.java deleted file mode 100644 index 8e49f4c..0000000 --- a/src/main/java/dev/wekend/housingtoolbox/mixins/menu/AnvilScreenMixin.java +++ /dev/null @@ -1,50 +0,0 @@ -package dev.wekend.housingtoolbox.mixins.menu; - -import dev.wekend.housingtoolbox.config.HousingToolboxSettings; -import net.minecraft.client.gui.screen.ingame.AnvilScreen; -import net.minecraft.client.gui.screen.ingame.ForgingScreen; -import net.minecraft.client.input.KeyInput; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; -import net.minecraft.screen.AnvilScreenHandler; -import net.minecraft.screen.slot.SlotActionType; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -@Mixin(AnvilScreen.class) -public abstract class AnvilScreenMixin extends ForgingScreen { - - public AnvilScreenMixin(AnvilScreenHandler handler, PlayerInventory playerInventory, Text title, Identifier texture) { - super(handler, playerInventory, title, texture); - } - - @Inject(method = "keyPressed", at = @At("HEAD")) - private void onEnterKeyPressed(KeyInput input, CallbackInfoReturnable cir) { - if (!HousingToolboxSettings.Companion.getAnvilEnterConfirm().get()) return; - if (!input.isEnter()) return; - - if (!HousingToolboxSettings.Companion.getAnvilEnterConfirmGlobal().get()) { - ItemStack item = this.handler.getSlot(0).getStack(); - if (item == null) return; - - if (item.getItem() != Items.PAPER) return; - if (item.getName().getLiteralString() != null) return; - } - - // Click output slot - if (client == null || client.interactionManager == null) return; - client.interactionManager.clickSlot( - this.handler.syncId, - 2, - 0, - SlotActionType.PICKUP, - client.player - ); - } - -} diff --git a/src/main/java/dev/wekend/housingtoolbox/mixins/menu/SignScreenMixin.java b/src/main/java/dev/wekend/housingtoolbox/mixins/menu/SignScreenMixin.java index 454ddbb..1d24bbf 100644 --- a/src/main/java/dev/wekend/housingtoolbox/mixins/menu/SignScreenMixin.java +++ b/src/main/java/dev/wekend/housingtoolbox/mixins/menu/SignScreenMixin.java @@ -1,7 +1,7 @@ package dev.wekend.housingtoolbox.mixins.menu; import dev.wekend.housingtoolbox.config.HousingToolboxSettings; -import dev.wekend.housingtoolbox.util.TextUtils; +import dev.wekend.housingtoolbox.utils.TextUtils; import net.minecraft.block.entity.SignText; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.ingame.AbstractSignEditScreen; diff --git a/src/main/kotlin/dev/wekend/housingtoolbox/HousingToolbox.kt b/src/main/kotlin/dev/wekend/housingtoolbox/HousingToolbox.kt index 3b4cf3e..80775e3 100644 --- a/src/main/kotlin/dev/wekend/housingtoolbox/HousingToolbox.kt +++ b/src/main/kotlin/dev/wekend/housingtoolbox/HousingToolbox.kt @@ -1,7 +1,10 @@ package dev.wekend.housingtoolbox +import com.github.shynixn.mccoroutine.fabric.mcCoroutineConfiguration import dev.wekend.housingtoolbox.feature.ChatInput import dev.wekend.housingtoolbox.keybind.KeyBindings +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Dispatchers import net.fabricmc.api.ClientModInitializer import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents import net.minecraft.client.MinecraftClient @@ -26,5 +29,7 @@ object HousingToolbox : ClientModInitializer { ClientReceiveMessageEvents.GAME.register { message, _ -> ChatInput.onGameMessage(message) } KeyBindings.init() + + mcCoroutineConfiguration.minecraftExecutor = MinecraftClient.getInstance() } } \ No newline at end of file diff --git a/src/main/kotlin/dev/wekend/housingtoolbox/keybind/KeyNav.kt b/src/main/kotlin/dev/wekend/housingtoolbox/keybind/KeyNav.kt index 1d3fbbf..6227437 100644 --- a/src/main/kotlin/dev/wekend/housingtoolbox/keybind/KeyNav.kt +++ b/src/main/kotlin/dev/wekend/housingtoolbox/keybind/KeyNav.kt @@ -1,11 +1,17 @@ package dev.wekend.housingtoolbox.keybind +import com.github.shynixn.mccoroutine.fabric.launch import de.siphalor.amecs.api.KeyModifiers +import dev.wekend.housingtoolbox.HousingToolbox import dev.wekend.housingtoolbox.keybind.KeyBindings.KeySpec -import dev.wekend.housingtoolbox.util.MenuUtils -import dev.wekend.housingtoolbox.util.MenuUtils.clickMenuTargets +import llc.redstone.systemapi.util.MenuUtils +import llc.redstone.systemapi.util.MenuUtils.clickMenuTargets +import net.minecraft.client.MinecraftClient +import net.minecraft.item.ItemStack import net.minecraft.item.Items +import net.minecraft.nbt.NbtOps import org.lwjgl.glfw.GLFW +import kotlin.jvm.optionals.getOrNull object KeyNav { @@ -29,6 +35,23 @@ object KeyNav { ) } ), + KeySpec( + id = "copyitemnbt", + key = GLFW.GLFW_KEY_C, + modifiers = KeyModifiers(false, true, true), + onPress = { + val stack = MinecraftClient.getInstance().player?.inventory?.selectedStack + val result = ItemStack.CODEC.encodeStart(NbtOps.INSTANCE, stack).result().getOrNull() + + if (result != null) { + val str = result.toString() + MinecraftClient.getInstance().keyboard.setClipboard(str) + true + } else { + false + } + } + ), KeySpec( id = "paste", key = GLFW.GLFW_KEY_V, diff --git a/src/main/kotlin/dev/wekend/housingtoolbox/util/MenuUtils.kt b/src/main/kotlin/dev/wekend/housingtoolbox/util/MenuUtils.kt deleted file mode 100644 index 5f9775f..0000000 --- a/src/main/kotlin/dev/wekend/housingtoolbox/util/MenuUtils.kt +++ /dev/null @@ -1,54 +0,0 @@ -package dev.wekend.housingtoolbox.util - -import dev.wekend.housingtoolbox.HousingToolbox.MC -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap -import net.minecraft.client.gui.screen.ingame.GenericContainerScreen -import net.minecraft.component.DataComponentTypes -import net.minecraft.item.Item -import net.minecraft.network.packet.c2s.play.ClickSlotC2SPacket -import net.minecraft.screen.slot.SlotActionType -import net.minecraft.screen.sync.ItemStackHash - -object MenuUtils { - - data class Target(val menuSlot: MenuSlot, val button: Int = 0) - data class MenuSlot(val item: Item, val label: String) - - private inline fun withContainer(block: (GenericContainerScreen) -> Boolean): Boolean { - val gui = MC.currentScreen as? GenericContainerScreen ?: return false - return block(gui) - } - - private fun findSlot(gui: GenericContainerScreen, item: Item, name: String) = - gui.screenHandler.slots.firstOrNull { - it.stack.item == item && - it.stack.components.get(DataComponentTypes.CUSTOM_NAME)?.string == name - } - - fun click(gui: GenericContainerScreen, slot: Int, button: Int = 0) { - val pkt = ClickSlotC2SPacket( - gui.screenHandler.syncId, - gui.screenHandler.revision, - slot.toShort(), - button.toByte(), - SlotActionType.PICKUP, - Int2ObjectOpenHashMap(), - ItemStackHash.EMPTY - ) - MC.networkHandler?.sendPacket(pkt) - } - - - fun clickMenuSlot(vararg slots: MenuSlot): Boolean = - clickMenuTargets(*slots.map { Target(it) }.toTypedArray()) - - fun clickMenuTargets(vararg attempts: Target): Boolean = - withContainer { gui -> - val match = attempts.firstNotNullOfOrNull { - val slot = findSlot(gui, it.menuSlot.item, it.menuSlot.label) - if (slot != null) it to slot else null - } ?: return@withContainer false - click(gui, match.second.id, match.first.button) - true - } -} \ No newline at end of file diff --git a/src/main/kotlin/dev/wekend/housingtoolbox/util/TextUtils.kt b/src/main/kotlin/dev/wekend/housingtoolbox/utils/TextUtils.kt similarity index 93% rename from src/main/kotlin/dev/wekend/housingtoolbox/util/TextUtils.kt rename to src/main/kotlin/dev/wekend/housingtoolbox/utils/TextUtils.kt index 5f09f3d..750ca4b 100644 --- a/src/main/kotlin/dev/wekend/housingtoolbox/util/TextUtils.kt +++ b/src/main/kotlin/dev/wekend/housingtoolbox/utils/TextUtils.kt @@ -1,4 +1,4 @@ -package dev.wekend.housingtoolbox.util +package dev.wekend.housingtoolbox.utils import net.minecraft.block.entity.SignText diff --git a/src/main/resources/housingtoolbox.mixins.json b/src/main/resources/housingtoolbox.mixins.json index a0db7c3..30d6d25 100644 --- a/src/main/resources/housingtoolbox.mixins.json +++ b/src/main/resources/housingtoolbox.mixins.json @@ -4,8 +4,9 @@ "package": "dev.wekend.housingtoolbox.mixins", "compatibilityLevel": "JAVA_21", "client": [ - "menu.AnvilScreenMixin", + "menu.ClientPlayNetworkHandlerMixin", "menu.ScreenCloseMixin", + "menu.ScreenRenderMixin", "menu.SignScreenMixin" ], "injectors": {