9 Commits
1.20 ... 1.18

Author SHA1 Message Date
Motschen
d7c7a98b87 Break unsupported ETF versions 2022-10-01 11:03:26 +02:00
Motschen
aae4f69f9d Puzzle 1.4.1 patch update for 1.18
Fixes #52 and #48
Thanks to @VladTheSheep
2022-10-01 10:59:45 +02:00
Martin Prokoph
aea7c56f31 Merge pull request #51 from VladTheSheep/update-ETF
Update Entity Texture Features from 3.1.4 to 4.1.1 - Fabric 1.18.2
2022-10-01 10:41:39 +02:00
Vlad
91d137c9b8 update ETF version 2022-09-27 15:11:58 +02:00
Motschen
b03a466261 Fix 1.18 support 2022-08-02 14:37:36 +02:00
Martin Prokoph
51271e450a Merge pull request #44 from PuzzleMC/1.18-temp
Backport 1.4.0 to 1.18
2022-08-02 12:16:55 +00:00
Martin Prokoph
b1250af1ea Merge branch '1.18' into 1.18-temp 2022-08-02 12:16:39 +00:00
Motschen
b4948cdd43 Puzzle 1.3.4 for 1.18.2 2022-07-06 21:03:32 +02:00
Martin Prokoph
f885597769 Merge pull request #37 from PuzzleMC/1.19
Backport 1.3.4 to 1.18
2022-07-06 18:49:40 +00:00
43 changed files with 441 additions and 561 deletions

View File

@@ -1,4 +1,2 @@
# Puzzle # Puzzle
Unites optifine replacement mods in a clean & vanilla-style gui Unites optifine replacement mods in a clean & vanilla-style gui
[![Download from Curseforge](https://cf.way2muchnoise.eu/full_563977_downloads%20on%20Curseforge.svg?badge_style=for_the_badge)](https://www.curseforge.com/minecraft/mc-mods/puzzle) [![Download from Modrinth](https://img.shields.io/modrinth/dt/puzzle?color=4&label=Download%20from%20Modrinth&style=for-the-badge)](https://modrinth.com/mod/puzzle)

View File

@@ -1,6 +1,6 @@
// Based on https://github.com/OnyxStudios/Cardinal-Components-API/blob/1.17/build.gradle // Based on https://github.com/OnyxStudios/Cardinal-Components-API/blob/1.17/build.gradle
plugins { plugins {
id "fabric-loom" version "1.2-SNAPSHOT" apply false id "fabric-loom" version "0.12-SNAPSHOT" apply false
id "com.matthewprenger.cursegradle" version "1.4.0" id "com.matthewprenger.cursegradle" version "1.4.0"
id "maven-publish" id "maven-publish"
id "java-library" id "java-library"
@@ -122,19 +122,18 @@ dependencies {
} }
modImplementation ("maven.modrinth:cull-leaves:${project.cull_leaves_version}") modImplementation ("maven.modrinth:cull-leaves:${project.cull_leaves_version}")
modImplementation ("maven.modrinth:lambdynamiclights:${project.ldl_version}") modImplementation ("maven.modrinth:lambdynamiclights:${project.ldl_version}")
modCompileOnlyApi ("maven.modrinth:lambdabettergrass:${project.lbg_version}") modImplementation ("maven.modrinth:lambdabettergrass:${project.lbg_version}")
modImplementation ("maven.modrinth:iris:${project.iris_version}") modImplementation ("maven.modrinth:iris:${project.iris_version}")
modCompileOnly ("maven.modrinth:cit-resewn:${project.cit_resewn_version}") modCompileOnly ("maven.modrinth:cit-resewn:${project.cit_resewn_version}")
modCompileOnlyApi ("maven.modrinth:continuity:${project.continuity_version}") modImplementation ("maven.modrinth:continuity:${project.continuity_version}")
modImplementation ("maven.modrinth:animatica:${project.animatica_version}") modImplementation ("maven.modrinth:animatica:${project.animatica_version}")
modCompileOnlyApi ("maven.modrinth:colormatic:${project.colormatic_version}") modImplementation ("maven.modrinth:colormatic:${project.colormatic_version}")
modImplementation ("maven.modrinth:borderless-mining:${project.borderless_mining_version}") modImplementation ("maven.modrinth:borderless-mining:${project.borderless_mining_version}")
modImplementation ("maven.modrinth:dynamic-fps:${project.dynamic_fps_version}") modImplementation ("maven.modrinth:dynamic-fps:${project.dynamic_fps_version}")
modImplementation("com.moandjiezana.toml:toml4j:${project.toml4j_version}") modImplementation("com.moandjiezana.toml:toml4j:${project.toml4j_version}")
modImplementation ("maven.modrinth:entitytexturefeatures:${project.etf_version}") modImplementation ("maven.modrinth:entitytexturefeatures:${project.entitytexturefeatures_version}")
modImplementation ("maven.modrinth:entity-model-features:${project.emf_version}") modImplementation ("maven.modrinth:cem:${project.cem_version}")
modImplementation ("maven.modrinth:completeconfig:${project.complete_config_version}") modImplementation "com.gitlab.Lortseam:completeconfig:${project.complete_config_version}"
modImplementation ("maven.modrinth:exordium:${project.exordium_version}")
modImplementation("org.aperlambda:lambdajcommon:1.8.1") { modImplementation("org.aperlambda:lambdajcommon:1.8.1") {
exclude group: 'com.google.code.gson' exclude group: 'com.google.code.gson'

View File

@@ -3,38 +3,33 @@ org.gradle.jvmargs=-Xmx4G
# Fabric Properties # Fabric Properties
# check these on https://fabricmc.net/use # check these on https://fabricmc.net/use
minecraft_version=1.20 minecraft_version=1.18.2
yarn_mappings=1.20+build.1 yarn_mappings=1.18.2+build.3
loader_version=0.14.21 loader_version=0.14.8
# Mod Properties # Mod Properties
mod_version = 1.5.2+1.20 mod_version = 1.4.1-1.18
maven_group = net.puzzlemc maven_group = net.puzzlemc
archives_base_name = puzzle archives_base_name = puzzle
# Dependencies # Dependencies
# currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api
fabric_version=0.83.0+1.20 fabric_version=0.57.0+1.18.2
mod_menu_version = 7.0.1 mod_menu_version = 2.0.13
midnightlib_version = 1.4.1-fabric
cull_leaves_version = 3.0.2-fabric cull_leaves_version = 2.3.3
ldl_version = 2.3.0+1.19.4 ldl_version = 2.1.0+1.17
lbg_version = 1.5.1+1.20 lbg_version = 1.2.3+1.18
iris_version = 1.6.4+1.20 iris_version = 1.18.x-v1.2.4
continuity_version = 3.0.0-beta.2+1.19.3 continuity_version = 1.0.3+1.18
animatica_version = 0.5+1.19 animatica_version = 0.2+1.18
colormatic_version = 3.1.2 colormatic_version = 3.1.1
borderless_mining_version = 1.1.7+1.19.4 borderless_mining_version = 1.1.2+1.18.2
dynamic_fps_version = v2.2.0 dynamic_fps_version = v2.1.0
toml4j_version = 0.7.2 toml4j_version = 0.7.2
cit_resewn_version = 1.1.3+1.20 cit_resewn_version = 1.0.1+1.18.2
cem_version = 0.7.1-1.19.3 cem_version = 0.7.1
complete_config_version = 2.3.0 complete_config_version = 1.0.0
spruceui_version=5.0.0+1.20 spruceui_version=3.3.3+1.18
emf_version=0.2.10 midnightlib_version=0.4.4
etf_version=4.4.4 entitytexturefeatures_version=4.1.1.fabric_18
exordium_version=1.1.1-1.19.4
# Required for LBG
quilt_loader_version=0.19.0-beta.18
quilt_fabric_api_version=7.0.1+0.83.0-1.20

View File

@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View File

@@ -1,11 +1,9 @@
archivesBaseName = "puzzle-base" archivesBaseName = "puzzle-base"
repositories { repositories {
maven { url "https://maven.terraformersmc.com/releases" }
maven { maven {
url = "https://api.modrinth.com/maven" url = "https://api.modrinth.com/maven"
} }
} }
dependencies { dependencies {
modImplementation "maven.modrinth:midnightlib:${project.midnightlib_version}" modImplementation "maven.modrinth:midnightlib:${project.midnightlib_version}"
modImplementation ("com.terraformersmc:modmenu:${project.mod_menu_version}")
} }

View File

@@ -6,19 +6,19 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
public class PuzzleConfig extends MidnightConfig { public class PuzzleConfig extends MidnightConfig {
@Entry(category = "gui", name = "Disabled integrations") public static List<String> disabledIntegrations = new ArrayList<>(); @Entry public static List<String> disabledIntegrations = new ArrayList<>();
@Entry(category = "gui", name = "Enable Puzzle button") public static boolean enablePuzzleButton = true; @Entry public static boolean enablePuzzleButton = true;
@Entry(category = "debug", name = "Enable debug messages") public static boolean debugMessages = false; @Entry public static boolean debugMessages = false;
@Entry(category = "debug", name = "puzzle.option.check_for_updates") public static boolean checkUpdates = true; @Entry public static boolean checkUpdates = true;
@Entry(category = "gui", name = "puzzle.option.show_version_info") public static boolean showPuzzleInfo = true; @Entry public static boolean showPuzzleInfo = true;
@Entry(category = "features", name = "puzzle.option.resourcepack_splash_screen") public static boolean resourcepackSplashScreen = true; @Entry public static boolean resourcepackSplashScreen = true;
@Entry(category = "features", name = "puzzle.option.unlimited_model_rotations") public static boolean unlimitedRotations = true; @Entry public static boolean unlimitedRotations = true;
@Entry(category = "features", name = "puzzle.option.bigger_custom_models") public static boolean biggerModels = true; @Entry public static boolean biggerModels = true;
@Entry(category = "features", name = "Splash Background Color") public static int backgroundColor = 15675965; @Entry public static int backgroundColor = 15675965;
@Entry(category = "features", name = "Splash Progress Bar Color") public static int progressBarColor = 16777215; @Entry public static int progressBarColor = 16777215;
@Entry(category = "features", name = "Splash Progress Bar Background Color") public static int progressBarBackgroundColor = 15675965; @Entry public static int progressBarBackgroundColor = 15675965;
@Entry(category = "features", name = "Splash Progress Bar Frame Color") public static int progressFrameColor = 16777215; @Entry public static int progressFrameColor = 16777215;
@Entry(category = "features", name = "puzzle.option.better_splash_screen_blend") public static boolean disableBlend = false; @Entry public static boolean disableBlend = false;
} }

View File

@@ -4,6 +4,7 @@ import com.mojang.blaze3d.platform.GlDebugInfo;
import net.puzzlemc.core.PuzzleCore; import net.puzzlemc.core.PuzzleCore;
import net.puzzlemc.core.config.PuzzleConfig; import net.puzzlemc.core.config.PuzzleConfig;
import net.puzzlemc.core.util.UpdateChecker; import net.puzzlemc.core.util.UpdateChecker;
import net.minecraft.client.gui.DrawableHelper;
import net.minecraft.client.gui.hud.DebugHud; import net.minecraft.client.gui.hud.DebugHud;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
@@ -13,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.List; import java.util.List;
@Mixin(DebugHud.class) @Mixin(DebugHud.class)
public abstract class MixinDebugHud { public abstract class MixinDebugHud extends DrawableHelper {
@Inject(at = @At("RETURN"), method = "getRightText") @Inject(at = @At("RETURN"), method = "getRightText")
private void puzzle$getRightText(CallbackInfoReturnable<List<String>> cir) { private void puzzle$getRightText(CallbackInfoReturnable<List<String>> cir) {
if (PuzzleConfig.showPuzzleInfo) { if (PuzzleConfig.showPuzzleInfo) {

View File

@@ -1,50 +1,60 @@
package net.puzzlemc.core.mixin; package net.puzzlemc.core.mixin;
import eu.midnightdust.lib.util.PlatformFunctions; import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.client.gui.widget.PressableTextWidget; import net.minecraft.text.TranslatableText;
import net.puzzlemc.core.PuzzleCore; import net.puzzlemc.core.PuzzleCore;
import net.puzzlemc.core.config.PuzzleConfig; import net.puzzlemc.core.config.PuzzleConfig;
import net.puzzlemc.core.util.ModMenuUtil;
import net.puzzlemc.core.util.UpdateChecker; import net.puzzlemc.core.util.UpdateChecker;
import net.minecraft.client.gui.screen.*; import net.minecraft.client.gui.screen.*;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.util.Util; import net.minecraft.util.Util;
import net.minecraft.util.math.MathHelper;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.Objects; import java.util.Objects;
@Mixin(TitleScreen.class) @Mixin(TitleScreen.class)
public abstract class MixinTitleScreen extends Screen { public abstract class MixinTitleScreen extends Screen {
private final String versionText = PuzzleCore.version.replace("+", " for ");
@Shadow @Final private boolean doBackgroundFade;
@Shadow private long backgroundFadeStart;
private Text puzzleText;
private int puzzleTextWidth;
private int yOffset;
protected MixinTitleScreen(Text title) { protected MixinTitleScreen(Text title) {
super(title); super(title);
} }
@Inject(at = @At("TAIL"), method = "init") @Inject(at = @At("TAIL"), method = "init")
private void puzzle$init(CallbackInfo ci) { private void puzzle$init(CallbackInfo ci) {
int yOffset = 8; yOffset = 20;
if (PlatformFunctions.isModLoaded("modmenu") && ModMenuUtil.hasClassicButton()) { if (FabricLoader.getInstance().isModLoaded("dashloader")) yOffset = yOffset + 10;
yOffset += 12;
}
Text puzzleText;
if (UpdateChecker.isUpToDate) { if (UpdateChecker.isUpToDate) {
puzzleText = Text.literal(versionText); puzzleText = Text.of(PuzzleCore.version);
} }
else { else {
puzzleText = Text.literal("").append(Text.of(versionText+" | ")).append(Text.translatable("puzzle.text.update_available")); puzzleText = new TranslatableText("").append(Text.of(PuzzleCore.version + " | ")).append(new TranslatableText("puzzle.text.update_available"));
this.puzzleTextWidth = this.textRenderer.getWidth(puzzleText);
} }
}
@Inject(at = @At("TAIL"), method = "render")
private void puzzle$render(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) {
if (PuzzleConfig.showPuzzleInfo) { if (PuzzleConfig.showPuzzleInfo) {
PressableTextWidget text = this.addDrawableChild(new PressableTextWidget(2, this.height - 12 - yOffset, this.textRenderer.getWidth(puzzleText), 10, puzzleText, (button) -> { float f = this.doBackgroundFade ? (float) (Util.getMeasuringTimeMs() - this.backgroundFadeStart) / 1000.0F : 1.0F;
if (Objects.requireNonNull(this.client).options.getChatLinksPrompt().getValue()) { float g = this.doBackgroundFade ? MathHelper.clamp(f - 1.0F, 0.0F, 1.0F) : 1.0F;
this.client.setScreen(new ConfirmLinkScreen(this::confirmLink, PuzzleCore.updateURL, true)); int l = MathHelper.ceil(g * 255.0F) << 24;
} else { textRenderer.drawWithShadow(matrices, puzzleText,2,this.height - yOffset, 16777215 | l);
Util.getOperatingSystem().open(PuzzleCore.updateURL); if (mouseX > 2 && mouseX < 2 + this.puzzleTextWidth && mouseY > this.height - yOffset && mouseY < this.height - yOffset + 10) {
fill(matrices, 2, this.height - yOffset + 9, 2 + this.puzzleTextWidth, this.height - yOffset + 10, 16777215 | l);
} }
}, this.textRenderer));
if (UpdateChecker.isUpToDate) text.active = false;
} }
} }
@@ -54,4 +64,16 @@ public abstract class MixinTitleScreen extends Screen {
} }
Objects.requireNonNull(this.client).setScreen(this); Objects.requireNonNull(this.client).setScreen(this);
} }
@Inject(at = @At("HEAD"), method = "mouseClicked",cancellable = true)
private void puzzle$mouseClicked(double mouseX, double mouseY, int button, CallbackInfoReturnable<Boolean> cir) {
if (mouseX > 2 && mouseX < (double)(2 + this.puzzleTextWidth) && mouseY > (double)(this.height - yOffset) && mouseY < (double)this.height - yOffset + 10) {
if (Objects.requireNonNull(this.client).options.chatLinksPrompt) {
this.client.setScreen(new ConfirmChatLinkScreen(this::confirmLink, PuzzleCore.updateURL, true));
} else {
Util.getOperatingSystem().open(PuzzleCore.updateURL);
}
cir.setReturnValue(false);
}
}
} }

View File

@@ -1,9 +0,0 @@
package net.puzzlemc.core.util;
import com.terraformersmc.modmenu.config.ModMenuConfig;
public class ModMenuUtil {
public static boolean hasClassicButton() {
return ModMenuConfig.MODIFY_TITLE_SCREEN.getValue() && ModMenuConfig.MODS_BUTTON_STYLE.getValue() == ModMenuConfig.TitleMenuButtonStyle.CLASSIC;
}
}

View File

@@ -20,7 +20,7 @@ import java.util.concurrent.CompletableFuture;
public class UpdateChecker { public class UpdateChecker {
private static final Gson GSON = new Gson(); private static final Gson GSON = new Gson();
private static final String minecraftVersion = MinecraftClient.getInstance().getGameVersion(); private static final String minecraftVersion = MinecraftClient.getInstance().getGame().getVersion().getId();
public static final Logger logger = LogManager.getLogger(PuzzleCore.name); public static final Logger logger = LogManager.getLogger(PuzzleCore.name);
public static final Type UPDATE_TYPE_TOKEN = new TypeToken<Map<String, String>>(){}.getType(); public static final Type UPDATE_TYPE_TOKEN = new TypeToken<Map<String, String>>(){}.getType();

View File

@@ -27,7 +27,6 @@ repositories {
maven { maven {
url "https://maven.shedaniel.me/" url "https://maven.shedaniel.me/"
} }
maven { url "https://maven.quiltmc.org/repository/release/" }
} }
dependencies { dependencies {
@@ -36,28 +35,25 @@ dependencies {
modImplementation "dev.lambdaurora:spruceui:${project.spruceui_version}" modImplementation "dev.lambdaurora:spruceui:${project.spruceui_version}"
modImplementation "maven.modrinth:midnightlib:${project.midnightlib_version}" modImplementation "maven.modrinth:midnightlib:${project.midnightlib_version}"
modImplementation ("com.terraformersmc:modmenu:${project.mod_menu_version}")
modImplementation ("com.terraformersmc:modmenu:${project.mod_menu_version}")
modImplementation ("maven.modrinth:cull-leaves:${project.cull_leaves_version}") modImplementation ("maven.modrinth:cull-leaves:${project.cull_leaves_version}")
modImplementation ("maven.modrinth:lambdynamiclights:${project.ldl_version}") modImplementation ("maven.modrinth:lambdynamiclights:${project.ldl_version}")
modCompileOnlyApi ("maven.modrinth:lambdabettergrass:${project.lbg_version}") modImplementation ("maven.modrinth:lambdabettergrass:${project.lbg_version}")
modCompileOnly "org.quiltmc:quilt-loader:${rootProject.quilt_loader_version}"
modCompileOnlyApi "org.quiltmc.quilted-fabric-api:quilted-fabric-api:${rootProject.quilt_fabric_api_version}"
modImplementation ("maven.modrinth:iris:${project.iris_version}") modImplementation ("maven.modrinth:iris:${project.iris_version}")
modCompileOnly ("maven.modrinth:cit-resewn:${project.cit_resewn_version}") modImplementation ("maven.modrinth:cit-resewn:${project.cit_resewn_version}")
modCompileOnlyApi ("maven.modrinth:continuity:${project.continuity_version}") modImplementation ("maven.modrinth:colormatic:${project.colormatic_version}")
modImplementation ("maven.modrinth:animatica:${project.animatica_version}")
modCompileOnlyApi ("maven.modrinth:colormatic:${project.colormatic_version}")
modImplementation ("maven.modrinth:borderless-mining:${project.borderless_mining_version}") modImplementation ("maven.modrinth:borderless-mining:${project.borderless_mining_version}")
modImplementation ("maven.modrinth:dynamic-fps:${project.dynamic_fps_version}") modImplementation ("maven.modrinth:dynamic-fps:${project.dynamic_fps_version}")
modImplementation("com.moandjiezana.toml:toml4j:${project.toml4j_version}") modImplementation ("maven.modrinth:entitytexturefeatures:${project.entitytexturefeatures_version}")
modImplementation ("maven.modrinth:entitytexturefeatures:${project.etf_version}") modImplementation ("maven.modrinth:cem:${project.cem_version}")
modImplementation ("maven.modrinth:entity-model-features:${project.emf_version}") modImplementation "com.gitlab.Lortseam:completeconfig:${project.complete_config_version}"
modImplementation ("maven.modrinth:completeconfig:${project.complete_config_version}")
modImplementation ("maven.modrinth:exordium:${project.exordium_version}")
modImplementation("org.aperlambda:lambdajcommon:1.8.1") { modImplementation("org.aperlambda:lambdajcommon:1.8.1") {
exclude group: 'com.google.code.gson' exclude group: 'com.google.code.gson'
exclude group: 'com.google.guava' exclude group: 'com.google.guava'
} }
modImplementation ("maven.modrinth:continuity:${project.continuity_version}") {
exclude module: "modmenu"
}
} }

View File

@@ -6,19 +6,21 @@ import net.irisshaders.iris.api.v0.IrisApi;
import net.irisshaders.iris.api.v0.IrisApiConfig; import net.irisshaders.iris.api.v0.IrisApiConfig;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.Screen;
import net.minecraft.text.LiteralText;
import net.minecraft.text.Style; import net.minecraft.text.Style;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
import net.puzzlemc.gui.screen.widget.PuzzleWidget; import net.puzzlemc.gui.screen.widget.PuzzleWidget;
public class IrisCompat { public class IrisCompat {
public static void init() { public static void init() {
if (FabricLoader.getInstance().isModLoaded("iris")) { if (FabricLoader.getInstance().isModLoaded("iris")) {
PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.of("Iris"))); PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.of("Iris")));
PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.translatable("iris.puzzle.option.enableShaders"), (button) -> button.setMessage(IrisApi.getInstance().getConfig().areShadersEnabled() ? PuzzleClient.YES : PuzzleClient.NO), (button) -> { PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("iris.puzzle.option.enableShaders"), (button) -> button.setMessage(IrisApi.getInstance().getConfig().areShadersEnabled() ? PuzzleClient.YES : PuzzleClient.NO), (button) -> {
IrisApiConfig irisConfig = IrisApi.getInstance().getConfig(); IrisApiConfig irisConfig = IrisApi.getInstance().getConfig();
irisConfig.setShadersEnabledAndApply(!irisConfig.areShadersEnabled()); irisConfig.setShadersEnabledAndApply(!irisConfig.areShadersEnabled());
})); }));
PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.translatable("options.iris.shaderPackSelection.title"), (button) -> button.setMessage(Text.literal("").append(Text.translatable("iris.puzzle.option.open").setStyle(Style.EMPTY.withColor(MidnightColorUtil.radialRainbow(0.5f, 1).getRGB())))), (button) -> { PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("options.iris.shaderPackSelection.title"), (button) -> button.setMessage(new LiteralText("").append(new TranslatableText("iris.puzzle.option.open").setStyle(Style.EMPTY.withColor(MidnightColorUtil.radialRainbow(0.5f, 1).getRGB())))), (button) -> {
MinecraftClient client = MinecraftClient.getInstance(); MinecraftClient client = MinecraftClient.getInstance();
client.setScreen((Screen) IrisApi.getInstance().openMainIrisScreenObj(client.currentScreen)); client.setScreen((Screen) IrisApi.getInstance().openMainIrisScreenObj(client.currentScreen));
})); }));

View File

@@ -18,18 +18,18 @@ public class PuzzleApi {
public static void addToGraphicsOptions(PuzzleWidget button) { public static void addToGraphicsOptions(PuzzleWidget button) {
GRAPHICS_OPTIONS.add(button); GRAPHICS_OPTIONS.add(button);
if (PuzzleConfig.debugMessages) LOGGER.info(button.descriptionText.getContent().toString() + " -> Graphics Options"); if (PuzzleConfig.debugMessages) LOGGER.info(button.descriptionText.toString() + " -> Graphics Options");
} }
public static void addToMiscOptions(PuzzleWidget button) { public static void addToMiscOptions(PuzzleWidget button) {
MISC_OPTIONS.add(button); MISC_OPTIONS.add(button);
if (PuzzleConfig.debugMessages) LOGGER.info(button.descriptionText.getContent().toString() + " -> Misc Options"); if (PuzzleConfig.debugMessages) LOGGER.info(button.descriptionText.toString() + " -> Misc Options");
} }
public static void addToPerformanceOptions(PuzzleWidget button) { public static void addToPerformanceOptions(PuzzleWidget button) {
PERFORMANCE_OPTIONS.add(button); PERFORMANCE_OPTIONS.add(button);
if (PuzzleConfig.debugMessages) LOGGER.info(button.descriptionText.getContent().toString() + "- > Performance Options"); if (PuzzleConfig.debugMessages) LOGGER.info(button.descriptionText.toString() + "- > Performance Options");
} }
public static void addToResourceOptions(PuzzleWidget button) { public static void addToResourceOptions(PuzzleWidget button) {
RESOURCE_OPTIONS.add(button); RESOURCE_OPTIONS.add(button);
if (PuzzleConfig.debugMessages) LOGGER.info(button.descriptionText.getContent().toString() + " -> Resource Options"); if (PuzzleConfig.debugMessages) LOGGER.info(button.descriptionText.toString() + " -> Resource Options");
} }
} }

View File

@@ -8,22 +8,26 @@ import dynamicfps.DynamicFPSConfig;
import dynamicfps.DynamicFPSMod; import dynamicfps.DynamicFPSMod;
import eu.midnightdust.core.MidnightLibClient; import eu.midnightdust.core.MidnightLibClient;
import eu.midnightdust.cullleaves.config.CullLeavesConfig; import eu.midnightdust.cullleaves.config.CullLeavesConfig;
import eu.midnightdust.lib.util.PlatformFunctions;
import io.github.kvverti.colormatic.Colormatic; import io.github.kvverti.colormatic.Colormatic;
import io.github.kvverti.colormatic.ColormaticConfigController; import io.github.kvverti.colormatic.ColormaticConfigController;
import link.infra.borderlessmining.config.ConfigHandler; import link.infra.borderlessmining.config.ConfigHandler;
import me.pepperbell.continuity.client.config.ContinuityConfig; import me.pepperbell.continuity.client.config.ContinuityConfig;
import me.pepperbell.continuity.client.config.Option; import me.pepperbell.continuity.client.config.Option;
import net.dorianpb.cem.internal.config.CemConfig;
import net.dorianpb.cem.internal.config.CemConfigFairy;
import net.dorianpb.cem.internal.config.CemOptions;
import net.minecraft.text.LiteralText;
import net.minecraft.text.TranslatableText;
import net.puzzlemc.core.config.PuzzleConfig; import net.puzzlemc.core.config.PuzzleConfig;
import net.puzzlemc.gui.mixin.CemConfigAccessor;
import net.puzzlemc.gui.screen.widget.PuzzleWidget; import net.puzzlemc.gui.screen.widget.PuzzleWidget;
import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.util.Formatting; import net.minecraft.util.Formatting;
import net.puzzlemc.splashscreen.PuzzleSplashScreen; import net.puzzlemc.splashscreen.PuzzleSplashScreen;
import shcm.shsupercm.fabric.citresewn.config.CITResewnConfig; import shcm.shsupercm.fabric.citresewn.config.CITResewnConfig;
import traben.entity_model_features.config.EMFConfig;
import traben.entity_model_features.utils.EMFManager;
import traben.entity_texture_features.ETFApi; import traben.entity_texture_features.ETFApi;
import traben.entity_texture_features.config.ETFConfig; import traben.entity_texture_features.config.ETFConfig;
import io.github.kvverti.colormatic.ColormaticConfig; import io.github.kvverti.colormatic.ColormaticConfig;
@@ -31,76 +35,76 @@ import io.github.kvverti.colormatic.ColormaticConfig;
public class PuzzleClient implements ClientModInitializer { public class PuzzleClient implements ClientModInitializer {
public final static String id = "puzzle"; public final static String id = "puzzle";
public static final Text YES = Text.translatable("gui.yes").formatted(Formatting.GREEN); public static final Text YES = new TranslatableText("gui.yes").formatted(Formatting.GREEN);
public static final Text NO = Text.translatable("gui.no").formatted(Formatting.RED); public static final Text NO = new TranslatableText("gui.no").formatted(Formatting.RED);
@Override @Override
public void onInitializeClient() { public void onInitializeClient() {
MidnightLibClient.hiddenMods.add("puzzle"); MidnightLibClient.hiddenMods.add("puzzle");
MinecraftClient client = MinecraftClient.getInstance(); MinecraftClient client = MinecraftClient.getInstance();
PuzzleApi.addToMiscOptions(new PuzzleWidget(Text.of("Puzzle"))); PuzzleApi.addToMiscOptions(new PuzzleWidget(Text.of("Puzzle")));
PuzzleApi.addToMiscOptions(new PuzzleWidget(Text.translatable("puzzle.option.check_for_updates"), (button) -> button.setMessage(PuzzleConfig.checkUpdates ? YES : NO), (button) -> { PuzzleApi.addToMiscOptions(new PuzzleWidget(new TranslatableText("puzzle.option.check_for_updates"), (button) -> button.setMessage(PuzzleConfig.checkUpdates ? YES : NO), (button) -> {
PuzzleConfig.checkUpdates = !PuzzleConfig.checkUpdates; PuzzleConfig.checkUpdates = !PuzzleConfig.checkUpdates;
PuzzleConfig.write(id); PuzzleConfig.write(id);
})); }));
PuzzleApi.addToMiscOptions(new PuzzleWidget(Text.translatable("puzzle.option.show_version_info"), (button) -> button.setMessage(PuzzleConfig.showPuzzleInfo ? YES : NO), (button) -> { PuzzleApi.addToMiscOptions(new PuzzleWidget(new TranslatableText("puzzle.option.show_version_info"), (button) -> button.setMessage(PuzzleConfig.showPuzzleInfo ? YES : NO), (button) -> {
PuzzleConfig.showPuzzleInfo = !PuzzleConfig.showPuzzleInfo; PuzzleConfig.showPuzzleInfo = !PuzzleConfig.showPuzzleInfo;
PuzzleConfig.write(id); PuzzleConfig.write(id);
})); }));
PuzzleApi.addToMiscOptions(new PuzzleWidget(Text.translatable("puzzle.midnightconfig.title"), (button) -> button.setMessage(Text.of("OPEN")), (button) -> { PuzzleApi.addToMiscOptions(new PuzzleWidget(new TranslatableText("puzzle.midnightconfig.title"), (button) -> button.setMessage(Text.of("OPEN")), (button) -> {
client.setScreen(PuzzleConfig.getScreen(client.currentScreen, "puzzle")); client.setScreen(PuzzleConfig.getScreen(client.currentScreen, "puzzle"));
})); }));
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.of("Puzzle"))); PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.of("Puzzle")));
if (isActive("puzzle-splashscreen")) { if (FabricLoader.getInstance().isModLoaded("puzzle-splashscreen") && !PuzzleConfig.disabledIntegrations.contains("puzzle-splashscreen")) {
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("puzzle.option.resourcepack_splash_screen"), (button) -> button.setMessage(PuzzleConfig.resourcepackSplashScreen ? YES : NO), (button) -> { PuzzleApi.addToResourceOptions(new PuzzleWidget(new TranslatableText("puzzle.option.resourcepack_splash_screen"), (button) -> button.setMessage(PuzzleConfig.resourcepackSplashScreen ? YES : NO), (button) -> {
PuzzleConfig.resourcepackSplashScreen = !PuzzleConfig.resourcepackSplashScreen; PuzzleConfig.resourcepackSplashScreen = !PuzzleConfig.resourcepackSplashScreen;
PuzzleConfig.write(id); PuzzleConfig.write(id);
PuzzleSplashScreen.resetColors(); PuzzleSplashScreen.resetColors();
MinecraftClient.getInstance().getTextureManager().registerTexture(PuzzleSplashScreen.LOGO, new PuzzleSplashScreen.LogoTexture(PuzzleSplashScreen.LOGO)); MinecraftClient.getInstance().getTextureManager().registerTexture(PuzzleSplashScreen.LOGO, new PuzzleSplashScreen.LogoTexture(PuzzleSplashScreen.LOGO));
})); }));
} }
if (isActive("puzzle-models")) { if (FabricLoader.getInstance().isModLoaded("puzzle-models") && !PuzzleConfig.disabledIntegrations.contains("puzzle-models")) {
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("puzzle.option.unlimited_model_rotations"), (button) -> button.setMessage(PuzzleConfig.unlimitedRotations ? YES : NO), (button) -> { PuzzleApi.addToResourceOptions(new PuzzleWidget(new TranslatableText("puzzle.option.unlimited_model_rotations"), (button) -> button.setMessage(PuzzleConfig.unlimitedRotations ? YES : NO), (button) -> {
PuzzleConfig.unlimitedRotations = !PuzzleConfig.unlimitedRotations; PuzzleConfig.unlimitedRotations = !PuzzleConfig.unlimitedRotations;
PuzzleConfig.write(id); PuzzleConfig.write(id);
})); }));
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("puzzle.option.bigger_custom_models"), (button) -> button.setMessage(PuzzleConfig.biggerModels ? YES : NO), (button) -> { PuzzleApi.addToResourceOptions(new PuzzleWidget(new TranslatableText("puzzle.option.bigger_custom_models"), (button) -> button.setMessage(PuzzleConfig.biggerModels ? YES : NO), (button) -> {
PuzzleConfig.biggerModels = !PuzzleConfig.biggerModels; PuzzleConfig.biggerModels = !PuzzleConfig.biggerModels;
PuzzleConfig.write(id); PuzzleConfig.write(id);
})); }));
} }
if (isActive("cullleaves")) { if (FabricLoader.getInstance().isModLoaded("cullleaves") && !PuzzleConfig.disabledIntegrations.contains("cullleaves")) {
PuzzleApi.addToPerformanceOptions(new PuzzleWidget(Text.of("CullLeaves"))); PuzzleApi.addToPerformanceOptions(new PuzzleWidget(Text.of("CullLeaves")));
PuzzleApi.addToPerformanceOptions(new PuzzleWidget(Text.translatable("cullleaves.puzzle.option.enabled"), (button) -> button.setMessage(CullLeavesConfig.enabled ? YES : NO), (button) -> { PuzzleApi.addToPerformanceOptions(new PuzzleWidget(new TranslatableText("cullleaves.puzzle.option.enabled"), (button) -> button.setMessage(CullLeavesConfig.enabled ? YES : NO), (button) -> {
CullLeavesConfig.enabled = !CullLeavesConfig.enabled; CullLeavesConfig.enabled = !CullLeavesConfig.enabled;
CullLeavesConfig.write("cullleaves"); CullLeavesConfig.write("cullleaves");
MinecraftClient.getInstance().worldRenderer.reload(); MinecraftClient.getInstance().worldRenderer.reload();
})); }));
} }
if (isActive("colormatic")) { if (FabricLoader.getInstance().isModLoaded("colormatic") && !PuzzleConfig.disabledIntegrations.contains("colormatic")) {
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.of("Colormatic"))); PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.of("Colormatic")));
ColormaticConfig colormaticConfig = Colormatic.config(); ColormaticConfig colormaticConfig = Colormatic.config();
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("colormatic.config.option.clearSky"), (button) -> button.setMessage(colormaticConfig.clearSky ? YES : NO), (button) -> { PuzzleApi.addToResourceOptions(new PuzzleWidget(new TranslatableText("colormatic.config.option.clearSky"), (button) -> button.setMessage(colormaticConfig.clearSky ? YES : NO), (button) -> {
colormaticConfig.clearSky = !colormaticConfig.clearSky; colormaticConfig.clearSky = !colormaticConfig.clearSky;
ColormaticConfigController.persist(colormaticConfig); ColormaticConfigController.persist(colormaticConfig);
})); }));
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("colormatic.config.option.clearVoid"), (button) -> button.setMessage(colormaticConfig.clearVoid ? YES : NO), (button) -> { PuzzleApi.addToResourceOptions(new PuzzleWidget(new TranslatableText("colormatic.config.option.clearVoid"), (button) -> button.setMessage(colormaticConfig.clearVoid ? YES : NO), (button) -> {
colormaticConfig.clearVoid = !colormaticConfig.clearVoid; colormaticConfig.clearVoid = !colormaticConfig.clearVoid;
ColormaticConfigController.persist(colormaticConfig); ColormaticConfigController.persist(colormaticConfig);
})); }));
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("colormatic.config.option.blendSkyLight"), (button) -> button.setMessage(colormaticConfig.blendSkyLight ? YES : NO), (button) -> { PuzzleApi.addToResourceOptions(new PuzzleWidget(new TranslatableText("colormatic.config.option.blendSkyLight"), (button) -> button.setMessage(colormaticConfig.blendSkyLight ? YES : NO), (button) -> {
colormaticConfig.blendSkyLight = !colormaticConfig.blendSkyLight; colormaticConfig.blendSkyLight = !colormaticConfig.blendSkyLight;
ColormaticConfigController.persist(colormaticConfig); ColormaticConfigController.persist(colormaticConfig);
})); }));
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("colormatic.config.option.flickerBlockLight"), (button) -> button.setMessage(colormaticConfig.flickerBlockLight ? YES : NO), (button) -> { PuzzleApi.addToResourceOptions(new PuzzleWidget(new TranslatableText("colormatic.config.option.flickerBlockLight"), (button) -> button.setMessage(colormaticConfig.flickerBlockLight ? YES : NO), (button) -> {
colormaticConfig.flickerBlockLight = !colormaticConfig.flickerBlockLight; colormaticConfig.flickerBlockLight = !colormaticConfig.flickerBlockLight;
ColormaticConfigController.persist(colormaticConfig); ColormaticConfigController.persist(colormaticConfig);
})); }));
PuzzleApi.addToResourceOptions(new PuzzleWidget(0, 100, Text.translatable("colormatic.config.option.relativeBlockLightIntensity"), PuzzleApi.addToResourceOptions(new PuzzleWidget(0, 100, new TranslatableText("colormatic.config.option.relativeBlockLightIntensity"),
() -> (int) (100*(1.0 - colormaticConfig.relativeBlockLightIntensityExponent / -16.0)), () -> (int) (100*(1.0 - colormaticConfig.relativeBlockLightIntensityExponent / -16.0)),
(button) -> button.setMessage(Text.translatable("colormatic.config.option.relativeBlockLightIntensity") (button) -> button.setMessage(new TranslatableText("colormatic.config.option.relativeBlockLightIntensity")
.append(": ") .append(": ")
.append(Text.literal(String.valueOf((int)(100 * Math.exp(ColormaticConfig.scaled(colormaticConfig.relativeBlockLightIntensityExponent))))).append("%"))), .append(new LiteralText(String.valueOf((int)(100 * Math.exp(ColormaticConfig.scaled(colormaticConfig.relativeBlockLightIntensityExponent))))).append("%"))),
(slider) -> { (slider) -> {
try { try {
colormaticConfig.relativeBlockLightIntensityExponent = ((1.00 - ((slider.getInt())/100f)) * -16.0); colormaticConfig.relativeBlockLightIntensityExponent = ((1.00 - ((slider.getInt())/100f)) * -16.0);
@@ -109,14 +113,14 @@ public class PuzzleClient implements ClientModInitializer {
catch (NumberFormatException ignored) {} catch (NumberFormatException ignored) {}
})); }));
} }
if (isActive("dynamicfps")) { if (FabricLoader.getInstance().isModLoaded("dynamicfps") && !PuzzleConfig.disabledIntegrations.contains("dynamicfps")) {
PuzzleApi.addToPerformanceOptions(new PuzzleWidget(Text.of("Dynamic FPS"))); PuzzleApi.addToPerformanceOptions(new PuzzleWidget(Text.of("Dynamic FPS")));
DynamicFPSConfig fpsConfig = DynamicFPSMod.config; DynamicFPSConfig fpsConfig = DynamicFPSMod.config;
PuzzleApi.addToPerformanceOptions(new PuzzleWidget(Text.translatable("config.dynamicfps.reduce_when_unfocused"), (button) -> button.setMessage(fpsConfig.reduceFPSWhenUnfocused ? YES : NO), (button) -> { PuzzleApi.addToPerformanceOptions(new PuzzleWidget(new TranslatableText("config.dynamicfps.reduce_when_unfocused"), (button) -> button.setMessage(fpsConfig.reduceFPSWhenUnfocused ? YES : NO), (button) -> {
fpsConfig.reduceFPSWhenUnfocused = !fpsConfig.reduceFPSWhenUnfocused; fpsConfig.reduceFPSWhenUnfocused = !fpsConfig.reduceFPSWhenUnfocused;
fpsConfig.save(); fpsConfig.save();
})); }));
PuzzleApi.addToPerformanceOptions(new PuzzleWidget(0, 60,Text.translatable("config.dynamicfps.unfocused_fps"), () -> fpsConfig.unfocusedFPS, PuzzleApi.addToPerformanceOptions(new PuzzleWidget(0, 60,new TranslatableText("config.dynamicfps.unfocused_fps"), () -> fpsConfig.unfocusedFPS,
(button) -> button.setMessage(Text.of(fpsConfig.unfocusedFPS + " FPS")), (button) -> button.setMessage(Text.of(fpsConfig.unfocusedFPS + " FPS")),
(slider) -> { (slider) -> {
try { try {
@@ -125,15 +129,15 @@ public class PuzzleClient implements ClientModInitializer {
catch (NumberFormatException ignored) {} catch (NumberFormatException ignored) {}
finally {fpsConfig.save();} finally {fpsConfig.save();}
})); }));
PuzzleApi.addToPerformanceOptions(new PuzzleWidget(Text.translatable("config.dynamicfps.restore_when_hovered"), (button) -> button.setMessage(fpsConfig.restoreFPSWhenHovered ? YES : NO), (button) -> { PuzzleApi.addToPerformanceOptions(new PuzzleWidget(new TranslatableText("config.dynamicfps.restore_when_hovered"), (button) -> button.setMessage(fpsConfig.restoreFPSWhenHovered ? YES : NO), (button) -> {
fpsConfig.restoreFPSWhenHovered = !fpsConfig.restoreFPSWhenHovered; fpsConfig.restoreFPSWhenHovered = !fpsConfig.restoreFPSWhenHovered;
fpsConfig.save(); fpsConfig.save();
})); }));
PuzzleApi.addToPerformanceOptions(new PuzzleWidget(Text.translatable("config.dynamicfps.run_gc_on_unfocus"), (button) -> button.setMessage(fpsConfig.runGCOnUnfocus ? YES : NO), (button) -> { PuzzleApi.addToPerformanceOptions(new PuzzleWidget(new TranslatableText("config.dynamicfps.run_gc_on_unfocus"), (button) -> button.setMessage(fpsConfig.runGCOnUnfocus ? YES : NO), (button) -> {
fpsConfig.runGCOnUnfocus = !fpsConfig.runGCOnUnfocus; fpsConfig.runGCOnUnfocus = !fpsConfig.runGCOnUnfocus;
fpsConfig.save(); fpsConfig.save();
})); }));
PuzzleApi.addToPerformanceOptions(new PuzzleWidget(0, 100,Text.translatable("config.dynamicfps.unfocused_volume"), () -> ((Number)(fpsConfig.unfocusedVolumeMultiplier * 100)).intValue(), PuzzleApi.addToPerformanceOptions(new PuzzleWidget(0, 100,new TranslatableText("config.dynamicfps.unfocused_volume"), () -> ((Number)(fpsConfig.unfocusedVolumeMultiplier * 100)).intValue(),
(button) -> button.setMessage(Text.of(((Number)(fpsConfig.unfocusedVolumeMultiplier * 100)).intValue() + "%")), (button) -> button.setMessage(Text.of(((Number)(fpsConfig.unfocusedVolumeMultiplier * 100)).intValue() + "%")),
(slider) -> { (slider) -> {
try { try {
@@ -142,7 +146,7 @@ public class PuzzleClient implements ClientModInitializer {
catch (NumberFormatException ignored) {} catch (NumberFormatException ignored) {}
finally {fpsConfig.save();} finally {fpsConfig.save();}
})); }));
PuzzleApi.addToPerformanceOptions(new PuzzleWidget(0, 100,Text.translatable("config.dynamicfps.hidden_volume"), () -> ((Number)(fpsConfig.hiddenVolumeMultiplier * 100)).intValue(), PuzzleApi.addToPerformanceOptions(new PuzzleWidget(0, 100,new TranslatableText("config.dynamicfps.hidden_volume"), () -> ((Number)(fpsConfig.hiddenVolumeMultiplier * 100)).intValue(),
(button) -> button.setMessage(Text.of(((Number)(fpsConfig.hiddenVolumeMultiplier * 100)).intValue() + "%")), (button) -> button.setMessage(Text.of(((Number)(fpsConfig.hiddenVolumeMultiplier * 100)).intValue() + "%")),
(slider) -> { (slider) -> {
try { try {
@@ -152,59 +156,59 @@ public class PuzzleClient implements ClientModInitializer {
finally {fpsConfig.save();} finally {fpsConfig.save();}
})); }));
} }
if (isActive("borderlessmining")) { if (FabricLoader.getInstance().isModLoaded("borderlessmining") && !PuzzleConfig.disabledIntegrations.contains("borderlessmining")) {
PuzzleApi.addToMiscOptions(new PuzzleWidget(Text.of("Borderless Mining"))); PuzzleApi.addToMiscOptions(new PuzzleWidget(Text.of("Borderless Mining")));
ConfigHandler bmConfig = ConfigHandler.getInstance(); ConfigHandler bmConfig = ConfigHandler.getInstance();
PuzzleApi.addToMiscOptions(new PuzzleWidget(Text.translatable("config.borderlessmining.general.enabled"), (button) -> button.setMessage(bmConfig.isEnabledOrPending() ? YES : NO), (button) -> { PuzzleApi.addToMiscOptions(new PuzzleWidget(new TranslatableText("config.borderlessmining.general.enabled"), (button) -> button.setMessage(bmConfig.isEnabledOrPending() ? YES : NO), (button) -> {
bmConfig.setEnabledPending(!bmConfig.isEnabledOrPending()); bmConfig.setEnabledPending(!bmConfig.isEnabledOrPending());
bmConfig.save(); bmConfig.save();
})); }));
if (MinecraftClient.IS_SYSTEM_MAC) { if (MinecraftClient.IS_SYSTEM_MAC) {
PuzzleApi.addToMiscOptions(new PuzzleWidget(Text.translatable("config.borderlessmining.general.enabledmac"), (button) -> button.setMessage(bmConfig.enableMacOS ? YES : NO), (button) -> { PuzzleApi.addToMiscOptions(new PuzzleWidget(new TranslatableText("config.borderlessmining.general.enabledmac"), (button) -> button.setMessage(bmConfig.enableMacOS ? YES : NO), (button) -> {
bmConfig.enableMacOS = !bmConfig.enableMacOS; bmConfig.enableMacOS = !bmConfig.enableMacOS;
bmConfig.setEnabledPending(bmConfig.isEnabled()); bmConfig.setEnabledPending(bmConfig.isEnabled());
bmConfig.save(); bmConfig.save();
})); }));
} }
} }
if (isActive("iris")) { if (FabricLoader.getInstance().isModLoaded("iris") && !PuzzleConfig.disabledIntegrations.contains("iris")) {
IrisCompat.init(); IrisCompat.init();
} }
} }
public static boolean lateInitDone = false; public static boolean lateInitDone = false;
public static void lateInit() { // Some mods are initialized after Puzzle, so we can't access them in our ClientModInitializer public static void lateInit() { // Some mods are initialized after Puzzle, so we can't access them in our ClientModInitializer
if (isActive("lambdynlights")) { if (FabricLoader.getInstance().isModLoaded("lambdynlights") && !PuzzleConfig.disabledIntegrations.contains("lambdynlights")) {
DynamicLightsConfig ldlConfig = LambDynLights.get().config; DynamicLightsConfig ldlConfig = LambDynLights.get().config;
PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.of("LambDynamicLights"))); PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.of("LambDynamicLights")));
PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.translatable("lambdynlights.option.mode"), (button) -> button.setMessage(ldlConfig.getDynamicLightsMode().getTranslatedText()), (button) -> ldlConfig.setDynamicLightsMode(ldlConfig.getDynamicLightsMode().next()))); PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("lambdynlights.option.mode"), (button) -> button.setMessage(ldlConfig.getDynamicLightsMode().getTranslatedText()), (button) -> ldlConfig.setDynamicLightsMode(ldlConfig.getDynamicLightsMode().next())));
PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.translatable("").append("DynLights: ").append(Text.translatable("lambdynlights.option.light_sources.entities")), (button) -> button.setMessage(ldlConfig.getEntitiesLightSource().get() ? YES : NO), (button) -> ldlConfig.getEntitiesLightSource().set(!ldlConfig.getEntitiesLightSource().get()))); PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("").append("DynLights: ").append(new TranslatableText("lambdynlights.option.light_sources.entities")), (button) -> button.setMessage(ldlConfig.getEntitiesLightSource().get() ? YES : NO), (button) -> ldlConfig.getEntitiesLightSource().set(!ldlConfig.getEntitiesLightSource().get())));
PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.translatable("").append("DynLights: ").append(Text.translatable("lambdynlights.option.light_sources.block_entities")), (button) -> button.setMessage(ldlConfig.getBlockEntitiesLightSource().get() ? YES : NO), (button) -> ldlConfig.getBlockEntitiesLightSource().set(!ldlConfig.getBlockEntitiesLightSource().get()))); PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("").append("DynLights: ").append(new TranslatableText("lambdynlights.option.light_sources.block_entities")), (button) -> button.setMessage(ldlConfig.getBlockEntitiesLightSource().get() ? YES : NO), (button) -> ldlConfig.getBlockEntitiesLightSource().set(!ldlConfig.getBlockEntitiesLightSource().get())));
PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.translatable("").append("DynLights: ").append(Text.translatable("entity.minecraft.creeper")), (button) -> button.setMessage(ldlConfig.getCreeperLightingMode().getTranslatedText()), (button) -> ldlConfig.setCreeperLightingMode(ldlConfig.getCreeperLightingMode().next()))); PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("").append("DynLights: ").append(new TranslatableText("entity.minecraft.creeper")), (button) -> button.setMessage(ldlConfig.getCreeperLightingMode().getTranslatedText()), (button) -> ldlConfig.setCreeperLightingMode(ldlConfig.getCreeperLightingMode().next())));
PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.translatable("").append("DynLights: ").append(Text.translatable("block.minecraft.tnt")), (button) -> button.setMessage(ldlConfig.getTntLightingMode().getTranslatedText()), (button) -> ldlConfig.setTntLightingMode(ldlConfig.getTntLightingMode().next()))); PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("").append("DynLights: ").append(new TranslatableText("block.minecraft.tnt")), (button) -> button.setMessage(ldlConfig.getTntLightingMode().getTranslatedText()), (button) -> ldlConfig.setTntLightingMode(ldlConfig.getTntLightingMode().next())));
PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.translatable("").append("DynLights: ").append(Text.translatable("lambdynlights.option.light_sources.water_sensitive_check")), (button) -> button.setMessage(ldlConfig.getWaterSensitiveCheck().get() ? YES : NO), (button) -> ldlConfig.getWaterSensitiveCheck().set(!ldlConfig.getWaterSensitiveCheck().get()))); PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("").append("DynLights: ").append(new TranslatableText("lambdynlights.option.light_sources.water_sensitive_check")), (button) -> button.setMessage(ldlConfig.getWaterSensitiveCheck().get() ? YES : NO), (button) -> ldlConfig.getWaterSensitiveCheck().set(!ldlConfig.getWaterSensitiveCheck().get())));
} }
if (isActive("citresewn") && CITResewnConfig.INSTANCE != null) { if (FabricLoader.getInstance().isModLoaded("citresewn") && !PuzzleConfig.disabledIntegrations.contains("citresewn") && CITResewnConfig.INSTANCE != null) {
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.of("CIT Resewn"))); PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.of("CIT Resewn")));
CITResewnConfig citConfig = CITResewnConfig.INSTANCE; CITResewnConfig citConfig = CITResewnConfig.INSTANCE;
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("config.citresewn.enabled.title"), (button) -> button.setMessage(citConfig.enabled ? YES : NO), (button) -> { PuzzleApi.addToResourceOptions(new PuzzleWidget(new TranslatableText("config.citresewn.enabled.title"), (button) -> button.setMessage(citConfig.enabled ? YES : NO), (button) -> {
citConfig.enabled = !citConfig.enabled; citConfig.enabled = !citConfig.enabled;
citConfig.write(); citConfig.write();
MinecraftClient.getInstance().reloadResources(); MinecraftClient.getInstance().reloadResources();
})); }));
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("config.citresewn.mute_errors.title"), (button) -> button.setMessage(citConfig.mute_errors ? YES : NO), (button) -> { PuzzleApi.addToResourceOptions(new PuzzleWidget(new TranslatableText("config.citresewn.mute_errors.title"), (button) -> button.setMessage(citConfig.mute_errors ? YES : NO), (button) -> {
citConfig.mute_errors = !citConfig.mute_errors; citConfig.mute_errors = !citConfig.mute_errors;
citConfig.write(); citConfig.write();
})); }));
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("config.citresewn.mute_warns.title"), (button) -> button.setMessage(citConfig.mute_warns ? YES : NO), (button) -> { PuzzleApi.addToResourceOptions(new PuzzleWidget(new TranslatableText("config.citresewn.mute_warns.title"), (button) -> button.setMessage(citConfig.mute_warns ? YES : NO), (button) -> {
citConfig.mute_warns = !citConfig.mute_warns; citConfig.mute_warns = !citConfig.mute_warns;
citConfig.write(); citConfig.write();
})); }));
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("config.citresewn.broken_paths.title"), (button) -> button.setMessage(citConfig.broken_paths ? YES : NO), (button) -> { PuzzleApi.addToResourceOptions(new PuzzleWidget(new TranslatableText("config.citresewn.broken_paths.title"), (button) -> button.setMessage(citConfig.broken_paths ? YES : NO), (button) -> {
citConfig.broken_paths = !citConfig.broken_paths; citConfig.broken_paths = !citConfig.broken_paths;
citConfig.write(); citConfig.write();
})); }));
PuzzleApi.addToResourceOptions(new PuzzleWidget(0, 100,Text.translatable("config.citresewn.cache_ms.title"), () -> citConfig.cache_ms, PuzzleApi.addToResourceOptions(new PuzzleWidget(0, 100,new TranslatableText("config.citresewn.cache_ms.title"), () -> citConfig.cache_ms,
(button) -> button.setMessage(message(citConfig)), (button) -> button.setMessage(message(citConfig)),
(slider) -> { (slider) -> {
try { try {
@@ -214,20 +218,37 @@ public class PuzzleClient implements ClientModInitializer {
citConfig.write(); citConfig.write();
})); }));
} }
if (isActive("lambdabettergrass")) { if (FabricLoader.getInstance().isModLoaded("lambdabettergrass") && !PuzzleConfig.disabledIntegrations.contains("lambdabettergrass")) {
LBGConfig lbgConfig = LambdaBetterGrass.get().config; LBGConfig lbgConfig = LambdaBetterGrass.get().config;
PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.of("LambdaBetterGrass"))); PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.of("LambdaBetterGrass")));
PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.translatable("lambdabettergrass.option.mode"), (button) -> button.setMessage(lbgConfig.getMode().getTranslatedText()), (button) -> lbgConfig.setMode(lbgConfig.getMode().next()))); PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("lambdabettergrass.option.mode"), (button) -> button.setMessage(lbgConfig.getMode().getTranslatedText()), (button) -> lbgConfig.setMode(lbgConfig.getMode().next())));
PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.translatable("lambdabettergrass.option.better_snow"), (button) -> button.setMessage(lbgConfig.hasBetterLayer() ? YES : NO), (button) -> lbgConfig.setBetterLayer(!lbgConfig.hasBetterLayer()))); PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("lambdabettergrass.option.better_snow"), (button) -> button.setMessage(lbgConfig.hasBetterLayer() ? YES : NO), (button) -> lbgConfig.setBetterLayer(!lbgConfig.hasBetterLayer())));
} }
if (isActive("continuity")) { if (FabricLoader.getInstance().isModLoaded("cem") && FabricLoader.getInstance().isModLoaded("completeconfig") && !PuzzleConfig.disabledIntegrations.contains("cem")) {
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.of("Custom Entity Models")));
CemConfig cemConfig = (CemConfig) CemConfigFairy.getConfig();
CemOptions cemOptions = CemConfigFairy.getConfig();
PuzzleApi.addToResourceOptions(new PuzzleWidget(new TranslatableText("config.cem.use_optifine_folder"), (button) -> button.setMessage(cemConfig.useOptifineFolder() ? YES : NO), (button) -> {
((CemConfigAccessor)cemOptions).setUseOptifineFolder(!cemConfig.useOptifineFolder());
cemConfig.save();
}));
PuzzleApi.addToResourceOptions(new PuzzleWidget(new TranslatableText("config.cem.use_new_model_creation_fix"), (button) -> button.setMessage(cemConfig.useTransparentParts() ? YES : NO), (button) -> {
((CemConfigAccessor)cemOptions).setUseModelCreationFix(!cemConfig.useTransparentParts());
cemConfig.save();
}));
PuzzleApi.addToResourceOptions(new PuzzleWidget(new TranslatableText("config.cem.use_old_animations"), (button) -> button.setMessage(cemConfig.useOldAnimations() ? YES : NO), (button) -> {
((CemConfigAccessor)cemOptions).setUseOldAnimations(!cemConfig.useOldAnimations());
cemConfig.save();
}));
}
if (FabricLoader.getInstance().isModLoaded("continuity") && !PuzzleConfig.disabledIntegrations.contains("continuity")) {
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.of("Continuity"))); PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.of("Continuity")));
ContinuityConfig contConfig = ContinuityConfig.INSTANCE; ContinuityConfig contConfig = ContinuityConfig.INSTANCE;
contConfig.getOptionMapView().forEach((s, option) -> { contConfig.getOptionMapView().forEach((s, option) -> {
if (s.equals("use_manual_culling")) return; if (s.equals("use_manual_culling")) return;
try { try {
Option.BooleanOption booleanOption = ((Option.BooleanOption)option); Option.BooleanOption booleanOption = ((Option.BooleanOption)option);
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("options.continuity."+s), (button) -> button.setMessage(booleanOption.get() ? YES : NO), (button) -> { PuzzleApi.addToResourceOptions(new PuzzleWidget(new TranslatableText("options.continuity."+s), (button) -> button.setMessage(booleanOption.get() ? YES : NO), (button) -> {
booleanOption.set(!booleanOption.get()); booleanOption.set(!booleanOption.get());
contConfig.onChange(); contConfig.onChange();
contConfig.save(); contConfig.save();
@@ -235,48 +256,36 @@ public class PuzzleClient implements ClientModInitializer {
} catch (Exception ignored) {} } catch (Exception ignored) {}
}); });
} }
if (isActive("entity_texture_features")) { if (FabricLoader.getInstance().isModLoaded("entity_texture_features") && !PuzzleConfig.disabledIntegrations.contains("entity_texture_features")) {
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("config.entity_texture_features.title"))); PuzzleApi.addToResourceOptions(new PuzzleWidget(new TranslatableText("config.entity_texture_features.title")));
ETFConfig etfConfig = ETFApi.getETFConfigObject(); ETFConfig etfConfig = ETFApi.getETFConfigObject;
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("config.entity_texture_features.enable_custom_textures.title"), (button) -> button.setMessage(etfConfig.enableCustomTextures ? YES : NO), (button) -> { PuzzleApi.addToResourceOptions(new PuzzleWidget(new TranslatableText("config.entity_texture_features.enable_custom_textures.title"), (button) -> button.setMessage(etfConfig.enableCustomTextures ? YES : NO), (button) -> {
etfConfig.enableCustomTextures = !etfConfig.enableCustomTextures; etfConfig.enableCustomTextures = !etfConfig.enableCustomTextures;
ETFApi.saveETFConfigChangesAndResetETF(); ETFApi.saveETFConfigChangesAndResetETF();
})); }));
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("config.entity_texture_features.enable_emissive_textures.title"), (button) -> button.setMessage(etfConfig.enableEmissiveTextures ? YES : NO), (button) -> { PuzzleApi.addToResourceOptions(new PuzzleWidget(new TranslatableText("config.entity_texture_features.enable_emissive_textures.title"), (button) -> button.setMessage(etfConfig.enableEmissiveTextures ? YES : NO), (button) -> {
etfConfig.enableEmissiveTextures = !etfConfig.enableEmissiveTextures; etfConfig.enableEmissiveTextures = !etfConfig.enableEmissiveTextures;
ETFApi.saveETFConfigChangesAndResetETF(); ETFApi.saveETFConfigChangesAndResetETF();
})); }));
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("config.entity_texture_features.emissive_mode.title"), (button) -> button.setMessage( PuzzleApi.addToResourceOptions(new PuzzleWidget(new TranslatableText("config.entity_texture_features.full_bright_emissives.title"), (button) -> button.setMessage(etfConfig.fullBrightEmissives ? Text.of("Brighter") : Text.of("Default")), (button) -> {
Text.literal(etfConfig.emissiveRenderMode.toString())), (button) -> { etfConfig.fullBrightEmissives = !etfConfig.fullBrightEmissives;
etfConfig.emissiveRenderMode = etfConfig.emissiveRenderMode.next();
ETFApi.saveETFConfigChangesAndResetETF(); ETFApi.saveETFConfigChangesAndResetETF();
})); }));
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("config.entity_texture_features.blinking_mob_settings.title"), (button) -> button.setMessage(etfConfig.enableBlinking ? YES : NO), (button) -> { PuzzleApi.addToResourceOptions(new PuzzleWidget(new TranslatableText("config.entity_texture_features.blinking_mob_settings.title"), (button) -> button.setMessage(etfConfig.enableBlinking ? YES : NO), (button) -> {
etfConfig.enableBlinking = !etfConfig.enableBlinking; etfConfig.enableBlinking = !etfConfig.enableBlinking;
ETFApi.saveETFConfigChangesAndResetETF(); ETFApi.saveETFConfigChangesAndResetETF();
})); }));
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("config.entity_texture_features.player_skin_features.title"), (button) -> button.setMessage(etfConfig.skinFeaturesEnabled ? YES : NO), (button) -> { PuzzleApi.addToResourceOptions(new PuzzleWidget(new TranslatableText("config.entity_texture_features.player_skin_features.title"), (button) -> button.setMessage(etfConfig.skinFeaturesEnabled ? YES : NO), (button) -> {
etfConfig.skinFeaturesEnabled = !etfConfig.skinFeaturesEnabled; etfConfig.skinFeaturesEnabled = !etfConfig.skinFeaturesEnabled;
ETFApi.saveETFConfigChangesAndResetETF(); ETFApi.saveETFConfigChangesAndResetETF();
})); }));
} }
if (isActive("entity_model_features")) {
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("entity_model_features.title")));
EMFConfig emfConfig = EMFConfig.getConfig();
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("entity_model_features.config.substitute_vanilla"), (button) -> button.setMessage(emfConfig.attemptToCopyVanillaModelIntoMissingModelPart ? YES : NO), (button) -> {
emfConfig.attemptToCopyVanillaModelIntoMissingModelPart = !emfConfig.attemptToCopyVanillaModelIntoMissingModelPart;
EMFConfig.EMF_saveConfig();
if (EMFConfig.getConfig().reloadMode == EMFConfig.ModelDataRefreshMode.MANUAL) {
EMFManager.resetInstance();
}
}));
}
lateInitDone = true; lateInitDone = true;
} }
public static Text message(CITResewnConfig config) { public static Text message(CITResewnConfig config) {
int ticks = config.cache_ms; int ticks = config.cache_ms;
if (ticks <= 1) { if (ticks <= 1) {
return (Text.translatable("config.citresewn.cache_ms.ticks." + ticks)).formatted(Formatting.AQUA); return (new TranslatableText("config.citresewn.cache_ms.ticks." + ticks)).formatted(Formatting.AQUA);
} else { } else {
Formatting color = Formatting.DARK_RED; Formatting color = Formatting.DARK_RED;
if (ticks <= 40) { if (ticks <= 40) {
@@ -295,10 +304,7 @@ public class PuzzleClient implements ClientModInitializer {
color = Formatting.GREEN; color = Formatting.GREEN;
} }
return (Text.translatable("config.citresewn.cache_ms.ticks.any", ticks)).formatted(color); return (new TranslatableText("config.citresewn.cache_ms.ticks.any", ticks)).formatted(color);
} }
} }
public static boolean isActive(String modid) {
return PlatformFunctions.isModLoaded(modid) && !PuzzleConfig.disabledIntegrations.contains(modid);
}
} }

View File

@@ -0,0 +1,17 @@
package net.puzzlemc.gui.mixin;
import net.dorianpb.cem.internal.config.CemConfig;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(value = CemConfig.class, remap = false)
public interface CemConfigAccessor {
@Accessor("use_optifine_folder")
void setUseOptifineFolder(boolean value);
@Accessor("use_new_model_creation_fix")
void setUseModelCreationFix(boolean value);
@Accessor("use_old_animations")
void setUseOldAnimations(boolean value);
}

View File

@@ -3,6 +3,7 @@ package net.puzzlemc.gui.mixin;
import eu.midnightdust.core.config.MidnightLibConfig; import eu.midnightdust.core.config.MidnightLibConfig;
import eu.midnightdust.lib.util.screen.TexturedOverlayButtonWidget; import eu.midnightdust.lib.util.screen.TexturedOverlayButtonWidget;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.puzzlemc.core.config.PuzzleConfig; import net.puzzlemc.core.config.PuzzleConfig;
import net.puzzlemc.gui.PuzzleClient; import net.puzzlemc.gui.PuzzleClient;
@@ -31,7 +32,7 @@ public abstract class MixinOptionsScreen extends Screen {
int i = 0; int i = 0;
if (FabricLoader.getInstance().isModLoaded("lod")) i = i + 358; if (FabricLoader.getInstance().isModLoaded("lod")) i = i + 358;
if (MidnightLibConfig.config_screen_list.equals(MidnightLibConfig.ConfigButton.FALSE)) i = i - 25; if (MidnightLibConfig.config_screen_list.equals(MidnightLibConfig.ConfigButton.FALSE)) i = i - 25;
this.addDrawableChild(new TexturedOverlayButtonWidget(this.width / 2 - 178 + i, this.height / 6 - 12, 20, 20, 0, 0, 20, PUZZLE_ICON_TEXTURE, 32, 64, (buttonWidget) -> (Objects.requireNonNull(this.client)).setScreen(new PuzzleOptionsScreen(this)), Text.translatable("midnightlib.overview.title"))); this.addDrawableChild(new TexturedOverlayButtonWidget(this.width / 2 - 178 + i, this.height / 6 - 12, 20, 20, 0, 0, 20, PUZZLE_ICON_TEXTURE, 32, 64, (buttonWidget) -> (Objects.requireNonNull(this.client)).setScreen(new PuzzleOptionsScreen(this)), new TranslatableText("midnightlib.overview.title")));
} }
} }
} }

View File

@@ -1,102 +1,48 @@
package net.puzzlemc.gui.screen; package net.puzzlemc.gui.screen;
import com.google.common.collect.Lists;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.tab.GridScreenTab;
import net.minecraft.client.gui.tab.Tab;
import net.minecraft.client.gui.tab.TabManager;
import net.minecraft.client.gui.widget.TabNavigationWidget;
import net.minecraft.screen.ScreenTexts;
import net.minecraft.text.Text;
import net.puzzlemc.gui.PuzzleApi; import net.puzzlemc.gui.PuzzleApi;
import net.minecraft.client.gui.screen.ScreenTexts;
import net.minecraft.text.TranslatableText;
import net.puzzlemc.gui.PuzzleClient; import net.puzzlemc.gui.PuzzleClient;
import net.puzzlemc.gui.screen.widget.PuzzleOptionListWidget; import net.puzzlemc.gui.screen.page.GraphicsPage;
import net.puzzlemc.gui.screen.widget.PuzzleWidget; import net.puzzlemc.gui.screen.page.MiscPage;
import net.puzzlemc.gui.screen.page.PerformancePage;
import net.puzzlemc.gui.screen.page.ResourcesPage;
import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.util.math.MatrixStack;
import java.util.List;
import java.util.Objects; import java.util.Objects;
public class PuzzleOptionsScreen extends Screen { public class PuzzleOptionsScreen extends Screen {
public PuzzleOptionListWidget list;
public List<Text> tooltip = null;
public TabManager tabManager = new TabManager(a -> {}, a -> {});
public Tab prevTab;
public TabNavigationWidget tabNavigation;
public static Text graphicsTab = Text.translatable("puzzle.page.graphics");
public static Text miscTab = Text.translatable("puzzle.page.misc");
public static Text performanceTab = Text.translatable("puzzle.page.performance");
public static Text resourcesTab = Text.translatable("puzzle.page.resources");
public PuzzleOptionsScreen(Screen parent) { public PuzzleOptionsScreen(Screen parent) {
super(Text.translatable("puzzle.screen.title")); super(new TranslatableText("puzzle.screen.title"));
this.parent = parent; this.parent = parent;
} }
private final Screen parent; private final Screen parent;
@Override @Override
protected void init() { protected void init() {
if (!PuzzleClient.lateInitDone) PuzzleClient.lateInit();
List<Tab> tabs = Lists.newArrayList();
if (!PuzzleApi.GRAPHICS_OPTIONS.isEmpty()) tabs.add(new GridScreenTab(graphicsTab));
if (!PuzzleApi.RESOURCE_OPTIONS.isEmpty()) tabs.add(new GridScreenTab(resourcesTab));
if (!PuzzleApi.PERFORMANCE_OPTIONS.isEmpty()) tabs.add(new GridScreenTab(performanceTab));
if (!PuzzleApi.MISC_OPTIONS.isEmpty()) tabs.add(new GridScreenTab(miscTab));
tabNavigation = TabNavigationWidget.builder(tabManager, this.width).tabs(tabs.toArray(new Tab[0])).build();
if (tabs.size() > 1) this.addDrawableChild(tabNavigation);
tabNavigation.selectTab(0, false);
tabNavigation.init();
prevTab = tabManager.getCurrentTab();
this.addDrawableChild(tabNavigation);
this.list = new PuzzleOptionListWidget(this.client, this.width, this.height, 32, this.height - 32, 25);
fillList();
this.addSelectableChild(this.list);
super.init(); super.init();
if (!PuzzleClient.lateInitDone) PuzzleClient.lateInit();
GraphicsPage graphicsPage = new GraphicsPage(this);
MiscPage miscPage = new MiscPage(this);
PerformancePage performancePage = new PerformancePage(this);
ResourcesPage resourcesPage = new ResourcesPage(this);
this.addDrawableChild(ButtonWidget.builder(ScreenTexts.DONE, (button) -> Objects.requireNonNull(client).setScreen(parent)).dimensions(this.width / 2 - 100, this.height - 28, 200, 20).build()); if (!PuzzleApi.GRAPHICS_OPTIONS.isEmpty()) this.addDrawableChild(new ButtonWidget(this.width / 2 - 155, this.height / 6 + 48 - 6, 150, 20, graphicsPage.getTitle().copy().append("..."), (button) -> Objects.requireNonNull(client).setScreen(graphicsPage)));
} if (!PuzzleApi.RESOURCE_OPTIONS.isEmpty()) this.addDrawableChild(new ButtonWidget(this.width / 2 + 5, this.height / 6 + 48 - 6, 150, 20, resourcesPage.getTitle().copy().append("..."), (button) -> Objects.requireNonNull(client).setScreen(resourcesPage)));
private void fillList() { if (!PuzzleApi.PERFORMANCE_OPTIONS.isEmpty()) this.addDrawableChild(new ButtonWidget(this.width / 2 - 155, this.height / 6 + 72 - 6, 150, 20, performancePage.getTitle().copy().append("..."), (button) -> Objects.requireNonNull(client).setScreen(performancePage)));
List<PuzzleWidget> options = List.of(); if (!PuzzleApi.MISC_OPTIONS.isEmpty()) this.addDrawableChild(new ButtonWidget(this.width / 2 + 5, this.height / 6 + 72 - 6, 150, 20, miscPage.getTitle().copy().append("..."), (button) -> Objects.requireNonNull(client).setScreen(miscPage)));
if (tabManager.getCurrentTab() == null) return; this.addDrawableChild(new ButtonWidget(this.width / 2 - 100, this.height / 6 + 168, 200, 20, ScreenTexts.DONE, (button) -> Objects.requireNonNull(client).setScreen(parent)));
else if (tabManager.getCurrentTab().getTitle().equals(graphicsTab)) options = PuzzleApi.GRAPHICS_OPTIONS;
else if (tabManager.getCurrentTab().getTitle().equals(miscTab)) options = PuzzleApi.MISC_OPTIONS;
else if (tabManager.getCurrentTab().getTitle().equals(performanceTab)) options = PuzzleApi.PERFORMANCE_OPTIONS;
else if (tabManager.getCurrentTab().getTitle().equals(resourcesTab)) options = PuzzleApi.RESOURCE_OPTIONS;
list.addAll(options);
}
@Override
public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
if (this.tabNavigation.trySwitchTabsWithKey(keyCode)) return true;
return super.keyPressed(keyCode, scanCode, modifiers);
}
@Override
public void tick() {
super.tick();
if (prevTab != null && prevTab != tabManager.getCurrentTab()) {
prevTab = tabManager.getCurrentTab();
this.list.clear();
fillList();
list.setScrollAmount(0);
}
} }
@Override @Override
public void render(DrawContext context, int mouseX, int mouseY, float delta) { public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
this.renderBackground(context); this.renderBackground(matrices);
if (client != null && client.world != null) this.list.setRenderBackground(false);
this.list.render(context, mouseX, mouseY, delta);
super.render(context, mouseX, mouseY, delta); super.render(matrices, mouseX, mouseY, delta);
if (tooltip != null) { drawCenteredText(matrices, textRenderer, title, width/2, 15, 0xFFFFFF);
if (this.list.getFocused() != null && (this.list.getHoveredEntry() == null || this.list.getHoveredEntry().button == null || !this.list.getHoveredEntry().button.isMouseOver(mouseX, mouseY))) {
context.drawTooltip(textRenderer, tooltip, this.list.getFocused().getX(), this.list.getFocused().getY() + (this.list.getFocused().getHeight() * 2));
}
else context.drawTooltip(textRenderer, tooltip, mouseX, mouseY);
}
tooltip = null;
} }
} }

View File

@@ -0,0 +1,53 @@
package net.puzzlemc.gui.screen.page;
import net.minecraft.client.gui.screen.ScreenTexts;
import net.minecraft.text.Text;
import net.puzzlemc.gui.screen.widget.PuzzleOptionListWidget;
import net.puzzlemc.gui.screen.widget.PuzzleWidget;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.util.math.MatrixStack;
import java.util.List;
import java.util.Objects;
public abstract class AbstractPuzzleOptionsPage extends Screen {
public PuzzleOptionListWidget list;
private final List<PuzzleWidget> options;
public List<Text> tooltip = null;
public AbstractPuzzleOptionsPage(Screen parent, Text title, List<PuzzleWidget> options) {
super(title);
this.parent = parent;
this.options = options;
}
private final Screen parent;
@Override
protected void init() {
this.list = new PuzzleOptionListWidget(this.client, this.width, this.height, 32, this.height - 32, 25);
list.addAll(options);
this.addSelectableChild(this.list);
super.init();
this.addDrawableChild(new ButtonWidget(this.width / 2 - 100, this.height - 28, 200, 20, ScreenTexts.DONE, (button) -> Objects.requireNonNull(client).setScreen(parent)));
}
@Override
public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
this.renderBackground(matrices);
if (client != null && client.world != null) this.list.setRenderBackground(false);
this.list.render(matrices, mouseX, mouseY, delta);
drawCenteredText(matrices, textRenderer, title, width/2, 15, 0xFFFFFF);
super.render(matrices, mouseX, mouseY, delta);
if (tooltip != null) {
if (this.list.getFocused() != null && (this.list.getHoveredEntry() == null || this.list.getHoveredEntry().button == null || !this.list.getHoveredEntry().button.isMouseOver(mouseX, mouseY))) {
renderTooltip(matrices, tooltip, this.list.getFocused().getX() + this.list.getFocused().getWidth(), this.list.getFocused().getY() + (this.list.getFocused().getHeight() * 2));
}
else renderTooltip(matrices, tooltip, mouseX, mouseY);
}
tooltip = null;
}
}

View File

@@ -0,0 +1,12 @@
package net.puzzlemc.gui.screen.page;
import net.minecraft.text.TranslatableText;
import net.puzzlemc.gui.PuzzleApi;
import net.minecraft.client.gui.screen.Screen;
public class GraphicsPage extends AbstractPuzzleOptionsPage {
public GraphicsPage(Screen parent) {
super(parent, new TranslatableText("puzzle.page.graphics"), PuzzleApi.GRAPHICS_OPTIONS);
}
}

View File

@@ -0,0 +1,12 @@
package net.puzzlemc.gui.screen.page;
import net.minecraft.text.TranslatableText;
import net.puzzlemc.gui.PuzzleApi;
import net.minecraft.client.gui.screen.Screen;
public class MiscPage extends AbstractPuzzleOptionsPage {
public MiscPage(Screen parent) {
super(parent, new TranslatableText("puzzle.page.misc"), PuzzleApi.MISC_OPTIONS);
}
}

View File

@@ -0,0 +1,12 @@
package net.puzzlemc.gui.screen.page;
import net.minecraft.text.TranslatableText;
import net.puzzlemc.gui.PuzzleApi;
import net.minecraft.client.gui.screen.Screen;
public class PerformancePage extends AbstractPuzzleOptionsPage {
public PerformancePage(Screen parent) {
super(parent, new TranslatableText("puzzle.page.performance"), PuzzleApi.PERFORMANCE_OPTIONS);
}
}

View File

@@ -0,0 +1,12 @@
package net.puzzlemc.gui.screen.page;
import net.minecraft.text.TranslatableText;
import net.puzzlemc.gui.PuzzleApi;
import net.minecraft.client.gui.screen.Screen;
public class ResourcesPage extends AbstractPuzzleOptionsPage {
public ResourcesPage(Screen parent) {
super(parent, new TranslatableText("puzzle.page.resources"), PuzzleApi.RESOURCE_OPTIONS);
}
}

View File

@@ -1,22 +1,19 @@
package net.puzzlemc.gui.screen.widget; package net.puzzlemc.gui.screen.widget;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import java.util.function.Supplier;
public class PuzzleButtonWidget extends ButtonWidget { public class PuzzleButtonWidget extends ButtonWidget {
private final PuzzleWidget.TextAction title; private final PuzzleWidget.TextAction title;
public PuzzleButtonWidget(int x, int y, int width, int height, PuzzleWidget.TextAction title, PressAction onPress) { public PuzzleButtonWidget(int x, int y, int width, int height, PuzzleWidget.TextAction title, PressAction onPress) {
super(x, y, width, height, Text.of(""), onPress, Supplier::get); super(x, y, width, height, Text.of(""), onPress);
this.title = title; this.title = title;
} }
@Override @Override
public void renderButton(DrawContext context, int mouseX, int mouseY, float delta) { public void renderButton(MatrixStack matrices, int mouseX, int mouseY, float delta) {
title.setTitle(this); title.setTitle(this);
super.renderButton(context, mouseX, mouseY, delta); super.renderButton(matrices, mouseX, mouseY, delta);
} }
} }

View File

@@ -4,16 +4,16 @@ import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer; import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.Element; import net.minecraft.client.gui.Element;
import net.minecraft.client.gui.Selectable; import net.minecraft.client.gui.Selectable;
import net.minecraft.client.gui.widget.ClickableWidget; import net.minecraft.client.gui.widget.ClickableWidget;
import net.minecraft.client.gui.widget.ElementListWidget; import net.minecraft.client.gui.widget.ElementListWidget;
import net.minecraft.client.resource.language.I18n; import net.minecraft.client.resource.language.I18n;
import net.minecraft.client.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.LiteralText;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.text.TranslatableTextContent; import net.minecraft.text.TranslatableText;
import net.puzzlemc.gui.screen.PuzzleOptionsScreen; import net.puzzlemc.gui.screen.page.AbstractPuzzleOptionsPage;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import java.util.*; import java.util.*;
@@ -47,9 +47,6 @@ public class PuzzleOptionListWidget extends ElementListWidget<PuzzleOptionListWi
} }
} }
public void clear() {
super.clearEntries();
}
public int getRowWidth() { public int getRowWidth() {
return 400; return 400;
} }
@@ -81,16 +78,16 @@ public class PuzzleOptionListWidget extends ElementListWidget<PuzzleOptionListWi
return new ButtonEntry(button, text); return new ButtonEntry(button, text);
} }
public void render(DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { public void render(MatrixStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) {
if (button != null) { if (button != null) {
button.setY(y); button.y = y;
button.render(context, mouseX, mouseY, tickDelta); button.render(matrices, mouseX, mouseY, tickDelta);
} }
if (button == null) context.drawCenteredTextWithShadow(textRenderer, Text.literal(" ").append(text).append(" "),x + 200,y+5,0xFFFFFF); if (button == null) drawCenteredText(matrices,textRenderer, new LiteralText(" ").append(text).append(" "),x + 200,y+5,0xFFFFFF);
else context.drawTextWithShadow(textRenderer, text,x+15,y+5,0xFFFFFF); else drawTextWithShadow(matrices,textRenderer, text,x+15,y+5,0xFFFFFF);
if (!(client.currentScreen instanceof PuzzleOptionsScreen page)) return; if (!(client.currentScreen instanceof AbstractPuzzleOptionsPage page)) return;
if (button != null && (button.isMouseOver(mouseX, mouseY) || ((page.list.getHoveredEntry() == null || page.list.getHoveredEntry().button == null || !page.list.getHoveredEntry().button.isMouseOver(mouseX, mouseY)) && button.isFocused())) && text.getContent() instanceof TranslatableTextContent content) { if (button != null && (button.isMouseOver(mouseX, mouseY) || ((page.list.getHoveredEntry() == null || page.list.getHoveredEntry().button == null || !page.list.getHoveredEntry().button.isMouseOver(mouseX, mouseY)) && button.isFocused())) && text instanceof TranslatableText content) {
String key = null; String key = null;
if (I18n.hasTranslation(content.getKey() + ".tooltip")) key = content.getKey() + ".tooltip"; if (I18n.hasTranslation(content.getKey() + ".tooltip")) key = content.getKey() + ".tooltip";
else if (I18n.hasTranslation(content.getKey() + ".desc")) key = content.getKey() + ".desc"; else if (I18n.hasTranslation(content.getKey() + ".desc")) key = content.getKey() + ".desc";
@@ -103,16 +100,16 @@ public class PuzzleOptionListWidget extends ElementListWidget<PuzzleOptionListWi
if (key != null) { if (key != null) {
List<Text> list = new ArrayList<>(); List<Text> list = new ArrayList<>();
for (String str : I18n.translate(key).split("\n")) for (String str : I18n.translate(key).split("\n"))
list.add(Text.literal(str)); list.add(new LiteralText(str));
page.tooltip = list; page.tooltip = list;
} }
} }
} }
public int getY() { public int getY() {
return button.getY(); return button.y;
} }
public int getX() { public int getX() {
return button.getX(); return button.x;
} }
public int getHeight() { public int getHeight() {
return button.getHeight(); return button.getHeight();

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 179 B

View File

@@ -43,6 +43,6 @@
}, },
"breaks": { "breaks": {
"citresewn": "<=1.0.0+1.18.2", "citresewn": "<=1.0.0+1.18.2",
"entity_texture_features": "<3.0.0" "entity_texture_features": "<4.0.0"
} }
} }

View File

@@ -3,7 +3,8 @@
"package": "net.puzzlemc.gui.mixin", "package": "net.puzzlemc.gui.mixin",
"compatibilityLevel": "JAVA_17", "compatibilityLevel": "JAVA_17",
"client": [ "client": [
"MixinOptionsScreen" "MixinOptionsScreen",
"CemConfigAccessor"
], ],
"injectors": { "injectors": {
"defaultRequire": 1 "defaultRequire": 1

View File

@@ -4,7 +4,6 @@ loom {
accessWidenerPath = file("src/main/resources/puzzle-models.accesswidener") accessWidenerPath = file("src/main/resources/puzzle-models.accesswidener")
} }
repositories { repositories {
maven { url "https://maven.terraformersmc.com/releases" }
maven { maven {
url = "https://api.modrinth.com/maven" url = "https://api.modrinth.com/maven"
} }

View File

@@ -4,8 +4,8 @@ import com.google.gson.JsonObject;
import com.google.gson.JsonParseException; import com.google.gson.JsonParseException;
import net.minecraft.client.render.model.json.ModelElement; import net.minecraft.client.render.model.json.ModelElement;
import net.minecraft.util.JsonHelper; import net.minecraft.util.JsonHelper;
import net.minecraft.util.math.Vec3f;
import net.puzzlemc.core.config.PuzzleConfig; import net.puzzlemc.core.config.PuzzleConfig;
import org.joml.Vector3f;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
@@ -14,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(ModelElement.Deserializer.class) @Mixin(ModelElement.Deserializer.class)
public abstract class MixinModelElementDeserializer { public abstract class MixinModelElementDeserializer {
@Shadow protected abstract Vector3f deserializeVec3f(JsonObject object, String name); @Shadow protected abstract Vec3f deserializeVec3f(JsonObject object, String name);
@Inject(at = @At("HEAD"),method = "deserializeRotationAngle", cancellable = true) @Inject(at = @At("HEAD"),method = "deserializeRotationAngle", cancellable = true)
private void puzzle$deserializeRotationAngle(JsonObject object, CallbackInfoReturnable<Float> cir) { private void puzzle$deserializeRotationAngle(JsonObject object, CallbackInfoReturnable<Float> cir) {
@@ -24,10 +24,10 @@ public abstract class MixinModelElementDeserializer {
} }
} }
@Inject(at = @At("HEAD"),method = "deserializeTo", cancellable = true) @Inject(at = @At("HEAD"),method = "deserializeTo", cancellable = true)
private void puzzle$deserializeTo(JsonObject object, CallbackInfoReturnable<Vector3f> cir) { private void puzzle$deserializeTo(JsonObject object, CallbackInfoReturnable<Vec3f> cir) {
if (PuzzleConfig.biggerModels) { if (PuzzleConfig.biggerModels) {
Vector3f vec3f = this.deserializeVec3f(object, "to"); Vec3f vec3f = this.deserializeVec3f(object, "to");
if (!(vec3f.x < -32.0F) && !(vec3f.y < -32.0F) && !(vec3f.z < -32.0F) && !(vec3f.x > 48.0F) && !(vec3f.y > 48.0F) && !(vec3f.z > 48.0F)) { if (!(vec3f.getX() < -32.0F) && !(vec3f.getY() < -32.0F) && !(vec3f.getZ() < -32.0F) && !(vec3f.getX() > 48.0F) && !(vec3f.getY() > 48.0F) && !(vec3f.getZ() > 48.0F)) {
cir.setReturnValue(vec3f); cir.setReturnValue(vec3f);
} else { } else {
throw new JsonParseException("'to' specifier exceeds the allowed boundaries: " + vec3f); throw new JsonParseException("'to' specifier exceeds the allowed boundaries: " + vec3f);
@@ -35,10 +35,10 @@ public abstract class MixinModelElementDeserializer {
} }
} }
@Inject(at = @At("HEAD"),method = "deserializeFrom", cancellable = true) @Inject(at = @At("HEAD"),method = "deserializeFrom", cancellable = true)
private void puzzle$deserializeFrom(JsonObject object, CallbackInfoReturnable<Vector3f> cir) { private void puzzle$deserializeFrom(JsonObject object, CallbackInfoReturnable<Vec3f> cir) {
if (PuzzleConfig.biggerModels) { if (PuzzleConfig.biggerModels) {
Vector3f vec3f = this.deserializeVec3f(object, "from"); Vec3f vec3f = this.deserializeVec3f(object, "from");
if (!(vec3f.x < -32.0F) && !(vec3f.y < -32.0F) && !(vec3f.z < -32.0F) && !(vec3f.x > 48.0F) && !(vec3f.y > 48.0F) && !(vec3f.z > 48.0F)) { if (!(vec3f.getX() < -32.0F) && !(vec3f.getY() < -32.0F) && !(vec3f.getZ() < -32.0F) && !(vec3f.getX() > 48.0F) && !(vec3f.getY() > 48.0F) && !(vec3f.getZ() > 48.0F)) {
cir.setReturnValue(vec3f); cir.setReturnValue(vec3f);
} else { } else {
throw new JsonParseException("'from' specifier exceeds the allowed boundaries: " + vec3f); throw new JsonParseException("'from' specifier exceeds the allowed boundaries: " + vec3f);

View File

@@ -1,6 +1,5 @@
archivesBaseName = "puzzle-splashscreen" archivesBaseName = "puzzle-splashscreen"
repositories { repositories {
maven { url "https://maven.terraformersmc.com/releases" }
maven { maven {
url = "https://api.modrinth.com/maven" url = "https://api.modrinth.com/maven"
} }

View File

@@ -1,10 +1,7 @@
package net.puzzlemc.splashscreen; package net.puzzlemc.splashscreen;
import com.mojang.blaze3d.platform.TextureUtil;
import com.mojang.blaze3d.systems.RenderSystem;
import eu.midnightdust.lib.util.MidnightColorUtil; import eu.midnightdust.lib.util.MidnightColorUtil;
import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.ClientModInitializer;
import net.minecraft.client.texture.AbstractTexture;
import net.minecraft.client.texture.NativeImageBackedTexture; import net.minecraft.client.texture.NativeImageBackedTexture;
import net.minecraft.util.Util; import net.minecraft.util.Util;
import net.minecraft.util.math.ColorHelper; import net.minecraft.util.math.ColorHelper;
@@ -25,13 +22,14 @@ import net.minecraft.util.Identifier;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import java.awt.*; import java.awt.*;
import java.io.*; import java.io.File;
import java.net.URL; import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.nio.file.StandardCopyOption; import java.nio.file.StandardCopyOption;
import java.util.Objects;
import java.util.Properties; import java.util.Properties;
public class PuzzleSplashScreen implements ClientModInitializer { public class PuzzleSplashScreen implements ClientModInitializer {
@@ -68,6 +66,10 @@ public class PuzzleSplashScreen implements ClientModInitializer {
public Identifier getFabricId() { public Identifier getFabricId() {
return new Identifier("puzzle", "splash_screen"); return new Identifier("puzzle", "splash_screen");
} }
public void method_14491(ResourceManager manager) {
reload(manager);
}
@Override @Override
public void reload(ResourceManager manager) { public void reload(ResourceManager manager) {
if (PuzzleConfig.resourcepackSplashScreen) { if (PuzzleConfig.resourcepackSplashScreen) {
@@ -75,8 +77,8 @@ public class PuzzleSplashScreen implements ClientModInitializer {
client.getTextureManager().registerTexture(LOGO, new LogoTexture(LOGO)); client.getTextureManager().registerTexture(LOGO, new LogoTexture(LOGO));
client.getTextureManager().registerTexture(BACKGROUND, new LogoTexture(BACKGROUND)); client.getTextureManager().registerTexture(BACKGROUND, new LogoTexture(BACKGROUND));
manager.findResources("optifine", path -> path.getPath().contains("color.properties")).forEach((id, resource) -> { manager.findResources("optifine", path -> path.contains("color.properties")).forEach(id -> {
try (InputStream stream = manager.getResource(id).get().getInputStream()) { try (InputStream stream = manager.getResource(id).getInputStream()) {
Properties properties = new Properties(); Properties properties = new Properties();
properties.load(stream); properties.load(stream);
@@ -101,16 +103,17 @@ public class PuzzleSplashScreen implements ClientModInitializer {
LogManager.getLogger("Puzzle").error("Error occurred while loading color.properties " + id.toString(), e); LogManager.getLogger("Puzzle").error("Error occurred while loading color.properties " + id.toString(), e);
} }
}); });
manager.findResources("textures", path -> path.getPath().contains("mojangstudios.png")).forEach((id, resource) -> { manager.findResources("textures", path -> path.contains("mojangstudios.png")).forEach(id -> {
try (InputStream stream = manager.getResource(id).get().getInputStream()) { try (InputStream stream = manager.getResource(id).getInputStream()) {
Files.copy(stream, LOGO_TEXTURE, StandardCopyOption.REPLACE_EXISTING); Files.copy(stream, LOGO_TEXTURE, StandardCopyOption.REPLACE_EXISTING);
client.getTextureManager().registerTexture(LOGO, new DynamicLogoTexture()); InputStream input = new FileInputStream(String.valueOf(PuzzleSplashScreen.LOGO_TEXTURE));
client.getTextureManager().registerTexture(LOGO, new NativeImageBackedTexture(NativeImage.read(input)));
} catch (Exception e) { } catch (Exception e) {
LogManager.getLogger("Puzzle").error("Error occurred while loading custom minecraft logo " + id.toString(), e); LogManager.getLogger("Puzzle").error("Error occurred while loading custom minecraft logo " + id.toString(), e);
} }
}); });
manager.findResources("puzzle", path -> path.getPath().contains("splash_background.png")).forEach((id, resource) -> { manager.findResources("puzzle", path -> path.contains("splash_background.png")).forEach(id -> {
try (InputStream stream = manager.getResource(id).get().getInputStream()) { try (InputStream stream = manager.getResource(id).getInputStream()) {
Files.copy(stream, BACKGROUND_TEXTURE, StandardCopyOption.REPLACE_EXISTING); Files.copy(stream, BACKGROUND_TEXTURE, StandardCopyOption.REPLACE_EXISTING);
InputStream input = new FileInputStream(String.valueOf(PuzzleSplashScreen.BACKGROUND_TEXTURE)); InputStream input = new FileInputStream(String.valueOf(PuzzleSplashScreen.BACKGROUND_TEXTURE));
client.getTextureManager().registerTexture(BACKGROUND, new NativeImageBackedTexture(NativeImage.read(input))); client.getTextureManager().registerTexture(BACKGROUND, new NativeImageBackedTexture(NativeImage.read(input)));
@@ -135,9 +138,9 @@ public class PuzzleSplashScreen implements ClientModInitializer {
protected TextureData loadTextureData(ResourceManager resourceManager) { protected TextureData loadTextureData(ResourceManager resourceManager) {
MinecraftClient minecraftClient = MinecraftClient.getInstance(); MinecraftClient minecraftClient = MinecraftClient.getInstance();
DefaultResourcePack defaultResourcePack = minecraftClient.getDefaultResourcePack(); DefaultResourcePack defaultResourcePack = minecraftClient.getResourcePackProvider().getPack();
try { try {
InputStream inputStream = Objects.requireNonNull(defaultResourcePack.open(ResourceType.CLIENT_RESOURCES, LOGO)).get(); InputStream inputStream = defaultResourcePack.open(ResourceType.CLIENT_RESOURCES, LOGO);
TextureData var6; TextureData var6;
try { try {
var6 = new TextureData(new TextureResourceMetadata(true, true), NativeImage.read(inputStream)); var6 = new TextureData(new TextureResourceMetadata(true, true), NativeImage.read(inputStream));
@@ -152,18 +155,4 @@ public class PuzzleSplashScreen implements ClientModInitializer {
} }
} }
} }
@Environment(EnvType.CLIENT)
public static class DynamicLogoTexture extends ResourceTexture {
public DynamicLogoTexture() {
super(LOGO);
}
protected TextureData loadTextureData(ResourceManager resourceManager) {
try {
InputStream input = new FileInputStream(String.valueOf(PuzzleSplashScreen.LOGO_TEXTURE));
return new TextureData(new TextureResourceMetadata(true, true), NativeImage.read(input));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
} }

View File

@@ -2,7 +2,6 @@ package net.puzzlemc.splashscreen.mixin;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.Overlay; import net.minecraft.client.gui.screen.Overlay;
import net.minecraft.client.gui.screen.SplashOverlay; import net.minecraft.client.gui.screen.SplashOverlay;
import net.minecraft.client.render.GameRenderer; import net.minecraft.client.render.GameRenderer;
@@ -46,7 +45,11 @@ public abstract class MixinSplashScreen extends Overlay {
private static void puzzle$initSplashscreen(MinecraftClient client, CallbackInfo ci) { // Load our custom textures at game start // private static void puzzle$initSplashscreen(MinecraftClient client, CallbackInfo ci) { // Load our custom textures at game start //
if (PuzzleConfig.resourcepackSplashScreen) { if (PuzzleConfig.resourcepackSplashScreen) {
if (PuzzleSplashScreen.LOGO_TEXTURE.toFile().exists()) { if (PuzzleSplashScreen.LOGO_TEXTURE.toFile().exists()) {
client.getTextureManager().registerTexture(LOGO, new PuzzleSplashScreen.DynamicLogoTexture()); try {
InputStream input = new FileInputStream(String.valueOf(PuzzleSplashScreen.LOGO_TEXTURE));
client.getTextureManager().registerTexture(LOGO, new NativeImageBackedTexture(NativeImage.read(input)));
} catch (IOException ignored) {
}
} }
if (PuzzleSplashScreen.BACKGROUND_TEXTURE.toFile().exists()) { if (PuzzleSplashScreen.BACKGROUND_TEXTURE.toFile().exists()) {
try { try {
@@ -62,12 +65,12 @@ public abstract class MixinSplashScreen extends Overlay {
return (!PuzzleConfig.resourcepackSplashScreen || PuzzleConfig.progressBarBackgroundColor == 15675965) ? instance.getAsInt() : PuzzleConfig.backgroundColor | 255 << 24; return (!PuzzleConfig.resourcepackSplashScreen || PuzzleConfig.progressBarBackgroundColor == 15675965) ? instance.getAsInt() : PuzzleConfig.backgroundColor | 255 << 24;
} }
@Inject(method = "render", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderSystem;blendFunc(II)V", shift = At.Shift.AFTER), remap = false) @Inject(method = "render", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderSystem;blendFunc(II)V", shift = At.Shift.AFTER), remap = false)
private void puzzle$betterBlend(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) { private void puzzle$betterBlend(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) {
if (PuzzleConfig.disableBlend && PuzzleConfig.resourcepackSplashScreen) RenderSystem.defaultBlendFunc(); if (PuzzleConfig.disableBlend) RenderSystem.defaultBlendFunc();
} }
@Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;getScaledWindowWidth()I", shift = At.Shift.BEFORE, ordinal = 2)) @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/Window;getScaledWidth()I", shift = At.Shift.BEFORE))
private void puzzle$renderSplashBackground(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) { private void puzzle$renderSplashBackground(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) {
if (Files.exists(PuzzleSplashScreen.BACKGROUND_TEXTURE) && PuzzleConfig.resourcepackSplashScreen) { if (Files.exists(PuzzleSplashScreen.BACKGROUND_TEXTURE)) {
int width = client.getWindow().getScaledWidth(); int width = client.getWindow().getScaledWidth();
int height = client.getWindow().getScaledHeight(); int height = client.getWindow().getScaledHeight();
long l = Util.getMeasuringTimeMs(); long l = Util.getMeasuringTimeMs();
@@ -80,31 +83,32 @@ public abstract class MixinSplashScreen extends Overlay {
s = MathHelper.clamp(g, 0.0F, 1.0F); s = MathHelper.clamp(g, 0.0F, 1.0F);
else else
s = 1.0F; s = 1.0F;
RenderSystem.setShaderTexture(0, PuzzleSplashScreen.BACKGROUND);
RenderSystem.enableBlend(); RenderSystem.enableBlend();
RenderSystem.blendEquation(32774); RenderSystem.blendEquation(32774);
RenderSystem.defaultBlendFunc(); RenderSystem.defaultBlendFunc();
RenderSystem.setShader(GameRenderer::getPositionTexProgram); RenderSystem.setShader(GameRenderer::getPositionTexShader);
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, s); RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, s);
context.drawTexture(PuzzleSplashScreen.BACKGROUND, 0, 0, 0, 0, 0, width, height, width, height); drawTexture(matrices, 0, 0, 0, 0, 0, width, height, width, height);
RenderSystem.defaultBlendFunc(); RenderSystem.defaultBlendFunc();
RenderSystem.disableBlend(); RenderSystem.disableBlend();
} }
} }
@Inject(method = "renderProgressBar", at = @At("HEAD")) @Inject(method = "renderProgressBar", at = @At("HEAD"))
private void puzzle$addProgressBarBackground(DrawContext context, int minX, int minY, int maxX, int maxY, float opacity, CallbackInfo ci) { private void puzzle$addProgressBarBackground(MatrixStack matrices, int minX, int minY, int maxX, int maxY, float opacity, CallbackInfo ci) {
RenderSystem.disableBlend();
if (!PuzzleConfig.resourcepackSplashScreen || PuzzleConfig.progressBarBackgroundColor == 15675965) return; if (!PuzzleConfig.resourcepackSplashScreen || PuzzleConfig.progressBarBackgroundColor == 15675965) return;
long l = Util.getMeasuringTimeMs(); long l = Util.getMeasuringTimeMs();
float f = this.reloadCompleteTime > -1L ? (float)(l - this.reloadCompleteTime) / 1000.0F : -1.0F; float f = this.reloadCompleteTime > -1L ? (float)(l - this.reloadCompleteTime) / 1000.0F : -1.0F;
int m = MathHelper.ceil((1.0F - MathHelper.clamp(f - 1.0F, 0.0F, 1.0F)) * 255.0F); int m = MathHelper.ceil((1.0F - MathHelper.clamp(f - 1.0F, 0.0F, 1.0F)) * 255.0F);
RenderSystem.disableBlend(); fill(matrices, minX, minY, maxX, maxY, withAlpha(PuzzleConfig.progressBarBackgroundColor, m));
context.fill(minX, minY, maxX, maxY, withAlpha(PuzzleConfig.progressBarBackgroundColor, m));
} }
@ModifyArg(method = "renderProgressBar", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;fill(IIIII)V"), index = 4) @ModifyArg(method = "renderProgressBar", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/SplashOverlay;fill(Lnet/minecraft/client/util/math/MatrixStack;IIIII)V"), index = 5)
private int puzzle$modifyProgressFrame(int color) { // Set the Progress Bar Frame Color to our configured value // private int puzzle$modifyProgressFrame(int color) { // Set the Progress Bar Frame Color to our configured value //
return (!PuzzleConfig.resourcepackSplashScreen || PuzzleConfig.progressFrameColor == 16777215) ? color : PuzzleConfig.progressFrameColor | 255 << 24; return (!PuzzleConfig.resourcepackSplashScreen || PuzzleConfig.progressFrameColor == 16777215) ? color : PuzzleConfig.progressFrameColor | 255 << 24;
} }
@ModifyArg(method = "renderProgressBar", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;fill(IIIII)V", ordinal = 0), index = 4) @ModifyArg(method = "renderProgressBar", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/SplashOverlay;fill(Lnet/minecraft/client/util/math/MatrixStack;IIIII)V", ordinal = 0), index = 5)
private int puzzle$modifyProgressColor(int color) { // Set the Progress Bar Color to our configured value // private int puzzle$modifyProgressColor(int color) { // Set the Progress Bar Color to our configured value //
return (!PuzzleConfig.resourcepackSplashScreen || PuzzleConfig.progressBarColor == 16777215) ? color : PuzzleConfig.progressBarColor | 255 << 24; return (!PuzzleConfig.resourcepackSplashScreen || PuzzleConfig.progressBarColor == 16777215) ? color : PuzzleConfig.progressBarColor | 255 << 24;
} }

View File

@@ -1,42 +0,0 @@
{
"puzzle.text.update_available":"Даступна абнаўленне!",
"puzzle.screen.title":"Налады Puzzle",
"puzzle.page.graphics":"Графіка",
"puzzle.page.resources":"Рэсурсы",
"puzzle.page.performance":"Прадукцыйнасць",
"puzzle.page.misc":"Рознае",
"puzzle.option.check_for_updates":"Праверыць абнаўленні",
"puzzle.option.check_for_updates.tooltip":"Уключае ўбудаваны правершчык абнаўленняў",
"puzzle.option.show_version_info":"Паказваць версію Puzzle",
"puzzle.option.show_version_info.tooltip":"Паказваць інфармацыю пра бягучую\nверсію Puzzle и наяўнасць абнаўленняў на\nтытульным экране і меню F3",
"puzzle.option.resourcepack_splash_screen":"Выкарыстанне пакетаў рэсурсаў для сплэшэй",
"puzzle.option.resourcepack_splash_screen.tooltip":"Уключае пакеты рэсурсаў, якія змяняюць\nзагрузачныя экраны/сплэшы\nMinecraft, якія выкарыстоўваюць фармат OptiFine",
"puzzle.option.better_splash_screen_blend":"Палепшанае спалучэнне сплэшэй і лагатыпу",
"puzzle.option.better_splash_screen_blend.tooltip":"Змяняе тып спалучэння\nлагатыпу і сплэшэй\nкаб палепшыць працу з лагатыпамі карыстальніцкіх колераў",
"puzzle.option.unlimited_model_rotations":"Неабмежаванае вярчэнне мадэлі",
"puzzle.option.unlimited_model_rotations.tooltip":"Дазваляе вярчэнне на 360° на карыстальніцкіх мадэляў блокаў/прадметаў",
"puzzle.option.bigger_custom_models":"Павялічаныя карыстальніцкія мадэлі",
"puzzle.option.bigger_custom_models.tooltip":"Павялічвае ліміт памеру\nкарыстальніцкіх мадэляў блокаў/прадметаў\nз 3x3x3 да 5x5x5",
"puzzle.midnightconfig.title":"Пашыраныя налады Puzzle",
"puzzle.midnightconfig.category.gui":"GUI",
"puzzle.midnightconfig.category.features":"Асаблівасці",
"puzzle.midnightconfig.category.debug":"Debug",
"puzzle.midnightconfig.tooltip":"Налады толькі для вопытных карыстальнікаў",
"cullleaves.puzzle.option.enabled": "Адбракоўваць лісце",
"cullleaves.puzzle.option.enabled.tooltip": "Уключыць адбракоўванне лісця, каб павялічыць прадукцыйнасць",
"iris.puzzle.option.enableShaders": "Уключыць шэйдэры",
"iris.puzzle.option.enableShaders.tooltip": "Дазваляе уключаць ці выключаць шэйдэры",
"iris.puzzle.option.open": "АДКРЫЦЬ",
"options.iris.shaderPackSelection.tooltip": "Адкрывае экран выбару\nшэйдэраў і іх налад",
"lambdabettergrass.option.mode.tooltip": "Робіць бакі\nзямлі з дзёрнам злучанымі з\nверхам гэтага блоку",
"lambdabettergrass.option.better_snow.tooltip": "Дадае крыху бачны слой снег/імху\nна непоўныя блокі, якія\nакружаны снегам/імхом",
"config.dynamicfps.reduce_when_unfocused.tooltip": "Зніжае FPS у Minecraft калі ён не актыўны\n(то бок калі іншая прагракма адчынена ці гульня згорнута)\nкаб захаваць рэсурсы сістэмы",
"config.dynamicfps.unfocused_fps.tooltip": "Колькасць кадраў у секунду, калі\nMinecraft згорнуты",
"config.dynamicfps.restore_when_hovered.tooltip": "Дазваляе скасаваць ці не\nабмежаванне FPS, калі Minecraft актыны\n(то бок актыўны ці наведзены курсорам з панелі задач)",
"config.dynamicfps.run_gc_on_unfocus.tooltip": "Запусціць збіральнік смецця калі\nMinecraft неактыўны,\n каб ачысціць крыху АЗУ",
"config.dynamicfps.unfocused_volume.tooltip": "Гучнасць прайгравальных гукаў\nкалі гульня не актыўна\n(то бок іншае акно абрана)",
"config.dynamicfps.hidden_volume.tooltip": "Гучнасць прайгравальных гукаў\nкали гульня не бачна\n(то бок згорнута, знаходзіцца пад іншымі вокнамі\nці на ішай віртуальнай машыне)",
"entity_texture_features.puzzle.emissive_type.brighter": "§eЯрчэй",
"entity_texture_features.puzzle.emissive_type.default": "§6Стандартна"
}

View File

@@ -1,10 +1,10 @@
{ {
"puzzle.text.update_available":"Ein Update ist verfügbar!", "puzzle.text.update_available":"Ein Update ist verfügbar!",
"puzzle.screen.title":"Puzzle Einstellungen", "puzzle.screen.title":"Puzzle Einstellungen",
"puzzle.page.graphics":"Grafik", "puzzle.page.graphics":"Grafik Einstellungen",
"puzzle.page.resources":"Resourcen", "puzzle.page.resources":"Resourcen Einstellungen",
"puzzle.page.performance":"Performance", "puzzle.page.performance":"Performance Einstellungen",
"puzzle.page.misc":"Sonstiges", "puzzle.page.misc":"Sonstige Einstellungen",
"puzzle.option.check_for_updates":"Auf Updates überprüfen", "puzzle.option.check_for_updates":"Auf Updates überprüfen",
"puzzle.option.show_version_info":"Zeige Informationen über Puzzle's Version", "puzzle.option.show_version_info":"Zeige Informationen über Puzzle's Version",
"puzzle.option.resourcepack_splash_screen":"Nutze Resourcepack-Ladebildschirm", "puzzle.option.resourcepack_splash_screen":"Nutze Resourcepack-Ladebildschirm",

View File

@@ -1,10 +1,10 @@
{ {
"puzzle.text.update_available":"Μια καινούρια έκδοση είναι διαθέσιμη!", "puzzle.text.update_available":"Μια καινούρια έκδοση είναι διαθέσιμη!",
"puzzle.screen.title":"Ρυθμίσεις του Puzzle", "puzzle.screen.title":"Ρυθμίσεις του Puzzle",
"puzzle.page.graphics":"Γραφικών", "puzzle.page.graphics":"Ρυθμίσεις Γραφικών",
"puzzle.page.resources":"Πόρων", "puzzle.page.resources":"Ρυθμίσεις Πόρων",
"puzzle.page.performance":"Απόδοσης", "puzzle.page.performance":"Ρυθμίσεις Απόδοσης",
"puzzle.page.misc":"Διάφορες", "puzzle.page.misc":"Διάφορες Ρυθμίσεις",
"puzzle.option.check_for_updates":"Έλεγχος για αναβαθμίσεις", "puzzle.option.check_for_updates":"Έλεγχος για αναβαθμίσεις",
"puzzle.option.show_version_info":"Εμφάνηση έκδοσης του Puzzle", "puzzle.option.show_version_info":"Εμφάνηση έκδοσης του Puzzle",
"puzzle.option.resourcepack_splash_screen":"Οθόνη φόρτωσης πακέτου πόρων", "puzzle.option.resourcepack_splash_screen":"Οθόνη φόρτωσης πακέτου πόρων",

View File

@@ -1,10 +1,10 @@
{ {
"puzzle.text.update_available":"An update is available!", "puzzle.text.update_available":"An update is available!",
"puzzle.screen.title":"Puzzle Settings", "puzzle.screen.title":"Puzzle Settings",
"puzzle.page.graphics":"Graphics", "puzzle.page.graphics":"Graphics Settings",
"puzzle.page.resources":"Resource", "puzzle.page.resources":"Resource Settings",
"puzzle.page.performance":"Performance", "puzzle.page.performance":"Performance Settings",
"puzzle.page.misc":"Miscellaneous", "puzzle.page.misc":"Miscellaneous Settings",
"puzzle.option.check_for_updates":"Check for Updates", "puzzle.option.check_for_updates":"Check for Updates",
"puzzle.option.check_for_updates.tooltip":"Enables Puzzle's built-in update checker", "puzzle.option.check_for_updates.tooltip":"Enables Puzzle's built-in update checker",
"puzzle.option.show_version_info":"Show Puzzle version info", "puzzle.option.show_version_info":"Show Puzzle version info",
@@ -18,9 +18,6 @@
"puzzle.option.bigger_custom_models":"Bigger Custom Models", "puzzle.option.bigger_custom_models":"Bigger Custom Models",
"puzzle.option.bigger_custom_models.tooltip":"Increases the limit of\ncustom block/item model sizes\nfrom 3x3x3 to 5x5x5", "puzzle.option.bigger_custom_models.tooltip":"Increases the limit of\ncustom block/item model sizes\nfrom 3x3x3 to 5x5x5",
"puzzle.midnightconfig.title":"Puzzle Advanced Config", "puzzle.midnightconfig.title":"Puzzle Advanced Config",
"puzzle.midnightconfig.category.gui":"GUI",
"puzzle.midnightconfig.category.features":"Features",
"puzzle.midnightconfig.category.debug":"Debug",
"puzzle.midnightconfig.tooltip":"Options for advanced users only", "puzzle.midnightconfig.tooltip":"Options for advanced users only",
"cullleaves.puzzle.option.enabled": "Cull Leaves", "cullleaves.puzzle.option.enabled": "Cull Leaves",

View File

@@ -1,10 +1,10 @@
{ {
"puzzle.text.update_available":"Uuendus on saadaval!", "puzzle.text.update_available":"Uuendus on saadaval!",
"puzzle.screen.title":"Puzzle sätted", "puzzle.screen.title":"Puzzle sätted",
"puzzle.page.graphics":"Graafika", "puzzle.page.graphics":"Graafikasätted",
"puzzle.page.resources":"Ressursi", "puzzle.page.resources":"Ressursisätted",
"puzzle.page.performance":"Jõudlus", "puzzle.page.performance":"Jõudlussätted",
"puzzle.page.misc":"Muud", "puzzle.page.misc":"Muud sätted",
"puzzle.option.check_for_updates":"Uuenduste kontroll", "puzzle.option.check_for_updates":"Uuenduste kontroll",
"puzzle.option.show_version_info":"Kuva Puzzle versiooniteavet", "puzzle.option.show_version_info":"Kuva Puzzle versiooniteavet",
"puzzle.option.resourcepack_splash_screen":"Kasuta ressursipaki laadimiskuva", "puzzle.option.resourcepack_splash_screen":"Kasuta ressursipaki laadimiskuva",

View File

@@ -1,10 +1,10 @@
{ {
"puzzle.text.update_available":"업데이트가 가능합니다!", "puzzle.text.update_available":"업데이트가 가능합니다!",
"puzzle.screen.title":"Puzzle 설정", "puzzle.screen.title":"Puzzle 설정",
"puzzle.page.graphics":"그래픽", "puzzle.page.graphics":"그래픽 설정",
"puzzle.page.resources":"리소스", "puzzle.page.resources":"리소스 설정",
"puzzle.page.performance":"성능", "puzzle.page.performance":"성능 설정",
"puzzle.page.misc":"기타", "puzzle.page.misc":"기타 설정",
"puzzle.option.check_for_updates":"업데이트 확인", "puzzle.option.check_for_updates":"업데이트 확인",
"puzzle.option.show_version_info":"Puzzle 버전 정보 보기", "puzzle.option.show_version_info":"Puzzle 버전 정보 보기",
"puzzle.option.resourcepack_splash_screen":"스플래시 화면에서 리소스팩 사용", "puzzle.option.resourcepack_splash_screen":"스플래시 화면에서 리소스팩 사용",

View File

@@ -1,10 +1,10 @@
{ {
"puzzle.text.update_available":"Aktualizacja jest dostępna!", "puzzle.text.update_available":"Aktualizacja jest dostępna!",
"puzzle.screen.title":"Ustawienia Puzzle", "puzzle.screen.title":"Ustawienia Puzzle",
"puzzle.page.graphics":"Grafiki", "puzzle.page.graphics":"Ustawienia grafiki",
"puzzle.page.resources":"Zasobów", "puzzle.page.resources":"Ustawienia zasobów",
"puzzle.page.performance":"Wydajności", "puzzle.page.performance":"Ustawienia wydajności",
"puzzle.page.misc":"Ustawienia", "puzzle.page.misc":"Różne ustawienia",
"puzzle.option.check_for_updates":"Sprawdź aktualizacje", "puzzle.option.check_for_updates":"Sprawdź aktualizacje",
"puzzle.option.show_version_info":"Pokaż informacje o wersji Puzzle", "puzzle.option.show_version_info":"Pokaż informacje o wersji Puzzle",
"puzzle.option.resourcepack_splash_screen":"Użyj ekranu powitalnego paczek zasobów", "puzzle.option.resourcepack_splash_screen":"Użyj ekranu powitalnego paczek zasobów",

View File

@@ -1,39 +0,0 @@
{
"puzzle.text.update_available":"Uma atualização está disponível!",
"puzzle.screen.title":"Puzzle Definições",
"puzzle.page.graphics":"Gráficas",
"puzzle.page.resources":"Recursos",
"puzzle.page.performance":"Desempenho",
"puzzle.page.misc":"Diversas",
"puzzle.option.check_for_updates":"Verifique se há atualizações",
"puzzle.option.check_for_updates.tooltip":"Ativa o verificador de atualização integrado do Puzzle",
"puzzle.option.show_version_info":"Mostrar informações da versão do Puzzle",
"puzzle.option.show_version_info.tooltip":"Mostrar informações sobre o atual\nVersão do Puzzle e status de atualização em\na tela de título e o menu F3",
"puzzle.option.resourcepack_splash_screen":"Use a tela inicial do pacote de recursos",
"puzzle.option.resourcepack_splash_screen.tooltip":"Permite que os pacotes de recursos mudem a aparência\ndo carregamento do Minecraft/splash\ntela usando o formato OptiFine",
"puzzle.option.better_splash_screen_blend":"Melhor combinação do logotipo da tela inicial",
"puzzle.option.better_splash_screen_blend.tooltip":"Muda o tipo de mistura usado\npelo logotipo na tela inicial\npara trabalhar melhor com logotipos coloridos personalizados",
"puzzle.option.unlimited_model_rotations":"Rotações de modelo ilimitadas",
"puzzle.option.unlimited_model_rotations.tooltip":"Desbloqueia rotação total de 360° em modelos de itens/blocos personalizados",
"puzzle.option.bigger_custom_models":"Modelos personalizados maiores",
"puzzle.option.bigger_custom_models.tooltip":"Aumenta o limite de\ntamanhos de modelo de bloco/item personalizados\nde 3x3x3 a 5x5x5",
"puzzle.midnightconfig.title":"Configuração avançada do Puzzle",
"puzzle.midnightconfig.tooltip":"Opções apenas para usuários avançados",
"cullleaves.puzzle.option.enabled": "Abate de Folhas",
"cullleaves.puzzle.option.enabled.tooltip": "Ative o abate de folhas para melhorar o desempenho",
"iris.puzzle.option.enableShaders": "Ativar sombreadores",
"iris.puzzle.option.enableShaders.tooltip": "Habilitar ou não shaderpacks",
"iris.puzzle.option.open": "ABRIR",
"options.iris.shaderPackSelection.tooltip": "Abra uma tela para selecionar\nshaderpacks e configurá-los",
"lambdabettergrass.option.mode.tooltip": "Faz os lados de\nblocos de grama se conectam a\nblocos de grama adjacentes",
"lambdabettergrass.option.better_snow.tooltip": "Adiciona uma neve puramente visual/camada de musgo\na blocos não completos que\nestão rodeados de neve/musgo",
"config.dynamicfps.reduce_when_unfocused.tooltip": "Reduz o FPS do Minecraft quando desfocado\n(ou seja, outra janela está focada ou o jogo está oculto)\npara economizar energia e recursos do sistema",
"config.dynamicfps.unfocused_fps.tooltip": "A quantidade de quadros por segundo\nMinecraft é permitido\nrenderizar enquanto estiver fora de foco",
"config.dynamicfps.restore_when_hovered.tooltip": "Interromper ou não o\nLimitação de FPS enquanto o Minecraft é visualizado\n(ou seja, pairou na barra de tarefas ou dock)",
"config.dynamicfps.run_gc_on_unfocus.tooltip": "Execute um coletor de lixo enquanto\nMinecraft não está focado em\nliberar um pouco de RAM",
"config.dynamicfps.unfocused_volume.tooltip": "O volume que o jogo deve reproduzir\nsom enquanto desfocado\n(ou seja, outra janela é selecionada)",
"config.dynamicfps.hidden_volume.tooltip": "O volume que o jogo deve reproduzir\nsom em enquanto não visível\n(ou seja, minimizado, coberto por outras janelas\nem em outra área de trabalho virtual)",
"entity_texture_features.puzzle.emissive_type.brighter": "§eMais brilhante",
"entity_texture_features.puzzle.emissive_type.default": "§6Padrão"
}

View File

@@ -1,48 +1,17 @@
{ {
"puzzle.text.update_available":"Доступно обновление!", "puzzle.text.update_available":"Доступно обновление!",
"puzzle.screen.title":"Настройки Puzzle", "puzzle.screen.title":"Настройки Puzzle",
"puzzle.page.graphics":"Графика", "puzzle.page.graphics":"Настройки графики",
"puzzle.page.resources":"Ресурсы", "puzzle.page.resources":"Настройки ресурсов",
"puzzle.page.performance":"Оптимизация", "puzzle.page.performance":"Производительность",
"puzzle.page.misc":"Прочие", "puzzle.page.misc":"Прочие настройки",
"puzzle.option.check_for_updates":"Проверять обновления", "puzzle.option.check_for_updates":"Проверять обновления",
"puzzle.option.check_for_updates.tooltip":"Включить встроенную в Puzzle проверку обновлений",
"puzzle.option.show_version_info":"Показывать информацию о версии", "puzzle.option.show_version_info":"Показывать информацию о версии",
"puzzle.option.show_version_info.tooltip":"Отображать информацию о текущей версии\nPuzzle и наличии обновлений\nна главном экране и экране отладки",
"puzzle.option.resourcepack_splash_screen":"Пользовательский экран загрузки", "puzzle.option.resourcepack_splash_screen":"Пользовательский экран загрузки",
"puzzle.option.resourcepack_splash_screen.tooltip":"Разрешить наборам ресурсов изменять\nвнешний вид экрана загрузки Minecraft,\nиспользуя формат OptiFine",
"puzzle.option.better_splash_screen_blend":"Улучшенное смешивание логотипа", "puzzle.option.better_splash_screen_blend":"Улучшенное смешивание логотипа",
"puzzle.option.better_splash_screen_blend.tooltip":"Изменить метод смешивания, используемый\nдля логотипа на экране загрузки,\nчтобы улучшить вид с изменёнными цветами", "puzzle.option.emissive_textures":"Светящиеся текстуры",
"puzzle.option.unlimited_model_rotations":"Неограниченные повороты моделей", "puzzle.option.unlimited_model_rotations":"Неограниченные повороты моделей",
"puzzle.option.unlimited_model_rotations.tooltip":"Разрешить поворот частей\nпользовательских моделей\nблоков/предметов на 360°",
"puzzle.option.bigger_custom_models":"Увеличенный размер моделей", "puzzle.option.bigger_custom_models":"Увеличенный размер моделей",
"puzzle.option.bigger_custom_models.tooltip":"Увеличить предельный размер\nпользовательских моделей блоков\nи предметов с 3×3×3 до 5×5×5", "puzzle.option.render_layer_overrides":"Пользовательские слои отрисовки",
"puzzle.midnightconfig.title":"Расширенные настройки Puzzle", "puzzle.midnightconfig.title":"Расширенные настройки Puzzle"
"puzzle.midnightconfig.category.gui":"Интерфейс",
"puzzle.midnightconfig.category.features":"Функционал",
"puzzle.midnightconfig.category.debug":"Отладка",
"puzzle.midnightconfig.tooltip":"Только для продвинутых пользователей!",
"cullleaves.puzzle.option.enabled": "Отбраковка листьев",
"cullleaves.puzzle.option.enabled.tooltip": "Включить отбраковку блоков листьев\nдля улучшения производительности",
"iris.puzzle.option.enableShaders": "Шейдеры",
"iris.puzzle.option.enableShaders.tooltip": "Включить выбранный набор шейдеров",
"iris.puzzle.option.open": "Выбрать ",
"options.iris.shaderPackSelection.tooltip": "Открыть экран переключения\nи настройки наборов шейдеров",
"lambdabettergrass.option.mode.tooltip": "Включить соединение текстуры\nтравы у соседних блоков дёрна",
"lambdabettergrass.option.better_snow.tooltip": "Добавить имитацию наличия слоя снега\nили мха для неполных блоков, имеющих\nсоответствующее окружение",
"config.dynamicfps.reduce_when_unfocused.tooltip": "Уменьшать FPS в Minecraft при переходе в фон\nдля экономии энергии и системных ресурсов\n(когда игра свёрнута или активно другое окно)",
"config.dynamicfps.unfocused_fps.tooltip": "Фактическое количество\nкадров в секунду, которое\nMinecraft сможет выводить\nв фоновом режиме",
"config.dynamicfps.restore_when_hovered.tooltip": "Отключать ограничение FPS,\nкогда на окно с Minecraft\nнаведён курсор мыши",
"config.dynamicfps.run_gc_on_unfocus.tooltip": "Запускать сборщик мусора при\nпереходе игры в фон, чтобы\nосвободить пространство в ОЗУ\n(уменьшает число просадок FPS)",
"config.dynamicfps.unfocused_volume.tooltip": "Громкость звука игры в состоянии фона\n(когда активно другое окно)",
"config.dynamicfps.hidden_volume.tooltip": "Громкость звука игры в скрытом состоянии\n(когда окно свёрнуто, закрыто другим окном\nили находится на другом рабочем столе)",
"entity_texture_features.puzzle.emissive_type.brighter": "§eЯркие",
"entity_texture_features.puzzle.emissive_type.default": "§6Обычные",
"modmenu.descriptionTranslation.puzzle": "Функции улучшения внешнего вида и производительности.",
"modmenu.descriptionTranslation.puzzle-base": "Общий код всех модулей Puzzle.",
"modmenu.descriptionTranslation.puzzle-gui": "Альтернативы Optifine, объединённые в едином меню.",
"modmenu.descriptionTranslation.puzzle-models": "Больше свободы моделям блоков и предметов!",
"modmenu.descriptionTranslation.puzzle-splashscreen": "Свой экран загрузки при помощи наборов ресурсов."
} }

View File

@@ -1,42 +0,0 @@
{
"puzzle.text.update_available":"Đã có bản cập nhật!",
"puzzle.screen.title":"Cài đặt Puzzle",
"puzzle.page.graphics":"Đồ họa",
"puzzle.page.resources":"Tài nguyên",
"puzzle.page.performance":"Hiệu năng",
"puzzle.page.misc":"Khác",
"puzzle.option.check_for_updates":"Kiểm tra cập nhật",
"puzzle.option.check_for_updates.tooltip":"Bật trình kiểm tra cập nhật tích hợp của Puzzle",
"puzzle.option.show_version_info":"Hiển thị thông tin phiên bản Puzzle",
"puzzle.option.show_version_info.tooltip":"Hiển thị thông tin về phiên bản \nPuzzle hiện tại và trạng thái cập nhật trên\nMàn hình Tiêu đề và Menu F3",
"puzzle.option.resourcepack_splash_screen":"Sử dụng màn hình đốm gói tài nguyên",
"puzzle.option.resourcepack_splash_screen.tooltip":"Cho phép gói tài nguyên thay đổi giao diện\nmàn hình tải/đốm\ncủa Minecraft bằng định dạng OptiFine",
"puzzle.option.better_splash_screen_blend":"Logo màn hình đốm tốt hơn",
"puzzle.option.better_splash_screen_blend.tooltip":"Thay đổi kiểu hòa trộn được sử dụng\nbởi biểu trưng trên màn hình đốm\nđể hoạt động tốt hơn với các biểu trưng có màu tùy chỉnh",
"puzzle.option.unlimited_model_rotations":"Xoay mô hình không giới hạn",
"puzzle.option.unlimited_model_rotations.tooltip":"Mở khóa xoay 360° đầy đủ trên các mô hình khối/vật phẩm tùy chỉnh",
"puzzle.option.bigger_custom_models":"Mô hình tùy chỉnh lớn hơn",
"puzzle.option.bigger_custom_models.tooltip":"Tăng giới hạn của\nkích thước mô hình khối/vật phẩm tùy chỉnh\ntừ 3x3x3 lên 5x5x5",
"puzzle.midnightconfig.title":"Cấu hình Puzzle nâng cao",
"puzzle.midnightconfig.category.gui":"GUI",
"puzzle.midnightconfig.category.features":"Tính năng",
"puzzle.midnightconfig.category.debug":"Gỡ lỗi",
"puzzle.midnightconfig.tooltip":"Tùy chọn chỉ dành cho người dùng nâng cao",
"cullleaves.puzzle.option.enabled": "Loại bỏ Lá",
"cullleaves.puzzle.option.enabled.tooltip": "Bật tính năng loại bỏ lá để nâng cao hiệu suất",
"iris.puzzle.option.enableShaders": "Bật Shader",
"iris.puzzle.option.enableShaders.tooltip": "Bật shaderpack",
"iris.puzzle.option.open": "MỞ",
"options.iris.shaderPackSelection.tooltip": "Mở một màn hình để chọn\nshaderpack và định cấu hình chúng",
"lambdabettergrass.option.mode.tooltip": "Làm cho các cạnh của\nkhối cỏ kết nối với\nkhối cỏ liền kề",
"lambdabettergrass.option.better_snow.tooltip": "Thêm một lớp tuyết/rêu hoàn toàn trực quan\nvào các khối không đầy đủ\nđược bao quanh bởi tuyết/rêu",
"config.dynamicfps.reduce_when_unfocused.tooltip": "Giảm FPS của Minecraft khi không tập trung\n(tức là một cửa sổ khác được tập trung hoặc trò chơi bị ẩn)\nđể tiết kiệm năng lượng và tài nguyên hệ thống",
"config.dynamicfps.unfocused_fps.tooltip": "Lượng khung hình mỗi giây\nMinecraft được phép\nkết xuất khi không tập trung",
"config.dynamicfps.restore_when_hovered.tooltip": "Dừng giới hạn\nFPS trong khi Minecraft được xem trước\n(tức là được di chuột trên thanh tác vụ hoặc thanh công cụ)",
"config.dynamicfps.run_gc_on_unfocus.tooltip": "Chạy trình thu gom rác trong khi\nMinecraft không tập trung vào\ngiải phóng một số RAM",
"config.dynamicfps.unfocused_volume.tooltip": "Âm lượng mà trò chơi sẽ phát\nâm thanh khi không tập trung\n(tức là một cửa sổ khác được chọn)",
"config.dynamicfps.hidden_volume.tooltip": "Âm lượng mà trò chơi sẽ phát\nâm thanh trong khi không hiển thị\n(tức là được thu nhỏ, bị che bởi các cửa sổ khác\ncũng như trên màn hình ảo khác)",
"entity_texture_features.puzzle.emissive_type.brighter": "§eSáng hơn",
"entity_texture_features.puzzle.emissive_type.default": "§6Mặc định"
}

View File

@@ -1,39 +1,17 @@
{ {
"puzzle.text.update_available": "有新版本可供升級!", "puzzle.text.update_available":"有新版本可供升級!",
"puzzle.screen.title": "Puzzle 設定", "puzzle.screen.title":"拼圖設置",
"puzzle.page.graphics": "顯示設", "puzzle.page.graphics":"顯示設",
"puzzle.page.resources": "資源設", "puzzle.page.resources":"資源設",
"puzzle.page.performance": "能設", "puzzle.page.performance":"能設",
"puzzle.page.misc": "其他設", "puzzle.page.misc":"其他設",
"puzzle.option.check_for_updates": "檢查更新", "puzzle.option.check_for_updates":"檢查更新",
"puzzle.option.check_for_updates.tooltip": "開啟 Puzzle 內建的更新檢查", "puzzle.option.show_version_info":"顯示拼圖版本信息",
"puzzle.option.show_version_info": "顯示 Puzzle 版本信息", "puzzle.option.resourcepack_splash_screen":"使用資源包的加載界面",
"puzzle.option.show_version_info.tooltip": "在標題畫面和 F3 選單上\n顯示有關目前 Puzzle 版本和更新狀態的資訊", "puzzle.option.disable_splash_screen_blend":"禁止加載界面徽標渲染",
"puzzle.option.resourcepack_splash_screen": "使用資源包載入畫面", "puzzle.option.emissive_textures":"發光貼圖",
"puzzle.option.resourcepack_splash_screen.tooltip": "使資源包可以使用 OptiFine 格式\n更改 Minecraft 的載入畫面", "puzzle.option.unlimited_model_rotations":"無限模型旋轉",
"puzzle.option.better_splash_screen_blend": "更好的載入畫面圖示混和", "puzzle.option.bigger_custom_models":"更大的自定義模型",
"puzzle.option.better_splash_screen_blend.tooltip": "更改激活畫面上標誌的混合方式\n以便更好地與自訂顏色的標誌配合使用", "puzzle.option.render_layer_overrides":"覆蓋渲染層",
"puzzle.option.unlimited_model_rotations": "無限模型旋轉", "puzzle.midnightconfig.title":"拼圖高級設置"
"puzzle.option.unlimited_model_rotations.tooltip": "在自訂方塊/物品模型上解鎖完整 360° 旋轉",
"puzzle.option.bigger_custom_models": "更大的自訂模型",
"puzzle.option.bigger_custom_models.tooltip": "增加將自訂方塊/物品模型大小\n從 3x3x3 增加到 5x5x5",
"puzzle.midnightconfig.title": "Puzzle 進階設定",
"puzzle.midnightconfig.tooltip": "給予進階使用者使用的選項",
"cullleaves.puzzle.option.enabled": "樹葉剔除",
"cullleaves.puzzle.option.enabled.tooltip": "開啟樹葉剔除以提升效能。",
"iris.puzzle.option.enableShaders": "開啟光影",
"iris.puzzle.option.enableShaders.tooltip": "開啟或關閉光影包",
"iris.puzzle.option.open": "開",
"options.iris.shaderPackSelection.tooltip": "開啟選擇畫面光影包和設定",
"lambdabettergrass.option.mode.tooltip": "讓草的側面連接相鄰的草塊",
"lambdabettergrass.option.better_snow.tooltip": "對雪塊/苔蘚方塊被包圍的不完整方塊\n增加視覺效果",
"config.dynamicfps.reduce_when_unfocused.tooltip": "當 Minecraft 失去焦點時限制 FPS\n如切換到其他視窗或是遊戲被隱藏\n以節省電源和系統資源",
"config.dynamicfps.unfocused_fps.tooltip": "當 Minecraft 失去焦點時允許的最大 FPS",
"config.dynamicfps.restore_when_hovered.tooltip": "開啟或關閉預覽 Mineceraft 時是否停止 FPS 限制\n如停留在工作列或 Dock",
"config.dynamicfps.run_gc_on_unfocus.tooltip": "當 Minecraft 失去焦點時執行垃圾清理\n以減少一些記憶體",
"config.dynamicfps.unfocused_volume.tooltip": "當 Minecraft 失去焦點時撥放的音量\n如選擇了另一個視窗",
"config.dynamicfps.hidden_volume.tooltip": "遊戲在不可見時應該播放的音量\n如最小化、被其他視窗覆蓋或在另一個虛擬桌面上",
"entity_texture_features.puzzle.emissive_type.brighter": "§e更亮",
"entity_texture_features.puzzle.emissive_type.default": "§6預設"
} }