diff --git a/build.gradle b/build.gradle index 1f344ce..7ba8d61 100644 --- a/build.gradle +++ b/build.gradle @@ -34,15 +34,13 @@ dependencies { // Dependencies include modImplementation("com.kneelawk.graphlib:graphlib-core-fabric:$graphlib_version") - modLocalRuntime("com.kneelawk.graphlib:graphlib-debugrender-fabric:$graphlib_version") + //modLocalRuntime("com.kneelawk.graphlib:graphlib-debugrender-fabric:$graphlib_version") //modImplementation "vazkii.patchouli:Patchouli:$patchouli_version" modImplementation annotationProcessor(include("com.github.mattidragon:ConfigToolkit:$configtoolkit_version")) modImplementation include("dev.isxander:yet-another-config-lib:$yacl_version-fabric") modImplementation "com.terraformersmc:modmenu:$modmenu_version" -// modImplementation include("me.luligabi:NoIndium:$noindium_version") - // Add generated data to runtime classpath (slightly hacky) runtimeOnly files("src/main/generated") } diff --git a/changelog/3.0.3+1.21.1.md b/changelog/3.0.3+1.21.1.md deleted file mode 100644 index 1331161..0000000 --- a/changelog/3.0.3+1.21.1.md +++ /dev/null @@ -1 +0,0 @@ -* Updated to 1.21.1 \ No newline at end of file diff --git a/changelog/3.0.4+1.21.1.md b/changelog/3.0.4+1.21.1.md deleted file mode 100644 index f4b2f71..0000000 --- a/changelog/3.0.4+1.21.1.md +++ /dev/null @@ -1,3 +0,0 @@ -* Work around sodium breaking drawer icons by using vanilla rendering - * The real issue is still a bug in sodium, but this should prevent it from causing issues -* Fix crash when interacting with some slots of compacting drawers caused by previous bug (#130) \ No newline at end of file diff --git a/changelog/3.0.5+1.21.1.md b/changelog/3.0.5+1.21.1.md deleted file mode 100644 index 54d0d0d..0000000 --- a/changelog/3.0.5+1.21.1.md +++ /dev/null @@ -1,2 +0,0 @@ -* Added Turkish translation by [Hexasan](https://github.com/Hexasan) -* Update comparators of access points when network changes \ No newline at end of file diff --git a/changelog/4.0.0+1.21.2.md b/changelog/4.0.0+1.21.2.md new file mode 100644 index 0000000..9e5f4f2 --- /dev/null +++ b/changelog/4.0.0+1.21.2.md @@ -0,0 +1,2 @@ +* Updated to 1.21.2 + * Marked as beta due to using hacks to make graphlib work on newer versions \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 08b388c..dd079e6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,17 +1,16 @@ org.gradle.jvmargs=-Xmx1G -minecraft_version=1.21.1 -yarn_mappings=1.21.1+build.3 -loader_version=0.15.11 +minecraft_version=1.21.2 +yarn_mappings=1.21.2+build.1 +loader_version=0.16.7 -mod_version=3.0.5 +mod_version=4.0.0 maven_group=io.github.mattidragon archives_base_name=ExtendedDrawers -fabric_version=0.102.0+1.21.1 +fabric_version=0.106.1+1.21.2 graphlib_version=2.0.0+1.21 patchouli_version=1.20.1-81-FABRIC -yacl_version=3.5.0+1.21 -modmenu_version=11.0.1 +yacl_version=3.6.1+1.21.2 +modmenu_version=12.0.0-beta.1 configtoolkit_version=1.1.1 -noindium_version=1.1.0+1.20.4 diff --git a/src/client/java/io/github/mattidragon/extendeddrawers/client/ExtendedDrawersClient.java b/src/client/java/io/github/mattidragon/extendeddrawers/client/ExtendedDrawersClient.java index b39eccd..d8fa606 100644 --- a/src/client/java/io/github/mattidragon/extendeddrawers/client/ExtendedDrawersClient.java +++ b/src/client/java/io/github/mattidragon/extendeddrawers/client/ExtendedDrawersClient.java @@ -1,11 +1,11 @@ package io.github.mattidragon.extendeddrawers.client; import io.github.mattidragon.extendeddrawers.ExtendedDrawers; +import io.github.mattidragon.extendeddrawers.client.compression.ClientCompressionRecipeManager; import io.github.mattidragon.extendeddrawers.client.renderer.CompactingDrawerBlockEntityRenderer; import io.github.mattidragon.extendeddrawers.client.renderer.DrawerBlockEntityRenderer; import io.github.mattidragon.extendeddrawers.client.renderer.ShadowDrawerBlockEntityRenderer; -import io.github.mattidragon.extendeddrawers.compacting.CompressionRecipeManager; -import io.github.mattidragon.extendeddrawers.networking.CompressionOverrideSyncPayload; +import io.github.mattidragon.extendeddrawers.networking.CompressionRecipeSyncPayload; import io.github.mattidragon.extendeddrawers.registry.ModBlocks; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; @@ -19,8 +19,8 @@ public void onInitializeClient() { BlockEntityRendererFactories.register(ModBlocks.SHADOW_DRAWER_BLOCK_ENTITY, ShadowDrawerBlockEntityRenderer::new); BlockEntityRendererFactories.register(ModBlocks.COMPACTING_DRAWER_BLOCK_ENTITY, CompactingDrawerBlockEntityRenderer::new); - ClientPlayNetworking.registerGlobalReceiver(CompressionOverrideSyncPayload.ID, (packet, context) -> - CompressionRecipeManager.of(context.player().networkHandler.getRecipeManager()).setOverrides(packet.overrides())); + ClientPlayNetworking.registerGlobalReceiver(CompressionRecipeSyncPayload.ID, (packet, context) -> + ClientCompressionRecipeManager.of(context.player().networkHandler).addLadders(packet.recipes())); ExtendedDrawers.SHIFT_ACCESS = Screen::hasShiftDown; } diff --git a/src/client/java/io/github/mattidragon/extendeddrawers/client/compression/ClientCompressionRecipeManager.java b/src/client/java/io/github/mattidragon/extendeddrawers/client/compression/ClientCompressionRecipeManager.java new file mode 100644 index 0000000..ad25c27 --- /dev/null +++ b/src/client/java/io/github/mattidragon/extendeddrawers/client/compression/ClientCompressionRecipeManager.java @@ -0,0 +1,37 @@ +package io.github.mattidragon.extendeddrawers.client.compression; + +import io.github.mattidragon.extendeddrawers.compacting.CompressionLadder; +import io.github.mattidragon.extendeddrawers.compacting.CompressionRecipeManager; +import net.fabricmc.fabric.api.transfer.v1.item.ItemVariant; +import net.minecraft.client.network.ClientPlayNetworkHandler; +import net.minecraft.world.World; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ClientCompressionRecipeManager implements CompressionRecipeManager { + private final Map ladders = new HashMap<>(); + + public static ClientCompressionRecipeManager of(ClientPlayNetworkHandler handler) { + return ((Provider) handler).extended_drawers$getCompactingManager(); + } + + public void addLadders(List recipes) { + for (var recipe : recipes) { + recipe.steps().forEach(step -> ladders.put(step.item(), recipe)); + } + } + + @Override + public CompressionLadder getLadder(ItemVariant item, World world) { + if (ladders.containsKey(item)) { + return ladders.get(item); + } + return new CompressionLadder(List.of(new CompressionLadder.Step(item, 1))); + } + + public interface Provider extends CompressionRecipeManager.Provider { + ClientCompressionRecipeManager extended_drawers$getCompactingManager(); + } +} diff --git a/src/client/java/io/github/mattidragon/extendeddrawers/client/config/ConfigScreenFactory.java b/src/client/java/io/github/mattidragon/extendeddrawers/client/config/ConfigScreenFactory.java index 3365134..44438ea 100644 --- a/src/client/java/io/github/mattidragon/extendeddrawers/client/config/ConfigScreenFactory.java +++ b/src/client/java/io/github/mattidragon/extendeddrawers/client/config/ConfigScreenFactory.java @@ -19,6 +19,7 @@ import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.render.LightmapTextureManager; import net.minecraft.client.render.OverlayTexture; +import net.minecraft.client.render.RenderLayer; import net.minecraft.item.Items; import net.minecraft.screen.PlayerScreenHandler; import net.minecraft.text.Text; @@ -335,40 +336,42 @@ public int render(DrawContext context, int x, int y, int renderWidth, float tick var playerPos = player == null ? BlockPos.ORIGIN : player.getBlockPos(); try (var ignored = ExtendedDrawers.CONFIG.override(newConfig)) { - context.drawSprite(x, y, 0, size, size, atlas.apply(id("block/single_drawer"))); - context.drawSprite(x + size, y, 0, size, size, atlas.apply(id("block/quad_drawer"))); - context.drawSprite(x + 2 * size, y, 0, size, size, atlas.apply(id("block/compacting_drawer"))); + context.drawSpriteStretched(RenderLayer::getGuiTextured, atlas.apply(id("block/single_drawer")), x, y, size, size); + context.drawSpriteStretched(RenderLayer::getGuiTextured, atlas.apply(id("block/quad_drawer")), x + size, y, size, size); + context.drawSpriteStretched(RenderLayer::getGuiTextured, atlas.apply(id("block/compacting_drawer")), x + 2 * size, y, size, size); matrices.push(); matrices.translate(x, y, 1); matrices.scale(size, size, -size); matrices.multiply(RotationAxis.POSITIVE_X.rotationDegrees(180)); matrices.translate(0.5, -0.5, 0); - - var voidingSprite = atlas.apply(Identifier.ofVanilla("item/lava_bucket")); - var lockSprite = atlas.apply(id("item/lock")); - var upgrade2Sprite = atlas.apply(id("item/t2_upgrade")); - var upgrade4Sprite = atlas.apply(id("item/t4_upgrade")); - - renderer.renderSlot(ItemVariant.of(Items.COBBLESTONE), String.valueOf((Long) 128L), false, false, List.of(lockSprite), matrices, context.getVertexConsumers(), LightmapTextureManager.MAX_LIGHT_COORDINATE, OverlayTexture.DEFAULT_UV, 0, playerPos, null); - - matrices.translate(0.75, 0.25, 0); - renderer.renderSlot(ItemVariant.of(Items.REDSTONE), String.valueOf((Long) 16L), true, false, List.of(lockSprite), matrices, context.getVertexConsumers(), LightmapTextureManager.MAX_LIGHT_COORDINATE, OverlayTexture.DEFAULT_UV, 0, playerPos, null); - matrices.translate(0.5, 0, 0); - renderer.renderSlot(ItemVariant.of(Items.GUNPOWDER), String.valueOf((Long) 32L), true, false, List.of(voidingSprite), matrices, context.getVertexConsumers(), LightmapTextureManager.MAX_LIGHT_COORDINATE, OverlayTexture.DEFAULT_UV, 0, playerPos, null); - matrices.translate(-0.5, -0.5, 0); - renderer.renderSlot(ItemVariant.of(Items.SUGAR), String.valueOf((Long) 64L), true, false, List.of(lockSprite, voidingSprite, upgrade2Sprite), matrices, context.getVertexConsumers(), LightmapTextureManager.MAX_LIGHT_COORDINATE, OverlayTexture.DEFAULT_UV, 0, playerPos, null); - matrices.translate(0.5, 0, 0); - renderer.renderSlot(ItemVariant.of(Items.GLOWSTONE_DUST), String.valueOf((Long) 128L), true, false, List.of(upgrade4Sprite), matrices, context.getVertexConsumers(), LightmapTextureManager.MAX_LIGHT_COORDINATE, OverlayTexture.DEFAULT_UV, 0, playerPos, null); - - matrices.translate(0.75, 0.5, 0); - renderer.renderIcons(List.of(lockSprite, voidingSprite, upgrade4Sprite), true, LightmapTextureManager.MAX_LIGHT_COORDINATE, OverlayTexture.DEFAULT_UV, matrices, context.getVertexConsumers()); - renderer.renderSlot(ItemVariant.of(Items.IRON_INGOT), String.valueOf((Long) 9L), true, false, List.of(), matrices, context.getVertexConsumers(), LightmapTextureManager.MAX_LIGHT_COORDINATE, OverlayTexture.DEFAULT_UV, 0, playerPos, null); - matrices.translate(0.25, -0.5, 0); - renderer.renderSlot(ItemVariant.of(Items.IRON_NUGGET), String.valueOf((Long) 81L), true, false, List.of(), matrices, context.getVertexConsumers(), LightmapTextureManager.MAX_LIGHT_COORDINATE, OverlayTexture.DEFAULT_UV, 0, playerPos, null); - matrices.translate(-0.5, 0, 0); - renderer.renderSlot(ItemVariant.of(Items.IRON_BLOCK), String.valueOf((Long) 1L), true, false, List.of(), matrices, context.getVertexConsumers(), LightmapTextureManager.MAX_LIGHT_COORDINATE, OverlayTexture.DEFAULT_UV, 0, playerPos, null); - + + context.draw(vertexConsumers -> { + var voidingSprite = atlas.apply(Identifier.ofVanilla("item/lava_bucket")); + var lockSprite = atlas.apply(id("item/lock")); + var upgrade2Sprite = atlas.apply(id("item/t2_upgrade")); + var upgrade4Sprite = atlas.apply(id("item/t4_upgrade")); + + renderer.renderSlot(ItemVariant.of(Items.COBBLESTONE), String.valueOf((Long) 128L), false, false, List.of(lockSprite), matrices, vertexConsumers, LightmapTextureManager.MAX_LIGHT_COORDINATE, OverlayTexture.DEFAULT_UV, 0, playerPos, null); + + matrices.translate(0.75, 0.25, 0); + renderer.renderSlot(ItemVariant.of(Items.REDSTONE), String.valueOf((Long) 16L), true, false, List.of(lockSprite), matrices, vertexConsumers, LightmapTextureManager.MAX_LIGHT_COORDINATE, OverlayTexture.DEFAULT_UV, 0, playerPos, null); + matrices.translate(0.5, 0, 0); + renderer.renderSlot(ItemVariant.of(Items.GUNPOWDER), String.valueOf((Long) 32L), true, false, List.of(voidingSprite), matrices, vertexConsumers, LightmapTextureManager.MAX_LIGHT_COORDINATE, OverlayTexture.DEFAULT_UV, 0, playerPos, null); + matrices.translate(-0.5, -0.5, 0); + renderer.renderSlot(ItemVariant.of(Items.SUGAR), String.valueOf((Long) 64L), true, false, List.of(lockSprite, voidingSprite, upgrade2Sprite), matrices, vertexConsumers, LightmapTextureManager.MAX_LIGHT_COORDINATE, OverlayTexture.DEFAULT_UV, 0, playerPos, null); + matrices.translate(0.5, 0, 0); + renderer.renderSlot(ItemVariant.of(Items.GLOWSTONE_DUST), String.valueOf((Long) 128L), true, false, List.of(upgrade4Sprite), matrices, vertexConsumers, LightmapTextureManager.MAX_LIGHT_COORDINATE, OverlayTexture.DEFAULT_UV, 0, playerPos, null); + + matrices.translate(0.75, 0.5, 0); + renderer.renderIcons(List.of(lockSprite, voidingSprite, upgrade4Sprite), true, LightmapTextureManager.MAX_LIGHT_COORDINATE, OverlayTexture.DEFAULT_UV, matrices, vertexConsumers); + renderer.renderSlot(ItemVariant.of(Items.IRON_INGOT), String.valueOf((Long) 9L), true, false, List.of(), matrices, vertexConsumers, LightmapTextureManager.MAX_LIGHT_COORDINATE, OverlayTexture.DEFAULT_UV, 0, playerPos, null); + matrices.translate(0.25, -0.5, 0); + renderer.renderSlot(ItemVariant.of(Items.IRON_NUGGET), String.valueOf((Long) 81L), true, false, List.of(), matrices, vertexConsumers, LightmapTextureManager.MAX_LIGHT_COORDINATE, OverlayTexture.DEFAULT_UV, 0, playerPos, null); + matrices.translate(-0.5, 0, 0); + renderer.renderSlot(ItemVariant.of(Items.IRON_BLOCK), String.valueOf((Long) 1L), true, false, List.of(), matrices, vertexConsumers, LightmapTextureManager.MAX_LIGHT_COORDINATE, OverlayTexture.DEFAULT_UV, 0, playerPos, null); + }); + matrices.pop(); } @@ -387,7 +390,7 @@ public int render(DrawContext graphics, int x, int y, int renderWidth, float tic var blockAtlas = MinecraftClient.getInstance().getSpriteAtlas(PlayerScreenHandler.BLOCK_ATLAS_TEXTURE); var sprite = blockAtlas.apply(id); - graphics.drawSprite(x + renderWidth / 3, y, 0, renderWidth / 3, renderWidth / 3, sprite); + graphics.drawSpriteStretched(RenderLayer::getGuiTextured, sprite, x + renderWidth / 3, y, renderWidth / 3, renderWidth / 3); return renderWidth / 3; } diff --git a/src/client/java/io/github/mattidragon/extendeddrawers/client/mixin/ClientPlayNetworkHandlerMixin.java b/src/client/java/io/github/mattidragon/extendeddrawers/client/mixin/ClientPlayNetworkHandlerMixin.java new file mode 100644 index 0000000..44672cf --- /dev/null +++ b/src/client/java/io/github/mattidragon/extendeddrawers/client/mixin/ClientPlayNetworkHandlerMixin.java @@ -0,0 +1,17 @@ +package io.github.mattidragon.extendeddrawers.client.mixin; + +import io.github.mattidragon.extendeddrawers.client.compression.ClientCompressionRecipeManager; +import net.minecraft.client.network.ClientPlayNetworkHandler; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; + +@Mixin(ClientPlayNetworkHandler.class) +public class ClientPlayNetworkHandlerMixin implements ClientCompressionRecipeManager.Provider { + @Unique + private final ClientCompressionRecipeManager compactingManager = new ClientCompressionRecipeManager(); + + @Override + public ClientCompressionRecipeManager extended_drawers$getCompactingManager() { + return compactingManager; + } +} diff --git a/src/client/java/io/github/mattidragon/extendeddrawers/client/mixin/ClientWorldMixin.java b/src/client/java/io/github/mattidragon/extendeddrawers/client/mixin/ClientWorldMixin.java new file mode 100644 index 0000000..913b54b --- /dev/null +++ b/src/client/java/io/github/mattidragon/extendeddrawers/client/mixin/ClientWorldMixin.java @@ -0,0 +1,18 @@ +package io.github.mattidragon.extendeddrawers.client.mixin; + +import io.github.mattidragon.extendeddrawers.client.compression.ClientCompressionRecipeManager; +import io.github.mattidragon.extendeddrawers.compacting.CompressionRecipeManager; +import io.github.mattidragon.extendeddrawers.mixin.WorldMixin; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.world.ClientWorld; +import org.spongepowered.asm.mixin.Mixin; + +import java.util.Objects; + +@Mixin(ClientWorld.class) +public class ClientWorldMixin extends WorldMixin { + @Override + public CompressionRecipeManager extended_drawers$getCompactingManager() { + return ((ClientCompressionRecipeManager.Provider) Objects.requireNonNull(MinecraftClient.getInstance().getNetworkHandler(), "network handler should exist")).extended_drawers$getCompactingManager(); + } +} diff --git a/src/client/java/io/github/mattidragon/extendeddrawers/client/renderer/AbstractDrawerBlockEntityRenderer.java b/src/client/java/io/github/mattidragon/extendeddrawers/client/renderer/AbstractDrawerBlockEntityRenderer.java index ccacac6..d6dc24b 100644 --- a/src/client/java/io/github/mattidragon/extendeddrawers/client/renderer/AbstractDrawerBlockEntityRenderer.java +++ b/src/client/java/io/github/mattidragon/extendeddrawers/client/renderer/AbstractDrawerBlockEntityRenderer.java @@ -14,9 +14,9 @@ import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.render.block.entity.BlockEntityRenderer; import net.minecraft.client.render.item.ItemRenderer; -import net.minecraft.client.render.model.json.ModelTransformationMode; import net.minecraft.client.texture.Sprite; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.item.ModelTransformationMode; import net.minecraft.screen.PlayerScreenHandler; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; @@ -29,7 +29,6 @@ import org.joml.Vector3f; import java.util.List; -import java.util.Objects; public abstract class AbstractDrawerBlockEntityRenderer implements BlockEntityRenderer { private static final Quaternionf ITEM_LIGHT_ROTATION_3D = RotationAxis.POSITIVE_X.rotationDegrees(-15).mul(RotationAxis.POSITIVE_Y.rotationDegrees(15)); @@ -103,7 +102,7 @@ public final boolean shouldRender(T drawer, Direction facing) { var pos = drawer.getPos(); var state = drawer.getCachedState(); - return Block.shouldDrawSide(state, world, pos, facing, pos.offset(facing)); + return Block.shouldDrawSide(state, world.getBlockState(pos.offset(facing)), facing); } public void renderIcons(List icons, boolean small, int light, int overlay, MatrixStack matrices, VertexConsumerProvider vertexConsumers) { diff --git a/src/client/java/io/github/mattidragon/extendeddrawers/client/screen/EditLimiterScreen.java b/src/client/java/io/github/mattidragon/extendeddrawers/client/screen/EditLimiterScreen.java index 0988a6c..1af02ed 100644 --- a/src/client/java/io/github/mattidragon/extendeddrawers/client/screen/EditLimiterScreen.java +++ b/src/client/java/io/github/mattidragon/extendeddrawers/client/screen/EditLimiterScreen.java @@ -7,6 +7,7 @@ import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.TextFieldWidget; +import net.minecraft.client.render.RenderLayer; import net.minecraft.screen.ScreenTexts; import net.minecraft.text.OrderedText; import net.minecraft.text.Style; @@ -94,7 +95,7 @@ private static boolean isValid(String text) { @Override public void renderBackground(DrawContext context, int mouseX, int mouseY, float delta) { renderInGameBackground(context); - context.drawTexture(TEXTURE, width / 2 - 64, height / 2 - 32, 0, 0, 128, 64, 128, 64); + context.drawTexture(RenderLayer::getGuiTextured, TEXTURE, width / 2 - 64, height / 2 - 32, 0, 0, 128, 64, 128, 64); } @Override diff --git a/src/client/resources/extended_drawers.client.mixins.json b/src/client/resources/extended_drawers.client.mixins.json index 702be7a..6d66940 100644 --- a/src/client/resources/extended_drawers.client.mixins.json +++ b/src/client/resources/extended_drawers.client.mixins.json @@ -6,6 +6,8 @@ "client": [ "ClientPlayerEntityMixin", "ClientPlayerInteractionManagerMixin", + "ClientPlayNetworkHandlerMixin", + "ClientWorldMixin", "RenderSystemAccess" ], "injectors": { diff --git a/src/main/generated/data/extended_drawers/recipe/access_point.json b/src/main/generated/data/extended_drawers/recipe/access_point.json index ab943ba..5f4b8a4 100644 --- a/src/main/generated/data/extended_drawers/recipe/access_point.json +++ b/src/main/generated/data/extended_drawers/recipe/access_point.json @@ -2,15 +2,9 @@ "type": "minecraft:crafting_shaped", "category": "misc", "key": { - "C": { - "item": "minecraft:cobblestone" - }, - "D": { - "tag": "extended_drawers:drawers" - }, - "I": { - "item": "minecraft:iron_ingot" - } + "C": "minecraft:cobblestone", + "D": "#extended_drawers:drawers", + "I": "minecraft:iron_ingot" }, "pattern": [ "CIC", diff --git a/src/main/generated/data/extended_drawers/recipe/compacting_drawer.json b/src/main/generated/data/extended_drawers/recipe/compacting_drawer.json index dc61883..02c0c9b 100644 --- a/src/main/generated/data/extended_drawers/recipe/compacting_drawer.json +++ b/src/main/generated/data/extended_drawers/recipe/compacting_drawer.json @@ -2,18 +2,10 @@ "type": "minecraft:crafting_shaped", "category": "misc", "key": { - "C": { - "item": "minecraft:chest" - }, - "I": { - "item": "minecraft:iron_block" - }, - "P": { - "item": "minecraft:piston" - }, - "S": { - "tag": "minecraft:stone_crafting_materials" - } + "C": "minecraft:chest", + "I": "minecraft:iron_block", + "P": "minecraft:piston", + "S": "#minecraft:stone_crafting_materials" }, "pattern": [ "SPS", diff --git a/src/main/generated/data/extended_drawers/recipe/connector.json b/src/main/generated/data/extended_drawers/recipe/connector.json index c4f6324..60e982e 100644 --- a/src/main/generated/data/extended_drawers/recipe/connector.json +++ b/src/main/generated/data/extended_drawers/recipe/connector.json @@ -2,12 +2,8 @@ "type": "minecraft:crafting_shaped", "category": "misc", "key": { - "L": { - "tag": "minecraft:logs" - }, - "P": { - "tag": "minecraft:planks" - } + "L": "#minecraft:logs", + "P": "#minecraft:planks" }, "pattern": [ "LPL", diff --git a/src/main/generated/data/extended_drawers/recipe/double_drawer.json b/src/main/generated/data/extended_drawers/recipe/double_drawer.json index 5d4da28..aee2666 100644 --- a/src/main/generated/data/extended_drawers/recipe/double_drawer.json +++ b/src/main/generated/data/extended_drawers/recipe/double_drawer.json @@ -2,15 +2,9 @@ "type": "minecraft:crafting_shaped", "category": "misc", "key": { - "C": { - "item": "minecraft:chest" - }, - "L": { - "tag": "minecraft:logs" - }, - "P": { - "tag": "minecraft:planks" - } + "C": "minecraft:chest", + "L": "#minecraft:logs", + "P": "#minecraft:planks" }, "pattern": [ "LPL", diff --git a/src/main/generated/data/extended_drawers/recipe/limiter.json b/src/main/generated/data/extended_drawers/recipe/limiter.json index 69ffde3..bd93023 100644 --- a/src/main/generated/data/extended_drawers/recipe/limiter.json +++ b/src/main/generated/data/extended_drawers/recipe/limiter.json @@ -2,15 +2,9 @@ "type": "minecraft:crafting_shaped", "category": "redstone", "key": { - "C": { - "item": "minecraft:copper_ingot" - }, - "E": { - "item": "minecraft:ender_pearl" - }, - "R": { - "item": "minecraft:redstone" - } + "C": "minecraft:copper_ingot", + "E": "minecraft:ender_pearl", + "R": "minecraft:redstone" }, "pattern": [ "RCR", diff --git a/src/main/generated/data/extended_drawers/recipe/lock.json b/src/main/generated/data/extended_drawers/recipe/lock.json index f479de2..373afe6 100644 --- a/src/main/generated/data/extended_drawers/recipe/lock.json +++ b/src/main/generated/data/extended_drawers/recipe/lock.json @@ -2,12 +2,8 @@ "type": "minecraft:crafting_shaped", "category": "equipment", "key": { - "G": { - "item": "minecraft:gold_ingot" - }, - "g": { - "item": "minecraft:gold_nugget" - } + "G": "minecraft:gold_ingot", + "g": "minecraft:gold_nugget" }, "pattern": [ " g ", diff --git a/src/main/generated/data/extended_drawers/recipe/quad_drawer.json b/src/main/generated/data/extended_drawers/recipe/quad_drawer.json index a50e8c1..049e7bd 100644 --- a/src/main/generated/data/extended_drawers/recipe/quad_drawer.json +++ b/src/main/generated/data/extended_drawers/recipe/quad_drawer.json @@ -2,15 +2,9 @@ "type": "minecraft:crafting_shaped", "category": "misc", "key": { - "C": { - "item": "minecraft:chest" - }, - "L": { - "tag": "minecraft:logs" - }, - "P": { - "tag": "minecraft:planks" - } + "C": "minecraft:chest", + "L": "#minecraft:logs", + "P": "#minecraft:planks" }, "pattern": [ "LCL", diff --git a/src/main/generated/data/extended_drawers/recipe/shadow_drawer.json b/src/main/generated/data/extended_drawers/recipe/shadow_drawer.json index 1778f09..481b0a5 100644 --- a/src/main/generated/data/extended_drawers/recipe/shadow_drawer.json +++ b/src/main/generated/data/extended_drawers/recipe/shadow_drawer.json @@ -2,12 +2,8 @@ "type": "minecraft:crafting_shaped", "category": "misc", "key": { - "C": { - "item": "minecraft:end_crystal" - }, - "E": { - "item": "minecraft:end_stone_bricks" - } + "C": "minecraft:end_crystal", + "E": "minecraft:end_stone_bricks" }, "pattern": [ "EEE", diff --git a/src/main/generated/data/extended_drawers/recipe/single_drawer.json b/src/main/generated/data/extended_drawers/recipe/single_drawer.json index 004171c..98da52f 100644 --- a/src/main/generated/data/extended_drawers/recipe/single_drawer.json +++ b/src/main/generated/data/extended_drawers/recipe/single_drawer.json @@ -2,15 +2,9 @@ "type": "minecraft:crafting_shaped", "category": "misc", "key": { - "C": { - "item": "minecraft:chest" - }, - "L": { - "tag": "minecraft:logs" - }, - "P": { - "tag": "minecraft:planks" - } + "C": "minecraft:chest", + "L": "#minecraft:logs", + "P": "#minecraft:planks" }, "pattern": [ "LPL", diff --git a/src/main/generated/data/extended_drawers/recipe/t1_upgrade.json b/src/main/generated/data/extended_drawers/recipe/t1_upgrade.json index b04c7a5..e89471e 100644 --- a/src/main/generated/data/extended_drawers/recipe/t1_upgrade.json +++ b/src/main/generated/data/extended_drawers/recipe/t1_upgrade.json @@ -2,15 +2,9 @@ "type": "minecraft:crafting_shaped", "category": "misc", "key": { - "B": { - "item": "extended_drawers:upgrade_frame" - }, - "M": { - "item": "minecraft:barrel" - }, - "S": { - "item": "minecraft:stick" - } + "B": "extended_drawers:upgrade_frame", + "M": "minecraft:barrel", + "S": "minecraft:stick" }, "pattern": [ "SSS", diff --git a/src/main/generated/data/extended_drawers/recipe/t2_upgrade.json b/src/main/generated/data/extended_drawers/recipe/t2_upgrade.json index 04354d0..85a2194 100644 --- a/src/main/generated/data/extended_drawers/recipe/t2_upgrade.json +++ b/src/main/generated/data/extended_drawers/recipe/t2_upgrade.json @@ -2,15 +2,9 @@ "type": "minecraft:crafting_shaped", "category": "misc", "key": { - "B": { - "item": "extended_drawers:t1_upgrade" - }, - "M": { - "item": "minecraft:iron_block" - }, - "S": { - "item": "minecraft:stick" - } + "B": "extended_drawers:t1_upgrade", + "M": "minecraft:iron_block", + "S": "minecraft:stick" }, "pattern": [ "SSS", diff --git a/src/main/generated/data/extended_drawers/recipe/t3_upgrade.json b/src/main/generated/data/extended_drawers/recipe/t3_upgrade.json index 8fa5c87..1137fcb 100644 --- a/src/main/generated/data/extended_drawers/recipe/t3_upgrade.json +++ b/src/main/generated/data/extended_drawers/recipe/t3_upgrade.json @@ -2,15 +2,9 @@ "type": "minecraft:crafting_shaped", "category": "misc", "key": { - "B": { - "item": "extended_drawers:t2_upgrade" - }, - "M": { - "item": "minecraft:diamond_block" - }, - "S": { - "item": "minecraft:blaze_rod" - } + "B": "extended_drawers:t2_upgrade", + "M": "minecraft:diamond_block", + "S": "minecraft:blaze_rod" }, "pattern": [ "SSS", diff --git a/src/main/generated/data/extended_drawers/recipe/t4_upgrade.json b/src/main/generated/data/extended_drawers/recipe/t4_upgrade.json index 9590603..34f1c08 100644 --- a/src/main/generated/data/extended_drawers/recipe/t4_upgrade.json +++ b/src/main/generated/data/extended_drawers/recipe/t4_upgrade.json @@ -2,15 +2,9 @@ "type": "minecraft:crafting_shaped", "category": "misc", "key": { - "B": { - "item": "extended_drawers:t3_upgrade" - }, - "M": { - "tag": "c:shulker_boxes" - }, - "S": { - "item": "minecraft:end_rod" - } + "B": "extended_drawers:t3_upgrade", + "M": "#c:shulker_boxes", + "S": "minecraft:end_rod" }, "pattern": [ "SSS", diff --git a/src/main/generated/data/extended_drawers/recipe/upgrade_frame.json b/src/main/generated/data/extended_drawers/recipe/upgrade_frame.json index 8cbcd39..c08c425 100644 --- a/src/main/generated/data/extended_drawers/recipe/upgrade_frame.json +++ b/src/main/generated/data/extended_drawers/recipe/upgrade_frame.json @@ -2,12 +2,8 @@ "type": "minecraft:crafting_shaped", "category": "misc", "key": { - "C": { - "item": "minecraft:cobblestone" - }, - "S": { - "item": "minecraft:stick" - } + "C": "minecraft:cobblestone", + "S": "minecraft:stick" }, "pattern": [ "SCS", diff --git a/src/main/java/io/github/mattidragon/extendeddrawers/ExtendedDrawers.java b/src/main/java/io/github/mattidragon/extendeddrawers/ExtendedDrawers.java index ba91891..67fceb1 100644 --- a/src/main/java/io/github/mattidragon/extendeddrawers/ExtendedDrawers.java +++ b/src/main/java/io/github/mattidragon/extendeddrawers/ExtendedDrawers.java @@ -5,7 +5,7 @@ import io.github.mattidragon.extendeddrawers.misc.DrawerCacheCommand; import io.github.mattidragon.extendeddrawers.misc.ShiftAccess; import io.github.mattidragon.extendeddrawers.network.NetworkRegistry; -import io.github.mattidragon.extendeddrawers.networking.CompressionOverrideSyncPayload; +import io.github.mattidragon.extendeddrawers.networking.CompressionRecipeSyncPayload; import io.github.mattidragon.extendeddrawers.networking.SetLimiterLimitPayload; import io.github.mattidragon.extendeddrawers.registry.ModBlocks; import io.github.mattidragon.extendeddrawers.registry.ModDataComponents; @@ -48,7 +48,7 @@ public void onInitialize() { registerItemGroup(); registerCommand(); NetworkRegistry.register(); - CompressionOverrideSyncPayload.register(); + CompressionRecipeSyncPayload.register(); SetLimiterLimitPayload.register(); DrawerCacheCommand.register(); ResourceManagerHelper.registerBuiltinResourcePack(id("alt"), MOD_CONTAINER, Text.translatable("resourcepack.extended_drawers.alt"), ResourcePackActivationType.NORMAL); diff --git a/src/main/java/io/github/mattidragon/extendeddrawers/block/AccessPointBlock.java b/src/main/java/io/github/mattidragon/extendeddrawers/block/AccessPointBlock.java index 79325df..9aaa11f 100644 --- a/src/main/java/io/github/mattidragon/extendeddrawers/block/AccessPointBlock.java +++ b/src/main/java/io/github/mattidragon/extendeddrawers/block/AccessPointBlock.java @@ -50,7 +50,7 @@ public int getComparatorOutput(BlockState state, World world, BlockPos pos) { @Override protected ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) { if (!player.canModifyBlocks()) return ActionResult.PASS; - if (!(world instanceof ServerWorld serverWorld)) return ActionResult.CONSUME_PARTIAL; + if (!(world instanceof ServerWorld serverWorld)) return ActionResult.CONSUME; var storage = NetworkStorageCache.get(serverWorld, pos); @@ -76,7 +76,7 @@ protected ActionResult onUse(BlockState state, World world, BlockPos pos, Player inserted = (int) storage.insert(ItemVariant.of(playerStack), playerStack.getCount(), t); playerStack.decrement(inserted); } - if (inserted == 0) return ActionResult.CONSUME_PARTIAL; + if (inserted == 0) return ActionResult.CONSUME; t.commit(); return ActionResult.SUCCESS; diff --git a/src/main/java/io/github/mattidragon/extendeddrawers/block/ShadowDrawerBlock.java b/src/main/java/io/github/mattidragon/extendeddrawers/block/ShadowDrawerBlock.java index 27e19e3..7a828fb 100644 --- a/src/main/java/io/github/mattidragon/extendeddrawers/block/ShadowDrawerBlock.java +++ b/src/main/java/io/github/mattidragon/extendeddrawers/block/ShadowDrawerBlock.java @@ -24,7 +24,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.server.world.ServerWorld; import net.minecraft.state.StateManager; -import net.minecraft.state.property.DirectionProperty; import net.minecraft.state.property.EnumProperty; import net.minecraft.state.property.Properties; import net.minecraft.util.ActionResult; @@ -41,7 +40,7 @@ import static io.github.mattidragon.extendeddrawers.misc.DrawerInteractionStatusManager.getAndResetInsertStatus; public class ShadowDrawerBlock extends NetworkBlockWithEntity implements CreativeBreakBlocker, DrawerInteractionHandler { - public static final DirectionProperty FACING = Properties.HORIZONTAL_FACING; + public static final EnumProperty FACING = Properties.HORIZONTAL_FACING; public static final EnumProperty FACE = Properties.BLOCK_FACE; public ShadowDrawerBlock(Settings settings) { @@ -99,7 +98,7 @@ public BlockState mirror(BlockState state, BlockMirror mirror) { @Override public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) { if (!isFront(state, hit.getSide()) || !player.canModifyBlocks()) return ActionResult.PASS; - if (!(world instanceof ServerWorld serverWorld)) return ActionResult.CONSUME_PARTIAL; + if (!(world instanceof ServerWorld serverWorld)) return ActionResult.CONSUME; var drawer = getBlockEntity(world, pos); if (drawer == null) return ActionResult.PASS; @@ -128,7 +127,7 @@ public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEnt inserted = (int) storage.insert(ItemVariant.of(playerStack), playerStack.getCount(), t); playerStack.decrement(inserted); } - if (inserted == 0) return ActionResult.CONSUME_PARTIAL; + if (inserted == 0) return ActionResult.CONSUME; t.commit(); return ActionResult.SUCCESS; diff --git a/src/main/java/io/github/mattidragon/extendeddrawers/block/base/NetworkBlock.java b/src/main/java/io/github/mattidragon/extendeddrawers/block/base/NetworkBlock.java index 7fa9389..8178462 100644 --- a/src/main/java/io/github/mattidragon/extendeddrawers/block/base/NetworkBlock.java +++ b/src/main/java/io/github/mattidragon/extendeddrawers/block/base/NetworkBlock.java @@ -8,21 +8,23 @@ import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; +import net.minecraft.util.math.random.Random; import net.minecraft.world.World; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.WorldView; +import net.minecraft.world.tick.ScheduledTickView; import org.jetbrains.annotations.Nullable; public abstract class NetworkBlock extends Block implements NetworkComponent { protected NetworkBlock(Settings settings) { super(settings); } - + @Override - public BlockState getStateForNeighborUpdate(BlockState state, Direction direction, BlockState neighborState, WorldAccess world, BlockPos pos, BlockPos neighborPos) { + protected BlockState getStateForNeighborUpdate(BlockState state, WorldView world, ScheduledTickView tickView, BlockPos pos, Direction direction, BlockPos neighborPos, BlockState neighborState, Random random) { if (world instanceof ServerWorld serverWorld && neighborState.getBlock() instanceof NetworkComponent) { NetworkRegistry.UNIVERSE.getGraphWorld(serverWorld).updateNodes(pos); } - return super.getStateForNeighborUpdate(state, direction, neighborState, world, pos, neighborPos); + return super.getStateForNeighborUpdate(state, world, tickView, pos, direction, neighborPos, neighborState, random); } @Override diff --git a/src/main/java/io/github/mattidragon/extendeddrawers/block/base/StorageDrawerBlock.java b/src/main/java/io/github/mattidragon/extendeddrawers/block/base/StorageDrawerBlock.java index 7a4f880..8dc24ca 100644 --- a/src/main/java/io/github/mattidragon/extendeddrawers/block/base/StorageDrawerBlock.java +++ b/src/main/java/io/github/mattidragon/extendeddrawers/block/base/StorageDrawerBlock.java @@ -21,7 +21,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.server.world.ServerWorld; import net.minecraft.state.StateManager; -import net.minecraft.state.property.DirectionProperty; import net.minecraft.state.property.EnumProperty; import net.minecraft.state.property.Properties; import net.minecraft.util.*; @@ -35,7 +34,7 @@ import org.jetbrains.annotations.Nullable; public abstract class StorageDrawerBlock extends NetworkBlockWithEntity implements DrawerInteractionHandler, CreativeBreakBlocker { - public static final DirectionProperty FACING = Properties.HORIZONTAL_FACING; + public static final EnumProperty FACING = Properties.HORIZONTAL_FACING; public static final EnumProperty FACE = Properties.BLOCK_FACE; protected StorageDrawerBlock(Settings settings) { @@ -118,7 +117,7 @@ public void onBlockBreakStart(BlockState state, World world, BlockPos pos, Playe public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, BlockHitResult hit) { if (!isFront(state, hit.getSide()) || !player.canModifyBlocks()) return ActionResult.PASS; - if (!(world instanceof ServerWorld)) return ActionResult.CONSUME_PARTIAL; + if (!(world instanceof ServerWorld)) return ActionResult.CONSUME; var internalPos = DrawerRaycastUtil.calculateFaceLocation(pos, hit.getPos(), hit.getSide(), state.get(FACING), state.get(FACE)); if (internalPos == null) return ActionResult.PASS; @@ -154,7 +153,7 @@ public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEnt inserted = (int) ((SingleSlotStorage) storage).insert(ItemVariant.of(playerStack), playerStack.getCount(), t); playerStack.decrement(inserted); } - if (inserted == 0) return ActionResult.CONSUME_PARTIAL; + if (inserted == 0) return ActionResult.CONSUME; t.commit(); return ActionResult.CONSUME; diff --git a/src/main/java/io/github/mattidragon/extendeddrawers/block/entity/CompactingDrawerBlockEntity.java b/src/main/java/io/github/mattidragon/extendeddrawers/block/entity/CompactingDrawerBlockEntity.java index 39a5290..6294722 100644 --- a/src/main/java/io/github/mattidragon/extendeddrawers/block/entity/CompactingDrawerBlockEntity.java +++ b/src/main/java/io/github/mattidragon/extendeddrawers/block/entity/CompactingDrawerBlockEntity.java @@ -13,6 +13,7 @@ import net.minecraft.network.packet.s2c.play.BlockEntityUpdateS2CPacket; import net.minecraft.registry.RegistryWrapper; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; import java.util.stream.Stream; @@ -63,7 +64,13 @@ public Stream streamStorages() { public boolean isEmpty() { return storage.getUpgrade() == null && storage.isBlank() && !storage.isHidden() && !storage.isLocked() && !storage.isVoiding(); } - + + @Override + public void setWorld(World world) { + super.setWorld(world); + storage.updateSlots(); // Force compression ladders to load + } + @Override public void readNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup registryLookup) { storage.readNbt(nbt.getCompound("storage"), registryLookup); diff --git a/src/main/java/io/github/mattidragon/extendeddrawers/block/entity/StorageDrawerBlockEntity.java b/src/main/java/io/github/mattidragon/extendeddrawers/block/entity/StorageDrawerBlockEntity.java index c03d065..eccaf58 100644 --- a/src/main/java/io/github/mattidragon/extendeddrawers/block/entity/StorageDrawerBlockEntity.java +++ b/src/main/java/io/github/mattidragon/extendeddrawers/block/entity/StorageDrawerBlockEntity.java @@ -22,7 +22,7 @@ public StorageDrawerBlockEntity(BlockEntityType type, BlockPos pos, BlockStat public void onSlotChanged(boolean sortingChanged) { if (world instanceof ServerWorld serverWorld) { // Using this instead of markDirty to handle cases where drawer is in unloaded chunks (why doesn't minecraft save in unloaded chunks?) - world.getWorldChunk(pos).setNeedsSaving(true); + world.getWorldChunk(pos).markNeedsSaving(); UpdateHandler.scheduleUpdate(serverWorld, pos, sortingChanged ? UpdateHandler.ChangeType.CONTENT : UpdateHandler.ChangeType.COUNT); var state = getCachedState(); world.updateListeners(pos, state, state, Block.NOTIFY_LISTENERS); diff --git a/src/main/java/io/github/mattidragon/extendeddrawers/compacting/CompressionLadder.java b/src/main/java/io/github/mattidragon/extendeddrawers/compacting/CompressionLadder.java index f4a0122..2d6a96b 100644 --- a/src/main/java/io/github/mattidragon/extendeddrawers/compacting/CompressionLadder.java +++ b/src/main/java/io/github/mattidragon/extendeddrawers/compacting/CompressionLadder.java @@ -1,11 +1,16 @@ package io.github.mattidragon.extendeddrawers.compacting; +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; +import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap; import net.fabricmc.fabric.api.transfer.v1.item.ItemVariant; +import net.minecraft.item.Item; import net.minecraft.network.RegistryByteBuf; import net.minecraft.network.codec.PacketCodec; import net.minecraft.network.codec.PacketCodecs; import java.util.List; +import java.util.stream.Collectors; /** * Represents a bidirectional ladder of compression recipes. @@ -13,16 +18,31 @@ * Each step after that has a new item (ingots, blocks) and a size that counts how many of the first tier is necessary (9, 81). */ public record CompressionLadder(List steps) { - public static final PacketCodec STEP_PACKET_CODEC = PacketCodec.tuple( - ItemVariant.PACKET_CODEC, Step::item, - PacketCodecs.VAR_INT, Step::size, - Step::new - ); + public static final Codec CODEC = Codec.unboundedMap( + Codec.withAlternative( + ItemVariant.CODEC.validate(variant -> variant.isBlank() ? DataResult.error(() -> "Cannot use air") : DataResult.success(variant)), + Item.ENTRY_CODEC.flatComapMap( + entry -> ItemVariant.of(entry.value()), + variant -> variant.hasComponents() ? DataResult.error(() -> "Cannot serialize components") : DataResult.success(variant.getRegistryEntry())) + ), + Codec.intRange(1, Integer.MAX_VALUE)) + .xmap(map -> new CompressionLadder(map.entrySet().stream().map(entry -> new Step(entry.getKey(), entry.getValue())).toList()), + ladder -> ladder.steps.stream().collect(Collectors.toMap(Step::item, Step::size, (a, b) -> a, Object2ObjectArrayMap::new))) + .validate(ladder -> { + var prevSize = 1; + for (var step : ladder.steps) { + if (step.size < prevSize) { + var finalPrevSize = prevSize; + return DataResult.error(() -> "Compression ladder entries must have increasing size order, but %s < %s".formatted(step.size, finalPrevSize)); + } + prevSize = step.size; + } + return DataResult.success(ladder); + }); public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( - STEP_PACKET_CODEC.collect(PacketCodecs.toList()), CompressionLadder::steps, - CompressionLadder::new - ); - + Step.PACKET_CODEC.collect(PacketCodecs.toList()), CompressionLadder::steps, + CompressionLadder::new); + public CompressionLadder(List steps) { this.steps = List.copyOf(steps); } @@ -32,6 +52,11 @@ public CompressionLadder(List steps) { * @param size The amount of the first step required to craft this one. */ public record Step(ItemVariant item, int size) { + public static final PacketCodec PACKET_CODEC = PacketCodec.tuple( + ItemVariant.PACKET_CODEC, Step::item, + PacketCodecs.VAR_INT, Step::size, + Step::new + ); } public int getPosition(ItemVariant item) { diff --git a/src/main/java/io/github/mattidragon/extendeddrawers/compacting/CompressionOverrideLoader.java b/src/main/java/io/github/mattidragon/extendeddrawers/compacting/CompressionOverrideLoader.java index 936b3cb..47eec1d 100644 --- a/src/main/java/io/github/mattidragon/extendeddrawers/compacting/CompressionOverrideLoader.java +++ b/src/main/java/io/github/mattidragon/extendeddrawers/compacting/CompressionOverrideLoader.java @@ -1,85 +1,23 @@ package io.github.mattidragon.extendeddrawers.compacting; -import com.google.gson.Gson; -import com.google.gson.JsonElement; -import com.google.gson.JsonParseException; -import com.mojang.brigadier.StringReader; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import io.github.mattidragon.extendeddrawers.ExtendedDrawers; -import net.fabricmc.fabric.api.transfer.v1.item.ItemVariant; -import net.minecraft.command.argument.ItemStringReader; -import net.minecraft.item.ItemStack; -import net.minecraft.registry.DynamicRegistryManager; -import net.minecraft.registry.Registries; import net.minecraft.resource.JsonDataLoader; import net.minecraft.resource.ResourceManager; import net.minecraft.util.Identifier; -import net.minecraft.util.JsonHelper; import net.minecraft.util.profiler.Profiler; -import java.util.ArrayList; -import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; -public class CompressionOverrideLoader extends JsonDataLoader { - private static final Gson GSON = new Gson(); - private final CompressionRecipeManager compressionRecipeManager; +public class CompressionOverrideLoader extends JsonDataLoader { + private final ServerCompressionRecipeManager compressionRecipeManager; - public CompressionOverrideLoader(CompressionRecipeManager compressionRecipeManager) { - super(GSON, "extended_drawers/compression_overrides"); + public CompressionOverrideLoader(ServerCompressionRecipeManager compressionRecipeManager) { + super(CompressionLadder.CODEC, "extended_drawers/compression_overrides"); this.compressionRecipeManager = compressionRecipeManager; } @Override - protected void apply(Map prepared, ResourceManager manager, Profiler profiler) { - var overrides = new ArrayList(); - for (var overrideEntry : prepared.entrySet()) { - var id = overrideEntry.getKey(); - var json = overrideEntry.getValue(); - - try { - var values = JsonHelper.asObject(json, "compression override"); - var steps = new LinkedHashMap(); - var currentCompression = 0; - - for (var stepEntry : values.asMap().entrySet()) { - var item = parseItem(stepEntry.getKey()); - var compressionAmount = JsonHelper.asInt(stepEntry.getValue(), "compression amount for " + stepEntry.getKey()); - if (compressionAmount == 0) throw new JsonParseException("Illegal compression amount for " + stepEntry.getKey() + ": 0"); - if (compressionAmount < currentCompression) throw new JsonParseException("Illegal compression amount for %s: %d, amounts should always rise or stay equal".formatted(stepEntry.getKey(), compressionAmount)); - currentCompression = compressionAmount; - - steps.put(item, compressionAmount); - } - - if (steps.isEmpty()) { - continue; // Allows disabling overrides using empty files instead of load conditions or pack filters - } - - overrides.add(new CompressionLadder(steps.entrySet() - .stream() - .map(entry -> new CompressionLadder.Step(entry.getKey(), entry.getValue())) - .toList())); - } catch (IllegalArgumentException | JsonParseException e) { - ExtendedDrawers.LOGGER.error("Parsing error loading compression override {}", id, e); - } - } - compressionRecipeManager.setOverrides(overrides); - } - - private ItemVariant parseItem(String data) { - try { - var reader = new StringReader(data); - var result = new ItemStringReader(DynamicRegistryManager.of(Registries.REGISTRIES)).consume(reader); - if (reader.getRemainingLength() != 0) { - throw new JsonParseException("Failed to parse item, found trailing data: '%s'".formatted(reader.getRemaining())); - } - - var stack = new ItemStack(result.item()); - stack.applyChanges(result.components()); - return ItemVariant.of(stack); - } catch (CommandSyntaxException e) { - throw new JsonParseException("Failed to parse item", e); - } + protected void apply(Map prepared, ResourceManager manager, Profiler profiler) { + compressionRecipeManager.setOverrides(List.copyOf(prepared.values())); } } diff --git a/src/main/java/io/github/mattidragon/extendeddrawers/compacting/CompressionRecipeManager.java b/src/main/java/io/github/mattidragon/extendeddrawers/compacting/CompressionRecipeManager.java index e7c1ccd..0f6194e 100644 --- a/src/main/java/io/github/mattidragon/extendeddrawers/compacting/CompressionRecipeManager.java +++ b/src/main/java/io/github/mattidragon/extendeddrawers/compacting/CompressionRecipeManager.java @@ -1,155 +1,16 @@ package io.github.mattidragon.extendeddrawers.compacting; import net.fabricmc.fabric.api.transfer.v1.item.ItemVariant; -import net.minecraft.item.ItemStack; -import net.minecraft.recipe.RecipeEntry; -import net.minecraft.recipe.RecipeManager; -import net.minecraft.recipe.RecipeType; -import net.minecraft.recipe.input.CraftingRecipeInput; import net.minecraft.world.World; -import org.jetbrains.annotations.Nullable; -import java.util.*; -import java.util.function.Function; -import java.util.stream.IntStream; -import java.util.stream.Stream; - -public final class CompressionRecipeManager { - private final RecipeManager recipeManager; - private final Map ladders = new HashMap<>(); - private final List overrides = new ArrayList<>(); - - public CompressionRecipeManager(RecipeManager recipeManager) { - this.recipeManager = recipeManager; - } - - public static CompressionRecipeManager of(RecipeManager recipeManager) { - return ((Provider) recipeManager).extended_drawers$getCompactingManager(); - } - - public void setOverrides(List overrides) { - this.overrides.clear(); - this.overrides.addAll(overrides); - reload(); - } - - public List getOverrides() { - return overrides; - } - - public void reload() { - ladders.clear(); - for (var override : overrides) { - addLadder(override); - } - } - - public CompressionLadder getLadder(ItemVariant item, World world) { - if (ladders.containsKey(item)) - return ladders.get(item); - var ladder = buildLadder(item, world); - // Put ladder in map for all items - addLadder(ladder); - return ladder; - } - - private void addLadder(CompressionLadder ladder) { - ladder.steps().forEach(step -> ladders.put(step.item(), ladder)); - } - - private CompressionLadder buildLadder(ItemVariant item, World world) { - var bottom = findBottom(item, world); - var ladder = new ArrayList(); - var visited = new HashSet(); - var currentItem = bottom; - var currentSize = 1; - visited.add(currentItem); - ladder.add(new CompressionLadder.Step(currentItem, currentSize)); - - while (true) { - var pair = findCompressionRecipe(currentItem, world); - if (pair == null) break; // Reached top of ladder - currentItem = pair.compressed; - currentSize *= pair.scale; - if (!visited.add(currentItem)) break; // Ladder is cyclic, all items accounted for - ladder.add(new CompressionLadder.Step(currentItem, currentSize)); - } - return new CompressionLadder(List.copyOf(ladder)); - } - - private ItemVariant findBottom(ItemVariant item, World world) { - var visited = new HashSet(); - var candidate = item; - while (true) { - var pair = findDecompressionRecipe(candidate, world); - if (pair == null) break; // Reached bottom - if (visited.contains(pair.decompressed)) break; // Next item would be a cycle, this is the bottom now - candidate = pair.decompressed; - visited.add(candidate); - } - return candidate; - } - - @Nullable - private RecipePair findCompressionRecipe(ItemVariant decompressed, World world) { - return IntStream.of(3, 2, 1) - .mapToObj(size -> findCompressionRecipeForSize(decompressed, world, size)) - .flatMap(Function.identity()) - .findFirst() - .orElse(null); - } - - private Stream findCompressionRecipeForSize(ItemVariant decompressed, World world, int size) { - var decompressedStack = decompressed.toStack(size * size); - return findRecipes(decompressed.toStack(), size, world) // Find compression recipes - .filter(compressed -> findRecipes(compressed, 1, world).anyMatch(decompressed2 -> ItemStack.areEqual(decompressed2, decompressedStack))) // Find matching decompression recipe - .map(compressed -> new RecipePair(ItemVariant.of(compressed), decompressed, size * size)); - } - - @Nullable - private RecipePair findDecompressionRecipe(ItemVariant compressed, World world) { - var compressedStack = compressed.toStack(); - return findRecipes(compressedStack, 1, world) // Find decompression recipe - .flatMap(decompressed -> IntStream.of(3, 2, 1) // Check each size from largest to smallest for matching compression recipes - .filter(size -> findRecipes(decompressed, size, world).anyMatch(compressed2 -> ItemStack.areEqual(compressedStack, compressed2))) - .mapToObj(size -> new RecipePair(compressed, ItemVariant.of(decompressed), size * size))) - .findFirst() - .orElse(null); - } - - private Stream findRecipes(ItemStack stack, int size, World world) { - var inventory = createInventory(stack, size); - return recipeManager.getAllMatches(RecipeType.CRAFTING, inventory, world) - .stream() - .map(RecipeEntry::value) - .filter(recipe -> recipe.getRemainder(inventory).stream().allMatch(ItemStack::isEmpty)) // We can't deal with remainders, so we just prevent recipe with them from being used - .map(recipe -> recipe.craft(inventory, world.getRegistryManager())) - .filter(result -> !result.isEmpty()); - } - - /** - * Creates a dummy crafting inventory. Similar to sheep dying so support should be fine - * @param stack The stack to fill the inventory with - * @param size The width and height of the inventory. Slot count is size squared. - * @return A filled crafting inventory of specified size - */ - private CraftingRecipeInput createInventory(ItemStack stack, int size) { - var list = new ArrayList(size * size); - for (int i = 0; i < size * size; i++) { - list.add(stack); - } - return CraftingRecipeInput.create(size, size, list); - } - - private record RecipePair(ItemVariant compressed, ItemVariant decompressed, int scale) { +public interface CompressionRecipeManager { + CompressionLadder getLadder(ItemVariant item, World world); + + static CompressionRecipeManager of(World world) { + return ((Provider) world).extended_drawers$getCompactingManager(); } - - /** - * Injected into {@link RecipeManager}. - */ - public interface Provider { - default CompressionRecipeManager extended_drawers$getCompactingManager() { - throw new AssertionError("extended_drawers$getCompactingManager must be overridden"); - } + + interface Provider { + CompressionRecipeManager extended_drawers$getCompactingManager(); } } diff --git a/src/main/java/io/github/mattidragon/extendeddrawers/compacting/ServerCompressionRecipeManager.java b/src/main/java/io/github/mattidragon/extendeddrawers/compacting/ServerCompressionRecipeManager.java new file mode 100644 index 0000000..70b8751 --- /dev/null +++ b/src/main/java/io/github/mattidragon/extendeddrawers/compacting/ServerCompressionRecipeManager.java @@ -0,0 +1,159 @@ +package io.github.mattidragon.extendeddrawers.compacting; + +import io.github.mattidragon.extendeddrawers.misc.ServerRecipeManagerAccess; +import io.github.mattidragon.extendeddrawers.networking.CompressionRecipeSyncPayload; +import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; +import net.fabricmc.fabric.api.transfer.v1.item.ItemVariant; +import net.minecraft.item.ItemStack; +import net.minecraft.recipe.RecipeEntry; +import net.minecraft.recipe.RecipeType; +import net.minecraft.recipe.ServerRecipeManager; +import net.minecraft.recipe.input.CraftingRecipeInput; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.world.World; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +public final class ServerCompressionRecipeManager implements CompressionRecipeManager { + private final ServerRecipeManager recipeManager; + private final Map ladders = new HashMap<>(); + private final List overrides = new ArrayList<>(); + + public ServerCompressionRecipeManager(ServerRecipeManager recipeManager) { + this.recipeManager = recipeManager; + } + + public static ServerCompressionRecipeManager of(ServerRecipeManager recipeManager) { + return ((Provider) recipeManager).extended_drawers$getCompactingManager(); + } + + public void setOverrides(List overrides) { + this.overrides.clear(); + this.overrides.addAll(overrides); + reload(); + } + + public Collection getLadders() { + return ladders.values(); + } + + public void reload() { + ladders.clear(); + for (var override : overrides) { + addLadder(override); + } + } + + @Override + public CompressionLadder getLadder(ItemVariant item, World world) { + if (ladders.containsKey(item)) + return ladders.get(item); + var ladder = buildLadder(item, world); + // Put ladder in map for all items + addLadder(ladder); + if (world instanceof ServerWorld serverWorld) { + for (var player : serverWorld.getPlayers()) { + ServerPlayNetworking.send(player, new CompressionRecipeSyncPayload(List.of(ladder), false)); + } + } + return ladder; + } + + private void addLadder(CompressionLadder ladder) { + ladder.steps().forEach(step -> ladders.put(step.item(), ladder)); + } + + private CompressionLadder buildLadder(ItemVariant item, World world) { + var bottom = findBottom(item, world); + var ladder = new ArrayList(); + var visited = new HashSet(); + var currentItem = bottom; + var currentSize = 1; + visited.add(currentItem); + ladder.add(new CompressionLadder.Step(currentItem, currentSize)); + + while (true) { + var pair = findCompressionRecipe(currentItem, world); + if (pair == null) break; // Reached top of ladder + currentItem = pair.compressed; + currentSize *= pair.scale; + if (!visited.add(currentItem)) break; // Ladder is cyclic, all items accounted for + ladder.add(new CompressionLadder.Step(currentItem, currentSize)); + } + return new CompressionLadder(List.copyOf(ladder)); + } + + private ItemVariant findBottom(ItemVariant item, World world) { + var visited = new HashSet(); + var candidate = item; + while (true) { + var pair = findDecompressionRecipe(candidate, world); + if (pair == null) break; // Reached bottom + if (visited.contains(pair.decompressed)) break; // Next item would be a cycle, this is the bottom now + candidate = pair.decompressed; + visited.add(candidate); + } + return candidate; + } + + @Nullable + private RecipePair findCompressionRecipe(ItemVariant decompressed, World world) { + return IntStream.of(3, 2, 1) + .mapToObj(size -> findCompressionRecipeForSize(decompressed, world, size)) + .flatMap(Function.identity()) + .findFirst() + .orElse(null); + } + + private Stream findCompressionRecipeForSize(ItemVariant decompressed, World world, int size) { + var decompressedStack = decompressed.toStack(size * size); + return findRecipes(decompressed.toStack(), size, world) // Find compression recipes + .filter(compressed -> findRecipes(compressed, 1, world).anyMatch(decompressed2 -> ItemStack.areEqual(decompressed2, decompressedStack))) // Find matching decompression recipe + .map(compressed -> new RecipePair(ItemVariant.of(compressed), decompressed, size * size)); + } + + @Nullable + private RecipePair findDecompressionRecipe(ItemVariant compressed, World world) { + var compressedStack = compressed.toStack(); + return findRecipes(compressedStack, 1, world) // Find decompression recipe + .flatMap(decompressed -> IntStream.of(3, 2, 1) // Check each size from largest to smallest for matching compression recipes + .filter(size -> findRecipes(decompressed, size, world).anyMatch(compressed2 -> ItemStack.areEqual(compressedStack, compressed2))) + .mapToObj(size -> new RecipePair(compressed, ItemVariant.of(decompressed), size * size))) + .findFirst() + .orElse(null); + } + + private Stream findRecipes(ItemStack stack, int size, World world) { + var inventory = createInventory(stack, size); + return ((ServerRecipeManagerAccess) recipeManager).getPreparedRecipes().find(RecipeType.CRAFTING, inventory, world) + .map(RecipeEntry::value) + .filter(recipe -> recipe.getRecipeRemainders(inventory).stream().allMatch(ItemStack::isEmpty)) // We can't deal with remainders, so we just prevent recipe with them from being used + .map(recipe -> recipe.craft(inventory, world.getRegistryManager())) + .filter(result -> !result.isEmpty()); + } + + /** + * Creates a dummy crafting inventory. Similar to sheep dying so support should be fine + * @param stack The stack to fill the inventory with + * @param size The width and height of the inventory. Slot count is size squared. + * @return A filled crafting inventory of specified size + */ + private CraftingRecipeInput createInventory(ItemStack stack, int size) { + var list = new ArrayList(size * size); + for (int i = 0; i < size * size; i++) { + list.add(stack); + } + return CraftingRecipeInput.create(size, size, list); + } + + private record RecipePair(ItemVariant compressed, ItemVariant decompressed, int scale) { + } + + public interface Provider extends CompressionRecipeManager.Provider { + ServerCompressionRecipeManager extended_drawers$getCompactingManager(); + } +} diff --git a/src/main/java/io/github/mattidragon/extendeddrawers/datagen/DrawersRecipeGenerator.java b/src/main/java/io/github/mattidragon/extendeddrawers/datagen/DrawersRecipeGenerator.java new file mode 100644 index 0000000..8b4f635 --- /dev/null +++ b/src/main/java/io/github/mattidragon/extendeddrawers/datagen/DrawersRecipeGenerator.java @@ -0,0 +1,159 @@ +package io.github.mattidragon.extendeddrawers.datagen; + +import io.github.mattidragon.extendeddrawers.ExtendedDrawers; +import io.github.mattidragon.extendeddrawers.recipe.CopyLimiterRecipe; +import io.github.mattidragon.extendeddrawers.registry.ModItems; +import io.github.mattidragon.extendeddrawers.registry.ModTags; +import net.fabricmc.fabric.api.tag.convention.v2.ConventionalItemTags; +import net.minecraft.data.server.recipe.ComplexRecipeJsonBuilder; +import net.minecraft.data.server.recipe.RecipeExporter; +import net.minecraft.data.server.recipe.RecipeGenerator; +import net.minecraft.item.Item; +import net.minecraft.item.Items; +import net.minecraft.recipe.Ingredient; +import net.minecraft.recipe.book.RecipeCategory; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.RegistryWrapper; +import net.minecraft.registry.tag.ItemTags; + +class DrawersRecipeGenerator extends RecipeGenerator { + public DrawersRecipeGenerator(RegistryWrapper.WrapperLookup registries, RecipeExporter exporter) { + super(registries, exporter); + } + + @Override + public void generate() { + offerUpgradeRecipe(exporter, ModItems.T1_UPGRADE, Ingredient.ofItems(Items.BARREL), ModItems.UPGRADE_FRAME, Items.STICK); + offerUpgradeRecipe(exporter, ModItems.T2_UPGRADE, Ingredient.ofItems(Items.IRON_BLOCK), ModItems.T1_UPGRADE, Items.STICK); + offerUpgradeRecipe(exporter, ModItems.T3_UPGRADE, Ingredient.ofItems(Items.DIAMOND_BLOCK), ModItems.T2_UPGRADE, Items.BLAZE_ROD); + offerUpgradeRecipe(exporter, ModItems.T4_UPGRADE, ingredientFromTag(ConventionalItemTags.SHULKER_BOXES), ModItems.T3_UPGRADE, Items.END_ROD); + + offerDrawerRecipes(exporter); + offerLockRecipe(exporter); + offerLimiterRecipe(exporter); + offerUpgradeFrameRecipe(exporter); + offerAccessPointRecipe(exporter); + offerConnectorRecipe(exporter); + + ComplexRecipeJsonBuilder.create(CopyLimiterRecipe::new) + .offerTo(exporter, RegistryKey.of(RegistryKeys.RECIPE, ExtendedDrawers.id("copy_limiter"))); + } + + private void offerDrawerRecipes(RecipeExporter exporter) { + createShaped(RecipeCategory.DECORATIONS, ModItems.SHADOW_DRAWER) + .input('E', Items.END_STONE_BRICKS) + .input('C', Items.END_CRYSTAL) + .pattern("EEE") + .pattern("ECE") + .pattern("EEE") + .criterion(hasItem(Items.END_STONE_BRICKS), conditionsFromItem(Items.END_STONE_BRICKS)) + .offerTo(exporter); + createShaped(RecipeCategory.DECORATIONS, ModItems.COMPACTING_DRAWER) + .input('C', Items.CHEST) + .input('S', ItemTags.STONE_CRAFTING_MATERIALS) + .input('I', Items.IRON_BLOCK) + .input('P', Items.PISTON) + .pattern("SPS") + .pattern("CIC") + .pattern("SPS") + .criterion(hasItem(Items.CHEST), conditionsFromItem(Items.CHEST)) + .offerTo(exporter); + createShaped(RecipeCategory.DECORATIONS, ModItems.SINGLE_DRAWER) + .input('C', Items.CHEST) + .input('L', ItemTags.LOGS) + .input('P', ItemTags.PLANKS) + .pattern("LPL") + .pattern("PCP") + .pattern("LPL") + .criterion(hasItem(Items.CHEST), conditionsFromItem(Items.CHEST)) + .offerTo(exporter); + createShaped(RecipeCategory.DECORATIONS, ModItems.DOUBLE_DRAWER) + .input('C', Items.CHEST) + .input('L', ItemTags.LOGS) + .input('P', ItemTags.PLANKS) + .pattern("LPL") + .pattern("CPC") + .pattern("LPL") + .criterion(hasItem(Items.CHEST), conditionsFromItem(Items.CHEST)) + .offerTo(exporter); + createShaped(RecipeCategory.DECORATIONS, ModItems.QUAD_DRAWER) + .input('C', Items.CHEST) + .input('L', ItemTags.LOGS) + .input('P', ItemTags.PLANKS) + .pattern("LCL") + .pattern("CPC") + .pattern("LCL") + .criterion(hasItem(Items.CHEST), conditionsFromItem(Items.CHEST)) + .offerTo(exporter); + } + + private void offerLockRecipe(RecipeExporter exporter) { + createShaped(RecipeCategory.TOOLS, ModItems.LOCK) + .input('G', Items.GOLD_INGOT) + .input('g', Items.GOLD_NUGGET) + .pattern(" g ") + .pattern("g g") + .pattern("GGG") + .criterion(hasItem(Items.GOLD_INGOT), conditionsFromItem(Items.GOLD_INGOT)) + .offerTo(exporter); + } + + private void offerLimiterRecipe(RecipeExporter exporter) { + createShaped(RecipeCategory.REDSTONE, ModItems.LIMITER) + .input('C', Items.COPPER_INGOT) + .input('R', Items.REDSTONE) + .input('E', Items.ENDER_PEARL) + .pattern("RCR") + .pattern("CEC") + .pattern("RCR") + .criterion("has_drawer", conditionsFromTag(ModTags.ItemTags.DRAWERS)) + .offerTo(exporter); + } + + private void offerAccessPointRecipe(RecipeExporter exporter) { + createShaped(RecipeCategory.DECORATIONS, ModItems.ACCESS_POINT) + .input('I', Items.IRON_INGOT) + .input('C', Items.COBBLESTONE) + .input('D', ModTags.ItemTags.DRAWERS) + .pattern("CIC") + .pattern("IDI") + .pattern("CIC") + .criterion("has_drawer", conditionsFromTag(ModTags.ItemTags.DRAWERS)) + .offerTo(exporter); + } + + private void offerConnectorRecipe(RecipeExporter exporter) { + createShaped(RecipeCategory.DECORATIONS, ModItems.CONNECTOR) + .input('L', ItemTags.LOGS) + .input('P', ItemTags.PLANKS) + .pattern("LPL") + .pattern("PPP") + .pattern("LPL") + .criterion("has_drawer", conditionsFromTag(ModTags.ItemTags.DRAWERS)) + .offerTo(exporter); + } + + private void offerUpgradeFrameRecipe(RecipeExporter exporter) { + createShaped(RecipeCategory.MISC, ModItems.UPGRADE_FRAME) + .input('S', Items.STICK) + .input('C', Items.COBBLESTONE) + .pattern("SCS") + .pattern("C C") + .pattern("SCS") + .criterion("has_drawer", conditionsFromTag(ModTags.ItemTags.DRAWERS)) + .offerTo(exporter); + } + + private void offerUpgradeRecipe(RecipeExporter exporter, Item result, Ingredient material, Item base, Item stick) { + createShaped(RecipeCategory.MISC, result) + .input('M', material) + .input('B', base) + .input('S', stick) + .pattern("SSS") + .pattern("BMB") + .pattern("SSS") + .criterion(hasItem(ModItems.UPGRADE_FRAME), conditionsFromItem(ModItems.UPGRADE_FRAME)) + .offerTo(exporter); + } +} diff --git a/src/main/java/io/github/mattidragon/extendeddrawers/datagen/DrawersRecipeProvider.java b/src/main/java/io/github/mattidragon/extendeddrawers/datagen/DrawersRecipeProvider.java index ab6cade..8aa9229 100644 --- a/src/main/java/io/github/mattidragon/extendeddrawers/datagen/DrawersRecipeProvider.java +++ b/src/main/java/io/github/mattidragon/extendeddrawers/datagen/DrawersRecipeProvider.java @@ -1,22 +1,10 @@ package io.github.mattidragon.extendeddrawers.datagen; -import io.github.mattidragon.extendeddrawers.ExtendedDrawers; -import io.github.mattidragon.extendeddrawers.recipe.CopyLimiterRecipe; -import io.github.mattidragon.extendeddrawers.registry.ModItems; -import io.github.mattidragon.extendeddrawers.registry.ModTags; import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider; -import net.fabricmc.fabric.api.tag.convention.v2.ConventionalItemTags; -import net.minecraft.data.server.recipe.ComplexRecipeJsonBuilder; import net.minecraft.data.server.recipe.RecipeExporter; -import net.minecraft.data.server.recipe.RecipeProvider; -import net.minecraft.data.server.recipe.ShapedRecipeJsonBuilder; -import net.minecraft.item.Item; -import net.minecraft.item.Items; -import net.minecraft.recipe.Ingredient; -import net.minecraft.recipe.book.RecipeCategory; +import net.minecraft.data.server.recipe.RecipeGenerator; import net.minecraft.registry.RegistryWrapper; -import net.minecraft.registry.tag.ItemTags; import java.util.concurrent.CompletableFuture; @@ -26,137 +14,12 @@ public DrawersRecipeProvider(FabricDataOutput output, CompletableFuture to } @Override - public TypedActionResult use(World world, PlayerEntity user, Hand hand) { + public ActionResult use(World world, PlayerEntity user, Hand hand) { var itemStack = user.getStackInHand(hand); user.useBook(itemStack, hand); user.incrementStat(Stats.USED.getOrCreateStat(this)); - return TypedActionResult.success(itemStack, world.isClient()); + return ActionResult.SUCCESS; } @Override diff --git a/src/main/java/io/github/mattidragon/extendeddrawers/misc/ServerRecipeManagerAccess.java b/src/main/java/io/github/mattidragon/extendeddrawers/misc/ServerRecipeManagerAccess.java new file mode 100644 index 0000000..96ac9ac --- /dev/null +++ b/src/main/java/io/github/mattidragon/extendeddrawers/misc/ServerRecipeManagerAccess.java @@ -0,0 +1,7 @@ +package io.github.mattidragon.extendeddrawers.misc; + +import net.minecraft.recipe.PreparedRecipes; + +public interface ServerRecipeManagerAccess { + PreparedRecipes getPreparedRecipes(); +} diff --git a/src/main/java/io/github/mattidragon/extendeddrawers/mixin/DataPackContentsMixin.java b/src/main/java/io/github/mattidragon/extendeddrawers/mixin/DataPackContentsMixin.java index c9f4ab8..03d8927 100644 --- a/src/main/java/io/github/mattidragon/extendeddrawers/mixin/DataPackContentsMixin.java +++ b/src/main/java/io/github/mattidragon/extendeddrawers/mixin/DataPackContentsMixin.java @@ -3,9 +3,12 @@ import com.google.common.collect.ImmutableList; import com.llamalad7.mixinextras.injector.ModifyReturnValue; import io.github.mattidragon.extendeddrawers.compacting.CompressionOverrideLoader; -import io.github.mattidragon.extendeddrawers.compacting.CompressionRecipeManager; -import net.minecraft.recipe.RecipeManager; -import net.minecraft.registry.DynamicRegistryManager; +import io.github.mattidragon.extendeddrawers.compacting.ServerCompressionRecipeManager; +import net.minecraft.recipe.ServerRecipeManager; +import net.minecraft.registry.CombinedDynamicRegistries; +import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryWrapper; +import net.minecraft.registry.ServerDynamicRegistryType; import net.minecraft.resource.ResourceReloader; import net.minecraft.resource.featuretoggle.FeatureSet; import net.minecraft.server.DataPackContents; @@ -22,14 +25,14 @@ @Mixin(value = DataPackContents.class) public class DataPackContentsMixin { - @Shadow @Final private RecipeManager recipeManager; + @Shadow @Final private ServerRecipeManager recipeManager; @Unique private CompressionOverrideLoader extended_drawers$compressionOverrideLoader; @Inject(method = "", at = @At("TAIL")) - private void extend_drawers$setupCompressionOverrideLoader(DynamicRegistryManager.Immutable dynamicRegistryManager, FeatureSet enabledFeatures, CommandManager.RegistrationEnvironment environment, int functionPermissionLevel, CallbackInfo ci) { - extended_drawers$compressionOverrideLoader = new CompressionOverrideLoader(CompressionRecipeManager.of(recipeManager)); + private void extend_drawers$setupCompressionOverrideLoader(CombinedDynamicRegistries dynamicRegistries, RegistryWrapper.WrapperLookup registries, FeatureSet enabledFeatures, CommandManager.RegistrationEnvironment environment, List> pendingTagLoads, int functionPermissionLevel, CallbackInfo ci) { + extended_drawers$compressionOverrideLoader = new CompressionOverrideLoader(ServerCompressionRecipeManager.of(recipeManager)); } @ModifyReturnValue(method = "getContents", at = @At("RETURN")) diff --git a/src/main/java/io/github/mattidragon/extendeddrawers/mixin/RecipeManagerMixin.java b/src/main/java/io/github/mattidragon/extendeddrawers/mixin/RecipeManagerMixin.java deleted file mode 100644 index 211e8ba..0000000 --- a/src/main/java/io/github/mattidragon/extendeddrawers/mixin/RecipeManagerMixin.java +++ /dev/null @@ -1,31 +0,0 @@ -package io.github.mattidragon.extendeddrawers.mixin; - -import com.google.gson.JsonElement; -import io.github.mattidragon.extendeddrawers.compacting.CompressionRecipeManager; -import net.minecraft.recipe.RecipeManager; -import net.minecraft.resource.ResourceManager; -import net.minecraft.util.Identifier; -import net.minecraft.util.profiler.Profiler; -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 java.util.Map; - -@Mixin(RecipeManager.class) -public class RecipeManagerMixin implements CompressionRecipeManager.Provider { - @Unique - private final CompressionRecipeManager compactingManager = new CompressionRecipeManager((RecipeManager)(Object)this); - - @Override - public CompressionRecipeManager extended_drawers$getCompactingManager() { - return compactingManager; - } - - @Inject(method = "apply(Ljava/util/Map;Lnet/minecraft/resource/ResourceManager;Lnet/minecraft/util/profiler/Profiler;)V", at = @At("TAIL")) - private void extended_drawers$reloadCompactingManager(Map map, ResourceManager resourceManager, Profiler profiler, CallbackInfo ci) { - compactingManager.reload(); - } -} diff --git a/src/main/java/io/github/mattidragon/extendeddrawers/mixin/ServerRecipeManagerMixin.java b/src/main/java/io/github/mattidragon/extendeddrawers/mixin/ServerRecipeManagerMixin.java new file mode 100644 index 0000000..d26dbea --- /dev/null +++ b/src/main/java/io/github/mattidragon/extendeddrawers/mixin/ServerRecipeManagerMixin.java @@ -0,0 +1,34 @@ +package io.github.mattidragon.extendeddrawers.mixin; + +import io.github.mattidragon.extendeddrawers.compacting.ServerCompressionRecipeManager; +import io.github.mattidragon.extendeddrawers.misc.ServerRecipeManagerAccess; +import net.minecraft.recipe.PreparedRecipes; +import net.minecraft.recipe.ServerRecipeManager; +import net.minecraft.resource.ResourceManager; +import net.minecraft.util.profiler.Profiler; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.gen.Accessor; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(ServerRecipeManager.class) +public abstract class ServerRecipeManagerMixin implements ServerCompressionRecipeManager.Provider, ServerRecipeManagerAccess { + @Unique + private final ServerCompressionRecipeManager compactingManager = new ServerCompressionRecipeManager((ServerRecipeManager) (Object) this); + + @Override + public ServerCompressionRecipeManager extended_drawers$getCompactingManager() { + return compactingManager; + } + + @Inject(method = "apply(Lnet/minecraft/recipe/PreparedRecipes;Lnet/minecraft/resource/ResourceManager;Lnet/minecraft/util/profiler/Profiler;)V", at = @At("TAIL")) + private void extended_drawers$reloadCompactingManager(PreparedRecipes preparedRecipes, ResourceManager resourceManager, Profiler profiler, CallbackInfo ci) { + compactingManager.reload(); + } + + @Accessor + @Override + public abstract PreparedRecipes getPreparedRecipes(); +} diff --git a/src/main/java/io/github/mattidragon/extendeddrawers/mixin/ServerWorldMixin.java b/src/main/java/io/github/mattidragon/extendeddrawers/mixin/ServerWorldMixin.java new file mode 100644 index 0000000..8d16ad7 --- /dev/null +++ b/src/main/java/io/github/mattidragon/extendeddrawers/mixin/ServerWorldMixin.java @@ -0,0 +1,17 @@ +package io.github.mattidragon.extendeddrawers.mixin; + +import io.github.mattidragon.extendeddrawers.compacting.CompressionRecipeManager; +import net.minecraft.recipe.ServerRecipeManager; +import net.minecraft.server.world.ServerWorld; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(ServerWorld.class) +public abstract class ServerWorldMixin extends WorldMixin { + @Shadow public abstract ServerRecipeManager getRecipeManager(); + + @Override + public CompressionRecipeManager extended_drawers$getCompactingManager() { + return ((CompressionRecipeManager.Provider) getRecipeManager()).extended_drawers$getCompactingManager(); + } +} diff --git a/src/main/java/io/github/mattidragon/extendeddrawers/mixin/WireConnectionDiscoverersMixin.java b/src/main/java/io/github/mattidragon/extendeddrawers/mixin/WireConnectionDiscoverersMixin.java new file mode 100644 index 0000000..3f62517 --- /dev/null +++ b/src/main/java/io/github/mattidragon/extendeddrawers/mixin/WireConnectionDiscoverersMixin.java @@ -0,0 +1,19 @@ +package io.github.mattidragon.extendeddrawers.mixin; + +import com.kneelawk.graphlib.api.wire.WireConnectionDiscoverers; +import net.minecraft.util.math.Direction; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(WireConnectionDiscoverers.class) +public class WireConnectionDiscoverersMixin { + @Redirect( + method = "fullBlockCanConnect(Lcom/kneelawk/graphlib/api/wire/FullWireBlockNode;Lcom/kneelawk/graphlib/api/graph/NodeHolder;Lcom/kneelawk/graphlib/api/util/HalfLink;Lcom/kneelawk/graphlib/api/wire/FullWireConnectionFilter;)Z", + at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/Direction;method_50026(III)Lnet/minecraft/util/math/Direction;"), + require = 0 + ) + private static Direction tempGraphLibFixHack(int x, int y, int z) { + return Direction.fromVector(x, y, z, null); + } +} diff --git a/src/main/java/io/github/mattidragon/extendeddrawers/mixin/WorldMixin.java b/src/main/java/io/github/mattidragon/extendeddrawers/mixin/WorldMixin.java new file mode 100644 index 0000000..7c10e2a --- /dev/null +++ b/src/main/java/io/github/mattidragon/extendeddrawers/mixin/WorldMixin.java @@ -0,0 +1,9 @@ +package io.github.mattidragon.extendeddrawers.mixin; + +import io.github.mattidragon.extendeddrawers.compacting.CompressionRecipeManager; +import net.minecraft.world.World; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(World.class) +public abstract class WorldMixin implements CompressionRecipeManager.Provider { +} diff --git a/src/main/java/io/github/mattidragon/extendeddrawers/networking/CompressionOverrideSyncPayload.java b/src/main/java/io/github/mattidragon/extendeddrawers/networking/CompressionRecipeSyncPayload.java similarity index 61% rename from src/main/java/io/github/mattidragon/extendeddrawers/networking/CompressionOverrideSyncPayload.java rename to src/main/java/io/github/mattidragon/extendeddrawers/networking/CompressionRecipeSyncPayload.java index b9c90be..ef92140 100644 --- a/src/main/java/io/github/mattidragon/extendeddrawers/networking/CompressionOverrideSyncPayload.java +++ b/src/main/java/io/github/mattidragon/extendeddrawers/networking/CompressionRecipeSyncPayload.java @@ -2,7 +2,7 @@ import io.github.mattidragon.extendeddrawers.ExtendedDrawers; import io.github.mattidragon.extendeddrawers.compacting.CompressionLadder; -import io.github.mattidragon.extendeddrawers.compacting.CompressionRecipeManager; +import io.github.mattidragon.extendeddrawers.compacting.ServerCompressionRecipeManager; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.fabricmc.fabric.api.networking.v1.PayloadTypeRegistry; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking; @@ -13,17 +13,18 @@ import java.util.List; -public record CompressionOverrideSyncPayload(List overrides) implements CustomPayload { - public static final Id ID = new Id<>(ExtendedDrawers.id("compression_override_sync")); - private static final PacketCodec CODEC = PacketCodec.tuple( - CompressionLadder.PACKET_CODEC.collect(PacketCodecs.toList()), CompressionOverrideSyncPayload::overrides, - CompressionOverrideSyncPayload::new +public record CompressionRecipeSyncPayload(List recipes, boolean clearRecipes) implements CustomPayload { + public static final Id ID = new Id<>(ExtendedDrawers.id("compression_recipe_sync")); + private static final PacketCodec CODEC = PacketCodec.tuple( + CompressionLadder.PACKET_CODEC.collect(PacketCodecs.toList()), CompressionRecipeSyncPayload::recipes, + PacketCodecs.BOOL, CompressionRecipeSyncPayload::clearRecipes, + CompressionRecipeSyncPayload::new ); public static void register() { PayloadTypeRegistry.playS2C().register(ID, CODEC); ServerLifecycleEvents.SYNC_DATA_PACK_CONTENTS.register((player, joined) -> - ServerPlayNetworking.send(player, new CompressionOverrideSyncPayload(CompressionRecipeManager.of(player.server.getRecipeManager()).getOverrides()))); + ServerPlayNetworking.send(player, new CompressionRecipeSyncPayload(List.copyOf(ServerCompressionRecipeManager.of(player.server.getRecipeManager()).getLadders()), true))); } @Override diff --git a/src/main/java/io/github/mattidragon/extendeddrawers/recipe/CopyLimiterRecipe.java b/src/main/java/io/github/mattidragon/extendeddrawers/recipe/CopyLimiterRecipe.java index 1e24530..faa0663 100644 --- a/src/main/java/io/github/mattidragon/extendeddrawers/recipe/CopyLimiterRecipe.java +++ b/src/main/java/io/github/mattidragon/extendeddrawers/recipe/CopyLimiterRecipe.java @@ -62,13 +62,8 @@ public ItemStack craft(CraftingRecipeInput input, RegistryWrapper.WrapperLookup } @Override - public boolean fits(int width, int height) { - return width * height >= 2; - } - - @Override - public DefaultedList getRemainder(CraftingRecipeInput input) { - var result = DefaultedList.ofSize(input.getSize(), ItemStack.EMPTY); + public DefaultedList getRecipeRemainders(CraftingRecipeInput input) { + var result = DefaultedList.ofSize(input.size(), ItemStack.EMPTY); for(int i = 0; i < result.size(); ++i) { var stack = input.getStackInSlot(i); @@ -86,7 +81,7 @@ public DefaultedList getRemainder(CraftingRecipeInput input) { } @Override - public RecipeSerializer getSerializer() { + public RecipeSerializer getSerializer() { return ModRecipes.COPY_LIMITER_SERIALIZER; } } diff --git a/src/main/java/io/github/mattidragon/extendeddrawers/registry/ModBlocks.java b/src/main/java/io/github/mattidragon/extendeddrawers/registry/ModBlocks.java index df2f40f..f07460d 100644 --- a/src/main/java/io/github/mattidragon/extendeddrawers/registry/ModBlocks.java +++ b/src/main/java/io/github/mattidragon/extendeddrawers/registry/ModBlocks.java @@ -4,27 +4,31 @@ import io.github.mattidragon.extendeddrawers.block.entity.CompactingDrawerBlockEntity; import io.github.mattidragon.extendeddrawers.block.entity.DrawerBlockEntity; import io.github.mattidragon.extendeddrawers.block.entity.ShadowDrawerBlockEntity; +import net.fabricmc.fabric.api.object.builder.v1.block.entity.FabricBlockEntityTypeBuilder; import net.minecraft.block.AbstractBlock; +import net.minecraft.block.Block; import net.minecraft.block.MapColor; import net.minecraft.block.entity.BlockEntityType; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; import net.minecraft.sound.BlockSoundGroup; import static io.github.mattidragon.extendeddrawers.ExtendedDrawers.id; public class ModBlocks { - public static final DrawerBlock SINGLE_DRAWER = new DrawerBlock(AbstractBlock.Settings.create().mapColor(MapColor.SPRUCE_BROWN).burnable().strength(2f, 3f).sounds(BlockSoundGroup.WOOD), 1); - public static final DrawerBlock DOUBLE_DRAWER = new DrawerBlock(AbstractBlock.Settings.create().mapColor(MapColor.SPRUCE_BROWN).burnable().strength(2f, 3f).sounds(BlockSoundGroup.WOOD), 2); - public static final DrawerBlock QUAD_DRAWER = new DrawerBlock(AbstractBlock.Settings.create().mapColor(MapColor.SPRUCE_BROWN).burnable().strength(2f, 3f).sounds(BlockSoundGroup.WOOD), 4); - public static final ConnectorBlock CONNECTOR = new ConnectorBlock(AbstractBlock.Settings.create().mapColor(MapColor.SPRUCE_BROWN).burnable().strength(2f, 3f).sounds(BlockSoundGroup.WOOD)); - public static final AccessPointBlock ACCESS_POINT = new AccessPointBlock(AbstractBlock.Settings.create().mapColor(MapColor.STONE_GRAY).strength(3f, 9f).sounds(BlockSoundGroup.STONE)); - public static final ShadowDrawerBlock SHADOW_DRAWER = new ShadowDrawerBlock(AbstractBlock.Settings.create().mapColor(MapColor.PALE_YELLOW).strength(3f, 9f).sounds(BlockSoundGroup.STONE)); - public static final CompactingDrawerBlock COMPACTING_DRAWER = new CompactingDrawerBlock(AbstractBlock.Settings.create().mapColor(MapColor.STONE_GRAY).strength(3f, 9f).sounds(BlockSoundGroup.STONE)); + public static final DrawerBlock SINGLE_DRAWER = new DrawerBlock(AbstractBlock.Settings.create().registryKey(key("single_drawer")).mapColor(MapColor.SPRUCE_BROWN).burnable().strength(2f, 3f).sounds(BlockSoundGroup.WOOD), 1); + public static final DrawerBlock DOUBLE_DRAWER = new DrawerBlock(AbstractBlock.Settings.create().registryKey(key("double_drawer")).mapColor(MapColor.SPRUCE_BROWN).burnable().strength(2f, 3f).sounds(BlockSoundGroup.WOOD), 2); + public static final DrawerBlock QUAD_DRAWER = new DrawerBlock(AbstractBlock.Settings.create().registryKey(key("quad_drawer")).mapColor(MapColor.SPRUCE_BROWN).burnable().strength(2f, 3f).sounds(BlockSoundGroup.WOOD), 4); + public static final ConnectorBlock CONNECTOR = new ConnectorBlock(AbstractBlock.Settings.create().registryKey(key("connector")).mapColor(MapColor.SPRUCE_BROWN).burnable().strength(2f, 3f).sounds(BlockSoundGroup.WOOD)); + public static final AccessPointBlock ACCESS_POINT = new AccessPointBlock(AbstractBlock.Settings.create().registryKey(key("access_point")).mapColor(MapColor.STONE_GRAY).strength(3f, 9f).sounds(BlockSoundGroup.STONE)); + public static final ShadowDrawerBlock SHADOW_DRAWER = new ShadowDrawerBlock(AbstractBlock.Settings.create().registryKey(key("shadow_drawer")).mapColor(MapColor.PALE_YELLOW).strength(3f, 9f).sounds(BlockSoundGroup.STONE)); + public static final CompactingDrawerBlock COMPACTING_DRAWER = new CompactingDrawerBlock(AbstractBlock.Settings.create().registryKey(key("compacting_drawer")).mapColor(MapColor.STONE_GRAY).strength(3f, 9f).sounds(BlockSoundGroup.STONE)); - public static final BlockEntityType DRAWER_BLOCK_ENTITY = BlockEntityType.Builder.create(DrawerBlockEntity::new, SINGLE_DRAWER, DOUBLE_DRAWER, QUAD_DRAWER).build(); - public static final BlockEntityType COMPACTING_DRAWER_BLOCK_ENTITY = BlockEntityType.Builder.create(CompactingDrawerBlockEntity::new, COMPACTING_DRAWER).build(); - public static final BlockEntityType SHADOW_DRAWER_BLOCK_ENTITY = BlockEntityType.Builder.create(ShadowDrawerBlockEntity::new, SHADOW_DRAWER).build(); + public static final BlockEntityType DRAWER_BLOCK_ENTITY = FabricBlockEntityTypeBuilder.create(DrawerBlockEntity::new, SINGLE_DRAWER, DOUBLE_DRAWER, QUAD_DRAWER).build(); + public static final BlockEntityType COMPACTING_DRAWER_BLOCK_ENTITY = FabricBlockEntityTypeBuilder.create(CompactingDrawerBlockEntity::new, COMPACTING_DRAWER).build(); + public static final BlockEntityType SHADOW_DRAWER_BLOCK_ENTITY = FabricBlockEntityTypeBuilder.create(ShadowDrawerBlockEntity::new, SHADOW_DRAWER).build(); public static void register() { Registry.register(Registries.BLOCK, id("single_drawer"), SINGLE_DRAWER); @@ -39,4 +43,8 @@ public static void register() { Registry.register(Registries.BLOCK_ENTITY_TYPE, id("compacting_drawer"), COMPACTING_DRAWER_BLOCK_ENTITY); Registry.register(Registries.BLOCK_ENTITY_TYPE, id("shadow_drawer"), SHADOW_DRAWER_BLOCK_ENTITY); } + + private static RegistryKey key(String path) { + return RegistryKey.of(RegistryKeys.BLOCK, id(path)); + } } diff --git a/src/main/java/io/github/mattidragon/extendeddrawers/registry/ModItems.java b/src/main/java/io/github/mattidragon/extendeddrawers/registry/ModItems.java index 67ed8c8..93bc76f 100644 --- a/src/main/java/io/github/mattidragon/extendeddrawers/registry/ModItems.java +++ b/src/main/java/io/github/mattidragon/extendeddrawers/registry/ModItems.java @@ -7,27 +7,29 @@ import net.minecraft.item.Item; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; +import net.minecraft.registry.RegistryKey; +import net.minecraft.registry.RegistryKeys; import static io.github.mattidragon.extendeddrawers.ExtendedDrawers.id; public class ModItems { - public static final Item SINGLE_DRAWER = new DrawerItem(ModBlocks.SINGLE_DRAWER, new Item.Settings()); - public static final Item DOUBLE_DRAWER = new DrawerItem(ModBlocks.DOUBLE_DRAWER, new Item.Settings()); - public static final Item QUAD_DRAWER = new DrawerItem(ModBlocks.QUAD_DRAWER, new Item.Settings()); - public static final Item CONNECTOR = new BlockItem(ModBlocks.CONNECTOR, new Item.Settings()); - public static final Item SHADOW_DRAWER = new DrawerItem(ModBlocks.SHADOW_DRAWER, new Item.Settings()); - public static final Item COMPACTING_DRAWER = new DrawerItem(ModBlocks.COMPACTING_DRAWER, new Item.Settings()); - public static final Item ACCESS_POINT = new BlockItem(ModBlocks.ACCESS_POINT, new Item.Settings()); + public static final Item SINGLE_DRAWER = new DrawerItem(ModBlocks.SINGLE_DRAWER, new Item.Settings().registryKey(key("single_drawer")).useBlockPrefixedTranslationKey()); + public static final Item DOUBLE_DRAWER = new DrawerItem(ModBlocks.DOUBLE_DRAWER, new Item.Settings().registryKey(key("double_drawer")).useBlockPrefixedTranslationKey()); + public static final Item QUAD_DRAWER = new DrawerItem(ModBlocks.QUAD_DRAWER, new Item.Settings().registryKey(key("quad_drawer")).useBlockPrefixedTranslationKey()); + public static final Item CONNECTOR = new BlockItem(ModBlocks.CONNECTOR, new Item.Settings().registryKey(key("connector")).useBlockPrefixedTranslationKey()); + public static final Item SHADOW_DRAWER = new DrawerItem(ModBlocks.SHADOW_DRAWER, new Item.Settings().registryKey(key("shadow_drawer")).useBlockPrefixedTranslationKey()); + public static final Item COMPACTING_DRAWER = new DrawerItem(ModBlocks.COMPACTING_DRAWER, new Item.Settings().registryKey(key("compacting_drawer")).useBlockPrefixedTranslationKey()); + public static final Item ACCESS_POINT = new BlockItem(ModBlocks.ACCESS_POINT, new Item.Settings().registryKey(key("access_point")).useBlockPrefixedTranslationKey()); - public static final Item UPGRADE_FRAME = new Item(new Item.Settings()); - public static final UpgradeItem T1_UPGRADE = new UpgradeItem(new Item.Settings(), id("item/t1_upgrade"), 1); - public static final UpgradeItem T2_UPGRADE = new UpgradeItem(new Item.Settings(), id("item/t2_upgrade"), 2); - public static final UpgradeItem T3_UPGRADE = new UpgradeItem(new Item.Settings(), id("item/t3_upgrade"), 3); - public static final UpgradeItem T4_UPGRADE = new UpgradeItem(new Item.Settings(), id("item/t4_upgrade"), 4); - public static final UpgradeItem CREATIVE_UPGRADE = new UpgradeItem(new Item.Settings(), id("item/creative_upgrade"), value -> Long.MAX_VALUE); - public static final LimiterItem LIMITER = new LimiterItem(new Item.Settings()); - public static final Item LOCK = new Item(new Item.Settings()); - public static final Item DUPE_WAND = new Item(new Item.Settings()); + public static final Item UPGRADE_FRAME = new Item(new Item.Settings().registryKey(key("upgrade_frame"))); + public static final UpgradeItem T1_UPGRADE = new UpgradeItem(new Item.Settings().registryKey(key("t1_upgrade")), id("item/t1_upgrade"), 1); + public static final UpgradeItem T2_UPGRADE = new UpgradeItem(new Item.Settings().registryKey(key("t2_upgrade")), id("item/t2_upgrade"), 2); + public static final UpgradeItem T3_UPGRADE = new UpgradeItem(new Item.Settings().registryKey(key("t3_upgrade")), id("item/t3_upgrade"), 3); + public static final UpgradeItem T4_UPGRADE = new UpgradeItem(new Item.Settings().registryKey(key("t4_upgrade")), id("item/t4_upgrade"), 4); + public static final UpgradeItem CREATIVE_UPGRADE = new UpgradeItem(new Item.Settings().registryKey(key("creative_upgrade")), id("item/creative_upgrade"), value -> Long.MAX_VALUE); + public static final LimiterItem LIMITER = new LimiterItem(new Item.Settings().registryKey(key("limiter"))); + public static final Item LOCK = new Item(new Item.Settings().registryKey(key("lock"))); + public static final Item DUPE_WAND = new Item(new Item.Settings().registryKey(key("dupe_wand"))); public static void register() { Registry.register(Registries.ITEM, id("single_drawer"), SINGLE_DRAWER); @@ -48,4 +50,8 @@ public static void register() { Registry.register(Registries.ITEM, id("lock"), LOCK); Registry.register(Registries.ITEM, id("dupe_wand"), DUPE_WAND); } + + private static RegistryKey key(String path) { + return RegistryKey.of(RegistryKeys.ITEM, id(path)); + } } diff --git a/src/main/java/io/github/mattidragon/extendeddrawers/registry/ModRecipes.java b/src/main/java/io/github/mattidragon/extendeddrawers/registry/ModRecipes.java index d07ba52..45e0eda 100644 --- a/src/main/java/io/github/mattidragon/extendeddrawers/registry/ModRecipes.java +++ b/src/main/java/io/github/mattidragon/extendeddrawers/registry/ModRecipes.java @@ -2,12 +2,13 @@ import io.github.mattidragon.extendeddrawers.ExtendedDrawers; import io.github.mattidragon.extendeddrawers.recipe.CopyLimiterRecipe; -import net.minecraft.recipe.SpecialRecipeSerializer; +import net.minecraft.recipe.RecipeSerializer; +import net.minecraft.recipe.SpecialCraftingRecipe; import net.minecraft.registry.Registries; import net.minecraft.registry.Registry; public class ModRecipes { - public static final SpecialRecipeSerializer COPY_LIMITER_SERIALIZER = new SpecialRecipeSerializer<>(CopyLimiterRecipe::new); + public static final RecipeSerializer COPY_LIMITER_SERIALIZER = new SpecialCraftingRecipe.SpecialRecipeSerializer<>(CopyLimiterRecipe::new); private ModRecipes() {} diff --git a/src/main/java/io/github/mattidragon/extendeddrawers/storage/CompactingDrawerStorage.java b/src/main/java/io/github/mattidragon/extendeddrawers/storage/CompactingDrawerStorage.java index ac1b2b3..8ed3e69 100644 --- a/src/main/java/io/github/mattidragon/extendeddrawers/storage/CompactingDrawerStorage.java +++ b/src/main/java/io/github/mattidragon/extendeddrawers/storage/CompactingDrawerStorage.java @@ -238,14 +238,14 @@ private void clear() { updatePending = false; // No need to update since cleared slots are up-to-date } - private void updateSlots() { + public void updateSlots() { for (var slot : slots) { // Disable all slots slot.reset(true); } var ladder = owner.getWorld() == null ? new CompressionLadder(List.of(new CompressionLadder.Step(item, 1))) - : CompressionRecipeManager.of(owner.getWorld().getRecipeManager()).getLadder(item, owner.getWorld()); + : CompressionRecipeManager.of(owner.getWorld()).getLadder(item, owner.getWorld()); var ladderSize = ladder.steps().size(); var initialPosition = ladder.getPosition(item); if (initialPosition == -1) throw new IllegalStateException("Item is not on it's own recipe ladder. Did we lookup mid-reload?"); diff --git a/src/main/resources/extended_drawers.mixins.json b/src/main/resources/extended_drawers.mixins.json index 9ee1317..b686ed2 100644 --- a/src/main/resources/extended_drawers.mixins.json +++ b/src/main/resources/extended_drawers.mixins.json @@ -6,9 +6,12 @@ "mixins": [ "DataPackContentsMixin", "ItemStackMixin", - "RecipeManagerMixin", "ServerPlayerInteractionManagerMixin", - "ShulkerBoxBlockEntityMixin" + "ServerRecipeManagerMixin", + "ServerWorldMixin", + "ShulkerBoxBlockEntityMixin", + "WireConnectionDiscoverersMixin", + "WorldMixin" ], "injectors": { "defaultRequire": 1 diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index fe41c03..ef7a1aa 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -42,7 +42,7 @@ "depends": { "fabricloader": ">=0.15.11", "fabric": ">=0.102.0", - "minecraft": "1.21.1", + "minecraft": ">=1.21.2 <1.21.4-", "graphlib": "*" }, "recommends": {