From 29481bc123ff3ce6416d8a4359d1a2c322cb2b83 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Mon, 20 May 2024 22:06:25 -0500 Subject: [PATCH] Fix 1.20.6 config page and config button --- .../1_20_2.distanthorizons.accesswidener | 3 - .../1_20_6.distanthorizons.accesswidener | 46 +++++++ .../mixins/client/MixinOptionsScreen.java | 112 +++++++++++------- versionProperties/1.20.6.properties | 2 +- 4 files changed, 113 insertions(+), 50 deletions(-) create mode 100644 common/src/main/resources/1_20_6.distanthorizons.accesswidener diff --git a/common/src/main/resources/1_20_2.distanthorizons.accesswidener b/common/src/main/resources/1_20_2.distanthorizons.accesswidener index a267d98a3..c793fab68 100644 --- a/common/src/main/resources/1_20_2.distanthorizons.accesswidener +++ b/common/src/main/resources/1_20_2.distanthorizons.accesswidener @@ -37,6 +37,3 @@ accessible field net/minecraft/client/gui/components/AbstractButton SPRITES Lnet accessible field net/minecraft/util/ThreadingDetector lock Ljava/util/concurrent/Semaphore; mutable field net/minecraft/util/ThreadingDetector lock Ljava/util/concurrent/Semaphore; accessible field net/minecraft/client/gui/components/AbstractSelectionList scrollAmount D # Hack to bypass vanilla's setScrollAmount's clamp - -# TODO add a separate 1.20.6 Access widner file, this is only present in 1.20.6 -accessible field net/minecraft/client/gui/screens/OptionsScreen layout Lnet/minecraft/client/gui/layouts/HeaderAndFooterLayout; diff --git a/common/src/main/resources/1_20_6.distanthorizons.accesswidener b/common/src/main/resources/1_20_6.distanthorizons.accesswidener new file mode 100644 index 000000000..427617544 --- /dev/null +++ b/common/src/main/resources/1_20_6.distanthorizons.accesswidener @@ -0,0 +1,46 @@ +accessWidener v1 named + +# used when determining where to save files to +accessible field net/minecraft/world/level/storage/DimensionDataStorage dataFolder Ljava/io/File; + +# used when rendering +accessible method net/minecraft/client/renderer/GameRenderer getFov (Lnet/minecraft/client/Camera;FZ)D + +# used for grabbing vanilla rendered chunks +accessible field net/minecraft/client/renderer/LevelRenderer visibleSections Lit/unimi/dsi/fastutil/objects/ObjectArrayList; + +#accessible method net/minecraft/client/renderer/LevelRenderer renderSectionLayer (Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V + +# world generation +# accessible method net/minecraft/world/level/lighting/LayerLightEngine queueSectionData (JLnet/minecraft/world/level/chunk/DataLayer;Z)V +accessible field net/minecraft/world/level/chunk/LevelChunk loaded Z +accessible field net/minecraft/world/level/lighting/LightEngine storage Lnet/minecraft/world/level/lighting/LayerLightSectionStorage; +accessible method net/minecraft/world/level/lighting/LayerLightSectionStorage lightOnInSection (J)Z + +# lod generation from save file +accessible field net/minecraft/world/level/chunk/storage/ChunkStorage worker Lnet/minecraft/world/level/chunk/storage/IOWorker; +accessible field net/minecraft/world/level/chunk/storage/IOWorker storage Lnet/minecraft/world/level/chunk/storage/RegionFileStorage; +accessible field net/minecraft/world/level/chunk/storage/RegionFileStorage regionCache Lit/unimi/dsi/fastutil/longs/Long2ObjectLinkedOpenHashMap; +accessible field net/minecraft/world/level/chunk/storage/RegionFileStorage folder Ljava/nio/file/Path; + +# grabbing textures +accessible class net/minecraft/client/renderer/texture/SpriteContents$AnimatedTexture +accessible method net/minecraft/client/renderer/texture/SpriteContents$AnimatedTexture getFrameX (I)I +accessible method net/minecraft/client/renderer/texture/SpriteContents$AnimatedTexture getFrameY (I)I +accessible field net/minecraft/client/renderer/texture/SpriteContents animatedTexture Lnet/minecraft/client/renderer/texture/SpriteContents$AnimatedTexture; +accessible field net/minecraft/client/renderer/texture/SpriteContents originalImage Lcom/mojang/blaze3d/platform/NativeImage; + +# UI stuff +accessible field net/minecraft/client/gui/components/AbstractButton SPRITES Lnet/minecraft/client/gui/components/WidgetSprites; +# Handles inserting the config button +accessible field net/minecraft/client/gui/layouts/HeaderAndFooterLayout headerFrame Lnet/minecraft/client/gui/layouts/FrameLayout; +accessible field net/minecraft/client/gui/layouts/FrameLayout children Ljava/util/List; +accessible class net/minecraft/client/gui/layouts/FrameLayout$ChildContainer +accessible field net/minecraft/client/gui/layouts/LinearLayout wrapped Lnet/minecraft/client/gui/layouts/GridLayout; + +# hacky stuff +accessible field net/minecraft/util/ThreadingDetector lock Ljava/util/concurrent/Semaphore; +mutable field net/minecraft/util/ThreadingDetector lock Ljava/util/concurrent/Semaphore; +accessible field net/minecraft/client/gui/components/AbstractSelectionList scrollAmount D # Hack to bypass vanilla's setScrollAmount's clamp + + diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinOptionsScreen.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinOptionsScreen.java index fc0bbdd70..9fc0f8a57 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinOptionsScreen.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinOptionsScreen.java @@ -23,7 +23,6 @@ import com.seibel.distanthorizons.common.wrappers.gui.GetConfigScreen; import com.seibel.distanthorizons.common.wrappers.gui.TexturedButtonWidget; import com.seibel.distanthorizons.coreapi.ModInfo; import com.seibel.distanthorizons.core.config.Config; -import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.layouts.HeaderAndFooterLayout; import net.minecraft.client.gui.screens.OptionsScreen; import net.minecraft.client.gui.screens.Screen; @@ -35,85 +34,106 @@ import net.minecraft.resources.ResourceLocation; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Objects; +#if MC_VER == MC_1_20_6 +import net.minecraft.client.gui.layouts.LinearLayout; +#endif + /** * Adds a button to the menu to goto the config * * @author coolGi - * @version 12-02-2021 + * @version 2024-5-20 */ @Mixin(OptionsScreen.class) public class MixinOptionsScreen extends Screen { - /** Get the texture for the button */ + /** Texture used for the config opening button */ + @Unique private static final ResourceLocation ICON_TEXTURE = new ResourceLocation(ModInfo.ID, "textures/gui/button.png"); - public final TexturedButtonWidget optionsButton; + @Unique + private TexturedButtonWidget optionsButton = null; + + #if MC_VER == MC_1_20_6 @Shadow @Final protected HeaderAndFooterLayout layout; + #endif - protected MixinOptionsScreen(Component title) - { - super(title); - - this.optionsButton = new TexturedButtonWidget( - // Where the button is on the screen - this.width / 2 - 180, this.height / 6 - 12, - // Width and height of the button - 20, 20, - // texture UV Offset - 0, 0, - // Some textuary stuff - 20, ICON_TEXTURE, 20, 40, - // Create the button and tell it where to go - // For now it goes to the client option by default - (buttonWidget) -> Objects.requireNonNull(minecraft).setScreen(GetConfigScreen.getScreen(this)), - // Add a title to the utton - #if MC_VER < MC_1_19_2 - new TranslatableComponent(ModInfo.ID + ".title"))); - #else - Component.translatable(ModInfo.ID + ".title")); - #endif - } + //==============// + // constructors // + //==============// + protected MixinOptionsScreen(Component title) { super(title); } - - @Inject(at = @At("HEAD"), method = "init") + @Inject(at = @At("RETURN"), method = "init") private void lodconfig$init(CallbackInfo ci) { if (Config.Client.optionsButton.get()) { - this. #if MC_VER < MC_1_17_1 addButton #else addRenderableWidget #endif - (this.optionsButton); + #if MC_VER < MC_1_17_1 + this.addButton(this.getOptionsButton()); + #elif MC_VER < MC_1_20_6 + this.addRenderableWidget(this.getOptionsButton()); + #else - // TODO we need to add optionsButton to the UI via the layout instead so it centers correctly - // This wasn't working on James' machine - this.layout.visitChildren((x) -> - { - System.out.println(x); - }); + // add the button so it's rendered + this.addRenderableWidget(this.getOptionsButton()); + // add the button to the correct location in the UI + // TODO is there a better way to do this instead of using access transformers to inject into the exact UI elements? + // TODO is there a way we can put the button on the left side of the FOV bar like before? + LinearLayout layout = (LinearLayout) this.layout.headerFrame.children.get(0).child; + layout.wrapped.addChild(this.getOptionsButton(), 1, 2); + layout.arrangeElements(); + + #endif } } - //@Inject(method = "Lnet/minecraft/client/gui/screens/Screen;render(Lnet/minecraft/client/gui/GuiGraphics;IIF)V", at = @At(value = "INVOKE")) - //public void renderStuff(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick, CallbackInfo ci) - //{ - // int newWidth = this.width / 2 - 180; - // if (this.optionsButton.getX() != newWidth) - // { - // this.optionsButton.setX(newWidth); - // } - //} + + //================// + // helper methods // + //================// + + @Unique + public TexturedButtonWidget getOptionsButton() + { + if (this.optionsButton == null) + { + this.optionsButton + = new TexturedButtonWidget( + // Where the button is on the screen + this.width / 2 - 180, this.height / 6 - 12, + // Width and height of the button + 20, 20, + // texture UV Offset + 0, 0, + // Some textuary stuff + 20, ICON_TEXTURE, 20, 40, + // Create the button and tell it where to go + // For now it goes to the client option by default + (buttonWidget) -> Objects.requireNonNull(this.minecraft).setScreen(GetConfigScreen.getScreen(this)), + // Add a title to the utton + #if MC_VER < MC_1_19_2 + new TranslatableComponent(ModInfo.ID + ".title"))); + #else + Component.translatable(ModInfo.ID + ".title")); + #endif + } + + return this.optionsButton; + } } diff --git a/versionProperties/1.20.6.properties b/versionProperties/1.20.6.properties index eaea6d61a..273c66923 100644 --- a/versionProperties/1.20.6.properties +++ b/versionProperties/1.20.6.properties @@ -3,7 +3,7 @@ java_version=21 minecraft_version=1.20.6 parchment_version=1.20.6:2024.05.01 compatible_minecraft_versions=["1.20.6"] -accessWidenerVersion=1_20_2 +accessWidenerVersion=1_20_6 builds_for=fabric,neoforge # forge is broken due to gradle/build script issues