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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -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"
Expand All @@ -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) {
Expand Down
7 changes: 3 additions & 4 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand Down
Binary file modified gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
5 changes: 3 additions & 2 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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<String> myTargets, Set<String> otherTargets) {

}

@Override
public List<String> 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) {

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,6 @@ public int getRowWidth() {
return 400;
}

protected int getScrollbarPositionX() {
return super.getScrollbarPositionX() + 32;
}

public Style getHoveredStyle(int mouseX, int mouseY) {
Optional<Element> hovered = hoveredElement(mouseX, mouseY);
//noinspection OptionalIsPresent
Expand Down Expand Up @@ -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();
Expand Down
Original file line number Diff line number Diff line change
@@ -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;<init>(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<Integer> oldTextGetter = args.get(2);
args.set(2, (SimpleOption.ValueTextGetter<Integer>) (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<Integer> oldConsumer = args.get(5);
args.set(5, (Consumer<Integer>) 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<VideoMode> 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<Integer> 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<Integer> textGetter = (SimpleOption.ValueTextGetter<Integer> )(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<Integer> oldConsumer = (value) -> {
if (monitor != null) {
window.setVideoMode(value == -1 ? Optional.empty() : Optional.of(monitor.getVideoMode(value)));
}
};

Consumer<Integer> 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<Integer> simpleOption = new SimpleOption<Integer> ("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));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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'");
}
}
1 change: 1 addition & 0 deletions src/main/resources/borderlessmining.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
"required": true,
"package": "link.infra.borderlessmining.mixin",
"compatibilityLevel": "JAVA_17",
"plugin": "link.infra.borderlessmining.BorderlessMiningMixinPlugin",
"mixins": [
],
"client": [
Expand Down
2 changes: 1 addition & 1 deletion src/main/resources/fabric.mod.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,6 @@
"depends": {
"fabricloader": ">=0.7.2",
"fabric-resource-loader-v0": "*",
"minecraft": "~1.20.2"
"minecraft": "1.21"
}
}