Skip to content

Commit b1c4759

Browse files
committed
Minecraft 1.20.0 backport
1 parent 445cac6 commit b1c4759

File tree

33 files changed

+442
-57
lines changed

33 files changed

+442
-57
lines changed

build-logic/src/main/kotlin/dynamic_fps.base.gradle.kts

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ if (project.hasProperty("loom.platform")) {
2424
tasks.withType<ProcessResources> {
2525
inputs.property("version", modVersion)
2626

27-
filesMatching(listOf("fabric.mod.json", "mods.toml", "neoforge.mods.toml", "quilt.mod.json")) {
27+
filesMatching(listOf("fabric.mod.json", "META-INF/mods.toml", "META-INF/neoforge.mods.toml", "quilt.mod.json")) {
2828
expand(inputs.properties)
2929
}
3030
}

build-logic/src/main/kotlin/dynamic_fps.java.gradle.kts

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ java {
66
withSourcesJar()
77

88
toolchain {
9-
languageVersion = JavaLanguageVersion.of(21)
9+
languageVersion = JavaLanguageVersion.of(17)
1010
}
1111
}
1212

1313
tasks.withType<JavaCompile> {
1414
options.encoding = "UTF-8"
1515

1616
javaCompiler = javaToolchains.compilerFor {
17-
languageVersion = JavaLanguageVersion.of(21)
17+
languageVersion = JavaLanguageVersion.of(17)
1818
}
1919
}

gradle.properties

+4-4
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ maven_group = juliand665
1010
archives_name = dynamic-fps
1111

1212
# File naming version
13-
minecraft_version = 1.21.0
13+
minecraft_version = 1.20.0
1414
# Version for publishing
15-
minecraft_version_min = 1.21
16-
minecraft_version_max = 1.21
15+
minecraft_version_min = 1.20
16+
minecraft_version_max = 1.20.4
1717

18-
enabled_platforms=fabric,neoforge,quilt
18+
enabled_platforms=fabric,forge,neoforge,quilt

gradle/libs.versions.toml

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
[versions]
2-
minecraft = "1.21"
2+
minecraft = "1.20.4"
33

44
# Platform libraries
55

66
fabric_loader = "0.15.10"
7-
fabric_api = "0.100.1+1.21"
7+
fabric_api = "0.96.1+1.20.4"
88

99
forge = "1.20.4-49.0.30"
1010

11-
neoforge = "21.0.0-beta"
11+
neoforge = "20.4.237"
1212

1313
quilt_loader = "0.25.0"
1414
quilt_standard_libraries = "8.0.0-alpha.12+1.20.4"
@@ -19,8 +19,8 @@ battery = "1.1.0"
1919

2020
# Modding libraries
2121

22-
modmenu = "11.0.0-beta.1"
23-
cloth_config = "15.0.127"
22+
modmenu = "9.0.0"
23+
cloth_config = "13.0.121"
2424

2525
mixinextras = "0.3.5"
2626

platforms/common/src/main/java/dynamic_fps/impl/DynamicFPSMod.java

+9-1
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@
1414
import dynamic_fps.impl.util.FallbackConfigScreen;
1515
import dynamic_fps.impl.util.Logging;
1616
import dynamic_fps.impl.feature.state.OptionHolder;
17+
import dynamic_fps.impl.util.ModCompatHelper;
1718
import dynamic_fps.impl.util.ResourceLocations;
1819
import dynamic_fps.impl.util.Version;
1920
import dynamic_fps.impl.feature.volume.SmoothVolumeHandler;
2021
import dynamic_fps.impl.util.duck.DuckLoadingOverlay;
2122
import dynamic_fps.impl.feature.state.WindowObserver;
2223
import dynamic_fps.impl.service.Platform;
24+
import dynamic_fps.impl.util.duck.DuckScreen;
2325
import net.lostluma.battery.api.State;
2426
import net.minecraft.Util;
2527
import net.minecraft.client.Minecraft;
@@ -174,7 +176,7 @@ public static boolean shouldShowToasts() {
174176
}
175177

176178
public static boolean shouldShowLevels() {
177-
return isDisabled() || !isLevelCoveredByOverlay();
179+
return isDisabled() || !(isLevelCoveredByScreen() || isLevelCoveredByOverlay());
178180
}
179181

180182
public static void onBatteryChargeChanged(int before, int after) {
@@ -196,11 +198,17 @@ public static void onBatteryStatusChanged(State before, State after) {
196198
private static void doInit() {
197199
// NOTE: Init battery tracker first here
198200
// Since the idle handler queries it for info
201+
ModCompatHelper.init();
202+
199203
BatteryTracker.init();
200204
IdleHandler.init();
201205
SmoothVolumeHandler.init();
202206
}
203207

208+
private static boolean isLevelCoveredByScreen() {
209+
return minecraft.screen != null && ((DuckScreen) minecraft.screen).dynamic_fps$rendersBackground();
210+
}
211+
204212
private static void showNotification(String titleTranslationKey, String iconPath) {
205213
if (!DynamicFPSConfig.INSTANCE.batteryTracker().notifications()) {
206214
return;

platforms/common/src/main/java/dynamic_fps/impl/feature/battery/BatteryTracker.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public static void init() {
5858
}
5959
} else {
6060
manager = temp; // Keep around to allow updating batteries
61-
Thread.ofVirtual().name("refresh-battery").start(BatteryTracker::updateBatteries);
61+
new Thread(BatteryTracker::updateBatteries, "refresh-battery").start();
6262
}
6363
}
6464

@@ -127,7 +127,7 @@ private static void updateBatteries() {
127127
updateState();
128128

129129
try {
130-
Thread.sleep(updateInterval);
130+
Thread.sleep(updateInterval.toMillis());
131131
} catch (InterruptedException e) {
132132
active = false;
133133
Thread.currentThread().interrupt();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package dynamic_fps.impl.mixin;
2+
3+
import dynamic_fps.impl.service.ModCompat;
4+
import org.spongepowered.asm.mixin.Mixin;
5+
import org.spongepowered.asm.mixin.Unique;
6+
import org.spongepowered.asm.mixin.injection.At;
7+
import org.spongepowered.asm.mixin.injection.Inject;
8+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
9+
10+
import dynamic_fps.impl.util.duck.DuckScreen;
11+
import net.minecraft.client.gui.screens.Screen;
12+
13+
@Mixin(Screen.class)
14+
public class ScreenMixin implements DuckScreen {
15+
@Unique
16+
private boolean dynamic_fps$canOptimize = false;
17+
18+
@Unique
19+
private boolean dynamic_fps$hasOptedOut = false;
20+
21+
@Override
22+
public boolean dynamic_fps$rendersBackground() {
23+
return dynamic_fps$canOptimize;
24+
}
25+
26+
@Override
27+
public void dynamic_fps$setRendersBackground() {
28+
this.dynamic_fps$canOptimize = true;
29+
}
30+
31+
@Inject(method = "init", at = @At("HEAD"))
32+
private void onInit(CallbackInfo callbackInfo) {
33+
String name = this.getClass().getName();
34+
35+
this.dynamic_fps$hasOptedOut = ModCompat.getInstance().isScreenOptedOut(name);
36+
37+
// Allow other mods to opt out on behalf of vanilla screens
38+
// That Dynamic FPS forced to opt in via its own mod metadata.
39+
if (!this.dynamic_fps$hasOptedOut) {
40+
this.dynamic_fps$canOptimize = ModCompat.getInstance().isScreenOptedIn(name);
41+
}
42+
}
43+
44+
@Inject(method = "renderDirtBackground", at = @At("HEAD"))
45+
private void onRenderDirtBackground(CallbackInfo callbackInfo) {
46+
if (!this.dynamic_fps$hasOptedOut) {
47+
this.dynamic_fps$canOptimize = true; // Signal to apply optimizations on next frame
48+
}
49+
}
50+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package dynamic_fps.impl.mixin;
2+
3+
import dynamic_fps.impl.util.duck.DuckScreen;
4+
import org.spongepowered.asm.mixin.Mixin;
5+
import org.spongepowered.asm.mixin.injection.At;
6+
import org.spongepowered.asm.mixin.injection.Inject;
7+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
8+
9+
import net.minecraft.client.gui.screens.achievement.StatsScreen;
10+
11+
@Mixin(StatsScreen.class)
12+
public class StatsScreenMixin {
13+
@Inject(method = "onStatsUpdated", at = @At("HEAD"))
14+
private void onStatsUpdated(CallbackInfo callbackInfo) {
15+
((DuckScreen) this).dynamic_fps$setRendersBackground();
16+
}
17+
}

platforms/common/src/main/java/dynamic_fps/impl/service/ModCompat.java

+13
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,23 @@
11
package dynamic_fps.impl.service;
22

3+
import java.util.Set;
4+
35
public interface ModCompat {
46
boolean isDisabled();
57

68
boolean disableOverlayOptimization();
79

10+
Set<String> getOptedInScreens();
11+
Set<String> getOptedOutScreens();
12+
13+
default boolean isScreenOptedIn(String className) {
14+
return getOptedInScreens().contains(className);
15+
}
16+
17+
default boolean isScreenOptedOut(String className) {
18+
return getOptedOutScreens().contains(className);
19+
}
20+
821
static ModCompat getInstance() {
922
return Services.MOD_COMPAT;
1023
}

platforms/common/src/main/java/dynamic_fps/impl/util/FallbackConfigScreen.java

+1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ protected void init() {
3333

3434
@Override
3535
public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTicks) {
36+
this.renderDirtBackground(guiGraphics);
3637
super.render(guiGraphics, mouseX, mouseY, partialTicks);
3738

3839
int width = guiGraphics.guiWidth() / 2;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package dynamic_fps.impl.util;
2+
3+
import dynamic_fps.impl.service.ModCompat;
4+
import dynamic_fps.impl.service.Platform;
5+
6+
import java.util.Optional;
7+
8+
public class ModCompatHelper {
9+
public static void init() {
10+
fixFastloadSoftLock();
11+
}
12+
13+
/**
14+
* Fix softlock in combination with Fastload <=3.4.0 due to our screen / loading overlay optimization.
15+
*
16+
* See the <a href="https://github.com/juliand665/Dynamic-FPS/issues/129">issue report</a> for more info.
17+
*/
18+
private static void fixFastloadSoftLock() {
19+
Optional<Version> optional = Platform.getInstance().getModVersion("fastload");
20+
21+
if (optional.isEmpty()) {
22+
return;
23+
}
24+
25+
Version other;
26+
27+
try {
28+
other = Version.of("3.4.0");
29+
} catch (Version.VersionParseException e) {
30+
throw new RuntimeException(e);
31+
}
32+
33+
// If a version below 3.4.0 is present opt their custom world loading screen out of our optimization
34+
if (optional.get().compareTo(other) <= 0) {
35+
ModCompat.getInstance().getOptedOutScreens().add(
36+
"io.github.bumblesoftware.fastload.client.BuildingTerrainScreen"
37+
);
38+
}
39+
}
40+
}

platforms/common/src/main/java/dynamic_fps/impl/util/ResourceLocations.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44

55
public class ResourceLocations {
66
public static ResourceLocation of(String namespace, String path) {
7-
return ResourceLocation.fromNamespaceAndPath(namespace, path);
7+
return new ResourceLocation(namespace, path);
88
}
99
}

platforms/common/src/main/java/dynamic_fps/impl/util/VariableStepTransformer.java

+13-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package dynamic_fps.impl.util;
22

33
import java.util.ArrayList;
4+
import java.util.Collections;
45
import java.util.Comparator;
56
import java.util.List;
67

@@ -13,9 +14,11 @@
1314
public class VariableStepTransformer {
1415
private boolean unsorted;
1516
private final List<Step> steps;
17+
private final List<Step> reversedSteps;
1618

1719
public VariableStepTransformer() {
1820
this.steps = new ArrayList<>();
21+
this.reversedSteps = new ArrayList<>();
1922
}
2023

2124
/**
@@ -27,6 +30,7 @@ public VariableStepTransformer() {
2730
public void addStep(int change, int max) {
2831
this.unsorted = true;
2932
this.steps.add(new Step(change, max));
33+
this.reversedSteps.add(new Step(change, max));
3034
}
3135

3236
/**
@@ -42,7 +46,7 @@ public int toStep(int value) {
4246
int currentChange = 0;
4347
int currentValue = value;
4448

45-
for (Step pair : this.steps.reversed()) {
49+
for (Step pair : this.reversedSteps) {
4650
if (currentValue > pair.max && currentChange != 0) {
4751
step += Math.floorDiv(currentValue - pair.max, currentChange);
4852
currentValue = pair.max;
@@ -86,6 +90,14 @@ public int compare(Step self, Step other) {
8690
return Integer.compare(self.max, other.max);
8791
}
8892
});
93+
94+
this.reversedSteps.sort(new Comparator<Step>() {
95+
@Override
96+
public int compare(Step self, Step other) {
97+
return Integer.compare(self.max, other.max);
98+
}
99+
});
100+
Collections.reverse(this.reversedSteps);
89101
}
90102

91103
private record Step(int change, int max) {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package dynamic_fps.impl.util.duck;
2+
3+
public interface DuckScreen {
4+
default boolean dynamic_fps$rendersBackground() {
5+
throw new RuntimeException("No implementation for dynamic_fps$rendersBackground was found.");
6+
}
7+
8+
default void dynamic_fps$setRendersBackground() {
9+
throw new RuntimeException("No implementation for dynamic_fps$rendersBackground was found.");
10+
}
11+
}

platforms/common/src/main/resources/dynamic_fps-common.mixins.json

+2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
"GuiMixin",
99
"LoadingOverlayMixin",
1010
"MinecraftMixin",
11+
"ScreenMixin",
1112
"SoundEngineMixin",
13+
"StatsScreenMixin",
1214
"ToastComponentMixin",
1315
"WindowMixin",
1416
"bugfix.BlockableEventLoopMixin"

platforms/fabric/build.gradle

+2-6
Original file line numberDiff line numberDiff line change
@@ -85,13 +85,11 @@ publishMods {
8585
accessToken = providers.environmentVariable("CURSEFORGE_SECRET")
8686
projectId = "335493"
8787

88-
/*
8988
minecraftVersionRange {
9089
start = project.property("minecraft_version_min").toString()
9190
end = project.property("minecraft_version_max").toString()
9291
}
93-
*/
94-
minecraftVersions.add(project.property("minecraft_version_min").toString())
92+
// minecraftVersions.add(project.property("minecraft_version_min").toString())
9593

9694
clientRequired = true
9795
serverRequired = false
@@ -104,15 +102,13 @@ publishMods {
104102
accessToken = providers.environmentVariable("MODRINTH_SECRET")
105103
projectId = "LQ3K71Q1"
106104

107-
/*
108105
minecraftVersionRange {
109106
start = project.property("minecraft_version_min").toString()
110107
end = project.property("minecraft_version_max").toString()
111108

112109
includeSnapshots = true
113110
}
114-
*/
115-
minecraftVersions.add(project.property("minecraft_version_min").toString())
111+
// minecraftVersions.add(project.property("minecraft_version_min").toString())
116112

117113
requires("fabric-api")
118114
optional("cloth-config", "modmenu")

platforms/fabric/src/main/java/net/lostluma/dynamic_fps/impl/fabric/mixin/GuiMixin.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,13 @@ public class GuiMixin {
1414
/**
1515
* Render info on whether Dynamic FPS is disabled or always reducing the user's FPS.
1616
*/
17-
@Inject(method = "renderSavingIndicator", at = @At("HEAD"))
17+
@Inject(
18+
method = "render",
19+
at = @At(
20+
value = "INVOKE",
21+
target = "Lnet/minecraft/client/gui/Gui;renderSavingIndicator(Lnet/minecraft/client/gui/GuiGraphics;)V"
22+
)
23+
)
1824
private void renderSavingIndicator(CallbackInfo callbackInfo, @Local(argsOnly = true) GuiGraphics guiGraphics) {
1925
HudInfoRenderer.renderInfo(guiGraphics);
2026
}

0 commit comments

Comments
 (0)