Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Changelog

## [3.0.4 → 3.1.4] Port to Minecraft 26.2

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.

- 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 `<Player>`/`<TraderLlama>` 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.
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
3 changes: 3 additions & 0 deletions buildSrc/src/main/groovy/multiloader-common.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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())
{
Expand Down Expand Up @@ -88,12 +89,12 @@ private static boolean onInteraction(boolean attack, boolean use, boolean pick,
double range = Config.PICKPOCKETING.maxReachDistance.get();
List<LivingEntity> 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<CosmeticProperties> 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());
}));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -23,21 +23,16 @@

public class GuiBackpackRenderer extends PictureInPictureRenderer<GuiBackpackRenderState>
{
public GuiBackpackRenderer(MultiBufferSource.BufferSource source)
{
super(source);
}

@Override
public Class<GuiBackpackRenderState> getRenderStateClass()
{
return GuiBackpackRenderState.class;
}

@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);
Expand All @@ -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);
Expand All @@ -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();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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();
Expand Down Expand Up @@ -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<CosmeticProperties> propertiesOptional = ModSyncedDataKeys.COSMETIC_PROPERTIES.getValue(player);
if(propertiesOptional.isEmpty())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -128,7 +129,7 @@ public static boolean onInteract(Entity target, Player player)

private static List<Player> findDetectedPlayers(LivingEntity entity)
{
return entity.level().getEntities(EntityType.PLAYER, entity.getBoundingBox().inflate(getMaxDetectionDistance()), player -> {
return entity.level().<Player>getEntities(EntityTypes.PLAYER, entity.getBoundingBox().inflate(getMaxDetectionDistance()), player -> {
return isPlayerInLivingEntityVision(entity, player) && isPlayerSeenByLivingEntity(entity, player, getMaxDetectionDistance()) || !player.isCrouching() && isPlayerMoving(player);
});
}
Expand Down Expand Up @@ -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().<TraderLlama>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;
Expand Down
Loading