From af27907356dc97e202742ccad2aec8a59dfed943 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Wed, 30 Sep 2026 17:39:14 +0200 Subject: [PATCH] Build every version with Mojang mappings instead of Yarn Minecraft ships unobfuscated from 26.1, and 1.21.11 has the last Yarn release, so the shared src/ has to use Mojang's names before newer versions can be added (#39). Each version's sources were migrated with Loom's migrateMappings and merged back into src/, so code that is only active on other versions is migrated too. Where Mojang's names differ between 1.21.x versions, src/ uses the newest ones: Stonecutter replacements swap in the older Identifier/ResourceLocation and Avatar/Player renderer names, and version comments cover the few package moves and renamed methods. The fog mixin now targets setupFog on every version. Yarn's applyFog named two methods from 1.21.6 on, so it also applied to updateBuffer. Co-Authored-By: Claude Opus 5.5 --- VERSION_GUIDE.md | 20 +- build.gradle.kts | 2 +- settings.gradle.kts | 2 +- .../impl/cosmetics/CloakFeatureRenderer.java | 185 +++++----- .../impl/cosmetics/HatFeatureRenderer.java | 52 +-- .../impl/cosmetics/obj/MtlLoader.java | 10 +- .../impl/cosmetics/obj/ObjModel.java | 44 +-- .../impl/cosmetics/obj/ObjRenderer.java | 51 +-- .../impl/cosmetics/utils/IdentifierUtils.java | 16 +- .../impl/cosmetics/utils/ShaderUtils.java | 81 +++-- .../features/entity/EntityFeatureImpl.java | 16 +- .../features/mixins/entity/CameraMixin.java | 24 +- .../features/mixins/entity/EntityMixin.java | 12 +- .../render/BackgroundRendererMixin.java | 9 +- .../mixins/render/GameRendererMixin.java | 14 +- .../render/LightmapTextureManagerMixin.java | 6 +- .../render/LivingEntityRenderStateMixin.java | 2 +- .../render/LivingEntityRendererMixin.java | 28 +- .../features/mixins/render/RenderMixin.java | 16 +- .../impl/features/mixins/world/TpsMixin.java | 12 +- .../features/network/NetworkFeatureImpl.java | 14 +- .../features/player/PlayerFeatureImpl.java | 68 ++-- .../features/render/RenderFeatureImpl.java | 20 +- .../impl/features/world/WorldFeatureImpl.java | 10 +- .../impl/mixins/IdentifierMixin.java | 2 +- .../impl/mixins/ItemStackMixin.java | 4 +- .../impl/mixins/MatrixStackMixin.java | 22 +- .../impl/mixins/MinecraftClientMixin.java | 66 ++-- .../saturnclient/impl/mixins/SpriteMixin.java | 4 +- .../impl/mixins/StatusEffectMixin.java | 24 +- .../saturnclient/impl/mixins/TextMixin.java | 16 +- .../saturnclient/impl/mixins/WindowMixin.java | 15 +- .../impl/provider/FeatureProviderFabric.java | 4 +- .../impl/provider/GLFWProviderImpl.java | 8 +- .../impl/provider/RefConstructorImpl.java | 10 +- .../impl/provider/SaturnProviderImpl.java | 26 +- .../impl/ui/EntityDrawerImpl.java | 106 +++--- .../saturnclient/impl/ui/GlassRenderer.java | 252 ++++++------- .../saturnclient/impl/ui/RenderScopeImpl.java | 338 +++++++++--------- .../impl/ui/SaturnScreenFabric.java | 98 ++--- .../saturnclient/SaturnClient.java | 6 +- .../saturnclient/event/KeyInputHandler.java | 36 +- .../mixin/DrawContextAccessor.java | 12 +- .../mixin/PlayerEntityRendererMixin.java | 65 ++-- .../saturnclient/mixin/SetScreenMixin.java | 10 +- .../mixin/SplashOverlayMixin.java | 105 +++--- .../saturnclient/mixin/TabListMixin.java | 24 +- .../saturnclient/mixin/WhoAmI.java | 6 +- stonecutter.gradle.kts | 14 + versions/1.21.10/gradle.properties | 1 - versions/1.21.11/gradle.properties | 1 - versions/1.21.4/gradle.properties | 1 - versions/1.21.5/gradle.properties | 1 - versions/1.21.6/gradle.properties | 1 - versions/1.21.7/gradle.properties | 1 - versions/1.21.8/gradle.properties | 1 - versions/1.21.9/gradle.properties | 1 - 57 files changed, 1021 insertions(+), 974 deletions(-) diff --git a/VERSION_GUIDE.md b/VERSION_GUIDE.md index f810719..042561a 100644 --- a/VERSION_GUIDE.md +++ b/VERSION_GUIDE.md @@ -8,29 +8,35 @@ Every supported Minecraft version (1.21.4 to 1.21.11) builds from one copy of th - `common/`: all version-independent code (mods, UI, cosmetics, the server client). It has no Minecraft dependency and reaches the game only through the interfaces in `org.saturnclient.common`. - `src/`: the version-specific code (providers, refs, mixins and the three mixin configs), one copy for every version. Where Minecraft's API differs between versions, the code goes behind version comments (see below). -- `versions//`: each version's `gradle.properties` (Minecraft, Yarn, Fabric Loader and Fabric API versions), plus its `build/` and `run/` folders. Each version is the Gradle project `:`. +- `versions//`: each version's `gradle.properties` (Minecraft, Fabric Loader and Fabric API versions), plus its `build/` and `run/` folders. Each version is the Gradle project `:`. `settings.gradle.kts` lists the versions in `stonecutterVersions`. The root `build.gradle.kts` builds each version, and `stonecutter.gradle.kts` configures the root project (shared repositories, the `common` wiring and `buildAll`). Loom's version is `loom_version` in the root `gradle.properties`. +## Mappings + +Every version is built with Mojang's official names (`loom.officialMojangMappings()`), the names Minecraft itself ships from 26.1 on. Yarn isn't used any more: 1.21.11 has the last Yarn release. + +Mojang renamed a few classes within 1.21.x. `src/` uses the newest names, and `stonecutter.gradle.kts` lists replacements that swap in the older name when Stonecutter processes an older version (for example `Identifier`, which was `ResourceLocation` before 1.21.11, and `AvatarRenderState`, which was `PlayerRenderState` before 1.21.9). Add a replacement there when a rename touches many lines. A class that only moved package needs just a version comment on its import, and a renamed method a version comment where it's called. + ## Version-specific code with Stonecutter The code in `src/` is always plain Java for the **active** version (1.21.11, set in `stonecutter.gradle.kts`). Code for other versions sits in comments that Stonecutter swaps before building each version: ```java //? if >=1.21.9 { -public void render(MatrixStack matrices, OrderedRenderCommandQueue queue, int light, PlayerEntityRenderState state, float limbAngle, float limbDistance) { +public void submit(PoseStack matrices, SubmitNodeCollector output, int light, AvatarRenderState state, float limbAngle, float limbDistance) { //?} else -//public void render(MatrixStack matrices, VertexConsumerProvider consumers, int light, PlayerEntityRenderState state, float limbAngle, float limbDistance) { +//public void render(PoseStack matrices, MultiBufferSource output, int light, AvatarRenderState state, float limbAngle, float limbDistance) { ``` A condition without braces covers the next line only. For several lines, use braces and wrap the inactive block in `/* … */`: ```java //? if >=1.21.11 { -import net.minecraft.client.render.RenderLayers; -import net.minecraft.client.render.RenderSetup; +import net.minecraft.client.renderer.rendertype.RenderTypes; +import net.minecraft.client.renderer.rendertype.RenderSetup; //?} else { -/*import net.minecraft.client.render.RenderPhase.Textures; +/*import net.minecraft.client.renderer.RenderStateShard.MultiTextureStateShard; *///?} ``` @@ -62,7 +68,7 @@ For bigger changes, `./gradlew buildAll` builds every version's jar into `build/ ## Adding a Minecraft version -1. Create `versions//gradle.properties` with `minecraft_version`, `yarn_mappings`, `loader_version` and `fabric_api_version` (copy 1.21.11's and change the values; they're listed at ). Loom's version is shared, in the root `gradle.properties`. +1. Create `versions//gradle.properties` with `minecraft_version`, `loader_version` and `fabric_api_version` (copy 1.21.11's and change the values; they're listed at ). Loom's version is shared, in the root `gradle.properties`. 2. Add `` to `stonecutterVersions` in `settings.gradle.kts`. 3. Build it with `./gradlew ::compileJava` and put what Minecraft changed behind version comments. Check the mixin configs in `src/main/resources/*.mixins.json` as well: a mixin whose target changed fails at startup, not at compile time, so launch it with `./gradlew ::runClient`. 4. The release workflow builds everything through `buildAll`, and "Publish to Modrinth" takes the game version from each jar's name, so neither needs changing. diff --git a/build.gradle.kts b/build.gradle.kts index 5faa9c2..afb70ae 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -17,7 +17,7 @@ base { dependencies { minecraft("com.mojang:minecraft:$minecraftVersion") - mappings("net.fabricmc:yarn:${property("yarn_mappings")}:v2") + mappings(loom.officialMojangMappings()) modImplementation("net.fabricmc:fabric-loader:$loaderVersion") modImplementation("net.fabricmc.fabric-api:fabric-api:${property("fabric_api_version")}") diff --git a/settings.gradle.kts b/settings.gradle.kts index 4167ee7..8fcbb8a 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -22,7 +22,7 @@ rootProject.name = "saturn-client" include("common") // Versions built by Stonecutter from the shared src/ (see stonecutter.gradle.kts). Each one's -// versions//gradle.properties holds its Minecraft, Yarn and Fabric API versions. +// versions//gradle.properties holds its Minecraft, Fabric Loader and Fabric API versions. val stonecutterVersions = listOf("1.21.4", "1.21.5", "1.21.6", "1.21.7", "1.21.8", "1.21.9", "1.21.10", "1.21.11") stonecutter { diff --git a/src/main/java/org/saturnclient/impl/cosmetics/CloakFeatureRenderer.java b/src/main/java/org/saturnclient/impl/cosmetics/CloakFeatureRenderer.java index 7463528..59d6f5e 100644 --- a/src/main/java/org/saturnclient/impl/cosmetics/CloakFeatureRenderer.java +++ b/src/main/java/org/saturnclient/impl/cosmetics/CloakFeatureRenderer.java @@ -22,28 +22,30 @@ import org.saturnclient.emotes.fabric.access.BendablePart; import org.saturnclient.impl.cosmetics.utils.ShaderUtils; import org.saturnclient.saturnclient.SaturnRenderState; -import net.minecraft.client.model.ModelPart; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.model.geom.ModelPart; +import net.minecraft.client.renderer.texture.OverlayTexture; +import com.mojang.blaze3d.vertex.VertexConsumer; //? if >=1.21.9 { -import net.minecraft.client.render.command.OrderedRenderCommandQueue; +import net.minecraft.client.renderer.SubmitNodeCollector; //?} else -//import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.equipment.EquipmentModel; -import net.minecraft.client.render.entity.equipment.EquipmentModelLoader; -import net.minecraft.client.render.entity.equipment.EquipmentModel.LayerType; -import net.minecraft.client.render.entity.feature.FeatureRenderer; -import net.minecraft.client.render.entity.feature.FeatureRendererContext; -import net.minecraft.client.render.entity.model.PlayerEntityModel; -import net.minecraft.client.render.entity.state.PlayerEntityRenderState; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.component.DataComponentTypes; -import net.minecraft.component.type.EquippableComponent; -import net.minecraft.item.ItemStack; -import net.minecraft.item.equipment.EquipmentAsset; -import net.minecraft.registry.RegistryKey; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; +//import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.resources.model.EquipmentClientInfo; +import net.minecraft.client.resources.model.EquipmentAssetManager; +import net.minecraft.client.resources.model.EquipmentClientInfo.LayerType; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.client.renderer.entity.RenderLayerParent; +//? if >=1.21.11 { +import net.minecraft.client.model.player.PlayerModel; +//?} else +//import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.renderer.entity.state.AvatarRenderState; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.core.component.DataComponents; +import net.minecraft.world.item.equipment.Equippable; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.equipment.EquipmentAsset; +import net.minecraft.resources.ResourceKey; +import net.minecraft.util.Mth; /** * The cloak renderer @@ -52,8 +54,8 @@ import net.minecraft.util.math.Vec3d; * - **Curving**: Curves when player velocity increases. * - **Wavey**: Makes the cloak feel like wind, when jump sprinting. */ -public class CloakFeatureRenderer extends FeatureRenderer { - private final EquipmentModelLoader equipmentModelLoader; +public class CloakFeatureRenderer extends RenderLayer { + private final EquipmentAssetManager equipmentModelLoader; private static final int PARTS = 24; private final float[] segmentValues = new float[PARTS]; private static final int H_PARTS = 6; @@ -96,19 +98,19 @@ public class CloakFeatureRenderer extends FeatureRenderer context, - EquipmentModelLoader equipmentModelLoader) { + public CloakFeatureRenderer(RenderLayerParent context, + EquipmentAssetManager equipmentModelLoader) { super(context); this.equipmentModelLoader = equipmentModelLoader; Arrays.fill(segmentValues, 0.0f); } - private boolean hasCustomModelForLayer(ItemStack stack, EquipmentModel.LayerType layerType) { - EquippableComponent equippableComponent = (EquippableComponent) stack - .get(DataComponentTypes.EQUIPPABLE); + private boolean hasCustomModelForLayer(ItemStack stack, EquipmentClientInfo.LayerType layerType) { + Equippable equippableComponent = (Equippable) stack + .get(DataComponents.EQUIPPABLE); if (equippableComponent != null && !equippableComponent.assetId().isEmpty()) { - EquipmentModel equipmentModel = this.equipmentModelLoader - .get((RegistryKey) equippableComponent.assetId().get()); + EquipmentClientInfo equipmentModel = this.equipmentModelLoader + .get((ResourceKey) equippableComponent.assetId().get()); return !equipmentModel.getLayers(layerType).isEmpty(); } else { return false; @@ -116,7 +118,7 @@ public class CloakFeatureRenderer extends FeatureRenderer=1.21.9 { + public void submit(PoseStack matrices, + //?} else + //public void render(PoseStack matrices, //? if >=1.21.9 { - OrderedRenderCommandQueue output, + SubmitNodeCollector output, //?} else - //VertexConsumerProvider output, - int light, PlayerEntityRenderState state, float limbAngle, float limbDistance) { - if (state.invisible || !state.capeVisible + //MultiBufferSource output, + int light, AvatarRenderState state, float limbAngle, float limbDistance) { + if (state.isInvisible || !state.showCape //? if >=1.21.9 { - || state.skinTextures.cape() != null) { + || state.skin.cape() != null) { //?} else - //|| state.skinTextures.capeTexture() != null) { + //|| state.skin.capeTexture() != null) { return; } @@ -475,7 +480,7 @@ public class CloakFeatureRenderer extends FeatureRenderer=1.21.5 { - model.getRootPart().applyTransform(matrices); - model.body.applyTransform(matrices); + model.root().translateAndRotate(matrices); + model.body.translateAndRotate(matrices); //?} else { - /*model.getRootPart().rotate(matrices); - model.body.rotate(matrices); + /*model.root().translateAndRotate(matrices); + model.body.translateAndRotate(matrices); *///?} followBend(matrices, model.body); matrices.translate(0.0f, 0.0f, 0.12f); - if (this.hasCustomModelForLayer(state.equippedChestStack, LayerType.HUMANOID)) { + if (this.hasCustomModelForLayer(state.chestEquipment, LayerType.HUMANOID)) { matrices.translate(0.0F, -0.053125F, 0.06875F); } long now = System.currentTimeMillis(); if (now - lastUpdate >= 20) { - float velX = Math.min(0.8f, state.field_53537 / 108.0f); - float rawVelY = state.field_53536; + float velX = Math.min(0.8f, state.capeLean / 108.0f); + float rawVelY = state.capeFlap; float velY = (rawVelY > 3.4f ? rawVelY : rawVelY < -3.4f ? rawVelY : 0.0f) / 16; - float value = Math.max(0.0f, Math.min(2.0f, state.isSwimming ? 0.0f : velX + velY)); + float value = Math.max(0.0f, Math.min(2.0f, state.isVisuallySwimming ? 0.0f : velX + velY)); if (Config.cloakPhysics.value) { updateSegmentValues(segmentValues[0] + (value - segmentValues[0]) * 0.3f); @@ -525,15 +530,15 @@ public class CloakFeatureRenderer extends FeatureRenderer=1.21.9 { - output.submitCustom(matrices, ShaderUtils.getRenderLayer(customCape), (entry, vertexConsumer) -> { - renderCape(entry, vertexConsumer, state, l, OverlayTexture.DEFAULT_UV); + output.submitCustomGeometry(matrices, ShaderUtils.getRenderLayer(customCape), (entry, vertexConsumer) -> { + renderCape(entry, vertexConsumer, state, l, OverlayTexture.NO_OVERLAY); }); //?} else - //renderCape(matrices.peek(), output.getBuffer(ShaderUtils.getRenderLayer(customCape)), state, l, OverlayTexture.DEFAULT_UV); + //renderCape(matrices.last(), output.getBuffer(ShaderUtils.getRenderLayer(customCape)), state, l, OverlayTexture.NO_OVERLAY); - matrices.pop(); + matrices.popPose(); } } diff --git a/src/main/java/org/saturnclient/impl/cosmetics/HatFeatureRenderer.java b/src/main/java/org/saturnclient/impl/cosmetics/HatFeatureRenderer.java index 5e9082a..ff4697d 100644 --- a/src/main/java/org/saturnclient/impl/cosmetics/HatFeatureRenderer.java +++ b/src/main/java/org/saturnclient/impl/cosmetics/HatFeatureRenderer.java @@ -5,55 +5,61 @@ import org.saturnclient.impl.cosmetics.obj.MtlLoader; import org.saturnclient.impl.cosmetics.obj.ObjModel; import org.saturnclient.saturnclient.SaturnRenderState; -import net.minecraft.client.render.OverlayTexture; +import net.minecraft.client.renderer.texture.OverlayTexture; //? if >=1.21.9 { -import net.minecraft.client.render.command.OrderedRenderCommandQueue; +import net.minecraft.client.renderer.SubmitNodeCollector; //?} else -//import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.feature.FeatureRenderer; -import net.minecraft.client.render.entity.feature.FeatureRendererContext; -import net.minecraft.client.render.entity.model.PlayerEntityModel; -import net.minecraft.client.render.entity.state.PlayerEntityRenderState; -import net.minecraft.client.util.math.MatrixStack; +//import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.client.renderer.entity.RenderLayerParent; +//? if >=1.21.11 { +import net.minecraft.client.model.player.PlayerModel; +//?} else +//import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.renderer.entity.state.AvatarRenderState; +import com.mojang.blaze3d.vertex.PoseStack; -public class HatFeatureRenderer extends FeatureRenderer { - public HatFeatureRenderer(FeatureRendererContext context) { +public class HatFeatureRenderer extends RenderLayer { + public HatFeatureRenderer(RenderLayerParent context) { super(context); } @Override - public void render(MatrixStack matrices, + //? if >=1.21.9 { + public void submit(PoseStack matrices, + //?} else + //public void render(PoseStack matrices, //? if >=1.21.9 { - OrderedRenderCommandQueue output, + SubmitNodeCollector output, //?} else - //VertexConsumerProvider output, - int light, PlayerEntityRenderState state, float limbAngle, float limbDistance) { + //MultiBufferSource output, + int light, AvatarRenderState state, float limbAngle, float limbDistance) { //? if >=1.21.8 { SaturnPlayer player = state.getData(SaturnRenderState.saturnDataKey); //?} else //SaturnPlayer player = SaturnPlayer.get(state.name); - if (state.invisible || player == null || player.hat.isEmpty()) { + if (state.isInvisible || player == null || player.hat.isEmpty()) { return; } - matrices.push(); + matrices.pushPose(); // On the head, as vanilla places head items: the whole player (which emotes like the backflip // turn), then the head's position, turn and scale (which crouching and emotes move) - PlayerEntityModel model = this.getContextModel(); + PlayerModel model = this.getParentModel(); //? if >=1.21.5 { - model.getRootPart().applyTransform(matrices); - model.head.applyTransform(matrices); + model.root().translateAndRotate(matrices); + model.head.translateAndRotate(matrices); //?} else { - /*model.getRootPart().rotate(matrices); - model.head.rotate(matrices); + /*model.root().translateAndRotate(matrices); + model.head.translateAndRotate(matrices); *///?} ObjModel.cosmetic("hat", player.hat).render(MtlLoader.cosmetic(player.hat), matrices, output, light, - OverlayTexture.DEFAULT_UV); + OverlayTexture.NO_OVERLAY); - matrices.pop(); + matrices.popPose(); } } \ No newline at end of file diff --git a/src/main/java/org/saturnclient/impl/cosmetics/obj/MtlLoader.java b/src/main/java/org/saturnclient/impl/cosmetics/obj/MtlLoader.java index 11b06d3..6017715 100644 --- a/src/main/java/org/saturnclient/impl/cosmetics/obj/MtlLoader.java +++ b/src/main/java/org/saturnclient/impl/cosmetics/obj/MtlLoader.java @@ -8,15 +8,15 @@ import java.util.Map; import de.javagl.obj.*; -import net.minecraft.client.MinecraftClient; -import net.minecraft.util.Identifier; +import net.minecraft.client.Minecraft; +import net.minecraft.resources.Identifier; public class MtlLoader { static Map> loadedMtls = new HashMap<>(); static Map loadMtl(Identifier mtlId) throws IOException { - try (InputStream is = MinecraftClient.getInstance().getResourceManager() - .getResource(mtlId).get().getInputStream()) { + try (InputStream is = Minecraft.getInstance().getResourceManager() + .getResource(mtlId).get().open()) { List mtlList = MtlReader.read(is); Map mtlMap = new java.util.LinkedHashMap<>(); for (Mtl mtl : mtlList) { @@ -51,6 +51,6 @@ public class MtlLoader { if (mtlId.isEmpty()) mtlId = "white"; - return of(Identifier.of("saturnclient", "models/cosmetic/materials/" + mtlId + ".mtl")); + return of(Identifier.fromNamespaceAndPath("saturnclient", "models/cosmetic/materials/" + mtlId + ".mtl")); } } diff --git a/src/main/java/org/saturnclient/impl/cosmetics/obj/ObjModel.java b/src/main/java/org/saturnclient/impl/cosmetics/obj/ObjModel.java index 6fd8819..f290e4c 100644 --- a/src/main/java/org/saturnclient/impl/cosmetics/obj/ObjModel.java +++ b/src/main/java/org/saturnclient/impl/cosmetics/obj/ObjModel.java @@ -12,15 +12,15 @@ import com.fasterxml.jackson.databind.ObjectMapper; import de.javagl.obj.Mtl; import de.javagl.obj.Obj; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; //? if >=1.21.9 { -import net.minecraft.client.render.command.OrderedRenderCommandQueue; +import net.minecraft.client.renderer.SubmitNodeCollector; //?} else -//import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.resource.Resource; -import net.minecraft.resource.ResourceManager; -import net.minecraft.util.Identifier; +//import net.minecraft.client.renderer.MultiBufferSource; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.server.packs.resources.Resource; +import net.minecraft.server.packs.resources.ResourceManager; +import net.minecraft.resources.Identifier; public class ObjModel { private static final ObjectMapper MAPPER = new ObjectMapper(); @@ -46,7 +46,7 @@ public class ObjModel { Config config; public static ObjModel cosmetic(String cosmeticKind, String id) { - return of(Identifier.of("saturnclient", "models/cosmetic/" + cosmeticKind + "/" + id.split("_")[0] + "/model")); + return of(Identifier.fromNamespaceAndPath("saturnclient", "models/cosmetic/" + cosmeticKind + "/" + id.split("_")[0] + "/model")); } public static ObjModel of(Identifier obj) { @@ -59,8 +59,8 @@ public class ObjModel { } ObjModel(Identifier identifier) { - Identifier objId = Identifier.of(identifier.getNamespace(), identifier.getPath() + ".obj"); - Identifier jsonId = Identifier.of(identifier.getNamespace(), identifier.getPath() + ".json"); + Identifier objId = Identifier.fromNamespaceAndPath(identifier.getNamespace(), identifier.getPath() + ".obj"); + Identifier jsonId = Identifier.fromNamespaceAndPath(identifier.getNamespace(), identifier.getPath() + ".json"); try { this.obj = ObjRenderer.loadObj(objId); @@ -69,11 +69,11 @@ public class ObjModel { } // Try loading JSON config if it exists - ResourceManager resourceManager = MinecraftClient.getInstance().getResourceManager(); + ResourceManager resourceManager = Minecraft.getInstance().getResourceManager(); Optional resource = resourceManager.getResource(jsonId); if (resource.isPresent()) { - try (InputStream stream = resource.get().getInputStream()) { + try (InputStream stream = resource.get().open()) { this.config = MAPPER.readValue(stream, Config.class); } catch (Exception e) { e.printStackTrace(); @@ -81,29 +81,29 @@ public class ObjModel { } } - public void render(Map mtlMap, MatrixStack matrices, + public void render(Map mtlMap, PoseStack matrices, //? if >=1.21.9 { - OrderedRenderCommandQueue output, + SubmitNodeCollector output, //?} else - //VertexConsumerProvider output, + //MultiBufferSource output, int light, int overlay) { - matrices.push(); + matrices.pushPose(); - matrices.multiply(net.minecraft.util.math.RotationAxis.POSITIVE_X.rotationDegrees(180.0f)); - matrices.multiply(net.minecraft.util.math.RotationAxis.POSITIVE_Y.rotationDegrees(180.0f)); + matrices.mulPose(com.mojang.math.Axis.XP.rotationDegrees(180.0f)); + matrices.mulPose(com.mojang.math.Axis.YP.rotationDegrees(180.0f)); if (this.config != null) { matrices.translate(config.transform.x, config.transform.y, config.transform.z); matrices.scale(config.scale.x, config.scale.y, config.scale.z); - matrices.multiply(net.minecraft.util.math.RotationAxis.POSITIVE_X.rotationDegrees(config.rotation.x)); - matrices.multiply(net.minecraft.util.math.RotationAxis.POSITIVE_Y.rotationDegrees(config.rotation.y)); - matrices.multiply(net.minecraft.util.math.RotationAxis.POSITIVE_Z.rotationDegrees(config.rotation.z)); + matrices.mulPose(com.mojang.math.Axis.XP.rotationDegrees(config.rotation.x)); + matrices.mulPose(com.mojang.math.Axis.YP.rotationDegrees(config.rotation.y)); + matrices.mulPose(com.mojang.math.Axis.ZP.rotationDegrees(config.rotation.z)); } ObjRenderer.renderObj(this.obj, mtlMap, matrices, output, light, overlay); - matrices.pop(); + matrices.popPose(); } } diff --git a/src/main/java/org/saturnclient/impl/cosmetics/obj/ObjRenderer.java b/src/main/java/org/saturnclient/impl/cosmetics/obj/ObjRenderer.java index a4c7282..b358941 100644 --- a/src/main/java/org/saturnclient/impl/cosmetics/obj/ObjRenderer.java +++ b/src/main/java/org/saturnclient/impl/cosmetics/obj/ObjRenderer.java @@ -9,32 +9,35 @@ import org.saturnclient.impl.cosmetics.utils.ShaderUtils; import de.javagl.obj.*; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -//? if >=1.21.9 { -import net.minecraft.client.render.command.OrderedRenderCommandQueue; +import net.minecraft.client.Minecraft; +//? if >=1.21.11 { +import net.minecraft.client.renderer.rendertype.RenderType; //?} else -//import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.util.Identifier; +//import net.minecraft.client.renderer.RenderType; +import com.mojang.blaze3d.vertex.VertexConsumer; +//? if >=1.21.9 { +import net.minecraft.client.renderer.SubmitNodeCollector; +//?} else +//import net.minecraft.client.renderer.MultiBufferSource; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.resources.Identifier; public class ObjRenderer { public static Obj loadObj(Identifier objId) throws IOException { - try (InputStream is = MinecraftClient.getInstance().getResourceManager() - .getResource(objId).get().getInputStream()) { + try (InputStream is = Minecraft.getInstance().getResourceManager() + .getResource(objId).get().open()) { return ObjReader.read(is); } } public static void renderObj(Obj obj, Map mtlMap, - MatrixStack matrices, + PoseStack matrices, //? if >=1.21.9 { - OrderedRenderCommandQueue output, + SubmitNodeCollector output, //?} else - //VertexConsumerProvider output, + //MultiBufferSource output, int light, int overlay) { @@ -65,20 +68,20 @@ public class ObjRenderer { } } - RenderLayer layer = ShaderUtils.getRenderLayer(texture); + RenderType layer = ShaderUtils.getRenderLayer(texture); final float fr = r, fg = g, fb = b; final Obj finalObj = groupObj; //? if >=1.21.9 { - output.submitCustom(matrices, layer, + output.submitCustomGeometry(matrices, layer, (entry, consumer) -> drawGroup(finalObj, consumer, entry, light, overlay, fr, fg, fb)); //?} else - //drawGroup(finalObj, output.getBuffer(layer), matrices.peek(), light, overlay, fr, fg, fb); + //drawGroup(finalObj, output.getBuffer(layer), matrices.last(), light, overlay, fr, fg, fb); } } - private static void drawGroup(Obj obj, VertexConsumer consumer, MatrixStack.Entry entry, int light, int overlay, + private static void drawGroup(Obj obj, VertexConsumer consumer, PoseStack.Pose entry, int light, int overlay, float r, float g, float b) { int faces = obj.getNumFaces(); @@ -93,7 +96,7 @@ public class ObjRenderer { } private static void writeVertex(Obj obj, ObjFace face, int index, VertexConsumer consumer, - MatrixStack.Entry matrix, int light, int overlay, + PoseStack.Pose matrix, int light, int overlay, float r, float g, float b) { FloatTuple pos = obj.getVertex(face.getVertexIndex(index)); @@ -118,11 +121,11 @@ public class ObjRenderer { v = 1f - tc.getY(); // Flip V: OBJ bottom-left origin -> Minecraft top-left } - consumer.vertex(matrix, x, y, z) - .color(r, g, b, 1f) - .texture(u, v) - .overlay(overlay) - .light(light) - .normal(matrix, nx, ny, nz); + consumer.addVertex(matrix, x, y, z) + .setColor(r, g, b, 1f) + .setUv(u, v) + .setOverlay(overlay) + .setLight(light) + .setNormal(matrix, nx, ny, nz); } } \ No newline at end of file diff --git a/src/main/java/org/saturnclient/impl/cosmetics/utils/IdentifierUtils.java b/src/main/java/org/saturnclient/impl/cosmetics/utils/IdentifierUtils.java index d35ceae..a2fa058 100644 --- a/src/main/java/org/saturnclient/impl/cosmetics/utils/IdentifierUtils.java +++ b/src/main/java/org/saturnclient/impl/cosmetics/utils/IdentifierUtils.java @@ -3,9 +3,9 @@ package org.saturnclient.impl.cosmetics.utils; import org.saturnclient.common.ref.asset.IdentifierRef; import org.saturnclient.saturnclient.SaturnClient; -import net.minecraft.client.texture.NativeImage; -import net.minecraft.client.texture.NativeImageBackedTexture; -import net.minecraft.util.Identifier; +import com.mojang.blaze3d.platform.NativeImage; +import net.minecraft.client.renderer.texture.DynamicTexture; +import net.minecraft.resources.Identifier; import java.awt.image.BufferedImage; import java.awt.image.DataBufferInt; @@ -28,7 +28,7 @@ public class IdentifierUtils { int index = 0; for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { - nativeImage.setColorArgb(x, y, pixels[index++]); + nativeImage.setPixel(x, y, pixels[index++]); } } @@ -36,7 +36,7 @@ public class IdentifierUtils { for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { - nativeImage.setColorArgb(x, y, bufferedImage.getRGB(x, y)); + nativeImage.setPixel(x, y, bufferedImage.getRGB(x, y)); } } @@ -44,13 +44,13 @@ public class IdentifierUtils { SaturnClient.client.execute(() -> { //? if >=1.21.5 { - NativeImageBackedTexture texture = new NativeImageBackedTexture( + DynamicTexture texture = new DynamicTexture( () -> identifier.toString(), nativeImage); //?} else - //NativeImageBackedTexture texture = new NativeImageBackedTexture(nativeImage); + //DynamicTexture texture = new DynamicTexture(nativeImage); - SaturnClient.client.getTextureManager().registerTexture(identifier, texture); + SaturnClient.client.getTextureManager().register(identifier, texture); }); } catch (Exception e) { diff --git a/src/main/java/org/saturnclient/impl/cosmetics/utils/ShaderUtils.java b/src/main/java/org/saturnclient/impl/cosmetics/utils/ShaderUtils.java index 99fb441..4284c36 100644 --- a/src/main/java/org/saturnclient/impl/cosmetics/utils/ShaderUtils.java +++ b/src/main/java/org/saturnclient/impl/cosmetics/utils/ShaderUtils.java @@ -7,29 +7,32 @@ import org.saturnclient.cosmetics.utils.GifUtils; import com.mojang.blaze3d.pipeline.RenderPipeline; //? if >=1.21.5 -import net.minecraft.client.gl.RenderPipelines; -import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.renderer.RenderPipelines; +//? if >=1.21.11 { +import net.minecraft.client.renderer.rendertype.RenderType; +//?} else +//import net.minecraft.client.renderer.RenderType; //? if <1.21.5 { -/*import net.minecraft.client.render.RenderPhase; -import net.minecraft.client.render.VertexFormat.DrawMode; -import net.minecraft.client.render.VertexFormats; +/*import net.minecraft.client.renderer.RenderStateShard; +import com.mojang.blaze3d.vertex.VertexFormat.Mode; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; *///?} //? if >=1.21.11 { -import net.minecraft.client.render.RenderLayers; -import net.minecraft.client.render.RenderSetup; -import net.minecraft.client.render.block.entity.AbstractEndPortalBlockEntityRenderer; +import net.minecraft.client.renderer.rendertype.RenderTypes; +import net.minecraft.client.renderer.rendertype.RenderSetup; +import net.minecraft.client.renderer.blockentity.AbstractEndPortalRenderer; //?} else { -/*import net.minecraft.client.render.RenderPhase.Textures; -import net.minecraft.client.render.block.entity.EndPortalBlockEntityRenderer; +/*import net.minecraft.client.renderer.RenderStateShard.MultiTextureStateShard; +import net.minecraft.client.renderer.blockentity.TheEndPortalRenderer; *///?} -import net.minecraft.util.Identifier; +import net.minecraft.resources.Identifier; public class ShaderUtils { // Render pipelines exist from 1.21.5; before that the layer names a shader program directly. //? if >=1.21.5 { public static final RenderPipeline END_GATEWAY_PIPELINE = RenderPipelines.register( RenderPipeline.builder(new RenderPipeline.Snippet[] { - RenderPipelines.RENDERTYPE_END_PORTAL_SNIPPET }) + RenderPipelines.END_PORTAL_SNIPPET }) .withLocation("pipeline/end_gateway") .withShaderDefine("PORTAL_LAYERS", 16) .withCull(false) @@ -37,43 +40,43 @@ public class ShaderUtils { //?} //? if >=1.21.11 { - public static final RenderLayer END_GATEWAY = RenderLayer.of("end_gateway", + public static final RenderType END_GATEWAY = RenderType.create("end_gateway", RenderSetup.builder(END_GATEWAY_PIPELINE) - .texture("Sampler0", AbstractEndPortalBlockEntityRenderer.SKY_TEXTURE) - .texture("Sampler1", AbstractEndPortalBlockEntityRenderer.PORTAL_TEXTURE).build()); + .withTexture("Sampler0", AbstractEndPortalRenderer.END_SKY_LOCATION) + .withTexture("Sampler1", AbstractEndPortalRenderer.END_PORTAL_LOCATION).createRenderSetup()); //?} else if >=1.21.6 { - /*public static final RenderLayer END_GATEWAY = RenderLayer.of("end_gateway", 1536, false, false, + /*public static final RenderType END_GATEWAY = RenderType.create("end_gateway", 1536, false, false, END_GATEWAY_PIPELINE, - RenderLayer.MultiPhaseParameters.builder() - .texture(Textures.create().add(EndPortalBlockEntityRenderer.SKY_TEXTURE, false) - .add(EndPortalBlockEntityRenderer.PORTAL_TEXTURE, false).build()) - .build(false)); + RenderType.CompositeState.builder() + .setTextureState(MultiTextureStateShard.builder().add(TheEndPortalRenderer.END_SKY_LOCATION, false) + .add(TheEndPortalRenderer.END_PORTAL_LOCATION, false).build()) + .createCompositeState(false)); *///?} else if >=1.21.5 { - /*public static final RenderLayer END_GATEWAY = RenderLayer.of("end_gateway", 1536, false, false, + /*public static final RenderType END_GATEWAY = RenderType.create("end_gateway", 1536, false, false, END_GATEWAY_PIPELINE, - RenderLayer.MultiPhaseParameters.builder() - .texture(Textures.create().add(EndPortalBlockEntityRenderer.SKY_TEXTURE, false, false) - .add(EndPortalBlockEntityRenderer.PORTAL_TEXTURE, false, false).build()) - .build(false)); + RenderType.CompositeState.builder() + .setTextureState(MultiTextureStateShard.builder().add(TheEndPortalRenderer.END_SKY_LOCATION, false, false) + .add(TheEndPortalRenderer.END_PORTAL_LOCATION, false, false).build()) + .createCompositeState(false)); *///?} else { - /*public static final RenderLayer END_GATEWAY = RenderLayer.of( + /*public static final RenderType END_GATEWAY = RenderType.create( "end_gateway", - VertexFormats.POSITION, - DrawMode.QUADS, + DefaultVertexFormat.POSITION, + Mode.QUADS, 1536, false, false, - RenderLayer.MultiPhaseParameters.builder() - .program(RenderLayer.END_GATEWAY_PROGRAM) - .texture(Textures.create() - .add(EndPortalBlockEntityRenderer.SKY_TEXTURE, false, false) - .add(EndPortalBlockEntityRenderer.PORTAL_TEXTURE, false, false) + RenderType.CompositeState.builder() + .setShaderState(RenderType.RENDERTYPE_END_GATEWAY_SHADER) + .setTextureState(MultiTextureStateShard.builder() + .add(TheEndPortalRenderer.END_SKY_LOCATION, false, false) + .add(TheEndPortalRenderer.END_PORTAL_LOCATION, false, false) .build()) - .cull(RenderPhase.DISABLE_CULLING) - .build(false)); + .setCullState(RenderStateShard.NO_CULL) + .createCompositeState(false)); *///?} - public static RenderLayer getRenderLayer(IdentifierRef texture) { + public static RenderType getRenderLayer(IdentifierRef texture) { String path = texture.toString(); if (path.endsWith(".gif")) { return entityAlpha((Identifier) (Object) GifUtils.get(texture)); @@ -84,10 +87,10 @@ public class ShaderUtils { } } - private static RenderLayer entityAlpha(Identifier texture) { + private static RenderType entityAlpha(Identifier texture) { //? if >=1.21.11 { - return RenderLayers.entityAlpha(texture); + return RenderTypes.dragonExplosionAlpha(texture); //?} else - //return RenderLayer.getEntityAlpha(texture); + //return RenderType.dragonExplosionAlpha(texture); } } diff --git a/src/main/java/org/saturnclient/impl/features/entity/EntityFeatureImpl.java b/src/main/java/org/saturnclient/impl/features/entity/EntityFeatureImpl.java index 4784d62..8eb8d5b 100644 --- a/src/main/java/org/saturnclient/impl/features/entity/EntityFeatureImpl.java +++ b/src/main/java/org/saturnclient/impl/features/entity/EntityFeatureImpl.java @@ -2,11 +2,11 @@ package org.saturnclient.impl.features.entity; import org.saturnclient.common.feature.EntityFeature; -import net.minecraft.client.MinecraftClient; -import net.minecraft.entity.Entity; -import net.minecraft.util.hit.EntityHitResult; -import net.minecraft.util.hit.HitResult; -import net.minecraft.entity.LivingEntity; +import net.minecraft.client.Minecraft; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.EntityHitResult; +import net.minecraft.world.phys.HitResult; +import net.minecraft.world.entity.LivingEntity; /** * Fabric implementation of {@link EntityFeature}. @@ -18,15 +18,15 @@ import net.minecraft.entity.LivingEntity; */ public class EntityFeatureImpl implements EntityFeature { - private final MinecraftClient mc; + private final Minecraft mc; - public EntityFeatureImpl(MinecraftClient mc) { + public EntityFeatureImpl(Minecraft mc) { this.mc = mc; } @Override public boolean isTargetingLivingEntity() { - HitResult target = mc.crosshairTarget; + HitResult target = mc.hitResult; if (target == null || target.getType() != HitResult.Type.ENTITY) return false; Entity hit = ((EntityHitResult) target).getEntity(); diff --git a/src/main/java/org/saturnclient/impl/features/mixins/entity/CameraMixin.java b/src/main/java/org/saturnclient/impl/features/mixins/entity/CameraMixin.java index 10b0630..82d71ec 100644 --- a/src/main/java/org/saturnclient/impl/features/mixins/entity/CameraMixin.java +++ b/src/main/java/org/saturnclient/impl/features/mixins/entity/CameraMixin.java @@ -10,13 +10,13 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.client.render.Camera; -import net.minecraft.entity.Entity; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.client.Camera; +import net.minecraft.world.entity.Entity; //? if >=1.21.11 { -import net.minecraft.world.World; +import net.minecraft.world.level.Level; //?} else -//import net.minecraft.world.BlockView; +//import net.minecraft.world.level.BlockGetter; @Mixin(Camera.class) public abstract class CameraMixin { @@ -26,30 +26,30 @@ public abstract class CameraMixin { @Shadow protected abstract void setRotation(float yaw, float pitch); - @Inject(method = "update", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/Camera;setRotation(FF)V", ordinal = 1, shift = At.Shift.AFTER)) + @Inject(method = "setup", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Camera;setRotation(FF)V", ordinal = 1, shift = At.Shift.AFTER)) public void lockRotation( //? if >=1.21.11 { - World focusedBlock, + Level focusedBlock, //?} else - //BlockView focusedBlock, + //BlockGetter focusedBlock, Entity cameraEntity, boolean isThirdPerson, boolean isFrontFacing, float tickDelta, CallbackInfo ci) { - if (FreelookMod.isFreeLooking() && cameraEntity instanceof ClientPlayerEntity) { + if (FreelookMod.isFreeLooking() && cameraEntity instanceof LocalPlayer) { CameraOverriddenEntity cameraOverriddenEntity = (CameraOverriddenEntity) cameraEntity; if (firstTime && SaturnClient.client.player != null) { - cameraOverriddenEntity.freelook$setCameraPitch(SaturnClient.client.player.getPitch()); - cameraOverriddenEntity.freelook$setCameraYaw(SaturnClient.client.player.getYaw()); + cameraOverriddenEntity.freelook$setCameraPitch(SaturnClient.client.player.getXRot()); + cameraOverriddenEntity.freelook$setCameraYaw(SaturnClient.client.player.getYRot()); firstTime = false; } this.setRotation(cameraOverriddenEntity.freelook$getCameraYaw(), cameraOverriddenEntity.freelook$getCameraPitch()); } - if (!FreelookMod.isFreeLooking() && cameraEntity instanceof ClientPlayerEntity) { + if (!FreelookMod.isFreeLooking() && cameraEntity instanceof LocalPlayer) { firstTime = true; } } diff --git a/src/main/java/org/saturnclient/impl/features/mixins/entity/EntityMixin.java b/src/main/java/org/saturnclient/impl/features/mixins/entity/EntityMixin.java index a079e19..92228a9 100644 --- a/src/main/java/org/saturnclient/impl/features/mixins/entity/EntityMixin.java +++ b/src/main/java/org/saturnclient/impl/features/mixins/entity/EntityMixin.java @@ -8,9 +8,9 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import net.minecraft.client.network.ClientPlayerEntity; -import net.minecraft.entity.Entity; -import net.minecraft.util.math.MathHelper; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.world.entity.Entity; +import net.minecraft.util.Mth; @Mixin(Entity.class) public class EntityMixin implements CameraOverriddenEntity { @@ -20,15 +20,15 @@ public class EntityMixin implements CameraOverriddenEntity { @Unique private float cameraYaw; - @Inject(method = "changeLookDirection", at = @At("HEAD"), cancellable = true) + @Inject(method = "turn", at = @At("HEAD"), cancellable = true) public void changeCameraLookDirection(double xDelta, double yDelta, CallbackInfo ci) { // noinspection ConstantValue// IntelliJ is incorrect here, this code block is // reachable - if (FreelookMod.isFreeLooking() && (Object) this instanceof ClientPlayerEntity) { + if (FreelookMod.isFreeLooking() && (Object) this instanceof LocalPlayer) { double pitchDelta = (yDelta * 0.15); double yawDelta = (xDelta * 0.15); - this.cameraPitch = MathHelper.clamp(this.cameraPitch + (float) pitchDelta, -90.0f, 90.0f); + this.cameraPitch = Mth.clamp(this.cameraPitch + (float) pitchDelta, -90.0f, 90.0f); this.cameraYaw += (float) yawDelta; ci.cancel(); diff --git a/src/main/java/org/saturnclient/impl/features/mixins/render/BackgroundRendererMixin.java b/src/main/java/org/saturnclient/impl/features/mixins/render/BackgroundRendererMixin.java index 3d3602e..2eda504 100644 --- a/src/main/java/org/saturnclient/impl/features/mixins/render/BackgroundRendererMixin.java +++ b/src/main/java/org/saturnclient/impl/features/mixins/render/BackgroundRendererMixin.java @@ -1,22 +1,19 @@ package org.saturnclient.impl.features.mixins.render; //? if >=1.21.6 { -import net.minecraft.client.render.fog.FogRenderer; +import net.minecraft.client.renderer.fog.FogRenderer; //?} else -//import net.minecraft.client.render.BackgroundRenderer; +//import net.minecraft.client.renderer.FogRenderer; import org.saturnclient.mod.mods.NoFogMod; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyVariable; -//? if >=1.21.6 { @Mixin(FogRenderer.class) -//?} else -//@Mixin(BackgroundRenderer.class) public class BackgroundRendererMixin { // fog - @ModifyVariable(method = "applyFog", at = @At("HEAD"), ordinal = 0, argsOnly = true) + @ModifyVariable(method = "setupFog", at = @At("HEAD"), ordinal = 0, argsOnly = true) private static float modifyFogStart(float viewDistance) { if (NoFogMod.isActive()) { return viewDistance * 2.0f; diff --git a/src/main/java/org/saturnclient/impl/features/mixins/render/GameRendererMixin.java b/src/main/java/org/saturnclient/impl/features/mixins/render/GameRendererMixin.java index be65e23..79c1eaf 100644 --- a/src/main/java/org/saturnclient/impl/features/mixins/render/GameRendererMixin.java +++ b/src/main/java/org/saturnclient/impl/features/mixins/render/GameRendererMixin.java @@ -1,10 +1,10 @@ package org.saturnclient.impl.features.mixins.render; //? if >=1.21.6 -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; //? if >=1.21.6 -import net.minecraft.client.option.GameOptions; -import net.minecraft.client.render.GameRenderer; +import net.minecraft.client.Options; +import net.minecraft.client.renderer.GameRenderer; //? if >=1.21.6 import org.saturnclient.impl.ui.SaturnScreenFabric; @@ -51,13 +51,13 @@ public class GameRendererMixin { // From 1.21.6 the menu blur's strength is the vanilla setting, read here every frame. While a // Saturn screen is open, it's Saturn's background blur instead, faded in with the screen. @Redirect(method = "render", at = @At(value = "INVOKE", - target = "Lnet/minecraft/client/option/GameOptions;getMenuBackgroundBlurrinessValue()I")) - private int useSaturnBlur(GameOptions options) { - if (MinecraftClient.getInstance().currentScreen instanceof SaturnScreenFabric saturnScreen) { + target = "Lnet/minecraft/client/Options;getMenuBackgroundBlurriness()I")) + private int useSaturnBlur(Options options) { + if (Minecraft.getInstance().screen instanceof SaturnScreenFabric saturnScreen) { return saturnScreen.screen.getBackgroundBlur(); } - return options.getMenuBackgroundBlurrinessValue(); + return options.getMenuBackgroundBlurriness(); } //?} } diff --git a/src/main/java/org/saturnclient/impl/features/mixins/render/LightmapTextureManagerMixin.java b/src/main/java/org/saturnclient/impl/features/mixins/render/LightmapTextureManagerMixin.java index 66a3119..d07ea86 100644 --- a/src/main/java/org/saturnclient/impl/features/mixins/render/LightmapTextureManagerMixin.java +++ b/src/main/java/org/saturnclient/impl/features/mixins/render/LightmapTextureManagerMixin.java @@ -3,7 +3,7 @@ package org.saturnclient.impl.features.mixins.render; // Code approach adapted from Gamma Utils: https://github.com/Sjouwer/gamma-utils import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import net.minecraft.client.render.LightmapTextureManager; +import net.minecraft.client.renderer.LightTexture; import org.saturnclient.mod.mods.FullbrightMod; import org.spongepowered.asm.mixin.Mixin; @@ -18,14 +18,14 @@ import org.spongepowered.asm.mixin.injection.At; * it is now {@link FullbrightMod}. The injection target and * strategy are unchanged. */ -@Mixin(LightmapTextureManager.class) +@Mixin(LightTexture.class) public class LightmapTextureManagerMixin { /** * If fullbright is active, substitute the feature's brightness * value for whatever vanilla calculated. */ - @ModifyExpressionValue(method = "update", at = @At(value = "INVOKE", target = "Ljava/lang/Math;max(FF)F", ordinal = 0)) + @ModifyExpressionValue(method = "updateLightTexture", at = @At(value = "INVOKE", target = "Ljava/lang/Math;max(FF)F", ordinal = 0)) private float modifyGamma(float original) { if (FullbrightMod.shouldOverrideBrightness()) { return FullbrightMod.getBrightnessValue(); diff --git a/src/main/java/org/saturnclient/impl/features/mixins/render/LivingEntityRenderStateMixin.java b/src/main/java/org/saturnclient/impl/features/mixins/render/LivingEntityRenderStateMixin.java index fa3c669..59ad24c 100644 --- a/src/main/java/org/saturnclient/impl/features/mixins/render/LivingEntityRenderStateMixin.java +++ b/src/main/java/org/saturnclient/impl/features/mixins/render/LivingEntityRenderStateMixin.java @@ -1,6 +1,6 @@ package org.saturnclient.impl.features.mixins.render; -import net.minecraft.client.render.entity.state.LivingEntityRenderState; +import net.minecraft.client.renderer.entity.state.LivingEntityRenderState; import org.saturnclient.common.feature.EntityFeature; import org.saturnclient.impl.features.entity.HealthRenderState; diff --git a/src/main/java/org/saturnclient/impl/features/mixins/render/LivingEntityRendererMixin.java b/src/main/java/org/saturnclient/impl/features/mixins/render/LivingEntityRendererMixin.java index 0beda74..71c1439 100644 --- a/src/main/java/org/saturnclient/impl/features/mixins/render/LivingEntityRendererMixin.java +++ b/src/main/java/org/saturnclient/impl/features/mixins/render/LivingEntityRendererMixin.java @@ -1,12 +1,12 @@ package org.saturnclient.impl.features.mixins.render; -import net.minecraft.client.render.entity.LivingEntityRenderer; -import net.minecraft.client.render.entity.state.LivingEntityRenderState; -import net.minecraft.entity.LivingEntity; -import net.minecraft.entity.mob.HostileEntity; -import net.minecraft.entity.passive.PassiveEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.text.Text; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.state.LivingEntityRenderState; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.AgeableMob; +import net.minecraft.world.entity.player.Player; +import net.minecraft.network.chat.Component; import org.saturnclient.common.feature.EntityFeature; import org.saturnclient.impl.features.entity.EntityFeatureImpl; @@ -29,7 +29,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(LivingEntityRenderer.class) public abstract class LivingEntityRendererMixin { - @Inject(method = "updateRenderState", at = @At("TAIL")) + @Inject(method = "extractRenderState", at = @At("TAIL")) private void saturn$captureHealth(T entity, S state, float tickDelta, CallbackInfo ci) { if (!(state instanceof HealthRenderState hrs)) return; @@ -38,11 +38,11 @@ public abstract class LivingEntityRendererMixin=1.21.5 { - return wrap(hasPlayer() ? player().getEquippedStack(EquipmentSlot.HEAD) : ItemStack.EMPTY); + return wrap(hasPlayer() ? player().getItemBySlot(EquipmentSlot.HEAD) : ItemStack.EMPTY); //?} else //return wrap(hasPlayer() ? player().getInventory().armor.get(3) : ItemStack.EMPTY); } @@ -178,7 +178,7 @@ public class PlayerFeatureImpl implements PlayerFeature { @Override public ItemStackRef getChestplate() { //? if >=1.21.5 { - return wrap(hasPlayer() ? player().getEquippedStack(EquipmentSlot.CHEST) : ItemStack.EMPTY); + return wrap(hasPlayer() ? player().getItemBySlot(EquipmentSlot.CHEST) : ItemStack.EMPTY); //?} else //return wrap(hasPlayer() ? player().getInventory().armor.get(2) : ItemStack.EMPTY); } @@ -186,7 +186,7 @@ public class PlayerFeatureImpl implements PlayerFeature { @Override public ItemStackRef getLeggings() { //? if >=1.21.5 { - return wrap(hasPlayer() ? player().getEquippedStack(EquipmentSlot.LEGS) : ItemStack.EMPTY); + return wrap(hasPlayer() ? player().getItemBySlot(EquipmentSlot.LEGS) : ItemStack.EMPTY); //?} else //return wrap(hasPlayer() ? player().getInventory().armor.get(1) : ItemStack.EMPTY); } @@ -194,7 +194,7 @@ public class PlayerFeatureImpl implements PlayerFeature { @Override public ItemStackRef getBoots() { //? if >=1.21.5 { - return wrap(hasPlayer() ? player().getEquippedStack(EquipmentSlot.FEET) : ItemStack.EMPTY); + return wrap(hasPlayer() ? player().getItemBySlot(EquipmentSlot.FEET) : ItemStack.EMPTY); //?} else //return wrap(hasPlayer() ? player().getInventory().armor.get(0) : ItemStack.EMPTY); } @@ -237,9 +237,9 @@ public class PlayerFeatureImpl implements PlayerFeature { if (!hasPlayer()) return Collections.emptyList(); - var effects = player().getActiveStatusEffects().values(); + var effects = player().getActiveEffectsMap().values(); List result = new ArrayList<>(effects.size()); - for (StatusEffectInstance instance : effects) { + for (MobEffectInstance instance : effects) { result.add((EffectRef) instance); } return result; @@ -248,12 +248,12 @@ public class PlayerFeatureImpl implements PlayerFeature { @Override public List getDummyEffects() { return List.of( - (EffectRef) new StatusEffectInstance( - Registries.STATUS_EFFECT.getEntry(Identifier.ofVanilla("speed")).get(), 12000, 2), - (EffectRef) new StatusEffectInstance( - Registries.STATUS_EFFECT.getEntry(Identifier.ofVanilla("strength")).get(), 12000, 2), - (EffectRef) new StatusEffectInstance( - Registries.STATUS_EFFECT.getEntry(Identifier.ofVanilla("fire_resistance")).get(), 12000, 2)); + (EffectRef) new MobEffectInstance( + BuiltInRegistries.MOB_EFFECT.get(Identifier.withDefaultNamespace("speed")).get(), 12000, 2), + (EffectRef) new MobEffectInstance( + BuiltInRegistries.MOB_EFFECT.get(Identifier.withDefaultNamespace("strength")).get(), 12000, 2), + (EffectRef) new MobEffectInstance( + BuiltInRegistries.MOB_EFFECT.get(Identifier.withDefaultNamespace("fire_resistance")).get(), 12000, 2)); } // --------------------------------------------------------------- diff --git a/src/main/java/org/saturnclient/impl/features/render/RenderFeatureImpl.java b/src/main/java/org/saturnclient/impl/features/render/RenderFeatureImpl.java index adb958c..feaaa73 100644 --- a/src/main/java/org/saturnclient/impl/features/render/RenderFeatureImpl.java +++ b/src/main/java/org/saturnclient/impl/features/render/RenderFeatureImpl.java @@ -2,8 +2,8 @@ package org.saturnclient.impl.features.render; import org.saturnclient.common.feature.RenderFeature; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.option.Perspective; +import net.minecraft.client.Minecraft; +import net.minecraft.client.CameraType; /** * Fabric implementation of {@link RenderFeature}. @@ -14,9 +14,9 @@ import net.minecraft.client.option.Perspective; */ public class RenderFeatureImpl implements RenderFeature { - private final MinecraftClient mc; + private final Minecraft mc; - public RenderFeatureImpl(MinecraftClient mc) { + public RenderFeatureImpl(Minecraft mc) { this.mc = mc; } @@ -26,12 +26,12 @@ public class RenderFeatureImpl implements RenderFeature { @Override public int getScaledWindowWidth() { - return mc.getWindow().getScaledWidth(); + return mc.getWindow().getGuiScaledWidth(); } @Override public int getScaledWindowHeight() { - return mc.getWindow().getScaledHeight(); + return mc.getWindow().getGuiScaledHeight(); } // --------------------------------------------------------------- @@ -40,7 +40,7 @@ public class RenderFeatureImpl implements RenderFeature { @Override public int getFps() { - return mc.getCurrentFps(); + return mc.getFps(); } // --------------------------------------------------------------- @@ -49,16 +49,16 @@ public class RenderFeatureImpl implements RenderFeature { @Override public boolean isFirstPerson() { - return mc.options.getPerspective() == Perspective.FIRST_PERSON; + return mc.options.getCameraType() == CameraType.FIRST_PERSON; } @Override public void setFirstPerson() { - mc.options.setPerspective(Perspective.FIRST_PERSON); + mc.options.setCameraType(CameraType.FIRST_PERSON); } @Override public void setThirdPersonBack() { - mc.options.setPerspective(Perspective.THIRD_PERSON_BACK); + mc.options.setCameraType(CameraType.THIRD_PERSON_BACK); } } diff --git a/src/main/java/org/saturnclient/impl/features/world/WorldFeatureImpl.java b/src/main/java/org/saturnclient/impl/features/world/WorldFeatureImpl.java index 691917d..d40203e 100644 --- a/src/main/java/org/saturnclient/impl/features/world/WorldFeatureImpl.java +++ b/src/main/java/org/saturnclient/impl/features/world/WorldFeatureImpl.java @@ -2,7 +2,7 @@ package org.saturnclient.impl.features.world; import org.saturnclient.common.feature.WorldFeature; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; /** * Fabric implementation of {@link WorldFeature}. @@ -12,15 +12,15 @@ import net.minecraft.client.MinecraftClient; */ public class WorldFeatureImpl implements WorldFeature { - private final MinecraftClient mc; + private final Minecraft mc; - public WorldFeatureImpl(MinecraftClient mc) { + public WorldFeatureImpl(Minecraft mc) { this.mc = mc; } @Override public boolean hasWorld() { - return mc.world != null; + return mc.level != null; } /** @@ -32,6 +32,6 @@ public class WorldFeatureImpl implements WorldFeature { @Override public long getWorldAge() { // World.getTime() was a shortcut for this, and 1.21.11 removed it. - return hasWorld() ? mc.world.getLevelProperties().getTime() : 0L; + return hasWorld() ? mc.level.getLevelData().getGameTime() : 0L; } } diff --git a/src/main/java/org/saturnclient/impl/mixins/IdentifierMixin.java b/src/main/java/org/saturnclient/impl/mixins/IdentifierMixin.java index edfcdb9..6fda1a5 100644 --- a/src/main/java/org/saturnclient/impl/mixins/IdentifierMixin.java +++ b/src/main/java/org/saturnclient/impl/mixins/IdentifierMixin.java @@ -4,7 +4,7 @@ import org.saturnclient.common.ref.asset.IdentifierRef; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import net.minecraft.util.Identifier; +import net.minecraft.resources.Identifier; @Mixin(Identifier.class) public abstract class IdentifierMixin implements IdentifierRef { diff --git a/src/main/java/org/saturnclient/impl/mixins/ItemStackMixin.java b/src/main/java/org/saturnclient/impl/mixins/ItemStackMixin.java index 9a69341..0ed61b4 100644 --- a/src/main/java/org/saturnclient/impl/mixins/ItemStackMixin.java +++ b/src/main/java/org/saturnclient/impl/mixins/ItemStackMixin.java @@ -4,7 +4,7 @@ import org.saturnclient.common.ref.game.ItemStackRef; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import net.minecraft.item.ItemStack; +import net.minecraft.world.item.ItemStack; @Mixin(ItemStack.class) public abstract class ItemStackMixin implements ItemStackRef { @@ -15,5 +15,5 @@ public abstract class ItemStackMixin implements ItemStackRef { public abstract int getMaxDamage(); @Shadow - public abstract int getDamage(); + public abstract int getDamageValue(); } diff --git a/src/main/java/org/saturnclient/impl/mixins/MatrixStackMixin.java b/src/main/java/org/saturnclient/impl/mixins/MatrixStackMixin.java index ae9427a..a6d8671 100644 --- a/src/main/java/org/saturnclient/impl/mixins/MatrixStackMixin.java +++ b/src/main/java/org/saturnclient/impl/mixins/MatrixStackMixin.java @@ -1,6 +1,6 @@ package org.saturnclient.impl.mixins; -import net.minecraft.client.util.math.MatrixStack; +import com.mojang.blaze3d.vertex.PoseStack; import org.spongepowered.asm.mixin.Mixin; //? if <1.21.6 { /*import org.saturnclient.common.ref.render.MatrixStackRef; @@ -9,7 +9,7 @@ import org.joml.Quaternionfc; //? if <1.21.5 //import org.joml.Quaternionf; import org.spongepowered.asm.mixin.Shadow; -import net.minecraft.util.math.RotationAxis; +import com.mojang.math.Axis; *///?} /** @@ -17,14 +17,14 @@ import net.minecraft.util.math.RotationAxis; * Matrix3x2fStack (Matrix3x2fStackRef) instead, so this mixin is empty but stays registered, keeping * impl.mixins.json the same for every version. */ -@Mixin(MatrixStack.class) +@Mixin(PoseStack.class) //? if <1.21.6 { /*public abstract class MatrixStackMixin implements MatrixStackRef { @Shadow - public abstract void push(); + public abstract void pushPose(); @Shadow - public abstract void pop(); + public abstract void popPose(); @Shadow public abstract void translate(float x, float y, float z); @@ -34,15 +34,15 @@ import net.minecraft.util.math.RotationAxis; @Shadow //? if >=1.21.5 - public abstract void multiply(Quaternionfc quaternion); + public abstract void mulPose(Quaternionfc quaternion); //? if <1.21.5 - //public abstract void multiply(Quaternionf quaternion); + //public abstract void mulPose(Quaternionf quaternion); @Shadow //? if >=1.21.5 - public abstract void multiply(Quaternionfc quaternion, float originX, float originY, float originZ); + public abstract void rotateAround(Quaternionfc quaternion, float originX, float originY, float originZ); //? if <1.21.5 - //public abstract void multiply(Quaternionf quaternion, float originX, float originY, float originZ); + //public abstract void rotateAround(Quaternionf quaternion, float originX, float originY, float originZ); @Override public void translate(float x, float y) { @@ -56,12 +56,12 @@ import net.minecraft.util.math.RotationAxis; @Override public void rotate(float angle, float originX, float originY, float originZ) { - multiply(RotationAxis.NEGATIVE_Z.rotationDegrees(angle), originX, originY, originZ); + rotateAround(Axis.ZN.rotationDegrees(angle), originX, originY, originZ); } @Override public void rotate(float angle) { - multiply(RotationAxis.NEGATIVE_Z.rotationDegrees(angle)); + mulPose(Axis.ZN.rotationDegrees(angle)); } } *///?} else diff --git a/src/main/java/org/saturnclient/impl/mixins/MinecraftClientMixin.java b/src/main/java/org/saturnclient/impl/mixins/MinecraftClientMixin.java index 1aeb6f8..8d4754f 100644 --- a/src/main/java/org/saturnclient/impl/mixins/MinecraftClientMixin.java +++ b/src/main/java/org/saturnclient/impl/mixins/MinecraftClientMixin.java @@ -15,50 +15,54 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.multiplayer.MultiplayerScreen; -import net.minecraft.client.gui.screen.option.OptionsScreen; -import net.minecraft.client.gui.screen.world.SelectWorldScreen; -import net.minecraft.client.option.GameOptions; -import net.minecraft.client.session.Session; -import net.minecraft.client.util.Window; -import net.minecraft.resource.ReloadableResourceManagerImpl; -import net.minecraft.util.Identifier; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.multiplayer.JoinMultiplayerScreen; +import net.minecraft.client.gui.screens.options.OptionsScreen; +import net.minecraft.client.gui.screens.worldselection.SelectWorldScreen; +import net.minecraft.client.Options; +import net.minecraft.client.User; +import com.mojang.blaze3d.platform.Window; +import net.minecraft.server.packs.resources.ReloadableResourceManager; +import net.minecraft.resources.Identifier; -@Mixin(MinecraftClient.class) +@Mixin(Minecraft.class) public abstract class MinecraftClientMixin implements MinecraftClientRef { @Shadow - public File runDirectory; + public File gameDirectory; @Shadow private Window window; @Shadow - private ReloadableResourceManagerImpl resourceManager; + private ReloadableResourceManager resourceManager; @Shadow - public GameOptions options; + public Options options; @Shadow - private Session session; + private User user; @Shadow public abstract void setScreen(@Nullable Screen screen); @Shadow + public abstract void stop(); + @Override - public abstract void scheduleStop(); + public void scheduleStop() { + stop(); + } @Override public File getRunDirectory() { - return runDirectory; + return gameDirectory; } @Override public InputStream getResource(IdentifierRef identifier) { try { - return resourceManager.getResource((Identifier) (Object) identifier).get().getInputStream(); + return resourceManager.getResource((Identifier) (Object) identifier).get().open(); } catch (Exception e) { return null; } @@ -84,7 +88,7 @@ public abstract class MinecraftClientMixin implements MinecraftClientRef { break; case Multiplayer: - this.setScreen(new MultiplayerScreen(exitTarget)); + this.setScreen(new JoinMultiplayerScreen(exitTarget)); break; case Options: @@ -95,27 +99,27 @@ public abstract class MinecraftClientMixin implements MinecraftClientRef { @Override public String getAccessToken() { - if (session == null) { + if (user == null) { return null; } - return this.session.getAccessToken(); + return this.user.getAccessToken(); } @Override public UUID getUuid() { - if (session == null) { + if (user == null) { return null; } - return this.session.getUuidOrNull(); + return this.user.getProfileId(); } @Override public String getUsername() { - if (session == null) { + if (user == null) { return null; } - return this.session.getUsername(); + return this.user.getName(); } @Override @@ -131,13 +135,13 @@ public abstract class MinecraftClientMixin implements MinecraftClientRef { @Override @SuppressWarnings("resource") public String getPlayerListEntry(UUID uuid) { - var client = (MinecraftClient) (Object) this; - var handler = client.getNetworkHandler(); + var client = (Minecraft) (Object) this; + var handler = client.getConnection(); if (handler == null) return null; - var entry = handler.getPlayerListEntry(uuid); + var entry = handler.getPlayerInfo(uuid); if (entry == null) return null; @@ -150,13 +154,13 @@ public abstract class MinecraftClientMixin implements MinecraftClientRef { @Override @SuppressWarnings("resource") public UUID getPlayerListEntryUUID(String name) { - var client = (MinecraftClient) (Object) this; - var handler = client.getNetworkHandler(); + var client = (Minecraft) (Object) this; + var handler = client.getConnection(); if (handler == null) return null; - var entry = handler.getPlayerListEntry(name); + var entry = handler.getPlayerInfo(name); if (entry == null) return null; diff --git a/src/main/java/org/saturnclient/impl/mixins/SpriteMixin.java b/src/main/java/org/saturnclient/impl/mixins/SpriteMixin.java index 6cf07bc..b235d5a 100644 --- a/src/main/java/org/saturnclient/impl/mixins/SpriteMixin.java +++ b/src/main/java/org/saturnclient/impl/mixins/SpriteMixin.java @@ -1,9 +1,9 @@ package org.saturnclient.impl.mixins; -import net.minecraft.client.texture.Sprite; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; import org.saturnclient.common.ref.asset.SpriteRef; import org.spongepowered.asm.mixin.Mixin; -@Mixin(Sprite.class) +@Mixin(TextureAtlasSprite.class) public abstract class SpriteMixin implements SpriteRef { } \ No newline at end of file diff --git a/src/main/java/org/saturnclient/impl/mixins/StatusEffectMixin.java b/src/main/java/org/saturnclient/impl/mixins/StatusEffectMixin.java index 556d33a..8dab800 100644 --- a/src/main/java/org/saturnclient/impl/mixins/StatusEffectMixin.java +++ b/src/main/java/org/saturnclient/impl/mixins/StatusEffectMixin.java @@ -8,26 +8,26 @@ import org.saturnclient.common.ref.game.EffectRef; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import net.minecraft.client.gui.hud.InGameHud; -import net.minecraft.entity.effect.StatusEffect; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.registry.entry.RegistryEntry; -import net.minecraft.util.Identifier; +import net.minecraft.client.gui.Gui; +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.core.Holder; +import net.minecraft.resources.Identifier; -@Mixin(StatusEffectInstance.class) +@Mixin(MobEffectInstance.class) public abstract class StatusEffectMixin implements EffectRef { @Shadow - public abstract boolean shouldShowIcon(); + public abstract boolean showIcon(); @Shadow - public abstract boolean isInfinite(); + public abstract boolean isInfiniteDuration(); @Shadow public abstract int getDuration(); @Shadow - public abstract RegistryEntry getEffectType(); + public abstract Holder getEffect(); @Override public SpriteRef getIcon() { @@ -35,16 +35,16 @@ public abstract class StatusEffectMixin implements EffectRef { //? if >=1.21.9 { return null; //?} else if >=1.21.6 { - //return (SpriteRef) SaturnClient.client.getGuiAtlasManager().getSprite((InGameHud.getEffectTexture(getEffectType()))); + //return (SpriteRef) SaturnClient.client.getGuiSprites().getSprite((Gui.getMobEffectSprite(getEffect()))); //?} else - //return (SpriteRef) SaturnClient.client.getStatusEffectSpriteManager().getSprite(getEffectType()); + //return (SpriteRef) SaturnClient.client.getMobEffectTextures().get(getEffect()); } // Before 1.21.6 there's no InGameHud.getEffectTexture; getIcon's sprite is used there instead. //? if >=1.21.6 { @Override public IdentifierRef getIconId() { - Identifier id = InGameHud.getEffectTexture(getEffectType()); + Identifier id = Gui.getMobEffectSprite(getEffect()); return IdentifierRef.of(id.getNamespace(), "textures/" + id.getPath() + ".png"); } diff --git a/src/main/java/org/saturnclient/impl/mixins/TextMixin.java b/src/main/java/org/saturnclient/impl/mixins/TextMixin.java index e5e31f6..b064db3 100644 --- a/src/main/java/org/saturnclient/impl/mixins/TextMixin.java +++ b/src/main/java/org/saturnclient/impl/mixins/TextMixin.java @@ -5,25 +5,25 @@ import org.saturnclient.common.ref.render.TextRef; import org.saturnclient.saturnclient.SaturnClient; import org.spongepowered.asm.mixin.Mixin; -import net.minecraft.text.Style; -import net.minecraft.text.Text; +import net.minecraft.network.chat.Style; +import net.minecraft.network.chat.Component; //? if >=1.21.9 -import net.minecraft.text.StyleSpriteSource.Font; -import net.minecraft.util.Identifier; +import net.minecraft.network.chat.FontDescription.Resource; +import net.minecraft.resources.Identifier; -@Mixin(Text.class) +@Mixin(Component.class) public interface TextMixin extends TextRef { @Override public default TextRef withFont(IdentifierRef font) { //? if >=1.21.9 { - return (TextRef) (Text) (((Text) this).copy().setStyle(Style.EMPTY.withFont(new Font((Identifier) (Object) font)))); + return (TextRef) (Component) (((Component) this).copy().setStyle(Style.EMPTY.withFont(new Resource((Identifier) (Object) font)))); //?} else - //return (TextRef) (((Text) this).copy().setStyle(Style.EMPTY.withFont((Identifier) (Object) font))); + //return (TextRef) (((Component) this).copy().setStyle(Style.EMPTY.withFont((Identifier) (Object) font))); } @Override public default int getWidth() { - return SaturnClient.client.textRenderer.getWidth((Text) this); + return SaturnClient.client.font.width((Component) this); } } diff --git a/src/main/java/org/saturnclient/impl/mixins/WindowMixin.java b/src/main/java/org/saturnclient/impl/mixins/WindowMixin.java index 5629068..ab54ba2 100644 --- a/src/main/java/org/saturnclient/impl/mixins/WindowMixin.java +++ b/src/main/java/org/saturnclient/impl/mixins/WindowMixin.java @@ -1,22 +1,21 @@ package org.saturnclient.impl.mixins; +import com.mojang.blaze3d.platform.Window; import org.saturnclient.common.ref.render.WindowRef; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import net.minecraft.client.util.Window; - @Mixin(Window.class) public abstract class WindowMixin implements WindowRef { + @Shadow + public abstract int getScreenWidth(); + + @Shadow + public abstract int getScreenHeight(); + @Shadow public abstract int getWidth(); @Shadow public abstract int getHeight(); - - @Shadow - public abstract int getFramebufferWidth(); - - @Shadow - public abstract int getFramebufferHeight(); } diff --git a/src/main/java/org/saturnclient/impl/provider/FeatureProviderFabric.java b/src/main/java/org/saturnclient/impl/provider/FeatureProviderFabric.java index c424273..4f1ed10 100644 --- a/src/main/java/org/saturnclient/impl/provider/FeatureProviderFabric.java +++ b/src/main/java/org/saturnclient/impl/provider/FeatureProviderFabric.java @@ -1,6 +1,6 @@ package org.saturnclient.impl.provider; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import org.saturnclient.common.feature.*; import org.saturnclient.common.provider.FeatureProvider; @@ -33,7 +33,7 @@ public class FeatureProviderFabric implements FeatureProvider { private final RenderFeature render; private final NetworkFeature network; - public FeatureProviderFabric(MinecraftClient mc) { + public FeatureProviderFabric(Minecraft mc) { this.player = new PlayerFeatureImpl(mc); this.world = new WorldFeatureImpl(mc); this.entity = new EntityFeatureImpl(mc); diff --git a/src/main/java/org/saturnclient/impl/provider/GLFWProviderImpl.java b/src/main/java/org/saturnclient/impl/provider/GLFWProviderImpl.java index f8a896f..85eb7ba 100644 --- a/src/main/java/org/saturnclient/impl/provider/GLFWProviderImpl.java +++ b/src/main/java/org/saturnclient/impl/provider/GLFWProviderImpl.java @@ -7,8 +7,12 @@ import org.saturnclient.saturnclient.SaturnClient; public class GLFWProviderImpl implements GLFWProvider { @Override public boolean isKeyPressed(int key) { - return GLFW.glfwGetKey(SaturnClient.client.getWindow().getHandle(), key) == GLFW.GLFW_PRESS - && SaturnClient.client.currentScreen == null; + //? if >=1.21.9 { + long window = SaturnClient.client.getWindow().handle(); + //?} else + //long window = SaturnClient.client.getWindow().getWindow(); + return GLFW.glfwGetKey(window, key) == GLFW.GLFW_PRESS + && SaturnClient.client.screen == null; } @Override diff --git a/src/main/java/org/saturnclient/impl/provider/RefConstructorImpl.java b/src/main/java/org/saturnclient/impl/provider/RefConstructorImpl.java index 80b7c9a..dc87f4b 100644 --- a/src/main/java/org/saturnclient/impl/provider/RefConstructorImpl.java +++ b/src/main/java/org/saturnclient/impl/provider/RefConstructorImpl.java @@ -4,22 +4,22 @@ import org.saturnclient.common.provider.RefConstructorProvider; import org.saturnclient.common.ref.asset.IdentifierRef; import org.saturnclient.common.ref.render.TextRef; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.Identifier; public class RefConstructorImpl implements RefConstructorProvider { @Override public IdentifierRef identifier(String fullPath) { - return (IdentifierRef) (Object) Identifier.of(fullPath); + return (IdentifierRef) (Object) Identifier.parse(fullPath); } @Override public IdentifierRef identifier(String namespace, String path) { - return (IdentifierRef) (Object) Identifier.of(namespace, path); + return (IdentifierRef) (Object) Identifier.fromNamespaceAndPath(namespace, path); } @Override public TextRef text(String text) { - return (TextRef) (Text) Text.literal(text); + return (TextRef) (Component) Component.literal(text); } } diff --git a/src/main/java/org/saturnclient/impl/provider/SaturnProviderImpl.java b/src/main/java/org/saturnclient/impl/provider/SaturnProviderImpl.java index fb9b976..e76c79d 100644 --- a/src/main/java/org/saturnclient/impl/provider/SaturnProviderImpl.java +++ b/src/main/java/org/saturnclient/impl/provider/SaturnProviderImpl.java @@ -5,14 +5,14 @@ import java.util.UUID; import java.util.function.Supplier; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.toast.SystemToast; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.toasts.SystemToast; //? if >=1.21.9 { -import net.minecraft.entity.player.SkinTextures; +import net.minecraft.world.entity.player.PlayerSkin; //?} else -//import net.minecraft.client.util.SkinTextures; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; +//import net.minecraft.client.resources.PlayerSkin; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.Identifier; import org.saturnclient.common.provider.SaturnProvider; import org.saturnclient.common.ref.asset.IdentifierRef; @@ -57,18 +57,18 @@ public class SaturnProviderImpl implements SaturnProvider { } /** Shown longer than the vanilla default, since these ask the player to act. */ - private static final SystemToast.Type WARNING_TOAST = new SystemToast.Type(15_000L); + private static final SystemToast.SystemToastId WARNING_TOAST = new SystemToast.SystemToastId(15_000L); @Override public IdentifierRef getPlayerSkin() { if (playerSkin == null) { - MinecraftClient client = MinecraftClient.getInstance(); + Minecraft client = Minecraft.getInstance(); // 1.21.9 moved SkinTextures and renamed the skin provider's lookup. //? if >=1.21.9 { - Supplier textures = client.getSkinProvider().supplySkinTextures(client.getGameProfile(), false); + Supplier textures = client.getSkinManager().createLookup(client.getGameProfile(), false); playerSkin = () -> textures.get().body().texturePath(); //?} else { - /*Supplier textures = client.getSkinProvider().getSkinTexturesSupplier(client.getGameProfile()); + /*Supplier textures = client.getSkinManager().lookupInsecure(client.getGameProfile()); playerSkin = () -> textures.get().texture(); *///?} } @@ -85,9 +85,9 @@ public class SaturnProviderImpl implements SaturnProvider { @Override public void showWarning(String title, String message) { - MinecraftClient client = MinecraftClient.getInstance(); - client.execute(() -> client.getToastManager().add( - SystemToast.create(client, WARNING_TOAST, Text.literal(title), Text.literal(message)))); + Minecraft client = Minecraft.getInstance(); + client.execute(() -> client.getToastManager().addToast( + SystemToast.multiline(client, WARNING_TOAST, Component.literal(title), Component.literal(message)))); } @Override diff --git a/src/main/java/org/saturnclient/impl/ui/EntityDrawerImpl.java b/src/main/java/org/saturnclient/impl/ui/EntityDrawerImpl.java index 042c31f..2dd5352 100644 --- a/src/main/java/org/saturnclient/impl/ui/EntityDrawerImpl.java +++ b/src/main/java/org/saturnclient/impl/ui/EntityDrawerImpl.java @@ -11,12 +11,12 @@ import org.saturnclient.ui.RenderScope; import org.saturnclient.ui.components.SkinPreview.EntityDrawer; //? if >=1.21.9 { -import net.minecraft.client.render.entity.EntityRenderManager; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; //?} else -//import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.client.render.entity.EntityRenderer; -import net.minecraft.client.render.entity.state.EntityRenderState; -import net.minecraft.entity.LivingEntity; +//import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.client.renderer.entity.EntityRenderer; +import net.minecraft.client.renderer.entity.state.EntityRenderState; +import net.minecraft.world.entity.LivingEntity; public class EntityDrawerImpl implements EntityDrawer { @Override @@ -38,25 +38,25 @@ public class EntityDrawerImpl implements EntityDrawer { renderScope.enableScissor(x1, y1, x2, y2); Quaternionf quaternionf = (new Quaternionf()).rotateZ((float) Math.PI); Quaternionf quaternionf2 = new Quaternionf(); - float j = entity.bodyYaw; - float k = entity.getYaw(); - float l = entity.getPitch(); - float m = entity.lastHeadYaw; - float n = entity.headYaw; - entity.bodyYaw = 180.0F + yaw; - entity.setYaw(180.0F + yaw); - entity.setPitch(0.0F); - entity.headYaw = entity.getYaw(); - entity.lastHeadYaw = entity.getYaw(); + float j = entity.yBodyRot; + float k = entity.getYRot(); + float l = entity.getXRot(); + float m = entity.yHeadRotO; + float n = entity.yHeadRot; + entity.yBodyRot = 180.0F + yaw; + entity.setYRot(180.0F + yaw); + entity.setXRot(0.0F); + entity.yHeadRot = entity.getYRot(); + entity.yHeadRotO = entity.getYRot(); float o = entity.getScale(); - Vector3f vector3f = new Vector3f(0.0F, entity.getHeight() / 2.0F + scale * o, 0.0F); + Vector3f vector3f = new Vector3f(0.0F, entity.getBbHeight() / 2.0F + scale * o, 0.0F); float p = (float) size / o; drawEntity(renderScope, x1, y1, x2, y2, p, vector3f, quaternionf, quaternionf2, entity); - entity.bodyYaw = j; - entity.setYaw(k); - entity.setPitch(l); - entity.lastHeadYaw = m; - entity.headYaw = n; + entity.yBodyRot = j; + entity.setYRot(k); + entity.setXRot(l); + entity.yHeadRotO = m; + entity.yHeadRot = n; renderScope.disableScissor(); } @@ -64,13 +64,13 @@ public class EntityDrawerImpl implements EntityDrawer { Vector3f translation, Quaternionf rotation, @Nullable Quaternionf overrideCameraAngle, LivingEntity entity) { //? if >=1.21.9 { - EntityRenderManager entityRenderDispatcher = SaturnClient.client.getEntityRenderDispatcher(); + EntityRenderDispatcher entityRenderDispatcher = SaturnClient.client.getEntityRenderDispatcher(); //?} else //EntityRenderDispatcher entityRenderDispatcher = SaturnClient.client.getEntityRenderDispatcher(); EntityRenderer entityRenderer = entityRenderDispatcher.getRenderer(entity); - EntityRenderState entityRenderState = entityRenderer.getAndUpdateRenderState(entity, 1.0F); + EntityRenderState entityRenderState = entityRenderer.createRenderState(entity, 1.0F); //? if <1.21.11 - //entityRenderState.hitbox = null; + //entityRenderState.hitboxesRenderState = null; if (renderScope instanceof RenderScopeImpl i) i.addEntity(entityRenderState, scale, translation, rotation, overrideCameraAngle, x1, y1, x2, y2); @@ -84,9 +84,9 @@ import org.saturnclient.saturnclient.SaturnClient; import org.saturnclient.ui.RenderScope; import org.saturnclient.ui.components.SkinPreview.EntityDrawer; -import net.minecraft.client.render.DiffuseLighting; -import net.minecraft.client.render.entity.EntityRenderDispatcher; -import net.minecraft.entity.LivingEntity; +import com.mojang.blaze3d.platform.Lighting; +import net.minecraft.client.renderer.entity.EntityRenderDispatcher; +import net.minecraft.world.entity.LivingEntity; public class EntityDrawerImpl implements EntityDrawer { // Draws the entity in the box, turned by yaw degrees (0 faces the viewer) with its head straight. @@ -96,66 +96,66 @@ public class EntityDrawerImpl implements EntityDrawer { float h = (float) (y1 + y2) / 2.0F; renderScope.enableScissor(x1, y1, x2, y2); Quaternionf quaternionf = (new Quaternionf()).rotateZ(3.1415927F); - float k = entity.bodyYaw; - float l = entity.getYaw(); - float m = entity.getPitch(); + float k = entity.yBodyRot; + float l = entity.getYRot(); + float m = entity.getXRot(); //? if >=1.21.5 - float n = entity.lastHeadYaw; + float n = entity.yHeadRotO; //? if <1.21.5 - //float n = entity.prevHeadYaw; - float o = entity.headYaw; - entity.setYaw(180.0F + yaw); - entity.bodyYaw = 180.0F + yaw; - entity.setPitch(0.0F); - entity.headYaw = entity.getYaw(); + //float n = entity.yHeadRotO; + float o = entity.yHeadRot; + entity.setYRot(180.0F + yaw); + entity.yBodyRot = 180.0F + yaw; + entity.setXRot(0.0F); + entity.yHeadRot = entity.getYRot(); //? if >=1.21.5 - entity.lastHeadYaw = entity.getHeadYaw(); + entity.yHeadRotO = entity.getYHeadRot(); //? if <1.21.5 - //entity.prevHeadYaw = entity.getHeadYaw(); + //entity.yHeadRotO = entity.getYHeadRot(); entity.setCustomNameVisible(false); float p = entity.getScale(); - Vector3f vector3f = new Vector3f(0.0F, entity.getHeight() / 2.0F + f * p, 0.0F); + Vector3f vector3f = new Vector3f(0.0F, entity.getBbHeight() / 2.0F + f * p, 0.0F); float q = (float) size / p; drawEntity(renderScope, g, h, q, vector3f, quaternionf, null, entity); entity.setCustomNameVisible(true); - entity.bodyYaw = k; - entity.setYaw(l); - entity.setPitch(m); + entity.yBodyRot = k; + entity.setYRot(l); + entity.setXRot(m); //? if >=1.21.5 - entity.lastHeadYaw = n; + entity.yHeadRotO = n; //? if <1.21.5 - //entity.prevHeadYaw = n; - entity.headYaw = o; + //entity.yHeadRotO = n; + entity.yHeadRot = o; renderScope.disableScissor(); } public static void drawEntity(RenderScope renderScope, float x, float y, float size, Vector3f vector3f, Quaternionf quaternionf, @Nullable Quaternionf quaternionf2, LivingEntity entity) { if (renderScope instanceof RenderScopeImpl scopeImpl) { - scopeImpl.matrices.push(); + scopeImpl.matrices.pushPose(); scopeImpl.matrices.translate((double) x, (double) y, 0); scopeImpl.matrices.scale(size, size, -size); scopeImpl.matrices.translate(vector3f.x, vector3f.y, vector3f.z); - scopeImpl.matrices.multiply(quaternionf); + scopeImpl.matrices.mulPose(quaternionf); scopeImpl.draw(); //? if >=1.21.5 - DiffuseLighting.disableGuiDepthLighting(); + Lighting.setupForFlatItems(); //? if <1.21.5 - //DiffuseLighting.method_34742(); + //Lighting.setupForEntityInInventory(); EntityRenderDispatcher entityRenderDispatcher = SaturnClient.client.getEntityRenderDispatcher(); - entityRenderDispatcher.setRenderShadows(false); + entityRenderDispatcher.setRenderShadow(false); scopeImpl.draw((vertexConsumers) -> { entityRenderDispatcher.render(entity, 0.0, 0.0, 0.0, 1.0F, scopeImpl.matrices, vertexConsumers, 15728880); }); scopeImpl.draw(); - entityRenderDispatcher.setRenderShadows(true); + entityRenderDispatcher.setRenderShadow(true); scopeImpl.getMatrixStack().pop(); - DiffuseLighting.enableGuiDepthLighting(); + Lighting.setupFor3DItems(); } } diff --git a/src/main/java/org/saturnclient/impl/ui/GlassRenderer.java b/src/main/java/org/saturnclient/impl/ui/GlassRenderer.java index 9146cef..fc4149d 100644 --- a/src/main/java/org/saturnclient/impl/ui/GlassRenderer.java +++ b/src/main/java/org/saturnclient/impl/ui/GlassRenderer.java @@ -31,36 +31,36 @@ import com.mojang.serialization.JsonOps; import org.saturnclient.config.Config; import org.saturnclient.saturnclient.SaturnClient; -import net.minecraft.client.gl.Framebuffer; -import net.minecraft.client.gl.PostEffectPipeline; -import net.minecraft.client.gl.PostEffectProcessor; -import net.minecraft.client.gl.RenderPipelines; -import net.minecraft.client.gl.SimpleFramebuffer; -import net.minecraft.client.render.DefaultFramebufferSet; -import net.minecraft.client.render.ProjectionMatrix2; -import net.minecraft.client.texture.AbstractTexture; -import net.minecraft.client.texture.TextureSetup; -import net.minecraft.client.util.Pool; -import net.minecraft.util.Identifier; +import com.mojang.blaze3d.pipeline.RenderTarget; +import net.minecraft.client.renderer.PostChainConfig; +import net.minecraft.client.renderer.PostChain; +import net.minecraft.client.renderer.RenderPipelines; +import com.mojang.blaze3d.pipeline.TextureTarget; +import net.minecraft.client.renderer.LevelTargetBundle; +import net.minecraft.client.renderer.CachedOrthoProjectionMatrixBuffer; +import net.minecraft.client.renderer.texture.AbstractTexture; +import net.minecraft.client.gui.render.TextureSetup; +import com.mojang.blaze3d.resource.CrossFrameResourcePool; +import net.minecraft.resources.Identifier; public final class GlassRenderer { - public static final RenderPipeline PIPELINE = RenderPipeline.builder(RenderPipelines.POSITION_TEX_COLOR_SNIPPET) - .withLocation(Identifier.of("saturnclient", "pipeline/glass")) - .withFragmentShader(Identifier.of("saturnclient", "core/glass")) + public static final RenderPipeline PIPELINE = RenderPipeline.builder(RenderPipelines.GUI_TEXTURED_SNIPPET) + .withLocation(Identifier.fromNamespaceAndPath("saturnclient", "pipeline/glass")) + .withFragmentShader(Identifier.fromNamespaceAndPath("saturnclient", "core/glass")) .withSampler("Sampler1") // The transforms block ends with LineWidth before 1.21.11 (see glass.fsh). //? if <1.21.11 //.withShaderDefine("HAS_LINE_WIDTH") .build(); - private static final Identifier BLUR = Identifier.ofVanilla("post_effect/blur.json"); - private static final ProjectionMatrix2 PROJECTION = new ProjectionMatrix2("saturn glass", 0.1f, 1000f, false); + private static final Identifier BLUR = Identifier.withDefaultNamespace("post_effect/blur.json"); + private static final CachedOrthoProjectionMatrixBuffer PROJECTION = new CachedOrthoProjectionMatrixBuffer("saturn glass", 0.1f, 1000f, false); // For the blurs' intermediate targets, freed once unused for a few frames - private static final Pool POOL = new Pool(3); + private static final CrossFrameResourcePool POOL = new CrossFrameResourcePool(3); // By blur strength. A blur that failed to load is kept as null, so it isn't retried every frame. - private static final Map BLURS = new HashMap<>(); - private static final Map BACKDROPS = new HashMap<>(); + private static final Map BLURS = new HashMap<>(); + private static final Map BACKDROPS = new HashMap<>(); private GlassRenderer() { } @@ -68,38 +68,38 @@ public final class GlassRenderer { // Copies the main framebuffer and blurs the copy by blur. Call once a frame for each blur, while // the screen builds its GUI, before drawing glass with it. public static void captureBackdrop(int blur) { - Framebuffer main = SaturnClient.client.getFramebuffer(); - int width = main.textureWidth; - int height = main.textureHeight; + RenderTarget main = SaturnClient.client.getMainRenderTarget(); + int width = main.width; + int height = main.height; - SimpleFramebuffer backdrop = BACKDROPS.get(blur); + TextureTarget backdrop = BACKDROPS.get(blur); if (backdrop == null) { - backdrop = new SimpleFramebuffer("Saturn glass " + blur, width, height, false); + backdrop = new TextureTarget("Saturn glass " + blur, width, height, false); BACKDROPS.put(blur, backdrop); - } else if (backdrop.textureWidth != width || backdrop.textureHeight != height) { + } else if (backdrop.width != width || backdrop.height != height) { backdrop.resize(width, height); } //? if <1.21.11 - //backdrop.getColorAttachment().setTextureFilter(FilterMode.LINEAR, false); + //backdrop.getColorTexture().setTextureFilter(FilterMode.LINEAR, false); RenderSystem.getDevice().createCommandEncoder().copyTextureToTexture( - main.getColorAttachment(), backdrop.getColorAttachment(), 0, 0, 0, 0, 0, width, height); + main.getColorTexture(), backdrop.getColorTexture(), 0, 0, 0, 0, 0, width, height); - PostEffectProcessor processor = getBlur(blur); + PostChain processor = getBlur(blur); if (processor != null) { - processor.render(backdrop, POOL); + processor.process(backdrop, POOL); } - POOL.decrementLifespan(); + POOL.endFrame(); release(blur); } // The mask, then the copy blurred by blur, as the glass pipeline samples them public static TextureSetup textures(AbstractTexture mask, int blur) { - GpuTextureView backdrop = BACKDROPS.get(blur).getColorAttachmentView(); + GpuTextureView backdrop = BACKDROPS.get(blur).getColorTextureView(); //? if >=1.21.11 - return TextureSetup.of(mask.getGlTextureView(), mask.getSampler(), backdrop, RenderSystem.getSamplerCache().get(FilterMode.LINEAR)); + return TextureSetup.doubleTexture(mask.getTextureView(), mask.getSampler(), backdrop, RenderSystem.getSamplerCache().getClampToEdge(FilterMode.LINEAR)); //? if <1.21.11 - //return TextureSetup.of(mask.getGlTextureView(), backdrop); + //return TextureSetup.doubleTexture(mask.getTextureView(), backdrop); } // Frees the copies and blurs of strengths that are no longer set, besides kept @@ -107,7 +107,7 @@ public final class GlassRenderer { BACKDROPS.entrySet().removeIf(entry -> { boolean unused = entry.getKey() != kept && !isSet(entry.getKey()); if (unused) { - entry.getValue().delete(); + entry.getValue().destroyBuffers(); } return unused; }); @@ -124,7 +124,7 @@ public final class GlassRenderer { return blur == Config.menuBlur.value || blur == Config.widgetBlur.value; } - private static PostEffectProcessor getBlur(int blur) { + private static PostChain getBlur(int blur) { if (!BLURS.containsKey(blur)) { BLURS.put(blur, loadBlur(blur)); } @@ -133,14 +133,14 @@ public final class GlassRenderer { // Vanilla's blur, with its radius set to blur. Vanilla's own leaves it at 0, which makes the shader // read the menu blur setting (Saturn's animated background blur while a Saturn screen is open). - private static PostEffectProcessor loadBlur(int blur) { - try (Reader reader = SaturnClient.client.getResourceManager().getResourceOrThrow(BLUR).getReader()) { + private static PostChain loadBlur(int blur) { + try (Reader reader = SaturnClient.client.getResourceManager().getResourceOrThrow(BLUR).openAsReader()) { JsonElement json = JsonParser.parseReader(reader); setRadius(json, blur); - PostEffectPipeline pipeline = PostEffectPipeline.CODEC.parse(JsonOps.INSTANCE, json).getOrThrow(); - return PostEffectProcessor.parseEffect(pipeline, SaturnClient.client.getTextureManager(), - DefaultFramebufferSet.MAIN_ONLY, Identifier.of("saturnclient", "glass_blur_" + blur), PROJECTION); + PostChainConfig pipeline = PostChainConfig.CODEC.parse(JsonOps.INSTANCE, json).getOrThrow(); + return PostChain.load(pipeline, SaturnClient.client.getTextureManager(), + LevelTargetBundle.MAIN_TARGETS, Identifier.fromNamespaceAndPath("saturnclient", "glass_blur_" + blur), PROJECTION); } catch (Exception e) { SaturnClient.LOGGER.error("Couldn't load the glass blur", e); return null; @@ -171,68 +171,68 @@ import com.mojang.blaze3d.textures.FilterMode; import org.saturnclient.config.Config; import org.saturnclient.saturnclient.SaturnClient; -import net.minecraft.client.gl.Framebuffer; -import net.minecraft.client.gl.PostEffectProcessor; -import net.minecraft.client.gl.RenderPipelines; -import net.minecraft.client.gl.SimpleFramebuffer; -import net.minecraft.client.render.DefaultFramebufferSet; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.RenderPhase; -import net.minecraft.client.util.Pool; -import net.minecraft.util.Identifier; +import com.mojang.blaze3d.pipeline.RenderTarget; +import net.minecraft.client.renderer.PostChain; +import net.minecraft.client.renderer.RenderPipelines; +import com.mojang.blaze3d.pipeline.TextureTarget; +import net.minecraft.client.renderer.LevelTargetBundle; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.RenderStateShard; +import com.mojang.blaze3d.resource.CrossFrameResourcePool; +import net.minecraft.resources.Identifier; public final class GlassRenderer { - private static final RenderPipeline PIPELINE = RenderPipeline.builder(RenderPipelines.POSITION_TEX_COLOR_SNIPPET) - .withLocation(Identifier.of("saturnclient", "pipeline/glass")) - .withFragmentShader(Identifier.of("saturnclient", "core/glass_pre_1_21_6")) + private static final RenderPipeline PIPELINE = RenderPipeline.builder(RenderPipelines.GUI_TEXTURED_SNIPPET) + .withLocation(Identifier.fromNamespaceAndPath("saturnclient", "pipeline/glass")) + .withFragmentShader(Identifier.fromNamespaceAndPath("saturnclient", "core/glass_pre_1_21_6")) .withSampler("Sampler1") .build(); - private static final Identifier BLUR = Identifier.ofVanilla("blur"); + private static final Identifier BLUR = Identifier.withDefaultNamespace("blur"); // For the blur's intermediate target, freed once unused for a few frames - private static final Pool POOL = new Pool(3); + private static final CrossFrameResourcePool POOL = new CrossFrameResourcePool(3); - private static final Map BACKDROPS = new HashMap<>(); + private static final Map BACKDROPS = new HashMap<>(); // By mask and blur - private static final Map LAYERS = new HashMap<>(); + private static final Map LAYERS = new HashMap<>(); // The game behind the screen before the screen blurs it, which glass is blurred from - private static SimpleFramebuffer background; + private static TextureTarget background; private GlassRenderer() { } // Saves the main framebuffer for glass. Call each frame before the screen blurs its background. public static void saveBackground() { - background = copy(SaturnClient.client.getFramebuffer(), background, "Saturn glass background"); + background = copy(SaturnClient.client.getMainRenderTarget(), background, "Saturn glass background"); } // Copies the saved background and blurs the copy by blur. Call once a frame for each blur, before // drawing glass with it. public static void captureBackdrop(int blur) { - Framebuffer from = background != null ? background : SaturnClient.client.getFramebuffer(); - SimpleFramebuffer backdrop = copy(from, BACKDROPS.get(blur), "Saturn glass " + blur); + RenderTarget from = background != null ? background : SaturnClient.client.getMainRenderTarget(); + TextureTarget backdrop = copy(from, BACKDROPS.get(blur), "Saturn glass " + blur); BACKDROPS.put(blur, backdrop); - PostEffectProcessor processor = SaturnClient.client.getShaderLoader().loadPostEffect(BLUR, - DefaultFramebufferSet.MAIN_ONLY); + PostChain processor = SaturnClient.client.getShaderManager().getPostChain(BLUR, + LevelTargetBundle.MAIN_TARGETS); if (processor != null) { - processor.render(backdrop, POOL, pass -> pass.setUniform("Radius", (float) blur)); + processor.process(backdrop, POOL, pass -> pass.setUniform("Radius", (float) blur)); } - POOL.decrementLifespan(); + POOL.endFrame(); release(blur); } // Draws glass through mask with the copy blurred by blur - public static RenderLayer getLayer(Identifier mask, int blur) { - return LAYERS.computeIfAbsent(mask + " " + blur, key -> RenderLayer.of("saturn_glass", 786432, PIPELINE, - RenderLayer.MultiPhaseParameters.builder() - .texture(new RenderPhase.TextureBase(() -> { + public static RenderType getLayer(Identifier mask, int blur) { + return LAYERS.computeIfAbsent(mask + " " + blur, key -> RenderType.create("saturn_glass", 786432, PIPELINE, + RenderType.CompositeState.builder() + .setTextureState(new RenderStateShard.EmptyTextureStateShard(() -> { RenderSystem.setShaderTexture(0, - SaturnClient.client.getTextureManager().getTexture(mask).getGlTexture()); - RenderSystem.setShaderTexture(1, BACKDROPS.get(blur).getColorAttachment()); + SaturnClient.client.getTextureManager().getTexture(mask).getTexture()); + RenderSystem.setShaderTexture(1, BACKDROPS.get(blur).getColorTexture()); }, () -> { })) - .build(false))); + .createCompositeState(false))); } // Frees the copies of strengths that are no longer set, besides kept @@ -241,26 +241,26 @@ public final class GlassRenderer { boolean unused = entry.getKey() != kept && entry.getKey() != Config.menuBlur.value && entry.getKey() != Config.widgetBlur.value; if (unused) { - entry.getValue().delete(); + entry.getValue().destroyBuffers(); } return unused; }); } // Copies from into to, made or resized to match - private static SimpleFramebuffer copy(Framebuffer from, SimpleFramebuffer to, String name) { - int width = from.textureWidth; - int height = from.textureHeight; + private static TextureTarget copy(RenderTarget from, TextureTarget to, String name) { + int width = from.width; + int height = from.height; if (to == null) { - to = new SimpleFramebuffer(name, width, height, false); - } else if (to.textureWidth != width || to.textureHeight != height) { + to = new TextureTarget(name, width, height, false); + } else if (to.width != width || to.height != height) { to.resize(width, height); } - to.getColorAttachment().setTextureFilter(FilterMode.LINEAR, false); + to.getColorTexture().setTextureFilter(FilterMode.LINEAR, false); RenderSystem.getDevice().createCommandEncoder().copyTextureToTexture( - from.getColorAttachment(), to.getColorAttachment(), 0, 0, 0, 0, 0, width, height); + from.getColorTexture(), to.getColorTexture(), 0, 0, 0, 0, 0, width, height); return to; } } @@ -277,72 +277,72 @@ import com.mojang.blaze3d.systems.RenderSystem; import org.saturnclient.config.Config; import org.saturnclient.saturnclient.SaturnClient; -import net.minecraft.client.gl.Defines; -import net.minecraft.client.gl.Framebuffer; -import net.minecraft.client.gl.PostEffectProcessor; -import net.minecraft.client.gl.ShaderProgramKey; -import net.minecraft.client.gl.SimpleFramebuffer; -import net.minecraft.client.render.DefaultFramebufferSet; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.RenderPhase; -import net.minecraft.client.render.VertexFormat; -import net.minecraft.client.render.VertexFormats; -import net.minecraft.client.util.Pool; -import net.minecraft.util.Identifier; +import net.minecraft.client.renderer.ShaderDefines; +import com.mojang.blaze3d.pipeline.RenderTarget; +import net.minecraft.client.renderer.PostChain; +import net.minecraft.client.renderer.ShaderProgram; +import com.mojang.blaze3d.pipeline.TextureTarget; +import net.minecraft.client.renderer.LevelTargetBundle; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.RenderStateShard; +import com.mojang.blaze3d.vertex.VertexFormat; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.resource.CrossFrameResourcePool; +import net.minecraft.resources.Identifier; public final class GlassRenderer { - private static final ShaderProgramKey PROGRAM = new ShaderProgramKey(Identifier.of("saturnclient", "core/glass"), - VertexFormats.POSITION_TEXTURE_COLOR, Defines.EMPTY); + private static final ShaderProgram PROGRAM = new ShaderProgram(Identifier.fromNamespaceAndPath("saturnclient", "core/glass"), + DefaultVertexFormat.POSITION_TEX_COLOR, ShaderDefines.EMPTY); - private static final Identifier BLUR = Identifier.ofVanilla("blur"); + private static final Identifier BLUR = Identifier.withDefaultNamespace("blur"); // For the blur's intermediate target, freed once unused for a few frames - private static final Pool POOL = new Pool(3); + private static final CrossFrameResourcePool POOL = new CrossFrameResourcePool(3); - private static final Map BACKDROPS = new HashMap<>(); + private static final Map BACKDROPS = new HashMap<>(); // By mask and blur - private static final Map LAYERS = new HashMap<>(); + private static final Map LAYERS = new HashMap<>(); // The game behind the screen before the screen blurs it, which glass is blurred from - private static SimpleFramebuffer background; + private static TextureTarget background; private GlassRenderer() { } // Saves the main framebuffer for glass. Call each frame before the screen blurs its background. public static void saveBackground() { - background = copy(SaturnClient.client.getFramebuffer(), background); + background = copy(SaturnClient.client.getMainRenderTarget(), background); } // Copies the saved background and blurs the copy by blur. Call once a frame for each blur, before // drawing glass with it. public static void captureBackdrop(int blur) { - Framebuffer from = background != null ? background : SaturnClient.client.getFramebuffer(); - SimpleFramebuffer backdrop = copy(from, BACKDROPS.get(blur)); + RenderTarget from = background != null ? background : SaturnClient.client.getMainRenderTarget(); + TextureTarget backdrop = copy(from, BACKDROPS.get(blur)); BACKDROPS.put(blur, backdrop); - PostEffectProcessor processor = SaturnClient.client.getShaderLoader().loadPostEffect(BLUR, - DefaultFramebufferSet.MAIN_ONLY); + PostChain processor = SaturnClient.client.getShaderManager().getPostChain(BLUR, + LevelTargetBundle.MAIN_TARGETS); if (processor != null) { - processor.setUniforms("Radius", blur); - processor.render(backdrop, POOL); + processor.setUniform("Radius", blur); + processor.process(backdrop, POOL); } - POOL.decrementLifespan(); + POOL.endFrame(); release(blur); - SaturnClient.client.getFramebuffer().beginWrite(false); + SaturnClient.client.getMainRenderTarget().bindWrite(false); } // Draws glass through mask with the copy blurred by blur - public static RenderLayer getLayer(Identifier mask, int blur) { - return LAYERS.computeIfAbsent(mask + " " + blur, key -> RenderLayer.of("saturn_glass", - VertexFormats.POSITION_TEXTURE_COLOR, VertexFormat.DrawMode.QUADS, 786432, - RenderLayer.MultiPhaseParameters.builder() - .texture(new RenderPhase.TextureBase(() -> { + public static RenderType getLayer(Identifier mask, int blur) { + return LAYERS.computeIfAbsent(mask + " " + blur, key -> RenderType.create("saturn_glass", + DefaultVertexFormat.POSITION_TEX_COLOR, VertexFormat.Mode.QUADS, 786432, + RenderType.CompositeState.builder() + .setTextureState(new RenderStateShard.EmptyTextureStateShard(() -> { RenderSystem.setShaderTexture(0, mask); - RenderSystem.setShaderTexture(1, BACKDROPS.get(blur).getColorAttachment()); + RenderSystem.setShaderTexture(1, BACKDROPS.get(blur).getColorTextureId()); }, () -> { })) - .program(new RenderPhase.ShaderProgram(PROGRAM)) - .transparency(RenderPhase.TRANSLUCENT_TRANSPARENCY) - .build(false))); + .setShaderState(new RenderStateShard.ShaderStateShard(PROGRAM)) + .setTransparencyState(RenderStateShard.TRANSLUCENT_TRANSPARENCY) + .createCompositeState(false))); } // Frees the copies of strengths that are no longer set, besides kept @@ -351,29 +351,29 @@ public final class GlassRenderer { boolean unused = entry.getKey() != kept && entry.getKey() != Config.menuBlur.value && entry.getKey() != Config.widgetBlur.value; if (unused) { - entry.getValue().delete(); + entry.getValue().destroyBuffers(); } return unused; }); } // Copies from into to, made or resized to match - private static SimpleFramebuffer copy(Framebuffer from, SimpleFramebuffer to) { - int width = from.textureWidth; - int height = from.textureHeight; + private static TextureTarget copy(RenderTarget from, TextureTarget to) { + int width = from.width; + int height = from.height; if (to == null) { - to = new SimpleFramebuffer(width, height, false); - } else if (to.textureWidth != width || to.textureHeight != height) { + to = new TextureTarget(width, height, false); + } else if (to.width != width || to.height != height) { to.resize(width, height); } - to.setTexFilter(GL11.GL_LINEAR); + to.setFilterMode(GL11.GL_LINEAR); - GlStateManager._glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, from.fbo); - GlStateManager._glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, to.fbo); + GlStateManager._glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, from.frameBufferId); + GlStateManager._glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, to.frameBufferId); GlStateManager._glBlitFrameBuffer(0, 0, width, height, 0, 0, width, height, GL11.GL_COLOR_BUFFER_BIT, GL11.GL_NEAREST); - SaturnClient.client.getFramebuffer().beginWrite(false); + SaturnClient.client.getMainRenderTarget().bindWrite(false); return to; } } diff --git a/src/main/java/org/saturnclient/impl/ui/RenderScopeImpl.java b/src/main/java/org/saturnclient/impl/ui/RenderScopeImpl.java index 3398516..806cc20 100644 --- a/src/main/java/org/saturnclient/impl/ui/RenderScopeImpl.java +++ b/src/main/java/org/saturnclient/impl/ui/RenderScopeImpl.java @@ -28,32 +28,32 @@ import org.saturnclient.ui.RenderScope; import org.saturnclient.ui.resources.Fonts; import org.saturnclient.ui.resources.SvgTexture; -import net.minecraft.client.gl.RenderPipelines; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.ScreenRect; -import net.minecraft.client.gui.render.state.ColoredQuadGuiElementRenderState; +import net.minecraft.client.renderer.RenderPipelines; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.navigation.ScreenRectangle; +import net.minecraft.client.gui.render.state.ColoredRectangleRenderState; import net.minecraft.client.gui.render.state.GuiRenderState; -import net.minecraft.client.gui.render.state.ItemGuiElementRenderState; -import net.minecraft.client.gui.render.state.TextGuiElementRenderState; -import net.minecraft.client.gui.render.state.TexturedQuadGuiElementRenderState; -import net.minecraft.client.gui.render.state.special.EntityGuiElementRenderState; -import net.minecraft.client.render.entity.state.EntityRenderState; +import net.minecraft.client.gui.render.state.GuiItemRenderState; +import net.minecraft.client.gui.render.state.GuiTextRenderState; +import net.minecraft.client.gui.render.state.BlitRenderState; +import net.minecraft.client.gui.render.state.pip.GuiEntityRenderState; +import net.minecraft.client.renderer.entity.state.EntityRenderState; //? if >=1.21.7 { -import net.minecraft.client.render.item.KeyedItemRenderState; +import net.minecraft.client.renderer.item.TrackingItemStackRenderState; //?} else -//import net.minecraft.client.render.item.ItemRenderState; -import net.minecraft.client.texture.AbstractTexture; -import net.minecraft.client.texture.Sprite; -import net.minecraft.client.texture.TextureSetup; -import net.minecraft.entity.LivingEntity; -import net.minecraft.item.ItemDisplayContext; -import net.minecraft.item.ItemStack; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; -import net.minecraft.util.crash.CrashException; -import net.minecraft.util.crash.CrashReport; -import net.minecraft.util.crash.CrashReportSection; -import net.minecraft.world.World; +//import net.minecraft.client.renderer.item.ItemStackRenderState; +import net.minecraft.client.renderer.texture.AbstractTexture; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.gui.render.TextureSetup; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.Identifier; +import net.minecraft.ReportedException; +import net.minecraft.CrashReport; +import net.minecraft.CrashReportCategory; +import net.minecraft.world.level.Level; public class RenderScopeImpl implements RenderScope { @@ -65,8 +65,8 @@ public class RenderScopeImpl implements RenderScope { // The glass blurs made for this scope's frame private final Set capturedBlurs = new HashSet<>(); - public RenderScopeImpl(DrawContext context) { - this(context.getMatrices(), ((DrawContextAccessor) (Object) context).getState()); + public RenderScopeImpl(GuiGraphics context) { + this(context.pose(), ((DrawContextAccessor) (Object) context).getState()); } public RenderScopeImpl(Matrix3x2fStack matrices, GuiRenderState state) { @@ -95,10 +95,10 @@ public class RenderScopeImpl implements RenderScope { @Override public void fill(int x1, int y1, int x2, int y2, int color) { - this.state.addSimpleElement( - new ColoredQuadGuiElementRenderState( + this.state.submitGuiElement( + new ColoredRectangleRenderState( RenderPipelines.GUI, - TextureSetup.empty(), + TextureSetup.noTexture(), new Matrix3x2f(this.matrices.stack), x1, y1, x2, y2, color, color, this.scissorStack.peekLast())); @@ -149,10 +149,10 @@ public class RenderScopeImpl implements RenderScope { matrices.translate(x, y + (lineIndex * Fonts.getHeight())); matrices.scale(scale, scale); - this.state.addText( - new TextGuiElementRenderState( - SaturnClient.client.textRenderer, - ((Text) Fonts.setFont(line, font)).asOrderedText(), + this.state.submitText( + new GuiTextRenderState( + SaturnClient.client.font, + ((Component) Fonts.setFont(line, font)).getVisualOrderText(), new Matrix3x2f(this.matrices.stack), 0, font == 0 ? 1 : 8, //? if >=1.21.11 { @@ -168,12 +168,12 @@ public class RenderScopeImpl implements RenderScope { @Override public int getScaledWindowWidth() { - return SaturnClient.client.getWindow().getScaledWidth(); + return SaturnClient.client.getWindow().getGuiScaledWidth(); } @Override public int getScaledWindowHeight() { - return SaturnClient.client.getWindow().getScaledHeight(); + return SaturnClient.client.getWindow().getGuiScaledHeight(); } // Texture rendering @@ -217,17 +217,17 @@ public class RenderScopeImpl implements RenderScope { } GpuTextureView gpuTextureView = SaturnClient.client.getTextureManager() - .getTexture(sprite).getGlTextureView(); + .getTexture(sprite).getTextureView(); //? if >=1.21.11 AbstractTexture abstractTexture = SaturnClient.client.getTextureManager().getTexture(sprite); - this.state.addSimpleElement(new TexturedQuadGuiElementRenderState( + this.state.submitGuiElement(new BlitRenderState( RenderPipelines.GUI_TEXTURED, //? if >=1.21.11 { - TextureSetup.of(gpuTextureView, abstractTexture.getSampler()), + TextureSetup.singleTexture(gpuTextureView, abstractTexture.getSampler()), //?} else - //TextureSetup.withoutGlTexture(gpuTextureView), + //TextureSetup.singleTexture(gpuTextureView), new Matrix3x2f(this.matrices.stack), x1, y1, x2, y2, u1, u2, v1, v2, color, this.scissorStack.peekLast())); @@ -244,7 +244,7 @@ public class RenderScopeImpl implements RenderScope { } AbstractTexture maskTexture = SaturnClient.client.getTextureManager().getTexture((Identifier) (Object) mask); - this.state.addSimpleElement(new TexturedQuadGuiElementRenderState( + this.state.submitGuiElement(new BlitRenderState( GlassRenderer.PIPELINE, GlassRenderer.textures(maskTexture, blur), new Matrix3x2f(this.matrices.stack), @@ -255,7 +255,7 @@ public class RenderScopeImpl implements RenderScope { // Scissor management @Override public void enableScissor(int x1, int y1, int x2, int y2) { - ScreenRect rect = new ScreenRect(x1, y1, x2 - x1, y2 - y1).transform(this.matrices.stack); + ScreenRectangle rect = new ScreenRectangle(x1, y1, x2 - x1, y2 - y1).transformAxisAligned(this.matrices.stack); scissorStack.push(rect); } @@ -270,12 +270,12 @@ public class RenderScopeImpl implements RenderScope { } public static class ScissorStack { - private final Deque stack = new ArrayDeque<>(); + private final Deque stack = new ArrayDeque<>(); - public ScreenRect push(ScreenRect rect) { - ScreenRect last = stack.peekLast(); + public ScreenRectangle push(ScreenRectangle rect) { + ScreenRectangle last = stack.peekLast(); if (last != null) { - ScreenRect intersection = Objects.requireNonNullElse(rect.intersection(last), ScreenRect.empty()); + ScreenRectangle intersection = Objects.requireNonNullElse(rect.intersection(last), ScreenRectangle.empty()); stack.addLast(intersection); return intersection; } else { @@ -285,7 +285,7 @@ public class RenderScopeImpl implements RenderScope { } @Nullable - public ScreenRect pop() { + public ScreenRectangle pop() { if (stack.isEmpty()) throw new IllegalStateException("Scissor stack underflow"); stack.removeLast(); @@ -293,48 +293,48 @@ public class RenderScopeImpl implements RenderScope { } @Nullable - public ScreenRect peekLast() { + public ScreenRectangle peekLast() { return stack.peekLast(); } public boolean contains(int x, int y) { - return stack.isEmpty() || stack.peekLast().contains(x, y); + return stack.isEmpty() || stack.peekLast().containsPoint(x, y); } } // Item rendering @Override public void drawItem(ItemStackRef stack, int x, int y) { - drawItem(null, SaturnClient.client.world, stack, x, y, 0); + drawItem(null, SaturnClient.client.level, stack, x, y, 0); } - private void drawItem(@Nullable LivingEntity entity, @Nullable World world, ItemStackRef stack, int x, int y, + private void drawItem(@Nullable LivingEntity entity, @Nullable Level world, ItemStackRef stack, int x, int y, int seed) { drawItem(entity, world, (ItemStack) (Object) stack, x, y, seed, 0); } - private void drawItem(@Nullable LivingEntity entity, @Nullable World world, ItemStack stack, int x, int y, int seed, + private void drawItem(@Nullable LivingEntity entity, @Nullable Level world, ItemStack stack, int x, int y, int seed, int z) { if (!stack.isEmpty()) { //? if >=1.21.7 { - KeyedItemRenderState keyedItemRenderState = new KeyedItemRenderState(); + TrackingItemStackRenderState keyedItemRenderState = new TrackingItemStackRenderState(); //?} else - //ItemRenderState keyedItemRenderState = new ItemRenderState(); - SaturnClient.client.getItemModelManager().clearAndUpdate(keyedItemRenderState, stack, + //ItemStackRenderState keyedItemRenderState = new ItemStackRenderState(); + SaturnClient.client.getItemModelResolver().updateForTopItem(keyedItemRenderState, stack, ItemDisplayContext.GUI, world, entity, seed); try { - this.state.addItem(new ItemGuiElementRenderState(stack.getItem().getName().toString(), + this.state.submitItem(new GuiItemRenderState(stack.getItem().getName().toString(), new Matrix3x2f(this.matrices.stack), keyedItemRenderState, x, y, this.scissorStack.peekLast())); } catch (Throwable throwable) { - CrashReport crashReport = CrashReport.create(throwable, "Rendering item"); - CrashReportSection crashReportSection = crashReport.addElement("Item being rendered"); - crashReportSection.add("Item Type", () -> String.valueOf(stack.getItem())); - crashReportSection.add("Item Components", () -> String.valueOf(stack.getComponents())); - crashReportSection.add("Item Foil", () -> String.valueOf(stack.hasGlint())); - throw new CrashException(crashReport); + CrashReport crashReport = CrashReport.forThrowable(throwable, "Rendering item"); + CrashReportCategory crashReportSection = crashReport.addCategory("Item being rendered"); + crashReportSection.setDetail("Item Type", () -> String.valueOf(stack.getItem())); + crashReportSection.setDetail("Item Components", () -> String.valueOf(stack.getComponents())); + crashReportSection.setDetail("Item Foil", () -> String.valueOf(stack.hasFoil())); + throw new ReportedException(crashReport); } } } @@ -346,12 +346,12 @@ public class RenderScopeImpl implements RenderScope { @Override public void drawSpriteStretched(SpriteRef sprite, int x, int y, int width, int height, int color) { - Sprite mcSprite = (Sprite) sprite; + TextureAtlasSprite mcSprite = (TextureAtlasSprite) sprite; if (color == 0 || width == 0 || height == 0) return; - drawTexturedQuad(mcSprite.getAtlasId(), x, x + width, y, y + height, - mcSprite.getMinU(), mcSprite.getMaxU(), mcSprite.getMinV(), mcSprite.getMaxV(), color); + drawTexturedQuad(mcSprite.atlasLocation(), x, x + width, y, y + height, + mcSprite.getU0(), mcSprite.getU1(), mcSprite.getV0(), mcSprite.getV1(), color); } @Override @@ -382,7 +382,7 @@ public class RenderScopeImpl implements RenderScope { float adjustedScale = scale * scaleX; // apply matrix scale to entity scale too - this.state.addSpecialElement(new EntityGuiElementRenderState(entityState, translation, rotation, + this.state.submitPicturesInPictureState(new GuiEntityRenderState(entityState, translation, rotation, overrideCameraAngle, adjustedX1, adjustedY1, adjustedX2, adjustedY2, adjustedScale, this.scissorStack.peekLast())); } @@ -410,57 +410,57 @@ import org.saturnclient.ui.RenderScope; import org.saturnclient.ui.resources.Fonts; import org.saturnclient.ui.resources.SvgTexture; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.font.TextRenderer.TextLayerType; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.ScreenRect; -import net.minecraft.client.render.DiffuseLighting; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.item.ItemRenderState; -import net.minecraft.client.texture.Sprite; -import net.minecraft.client.util.Window; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.LivingEntity; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.Font.DisplayMode; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.navigation.ScreenRectangle; +import com.mojang.blaze3d.platform.Lighting; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.RenderType; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.item.ItemStackRenderState; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import com.mojang.blaze3d.platform.Window; +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.world.entity.LivingEntity; //? if >=1.21.5 -import net.minecraft.item.ItemDisplayContext; +import net.minecraft.world.item.ItemDisplayContext; //? if <1.21.5 -//import net.minecraft.item.ModelTransformationMode; -import net.minecraft.item.ItemStack; +//import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; -import net.minecraft.util.crash.CrashException; -import net.minecraft.util.crash.CrashReport; -import net.minecraft.util.crash.CrashReportSection; -import net.minecraft.world.World; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.Identifier; +import net.minecraft.ReportedException; +import net.minecraft.CrashReport; +import net.minecraft.CrashReportCategory; +import net.minecraft.world.level.Level; public class RenderScopeImpl implements RenderScope { // ---------------------------- // Fields // ---------------------------- - public MatrixStack matrices; - public VertexConsumerProvider.Immediate vertexConsumers; + public PoseStack matrices; + public MultiBufferSource.BufferSource vertexConsumers; private ScissorStack scissorStack = new ScissorStack(); private int opacity = 255 << 24; // The glass blurs made for this scope's frame private final Set capturedBlurs = new HashSet<>(); - private final ItemRenderState itemRenderState; + private final ItemStackRenderState itemRenderState; // ---------------------------- // Constructors // ---------------------------- - public RenderScopeImpl(DrawContext context) { - this(context.getMatrices(), ((DrawContextAccessor) context).getVertexConsumers()); + public RenderScopeImpl(GuiGraphics context) { + this(context.pose(), ((DrawContextAccessor) context).getVertexConsumers()); } - public RenderScopeImpl(MatrixStack matrices, VertexConsumerProvider.Immediate vertexConsumers) { + public RenderScopeImpl(PoseStack matrices, MultiBufferSource.BufferSource vertexConsumers) { this.matrices = matrices; this.vertexConsumers = vertexConsumers; this.scissorStack = new ScissorStack(); - this.itemRenderState = new ItemRenderState(); + this.itemRenderState = new ItemStackRenderState(); } // ---------------------------- @@ -492,22 +492,22 @@ public class RenderScopeImpl implements RenderScope { // ---------------------------- @Override public void draw() { - this.vertexConsumers.draw(); + this.vertexConsumers.endBatch(); } @Override public int getScaledWindowWidth() { - return SaturnClient.client.getWindow().getScaledWidth(); + return SaturnClient.client.getWindow().getGuiScaledWidth(); } @Override public int getScaledWindowHeight() { - return SaturnClient.client.getWindow().getScaledHeight(); + return SaturnClient.client.getWindow().getGuiScaledHeight(); } - public void draw(Consumer drawer) { + public void draw(Consumer drawer) { drawer.accept(this.vertexConsumers); - this.vertexConsumers.draw(); + this.vertexConsumers.endBatch(); } // ---------------------------- @@ -519,7 +519,7 @@ public class RenderScopeImpl implements RenderScope { return; color = getColor(color); - Matrix4f matrix4f = this.matrices.peek().getPositionMatrix(); + Matrix4f matrix4f = this.matrices.last().pose(); int x1 = x; int x2 = x + width; @@ -537,11 +537,11 @@ public class RenderScopeImpl implements RenderScope { y2 = tmp; } - VertexConsumer vertexConsumer = this.vertexConsumers.getBuffer(RenderLayer.getGui()); - vertexConsumer.vertex(matrix4f, x1, y1, 0).color(color); - vertexConsumer.vertex(matrix4f, x1, y2, 0).color(color); - vertexConsumer.vertex(matrix4f, x2, y2, 0).color(color); - vertexConsumer.vertex(matrix4f, x2, y1, 0).color(color); + VertexConsumer vertexConsumer = this.vertexConsumers.getBuffer(RenderType.gui()); + vertexConsumer.addVertex(matrix4f, x1, y1, 0).setColor(color); + vertexConsumer.addVertex(matrix4f, x1, y2, 0).setColor(color); + vertexConsumer.addVertex(matrix4f, x2, y2, 0).setColor(color); + vertexConsumer.addVertex(matrix4f, x2, y1, 0).setColor(color); } @Override @@ -550,15 +550,15 @@ public class RenderScopeImpl implements RenderScope { } public void fill(int x1, int y1, int x2, int y2, int z, int color) { - fill(RenderLayer.getGui(), x1, y1, x2, y2, z, color); + fill(RenderType.gui(), x1, y1, x2, y2, z, color); } - public void fill(RenderLayer layer, int x1, int y1, int x2, int y2, int color) { + public void fill(RenderType layer, int x1, int y1, int x2, int y2, int color) { fill(layer, x1, y1, x2, y2, 0, color); } - public void fill(RenderLayer layer, int x1, int y1, int x2, int y2, int z, int color) { - Matrix4f matrix4f = this.matrices.peek().getPositionMatrix(); + public void fill(RenderType layer, int x1, int y1, int x2, int y2, int z, int color) { + Matrix4f matrix4f = this.matrices.last().pose(); if (x1 < x2) { int tmp = x1; x1 = x2; @@ -571,10 +571,10 @@ public class RenderScopeImpl implements RenderScope { } VertexConsumer vertexConsumer = this.vertexConsumers.getBuffer(layer); - vertexConsumer.vertex(matrix4f, x1, y1, z).color(color); - vertexConsumer.vertex(matrix4f, x1, y2, z).color(color); - vertexConsumer.vertex(matrix4f, x2, y2, z).color(color); - vertexConsumer.vertex(matrix4f, x2, y1, z).color(color); + vertexConsumer.addVertex(matrix4f, x1, y1, z).setColor(color); + vertexConsumer.addVertex(matrix4f, x1, y2, z).setColor(color); + vertexConsumer.addVertex(matrix4f, x2, y2, z).setColor(color); + vertexConsumer.addVertex(matrix4f, x2, y1, z).setColor(color); } @Override @@ -603,13 +603,13 @@ public class RenderScopeImpl implements RenderScope { int i = 0; for (String line : text.split("\n")) { color = getColor(color); - matrices.push(); + matrices.pushPose(); matrices.translate(x, y + i * Fonts.getHeight(), 0); matrices.scale(scale, scale, 1.0f); - TextRenderer textRenderer = SaturnClient.client.textRenderer; - textRenderer.draw((Text) Fonts.setFont(line, font), 0, font == 0 ? 1 : 7, color, false, - matrices.peek().getPositionMatrix(), vertexConsumers, TextLayerType.NORMAL, 0, 15728880); - matrices.pop(); + Font textRenderer = SaturnClient.client.font; + textRenderer.drawInBatch((Component) Fonts.setFont(line, font), 0, font == 0 ? 1 : 7, color, false, + matrices.last().pose(), vertexConsumers, DisplayMode.NORMAL, 0, 15728880); + matrices.popPose(); i++; } } @@ -648,12 +648,12 @@ public class RenderScopeImpl implements RenderScope { @Override public void drawSpriteStretched(SpriteRef saturnSprite, int x, int y, int width, int height, int color) { - Sprite sprite = (Sprite) saturnSprite; + TextureAtlasSprite sprite = (TextureAtlasSprite) saturnSprite; if (color == 0) return; if (width != 0 && height != 0) { - drawTexturedQuad(sprite.getAtlasId(), x, x + width, y, y + height, - sprite.getMinU(), sprite.getMaxU(), sprite.getMinV(), sprite.getMaxV(), color); + drawTexturedQuad(sprite.atlasLocation(), x, x + width, y, y + height, + sprite.getU0(), sprite.getU1(), sprite.getV0(), sprite.getV1(), color); } } @@ -672,18 +672,18 @@ public class RenderScopeImpl implements RenderScope { y2 *= 4; color = getColor(color); - matrices.push(); + matrices.pushPose(); matrices.scale(0.25f, 0.25f, 1.0f); //? if <1.21.5 //RenderSystem.setShaderTexture(0, sprite); - RenderLayer renderLayer = RenderLayer.getGuiTextured(sprite); - Matrix4f matrix4f = matrices.peek().getPositionMatrix(); + RenderType renderLayer = RenderType.guiTextured(sprite); + Matrix4f matrix4f = matrices.last().pose(); VertexConsumer vertexConsumer = vertexConsumers.getBuffer(renderLayer); - vertexConsumer.vertex(matrix4f, x1, y1, 0).texture(u1, v1).color(color); - vertexConsumer.vertex(matrix4f, x1, y2, 0).texture(u1, v2).color(color); - vertexConsumer.vertex(matrix4f, x2, y2, 0).texture(u2, v2).color(color); - vertexConsumer.vertex(matrix4f, x2, y1, 0).texture(u2, v1).color(color); - matrices.pop(); + vertexConsumer.addVertex(matrix4f, x1, y1, 0).setUv(u1, v1).setColor(color); + vertexConsumer.addVertex(matrix4f, x1, y2, 0).setUv(u1, v2).setColor(color); + vertexConsumer.addVertex(matrix4f, x2, y2, 0).setUv(u2, v2).setColor(color); + vertexConsumer.addVertex(matrix4f, x2, y1, 0).setUv(u2, v1).setColor(color); + matrices.popPose(); } @Override @@ -702,15 +702,15 @@ public class RenderScopeImpl implements RenderScope { int y1 = y * 4; int y2 = (y + height) * 4; - matrices.push(); + matrices.pushPose(); matrices.scale(0.25f, 0.25f, 1.0f); - Matrix4f matrix4f = matrices.peek().getPositionMatrix(); + Matrix4f matrix4f = matrices.last().pose(); VertexConsumer vertexConsumer = vertexConsumers.getBuffer(GlassRenderer.getLayer((Identifier) (Object) mask, blur)); - vertexConsumer.vertex(matrix4f, x1, y1, 0).texture(0, 0).color(color); - vertexConsumer.vertex(matrix4f, x1, y2, 0).texture(0, 1).color(color); - vertexConsumer.vertex(matrix4f, x2, y2, 0).texture(1, 1).color(color); - vertexConsumer.vertex(matrix4f, x2, y1, 0).texture(1, 0).color(color); - matrices.pop(); + vertexConsumer.addVertex(matrix4f, x1, y1, 0).setUv(0, 0).setColor(color); + vertexConsumer.addVertex(matrix4f, x1, y2, 0).setUv(0, 1).setColor(color); + vertexConsumer.addVertex(matrix4f, x2, y2, 0).setUv(1, 1).setColor(color); + vertexConsumer.addVertex(matrix4f, x2, y1, 0).setUv(1, 0).setColor(color); + matrices.popPose(); } // ---------------------------- @@ -718,55 +718,55 @@ public class RenderScopeImpl implements RenderScope { // ---------------------------- @Override public void drawItem(ItemStackRef item, int x, int y) { - drawItem(SaturnClient.client.player, SaturnClient.client.world, item, x, y, 0); + drawItem(SaturnClient.client.player, SaturnClient.client.level, item, x, y, 0); } - private void drawItem(@Nullable LivingEntity entity, @Nullable World world, ItemStackRef stack, int x, int y, + private void drawItem(@Nullable LivingEntity entity, @Nullable Level world, ItemStackRef stack, int x, int y, int seed) { drawItem(entity, world, (ItemStack) (Object) stack, x, y, seed, 0); } - private void drawItem(@Nullable LivingEntity entity, @Nullable World world, ItemStack stack, int x, int y, int seed, + private void drawItem(@Nullable LivingEntity entity, @Nullable Level world, ItemStack stack, int x, int y, int seed, int z) { if (stack.isEmpty()) return; //? if >=1.21.5 - SaturnClient.client.getItemModelManager().update(itemRenderState, stack, ItemDisplayContext.GUI, world, entity, seed); + SaturnClient.client.getItemModelResolver().appendItemLayers(itemRenderState, stack, ItemDisplayContext.GUI, world, entity, seed); //? if >=1.21.5 - SaturnClient.client.getItemModelManager().clearAndUpdate(this.itemRenderState, stack, ItemDisplayContext.GUI, world, entity, seed); + SaturnClient.client.getItemModelResolver().updateForTopItem(this.itemRenderState, stack, ItemDisplayContext.GUI, world, entity, seed); //? if <1.21.5 - //SaturnClient.client.getItemModelManager().update(itemRenderState, stack, ModelTransformationMode.GUI, false, world, entity, seed); + //SaturnClient.client.getItemModelResolver().updateForTopItem(itemRenderState, stack, ItemDisplayContext.GUI, false, world, entity, seed); - this.matrices.push(); + this.matrices.pushPose(); //? if >=1.21.5 this.matrices.translate((float) (x + 8), (float) (y + 8), (float) (150 + z)); //? if <1.21.5 - //this.matrices.translate(x + 8, y + 8, 150 + (itemRenderState.hasDepth() ? z : 0)); + //this.matrices.translate(x + 8, y + 8, 150 + (itemRenderState.isGui3d() ? z : 0)); try { this.matrices.scale(16.0F, -16.0F, 16.0F); - boolean bl = !this.itemRenderState.isSideLit(); + boolean bl = !this.itemRenderState.usesBlockLight(); if (bl) { this.draw(); - DiffuseLighting.disableGuiDepthLighting(); + Lighting.setupForFlatItems(); } - this.itemRenderState.render(this.matrices, this.vertexConsumers, 15728880, OverlayTexture.DEFAULT_UV); + this.itemRenderState.render(this.matrices, this.vertexConsumers, 15728880, OverlayTexture.NO_OVERLAY); this.draw(); if (bl) { - DiffuseLighting.enableGuiDepthLighting(); + Lighting.setupFor3DItems(); } } catch (Throwable throwable) { - CrashReport crashReport = CrashReport.create(throwable, "Rendering item"); - CrashReportSection crashReportSection = crashReport.addElement("Item being rendered"); - crashReportSection.add("Item Type", () -> String.valueOf(stack.getItem())); - crashReportSection.add("Item Components", () -> String.valueOf(stack.getComponents())); - crashReportSection.add("Item Foil", () -> String.valueOf(stack.hasGlint())); - throw new CrashException(crashReport); + CrashReport crashReport = CrashReport.forThrowable(throwable, "Rendering item"); + CrashReportCategory crashReportSection = crashReport.addCategory("Item being rendered"); + crashReportSection.setDetail("Item Type", () -> String.valueOf(stack.getItem())); + crashReportSection.setDetail("Item Components", () -> String.valueOf(stack.getComponents())); + crashReportSection.setDetail("Item Foil", () -> String.valueOf(stack.hasFoil())); + throw new ReportedException(crashReport); } - this.matrices.pop(); + this.matrices.popPose(); } // ---------------------------- @@ -774,8 +774,8 @@ public class RenderScopeImpl implements RenderScope { // ---------------------------- @Override public void enableScissor(int x1, int y1, int x2, int y2) { - ScreenRect screenRect = new ScreenRect(x1, y1, x2 - x1, y2 - y1) - .transform(matrices.peek().getPositionMatrix()); + ScreenRectangle screenRect = new ScreenRectangle(x1, y1, x2 - x1, y2 - y1) + .transformAxisAligned(matrices.last().pose()); setScissor(scissorStack.push(screenRect)); } @@ -789,15 +789,15 @@ public class RenderScopeImpl implements RenderScope { return scissorStack.containsPoint(x, y); } - private void setScissor(@Nullable ScreenRect rect) { + private void setScissor(@Nullable ScreenRectangle rect) { draw(); if (rect != null) { Window window = SaturnClient.client.getWindow(); - int framebufferHeight = window.getFramebufferHeight(); - double scaleFactor = window.getScaleFactor(); + int framebufferHeight = window.getHeight(); + double scaleFactor = window.getGuiScale(); RenderSystem.enableScissor( - (int) (rect.getLeft() * scaleFactor), - (int) (framebufferHeight - rect.getBottom() * scaleFactor), + (int) (rect.left() * scaleFactor), + (int) (framebufferHeight - rect.bottom() * scaleFactor), Math.max(0, (int) (rect.width() * scaleFactor)), Math.max(0, (int) (rect.height() * scaleFactor))); } else { @@ -806,13 +806,13 @@ public class RenderScopeImpl implements RenderScope { } static class ScissorStack { - private final Deque stack = new ArrayDeque<>(); + private final Deque stack = new ArrayDeque<>(); - public ScreenRect push(ScreenRect p_281812_) { - ScreenRect screenrectangle = this.stack.peekLast(); + public ScreenRectangle push(ScreenRectangle p_281812_) { + ScreenRectangle screenrectangle = this.stack.peekLast(); if (screenrectangle != null) { - ScreenRect screenrectangle1 = Objects.requireNonNullElse(p_281812_.intersection(screenrectangle), - ScreenRect.empty()); + ScreenRectangle screenrectangle1 = Objects.requireNonNullElse(p_281812_.intersection(screenrectangle), + ScreenRectangle.empty()); this.stack.addLast(screenrectangle1); return screenrectangle1; } else { @@ -822,7 +822,7 @@ public class RenderScopeImpl implements RenderScope { } @Nullable - public ScreenRect pop() { + public ScreenRectangle pop() { if (this.stack.isEmpty()) { throw new IllegalStateException("Scissor stack underflow"); } else { @@ -832,7 +832,7 @@ public class RenderScopeImpl implements RenderScope { } public boolean containsPoint(int p_329411_, int p_333404_) { - return this.stack.isEmpty() ? true : this.stack.peek().contains(p_329411_, p_333404_); + return this.stack.isEmpty() ? true : this.stack.peek().containsPoint(p_329411_, p_333404_); } } } diff --git a/src/main/java/org/saturnclient/impl/ui/SaturnScreenFabric.java b/src/main/java/org/saturnclient/impl/ui/SaturnScreenFabric.java index 908ad91..1cf7ee6 100644 --- a/src/main/java/org/saturnclient/impl/ui/SaturnScreenFabric.java +++ b/src/main/java/org/saturnclient/impl/ui/SaturnScreenFabric.java @@ -8,67 +8,67 @@ import org.saturnclient.ui.RenderScope; import org.saturnclient.ui.SaturnScreen; import org.saturnclient.ui.SaturnScreen.ScreenProvider; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; //? if >=1.21.9 -import net.minecraft.client.gui.Click; -import net.minecraft.client.gui.CubeMapRenderer; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.RotatingCubeMapRenderer; -import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.input.MouseButtonEvent; +import net.minecraft.client.renderer.CubeMap; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.PanoramaRenderer; +import net.minecraft.client.gui.screens.Screen; //? if >=1.21.6 { -import net.minecraft.client.texture.CubemapTexture; +import net.minecraft.client.renderer.texture.CubeMapTexture; //?} else { -/*import net.minecraft.client.texture.ResourceTexture; -import net.minecraft.client.texture.TextureManager; +/*import net.minecraft.client.renderer.texture.SimpleTexture; +import net.minecraft.client.renderer.texture.TextureManager; *///?} //? if >=1.21.9 -import net.minecraft.client.input.KeyInput; +import net.minecraft.client.input.KeyEvent; //? if <1.21.6 { -/*import net.minecraft.client.gl.PostEffectProcessor; -import net.minecraft.client.render.DefaultFramebufferSet; -import net.minecraft.client.util.Pool; +/*import net.minecraft.client.renderer.PostChain; +import net.minecraft.client.renderer.LevelTargetBundle; +import com.mojang.blaze3d.resource.CrossFrameResourcePool; *///?} -import net.minecraft.text.Text; -import net.minecraft.util.Identifier; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.Identifier; public class SaturnScreenFabric extends Screen implements ScreenProvider { - protected static final Identifier PANORAMA = Identifier.of("saturnclient", + protected static final Identifier PANORAMA = Identifier.fromNamespaceAndPath("saturnclient", "textures/gui/title/background/panorama"); - protected static final CubeMapRenderer PANORAMA_RENDERER = new CubeMapRenderer(PANORAMA); + protected static final CubeMap PANORAMA_RENDERER = new CubeMap(PANORAMA); - public static final RotatingCubeMapRenderer ROTATING_PANORAMA_RENDERER; + public static final PanoramaRenderer ROTATING_PANORAMA_RENDERER; static { - ROTATING_PANORAMA_RENDERER = new RotatingCubeMapRenderer(PANORAMA_RENDERER); + ROTATING_PANORAMA_RENDERER = new PanoramaRenderer(PANORAMA_RENDERER); } //? if <1.21.6 - //private final Pool pool = new Pool(3); + //private final CrossFrameResourcePool pool = new CrossFrameResourcePool(3); public final SaturnScreen screen; /** Whether the panorama's textures are loaded; it isn't drawn before (e.g. under the splash). */ private static volatile boolean panoramaReady = false; - public static void preload(MinecraftClient client) { + public static void preload(Minecraft client) { //? if >=1.21.6 { // From 1.21.6 CubeMapRenderer draws from one cube map texture made of panorama_0..5.png. // CubeMapRenderer.registerTextures only stores it for the next resource reload, which has // already happened by now, so register it through the overload that loads it right away. - client.getTextureManager().registerTexture(PANORAMA, new CubemapTexture(PANORAMA)); + client.getTextureManager().registerAndLoad(PANORAMA, new CubeMapTexture(PANORAMA)); //?} else { /*TextureManager textureManager = client.getTextureManager(); for (int i = 0; i < 6; i++) { String var10001 = PANORAMA.getPath(); Identifier tex = PANORAMA.withPath(var10001 + "_" + i + ".png"); - ResourceTexture resourceTexture = new ResourceTexture(tex); - textureManager.registerTexture(tex, resourceTexture); + SimpleTexture resourceTexture = new SimpleTexture(tex); + textureManager.registerAndLoad(tex, resourceTexture); } *///?} panoramaReady = true; } public SaturnScreenFabric(SaturnScreen screen) { - super(Text.literal(screen.title)); + super(Component.literal(screen.title)); screen.provider = this; this.screen = screen; } @@ -81,7 +81,7 @@ public class SaturnScreenFabric extends Screen implements ScreenProvider { //? if <1.21.6 //@SuppressWarnings("deprecation") @Override - public void render(DrawContext context, int mouseX, int mouseY, float delta) { + public void render(GuiGraphics context, int mouseX, int mouseY, float delta) { if (screen.start == null) { screen.start = Instant.now(); } @@ -100,22 +100,22 @@ public class SaturnScreenFabric extends Screen implements ScreenProvider { // Glass is blurred from the game as it is before this screen blurs it. if (Config.usesGlass()) { - context.draw(); + context.flush(); GlassRenderer.saveBackground(); } float radius = screen.getBackgroundBlur(); - PostEffectProcessor postEffectProcessor = radius < 1 ? null : this.client.getShaderLoader().loadPostEffect( - Identifier.ofVanilla("blur"), - DefaultFramebufferSet.MAIN_ONLY); + PostChain postEffectProcessor = radius < 1 ? null : this.minecraft.getShaderManager().getPostChain( + Identifier.withDefaultNamespace("blur"), + LevelTargetBundle.MAIN_TARGETS); if (postEffectProcessor != null) { //? if >=1.21.5 - postEffectProcessor.render(this.client.getFramebuffer(), this.pool, pass -> pass.setUniform("Radius", radius)); + postEffectProcessor.process(this.minecraft.getMainRenderTarget(), this.pool, pass -> pass.setUniform("Radius", radius)); //? if <1.21.5 - //postEffectProcessor.setUniforms("Radius", radius); + //postEffectProcessor.setUniform("Radius", radius); //? if <1.21.5 - //postEffectProcessor.render(this.client.getFramebuffer(), this.pool); + //postEffectProcessor.process(this.minecraft.getMainRenderTarget(), this.pool); } *///?} @@ -128,7 +128,7 @@ public class SaturnScreenFabric extends Screen implements ScreenProvider { // Vanilla's background would cover Saturn's panorama, and blurs by the vanilla setting. The // strength of this blur comes from GameRendererMixin, which gives Saturn's setting instead. @Override - public void renderBackground(DrawContext context, int mouseX, int mouseY, float delta) { + public void renderBackground(GuiGraphics context, int mouseX, int mouseY, float delta) { // The panorama renderer has no opacity (and takes no delta) from 1.21.6, so it's drawn fully // opaque. if (isShowingPanorama()) { @@ -136,24 +136,24 @@ public class SaturnScreenFabric extends Screen implements ScreenProvider { } if (screen.getBackgroundBlur() >= 1) { - context.applyBlur(); + context.blurBeforeThisStratum(); } - if (client.world != null) { - renderDarkening(context); + if (minecraft.level != null) { + renderMenuBackground(context); } } //?} /** Whether Saturn's panorama is behind the screen: outside a world, once it's loaded. */ private boolean isShowingPanorama() { - return panoramaReady && client.world == null && client.getCurrentServerEntry() == null; + return panoramaReady && minecraft.level == null && minecraft.getCurrentServer() == null; } // 1.21.9 moved mouse and key events to Click and KeyInput. //? if >=1.21.9 { @Override - public boolean mouseClicked(Click click, boolean doubled) { + public boolean mouseClicked(MouseButtonEvent click, boolean doubled) { if (screen.mouseClicked(click.x(), click.y(), click.button())) { return true; } @@ -162,7 +162,7 @@ public class SaturnScreenFabric extends Screen implements ScreenProvider { } @Override - public boolean mouseDragged(Click click, double offsetX, double offsetY) { + public boolean mouseDragged(MouseButtonEvent click, double offsetX, double offsetY) { // offsetX and offsetY are the drag deltas, as mouseDragged's deltaX and deltaY were before 1.21.9. if (screen.mouseDragged(click.x(), click.y(), click.button(), offsetX, offsetY)) { return true; @@ -172,7 +172,7 @@ public class SaturnScreenFabric extends Screen implements ScreenProvider { } @Override - public boolean mouseReleased(Click click) { + public boolean mouseReleased(MouseButtonEvent click) { if (screen.mouseReleased(click.x(), click.y(), click.button())) { return true; } @@ -215,8 +215,8 @@ public class SaturnScreenFabric extends Screen implements ScreenProvider { //? if >=1.21.9 { @Override - public boolean keyPressed(KeyInput input) { - if (screen.keyPressed(input.getKeycode(), input.scancode(), input.modifiers())) { + public boolean keyPressed(KeyEvent input) { + if (screen.keyPressed(input.input(), input.scancode(), input.modifiers())) { return true; } @@ -240,16 +240,22 @@ public class SaturnScreenFabric extends Screen implements ScreenProvider { } //?} else { /*@Override - public void resize(MinecraftClient client, int width, int height) { + public void resize(Minecraft client, int width, int height) { screen.resize(width, height); super.resize(client, width, height); } *///?} @Override - public void close() { + public void onClose() { this.screen.onClose(); - super.close(); + super.onClose(); + } + + // ScreenProvider's close, separate from the vanilla onClose above. + @Override + public void close() { + onClose(); } @Override diff --git a/src/main/java/org/saturnclient/saturnclient/SaturnClient.java b/src/main/java/org/saturnclient/saturnclient/SaturnClient.java index c44e106..52415b2 100644 --- a/src/main/java/org/saturnclient/saturnclient/SaturnClient.java +++ b/src/main/java/org/saturnclient/saturnclient/SaturnClient.java @@ -3,7 +3,7 @@ package org.saturnclient.saturnclient; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; -import net.minecraft.client.MinecraftClient; +import net.minecraft.client.Minecraft; import org.saturnclient.client.ServiceClient; import org.saturnclient.cosmetics.Emotes; @@ -29,12 +29,12 @@ public class SaturnClient implements ModInitializer { public static final String MOD_ID = "saturnclient"; public static final Logger LOGGER = LoggerFactory.getLogger(MOD_ID); - public static MinecraftClient client; + public static Minecraft client; @Override public void onInitialize() { LOGGER.info("Initializing " + MOD_ID); - client = MinecraftClient.getInstance(); + client = Minecraft.getInstance(); Providers.saturn = new SaturnProviderImpl(); Providers.refConstructor = new RefConstructorImpl(); diff --git a/src/main/java/org/saturnclient/saturnclient/event/KeyInputHandler.java b/src/main/java/org/saturnclient/saturnclient/event/KeyInputHandler.java index 5f7d9d7..c54d853 100644 --- a/src/main/java/org/saturnclient/saturnclient/event/KeyInputHandler.java +++ b/src/main/java/org/saturnclient/saturnclient/event/KeyInputHandler.java @@ -2,10 +2,10 @@ package org.saturnclient.saturnclient.event; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper; -import net.minecraft.client.option.KeyBinding; -import net.minecraft.client.util.InputUtil; +import net.minecraft.client.KeyMapping; +import com.mojang.blaze3d.platform.InputConstants; //? if >=1.21.9 -import net.minecraft.util.Identifier; +import net.minecraft.resources.Identifier; import org.saturnclient.config.Config; import org.saturnclient.saturnclient.SaturnClient; @@ -24,31 +24,31 @@ import org.lwjgl.glfw.GLFW; */ public class KeyInputHandler { //? if >=1.21.9 { - private static final Identifier KEY_CATEGORY = Identifier.of("saturnclient", "key.category.saturnclient"); + private static final Identifier KEY_CATEGORY = Identifier.fromNamespaceAndPath("saturnclient", "key.category.saturnclient"); //?} else //private static final String KEY_CATEGORY = "key.category.saturnclient"; private static final String MAIN_MENU_KEY_ID = "key.saturnclient.main_menu"; private static final int DEFAULT_MENU_KEY = GLFW.GLFW_KEY_RIGHT_SHIFT; - private static KeyBinding mainMenuKeyBinding; + private static KeyMapping mainMenuKeyBinding; public static void register() { //? if >=1.21.9 { mainMenuKeyBinding = KeyBindingHelper.registerKeyBinding( - new KeyBinding( + new KeyMapping( MAIN_MENU_KEY_ID, DEFAULT_MENU_KEY, - KeyBinding.Category.create(KEY_CATEGORY))); + KeyMapping.Category.register(KEY_CATEGORY))); //?} else { - /*mainMenuKeyBinding = KeyBindingHelper.registerKeyBinding(new KeyBinding( + /*mainMenuKeyBinding = KeyBindingHelper.registerKeyBinding(new KeyMapping( MAIN_MENU_KEY_ID, - InputUtil.Type.KEYSYM, + InputConstants.Type.KEYSYM, DEFAULT_MENU_KEY, KEY_CATEGORY)); *///?} // Register the event handler for the main menu key ClientTickEvents.END_CLIENT_TICK.register(client -> { - if (mainMenuKeyBinding.wasPressed()) { + if (mainMenuKeyBinding.consumeClick()) { Providers.saturn.getClient().setScreen(new ShiftMenu()); } @@ -57,21 +57,21 @@ public class KeyInputHandler { // still down and no screen is open by then. if (Config.openEmoteWheel.wasKeyPressed() //? if >=1.21.9 { - && !InputUtil.isKeyPressed(client.getWindow(), GLFW.GLFW_KEY_F3)) { + && !InputConstants.isKeyDown(client.getWindow(), GLFW.GLFW_KEY_F3)) { //?} else - //&& !InputUtil.isKeyPressed(client.getWindow().getHandle(), GLFW.GLFW_KEY_F3)) { - if (client.currentScreen == null) { + //&& !InputConstants.isKeyDown(client.getWindow().getWindow(), GLFW.GLFW_KEY_F3)) { + if (client.screen == null) { Providers.saturn.getClient().setScreen(new EmoteWheel()); - } else if (client.currentScreen instanceof SaturnScreenFabric saturnScreen + } else if (client.screen instanceof SaturnScreenFabric saturnScreen && saturnScreen.screen instanceof EmoteWheel) { - saturnScreen.close(); + saturnScreen.onClose(); } } // Sneaking cancels your own emote, for everyone. - if (SaturnClient.client.player != null && SaturnClient.client.player.isSneaking() - && Emotes.playing(SaturnClient.client.player.getUuid()).isPresent()) { - Emotes.stop(SaturnClient.client.player.getUuid()); + if (SaturnClient.client.player != null && SaturnClient.client.player.isShiftKeyDown() + && Emotes.playing(SaturnClient.client.player.getUUID()).isPresent()) { + Emotes.stop(SaturnClient.client.player.getUUID()); ServiceClient.emote(""); } }); diff --git a/src/main/java/org/saturnclient/saturnclient/mixin/DrawContextAccessor.java b/src/main/java/org/saturnclient/saturnclient/mixin/DrawContextAccessor.java index d9f4349..2c777b2 100644 --- a/src/main/java/org/saturnclient/saturnclient/mixin/DrawContextAccessor.java +++ b/src/main/java/org/saturnclient/saturnclient/mixin/DrawContextAccessor.java @@ -1,20 +1,20 @@ package org.saturnclient.saturnclient.mixin; -import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.GuiGraphics; //? if >=1.21.6 { import net.minecraft.client.gui.render.state.GuiRenderState; //?} else -//import net.minecraft.client.render.VertexConsumerProvider; +//import net.minecraft.client.renderer.MultiBufferSource; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; -@Mixin(DrawContext.class) +@Mixin(GuiGraphics.class) public interface DrawContextAccessor { //? if >=1.21.6 { - @Accessor("state") + @Accessor("guiRenderState") GuiRenderState getState(); //?} else { - /*@Accessor("vertexConsumers") - VertexConsumerProvider.Immediate getVertexConsumers(); + /*@Accessor("bufferSource") + MultiBufferSource.BufferSource getVertexConsumers(); *///?} } diff --git a/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java b/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java index de848a3..57e1fdb 100644 --- a/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java +++ b/src/main/java/org/saturnclient/saturnclient/mixin/PlayerEntityRendererMixin.java @@ -1,20 +1,23 @@ package org.saturnclient.saturnclient.mixin; //? if >=1.21.9 { -import net.minecraft.client.network.ClientPlayerLikeEntity; -import net.minecraft.entity.PlayerLikeEntity; +import net.minecraft.client.entity.ClientAvatarEntity; +import net.minecraft.world.entity.Avatar; //?} else -//import net.minecraft.client.network.AbstractClientPlayerEntity; -import net.minecraft.client.render.entity.EntityRendererFactory; -import net.minecraft.client.render.entity.LivingEntityRenderer; -import net.minecraft.client.render.entity.PlayerEntityRenderer; -import net.minecraft.client.render.entity.model.PlayerEntityModel; -import net.minecraft.client.render.entity.state.PlayerEntityRenderState; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.text.MutableText; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; +//import net.minecraft.client.player.AbstractClientPlayer; +import net.minecraft.client.renderer.entity.EntityRendererProvider; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.client.renderer.entity.player.AvatarRenderer; +//? if >=1.21.11 { +import net.minecraft.client.model.player.PlayerModel; +//?} else +//import net.minecraft.client.model.PlayerModel; +import net.minecraft.client.renderer.entity.state.AvatarRenderState; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Component; +import net.minecraft.ChatFormatting; import org.saturnclient.client.player.Roles; import org.saturnclient.client.player.SaturnPlayer; @@ -26,54 +29,54 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(PlayerEntityRenderer.class) +@Mixin(AvatarRenderer.class) public abstract class PlayerEntityRendererMixin - extends LivingEntityRenderer { + extends LivingEntityRenderer { protected PlayerEntityRendererMixin() { super(null, null, 0.0f); } @Inject(method = "", at = @At("TAIL")) - private void addCustomFeatureRenderer(EntityRendererFactory.Context ctx, boolean slim, CallbackInfo ci) { - this.addFeature(new HatFeatureRenderer(this)); - this.addFeature(new CloakFeatureRenderer(this, ctx.getEquipmentModelLoader())); + private void addCustomFeatureRenderer(EntityRendererProvider.Context ctx, boolean slim, CallbackInfo ci) { + this.addLayer(new HatFeatureRenderer(this)); + this.addLayer(new CloakFeatureRenderer(this, ctx.getEquipmentAssets())); } // Adds the role icon to the player's name, and stores the SaturnPlayer in the render state for the // cloak and hat (Fabric API only has render state data from 1.21.8). //? if >=1.21.9 { - @Inject(method = "updateRenderState", at = @At("TAIL")) - public void updateRenderState( - A entity, PlayerEntityRenderState state, float f, CallbackInfo ci) { + @Inject(method = "extractRenderState", at = @At("TAIL")) + public void updateRenderState( + A entity, AvatarRenderState state, float f, CallbackInfo ci) { saturn$applyPlayer(entity, state); } //?} else { - /*@Inject(method = "updateRenderState", at = @At("TAIL")) + /*@Inject(method = "extractRenderState", at = @At("TAIL")) public void updateRenderState( - AbstractClientPlayerEntity entity, PlayerEntityRenderState state, float f, CallbackInfo ci) { + AbstractClientPlayer entity, AvatarRenderState state, float f, CallbackInfo ci) { saturn$applyPlayer(entity, state); } *///?} - private void saturn$applyPlayer(Entity entity, PlayerEntityRenderState state) { + private void saturn$applyPlayer(Entity entity, AvatarRenderState state) { if (entity == null) { return; } - SaturnPlayer player = SaturnPlayer.get(entity.getUuid()); + SaturnPlayer player = SaturnPlayer.get(entity.getUUID()); //? if >=1.21.8 state.setData(SaturnRenderState.saturnDataKey, player); - if (player != null && state.displayName != null) { - MutableText iconText = Text.literal(Roles.getSaturnIndicator()) - .styled(style -> style.withColor(Roles.getIconColor(player.uuid))); + if (player != null && state.nameTag != null) { + MutableComponent iconText = Component.literal(Roles.getSaturnIndicator()) + .withStyle(style -> style.withColor(Roles.getIconColor(player.uuid))); - state.displayName = Text.empty() + state.nameTag = Component.empty() .append(iconText.copy()) - .append(Text.empty().formatted(Formatting.RESET)) - .append(state.displayName.copy()); + .append(Component.empty().withStyle(ChatFormatting.RESET)) + .append(state.nameTag.copy()); } } } \ No newline at end of file diff --git a/src/main/java/org/saturnclient/saturnclient/mixin/SetScreenMixin.java b/src/main/java/org/saturnclient/saturnclient/mixin/SetScreenMixin.java index 061d641..e5e5624 100644 --- a/src/main/java/org/saturnclient/saturnclient/mixin/SetScreenMixin.java +++ b/src/main/java/org/saturnclient/saturnclient/mixin/SetScreenMixin.java @@ -7,18 +7,18 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyVariable; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.TitleScreen; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.TitleScreen; -@Mixin(MinecraftClient.class) +@Mixin(Minecraft.class) public class SetScreenMixin { @ModifyVariable(method = "setScreen", at = @At("HEAD"), argsOnly = true) private Screen replaceTitleScreen(Screen screen) { if (Config.saturnTitleScreen.value) { if (screen instanceof TitleScreen) return new SaturnScreenFabric(new TitleMenu()); - if (screen == null && ((MinecraftClient) (Object) this).world == null) + if (screen == null && ((Minecraft) (Object) this).level == null) return new SaturnScreenFabric(new TitleMenu()); } diff --git a/src/main/java/org/saturnclient/saturnclient/mixin/SplashOverlayMixin.java b/src/main/java/org/saturnclient/saturnclient/mixin/SplashOverlayMixin.java index 9eea165..9772149 100644 --- a/src/main/java/org/saturnclient/saturnclient/mixin/SplashOverlayMixin.java +++ b/src/main/java/org/saturnclient/saturnclient/mixin/SplashOverlayMixin.java @@ -12,67 +12,70 @@ import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Final; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.SplashOverlay; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.LoadingOverlay; //? if >=1.21.11 -import net.minecraft.client.util.Window; -import net.minecraft.resource.ResourceReload; +import com.mojang.blaze3d.platform.Window; +import net.minecraft.server.packs.resources.ReloadInstance; +//? if >=1.21.11 { import net.minecraft.util.Util; -import net.minecraft.util.math.MathHelper; +//?} else +//import net.minecraft.Util; +import net.minecraft.util.Mth; -@Mixin(SplashOverlay.class) +@Mixin(LoadingOverlay.class) public abstract class SplashOverlayMixin { @Shadow - private MinecraftClient client; + private Minecraft minecraft; @Shadow - private ResourceReload reload; + private ReloadInstance reload; @Shadow - private long reloadCompleteTime; + private long fadeOutStart; @Shadow - private long reloadStartTime; + private long fadeInStart; @Shadow @Final - private boolean reloading; + private boolean fadeIn; @Shadow @Final - private Consumer> exceptionHandler; + private Consumer> onFinish; @Shadow - private float progress; + private float currentProgress; /** * @author SaturnClient * @reason Replace vanilla splash rendering completely but keep exit logic */ @Overwrite - public void render(DrawContext context, int mouseX, int mouseY, float delta) { - int screenWidth = context.getScaledWindowWidth(); - int screenHeight = context.getScaledWindowHeight(); - long currentTime = Util.getMeasuringTimeMs(); + public void render(GuiGraphics context, int mouseX, int mouseY, float delta) { + int screenWidth = context.guiWidth(); + int screenHeight = context.guiHeight(); + long currentTime = Util.getMillis(); // Initialize reload start time if not set - if (reloadStartTime == -1L) { - reloadStartTime = currentTime; + if (fadeInStart == -1L) { + fadeInStart = currentTime; } // Compute fade-out progress after reload completes - float fadeOutProgress = reloadCompleteTime > -1L - ? (float) (currentTime - reloadCompleteTime) / 1000f + float fadeOutProgress = fadeOutStart > -1L + ? (float) (currentTime - fadeOutStart) / 1000f : -1f; int alpha = fadeOutProgress >= 0f - ? MathHelper.ceil((1.0f - MathHelper.clamp(fadeOutProgress - 1f, 0f, 1f)) * 255f) + ? Mth.ceil((1.0f - Mth.clamp(fadeOutProgress - 1f, 0f, 1f)) * 255f) : 255; // Compute fade-in progress while reloading - float reloadProgress = reloadStartTime > -1L - ? (float) (currentTime - reloadStartTime) / 500f + float reloadProgress = fadeInStart > -1L + ? (float) (currentTime - fadeInStart) / 500f : -1f; // Get render scope for better UI @@ -84,7 +87,7 @@ public abstract class SplashOverlayMixin { int overlayAlpha = computeOverlayAlpha(fadeOutProgress - 1f); scope.drawTexture(Textures.SPLASH, 0, 0, 0, 0, screenWidth, screenHeight, Theme.withAlpha(overlayAlpha, 0xFFFFFFFF)); - } else if (reloading) { + } else if (fadeIn) { if (reloadProgress < 1.0F) { renderCurrentScreen(context, mouseX, mouseY, delta); } @@ -95,8 +98,8 @@ public abstract class SplashOverlayMixin { Theme.withAlpha(alpha, 0xFFFFFFFF)); } - float u = this.reload.getProgress(); - this.progress = MathHelper.clamp(this.progress * 0.95F + u * 0.050000012F, 0.0F, 1.0F); + float u = this.reload.getActualProgress(); + this.currentProgress = Mth.clamp(this.currentProgress * 0.95F + u * 0.050000012F, 0.0F, 1.0F); // Draw central logo drawLogo(scope, screenWidth, screenHeight, alpha); @@ -104,16 +107,16 @@ public abstract class SplashOverlayMixin { // Remove overlay after fade-out completes if (fadeOutProgress >= 2.0F) { - client.setOverlay(null); + minecraft.setOverlay(null); } // Handle reload completion and exceptions handleReloadCompletion(context); } - private void renderCurrentScreen(DrawContext context, int mouseX, int mouseY, float delta) { - if (client.currentScreen != null) { - client.currentScreen.render(context, mouseX, mouseY, delta); + private void renderCurrentScreen(GuiGraphics context, int mouseX, int mouseY, float delta) { + if (minecraft.screen != null) { + minecraft.screen.render(context, mouseX, mouseY, delta); } } @@ -123,15 +126,17 @@ public abstract class SplashOverlayMixin { Theme.withAlpha(alpha, 0xFFFFFFFF)); } - private void renderProgressBar(RenderScope scope, DrawContext context, int screenWidth, int screenHeight, + private void renderProgressBar(RenderScope scope, GuiGraphics context, int screenWidth, int screenHeight, int alpha) { int progressY = ((screenHeight - 5) / 2) + 25; - //? if >=1.21.9 { - context.drawStrokedRectangle((screenWidth - 120) / 2, progressY, 120, 5, Theme.withAlpha(alpha, 0xFFFFFFFF)); - //?} else - //context.drawBorder((screenWidth - 120) / 2, progressY, 120, 5, Theme.withAlpha(alpha, 0xFFFFFFFF)); + //? if >=1.21.11 { + context.renderOutline((screenWidth - 120) / 2, progressY, 120, 5, Theme.withAlpha(alpha, 0xFFFFFFFF)); + //?} else if >=1.21.9 { + /*context.submitOutline((screenWidth - 120) / 2, progressY, 120, 5, Theme.withAlpha(alpha, 0xFFFFFFFF)); + *///?} else + //context.renderOutline((screenWidth - 120) / 2, progressY, 120, 5, Theme.withAlpha(alpha, 0xFFFFFFFF)); - int progressWidth = Math.min((int) (progress * 120), 120); + int progressWidth = Math.min((int) (currentProgress * 120), 120); int progressX = (screenWidth - 120) / 2; context.fill(progressX, progressY, progressX + progressWidth, progressY + 5, @@ -140,31 +145,31 @@ public abstract class SplashOverlayMixin { /** Compute overlay alpha from fade progress */ private int computeOverlayAlpha(float progress) { - return MathHelper.ceil((1.0F - MathHelper.clamp(progress, 0.0F, 1.0F)) * 255.0F); + return Mth.ceil((1.0F - Mth.clamp(progress, 0.0F, 1.0F)) * 255.0F); } /** Handle reload completion logic */ - private void handleReloadCompletion(DrawContext context) { - float reloadProgress = reloadStartTime > -1L ? (float) (Util.getMeasuringTimeMs() - reloadStartTime) / 500f + private void handleReloadCompletion(GuiGraphics context) { + float reloadProgress = fadeInStart > -1L ? (float) (Util.getMillis() - fadeInStart) / 500f : -1f; - if (reloadCompleteTime == -1L && reload.isComplete() && (!reloading || reloadProgress >= 2.0F)) { + if (fadeOutStart == -1L && reload.isDone() && (!fadeIn || reloadProgress >= 2.0F)) { try { - reload.throwException(); - exceptionHandler.accept(Optional.empty()); + reload.checkExceptions(); + onFinish.accept(Optional.empty()); } catch (Throwable ex) { - exceptionHandler.accept(Optional.of(ex)); + onFinish.accept(Optional.of(ex)); } - reloadCompleteTime = Util.getMeasuringTimeMs(); + fadeOutStart = Util.getMillis(); //? if >=1.21.11 - Window window = client.getWindow(); - if (client.currentScreen != null) { + Window window = minecraft.getWindow(); + if (minecraft.screen != null) { //? if >=1.21.11 { - client.currentScreen.init(window.getScaledWidth(), window.getScaledHeight()); + minecraft.screen.init(window.getGuiScaledWidth(), window.getGuiScaledHeight()); //?} else - //client.currentScreen.init(client, context.getScaledWindowWidth(), context.getScaledWindowHeight()); + //minecraft.screen.init(minecraft, context.guiWidth(), context.guiHeight()); } } } diff --git a/src/main/java/org/saturnclient/saturnclient/mixin/TabListMixin.java b/src/main/java/org/saturnclient/saturnclient/mixin/TabListMixin.java index b76385b..4b7a778 100644 --- a/src/main/java/org/saturnclient/saturnclient/mixin/TabListMixin.java +++ b/src/main/java/org/saturnclient/saturnclient/mixin/TabListMixin.java @@ -1,8 +1,8 @@ package org.saturnclient.saturnclient.mixin; -import net.minecraft.client.network.PlayerListEntry; -import net.minecraft.scoreboard.Team; -import net.minecraft.text.Text; +import net.minecraft.client.multiplayer.PlayerInfo; +import net.minecraft.world.scores.PlayerTeam; +import net.minecraft.network.chat.Component; import java.util.UUID; @@ -15,7 +15,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.mojang.authlib.GameProfile; -@Mixin(PlayerListEntry.class) +@Mixin(PlayerInfo.class) public abstract class TabListMixin { /** @@ -23,9 +23,9 @@ public abstract class TabListMixin { * Saturn Client, keeping any name, rank prefix or team formatting the server * set. */ - @Inject(method = "getDisplayName", at = @At("RETURN"), cancellable = true) - private void saturn$addSaturnIcon(CallbackInfoReturnable cir) { - PlayerListEntry entry = (PlayerListEntry) (Object) this; + @Inject(method = "getTabListDisplayName", at = @At("RETURN"), cancellable = true) + private void saturn$addSaturnIcon(CallbackInfoReturnable cir) { + PlayerInfo entry = (PlayerInfo) (Object) this; GameProfile profile = entry.getProfile(); //? if >=1.21.9 { String name = profile.name(); @@ -39,16 +39,16 @@ public abstract class TabListMixin { return; } - Text displayName = cir.getReturnValue(); + Component displayName = cir.getReturnValue(); // With no server-set name, vanilla shows the team-decorated profile name. if (displayName == null) { - displayName = Team.decorateName(entry.getScoreboardTeam(), Text.literal(name)); + displayName = PlayerTeam.formatNameForTeam(entry.getTeam(), Component.literal(name)); } - cir.setReturnValue(Text.empty() - .append(Text.literal(Roles.getSaturnIndicator()) - .styled(style -> style.withColor(Roles.getIconColor(uuid)))) + cir.setReturnValue(Component.empty() + .append(Component.literal(Roles.getSaturnIndicator()) + .withStyle(style -> style.withColor(Roles.getIconColor(uuid)))) .append(displayName)); } } diff --git a/src/main/java/org/saturnclient/saturnclient/mixin/WhoAmI.java b/src/main/java/org/saturnclient/saturnclient/mixin/WhoAmI.java index 041e0cf..c6d013c 100644 --- a/src/main/java/org/saturnclient/saturnclient/mixin/WhoAmI.java +++ b/src/main/java/org/saturnclient/saturnclient/mixin/WhoAmI.java @@ -12,14 +12,14 @@ package org.saturnclient.saturnclient.mixin; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import net.minecraft.client.render.entity.LivingEntityRenderer; -import net.minecraft.entity.Entity; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraft.world.entity.Entity; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @Mixin(LivingEntityRenderer.class) public class WhoAmI { - @ModifyExpressionValue(method = "hasLabel(Lnet/minecraft/entity/LivingEntity;D)Z", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;getCameraEntity()Lnet/minecraft/entity/Entity;")) + @ModifyExpressionValue(method = "shouldShowName(Lnet/minecraft/world/entity/LivingEntity;D)Z", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;getCameraEntity()Lnet/minecraft/world/entity/Entity;")) public Entity obfuscateCameraEntity(Entity original) { // hasLabel checks if the rendered entity is equal to the camera entity (aka our // player), diff --git a/stonecutter.gradle.kts b/stonecutter.gradle.kts index ba6ec10..98b6560 100644 --- a/stonecutter.gradle.kts +++ b/stonecutter.gradle.kts @@ -6,6 +6,20 @@ plugins { // "Reset active project" before committing. stonecutter active "1.21.11" +// src/ uses the newest Mojang names. These classes were renamed in the versions given, so Stonecutter +// swaps in the older names when it processes an older version. +stonecutter parameters { + for ((since, old, new) in listOf( + Triple("1.21.11", "ResourceLocation", "Identifier"), + Triple("1.21.9", "PlayerRenderer", "AvatarRenderer"), + Triple("1.21.9", "PlayerRenderState", "AvatarRenderState"), + )) { + replacements.regex(eval(current.version, ">=$since")) { + replace("\\b$old\\b", new, "\\b$new\\b", old) + } + } +} + subprojects { apply(plugin = "java") diff --git a/versions/1.21.10/gradle.properties b/versions/1.21.10/gradle.properties index d28ea2c..69e6fc1 100644 --- a/versions/1.21.10/gradle.properties +++ b/versions/1.21.10/gradle.properties @@ -8,7 +8,6 @@ org.gradle.configuration-cache=false # Fabric Properties # check these on https://fabricmc.net/develop minecraft_version=1.21.10 -yarn_mappings=1.21.10+build.3 loader_version=0.19.5 fabric_api_version=0.138.4+1.21.10 diff --git a/versions/1.21.11/gradle.properties b/versions/1.21.11/gradle.properties index 71eb7fa..d58c352 100644 --- a/versions/1.21.11/gradle.properties +++ b/versions/1.21.11/gradle.properties @@ -8,7 +8,6 @@ org.gradle.configuration-cache=false # Fabric Properties # check these on https://fabricmc.net/develop minecraft_version=1.21.11 -yarn_mappings=1.21.11+build.4 loader_version=0.19.5 fabric_api_version=0.141.3+1.21.11 diff --git a/versions/1.21.4/gradle.properties b/versions/1.21.4/gradle.properties index f8fcf1c..b7f7611 100644 --- a/versions/1.21.4/gradle.properties +++ b/versions/1.21.4/gradle.properties @@ -8,7 +8,6 @@ org.gradle.configuration-cache=false # Fabric Properties # check these on https://fabricmc.net/develop minecraft_version=1.21.4 -yarn_mappings=1.21.4+build.8 loader_version=0.19.5 # Mod Properties diff --git a/versions/1.21.5/gradle.properties b/versions/1.21.5/gradle.properties index 916acd9..2f014e9 100644 --- a/versions/1.21.5/gradle.properties +++ b/versions/1.21.5/gradle.properties @@ -8,7 +8,6 @@ org.gradle.configuration-cache=false # Fabric Properties # check these on https://fabricmc.net/develop minecraft_version=1.21.5 -yarn_mappings=1.21.5+build.1 loader_version=0.19.5 fabric_api_version=0.128.2+1.21.5 diff --git a/versions/1.21.6/gradle.properties b/versions/1.21.6/gradle.properties index 8212ab5..c055781 100644 --- a/versions/1.21.6/gradle.properties +++ b/versions/1.21.6/gradle.properties @@ -8,7 +8,6 @@ org.gradle.configuration-cache=false # Fabric Properties # check these on https://fabricmc.net/develop minecraft_version=1.21.6 -yarn_mappings=1.21.6+build.1 loader_version=0.19.5 fabric_api_version=0.128.2+1.21.6 diff --git a/versions/1.21.7/gradle.properties b/versions/1.21.7/gradle.properties index 8241709..a38d864 100644 --- a/versions/1.21.7/gradle.properties +++ b/versions/1.21.7/gradle.properties @@ -8,7 +8,6 @@ org.gradle.configuration-cache=false # Fabric Properties # check these on https://fabricmc.net/develop minecraft_version=1.21.7 -yarn_mappings=1.21.7+build.8 loader_version=0.19.5 fabric_api_version=0.129.0+1.21.7 diff --git a/versions/1.21.8/gradle.properties b/versions/1.21.8/gradle.properties index 3f6820a..3ad7b00 100644 --- a/versions/1.21.8/gradle.properties +++ b/versions/1.21.8/gradle.properties @@ -8,7 +8,6 @@ org.gradle.configuration-cache=false # Fabric Properties # check these on https://fabricmc.net/develop minecraft_version=1.21.8 -yarn_mappings=1.21.8+build.1 loader_version=0.19.5 fabric_api_version=0.136.1+1.21.8 diff --git a/versions/1.21.9/gradle.properties b/versions/1.21.9/gradle.properties index b24c8f4..4bf17c2 100644 --- a/versions/1.21.9/gradle.properties +++ b/versions/1.21.9/gradle.properties @@ -8,7 +8,6 @@ org.gradle.configuration-cache=false # Fabric Properties # check these on https://fabricmc.net/develop minecraft_version=1.21.9 -yarn_mappings=1.21.9+build.1 loader_version=0.19.5 fabric_api_version=0.134.1+1.21.9