From eaaa8d16c156771c729d3c4931969becaa94ac40 Mon Sep 17 00:00:00 2001 From: Masato Nakajima Date: Mon, 22 Jun 2026 14:36:44 +0800 Subject: [PATCH 1/7] Port Backpacked to Minecraft 26.2 (version 3.1.0) --- CHANGELOG.md | 12 ++++++++ build.gradle | 2 +- .../src/main/groovy/multiloader-common.gradle | 3 ++ .../blockentity/BackpackDockBlockEntity.java | 2 +- .../blockentity/ShelfBlockEntity.java | 2 +- .../backpacked/client/ClientEvents.java | 7 +++-- .../client/gui/pip/GuiBackpackRenderer.java | 15 ++++------ .../gui/screen/CustomiseBackpackScreen.java | 2 +- .../renderer/FirstPersonEffectsRenderer.java | 8 ++--- .../function/SpawnParticleFunction.java | 2 +- .../blockentity/BackpackDockRenderer.java | 4 +-- .../renderer/blockentity/ShelfRenderer.java | 4 +-- .../common/UseItemOnBlockFaceContext.java | 4 +-- .../common/WanderingTraderEvents.java | 11 +++---- .../common/augment/data/Farmhand.java | 4 +-- .../common/augment/data/Recall.java | 4 +-- .../common/challenge/PredicateUtils.java | 6 ++-- .../challenge/impl/BreedAnimalChallenge.java | 2 +- .../challenge/impl/FeedAnimalChallenge.java | 2 +- .../impl/InteractWithBlockChallenge.java | 6 ++-- .../impl/InteractWithEntityChallenge.java | 4 +-- .../challenge/impl/KillMobChallenge.java | 7 +++-- .../impl/MerchantTradeChallenge.java | 4 +-- .../challenge/impl/MineBlockChallenge.java | 6 ++-- .../impl/TravelDistanceChallenge.java | 2 +- .../predicates/BlockPositionPredicate.java | 2 +- .../predicates/BlockSnapshotPredicate.java | 2 +- .../core/ModParticleRenderTypes.java | 3 +- .../backpacked/datagen/CommonBlockTagGen.java | 30 ++++++++++--------- .../mixin/common/BredAnimalsTriggerMixin.java | 2 +- .../common/PlayerInteractTriggerMixin.java | 2 +- .../network/play/ClientPlayHandler.java | 12 ++++---- .../resources/backpacked.common.mixins.json | 2 +- fabric/build.gradle | 6 ++-- .../backpacked/client/ClientHandler.java | 9 +++--- .../backpacked/mixin/EntityMixin.java | 3 +- .../platform/FabricClientHelper.java | 2 +- .../resources/backpacked.fabric.mixins.json | 2 +- gradle.properties | 22 +++++++------- gradle/wrapper/gradle-wrapper.properties | 2 +- neoforge/build.gradle | 3 +- .../com/mrcrayfish/backpacked/Backpacked.java | 3 +- .../backpacked/client/ClientBackpacked.java | 11 +++---- .../platform/NeoForgeClientHelper.java | 2 +- 44 files changed, 134 insertions(+), 111 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 000000000..b4d1d3a9d --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,12 @@ +# Changelog + +## 3.1.0 +- Ported to Minecraft 26.2 (from 26.1.2) +- Updated Framework dependency to 0.14.0+26.2 +- Migrated rendering code to the new deferred `SubmitNodeCollector` pipeline (`MultiBufferSource` removal) +- Updated `net.minecraft.advancements.criterion` predicate/trigger imports to their new `advancements.predicates` / `advancements.triggers` packages +- Replaced `EntityType` constants with the new `EntityTypes` holder class +- Replaced removed `BlockPos.getCenter()` / `getBottomCenter()` with `Vec3.atCenterOf()` / `Vec3.atBottomCenterOf()` +- Replaced removed `Minecraft.screen` / `setScreen()` / `getToastManager()` with their `Minecraft.gui` equivalents +- Replaced removed `IntrinsicHolderTagsProvider` with `TagsProvider` +- Catalogue integration disabled for local builds (not published anywhere reachable without GitHub Packages credentials) diff --git a/build.gradle b/build.gradle index 787b683f1..c04ed01f7 100644 --- a/build.gradle +++ b/build.gradle @@ -6,6 +6,6 @@ buildscript { plugins { id 'org.jetbrains.gradle.plugin.idea-ext' version '1.1.7' - id 'net.fabricmc.fabric-loom' version '1.16-SNAPSHOT' apply false + id 'net.fabricmc.fabric-loom' version '1.17.11' apply false id 'net.neoforged.moddev' version '2.0.141' apply false } diff --git a/buildSrc/src/main/groovy/multiloader-common.gradle b/buildSrc/src/main/groovy/multiloader-common.gradle index 7fe0ea044..d4b4fd4a9 100644 --- a/buildSrc/src/main/groovy/multiloader-common.gradle +++ b/buildSrc/src/main/groovy/multiloader-common.gradle @@ -30,6 +30,9 @@ def getPackagesRepo() { repositories { mavenCentral() + // Resolves the locally-published 26.2 Framework fork (com.mrcrayfish:framework-*) + // when GitHub Packages credentials for the upstream MrCrayfish repo aren't configured. + mavenLocal() // https://docs.gradle.org/current/userguide/declaring_repositories.html#declaring_content_exclusively_found_in_one_repository exclusiveContent { forRepository { diff --git a/common/src/main/java/com/mrcrayfish/backpacked/blockentity/BackpackDockBlockEntity.java b/common/src/main/java/com/mrcrayfish/backpacked/blockentity/BackpackDockBlockEntity.java index f04c6a58c..457d5e8e5 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/blockentity/BackpackDockBlockEntity.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/blockentity/BackpackDockBlockEntity.java @@ -116,7 +116,7 @@ private void playSound(SoundEvent event) private Vec3 getPopPosition() { - return this.getBlockPos().getCenter().relative(this.getDirection(), 0.6875); + return Vec3.atCenterOf(this.getBlockPos()).relative(this.getDirection(), 0.6875); } private ItemStack getBackpackWithContents() diff --git a/common/src/main/java/com/mrcrayfish/backpacked/blockentity/ShelfBlockEntity.java b/common/src/main/java/com/mrcrayfish/backpacked/blockentity/ShelfBlockEntity.java index aa84b9b07..4e80f5c69 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/blockentity/ShelfBlockEntity.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/blockentity/ShelfBlockEntity.java @@ -136,7 +136,7 @@ public void popBackpack(Player player) if(backpack.isEmpty()) return; - Vec3 pos = this.worldPosition.getCenter().subtract(0, 0.25, 0); + Vec3 pos = Vec3.atCenterOf(this.worldPosition).subtract(0, 0.25, 0); UUID originalOwner = this.recallOwner; int originalIndex = this.recallIndex; this.setBackpack(ItemStack.EMPTY); diff --git a/common/src/main/java/com/mrcrayfish/backpacked/client/ClientEvents.java b/common/src/main/java/com/mrcrayfish/backpacked/client/ClientEvents.java index 16fc47b17..d74e9638f 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/client/ClientEvents.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/client/ClientEvents.java @@ -22,6 +22,7 @@ import net.minecraft.network.Connection; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EntityTypes; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.AABB; @@ -53,7 +54,7 @@ private static void onPlayerLogin(LocalPlayer player, MultiPlayerGameMode gameMo public static void onKeyInput(int action, KeyEvent event) { Minecraft mc = Minecraft.getInstance(); - if(mc.player != null && mc.screen == null) + if(mc.player != null && mc.gui.screen() == null) { if(ModKeyMappings.KEY_BACKPACK.isDown() && ModKeyMappings.KEY_BACKPACK.consumeClick()) { @@ -88,12 +89,12 @@ private static boolean onInteraction(boolean attack, boolean use, boolean pick, double range = Config.PICKPOCKETING.maxReachDistance.get(); List entities = new ArrayList<>(); if(Config.PICKPOCKETING.enabled.get()) { - entities.addAll(mc.level.getEntities(EntityType.PLAYER, mc.player.getBoundingBox().inflate(range), player -> { + entities.addAll(mc.level.getEntities(EntityTypes.PLAYER, mc.player.getBoundingBox().inflate(range), player -> { Optional optional = ModSyncedDataKeys.COSMETIC_PROPERTIES.getValue(player); // Just use properties to determine if backpack is equipped on client return !player.equals(mc.player) && optional.isPresent() && PickpocketUtil.canPickpocketEntity(player, mc.player); })); } - entities.addAll(mc.level.getEntities(EntityType.WANDERING_TRADER, mc.player.getBoundingBox().inflate(mc.player.entityInteractionRange()), entity -> { + entities.addAll(mc.level.getEntities(EntityTypes.WANDERING_TRADER, mc.player.getBoundingBox().inflate(mc.player.entityInteractionRange()), entity -> { return TraderPickpocketing.get(entity).map(TraderPickpocketing::isBackpackEquipped).orElse(false) && PickpocketUtil.canPickpocketEntity(entity, mc.player, mc.player.entityInteractionRange()); })); diff --git a/common/src/main/java/com/mrcrayfish/backpacked/client/gui/pip/GuiBackpackRenderer.java b/common/src/main/java/com/mrcrayfish/backpacked/client/gui/pip/GuiBackpackRenderer.java index c79f9f39b..97f9ab1e2 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/client/gui/pip/GuiBackpackRenderer.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/client/gui/pip/GuiBackpackRenderer.java @@ -13,7 +13,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.navigation.ScreenRectangle; import net.minecraft.client.gui.render.pip.PictureInPictureRenderer; -import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.SubmitNodeCollector; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.resources.model.cuboid.ItemTransform; import net.minecraft.util.Brightness; @@ -23,11 +23,6 @@ public class GuiBackpackRenderer extends PictureInPictureRenderer { - public GuiBackpackRenderer(MultiBufferSource.BufferSource source) - { - super(source); - } - @Override public Class getRenderStateClass() { @@ -35,9 +30,9 @@ public Class getRenderStateClass() } @Override - protected void renderToTexture(GuiBackpackRenderState state, PoseStack pose) + protected void renderToTexture(GuiBackpackRenderState state, PoseStack pose, SubmitNodeCollector collector) { - Minecraft.getInstance().gameRenderer.getLighting().setupFor(Lighting.Entry.ITEMS_3D); + Minecraft.getInstance().gameRenderer.lighting().setupFor(Lighting.Entry.ITEMS_3D); pose.pushPose(); pose.scale(1.0F, -1.0F, -1.0F); @@ -59,7 +54,7 @@ protected void renderToTexture(GuiBackpackRenderState state, PoseStack pose) BackpackRenderContext context = new BackpackRenderContext(Scene.CUSTOMISATION_MENU, RenderMode.MODELS_ONLY, pose, state.baseModel(), state.strapsModel(), state.entityData(), state.levelData(), state.entityId(), 0xFFF000F0, state.tickCount(), state.partialTick(), model -> { pose.pushPose(); pose.translate(-0.5F, -0.5F, -0.5F); - StandaloneModelRenderer.draw(model, pose, this.bufferSource, 1.0F, 1.0F, 1.0F, LightCoordsUtil.FULL_BRIGHT, OverlayTexture.NO_OVERLAY); + StandaloneModelRenderer.submitDraw(collector, model, pose, 1.0F, 1.0F, 1.0F, LightCoordsUtil.FULL_BRIGHT, OverlayTexture.NO_OVERLAY); pose.popPose(); }); renderer.render(context); @@ -74,7 +69,7 @@ protected void renderToTexture(GuiBackpackRenderState state, PoseStack pose) { pose.pushPose(); pose.translate(-0.5F, -0.5F, -0.5F); - StandaloneModelRenderer.draw(model, pose, this.bufferSource, 1.0F, 1.0F, 1.0F, LightCoordsUtil.FULL_BRIGHT, OverlayTexture.NO_OVERLAY); + StandaloneModelRenderer.submitDraw(collector, model, pose, 1.0F, 1.0F, 1.0F, LightCoordsUtil.FULL_BRIGHT, OverlayTexture.NO_OVERLAY); pose.popPose(); } } diff --git a/common/src/main/java/com/mrcrayfish/backpacked/client/gui/screen/CustomiseBackpackScreen.java b/common/src/main/java/com/mrcrayfish/backpacked/client/gui/screen/CustomiseBackpackScreen.java index d7a91c6b7..2ea8e4cac 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/client/gui/screen/CustomiseBackpackScreen.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/client/gui/screen/CustomiseBackpackScreen.java @@ -502,7 +502,7 @@ protected boolean onMouseClicked(MouseButtonEvent event, Minecraft mc) if(Minecraft.getInstance().hasControlDown()) { Minecraft.getInstance().keyboardHandler.setClipboard(this.backpack.getId().toString()); - Minecraft.getInstance().gui.getChat().addClientSystemMessage(Component.literal("Copied " + this.backpack.getId() + " to the clipboard")); + Minecraft.getInstance().gui.hud.getChat().addClientSystemMessage(Component.literal("Copied " + this.backpack.getId() + " to the clipboard")); return true; } diff --git a/common/src/main/java/com/mrcrayfish/backpacked/client/renderer/FirstPersonEffectsRenderer.java b/common/src/main/java/com/mrcrayfish/backpacked/client/renderer/FirstPersonEffectsRenderer.java index ff16a4c14..465cc8f4a 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/client/renderer/FirstPersonEffectsRenderer.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/client/renderer/FirstPersonEffectsRenderer.java @@ -15,7 +15,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.model.geom.ModelPart; import net.minecraft.client.player.AbstractClientPlayer; -import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.SubmitNodeCollector; import net.minecraft.client.renderer.entity.player.AvatarRenderer; import net.minecraft.client.renderer.entity.state.AvatarRenderState; import net.minecraft.resources.Identifier; @@ -34,11 +34,11 @@ public class FirstPersonEffectsRenderer { @SuppressWarnings({"NullableProblems", "unchecked"}) - public static void draw(AbstractClientPlayer player, PoseStack pose, MultiBufferSource source, float partialTick) + public static void draw(AbstractClientPlayer player, PoseStack pose, SubmitNodeCollector source, float partialTick) { Minecraft mc = Minecraft.getInstance(); - Camera camera = mc.gameRenderer.getMainCamera(); + Camera camera = mc.gameRenderer.mainCamera(); Vec3 cameraPos = camera.position(); double playerX = Mth.lerp(partialTick, player.xOld, player.getX()) - cameraPos.x(); double playerY = Mth.lerp(partialTick, player.yOld, player.getY()) - cameraPos.y(); @@ -108,7 +108,7 @@ private static void setupBodyRotations(AbstractClientPlayer player, AvatarRender body.translateAndRotate(pose); } - private static void renderBackpack(AbstractClientPlayer player, PoseStack pose, MultiBufferSource source, int light, float partialTick) + private static void renderBackpack(AbstractClientPlayer player, PoseStack pose, SubmitNodeCollector source, int light, float partialTick) { Optional propertiesOptional = ModSyncedDataKeys.COSMETIC_PROPERTIES.getValue(player); if(propertiesOptional.isEmpty()) diff --git a/common/src/main/java/com/mrcrayfish/backpacked/client/renderer/backpack/advanced/function/SpawnParticleFunction.java b/common/src/main/java/com/mrcrayfish/backpacked/client/renderer/backpack/advanced/function/SpawnParticleFunction.java index e998611b8..7cc6a1835 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/client/renderer/backpack/advanced/function/SpawnParticleFunction.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/client/renderer/backpack/advanced/function/SpawnParticleFunction.java @@ -66,7 +66,7 @@ public void apply(BackpackRenderContext context) if(SPAWNED.contains(key)) return; - Camera camera = Minecraft.getInstance().gameRenderer.getMainCamera(); + Camera camera = Minecraft.getInstance().gameRenderer.mainCamera(); Vector3f pos = context.pose().last().pose().getTranslation(new Vector3f()); pos = camera.position().toVector3f().add(pos); diff --git a/common/src/main/java/com/mrcrayfish/backpacked/client/renderer/blockentity/BackpackDockRenderer.java b/common/src/main/java/com/mrcrayfish/backpacked/client/renderer/blockentity/BackpackDockRenderer.java index b34456bc5..469e1c683 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/client/renderer/blockentity/BackpackDockRenderer.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/client/renderer/blockentity/BackpackDockRenderer.java @@ -19,7 +19,6 @@ import com.mrcrayfish.framework.api.client.model.FrameworkModelResource; import com.mrcrayfish.framework.api.client.model.renderer.StandaloneModelRenderer; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.SubmitNodeCollector; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; @@ -28,6 +27,7 @@ import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.core.BlockPos; import net.minecraft.resources.Identifier; +import net.minecraft.util.LightCoordsUtil; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import org.joml.Vector3fc; @@ -67,7 +67,7 @@ public void extractRenderState(BackpackDockBlockEntity entity, BackpackDockRende if(level != null) { BlockPos lightPos = entity.getBlockPos().relative(entity.getDirection()); - state.itemLight = LevelRenderer.getLightCoords(level, lightPos); + state.itemLight = LightCoordsUtil.getLightCoords(level, lightPos); } // Easy solution could use a tick count on block entity in the future diff --git a/common/src/main/java/com/mrcrayfish/backpacked/client/renderer/blockentity/ShelfRenderer.java b/common/src/main/java/com/mrcrayfish/backpacked/client/renderer/blockentity/ShelfRenderer.java index 48f191d28..fae0ac00a 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/client/renderer/blockentity/ShelfRenderer.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/client/renderer/blockentity/ShelfRenderer.java @@ -192,7 +192,7 @@ private void renderBackpackName(ShelfRenderState state, Direction facing, PoseSt Minecraft mc = Minecraft.getInstance(); if(mc.hitResult instanceof BlockHitResult result && result.getBlockPos().equals(state.blockPos)) { - collector.submitNameTag(poseStack, null, 0, state.nameplate, true, state.lightCoords, 0, camera); + collector.submitNameTag(poseStack, Vec3.ZERO, 0, state.nameplate, true, state.lightCoords, camera); /*float halfWidth = mc.font.width(label) / 2F; mc.font.drawInBatch(label, -halfWidth, 0, 0x20FFFFFF, false, poseStack.last().pose(), source, Font.DisplayMode.SEE_THROUGH, 0x2A000000, light); mc.font.drawInBatch(label, -halfWidth, 0, -1, true, poseStack.last().pose(), source, Font.DisplayMode.NORMAL, 0, light); @@ -204,7 +204,7 @@ private void renderBackpackName(ShelfRenderState state, Direction facing, PoseSt { poseStack.scale(1.1F, 1.1F, 1.1F); Component label = ScreenUtil.join(" ", RECALL_ICON, Component.literal(Integer.toString(recallCount))); - collector.submitNameTag(poseStack, null, 0, label, true, state.lightCoords, 0, camera); + collector.submitNameTag(poseStack, Vec3.ZERO, 0, label, true, state.lightCoords, camera); /*float halfWidth = mc.font.width(label) / 2F; mc.font.drawInBatch(label, -halfWidth, 0, 0x20FFFFFF, false, matrix, source, Font.DisplayMode.SEE_THROUGH, 0, light); mc.font.drawInBatch(label, -halfWidth, 0, -1, false, matrix, source, Font.DisplayMode.NORMAL, 0, light);*/ diff --git a/common/src/main/java/com/mrcrayfish/backpacked/common/UseItemOnBlockFaceContext.java b/common/src/main/java/com/mrcrayfish/backpacked/common/UseItemOnBlockFaceContext.java index 0bb929d9c..2c38a8858 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/common/UseItemOnBlockFaceContext.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/common/UseItemOnBlockFaceContext.java @@ -26,14 +26,14 @@ private UseItemOnBlockFaceContext(Level level, Player player, ItemStack stack, B public static UseItemOnBlockFaceContext create(ServerLevel level, ItemStack stack, BlockPos pos, Direction face) { - Vec3 hit = pos.getCenter().add(face.getStepX() * 0.5, face.getStepY() * 0.5, face.getStepZ() * 0.5); + Vec3 hit = Vec3.atCenterOf(pos).add(face.getStepX() * 0.5, face.getStepY() * 0.5, face.getStepZ() * 0.5); BlockHitResult result = new BlockHitResult(hit, face, pos, false); return new UseItemOnBlockFaceContext(level, stack, result); } public static UseItemOnBlockFaceContext create(ServerLevel level, ServerPlayer player, ItemStack stack, BlockPos pos, Direction face) { - Vec3 hit = pos.getCenter().add(face.getStepX() * 0.5, face.getStepY() * 0.5, face.getStepZ() * 0.5); + Vec3 hit = Vec3.atCenterOf(pos).add(face.getStepX() * 0.5, face.getStepY() * 0.5, face.getStepZ() * 0.5); BlockHitResult result = new BlockHitResult(hit, face, pos, false); return new UseItemOnBlockFaceContext(level, player, stack, result); } diff --git a/common/src/main/java/com/mrcrayfish/backpacked/common/WanderingTraderEvents.java b/common/src/main/java/com/mrcrayfish/backpacked/common/WanderingTraderEvents.java index cd4882d18..5154f0fe3 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/common/WanderingTraderEvents.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/common/WanderingTraderEvents.java @@ -20,11 +20,12 @@ import net.minecraft.util.Mth; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EntityTypes; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.ai.goal.GoalSelector; import net.minecraft.world.entity.ai.goal.LookAtPlayerGoal; +import net.minecraft.world.entity.animal.equine.TraderLlama; import net.minecraft.world.entity.npc.wanderingtrader.WanderingTrader; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -74,7 +75,7 @@ private static void onEntityJoinLevel(Entity entity, Level level, boolean disk) private static void onStartTracking(Entity entity, Player player) { - if(entity.getType() != EntityType.WANDERING_TRADER) + if(entity.getType() != EntityTypes.WANDERING_TRADER) return; WanderingTrader trader = (WanderingTrader) entity; @@ -90,7 +91,7 @@ private static void onStartTracking(Entity entity, Player player) private static void onTickLivingEntity(LivingEntity entity) { Level level = entity.level(); - if(level.isClientSide() || entity.getType() != EntityType.WANDERING_TRADER) + if(level.isClientSide() || entity.getType() != EntityTypes.WANDERING_TRADER) return; WanderingTrader trader = (WanderingTrader) entity; @@ -128,7 +129,7 @@ public static boolean onInteract(Entity target, Player player) private static List findDetectedPlayers(LivingEntity entity) { - return entity.level().getEntities(EntityType.PLAYER, entity.getBoundingBox().inflate(getMaxDetectionDistance()), player -> { + return entity.level().getEntities(EntityTypes.PLAYER, entity.getBoundingBox().inflate(getMaxDetectionDistance()), player -> { return isPlayerInLivingEntityVision(entity, player) && isPlayerSeenByLivingEntity(entity, player, getMaxDetectionDistance()) || !player.isCrouching() && isPlayerMoving(player); }); } @@ -194,7 +195,7 @@ public static void openBackpack(WanderingTrader trader, ServerPlayer openingPlay trader.setUnhappyCounter(20); trader.getLookControl().setLookAt(openingPlayer.getEyePosition(1.0F)); trader.level().playSound(null, trader, SoundEvents.VILLAGER_NO, SoundSource.NEUTRAL, 1.0F, 1.5F); - trader.level().getEntities(EntityType.TRADER_LLAMA, trader.getBoundingBox().inflate(Config.WANDERING_TRADER.challenge.maxDetectionDistance.get()), entity -> true).forEach(llama -> llama.setTarget(openingPlayer)); + trader.level().getEntities(EntityTypes.TRADER_LLAMA, trader.getBoundingBox().inflate(Config.WANDERING_TRADER.challenge.maxDetectionDistance.get()), entity -> true).forEach(llama -> llama.setTarget(openingPlayer)); ((ServerLevel) trader.level()).sendParticles(ParticleTypes.ANGRY_VILLAGER, trader.getX(), trader.getEyeY(), trader.getZ(), 1, 0, 0, 0, 0); data.addDislikedPlayer(openingPlayer, trader.level().getGameTime()); return; diff --git a/common/src/main/java/com/mrcrayfish/backpacked/common/augment/data/Farmhand.java b/common/src/main/java/com/mrcrayfish/backpacked/common/augment/data/Farmhand.java index 58189bc82..e7d051b23 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/common/augment/data/Farmhand.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/common/augment/data/Farmhand.java @@ -119,14 +119,14 @@ public void run(ServerLevel level) if(result.consumesAction()) { BlockState state = level.getBlockState(this.pos.below()); - Vec3 particle = this.pos.getBottomCenter(); + Vec3 particle = Vec3.atBottomCenterOf(this.pos); level.sendParticles(new BlockParticleOption(ParticleTypes.BLOCK, state), particle.x, particle.y, particle.z, 10, 0.3F, 0.3F, 0.3F, 0.15F); return; } } } // Fallback if fails - Vec3 spawn = this.pos.getBottomCenter().add(0, 1, 0); + Vec3 spawn = Vec3.atBottomCenterOf(this.pos).add(0, 1, 0); level.addFreshEntity(new ItemEntity(level, spawn.x, spawn.y, spawn.z, this.stack.copy())); } } diff --git a/common/src/main/java/com/mrcrayfish/backpacked/common/augment/data/Recall.java b/common/src/main/java/com/mrcrayfish/backpacked/common/augment/data/Recall.java index 80a3d2b4e..ca79e97fa 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/common/augment/data/Recall.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/common/augment/data/Recall.java @@ -179,7 +179,7 @@ private void removeAndFlushQueueToBlockPos(ServerLevel level, ShelfKey key) // Flush items of every player queue queue.forEach((owner, items) -> items.forEach(item -> { this.removeInvalidShelfFromItemStack(item.stack); - this.flushItem(level, pos.getCenter(), item.stack); + this.flushItem(level, Vec3.atCenterOf(pos), item.stack); })); // Clean up @@ -242,7 +242,7 @@ public void tick(ServerLevel level) ShelfQueue queue = relativeEntry.getValue(); queue.forEach((owner, items) -> items.forEach(item -> { this.removeInvalidShelfFromItemStack(item.stack); - this.flushItem(level, pos.getCenter(), item.stack); + this.flushItem(level, Vec3.atCenterOf(pos), item.stack); })); sectionIterator.remove(); this.setDirty(); diff --git a/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/PredicateUtils.java b/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/PredicateUtils.java index e3b83a521..a339349ba 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/PredicateUtils.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/PredicateUtils.java @@ -2,9 +2,9 @@ import com.mrcrayfish.backpacked.common.BlockSnapshot; import com.mrcrayfish.backpacked.common.predicates.BlockSnapshotPredicate; -import net.minecraft.advancements.criterion.BlockPredicate; -import net.minecraft.advancements.criterion.EntityPredicate; -import net.minecraft.advancements.criterion.ItemPredicate; +import net.minecraft.advancements.predicates.BlockPredicate; +import net.minecraft.advancements.predicates.entity.EntityPredicate; +import net.minecraft.advancements.predicates.ItemPredicate; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; diff --git a/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/BreedAnimalChallenge.java b/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/BreedAnimalChallenge.java index 35969891d..3c382a9ff 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/BreedAnimalChallenge.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/BreedAnimalChallenge.java @@ -9,7 +9,7 @@ import com.mrcrayfish.backpacked.data.unlock.UnlockManager; import com.mrcrayfish.backpacked.event.BackpackedEvents; import com.mrcrayfish.backpacked.util.Utils; -import net.minecraft.advancements.criterion.EntityPredicate; +import net.minecraft.advancements.predicates.entity.EntityPredicate; import net.minecraft.resources.Identifier; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.ExtraCodecs; diff --git a/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/FeedAnimalChallenge.java b/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/FeedAnimalChallenge.java index 8bee99210..c194ba898 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/FeedAnimalChallenge.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/FeedAnimalChallenge.java @@ -9,7 +9,7 @@ import com.mrcrayfish.backpacked.data.unlock.UnlockManager; import com.mrcrayfish.backpacked.event.BackpackedEvents; import com.mrcrayfish.backpacked.util.Utils; -import net.minecraft.advancements.criterion.EntityPredicate; +import net.minecraft.advancements.predicates.entity.EntityPredicate; import net.minecraft.resources.Identifier; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.ExtraCodecs; diff --git a/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/InteractWithBlockChallenge.java b/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/InteractWithBlockChallenge.java index 612053779..4299c9f29 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/InteractWithBlockChallenge.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/InteractWithBlockChallenge.java @@ -10,9 +10,9 @@ import com.mrcrayfish.backpacked.data.unlock.UnlockManager; import com.mrcrayfish.backpacked.event.BackpackedEvents; import com.mrcrayfish.backpacked.util.Utils; -import net.minecraft.advancements.criterion.BlockPredicate; -import net.minecraft.advancements.criterion.EntityPredicate; -import net.minecraft.advancements.criterion.ItemPredicate; +import net.minecraft.advancements.predicates.BlockPredicate; +import net.minecraft.advancements.predicates.entity.EntityPredicate; +import net.minecraft.advancements.predicates.ItemPredicate; import net.minecraft.resources.Identifier; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.ExtraCodecs; diff --git a/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/InteractWithEntityChallenge.java b/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/InteractWithEntityChallenge.java index 19a26e30e..084a851b1 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/InteractWithEntityChallenge.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/InteractWithEntityChallenge.java @@ -10,8 +10,8 @@ import com.mrcrayfish.backpacked.data.unlock.UnlockManager; import com.mrcrayfish.backpacked.event.BackpackedEvents; import com.mrcrayfish.backpacked.util.Utils; -import net.minecraft.advancements.criterion.EntityPredicate; -import net.minecraft.advancements.criterion.ItemPredicate; +import net.minecraft.advancements.predicates.entity.EntityPredicate; +import net.minecraft.advancements.predicates.ItemPredicate; import net.minecraft.resources.Identifier; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.ExtraCodecs; diff --git a/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/KillMobChallenge.java b/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/KillMobChallenge.java index aaa9722c0..f1670dafd 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/KillMobChallenge.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/KillMobChallenge.java @@ -9,14 +9,15 @@ import com.mrcrayfish.backpacked.data.unlock.UnlockManager; import com.mrcrayfish.backpacked.util.Utils; import com.mrcrayfish.framework.api.event.FrameworkEntityEvents; -import net.minecraft.advancements.criterion.EntityPredicate; -import net.minecraft.advancements.criterion.ItemPredicate; +import net.minecraft.advancements.predicates.entity.EntityPredicate; +import net.minecraft.advancements.predicates.ItemPredicate; import net.minecraft.resources.Identifier; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.ExtraCodecs; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EntityTypes; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.item.ItemStack; @@ -86,7 +87,7 @@ private boolean test(LivingEntity entity, ItemStack stack, ServerPlayer player) public static void onLivingEntityDeath(LivingEntity entity, DamageSource source) { Entity cause = source.getEntity(); - if(cause != null && cause.getType() == EntityType.PLAYER) + if(cause != null && cause.getType() == EntityTypes.PLAYER) { ServerPlayer player = (ServerPlayer) cause; UnlockManager.getIncompleteTrackers(player, Tracker.class).forEach(tracker -> { diff --git a/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/MerchantTradeChallenge.java b/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/MerchantTradeChallenge.java index b836f8a0b..fbf48d17f 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/MerchantTradeChallenge.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/MerchantTradeChallenge.java @@ -9,8 +9,8 @@ import com.mrcrayfish.backpacked.data.unlock.UnlockManager; import com.mrcrayfish.backpacked.event.BackpackedEvents; import com.mrcrayfish.backpacked.util.Utils; -import net.minecraft.advancements.criterion.EntityPredicate; -import net.minecraft.advancements.criterion.ItemPredicate; +import net.minecraft.advancements.predicates.entity.EntityPredicate; +import net.minecraft.advancements.predicates.ItemPredicate; import net.minecraft.resources.Identifier; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.ExtraCodecs; diff --git a/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/MineBlockChallenge.java b/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/MineBlockChallenge.java index 3f0a522ca..ffd854503 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/MineBlockChallenge.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/MineBlockChallenge.java @@ -12,9 +12,9 @@ import com.mrcrayfish.backpacked.data.unlock.UnlockManager; import com.mrcrayfish.backpacked.event.BackpackedEvents; import com.mrcrayfish.backpacked.util.Utils; -import net.minecraft.advancements.criterion.BlockPredicate; -import net.minecraft.advancements.criterion.EntityPredicate; -import net.minecraft.advancements.criterion.ItemPredicate; +import net.minecraft.advancements.predicates.BlockPredicate; +import net.minecraft.advancements.predicates.entity.EntityPredicate; +import net.minecraft.advancements.predicates.ItemPredicate; import net.minecraft.resources.Identifier; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.ExtraCodecs; diff --git a/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/TravelDistanceChallenge.java b/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/TravelDistanceChallenge.java index 90f536e92..2f6536596 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/TravelDistanceChallenge.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/common/challenge/impl/TravelDistanceChallenge.java @@ -11,7 +11,7 @@ import com.mrcrayfish.backpacked.data.unlock.UnlockManager; import com.mrcrayfish.backpacked.event.BackpackedEvents; import com.mrcrayfish.backpacked.util.Utils; -import net.minecraft.advancements.criterion.EntityPredicate; +import net.minecraft.advancements.predicates.entity.EntityPredicate; import net.minecraft.resources.Identifier; import net.minecraft.util.ExtraCodecs; diff --git a/common/src/main/java/com/mrcrayfish/backpacked/common/predicates/BlockPositionPredicate.java b/common/src/main/java/com/mrcrayfish/backpacked/common/predicates/BlockPositionPredicate.java index cbffbc83d..3e2e79597 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/common/predicates/BlockPositionPredicate.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/common/predicates/BlockPositionPredicate.java @@ -2,7 +2,7 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.advancements.criterion.MinMaxBounds; +import net.minecraft.advancements.predicates.MinMaxBounds; import net.minecraft.core.BlockPos; public record BlockPositionPredicate(MinMaxBounds.Ints x, MinMaxBounds.Ints y, MinMaxBounds.Ints z) diff --git a/common/src/main/java/com/mrcrayfish/backpacked/common/predicates/BlockSnapshotPredicate.java b/common/src/main/java/com/mrcrayfish/backpacked/common/predicates/BlockSnapshotPredicate.java index 6cd8f3ce8..cee799117 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/common/predicates/BlockSnapshotPredicate.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/common/predicates/BlockSnapshotPredicate.java @@ -4,7 +4,7 @@ import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mrcrayfish.backpacked.common.BlockSnapshot; import com.mrcrayfish.backpacked.common.challenge.PredicateUtils; -import net.minecraft.advancements.criterion.BlockPredicate; +import net.minecraft.advancements.predicates.BlockPredicate; import net.minecraft.core.HolderSet; import net.minecraft.core.RegistryCodecs; import net.minecraft.core.registries.Registries; diff --git a/common/src/main/java/com/mrcrayfish/backpacked/core/ModParticleRenderTypes.java b/common/src/main/java/com/mrcrayfish/backpacked/core/ModParticleRenderTypes.java index 2d177e3e6..2bfd1629d 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/core/ModParticleRenderTypes.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/core/ModParticleRenderTypes.java @@ -7,5 +7,6 @@ @RegistryContainer(clientOnly = true) public class ModParticleRenderTypes { - public static final ParticleRenderType FARMHAND_PLANT = new ParticleRenderType(Utils.id("backpacked_farmhand_plant").toString()); + // ParticleRenderType now also requires a shorthand identifier alongside the name (MC 26.2). + public static final ParticleRenderType FARMHAND_PLANT = new ParticleRenderType(Utils.id("backpacked_farmhand_plant").toString(), "backpacked_farmhand_plant"); } diff --git a/common/src/main/java/com/mrcrayfish/backpacked/datagen/CommonBlockTagGen.java b/common/src/main/java/com/mrcrayfish/backpacked/datagen/CommonBlockTagGen.java index 6105de09b..ad3915d1d 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/datagen/CommonBlockTagGen.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/datagen/CommonBlockTagGen.java @@ -4,34 +4,36 @@ import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.Registries; import net.minecraft.data.PackOutput; -import net.minecraft.data.tags.IntrinsicHolderTagsProvider; +import net.minecraft.data.tags.TagsProvider; import net.minecraft.tags.BlockTags; import net.minecraft.world.level.block.Block; import java.util.concurrent.CompletableFuture; -public class CommonBlockTagGen extends IntrinsicHolderTagsProvider +// IntrinsicHolderTagsProvider was removed in MC 26.2; use TagsProvider directly and pass +// resource keys (via builtInRegistryHolder().key()) instead of raw Block instances. +public class CommonBlockTagGen extends TagsProvider { public CommonBlockTagGen(PackOutput output, CompletableFuture completableFuture) { - super(output, Registries.BLOCK, completableFuture, block -> block.builtInRegistryHolder().key()); + super(output, Registries.BLOCK, completableFuture); } @Override protected void addTags(HolderLookup.Provider provider) { this.tag(BlockTags.MINEABLE_WITH_AXE).add( - ModBlocks.OAK_BACKPACK_SHELF.get(), - ModBlocks.SPRUCE_BACKPACK_SHELF.get(), - ModBlocks.BIRCH_BACKPACK_SHELF.get(), - ModBlocks.JUNGLE_BACKPACK_SHELF.get(), - ModBlocks.DARK_OAK_BACKPACK_SHELF.get(), - ModBlocks.ACACIA_BACKPACK_SHELF.get(), - ModBlocks.CRIMSON_BACKPACK_SHELF.get(), - ModBlocks.WARPED_BACKPACK_SHELF.get(), - ModBlocks.CHERRY_BACKPACK_SHELF.get(), - ModBlocks.PALE_OAK_BACKPACK_SHELF.get(), - ModBlocks.BACKPACK_DOCK.get() + ModBlocks.OAK_BACKPACK_SHELF.get().builtInRegistryHolder().key(), + ModBlocks.SPRUCE_BACKPACK_SHELF.get().builtInRegistryHolder().key(), + ModBlocks.BIRCH_BACKPACK_SHELF.get().builtInRegistryHolder().key(), + ModBlocks.JUNGLE_BACKPACK_SHELF.get().builtInRegistryHolder().key(), + ModBlocks.DARK_OAK_BACKPACK_SHELF.get().builtInRegistryHolder().key(), + ModBlocks.ACACIA_BACKPACK_SHELF.get().builtInRegistryHolder().key(), + ModBlocks.CRIMSON_BACKPACK_SHELF.get().builtInRegistryHolder().key(), + ModBlocks.WARPED_BACKPACK_SHELF.get().builtInRegistryHolder().key(), + ModBlocks.CHERRY_BACKPACK_SHELF.get().builtInRegistryHolder().key(), + ModBlocks.PALE_OAK_BACKPACK_SHELF.get().builtInRegistryHolder().key(), + ModBlocks.BACKPACK_DOCK.get().builtInRegistryHolder().key() ); } } diff --git a/common/src/main/java/com/mrcrayfish/backpacked/mixin/common/BredAnimalsTriggerMixin.java b/common/src/main/java/com/mrcrayfish/backpacked/mixin/common/BredAnimalsTriggerMixin.java index cccc59c2f..91a2e9006 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/mixin/common/BredAnimalsTriggerMixin.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/mixin/common/BredAnimalsTriggerMixin.java @@ -1,7 +1,7 @@ package com.mrcrayfish.backpacked.mixin.common; import com.mrcrayfish.backpacked.event.BackpackedEvents; -import net.minecraft.advancements.criterion.BredAnimalsTrigger; +import net.minecraft.advancements.triggers.BredAnimalsTrigger; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.AgeableMob; import net.minecraft.world.entity.animal.Animal; diff --git a/common/src/main/java/com/mrcrayfish/backpacked/mixin/common/PlayerInteractTriggerMixin.java b/common/src/main/java/com/mrcrayfish/backpacked/mixin/common/PlayerInteractTriggerMixin.java index 8013e624d..692b321ee 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/mixin/common/PlayerInteractTriggerMixin.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/mixin/common/PlayerInteractTriggerMixin.java @@ -2,7 +2,7 @@ import com.mrcrayfish.backpacked.event.BackpackedEvents; import com.mrcrayfish.backpacked.event.BackpackedInteractAccess; -import net.minecraft.advancements.criterion.PlayerInteractTrigger; +import net.minecraft.advancements.triggers.PlayerInteractTrigger; import net.minecraft.resources.Identifier; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; diff --git a/common/src/main/java/com/mrcrayfish/backpacked/network/play/ClientPlayHandler.java b/common/src/main/java/com/mrcrayfish/backpacked/network/play/ClientPlayHandler.java index 597364ff1..30448e4c7 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/network/play/ClientPlayHandler.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/network/play/ClientPlayHandler.java @@ -59,7 +59,7 @@ public static void handleUnlockBackpack(MessageUnlockBackpack message) // Suppress toast if the cosmetic is disabled if(!BackpackHelper.isCosmeticDisabled(backpack.getId())) { - mc.getToastManager().addToast(new UnlockBackpackToast(backpack)); + mc.gui.toastManager().addToast(new UnlockBackpackToast(backpack)); } } }); @@ -83,7 +83,7 @@ public static void handleOpenCustomisation(MessageOpenCustomisation message) if(minecraft.player == null) return; - minecraft.setScreen(new CustomiseBackpackScreen(message.backpackIndex(), message.progressMap(), message.properties(), message.showCosmeticWarning(), message.completionProgressMap())); + minecraft.gui.setScreen(new CustomiseBackpackScreen(message.backpackIndex(), message.progressMap(), message.properties(), message.showCosmeticWarning(), message.completionProgressMap())); } public static void handleSyncVillagerBackpack(MessageSyncVillagerBackpack message) @@ -127,7 +127,7 @@ public static void handleUnlockSlot(MessageSyncUnlockSlot message) } } - if(changed && minecraft.screen instanceof UnlockableContainerScreen screen) + if(changed && minecraft.gui.screen() instanceof UnlockableContainerScreen screen) { screen.onSlotUnlocked(slotIndexes); } @@ -163,7 +163,7 @@ public static void handleLootboundTakeItem(MessageLootboundTakeItem message, Mes public static void handleSyncAugmentChange(MessageSyncAugmentChange message) { Minecraft minecraft = Minecraft.getInstance(); - if(minecraft.screen instanceof BackpackScreen screen) + if(minecraft.gui.screen() instanceof BackpackScreen screen) { screen.updateAugment(message.position(), message.augment()); } @@ -185,7 +185,7 @@ public static void handleFarmhandPlant(MessageFarmhandPlant message, MessageCont var dispatcher = minecraft.getEntityRenderDispatcher(); var start = new Vec3(player.getX(), player.getY(0.65), player.getZ()).add(Vec3.directionFromRotation(0, player.yBodyRot + 180).scale(0.25)); - var end = message.pos().getBottomCenter(); + var end = Vec3.atBottomCenterOf(message.pos()); EntityRenderState state = dispatcher.extractEntity(new ItemEntity(level, start.x, start.y, start.z, stack), 1.0F); minecraft.particleEngine.add(new FarmhandPlantParticle(state, level, start, end)); minecraft.level.playSound(null, start.x, start.y, start.z, ModSounds.AUGMENT_LOOTBOUND_TAKE_ITEM.get(), SoundSource.PLAYERS, 1F, 0.5F); @@ -221,7 +221,7 @@ public static void handleUnlockAugmentBay(MessageSyncUnlockAugmentBay message) if(!menu.getAugmentBayController().unlockSlot(message.position().ordinal())) return; - if(minecraft.screen instanceof BackpackScreen screen) + if(minecraft.gui.screen() instanceof BackpackScreen screen) { screen.onAugmentBayUnlocked(message.position()); } diff --git a/common/src/main/resources/backpacked.common.mixins.json b/common/src/main/resources/backpacked.common.mixins.json index e10eac313..41d52dd1f 100644 --- a/common/src/main/resources/backpacked.common.mixins.json +++ b/common/src/main/resources/backpacked.common.mixins.json @@ -2,7 +2,7 @@ "required": true, "minVersion": "0.8", "package": "com.mrcrayfish.backpacked.mixin", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "refmap": "backpacked.refmap.json", "mixins": [ "common.AbstractArrowMixin", diff --git a/fabric/build.gradle b/fabric/build.gradle index 995948653..49412dc75 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -32,7 +32,8 @@ dependencies { implementation "net.fabricmc:fabric-loader:${fabric_loader_version}" implementation "net.fabricmc.fabric-api:fabric-api:${fabric_version}" implementation "com.mrcrayfish:framework-fabric:${framework_version}+${minecraft_version}" - runtimeOnly "com.mrcrayfish:catalogue-fabric:${catalogue_version}+${minecraft_version}" + // Catalogue 26.2 isn't published anywhere reachable without GitHub Packages credentials; disabled for local builds. + // runtimeOnly "com.mrcrayfish:catalogue-fabric:${catalogue_version}+${minecraft_version}" // JEI compileOnly "mezz.jei:jei-${jei_minecraft_version}-common-api:${jei_version}" @@ -102,7 +103,8 @@ build.dependsOn signJar // Implement mcgradleconventions loader attribute def loaderAttribute = Attribute.of('io.github.mcgradleconventions.loader', String) -['apiElements', 'runtimeElements', 'sourcesElements', 'javadocElements', 'includeInternal', 'modCompileClasspath'].each { variant -> +// 'includeInternal' configuration was removed in newer Fabric Loom versions +['apiElements', 'runtimeElements', 'sourcesElements', 'javadocElements', 'modCompileClasspath'].each { variant -> configurations.named("$variant") { attributes { attribute(loaderAttribute, 'fabric') diff --git a/fabric/src/main/java/com/mrcrayfish/backpacked/client/ClientHandler.java b/fabric/src/main/java/com/mrcrayfish/backpacked/client/ClientHandler.java index 7b04f1a6e..37d738fdd 100644 --- a/fabric/src/main/java/com/mrcrayfish/backpacked/client/ClientHandler.java +++ b/fabric/src/main/java/com/mrcrayfish/backpacked/client/ClientHandler.java @@ -32,7 +32,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.MenuScreens; import net.minecraft.client.model.player.PlayerModel; -import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.SubmitNodeCollector; import net.minecraft.client.renderer.blockentity.BlockEntityRenderers; import net.minecraft.client.renderer.entity.RenderLayerParent; import net.minecraft.client.renderer.entity.WanderingTraderRenderer; @@ -40,6 +40,7 @@ import net.minecraft.client.renderer.special.SpecialModelRenderers; import net.minecraft.server.packs.PackType; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EntityTypes; /** * Author: MrCrayfish @@ -63,13 +64,13 @@ public void onInitializeClient() SpecialModelRenderers.ID_MAPPER.put(Utils.id("backpack"), BackpackItemSpecialRenderer.Unbaked.MAP_CODEC); //BlockRenderLayerMap.putBlock(ModBlocks.BACKPACK_DOCK.get(), ChunkSectionLayer.CUTOUT); KeyMapping.Category.register(ModKeyMappings.CATEGORY.id()); - PictureInPictureRendererRegistry.register(ctx -> new GuiBackpackRenderer(ctx.bufferSource())); + PictureInPictureRendererRegistry.register(ctx -> new GuiBackpackRenderer()); // Add backpack layers for player and wandering trader LivingEntityRenderLayerRegistrationCallback.EVENT.register((entityType, entityRenderer, registrationHelper, context) -> { if(entityRenderer instanceof WanderingTraderRenderer renderer) { registrationHelper.register(new VillagerBackpackLayer(renderer, context.getItemModelResolver())); - } else if(entityType == EntityType.PLAYER) { + } else if(entityType == EntityTypes.PLAYER) { registrationHelper.register(new BackpackLayer((RenderLayerParent) entityRenderer)); } }); @@ -88,7 +89,7 @@ private void afterSolidFeatures(LevelRenderContext context) return; PoseStack stack = context.poseStack(); - MultiBufferSource source = mc.renderBuffers().bufferSource(); + SubmitNodeCollector source = context.submitNodeCollector(); boolean frozen = mc.level.tickRateManager().isEntityFrozen(mc.player); float partialTick = mc.getDeltaTracker().getGameTimeDeltaPartialTick(!frozen); FirstPersonEffectsRenderer.draw(mc.player, stack, source, partialTick); diff --git a/fabric/src/main/java/com/mrcrayfish/backpacked/mixin/EntityMixin.java b/fabric/src/main/java/com/mrcrayfish/backpacked/mixin/EntityMixin.java index 47dcc56dd..8394a1019 100644 --- a/fabric/src/main/java/com/mrcrayfish/backpacked/mixin/EntityMixin.java +++ b/fabric/src/main/java/com/mrcrayfish/backpacked/mixin/EntityMixin.java @@ -19,6 +19,7 @@ import net.minecraft.world.damagesource.DamageType; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EntityTypes; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.Vec3; @@ -85,7 +86,7 @@ public class EntityMixin implements LootCapture @Unique private boolean backpacked$CheckEntityForInvulnerability(Entity entity, DamageSource source) { - if(entity.getType() == EntityType.ITEM) + if(entity.getType() == EntityTypes.ITEM) { ItemEntity itemEntity = ((ItemEntity) entity); ItemStack stack = itemEntity.getItem(); diff --git a/fabric/src/main/java/com/mrcrayfish/backpacked/platform/FabricClientHelper.java b/fabric/src/main/java/com/mrcrayfish/backpacked/platform/FabricClientHelper.java index 4360d99b9..7d6dc9fdf 100644 --- a/fabric/src/main/java/com/mrcrayfish/backpacked/platform/FabricClientHelper.java +++ b/fabric/src/main/java/com/mrcrayfish/backpacked/platform/FabricClientHelper.java @@ -62,7 +62,7 @@ public void openConfigScreen() { Class factoryClass = Class.forName("com.mrcrayfish.configured.integration.CatalogueConfigFactory"); Method createConfigScreen = factoryClass.getDeclaredMethod("createConfigScreen", Screen.class, ModContainer.class); - createConfigScreen.invoke(null, Minecraft.getInstance().screen, container); + createConfigScreen.invoke(null, Minecraft.getInstance().gui.screen(), container); } catch(Exception e) { diff --git a/fabric/src/main/resources/backpacked.fabric.mixins.json b/fabric/src/main/resources/backpacked.fabric.mixins.json index e558597f9..059afe25b 100644 --- a/fabric/src/main/resources/backpacked.fabric.mixins.json +++ b/fabric/src/main/resources/backpacked.fabric.mixins.json @@ -2,7 +2,7 @@ "required": true, "minVersion": "0.8", "package": "com.mrcrayfish.backpacked.mixin", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "refmap": "backpacked.refmap.json", "mixins": [ "BlockMixin", diff --git a/gradle.properties b/gradle.properties index b00f8ba83..e64094154 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,21 +5,21 @@ group=com.mrcrayfish java_version=25 # Common -minecraft_version=26.1.2 -neo_form_version=26.1.2-1 +minecraft_version=26.2 +neo_form_version=26.2-1 # Fabric -fabric_version=0.145.4+26.1.2 -fabric_loader_version=0.18.6 -fabric_minecraft_version_range=~26.1- +fabric_version=0.152.1+26.2 +fabric_loader_version=0.19.3 +fabric_minecraft_version_range=~26.2- # NeoForge -neoforge_version=26.1.2.4-beta -neoforge_version_range=[26.1.2,) +neoforge_version=26.2.0.6-beta +neoforge_version_range=[26.2,) neoforge_loader_version_range=[2,) # Mod options -mod_version=3.0.4 +mod_version=3.1.0 mod_name=Backpacked mod_author=MrCrayfish mod_id=backpacked @@ -30,14 +30,14 @@ mod_issues=https://github.com/MrCrayfish/Backpacked/issues mod_license=GNU Lesser General Public License v2.1 # Dependency options -framework_version=0.13.22 +framework_version=0.14.0 catalogue_version=1.12.3 modmenu_version=18.0.0-alpha.8 yigd_neoforge_version=2.0.13 yigd_fabric_version=2.4.18 gravestone_version=1.0.35 -jei_minecraft_version=26.1.2 -jei_version=29.5.0.24 +jei_minecraft_version=26.2 +jei_version=30.1.0.10 # Gradle org.gradle.jvmargs=-Xmx3G diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index c61a118f7..5dd3c0121 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/neoforge/build.gradle b/neoforge/build.gradle index 22db66cea..f77461daf 100644 --- a/neoforge/build.gradle +++ b/neoforge/build.gradle @@ -59,7 +59,8 @@ repositories { dependencies { implementation "net.neoforged:neoforge:${neoforge_version}" implementation "com.mrcrayfish:framework-neoforge:${framework_version}+${minecraft_version}" - runtimeOnly "com.mrcrayfish:catalogue-neoforge:${catalogue_version}+${minecraft_version}" + // Catalogue 26.2 isn't published anywhere reachable without GitHub Packages credentials; disabled for local builds. + // runtimeOnly "com.mrcrayfish:catalogue-neoforge:${catalogue_version}+${minecraft_version}" // JEI compileOnly "mezz.jei:jei-${jei_minecraft_version}-common-api:${jei_version}" diff --git a/neoforge/src/main/java/com/mrcrayfish/backpacked/Backpacked.java b/neoforge/src/main/java/com/mrcrayfish/backpacked/Backpacked.java index 4556443b1..354e51c83 100644 --- a/neoforge/src/main/java/com/mrcrayfish/backpacked/Backpacked.java +++ b/neoforge/src/main/java/com/mrcrayfish/backpacked/Backpacked.java @@ -27,6 +27,7 @@ import net.minecraft.world.damagesource.DamageType; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EntityTypes; import net.minecraft.world.entity.ai.village.poi.PoiType; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; @@ -177,7 +178,7 @@ private void onEntityInvulnerabilityCheck(EntityInvulnerabilityCheckEvent event) if(event.isInvulnerable()) return; - if(event.getEntity().getType() == EntityType.ITEM) + if(event.getEntity().getType() == EntityTypes.ITEM) { ItemEntity entity = ((ItemEntity) event.getEntity()); ItemStack stack = entity.getItem(); diff --git a/neoforge/src/main/java/com/mrcrayfish/backpacked/client/ClientBackpacked.java b/neoforge/src/main/java/com/mrcrayfish/backpacked/client/ClientBackpacked.java index 944155a91..7219d9b28 100644 --- a/neoforge/src/main/java/com/mrcrayfish/backpacked/client/ClientBackpacked.java +++ b/neoforge/src/main/java/com/mrcrayfish/backpacked/client/ClientBackpacked.java @@ -33,7 +33,7 @@ import com.mrcrayfish.framework.api.client.model.NeoForgeModelResource; import net.minecraft.client.Minecraft; import net.minecraft.client.player.AbstractClientPlayer; -import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.SubmitNodeCollector; import net.minecraft.client.renderer.chunk.ChunkSectionLayer; import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.WanderingTraderRenderer; @@ -45,6 +45,7 @@ import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.util.context.ContextKey; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.EntityTypes; import net.minecraft.world.entity.npc.wanderingtrader.WanderingTrader; import net.minecraft.world.entity.player.PlayerModelType; import net.minecraft.world.level.storage.LevelStorageSource; @@ -87,7 +88,7 @@ public ClientBackpacked(IEventBus bus) bus.addListener(this::onRegisterPipRenderers); bus.addListener(this::onRegisterSpecialRenderers); bus.addListener(this::onRegisterKeyMappings); - NeoForge.EVENT_BUS.addListener(this::onRenderLevelStage); + NeoForge.EVENT_BUS.addListener(this::onSubmitCustomGeometry); } private void onClientSetup(FMLClientSetupEvent event) @@ -123,7 +124,7 @@ private void onAddLayers(EntityRenderersEvent.AddLayers event) addBackpackLayer(event.getPlayerRenderer(PlayerModelType.WIDE)); addBackpackLayer(event.getPlayerRenderer(PlayerModelType.SLIM)); - EntityRenderer renderer = event.getRenderer(EntityType.WANDERING_TRADER); + EntityRenderer renderer = event.getRenderer(EntityTypes.WANDERING_TRADER); if(renderer instanceof WanderingTraderRenderer traderRenderer) { traderRenderer.addLayer(new VillagerBackpackLayer(traderRenderer, event.getContext().getItemModelResolver())); @@ -167,7 +168,7 @@ private void onFindPacks(AddPackFindersEvent event) } } - private void onRenderLevelStage(RenderLevelStageEvent.AfterOpaqueBlocks event) + private void onSubmitCustomGeometry(SubmitCustomGeometryEvent event) { Minecraft mc = Minecraft.getInstance(); if(mc.player == null || mc.level == null) @@ -177,7 +178,7 @@ private void onRenderLevelStage(RenderLevelStageEvent.AfterOpaqueBlocks event) return; PoseStack stack = event.getPoseStack(); - MultiBufferSource source = mc.renderBuffers().bufferSource(); + SubmitNodeCollector source = event.getSubmitNodeCollector(); boolean frozen = mc.level.tickRateManager().isEntityFrozen(mc.player); float partialTick = mc.getDeltaTracker().getGameTimeDeltaPartialTick(!frozen); FirstPersonEffectsRenderer.draw(mc.player, stack, source, partialTick); diff --git a/neoforge/src/main/java/com/mrcrayfish/backpacked/platform/NeoForgeClientHelper.java b/neoforge/src/main/java/com/mrcrayfish/backpacked/platform/NeoForgeClientHelper.java index 0499d5f4b..9f1a4a38e 100644 --- a/neoforge/src/main/java/com/mrcrayfish/backpacked/platform/NeoForgeClientHelper.java +++ b/neoforge/src/main/java/com/mrcrayfish/backpacked/platform/NeoForgeClientHelper.java @@ -48,7 +48,7 @@ public void openConfigScreen() Screen screen = container.getCustomExtension(IConfigScreenFactory.class).map(function -> function.createScreen(container, null)).orElse(null); if(screen != null) { - minecraft.setScreen(screen); + minecraft.gui.setScreen(screen); } else if(minecraft.player != null) { From c2bc899f9360ef982103590ca2d1a24fea57da4c Mon Sep 17 00:00:00 2001 From: Masato Nakajima Date: Mon, 22 Jun 2026 17:19:33 +0800 Subject: [PATCH 2/7] Fix GuiMixin target for MC 26.2 (overlayMessageTime moved from Gui to Hud) --- .../com/mrcrayfish/backpacked/mixin/client/GuiMixin.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/com/mrcrayfish/backpacked/mixin/client/GuiMixin.java b/common/src/main/java/com/mrcrayfish/backpacked/mixin/client/GuiMixin.java index 7c034af50..57b72a7f0 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/mixin/client/GuiMixin.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/mixin/client/GuiMixin.java @@ -1,6 +1,6 @@ package com.mrcrayfish.backpacked.mixin.client; -import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.Hud; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.contents.TranslatableContents; import org.spongepowered.asm.mixin.Mixin; @@ -9,7 +9,8 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(Gui.class) +// In MC 26.2, overlayMessageTime/setOverlayMessage moved from Gui to Hud. +@Mixin(Hud.class) public class GuiMixin { @Shadow From 92374003dd974812e793f29bbedfc03d83ef4855 Mon Sep 17 00:00:00 2001 From: Masato Nakajima Date: Mon, 22 Jun 2026 17:39:19 +0800 Subject: [PATCH 3/7] Bump version to 3.1.1 and update Framework dependency to 0.14.1 --- CHANGELOG.md | 4 ++++ gradle.properties | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b4d1d3a9d..718054a03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 3.1.1 +- Fixed `GuiMixin` crash on launch: `@Shadow private int overlayMessageTime` and the `setOverlayMessage` injection target `Gui.class`, but MC 26.2 moved both the field and method to the new `Hud` class. Retargeted the mixin to `Hud.class`. +- Bumped Framework dependency to 0.14.1 (fixes a launch crash in Framework's own `GameRendererMixin` — see Framework's changelog) + ## 3.1.0 - Ported to Minecraft 26.2 (from 26.1.2) - Updated Framework dependency to 0.14.0+26.2 diff --git a/gradle.properties b/gradle.properties index e64094154..cdbee4ee8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,7 +19,7 @@ neoforge_version_range=[26.2,) neoforge_loader_version_range=[2,) # Mod options -mod_version=3.1.0 +mod_version=3.1.1 mod_name=Backpacked mod_author=MrCrayfish mod_id=backpacked @@ -30,7 +30,7 @@ mod_issues=https://github.com/MrCrayfish/Backpacked/issues mod_license=GNU Lesser General Public License v2.1 # Dependency options -framework_version=0.14.0 +framework_version=0.14.1 catalogue_version=1.12.3 modmenu_version=18.0.0-alpha.8 yigd_neoforge_version=2.0.13 From a832348d1366db3ca95d220f7345d5b16d8afdbf Mon Sep 17 00:00:00 2001 From: Masato Nakajima Date: Mon, 22 Jun 2026 22:43:06 +0800 Subject: [PATCH 4/7] Fix BitmapProvider Glyph mixin and advancements.triggers package mismatch for MC 26.2; bump to 3.1.2 --- CHANGELOG.md | 5 +++++ .../mixin/client/BitmapProviderDefinitionMixin.java | 3 ++- .../backpacked/mixin/common/ServerPlayerGameModeMixin.java | 4 ++-- gradle.properties | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 718054a03..c4ab69d43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## 3.1.2 +- **Root cause of the launch hang reported by user (not `comforts` as previously suspected):** `BitmapProviderDefinitionMixin`'s `@ModifyArgs` on `BitmapProvider$Glyph`'s constructor failed to find its target — MC 26.2 wraps the `NativeImage` constructor param in a new `BitmapProvider$ImageDataHolder` type. Fixed the `@At` target descriptor; the "advance" param this mixin adjusts is still index 6, so the modification logic itself didn't need to change. This mixin's failure was crashing `BitmapProvider$Definition`'s static init, which cascades into the `FontManager`/`GlyphProviderDefinition` circular class-init failure seen in earlier logs. +- `ServerPlayerGameModeMixin`: fixed two more `@At` target descriptors that still referenced the old `net.minecraft.advancements.criterion` package for `ItemUsedOnLocationTrigger`/`DefaultBlockInteractionTrigger` (moved to `advancements.triggers` in 3.1.0's port, but these were string-literal targets so the earlier import-based search missed them). +- Audited every other hardcoded mixin `@At`/`@Inject` target descriptor in the mod against MC 26.2 bytecode (cross-referencing actual constant-pool owner references, not just declared-method lists, since inherited methods keep the subclass as the symbolic owner) — no further mismatches found. + ## 3.1.1 - Fixed `GuiMixin` crash on launch: `@Shadow private int overlayMessageTime` and the `setOverlayMessage` injection target `Gui.class`, but MC 26.2 moved both the field and method to the new `Hud` class. Retargeted the mixin to `Hud.class`. - Bumped Framework dependency to 0.14.1 (fixes a launch crash in Framework's own `GameRendererMixin` — see Framework's changelog) diff --git a/common/src/main/java/com/mrcrayfish/backpacked/mixin/client/BitmapProviderDefinitionMixin.java b/common/src/main/java/com/mrcrayfish/backpacked/mixin/client/BitmapProviderDefinitionMixin.java index 8903a7dfc..a2326d14b 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/mixin/client/BitmapProviderDefinitionMixin.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/mixin/client/BitmapProviderDefinitionMixin.java @@ -26,7 +26,8 @@ public abstract class BitmapProviderDefinitionMixin } /* Thirdly, while init the glyph, remove the extra pixel space that is added to the real width */ - @ModifyArgs(method = "load", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/font/providers/BitmapProvider$Glyph;(FLcom/mojang/blaze3d/platform/NativeImage;IIIIII)V")) + // MC 26.2: the Glyph constructor's NativeImage param is now wrapped in ImageDataHolder; "advance" (the param this targets) is still index 6. + @ModifyArgs(method = "load", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/font/providers/BitmapProvider$Glyph;(FLnet/minecraft/client/gui/font/providers/BitmapProvider$ImageDataHolder;IIIIII)V")) private void backpacked$RemoveExtraWidth(Args args) { if(this.backpacked$removeOnePixel) diff --git a/common/src/main/java/com/mrcrayfish/backpacked/mixin/common/ServerPlayerGameModeMixin.java b/common/src/main/java/com/mrcrayfish/backpacked/mixin/common/ServerPlayerGameModeMixin.java index 93f817f10..b0d58898e 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/mixin/common/ServerPlayerGameModeMixin.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/mixin/common/ServerPlayerGameModeMixin.java @@ -103,7 +103,7 @@ public class ServerPlayerGameModeMixin } } - @Inject(method = "useItemOn", at = @At(value = "INVOKE", target = "Lnet/minecraft/advancements/criterion/ItemUsedOnLocationTrigger;trigger(Lnet/minecraft/server/level/ServerPlayer;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/item/ItemInstance;)V")) + @Inject(method = "useItemOn", at = @At(value = "INVOKE", target = "Lnet/minecraft/advancements/triggers/ItemUsedOnLocationTrigger;trigger(Lnet/minecraft/server/level/ServerPlayer;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/item/ItemInstance;)V")) private void backpacked$BeforeTriggerItem(ServerPlayer player, Level level, ItemStack stack, InteractionHand hand, BlockHitResult result, CallbackInfoReturnable cir) { if(this.backpacked$capturedUseState != null && this.backpacked$capturedUseItem != null) @@ -115,7 +115,7 @@ public class ServerPlayerGameModeMixin } } - @Inject(method = "useItemOn", at = @At(value = "INVOKE", target = "Lnet/minecraft/advancements/criterion/DefaultBlockInteractionTrigger;trigger(Lnet/minecraft/server/level/ServerPlayer;Lnet/minecraft/core/BlockPos;)V")) + @Inject(method = "useItemOn", at = @At(value = "INVOKE", target = "Lnet/minecraft/advancements/triggers/DefaultBlockInteractionTrigger;trigger(Lnet/minecraft/server/level/ServerPlayer;Lnet/minecraft/core/BlockPos;)V")) private void backpacked$BeforeTriggerDefault(ServerPlayer player, Level level, ItemStack stack, InteractionHand hand, BlockHitResult result, CallbackInfoReturnable cir) { if(this.backpacked$capturedUseState != null && this.backpacked$capturedUseItem != null) diff --git a/gradle.properties b/gradle.properties index cdbee4ee8..128452307 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,7 +19,7 @@ neoforge_version_range=[26.2,) neoforge_loader_version_range=[2,) # Mod options -mod_version=3.1.1 +mod_version=3.1.2 mod_name=Backpacked mod_author=MrCrayfish mod_id=backpacked From 1ec0930f2457d4745a3e1f240b1ae39550e052cb Mon Sep 17 00:00:00 2001 From: Masato Nakajima Date: Mon, 22 Jun 2026 23:11:34 +0800 Subject: [PATCH 5/7] Switch BitmapProvider mixin to ModifyArg to avoid IllegalAccessError; bump to 3.1.3 --- CHANGELOG.md | 3 +++ .../client/BitmapProviderDefinitionMixin.java | 22 +++++++------------ gradle.properties | 2 +- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c4ab69d43..8176906f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Changelog +## 3.1.3 +- `BitmapProviderDefinitionMixin` still crashed after 3.1.2's target-descriptor fix: `@ModifyArgs`'s generic `Args` wrapper has to box every constructor parameter generically, including the now-package-private `BitmapProvider$ImageDataHolder` type, which threw `IllegalAccessError` at runtime (synthetic Mixin helper class in a different package touching a package-private vanilla type). Switched to `@ModifyArg` (singular), which only generates a handler for the one `int` "advance" param (index 6) we actually modify — never needs to reference `ImageDataHolder` at all. + ## 3.1.2 - **Root cause of the launch hang reported by user (not `comforts` as previously suspected):** `BitmapProviderDefinitionMixin`'s `@ModifyArgs` on `BitmapProvider$Glyph`'s constructor failed to find its target — MC 26.2 wraps the `NativeImage` constructor param in a new `BitmapProvider$ImageDataHolder` type. Fixed the `@At` target descriptor; the "advance" param this mixin adjusts is still index 6, so the modification logic itself didn't need to change. This mixin's failure was crashing `BitmapProvider$Definition`'s static init, which cascades into the `FontManager`/`GlyphProviderDefinition` circular class-init failure seen in earlier logs. - `ServerPlayerGameModeMixin`: fixed two more `@At` target descriptors that still referenced the old `net.minecraft.advancements.criterion` package for `ItemUsedOnLocationTrigger`/`DefaultBlockInteractionTrigger` (moved to `advancements.triggers` in 3.1.0's port, but these were string-literal targets so the earlier import-based search missed them). diff --git a/common/src/main/java/com/mrcrayfish/backpacked/mixin/client/BitmapProviderDefinitionMixin.java b/common/src/main/java/com/mrcrayfish/backpacked/mixin/client/BitmapProviderDefinitionMixin.java index a2326d14b..0f4a546ee 100644 --- a/common/src/main/java/com/mrcrayfish/backpacked/mixin/client/BitmapProviderDefinitionMixin.java +++ b/common/src/main/java/com/mrcrayfish/backpacked/mixin/client/BitmapProviderDefinitionMixin.java @@ -7,9 +7,8 @@ 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.ModifyArgs; +import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import org.spongepowered.asm.mixin.injection.invoke.arg.Args; @Mixin(BitmapProvider.Definition.class) public abstract class BitmapProviderDefinitionMixin @@ -26,18 +25,13 @@ public abstract class BitmapProviderDefinitionMixin } /* Thirdly, while init the glyph, remove the extra pixel space that is added to the real width */ - // MC 26.2: the Glyph constructor's NativeImage param is now wrapped in ImageDataHolder; "advance" (the param this targets) is still index 6. - @ModifyArgs(method = "load", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/font/providers/BitmapProvider$Glyph;(FLnet/minecraft/client/gui/font/providers/BitmapProvider$ImageDataHolder;IIIIII)V")) - private void backpacked$RemoveExtraWidth(Args args) + // MC 26.2: the Glyph constructor's NativeImage param is now wrapped in a package-private ImageDataHolder type. + // @ModifyArgs's generic Args wrapper has to box every constructor param (including that inaccessible type), + // which throws IllegalAccessError at runtime. @ModifyArg only touches the one int param we care about (index 6, + // "advance"), so it never needs to reference ImageDataHolder at all. + @ModifyArg(method = "load", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/font/providers/BitmapProvider$Glyph;(FLnet/minecraft/client/gui/font/providers/BitmapProvider$ImageDataHolder;IIIIII)V"), index = 6) + private int backpacked$RemoveExtraWidth(int advance) { - if(this.backpacked$removeOnePixel) - { - Object arg = args.get(6); // 6 is the index for the width param - if(arg instanceof Integer) - { - // Remove the added pixel - args.set(6, (int) arg - 1); - } - } + return this.backpacked$removeOnePixel ? advance - 1 : advance; } } diff --git a/gradle.properties b/gradle.properties index 128452307..b3ac6f3d8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,7 +19,7 @@ neoforge_version_range=[26.2,) neoforge_loader_version_range=[2,) # Mod options -mod_version=3.1.2 +mod_version=3.1.3 mod_name=Backpacked mod_author=MrCrayfish mod_id=backpacked From c5c8d7fdb8457953ebd269fe2783cce6682cbc09 Mon Sep 17 00:00:00 2001 From: Masato Nakajima Date: Tue, 23 Jun 2026 01:13:47 +0800 Subject: [PATCH 6/7] Run datagen for both loaders and fix Fabric tag provider crash; bump to 3.1.4 --- CHANGELOG.md | 5 +++ .../backpacked/datagen/DataGeneration.java | 2 +- .../backpacked/datagen/FabricBlockTagGen.java | 37 +++++++++++++++++++ gradle.properties | 2 +- 4 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 fabric/src/main/java/com/mrcrayfish/backpacked/datagen/FabricBlockTagGen.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 8176906f8..b0df5ea60 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## 3.1.4 +- **Crafting recipes weren't unlocking/showing at all:** `src/generated/resources` (recipes, recipe-unlock advancements, loot tables, block tags — all produced by `:fabric:runDatagen` / `:neoforge:runData`) is gitignored project-wide and was never regenerated after this fresh clone/port, so none of that data made it into any of the 3.1.x jars. Ran datagen for both loaders; recipe/advancement/loot table/tag JSON now present and packaged. +- Fixed a second issue datagen surfaced: Fabric's data generator mixes into vanilla `TagsProvider` and casts the instance to `FabricTagsProvider`, so the shared `CommonBlockTagGen` (plain `TagsProvider`, from 3.1.0's `IntrinsicHolderTagsProvider` fix) crashed Fabric's datagen with a `ClassCastException`. Added a Fabric-specific `FabricBlockTagGen extends FabricTagsProvider.BlockTagsProvider` and registered that instead; NeoForge keeps using `CommonBlockTagGen` (no such requirement there). +- **Note for future builds:** if you regenerate from a fresh clone, run `:fabric:runDatagen` and `:neoforge:runData` before building, or any data-driven content (recipes, tags, loot tables) silently won't be in the jar. + ## 3.1.3 - `BitmapProviderDefinitionMixin` still crashed after 3.1.2's target-descriptor fix: `@ModifyArgs`'s generic `Args` wrapper has to box every constructor parameter generically, including the now-package-private `BitmapProvider$ImageDataHolder` type, which threw `IllegalAccessError` at runtime (synthetic Mixin helper class in a different package touching a package-private vanilla type). Switched to `@ModifyArg` (singular), which only generates a handler for the one `int` "advance" param (index 6) we actually modify — never needs to reference `ImageDataHolder` at all. diff --git a/fabric/src/main/java/com/mrcrayfish/backpacked/datagen/DataGeneration.java b/fabric/src/main/java/com/mrcrayfish/backpacked/datagen/DataGeneration.java index 06a48b9dc..129ad5035 100644 --- a/fabric/src/main/java/com/mrcrayfish/backpacked/datagen/DataGeneration.java +++ b/fabric/src/main/java/com/mrcrayfish/backpacked/datagen/DataGeneration.java @@ -14,6 +14,6 @@ public void onInitializeDataGenerator(FabricDataGenerator generator) FabricDataGenerator.Pack pack = generator.createPack(); pack.addProvider(LootTableGen::new); pack.addProvider(RecipeGen.Runner::new); - pack.addProvider(CommonBlockTagGen::new); + pack.addProvider(FabricBlockTagGen::new); } } diff --git a/fabric/src/main/java/com/mrcrayfish/backpacked/datagen/FabricBlockTagGen.java b/fabric/src/main/java/com/mrcrayfish/backpacked/datagen/FabricBlockTagGen.java new file mode 100644 index 000000000..b0f8d61fe --- /dev/null +++ b/fabric/src/main/java/com/mrcrayfish/backpacked/datagen/FabricBlockTagGen.java @@ -0,0 +1,37 @@ +package com.mrcrayfish.backpacked.datagen; + +import com.mrcrayfish.backpacked.core.ModBlocks; +import net.fabricmc.fabric.api.datagen.v1.FabricPackOutput; +import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagsProvider; +import net.minecraft.core.HolderLookup; +import net.minecraft.tags.BlockTags; + +import java.util.concurrent.CompletableFuture; + +// Fabric's data generator mixes into vanilla TagsProvider and casts the instance to FabricTagsProvider, +// so the shared CommonBlockTagGen (plain TagsProvider) can't be registered directly on Fabric. +public class FabricBlockTagGen extends FabricTagsProvider.BlockTagsProvider +{ + public FabricBlockTagGen(FabricPackOutput output, CompletableFuture completableFuture) + { + super(output, completableFuture); + } + + @Override + protected void addTags(HolderLookup.Provider provider) + { + this.tag(BlockTags.MINEABLE_WITH_AXE).add( + ModBlocks.OAK_BACKPACK_SHELF.get().builtInRegistryHolder().key(), + ModBlocks.SPRUCE_BACKPACK_SHELF.get().builtInRegistryHolder().key(), + ModBlocks.BIRCH_BACKPACK_SHELF.get().builtInRegistryHolder().key(), + ModBlocks.JUNGLE_BACKPACK_SHELF.get().builtInRegistryHolder().key(), + ModBlocks.DARK_OAK_BACKPACK_SHELF.get().builtInRegistryHolder().key(), + ModBlocks.ACACIA_BACKPACK_SHELF.get().builtInRegistryHolder().key(), + ModBlocks.CRIMSON_BACKPACK_SHELF.get().builtInRegistryHolder().key(), + ModBlocks.WARPED_BACKPACK_SHELF.get().builtInRegistryHolder().key(), + ModBlocks.CHERRY_BACKPACK_SHELF.get().builtInRegistryHolder().key(), + ModBlocks.PALE_OAK_BACKPACK_SHELF.get().builtInRegistryHolder().key(), + ModBlocks.BACKPACK_DOCK.get().builtInRegistryHolder().key() + ); + } +} diff --git a/gradle.properties b/gradle.properties index b3ac6f3d8..e49ee9bb2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -19,7 +19,7 @@ neoforge_version_range=[26.2,) neoforge_loader_version_range=[2,) # Mod options -mod_version=3.1.3 +mod_version=3.1.4 mod_name=Backpacked mod_author=MrCrayfish mod_id=backpacked From 0c61dd1e88a8cfc22b841b314c541c3e4fa1d167 Mon Sep 17 00:00:00 2001 From: Masato Nakajima Date: Tue, 23 Jun 2026 01:37:54 +0800 Subject: [PATCH 7/7] Consolidate 3.1.0-3.1.4 changelog entries into a single MC 26.2 port entry --- CHANGELOG.md | 39 ++++++++++++++------------------------- 1 file changed, 14 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b0df5ea60..0e066ba2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,29 +1,18 @@ # Changelog -## 3.1.4 -- **Crafting recipes weren't unlocking/showing at all:** `src/generated/resources` (recipes, recipe-unlock advancements, loot tables, block tags — all produced by `:fabric:runDatagen` / `:neoforge:runData`) is gitignored project-wide and was never regenerated after this fresh clone/port, so none of that data made it into any of the 3.1.x jars. Ran datagen for both loaders; recipe/advancement/loot table/tag JSON now present and packaged. -- Fixed a second issue datagen surfaced: Fabric's data generator mixes into vanilla `TagsProvider` and casts the instance to `FabricTagsProvider`, so the shared `CommonBlockTagGen` (plain `TagsProvider`, from 3.1.0's `IntrinsicHolderTagsProvider` fix) crashed Fabric's datagen with a `ClassCastException`. Added a Fabric-specific `FabricBlockTagGen extends FabricTagsProvider.BlockTagsProvider` and registered that instead; NeoForge keeps using `CommonBlockTagGen` (no such requirement there). -- **Note for future builds:** if you regenerate from a fresh clone, run `:fabric:runDatagen` and `:neoforge:runData` before building, or any data-driven content (recipes, tags, loot tables) silently won't be in the jar. +## [3.0.4 → 3.1.4] Port to Minecraft 26.2 -## 3.1.3 -- `BitmapProviderDefinitionMixin` still crashed after 3.1.2's target-descriptor fix: `@ModifyArgs`'s generic `Args` wrapper has to box every constructor parameter generically, including the now-package-private `BitmapProvider$ImageDataHolder` type, which threw `IllegalAccessError` at runtime (synthetic Mixin helper class in a different package touching a package-private vanilla type). Switched to `@ModifyArg` (singular), which only generates a handler for the one `int` "advance" param (index 6) we actually modify — never needs to reference `ImageDataHolder` at all. +Ported from Minecraft 26.1.2 to 26.2 (Fabric + NeoForge). Confirmed working: game launches and the backpack recipe unlocks and shows on the crafting table. -## 3.1.2 -- **Root cause of the launch hang reported by user (not `comforts` as previously suspected):** `BitmapProviderDefinitionMixin`'s `@ModifyArgs` on `BitmapProvider$Glyph`'s constructor failed to find its target — MC 26.2 wraps the `NativeImage` constructor param in a new `BitmapProvider$ImageDataHolder` type. Fixed the `@At` target descriptor; the "advance" param this mixin adjusts is still index 6, so the modification logic itself didn't need to change. This mixin's failure was crashing `BitmapProvider$Definition`'s static init, which cascades into the `FontManager`/`GlyphProviderDefinition` circular class-init failure seen in earlier logs. -- `ServerPlayerGameModeMixin`: fixed two more `@At` target descriptors that still referenced the old `net.minecraft.advancements.criterion` package for `ItemUsedOnLocationTrigger`/`DefaultBlockInteractionTrigger` (moved to `advancements.triggers` in 3.1.0's port, but these were string-literal targets so the earlier import-based search missed them). -- Audited every other hardcoded mixin `@At`/`@Inject` target descriptor in the mod against MC 26.2 bytecode (cross-referencing actual constant-pool owner references, not just declared-method lists, since inherited methods keep the subclass as the symbolic owner) — no further mismatches found. - -## 3.1.1 -- Fixed `GuiMixin` crash on launch: `@Shadow private int overlayMessageTime` and the `setOverlayMessage` injection target `Gui.class`, but MC 26.2 moved both the field and method to the new `Hud` class. Retargeted the mixin to `Hud.class`. -- Bumped Framework dependency to 0.14.1 (fixes a launch crash in Framework's own `GameRendererMixin` — see Framework's changelog) - -## 3.1.0 -- Ported to Minecraft 26.2 (from 26.1.2) -- Updated Framework dependency to 0.14.0+26.2 -- Migrated rendering code to the new deferred `SubmitNodeCollector` pipeline (`MultiBufferSource` removal) -- Updated `net.minecraft.advancements.criterion` predicate/trigger imports to their new `advancements.predicates` / `advancements.triggers` packages -- Replaced `EntityType` constants with the new `EntityTypes` holder class -- Replaced removed `BlockPos.getCenter()` / `getBottomCenter()` with `Vec3.atCenterOf()` / `Vec3.atBottomCenterOf()` -- Replaced removed `Minecraft.screen` / `setScreen()` / `getToastManager()` with their `Minecraft.gui` equivalents -- Replaced removed `IntrinsicHolderTagsProvider` with `TagsProvider` -- Catalogue integration disabled for local builds (not published anywhere reachable without GitHub Packages credentials) +- Updated Framework dependency to 0.14.1+26.2 (published locally to mavenLocal; not available via GitHub Packages without GPR credentials). +- Migrated rendering code to the new deferred `SubmitNodeCollector` pipeline (`MultiBufferSource` was removed entirely): `GuiBackpackRenderer`, `FirstPersonEffectsRenderer`, `ShelfRenderer`, `BackpackDockRenderer`, and the Fabric/NeoForge render-event hooks (NeoForge's old `RenderLevelStageEvent.AfterOpaqueBlocks` moved to `SubmitCustomGeometryEvent`). +- Updated `net.minecraft.advancements.criterion` predicate/trigger references (imports *and* hardcoded mixin `@At` target descriptors) to their new `advancements.predicates` / `advancements.predicates.entity` / `advancements.triggers` packages. +- Replaced `EntityType` constants with the new `EntityTypes` holder class; added explicit ``/`` type witnesses where generic inference needed help. +- Replaced removed `BlockPos.getCenter()` / `getBottomCenter()` with `Vec3.atCenterOf()` / `Vec3.atBottomCenterOf()`. +- Replaced removed `Minecraft.screen` / `setScreen()` / `getToastManager()` with their `Minecraft.gui` equivalents (`Gui#screen()`, `Gui#setScreen()`, `Gui#hud#getChat()`, `Hud#toastManager()`). +- Replaced removed `IntrinsicHolderTagsProvider` with `TagsProvider`. Fabric's data generator mixes into vanilla `TagsProvider` and requires the instance to actually be a `FabricTagsProvider`, so added a Fabric-specific `FabricBlockTagGen extends FabricTagsProvider.BlockTagsProvider`; NeoForge keeps the shared `CommonBlockTagGen`. +- `GuiMixin`: `overlayMessageTime` field and `setOverlayMessage` moved from `Gui` to the new `Hud` class — retargeted the mixin to `Hud.class`. +- `BitmapProviderDefinitionMixin`: the `Glyph` constructor now wraps `NativeImage` in a new package-private `ImageDataHolder` type. Updated the `@At` target descriptor, and switched from `@ModifyArgs` to `@ModifyArg` (singular) so the generated handler only touches the one `int` "advance" param we modify, instead of needing to box every constructor parameter (which threw `IllegalAccessError` against the inaccessible `ImageDataHolder` type). +- Other smaller API renames: `GameRenderer#getMainCamera()` → `mainCamera()`, `GameRenderer#getLighting()` → `lighting()`, `LevelRenderer.getLightCoords` → `LightCoordsUtil`, `ParticleRenderType` constructor now takes a shorthand string too, Fabric Loom's `includeInternal` configuration removed. +- Catalogue integration disabled for local builds (not published anywhere reachable without GitHub Packages credentials). +- Ran `:fabric:runDatagen` / `:neoforge:runData` to (re)generate recipes, recipe-unlock advancements, loot tables, and tags — this output is gitignored, so it must be regenerated on any fresh clone or the jar silently ships without that content.