diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f83e649..d613222 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,11 +19,11 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v4 with: distribution: 'temurin' - java-version: 17 + java-version: 21 - name: Cache gradle files uses: actions/cache@v4 diff --git a/build.gradle.kts b/build.gradle.kts index 63dfc9e..039ec8b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,19 +2,18 @@ import com.diffplug.gradle.spotless.BaseKotlinExtension plugins { id("maven-publish") - id("dev.architectury.loom") version "1.7-SNAPSHOT" apply false - // TODO: the preprocessor doesn't yet work with Kotlin 1.9 - // https://github.com/ReplayMod/remap/pull/17 - kotlin("jvm") version "1.8.22" apply false + id("dev.architectury.loom") version "1.13-SNAPSHOT" apply false + // Kotlin 2.1+ is still incompatible with the preprocessor/remap + kotlin("jvm") version "2.0.21" apply false // https://github.com/ReplayMod/preprocessor // https://github.com/Fallen-Breath/preprocessor - id("com.replaymod.preprocess") version "ce1aeb2b" + id("com.replaymod.preprocess") version "d452ef76" // https://github.com/Fallen-Breath/yamlang - id("me.fallenbreath.yamlang") version "1.3.1" apply false + id("me.fallenbreath.yamlang") version "1.5.0" apply false - id("com.diffplug.spotless") version "6.25.0" + id("com.diffplug.spotless") version "8.0.0" } tasks.named("assemble").get().dependsOn("spotlessApply") @@ -28,27 +27,17 @@ repositories { @Suppress("LocalVariableName", "ktlint:standard:property-naming") preprocess { - val mc12001_common = createNode("1.20.1-common", 1_20_01, "yarn") - val mc12001_fabric = createNode("1.20.1-fabric", 1_20_01, "yarn") - val mc12001_forge = createNode("1.20.1-forge", 1_20_01, "yarn") + // it doesn't seem to be possible to explicitly set the descriptor of a field, + // which we would need for strict mappings to work + strictExtraMappings = false - val mc12002_fabric = createNode("1.20.2-fabric", 1_20_02, "yarn") - val mc12002_neoforge = createNode("1.20.2-neoforge", 1_20_02, "yarn") + val mc12006_common = createNode("1.20.6-common", 1_20_06, "yarn") + val mc12006_fabric = createNode("1.20.6-fabric", 1_20_06, "yarn") + val mc12006_neoforge = createNode("1.20.6-neoforge", 1_20_06, "yarn") - val mc12004_common = createNode("1.20.4-common", 1_20_04, "yarn") - val mc12004_fabric = createNode("1.20.4-fabric", 1_20_04, "yarn") - val mc12004_neoforge = createNode("1.20.4-neoforge", 1_20_04, "yarn") - - // 1.20.1 - mc12002_fabric.link(mc12001_fabric, null) - mc12004_common.link(mc12001_common, null) - mc12001_common.link(mc12001_forge, file("versions/mappings-common-forge.txt")) - // 1.20.2 - mc12004_fabric.link(mc12002_fabric, null) - mc12004_neoforge.link(mc12002_neoforge, null) - // 1.20.4 - mc12004_common.link(mc12004_fabric, null) - mc12004_common.link(mc12004_neoforge, file("versions/mappings-common-neoforge.txt")) + // 1.20.6 + mc12006_common.link(mc12006_fabric, null) + mc12006_common.link(mc12006_neoforge, file("versions/mappings-common-neoforge.txt")) } spotless { diff --git a/common.gradle.kts b/common.gradle.kts index 25806d5..828576c 100644 --- a/common.gradle.kts +++ b/common.gradle.kts @@ -1,7 +1,6 @@ import kotlin.reflect.KProperty import kotlin.reflect.jvm.jvmErasure import org.gradle.jvm.tasks.Jar -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { id("maven-publish") @@ -12,25 +11,21 @@ plugins { } val loaderName = if (project.name.endsWith("-common")) "common" else loom.platform.get().name.lowercase() -assert(loaderName in listOf("common", "fabric", "forge", "neoforge")) +assert(loaderName in listOf("common", "fabric", "neoforge")) assert(project.name.endsWith("-$loaderName")) enum class Loader { COMMON, FABRIC, - FORGE, NEOFORGE, ; val isCommon get() = this == COMMON val isFabric get() = this == FABRIC - val isForge get() = this == FORGE val isNeoForge get() = this == NEOFORGE - val isForgeLike get() = this == FORGE || this == NEOFORGE } val loader = when (loaderName) { "common" -> Loader.COMMON "fabric" -> Loader.FABRIC - "forge" -> Loader.FORGE "neoforge" -> Loader.NEOFORGE else -> throw AssertionError("invalid loader '$loaderName'") } @@ -42,9 +37,7 @@ val mcVersion: Int by project.extra preprocess { vars.put("MC", mcVersion) vars.put("FABRIC", loader.isFabric.toInt()) - vars.put("FORGE", loader.isForge.toInt()) vars.put("NEOFORGE", loader.isNeoForge.toInt()) - vars.put("FORGELIKE", loader.isForgeLike.toInt()) } @Suppress("PropertyName") @@ -77,8 +70,7 @@ class Props { val issues_url: String by prop val fabric_kotlin_version: String by prop - val forge_kotlin_version: String by prop - val mixinextras_version: String by prop + val neoforge_kotlin_version: String by prop val conditional_mixin_version: String by prop val run_with_compat_mods: Boolean by prop @@ -86,11 +78,10 @@ class Props { //// Version Specific Properties //// val minecraft_version: String by prop val yarn_mappings: String by prop + val yarn_mappings_patch: String by prop val minecraft_version_range_fabric: String by prop val minecraft_version_range_forge: String by prop - val forge_version: String by prop - val forge_version_range: String by prop val neoforge_version: String by prop val neoforge_version_range: String by prop @@ -101,7 +92,6 @@ class Props { val fabric_api_version: String by prop val modmenu_version: String by prop val trinkets_version: String by prop - val cca_version: String by prop val curios_version: String by prop } @@ -115,18 +105,6 @@ loom { vmArg("-Dmixin.debug.export=true") } - if (loader.isForge) { - forge.mixinConfigs = listOf( - "${props.mod_id}.mixins.json", - "${props.mod_id}-forge.mixins.json", - ) - // workaround for https://github.com/SpongePowered/Mixin/issues/560 - // TODO: remove this when Mixin 0.8.6 is out or you find another proper fix - forge.useCustomMixin = false - @Suppress("UnstableApiUsage") - mixin.useLegacyMixinAp = false - } - rootDir.resolve("src/main/resources/${props.mod_id}.accesswidener").let { if (it.exists()) { accessWidenerPath = it @@ -147,10 +125,6 @@ repositories { // NeoForge maven("https://maven.neoforged.net/releases") } - Loader.FORGE -> { - // MixinExtras - mavenCentral() - } } if (!loader.isFabric) { // Kotlin for Forge @@ -172,10 +146,17 @@ repositories { dependencies { minecraft("com.mojang:minecraft:${props.minecraft_version}") - mappings("net.fabricmc:yarn:${props.yarn_mappings}:v2") + mappings( + loom.layered { + mappings("net.fabricmc:yarn:${props.yarn_mappings}:v2") + if (loader == Loader.NEOFORGE) { + mappings("dev.architectury:yarn-mappings-patch-neoforge:${props.yarn_mappings_patch}") + } + }, + ) // outside the fabric specific projects this should only be used for the @Environment annotation - modImplementation("net.fabricmc:fabric-loader:${props.fabric_loader_version}") + modCompileOnly("net.fabricmc:fabric-loader:${props.fabric_loader_version}") fun modCompat(dependencyNotation: String, dependencyConfiguration: ExternalModuleDependency.() -> Unit = {}) = if (props.run_with_compat_mods) { @@ -194,6 +175,7 @@ dependencies { Loader.FABRIC -> { modLocalRuntime("maven.modrinth:early-loading-screen:${props.early_loading_screen_version}") + modImplementation("net.fabricmc:fabric-loader:${props.fabric_loader_version}") modImplementation("net.fabricmc.fabric-api:fabric-api:${props.fabric_api_version}") include(modImplementation("me.fallenbreath:conditional-mixin-fabric:${props.conditional_mixin_version}")!!) @@ -207,33 +189,16 @@ dependencies { // other mods we do integration with // - Trinkets modCompat("dev.emi:trinkets:${props.trinkets_version}") - // before 3.8.1 these weren't included as modApi but as modImplementation in Trinkets, so we must add them ourselves - if (mcVersion < 12004) { - modCompileOnly("dev.onyxstudios.cardinal-components-api:cardinal-components-base:${props.cca_version}") - modCompileOnly("dev.onyxstudios.cardinal-components-api:cardinal-components-entity:${props.cca_version}") - } - } - Loader.FORGE -> { - "forge"("net.minecraftforge:forge:${props.forge_version}") - - include(modImplementation("me.fallenbreath:conditional-mixin-forge:${props.conditional_mixin_version}")!!) - - implementation("thedarkcolour:kotlinforforge:${props.forge_kotlin_version}") - modImplementation("me.shedaniel.cloth:cloth-config-forge:${props.cloth_version}") - - compileOnly(annotationProcessor("io.github.llamalad7:mixinextras-common:0.4.1")!!) - implementation(include("io.github.llamalad7:mixinextras-forge:0.4.1")!!) - - // other mods we do integration with - // - Curios API - modCompat("top.theillusivec4.curios:curios-forge:${props.curios_version}") } Loader.NEOFORGE -> { "neoForge"("net.neoforged:neoforge:${props.neoforge_version}") include(modImplementation("me.fallenbreath:conditional-mixin-neoforge:${props.conditional_mixin_version}")!!) - implementation("thedarkcolour:kotlinforforge-neoforge:${props.forge_kotlin_version}") + implementation("thedarkcolour:kotlinforforge-neoforge:${props.neoforge_kotlin_version}") { + // TODO: remove after kff 5.8 + exclude(group = "net.neoforged.fancymodloader", module = "loader") + } modImplementation("me.shedaniel.cloth:cloth-config-neoforge:${props.cloth_version}") // other mods we do integration with @@ -260,21 +225,18 @@ tasks.named("processResources") { val authors = props.mod_authors.joinToString(if (loader.isFabric) "\",\"" else ", ") - val versionsMap = mapOf( - 11904 to 13, - 12001 to 15, - 12002 to 18, - 12004 to 22, + // See https://minecraft.wiki/w/Pack_format#List_of_resource_pack_formats + val resourcePackVersions = mapOf( + 12006 to 32, ) val replaceProperties = mapOf( "minecraft_version_range_fabric" to props.minecraft_version_range_fabric, "minecraft_version_range_forge" to props.minecraft_version_range_forge, "fabric_loader_version" to props.fabric_loader_version, - "forge_version_range" to props.forge_version_range, "neoforge_version_range" to props.neoforge_version_range, "fabric_kotlin_version" to props.fabric_kotlin_version, - "forge_kotlin_version" to props.forge_kotlin_version, + "neoforge_kotlin_version" to props.neoforge_kotlin_version, "description" to props.mod_description, "homepage_url" to props.homepage_url, "sources_url" to props.sources_url, @@ -284,11 +246,11 @@ tasks.named("processResources") { "version" to fullModVersion, "license" to props.license, "authors" to authors, - "pack_format_number" to versionsMap[mcVersion], + "pack_format_number" to resourcePackVersions[mcVersion], ) inputs.properties(replaceProperties) - filesMatching(listOf("fabric.mod.json", "META-INF/mods.toml", "pack.mcmeta")) { + filesMatching(listOf("fabric.mod.json", "META-INF/neoforge.mods.toml", "pack.mcmeta")) { expand(replaceProperties + mapOf("project" to project)) } @@ -313,14 +275,11 @@ version = "v$fullModVersion" group = props.maven_group tasks.withType { - sourceCompatibility = "17" - targetCompatibility = "17" options.encoding = "UTF-8" } -tasks.withType().configureEach { - kotlinOptions.jvmTarget = "17" - kotlinOptions.freeCompilerArgs = listOf("-Xjvm-default=all") +kotlin { + jvmToolchain(21) } java { diff --git a/gradle.properties b/gradle.properties index 7155805..5b63b87 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,13 +4,13 @@ # Minecraft Properties # https://fabricmc.net/develop/ - fabric_loader_version=0.15.7 + fabric_loader_version=0.17.3 # Mod Properties mod_id=inventorio mod_name=Inventorio - mod_authors=RubixDev,LizardOfOz,Favorlock - mod_version=1.10.4 + mod_authors=RubixDev,LizardOfOz + mod_version=1.11.0 mod_description=My vision of the Inventory Update. Includes Deep Pockets Enchantment, Tool Belt, Utility Belt and more. maven_group=de.rubixdev.inventorio archives_base_name=inventorio @@ -21,11 +21,10 @@ # Global Dependencies # https://maven.fabricmc.net/net/fabricmc/fabric-language-kotlin/ - fabric_kotlin_version=1.9.6+kotlin.1.8.22 + fabric_kotlin_version=1.12.3+kotlin.2.0.21 # https://github.com/thedarkcolour/KotlinForForge/blob/site/thedarkcolour/kotlinforforge/maven-metadata.xml - forge_kotlin_version=4.10.0 - # https://mvnrepository.com/artifact/io.github.llamalad7/mixinextras-common - mixinextras_version=0.3.5 + # https://docs.google.com/spreadsheets/d/1v8K90PBa5qPFrlHBA8PSqlBTYCcp078o5E2XQbt5BUs/edit?usp=sharing + neoforge_kotlin_version=5.6.0 # https://github.com/Fallen-Breath/conditional-mixin/tags conditional_mixin_version=0.6.4 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a441313..bad7c24 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/jitpack.yml b/jitpack.yml index f3c0a5f..dc2df8a 100644 --- a/jitpack.yml +++ b/jitpack.yml @@ -1,6 +1,6 @@ jdk: - - openjdk17 + - openjdk21 before_install: - wget https://github.com/sormuras/bach/raw/master/install-jdk.sh - - source install-jdk.sh --feature 17 + - source install-jdk.sh --feature 21 - jshell --version \ No newline at end of file diff --git a/settings.json b/settings.json index ec55d2b..d251a77 100644 --- a/settings.json +++ b/settings.json @@ -1,12 +1,7 @@ { "versions": [ - "1.20.1-common", - "1.20.1-fabric", - "1.20.1-forge", - "1.20.2-fabric", - "1.20.2-neoforge", - "1.20.4-common", - "1.20.4-fabric", - "1.20.4-neoforge" + "1.20.6-common", + "1.20.6-fabric", + "1.20.6-neoforge" ] } diff --git a/src/main/java/de/rubixdev/inventorio/api/InventorioAPI.java b/src/main/java/de/rubixdev/inventorio/api/InventorioAPI.java index 707141d..b1caae7 100644 --- a/src/main/java/de/rubixdev/inventorio/api/InventorioAPI.java +++ b/src/main/java/de/rubixdev/inventorio/api/InventorioAPI.java @@ -5,7 +5,6 @@ import de.rubixdev.inventorio.config.GlobalSettings; import de.rubixdev.inventorio.player.InventorioScreenHandler; import de.rubixdev.inventorio.player.PlayerInventoryAddon; -import de.rubixdev.inventorio.util.ToolBeltMode; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.entity.player.PlayerEntity; @@ -24,58 +23,7 @@ public final class InventorioAPI { public static final String SLOT_HOE = "hoe"; static { - if (GlobalSettings.toolBeltMode.getValue() == ToolBeltMode.ENABLED) { - InventorioAPI - .registerToolBeltSlotIfNotExists( - InventorioAPI.SLOT_PICKAXE, - new Identifier("inventorio", "textures/gui/empty/pickaxe.png") - ) - .addAllowingCondition(((itemStack, addon) -> itemStack.getItem() instanceof PickaxeItem)) - .addAllowingTag(new Identifier("inventorio", "pickaxes")) - .addDenyingTag(new Identifier("inventorio", "pickaxes_blacklist")); - - InventorioAPI - .registerToolBeltSlotIfNotExists( - InventorioAPI.SLOT_SWORD, - new Identifier("inventorio", "textures/gui/empty/sword.png") - ) - .addAllowingCondition( - ((itemStack, addon) -> itemStack.getItem() instanceof SwordItem - || itemStack.getItem() instanceof TridentItem) - ) - .addAllowingTag(new Identifier("inventorio", "swords")) - .addDenyingTag(new Identifier("inventorio", "swords_blacklist")); - - InventorioAPI - .registerToolBeltSlotIfNotExists( - InventorioAPI.SLOT_AXE, - new Identifier("inventorio", "textures/gui/empty/axe.png") - ) - .addAllowingCondition(((itemStack, addon) -> itemStack.getItem() instanceof AxeItem)) - .addAllowingTag(new Identifier("inventorio", "axes")) - .addDenyingTag(new Identifier("inventorio", "axes_blacklist")); - - InventorioAPI - .registerToolBeltSlotIfNotExists( - InventorioAPI.SLOT_SHOVEL, - new Identifier("inventorio", "textures/gui/empty/shovel.png") - ) - .addAllowingCondition(((itemStack, addon) -> itemStack.getItem() instanceof ShovelItem)) - .addAllowingTag(new Identifier("inventorio", "shovels")) - .addDenyingTag(new Identifier("inventorio", "shovels_blacklist")); - - InventorioAPI - .registerToolBeltSlotIfNotExists( - InventorioAPI.SLOT_HOE, - new Identifier("inventorio", "textures/gui/empty/hoe.png") - ) - .addAllowingCondition( - ((itemStack, addon) -> itemStack.getItem() instanceof HoeItem - || itemStack.getItem() instanceof ShearsItem) - ) - .addAllowingTag(new Identifier("inventorio", "hoes")) - .addDenyingTag(new Identifier("inventorio", "hoes_blacklist")); - } + OnInitKt.onApiInit(); } private InventorioAPI() {} diff --git a/src/main/java/de/rubixdev/inventorio/mixin/PlayerEntityMixin.java b/src/main/java/de/rubixdev/inventorio/mixin/PlayerEntityMixin.java index 1b8ea4e..4b69393 100644 --- a/src/main/java/de/rubixdev/inventorio/mixin/PlayerEntityMixin.java +++ b/src/main/java/de/rubixdev/inventorio/mixin/PlayerEntityMixin.java @@ -10,7 +10,9 @@ import de.rubixdev.inventorio.util.MixinHelpers; import de.rubixdev.inventorio.util.PlayerDuck; import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.ItemStack; @@ -29,7 +31,11 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(PlayerEntity.class) -public abstract class PlayerEntityMixin implements PlayerDuck { +public abstract class PlayerEntityMixin extends LivingEntity implements PlayerDuck { + protected PlayerEntityMixin(EntityType entityType, World world) { + super(entityType, world); + } + @Shadow public abstract PlayerInventory getInventory(); @@ -129,13 +135,14 @@ private void inventorioPostAttack(Entity target, CallbackInfo ci) { */ @Inject(method = "readCustomDataFromNbt", at = @At(value = "RETURN")) private void inventorioDeserializePlayerAddon(NbtCompound tag, CallbackInfo ci) { - PlayerAddonSerializer.INSTANCE.deserialize(inventorioAddon, tag.getCompound("Inventorio")); + PlayerAddonSerializer.INSTANCE + .deserialize(this.getRegistryManager(), inventorioAddon, tag.getCompound("Inventorio")); } @Inject(method = "writeCustomDataToNbt", at = @At(value = "RETURN")) private void inventorioSerializePlayerAddon(NbtCompound tag, CallbackInfo ci) { NbtCompound inventorioTag = new NbtCompound(); - PlayerAddonSerializer.INSTANCE.serialize(inventorioAddon, inventorioTag); + PlayerAddonSerializer.INSTANCE.serialize(this.getRegistryManager(), inventorioAddon, inventorioTag); tag.put("Inventorio", inventorioTag); } diff --git a/src/main/java/de/rubixdev/inventorio/mixin/PlayerManagerMixin.java b/src/main/java/de/rubixdev/inventorio/mixin/PlayerManagerMixin.java index cf1584a..db2bd74 100644 --- a/src/main/java/de/rubixdev/inventorio/mixin/PlayerManagerMixin.java +++ b/src/main/java/de/rubixdev/inventorio/mixin/PlayerManagerMixin.java @@ -4,6 +4,7 @@ import de.rubixdev.inventorio.util.MixinHelpers; import net.minecraft.network.ClientConnection; import net.minecraft.server.PlayerManager; +import net.minecraft.server.network.ConnectedClientData; import net.minecraft.server.network.ServerPlayerEntity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -11,10 +12,6 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -//#if MC >= 12002 -import net.minecraft.server.network.ConnectedClientData; -//#endif - @Mixin(PlayerManager.class) public class PlayerManagerMixin { /** @@ -22,12 +19,10 @@ public class PlayerManagerMixin { * server to the client */ @Inject(method = "onPlayerConnect", at = @At(value = "RETURN"), require = 0) - private void inventorioSetPlayerSettings(/* #if <- hack around formatter */ + private void inventorioSetPlayerSettings( ClientConnection connection, ServerPlayerEntity player, - //#if MC >= 12002 ConnectedClientData clientData, - //#endif CallbackInfo ci ) { InventorioNetworking.getInstance().s2cSelectUtilitySlot(player); diff --git a/src/main/java/de/rubixdev/inventorio/mixin/client/InGameHudMixinLP.java b/src/main/java/de/rubixdev/inventorio/mixin/client/InGameHudMixinLP.java index 4e2a799..4e227d4 100644 --- a/src/main/java/de/rubixdev/inventorio/mixin/client/InGameHudMixinLP.java +++ b/src/main/java/de/rubixdev/inventorio/mixin/client/InGameHudMixinLP.java @@ -22,12 +22,12 @@ public class InGameHudMixinLP { * is selected. */ @Inject(method = "renderHotbar", at = @At(value = "HEAD"), cancellable = true, require = 0) - private void inventorioRenderSegmentedHotbar(float tickDelta, DrawContext context, CallbackInfo ci) { + private void inventorioRenderSegmentedHotbar(DrawContext context, float tickDelta, CallbackInfo ci) { if (HotbarHUDRenderer.INSTANCE.renderSegmentedHotbar(context)) ci.cancel(); } @Inject(method = "renderHotbar", at = @At(value = "RETURN"), require = 0) - private void inventorioRenderFunctionOnlySelector(float tickDelta, DrawContext context, CallbackInfo ci) { + private void inventorioRenderFunctionOnlySelector(DrawContext context, float tickDelta, CallbackInfo ci) { HotbarHUDRenderer.INSTANCE.renderFunctionOnlySelector(context); } diff --git a/src/main/java/de/rubixdev/inventorio/mixin/client/accessor/HandledScreenAccessor.java b/src/main/java/de/rubixdev/inventorio/mixin/client/accessor/HandledScreenAccessor.java index 174bcbd..6e1dfc9 100644 --- a/src/main/java/de/rubixdev/inventorio/mixin/client/accessor/HandledScreenAccessor.java +++ b/src/main/java/de/rubixdev/inventorio/mixin/client/accessor/HandledScreenAccessor.java @@ -14,6 +14,9 @@ public interface HandledScreenAccessorextends ScreenAcc @Accessor("backgroundWidth") int getBackgroundWidth(); + @Accessor("backgroundHeight") + int getBackgroundHeight(); + @Accessor("x") int getX(); diff --git a/src/main/java/de/rubixdev/inventorio/mixin/optional/bowfix/BowItemMixin.java b/src/main/java/de/rubixdev/inventorio/mixin/optional/bowfix/PlayerEntityMixin.java similarity index 68% rename from src/main/java/de/rubixdev/inventorio/mixin/optional/bowfix/BowItemMixin.java rename to src/main/java/de/rubixdev/inventorio/mixin/optional/bowfix/PlayerEntityMixin.java index 358f229..55245f8 100644 --- a/src/main/java/de/rubixdev/inventorio/mixin/optional/bowfix/BowItemMixin.java +++ b/src/main/java/de/rubixdev/inventorio/mixin/optional/bowfix/PlayerEntityMixin.java @@ -1,30 +1,27 @@ package de.rubixdev.inventorio.mixin.optional.bowfix; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import com.llamalad7.mixinextras.sugar.Local; import de.rubixdev.inventorio.util.BowTester; import de.rubixdev.inventorio.util.RandomStuff; import me.fallenbreath.conditionalmixin.api.annotation.Condition; import me.fallenbreath.conditionalmixin.api.annotation.Restriction; import net.minecraft.enchantment.Enchantments; -import net.minecraft.item.BowItem; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @Restriction(require = @Condition(type = Condition.Type.TESTER, tester = BowTester.class)) -@Mixin(BowItem.class) -public class BowItemMixin { +@Mixin(PlayerEntity.class) +public class PlayerEntityMixin { /** - * This fixes a bug (yes, it's a bug! check out - * {@link BowItem#onStoppedUsing} method!) that an Infinity Bow requires an - * arrow to shoot. + * This fixes a bug that an Infinity Bow requires an arrow to shoot. */ @ModifyExpressionValue( - method = "use", + method = "getProjectileType", at = @At(value = "FIELD", target = "Lnet/minecraft/entity/player/PlayerAbilities;creativeMode:Z") ) - private boolean inventorioFixInfinityBow(boolean original, @Local ItemStack bow) { + private boolean inventorioFixInfinityBow(boolean original, ItemStack bow) { return original || RandomStuff.getLevelOn(Enchantments.INFINITY, bow) > 0; } } diff --git a/src/main/java/de/rubixdev/inventorio/mixin/optional/enderchest/EnderChestBlockMixin.java b/src/main/java/de/rubixdev/inventorio/mixin/optional/enderchest/EnderChestBlockMixin.java index 968b393..c79f47d 100644 --- a/src/main/java/de/rubixdev/inventorio/mixin/optional/enderchest/EnderChestBlockMixin.java +++ b/src/main/java/de/rubixdev/inventorio/mixin/optional/enderchest/EnderChestBlockMixin.java @@ -20,7 +20,7 @@ @Mixin(value = EnderChestBlock.class) public class EnderChestBlockMixin { @Redirect( - method = "method_17468", + method = "method_55773", at = @At( value = "INVOKE", target = "Lnet/minecraft/screen/GenericContainerScreenHandler;createGeneric9x3(ILnet/minecraft/entity/player/PlayerInventory;Lnet/minecraft/inventory/Inventory;)Lnet/minecraft/screen/GenericContainerScreenHandler;" diff --git a/src/main/java/me/lizardofoz/inventorio/api/InventorioAPI.java b/src/main/java/me/lizardofoz/inventorio/api/InventorioAPI.java deleted file mode 100644 index 5ea7dfb..0000000 --- a/src/main/java/me/lizardofoz/inventorio/api/InventorioAPI.java +++ /dev/null @@ -1,195 +0,0 @@ -package me.lizardofoz.inventorio.api; - -import com.google.common.collect.ImmutableList; -import de.rubixdev.inventorio.config.GlobalSettings; -import me.lizardofoz.inventorio.client.ui.InventorioScreen; -import me.lizardofoz.inventorio.player.InventorioScreenHandler; -import me.lizardofoz.inventorio.player.PlayerInventoryAddon; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.*; -import net.minecraft.util.Identifier; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import java.util.function.Consumer; - -/** - * @deprecated Use {@link de.rubixdev.inventorio.api.InventorioAPI} instead. - */ -@SuppressWarnings({ "unused", "removal" }) -@Deprecated(forRemoval = true, since = "1.10.0") -public final class InventorioAPI { - private InventorioAPI() {} - - /** - * Items within vanilla Player Inventory can tick - * ({@link ItemStack#inventoryTick}).
- * This method opens mod authors the ability to make their items tick within - * Inventorio Addon slots.
- * Note: each tick handler gets ran within its own try-catch block.
- * Unfortunately, because the vanilla ticking needs to be supplied with a - * VANILLA slot id, it denies the possibility to inject Inventorio ticking - * into it. - * - * @deprecated Use - * {@link de.rubixdev.inventorio.api.InventorioAPI#registerInventoryTickHandler} - * instead - */ - @Deprecated(forRemoval = true, since = "1.10.0") - public static void registerInventoryTickHandler( - @NotNull Identifier customIdentifier, - @NotNull InventorioTickHandler tickHandler - ) { - de.rubixdev.inventorio.api.InventorioAPI.registerInventoryTickHandler( - customIdentifier, - (addon, section, stack, index) -> tickHandler - .tick(PlayerInventoryAddon.ofNonNull(addon), InventorioAddonSection.from(section), stack, index) - ); - } - - /** - * Note: each consumer get ran within its own try-catch block - * - * @deprecated Use - * {@link de.rubixdev.inventorio.api.InventorioAPI#registerScreenHandlerOpenConsumer} - * instead - */ - @Deprecated(forRemoval = true, since = "1.10.0") - public static void registerScreenHandlerOpenConsumer( - @NotNull Identifier customIdentifier, - Consumer screenHandlerConsumer - ) { - de.rubixdev.inventorio.api.InventorioAPI.registerScreenHandlerOpenConsumer( - customIdentifier, - handler -> screenHandlerConsumer.accept(InventorioScreenHandler.of(handler)) - ); - } - - /** - * Note: each consumer get ran within its own try-catch block - * - * @deprecated Use - * {@link de.rubixdev.inventorio.api.InventorioAPI#registerInventoryUIInitConsumer} - * instead - */ - @Deprecated(forRemoval = true, since = "1.10.0") - @Environment(EnvType.CLIENT) - public static void registerInventoryUIInitConsumer( - @NotNull Identifier customIdentifier, - Consumer uiConsumer - ) { - de.rubixdev.inventorio.api.InventorioAPI.registerInventoryUIInitConsumer( - customIdentifier, - screen -> uiConsumer.accept(InventorioScreen.of(screen)) - ); - } - - /** - * @param slotName Unique string id for the slot. Default slots available - * at {@link InventorioAPI} constants. - * @param emptyIcon Identifier/ResourceLocation that leads to an icon, e.g. - * new Identifier("your_mod", "textures/gui/empty/your_tool_slot.png") - * @return If slotName has already been taken, returns the - * existing {@link ToolBeltSlotTemplate}.
- * Creates a new one and returns it otherwise.
- * Returns NULL if {@link GlobalSettings#toolBeltMode} is set to - * DISABLED - * @throws IllegalStateException when attempted to add a new Template post - * initialization.
- * No new ToolBelt slots can be added after - * the first player has been spawned. - * @deprecated Use - * {@link de.rubixdev.inventorio.api.InventorioAPI#registerToolBeltSlotIfNotExists} - * instead - */ - @Deprecated(forRemoval = true, since = "1.10.0") - @Nullable public static ToolBeltSlotTemplate registerToolBeltSlotIfNotExists( - @NotNull String slotName, - @NotNull Identifier emptyIcon - ) { - return ToolBeltSlotTemplate - .of(de.rubixdev.inventorio.api.InventorioAPI.registerToolBeltSlotIfNotExists(slotName, emptyIcon)); - } - - /** - * Please consider the existence of {@link GlobalSettings#toolBeltMode} when - * calling this method.
- * When set to anything but ENABLED, the standard tool belt - * slots might be missing. - * - * @param slotName Unique string id for the slot. Default slots available at - * {@link InventorioAPI} constants. - * @deprecated Use - * {@link de.rubixdev.inventorio.api.InventorioAPI#getToolBeltSlotTemplate} - * instead - */ - @Deprecated(forRemoval = true, since = "1.10.0") - @Nullable public static ToolBeltSlotTemplate getToolBeltSlotTemplate(@NotNull String slotName) { - return ToolBeltSlotTemplate.of(de.rubixdev.inventorio.api.InventorioAPI.getToolBeltSlotTemplate(slotName)); - } - - /** - * Please consider the existence of {@link GlobalSettings#toolBeltMode} when - * calling this method.
- * When set to anything but ENABLED, the standard tool belt - * slots might be missing. - * - * @return ItemStack.Empty if no fitting slot was found - * @deprecated Use - * {@link de.rubixdev.inventorio.api.InventorioAPI#findFittingToolBeltStack} - * instead - */ - @Deprecated(forRemoval = true, since = "1.10.0") - @NotNull public static ItemStack findFittingToolBeltStack( - @NotNull PlayerInventoryAddon playerInventoryAddon, - @NotNull ItemStack sampleStack - ) { - return de.rubixdev.inventorio.api.InventorioAPI.findFittingToolBeltStack(playerInventoryAddon, sampleStack); - } - - /** - * Please consider the existence of {@link GlobalSettings#toolBeltMode} when - * calling this method.
- * When set to anything but ENABLED, the standard tool belt - * slots might be missing. - * - * @return -1 if no fitting slot was found - * @deprecated Use - * {@link de.rubixdev.inventorio.api.InventorioAPI#findFittingToolBeltIndex} - * instead - */ - @Deprecated(forRemoval = true, since = "1.10.0") - public static int findFittingToolBeltIndex( - @NotNull PlayerInventoryAddon playerInventoryAddon, - @NotNull ItemStack sampleStack - ) { - return de.rubixdev.inventorio.api.InventorioAPI.findFittingToolBeltIndex(playerInventoryAddon, sampleStack); - } - - /** - * @see InventorioAPI#registerToolBeltSlotIfNotExists - * @deprecated Use - * {@link de.rubixdev.inventorio.api.InventorioAPI#getToolBeltTemplates} - * instead - */ - @Deprecated(forRemoval = true, since = "1.10.0") - @NotNull public static ImmutableList getToolBeltTemplates() { - return ImmutableList.copyOf( - de.rubixdev.inventorio.api.InventorioAPI.getToolBeltTemplates() - .stream() - .map(ToolBeltSlotTemplate::of) - .toList() - ); - } - - /** - * @deprecated Use - * {@link de.rubixdev.inventorio.api.InventorioAPI#getInventoryAddon} - * instead - */ - @Deprecated(forRemoval = true, since = "1.10.0") - @Nullable public static PlayerInventoryAddon getInventoryAddon(@NotNull PlayerEntity playerEntity) { - return PlayerInventoryAddon.of(de.rubixdev.inventorio.api.InventorioAPI.getInventoryAddon(playerEntity)); - } -} diff --git a/src/main/java/me/lizardofoz/inventorio/api/InventorioAddonSection.java b/src/main/java/me/lizardofoz/inventorio/api/InventorioAddonSection.java deleted file mode 100644 index 2efa0e0..0000000 --- a/src/main/java/me/lizardofoz/inventorio/api/InventorioAddonSection.java +++ /dev/null @@ -1,20 +0,0 @@ -package me.lizardofoz.inventorio.api; - -/** - * @deprecated Use {@link de.rubixdev.inventorio.api.InventorioAddonSection} - * instead. - */ -@Deprecated(forRemoval = true, since = "1.10.0") -public enum InventorioAddonSection { - DEEP_POCKETS, - TOOLBELT, - UTILITY_BELT; - - static InventorioAddonSection from(de.rubixdev.inventorio.api.InventorioAddonSection section) { - return switch (section) { - case DEEP_POCKETS -> DEEP_POCKETS; - case TOOLBELT -> TOOLBELT; - case UTILITY_BELT -> UTILITY_BELT; - }; - } -} diff --git a/src/main/java/me/lizardofoz/inventorio/api/InventorioTickHandler.java b/src/main/java/me/lizardofoz/inventorio/api/InventorioTickHandler.java deleted file mode 100644 index ab087ec..0000000 --- a/src/main/java/me/lizardofoz/inventorio/api/InventorioTickHandler.java +++ /dev/null @@ -1,32 +0,0 @@ -package me.lizardofoz.inventorio.api; - -import me.lizardofoz.inventorio.player.PlayerInventoryAddon; -import net.minecraft.item.ItemStack; -import org.jetbrains.annotations.NotNull; - -/** - * @deprecated Use {@link de.rubixdev.inventorio.api.InventorioTickHandler} - * instead. - */ -@SuppressWarnings("removal") -@Deprecated(forRemoval = true, since = "1.10.0") -@FunctionalInterface -public interface InventorioTickHandler { - /** - * Note: The size of the ToolBelt and the order of slots is persistent ONLY - * within the current play session.
- * The size of the ToolBelt may depend on the mods currently installed and - * can change across restarts. - * - * @deprecated Use - * {@link de.rubixdev.inventorio.api.InventorioTickHandler#tick} - * instead. - */ - @Deprecated(forRemoval = true, since = "1.10.0") - void tick( - @NotNull PlayerInventoryAddon playerInventoryAddon, - @NotNull InventorioAddonSection addonSection, - @NotNull ItemStack itemStack, - int indexWithinSection - ); -} diff --git a/src/main/kotlin/de/rubixdev/inventorio/api/OnInit.kt b/src/main/kotlin/de/rubixdev/inventorio/api/OnInit.kt new file mode 100644 index 0000000..2bbb5b2 --- /dev/null +++ b/src/main/kotlin/de/rubixdev/inventorio/api/OnInit.kt @@ -0,0 +1,55 @@ +package de.rubixdev.inventorio.api + +import de.rubixdev.inventorio.config.GlobalSettings +import de.rubixdev.inventorio.util.ToolBeltMode +import de.rubixdev.inventorio.util.id +import net.minecraft.item.* + +fun onApiInit() { + if (GlobalSettings.toolBeltMode.value != ToolBeltMode.ENABLED) return + + InventorioAPI + .registerToolBeltSlotIfNotExists( + InventorioAPI.SLOT_PICKAXE, + "textures/gui/empty/pickaxe.png".id, + )!! + .addAllowingCondition { stack, _ -> stack.item is PickaxeItem } + .addAllowingTag("pickaxes".id) + .addDenyingTag("pickaxes_blacklist".id) + + InventorioAPI + .registerToolBeltSlotIfNotExists( + InventorioAPI.SLOT_SWORD, + "textures/gui/empty/sword.png".id, + )!! + .addAllowingCondition { stack, _ -> stack.item is SwordItem || stack.item is TridentItem } + .addAllowingTag("swords".id) + .addDenyingTag("swords_blacklist".id) + + InventorioAPI + .registerToolBeltSlotIfNotExists( + InventorioAPI.SLOT_AXE, + "textures/gui/empty/axe.png".id, + )!! + .addAllowingCondition { stack, _ -> stack.item is AxeItem } + .addAllowingTag("axes".id) + .addDenyingTag("axes_blacklist".id) + + InventorioAPI + .registerToolBeltSlotIfNotExists( + InventorioAPI.SLOT_SHOVEL, + "textures/gui/empty/shovel.png".id, + )!! + .addAllowingCondition { stack, _ -> stack.item is ShovelItem } + .addAllowingTag("shovels".id) + .addDenyingTag("shovels_blacklist".id) + + InventorioAPI + .registerToolBeltSlotIfNotExists( + InventorioAPI.SLOT_HOE, + "textures/gui/empty/hoe.png".id, + )!! + .addAllowingCondition { stack, _ -> stack.item is HoeItem || stack.item is ShearsItem } + .addAllowingTag("hoes".id) + .addDenyingTag("hoes_blacklist".id) +} diff --git a/src/main/kotlin/de/rubixdev/inventorio/api/ToolBeltSlotTemplate.kt b/src/main/kotlin/de/rubixdev/inventorio/api/ToolBeltSlotTemplate.kt index 91e812f..3b3c8f6 100644 --- a/src/main/kotlin/de/rubixdev/inventorio/api/ToolBeltSlotTemplate.kt +++ b/src/main/kotlin/de/rubixdev/inventorio/api/ToolBeltSlotTemplate.kt @@ -5,11 +5,7 @@ import java.util.function.BiPredicate import net.minecraft.item.ItemStack import net.minecraft.util.Identifier -/** - * Note: **Do not extend this class!** It is only marked as `open` for compatibility purposes. - */ -// TODO: remove `open` modifier once old api package is removed -open class ToolBeltSlotTemplate(val name: String, val emptyIcon: Identifier) { +class ToolBeltSlotTemplate(val name: String, val emptyIcon: Identifier) { private val isAllowed: MutableList> = ArrayList() private val isDenied: MutableList> = ArrayList() diff --git a/src/main/kotlin/de/rubixdev/inventorio/client/configscreen/GlobalSettingsScreen.kt b/src/main/kotlin/de/rubixdev/inventorio/client/configscreen/GlobalSettingsScreen.kt index 5c5202b..bc4172c 100644 --- a/src/main/kotlin/de/rubixdev/inventorio/client/configscreen/GlobalSettingsScreen.kt +++ b/src/main/kotlin/de/rubixdev/inventorio/client/configscreen/GlobalSettingsScreen.kt @@ -36,7 +36,7 @@ object GlobalSettingsScreen { addBoolEntry(category, entryBuilder, GlobalSettings.allow2x2CraftingGrid, true, isNotLocal) //#if FABRIC addBoolEntry(category, entryBuilder, GlobalSettings.trinketsIntegration, true, isNotLocal) { PlatformApi.isModLoaded("trinkets") } - //#elseif FORGELIKE + //#elseif NEOFORGE addBoolEntry(category, entryBuilder, GlobalSettings.curiosIntegration, true, isNotLocal) { PlatformApi.isModLoaded("curios") } //#endif diff --git a/src/main/kotlin/de/rubixdev/inventorio/client/configscreen/PlayerSettingsScreen.kt b/src/main/kotlin/de/rubixdev/inventorio/client/configscreen/PlayerSettingsScreen.kt index d7640b8..309f41b 100644 --- a/src/main/kotlin/de/rubixdev/inventorio/client/configscreen/PlayerSettingsScreen.kt +++ b/src/main/kotlin/de/rubixdev/inventorio/client/configscreen/PlayerSettingsScreen.kt @@ -39,7 +39,7 @@ object PlayerSettingsScreen { addBoolEntry(category, entryBuilder, PlayerSettings.aggressiveButtonRemoval, requireRestart = false, blocked = false) addBoolEntry(category, entryBuilder, PlayerSettings.toggleButton, requireRestart = false, blocked = false) addBoolEntry(category, entryBuilder, PlayerSettings.centeredScreen, requireRestart = false, blocked = false) - //#if FORGELIKE + //#if NEOFORGE addBoolEntry(category, entryBuilder, PlayerSettings.curiosOpenByDefault, requireRestart = false, blocked = false) { PlatformApi.isModLoaded("curios") } //#endif diff --git a/src/main/kotlin/de/rubixdev/inventorio/client/ui/HotbarHUDRenderer.kt b/src/main/kotlin/de/rubixdev/inventorio/client/ui/HotbarHUDRenderer.kt index b0e66f8..1b4b4f8 100644 --- a/src/main/kotlin/de/rubixdev/inventorio/client/ui/HotbarHUDRenderer.kt +++ b/src/main/kotlin/de/rubixdev/inventorio/client/ui/HotbarHUDRenderer.kt @@ -14,7 +14,6 @@ import net.minecraft.client.render.model.json.ModelTransformationMode import net.minecraft.entity.player.PlayerEntity import net.minecraft.item.ItemStack import net.minecraft.util.Arm -import net.minecraft.util.Identifier import net.minecraft.util.crash.CrashException import net.minecraft.util.crash.CrashReport import net.minecraft.util.math.MathHelper @@ -23,8 +22,8 @@ import org.joml.Matrix4f @Environment(EnvType.CLIENT) object HotbarHUDRenderer { - private val WIDGETS_TEXTURE = Identifier("inventorio", "textures/gui/widgets.png") - private val WIDGETS_TEXTURE_DARK = Identifier("inventorio", "textures/gui/widgets_dark.png") + private val WIDGETS_TEXTURE = "textures/gui/widgets.png".id + private val WIDGETS_TEXTURE_DARK = "textures/gui/widgets_dark.png".id private val client = MinecraftClient.getInstance()!! fun renderSegmentedHotbar(drawContext: DrawContext): Boolean { @@ -285,8 +284,7 @@ object HotbarHUDRenderer { val crashReport = CrashReport.create(var12, "Rendering item") val crashReportSection = crashReport.addElement("Item being rendered") crashReportSection.add("Item Type") { stack.item.toString() } - crashReportSection.add("Item Damage") { stack.damage.toString() } - crashReportSection.add("Item NBT") { stack.nbt.toString() } + crashReportSection.add("Item Components") { stack.components.toString() } crashReportSection.add("Item Foil") { stack.hasGlint().toString() } throw CrashException(crashReport) } diff --git a/src/main/kotlin/de/rubixdev/inventorio/client/ui/InventorioScreen.kt b/src/main/kotlin/de/rubixdev/inventorio/client/ui/InventorioScreen.kt index b8afed6..b478054 100644 --- a/src/main/kotlin/de/rubixdev/inventorio/client/ui/InventorioScreen.kt +++ b/src/main/kotlin/de/rubixdev/inventorio/client/ui/InventorioScreen.kt @@ -18,6 +18,7 @@ import net.fabricmc.api.Environment import net.minecraft.client.MinecraftClient import net.minecraft.client.gui.DrawContext import net.minecraft.client.gui.Drawable +import net.minecraft.client.gui.screen.ButtonTextures import net.minecraft.client.gui.screen.Screen import net.minecraft.client.gui.screen.ingame.AbstractInventoryScreen import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen @@ -32,16 +33,8 @@ import net.minecraft.screen.slot.SlotActionType import net.minecraft.text.Text import net.minecraft.util.Identifier -//#if MC >= 12002 -import net.minecraft.client.gui.screen.ButtonTextures -//#endif - -/** - * Note: **Do not extend this class!** It is only marked as `open` for compatibility purposes. - */ -// TODO: remove `open` modifier once old api package is removed @Environment(EnvType.CLIENT) -open class InventorioScreen(handler: InventorioScreenHandler, internal val inventory: PlayerInventory) : +class InventorioScreen(handler: InventorioScreenHandler, internal val inventory: PlayerInventory) : AbstractInventoryScreen(handler, inventory, Text.translatable("container.crafting")), RecipeBookProvider { private var mouseX = 0f private var mouseY = 0f @@ -82,11 +75,7 @@ open class InventorioScreen(handler: InventorioScreenHandler, internal val inven y + GUI_RECIPE_WIDGET_BUTTON.y, GUI_RECIPE_WIDGET_BUTTON.width, GUI_RECIPE_WIDGET_BUTTON.height, - //#if MC >= 12002 RecipeBookWidget.BUTTON_TEXTURES, - //#else - //$$ 0, 0, 19, RECIPE_BUTTON_TEXTURE, - //#endif ) { setRecipeLeftOffset() recipeBook.toggleOpen() @@ -131,6 +120,7 @@ open class InventorioScreen(handler: InventorioScreenHandler, internal val inven true -> (width - backgroundWidth + RecipeBookWidget.field_32408 + 2) / 2 false -> (width - backgroundWidth) / 2 }.also { setRecipeLeftOffset() } + // TODO: fix recipe book offset for non-centered screen false -> recipeBook.findLeftEdge(width, GUI_INVENTORY_TOP.width - 22) } @@ -256,11 +246,7 @@ open class InventorioScreen(handler: InventorioScreenHandler, internal val inven ) } - //#if MC >= 12002 InventoryScreen.drawEntity(drawContext, x + 26, y + 8, x + 75, y + 78, 30, 0.0625f, this.mouseX, this.mouseY, client!!.player) - //#else - //$$ InventoryScreen.drawEntity(drawContext, x + 51, y + 75, 30, (x + 51).toFloat() - this.mouseX, (y + 75 - 50).toFloat() - this.mouseY, client!!.player!!) - //#endif } // =================================================== @@ -271,15 +257,8 @@ open class InventorioScreen(handler: InventorioScreenHandler, internal val inven } override fun render(context: DrawContext, mouseX: Int, mouseY: Int, delta: Float) { - //#if MC < 12002 - //$$ this.renderBackground(context) - //#endif if (recipeBook.isOpen && narrow) { - //#if MC >= 12002 this.renderBackground(context, mouseX, mouseY, delta) - //#else - //$$ drawBackground(context, delta, mouseX, mouseY) - //#endif recipeBook.render(context, mouseX, mouseY, delta) } else { super.render(context, mouseX, mouseY, delta) @@ -345,43 +324,31 @@ open class InventorioScreen(handler: InventorioScreenHandler, internal val inven super.drawMouseoverTooltip(context, x, y) } - @Suppress("RedundantOverride") // this makes it easier to add functionality for mod compat via mixin override fun mouseDragged(mouseX: Double, mouseY: Double, button: Int, deltaX: Double, deltaY: Double): Boolean { return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY) } - @Suppress("RedundantOverride") // this makes it easier to add functionality for mod compat via mixin override fun mouseScrolled( mouseX: Double, mouseY: Double, - //#if MC >= 12002 horizontalAmount: Double, - //#endif verticalAmount: Double, ): Boolean { - //#if MC >= 12002 return super.mouseScrolled(mouseX, mouseY, horizontalAmount, verticalAmount) - //#else - //$$ return super.mouseScrolled(mouseX, mouseY, verticalAmount) - //#endif } // =================================================== // Companion Object // =================================================== companion object { - //#if MC >= 12002 - private val TOGGLE_BUTTON_ON_TEXTURES = ButtonTextures(Identifier("inventorio", "toggle_button_on"), Identifier("inventorio", "toggle_button_active_on")) - private val TOGGLE_BUTTON_OFF_TEXTURES = ButtonTextures(Identifier("inventorio", "toggle_button_off"), Identifier("inventorio", "toggle_button_active_off")) - private val LOCK_BUTTON_TEXTURES = ButtonTextures(Identifier("inventorio", "lock_button"), Identifier("inventorio", "lock_button_active")) - private val TOGGLE_BUTTON_ON_TEXTURES_DARK = ButtonTextures(Identifier("inventorio", "toggle_button_on_dark"), Identifier("inventorio", "toggle_button_active_on_dark")) - private val TOGGLE_BUTTON_OFF_TEXTURES_DARK = ButtonTextures(Identifier("inventorio", "toggle_button_off_dark"), Identifier("inventorio", "toggle_button_active_off_dark")) - private val LOCK_BUTTON_TEXTURES_DARK = ButtonTextures(Identifier("inventorio", "lock_button_dark"), Identifier("inventorio", "lock_button_active_dark")) - //#else - //$$ private val RECIPE_BUTTON_TEXTURE = Identifier("textures/gui/recipe_button.png") - //#endif - private val BACKGROUND_TEXTURE = Identifier("inventorio", "textures/gui/player_inventory.png") - private val BACKGROUND_TEXTURE_DARK = Identifier("inventorio", "textures/gui/player_inventory_dark.png") + private val TOGGLE_BUTTON_ON_TEXTURES = ButtonTextures("toggle_button_on".id, "toggle_button_active_on".id) + private val TOGGLE_BUTTON_OFF_TEXTURES = ButtonTextures("toggle_button_off".id, "toggle_button_active_off".id) + private val LOCK_BUTTON_TEXTURES = ButtonTextures("lock_button".id, "lock_button_active".id) + private val TOGGLE_BUTTON_ON_TEXTURES_DARK = ButtonTextures("toggle_button_on_dark".id, "toggle_button_active_on_dark".id) + private val TOGGLE_BUTTON_OFF_TEXTURES_DARK = ButtonTextures("toggle_button_off_dark".id, "toggle_button_active_off_dark".id) + private val LOCK_BUTTON_TEXTURES_DARK = ButtonTextures("lock_button_dark".id, "lock_button_active_dark".id) + private val BACKGROUND_TEXTURE = "textures/gui/player_inventory.png".id + private val BACKGROUND_TEXTURE_DARK = "textures/gui/player_inventory_dark.png".id private val initConsumers = mutableMapOf>() @@ -403,24 +370,15 @@ open class InventorioScreen(handler: InventorioScreenHandler, internal val inven if (!PlayerSettings.toggleButton.boolValue) { return null } - //#if MC >= 12002 val textures = if (screen is InventorioScreen) TOGGLE_BUTTON_ON_TEXTURES else TOGGLE_BUTTON_OFF_TEXTURES val texturesDark = if (screen is InventorioScreen) TOGGLE_BUTTON_ON_TEXTURES_DARK else TOGGLE_BUTTON_OFF_TEXTURES_DARK - //#else - //$$ val canvas = if (screen is InventorioScreen) CANVAS_TOGGLE_BUTTON_ON else CANVAS_TOGGLE_BUTTON_OFF - //#endif val screenAccessor = screen as HandledScreenAccessor<*> val button = TexturedButtonWidget( screenAccessor.x + screen.backgroundWidth + GUI_TOGGLE_BUTTON_OFFSET.x, screenAccessor.y + GUI_TOGGLE_BUTTON_OFFSET.y, GUI_TOGGLE_BUTTON_OFFSET.width, GUI_TOGGLE_BUTTON_OFFSET.height, - //#if MC >= 12002 if (PlayerSettings.darkTheme.boolValue) texturesDark else textures, - //#else - //$$ canvas.x, canvas.y, CANVAS_TOGGLE_BUTTON_HOVER_SHIFT, - //$$ if (PlayerSettings.darkTheme.boolValue) BACKGROUND_TEXTURE_DARK else BACKGROUND_TEXTURE, - //#endif ) { val client = MinecraftClient.getInstance() ?: return@TexturedButtonWidget shouldOpenVanillaInventory = client.currentScreen is InventorioScreen @@ -450,13 +408,7 @@ open class InventorioScreen(handler: InventorioScreenHandler, internal val inven screenAccessor.y + GUI_LOCKED_CRAFTING_POS.y, GUI_LOCKED_CRAFTING_POS.width, GUI_LOCKED_CRAFTING_POS.height, - //#if MC >= 12002 if (PlayerSettings.darkTheme.boolValue) LOCK_BUTTON_TEXTURES_DARK else LOCK_BUTTON_TEXTURES, - //#else - //$$ CANVAS_LOCKED_CRAFT_BUTTON.x, CANVAS_LOCKED_CRAFT_BUTTON.y, - //$$ GUI_LOCKED_CRAFTING_POS.height, - //$$ if (PlayerSettings.darkTheme.boolValue) BACKGROUND_TEXTURE_DARK else BACKGROUND_TEXTURE, - //#endif ) { val client = MinecraftClient.getInstance() ?: return@TexturedButtonWidget isSwappingInvScreens = true diff --git a/src/main/kotlin/de/rubixdev/inventorio/config/GlobalSettings.kt b/src/main/kotlin/de/rubixdev/inventorio/config/GlobalSettings.kt index 85f5fc1..876c70b 100644 --- a/src/main/kotlin/de/rubixdev/inventorio/config/GlobalSettings.kt +++ b/src/main/kotlin/de/rubixdev/inventorio/config/GlobalSettings.kt @@ -42,7 +42,7 @@ object GlobalSettings : AbstractSettings() { "inventorio.settings.global.trinkets_integration", "inventorio.settings.global.trinkets_integration.tooltip", ) - //#elseif FORGELIKE + //#elseif NEOFORGE @JvmField val curiosIntegration = SettingsEntryBoolean( true, "CuriosIntegration", @@ -91,7 +91,7 @@ object GlobalSettings : AbstractSettings() { allow2x2CraftingGrid, //#if FABRIC trinketsIntegration, - //#elseif FORGELIKE + //#elseif NEOFORGE curiosIntegration, //#endif diff --git a/src/main/kotlin/de/rubixdev/inventorio/config/PlayerSettings.kt b/src/main/kotlin/de/rubixdev/inventorio/config/PlayerSettings.kt index 2e1f2c7..a586315 100644 --- a/src/main/kotlin/de/rubixdev/inventorio/config/PlayerSettings.kt +++ b/src/main/kotlin/de/rubixdev/inventorio/config/PlayerSettings.kt @@ -92,7 +92,7 @@ object PlayerSettings : AbstractSettings() { "inventorio.settings.player.centered_screen.tooltip", ) - //#if FORGELIKE + //#if NEOFORGE @JvmField val curiosOpenByDefault = SettingsEntryBoolean( false, @@ -114,7 +114,7 @@ object PlayerSettings : AbstractSettings() { aggressiveButtonRemoval, toggleButton, centeredScreen, - //#if FORGELIKE + //#if NEOFORGE curiosOpenByDefault, //#endif ) diff --git a/src/main/kotlin/de/rubixdev/inventorio/enchantment/DeepPocketsBookRecipe.kt b/src/main/kotlin/de/rubixdev/inventorio/enchantment/DeepPocketsBookRecipe.kt index 3ce20eb..dece183 100644 --- a/src/main/kotlin/de/rubixdev/inventorio/enchantment/DeepPocketsBookRecipe.kt +++ b/src/main/kotlin/de/rubixdev/inventorio/enchantment/DeepPocketsBookRecipe.kt @@ -11,15 +11,11 @@ import net.minecraft.recipe.RecipeSerializer import net.minecraft.recipe.SpecialCraftingRecipe import net.minecraft.recipe.SpecialRecipeSerializer import net.minecraft.recipe.book.CraftingRecipeCategory -import net.minecraft.registry.DynamicRegistryManager +import net.minecraft.registry.RegistryWrapper import net.minecraft.util.collection.DefaultedList import net.minecraft.world.World -//#if MC >= 12002 class DeepPocketsBookRecipe(category: CraftingRecipeCategory) : SpecialCraftingRecipe(category) { -//#else -//$$ class DeepPocketsBookRecipe(identifier: net.minecraft.util.Identifier, category: CraftingRecipeCategory) : SpecialCraftingRecipe(identifier, category) { -//#endif override fun matches(craftingInventory: RecipeInputInventory, world: World): Boolean { if (!GlobalSettings.deepPocketsBookCraft.boolValue) { return false @@ -39,11 +35,8 @@ class DeepPocketsBookRecipe(category: CraftingRecipeCategory) : SpecialCraftingR return shells == 2 && books == 1 } - override fun craft(inventory: RecipeInputInventory, registryManager: DynamicRegistryManager): ItemStack { - val bookItem = ItemStack(Items.ENCHANTED_BOOK, 1) - EnchantedBookItem.addEnchantment(bookItem, EnchantmentLevelEntry(DeepPocketsEnchantment, 1)) - return bookItem - } + override fun craft(inventory: RecipeInputInventory, lookup: RegistryWrapper.WrapperLookup): ItemStack = + EnchantedBookItem.forEnchantment(EnchantmentLevelEntry(DeepPocketsEnchantment, 1)) override fun fits(width: Int, height: Int): Boolean { return width >= 2 && height >= 2 @@ -61,13 +54,9 @@ class DeepPocketsBookRecipe(category: CraftingRecipeCategory) : SpecialCraftingR return DefaultedList.copyOf(SHULKER_SHELL, SHULKER_SHELL, BOOKS, SHULKER_SHELL) } - override fun getResult(registryManager: DynamicRegistryManager): ItemStack { - if (!GlobalSettings.deepPocketsBookCraft.boolValue) { - ItemStack.EMPTY - } - val bookItem = ItemStack(Items.ENCHANTED_BOOK, 1) - EnchantedBookItem.addEnchantment(bookItem, EnchantmentLevelEntry(DeepPocketsEnchantment, 1)) - return bookItem + override fun getResult(lookup: RegistryWrapper.WrapperLookup): ItemStack = when (GlobalSettings.deepPocketsBookCraft.boolValue) { + true -> EnchantedBookItem.forEnchantment(EnchantmentLevelEntry(DeepPocketsEnchantment, 1)) + false -> ItemStack.EMPTY } companion object { diff --git a/src/main/kotlin/de/rubixdev/inventorio/enchantment/DeepPocketsEnchantment.kt b/src/main/kotlin/de/rubixdev/inventorio/enchantment/DeepPocketsEnchantment.kt index c82a737..4ac546f 100644 --- a/src/main/kotlin/de/rubixdev/inventorio/enchantment/DeepPocketsEnchantment.kt +++ b/src/main/kotlin/de/rubixdev/inventorio/enchantment/DeepPocketsEnchantment.kt @@ -3,26 +3,20 @@ package de.rubixdev.inventorio.enchantment import de.rubixdev.inventorio.config.GlobalSettings import de.rubixdev.inventorio.util.DEEP_POCKETS_MAX_LEVEL import net.minecraft.enchantment.Enchantment -import net.minecraft.enchantment.EnchantmentTarget import net.minecraft.entity.EquipmentSlot +import net.minecraft.registry.tag.ItemTags -object DeepPocketsEnchantment : Enchantment(Rarity.UNCOMMON, EnchantmentTarget.ARMOR_LEGS, arrayOf(EquipmentSlot.LEGS)) { - override fun getMinLevel(): Int { - return 1 - } - - override fun getMaxLevel(): Int { - return DEEP_POCKETS_MAX_LEVEL - } - - override fun getMinPower(level: Int): Int { - return 5 + (level - 1) * 8 - } - - override fun getMaxPower(level: Int): Int { - return super.getMinPower(level) + 50 - } - +object DeepPocketsEnchantment : Enchantment( + properties( + ItemTags.LEG_ARMOR_ENCHANTABLE, + 5, + DEEP_POCKETS_MAX_LEVEL, + leveledCost(5, 8), + leveledCost(55, 8), + 2, + EquipmentSlot.LEGS, + ), +) { override fun isAvailableForEnchantedBookOffer(): Boolean { return GlobalSettings.deepPocketsInTrades.boolValue } diff --git a/src/main/kotlin/de/rubixdev/inventorio/integration/InventorioModIntegration.kt b/src/main/kotlin/de/rubixdev/inventorio/integration/InventorioModIntegration.kt index a11818c..5eabc17 100644 --- a/src/main/kotlin/de/rubixdev/inventorio/integration/InventorioModIntegration.kt +++ b/src/main/kotlin/de/rubixdev/inventorio/integration/InventorioModIntegration.kt @@ -11,14 +11,14 @@ object InventorioModIntegration { fun applyModIntegrations(modIntegrations: Collection) { for (modIntegration in modIntegrations) { try { - if (modIntegration.shouldApply()) { + if (modIntegration.shouldApply) { modIntegration.apply() logger.info("Mod integration succeeded for ${modIntegration.displayName}") } else { logger.info("Skipping mod integration for ${modIntegration.displayName}") } } catch (e: Throwable) { - logger.error("Failed to apply mod integration for ${modIntegration.displayName} (${modIntegration.name})", e) + logger.error("Failed to apply mod integration for ${modIntegration.displayName} (${modIntegration.modId})", e) } } } diff --git a/src/main/kotlin/de/rubixdev/inventorio/integration/ModIntegration.kt b/src/main/kotlin/de/rubixdev/inventorio/integration/ModIntegration.kt index 29afd5d..6bf35f4 100644 --- a/src/main/kotlin/de/rubixdev/inventorio/integration/ModIntegration.kt +++ b/src/main/kotlin/de/rubixdev/inventorio/integration/ModIntegration.kt @@ -1,14 +1,19 @@ package de.rubixdev.inventorio.integration +import de.rubixdev.inventorio.util.PlatformApi + /** * This class is intended for Inventorio to integrate with other mods, * _not_ for other mods to integrate with Inventorio. */ abstract class ModIntegration { - abstract val name: String - abstract val displayName: String + abstract val modId: String + + open val displayName: String + get() = PlatformApi.modDisplayname(modId) ?: modId - abstract fun shouldApply(): Boolean + open val shouldApply: Boolean + get() = PlatformApi.isModLoaded(modId) abstract fun apply() } diff --git a/src/main/kotlin/de/rubixdev/inventorio/packet/GlobalSettingsS2CPacket.kt b/src/main/kotlin/de/rubixdev/inventorio/packet/GlobalSettingsS2CPacket.kt new file mode 100644 index 0000000..7dc10f8 --- /dev/null +++ b/src/main/kotlin/de/rubixdev/inventorio/packet/GlobalSettingsS2CPacket.kt @@ -0,0 +1,27 @@ +package de.rubixdev.inventorio.packet + +import com.google.gson.Gson +import com.google.gson.JsonObject +import de.rubixdev.inventorio.config.GlobalSettings +import de.rubixdev.inventorio.util.id +import io.netty.buffer.ByteBuf +import java.util.concurrent.Executor +import net.minecraft.network.codec.PacketCodec +import net.minecraft.network.codec.PacketCodecs +import net.minecraft.network.packet.CustomPayload + +data class GlobalSettingsS2CPacket(val settings: JsonObject = GlobalSettings.asJson()) : CustomPayload { + companion object { + val ID = CustomPayload.Id("global_settings".id) + val CODEC: PacketCodec = PacketCodecs.STRING.xmap( + { jsonString -> GlobalSettingsS2CPacket(Gson().fromJson(jsonString, JsonObject::class.java)) }, + { packet -> packet.settings.toString() }, + ) + } + + override fun getId(): CustomPayload.Id = ID + + fun consume(executor: Executor) { + executor.execute { GlobalSettings.syncFromServer(settings) } + } +} diff --git a/src/main/kotlin/de/rubixdev/inventorio/packet/InventorioNetworking.kt b/src/main/kotlin/de/rubixdev/inventorio/packet/InventorioNetworking.kt index ed69822..ece4018 100644 --- a/src/main/kotlin/de/rubixdev/inventorio/packet/InventorioNetworking.kt +++ b/src/main/kotlin/de/rubixdev/inventorio/packet/InventorioNetworking.kt @@ -1,34 +1,63 @@ package de.rubixdev.inventorio.packet +import de.rubixdev.inventorio.player.PlayerInventoryAddon.Companion.inventoryAddon import net.fabricmc.api.EnvType import net.fabricmc.api.Environment +import net.minecraft.client.MinecraftClient import net.minecraft.item.ItemStack +import net.minecraft.network.packet.CustomPayload import net.minecraft.server.network.ServerPlayerEntity interface InventorioNetworking { - fun s2cSelectUtilitySlot(player: ServerPlayerEntity) + fun sendToPlayer(player: ServerPlayerEntity, packet: CustomPayload) - fun s2cGlobalSettings(player: ServerPlayerEntity) + @Environment(EnvType.CLIENT) + fun sendToServer(packet: CustomPayload) + + fun s2cSelectUtilitySlot(player: ServerPlayerEntity) { + val inventoryAddon = player.inventoryAddon ?: return + sendToPlayer(player, SelectUtilitySlotPacket(inventoryAddon.selectedUtility.toByte())) + } - fun s2cUpdateAddonStacks(player: ServerPlayerEntity, updatedStacks: Map) + fun s2cGlobalSettings(player: ServerPlayerEntity) { + sendToPlayer(player, GlobalSettingsS2CPacket()) + } + + fun s2cUpdateAddonStacks(player: ServerPlayerEntity, updatedStacks: Map) { + sendToPlayer(player, UpdateAddonStacksS2CPacket(updatedStacks)) + } @Environment(EnvType.CLIENT) - fun c2sSelectUtilitySlot(selectedUtility: Int) + fun c2sSelectUtilitySlot(selectedUtility: Int) { + sendToServer(SelectUtilitySlotPacket(selectedUtility.toByte())) + } @Environment(EnvType.CLIENT) - fun c2sUseBoostRocket() + fun c2sUseBoostRocket() { + sendToServer(UseBoostRocketC2SPacket) + } @Environment(EnvType.CLIENT) - fun c2sSetSwappedHandsMode(swappedHands: Boolean) + fun c2sSetSwappedHandsMode(swappedHands: Boolean) { + if (MinecraftClient.getInstance().networkHandler != null) { + sendToServer(SwappedHandsModeC2SPacket(swappedHands)) + } + } @Environment(EnvType.CLIENT) - fun c2sMoveItemToUtilityBelt(sourceSlot: Int) + fun c2sMoveItemToUtilityBelt(sourceSlot: Int) { + sendToServer(MoveItemToUtilityBeltC2SPacket(sourceSlot)) + } @Environment(EnvType.CLIENT) - fun c2sOpenInventorioScreen() + fun c2sOpenInventorioScreen() { + sendToServer(OpenInventorioScreenC2SPacket) + } @Environment(EnvType.CLIENT) - fun c2sSwapItemsInHands() + fun c2sSwapItemsInHands() { + sendToServer(SwapItemsInHandsKeyC2SPacket) + } companion object { @JvmStatic diff --git a/src/main/kotlin/de/rubixdev/inventorio/packet/MoveItemToUtilityBeltC2SPacket.kt b/src/main/kotlin/de/rubixdev/inventorio/packet/MoveItemToUtilityBeltC2SPacket.kt new file mode 100644 index 0000000..4cc7001 --- /dev/null +++ b/src/main/kotlin/de/rubixdev/inventorio/packet/MoveItemToUtilityBeltC2SPacket.kt @@ -0,0 +1,26 @@ +package de.rubixdev.inventorio.packet + +import de.rubixdev.inventorio.player.InventorioScreenHandler.Companion.inventorioScreenHandler +import de.rubixdev.inventorio.util.id +import io.netty.buffer.ByteBuf +import java.util.concurrent.Executor +import net.minecraft.network.codec.PacketCodec +import net.minecraft.network.codec.PacketCodecs +import net.minecraft.network.packet.CustomPayload +import net.minecraft.server.network.ServerPlayerEntity + +data class MoveItemToUtilityBeltC2SPacket(val sourceSlot: Int = 0) : CustomPayload { + companion object { + val ID = CustomPayload.Id("move_to_utility_c2s".id) + val CODEC: PacketCodec = PacketCodecs.VAR_INT.xmap(::MoveItemToUtilityBeltC2SPacket) { it.sourceSlot } + } + + override fun getId(): CustomPayload.Id = ID + + fun consume(executor: Executor, player: ServerPlayerEntity) { + executor.execute { + val screenHandler = player.inventorioScreenHandler ?: return@execute + screenHandler.tryTransferToUtilityBeltSlot(screenHandler.getSlot(sourceSlot)) + } + } +} diff --git a/src/main/kotlin/de/rubixdev/inventorio/packet/OpenInventorioScreenC2SPacket.kt b/src/main/kotlin/de/rubixdev/inventorio/packet/OpenInventorioScreenC2SPacket.kt new file mode 100644 index 0000000..87ed873 --- /dev/null +++ b/src/main/kotlin/de/rubixdev/inventorio/packet/OpenInventorioScreenC2SPacket.kt @@ -0,0 +1,20 @@ +package de.rubixdev.inventorio.packet + +import de.rubixdev.inventorio.player.InventorioScreenHandler +import de.rubixdev.inventorio.util.id +import io.netty.buffer.ByteBuf +import java.util.concurrent.Executor +import net.minecraft.network.codec.PacketCodec +import net.minecraft.network.packet.CustomPayload +import net.minecraft.server.network.ServerPlayerEntity + +object OpenInventorioScreenC2SPacket : CustomPayload { + val ID = CustomPayload.Id("open_screen".id) + val CODEC: PacketCodec = PacketCodec.unit(OpenInventorioScreenC2SPacket) + + override fun getId(): CustomPayload.Id = ID + + fun consume(payload: OpenInventorioScreenC2SPacket, executor: Executor, player: ServerPlayerEntity) { + executor.execute { InventorioScreenHandler.open(player) } + } +} diff --git a/src/main/kotlin/de/rubixdev/inventorio/packet/SelectUtilitySlotPacket.kt b/src/main/kotlin/de/rubixdev/inventorio/packet/SelectUtilitySlotPacket.kt new file mode 100644 index 0000000..7fc44dd --- /dev/null +++ b/src/main/kotlin/de/rubixdev/inventorio/packet/SelectUtilitySlotPacket.kt @@ -0,0 +1,45 @@ +package de.rubixdev.inventorio.packet + +import com.mojang.datafixers.util.Pair +import de.rubixdev.inventorio.player.PlayerInventoryAddon +import de.rubixdev.inventorio.player.PlayerInventoryAddon.Companion.inventoryAddon +import de.rubixdev.inventorio.util.id +import io.netty.buffer.ByteBuf +import java.util.concurrent.Executor +import net.minecraft.entity.EquipmentSlot +import net.minecraft.network.codec.PacketCodec +import net.minecraft.network.codec.PacketCodecs +import net.minecraft.network.packet.CustomPayload +import net.minecraft.network.packet.s2c.play.EntityEquipmentUpdateS2CPacket +import net.minecraft.server.network.ServerPlayerEntity +import net.minecraft.server.world.ServerWorld + +data class SelectUtilitySlotPacket(val slot: Byte = 0) : CustomPayload { + companion object { + val ID = CustomPayload.Id("select_utility".id) + val CODEC: PacketCodec = + PacketCodecs.BYTE.xmap(::SelectUtilitySlotPacket) { it.slot } + } + + override fun getId(): CustomPayload.Id = ID + + // Server's receiving consumer + fun consume(executor: Executor, player: ServerPlayerEntity) { + executor.execute { + player.inventoryAddon?.selectedUtility = slot.toInt() + + // Resending the current offhand item (aka a selected utility belt item) of this player to other players + val broadcastPacket = + EntityEquipmentUpdateS2CPacket( + player.id, + listOf(Pair(EquipmentSlot.OFFHAND, player.offHandStack)), + ) + (player.world as ServerWorld).chunkManager.sendToOtherNearbyPlayers(player, broadcastPacket) + } + } + + // Client's receiving consumer + fun consume(executor: Executor) { + executor.execute { PlayerInventoryAddon.Client.local?.selectedUtility = slot.toInt() } + } +} diff --git a/src/main/kotlin/de/rubixdev/inventorio/packet/SwapItemsInHandsKeyC2SPacket.kt b/src/main/kotlin/de/rubixdev/inventorio/packet/SwapItemsInHandsKeyC2SPacket.kt new file mode 100644 index 0000000..05bc3a1 --- /dev/null +++ b/src/main/kotlin/de/rubixdev/inventorio/packet/SwapItemsInHandsKeyC2SPacket.kt @@ -0,0 +1,20 @@ +package de.rubixdev.inventorio.packet + +import de.rubixdev.inventorio.player.PlayerInventoryAddon.Companion.inventoryAddon +import de.rubixdev.inventorio.util.id +import io.netty.buffer.ByteBuf +import java.util.concurrent.Executor +import net.minecraft.network.codec.PacketCodec +import net.minecraft.network.packet.CustomPayload +import net.minecraft.server.network.ServerPlayerEntity + +object SwapItemsInHandsKeyC2SPacket : CustomPayload { + val ID = CustomPayload.Id("swap_items_in_hands".id) + val CODEC: PacketCodec = PacketCodec.unit(SwapItemsInHandsKeyC2SPacket) + + override fun getId(): CustomPayload.Id = ID + + fun consume(payload: SwapItemsInHandsKeyC2SPacket, executor: Executor, player: ServerPlayerEntity) { + executor.execute { player.inventoryAddon?.swapItemsInHands() } + } +} diff --git a/src/main/kotlin/de/rubixdev/inventorio/packet/SwappedHandsModeC2SPacket.kt b/src/main/kotlin/de/rubixdev/inventorio/packet/SwappedHandsModeC2SPacket.kt new file mode 100644 index 0000000..60a2024 --- /dev/null +++ b/src/main/kotlin/de/rubixdev/inventorio/packet/SwappedHandsModeC2SPacket.kt @@ -0,0 +1,23 @@ +package de.rubixdev.inventorio.packet + +import de.rubixdev.inventorio.player.PlayerInventoryAddon.Companion.inventoryAddon +import de.rubixdev.inventorio.util.id +import io.netty.buffer.ByteBuf +import java.util.concurrent.Executor +import net.minecraft.network.codec.PacketCodec +import net.minecraft.network.codec.PacketCodecs +import net.minecraft.network.packet.CustomPayload +import net.minecraft.server.network.ServerPlayerEntity + +data class SwappedHandsModeC2SPacket(val swappedHands: Boolean = false) : CustomPayload { + companion object { + val ID = CustomPayload.Id("swapped_hands".id) + val CODEC: PacketCodec = PacketCodecs.BOOL.xmap(::SwappedHandsModeC2SPacket) { it.swappedHands } + } + + override fun getId(): CustomPayload.Id = ID + + fun consume(executor: Executor, player: ServerPlayerEntity) { + executor.execute { player.inventoryAddon?.swappedHands = swappedHands } + } +} diff --git a/src/main/kotlin/de/rubixdev/inventorio/packet/UpdateAddonStacksS2CPacket.kt b/src/main/kotlin/de/rubixdev/inventorio/packet/UpdateAddonStacksS2CPacket.kt new file mode 100644 index 0000000..5d6b536 --- /dev/null +++ b/src/main/kotlin/de/rubixdev/inventorio/packet/UpdateAddonStacksS2CPacket.kt @@ -0,0 +1,26 @@ +package de.rubixdev.inventorio.packet + +import de.rubixdev.inventorio.player.PlayerInventoryAddon +import de.rubixdev.inventorio.util.id +import java.util.concurrent.Executor +import net.minecraft.item.ItemStack +import net.minecraft.network.RegistryByteBuf +import net.minecraft.network.codec.PacketCodec +import net.minecraft.network.codec.PacketCodecs +import net.minecraft.network.packet.CustomPayload + +data class UpdateAddonStacksS2CPacket(val updatedStacks: Map) : CustomPayload { + companion object { + val ID = CustomPayload.Id("update_addon_stacks".id) + private val MAP_CODEC: PacketCodec> = + PacketCodecs.map(::LinkedHashMap, PacketCodecs.VAR_INT, ItemStack.OPTIONAL_PACKET_CODEC) + val CODEC: PacketCodec = + MAP_CODEC.xmap(::UpdateAddonStacksS2CPacket) { it.updatedStacks } + } + + fun consume(executor: Executor) { + executor.execute { PlayerInventoryAddon.Client.local?.receiveStacksUpdateS2C(updatedStacks) } + } + + override fun getId(): CustomPayload.Id = ID +} diff --git a/src/main/kotlin/de/rubixdev/inventorio/packet/UseBoostRocketC2SPacket.kt b/src/main/kotlin/de/rubixdev/inventorio/packet/UseBoostRocketC2SPacket.kt new file mode 100644 index 0000000..76d44fc --- /dev/null +++ b/src/main/kotlin/de/rubixdev/inventorio/packet/UseBoostRocketC2SPacket.kt @@ -0,0 +1,20 @@ +package de.rubixdev.inventorio.packet + +import de.rubixdev.inventorio.player.PlayerInventoryAddon.Companion.inventoryAddon +import de.rubixdev.inventorio.util.id +import io.netty.buffer.ByteBuf +import java.util.concurrent.Executor +import net.minecraft.network.codec.PacketCodec +import net.minecraft.network.packet.CustomPayload +import net.minecraft.server.network.ServerPlayerEntity + +object UseBoostRocketC2SPacket : CustomPayload { + val ID = CustomPayload.Id("fire_boost_rocket_c2s".id) + val CODEC: PacketCodec = PacketCodec.unit(UseBoostRocketC2SPacket) + + override fun getId(): CustomPayload.Id = ID + + fun consume(payload: UseBoostRocketC2SPacket, executor: Executor, player: ServerPlayerEntity) { + executor.execute { player.inventoryAddon?.fireRocketFromInventory() } + } +} diff --git a/src/main/kotlin/de/rubixdev/inventorio/player/InventorioScreenHandler.kt b/src/main/kotlin/de/rubixdev/inventorio/player/InventorioScreenHandler.kt index a82be88..c660503 100644 --- a/src/main/kotlin/de/rubixdev/inventorio/player/InventorioScreenHandler.kt +++ b/src/main/kotlin/de/rubixdev/inventorio/player/InventorioScreenHandler.kt @@ -26,6 +26,7 @@ import net.minecraft.inventory.CraftingResultInventory import net.minecraft.inventory.Inventory import net.minecraft.item.ItemStack import net.minecraft.recipe.Recipe +import net.minecraft.recipe.RecipeEntry import net.minecraft.recipe.RecipeMatcher import net.minecraft.recipe.book.RecipeBookCategory import net.minecraft.screen.AbstractRecipeScreenHandler @@ -36,16 +37,7 @@ import net.minecraft.screen.slot.SlotActionType import net.minecraft.text.Text import net.minecraft.util.Identifier -//#if MC >= 12002 -import net.minecraft.recipe.RecipeEntry -//#endif - -/** -* Note: **Do not extend this class!** It is only marked as `open` for compatibility purposes. -*/ -// TODO: remove `open` modifier once old api package is removed -@Suppress("LeakingThis") -open class InventorioScreenHandler(syncId: Int, val inventory: PlayerInventory) : +class InventorioScreenHandler(syncId: Int, val inventory: PlayerInventory) : AbstractRecipeScreenHandler(ScreenTypeProvider.INSTANCE.getScreenHandlerType(), syncId) { val inventoryAddon = inventory.player.inventoryAddon!! @@ -343,18 +335,12 @@ open class InventorioScreenHandler(syncId: Int, val inventory: PlayerInventory) craftingInput.clear() } - //#if MC >= 12002 override fun matches(recipe: RecipeEntry>?): Boolean { if (recipe != null) { return recipe.value.matches(craftingInput, inventory.player.world) } return false } - //#else - //$$ override fun matches(recipe: Recipe): Boolean { - //$$ return recipe.matches(craftingInput, inventory.player.world) - //$$ } - //#endif override fun onContentChanged(inventory: Inventory) { CraftingScreenHandlerAccessor.updateTheResult(this, this.inventory.player.world, this.inventory.player, this.craftingInput, this.craftingResult) @@ -396,6 +382,7 @@ open class InventorioScreenHandler(syncId: Int, val inventory: PlayerInventory) return RecipeBookCategory.CRAFTING } + @Suppress("RedundantOverride") // this makes it easier to add functionality for mod compat via mixin override fun setStackInSlot(slot: Int, revision: Int, stack: ItemStack?) { super.setStackInSlot(slot, revision, stack) } diff --git a/src/main/kotlin/de/rubixdev/inventorio/player/PlayerAddonSerializer.kt b/src/main/kotlin/de/rubixdev/inventorio/player/PlayerAddonSerializer.kt index daf3005..020acb6 100644 --- a/src/main/kotlin/de/rubixdev/inventorio/player/PlayerAddonSerializer.kt +++ b/src/main/kotlin/de/rubixdev/inventorio/player/PlayerAddonSerializer.kt @@ -3,44 +3,58 @@ package de.rubixdev.inventorio.player import net.minecraft.item.ItemStack import net.minecraft.nbt.NbtCompound import net.minecraft.nbt.NbtList +import net.minecraft.registry.RegistryWrapper object PlayerAddonSerializer { - fun serialize(inventoryAddon: PlayerInventoryAddon, inventorioTag: NbtCompound) { + fun serialize( + registries: RegistryWrapper.WrapperLookup, + inventoryAddon: PlayerInventoryAddon, + inventorioTag: NbtCompound, + ) { inventorioTag.putInt("SelectedUtilitySlot", inventoryAddon.selectedUtility) - inventorioTag.put("DeepPockets", serializeSection(inventoryAddon.deepPockets)) - inventorioTag.put("UtilityBelt", serializeSection(inventoryAddon.utilityBelt)) - inventorioTag.put("ToolBelt", serializeSection(inventoryAddon.toolBelt)) + inventorioTag.put("DeepPockets", serializeSection(registries, inventoryAddon.deepPockets)) + inventorioTag.put("UtilityBelt", serializeSection(registries, inventoryAddon.utilityBelt)) + inventorioTag.put("ToolBelt", serializeSection(registries, inventoryAddon.toolBelt)) } - private fun serializeSection(section: List): NbtList { + private fun serializeSection(registries: RegistryWrapper.WrapperLookup, section: List): NbtList { val resultTag = NbtList() for ((slotIndex, itemStack) in section.withIndex()) { if (itemStack.isEmpty) { continue } - val itemTag = NbtCompound() + var itemTag = NbtCompound() itemTag.putInt("Slot", slotIndex) - itemStack.writeNbt(itemTag) + itemTag = itemStack.encode(registries, itemTag) as NbtCompound resultTag.add(itemTag) } return resultTag } - fun deserialize(inventoryAddon: PlayerInventoryAddon, inventorioTag: NbtCompound) { + fun deserialize( + registries: RegistryWrapper.WrapperLookup, + inventoryAddon: PlayerInventoryAddon, + inventorioTag: NbtCompound, + ) { inventoryAddon.selectedUtility = inventorioTag.getInt("SelectedUtilitySlot") - deserializeSection(inventoryAddon, inventoryAddon.utilityBelt, inventorioTag.getList("UtilityBelt", 10)) - deserializeSection(inventoryAddon, inventoryAddon.toolBelt, inventorioTag.getList("ToolBelt", 10)) - deserializeSection(inventoryAddon, inventoryAddon.deepPockets, inventorioTag.getList("DeepPockets", 10)) + deserializeSection(registries, inventoryAddon, inventoryAddon.utilityBelt, inventorioTag.getList("UtilityBelt", 10)) + deserializeSection(registries, inventoryAddon, inventoryAddon.toolBelt, inventorioTag.getList("ToolBelt", 10)) + deserializeSection(registries, inventoryAddon, inventoryAddon.deepPockets, inventorioTag.getList("DeepPockets", 10)) } - private fun deserializeSection(inventoryAddon: PlayerInventoryAddon, inventorySection: MutableList, sectionTag: NbtList) { + private fun deserializeSection( + registries: RegistryWrapper.WrapperLookup, + inventoryAddon: PlayerInventoryAddon, + inventorySection: MutableList, + sectionTag: NbtList, + ) { for (i in inventorySection.indices) inventorySection[i] = ItemStack.EMPTY for (itemTag in sectionTag) { val compoundTag = itemTag as NbtCompound - val itemStack = ItemStack.fromNbt(compoundTag) + val itemStack = ItemStack.fromNbtOrEmpty(registries, compoundTag) val slotIndex = compoundTag.getInt("Slot") if (slotIndex in inventorySection.indices) { inventorySection[slotIndex] = itemStack diff --git a/src/main/kotlin/de/rubixdev/inventorio/player/PlayerInventoryAddon.kt b/src/main/kotlin/de/rubixdev/inventorio/player/PlayerInventoryAddon.kt index 215bb8a..3a5738f 100644 --- a/src/main/kotlin/de/rubixdev/inventorio/player/PlayerInventoryAddon.kt +++ b/src/main/kotlin/de/rubixdev/inventorio/player/PlayerInventoryAddon.kt @@ -24,11 +24,8 @@ import net.minecraft.util.Util * This class is responsible for the inventory addon itself, * while [InventorioScreen] is responsible for the visuals of the Player Screen UI * and [InventorioScreenHandler] is responsible for the slots and player interacting with the slots - * - * Note: **Do not extend this class!** It is only marked as `open` for compatibility purposes. */ -// TODO: remove `open` modifier once old api package is removed -open class PlayerInventoryAddon internal constructor(player: PlayerEntity) : PlayerInventoryExtraStuff(player) { +class PlayerInventoryAddon internal constructor(player: PlayerEntity) : PlayerInventoryExtraStuff(player) { init { bNoMoreToolBeltSlots = true } @@ -84,14 +81,6 @@ open class PlayerInventoryAddon internal constructor(player: PlayerEntity) : Pla } } - protected fun copyFrom(other: PlayerInventoryAddon) { - cloneFrom(other) - prevSelectedSlot = other.prevSelectedSlot - displayToolTimeStamp = other.displayToolTimeStamp - displayTool = other.displayTool - swappedHands = other.swappedHands - } - @Environment(EnvType.CLIENT) object Client { val local get() = MinecraftClient.getInstance().player?.inventoryAddon diff --git a/src/main/kotlin/de/rubixdev/inventorio/player/inventory/PlayerInventoryExtension.kt b/src/main/kotlin/de/rubixdev/inventorio/player/inventory/PlayerInventoryExtension.kt index ff8306c..a837861 100644 --- a/src/main/kotlin/de/rubixdev/inventorio/player/inventory/PlayerInventoryExtension.kt +++ b/src/main/kotlin/de/rubixdev/inventorio/player/inventory/PlayerInventoryExtension.kt @@ -183,7 +183,7 @@ abstract class PlayerInventoryExtension protected constructor(val player: Player } protected fun areItemsSimilar(stack1: ItemStack, stack2: ItemStack): Boolean { - return stack1.isNotEmpty && ItemStack.canCombine(stack1, stack2) + return stack1.isNotEmpty && ItemStack.areItemsAndComponentsEqual(stack1, stack2) } fun contains(stack: ItemStack): Boolean = stacks.any { areItemsSimilar(it, stack) } diff --git a/src/main/kotlin/de/rubixdev/inventorio/player/inventory/PlayerInventoryExtraStuff.kt b/src/main/kotlin/de/rubixdev/inventorio/player/inventory/PlayerInventoryExtraStuff.kt index 3e1fc86..a49a506 100644 --- a/src/main/kotlin/de/rubixdev/inventorio/player/inventory/PlayerInventoryExtraStuff.kt +++ b/src/main/kotlin/de/rubixdev/inventorio/player/inventory/PlayerInventoryExtraStuff.kt @@ -5,7 +5,10 @@ import de.rubixdev.inventorio.packet.InventorioNetworking import de.rubixdev.inventorio.util.getLevelOn import kotlin.math.max import net.minecraft.block.BlockState +import net.minecraft.block.Blocks +import net.minecraft.block.StainedGlassBlock import net.minecraft.client.MinecraftClient +import net.minecraft.component.DataComponentTypes import net.minecraft.enchantment.Enchantments import net.minecraft.entity.EquipmentSlot import net.minecraft.entity.player.PlayerEntity @@ -15,13 +18,6 @@ import net.minecraft.item.ItemStack import net.minecraft.item.Items import net.minecraft.item.ToolItem -//#if MC >= 12002 -import net.minecraft.block.Blocks -import net.minecraft.block.StainedGlassBlock -//#else -//$$ import net.minecraft.block.AbstractGlassBlock -//#endif - abstract class PlayerInventoryExtraStuff protected constructor(player: PlayerEntity) : PlayerInventoryHandFeatures(player) { /** * Returns the block breaking speed based on the return of [getMostPreferredTool] @@ -48,11 +44,7 @@ abstract class PlayerInventoryExtraStuff protected constructor(player: PlayerEnt if (result.getMiningSpeedMultiplier(block) > 1.0f) { return result } - //#if MC >= 12002 val isGlass = block.block is StainedGlassBlock || block.isOf(Blocks.GLASS) - //#else - //$$ val isGlass = block.block is AbstractGlassBlock - //#endif if (isGlass) { return toolBelt.firstOrNull { Enchantments.SILK_TOUCH.getLevelOn(it) > 0 } ?: ItemStack.EMPTY } @@ -82,12 +74,19 @@ abstract class PlayerInventoryExtraStuff protected constructor(player: PlayerEnt findFittingToolBeltStack(ItemStack(Items.DIAMOND_AXE)) } // For some reason we need to manually add weapon's attack modifiers - the game doesn't do that for us - player.attributes.addTemporaryModifiers(displayTool.getAttributeModifiers(EquipmentSlot.MAINHAND)) + displayTool.applyAttributeModifiers(EquipmentSlot.MAINHAND) { attribute, modifier -> + val instance = player.attributes.getCustomInstance(attribute) + instance?.removeModifier(modifier) + instance?.addTemporaryModifier(modifier) + } } fun postPlayerAttack() { if (!playerAttackConditions()) return - player.attributes.removeModifiers(displayTool.getAttributeModifiers(EquipmentSlot.MAINHAND)) + displayTool.applyAttributeModifiers(EquipmentSlot.MAINHAND) { attribute, modifier -> + val instance = player.attributes.getCustomInstance(attribute) + instance?.removeModifier(modifier) + } } fun fireRocketFromInventory() { @@ -105,7 +104,7 @@ abstract class PlayerInventoryExtraStuff protected constructor(player: PlayerEnt } private fun tryFireRocket(itemStack: ItemStack): Boolean { - if (itemStack.item is FireworkRocketItem && itemStack.getSubNbt("Fireworks")?.getList("Explosions", 10)?.isEmpty() != false) { + if (itemStack.item is FireworkRocketItem && itemStack.components.get(DataComponentTypes.FIREWORKS)?.explosions?.isEmpty() != false) { val copyStack = itemStack.copy() if (!player.abilities.creativeMode) { itemStack.decrement(1) diff --git a/src/main/kotlin/de/rubixdev/inventorio/util/MixinTesters.kt b/src/main/kotlin/de/rubixdev/inventorio/util/MixinTesters.kt index b09f41f..ce6955c 100644 --- a/src/main/kotlin/de/rubixdev/inventorio/util/MixinTesters.kt +++ b/src/main/kotlin/de/rubixdev/inventorio/util/MixinTesters.kt @@ -24,7 +24,7 @@ class TotemTester : ConditionTester { //$$ class TrinketsTester : ConditionTester { //$$ override fun isSatisfied(mixinClassName: String) = GlobalSettings.trinketsIntegration.boolValue //$$ } -//#elseif FORGELIKE +//#elseif NEOFORGE //$$ class CuriosTester : ConditionTester { //$$ override fun isSatisfied(mixinClassName: String) = GlobalSettings.curiosIntegration.boolValue //$$ } diff --git a/src/main/kotlin/de/rubixdev/inventorio/util/PlatformApi.kt b/src/main/kotlin/de/rubixdev/inventorio/util/PlatformApi.kt index b5cb771..8df8257 100644 --- a/src/main/kotlin/de/rubixdev/inventorio/util/PlatformApi.kt +++ b/src/main/kotlin/de/rubixdev/inventorio/util/PlatformApi.kt @@ -1,6 +1,7 @@ package de.rubixdev.inventorio.util -@Suppress("UNUSED_PARAMETER") +@Suppress("UNUSED_PARAMETER", "RedundantNullableReturnType") object PlatformApi { fun isModLoaded(modId: String): Boolean = throw IllegalStateException() + fun modDisplayname(modId: String): String? = throw IllegalStateException() } diff --git a/src/main/kotlin/de/rubixdev/inventorio/util/RandomStuff.kt b/src/main/kotlin/de/rubixdev/inventorio/util/RandomStuff.kt index 771021f..773979b 100644 --- a/src/main/kotlin/de/rubixdev/inventorio/util/RandomStuff.kt +++ b/src/main/kotlin/de/rubixdev/inventorio/util/RandomStuff.kt @@ -14,6 +14,7 @@ import net.minecraft.enchantment.EnchantmentHelper import net.minecraft.item.ItemStack import net.minecraft.item.TridentItem import net.minecraft.screen.ScreenHandler +import net.minecraft.util.Identifier import org.apache.logging.log4j.LogManager data class Point2I(@JvmField val x: Int, @JvmField val y: Int) @@ -58,7 +59,7 @@ fun canRMBItem(itemStack: ItemStack): Boolean { } fun Enchantment.getLevelOn(stack: ItemStack): Int { - //#if FORGELIKE + //#if NEOFORGE //$$ return stack.getEnchantmentLevel(this) //#else return EnchantmentHelper.getLevel(this, stack) @@ -77,3 +78,12 @@ class MixinDelegate( override fun getValue(thisRef: Any?, property: KProperty<*>): T = getter.get() override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) = setter.accept(value) } + +/** Turn this String into an [Identifier] in this mod's namespace */ +val String.id get() = Identifier("inventorio", this) + +/** Turn this String into an [Identifier] in the vanilla namespace */ +fun String.id() = Identifier(this) + +/** Turn this String into an [Identifier] in the given namespace */ +fun String.id(namespace: String) = Identifier(namespace, this) diff --git a/src/main/kotlin/de/rubixdev/inventorio/util/UIConstants.kt b/src/main/kotlin/de/rubixdev/inventorio/util/UIConstants.kt index 0e5bcd9..c76c89b 100644 --- a/src/main/kotlin/de/rubixdev/inventorio/util/UIConstants.kt +++ b/src/main/kotlin/de/rubixdev/inventorio/util/UIConstants.kt @@ -39,11 +39,5 @@ const val CRAFTING_GRID_OFFSET_X = 20 @JvmField val CANVAS_INVENTORY_TEXTURE_SIZE = Point2I(256, 256) @JvmField val CANVAS_WIDGETS_TEXTURE_SIZE = Point2I(256, 64) -//#if MC < 12002 -//$$ @JvmField val CANVAS_TOGGLE_BUTTON_ON = Point2I(243, 114) -//$$ @JvmField val CANVAS_TOGGLE_BUTTON_OFF = Point2I(243, 120) -//$$ const val CANVAS_TOGGLE_BUTTON_HOVER_SHIFT = 12 -//$$ @JvmField val CANVAS_LOCKED_CRAFT_BUTTON = Point2I(236, 138) -//#endif @JvmField val GUI_TOGGLE_BUTTON_OFFSET = Rectangle(-19, 5, 13, 6) @JvmField val GUI_LOCKED_CRAFTING_POS = Rectangle(125, 25, 20, 20) diff --git a/src/main/kotlin/me/lizardofoz/inventorio/api/ToolBeltSlotTemplate.kt b/src/main/kotlin/me/lizardofoz/inventorio/api/ToolBeltSlotTemplate.kt deleted file mode 100644 index 803b271..0000000 --- a/src/main/kotlin/me/lizardofoz/inventorio/api/ToolBeltSlotTemplate.kt +++ /dev/null @@ -1,16 +0,0 @@ -package me.lizardofoz.inventorio.api - -import de.rubixdev.inventorio.api.ToolBeltSlotTemplate -import net.minecraft.util.Identifier - -@Deprecated("Package has been moved", ReplaceWith("de.rubixdev.inventorio.api.ToolBeltSlotTemplate"), DeprecationLevel.ERROR) -class ToolBeltSlotTemplate(name: String, emptyIcon: Identifier) : ToolBeltSlotTemplate(name, emptyIcon) { - companion object { - @JvmStatic - @Suppress("DEPRECATION_ERROR", "DeprecatedCallableAddReplaceWith") - @Deprecated("For internal use only", level = DeprecationLevel.ERROR) - fun of(delegate: ToolBeltSlotTemplate?): me.lizardofoz.inventorio.api.ToolBeltSlotTemplate? { - return delegate?.let { me.lizardofoz.inventorio.api.ToolBeltSlotTemplate(it.name, it.emptyIcon) } - } - } -} diff --git a/src/main/kotlin/me/lizardofoz/inventorio/client/ui/InventorioScreen.kt b/src/main/kotlin/me/lizardofoz/inventorio/client/ui/InventorioScreen.kt deleted file mode 100644 index 227c317..0000000 --- a/src/main/kotlin/me/lizardofoz/inventorio/client/ui/InventorioScreen.kt +++ /dev/null @@ -1,25 +0,0 @@ -package me.lizardofoz.inventorio.client.ui - -import de.rubixdev.inventorio.client.ui.InventorioScreen -import de.rubixdev.inventorio.mixin.client.accessor.HandledScreenAccessor -import de.rubixdev.inventorio.player.InventorioScreenHandler -import net.minecraft.entity.player.PlayerInventory - -@Deprecated("Package has been moved", ReplaceWith("de.rubixdev.inventorio.client.ui.InventorioScreen"), DeprecationLevel.ERROR) -class InventorioScreen(handler: InventorioScreenHandler, inventory: PlayerInventory) : - InventorioScreen(handler, inventory) { - companion object { - @JvmStatic - @Suppress("DEPRECATION_ERROR", "DeprecatedCallableAddReplaceWith") - @Deprecated("For internal use only", level = DeprecationLevel.ERROR) - fun of(delegate: InventorioScreen?): me.lizardofoz.inventorio.client.ui.InventorioScreen? { - return delegate?.let { - @Suppress("UNCHECKED_CAST") - me.lizardofoz.inventorio.client.ui.InventorioScreen( - (it as HandledScreenAccessor).handler, - it.inventory, - ) - } - } - } -} diff --git a/src/main/kotlin/me/lizardofoz/inventorio/player/InventorioScreenHandler.kt b/src/main/kotlin/me/lizardofoz/inventorio/player/InventorioScreenHandler.kt deleted file mode 100644 index dd04645..0000000 --- a/src/main/kotlin/me/lizardofoz/inventorio/player/InventorioScreenHandler.kt +++ /dev/null @@ -1,20 +0,0 @@ -package me.lizardofoz.inventorio.player - -import de.rubixdev.inventorio.player.InventorioScreenHandler -import net.minecraft.entity.player.PlayerInventory - -@Deprecated("Package has been moved", ReplaceWith("de.rubixdev.inventorio.player.InventorioScreenHandler"), DeprecationLevel.ERROR) -class InventorioScreenHandler(syncId: Int, inventory: PlayerInventory) : InventorioScreenHandler(syncId, inventory) { - companion object { - @JvmStatic - @Suppress("DEPRECATION_ERROR") - @Deprecated("For internal use only", level = DeprecationLevel.ERROR) - fun of(delegate: InventorioScreenHandler?): me.lizardofoz.inventorio.player.InventorioScreenHandler? { - return delegate?.let { - me.lizardofoz.inventorio.player.InventorioScreenHandler(it.syncId, it.inventory).apply { - slots.indices.forEach { idx -> slots[idx] = it.slots[idx] } - } - } - } - } -} diff --git a/src/main/kotlin/me/lizardofoz/inventorio/player/PlayerInventoryAddon.kt b/src/main/kotlin/me/lizardofoz/inventorio/player/PlayerInventoryAddon.kt deleted file mode 100644 index a38ebeb..0000000 --- a/src/main/kotlin/me/lizardofoz/inventorio/player/PlayerInventoryAddon.kt +++ /dev/null @@ -1,28 +0,0 @@ -package me.lizardofoz.inventorio.player - -import de.rubixdev.inventorio.mixin.accessor.SimpleInventoryAccessor -import de.rubixdev.inventorio.player.PlayerInventoryAddon -import net.minecraft.entity.player.PlayerEntity - -@Deprecated("Package has been moved", ReplaceWith("de.rubixdev.inventorio.player.PlayerInventoryAddon"), DeprecationLevel.ERROR) -class PlayerInventoryAddon(player: PlayerEntity) : PlayerInventoryAddon(player) { - companion object { - @JvmStatic - @Suppress("DEPRECATION_ERROR") - @Deprecated("For internal use only", level = DeprecationLevel.ERROR) - fun ofNonNull(delegate: PlayerInventoryAddon): me.lizardofoz.inventorio.player.PlayerInventoryAddon { - return me.lizardofoz.inventorio.player.PlayerInventoryAddon(delegate.player).apply { - copyFrom(delegate) - @Suppress("CAST_NEVER_SUCCEEDS") - (this as SimpleInventoryAccessor).heldStacks = delegate.stacks - } - } - - @JvmStatic - @Suppress("DEPRECATION_ERROR", "DeprecatedCallableAddReplaceWith") - @Deprecated("For internal use only", level = DeprecationLevel.ERROR) - fun of(delegate: PlayerInventoryAddon?): me.lizardofoz.inventorio.player.PlayerInventoryAddon? { - return delegate?.let { ofNonNull(delegate) } - } - } -} diff --git a/src/main/resources/inventorio.mixins.json b/src/main/resources/inventorio.mixins.json index 03a3b89..e41a481 100644 --- a/src/main/resources/inventorio.mixins.json +++ b/src/main/resources/inventorio.mixins.json @@ -1,7 +1,7 @@ { "required": true, "package": "de.rubixdev.inventorio.mixin", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "minVersion": "0.8", "plugin": "de.rubixdev.inventorio.InventorioMixinPlugin", "mixins": [ @@ -15,7 +15,7 @@ "accessor.ScreenHandlerAccessor", "accessor.SimpleInventoryAccessor", "accessor.SlotAccessor", - "optional.bowfix.BowItemMixin", + "optional.bowfix.PlayerEntityMixin", "optional.enderchest.EnderChestBlockMixin", "optional.enderchest.PlayerEntityMixin", "optional.totem.LivingEntityMixin" @@ -28,9 +28,9 @@ "client.InGameHudMixinLP", "client.InventoryScreenMixin", "client.MinecraftClientMixin", + "client.RecipeBookWidgetMixin", "client.accessor.HandledScreenAccessor", "client.accessor.MinecraftClientAccessor", - "client.RecipeBookWidgetMixin", "client.accessor.ScreenAccessor" ], "injectors": { diff --git a/versions/1.20.1-fabric/gradle.properties b/versions/1.20.1-fabric/gradle.properties deleted file mode 100644 index 8d5ea3d..0000000 --- a/versions/1.20.1-fabric/gradle.properties +++ /dev/null @@ -1,31 +0,0 @@ -# General Properties - loom.platform=fabric - minecraft_version=1.20.1 - yarn_mappings=1.20.1+build.10 - game_versions=1.20\n1.20.1 - -# (Neo)Forge and dependency version ranges - minecraft_version_range_fabric=>=1.20 <=1.20.1 - minecraft_version_range_forge= - forge_version= - forge_version_range= - neoforge_version= - neoforge_version_range= - -# Common Dependencies - cloth_version=11.1.118 - # https://modrinth.com/mod/clumps/versions - clumps_version=12.0.0.3-fabric,1.20.1 - -# Fabric Dependencies - # https://modrinth.com/mod/early-loading-screen/versions - early_loading_screen_version=0.1.5+1.20.1 - fabric_api_version=0.92.0+1.20.1 - modmenu_version=7.2.2 - # https://modrinth.com/mod/trinkets/versions?l=fabric - trinkets_version=3.7.2 - cca_version=5.2.2 - -# (Neo)Forge Dependencies - # https://maven.theillusivec4.top/top/theillusivec4/curios/curios-forge/ - curios_version= diff --git a/versions/1.20.1-forge/gradle.properties b/versions/1.20.1-forge/gradle.properties deleted file mode 100644 index 8956da8..0000000 --- a/versions/1.20.1-forge/gradle.properties +++ /dev/null @@ -1,31 +0,0 @@ -# General Properties - loom.platform=forge - minecraft_version=1.20.1 - yarn_mappings=1.20.1+build.10 - game_versions=1.20\n1.20.1 - -# (Neo)Forge and dependency version ranges - minecraft_version_range_fabric= - minecraft_version_range_forge=[1.20,1.20.1] - forge_version=1.20.1-47.2.20 - forge_version_range=[47,) - neoforge_version= - neoforge_version_range= - -# Common Dependencies - cloth_version=11.1.118 - # https://modrinth.com/mod/clumps/versions - clumps_version=12.0.0.3-forge,1.20.1 - -# Fabric Dependencies - # https://modrinth.com/mod/early-loading-screen/versions - early_loading_screen_version= - fabric_api_version= - modmenu_version= - # https://modrinth.com/mod/trinkets/versions?l=fabric - trinkets_version= - cca_version= - -# (Neo)Forge Dependencies - # https://maven.theillusivec4.top/top/theillusivec4/curios/curios-forge/ - curios_version=5.14.1+1.20.1 diff --git a/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/CPacketScrollMixin.java b/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/CPacketScrollMixin.java deleted file mode 100644 index 70f5205..0000000 --- a/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/CPacketScrollMixin.java +++ /dev/null @@ -1,52 +0,0 @@ -package de.rubixdev.inventorio.mixin.forge.curios; - -import com.llamalad7.mixinextras.sugar.Local; -import de.rubixdev.inventorio.integration.curios.ICuriosContainer; -import de.rubixdev.inventorio.util.CuriosTester; -import me.fallenbreath.conditionalmixin.api.annotation.Condition; -import me.fallenbreath.conditionalmixin.api.annotation.Restriction; -import net.minecraft.screen.ScreenHandler; -import net.minecraftforge.network.NetworkEvent; -import org.objectweb.asm.Opcodes; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Slice; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import top.theillusivec4.curios.common.network.client.CPacketScroll; - -import java.util.function.Supplier; - -@Restriction(require = { @Condition("curios"), @Condition(type = Condition.Type.TESTER, tester = CuriosTester.class) }) -@Mixin(CPacketScroll.class) -public abstract class CPacketScrollMixin { - @Shadow - private int index; - - @Shadow - private int windowId; - - @Inject( - method = "lambda$handle$0", - at = @At(value = "JUMP", opcode = Opcodes.IFEQ, shift = At.Shift.BEFORE, ordinal = 0), - slice = @Slice( - from = @At( - value = "FIELD", - target = "Lnet/minecraft/server/network/ServerPlayerEntity;currentScreenHandler:Lnet/minecraft/screen/ScreenHandler;" - ) - ) - ) - private static void inventorioScrollToIndex( - Supplier ctx, - CPacketScroll msg, - CallbackInfo ci, - @Local ScreenHandler container - ) { - CPacketScrollMixin accessor = ((CPacketScrollMixin) (Object) msg); - // noinspection DataFlowIssue - if (container instanceof ICuriosContainer curiosContainer && container.syncId == accessor.windowId) { - curiosContainer.inventorio$scrollToIndex(accessor.index); - } - } -} diff --git a/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/CurioStacksHandlerMixin.java b/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/CurioStacksHandlerMixin.java deleted file mode 100644 index ea85981..0000000 --- a/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/CurioStacksHandlerMixin.java +++ /dev/null @@ -1,45 +0,0 @@ -package de.rubixdev.inventorio.mixin.forge.curios; - -import de.rubixdev.inventorio.integration.curios.ICuriosContainer; -import de.rubixdev.inventorio.util.CuriosTester; -import me.fallenbreath.conditionalmixin.api.annotation.Condition; -import me.fallenbreath.conditionalmixin.api.annotation.Restriction; -import net.minecraft.entity.player.PlayerEntity; -import org.objectweb.asm.Opcodes; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Slice; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler; -import top.theillusivec4.curios.common.inventory.CurioStacksHandler; - -@Restriction(require = { @Condition("curios"), @Condition(type = Condition.Type.TESTER, tester = CuriosTester.class) }) -@Mixin(CurioStacksHandler.class) -public class CurioStacksHandlerMixin { - @Shadow - @Final - private ICuriosItemHandler itemHandler; - - @Inject( - method = "update", - at = @At(value = "JUMP", opcode = Opcodes.IFEQ, shift = At.Shift.BEFORE, ordinal = 0), - slice = @Slice( - from = @At( - value = "INVOKE", - target = "Lnet/minecraftforge/eventbus/api/IEventBus;post(Lnet/minecraftforge/eventbus/api/Event;)Z" - ) - ), - remap = false - ) - private void inventorioResetSlots(CallbackInfo ci) { - if ( - itemHandler.getWearer() instanceof PlayerEntity player - && player.currentScreenHandler instanceof ICuriosContainer curiosContainer - ) { - curiosContainer.inventorio$resetSlots(); - } - } -} diff --git a/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/CuriosEventHandlerMixin.java b/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/CuriosEventHandlerMixin.java deleted file mode 100644 index 0ef4308..0000000 --- a/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/CuriosEventHandlerMixin.java +++ /dev/null @@ -1,35 +0,0 @@ -package de.rubixdev.inventorio.mixin.forge.curios; - -import de.rubixdev.inventorio.integration.curios.ICuriosContainer; -import de.rubixdev.inventorio.util.CuriosTester; -import me.fallenbreath.conditionalmixin.api.annotation.Condition; -import me.fallenbreath.conditionalmixin.api.annotation.Restriction; -import net.minecraft.server.network.ServerPlayerEntity; -import org.objectweb.asm.Opcodes; -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.Slice; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler; -import top.theillusivec4.curios.common.event.CuriosEventHandler; - -@Restriction(require = { @Condition("curios"), @Condition(type = Condition.Type.TESTER, tester = CuriosTester.class) }) -@Mixin(CuriosEventHandler.class) -public class CuriosEventHandlerMixin { - @Inject( - method = "lambda$onDatapackSync$5", - at = @At(value = "JUMP", opcode = Opcodes.IFEQ, shift = At.Shift.BEFORE, ordinal = 0), - slice = @Slice( - from = @At( - value = "FIELD", - target = "Lnet/minecraft/server/network/ServerPlayerEntity;currentScreenHandler:Lnet/minecraft/screen/ScreenHandler;" - ) - ) - ) - private static void inventorioResetSlots2(ServerPlayerEntity player, ICuriosItemHandler handler, CallbackInfo ci) { - if (player.currentScreenHandler instanceof ICuriosContainer curiosContainer) { - curiosContainer.inventorio$resetSlots(); - } - } -} diff --git a/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/HandledScreenMixin.java b/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/HandledScreenMixin.java deleted file mode 100644 index 1117d4d..0000000 --- a/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/HandledScreenMixin.java +++ /dev/null @@ -1,48 +0,0 @@ -package de.rubixdev.inventorio.mixin.forge.curios; - -import com.llamalad7.mixinextras.injector.ModifyReturnValue; -import de.rubixdev.inventorio.integration.curios.ICuriosScreen; -import de.rubixdev.inventorio.util.CuriosTester; -import me.fallenbreath.conditionalmixin.api.annotation.Condition; -import me.fallenbreath.conditionalmixin.api.annotation.Restriction; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.screen.slot.Slot; -import net.minecraft.text.Text; -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.CallbackInfo; -import top.theillusivec4.curios.common.inventory.CurioSlot; - -@Restriction(require = { @Condition("curios"), @Condition(type = Condition.Type.TESTER, tester = CuriosTester.class) }) -@Mixin(HandledScreen.class) -public class HandledScreenMixin extends Screen { - protected HandledScreenMixin(Text title) { - super(title); - } - - @ModifyReturnValue(method = "isPointOverSlot", at = @At("RETURN")) - private boolean dontRenderCuriosWhenClosed(boolean original, Slot slot) { - if ( - this instanceof ICuriosScreen curiosScreen - && slot instanceof CurioSlot - && !curiosScreen.getInventorio$isCuriosOpen() - ) { - return false; - } - return original; - } - - @Inject(method = "drawSlot", at = @At("HEAD"), cancellable = true) - private void dontRenderCuriosWhenClosed(DrawContext context, Slot slot, CallbackInfo ci) { - if ( - this instanceof ICuriosScreen curiosScreen - && slot instanceof CurioSlot - && !curiosScreen.getInventorio$isCuriosOpen() - ) { - ci.cancel(); - } - } -} diff --git a/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/InventorioScreenHandlerMixin.java b/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/InventorioScreenHandlerMixin.java deleted file mode 100644 index 5f9f23f..0000000 --- a/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/InventorioScreenHandlerMixin.java +++ /dev/null @@ -1,79 +0,0 @@ -package de.rubixdev.inventorio.mixin.forge.curios; - -import de.rubixdev.inventorio.integration.curios.ICuriosContainer; -import de.rubixdev.inventorio.integration.curios.InventorioScreenHandlerMixinHelper; -import de.rubixdev.inventorio.player.InventorioScreenHandler; -import de.rubixdev.inventorio.util.CuriosTester; -import me.fallenbreath.conditionalmixin.api.annotation.Condition; -import me.fallenbreath.conditionalmixin.api.annotation.Restriction; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.CraftingInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.screen.AbstractRecipeScreenHandler; -import net.minecraft.screen.ScreenHandlerType; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler; - -@SuppressWarnings("UnresolvedMixinReference") // the Minecraft Dev plugin - // doesn't seem to like Kotlin - // target classes -@Restriction(require = { @Condition("curios"), @Condition(type = Condition.Type.TESTER, tester = CuriosTester.class) }) -@Mixin(InventorioScreenHandler.class) -public abstract class InventorioScreenHandlerMixin extends AbstractRecipeScreenHandler - implements ICuriosContainer { - public InventorioScreenHandlerMixin(ScreenHandlerType arg, int i) { - super(arg, i); - } - - @SuppressWarnings("DataFlowIssue") - @Unique private final InventorioScreenHandler thiz = (InventorioScreenHandler) (AbstractRecipeScreenHandler) this; - - @Unique private InventorioScreenHandlerMixinHelper helper; - - @Override - public void inventorio$resetSlots() { - helper.curios$resetSlots(thiz); - } - - @Override - public void inventorio$scrollTo(float pos) { - helper.curios$scrollTo(thiz, pos); - } - - @Override - public void inventorio$scrollToIndex(int indexIn) { - helper.curios$scrollToIndex(thiz, indexIn); - } - - @Override - public boolean getInventorio$hasCosmeticColumn() { return helper.hasCosmeticColumn(); } - - @Override - public boolean getInventorio$canScroll() { return helper.canScroll(); } - - @Nullable @Override - public ICuriosItemHandler getInventorio$curiosHandler() { return helper.getCuriosHandler(); } - - @Inject(method = "(ILnet/minecraft/entity/player/PlayerInventory;)V", at = @At("RETURN")) - private void curios$init(int syncId, PlayerInventory inventory, CallbackInfo ci) { - helper = new InventorioScreenHandlerMixinHelper(thiz); - helper.curios$init(thiz); - } - - @Inject(method = "setStackInSlot", at = @At("HEAD"), cancellable = true) - private void curios$setStackInSlot(int slot, int revision, ItemStack stack, CallbackInfo ci) { - helper.curios$setStackInSlot(thiz, slot, ci); - } - - @Inject(method = "quickMove", at = @At("HEAD"), cancellable = true) - private void curios$quickMove(PlayerEntity player, int sourceIndex, CallbackInfoReturnable cir) { - helper.curios$quickMove(thiz, sourceIndex, cir); - } -} diff --git a/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/InventorioScreenMixin.java b/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/InventorioScreenMixin.java deleted file mode 100644 index b901fde..0000000 --- a/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/InventorioScreenMixin.java +++ /dev/null @@ -1,141 +0,0 @@ -package de.rubixdev.inventorio.mixin.forge.curios; - -import de.rubixdev.inventorio.client.ui.InventorioScreen; -import de.rubixdev.inventorio.integration.curios.ICuriosScreen; -import de.rubixdev.inventorio.integration.curios.InventorioScreenMixinHelper; -import de.rubixdev.inventorio.player.InventorioScreenHandler; -import de.rubixdev.inventorio.util.CuriosTester; -import me.fallenbreath.conditionalmixin.api.annotation.Condition; -import me.fallenbreath.conditionalmixin.api.annotation.Restriction; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.ingame.AbstractInventoryScreen; -import net.minecraft.client.gui.screen.ingame.HandledScreen; -import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget; -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.text.Text; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -@SuppressWarnings("UnresolvedMixinReference") // the Minecraft Dev plugin - // doesn't seem to like Kotlin - // target classes -@Restriction(require = { @Condition("curios"), @Condition(type = Condition.Type.TESTER, tester = CuriosTester.class) }) -@Mixin(InventorioScreen.class) -public abstract class InventorioScreenMixin extends AbstractInventoryScreen - implements ICuriosScreen { - public InventorioScreenMixin(InventorioScreenHandler arg, PlayerInventory arg2, Text arg3) { - super(arg, arg2, arg3); - } - - @Shadow - private RecipeBookWidget recipeBook; - - @SuppressWarnings("DataFlowIssue") - @Unique private final InventorioScreen thiz = (InventorioScreen) (AbstractInventoryScreen) this; - - @Unique private InventorioScreenMixinHelper helper; - - @Override - public void inventorio$updateRenderButtons() { - helper.curios$updateRenderButtons(thiz); - } - - @Override - public boolean getInventorio$isCuriosOpen() { return helper.isCuriosOpen(); } - - @Inject(method = "init", at = @At("RETURN")) - private void curios$init(CallbackInfo ci) { - helper = new InventorioScreenMixinHelper(thiz, recipeBook); - helper.curios$init(thiz); - } - - @Inject(method = "render", at = @At("RETURN")) - private void curios$render(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) { - helper.curios$render(thiz, context, mouseX, mouseY, delta); - } - - @Inject(method = "drawMouseoverTooltip", at = @At("RETURN")) - private void curios$drawMouseoverTooltip(DrawContext context, int x, int y, CallbackInfo ci) { - helper.drawMouseoverTooltip(context, x, y); - } - - @Inject(method = "drawBackground", at = @At("RETURN")) - private void curios$drawBackground(DrawContext drawContext, float delta, int mouseX, int mouseY, CallbackInfo ci) { - helper.drawBackground(drawContext); - } - - @Inject(method = "isPointWithinBounds", at = @At("HEAD"), cancellable = true) - private void curios$isPointWithinBounds( - int xPosition, - int yPosition, - int width, - int height, - double pointX, - double pointY, - CallbackInfoReturnable cir - ) { - helper.isPointWithinBounds(cir); - } - - @Inject(method = "mouseClicked", at = @At("HEAD"), cancellable = true) - private void curios$mouseClicked(double mouseX, double mouseY, int button, CallbackInfoReturnable cir) { - helper.mouseClicked(mouseX, mouseY, cir); - } - - @Inject(method = "mouseReleased", at = @At("HEAD"), cancellable = true) - private void curios$mouseReleased(double mouseX, double mouseY, int button, CallbackInfoReturnable cir) { - helper.mouseReleased(button, cir); - } - - @Inject(method = "mouseDragged", at = @At("HEAD"), cancellable = true) - private void curios$mouseDragged( - double mouseX, - double mouseY, - int button, - double deltaX, - double deltaY, - CallbackInfoReturnable cir - ) { - helper.mouseDragged(mouseY, cir); - } - - @Inject(method = "mouseScrolled", at = @At("HEAD"), cancellable = true) - private void curios$mouseScrolled( - double mouseX, - double mouseY, - double verticalAmount, - CallbackInfoReturnable cir - ) { - helper.mouseScrolled(verticalAmount, cir); - } - - @Inject( - method = "init$lambda$0", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/client/gui/screen/recipebook/RecipeBookWidget;toggleOpen()V", - shift = At.Shift.AFTER - ) - ) - private static void curios$hideCuriosWhenOpeningRecipeBook( - InventorioScreen instance, - ButtonWidget it, - CallbackInfo ci - ) { - // noinspection DataFlowIssue - ((InventorioScreenMixin) (HandledScreen) instance).helper.curios$hideCuriosWhenOpeningRecipeBook(instance); - } - - @Inject(method = "updateScreenPosition", at = @At("TAIL"), remap = false) - private void curios$updateScreenPosition(CallbackInfo ci) { - if (helper != null) { - helper.curios$updateRenderButtons(thiz); - } - } -} diff --git a/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/InventorioScreenMixin_alternative.java b/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/InventorioScreenMixin_alternative.java deleted file mode 100644 index 800de10..0000000 --- a/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/InventorioScreenMixin_alternative.java +++ /dev/null @@ -1,72 +0,0 @@ -package de.rubixdev.inventorio.mixin.forge.curios; - -import de.rubixdev.inventorio.client.ui.InventorioScreen; -import de.rubixdev.inventorio.integration.curios.CustomCuriosButton; -import de.rubixdev.inventorio.player.InventorioScreenHandler; -import me.fallenbreath.conditionalmixin.api.annotation.Condition; -import me.fallenbreath.conditionalmixin.api.annotation.Restriction; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.ingame.AbstractInventoryScreen; -import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget; -import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.text.Text; -import net.minecraft.util.Pair; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import top.theillusivec4.curios.client.gui.CuriosScreen; -import top.theillusivec4.curios.common.network.client.CPacketOpenCurios; - -import static de.rubixdev.inventorio.integration.curios.InventorioScreenHandlerMixinHelperKt.sendToServer; -import static de.rubixdev.inventorio.integration.curios.InventorioScreenMixinHelper.CURIO_INVENTORY; - -@SuppressWarnings("UnresolvedMixinReference") // the Minecraft Dev plugin - // doesn't seem to like Kotlin - // target classes -@Restriction( - require = @Condition("curios"), - conflict = @Condition( - type = Condition.Type.MIXIN, - value = "de.rubixdev.inventorio.mixin.neoforge.curios.InventorioScreenMixin" - ) -) -@Mixin(InventorioScreen.class) -public abstract class InventorioScreenMixin_alternative extends AbstractInventoryScreen { - public InventorioScreenMixin_alternative(InventorioScreenHandler arg, PlayerInventory arg2, Text arg3) { - super(arg, arg2, arg3); - } - - @Shadow - private RecipeBookWidget recipeBook; - - @Inject(method = "init", at = @At("RETURN")) - private void curios$init(CallbackInfo ci) { - Pair offsets = CuriosScreen.getButtonOffset(false); - addDrawableChild( - new CustomCuriosButton( - this, - x + offsets.getLeft() + 2, - height / 2 + offsets.getRight() + 2, - 14, - 14, - 50, - 0, - 14, - CURIO_INVENTORY, - button -> { - MinecraftClient client = MinecraftClient.getInstance(); - if (client.player != null) { - ItemStack stack = client.player.currentScreenHandler.getCursorStack(); - client.player.currentScreenHandler.setCursorStack(ItemStack.EMPTY); - - if (recipeBook.isOpen()) recipeBook.toggleOpen(); - sendToServer(new CPacketOpenCurios(stack)); - } - } - ) - ); - } -} diff --git a/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/SPacketScrollMixin.java b/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/SPacketScrollMixin.java deleted file mode 100644 index ea4dd8b..0000000 --- a/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/SPacketScrollMixin.java +++ /dev/null @@ -1,62 +0,0 @@ -package de.rubixdev.inventorio.mixin.forge.curios; - -import com.llamalad7.mixinextras.sugar.Local; -import de.rubixdev.inventorio.integration.curios.ICuriosContainer; -import de.rubixdev.inventorio.integration.curios.ICuriosScreen; -import de.rubixdev.inventorio.util.CuriosTester; -import me.fallenbreath.conditionalmixin.api.annotation.Condition; -import me.fallenbreath.conditionalmixin.api.annotation.Restriction; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.screen.ScreenHandler; -import org.objectweb.asm.Opcodes; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Slice; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import top.theillusivec4.curios.common.network.server.SPacketScroll; - -@Restriction(require = { @Condition("curios"), @Condition(type = Condition.Type.TESTER, tester = CuriosTester.class) }) -@Mixin(SPacketScroll.class) -public abstract class SPacketScrollMixin { - @Shadow - private int windowId; - - @Shadow - private int index; - - @Inject( - method = "lambda$handle$0", - at = @At(value = "JUMP", opcode = Opcodes.IFEQ, shift = At.Shift.BEFORE, ordinal = 0), - slice = @Slice( - from = @At( - value = "INVOKE", - target = "Ltop/theillusivec4/curios/common/inventory/container/CuriosContainer;scrollToIndex(I)V" - ) - ) - ) - private static void inventorioUpdateRenderButtons(SPacketScroll msg, CallbackInfo ci, @Local Screen screen) { - if (screen instanceof ICuriosScreen curiosScreen) { - curiosScreen.inventorio$updateRenderButtons(); - } - } - - @Inject( - method = "lambda$handle$0", - at = @At(value = "JUMP", opcode = Opcodes.IFEQ, shift = At.Shift.BEFORE, ordinal = 0), - slice = @Slice( - from = @At( - value = "FIELD", - target = "Lnet/minecraft/client/network/ClientPlayerEntity;currentScreenHandler:Lnet/minecraft/screen/ScreenHandler;" - ) - ) - ) - private static void inventorioScrollToIndex(SPacketScroll msg, CallbackInfo ci, @Local ScreenHandler container) { - SPacketScrollMixin accessor = ((SPacketScrollMixin) (Object) msg); - // noinspection DataFlowIssue - if (container instanceof ICuriosContainer curiosContainer && container.syncId == accessor.windowId) { - curiosContainer.inventorio$scrollToIndex(accessor.index); - } - } -} diff --git a/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/SPacketSyncCuriosMixin.java b/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/SPacketSyncCuriosMixin.java deleted file mode 100644 index 1c7b0ac..0000000 --- a/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/SPacketSyncCuriosMixin.java +++ /dev/null @@ -1,44 +0,0 @@ -package de.rubixdev.inventorio.mixin.forge.curios; - -import de.rubixdev.inventorio.integration.curios.ICuriosContainer; -import de.rubixdev.inventorio.util.CuriosTester; -import me.fallenbreath.conditionalmixin.api.annotation.Condition; -import me.fallenbreath.conditionalmixin.api.annotation.Restriction; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.entity.Entity; -import org.objectweb.asm.Opcodes; -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.Slice; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler; -import top.theillusivec4.curios.common.network.server.sync.SPacketSyncCurios; - -@Restriction(require = { @Condition("curios"), @Condition(type = Condition.Type.TESTER, tester = CuriosTester.class) }) -@Mixin(SPacketSyncCurios.class) -public class SPacketSyncCuriosMixin { - @Inject( - method = "lambda$handle$0", - at = @At(value = "JUMP", opcode = Opcodes.IFEQ, shift = At.Shift.BEFORE, ordinal = 0), - slice = @Slice( - from = @At( - value = "INVOKE", - target = "Ltop/theillusivec4/curios/api/type/capability/ICuriosItemHandler;setCurios(Ljava/util/Map;)V" - ) - ) - ) - private static void inventorioResetSlots( - SPacketSyncCurios data, - Entity entity, - ICuriosItemHandler handler, - CallbackInfo ci - ) { - if ( - entity instanceof ClientPlayerEntity player - && player.currentScreenHandler instanceof ICuriosContainer curiosContainer - ) { - curiosContainer.inventorio$resetSlots(); - } - } -} diff --git a/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/SPacketSyncModifiersMixinV1.java b/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/SPacketSyncModifiersMixinV1.java deleted file mode 100644 index 56a6a10..0000000 --- a/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/SPacketSyncModifiersMixinV1.java +++ /dev/null @@ -1,50 +0,0 @@ -package de.rubixdev.inventorio.mixin.forge.curios; - -import de.rubixdev.inventorio.integration.curios.ICuriosContainer; -import de.rubixdev.inventorio.util.CuriosTester; -import me.fallenbreath.conditionalmixin.api.annotation.Condition; -import me.fallenbreath.conditionalmixin.api.annotation.Restriction; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import org.objectweb.asm.Opcodes; -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.Slice; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler; -import top.theillusivec4.curios.common.network.server.sync.SPacketSyncModifiers; - -@Restriction( - require = { - @Condition(value = "curios", versionPredicates = "(,5.11)"), - @Condition(type = Condition.Type.TESTER, tester = CuriosTester.class) } -) -@Mixin(SPacketSyncModifiers.class) -public class SPacketSyncModifiersMixinV1 { - @Inject( - method = "lambda$handle$0(Ltop/theillusivec4/curios/common/network/server/sync/SPacketSyncModifiers;Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/entity/Entity;Ltop/theillusivec4/curios/api/type/capability/ICuriosItemHandler;)V", - at = @At(value = "JUMP", opcode = Opcodes.IFEQ, shift = At.Shift.BEFORE, ordinal = 0), - slice = @Slice( - from = @At( - value = "INVOKE", - target = "Lnet/minecraftforge/eventbus/api/IEventBus;post(Lnet/minecraftforge/eventbus/api/Event;)Z" - ) - ) - ) - private static void inventorioResetSlots( - SPacketSyncModifiers data, - LivingEntity livingEntity, - Entity entity, - ICuriosItemHandler handler, - CallbackInfo ci - ) { - if ( - entity instanceof ClientPlayerEntity player - && player.currentScreenHandler instanceof ICuriosContainer curiosContainer - ) { - curiosContainer.inventorio$resetSlots(); - } - } -} diff --git a/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/SPacketSyncModifiersMixinV2.java b/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/SPacketSyncModifiersMixinV2.java deleted file mode 100644 index d4a1606..0000000 --- a/versions/1.20.1-forge/src/main/java/de/rubixdev/inventorio/mixin/forge/curios/SPacketSyncModifiersMixinV2.java +++ /dev/null @@ -1,52 +0,0 @@ -package de.rubixdev.inventorio.mixin.forge.curios; - -import de.rubixdev.inventorio.integration.curios.ICuriosContainer; -import de.rubixdev.inventorio.util.CuriosTester; -import me.fallenbreath.conditionalmixin.api.annotation.Condition; -import me.fallenbreath.conditionalmixin.api.annotation.Restriction; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import org.objectweb.asm.Opcodes; -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.Slice; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler; -import top.theillusivec4.curios.common.network.server.sync.SPacketSyncModifiers; - -@Restriction( - require = { - @Condition(value = "curios", versionPredicates = "[5.11,)"), - @Condition(type = Condition.Type.TESTER, tester = CuriosTester.class) } -) -@Mixin(SPacketSyncModifiers.class) -public class SPacketSyncModifiersMixinV2 { - @Inject( - method = "lambda$handle$0", - at = @At(value = "JUMP", opcode = Opcodes.IFEQ, shift = At.Shift.BEFORE, ordinal = 0), - slice = @Slice( - from = @At( - value = "INVOKE", - target = "Lnet/minecraftforge/eventbus/api/IEventBus;post(Lnet/minecraftforge/eventbus/api/Event;)Z" - ) - ) - ) - private static void inventorioResetSlots( - SPacketSyncModifiers data, - LivingEntity livingEntity, - Entity entity, - MinecraftClient client, - ICuriosItemHandler handler, - CallbackInfo ci - ) { - if ( - entity instanceof ClientPlayerEntity player - && player.currentScreenHandler instanceof ICuriosContainer curiosContainer - ) { - curiosContainer.inventorio$resetSlots(); - } - } -} diff --git a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/ForgeEvents.kt b/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/ForgeEvents.kt deleted file mode 100644 index c65eefa..0000000 --- a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/ForgeEvents.kt +++ /dev/null @@ -1,27 +0,0 @@ -package de.rubixdev.inventorio - -import de.rubixdev.inventorio.client.control.InventorioKeyHandler -import de.rubixdev.inventorio.client.ui.HotbarHUDRenderer.renderHotbarAddons -import net.minecraftforge.api.distmarker.Dist -import net.minecraftforge.api.distmarker.OnlyIn -import net.minecraftforge.client.event.RegisterGuiOverlaysEvent -import net.minecraftforge.event.TickEvent -import net.minecraftforge.eventbus.api.SubscribeEvent - -@OnlyIn(Dist.CLIENT) -object ForgeEvents { - @SubscribeEvent - fun onClientTick(event: TickEvent.ClientTickEvent) { - InventorioKeyHandler.tick() - } -} - -@OnlyIn(Dist.CLIENT) -object ForgeModEvents { - @SubscribeEvent - fun onGuiRender(event: RegisterGuiOverlaysEvent) { - event.registerBelowAll("inventorio_hotbar_addons") { _, guiGraphics, _, _, _ -> - renderHotbarAddons(guiGraphics) - } - } -} diff --git a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/InventorioForge.kt b/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/InventorioForge.kt deleted file mode 100644 index 51437ae..0000000 --- a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/InventorioForge.kt +++ /dev/null @@ -1,80 +0,0 @@ -package de.rubixdev.inventorio - -import de.rubixdev.inventorio.api.InventorioAPI -import de.rubixdev.inventorio.client.configscreen.PlayerSettingsScreen -import de.rubixdev.inventorio.client.control.InventorioControls -import de.rubixdev.inventorio.config.PlayerSettings -import de.rubixdev.inventorio.enchantment.DeepPocketsBookRecipe -import de.rubixdev.inventorio.enchantment.DeepPocketsEnchantment -import de.rubixdev.inventorio.integration.ClumpsIntegration -import de.rubixdev.inventorio.integration.InventorioModIntegration -import de.rubixdev.inventorio.integration.ModIntegration -import de.rubixdev.inventorio.packet.InventorioNetworking -import de.rubixdev.inventorio.packet.InventorioNetworkingForge -import net.minecraft.client.MinecraftClient -import net.minecraft.item.ItemStack -import net.minecraft.recipe.SpecialRecipeSerializer -import net.minecraft.util.Identifier -import net.minecraftforge.api.distmarker.Dist -import net.minecraftforge.client.ConfigScreenHandler -import net.minecraftforge.common.MinecraftForge -import net.minecraftforge.common.ToolAction -import net.minecraftforge.common.ToolActions -import net.minecraftforge.fml.ModLoadingContext -import net.minecraftforge.fml.common.Mod -import net.minecraftforge.fml.loading.FMLEnvironment -import net.minecraftforge.fml.loading.FMLPaths -import net.minecraftforge.registries.ForgeRegistries -import thedarkcolour.kotlinforforge.KotlinModLoadingContext - -@Mod("inventorio") -class InventorioForge { - private val forgeModIntegrations = listOf(ClumpsIntegration) - - init { - ScreenTypeProvider.INSTANCE = ScreenTypeProviderForge - InventorioNetworking.INSTANCE = InventorioNetworkingForge - ForgeRegistries.ENCHANTMENTS.register(Identifier("inventorio", "deep_pockets"), DeepPocketsEnchantment) - val serializer = SpecialRecipeSerializer { identifier, category -> DeepPocketsBookRecipe(identifier, category) } - DeepPocketsBookRecipe.SERIALIZER = serializer - ForgeRegistries.RECIPE_SERIALIZERS.register(Identifier("inventorio", "deep_pockets_book"), serializer) - initToolBelt() - - if (FMLEnvironment.dist == Dist.CLIENT) { - MinecraftForge.EVENT_BUS.register(ForgeEvents) - KotlinModLoadingContext.get().getKEventBus().register(ForgeModEvents) - MinecraftClient.getInstance().options.allKeys += InventorioControls.keys - PlayerSettings.load(FMLPaths.CONFIGDIR.get().resolve("inventorio.json").toFile()) - ScreenTypeProviderForge.registerScreen() - ModLoadingContext.get().registerExtensionPoint(ConfigScreenHandler.ConfigScreenFactory::class.java) { - ConfigScreenHandler.ConfigScreenFactory { _, parent -> PlayerSettingsScreen.get(parent) } - } - } - - InventorioModIntegration.applyModIntegrations(forgeModIntegrations) - } - - private fun initToolBelt() { - // What this actually does is loads the [InventorioAPI] which creates the ToolBelt - // The reason why we do it this way is that we can't guarantee that other mods - // won't call [InventorioAPI] BEFORE [InventorioForge#onInitialize] has been invoked - InventorioAPI.getToolBeltSlotTemplate(InventorioAPI.SLOT_PICKAXE)?.addAllowingCondition { itemStack, _ -> - testToolType(itemStack, ToolActions.PICKAXE_DIG) - } - InventorioAPI.getToolBeltSlotTemplate(InventorioAPI.SLOT_SWORD)?.addAllowingCondition { itemStack, _ -> - testToolType(itemStack, ToolActions.SWORD_SWEEP) // todo sword - } - InventorioAPI.getToolBeltSlotTemplate(InventorioAPI.SLOT_AXE)?.addAllowingCondition { itemStack, _ -> - testToolType(itemStack, ToolActions.AXE_DIG) - } - InventorioAPI.getToolBeltSlotTemplate(InventorioAPI.SLOT_SHOVEL)?.addAllowingCondition { itemStack, _ -> - testToolType(itemStack, ToolActions.SHOVEL_DIG) - } - InventorioAPI.getToolBeltSlotTemplate(InventorioAPI.SLOT_HOE)?.addAllowingCondition { itemStack, _ -> - testToolType(itemStack, ToolActions.HOE_DIG) - } - } - private fun testToolType(itemStack: ItemStack, vararg toolActions: ToolAction): Boolean { - return toolActions.any { itemStack.canPerformAction(it) } - } -} diff --git a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/ScreenTypeProviderForge.kt b/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/ScreenTypeProviderForge.kt deleted file mode 100644 index 76d70ef..0000000 --- a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/ScreenTypeProviderForge.kt +++ /dev/null @@ -1,30 +0,0 @@ -package de.rubixdev.inventorio - -import de.rubixdev.inventorio.client.ui.InventorioScreen -import de.rubixdev.inventorio.player.InventorioScreenHandler -import net.minecraft.client.gui.screen.ingame.HandledScreens -import net.minecraft.screen.ScreenHandlerType -import net.minecraftforge.common.extensions.IForgeMenuType -import net.minecraftforge.registries.DeferredRegister -import net.minecraftforge.registries.ForgeRegistries -import thedarkcolour.kotlinforforge.KotlinModLoadingContext - -object ScreenTypeProviderForge : ScreenTypeProvider { - private val handlerProvider = IForgeMenuType.create { syncId, inv, _ -> - InventorioScreenHandler(syncId, inv) - } - - init { - val registry = DeferredRegister.create(ForgeRegistries.MENU_TYPES, "inventorio") - registry.register(KotlinModLoadingContext.get().getKEventBus()) - registry.register("player_screen") { handlerProvider } - } - - override fun getScreenHandlerType(): ScreenHandlerType { - return handlerProvider - } - - fun registerScreen() { - HandledScreens.register(handlerProvider) { handler, inventory, _ -> InventorioScreen(handler, inventory) } - } -} diff --git a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/integration/ClumpsIntegration.kt b/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/integration/ClumpsIntegration.kt deleted file mode 100644 index ffadd96..0000000 --- a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/integration/ClumpsIntegration.kt +++ /dev/null @@ -1,19 +0,0 @@ -package de.rubixdev.inventorio.integration - -import com.blamejared.clumps.api.events.RepairEvent -import de.rubixdev.inventorio.api.InventorioAPI -import net.minecraftforge.common.MinecraftForge -import net.minecraftforge.fml.ModList - -object ClumpsIntegration : ModIntegration() { - override val name = "clumps" - override val displayName = "Clumps" - - override fun shouldApply() = ModList.get().isLoaded("clumps") - - override fun apply() { - MinecraftForge.EVENT_BUS.addListener { event: RepairEvent -> - event.value = InventorioAPI.getInventoryAddon(event.player)!!.mendToolBeltItems(event.value) - } - } -} diff --git a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/CustomCuriosButton.kt b/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/CustomCuriosButton.kt deleted file mode 100644 index 9845b32..0000000 --- a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/CustomCuriosButton.kt +++ /dev/null @@ -1,28 +0,0 @@ -package de.rubixdev.inventorio.integration.curios - -import de.rubixdev.inventorio.player.PlayerInventoryAddon -import net.minecraft.client.gui.DrawContext -import net.minecraft.client.gui.screen.ingame.HandledScreen -import net.minecraft.client.gui.widget.TexturedButtonWidget -import net.minecraft.util.Identifier -import top.theillusivec4.curios.client.gui.CuriosScreen - -class CustomCuriosButton( - private val parentGui: HandledScreen<*>, - x: Int, - y: Int, - width: Int, - height: Int, - textureOffsetX: Int, - textureOffsetY: Int, - yDiffText: Int, - texture: Identifier, - pressAction: PressAction?, -) : TexturedButtonWidget(x, y, width, height, textureOffsetX, textureOffsetY, yDiffText, texture, pressAction) { - override fun renderButton(context: DrawContext?, mouseX: Int, mouseY: Int, delta: Float) { - val offsets = CuriosScreen.getButtonOffset(false) - x = parentGui.guiLeft + offsets.left - y = parentGui.height / 2 + offsets.right - 9 * (PlayerInventoryAddon.Client.local?.getDeepPocketsRowCount() ?: 0) - super.renderButton(context, mouseX, mouseY, delta) - } -} diff --git a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/ICuriosContainer.kt b/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/ICuriosContainer.kt deleted file mode 100644 index 0d73cb6..0000000 --- a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/ICuriosContainer.kt +++ /dev/null @@ -1,13 +0,0 @@ -package de.rubixdev.inventorio.integration.curios - -import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler - -@Suppress("FunctionName", "PropertyName") -interface ICuriosContainer { - fun `inventorio$resetSlots`() - fun `inventorio$scrollTo`(pos: Float) - fun `inventorio$scrollToIndex`(indexIn: Int) - val `inventorio$hasCosmeticColumn`: Boolean - val `inventorio$canScroll`: Boolean - val `inventorio$curiosHandler`: ICuriosItemHandler? -} diff --git a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/InventorioScreenHandlerMixinHelper.kt b/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/InventorioScreenHandlerMixinHelper.kt deleted file mode 100644 index 348ead8..0000000 --- a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/InventorioScreenHandlerMixinHelper.kt +++ /dev/null @@ -1,185 +0,0 @@ -package de.rubixdev.inventorio.integration.curios - -import de.rubixdev.inventorio.mixin.accessor.ScreenHandlerAccessor -import de.rubixdev.inventorio.player.InventorioScreenHandler -import de.rubixdev.inventorio.player.InventorioScreenHandler.Companion.deepPocketsRange -import de.rubixdev.inventorio.player.InventorioScreenHandler.Companion.mainInventoryRange -import de.rubixdev.inventorio.player.InventorioScreenHandler.Companion.toolBeltRange -import de.rubixdev.inventorio.util.insertItem -import de.rubixdev.inventorio.util.subList -import kotlin.math.max -import kotlin.math.min -import net.minecraft.entity.player.PlayerEntity -import net.minecraft.item.ItemStack -import net.minecraft.server.network.ServerPlayerEntity -import net.minecraftforge.network.PacketDistributor -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable -import top.theillusivec4.curios.api.CuriosApi -import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler -import top.theillusivec4.curios.common.inventory.CosmeticCurioSlot -import top.theillusivec4.curios.common.inventory.CurioSlot -import top.theillusivec4.curios.common.network.NetworkHandler -import top.theillusivec4.curios.common.network.client.CPacketScroll -import top.theillusivec4.curios.common.network.server.SPacketScroll - -fun sendToServer(packet: MSG) { - NetworkHandler.INSTANCE.send( - PacketDistributor.SERVER.noArg(), - packet, - ) -} -fun sendToPlayer(player: ServerPlayerEntity, packet: MSG) { - NetworkHandler.INSTANCE.send( - PacketDistributor.PLAYER.with { player }, - packet, - ) -} - -/** - * This is basically a re-implementation of https://github.com/TheIllusiveC4/Curios/blob/7bd447467d1a881d9217ebf938337723fafaabf4/neoforge/src/main/java/top/theillusivec4/curios/common/inventory/container/CuriosContainer.java - * with adjustments for the Inventorio screen (and in Kotlin). - */ -@Suppress("FunctionName") -class InventorioScreenHandlerMixinHelper( - thiz: InventorioScreenHandler, -) { - val player: PlayerEntity = thiz.inventory.player - val curiosHandler: ICuriosItemHandler? = CuriosApi.getCuriosInventory(player).resolve().orElse(null) - - private val isLocalWorld = player.world.isClient - private var lastScrollIndex = 0 - private var curiosSlotRange = toolBeltRange.last + 1 until thiz.slots.size - @get:JvmName("hasCosmeticColumn") - var hasCosmeticColumn = false - private set - - private val thiss = thiz as ScreenHandlerAccessor - - fun InventorioScreenHandler.`curios$init`() { - `curios$scrollToIndex`(0) - } - - fun InventorioScreenHandler.`curios$resetSlots`() = `curios$scrollToIndex`(lastScrollIndex) - - fun InventorioScreenHandler.`curios$scrollToIndex`(indexIn: Int) { - val curioMap = curiosHandler?.curios ?: return - var slotCount = 0 - var yOffset = 12 - var index = 0 - var startingIndex = indexIn - slots.subList(curiosSlotRange).clear() - thiss.trackedStacks.subList(curiosSlotRange).clear() - thiss.previousTrackedStacks.subList(curiosSlotRange).clear() - - val curiosSlotStart = slots.size - - for (stacksHandler in curioMap.values) { - val stackHandler = stacksHandler.stacks - if (stacksHandler.isVisible) { - for (i in 0 until stackHandler.slots) { - if (slotCount >= 8) break - if (index >= startingIndex) slotCount++ - index++ - } - } - } - startingIndex = min(startingIndex, max(0, index - 8)) - index = 0 - slotCount = 0 - - for ((identifier, stacksHandler) in curioMap.entries) { - val stackHandler = stacksHandler.stacks - if (stacksHandler.isVisible) { - for (i in 0 until stackHandler.slots) { - if (slotCount >= 8) break - if (index >= startingIndex) { - thiss.callAddSlot( - CurioSlot( - player, - stackHandler, - i, - identifier, - -18, - yOffset, - stacksHandler.renders, - stacksHandler.canToggleRendering(), - ), - ) - yOffset += 18 - slotCount++ - } - index++ - } - } - } - index = 0 - slotCount = 0 - yOffset = 12 - - for ((identifier, stacksHandler) in curioMap.entries) { - val stackHandler = stacksHandler.stacks - if (stacksHandler.isVisible) { - for (i in 0 until stackHandler.slots) { - if (slotCount >= 8) break - if (index >= startingIndex) { - if (stacksHandler.hasCosmetic()) { - val cosmeticHandler = stacksHandler.cosmeticStacks - hasCosmeticColumn = true - thiss.callAddSlot(CosmeticCurioSlot(player, cosmeticHandler, i, identifier, -37, yOffset)) - } - yOffset += 18 - slotCount++ - } - index++ - } - } - } - - if (!isLocalWorld) { - sendToPlayer(player as ServerPlayerEntity, SPacketScroll(syncId, indexIn)) - } - lastScrollIndex = indexIn - curiosSlotRange = curiosSlotStart until slots.size - } - - fun InventorioScreenHandler.`curios$scrollTo`(pos: Float) { - val k = (curiosHandler?.visibleSlots ?: return) - 8 - val j = (pos * k + 0.5).toInt().coerceAtLeast(0) - if (j == lastScrollIndex) return - if (isLocalWorld) { - sendToServer(CPacketScroll(syncId, j)) - } - } - - @get:JvmName("canScroll") - val canScroll get() = (curiosHandler?.visibleSlots ?: 0) > 8 - - fun InventorioScreenHandler.`curios$setStackInSlot`(slot: Int, ci: CallbackInfo) { - if (slots.size <= slot) ci.cancel() - } - - fun InventorioScreenHandler.`curios$quickMove`(sourceIndex: Int, cir: CallbackInfoReturnable) { - // TODO: quick move also works while the client has the curios stuff closed, but to fix that I'd have to sync the - // open status using custom packets which is a bit too much for just mod compat - val slot = slots[sourceIndex] - if (slot.hasStack()) { - val stack = slot.stack - if (sourceIndex in curiosSlotRange) { - val availableDeepPocketsRange = getAvailableDeepPocketsRange() - cir.returnValue = if (!insertItem(stack, mainInventoryRange) - && !(!availableDeepPocketsRange.isEmpty() && insertItem(stack, availableDeepPocketsRange)) - ) { - ItemStack.EMPTY - } else { - stack - } - } else if ((sourceIndex in mainInventoryRange || sourceIndex in deepPocketsRange) - && CuriosApi.getItemStackSlots(stack).isNotEmpty() - && insertItem(stack, curiosSlotRange) - ) { - cir.returnValue = ItemStack.EMPTY - } - } - } -} diff --git a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/InventorioScreenMixinHelper.kt b/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/InventorioScreenMixinHelper.kt deleted file mode 100644 index 6ba7ff0..0000000 --- a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/InventorioScreenMixinHelper.kt +++ /dev/null @@ -1,309 +0,0 @@ -package de.rubixdev.inventorio.integration.curios - -import de.rubixdev.inventorio.client.ui.InventorioScreen -import de.rubixdev.inventorio.config.PlayerSettings -import de.rubixdev.inventorio.mixin.client.accessor.HandledScreenAccessor -import de.rubixdev.inventorio.util.MixinDelegate -import kotlin.math.min -import net.minecraft.client.MinecraftClient -import net.minecraft.client.gui.DrawContext -import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget -import net.minecraft.client.gui.widget.TexturedButtonWidget -import net.minecraft.text.Text -import net.minecraft.util.Identifier -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable -import top.theillusivec4.curios.api.CuriosApi -import top.theillusivec4.curios.client.gui.CuriosScreen -import top.theillusivec4.curios.client.gui.RenderButton -import top.theillusivec4.curios.common.inventory.CosmeticCurioSlot -import top.theillusivec4.curios.common.inventory.CurioSlot -import top.theillusivec4.curios.common.network.client.CPacketToggleRender - -/** - * This is basically a re-implementation of https://github.com/TheIllusiveC4/Curios/blob/7bd447467d1a881d9217ebf938337723fafaabf4/neoforge/src/main/java/top/theillusivec4/curios/client/gui/CuriosScreen.java - * for the Inventorio screen (and in Kotlin). - */ -@Suppress("FunctionName") -class InventorioScreenMixinHelper( - private val thiz: InventorioScreen, - private val recipeBook: RecipeBookWidget, -) { - companion object { - @JvmField - val CURIO_INVENTORY = Identifier("curios", "textures/gui/inventory.png") - private val CREATIVE_INVENTORY_TABS = Identifier("textures/gui/container/creative_inventory/tabs.png") - - var currentScroll = 0f - } - - var isCuriosOpen = false - private set - - private var hasScrollbar = false - private lateinit var buttonCurios: TexturedButtonWidget - private var wasRecipeBookOpen = mutableListOf(false) - private var wasCuriosOpen = mutableListOf(false) - private var isScrolling = false - private var buttonClicked = false - private var isRenderButtonHovered = false - - private val handler get() = thiss.handler - private val curioHandler get() = handler as ICuriosContainer - - @Suppress("CAST_NEVER_SUCCEEDS") - private val thiss = thiz as HandledScreenAccessor<*> - - ///// private members of the mixin target class //// - private var x by MixinDelegate(thiss::getX, thiss::setX) - private var y by MixinDelegate(thiss::getY, thiss::setY) - - fun InventorioScreen.`curios$init`() { - thiss.client?.also { client -> - client.player?.also { player -> - hasScrollbar = CuriosApi.getCuriosInventory(player).map { it.visibleSlots > 0 }.orElse(false) - if (hasScrollbar) { - curioHandler.`inventorio$scrollTo`(currentScroll) - } - } - - val offsets = CuriosScreen.getButtonOffset(false) - buttonCurios = CustomCuriosButton( - thiz, - x + offsets.left, - height / 2 + offsets.right, - 14, - 14, - 50, - 0, - 14, - CURIO_INVENTORY, - ) { - toggleCurios() - } - thiss.callAddDrawableChild(buttonCurios) - - `curios$updateRenderButtons`() - - if (PlayerSettings.curiosOpenByDefault.boolValue) { - toggleCurios() - } - } - } - - private fun InventorioScreen.toggleCurios() { - isCuriosOpen = !isCuriosOpen - if (isCuriosOpen) wasRecipeBookOpen.add(recipeBook.isOpen) - if (isCuriosOpen && recipeBook.isOpen) { - // close the recipe book when opening the curios stuff, so we don't have to deal with that - recipeBook.toggleOpen() - } else if (!isCuriosOpen && wasRecipeBookOpen.last()) { - // re-open the recipe book if it was open before - recipeBook.toggleOpen() - wasRecipeBookOpen.removeLast() - } - updateScreenPosition() - `curios$updateRenderButtons`() - } - - fun InventorioScreen.`curios$hideCuriosWhenOpeningRecipeBook`() { - if (recipeBook.isOpen) wasCuriosOpen.add(isCuriosOpen) - if (recipeBook.isOpen && isCuriosOpen) { - // close curios when recipe book is being opened - isCuriosOpen = false - } else if (!recipeBook.isOpen && wasCuriosOpen.last()) { - // re-open curios if it was open before - isCuriosOpen = true - wasCuriosOpen.removeLast() - } - updateScreenPosition() - `curios$updateRenderButtons`() - } - - fun InventorioScreen.`curios$updateRenderButtons`() { - thiss.selectables.removeIf { it is RenderButton } - thiss.children.removeIf { it is RenderButton } - drawables.removeIf { it is RenderButton } - - if (!isCuriosOpen) return - - for (inventorySlot in handler.slots) { - if (inventorySlot is CurioSlot && inventorySlot !is CosmeticCurioSlot) { - if (inventorySlot.canToggleRender()) { - thiss.callAddDrawableChild( - RenderButton( - inventorySlot, - x + inventorySlot.x + 11, - y + inventorySlot.y - 3, - 8, - 8, - 75, - 0, - 8, - CURIO_INVENTORY, - ) { - sendToServer(CPacketToggleRender(inventorySlot.identifier, inventorySlot.slotIndex)) - }, - ) - } - } - } - } - - private fun inScrollbar(mouseX: Double, mouseY: Double): Boolean { - if (!isCuriosOpen) return false - val i = x - val j = y - var k = i - 34 - val l = j + 12 - var i1 = k + 14 - val j1 = l + 139 - if (curioHandler.`inventorio$hasCosmeticColumn`) { - i1 -= 19 - k -= 19 - } - return mouseX >= k && mouseY >= l && mouseX < i1 && mouseY < j1 - } - - fun InventorioScreen.`curios$render`(context: DrawContext, mouseX: Int, mouseY: Int, delta: Float) { - var isButtonHovered = false - for (button in drawables.filterIsInstance()) { - button.renderButtonOverlay(context, mouseX, mouseY, delta) - if (button.isHovered) isButtonHovered = true - } - isRenderButtonHovered = isButtonHovered - val clientPlayer = MinecraftClient.getInstance().player - if (!isRenderButtonHovered && clientPlayer != null && clientPlayer.playerScreenHandler.cursorStack.isEmpty) { - slotUnderMouse?.let { slot -> - if (slot is CurioSlot && !slot.hasStack()) { - context.drawTooltip(thiss.textRenderer, Text.literal(slot.slotName), mouseX, mouseY) - } - } - } - } - - fun drawMouseoverTooltip(context: DrawContext, x: Int, y: Int) { - thiss.client?.player?.let { player -> - if (player.playerScreenHandler.cursorStack.isEmpty && isRenderButtonHovered) { - context.drawTooltip(thiss.textRenderer, Text.translatable("gui.curios.toggle"), x, y) - } - } - } - - fun drawBackground(drawContext: DrawContext) { - if (!isCuriosOpen) return - thiss.client?.player?.let { player -> - val i = x - val j = y - CuriosApi.getCuriosInventory(player).ifPresent { handler -> - val slotCount = handler.visibleSlots - if (slotCount <= 0) return@ifPresent - val upperHeight = 7 + min(slotCount, 9) * 18 - var xTexOffset = 0 - var width = 27 - var xOffset = -26 - if (curioHandler.`inventorio$hasCosmeticColumn`) { - xTexOffset = 92 - width = 46 - xOffset -= 19 - } - drawContext.drawTexture( - CURIO_INVENTORY, - i + xOffset, - j + 4, - xTexOffset, - 0, - width, - upperHeight, - ) - - if (slotCount <= 8) { - drawContext.drawTexture( - CURIO_INVENTORY, - i + xOffset, - j + 4 + upperHeight, - xTexOffset, - 151, - width, - 7, - ) - } else { - drawContext.drawTexture( - CURIO_INVENTORY, - i + xOffset - 16, - j + 4, - 27, - 0, - 23, - 158, - ) - drawContext.drawTexture( - CREATIVE_INVENTORY_TABS, - i + xOffset - 8, - j + 12 + (127f * currentScroll).toInt(), - 232, - 0, - 12, - 15, - ) - } - - for (slot in this.handler.slots.filterIsInstance()) { - val x = x + slot.x - 1 - val y = y + slot.y - 1 - drawContext.drawTexture( - CURIO_INVENTORY, - x, - y, - 138, - 0, - 18, - 18, - ) - } - } - } - } - - fun isPointWithinBounds(cir: CallbackInfoReturnable) { - if (isRenderButtonHovered) cir.returnValue = false - } - - fun mouseClicked(mouseX: Double, mouseY: Double, cir: CallbackInfoReturnable) { - if (inScrollbar(mouseX, mouseY)) { - isScrolling = curioHandler.`inventorio$canScroll` - cir.returnValue = true - } - } - - fun mouseReleased(button: Int, cir: CallbackInfoReturnable) { - if (button == 0) { - isScrolling = false - } - if (buttonClicked) { - buttonClicked = false - cir.returnValue = true - } - } - - fun mouseDragged(mouseY: Double, cir: CallbackInfoReturnable) { - if (isScrolling) { - val i = y + 8 - val j = i + 148 - currentScroll = ((mouseY.toFloat() - i - 7.5f) / (j - i - 15f)).coerceIn(0f, 1f) - curioHandler.`inventorio$scrollTo`(currentScroll) - cir.returnValue = true - } - } - - fun mouseScrolled(verticalAmount: Double, cir: CallbackInfoReturnable) { - if (curioHandler.`inventorio$canScroll` && isCuriosOpen) { - var i = 1 - curioHandler.`inventorio$curiosHandler`?.let { handler -> - i = handler.visibleSlots - } - currentScroll = (currentScroll - verticalAmount / i).toFloat().coerceIn(0f, 1f) - curioHandler.`inventorio$scrollTo`(currentScroll) - cir.returnValue = true - } - } -} diff --git a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/packet/GlobalSettingsS2CPacket.kt b/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/packet/GlobalSettingsS2CPacket.kt deleted file mode 100644 index 458a580..0000000 --- a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/packet/GlobalSettingsS2CPacket.kt +++ /dev/null @@ -1,35 +0,0 @@ -package de.rubixdev.inventorio.packet - -import com.google.gson.Gson -import com.google.gson.JsonObject -import de.rubixdev.inventorio.config.GlobalSettings -import java.util.function.Supplier -import net.minecraft.network.PacketByteBuf -import net.minecraftforge.network.NetworkEvent - -class GlobalSettingsS2CPacket { - private var settingsJson: JsonObject - - // Sender's constructor - constructor() { - this.settingsJson = GlobalSettings.asJson() - } - - // Receiver's constructor - constructor(buf: PacketByteBuf) { - this.settingsJson = Gson().fromJson(buf.readString(), JsonObject::class.java) - } - - // Sender's writer - fun write(buf: PacketByteBuf) { - buf.writeString(settingsJson.toString()) - } - - // Receiver's consumer - fun consume(supplier: Supplier) { - supplier.get().enqueueWork { - GlobalSettings.syncFromServer(settingsJson) - } - supplier.get().packetHandled = true - } -} diff --git a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/packet/InventorioNetworkingForge.kt b/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/packet/InventorioNetworkingForge.kt deleted file mode 100644 index 52fd336..0000000 --- a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/packet/InventorioNetworkingForge.kt +++ /dev/null @@ -1,134 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.PlayerInventoryAddon.Companion.inventoryAddon -import net.minecraft.client.MinecraftClient -import net.minecraft.item.ItemStack -import net.minecraft.server.network.ServerPlayerEntity -import net.minecraft.util.Identifier -import net.minecraftforge.api.distmarker.Dist -import net.minecraftforge.api.distmarker.OnlyIn -import net.minecraftforge.network.NetworkDirection -import net.minecraftforge.network.NetworkRegistry - -@Suppress("INACCESSIBLE_TYPE", "UNUSED_ANONYMOUS_PARAMETER") -object InventorioNetworkingForge : InventorioNetworking { - private const val PROTOCOL_VERSION = "1.7" - - private val INSTANCE = NetworkRegistry.newSimpleChannel( - Identifier("inventorio", "packets"), - { PROTOCOL_VERSION }, - { PROTOCOL_VERSION == it }, - { PROTOCOL_VERSION == it }, - )!! - - init { - INSTANCE.registerMessage( - 0, - SelectUtilitySlotPacket::class.java, - { packet, buf -> packet.write(buf) }, - { buf -> SelectUtilitySlotPacket(buf) }, - { packet, supplier -> packet.consume(supplier) }, - ) - - INSTANCE.registerMessage( - 1, - UpdateAddonStacksS2CPacket::class.java, - { packet, buf -> packet.write(buf) }, - { buf -> UpdateAddonStacksS2CPacket(buf) }, - { packet, supplier -> packet.consume(supplier) }, - ) - - INSTANCE.registerMessage( - 2, - GlobalSettingsS2CPacket::class.java, - { packet, buf -> packet.write(buf) }, - { buf -> GlobalSettingsS2CPacket(buf) }, - { packet, supplier -> packet.consume(supplier) }, - ) - - INSTANCE.registerMessage( - 3, - UseBoostRocketC2SPacket::class.java, - { packet, buf -> }, - { buf -> UseBoostRocketC2SPacket() }, - { packet, supplier -> packet.consume(supplier) }, - ) - - INSTANCE.registerMessage( - 4, - SwappedHandsModeC2SPacket::class.java, - { packet, buf -> packet.write(buf) }, - { buf -> SwappedHandsModeC2SPacket(buf) }, - { packet, supplier -> packet.consume(supplier) }, - ) - - INSTANCE.registerMessage( - 5, - MoveItemToUtilityBeltC2SPacket::class.java, - { packet, buf -> packet.write(buf) }, - { buf -> MoveItemToUtilityBeltC2SPacket(buf) }, - { packet, supplier -> packet.consume(supplier) }, - ) - - INSTANCE.registerMessage( - 6, - OpenInventorioScreenC2SPacket::class.java, - { packet, buf -> }, - { buf -> OpenInventorioScreenC2SPacket() }, - { packet, supplier -> packet.consume(supplier) }, - ) - - INSTANCE.registerMessage( - 7, - SwapItemsInHandsKeyC2SPacket::class.java, - { packet, buf -> }, - { buf -> SwapItemsInHandsKeyC2SPacket() }, - { packet, supplier -> packet.consume(supplier) }, - ) - } - - override fun s2cSelectUtilitySlot(player: ServerPlayerEntity) { - val inventoryAddon = player.inventoryAddon ?: return - INSTANCE.sendTo(SelectUtilitySlotPacket(inventoryAddon.selectedUtility), player.networkHandler.connection, NetworkDirection.PLAY_TO_CLIENT) - } - - override fun s2cGlobalSettings(player: ServerPlayerEntity) { - INSTANCE.sendTo(GlobalSettingsS2CPacket(), player.networkHandler.connection, NetworkDirection.PLAY_TO_CLIENT) - } - - override fun s2cUpdateAddonStacks(player: ServerPlayerEntity, updatedStacks: Map) { - INSTANCE.sendTo(UpdateAddonStacksS2CPacket(updatedStacks), player.networkHandler.connection, NetworkDirection.PLAY_TO_CLIENT) - } - - @OnlyIn(Dist.CLIENT) - override fun c2sSelectUtilitySlot(selectedUtility: Int) { - INSTANCE.sendToServer(SelectUtilitySlotPacket(selectedUtility)) - } - - @OnlyIn(Dist.CLIENT) - override fun c2sUseBoostRocket() { - INSTANCE.sendToServer(UseBoostRocketC2SPacket()) - } - - @OnlyIn(Dist.CLIENT) - override fun c2sSetSwappedHandsMode(swappedHands: Boolean) { - if (MinecraftClient.getInstance().networkHandler != null) { - INSTANCE.sendToServer(SwappedHandsModeC2SPacket(swappedHands)) - } - } - - @OnlyIn(Dist.CLIENT) - override fun c2sMoveItemToUtilityBelt(sourceSlot: Int) { - INSTANCE.sendToServer(MoveItemToUtilityBeltC2SPacket(sourceSlot)) - } - - @OnlyIn(Dist.CLIENT) - override fun c2sOpenInventorioScreen() { - INSTANCE.sendToServer(OpenInventorioScreenC2SPacket()) - } - - @OnlyIn(Dist.CLIENT) - override fun c2sSwapItemsInHands() { - INSTANCE.sendToServer(SwapItemsInHandsKeyC2SPacket()) - } -} diff --git a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/packet/MoveItemToUtilityBeltC2SPacket.kt b/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/packet/MoveItemToUtilityBeltC2SPacket.kt deleted file mode 100644 index 107f03a..0000000 --- a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/packet/MoveItemToUtilityBeltC2SPacket.kt +++ /dev/null @@ -1,35 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.InventorioScreenHandler.Companion.inventorioScreenHandler -import java.util.function.Supplier -import net.minecraft.network.PacketByteBuf -import net.minecraftforge.network.NetworkEvent - -class MoveItemToUtilityBeltC2SPacket { - private var sourceSlot = 0 - - // Sender's constructor - constructor(sourceSlot: Int) { - this.sourceSlot = sourceSlot - } - - // Receiver's constructor - constructor(buf: PacketByteBuf) { - sourceSlot = buf.readByte().toInt() - } - - // Sender's writer - fun write(buf: PacketByteBuf) { - buf.writeByte(sourceSlot) - } - - // Receiver's consumer - fun consume(supplier: Supplier) { - val player = supplier.get().sender ?: return - supplier.get().enqueueWork { - val screenHandler = player.inventorioScreenHandler ?: return@enqueueWork - screenHandler.tryTransferToUtilityBeltSlot(screenHandler.getSlot(sourceSlot)) - } - supplier.get().packetHandled = true - } -} diff --git a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/packet/OpenInventorioScreenC2SPacket.kt b/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/packet/OpenInventorioScreenC2SPacket.kt deleted file mode 100644 index 43f657a..0000000 --- a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/packet/OpenInventorioScreenC2SPacket.kt +++ /dev/null @@ -1,15 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.InventorioScreenHandler -import java.util.function.Supplier -import net.minecraftforge.network.NetworkEvent - -class OpenInventorioScreenC2SPacket { - fun consume(supplier: Supplier) { - val sender = supplier.get().sender ?: return - supplier.get().enqueueWork { - InventorioScreenHandler.open(sender) - } - supplier.get().packetHandled = true - } -} diff --git a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/packet/SelectUtilitySlotPacket.kt b/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/packet/SelectUtilitySlotPacket.kt deleted file mode 100644 index 8ab9bfc..0000000 --- a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/packet/SelectUtilitySlotPacket.kt +++ /dev/null @@ -1,49 +0,0 @@ -package de.rubixdev.inventorio.packet - -import com.mojang.datafixers.util.Pair -import de.rubixdev.inventorio.player.PlayerInventoryAddon -import de.rubixdev.inventorio.player.PlayerInventoryAddon.Companion.inventoryAddon -import java.util.function.Supplier -import net.minecraft.entity.EquipmentSlot -import net.minecraft.network.PacketByteBuf -import net.minecraft.network.packet.s2c.play.EntityEquipmentUpdateS2CPacket -import net.minecraft.server.world.ServerWorld -import net.minecraftforge.network.NetworkDirection -import net.minecraftforge.network.NetworkEvent - -class SelectUtilitySlotPacket { - private var utilitySlot = 0 - - // Sender's constructor - constructor(utilitySlot: Int) { - this.utilitySlot = utilitySlot - } - - // Receiver's constructor - constructor(buf: PacketByteBuf) { - this.utilitySlot = buf.readByte().toInt() - } - - // Sender's writer - fun write(buf: PacketByteBuf) { - buf.writeByte(utilitySlot) - } - - // Receiver's consumer - fun consume(supplier: Supplier) { - if (supplier.get().direction == NetworkDirection.PLAY_TO_SERVER) { - val player = supplier.get().sender ?: return - supplier.get().enqueueWork { - player.inventoryAddon?.selectedUtility = utilitySlot - - val broadcastPacket = EntityEquipmentUpdateS2CPacket(player.id, listOf(Pair(EquipmentSlot.OFFHAND, player.offHandStack))) - (player.world as ServerWorld).chunkManager.sendToOtherNearbyPlayers(player, broadcastPacket) - } - } else { - supplier.get().enqueueWork { - PlayerInventoryAddon.Client.local?.selectedUtility = utilitySlot - } - } - supplier.get().packetHandled = true - } -} diff --git a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/packet/SwapItemsInHandsKeyC2SPacket.kt b/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/packet/SwapItemsInHandsKeyC2SPacket.kt deleted file mode 100644 index f3f2306..0000000 --- a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/packet/SwapItemsInHandsKeyC2SPacket.kt +++ /dev/null @@ -1,16 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.PlayerInventoryAddon.Companion.inventoryAddon -import java.util.function.Supplier -import net.minecraftforge.network.NetworkEvent - -class SwapItemsInHandsKeyC2SPacket { - // Receiver's consumer - fun consume(supplier: Supplier) { - val sender = supplier.get().sender ?: return - supplier.get().enqueueWork { - sender.inventoryAddon?.swapItemsInHands() - } - supplier.get().packetHandled = true - } -} diff --git a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/packet/SwappedHandsModeC2SPacket.kt b/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/packet/SwappedHandsModeC2SPacket.kt deleted file mode 100644 index 3935f4b..0000000 --- a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/packet/SwappedHandsModeC2SPacket.kt +++ /dev/null @@ -1,34 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.PlayerInventoryAddon.Companion.inventoryAddon -import java.util.function.Supplier -import net.minecraft.network.PacketByteBuf -import net.minecraftforge.network.NetworkEvent - -class SwappedHandsModeC2SPacket { - private var swappedHands = false - - // Sender's constructor - constructor(swappedHands: Boolean) { - this.swappedHands = swappedHands - } - - // Receiver's constructor - constructor(buf: PacketByteBuf) { - swappedHands = buf.readBoolean() - } - - // Sender's writer - fun write(buf: PacketByteBuf) { - buf.writeBoolean(swappedHands) - } - - // Receiver's consumer - fun consume(supplier: Supplier) { - val sender = supplier.get().sender ?: return - supplier.get().enqueueWork { - sender.inventoryAddon?.swappedHands = swappedHands - } - supplier.get().packetHandled = true - } -} diff --git a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/packet/UpdateAddonStacksS2CPacket.kt b/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/packet/UpdateAddonStacksS2CPacket.kt deleted file mode 100644 index 7381d7d..0000000 --- a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/packet/UpdateAddonStacksS2CPacket.kt +++ /dev/null @@ -1,42 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.PlayerInventoryAddon -import java.util.function.Supplier -import net.minecraft.item.ItemStack -import net.minecraft.network.PacketByteBuf -import net.minecraftforge.network.NetworkEvent - -class UpdateAddonStacksS2CPacket { - private var updatedStacks: Map - - // Sender's constructor - constructor(updatedStacks: Map) { - this.updatedStacks = updatedStacks - } - - // Receiver's constructor - constructor(buf: PacketByteBuf) { - val size = buf.readInt() - val updatedStacks = mutableMapOf() - for (i in 0 until size) - updatedStacks[buf.readInt()] = buf.readItemStack() - this.updatedStacks = updatedStacks - } - - // Sender's writer - fun write(buf: PacketByteBuf) { - buf.writeInt(updatedStacks.size) - for ((index, stack) in updatedStacks) { - buf.writeInt(index) - buf.writeItemStack(stack) - } - } - - // Receiver's consumer - fun consume(supplier: Supplier) { - supplier.get().enqueueWork { - PlayerInventoryAddon.Client.local?.receiveStacksUpdateS2C(updatedStacks) - } - supplier.get().packetHandled = true - } -} diff --git a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/packet/UseBoostRocketC2SPacket.kt b/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/packet/UseBoostRocketC2SPacket.kt deleted file mode 100644 index 0b22ef1..0000000 --- a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/packet/UseBoostRocketC2SPacket.kt +++ /dev/null @@ -1,15 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.PlayerInventoryAddon.Companion.inventoryAddon -import java.util.function.Supplier -import net.minecraftforge.network.NetworkEvent - -class UseBoostRocketC2SPacket { - fun consume(supplier: Supplier) { - val sender = supplier.get().sender ?: return - supplier.get().enqueueWork { - sender.inventoryAddon?.fireRocketFromInventory() - } - supplier.get().packetHandled = true - } -} diff --git a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/util/PlatformApi.kt b/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/util/PlatformApi.kt deleted file mode 100644 index 2df665a..0000000 --- a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/util/PlatformApi.kt +++ /dev/null @@ -1,7 +0,0 @@ -package de.rubixdev.inventorio.util - -import net.minecraftforge.fml.ModList - -object PlatformApi { - fun isModLoaded(modId: String): Boolean = ModList.get().isLoaded(modId) -} diff --git a/versions/1.20.1-forge/src/main/resources/META-INF/mods.toml b/versions/1.20.1-forge/src/main/resources/META-INF/mods.toml deleted file mode 100644 index 0bea8fe..0000000 --- a/versions/1.20.1-forge/src/main/resources/META-INF/mods.toml +++ /dev/null @@ -1,34 +0,0 @@ -modLoader = "kotlinforforge" -loaderVersion = "[${forge_kotlin_version},)" -issueTrackerURL = "${issues_url}" -license = "${license}" - -[[mods]] -modId = "${mod_id}" -version = "${version}" -displayName = "${mod_name}" -displayURL = "${homepage_url}" -logoFile = "icon.png" -authors = "${authors}" -description = "${description}" - -[[dependencies.${mod_id}]] -modId = "minecraft" -mandatory = true -versionRange = "${minecraft_version_range_forge}" -ordering = "NONE" -side = "BOTH" - -[[dependencies.${mod_id}]] -modId = "forge" -mandatory = true -versionRange = "${forge_version_range}" -ordering = "NONE" -side = "BOTH" - -[[dependencies.${mod_id}]] -modId = "cloth_config" -mandatory = true -versionRange = "[10,)" -ordering = "NONE" -side = "CLIENT" diff --git a/versions/1.20.1-forge/src/main/resources/inventorio-forge.mixins.json b/versions/1.20.1-forge/src/main/resources/inventorio-forge.mixins.json deleted file mode 100644 index c9e810d..0000000 --- a/versions/1.20.1-forge/src/main/resources/inventorio-forge.mixins.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "required": true, - "package": "de.rubixdev.inventorio.mixin.forge", - "compatibilityLevel": "JAVA_17", - "minVersion": "0.8", - "plugin": "de.rubixdev.inventorio.InventorioMixinPlugin", - "mixins": [ - "curios.CPacketScrollMixin", - "curios.CuriosEventHandlerMixin", - "curios.CurioStacksHandlerMixin", - "curios.InventorioScreenHandlerMixin" - ], - "client": [ - "curios.HandledScreenMixin", - "curios.InventorioScreenMixin", - "curios.InventorioScreenMixin_alternative", - "curios.SPacketScrollMixin", - "curios.SPacketSyncCuriosMixin", - "curios.SPacketSyncModifiersMixinV1", - "curios.SPacketSyncModifiersMixinV2" - ], - "injectors": { - "defaultRequire": 1 - } -} diff --git a/versions/1.20.2-fabric/gradle.properties b/versions/1.20.2-fabric/gradle.properties deleted file mode 100644 index f1aa2c8..0000000 --- a/versions/1.20.2-fabric/gradle.properties +++ /dev/null @@ -1,31 +0,0 @@ -# General Properties - loom.platform=fabric - minecraft_version=1.20.2 - yarn_mappings=1.20.2+build.4 - game_versions=1.20.2 - -# (Neo)Forge and dependency version ranges - minecraft_version_range_fabric=1.20.2 - minecraft_version_range_forge= - forge_version= - forge_version_range= - neoforge_version= - neoforge_version_range= - -# Common Dependencies - cloth_version=12.0.119 - # https://modrinth.com/mod/clumps/versions - clumps_version=13.0.0.6-fabric,1.20.2 - -# Fabric Dependencies - # https://modrinth.com/mod/early-loading-screen/versions - early_loading_screen_version=0.1.5+1.20.4 - fabric_api_version=0.91.6+1.20.2 - modmenu_version=8.0.1 - # https://modrinth.com/mod/trinkets/versions?l=fabric - trinkets_version=3.8.0 - cca_version=5.3.0 - -# (Neo)Forge Dependencies - # https://maven.theillusivec4.top/top/theillusivec4/curios/curios-forge/ - curios_version= diff --git a/versions/1.20.2-neoforge/gradle.properties b/versions/1.20.2-neoforge/gradle.properties deleted file mode 100644 index 71d683a..0000000 --- a/versions/1.20.2-neoforge/gradle.properties +++ /dev/null @@ -1,31 +0,0 @@ -# General Properties - loom.platform=neoforge - minecraft_version=1.20.2 - yarn_mappings=1.20.2+build.4 - game_versions=1.20.2 - -# (Neo)Forge and dependency version ranges - minecraft_version_range_fabric= - minecraft_version_range_forge=[1.20.2] - forge_version= - forge_version_range= - neoforge_version=20.2.88 - neoforge_version_range=[20.2.84,) - -# Common Dependencies - cloth_version=12.0.119 - # https://modrinth.com/mod/clumps/versions - clumps_version=13.0.0.6-neoforge,1.20.2 - -# Fabric Dependencies - # https://modrinth.com/mod/early-loading-screen/versions - early_loading_screen_version= - fabric_api_version= - modmenu_version= - # https://modrinth.com/mod/trinkets/versions?l=fabric - trinkets_version= - cca_version= - -# (Neo)Forge Dependencies - # https://maven.theillusivec4.top/top/theillusivec4/curios/curios-forge/ - curios_version=6.1.0+1.20.2 diff --git a/versions/1.20.2-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/CPacketScrollMixin.java b/versions/1.20.2-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/CPacketScrollMixin.java deleted file mode 100644 index 45987cd..0000000 --- a/versions/1.20.2-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/CPacketScrollMixin.java +++ /dev/null @@ -1,50 +0,0 @@ -package de.rubixdev.inventorio.mixin.neoforge.curios; - -import com.llamalad7.mixinextras.sugar.Local; -import de.rubixdev.inventorio.integration.curios.ICuriosContainer; -import de.rubixdev.inventorio.util.CuriosTester; -import me.fallenbreath.conditionalmixin.api.annotation.Condition; -import me.fallenbreath.conditionalmixin.api.annotation.Restriction; -import net.minecraft.screen.ScreenHandler; -import net.neoforged.neoforge.network.NetworkEvent; -import org.objectweb.asm.Opcodes; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Slice; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import top.theillusivec4.curios.common.network.client.CPacketScroll; - -@Restriction(require = { @Condition("curios"), @Condition(type = Condition.Type.TESTER, tester = CuriosTester.class) }) -@Mixin(CPacketScroll.class) -public abstract class CPacketScrollMixin { - @Shadow - private int index; - - @Shadow - private int windowId; - - @Inject( - method = "lambda$handle$0", - at = @At(value = "JUMP", opcode = Opcodes.IFEQ, shift = At.Shift.BEFORE, ordinal = 0), - slice = @Slice( - from = @At( - value = "FIELD", - target = "Lnet/minecraft/server/network/ServerPlayerEntity;currentScreenHandler:Lnet/minecraft/screen/ScreenHandler;" - ) - ) - ) - private static void inventorioScrollToIndex( - NetworkEvent.Context ctx, - CPacketScroll msg, - CallbackInfo ci, - @Local ScreenHandler container - ) { - CPacketScrollMixin accessor = ((CPacketScrollMixin) (Object) msg); - // noinspection DataFlowIssue - if (container instanceof ICuriosContainer curiosContainer && container.syncId == accessor.windowId) { - curiosContainer.inventorio$scrollToIndex(accessor.index); - } - } -} diff --git a/versions/1.20.2-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/CuriosClientPayloadHandlerMixin.java b/versions/1.20.2-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/CuriosClientPayloadHandlerMixin.java deleted file mode 100644 index 1be3b4e..0000000 --- a/versions/1.20.2-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/CuriosClientPayloadHandlerMixin.java +++ /dev/null @@ -1,12 +0,0 @@ -package de.rubixdev.inventorio.mixin.neoforge.curios; - -import de.rubixdev.inventorio.util.Never; -import me.fallenbreath.conditionalmixin.api.annotation.Condition; -import me.fallenbreath.conditionalmixin.api.annotation.Restriction; -import net.minecraft.SharedConstants; -import org.spongepowered.asm.mixin.Mixin; - -// this mixin is only valid in 1.20.4+ -@Restriction(require = @Condition(type = Condition.Type.TESTER, tester = Never.class)) -@Mixin(SharedConstants.class) -public class CuriosClientPayloadHandlerMixin {} diff --git a/versions/1.20.2-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/CuriosServerPayloadHandlerMixin.java b/versions/1.20.2-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/CuriosServerPayloadHandlerMixin.java deleted file mode 100644 index a1fb105..0000000 --- a/versions/1.20.2-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/CuriosServerPayloadHandlerMixin.java +++ /dev/null @@ -1,12 +0,0 @@ -package de.rubixdev.inventorio.mixin.neoforge.curios; - -import de.rubixdev.inventorio.util.Never; -import me.fallenbreath.conditionalmixin.api.annotation.Condition; -import me.fallenbreath.conditionalmixin.api.annotation.Restriction; -import net.minecraft.SharedConstants; -import org.spongepowered.asm.mixin.Mixin; - -// this mixin is only valid in 1.20.4+ -@Restriction(require = @Condition(type = Condition.Type.TESTER, tester = Never.class)) -@Mixin(SharedConstants.class) -public class CuriosServerPayloadHandlerMixin {} diff --git a/versions/1.20.2-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/SPacketScrollMixin.java b/versions/1.20.2-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/SPacketScrollMixin.java deleted file mode 100644 index 615fe4d..0000000 --- a/versions/1.20.2-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/SPacketScrollMixin.java +++ /dev/null @@ -1,62 +0,0 @@ -package de.rubixdev.inventorio.mixin.neoforge.curios; - -import com.llamalad7.mixinextras.sugar.Local; -import de.rubixdev.inventorio.integration.curios.ICuriosContainer; -import de.rubixdev.inventorio.integration.curios.ICuriosScreen; -import de.rubixdev.inventorio.util.CuriosTester; -import me.fallenbreath.conditionalmixin.api.annotation.Condition; -import me.fallenbreath.conditionalmixin.api.annotation.Restriction; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.screen.ScreenHandler; -import org.objectweb.asm.Opcodes; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Slice; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import top.theillusivec4.curios.common.network.server.SPacketScroll; - -@Restriction(require = { @Condition("curios"), @Condition(type = Condition.Type.TESTER, tester = CuriosTester.class) }) -@Mixin(SPacketScroll.class) -public abstract class SPacketScrollMixin { - @Shadow - private int windowId; - - @Shadow - private int index; - - @Inject( - method = "lambda$handle$0", - at = @At(value = "JUMP", opcode = Opcodes.IFEQ, shift = At.Shift.BEFORE, ordinal = 0), - slice = @Slice( - from = @At( - value = "INVOKE", - target = "Ltop/theillusivec4/curios/common/inventory/container/CuriosContainer;scrollToIndex(I)V" - ) - ) - ) - private static void inventorioUpdateRenderButtons(SPacketScroll msg, CallbackInfo ci, @Local Screen screen) { - if (screen instanceof ICuriosScreen curiosScreen) { - curiosScreen.inventorio$updateRenderButtons(); - } - } - - @Inject( - method = "lambda$handle$0", - at = @At(value = "JUMP", opcode = Opcodes.IFEQ, shift = At.Shift.BEFORE, ordinal = 0), - slice = @Slice( - from = @At( - value = "FIELD", - target = "Lnet/minecraft/client/network/ClientPlayerEntity;currentScreenHandler:Lnet/minecraft/screen/ScreenHandler;" - ) - ) - ) - private static void inventorioScrollToIndex(SPacketScroll msg, CallbackInfo ci, @Local ScreenHandler container) { - SPacketScrollMixin accessor = ((SPacketScrollMixin) (Object) msg); - // noinspection DataFlowIssue - if (container instanceof ICuriosContainer curiosContainer && container.syncId == accessor.windowId) { - curiosContainer.inventorio$scrollToIndex(accessor.index); - } - } -} diff --git a/versions/1.20.2-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/SPacketSyncCuriosMixin.java b/versions/1.20.2-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/SPacketSyncCuriosMixin.java deleted file mode 100644 index 812ffff..0000000 --- a/versions/1.20.2-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/SPacketSyncCuriosMixin.java +++ /dev/null @@ -1,44 +0,0 @@ -package de.rubixdev.inventorio.mixin.neoforge.curios; - -import de.rubixdev.inventorio.integration.curios.ICuriosContainer; -import de.rubixdev.inventorio.util.CuriosTester; -import me.fallenbreath.conditionalmixin.api.annotation.Condition; -import me.fallenbreath.conditionalmixin.api.annotation.Restriction; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.entity.Entity; -import org.objectweb.asm.Opcodes; -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.Slice; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler; -import top.theillusivec4.curios.common.network.server.sync.SPacketSyncCurios; - -@Restriction(require = { @Condition("curios"), @Condition(type = Condition.Type.TESTER, tester = CuriosTester.class) }) -@Mixin(SPacketSyncCurios.class) -public class SPacketSyncCuriosMixin { - @Inject( - method = "lambda$handle$0", - at = @At(value = "JUMP", opcode = Opcodes.IFEQ, shift = At.Shift.BEFORE, ordinal = 0), - slice = @Slice( - from = @At( - value = "INVOKE", - target = "Ltop/theillusivec4/curios/api/type/capability/ICuriosItemHandler;setCurios(Ljava/util/Map;)V" - ) - ) - ) - private static void inventorioResetSlots( - SPacketSyncCurios data, - Entity entity, - ICuriosItemHandler handler, - CallbackInfo ci - ) { - if ( - entity instanceof ClientPlayerEntity player - && player.currentScreenHandler instanceof ICuriosContainer curiosContainer - ) { - curiosContainer.inventorio$resetSlots(); - } - } -} diff --git a/versions/1.20.2-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/SPacketSyncModifiersMixin.java b/versions/1.20.2-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/SPacketSyncModifiersMixin.java deleted file mode 100644 index fbf5f64..0000000 --- a/versions/1.20.2-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/SPacketSyncModifiersMixin.java +++ /dev/null @@ -1,46 +0,0 @@ -package de.rubixdev.inventorio.mixin.neoforge.curios; - -import de.rubixdev.inventorio.integration.curios.ICuriosContainer; -import de.rubixdev.inventorio.util.CuriosTester; -import me.fallenbreath.conditionalmixin.api.annotation.Condition; -import me.fallenbreath.conditionalmixin.api.annotation.Restriction; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import org.objectweb.asm.Opcodes; -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.Slice; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler; -import top.theillusivec4.curios.common.network.server.sync.SPacketSyncModifiers; - -@Restriction(require = { @Condition("curios"), @Condition(type = Condition.Type.TESTER, tester = CuriosTester.class) }) -@Mixin(SPacketSyncModifiers.class) -public class SPacketSyncModifiersMixin { - @Inject( - method = "lambda$handle$0", - at = @At(value = "JUMP", opcode = Opcodes.IFEQ, shift = At.Shift.BEFORE, ordinal = 0), - slice = @Slice( - from = @At( - value = "INVOKE", - target = "Lnet/neoforged/bus/api/IEventBus;post(Lnet/neoforged/bus/api/Event;)Lnet/neoforged/bus/api/Event;" - ) - ) - ) - private static void inventorioResetSlots( - SPacketSyncModifiers data, - LivingEntity livingEntity, - Entity entity, - ICuriosItemHandler handler, - CallbackInfo ci - ) { - if ( - entity instanceof ClientPlayerEntity player - && player.currentScreenHandler instanceof ICuriosContainer curiosContainer - ) { - curiosContainer.inventorio$resetSlots(); - } - } -} diff --git a/versions/1.20.2-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/GlobalSettingsS2CPacket.kt b/versions/1.20.2-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/GlobalSettingsS2CPacket.kt deleted file mode 100644 index a06db03..0000000 --- a/versions/1.20.2-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/GlobalSettingsS2CPacket.kt +++ /dev/null @@ -1,34 +0,0 @@ -package de.rubixdev.inventorio.packet - -import com.google.gson.Gson -import com.google.gson.JsonObject -import de.rubixdev.inventorio.config.GlobalSettings -import net.minecraft.network.PacketByteBuf -import net.neoforged.neoforge.network.NetworkEvent - -class GlobalSettingsS2CPacket { - private var settingsJson: JsonObject - - // Sender's constructor - constructor() { - this.settingsJson = GlobalSettings.asJson() - } - - // Receiver's constructor - constructor(buf: PacketByteBuf) { - this.settingsJson = Gson().fromJson(buf.readString(), JsonObject::class.java) - } - - // Sender's writer - fun write(buf: PacketByteBuf) { - buf.writeString(settingsJson.toString()) - } - - // Receiver's consumer - fun consume(context: NetworkEvent.Context) { - context.enqueueWork { - GlobalSettings.syncFromServer(settingsJson) - } - context.packetHandled = true - } -} diff --git a/versions/1.20.2-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/InventorioNetworkingNeoForge.kt b/versions/1.20.2-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/InventorioNetworkingNeoForge.kt deleted file mode 100644 index 0b83079..0000000 --- a/versions/1.20.2-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/InventorioNetworkingNeoForge.kt +++ /dev/null @@ -1,134 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.PlayerInventoryAddon.Companion.inventoryAddon -import net.minecraft.client.MinecraftClient -import net.minecraft.item.ItemStack -import net.minecraft.server.network.ServerPlayerEntity -import net.minecraft.util.Identifier -import net.neoforged.api.distmarker.Dist -import net.neoforged.api.distmarker.OnlyIn -import net.neoforged.neoforge.network.NetworkRegistry -import net.neoforged.neoforge.network.PlayNetworkDirection - -@Suppress("INACCESSIBLE_TYPE", "UNUSED_ANONYMOUS_PARAMETER") -object InventorioNetworkingNeoForge : InventorioNetworking { - private const val PROTOCOL_VERSION = "1.7" - - private val INSTANCE = NetworkRegistry.newSimpleChannel( - Identifier("inventorio", "packets"), - { PROTOCOL_VERSION }, - { PROTOCOL_VERSION == it }, - { PROTOCOL_VERSION == it }, - ) - - init { - INSTANCE.registerMessage( - 0, - SelectUtilitySlotPacket::class.java, - { packet, buf -> packet.write(buf) }, - { buf -> SelectUtilitySlotPacket(buf) }, - { packet, context -> packet.consume(context) }, - ) - - INSTANCE.registerMessage( - 1, - UpdateAddonStacksS2CPacket::class.java, - { packet, buf -> packet.write(buf) }, - { buf -> UpdateAddonStacksS2CPacket(buf) }, - { packet, context -> packet.consume(context) }, - ) - - INSTANCE.registerMessage( - 2, - GlobalSettingsS2CPacket::class.java, - { packet, buf -> packet.write(buf) }, - { buf -> GlobalSettingsS2CPacket(buf) }, - { packet, context -> packet.consume(context) }, - ) - - INSTANCE.registerMessage( - 3, - UseBoostRocketC2SPacket::class.java, - { packet, buf -> }, - { buf -> UseBoostRocketC2SPacket() }, - { packet, context -> packet.consume(context) }, - ) - - INSTANCE.registerMessage( - 4, - SwappedHandsModeC2SPacket::class.java, - { packet, buf -> packet.write(buf) }, - { buf -> SwappedHandsModeC2SPacket(buf) }, - { packet, context -> packet.consume(context) }, - ) - - INSTANCE.registerMessage( - 5, - MoveItemToUtilityBeltC2SPacket::class.java, - { packet, buf -> packet.write(buf) }, - { buf -> MoveItemToUtilityBeltC2SPacket(buf) }, - { packet, context -> packet.consume(context) }, - ) - - INSTANCE.registerMessage( - 6, - OpenInventorioScreenC2SPacket::class.java, - { packet, buf -> }, - { buf -> OpenInventorioScreenC2SPacket() }, - { packet, context -> packet.consume(context) }, - ) - - INSTANCE.registerMessage( - 7, - SwapItemsInHandsKeyC2SPacket::class.java, - { packet, buf -> }, - { buf -> SwapItemsInHandsKeyC2SPacket() }, - { packet, context -> packet.consume(context) }, - ) - } - - override fun s2cSelectUtilitySlot(player: ServerPlayerEntity) { - val inventoryAddon = player.inventoryAddon ?: return - INSTANCE.sendTo(SelectUtilitySlotPacket(inventoryAddon.selectedUtility), player.networkHandler.connection, PlayNetworkDirection.PLAY_TO_CLIENT) - } - - override fun s2cGlobalSettings(player: ServerPlayerEntity) { - INSTANCE.sendTo(GlobalSettingsS2CPacket(), player.networkHandler.connection, PlayNetworkDirection.PLAY_TO_CLIENT) - } - - override fun s2cUpdateAddonStacks(player: ServerPlayerEntity, updatedStacks: Map) { - INSTANCE.sendTo(UpdateAddonStacksS2CPacket(updatedStacks), player.networkHandler.connection, PlayNetworkDirection.PLAY_TO_CLIENT) - } - - @OnlyIn(Dist.CLIENT) - override fun c2sSelectUtilitySlot(selectedUtility: Int) { - INSTANCE.sendToServer(SelectUtilitySlotPacket(selectedUtility)) - } - - @OnlyIn(Dist.CLIENT) - override fun c2sUseBoostRocket() { - INSTANCE.sendToServer(UseBoostRocketC2SPacket()) - } - - @OnlyIn(Dist.CLIENT) - override fun c2sSetSwappedHandsMode(swappedHands: Boolean) { - if (MinecraftClient.getInstance().networkHandler != null) { - INSTANCE.sendToServer(SwappedHandsModeC2SPacket(swappedHands)) - } - } - - @OnlyIn(Dist.CLIENT) - override fun c2sMoveItemToUtilityBelt(sourceSlot: Int) { - INSTANCE.sendToServer(MoveItemToUtilityBeltC2SPacket(sourceSlot)) - } - - @OnlyIn(Dist.CLIENT) - override fun c2sOpenInventorioScreen() { - INSTANCE.sendToServer(OpenInventorioScreenC2SPacket()) - } - - @OnlyIn(Dist.CLIENT) - override fun c2sSwapItemsInHands() { - INSTANCE.sendToServer(SwapItemsInHandsKeyC2SPacket()) - } -} diff --git a/versions/1.20.2-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/MoveItemToUtilityBeltC2SPacket.kt b/versions/1.20.2-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/MoveItemToUtilityBeltC2SPacket.kt deleted file mode 100644 index 28f0b2b..0000000 --- a/versions/1.20.2-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/MoveItemToUtilityBeltC2SPacket.kt +++ /dev/null @@ -1,34 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.InventorioScreenHandler.Companion.inventorioScreenHandler -import net.minecraft.network.PacketByteBuf -import net.neoforged.neoforge.network.NetworkEvent - -class MoveItemToUtilityBeltC2SPacket { - private var sourceSlot = 0 - - // Sender's constructor - constructor(sourceSlot: Int) { - this.sourceSlot = sourceSlot - } - - // Receiver's constructor - constructor(buf: PacketByteBuf) { - sourceSlot = buf.readByte().toInt() - } - - // Sender's writer - fun write(buf: PacketByteBuf) { - buf.writeByte(sourceSlot) - } - - // Receiver's consumer - fun consume(context: NetworkEvent.Context) { - val player = context.sender ?: return - context.enqueueWork { - val screenHandler = player.inventorioScreenHandler ?: return@enqueueWork - screenHandler.tryTransferToUtilityBeltSlot(screenHandler.getSlot(sourceSlot)) - } - context.packetHandled = true - } -} diff --git a/versions/1.20.2-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/OpenInventorioScreenC2SPacket.kt b/versions/1.20.2-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/OpenInventorioScreenC2SPacket.kt deleted file mode 100644 index e5a9f67..0000000 --- a/versions/1.20.2-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/OpenInventorioScreenC2SPacket.kt +++ /dev/null @@ -1,14 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.InventorioScreenHandler -import net.neoforged.neoforge.network.NetworkEvent - -class OpenInventorioScreenC2SPacket { - fun consume(context: NetworkEvent.Context) { - val sender = context.sender ?: return - context.enqueueWork { - InventorioScreenHandler.open(sender) - } - context.packetHandled = true - } -} diff --git a/versions/1.20.2-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/SelectUtilitySlotPacket.kt b/versions/1.20.2-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/SelectUtilitySlotPacket.kt deleted file mode 100644 index 9547d3c..0000000 --- a/versions/1.20.2-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/SelectUtilitySlotPacket.kt +++ /dev/null @@ -1,48 +0,0 @@ -package de.rubixdev.inventorio.packet - -import com.mojang.datafixers.util.Pair -import de.rubixdev.inventorio.player.PlayerInventoryAddon -import de.rubixdev.inventorio.player.PlayerInventoryAddon.Companion.inventoryAddon -import net.minecraft.entity.EquipmentSlot -import net.minecraft.network.PacketByteBuf -import net.minecraft.network.packet.s2c.play.EntityEquipmentUpdateS2CPacket -import net.minecraft.server.world.ServerWorld -import net.neoforged.neoforge.network.NetworkEvent -import net.neoforged.neoforge.network.PlayNetworkDirection - -class SelectUtilitySlotPacket { - private var utilitySlot = 0 - - // Sender's constructor - constructor(utilitySlot: Int) { - this.utilitySlot = utilitySlot - } - - // Receiver's constructor - constructor(buf: PacketByteBuf) { - this.utilitySlot = buf.readByte().toInt() - } - - // Sender's writer - fun write(buf: PacketByteBuf) { - buf.writeByte(utilitySlot) - } - - // Receiver's consumer - fun consume(context: NetworkEvent.Context) { - if (context.direction == PlayNetworkDirection.PLAY_TO_SERVER) { - val player = context.sender ?: return - context.enqueueWork { - player.inventoryAddon?.selectedUtility = utilitySlot - - val broadcastPacket = EntityEquipmentUpdateS2CPacket(player.id, listOf(Pair(EquipmentSlot.OFFHAND, player.offHandStack))) - (player.world as ServerWorld).chunkManager.sendToOtherNearbyPlayers(player, broadcastPacket) - } - } else { - context.enqueueWork { - PlayerInventoryAddon.Client.local?.selectedUtility = utilitySlot - } - } - context.packetHandled = true - } -} diff --git a/versions/1.20.2-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/SwapItemsInHandsKeyC2SPacket.kt b/versions/1.20.2-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/SwapItemsInHandsKeyC2SPacket.kt deleted file mode 100644 index f339516..0000000 --- a/versions/1.20.2-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/SwapItemsInHandsKeyC2SPacket.kt +++ /dev/null @@ -1,15 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.PlayerInventoryAddon.Companion.inventoryAddon -import net.neoforged.neoforge.network.NetworkEvent - -class SwapItemsInHandsKeyC2SPacket { - // Receiver's consumer - fun consume(context: NetworkEvent.Context) { - val sender = context.sender ?: return - context.enqueueWork { - sender.inventoryAddon?.swapItemsInHands() - } - context.packetHandled = true - } -} diff --git a/versions/1.20.2-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/SwappedHandsModeC2SPacket.kt b/versions/1.20.2-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/SwappedHandsModeC2SPacket.kt deleted file mode 100644 index 078ed16..0000000 --- a/versions/1.20.2-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/SwappedHandsModeC2SPacket.kt +++ /dev/null @@ -1,33 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.PlayerInventoryAddon.Companion.inventoryAddon -import net.minecraft.network.PacketByteBuf -import net.neoforged.neoforge.network.NetworkEvent - -class SwappedHandsModeC2SPacket { - private var swappedHands = false - - // Sender's constructor - constructor(swappedHands: Boolean) { - this.swappedHands = swappedHands - } - - // Receiver's constructor - constructor(buf: PacketByteBuf) { - swappedHands = buf.readBoolean() - } - - // Sender's writer - fun write(buf: PacketByteBuf) { - buf.writeBoolean(swappedHands) - } - - // Receiver's consumer - fun consume(context: NetworkEvent.Context) { - val sender = context.sender ?: return - context.enqueueWork { - sender.inventoryAddon?.swappedHands = swappedHands - } - context.packetHandled = true - } -} diff --git a/versions/1.20.2-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/UpdateAddonStacksS2CPacket.kt b/versions/1.20.2-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/UpdateAddonStacksS2CPacket.kt deleted file mode 100644 index 9c15329..0000000 --- a/versions/1.20.2-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/UpdateAddonStacksS2CPacket.kt +++ /dev/null @@ -1,41 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.PlayerInventoryAddon -import net.minecraft.item.ItemStack -import net.minecraft.network.PacketByteBuf -import net.neoforged.neoforge.network.NetworkEvent - -class UpdateAddonStacksS2CPacket { - private var updatedStacks: Map - - // Sender's constructor - constructor(updatedStacks: Map) { - this.updatedStacks = updatedStacks - } - - // Receiver's constructor - constructor(buf: PacketByteBuf) { - val size = buf.readInt() - val updatedStacks = mutableMapOf() - for (i in 0 until size) - updatedStacks[buf.readInt()] = buf.readItemStack() - this.updatedStacks = updatedStacks - } - - // Sender's writer - fun write(buf: PacketByteBuf) { - buf.writeInt(updatedStacks.size) - for ((index, stack) in updatedStacks) { - buf.writeInt(index) - buf.writeItemStack(stack) - } - } - - // Receiver's consumer - fun consume(context: NetworkEvent.Context) { - context.enqueueWork { - PlayerInventoryAddon.Client.local?.receiveStacksUpdateS2C(updatedStacks) - } - context.packetHandled = true - } -} diff --git a/versions/1.20.2-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/UseBoostRocketC2SPacket.kt b/versions/1.20.2-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/UseBoostRocketC2SPacket.kt deleted file mode 100644 index 318c8b6..0000000 --- a/versions/1.20.2-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/UseBoostRocketC2SPacket.kt +++ /dev/null @@ -1,14 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.PlayerInventoryAddon.Companion.inventoryAddon -import net.neoforged.neoforge.network.NetworkEvent - -class UseBoostRocketC2SPacket { - fun consume(context: NetworkEvent.Context) { - val sender = context.sender ?: return - context.enqueueWork { - sender.inventoryAddon?.fireRocketFromInventory() - } - context.packetHandled = true - } -} diff --git a/versions/1.20.2-neoforge/src/main/resources/META-INF/mods.toml b/versions/1.20.2-neoforge/src/main/resources/META-INF/mods.toml deleted file mode 100644 index c6e83ad..0000000 --- a/versions/1.20.2-neoforge/src/main/resources/META-INF/mods.toml +++ /dev/null @@ -1,41 +0,0 @@ -modLoader = "kotlinforforge" -loaderVersion = "[${forge_kotlin_version},)" -issueTrackerURL = "${issues_url}" -license = "${license}" - -[[mods]] -modId = "${mod_id}" -version = "${version}" -displayName = "${mod_name}" -displayURL = "${homepage_url}" -logoFile = "icon.png" -authors = "${authors}" -description = "${description}" - -[[mixins]] -config = "${mod_id}.mixins.json" -[[mixins]] -config = "${mod_id}-neoforge.mixins.json" -[[mixins]] -config = "${mod_id}-neoforge-12002.mixins.json" - -[[dependencies.${mod_id}]] -modId = "minecraft" -mandatory = true -versionRange = "${minecraft_version_range_forge}" -ordering = "NONE" -side = "BOTH" - -[[dependencies.${mod_id}]] -modId = "neoforge" -mandatory = true -versionRange = "${neoforge_version_range}" -ordering = "NONE" -side = "BOTH" - -[[dependencies.${mod_id}]] -modId = "cloth_config" -mandatory = true -versionRange = "[10,)" -ordering = "NONE" -side = "CLIENT" diff --git a/versions/1.20.2-neoforge/src/main/resources/inventorio-neoforge-12002.mixins.json b/versions/1.20.2-neoforge/src/main/resources/inventorio-neoforge-12002.mixins.json deleted file mode 100644 index f5e49cd..0000000 --- a/versions/1.20.2-neoforge/src/main/resources/inventorio-neoforge-12002.mixins.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "required": true, - "package": "de.rubixdev.inventorio.mixin.neoforge", - "compatibilityLevel": "JAVA_17", - "minVersion": "0.8", - "plugin": "de.rubixdev.inventorio.InventorioMixinPlugin", - "mixins": [ - "curios.CPacketScrollMixin" - ], - "client": [ - "curios.SPacketScrollMixin", - "curios.SPacketSyncCuriosMixin", - "curios.SPacketSyncModifiersMixin" - ], - "injectors": { - "defaultRequire": 1 - } -} diff --git a/versions/1.20.4-common/gradle.properties b/versions/1.20.4-common/gradle.properties deleted file mode 100644 index e8afc6a..0000000 --- a/versions/1.20.4-common/gradle.properties +++ /dev/null @@ -1,30 +0,0 @@ -# General Properties - minecraft_version=1.20.4 - yarn_mappings=1.20.4+build.3 - game_versions=1.20.3\n1.20.4 - -# (Neo)Forge and dependency version ranges - minecraft_version_range_fabric= - minecraft_version_range_forge= - forge_version= - forge_version_range= - neoforge_version= - neoforge_version_range= - -# Common Dependencies - cloth_version=13.0.121 - # https://modrinth.com/mod/clumps/versions - clumps_version=15.0.0.2-fabric,1.20.4 - -# Fabric Dependencies - # https://modrinth.com/mod/early-loading-screen/versions - early_loading_screen_version= - fabric_api_version= - modmenu_version= - # https://modrinth.com/mod/trinkets/versions?l=fabric - trinkets_version= - cca_version= - -# (Neo)Forge Dependencies - # https://maven.theillusivec4.top/top/theillusivec4/curios/curios-forge/ - curios_version= diff --git a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/GlobalSettingsS2CPacket.kt b/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/GlobalSettingsS2CPacket.kt deleted file mode 100644 index 0e23e4a..0000000 --- a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/GlobalSettingsS2CPacket.kt +++ /dev/null @@ -1,27 +0,0 @@ -package de.rubixdev.inventorio.packet - -import com.google.gson.Gson -import com.google.gson.JsonObject -import de.rubixdev.inventorio.config.GlobalSettings -import net.fabricmc.fabric.api.networking.v1.PacketSender -import net.minecraft.client.MinecraftClient -import net.minecraft.client.network.ClientPlayNetworkHandler -import net.minecraft.network.PacketByteBuf -import net.minecraft.util.Identifier - -@Suppress("UNUSED_PARAMETER") -object GlobalSettingsS2CPacket { - val identifier = Identifier("inventorio", "global_settings") - - fun consume(client: MinecraftClient, handler: ClientPlayNetworkHandler, buf: PacketByteBuf, responseSender: PacketSender) { - val jsonString = buf.readString() - val settingsJson = Gson().fromJson(jsonString, JsonObject::class.java) - client.execute { - GlobalSettings.syncFromServer(settingsJson) - } - } - - fun write(buf: PacketByteBuf) { - buf.writeString(GlobalSettings.asJson().toString()) - } -} diff --git a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/InventorioNetworkingFabric.kt b/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/InventorioNetworkingFabric.kt deleted file mode 100644 index 1128f1b..0000000 --- a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/InventorioNetworkingFabric.kt +++ /dev/null @@ -1,96 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.PlayerInventoryAddon.Companion.inventoryAddon -import io.netty.buffer.PooledByteBufAllocator -import net.fabricmc.api.EnvType -import net.fabricmc.api.Environment -import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking -import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking -import net.fabricmc.loader.api.FabricLoader -import net.minecraft.client.MinecraftClient -import net.minecraft.item.ItemStack -import net.minecraft.network.PacketByteBuf -import net.minecraft.server.network.ServerPlayerEntity -import net.minecraft.util.Identifier - -object InventorioNetworkingFabric : InventorioNetworking { - init { - if (FabricLoader.getInstance().environmentType == EnvType.CLIENT) { - ClientPlayNetworking.registerGlobalReceiver(SelectUtilitySlotPacket.identifier, SelectUtilitySlotPacket::consume) - ClientPlayNetworking.registerGlobalReceiver(GlobalSettingsS2CPacket.identifier, GlobalSettingsS2CPacket::consume) - ClientPlayNetworking.registerGlobalReceiver(UpdateAddonStacksS2CPacket.identifier, UpdateAddonStacksS2CPacket::consume) - } - - ServerPlayNetworking.registerGlobalReceiver(UseBoostRocketC2SPacket.identifier, UseBoostRocketC2SPacket::consume) - ServerPlayNetworking.registerGlobalReceiver(SelectUtilitySlotPacket.identifier, SelectUtilitySlotPacket::consume) - ServerPlayNetworking.registerGlobalReceiver(SwapItemsInHandsKeyC2SPacket.identifier, SwapItemsInHandsKeyC2SPacket::consume) - ServerPlayNetworking.registerGlobalReceiver(SwappedHandsModeC2SPacket.identifier, SwappedHandsModeC2SPacket::consume) - ServerPlayNetworking.registerGlobalReceiver(MoveItemToUtilityBeltC2SPacket.identifier, MoveItemToUtilityBeltC2SPacket::consume) - ServerPlayNetworking.registerGlobalReceiver(OpenInventorioScreenC2SPacket.identifier, OpenInventorioScreenC2SPacket::consume) - } - - override fun s2cSelectUtilitySlot(player: ServerPlayerEntity) { - val inventoryAddon = player.inventoryAddon ?: return - val buf = PacketByteBuf(PooledByteBufAllocator.DEFAULT.buffer()) - SelectUtilitySlotPacket.write(buf, inventoryAddon.selectedUtility) - ServerPlayNetworking.send(player, SelectUtilitySlotPacket.identifier, buf) - } - - override fun s2cGlobalSettings(player: ServerPlayerEntity) { - val buf = PacketByteBuf(PooledByteBufAllocator.DEFAULT.buffer()) - GlobalSettingsS2CPacket.write(buf) - ServerPlayNetworking.send(player, GlobalSettingsS2CPacket.identifier, buf) - } - - override fun s2cUpdateAddonStacks(player: ServerPlayerEntity, updatedStacks: Map) { - val buf = PacketByteBuf(PooledByteBufAllocator.DEFAULT.buffer()) - UpdateAddonStacksS2CPacket.write(buf, updatedStacks) - ServerPlayNetworking.send(player, UpdateAddonStacksS2CPacket.identifier, buf) - } - - @Environment(EnvType.CLIENT) - override fun c2sSelectUtilitySlot(selectedUtility: Int) { - sendC2S(SelectUtilitySlotPacket.identifier) { - SelectUtilitySlotPacket.write(it, selectedUtility) - } - } - - @Environment(EnvType.CLIENT) - override fun c2sUseBoostRocket() { - sendC2S(UseBoostRocketC2SPacket.identifier) { } - } - - @Environment(EnvType.CLIENT) - override fun c2sSetSwappedHandsMode(swappedHands: Boolean) { - if (MinecraftClient.getInstance().networkHandler != null) { - sendC2S(SwappedHandsModeC2SPacket.identifier) { - SwappedHandsModeC2SPacket.write(it, swappedHands) - } - } - } - - @Environment(EnvType.CLIENT) - override fun c2sMoveItemToUtilityBelt(sourceSlot: Int) { - sendC2S(MoveItemToUtilityBeltC2SPacket.identifier) { - MoveItemToUtilityBeltC2SPacket.write(it, sourceSlot) - } - } - - @Environment(EnvType.CLIENT) - override fun c2sOpenInventorioScreen() { - sendC2S(OpenInventorioScreenC2SPacket.identifier) { - OpenInventorioScreenC2SPacket.write(it) - } - } - - override fun c2sSwapItemsInHands() { - sendC2S(SwapItemsInHandsKeyC2SPacket.identifier) { } - } - - @Environment(EnvType.CLIENT) - private fun sendC2S(id: Identifier, func: (PacketByteBuf) -> Unit) { - val buf = PacketByteBuf(PooledByteBufAllocator.DEFAULT.buffer()) - func(buf) - ClientPlayNetworking.send(id, buf) - } -} diff --git a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/MoveItemToUtilityBeltC2SPacket.kt b/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/MoveItemToUtilityBeltC2SPacket.kt deleted file mode 100644 index 4d236f1..0000000 --- a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/MoveItemToUtilityBeltC2SPacket.kt +++ /dev/null @@ -1,26 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.InventorioScreenHandler.Companion.inventorioScreenHandler -import net.fabricmc.fabric.api.networking.v1.PacketSender -import net.minecraft.network.PacketByteBuf -import net.minecraft.server.MinecraftServer -import net.minecraft.server.network.ServerPlayNetworkHandler -import net.minecraft.server.network.ServerPlayerEntity -import net.minecraft.util.Identifier - -@Suppress("UNUSED_PARAMETER") -object MoveItemToUtilityBeltC2SPacket { - val identifier = Identifier("inventorio", "move_to_utility_c2s") - - fun consume(server: MinecraftServer, player: ServerPlayerEntity, handler: ServerPlayNetworkHandler, buf: PacketByteBuf, responseSender: PacketSender) { - val sourceSlot = buf.readByte().toInt() - server.execute { - val screenHandler = player.inventorioScreenHandler ?: return@execute - screenHandler.tryTransferToUtilityBeltSlot(screenHandler.getSlot(sourceSlot)) - } - } - - fun write(buf: PacketByteBuf, sourceSlot: Int = 0) { - buf.writeByte(sourceSlot) - } -} diff --git a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/OpenInventorioScreenC2SPacket.kt b/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/OpenInventorioScreenC2SPacket.kt deleted file mode 100644 index 12ff989..0000000 --- a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/OpenInventorioScreenC2SPacket.kt +++ /dev/null @@ -1,23 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.InventorioScreenHandler -import net.fabricmc.fabric.api.networking.v1.PacketSender -import net.minecraft.network.PacketByteBuf -import net.minecraft.server.MinecraftServer -import net.minecraft.server.network.ServerPlayNetworkHandler -import net.minecraft.server.network.ServerPlayerEntity -import net.minecraft.util.Identifier - -@Suppress("UNUSED_PARAMETER") -object OpenInventorioScreenC2SPacket { - val identifier = Identifier("inventorio", "open_screen") - - fun consume(server: MinecraftServer, player: ServerPlayerEntity, handler: ServerPlayNetworkHandler, buf: PacketByteBuf, responseSender: PacketSender) { - server.execute { - InventorioScreenHandler.open(player) - } - } - - fun write(buf: PacketByteBuf) { - } -} diff --git a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/SelectUtilitySlotPacket.kt b/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/SelectUtilitySlotPacket.kt deleted file mode 100644 index 0c93fa2..0000000 --- a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/SelectUtilitySlotPacket.kt +++ /dev/null @@ -1,45 +0,0 @@ -package de.rubixdev.inventorio.packet - -import com.mojang.datafixers.util.Pair -import de.rubixdev.inventorio.player.PlayerInventoryAddon -import de.rubixdev.inventorio.player.PlayerInventoryAddon.Companion.inventoryAddon -import net.fabricmc.fabric.api.networking.v1.PacketSender -import net.minecraft.client.MinecraftClient -import net.minecraft.client.network.ClientPlayNetworkHandler -import net.minecraft.entity.EquipmentSlot -import net.minecraft.network.PacketByteBuf -import net.minecraft.network.packet.s2c.play.EntityEquipmentUpdateS2CPacket -import net.minecraft.server.MinecraftServer -import net.minecraft.server.network.ServerPlayNetworkHandler -import net.minecraft.server.network.ServerPlayerEntity -import net.minecraft.server.world.ServerWorld -import net.minecraft.util.Identifier - -@Suppress("UNUSED_PARAMETER") -object SelectUtilitySlotPacket { - val identifier = Identifier("inventorio", "select_utility") - - // Server's receiving consumer - fun consume(server: MinecraftServer, player: ServerPlayerEntity, handler: ServerPlayNetworkHandler, buf: PacketByteBuf, responseSender: PacketSender) { - val utilitySlot = buf.readByte().toInt() - server.execute { - player.inventoryAddon?.selectedUtility = utilitySlot - - // Resending the current offhand item (aka a selected utility belt item) of this player to other players - val broadcastPacket = EntityEquipmentUpdateS2CPacket(player.id, listOf(Pair(EquipmentSlot.OFFHAND, player.offHandStack))) - (player.world as ServerWorld).chunkManager.sendToOtherNearbyPlayers(player, broadcastPacket) - } - } - - // Client's receiving consumer - fun consume(client: MinecraftClient, handler: ClientPlayNetworkHandler, buf: PacketByteBuf, responseSender: PacketSender) { - val utilitySlot = buf.readByte().toInt() - client.execute { - PlayerInventoryAddon.Client.local?.selectedUtility = utilitySlot - } - } - - fun write(buf: PacketByteBuf, slot: Int = 0) { - buf.writeByte(slot) - } -} diff --git a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/SwapItemsInHandsKeyC2SPacket.kt b/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/SwapItemsInHandsKeyC2SPacket.kt deleted file mode 100644 index b9aa879..0000000 --- a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/SwapItemsInHandsKeyC2SPacket.kt +++ /dev/null @@ -1,20 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.PlayerInventoryAddon.Companion.inventoryAddon -import net.fabricmc.fabric.api.networking.v1.PacketSender -import net.minecraft.network.PacketByteBuf -import net.minecraft.server.MinecraftServer -import net.minecraft.server.network.ServerPlayNetworkHandler -import net.minecraft.server.network.ServerPlayerEntity -import net.minecraft.util.Identifier - -@Suppress("UNUSED_PARAMETER") -object SwapItemsInHandsKeyC2SPacket { - val identifier = Identifier("inventorio", "swap_items_in_hands") - - fun consume(server: MinecraftServer, player: ServerPlayerEntity, handler: ServerPlayNetworkHandler, buf: PacketByteBuf, responseSender: PacketSender) { - server.execute { - player.inventoryAddon?.swapItemsInHands() - } - } -} diff --git a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/SwappedHandsModeC2SPacket.kt b/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/SwappedHandsModeC2SPacket.kt deleted file mode 100644 index c04c0cb..0000000 --- a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/SwappedHandsModeC2SPacket.kt +++ /dev/null @@ -1,25 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.PlayerInventoryAddon.Companion.inventoryAddon -import net.fabricmc.fabric.api.networking.v1.PacketSender -import net.minecraft.network.PacketByteBuf -import net.minecraft.server.MinecraftServer -import net.minecraft.server.network.ServerPlayNetworkHandler -import net.minecraft.server.network.ServerPlayerEntity -import net.minecraft.util.Identifier - -@Suppress("UNUSED_PARAMETER") -object SwappedHandsModeC2SPacket { - val identifier = Identifier("inventorio", "swapped_hands") - - fun consume(server: MinecraftServer, player: ServerPlayerEntity, handler: ServerPlayNetworkHandler, buf: PacketByteBuf, responseSender: PacketSender) { - val swappedHands = buf.readBoolean() - server.execute { - player.inventoryAddon?.swappedHands = swappedHands - } - } - - fun write(buf: PacketByteBuf, swappedHands: Boolean = false) { - buf.writeBoolean(swappedHands) - } -} diff --git a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/UpdateAddonStacksS2CPacket.kt b/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/UpdateAddonStacksS2CPacket.kt deleted file mode 100644 index 649d37f..0000000 --- a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/UpdateAddonStacksS2CPacket.kt +++ /dev/null @@ -1,32 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.PlayerInventoryAddon -import net.fabricmc.fabric.api.networking.v1.PacketSender -import net.minecraft.client.MinecraftClient -import net.minecraft.client.network.ClientPlayNetworkHandler -import net.minecraft.item.ItemStack -import net.minecraft.network.PacketByteBuf -import net.minecraft.util.Identifier - -@Suppress("UNUSED_PARAMETER") -object UpdateAddonStacksS2CPacket { - val identifier = Identifier("inventorio", "update_addon_stacks") - - fun consume(client: MinecraftClient, handler: ClientPlayNetworkHandler, buf: PacketByteBuf, responseSender: PacketSender) { - val size = buf.readInt() - val updatedStacks = mutableMapOf() - for (i in 0 until size) - updatedStacks[buf.readInt()] = buf.readItemStack() - client.execute { - PlayerInventoryAddon.Client.local?.receiveStacksUpdateS2C(updatedStacks) - } - } - - fun write(buf: PacketByteBuf, updatedStacks: Map) { - buf.writeInt(updatedStacks.size) - for ((index, stack) in updatedStacks) { - buf.writeInt(index) - buf.writeItemStack(stack) - } - } -} diff --git a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/UseBoostRocketC2SPacket.kt b/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/UseBoostRocketC2SPacket.kt deleted file mode 100644 index af0ab40..0000000 --- a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/UseBoostRocketC2SPacket.kt +++ /dev/null @@ -1,20 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.PlayerInventoryAddon.Companion.inventoryAddon -import net.fabricmc.fabric.api.networking.v1.PacketSender -import net.minecraft.network.PacketByteBuf -import net.minecraft.server.MinecraftServer -import net.minecraft.server.network.ServerPlayNetworkHandler -import net.minecraft.server.network.ServerPlayerEntity -import net.minecraft.util.Identifier - -@Suppress("UNUSED_PARAMETER") -object UseBoostRocketC2SPacket { - val identifier = Identifier("inventorio", "fire_boost_rocket_c2s") - - fun consume(server: MinecraftServer, player: ServerPlayerEntity, handler: ServerPlayNetworkHandler, buf: PacketByteBuf, responseSender: PacketSender) { - server.execute { - player.inventoryAddon?.fireRocketFromInventory() - } - } -} diff --git a/versions/1.20.4-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/CurioStacksHandlerMixin.java b/versions/1.20.4-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/CurioStacksHandlerMixin.java deleted file mode 100644 index cdb4b0d..0000000 --- a/versions/1.20.4-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/CurioStacksHandlerMixin.java +++ /dev/null @@ -1,44 +0,0 @@ -package de.rubixdev.inventorio.mixin.neoforge.curios; - -import de.rubixdev.inventorio.integration.curios.ICuriosContainer; -import de.rubixdev.inventorio.util.CuriosTester; -import me.fallenbreath.conditionalmixin.api.annotation.Condition; -import me.fallenbreath.conditionalmixin.api.annotation.Restriction; -import net.minecraft.entity.player.PlayerEntity; -import org.objectweb.asm.Opcodes; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Slice; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler; -import top.theillusivec4.curios.common.inventory.CurioStacksHandler; - -@Restriction(require = { @Condition("curios"), @Condition(type = Condition.Type.TESTER, tester = CuriosTester.class) }) -@Mixin(CurioStacksHandler.class) -public class CurioStacksHandlerMixin { - @Shadow - @Final - private ICuriosItemHandler itemHandler; - - @Inject( - method = "update", - at = @At(value = "JUMP", opcode = Opcodes.IFEQ, shift = At.Shift.BEFORE, ordinal = 0), - slice = @Slice( - from = @At( - value = "INVOKE", - target = "Lnet/neoforged/bus/api/IEventBus;post(Lnet/neoforged/bus/api/Event;)Lnet/neoforged/bus/api/Event;" - ) - ) - ) - private void inventorioResetSlots(CallbackInfo ci) { - if ( - itemHandler.getWearer() instanceof PlayerEntity player - && player.currentScreenHandler instanceof ICuriosContainer curiosContainer - ) { - curiosContainer.inventorio$resetSlots(); - } - } -} diff --git a/versions/1.20.4-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/CuriosClientPayloadHandlerMixin.java b/versions/1.20.4-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/CuriosClientPayloadHandlerMixin.java deleted file mode 100644 index f4cf15b..0000000 --- a/versions/1.20.4-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/CuriosClientPayloadHandlerMixin.java +++ /dev/null @@ -1,109 +0,0 @@ -package de.rubixdev.inventorio.mixin.neoforge.curios; - -import com.llamalad7.mixinextras.sugar.Local; -import de.rubixdev.inventorio.integration.curios.ICuriosContainer; -import de.rubixdev.inventorio.integration.curios.ICuriosScreen; -import de.rubixdev.inventorio.util.CuriosTester; -import me.fallenbreath.conditionalmixin.api.annotation.Condition; -import me.fallenbreath.conditionalmixin.api.annotation.Restriction; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.entity.Entity; -import net.minecraft.entity.LivingEntity; -import net.minecraft.screen.ScreenHandler; -import org.objectweb.asm.Opcodes; -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.Slice; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler; -import top.theillusivec4.curios.common.network.client.CuriosClientPayloadHandler; -import top.theillusivec4.curios.common.network.server.SPacketScroll; -import top.theillusivec4.curios.common.network.server.sync.SPacketSyncCurios; -import top.theillusivec4.curios.common.network.server.sync.SPacketSyncModifiers; - -@Restriction(require = { @Condition("curios"), @Condition(type = Condition.Type.TESTER, tester = CuriosTester.class) }) -@Mixin(CuriosClientPayloadHandler.class) -public class CuriosClientPayloadHandlerMixin { - @Inject( - method = "lambda$handleScroll$2", - at = @At(value = "JUMP", opcode = Opcodes.IFEQ, shift = At.Shift.BEFORE, ordinal = 0), - slice = @Slice( - from = @At( - value = "INVOKE", - target = "Ltop/theillusivec4/curios/common/inventory/container/CuriosContainer;scrollToIndex(I)V" - ) - ) - ) - private static void inventorioUpdateRenderButtons(SPacketScroll data, CallbackInfo ci, @Local Screen screen) { - if (screen instanceof ICuriosScreen curiosScreen) { - curiosScreen.inventorio$updateRenderButtons(); - } - } - - @Inject( - method = "lambda$handleSyncCurios$13", - at = @At(value = "JUMP", opcode = Opcodes.IFEQ, shift = At.Shift.BEFORE, ordinal = 0), - slice = @Slice( - from = @At( - value = "INVOKE", - target = "Ltop/theillusivec4/curios/api/type/capability/ICuriosItemHandler;setCurios(Ljava/util/Map;)V" - ) - ) - ) - private static void inventorioResetSlots( - SPacketSyncCurios data, - Entity entity, - ICuriosItemHandler handler, - CallbackInfo ci - ) { - if ( - entity instanceof ClientPlayerEntity player - && player.currentScreenHandler instanceof ICuriosContainer curiosContainer - ) { - curiosContainer.inventorio$resetSlots(); - } - } - - @Inject( - method = "lambda$handleSyncModifiers$10", - at = @At(value = "JUMP", opcode = Opcodes.IFEQ, shift = At.Shift.BEFORE, ordinal = 0), - slice = @Slice( - from = @At( - value = "INVOKE", - target = "Lnet/neoforged/bus/api/IEventBus;post(Lnet/neoforged/bus/api/Event;)Lnet/neoforged/bus/api/Event;" - ) - ) - ) - private static void inventorioResetSlots( - SPacketSyncModifiers data, - LivingEntity livingEntity, - Entity entity, - ICuriosItemHandler handler, - CallbackInfo ci - ) { - if ( - entity instanceof ClientPlayerEntity player - && player.currentScreenHandler instanceof ICuriosContainer curiosContainer - ) { - curiosContainer.inventorio$resetSlots(); - } - } - - @Inject( - method = "lambda$handleScroll$2", - at = @At(value = "JUMP", opcode = Opcodes.IFEQ, shift = At.Shift.BEFORE, ordinal = 0), - slice = @Slice( - from = @At( - value = "FIELD", - target = "Lnet/minecraft/client/network/ClientPlayerEntity;currentScreenHandler:Lnet/minecraft/screen/ScreenHandler;" - ) - ) - ) - private static void inventorioScrollToIndex(SPacketScroll data, CallbackInfo ci, @Local ScreenHandler container) { - if (container instanceof ICuriosContainer curiosContainer && container.syncId == data.windowId()) { - curiosContainer.inventorio$scrollToIndex(data.index()); - } - } -} diff --git a/versions/1.20.4-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/CuriosEventHandlerMixin.java b/versions/1.20.4-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/CuriosEventHandlerMixin.java deleted file mode 100644 index 742f953..0000000 --- a/versions/1.20.4-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/CuriosEventHandlerMixin.java +++ /dev/null @@ -1,57 +0,0 @@ -package de.rubixdev.inventorio.mixin.neoforge.curios; - -import de.rubixdev.inventorio.integration.curios.ICuriosContainer; -import de.rubixdev.inventorio.util.CuriosTester; -import me.fallenbreath.conditionalmixin.api.annotation.Condition; -import me.fallenbreath.conditionalmixin.api.annotation.Restriction; -import net.minecraft.server.network.ServerPlayerEntity; -import org.objectweb.asm.Opcodes; -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.Slice; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler; -import top.theillusivec4.curios.common.event.CuriosEventHandler; - -@Restriction(require = { @Condition("curios"), @Condition(type = Condition.Type.TESTER, tester = CuriosTester.class) }) -@Mixin(CuriosEventHandler.class) -public class CuriosEventHandlerMixin { - //#if MC >= 12004 - @Inject( - method = "lambda$onDatapackSync$4", - at = @At(value = "JUMP", opcode = Opcodes.IFEQ, shift = At.Shift.BEFORE, ordinal = 0), - slice = @Slice( - from = @At( - value = "FIELD", - target = "Lnet/minecraft/server/network/ServerPlayerEntity;currentScreenHandler:Lnet/minecraft/screen/ScreenHandler;" - ) - ) - ) - private static void inventorioResetSlots(ServerPlayerEntity mp, ICuriosItemHandler handler, CallbackInfo ci) { - if (mp.currentScreenHandler instanceof ICuriosContainer curiosContainer) { - curiosContainer.inventorio$resetSlots(); - } - } - //#endif - - @Inject( - //#if MC >= 12004 - method = "lambda$onDatapackSync$2", - //#else - //$$ method = "lambda$onDatapackSync$5", - //#endif - at = @At(value = "JUMP", opcode = Opcodes.IFEQ, shift = At.Shift.BEFORE, ordinal = 0), - slice = @Slice( - from = @At( - value = "FIELD", - target = "Lnet/minecraft/server/network/ServerPlayerEntity;currentScreenHandler:Lnet/minecraft/screen/ScreenHandler;" - ) - ) - ) - private static void inventorioResetSlots2(ServerPlayerEntity player, ICuriosItemHandler handler, CallbackInfo ci) { - if (player.currentScreenHandler instanceof ICuriosContainer curiosContainer) { - curiosContainer.inventorio$resetSlots(); - } - } -} diff --git a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/ICuriosContainer.kt b/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/ICuriosContainer.kt deleted file mode 100644 index 0d73cb6..0000000 --- a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/ICuriosContainer.kt +++ /dev/null @@ -1,13 +0,0 @@ -package de.rubixdev.inventorio.integration.curios - -import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler - -@Suppress("FunctionName", "PropertyName") -interface ICuriosContainer { - fun `inventorio$resetSlots`() - fun `inventorio$scrollTo`(pos: Float) - fun `inventorio$scrollToIndex`(indexIn: Int) - val `inventorio$hasCosmeticColumn`: Boolean - val `inventorio$canScroll`: Boolean - val `inventorio$curiosHandler`: ICuriosItemHandler? -} diff --git a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/ICuriosScreen.kt b/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/ICuriosScreen.kt deleted file mode 100644 index 60613b0..0000000 --- a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/ICuriosScreen.kt +++ /dev/null @@ -1,7 +0,0 @@ -package de.rubixdev.inventorio.integration.curios - -@Suppress("FunctionName", "PropertyName") -interface ICuriosScreen { - fun `inventorio$updateRenderButtons`() - val `inventorio$isCuriosOpen`: Boolean -} diff --git a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/InventorioScreenHandlerMixinHelper.kt b/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/InventorioScreenHandlerMixinHelper.kt deleted file mode 100644 index 5a24f98..0000000 --- a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/InventorioScreenHandlerMixinHelper.kt +++ /dev/null @@ -1,201 +0,0 @@ -package de.rubixdev.inventorio.integration.curios - -import de.rubixdev.inventorio.mixin.accessor.ScreenHandlerAccessor -import de.rubixdev.inventorio.player.InventorioScreenHandler -import de.rubixdev.inventorio.player.InventorioScreenHandler.Companion.deepPocketsRange -import de.rubixdev.inventorio.player.InventorioScreenHandler.Companion.mainInventoryRange -import de.rubixdev.inventorio.player.InventorioScreenHandler.Companion.toolBeltRange -import de.rubixdev.inventorio.util.insertItem -import de.rubixdev.inventorio.util.subList -import kotlin.math.max -import kotlin.math.min -import net.minecraft.entity.player.PlayerEntity -import net.minecraft.item.ItemStack -import net.minecraft.network.packet.CustomPayload -import net.minecraft.server.network.ServerPlayerEntity -import net.neoforged.neoforge.network.PacketDistributor -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable -import top.theillusivec4.curios.api.CuriosApi -import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler -import top.theillusivec4.curios.common.inventory.CosmeticCurioSlot -import top.theillusivec4.curios.common.inventory.CurioSlot -import top.theillusivec4.curios.common.network.client.CPacketScroll -import top.theillusivec4.curios.common.network.server.SPacketScroll - -//#if MC >= 12004 -fun sendToServer(packet: CustomPayload) { - PacketDistributor.SERVER.noArg().send(packet) -} -fun sendToPlayer(player: ServerPlayerEntity, packet: CustomPayload) { - PacketDistributor.PLAYER.with(player).send(packet) -} -//#else -//$$ fun sendToServer(packet: MSG) { -//$$ top.theillusivec4.curios.common.network.NetworkHandler.INSTANCE.send( -//$$ PacketDistributor.SERVER.noArg(), -//$$ packet, -//$$ ) -//$$ } -//$$ fun sendToPlayer(player: ServerPlayerEntity, packet: MSG) { -//$$ top.theillusivec4.curios.common.network.NetworkHandler.INSTANCE.send( -//$$ PacketDistributor.PLAYER.with { player }, -//$$ packet, -//$$ ) -//$$ } -//#endif - -/** - * This is basically a re-implementation of https://github.com/TheIllusiveC4/Curios/blob/7bd447467d1a881d9217ebf938337723fafaabf4/neoforge/src/main/java/top/theillusivec4/curios/common/inventory/container/CuriosContainer.java - * with adjustments for the Inventorio screen (and in Kotlin). - */ -@Suppress("FunctionName") -class InventorioScreenHandlerMixinHelper( - thiz: InventorioScreenHandler, -) { - val player: PlayerEntity = thiz.inventory.player - - //#if MC >= 12004 - val curiosHandler: ICuriosItemHandler? = CuriosApi.getCuriosInventory(player).orElse(null) - //#else - //$$ val curiosHandler: ICuriosItemHandler? = CuriosApi.getCuriosInventory(player).resolve().orElse(null) - //#endif - - private val isLocalWorld = player.world.isClient - private var lastScrollIndex = 0 - private var curiosSlotRange = toolBeltRange.last + 1 until thiz.slots.size - @get:JvmName("hasCosmeticColumn") - var hasCosmeticColumn = false - private set - - private val thiss = thiz as ScreenHandlerAccessor - - fun InventorioScreenHandler.`curios$init`() { - `curios$scrollToIndex`(0) - } - - fun InventorioScreenHandler.`curios$resetSlots`() = `curios$scrollToIndex`(lastScrollIndex) - - fun InventorioScreenHandler.`curios$scrollToIndex`(indexIn: Int) { - val curioMap = curiosHandler?.curios ?: return - var slotCount = 0 - var yOffset = 12 - var index = 0 - var startingIndex = indexIn - slots.subList(curiosSlotRange).clear() - thiss.trackedStacks.subList(curiosSlotRange).clear() - thiss.previousTrackedStacks.subList(curiosSlotRange).clear() - - val curiosSlotStart = slots.size - - for (stacksHandler in curioMap.values) { - val stackHandler = stacksHandler.stacks - if (stacksHandler.isVisible) { - for (i in 0 until stackHandler.slots) { - if (slotCount >= 8) break - if (index >= startingIndex) slotCount++ - index++ - } - } - } - startingIndex = min(startingIndex, max(0, index - 8)) - index = 0 - slotCount = 0 - - for ((identifier, stacksHandler) in curioMap.entries) { - val stackHandler = stacksHandler.stacks - if (stacksHandler.isVisible) { - for (i in 0 until stackHandler.slots) { - if (slotCount >= 8) break - if (index >= startingIndex) { - thiss.callAddSlot( - CurioSlot( - player, - stackHandler, - i, - identifier, - -18, - yOffset, - stacksHandler.renders, - stacksHandler.canToggleRendering(), - ), - ) - yOffset += 18 - slotCount++ - } - index++ - } - } - } - index = 0 - slotCount = 0 - yOffset = 12 - - for ((identifier, stacksHandler) in curioMap.entries) { - val stackHandler = stacksHandler.stacks - if (stacksHandler.isVisible) { - for (i in 0 until stackHandler.slots) { - if (slotCount >= 8) break - if (index >= startingIndex) { - if (stacksHandler.hasCosmetic()) { - val cosmeticHandler = stacksHandler.cosmeticStacks - hasCosmeticColumn = true - thiss.callAddSlot(CosmeticCurioSlot(player, cosmeticHandler, i, identifier, -37, yOffset)) - } - yOffset += 18 - slotCount++ - } - index++ - } - } - } - - if (!isLocalWorld) { - sendToPlayer(player as ServerPlayerEntity, SPacketScroll(syncId, indexIn)) - } - lastScrollIndex = indexIn - curiosSlotRange = curiosSlotStart until slots.size - } - - fun InventorioScreenHandler.`curios$scrollTo`(pos: Float) { - if (curiosHandler != null) { - val k = curiosHandler.visibleSlots - 8 - val j = (pos * k + 0.5).toInt().coerceAtLeast(0) - if (j == lastScrollIndex) return - if (isLocalWorld) { - sendToServer(CPacketScroll(syncId, j)) - } - } - } - - @get:JvmName("canScroll") - val canScroll get() = (curiosHandler?.visibleSlots ?: 0) > 8 - - fun InventorioScreenHandler.`curios$setStackInSlot`(slot: Int, ci: CallbackInfo) { - if (slots.size <= slot) ci.cancel() - } - - fun InventorioScreenHandler.`curios$quickMove`(sourceIndex: Int, cir: CallbackInfoReturnable) { - // TODO: quick move also works while the client has the curios stuff closed, but to fix that I'd have to sync the - // open status using custom packets which is a bit too much for just mod compat - val slot = slots[sourceIndex] - if (slot.hasStack()) { - val stack = slot.stack - if (sourceIndex in curiosSlotRange) { - val availableDeepPocketsRange = getAvailableDeepPocketsRange() - cir.returnValue = if (!insertItem(stack, mainInventoryRange) - && !(!availableDeepPocketsRange.isEmpty() && insertItem(stack, availableDeepPocketsRange)) - ) { - ItemStack.EMPTY - } else { - stack - } - } else if ((sourceIndex in mainInventoryRange || sourceIndex in deepPocketsRange) - && CuriosApi.getItemStackSlots(stack).isNotEmpty() - && insertItem(stack, curiosSlotRange) - ) { - cir.returnValue = ItemStack.EMPTY - } - } - } -} diff --git a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/GlobalSettingsS2CPacket.kt b/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/GlobalSettingsS2CPacket.kt deleted file mode 100644 index 6dae38d..0000000 --- a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/GlobalSettingsS2CPacket.kt +++ /dev/null @@ -1,41 +0,0 @@ -package de.rubixdev.inventorio.packet - -import com.google.gson.Gson -import com.google.gson.JsonObject -import de.rubixdev.inventorio.config.GlobalSettings -import net.minecraft.network.PacketByteBuf -import net.minecraft.network.packet.CustomPayload -import net.minecraft.util.Identifier -import net.neoforged.neoforge.network.handling.PlayPayloadContext - -class GlobalSettingsS2CPacket : CustomPayload { - companion object { - val identifier = Identifier("inventorio", "global_settings") - } - - private var settingsJson: JsonObject - - // Sender's constructor - constructor() { - this.settingsJson = GlobalSettings.asJson() - } - - // Receiver's constructor - constructor(buf: PacketByteBuf) { - this.settingsJson = Gson().fromJson(buf.readString(), JsonObject::class.java) - } - - override fun id(): Identifier = identifier - - // Sender's writer - override fun write(buf: PacketByteBuf) { - buf.writeString(settingsJson.toString()) - } - - // Receiver's consumer - fun consume(context: PlayPayloadContext) { - context.workHandler.execute { - GlobalSettings.syncFromServer(settingsJson) - } - } -} diff --git a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/InventorioNetworkingNeoForge.kt b/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/InventorioNetworkingNeoForge.kt deleted file mode 100644 index a48a28e..0000000 --- a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/InventorioNetworkingNeoForge.kt +++ /dev/null @@ -1,77 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.PlayerInventoryAddon.Companion.inventoryAddon -import net.minecraft.client.MinecraftClient -import net.minecraft.item.ItemStack -import net.minecraft.server.network.ServerPlayerEntity -import net.neoforged.api.distmarker.Dist -import net.neoforged.api.distmarker.OnlyIn -import net.neoforged.bus.api.SubscribeEvent -import net.neoforged.neoforge.network.PacketDistributor -import net.neoforged.neoforge.network.event.RegisterPayloadHandlerEvent - -object InventorioNetworkingNeoForge : InventorioNetworking { - private const val PROTOCOL_VERSION = "1.8" - - @SubscribeEvent - fun registerPayloads(event: RegisterPayloadHandlerEvent) { - val registrar = event.registrar("inventorio").versioned(PROTOCOL_VERSION) - - registrar.play(SelectUtilitySlotPacket.identifier, ::SelectUtilitySlotPacket) { handler -> - handler.client(SelectUtilitySlotPacket::consumeClient).server(SelectUtilitySlotPacket::consumeServer) - } - registrar.play(GlobalSettingsS2CPacket.identifier, ::GlobalSettingsS2CPacket) { handler -> handler.client(GlobalSettingsS2CPacket::consume) } - registrar.play(UpdateAddonStacksS2CPacket.identifier, ::UpdateAddonStacksS2CPacket) { handler -> handler.client(UpdateAddonStacksS2CPacket::consume) } - - registrar.play(UseBoostRocketC2SPacket.identifier, { UseBoostRocketC2SPacket() }) { handler -> handler.server(UseBoostRocketC2SPacket::consume) } - registrar.play(SwappedHandsModeC2SPacket.identifier, ::SwappedHandsModeC2SPacket) { handler -> handler.server(SwappedHandsModeC2SPacket::consume) } - registrar.play(MoveItemToUtilityBeltC2SPacket.identifier, ::MoveItemToUtilityBeltC2SPacket) { handler -> handler.server(MoveItemToUtilityBeltC2SPacket::consume) } - registrar.play(OpenInventorioScreenC2SPacket.identifier, { OpenInventorioScreenC2SPacket() }) { handler -> handler.server(OpenInventorioScreenC2SPacket::consume) } - registrar.play(SwapItemsInHandsKeyC2SPacket.identifier, { SwapItemsInHandsKeyC2SPacket() }) { handler -> handler.server(SwapItemsInHandsKeyC2SPacket::consume) } - } - - override fun s2cSelectUtilitySlot(player: ServerPlayerEntity) { - val inventoryAddon = player.inventoryAddon ?: return - PacketDistributor.PLAYER.with(player).send(SelectUtilitySlotPacket(inventoryAddon.selectedUtility)) - } - - override fun s2cGlobalSettings(player: ServerPlayerEntity) { - PacketDistributor.PLAYER.with(player).send(GlobalSettingsS2CPacket()) - } - - override fun s2cUpdateAddonStacks(player: ServerPlayerEntity, updatedStacks: Map) { - PacketDistributor.PLAYER.with(player).send(UpdateAddonStacksS2CPacket(updatedStacks)) - } - - @OnlyIn(Dist.CLIENT) - override fun c2sSelectUtilitySlot(selectedUtility: Int) { - PacketDistributor.SERVER.noArg().send(SelectUtilitySlotPacket(selectedUtility)) - } - - @OnlyIn(Dist.CLIENT) - override fun c2sUseBoostRocket() { - PacketDistributor.SERVER.noArg().send(UseBoostRocketC2SPacket()) - } - - @OnlyIn(Dist.CLIENT) - override fun c2sSetSwappedHandsMode(swappedHands: Boolean) { - if (MinecraftClient.getInstance().networkHandler != null) { - PacketDistributor.SERVER.noArg().send(SwappedHandsModeC2SPacket(swappedHands)) - } - } - - @OnlyIn(Dist.CLIENT) - override fun c2sMoveItemToUtilityBelt(sourceSlot: Int) { - PacketDistributor.SERVER.noArg().send(MoveItemToUtilityBeltC2SPacket(sourceSlot)) - } - - @OnlyIn(Dist.CLIENT) - override fun c2sOpenInventorioScreen() { - PacketDistributor.SERVER.noArg().send(OpenInventorioScreenC2SPacket()) - } - - @OnlyIn(Dist.CLIENT) - override fun c2sSwapItemsInHands() { - PacketDistributor.SERVER.noArg().send(SwapItemsInHandsKeyC2SPacket()) - } -} diff --git a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/MoveItemToUtilityBeltC2SPacket.kt b/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/MoveItemToUtilityBeltC2SPacket.kt deleted file mode 100644 index e750825..0000000 --- a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/MoveItemToUtilityBeltC2SPacket.kt +++ /dev/null @@ -1,41 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.InventorioScreenHandler.Companion.inventorioScreenHandler -import kotlin.jvm.optionals.getOrNull -import net.minecraft.network.PacketByteBuf -import net.minecraft.network.packet.CustomPayload -import net.minecraft.util.Identifier -import net.neoforged.neoforge.network.handling.PlayPayloadContext - -class MoveItemToUtilityBeltC2SPacket : CustomPayload { - companion object { - val identifier = Identifier("inventorio", "move_to_utility_c2s") - } - private var sourceSlot = 0 - - // Sender's constructor - constructor(sourceSlot: Int) { - this.sourceSlot = sourceSlot - } - - // Receiver's constructor - constructor(buf: PacketByteBuf) { - sourceSlot = buf.readByte().toInt() - } - - override fun id(): Identifier = identifier - - // Sender's writer - override fun write(buf: PacketByteBuf) { - buf.writeByte(sourceSlot) - } - - // Receiver's consumer - fun consume(context: PlayPayloadContext) { - val player = context.player.getOrNull() ?: return - context.workHandler.execute { - val screenHandler = player.inventorioScreenHandler ?: return@execute - screenHandler.tryTransferToUtilityBeltSlot(screenHandler.getSlot(sourceSlot)) - } - } -} diff --git a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/OpenInventorioScreenC2SPacket.kt b/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/OpenInventorioScreenC2SPacket.kt deleted file mode 100644 index 71204b6..0000000 --- a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/OpenInventorioScreenC2SPacket.kt +++ /dev/null @@ -1,25 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.InventorioScreenHandler -import kotlin.jvm.optionals.getOrNull -import net.minecraft.network.PacketByteBuf -import net.minecraft.network.packet.CustomPayload -import net.minecraft.util.Identifier -import net.neoforged.neoforge.network.handling.PlayPayloadContext - -class OpenInventorioScreenC2SPacket : CustomPayload { - companion object { - val identifier = Identifier("inventorio", "open_screen") - } - - override fun id(): Identifier = identifier - - override fun write(buf: PacketByteBuf?) {} - - fun consume(context: PlayPayloadContext) { - val sender = context.player.getOrNull() ?: return - context.workHandler.execute { - InventorioScreenHandler.open(sender) - } - } -} diff --git a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/SelectUtilitySlotPacket.kt b/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/SelectUtilitySlotPacket.kt deleted file mode 100644 index f98156c..0000000 --- a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/SelectUtilitySlotPacket.kt +++ /dev/null @@ -1,55 +0,0 @@ -package de.rubixdev.inventorio.packet - -import com.mojang.datafixers.util.Pair -import de.rubixdev.inventorio.player.PlayerInventoryAddon -import de.rubixdev.inventorio.player.PlayerInventoryAddon.Companion.inventoryAddon -import kotlin.jvm.optionals.getOrNull -import net.minecraft.entity.EquipmentSlot -import net.minecraft.network.PacketByteBuf -import net.minecraft.network.packet.CustomPayload -import net.minecraft.network.packet.s2c.play.EntityEquipmentUpdateS2CPacket -import net.minecraft.server.world.ServerWorld -import net.minecraft.util.Identifier -import net.neoforged.neoforge.network.handling.PlayPayloadContext - -class SelectUtilitySlotPacket : CustomPayload { - companion object { - val identifier = Identifier("inventorio", "select_utility") - } - private var utilitySlot = 0 - - // Sender's constructor - constructor(utilitySlot: Int) { - this.utilitySlot = utilitySlot - } - - // Receiver's constructor - constructor(buf: PacketByteBuf) { - this.utilitySlot = buf.readByte().toInt() - } - - override fun id(): Identifier = identifier - - // Sender's writer - override fun write(buf: PacketByteBuf) { - buf.writeByte(utilitySlot) - } - - // Client's receiving consumer - fun consumeClient(context: PlayPayloadContext) { - context.workHandler.execute { - PlayerInventoryAddon.Client.local?.selectedUtility = utilitySlot - } - } - - // Server's receiving consumer - fun consumeServer(context: PlayPayloadContext) { - val player = context.player.getOrNull() ?: return - context.workHandler.execute { - player.inventoryAddon?.selectedUtility = utilitySlot - - val broadcastPacket = EntityEquipmentUpdateS2CPacket(player.id, listOf(Pair(EquipmentSlot.OFFHAND, player.offHandStack))) - (player.world as ServerWorld).chunkManager.sendToOtherNearbyPlayers(player, broadcastPacket) - } - } -} diff --git a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/SwapItemsInHandsKeyC2SPacket.kt b/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/SwapItemsInHandsKeyC2SPacket.kt deleted file mode 100644 index 35765e1..0000000 --- a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/SwapItemsInHandsKeyC2SPacket.kt +++ /dev/null @@ -1,26 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.PlayerInventoryAddon.Companion.inventoryAddon -import kotlin.jvm.optionals.getOrNull -import net.minecraft.network.PacketByteBuf -import net.minecraft.network.packet.CustomPayload -import net.minecraft.util.Identifier -import net.neoforged.neoforge.network.handling.PlayPayloadContext - -class SwapItemsInHandsKeyC2SPacket : CustomPayload { - companion object { - val identifier = Identifier("inventorio", "swap_items_in_hands") - } - - override fun id(): Identifier = identifier - - override fun write(buf: PacketByteBuf?) {} - - // Receiver's consumer - fun consume(context: PlayPayloadContext) { - val sender = context.player.getOrNull() ?: return - context.workHandler.execute { - sender.inventoryAddon?.swapItemsInHands() - } - } -} diff --git a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/SwappedHandsModeC2SPacket.kt b/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/SwappedHandsModeC2SPacket.kt deleted file mode 100644 index 4c4ae6a..0000000 --- a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/SwappedHandsModeC2SPacket.kt +++ /dev/null @@ -1,40 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.PlayerInventoryAddon.Companion.inventoryAddon -import kotlin.jvm.optionals.getOrNull -import net.minecraft.network.PacketByteBuf -import net.minecraft.network.packet.CustomPayload -import net.minecraft.util.Identifier -import net.neoforged.neoforge.network.handling.PlayPayloadContext - -class SwappedHandsModeC2SPacket : CustomPayload { - companion object { - val identifier = Identifier("inventorio", "swapped_hands") - } - private var swappedHands = false - - // Sender's constructor - constructor(swappedHands: Boolean) { - this.swappedHands = swappedHands - } - - // Receiver's constructor - constructor(buf: PacketByteBuf) { - swappedHands = buf.readBoolean() - } - - override fun id(): Identifier = identifier - - // Sender's writer - override fun write(buf: PacketByteBuf) { - buf.writeBoolean(swappedHands) - } - - // Receiver's consumer - fun consume(context: PlayPayloadContext) { - val sender = context.player.getOrNull() ?: return - context.workHandler.execute { - sender.inventoryAddon?.swappedHands = swappedHands - } - } -} diff --git a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/UpdateAddonStacksS2CPacket.kt b/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/UpdateAddonStacksS2CPacket.kt deleted file mode 100644 index 3c1b8d8..0000000 --- a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/UpdateAddonStacksS2CPacket.kt +++ /dev/null @@ -1,47 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.PlayerInventoryAddon -import net.minecraft.item.ItemStack -import net.minecraft.network.PacketByteBuf -import net.minecraft.network.packet.CustomPayload -import net.minecraft.util.Identifier -import net.neoforged.neoforge.network.handling.PlayPayloadContext - -class UpdateAddonStacksS2CPacket : CustomPayload { - companion object { - val identifier = Identifier("inventorio", "update_addon_stacks") - } - private var updatedStacks: Map - - // Sender's constructor - constructor(updatedStacks: Map) { - this.updatedStacks = updatedStacks - } - - // Receiver's constructor - constructor(buf: PacketByteBuf) { - val size = buf.readInt() - val updatedStacks = mutableMapOf() - for (i in 0 until size) - updatedStacks[buf.readInt()] = buf.readItemStack() - this.updatedStacks = updatedStacks - } - - override fun id(): Identifier = identifier - - // Sender's writer - override fun write(buf: PacketByteBuf) { - buf.writeInt(updatedStacks.size) - for ((index, stack) in updatedStacks) { - buf.writeInt(index) - buf.writeItemStack(stack) - } - } - - // Receiver's consumer - fun consume(context: PlayPayloadContext) { - context.workHandler.execute { - PlayerInventoryAddon.Client.local?.receiveStacksUpdateS2C(updatedStacks) - } - } -} diff --git a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/UseBoostRocketC2SPacket.kt b/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/UseBoostRocketC2SPacket.kt deleted file mode 100644 index e334bc6..0000000 --- a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/UseBoostRocketC2SPacket.kt +++ /dev/null @@ -1,25 +0,0 @@ -package de.rubixdev.inventorio.packet - -import de.rubixdev.inventorio.player.PlayerInventoryAddon.Companion.inventoryAddon -import kotlin.jvm.optionals.getOrNull -import net.minecraft.network.PacketByteBuf -import net.minecraft.network.packet.CustomPayload -import net.minecraft.util.Identifier -import net.neoforged.neoforge.network.handling.PlayPayloadContext - -class UseBoostRocketC2SPacket : CustomPayload { - companion object { - val identifier = Identifier("inventorio", "fire_boost_rocket_c2s") - } - - override fun id(): Identifier = identifier - - override fun write(buf: PacketByteBuf?) {} - - fun consume(context: PlayPayloadContext) { - val sender = context.player.getOrNull() ?: return - context.workHandler.execute { - sender.inventoryAddon?.fireRocketFromInventory() - } - } -} diff --git a/versions/1.20.1-common/gradle.properties b/versions/1.20.6-common/gradle.properties similarity index 68% rename from versions/1.20.1-common/gradle.properties rename to versions/1.20.6-common/gradle.properties index 5214994..06ea5f1 100644 --- a/versions/1.20.1-common/gradle.properties +++ b/versions/1.20.6-common/gradle.properties @@ -1,20 +1,20 @@ # General Properties - minecraft_version=1.20.1 - yarn_mappings=1.20.1+build.10 - game_versions=1.20\n1.20.1 + minecraft_version=1.20.6 + yarn_mappings=1.20.6+build.3 + # https://maven.architectury.dev/dev/architectury/yarn-mappings-patch-neoforge/ + yarn_mappings_patch=1.20.6+build.6 + game_versions=1.20.5\n1.20.6 # (Neo)Forge and dependency version ranges minecraft_version_range_fabric= minecraft_version_range_forge= - forge_version= - forge_version_range= neoforge_version= neoforge_version_range= # Common Dependencies - cloth_version=11.1.118 + cloth_version=14.0.139 # https://modrinth.com/mod/clumps/versions - clumps_version=12.0.0.3-fabric,1.20.1 + clumps_version=17.0.0.1-fabric,1.20.6 # Fabric Dependencies # https://modrinth.com/mod/early-loading-screen/versions @@ -23,7 +23,6 @@ modmenu_version= # https://modrinth.com/mod/trinkets/versions?l=fabric trinkets_version= - cca_version= # (Neo)Forge Dependencies # https://maven.theillusivec4.top/top/theillusivec4/curios/curios-forge/ diff --git a/versions/1.20.4-fabric/gradle.properties b/versions/1.20.6-fabric/gradle.properties similarity index 56% rename from versions/1.20.4-fabric/gradle.properties rename to versions/1.20.6-fabric/gradle.properties index facd952..755e463 100644 --- a/versions/1.20.4-fabric/gradle.properties +++ b/versions/1.20.6-fabric/gradle.properties @@ -1,30 +1,29 @@ # General Properties loom.platform=fabric - minecraft_version=1.20.4 - yarn_mappings=1.20.4+build.3 - game_versions=1.20.3\n1.20.4 + minecraft_version=1.20.6 + yarn_mappings=1.20.6+build.3 + # https://maven.architectury.dev/dev/architectury/yarn-mappings-patch-neoforge/ + yarn_mappings_patch=1.20.6+build.6 + game_versions=1.20.5\n1.20.6 # (Neo)Forge and dependency version ranges - minecraft_version_range_fabric=>=1.20.3 + minecraft_version_range_fabric=>=1.20.5 minecraft_version_range_forge= - forge_version= - forge_version_range= neoforge_version= neoforge_version_range= # Common Dependencies - cloth_version=13.0.121 + cloth_version=14.0.139 # https://modrinth.com/mod/clumps/versions - clumps_version=15.0.0.2-fabric,1.20.4 + clumps_version=17.0.0.1-fabric,1.20.6 # Fabric Dependencies # https://modrinth.com/mod/early-loading-screen/versions early_loading_screen_version=0.1.5+1.20.4 - fabric_api_version=0.95.4+1.20.4 - modmenu_version=9.0.0 + fabric_api_version=0.100.8+1.20.6 + modmenu_version=10.0.0 # https://modrinth.com/mod/trinkets/versions?l=fabric - trinkets_version=3.8.1 - cca_version= + trinkets_version=3.9.0 # (Neo)Forge Dependencies # https://maven.theillusivec4.top/top/theillusivec4/curios/curios-forge/ diff --git a/versions/1.20.4-fabric/src/main/java/de/rubixdev/inventorio/mixin/fabric/trinkets/InventorioScreenHandlerMixin.java b/versions/1.20.6-fabric/src/main/java/de/rubixdev/inventorio/mixin/fabric/trinkets/InventorioScreenHandlerMixin.java similarity index 100% rename from versions/1.20.4-fabric/src/main/java/de/rubixdev/inventorio/mixin/fabric/trinkets/InventorioScreenHandlerMixin.java rename to versions/1.20.6-fabric/src/main/java/de/rubixdev/inventorio/mixin/fabric/trinkets/InventorioScreenHandlerMixin.java diff --git a/versions/1.20.4-fabric/src/main/java/de/rubixdev/inventorio/mixin/fabric/trinkets/InventorioScreenMixin.java b/versions/1.20.6-fabric/src/main/java/de/rubixdev/inventorio/mixin/fabric/trinkets/InventorioScreenMixin.java similarity index 96% rename from versions/1.20.4-fabric/src/main/java/de/rubixdev/inventorio/mixin/fabric/trinkets/InventorioScreenMixin.java rename to versions/1.20.6-fabric/src/main/java/de/rubixdev/inventorio/mixin/fabric/trinkets/InventorioScreenMixin.java index 75ef534..cbfb417 100644 --- a/versions/1.20.4-fabric/src/main/java/de/rubixdev/inventorio/mixin/fabric/trinkets/InventorioScreenMixin.java +++ b/versions/1.20.6-fabric/src/main/java/de/rubixdev/inventorio/mixin/fabric/trinkets/InventorioScreenMixin.java @@ -15,6 +15,7 @@ import net.minecraft.client.gui.screen.recipebook.RecipeBookProvider; import net.minecraft.client.util.math.Rect2i; import net.minecraft.entity.player.PlayerInventory; +import net.minecraft.screen.ScreenHandler; import net.minecraft.screen.slot.Slot; import net.minecraft.text.Text; import org.spongepowered.asm.mixin.Mixin; @@ -77,7 +78,8 @@ public InventorioScreenMixin(InventorioScreenHandler screenHandler, PlayerInvent @Override public TrinketPlayerScreenHandler trinkets$getHandler() { - return (TrinketPlayerScreenHandler) handler; + // noinspection DataFlowIssue + return (TrinketPlayerScreenHandler) (ScreenHandler) handler; } @Override diff --git a/versions/1.20.4-fabric/src/main/java/de/rubixdev/inventorio/mixin/fabric/trinkets/SlotGroupMixin.java b/versions/1.20.6-fabric/src/main/java/de/rubixdev/inventorio/mixin/fabric/trinkets/SlotGroupMixin.java similarity index 100% rename from versions/1.20.4-fabric/src/main/java/de/rubixdev/inventorio/mixin/fabric/trinkets/SlotGroupMixin.java rename to versions/1.20.6-fabric/src/main/java/de/rubixdev/inventorio/mixin/fabric/trinkets/SlotGroupMixin.java diff --git a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/InventorioFabric.kt b/versions/1.20.6-fabric/src/main/kotlin/de/rubixdev/inventorio/InventorioFabric.kt similarity index 72% rename from versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/InventorioFabric.kt rename to versions/1.20.6-fabric/src/main/kotlin/de/rubixdev/inventorio/InventorioFabric.kt index 03d8b60..25f70ba 100644 --- a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/InventorioFabric.kt +++ b/versions/1.20.6-fabric/src/main/kotlin/de/rubixdev/inventorio/InventorioFabric.kt @@ -11,6 +11,7 @@ import de.rubixdev.inventorio.integration.InventorioModIntegration import de.rubixdev.inventorio.integration.ModIntegration import de.rubixdev.inventorio.packet.InventorioNetworking import de.rubixdev.inventorio.packet.InventorioNetworkingFabric +import de.rubixdev.inventorio.util.id import net.fabricmc.api.EnvType import net.fabricmc.api.ModInitializer import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents @@ -19,7 +20,6 @@ import net.fabricmc.loader.api.FabricLoader import net.minecraft.recipe.SpecialRecipeSerializer import net.minecraft.registry.Registries import net.minecraft.registry.Registry -import net.minecraft.util.Identifier open class InventorioFabric : ModInitializer { private val fabricModIntegrations = listOf(ClumpsIntegration) @@ -27,15 +27,11 @@ open class InventorioFabric : ModInitializer { override fun onInitialize() { ScreenTypeProvider.INSTANCE = ScreenTypeProviderFabric InventorioNetworking.INSTANCE = InventorioNetworkingFabric - Registry.register(Registries.ENCHANTMENT, Identifier("inventorio", "deep_pockets"), DeepPocketsEnchantment) + Registry.register(Registries.ENCHANTMENT, "deep_pockets".id, DeepPocketsEnchantment) DeepPocketsBookRecipe.SERIALIZER = Registry.register( Registries.RECIPE_SERIALIZER, - Identifier("inventorio", "deep_pockets_book"), - //#if MC >= 12002 + "deep_pockets_book".id, SpecialRecipeSerializer { category -> DeepPocketsBookRecipe(category) }, - //#else - //$$ SpecialRecipeSerializer { ident, category -> DeepPocketsBookRecipe(ident, category) }, - //#endif ) initToolBelt() @@ -55,24 +51,24 @@ open class InventorioFabric : ModInitializer { // The reason why we do it this way is that we can't guarantee that other mods // won't call [InventorioAPI] BEFORE [InventorioFabric#onInitialize] has been invoked InventorioAPI.getToolBeltSlotTemplate(InventorioAPI.SLOT_PICKAXE) - ?.addAllowingTag(Identifier("fabric", "pickaxes")) - ?.addAllowingTag(Identifier("fabric", "hammers")) + ?.addAllowingTag("pickaxes".id("fabric")) + ?.addAllowingTag("hammers".id("fabric")) InventorioAPI.getToolBeltSlotTemplate(InventorioAPI.SLOT_SWORD) - ?.addAllowingTag(Identifier("fabric", "swords")) - ?.addAllowingTag(Identifier("fabric", "tridents")) - ?.addAllowingTag(Identifier("fabric", "battleaxes")) + ?.addAllowingTag("swords".id("fabric")) + ?.addAllowingTag("tridents".id("fabric")) + ?.addAllowingTag("battleaxes".id("fabric")) InventorioAPI.getToolBeltSlotTemplate(InventorioAPI.SLOT_AXE) - ?.addAllowingTag(Identifier("fabric", "axes")) - ?.addAllowingTag(Identifier("fabric", "battleaxes")) + ?.addAllowingTag("axes".id("fabric")) + ?.addAllowingTag("battleaxes".id("fabric")) InventorioAPI.getToolBeltSlotTemplate(InventorioAPI.SLOT_SHOVEL) - ?.addAllowingTag(Identifier("fabric", "shovels")) - ?.addAllowingTag(Identifier("fabric", "mattocks")) + ?.addAllowingTag("shovels".id("fabric")) + ?.addAllowingTag("mattocks".id("fabric")) InventorioAPI.getToolBeltSlotTemplate(InventorioAPI.SLOT_HOE) - ?.addAllowingTag(Identifier("fabric", "hoes")) - ?.addAllowingTag(Identifier("fabric", "shears")) + ?.addAllowingTag("hoes".id("fabric")) + ?.addAllowingTag("shears".id("fabric")) } } diff --git a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/ScreenTypeProviderFabric.kt b/versions/1.20.6-fabric/src/main/kotlin/de/rubixdev/inventorio/ScreenTypeProviderFabric.kt similarity index 91% rename from versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/ScreenTypeProviderFabric.kt rename to versions/1.20.6-fabric/src/main/kotlin/de/rubixdev/inventorio/ScreenTypeProviderFabric.kt index 1ebd14d..29ac658 100644 --- a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/ScreenTypeProviderFabric.kt +++ b/versions/1.20.6-fabric/src/main/kotlin/de/rubixdev/inventorio/ScreenTypeProviderFabric.kt @@ -2,17 +2,17 @@ package de.rubixdev.inventorio import de.rubixdev.inventorio.client.ui.InventorioScreen import de.rubixdev.inventorio.player.InventorioScreenHandler +import de.rubixdev.inventorio.util.id import net.minecraft.client.gui.screen.ingame.HandledScreens import net.minecraft.registry.Registries import net.minecraft.registry.Registry import net.minecraft.resource.featuretoggle.FeatureFlags import net.minecraft.screen.ScreenHandlerType -import net.minecraft.util.Identifier object ScreenTypeProviderFabric : ScreenTypeProvider { private val handlerProvider = Registry.register( Registries.SCREEN_HANDLER, - Identifier("inventorio", "player_screen"), + "player_screen".id, ScreenHandlerType({ syncId, inv -> InventorioScreenHandler(syncId, inv) }, FeatureFlags.VANILLA_FEATURES), ) diff --git a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/integration/ClumpsIntegration.kt b/versions/1.20.6-fabric/src/main/kotlin/de/rubixdev/inventorio/integration/ClumpsIntegration.kt similarity index 67% rename from versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/integration/ClumpsIntegration.kt rename to versions/1.20.6-fabric/src/main/kotlin/de/rubixdev/inventorio/integration/ClumpsIntegration.kt index 835c1a6..d7880c4 100644 --- a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/integration/ClumpsIntegration.kt +++ b/versions/1.20.6-fabric/src/main/kotlin/de/rubixdev/inventorio/integration/ClumpsIntegration.kt @@ -2,13 +2,9 @@ package de.rubixdev.inventorio.integration import com.blamejared.clumps.api.events.ClumpsEvents import de.rubixdev.inventorio.api.InventorioAPI -import net.fabricmc.loader.api.FabricLoader object ClumpsIntegration : ModIntegration() { - override val name = "clumps" - override val displayName = "Clumps" - - override fun shouldApply() = FabricLoader.getInstance().isModLoaded("clumps") + override val modId = "clumps" override fun apply() { ClumpsEvents.REPAIR_EVENT.register { event -> diff --git a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/integration/ModMenuIntegration.kt b/versions/1.20.6-fabric/src/main/kotlin/de/rubixdev/inventorio/integration/ModMenuIntegration.kt similarity index 100% rename from versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/integration/ModMenuIntegration.kt rename to versions/1.20.6-fabric/src/main/kotlin/de/rubixdev/inventorio/integration/ModMenuIntegration.kt diff --git a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/integration/trinkets/InventorioScreenHandlerMixinHelper.kt b/versions/1.20.6-fabric/src/main/kotlin/de/rubixdev/inventorio/integration/trinkets/InventorioScreenHandlerMixinHelper.kt similarity index 100% rename from versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/integration/trinkets/InventorioScreenHandlerMixinHelper.kt rename to versions/1.20.6-fabric/src/main/kotlin/de/rubixdev/inventorio/integration/trinkets/InventorioScreenHandlerMixinHelper.kt diff --git a/versions/1.20.6-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/InventorioNetworkingFabric.kt b/versions/1.20.6-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/InventorioNetworkingFabric.kt new file mode 100644 index 0000000..b13c83d --- /dev/null +++ b/versions/1.20.6-fabric/src/main/kotlin/de/rubixdev/inventorio/packet/InventorioNetworkingFabric.kt @@ -0,0 +1,88 @@ +package de.rubixdev.inventorio.packet + +import java.util.concurrent.Executor +import net.fabricmc.api.EnvType +import net.fabricmc.api.Environment +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking +import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking +import net.fabricmc.loader.api.FabricLoader +import net.minecraft.network.packet.CustomPayload +import net.minecraft.server.network.ServerPlayerEntity + +fun consumeClient(consumer: T.(Executor) -> Unit) = + { payload: T, ctx: ClientPlayNetworking.Context -> + payload.consumer(ctx.client()) + } + +fun consumeServer(consumer: T.(Executor, ServerPlayerEntity) -> Unit) = + { payload: T, ctx: ServerPlayNetworking.Context -> + payload.consumer(ctx.server(), ctx.player()) + } + +object InventorioNetworkingFabric : InventorioNetworking { + init { + PayloadTypeRegistry.playS2C().register(SelectUtilitySlotPacket.ID, SelectUtilitySlotPacket.CODEC) + PayloadTypeRegistry.playS2C().register(GlobalSettingsS2CPacket.ID, GlobalSettingsS2CPacket.CODEC) + PayloadTypeRegistry.playS2C().register(UpdateAddonStacksS2CPacket.ID, UpdateAddonStacksS2CPacket.CODEC) + + PayloadTypeRegistry.playC2S().register(SelectUtilitySlotPacket.ID, SelectUtilitySlotPacket.CODEC) + PayloadTypeRegistry.playC2S().register(UseBoostRocketC2SPacket.ID, UseBoostRocketC2SPacket.CODEC) + PayloadTypeRegistry.playC2S().register(SwapItemsInHandsKeyC2SPacket.ID, SwapItemsInHandsKeyC2SPacket.CODEC) + PayloadTypeRegistry.playC2S().register(SwappedHandsModeC2SPacket.ID, SwappedHandsModeC2SPacket.CODEC) + PayloadTypeRegistry.playC2S().register(MoveItemToUtilityBeltC2SPacket.ID, MoveItemToUtilityBeltC2SPacket.CODEC) + PayloadTypeRegistry.playC2S().register(OpenInventorioScreenC2SPacket.ID, OpenInventorioScreenC2SPacket.CODEC) + + if (FabricLoader.getInstance().environmentType == EnvType.CLIENT) { + ClientPlayNetworking.registerGlobalReceiver( + SelectUtilitySlotPacket.ID, + consumeClient(SelectUtilitySlotPacket::consume), + ) + ClientPlayNetworking.registerGlobalReceiver( + GlobalSettingsS2CPacket.ID, + consumeClient(GlobalSettingsS2CPacket::consume), + ) + ClientPlayNetworking.registerGlobalReceiver( + UpdateAddonStacksS2CPacket.ID, + consumeClient(UpdateAddonStacksS2CPacket::consume), + ) + } + + ServerPlayNetworking.registerGlobalReceiver( + SelectUtilitySlotPacket.ID, + consumeServer(SelectUtilitySlotPacket::consume), + ) + ServerPlayNetworking.registerGlobalReceiver( + UseBoostRocketC2SPacket.ID, + consumeServer(UseBoostRocketC2SPacket::consume), + ) + ServerPlayNetworking.registerGlobalReceiver( + SwapItemsInHandsKeyC2SPacket.ID, + consumeServer(SwapItemsInHandsKeyC2SPacket::consume), + ) + ServerPlayNetworking.registerGlobalReceiver( + SwappedHandsModeC2SPacket.ID, + consumeServer(SwappedHandsModeC2SPacket::consume), + ) + ServerPlayNetworking.registerGlobalReceiver( + MoveItemToUtilityBeltC2SPacket.ID, + consumeServer(MoveItemToUtilityBeltC2SPacket::consume), + ) + ServerPlayNetworking.registerGlobalReceiver( + OpenInventorioScreenC2SPacket.ID, + consumeServer(OpenInventorioScreenC2SPacket::consume), + ) + } + + override fun sendToPlayer( + player: ServerPlayerEntity, + packet: CustomPayload, + ) { + ServerPlayNetworking.send(player, packet) + } + + @Environment(EnvType.CLIENT) + override fun sendToServer(packet: CustomPayload) { + ClientPlayNetworking.send(packet) + } +} diff --git a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/util/PlatformApi.kt b/versions/1.20.6-fabric/src/main/kotlin/de/rubixdev/inventorio/util/PlatformApi.kt similarity index 60% rename from versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/util/PlatformApi.kt rename to versions/1.20.6-fabric/src/main/kotlin/de/rubixdev/inventorio/util/PlatformApi.kt index 2998c5d..34755aa 100644 --- a/versions/1.20.4-fabric/src/main/kotlin/de/rubixdev/inventorio/util/PlatformApi.kt +++ b/versions/1.20.6-fabric/src/main/kotlin/de/rubixdev/inventorio/util/PlatformApi.kt @@ -4,4 +4,5 @@ import net.fabricmc.loader.api.FabricLoader object PlatformApi { fun isModLoaded(modId: String): Boolean = FabricLoader.getInstance().isModLoaded(modId) + fun modDisplayname(modId: String): String? = FabricLoader.getInstance().getModContainer(modId).orElse(null)?.metadata?.name } diff --git a/versions/1.20.4-fabric/src/main/resources/fabric.mod.json b/versions/1.20.6-fabric/src/main/resources/fabric.mod.json similarity index 100% rename from versions/1.20.4-fabric/src/main/resources/fabric.mod.json rename to versions/1.20.6-fabric/src/main/resources/fabric.mod.json diff --git a/versions/1.20.4-fabric/src/main/resources/inventorio-fabric.mixins.json b/versions/1.20.6-fabric/src/main/resources/inventorio-fabric.mixins.json similarity index 91% rename from versions/1.20.4-fabric/src/main/resources/inventorio-fabric.mixins.json rename to versions/1.20.6-fabric/src/main/resources/inventorio-fabric.mixins.json index 054acb6..3198e83 100644 --- a/versions/1.20.4-fabric/src/main/resources/inventorio-fabric.mixins.json +++ b/versions/1.20.6-fabric/src/main/resources/inventorio-fabric.mixins.json @@ -1,7 +1,7 @@ { "required": true, "package": "de.rubixdev.inventorio.mixin.fabric", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "minVersion": "0.8", "plugin": "de.rubixdev.inventorio.InventorioMixinPlugin", "mixins": [ diff --git a/versions/1.20.4-neoforge/gradle.properties b/versions/1.20.6-neoforge/gradle.properties similarity index 55% rename from versions/1.20.4-neoforge/gradle.properties rename to versions/1.20.6-neoforge/gradle.properties index dc8b512..f80a540 100644 --- a/versions/1.20.4-neoforge/gradle.properties +++ b/versions/1.20.6-neoforge/gradle.properties @@ -1,21 +1,21 @@ # General Properties loom.platform=neoforge - minecraft_version=1.20.4 - yarn_mappings=1.20.4+build.3 - game_versions=1.20.3\n1.20.4 + minecraft_version=1.20.6 + yarn_mappings=1.20.6+build.3 + # https://maven.architectury.dev/dev/architectury/yarn-mappings-patch-neoforge/ + yarn_mappings_patch=1.20.6+build.6 + game_versions=1.20.5\n1.20.6 # (Neo)Forge and dependency version ranges minecraft_version_range_fabric= - minecraft_version_range_forge=[1.20.3,) - forge_version= - forge_version_range= - neoforge_version=20.4.169 - neoforge_version_range=[20.4,) + minecraft_version_range_forge=[1.20.5,) + neoforge_version=20.6.139 + neoforge_version_range=[20.6,) # Common Dependencies - cloth_version=13.0.121 + cloth_version=14.0.139 # https://modrinth.com/mod/clumps/versions - clumps_version=15.0.0.2-neoforge,1.20.4 + clumps_version=17.0.0.1-neoforge,1.20.6 # Fabric Dependencies # https://modrinth.com/mod/early-loading-screen/versions @@ -24,8 +24,7 @@ modmenu_version= # https://modrinth.com/mod/trinkets/versions?l=fabric trinkets_version= - cca_version= # (Neo)Forge Dependencies # https://maven.theillusivec4.top/top/theillusivec4/curios/curios-forge/ - curios_version=7.3.4+1.20.4 + curios_version=8.1.0+1.20.6 diff --git a/versions/1.20.6-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/CuriosClientPacketsMixin.java b/versions/1.20.6-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/CuriosClientPacketsMixin.java new file mode 100644 index 0000000..b66833d --- /dev/null +++ b/versions/1.20.6-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/CuriosClientPacketsMixin.java @@ -0,0 +1,66 @@ +package de.rubixdev.inventorio.mixin.neoforge.curios; + +import com.llamalad7.mixinextras.sugar.Local; +import de.rubixdev.inventorio.integration.curios.ICuriosContainer; +import de.rubixdev.inventorio.integration.curios.ICuriosScreen; +import de.rubixdev.inventorio.util.CuriosTester; +import me.fallenbreath.conditionalmixin.api.annotation.Condition; +import me.fallenbreath.conditionalmixin.api.annotation.Restriction; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; +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.CallbackInfo; +import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler; +import top.theillusivec4.curios.common.network.client.CuriosClientPackets; +import top.theillusivec4.curios.common.network.server.SPacketPage; +import top.theillusivec4.curios.common.network.server.SPacketQuickMove; +import top.theillusivec4.curios.common.network.server.sync.SPacketSyncModifiers; + +@Restriction(require = { @Condition("curios"), @Condition(type = Condition.Type.TESTER, tester = CuriosTester.class) }) +@Mixin(CuriosClientPackets.class) +public class CuriosClientPacketsMixin { + @Inject(method = "handle(Ltop/theillusivec4/curios/common/network/server/SPacketQuickMove;)V", at = @At("RETURN")) + private static void inventorio$quickMove(SPacketQuickMove data, CallbackInfo ci, @Local ClientPlayerEntity player) { + if (player != null && player.currentScreenHandler instanceof ICuriosContainer) { + player.currentScreenHandler.quickMove(player, data.moveIndex()); + } + } + + @Inject(method = "handle(Ltop/theillusivec4/curios/common/network/server/SPacketPage;)V", at = @At("RETURN")) + private static void inventorio$setPage( + SPacketPage data, + CallbackInfo ci, + @Local ClientPlayerEntity player, + @Local Screen screen + ) { + if ( + player != null + && player.currentScreenHandler instanceof ICuriosContainer curiosContainer + && player.currentScreenHandler.syncId == data.windowId() + ) { + curiosContainer.inventorio$setPage(data.page()); + } + if (screen instanceof ICuriosScreen curiosScreen) { + curiosScreen.inventorio$updateRenderButtons(); + } + } + + @Inject(method = "lambda$handle$5", at = @At("RETURN")) + private static void inventorio$syncModifiers( + SPacketSyncModifiers data, + LivingEntity livingEntity, + Entity entity, + MinecraftClient mc, + ICuriosItemHandler handler, + CallbackInfo ci + ) { + if (entity instanceof ClientPlayerEntity && mc.currentScreen instanceof ICuriosScreen curiosScreen) { + curiosScreen.inventorio$updateRenderButtons(); + } + } +} diff --git a/versions/1.20.4-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/CuriosServerPayloadHandlerMixin.java b/versions/1.20.6-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/CuriosServerPayloadHandlerMixin.java similarity index 52% rename from versions/1.20.4-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/CuriosServerPayloadHandlerMixin.java rename to versions/1.20.6-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/CuriosServerPayloadHandlerMixin.java index 3ef080c..8756890 100644 --- a/versions/1.20.4-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/CuriosServerPayloadHandlerMixin.java +++ b/versions/1.20.6-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/CuriosServerPayloadHandlerMixin.java @@ -5,38 +5,44 @@ import de.rubixdev.inventorio.util.CuriosTester; import me.fallenbreath.conditionalmixin.api.annotation.Condition; import me.fallenbreath.conditionalmixin.api.annotation.Restriction; -import net.minecraft.entity.player.PlayerEntity; import net.minecraft.screen.ScreenHandler; -import org.objectweb.asm.Opcodes; +import net.neoforged.neoforge.network.handling.IPayloadContext; 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.Slice; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import top.theillusivec4.curios.common.network.client.CPacketScroll; +import top.theillusivec4.curios.common.network.client.CPacketPage; +import top.theillusivec4.curios.common.network.client.CPacketToggleCosmetics; import top.theillusivec4.curios.common.network.server.CuriosServerPayloadHandler; @Restriction(require = { @Condition("curios"), @Condition(type = Condition.Type.TESTER, tester = CuriosTester.class) }) @Mixin(CuriosServerPayloadHandler.class) public class CuriosServerPayloadHandlerMixin { - @Inject( - method = "lambda$handleScroll$5", - at = @At(value = "JUMP", opcode = Opcodes.IFEQ, shift = At.Shift.BEFORE, ordinal = 0), - slice = @Slice( - from = @At( - value = "FIELD", - target = "Lnet/minecraft/entity/player/PlayerEntity;currentScreenHandler:Lnet/minecraft/screen/ScreenHandler;" - ) - ) - ) - private static void inventorioScrollToIndex( - CPacketScroll data, - PlayerEntity player, + @Inject(method = "lambda$handlerToggleCosmetics$4", at = @At("RETURN")) + private static void inventorioToggleCosmetics( + IPayloadContext ctx, + CPacketToggleCosmetics data, CallbackInfo ci, @Local ScreenHandler container ) { if (container instanceof ICuriosContainer curiosContainer && container.syncId == data.windowId()) { - curiosContainer.inventorio$scrollToIndex(data.index()); + curiosContainer.inventorio$toggleCosmetics(); + } + } + + @Inject(method = "lambda$handlePage$3", at = @At("RETURN")) + private static void inventorioSetPage( + IPayloadContext ctx, + CPacketPage data, + CallbackInfo ci, + @Local ScreenHandler container + ) { + if (container instanceof ICuriosContainer curiosContainer && container.syncId == data.windowId()) { + if (data.next()) { + curiosContainer.inventorio$nextPage(); + } else { + curiosContainer.inventorio$prevPage(); + } } } } diff --git a/versions/1.20.4-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/HandledScreenMixin.java b/versions/1.20.6-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/HandledScreenMixin.java similarity index 100% rename from versions/1.20.4-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/HandledScreenMixin.java rename to versions/1.20.6-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/HandledScreenMixin.java diff --git a/versions/1.20.4-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/InventorioScreenHandlerMixin.java b/versions/1.20.6-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/InventorioScreenHandlerMixin.java similarity index 67% rename from versions/1.20.4-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/InventorioScreenHandlerMixin.java rename to versions/1.20.6-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/InventorioScreenHandlerMixin.java index beb7a50..ebe52e9 100644 --- a/versions/1.20.4-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/InventorioScreenHandlerMixin.java +++ b/versions/1.20.6-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/InventorioScreenHandlerMixin.java @@ -12,14 +12,16 @@ import net.minecraft.item.ItemStack; import net.minecraft.screen.AbstractRecipeScreenHandler; import net.minecraft.screen.ScreenHandlerType; -import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler; +import top.theillusivec4.curios.api.type.ICuriosMenu; + +import java.util.List; @SuppressWarnings("UnresolvedMixinReference") // the Minecraft Dev plugin // doesn't seem to like Kotlin @@ -27,7 +29,7 @@ @Restriction(require = { @Condition("curios"), @Condition(type = Condition.Type.TESTER, tester = CuriosTester.class) }) @Mixin(InventorioScreenHandler.class) public abstract class InventorioScreenHandlerMixin extends AbstractRecipeScreenHandler - implements ICuriosContainer { + implements ICuriosContainer, ICuriosMenu { public InventorioScreenHandlerMixin(ScreenHandlerType arg, int i) { super(arg, i); } @@ -37,29 +39,58 @@ public InventorioScreenHandlerMixin(ScreenHandlerType arg, int i) { @Unique private InventorioScreenHandlerMixinHelper helper; + @Override + public void resetSlots() { + inventorio$resetSlots(); + } + @Override public void inventorio$resetSlots() { helper.curios$resetSlots(thiz); } @Override - public void inventorio$scrollTo(float pos) { - helper.curios$scrollTo(thiz, pos); + public void inventorio$setPage(int page) { + helper.curios$setPage(thiz, page); + } + + @Override + public void inventorio$toggleCosmetics() { + helper.curios$toggleCosmetics(thiz); + } + + @Override + public void inventorio$nextPage() { + helper.curios$nextPage(thiz); } @Override - public void inventorio$scrollToIndex(int indexIn) { - helper.curios$scrollToIndex(thiz, indexIn); + public void inventorio$prevPage() { + helper.curios$prevPage(thiz); } @Override - public boolean getInventorio$hasCosmeticColumn() { return helper.hasCosmeticColumn(); } + public void inventorio$checkQuickMove() { + helper.curios$checkQuickMove(thiz); + } + + @Override + public int getInventorio$currentPage() { return helper.getCurrentPage(); } + + @Override + public int getInventorio$totalPages() { return helper.getTotalPages(); } @Override - public boolean getInventorio$canScroll() { return helper.canScroll(); } + public @NotNull List getInventorio$grid() { return helper.getGrid(); } - @Nullable @Override - public ICuriosItemHandler getInventorio$curiosHandler() { return helper.getCuriosHandler(); } + @Override + public boolean getInventorio$hasCosmetics() { return helper.getHasCosmetics(); } + + @Override + public boolean getInventorio$isViewingCosmetics() { return helper.isViewingCosmetics(); } + + @Override + public int getInventorio$panelWidth() { return helper.getPanelWidth(); } @Inject(method = "(ILnet/minecraft/entity/player/PlayerInventory;)V", at = @At("RETURN")) private void curios$init(int syncId, PlayerInventory inventory, CallbackInfo ci) { @@ -74,6 +105,6 @@ public InventorioScreenHandlerMixin(ScreenHandlerType arg, int i) { @Inject(method = "quickMove", at = @At("HEAD"), cancellable = true) private void curios$quickMove(PlayerEntity player, int sourceIndex, CallbackInfoReturnable cir) { - helper.curios$quickMove(thiz, sourceIndex, cir); + helper.curios$quickMove(thiz, player, sourceIndex, cir); } } diff --git a/versions/1.20.4-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/InventorioScreenMixin.java b/versions/1.20.6-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/InventorioScreenMixin.java similarity index 85% rename from versions/1.20.4-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/InventorioScreenMixin.java rename to versions/1.20.6-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/InventorioScreenMixin.java index dab12b5..5da667e 100644 --- a/versions/1.20.4-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/InventorioScreenMixin.java +++ b/versions/1.20.6-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/InventorioScreenMixin.java @@ -67,7 +67,7 @@ public InventorioScreenMixin(InventorioScreenHandler arg, PlayerInventory arg2, @Inject(method = "drawBackground", at = @At("RETURN")) private void curios$drawBackground(DrawContext drawContext, float delta, int mouseX, int mouseY, CallbackInfo ci) { - helper.drawBackground(drawContext); + helper.curios$drawBackground(thiz, drawContext); } @Inject(method = "isPointWithinBounds", at = @At("HEAD"), cancellable = true) @@ -83,29 +83,12 @@ public InventorioScreenMixin(InventorioScreenHandler arg, PlayerInventory arg2, helper.isPointWithinBounds(cir); } - @Inject(method = "mouseClicked", at = @At("HEAD"), cancellable = true) - private void curios$mouseClicked(double mouseX, double mouseY, int button, CallbackInfoReturnable cir) { - helper.mouseClicked(mouseX, mouseY, cir); - } - @Inject(method = "mouseReleased", at = @At("HEAD"), cancellable = true) private void curios$mouseReleased(double mouseX, double mouseY, int button, CallbackInfoReturnable cir) { - helper.mouseReleased(button, cir); - } - - @Inject(method = "mouseDragged", at = @At("HEAD"), cancellable = true) - private void curios$mouseDragged( - double mouseX, - double mouseY, - int button, - double deltaX, - double deltaY, - CallbackInfoReturnable cir - ) { - helper.mouseDragged(mouseY, cir); + helper.mouseReleased(cir); } - @Inject(method = "mouseScrolled", at = @At("HEAD"), cancellable = true) + @Inject(method = "mouseScrolled", at = @At("HEAD")) private void curios$mouseScrolled( double mouseX, double mouseY, @@ -113,7 +96,7 @@ public InventorioScreenMixin(InventorioScreenHandler arg, PlayerInventory arg2, double verticalAmount, CallbackInfoReturnable cir ) { - helper.mouseScrolled(verticalAmount, cir); + helper.curios$mouseScrolled(thiz, mouseX, mouseY, verticalAmount); } @Inject( diff --git a/versions/1.20.4-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/InventorioScreenMixin_alternative.java b/versions/1.20.6-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/InventorioScreenMixin_alternative.java similarity index 94% rename from versions/1.20.4-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/InventorioScreenMixin_alternative.java rename to versions/1.20.6-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/InventorioScreenMixin_alternative.java index 69ac2e2..172b7d3 100644 --- a/versions/1.20.4-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/InventorioScreenMixin_alternative.java +++ b/versions/1.20.6-neoforge/src/main/java/de/rubixdev/inventorio/mixin/neoforge/curios/InventorioScreenMixin_alternative.java @@ -2,6 +2,7 @@ import de.rubixdev.inventorio.client.ui.InventorioScreen; import de.rubixdev.inventorio.integration.curios.CustomCuriosButton; +import de.rubixdev.inventorio.packet.InventorioNetworking; import de.rubixdev.inventorio.player.InventorioScreenHandler; import me.fallenbreath.conditionalmixin.api.annotation.Condition; import me.fallenbreath.conditionalmixin.api.annotation.Restriction; @@ -21,8 +22,6 @@ import top.theillusivec4.curios.client.gui.CuriosScreen; import top.theillusivec4.curios.common.network.client.CPacketOpenCurios; -import static de.rubixdev.inventorio.integration.curios.InventorioScreenHandlerMixinHelperKt.sendToServer; - @SuppressWarnings("UnresolvedMixinReference") // the Minecraft Dev plugin // doesn't seem to like Kotlin // target classes @@ -60,7 +59,7 @@ public InventorioScreenMixin_alternative(InventorioScreenHandler arg, PlayerInve client.player.currentScreenHandler.setCursorStack(ItemStack.EMPTY); if (recipeBook.isOpen()) recipeBook.toggleOpen(); - sendToServer(new CPacketOpenCurios(stack)); + InventorioNetworking.getInstance().sendToServer(new CPacketOpenCurios(stack)); } } ) diff --git a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/InventorioNeoForge.kt b/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/InventorioNeoForge.kt similarity index 87% rename from versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/InventorioNeoForge.kt rename to versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/InventorioNeoForge.kt index 21920ed..2773548 100644 --- a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/InventorioNeoForge.kt +++ b/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/InventorioNeoForge.kt @@ -7,8 +7,8 @@ import de.rubixdev.inventorio.config.PlayerSettings import de.rubixdev.inventorio.enchantment.DeepPocketsBookRecipe import de.rubixdev.inventorio.enchantment.DeepPocketsEnchantment import de.rubixdev.inventorio.integration.ClumpsIntegration +import de.rubixdev.inventorio.integration.CuriosIntegration import de.rubixdev.inventorio.integration.InventorioModIntegration -import de.rubixdev.inventorio.integration.ModIntegration import de.rubixdev.inventorio.packet.InventorioNetworking import de.rubixdev.inventorio.packet.InventorioNetworkingNeoForge import net.minecraft.client.MinecraftClient @@ -20,7 +20,7 @@ import net.neoforged.fml.ModLoadingContext import net.neoforged.fml.common.Mod import net.neoforged.fml.loading.FMLEnvironment import net.neoforged.fml.loading.FMLPaths -import net.neoforged.neoforge.client.ConfigScreenHandler +import net.neoforged.neoforge.client.gui.IConfigScreenFactory import net.neoforged.neoforge.common.NeoForge import net.neoforged.neoforge.common.ToolAction import net.neoforged.neoforge.common.ToolActions @@ -29,7 +29,7 @@ import thedarkcolour.kotlinforforge.neoforge.KotlinModLoadingContext @Mod("inventorio") class InventorioNeoForge { - private val neoForgeModIntegrations = listOf(ClumpsIntegration) + private val neoForgeModIntegrations = listOf(ClumpsIntegration, CuriosIntegration) init { ScreenTypeProvider.INSTANCE = ScreenTypeProviderNeoForge @@ -46,22 +46,16 @@ class InventorioNeoForge { recipeRegistry.register("deep_pockets_book") { -> serializer } initToolBelt() - //#if MC >= 12004 KotlinModLoadingContext.get().getKEventBus().register(InventorioNetworkingNeoForge) - //#endif if (FMLEnvironment.dist == Dist.CLIENT) { NeoForge.EVENT_BUS.register(NeoForgeEvents) KotlinModLoadingContext.get().getKEventBus().register(NeoForgeModEvents) MinecraftClient.getInstance().options.allKeys += InventorioControls.keys PlayerSettings.load(FMLPaths.CONFIGDIR.get().resolve("inventorio.json").toFile()) - //#if MC >= 12004 KotlinModLoadingContext.get().getKEventBus().register(ScreenTypeProviderNeoForge) - //#else - //$$ ScreenTypeProviderNeoForge.registerScreen() - //#endif - ModLoadingContext.get().registerExtensionPoint(ConfigScreenHandler.ConfigScreenFactory::class.java) { - ConfigScreenHandler.ConfigScreenFactory { _, parent -> PlayerSettingsScreen.get(parent) } + ModLoadingContext.get().registerExtensionPoint(IConfigScreenFactory::class.java) { + IConfigScreenFactory { _, parent -> PlayerSettingsScreen.get(parent) } } } diff --git a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/NeoForgeEvents.kt b/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/NeoForgeEvents.kt similarity index 59% rename from versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/NeoForgeEvents.kt rename to versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/NeoForgeEvents.kt index d3ec295..3c15595 100644 --- a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/NeoForgeEvents.kt +++ b/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/NeoForgeEvents.kt @@ -2,17 +2,17 @@ package de.rubixdev.inventorio import de.rubixdev.inventorio.client.control.InventorioKeyHandler import de.rubixdev.inventorio.client.ui.HotbarHUDRenderer.renderHotbarAddons -import net.minecraft.util.Identifier +import de.rubixdev.inventorio.util.id import net.neoforged.api.distmarker.Dist import net.neoforged.api.distmarker.OnlyIn import net.neoforged.bus.api.SubscribeEvent -import net.neoforged.neoforge.client.event.RegisterGuiOverlaysEvent -import net.neoforged.neoforge.event.TickEvent +import net.neoforged.neoforge.client.event.ClientTickEvent +import net.neoforged.neoforge.client.event.RegisterGuiLayersEvent @OnlyIn(Dist.CLIENT) object NeoForgeEvents { @SubscribeEvent - fun onClientTick(event: TickEvent.ClientTickEvent) { + fun onClientTick(event: ClientTickEvent.Post) { InventorioKeyHandler.tick() } } @@ -20,8 +20,8 @@ object NeoForgeEvents { @OnlyIn(Dist.CLIENT) object NeoForgeModEvents { @SubscribeEvent - fun preGuiRender(event: RegisterGuiOverlaysEvent) { - event.registerBelowAll(Identifier("inventorio", "hotbar_addons")) { _, guiGraphics, _, _, _ -> + fun preGuiRender(event: RegisterGuiLayersEvent) { + event.registerBelowAll("hotbar_addons".id) { guiGraphics, _ -> renderHotbarAddons(guiGraphics) } } diff --git a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/ScreenTypeProviderNeoForge.kt b/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/ScreenTypeProviderNeoForge.kt similarity index 80% rename from versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/ScreenTypeProviderNeoForge.kt rename to versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/ScreenTypeProviderNeoForge.kt index 2149e11..c96df88 100644 --- a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/ScreenTypeProviderNeoForge.kt +++ b/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/ScreenTypeProviderNeoForge.kt @@ -4,17 +4,12 @@ import de.rubixdev.inventorio.client.ui.InventorioScreen import de.rubixdev.inventorio.player.InventorioScreenHandler import net.minecraft.registry.Registries import net.minecraft.screen.ScreenHandlerType +import net.neoforged.bus.api.SubscribeEvent +import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent import net.neoforged.neoforge.common.extensions.IMenuTypeExtension import net.neoforged.neoforge.registries.DeferredRegister import thedarkcolour.kotlinforforge.neoforge.KotlinModLoadingContext -//#if MC >= 12004 -import net.neoforged.bus.api.SubscribeEvent -import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent -//#else -//$$ import net.minecraft.client.gui.screen.ingame.HandledScreens -//#endif - object ScreenTypeProviderNeoForge : ScreenTypeProvider { private val handlerProvider = IMenuTypeExtension.create { syncId, inv, _ -> InventorioScreenHandler(syncId, inv) @@ -30,14 +25,8 @@ object ScreenTypeProviderNeoForge : ScreenTypeProvider { return handlerProvider } - //#if MC >= 12004 @SubscribeEvent fun registerScreen(event: RegisterMenuScreensEvent) { event.register(handlerProvider) { handler, inventory, _ -> InventorioScreen(handler, inventory) } } - //#else - //$$ fun registerScreen() { - //$$ HandledScreens.register(handlerProvider) { handler, inventory, _ -> InventorioScreen(handler, inventory) } - //$$ } - //#endif } diff --git a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/ClumpsIntegration.kt b/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/ClumpsIntegration.kt similarity index 72% rename from versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/ClumpsIntegration.kt rename to versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/ClumpsIntegration.kt index 8b9938b..b97ebfc 100644 --- a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/ClumpsIntegration.kt +++ b/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/ClumpsIntegration.kt @@ -2,14 +2,10 @@ package de.rubixdev.inventorio.integration import com.blamejared.clumps.api.events.RepairEvent import de.rubixdev.inventorio.api.InventorioAPI -import net.neoforged.fml.ModList import net.neoforged.neoforge.common.NeoForge object ClumpsIntegration : ModIntegration() { - override val name = "clumps" - override val displayName = "Clumps" - - override fun shouldApply() = ModList.get().isLoaded("clumps") + override val modId = "clumps" override fun apply() { NeoForge.EVENT_BUS.addListener { event: RepairEvent -> diff --git a/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/CuriosIntegration.kt b/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/CuriosIntegration.kt new file mode 100644 index 0000000..ca0d127 --- /dev/null +++ b/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/CuriosIntegration.kt @@ -0,0 +1,23 @@ +package de.rubixdev.inventorio.integration + +import de.rubixdev.inventorio.config.GlobalSettings +import de.rubixdev.inventorio.integration.curios.ICuriosContainer +import net.minecraft.entity.player.PlayerEntity +import net.neoforged.neoforge.common.NeoForge +import net.neoforged.neoforge.event.tick.EntityTickEvent + +object CuriosIntegration : ModIntegration() { + override val modId = "curios" + + override val shouldApply: Boolean + get() = super.shouldApply && GlobalSettings.curiosIntegration.boolValue + + override fun apply() { + NeoForge.EVENT_BUS.addListener { event: EntityTickEvent.Post -> + val entity = event.entity + if (entity is PlayerEntity) { + (entity.currentScreenHandler as? ICuriosContainer)?.`inventorio$checkQuickMove`() + } + } + } +} diff --git a/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/CustomCosmeticButton.kt b/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/CustomCosmeticButton.kt new file mode 100644 index 0000000..05c2a90 --- /dev/null +++ b/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/CustomCosmeticButton.kt @@ -0,0 +1,36 @@ +package de.rubixdev.inventorio.integration.curios + +import de.rubixdev.inventorio.client.ui.InventorioScreen +import de.rubixdev.inventorio.packet.InventorioNetworking +import net.minecraft.client.gui.DrawContext +import net.minecraft.client.gui.tooltip.Tooltip +import net.minecraft.client.gui.widget.TexturedButtonWidget +import net.minecraft.text.Text +import top.theillusivec4.curios.client.gui.CosmeticButton +import top.theillusivec4.curios.common.network.client.CPacketToggleCosmetics + +class CustomCosmeticButton( + private val parentGui: InventorioScreen, + x: Int, + y: Int, + width: Int, + height: Int, +) : TexturedButtonWidget(x, y, width, height, CosmeticButton.OFF, { + (parentGui.screenHandler as ICuriosContainer).`inventorio$toggleCosmetics`() + InventorioNetworking.INSTANCE.sendToServer(CPacketToggleCosmetics(parentGui.screenHandler.syncId)) +}) { + init { + tooltip = Tooltip.of(Text.translatable("gui.curios.toggle.cosmetics")) + } + + override fun renderWidget(context: DrawContext, mouseX: Int, mouseY: Int, delta: Float) { + val sprites = when ((parentGui.screenHandler as ICuriosContainer).`inventorio$isViewingCosmetics`) { + true -> CosmeticButton.ON + false -> CosmeticButton.OFF + } + x = parentGui.guiLeft - 27 + y = parentGui.guiTop - 18 + val identifier = sprites.get(isNarratable, isSelected) + context.drawGuiTexture(identifier, x, y, width, height) + } +} diff --git a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/CustomCuriosButton.kt b/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/CustomCuriosButton.kt similarity index 100% rename from versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/CustomCuriosButton.kt rename to versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/CustomCuriosButton.kt diff --git a/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/CustomPageButton.kt b/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/CustomPageButton.kt new file mode 100644 index 0000000..4b6928d --- /dev/null +++ b/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/CustomPageButton.kt @@ -0,0 +1,53 @@ +package de.rubixdev.inventorio.integration.curios + +import de.rubixdev.inventorio.client.ui.InventorioScreen +import de.rubixdev.inventorio.integration.curios.InventorioScreenMixinHelper.Companion.CURIO_INVENTORY +import de.rubixdev.inventorio.packet.InventorioNetworking +import net.minecraft.client.MinecraftClient +import net.minecraft.client.gui.DrawContext +import net.minecraft.client.gui.widget.ButtonWidget +import net.minecraft.screen.ScreenTexts +import net.minecraft.text.Text +import top.theillusivec4.curios.client.gui.PageButton +import top.theillusivec4.curios.common.network.client.CPacketPage + +class CustomPageButton( + private val parentGui: InventorioScreen, + x: Int, + y: Int, + width: Int, + height: Int, + private val type: PageButton.Type, +) : ButtonWidget(x, y, width, height, ScreenTexts.EMPTY, { + InventorioNetworking.INSTANCE.sendToServer(CPacketPage(parentGui.screenHandler.syncId, type == PageButton.Type.NEXT)) +}, DEFAULT_NARRATION_SUPPLIER) { + override fun renderWidget(context: DrawContext, mouseX: Int, mouseY: Int, delta: Float) { + val curiosHandler = parentGui.screenHandler as ICuriosContainer + var xText = if (type == PageButton.Type.NEXT) 43 else 32 + var yText = 25 + + if (type == PageButton.Type.NEXT) { + x = parentGui.guiLeft - 17 + active = curiosHandler.`inventorio$currentPage` + 1 < curiosHandler.`inventorio$totalPages` + } else { + x = parentGui.guiLeft - 28 + active = curiosHandler.`inventorio$currentPage` > 0 + } + + if (!isNarratable) { + yText += 12 + } else if (isSelected) { + xText += 22 + } + + if (isHovered) { + context.drawTooltip( + MinecraftClient.getInstance().textRenderer, + Text.translatable("gui.curios.page", curiosHandler.`inventorio$currentPage` + 1, curiosHandler.`inventorio$totalPages`), + x, + y, + ) + } + context.drawTexture(CURIO_INVENTORY, x, y, xText, yText, width, height) + } +} diff --git a/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/ICuriosContainer.kt b/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/ICuriosContainer.kt new file mode 100644 index 0000000..bb5f84e --- /dev/null +++ b/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/ICuriosContainer.kt @@ -0,0 +1,17 @@ +package de.rubixdev.inventorio.integration.curios + +@Suppress("FunctionName", "PropertyName") +interface ICuriosContainer { + fun `inventorio$resetSlots`() + fun `inventorio$setPage`(page: Int) + fun `inventorio$toggleCosmetics`() + fun `inventorio$nextPage`() + fun `inventorio$prevPage`() + fun `inventorio$checkQuickMove`() + val `inventorio$currentPage`: Int + val `inventorio$totalPages`: Int + val `inventorio$grid`: List + val `inventorio$hasCosmetics`: Boolean + val `inventorio$isViewingCosmetics`: Boolean + val `inventorio$panelWidth`: Int +} diff --git a/versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/ICuriosScreen.kt b/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/ICuriosScreen.kt similarity index 100% rename from versions/1.20.1-forge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/ICuriosScreen.kt rename to versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/ICuriosScreen.kt diff --git a/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/InventorioScreenHandlerMixinHelper.kt b/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/InventorioScreenHandlerMixinHelper.kt new file mode 100644 index 0000000..40eceb1 --- /dev/null +++ b/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/InventorioScreenHandlerMixinHelper.kt @@ -0,0 +1,273 @@ +package de.rubixdev.inventorio.integration.curios + +import de.rubixdev.inventorio.mixin.accessor.ScreenHandlerAccessor +import de.rubixdev.inventorio.packet.InventorioNetworking +import de.rubixdev.inventorio.player.InventorioScreenHandler +import de.rubixdev.inventorio.player.InventorioScreenHandler.Companion.deepPocketsRange +import de.rubixdev.inventorio.player.InventorioScreenHandler.Companion.mainInventoryRange +import de.rubixdev.inventorio.player.InventorioScreenHandler.Companion.toolBeltRange +import de.rubixdev.inventorio.util.insertItem +import de.rubixdev.inventorio.util.isNotEmpty +import de.rubixdev.inventorio.util.subList +import kotlin.math.ceil +import kotlin.math.max +import kotlin.math.min +import net.minecraft.entity.player.PlayerEntity +import net.minecraft.item.ItemStack +import net.minecraft.screen.slot.Slot +import net.minecraft.server.network.ServerPlayerEntity +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable +import top.theillusivec4.curios.api.CuriosApi +import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler +import top.theillusivec4.curios.common.CuriosConfig +import top.theillusivec4.curios.common.inventory.CurioSlot +import top.theillusivec4.curios.common.network.server.SPacketPage +import top.theillusivec4.curios.common.network.server.SPacketQuickMove + +/** + * This is basically a re-implementation of https://github.com/TheIllusiveC4/Curios/blob/ab847aab52213afd87c78f48ad9382212846f1b7/neoforge/src/main/java/top/theillusivec4/curios/common/inventory/container/CuriosContainer.java + * with adjustments for the Inventorio screen (and in Kotlin). + */ +@Suppress("FunctionName") +class InventorioScreenHandlerMixinHelper( + thiz: InventorioScreenHandler, +) { + val player: PlayerEntity = thiz.inventory.player + + private val curiosHandler: ICuriosItemHandler? = CuriosApi.getCuriosInventory(player).orElse(null) + + private val isLocalWorld = player.world.isClient + private var curiosSlotRange = toolBeltRange.last + 1..() + private val proxySlots = mutableListOf() + private var moveToPage = -1 + private var moveFromIndex = -1 + var hasCosmetics = false + private set + var isViewingCosmetics = false + private set + var panelWidth = 0 + + private val thiss = thiz as ScreenHandlerAccessor + + fun InventorioScreenHandler.`curios$init`() { + `curios$resetSlots`() + } + + fun InventorioScreenHandler.`curios$resetSlots`() = `curios$setPage`(currentPage) + + fun InventorioScreenHandler.`curios$setPage`(page: Int) { + slots.subList(curiosSlotRange).clear() + thiss.trackedStacks.subList(curiosSlotRange).clear() + thiss.previousTrackedStacks.subList(curiosSlotRange).clear() + panelWidth = 0 + var visibleSlots: Int + val maxSlotsPerPage: Int = CuriosConfig.SERVER.maxSlotsPerPage.get() + val startingIndex = page * maxSlotsPerPage + var columns: Int + val curiosSlotStart = slots.size + + if (curiosHandler != null) { + visibleSlots = curiosHandler.visibleSlots + val slotsOnPage = min(maxSlotsPerPage, visibleSlots - startingIndex) + val calculatedColumns = ceil(slotsOnPage.toDouble() / 8).toInt() + val minimumColumns = min(slotsOnPage, CuriosConfig.SERVER.minimumColumns.get()) + columns = calculatedColumns.coerceIn(minimumColumns, 8) + panelWidth = 14 + 18 * columns + + val curioMap = curiosHandler.curios + totalPages = ceil(visibleSlots.toDouble() / maxSlotsPerPage).toInt() + var index = 0 + var yOffset = 8 + + if (totalPages > 1) { + yOffset += 8 + } + var currentColumn = 1 + var currentRow = 1 + var slots = 0 + grid.clear() + proxySlots.clear() + var currentPage = 0 + val endingIndex = startingIndex + maxSlotsPerPage + + for ((identifier, stacksHandler) in curioMap.entries) { + var isCosmetic = false + var stackHandler = stacksHandler.stacks + + if (stacksHandler.hasCosmetic()) { + hasCosmetics = true + + if (isViewingCosmetics) { + isCosmetic = true + stackHandler = stacksHandler.cosmeticStacks + } + } + + if (stacksHandler.isVisible) { + for (i in 0..= maxSlotsPerPage) { + slots = 0 + currentPage++ + } + index++ + } + } + } + + if (!isLocalWorld) { + InventorioNetworking.INSTANCE.sendToPlayer(player as ServerPlayerEntity, SPacketPage(syncId, page)) + } + } + currentPage = page + curiosSlotRange = curiosSlotStart..) { + // TODO: quick move also works while the client has the curios stuff closed, but to fix that I'd have to sync the + // open status using custom packets which is a bit too much for just mod compat + val slot = slots[sourceIndex] + if (slot.hasStack()) { + val stack = slot.stack + if (sourceIndex in curiosSlotRange) { + val availableDeepPocketsRange = getAvailableDeepPocketsRange() + cir.returnValue = if (!insertItem(stack, mainInventoryRange) + && !(!availableDeepPocketsRange.isEmpty() && insertItem(stack, availableDeepPocketsRange)) + ) { + ItemStack.EMPTY + } else { + stack + } + } else if ((sourceIndex in mainInventoryRange || sourceIndex in deepPocketsRange) + && CuriosApi.getItemStackSlots(stack, player.world).isNotEmpty() + && !insertItem(stack, curiosSlotRange) + ) { + val page = findAvailableSlot(stack) + + if (page != 1) { + moveToPage = page + moveFromIndex = sourceIndex + } + cir.returnValue = ItemStack.EMPTY + } + } + } + + private fun findAvailableSlot(stack: ItemStack): Int { + var result = -1 + + if (stack.isStackable) { + for (proxySlot in proxySlots) { + val slot = proxySlot.slot + val itemStack = slot.stack + + if (itemStack.isNotEmpty && ItemStack.areItemsAndComponentsEqual(stack, itemStack)) { + val j = itemStack.count + stack.count + val maxSize = min(slot.maxItemCount, stack.maxCount) + + if (j <= maxSize || itemStack.count < maxSize) { + result = proxySlot.page + break + } + } + } + } + + if (stack.isNotEmpty && result == -1) { + for (proxySlot in proxySlots) { + val slot1 = proxySlot.slot + val itemStack1 = slot1.stack + if (itemStack1.isEmpty && slot1.canInsert(stack)) { + result = proxySlot.page + break + } + } + } + return result + } + + fun InventorioScreenHandler.`curios$nextPage`() { + `curios$setPage`(min(currentPage + 1, totalPages - 1)) + } + + fun InventorioScreenHandler.`curios$prevPage`() { + `curios$setPage`(max(currentPage - 1, 0)) + } + + fun InventorioScreenHandler.`curios$checkQuickMove`() { + if (moveToPage != -1) { + `curios$setPage`(moveToPage) + quickMove(player, moveFromIndex) + moveToPage = -1 + + if (!isLocalWorld) { + InventorioNetworking.INSTANCE.sendToPlayer(player as ServerPlayerEntity, SPacketQuickMove(syncId, moveFromIndex)) + } + } + } + + private data class ProxySlot(val page: Int, val slot: Slot) +} diff --git a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/InventorioScreenMixinHelper.kt b/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/InventorioScreenMixinHelper.kt similarity index 53% rename from versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/InventorioScreenMixinHelper.kt rename to versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/InventorioScreenMixinHelper.kt index 1d95225..4e8824b 100644 --- a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/InventorioScreenMixinHelper.kt +++ b/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/integration/curios/InventorioScreenMixinHelper.kt @@ -1,27 +1,30 @@ package de.rubixdev.inventorio.integration.curios +import com.mojang.blaze3d.systems.RenderSystem import de.rubixdev.inventorio.client.ui.InventorioScreen import de.rubixdev.inventorio.config.PlayerSettings import de.rubixdev.inventorio.mixin.client.accessor.HandledScreenAccessor +import de.rubixdev.inventorio.packet.InventorioNetworking import de.rubixdev.inventorio.util.MixinDelegate -import kotlin.math.min +import de.rubixdev.inventorio.util.id import net.minecraft.client.MinecraftClient import net.minecraft.client.gui.DrawContext import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget import net.minecraft.client.gui.widget.TexturedButtonWidget import net.minecraft.text.Text -import net.minecraft.util.Identifier import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable import top.theillusivec4.curios.api.CuriosApi import top.theillusivec4.curios.client.gui.CuriosButton import top.theillusivec4.curios.client.gui.CuriosScreen +import top.theillusivec4.curios.client.gui.PageButton import top.theillusivec4.curios.client.gui.RenderButton import top.theillusivec4.curios.common.inventory.CosmeticCurioSlot import top.theillusivec4.curios.common.inventory.CurioSlot +import top.theillusivec4.curios.common.network.client.CPacketPage import top.theillusivec4.curios.common.network.client.CPacketToggleRender /** - * This is basically a re-implementation of https://github.com/TheIllusiveC4/Curios/blob/7bd447467d1a881d9217ebf938337723fafaabf4/neoforge/src/main/java/top/theillusivec4/curios/client/gui/CuriosScreen.java + * This is basically a re-implementation of https://github.com/TheIllusiveC4/Curios/blob/ab847aab52213afd87c78f48ad9382212846f1b7/neoforge/src/main/java/top/theillusivec4/curios/client/gui/CuriosScreen.java * for the Inventorio screen (and in Kotlin). */ @Suppress("FunctionName") @@ -30,22 +33,23 @@ class InventorioScreenMixinHelper( private val recipeBook: RecipeBookWidget, ) { companion object { - private val CURIO_INVENTORY = Identifier("curios", "textures/gui/curios/inventory.png") - private val SCROLLER = Identifier("container/creative_inventory/scroller") + val CURIO_INVENTORY = "textures/gui/curios/inventory.png".id("curios") - var currentScroll = 0f + private var scrollCooldown = 0 } var isCuriosOpen = false private set - private var hasScrollbar = false private lateinit var buttonCurios: TexturedButtonWidget + private lateinit var cosmeticButton: CustomCosmeticButton + private lateinit var nextPage: CustomPageButton + private lateinit var prevPage: CustomPageButton private var wasRecipeBookOpen = mutableListOf(false) private var wasCuriosOpen = mutableListOf(false) - private var isScrolling = false private var buttonClicked = false private var isRenderButtonHovered = false + private var panelWidth = 0 private val handler get() = thiss.handler private val curioHandler get() = handler as ICuriosContainer @@ -58,18 +62,13 @@ class InventorioScreenMixinHelper( private var y by MixinDelegate(thiss::getY, thiss::setY) fun InventorioScreen.`curios$init`() { - thiss.client?.also { client -> - client.player?.also { player -> - hasScrollbar = CuriosApi.getCuriosInventory(player).map { it.visibleSlots > 0 }.orElse(false) - if (hasScrollbar) { - curioHandler.`inventorio$scrollTo`(currentScroll) - } - } + thiss.client?.also { _ -> + panelWidth = curioHandler.`inventorio$panelWidth` val offsets = CuriosScreen.getButtonOffset(false) buttonCurios = CustomCuriosButton( thiz, - x + offsets.left + 2, + guiLeft + offsets.left - 2, height / 2 + offsets.right + 2, 10, 10, @@ -117,27 +116,40 @@ class InventorioScreenMixinHelper( } fun InventorioScreen.`curios$updateRenderButtons`() { - thiss.selectables.removeIf { it is RenderButton } - thiss.children.removeIf { it is RenderButton } - drawables.removeIf { it is RenderButton } + thiss.selectables.removeIf { it is RenderButton || it is CustomCosmeticButton || it is CustomPageButton } + thiss.children.removeIf { it is RenderButton || it is CustomCosmeticButton || it is CustomPageButton } + drawables.removeIf { it is RenderButton || it is CustomCosmeticButton || it is CustomPageButton } + panelWidth = curioHandler.`inventorio$panelWidth` if (!isCuriosOpen) return + if (curioHandler.`inventorio$hasCosmetics`) { + cosmeticButton = CustomCosmeticButton(thiz, guiLeft + 17, guiTop - 18, 20, 17) + thiss.callAddDrawableChild(cosmeticButton) + } + + if (curioHandler.`inventorio$totalPages` > 1) { + nextPage = CustomPageButton(thiz, guiLeft + 17, guiTop + 2, 11, 12, PageButton.Type.NEXT) + thiss.callAddDrawableChild(nextPage) + prevPage = CustomPageButton(thiz, guiLeft + 17, guiTop + 2, 11, 12, PageButton.Type.PREVIOUS) + thiss.callAddDrawableChild(prevPage) + } + for (inventorySlot in handler.slots) { if (inventorySlot is CurioSlot && inventorySlot !is CosmeticCurioSlot) { if (inventorySlot.canToggleRender()) { thiss.callAddDrawableChild( RenderButton( inventorySlot, - x + inventorySlot.x + 11, - y + inventorySlot.y - 3, + x + inventorySlot.x + 12, + y + inventorySlot.y - 1, 8, 8, 75, 0, CURIO_INVENTORY, ) { - sendToServer(CPacketToggleRender(inventorySlot.identifier, inventorySlot.slotIndex)) + InventorioNetworking.INSTANCE.sendToServer(CPacketToggleRender(inventorySlot.identifier, inventorySlot.slotIndex)) }, ) } @@ -145,21 +157,6 @@ class InventorioScreenMixinHelper( } } - private fun inScrollbar(mouseX: Double, mouseY: Double): Boolean { - if (!isCuriosOpen) return false - val i = x - val j = y - var k = i - 34 - val l = j + 12 - var i1 = k + 14 - val j1 = l + 139 - if (curioHandler.`inventorio$hasCosmeticColumn`) { - i1 -= 19 - k -= 19 - } - return mouseX >= k && mouseY >= l && mouseX < i1 && mouseY < j1 - } - fun InventorioScreen.`curios$render`(context: DrawContext, mouseX: Int, mouseY: Int, delta: Float) { var isButtonHovered = false for (button in drawables.filterIsInstance()) { @@ -185,75 +182,122 @@ class InventorioScreenMixinHelper( } } - fun drawBackground(drawContext: DrawContext) { + fun InventorioScreen.`curios$drawBackground`(drawContext: DrawContext) { if (!isCuriosOpen) return thiss.client?.player?.let { player -> + if (scrollCooldown > 0 && player.age % 5 == 0) scrollCooldown-- + panelWidth = curioHandler.`inventorio$panelWidth` val i = x val j = y - CuriosApi.getCuriosInventory(player).ifPresent { handler -> - val slotCount = handler.visibleSlots - if (slotCount <= 0) return@ifPresent - val upperHeight = 7 + min(slotCount, 9) * 18 - var xTexOffset = 0 - var width = 27 - var xOffset = -26 - if (curioHandler.`inventorio$hasCosmeticColumn`) { - xTexOffset = 92 - width = 46 - xOffset -= 19 + CuriosApi.getCuriosInventory(player).ifPresent { + var xOffset = -33 + var yOffset = j + val pageOffset = curioHandler.`inventorio$totalPages` > 1 + + if (curioHandler.`inventorio$hasCosmetics`) { + drawContext.drawTexture( + CURIO_INVENTORY, + i + xOffset + 2, + yOffset - 23, + 32, + 0, + 28, + 24, + ) } - drawContext.drawTexture( - CURIO_INVENTORY, - i + xOffset, - j + 4, - xTexOffset, - 0, - width, - upperHeight, - ) - - if (slotCount <= 8) { + val grid = curioHandler.`inventorio$grid` + xOffset -= (grid.size - 1) * 18 + + // render backplate + for (r in 0..()) { - val x = x + slot.x - 1 - val y = y + slot.y - 1 drawContext.drawTexture( CURIO_INVENTORY, - x, - y, - 138, - 0, - 18, + i + xOffset, + yOffset + 7, + 7, + 7, 18, + upperHeight, ) + xOffset += 18 + } + RenderSystem.enableBlend() + + for (slot in handler.slots) { + if (slot is CurioSlot && slot.isCosmetic) { + drawContext.drawTexture( + CURIO_INVENTORY, + slot.x + guiLeft - 1, + slot.y + guiTop - 1, + 32, + 50, + 18, + 18, + ) + } } + RenderSystem.disableBlend() } } } @@ -262,42 +306,23 @@ class InventorioScreenMixinHelper( if (isRenderButtonHovered) cir.returnValue = false } - fun mouseClicked(mouseX: Double, mouseY: Double, cir: CallbackInfoReturnable) { - if (inScrollbar(mouseX, mouseY)) { - isScrolling = curioHandler.`inventorio$canScroll` - cir.returnValue = true - } - } - - fun mouseReleased(button: Int, cir: CallbackInfoReturnable) { - if (button == 0) { - isScrolling = false - } + fun mouseReleased(cir: CallbackInfoReturnable) { if (buttonClicked) { buttonClicked = false cir.returnValue = true } } - fun mouseDragged(mouseY: Double, cir: CallbackInfoReturnable) { - if (isScrolling) { - val i = y + 8 - val j = i + 148 - currentScroll = ((mouseY.toFloat() - i - 7.5f) / (j - i - 15f)).coerceIn(0f, 1f) - curioHandler.`inventorio$scrollTo`(currentScroll) - cir.returnValue = true - } - } - - fun mouseScrolled(verticalAmount: Double, cir: CallbackInfoReturnable) { - if (curioHandler.`inventorio$canScroll` && isCuriosOpen) { - var i = 1 - curioHandler.`inventorio$curiosHandler`?.let { handler -> - i = handler.visibleSlots - } - currentScroll = (currentScroll - verticalAmount / i).toFloat().coerceIn(0f, 1f) - curioHandler.`inventorio$scrollTo`(currentScroll) - cir.returnValue = true + fun InventorioScreen.`curios$mouseScrolled`( + mouseX: Double, + mouseY: Double, + verticalAmount: Double, + ) { + if (curioHandler.`inventorio$totalPages` > 1 && mouseX < guiLeft && mouseX > guiLeft - panelWidth + && mouseY > guiTop && mouseY < guiTop + thiss.backgroundHeight && scrollCooldown <= 0 + ) { + InventorioNetworking.INSTANCE.sendToServer(CPacketPage(handler.syncId, verticalAmount < 0)) + scrollCooldown = 2 } } } diff --git a/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/InventorioNetworkingNeoForge.kt b/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/InventorioNetworkingNeoForge.kt new file mode 100644 index 0000000..c4fbe07 --- /dev/null +++ b/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/packet/InventorioNetworkingNeoForge.kt @@ -0,0 +1,86 @@ +package de.rubixdev.inventorio.packet + +import java.util.concurrent.Executor +import net.minecraft.network.packet.CustomPayload +import net.minecraft.server.network.ServerPlayerEntity +import net.neoforged.api.distmarker.Dist +import net.neoforged.api.distmarker.OnlyIn +import net.neoforged.bus.api.SubscribeEvent +import net.neoforged.neoforge.network.PacketDistributor +import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent +import net.neoforged.neoforge.network.handling.DirectionalPayloadHandler +import net.neoforged.neoforge.network.handling.IPayloadContext + +fun consumeClient(consumer: T.(Executor) -> Unit) = + { payload: T, ctx: IPayloadContext -> + payload.consumer { ctx.enqueueWork(it) } + } + +fun consumeServer(consumer: T.(Executor, ServerPlayerEntity) -> Unit) = + { payload: T, ctx: IPayloadContext -> + payload.consumer({ ctx.enqueueWork(it) }, ctx.player() as ServerPlayerEntity) + } + +object InventorioNetworkingNeoForge : InventorioNetworking { + private const val PROTOCOL_VERSION = "1.9" + + @SubscribeEvent + fun registerPayloads(event: RegisterPayloadHandlersEvent) { + val registrar = event.registrar("inventorio").versioned(PROTOCOL_VERSION) + + registrar.playBidirectional( + SelectUtilitySlotPacket.ID, + SelectUtilitySlotPacket.CODEC, + DirectionalPayloadHandler( + consumeClient(SelectUtilitySlotPacket::consume), + consumeServer(SelectUtilitySlotPacket::consume), + ), + ) + + registrar.playToClient( + GlobalSettingsS2CPacket.ID, + GlobalSettingsS2CPacket.CODEC, + consumeClient(GlobalSettingsS2CPacket::consume), + ) + registrar.playToClient( + UpdateAddonStacksS2CPacket.ID, + UpdateAddonStacksS2CPacket.CODEC, + consumeClient(UpdateAddonStacksS2CPacket::consume), + ) + + registrar.playToServer( + UseBoostRocketC2SPacket.ID, + UseBoostRocketC2SPacket.CODEC, + consumeServer(UseBoostRocketC2SPacket::consume), + ) + registrar.playToServer( + SwappedHandsModeC2SPacket.ID, + SwappedHandsModeC2SPacket.CODEC, + consumeServer(SwappedHandsModeC2SPacket::consume), + ) + registrar.playToServer( + MoveItemToUtilityBeltC2SPacket.ID, + MoveItemToUtilityBeltC2SPacket.CODEC, + consumeServer(MoveItemToUtilityBeltC2SPacket::consume), + ) + registrar.playToServer( + OpenInventorioScreenC2SPacket.ID, + OpenInventorioScreenC2SPacket.CODEC, + consumeServer(OpenInventorioScreenC2SPacket::consume), + ) + registrar.playToServer( + SwapItemsInHandsKeyC2SPacket.ID, + SwapItemsInHandsKeyC2SPacket.CODEC, + consumeServer(SwapItemsInHandsKeyC2SPacket::consume), + ) + } + + override fun sendToPlayer(player: ServerPlayerEntity, packet: CustomPayload) { + PacketDistributor.sendToPlayer(player, packet) + } + + @OnlyIn(Dist.CLIENT) + override fun sendToServer(packet: CustomPayload) { + PacketDistributor.sendToServer(packet) + } +} diff --git a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/util/PlatformApi.kt b/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/util/PlatformApi.kt similarity index 57% rename from versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/util/PlatformApi.kt rename to versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/util/PlatformApi.kt index 5862712..dc56643 100644 --- a/versions/1.20.4-neoforge/src/main/kotlin/de/rubixdev/inventorio/util/PlatformApi.kt +++ b/versions/1.20.6-neoforge/src/main/kotlin/de/rubixdev/inventorio/util/PlatformApi.kt @@ -4,4 +4,5 @@ import net.neoforged.fml.ModList object PlatformApi { fun isModLoaded(modId: String): Boolean = ModList.get().isLoaded(modId) + fun modDisplayname(modId: String): String? = ModList.get().getModContainerById(modId).orElse(null)?.modInfo?.displayName } diff --git a/versions/1.20.4-neoforge/src/main/resources/META-INF/mods.toml b/versions/1.20.6-neoforge/src/main/resources/META-INF/neoforge.mods.toml similarity index 91% rename from versions/1.20.4-neoforge/src/main/resources/META-INF/mods.toml rename to versions/1.20.6-neoforge/src/main/resources/META-INF/neoforge.mods.toml index 44c3474..b2ea07e 100644 --- a/versions/1.20.4-neoforge/src/main/resources/META-INF/mods.toml +++ b/versions/1.20.6-neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -1,5 +1,5 @@ modLoader = "kotlinforforge" -loaderVersion = "[${forge_kotlin_version},)" +loaderVersion = "[${neoforge_kotlin_version},)" issueTrackerURL = "${issues_url}" license = "${license}" @@ -34,6 +34,6 @@ side = "BOTH" [[dependencies.${mod_id}]] modId = "cloth_config" type = "required" -versionRange = "[10,)" +versionRange = "[14,)" ordering = "NONE" side = "CLIENT" diff --git a/versions/1.20.4-neoforge/src/main/resources/inventorio-neoforge.mixins.json b/versions/1.20.6-neoforge/src/main/resources/inventorio-neoforge.mixins.json similarity index 74% rename from versions/1.20.4-neoforge/src/main/resources/inventorio-neoforge.mixins.json rename to versions/1.20.6-neoforge/src/main/resources/inventorio-neoforge.mixins.json index 3386cf0..54bc30b 100644 --- a/versions/1.20.4-neoforge/src/main/resources/inventorio-neoforge.mixins.json +++ b/versions/1.20.6-neoforge/src/main/resources/inventorio-neoforge.mixins.json @@ -1,17 +1,15 @@ { "required": true, "package": "de.rubixdev.inventorio.mixin.neoforge", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "minVersion": "0.8", "plugin": "de.rubixdev.inventorio.InventorioMixinPlugin", "mixins": [ - "curios.CuriosEventHandlerMixin", "curios.CuriosServerPayloadHandlerMixin", - "curios.CurioStacksHandlerMixin", "curios.InventorioScreenHandlerMixin" ], "client": [ - "curios.CuriosClientPayloadHandlerMixin", + "curios.CuriosClientPacketsMixin", "curios.HandledScreenMixin", "curios.InventorioScreenMixin", "curios.InventorioScreenMixin_alternative" diff --git a/versions/mainProject b/versions/mainProject index d788022..4e0be95 100644 --- a/versions/mainProject +++ b/versions/mainProject @@ -1 +1 @@ -1.20.4-common \ No newline at end of file +1.20.6-common \ No newline at end of file diff --git a/versions/mappings-common-forge.txt b/versions/mappings-common-forge.txt deleted file mode 100644 index eec88bd..0000000 --- a/versions/mappings-common-forge.txt +++ /dev/null @@ -1,3 +0,0 @@ -net.fabricmc.api.Environment net.minecraftforge.api.distmarker.OnlyIn -net.fabricmc.api.EnvType net.minecraftforge.api.distmarker.Dist -net.fabricmc.api.EnvType SERVER net.minecraftforge.api.distmarker.Dist DEDICATED_SERVER diff --git a/versions/mappings-common-neoforge.txt b/versions/mappings-common-neoforge.txt index 922187d..5361410 100644 --- a/versions/mappings-common-neoforge.txt +++ b/versions/mappings-common-neoforge.txt @@ -1,3 +1,5 @@ net.fabricmc.api.Environment net.neoforged.api.distmarker.OnlyIn net.fabricmc.api.EnvType net.neoforged.api.distmarker.Dist net.fabricmc.api.EnvType SERVER net.neoforged.api.distmarker.Dist DEDICATED_SERVER + +net.minecraft.server.network.ServerCommonNetworkHandler sendPacket() send()