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