diff --git a/build.gradle b/build.gradle index ab9e578..3241306 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'fabric-loom' version '1.2.+' + id 'fabric-loom' version '1.6.+' id 'maven-publish' id "com.github.breadmoirai.github-release" version "2.4.1" @@ -8,8 +8,8 @@ plugins { id "com.matthewprenger.cursegradle" version "1.4.0" } -sourceCompatibility = JavaVersion.VERSION_17 -targetCompatibility = JavaVersion.VERSION_17 +sourceCompatibility = JavaVersion.VERSION_21 +targetCompatibility = JavaVersion.VERSION_21 String getGitVersion(Project project) { if (grgit != null) { diff --git a/gradle.properties b/gradle.properties index fe392cf..9f61710 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,8 +3,8 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://fabricmc.net/develop - minecraft_version=1.20.4 - yarn_mappings=1.20.4+build.3 + minecraft_version=1.21 + yarn_mappings=1.21+build.2 loader_version=0.15.3 # Mod Properties @@ -13,8 +13,7 @@ org.gradle.jvmargs=-Xmx1G archives_base_name = borderless-mining # Dependencies - # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api - fabric_version=0.91.3+1.20.4 + fabric_version=0.100.1+1.21 modmenu_version=9.0.0 # Publishing metadata diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index c1962a7..e644113 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 37aef8d..dab2a01 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists +zipStorePath=wrapper/dists \ No newline at end of file diff --git a/src/main/java/link/infra/borderlessmining/BorderlessMiningMixinPlugin.java b/src/main/java/link/infra/borderlessmining/BorderlessMiningMixinPlugin.java new file mode 100644 index 0000000..6d9eb75 --- /dev/null +++ b/src/main/java/link/infra/borderlessmining/BorderlessMiningMixinPlugin.java @@ -0,0 +1,53 @@ +package link.infra.borderlessmining; + +import net.fabricmc.loader.api.FabricLoader; +import org.objectweb.asm.tree.ClassNode; +import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; +import org.spongepowered.asm.mixin.extensibility.IMixinInfo; + +import java.util.List; +import java.util.Set; + +public class BorderlessMiningMixinPlugin implements IMixinConfigPlugin { + private static final org.apache.logging.log4j.Logger LOGGER = org.apache.logging.log4j.LogManager.getLogger(); + + public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + LOGGER.info("Checking if mixin should be applied: " + mixinClassName + " to " + targetClassName); + if (mixinClassName.equals("link.infra.borderlessmining.mixin.FullScreenOptionMixin") || mixinClassName.equals("link.infra.borderlessmining.mixin.VideoModeFixMixin")) { + return !FabricLoader.getInstance().isModLoaded("iris"); + } + return true; + } + + // Boilerplate + + @Override + public void onLoad(String mixinPackage) { + + } + + @Override + public String getRefMapperConfig() { + return null; + } + + @Override + public void acceptTargets(Set myTargets, Set otherTargets) { + + } + + @Override + public List getMixins() { + return null; + } + + @Override + public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + + } + + @Override + public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + + } +} \ No newline at end of file diff --git a/src/main/java/link/infra/borderlessmining/config/ConfigScreen.java b/src/main/java/link/infra/borderlessmining/config/ConfigScreen.java index c27dd5c..c450db1 100644 --- a/src/main/java/link/infra/borderlessmining/config/ConfigScreen.java +++ b/src/main/java/link/infra/borderlessmining/config/ConfigScreen.java @@ -58,10 +58,6 @@ public int getRowWidth() { return 400; } - protected int getScrollbarPositionX() { - return super.getScrollbarPositionX() + 32; - } - public Style getHoveredStyle(int mouseX, int mouseY) { Optional hovered = hoveredElement(mouseX, mouseY); //noinspection OptionalIsPresent @@ -121,7 +117,7 @@ public void render(DrawContext drawContext, int mouseX, int mouseY, float delta) @Override public void renderBackground(DrawContext context, int mouseX, int mouseY, float delta) { - this.renderBackgroundTexture(context); + this.renderDarkening(context); } public abstract void addElements(); diff --git a/src/main/java/link/infra/borderlessmining/mixin/FullScreenOptionMixin.java b/src/main/java/link/infra/borderlessmining/mixin/FullScreenOptionMixin.java index 108fd28..e164903 100644 --- a/src/main/java/link/infra/borderlessmining/mixin/FullScreenOptionMixin.java +++ b/src/main/java/link/infra/borderlessmining/mixin/FullScreenOptionMixin.java @@ -1,54 +1,104 @@ package link.infra.borderlessmining.mixin; import link.infra.borderlessmining.config.ConfigHandler; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.option.GameOptionsScreen; import net.minecraft.client.gui.screen.option.VideoOptionsScreen; +import net.minecraft.client.option.GameOptions; import net.minecraft.client.option.SimpleOption; +import net.minecraft.client.util.VideoMode; +import net.minecraft.client.util.Window; import net.minecraft.text.Text; + import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyArgs; -import org.spongepowered.asm.mixin.injection.invoke.arg.Args; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; +import java.util.Objects; +import java.util.Optional; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.util.Monitor; import java.util.function.Consumer; @Mixin(VideoOptionsScreen.class) -public abstract class FullScreenOptionMixin { - // Modify the constructor call to add an extra option for Borderless Fullscreen - @ModifyArgs(method = "init", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/option/SimpleOption;(Ljava/lang/String;Lnet/minecraft/client/option/SimpleOption$TooltipFactory;Lnet/minecraft/client/option/SimpleOption$ValueTextGetter;Lnet/minecraft/client/option/SimpleOption$Callbacks;Ljava/lang/Object;Ljava/util/function/Consumer;)V")) - private void modifyOption(Args args) { - if (!ConfigHandler.getInstance().addToVanillaVideoSettings) { - return; - } - - // Add one extra option at the end for Borderless Windowed - SimpleOption.ValidatingIntSliderCallbacks cb = args.get(3); - int bmOption = cb.maxInclusive() + 1; - args.set(3, new SimpleOption.ValidatingIntSliderCallbacks(cb.minInclusive(), bmOption)); - - // Modify the text getter to show Borderless Mining text - SimpleOption.ValueTextGetter oldTextGetter = args.get(2); - args.set(2, (SimpleOption.ValueTextGetter) (optionText, value) -> { - if (value == bmOption) { - return Text.translatable("text.borderlessmining.videomodename"); - } - return oldTextGetter.toString(optionText, value); - }); - - // Change the default based on the existing option selection - args.set(4, ConfigHandler.getInstance().isEnabledOrPending() ? bmOption : args.get(4)); - - // Update BM settings when the slider is changed - Consumer oldConsumer = args.get(5); - args.set(5, (Consumer) value -> { - if (value == bmOption) { - ConfigHandler.getInstance().setEnabledPending(true); - // Set the actual value to "Current" - oldConsumer.accept(-1); - } else { - ConfigHandler.getInstance().setEnabledPending(false); - oldConsumer.accept(value); - } - }); - } -} +public abstract class FullScreenOptionMixin extends GameOptionsScreen { + private static final Text TITLE_TEXT = Text.translatable("options.videoTitle"); + + public FullScreenOptionMixin(Screen parent, MinecraftClient client, GameOptions gameOptions) { + super(parent, gameOptions, TITLE_TEXT); + } + + @Shadow + private static SimpleOption[] getOptions(GameOptions gameOptions) { + return new SimpleOption[] { + gameOptions.getGraphicsMode(), gameOptions.getViewDistance(), gameOptions.getChunkBuilderMode(), gameOptions.getSimulationDistance(), gameOptions.getAo(), gameOptions.getMaxFps(), gameOptions.getEnableVsync(), gameOptions.getBobView(), gameOptions.getGuiScale(), gameOptions.getAttackIndicator(), gameOptions.getGamma(), gameOptions.getCloudRenderMode(), gameOptions.getFullscreen(), gameOptions.getParticles(), gameOptions.getMipmapLevels(), gameOptions.getEntityShadows(), gameOptions.getDistortionEffectScale(), gameOptions.getEntityDistanceScaling(), gameOptions.getFovEffectScale(), gameOptions.getShowAutosaveIndicator(), gameOptions.getGlintSpeed(), gameOptions.getGlintStrength(), gameOptions.getMenuBackgroundBlurriness() + }; + } + + @Overwrite + protected void addOptions() { + Window window = this.client.getWindow(); + Monitor monitor = window.getMonitor(); + int j; + if (monitor == null) { + j = -1; + } else { + Optional optional = window.getVideoMode(); + Objects.requireNonNull(monitor); + j = (Integer) optional.map(monitor::findClosestVideoModeIndex).orElse(-1); + } + + // Add one extra option at the end for Borderless Windowed + SimpleOption.ValidatingIntSliderCallbacks cb = new SimpleOption.ValidatingIntSliderCallbacks(-1, monitor != null ? monitor.getVideoModeCount() - 1 : -1); + int bmOption = cb.maxInclusive() + 1; + cb = new SimpleOption.ValidatingIntSliderCallbacks(cb.minInclusive(), bmOption); + + // Modify the text getter to show Borderless Mining text + SimpleOption.ValueTextGetter oldTextGetter = (optionText, value) -> { + if (monitor == null) { + return Text.translatable("options.fullscreen.unavailable"); + } else if (value == -1) { + return GameOptions.getGenericValueText(optionText, Text.translatable("options.fullscreen.current")); + } else { + VideoMode videoMode = monitor.getVideoMode(value); + return GameOptions.getGenericValueText(optionText, Text.translatable("options.fullscreen.entry", new Object[] { + videoMode.getWidth(), videoMode.getHeight(), videoMode.getRefreshRate(), videoMode.getRedBits() + videoMode.getGreenBits() + videoMode.getBlueBits() + })); + } + }; + + SimpleOption.ValueTextGetter textGetter = (SimpleOption.ValueTextGetter )(optionText, value) -> { + if (value == bmOption) { + return Text.translatable("text.borderlessmining.videomodename"); + } + return oldTextGetter.toString(optionText, value); + }; + + // Change the default based on the existing option selection + j = ConfigHandler.getInstance().isEnabledOrPending() ? bmOption : j; + + // Update BM settings when the slider is changed + Consumer oldConsumer = (value) -> { + if (monitor != null) { + window.setVideoMode(value == -1 ? Optional.empty() : Optional.of(monitor.getVideoMode(value))); + } + }; + + Consumer consumer = (value) -> { + if (value == bmOption) { + ConfigHandler.getInstance().setEnabledPending(true); + // Set the actual value to "Current" + oldConsumer.accept(-1); + } else { + ConfigHandler.getInstance().setEnabledPending(false); + oldConsumer.accept(value); + } + }; + + SimpleOption simpleOption = new SimpleOption ("options.fullscreen.resolution", SimpleOption.emptyTooltip(), textGetter, cb, j, consumer); + + this.body.addSingleOptionEntry(simpleOption); + this.body.addSingleOptionEntry(this.gameOptions.getBiomeBlendRadius()); + this.body.addAll(getOptions(this.gameOptions)); + } +} \ No newline at end of file diff --git a/src/main/java/link/infra/borderlessmining/mixin/VideoModeFixMixin.java b/src/main/java/link/infra/borderlessmining/mixin/VideoModeFixMixin.java index 9cdd6e8..afed0b9 100644 --- a/src/main/java/link/infra/borderlessmining/mixin/VideoModeFixMixin.java +++ b/src/main/java/link/infra/borderlessmining/mixin/VideoModeFixMixin.java @@ -26,4 +26,10 @@ public void screenRemoved(CallbackInfo ci) { this.client.getWindow().applyVideoMode(); } } + + @Override + protected void addOptions() { + // TODO Auto-generated method stub + throw new UnsupportedOperationException("Unimplemented method 'addOptions'"); + } } diff --git a/src/main/resources/borderlessmining.mixins.json b/src/main/resources/borderlessmining.mixins.json index abd9ef1..efe819d 100644 --- a/src/main/resources/borderlessmining.mixins.json +++ b/src/main/resources/borderlessmining.mixins.json @@ -2,6 +2,7 @@ "required": true, "package": "link.infra.borderlessmining.mixin", "compatibilityLevel": "JAVA_17", + "plugin": "link.infra.borderlessmining.BorderlessMiningMixinPlugin", "mixins": [ ], "client": [ diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index b560f80..1a2f543 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -34,6 +34,6 @@ "depends": { "fabricloader": ">=0.7.2", "fabric-resource-loader-v0": "*", - "minecraft": "~1.20.2" + "minecraft": "1.21" } }