diff --git a/build.gradle b/build.gradle index 949c883..93b1223 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ import net.fabricmc.loom.task.RemapJarTask plugins { - id 'org.quiltmc.loom' version '1.6.+' + id 'fabric-loom' version '1.9-SNAPSHOT' id 'io.github.ladysnake.chenille' version '0.13.1' id 'maven-publish' } @@ -49,8 +49,8 @@ repositories { dependencies { // To change the versions see the gradle.properties file minecraft "com.mojang:minecraft:${project.minecraft_version}" - mappings "org.quiltmc:quilt-mappings:${minecraft_version}+build.${quilt_mappings}:intermediary-v2" - modImplementation "org.quiltmc:quilt-loader:${project.loader_version}" + mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" + modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_api_version}" @@ -60,7 +60,7 @@ dependencies { compileOnly "com.demonwav.mcdev:annotations:1.0" - modCompileOnly "maven.modrinth:backslot:${backslot_version}" // not updated yet + modCompileOnly "maven.modrinth:backslot:${backslot_version}" modLocalRuntime ("me.shedaniel.cloth:cloth-config-fabric:${cloth_config_version}") { transitive = false } modLocalRuntime ("com.terraformersmc:modmenu:${modmenu_version}") { transitive = false } diff --git a/gradle.properties b/gradle.properties index 8d9f9ff..51d7ba4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,21 +3,21 @@ org.gradle.jvmargs=-Xmx3G # Fabric Properties # check these on https://fabricmc.net/use - minecraft_version = 1.21 - quilt_mappings = 1 - loader_version=0.26.0 + minecraft_version = 1.21.1 + yarn_mappings=1.21.1+build.3 + loader_version=0.16.9 # Mod Properties - mod_version = 0.13.0 + mod_version = 0.14.0 maven_group = org.ladysnake archives_base_name = locki # Dependencies - fabric_api_version = 0.100.1+1.21 + fabric_api_version = 0.110.0+1.21.1 cca_version = 6.1.0 fpa_version=0.2-SNAPSHOT # V1.2.12 - backslot_version=1.2.15+1.20.6 + backslot_version=1.2.16+1.21.1 cloth_config_version=15.0.127 modmenu_version=11.0.0-rc.2 elmendorf_version=0.13.0 @@ -28,7 +28,6 @@ org.gradle.jvmargs=-Xmx3G gpl_version = 3 curseforge_id = 483059 modrinth_id = qS8U15sj - curseforge_versions = 1.21 - cf_requirements = qsl + curseforge_versions = 1.21.1 cf_embeddeds = cardinal-components-api release_type = beta diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 17655d0..e48eca5 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/junit-loader/build.gradle b/junit-loader/build.gradle index 75324ba..c54d701 100644 --- a/junit-loader/build.gradle +++ b/junit-loader/build.gradle @@ -2,24 +2,16 @@ plugins { id 'java-library' } -sourceCompatibility = JavaVersion.VERSION_1_8 -targetCompatibility = JavaVersion.VERSION_1_8 +sourceCompatibility = JavaVersion.VERSION_21 +targetCompatibility = JavaVersion.VERSION_21 -archivesBaseName = "quilt-loader-junit" +archivesBaseName = "fabric-loader-junit" version = rootProject.version group = rootProject.group repositories { mavenCentral() - maven { - name = 'Quilt' - url = 'https://maven.quiltmc.org/repository/release' - } - maven { - name = 'Quilt Snapshots' - url = 'https://maven.quiltmc.org/repository/snapshot' - } maven { name = 'Fabric' url = 'https://maven.fabricmc.net/' @@ -27,7 +19,7 @@ repositories { } dependencies { - compileOnly "org.quiltmc:quilt-loader:${project.loader_version}" + compileOnly "net.fabricmc:fabric-loader:${project.loader_version}" api platform("org.junit:junit-bom:5.9.2") api "org.junit.jupiter:junit-jupiter-engine" diff --git a/junit-loader/src/main/java/org/ladysnake/junitloader/QuiltLoaderLauncherSessionListener.java b/junit-loader/src/main/java/org/ladysnake/junitloader/FabricLoaderLauncherSessionListener.java similarity index 86% rename from junit-loader/src/main/java/org/ladysnake/junitloader/QuiltLoaderLauncherSessionListener.java rename to junit-loader/src/main/java/org/ladysnake/junitloader/FabricLoaderLauncherSessionListener.java index 2b780ae..5166721 100644 --- a/junit-loader/src/main/java/org/ladysnake/junitloader/QuiltLoaderLauncherSessionListener.java +++ b/junit-loader/src/main/java/org/ladysnake/junitloader/FabricLoaderLauncherSessionListener.java @@ -17,15 +17,15 @@ package org.ladysnake.junitloader; import net.fabricmc.api.EnvType; +import net.fabricmc.loader.impl.launch.knot.Knot; +import net.fabricmc.loader.impl.util.SystemProperties; import org.junit.platform.launcher.LauncherSession; import org.junit.platform.launcher.LauncherSessionListener; -import org.quiltmc.loader.impl.launch.knot.Knot; -import org.quiltmc.loader.impl.util.SystemProperties; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -public class QuiltLoaderLauncherSessionListener implements LauncherSessionListener { +public class FabricLoaderLauncherSessionListener implements LauncherSessionListener { static { System.setProperty(SystemProperties.DEVELOPMENT, "true"); } @@ -34,7 +34,7 @@ public class QuiltLoaderLauncherSessionListener implements LauncherSessionListen private ClassLoader launcherSessionClassLoader; - public QuiltLoaderLauncherSessionListener() throws InvocationTargetException, IllegalAccessException, NoSuchMethodException { + public FabricLoaderLauncherSessionListener() throws InvocationTargetException, IllegalAccessException, NoSuchMethodException { final Thread currentThread = Thread.currentThread(); final ClassLoader originalClassLoader = currentThread.getContextClassLoader(); diff --git a/junit-loader/src/main/resources/META-INF/services/org.junit.platform.launcher.LauncherSessionListener b/junit-loader/src/main/resources/META-INF/services/org.junit.platform.launcher.LauncherSessionListener index 5651338..e86f03b 100644 --- a/junit-loader/src/main/resources/META-INF/services/org.junit.platform.launcher.LauncherSessionListener +++ b/junit-loader/src/main/resources/META-INF/services/org.junit.platform.launcher.LauncherSessionListener @@ -1 +1 @@ -org.ladysnake.junitloader.QuiltLoaderLauncherSessionListener \ No newline at end of file +org.ladysnake.junitloader.FabricLoaderLauncherSessionListener \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 0ee0364..6980964 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,9 +1,5 @@ pluginManagement { repositories { - maven { - name = 'QuiltMC' - url = 'https://maven.quiltmc.org/repository/release' - } maven { name = 'Fabric' url = 'https://maven.fabricmc.net/' diff --git a/src/main/java/org/ladysnake/locki/Locki.java b/src/main/java/org/ladysnake/locki/Locki.java index eb307e7..c1e3af0 100644 --- a/src/main/java/org/ladysnake/locki/Locki.java +++ b/src/main/java/org/ladysnake/locki/Locki.java @@ -24,7 +24,7 @@ import net.fabricmc.fabric.api.command.v2.ArgumentTypeRegistry; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.fabricmc.fabric.api.util.TriState; -import net.minecraft.command.argument.SingletonArgumentInfo; +import net.minecraft.command.argument.serialize.ConstantArgumentSerializer; import net.minecraft.entity.Entity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.server.command.ServerCommandSource; @@ -157,8 +157,14 @@ public static Stream streamNodeNames() { @Override public void onInitialize() { this.baseInit(); - ArgumentTypeRegistry.registerArgumentType(id("inventory_lock"), InventoryLockArgumentType.class, SingletonArgumentInfo.contextFree(InventoryLockArgumentType::inventoryLock)); - ArgumentTypeRegistry.registerArgumentType(id("inventory_node"), InventoryNodeArgumentType.class, SingletonArgumentInfo.contextFree(InventoryNodeArgumentType::inventoryNode)); + ArgumentTypeRegistry.registerArgumentType(id("inventory_lock"), + InventoryLockArgumentType.class, + ConstantArgumentSerializer.of(InventoryLockArgumentType::inventoryLock) + ); + ArgumentTypeRegistry.registerArgumentType(id("inventory_node"), + InventoryNodeArgumentType.class, + ConstantArgumentSerializer.of(InventoryNodeArgumentType::inventoryNode) + ); } void baseInit() { diff --git a/src/main/java/org/ladysnake/locki/impl/InventoryKeeperBase.java b/src/main/java/org/ladysnake/locki/impl/InventoryKeeperBase.java index dee319f..1ca8be8 100644 --- a/src/main/java/org/ladysnake/locki/impl/InventoryKeeperBase.java +++ b/src/main/java/org/ladysnake/locki/impl/InventoryKeeperBase.java @@ -23,7 +23,8 @@ import net.minecraft.nbt.NbtCompound; import net.minecraft.nbt.NbtElement; import net.minecraft.nbt.NbtList; -import net.minecraft.registry.HolderLookup; +import net.minecraft.registry.RegistryEntryLookup; +import net.minecraft.registry.RegistryWrapper; import net.minecraft.util.Identifier; import org.ladysnake.cca.api.v3.component.Component; import org.ladysnake.locki.InventoryKeeper; @@ -143,7 +144,7 @@ protected BitSet lookup(InventoryNode inventoryNode) { } @Override - public void readFromNbt(NbtCompound tag, HolderLookup.Provider registryLookup) { + public void readFromNbt(NbtCompound tag, RegistryWrapper.WrapperLookup registryLookup) { if (tag.contains("locks", NbtElement.COMPOUND_TYPE)) { this.clearCache(); this.getLocks().clear(); @@ -170,7 +171,7 @@ public void readFromNbt(NbtCompound tag, HolderLookup.Provider registryLookup) { } @Override - public void writeToNbt(NbtCompound tag, HolderLookup.Provider registryLookup) { + public void writeToNbt(NbtCompound tag, RegistryWrapper.WrapperLookup registryLookup) { NbtCompound dict = new NbtCompound(); for (Map.Entry> nodeEntry : this.getLocks().entrySet()) { NbtList list = new NbtList(); diff --git a/src/main/java/org/ladysnake/locki/impl/LockiClient.java b/src/main/java/org/ladysnake/locki/impl/LockiClient.java index 8d15c36..8c67f5e 100644 --- a/src/main/java/org/ladysnake/locki/impl/LockiClient.java +++ b/src/main/java/org/ladysnake/locki/impl/LockiClient.java @@ -20,8 +20,8 @@ import net.fabricmc.api.ClientModInitializer; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.ingame.InventoryScreen; -import net.minecraft.client.gui.screen.recipe_book.RecipeBookProvider; -import net.minecraft.client.gui.widget.recipe_book.RecipeBookWidget; +import net.minecraft.client.gui.screen.recipebook.RecipeBookProvider; +import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.Identifier; import org.ladysnake.locki.DefaultInventoryNodes; diff --git a/src/main/java/org/ladysnake/locki/impl/LockiClientMixinPlugin.java b/src/main/java/org/ladysnake/locki/impl/LockiClientMixinPlugin.java index c2f2b4f..4c7764d 100644 --- a/src/main/java/org/ladysnake/locki/impl/LockiClientMixinPlugin.java +++ b/src/main/java/org/ladysnake/locki/impl/LockiClientMixinPlugin.java @@ -18,8 +18,8 @@ package org.ladysnake.locki.impl; import net.fabricmc.api.EnvType; +import net.fabricmc.loader.api.FabricLoader; import org.objectweb.asm.tree.ClassNode; -import org.quiltmc.loader.api.minecraft.MinecraftQuiltLoader; import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; import org.spongepowered.asm.mixin.extensibility.IMixinInfo; @@ -39,7 +39,7 @@ public String getRefMapperConfig() { @Override public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { - return MinecraftQuiltLoader.getEnvironmentType() == EnvType.CLIENT; + return FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT; } @Override diff --git a/src/main/java/org/ladysnake/locki/impl/compat/LockiCompatMixinPlugin.java b/src/main/java/org/ladysnake/locki/impl/compat/LockiCompatMixinPlugin.java index 53d8ccd..ef08398 100644 --- a/src/main/java/org/ladysnake/locki/impl/compat/LockiCompatMixinPlugin.java +++ b/src/main/java/org/ladysnake/locki/impl/compat/LockiCompatMixinPlugin.java @@ -17,8 +17,8 @@ */ package org.ladysnake.locki.impl.compat; +import net.fabricmc.loader.api.FabricLoader; import org.objectweb.asm.tree.ClassNode; -import org.quiltmc.loader.api.QuiltLoader; import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; import org.spongepowered.asm.mixin.extensibility.IMixinInfo; @@ -45,7 +45,7 @@ public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { Matcher matcher = mixinPattern.matcher(mixinClassName); if (!matcher.matches()) throw new IllegalStateException("Bad mixin name " + mixinClassName); String modId = matcher.group("modid"); - return QuiltLoader.isModLoaded(modId); + return FabricLoader.getInstance().isModLoaded(modId); } @Override diff --git a/src/main/java/org/ladysnake/locki/impl/compat/mixin/backslot/SwitchPacketMixin.java b/src/main/java/org/ladysnake/locki/impl/compat/mixin/backslot/SwitchPacketMixin.java index a7cbf14..85b9e38 100644 --- a/src/main/java/org/ladysnake/locki/impl/compat/mixin/backslot/SwitchPacketMixin.java +++ b/src/main/java/org/ladysnake/locki/impl/compat/mixin/backslot/SwitchPacketMixin.java @@ -17,6 +17,7 @@ */ package org.ladysnake.locki.impl.compat.mixin.backslot; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import net.backslot.network.SwitchPacketReceiver; import net.minecraft.item.ItemStack; import net.minecraft.server.MinecraftServer; @@ -33,12 +34,20 @@ public abstract class SwitchPacketMixin { public static boolean isItemAllowed(ItemStack stack, int slot) { return false; } - - @Redirect(method = "receive", at = @At(value = "INVOKE", target = "Lnet/backslot/network/SwitchPacketReceiver;isItemAllowed(Lnet/minecraft/item/ItemStack;I)Z")) +/*TODO + @WrapWithCondition( + method = "receive(Lnet/backslot/network/SwitchPacket;Lnet/fabricmc/fabric/api/networking/v1/ServerPlayNetworking$Context;)V", + at = @At( + value = "INVOKE", + target = "" + ) + ) private boolean lockAdditionalSlots(ItemStack stack, int slot, MinecraftServer server, ServerPlayerEntity player) { if (InventoryKeeper.get(player).isSlotLocked(slot)) { return false; } return isItemAllowed(stack, slot); } + + */ } diff --git a/src/main/java/org/ladysnake/locki/impl/mixin/InputSlotFillerMixin.java b/src/main/java/org/ladysnake/locki/impl/mixin/InputSlotFillerMixin.java index ee37af7..d071841 100644 --- a/src/main/java/org/ladysnake/locki/impl/mixin/InputSlotFillerMixin.java +++ b/src/main/java/org/ladysnake/locki/impl/mixin/InputSlotFillerMixin.java @@ -35,7 +35,7 @@ public abstract class InputSlotFillerMixin { @Shadow protected AbstractRecipeScreenHandler handler; - @WrapOperation(method = "fillInputSlots(Lnet/minecraft/server/network/ServerPlayerEntity;Lnet/minecraft/recipe/RecipeHolder;Z)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/recipe/RecipeMatcher;match(Lnet/minecraft/recipe/Recipe;Lit/unimi/dsi/fastutil/ints/IntList;)Z")) + @WrapOperation(method = "fillInputSlots(Lnet/minecraft/server/network/ServerPlayerEntity;Lnet/minecraft/recipe/RecipeEntry;Z)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/recipe/RecipeMatcher;match(Lnet/minecraft/recipe/Recipe;Lit/unimi/dsi/fastutil/ints/IntList;)Z")) private boolean blockInventoryCrafting(RecipeMatcher instance, Recipe recipe, IntList output, Operation original, ServerPlayerEntity entity) { if (this.handler == entity.playerScreenHandler && InventoryKeeper.get(entity).isLocked(DefaultInventoryNodes.CRAFTING_GRID)) { return false; diff --git a/src/main/java/org/ladysnake/locki/impl/mixin/PlayerInventoryMixin.java b/src/main/java/org/ladysnake/locki/impl/mixin/PlayerInventoryMixin.java index e3f16e6..3681aa3 100644 --- a/src/main/java/org/ladysnake/locki/impl/mixin/PlayerInventoryMixin.java +++ b/src/main/java/org/ladysnake/locki/impl/mixin/PlayerInventoryMixin.java @@ -17,6 +17,8 @@ */ package org.ladysnake.locki.impl.mixin; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.ItemStack; @@ -29,7 +31,6 @@ import org.ladysnake.locki.impl.LockiComponents; import org.ladysnake.locki.impl.PlayerInventoryKeeper; import org.objectweb.asm.Opcodes; -import org.quiltmc.loader.api.minecraft.ClientOnly; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -111,7 +112,7 @@ private void constructor(PlayerEntity player, CallbackInfo ci) { this.locki$keeper = LockiComponents.INVENTORY_KEEPER.maybeGet(player).orElse(null); } - @ClientOnly + @Environment(EnvType.CLIENT) @Inject(method = {"addPickBlock", "scrollInHotbar"}, at = @At(value = "FIELD", opcode = Opcodes.PUTFIELD, target = "Lnet/minecraft/entity/player/PlayerInventory;selectedSlot:I", shift = At.Shift.AFTER) ) diff --git a/src/main/java/org/ladysnake/locki/impl/mixin/ServerPlayNetworkHandlerMixin.java b/src/main/java/org/ladysnake/locki/impl/mixin/ServerPlayNetworkHandlerMixin.java index 099f9b0..c8af43d 100644 --- a/src/main/java/org/ladysnake/locki/impl/mixin/ServerPlayNetworkHandlerMixin.java +++ b/src/main/java/org/ladysnake/locki/impl/mixin/ServerPlayNetworkHandlerMixin.java @@ -18,7 +18,7 @@ package org.ladysnake.locki.impl.mixin; import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket; -import net.minecraft.network.packet.c2s.play.SelectedSlotUpdateC2SPacket; +import net.minecraft.network.packet.c2s.play.UpdateSelectedSlotC2SPacket; import net.minecraft.server.network.ServerPlayNetworkHandler; import net.minecraft.server.network.ServerPlayerEntity; import org.ladysnake.locki.DefaultInventoryNodes; @@ -35,8 +35,8 @@ public abstract class ServerPlayNetworkHandlerMixin { @Shadow public ServerPlayerEntity player; - @Inject(method = "onSelectedSlotUpdate", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/packet/c2s/play/SelectedSlotUpdateC2SPacket;getSelectedSlot()I", ordinal = 0)) - private void fixSelectedSlot(SelectedSlotUpdateC2SPacket packet, CallbackInfo ci) { + @Inject(method = "onUpdateSelectedSlot", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/packet/c2s/play/UpdateSelectedSlotC2SPacket;getSelectedSlot()I", ordinal = 0)) + private void fixSelectedSlot(UpdateSelectedSlotC2SPacket packet, CallbackInfo ci) { ((UpdateSelectedSlotC2SPacketAccessor) packet).locki$setSelectedSlot(PlayerInventoryKeeper.fixSelectedSlot(player, packet.getSelectedSlot())); } diff --git a/src/main/java/org/ladysnake/locki/impl/mixin/UpdateSelectedSlotC2SPacketAccessor.java b/src/main/java/org/ladysnake/locki/impl/mixin/UpdateSelectedSlotC2SPacketAccessor.java index 6baf2fe..f36e016 100644 --- a/src/main/java/org/ladysnake/locki/impl/mixin/UpdateSelectedSlotC2SPacketAccessor.java +++ b/src/main/java/org/ladysnake/locki/impl/mixin/UpdateSelectedSlotC2SPacketAccessor.java @@ -17,11 +17,11 @@ */ package org.ladysnake.locki.impl.mixin; -import net.minecraft.network.packet.c2s.play.SelectedSlotUpdateC2SPacket; +import net.minecraft.network.packet.c2s.play.UpdateSelectedSlotC2SPacket; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(SelectedSlotUpdateC2SPacket.class) +@Mixin(UpdateSelectedSlotC2SPacket.class) public interface UpdateSelectedSlotC2SPacketAccessor { @Accessor("selectedSlot") void locki$setSelectedSlot(int selectedSlot); diff --git a/src/main/java/org/ladysnake/locki/impl/mixin/UpdateSelectedSlotC2SPacketMixin.java b/src/main/java/org/ladysnake/locki/impl/mixin/UpdateSelectedSlotC2SPacketMixin.java index 14042e7..604e112 100644 --- a/src/main/java/org/ladysnake/locki/impl/mixin/UpdateSelectedSlotC2SPacketMixin.java +++ b/src/main/java/org/ladysnake/locki/impl/mixin/UpdateSelectedSlotC2SPacketMixin.java @@ -17,13 +17,13 @@ */ package org.ladysnake.locki.impl.mixin; -import net.minecraft.network.packet.c2s.play.SelectedSlotUpdateC2SPacket; +import net.minecraft.network.packet.c2s.play.UpdateSelectedSlotC2SPacket; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.Shadow; -@Mixin(SelectedSlotUpdateC2SPacket.class) +@Mixin(UpdateSelectedSlotC2SPacket.class) public class UpdateSelectedSlotC2SPacketMixin { @SuppressWarnings("unused") // only there to make selectedSlot mutable - for use by the accessor @Shadow @Mutable @Final private int selectedSlot; diff --git a/src/main/java/org/ladysnake/locki/impl/mixin/client/HandledScreenMixin.java b/src/main/java/org/ladysnake/locki/impl/mixin/client/HandledScreenMixin.java index d2ccfb9..f33f5a9 100644 --- a/src/main/java/org/ladysnake/locki/impl/mixin/client/HandledScreenMixin.java +++ b/src/main/java/org/ladysnake/locki/impl/mixin/client/HandledScreenMixin.java @@ -18,8 +18,12 @@ package org.ladysnake.locki.impl.mixin.client; import com.google.common.base.Suppliers; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.injector.ModifyReceiver; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import com.mojang.datafixers.util.Pair; -import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.ingame.HandledScreen; import net.minecraft.screen.PlayerScreenHandler; import net.minecraft.screen.slot.Slot; @@ -36,11 +40,12 @@ @Mixin(HandledScreen.class) public abstract class HandledScreenMixin { + @Unique private static final Supplier> LOCKED_SPRITE_REF = Suppliers.memoize(() -> com.mojang.datafixers.util.Pair.of(PlayerScreenHandler.BLOCK_ATLAS_TEXTURE, LockiClient.LOCKED_SLOT_SPRITE)); - @ModifyVariable(method = "drawSlot", at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/screen/slot/Slot;getBackgroundSprite()Lcom/mojang/datafixers/util/Pair;")) - private @Nullable Pair replaceSprite(@Nullable Pair baseSprite, GuiGraphics graphics, Slot slot) { + @ModifyExpressionValue(method = "drawSlot", at = @At(value = "INVOKE", target = "Lnet/minecraft/screen/slot/Slot;getBackgroundSprite()Lcom/mojang/datafixers/util/Pair;")) + private @Nullable Pair replaceSprite(@Nullable Pair baseSprite, DrawContext graphics, Slot slot) { if (((LockableSlot) slot).locki$shouldBeLocked()) { return HandledScreenMixin.LOCKED_SPRITE_REF.get(); } diff --git a/src/main/java/org/ladysnake/locki/impl/mixin/client/InGameHudMixin.java b/src/main/java/org/ladysnake/locki/impl/mixin/client/InGameHudMixin.java index c9b979a..4b5be19 100644 --- a/src/main/java/org/ladysnake/locki/impl/mixin/client/InGameHudMixin.java +++ b/src/main/java/org/ladysnake/locki/impl/mixin/client/InGameHudMixin.java @@ -17,11 +17,13 @@ */ package org.ladysnake.locki.impl.mixin.client; +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import net.minecraft.class_9779; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.hud.in_game.InGameHud; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.hud.InGameHud; +import net.minecraft.client.render.RenderTickCounter; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.Identifier; @@ -55,12 +57,12 @@ public abstract class InGameHudMixin { protected abstract PlayerEntity getCameraPlayer(); @Inject( - method = "renderSurvivalHotbar", + method = "renderHotbar", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/MatrixStack;push()V"), allow = 1, cancellable = true ) - private void checkInventoryLimit(GuiGraphics graphics, class_9779 arg, CallbackInfo ci) { + private void checkInventoryLimit(DrawContext context, RenderTickCounter tickCounter, CallbackInfo ci) { this.renderMainHandOnly = false; InventoryKeeper inventoryKeeper = InventoryKeeper.get(this.getCameraPlayer()); if (inventoryKeeper.isLocked(DefaultInventoryNodes.MAIN_HAND)) { @@ -70,7 +72,7 @@ private void checkInventoryLimit(GuiGraphics graphics, class_9779 arg, CallbackI } } - @ModifyVariable(method = "renderSurvivalHotbar", at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/entity/player/PlayerEntity;getOffHandStack()Lnet/minecraft/item/ItemStack;")) + @ModifyExpressionValue(method = "renderHotbar", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/PlayerEntity;getOffHandStack()Lnet/minecraft/item/ItemStack;")) private ItemStack lockOffHand(ItemStack base) { if (InventoryKeeper.get(this.getCameraPlayer()).isLocked(DefaultInventoryNodes.OFF_HAND)) { return ItemStack.EMPTY; @@ -79,10 +81,10 @@ private ItemStack lockOffHand(ItemStack base) { } @WrapOperation( - method = "renderSurvivalHotbar", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiGraphics;drawGuiTexture(Lnet/minecraft/util/Identifier;IIII)V", ordinal = 0) + method = "renderHotbar", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawGuiTexture(Lnet/minecraft/util/Identifier;IIII)V", ordinal = 0) ) - private void centerCroppedHotbar(GuiGraphics instance, Identifier texture, int x, int y, int width, int height, Operation original) { + private void centerCroppedHotbar(DrawContext instance, Identifier texture, int x, int y, int width, int height, Operation original) { if (this.renderMainHandOnly) { int centeredX = x + LOCKI$X_CENTER_SHIFT; instance.enableScissor(centeredX, y, centeredX + LOCKI$SINGLE_SLOT_WIDTH, y + height); @@ -94,8 +96,8 @@ private void centerCroppedHotbar(GuiGraphics instance, Identifier texture, int x } @ModifyArg( - method = "renderSurvivalHotbar", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiGraphics;drawGuiTexture(Lnet/minecraft/util/Identifier;IIII)V", ordinal = 1), + method = "renderHotbar", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawGuiTexture(Lnet/minecraft/util/Identifier;IIII)V", ordinal = 1), index = 1 ) private int centerSelectedSlot(int x) { @@ -106,7 +108,7 @@ private int centerSelectedSlot(int x) { } @ModifyArg( - method = "renderSurvivalHotbar", + method = "renderHotbar", slice = @Slice( from = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/MatrixStack;pop()V"), to = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;isEmpty()Z", ordinal = 1) @@ -119,12 +121,12 @@ private int cancelLockedItemRender(int index) { } @ModifyArg( - method = "renderSurvivalHotbar", + method = "renderHotbar", slice = @Slice( from = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/MatrixStack;pop()V"), to = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;isEmpty()Z", ordinal = 1) ), - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/in_game/InGameHud;renderHotbarItem(Lnet/minecraft/client/gui/GuiGraphics;IILnet/minecraft/class_9779;Lnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/item/ItemStack;I)V") + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/InGameHud;renderHotbarItem(Lnet/minecraft/client/gui/DrawContext;IILnet/minecraft/client/render/RenderTickCounter;Lnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/item/ItemStack;I)V") ) private ItemStack cancelLockedItemRender(ItemStack stack) { if (this.cancelNextItem) { @@ -134,12 +136,12 @@ private ItemStack cancelLockedItemRender(ItemStack stack) { } @ModifyArg( - method = "renderSurvivalHotbar", + method = "renderHotbar", slice = @Slice( from = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/math/MatrixStack;pop()V"), to = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;isEmpty()Z", ordinal = 1) ), - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/in_game/InGameHud;renderHotbarItem(Lnet/minecraft/client/gui/GuiGraphics;IILnet/minecraft/class_9779;Lnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/item/ItemStack;I)V"), + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/InGameHud;renderHotbarItem(Lnet/minecraft/client/gui/DrawContext;IILnet/minecraft/client/render/RenderTickCounter;Lnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/item/ItemStack;I)V"), index = 1 ) private int shiftMainHandItem(int x) { diff --git a/src/main/java/org/ladysnake/locki/impl/mixin/client/InventoryScreenMixin.java b/src/main/java/org/ladysnake/locki/impl/mixin/client/InventoryScreenMixin.java index f48c288..cafc8a6 100644 --- a/src/main/java/org/ladysnake/locki/impl/mixin/client/InventoryScreenMixin.java +++ b/src/main/java/org/ladysnake/locki/impl/mixin/client/InventoryScreenMixin.java @@ -46,7 +46,7 @@ public InventoryScreenMixin(PlayerScreenHandler screenHandler, PlayerInventory p return this.locki$craftingBookButton; } - @ModifyArg(method = "init", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/ingame/InventoryScreen;addDrawableSelectableElement(Lnet/minecraft/client/gui/Element;)Lnet/minecraft/client/gui/Element;"), allow = 1) + @ModifyArg(method = "init", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/ingame/InventoryScreen;addDrawableChild(Lnet/minecraft/client/gui/Element;)Lnet/minecraft/client/gui/Element;"), allow = 1) private Element captureCraftingBookButton(Element button) { this.locki$craftingBookButton = (ClickableWidget) button; diff --git a/src/main/java/org/ladysnake/locki/impl/mixin/client/RecipeBookWidgetMixin.java b/src/main/java/org/ladysnake/locki/impl/mixin/client/RecipeBookWidgetMixin.java index 4830da9..0fc91b8 100644 --- a/src/main/java/org/ladysnake/locki/impl/mixin/client/RecipeBookWidgetMixin.java +++ b/src/main/java/org/ladysnake/locki/impl/mixin/client/RecipeBookWidgetMixin.java @@ -19,7 +19,7 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.ingame.InventoryScreen; -import net.minecraft.client.gui.widget.recipe_book.RecipeBookWidget; +import net.minecraft.client.gui.screen.recipebook.RecipeBookWidget; import org.ladysnake.locki.DefaultInventoryNodes; import org.ladysnake.locki.InventoryKeeper; import org.spongepowered.asm.mixin.Mixin; diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json new file mode 100644 index 0000000..e4fd6f2 --- /dev/null +++ b/src/main/resources/fabric.mod.json @@ -0,0 +1,57 @@ +{ + "schemaVersion": 1, + "id": "locki", + "version": "${version}", + + "name": "Locki", + "description": "A library to handle inventory locking", + "authors": [ + "Pyrofab" + ], + "contact": { + "homepage": "https://ladysnake.github.io/wiki/locki", + "sources": "https://github.com/Ladysnake/locki", + "issues": "https://github.com/Ladysnake/Locki/issues" + }, + + "license": "LGPL-3.0-or-later", + "icon": "assets/locki/icon.png", + + "environment": "*", + "entrypoints": { + "main": [ + "org.ladysnake.locki.Locki" + ], + "client": [ + "org.ladysnake.locki.impl.LockiClient" + ], + "cardinal-components": [ + "org.ladysnake.locki.impl.LockiComponents" + ] + }, + + "mixins": [ + "locki.mixins.client.json", + "locki.mixins.common.json", + "locki.mixins.compat.json" + ], + + "depends": { + "minecraft": ">=1.19-", + "fabricloader": "*", + "fabric-permissions-api-v0": "*", + "cardinal-components-base": "*", + "cardinal-components-entity": "*" + }, + + "custom": { + "cardinal-components": [ + "locki:inventory_keeper" + ], + "loom:injected_interfaces": { + "net/minecraft/class_1661": [ + "org/ladysnake/locki/InventoryKeeper" + ] + } + } +} \ No newline at end of file diff --git a/src/main/resources/quilt.mod.json b/src/main/resources/quilt.mod.json deleted file mode 100644 index e8dacaa..0000000 --- a/src/main/resources/quilt.mod.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "schema_version": 1, - "quilt_loader": { - "group": "org.ladysnake", - "id": "locki", - "version": "${version}", - "metadata": { - "name": "Locki", - "description": "A library to handle inventory locking", - "contributors": { - "Pyrofab": "Owner" - }, - "contact": { - "homepage": "https://ladysnake.github.io/wiki/locki", - "sources": "https://github.com/Ladysnake/locki", - "issues": "https://github.com/Ladysnake/Locki/issues" - }, - "license": "LGPL-3.0-or-later", - "icon": "assets/locki/icon.png" - }, - "intermediate_mappings": "net.fabricmc:intermediary", - "entrypoints": { - "main": [ - "org.ladysnake.locki.Locki" - ], - "client": [ - "org.ladysnake.locki.impl.LockiClient" - ], - "cardinal-components": [ - "org.ladysnake.locki.impl.LockiComponents" - ] - }, - "depends": [ - "quilt_loader", - "fabric-permissions-api-v0", - "cardinal-components-base", - "cardinal-components-entity", - { - "id": "minecraft", - "versions": ">=1.19-" - } - ] - }, - "minecraft": { - "environment": "*" - }, - "mixin": [ - "locki.mixins.client.json", - "locki.mixins.common.json", - "locki.mixins.compat.json" - ], - "cardinal-components": [ - "locki:inventory_keeper" - ], - "quilt_loom": { - "injected_interfaces": { - "net/minecraft/class_1661": [ - "org/ladysnake/locki/InventoryKeeper" - ] - } - } -} diff --git a/src/test/java/org/ladysnake/locki/LockiTest.java b/src/test/java/org/ladysnake/locki/LockiTest.java index 892ff00..47f5237 100644 --- a/src/test/java/org/ladysnake/locki/LockiTest.java +++ b/src/test/java/org/ladysnake/locki/LockiTest.java @@ -49,7 +49,7 @@ public void registerLock() { .parallel() .boxed() .map(String::valueOf) - .map(Identifier::new) + .map(Identifier::of) .map(Locki::registerLock) .toList(); assertEquals(IntStream.range(0, 2000).boxed().collect(Collectors.toList()), locks.stream().map(InventoryLock::getRawId).sorted().collect(Collectors.toList())); @@ -57,15 +57,15 @@ public void registerLock() { @Test public void registerLockSeveralTimes() { - InventoryLock a = Locki.registerLock(new Identifier("a")); - assertEquals(a, Locki.registerLock(new Identifier("a"), true)); - assertThrows(IllegalStateException.class, () -> Locki.registerLock(new Identifier("a"), false)); + InventoryLock a = Locki.registerLock(Identifier.of("a")); + assertEquals(a, Locki.registerLock(Identifier.of("a"), true)); + assertThrows(IllegalStateException.class, () -> Locki.registerLock(Identifier.of("a"), false)); } @Test public void getLock() { - Identifier a = new Identifier("test", "a"); - Identifier b = new Identifier("test", "b"); + Identifier a = Identifier.of("test", "a"); + Identifier b = Identifier.of("test", "b"); InventoryLock lock = Locki.registerLock(a); assertEquals(lock, Locki.getLock(a)); Assertions.assertNull(Locki.getLock(b)); diff --git a/src/test/java/org/ladysnake/locki/impl/InventoryKeeperBaseTest.java b/src/test/java/org/ladysnake/locki/impl/InventoryKeeperBaseTest.java index 75a9e66..afab914 100644 --- a/src/test/java/org/ladysnake/locki/impl/InventoryKeeperBaseTest.java +++ b/src/test/java/org/ladysnake/locki/impl/InventoryKeeperBaseTest.java @@ -17,7 +17,10 @@ */ package org.ladysnake.locki.impl; +import net.minecraft.client.MinecraftClient; import net.minecraft.nbt.NbtCompound; +import net.minecraft.registry.RegistryWrapper; +import net.minecraft.server.MinecraftServer; import net.minecraft.util.Identifier; import net.minecraft.util.Util; import org.junit.jupiter.api.AfterEach; @@ -42,7 +45,7 @@ public void tearDown() { @Test public void isLocked() { InventoryKeeperBase instance = new InventoryKeeperBase(); - InventoryLock lock = Locki.registerLock(new Identifier("test", "test")); + InventoryLock lock = Locki.registerLock(Identifier.of("test", "test")); assertFalse(instance.isLocked(DefaultInventoryNodes.HANDS)); instance.addLock(lock, DefaultInventoryNodes.HANDS); assertTrue(instance.isLocked(DefaultInventoryNodes.HANDS)); @@ -53,7 +56,7 @@ public void isLocked() { assertTrue(instance.isLocked(DefaultInventoryNodes.HANDS)); assertFalse(instance.isLocked(DefaultInventoryNodes.MAIN_HAND)); assertTrue(instance.isLocked(DefaultInventoryNodes.OFF_HAND)); - InventoryLock lock2 = Locki.registerLock(new Identifier("test", "test2")); + InventoryLock lock2 = Locki.registerLock(Identifier.of("test", "test2")); instance.addLock(lock2, DefaultInventoryNodes.INVENTORY); assertEquals(2, instance.getCache().get(DefaultInventoryNodes.HANDS).cardinality()); assertTrue(instance.isLocked(DefaultInventoryNodes.OFF_HAND)); @@ -75,9 +78,9 @@ public void isLocked() { @Test public void serializesCorrectly() { InventoryKeeperBase instance = new InventoryKeeperBase(); - InventoryLock lock1 = Locki.registerLock(new Identifier("test", "test1"), true); - InventoryLock lock2 = Locki.registerLock(new Identifier("test", "test2"), true); - InventoryLock lock3 = Locki.registerLock(new Identifier("test", "test3"), false); + InventoryLock lock1 = Locki.registerLock(Identifier.of("test", "test1"), true); + InventoryLock lock2 = Locki.registerLock(Identifier.of("test", "test2"), true); + InventoryLock lock3 = Locki.registerLock(Identifier.of("test", "test3"), false); instance.addLock(lock1, DefaultInventoryNodes.HANDS); instance.addLock(lock1, DefaultInventoryNodes.ARMOR); instance.addLock(lock2, DefaultInventoryNodes.HEAD); @@ -89,7 +92,7 @@ public void serializesCorrectly() { assertTrue(instance.isLockedBy(lock3, DefaultInventoryNodes.HEAD)); assertTrue(instance.isLockedBy(lock3, DefaultInventoryNodes.INVENTORY)); InventoryKeeperBase copy = new InventoryKeeperBase(); - copy.readFromNbt(Util.make(new NbtCompound(), instance::writeToNbt)); + copy.readFromNbt(Util.make(new NbtCompound(), nbt -> instance.writeToNbt(nbt, null)), null); //TODO lookup null? assertTrue(copy.isLockedBy(lock1, DefaultInventoryNodes.HANDS)); assertTrue(copy.isLockedBy(lock1, DefaultInventoryNodes.ARMOR)); assertTrue(copy.isLockedBy(lock1, DefaultInventoryNodes.HEAD)); diff --git a/src/testmod/java/org/ladysnake/lockii/InventoryLockComponent.java b/src/testmod/java/org/ladysnake/lockii/InventoryLockComponent.java index b906f39..54d26f2 100644 --- a/src/testmod/java/org/ladysnake/lockii/InventoryLockComponent.java +++ b/src/testmod/java/org/ladysnake/lockii/InventoryLockComponent.java @@ -2,7 +2,7 @@ import com.mojang.serialization.Codec; import io.netty.buffer.ByteBuf; -import net.minecraft.component.DataComponentType; +import net.minecraft.component.ComponentType; import net.minecraft.network.codec.PacketCodec; import net.minecraft.network.codec.PacketCodecs; import org.jetbrains.annotations.NotNull; @@ -11,8 +11,8 @@ public record InventoryLockComponent(int debugMode) { public static final Codec CODEC = Codec.INT.xmap(InventoryLockComponent::new, InventoryLockComponent::debugMode); - public static final PacketCodec PACKET_CODEC = PacketCodecs.VAR_INT.map(InventoryLockComponent::new, InventoryLockComponent::debugMode); - public static final DataComponentType TYPE = new DataComponentType.Builder().codec(CODEC).packetCodec(PACKET_CODEC).build(); + public static final PacketCodec PACKET_CODEC = PacketCodecs.VAR_INT.xmap(InventoryLockComponent::new, InventoryLockComponent::debugMode); + public static final ComponentType TYPE = new ComponentType.Builder().codec(CODEC).packetCodec(PACKET_CODEC).build(); private static final InventoryNode[] ALL_DEFAULT_NODES = Locki.streamNodeNames().map(Locki::getNode).toArray(InventoryNode[]::new); public static final InventoryLockComponent DEFAULT = new InventoryLockComponent(0); diff --git a/src/testmod/java/org/ladysnake/lockii/tests/LockiTestSuite.java b/src/testmod/java/org/ladysnake/lockii/tests/LockiTestSuite.java index 992c459..ead8943 100644 --- a/src/testmod/java/org/ladysnake/lockii/tests/LockiTestSuite.java +++ b/src/testmod/java/org/ladysnake/lockii/tests/LockiTestSuite.java @@ -40,7 +40,7 @@ public class LockiTestSuite implements FabricGameTest { public static final InventoryLock lock = Locki.registerLock(Lockii.id("test_suite")); - @GameTest(structureName = EMPTY_STRUCTURE) + @GameTest(templateName = EMPTY_STRUCTURE) public void checkPermission(TestContext ctx) { ServerPlayerEntity player = ctx.spawnServerPlayer(0, 0, 0); @@ -69,18 +69,18 @@ public void checkPermission(TestContext ctx) { ctx.complete(); } - @GameTest(structureName = EMPTY_STRUCTURE) + @GameTest(templateName = EMPTY_STRUCTURE) public void lockingPreventsItemPickup(TestContext ctx) { ServerPlayerEntity player = ctx.spawnServerPlayer(1, 0, 1); player.getInventory().addLock(lock, DefaultInventoryNodes.INVENTORY); - ctx.spawnItemEntity(Items.DIAMOND, 1, 1, 2); + ctx.spawnItem(Items.DIAMOND, 1, 1, 2); ctx.expectEntity(EntityType.ITEM); player.playerTick(); ctx.expectEntity(EntityType.ITEM); ctx.complete(); } - @GameTest(structureName = EMPTY_STRUCTURE) + @GameTest(templateName = EMPTY_STRUCTURE) public void lockingPreventsDropFromMainHand(TestContext ctx) { ServerPlayerEntity player = ctx.spawnServerPlayer(1, 0, 1); player.equipStack(EquipmentSlot.MAINHAND, new ItemStack(Items.ENCHANTED_GOLDEN_APPLE)); @@ -99,17 +99,17 @@ public void lockingPreventsDropFromMainHand(TestContext ctx) { ctx.complete(); } - @GameTest(structureName = EMPTY_STRUCTURE) + @GameTest(templateName = EMPTY_STRUCTURE) public void itemPickupWorks(TestContext ctx) { ServerPlayerEntity player = ctx.spawnServerPlayer(1, 0, 1); - ctx.spawnItemEntity(Items.REDSTONE, 1, 1, 1); + ctx.spawnItem(Items.REDSTONE, 1, 1, 1); ctx.expectEntity(EntityType.ITEM); player.playerTick(); - ctx.expectNoEntity(EntityType.ITEM); + ctx.dontExpectEntity(EntityType.ITEM); ctx.complete(); } - @GameTest(structureName = EMPTY_STRUCTURE) + @GameTest(templateName = EMPTY_STRUCTURE) public void componentGetsSynced(TestContext ctx) { ServerPlayerEntity player = ctx.spawnServerPlayer(1, 0, 1); player.getInventory().addLock(lock, DefaultInventoryNodes.INVENTORY); diff --git a/src/testmod/resources/quilt.mod.json b/src/testmod/resources/quilt.mod.json index effced8..55dbceb 100644 --- a/src/testmod/resources/quilt.mod.json +++ b/src/testmod/resources/quilt.mod.json @@ -1,37 +1,35 @@ { - "schema_version": 1, - "quilt_loader": { - "group": "org.ladysnake", - "id": "lockii", - "version": "${version}", - "metadata": { - "name": "Locki Test Mod", - "description": "It's just a test... Or is it ?", - "license": "LGPL-3.0-or-later", - "icon": "assets/icon.png", - "authors": [ - "Pyrofab" - ], - "contact": { - "sources": "https://github.com/Ladysnake/Locki", - "issues": "https://github.com/Ladysnake/Locki/issues", - "discord": "ladysnake.glitch.me/discord" - } - }, - "entrypoints": { - "main": [ - "org.ladysnake.lockii.Lockii" - ], - "fabric-gametest": [ - "org.ladysnake.lockii.tests.LockiTestSuite" - ] - }, - "depends": [ - "locki" + "schemaVersion": 1, + "id": "lockii", + "version": "${version}", + + "name": "Locki Test Mod", + "description": "It's just a test... Or is it?", + "license": "LGPL-3.0-or-later", + "icon": "assets/icon.png", + + "authors": [ + "Pyrofab" + ], + "contact": { + "sources": "https://github.com/Ladysnake/Locki", + "issues": "https://github.com/Ladysnake/Locki/issues", + "discord": "ladysnake.glitch.me/discord" + }, + + "environment": "*", + "entrypoints": { + "main": [ + "org.ladysnake.lockii.Lockii" ], - "intermediate_mappings": "net.fabricmc:intermediary" + "fabric-gametest": [ + "org.ladysnake.lockii.tests.LockiTestSuite" + ] }, - "minecraft": { - "environment": "*" + + "depends": { + "minecraft": "*", + "fabricloader": "*", + "locki": "*" } -} +} \ No newline at end of file