14 Commits

Author SHA1 Message Date
Motschen
bc01662cda Puzzle 1.6.0 - 1.20.2 & Stability improvements
- Port to 1.20.2
- Improve stability by skipping outdated compat entries
- Update EMF integration
2023-09-24 21:18:45 +02:00
Martin Prokoph
1dc7245a99 Merge pull request #72 from Gazmanovich/1.20-1
Create be_by.json
2023-09-23 12:24:59 +02:00
Martin Prokoph
860d969c1d Merge pull request #69 from ImVietnam/patch-1
Create vi_vn.json
2023-09-23 12:24:37 +02:00
Alex Gazmanovich
acd3dbf9e2 Create be_by.json 2023-08-09 12:02:14 +03:00
I_am_Vietnam
cbd48603d2 Create vi_vn.json 2023-07-19 11:18:10 +07:00
Motschen
f91274dd90 Puzzle 1.5.2 - Fix crash without ModMenu
Fixes #67 & #68
2023-07-12 11:34:38 +02:00
Motschen
884ee8caf6 Puzzle 1.5.1 - 1.20 & Fixes
- Update to 1.20
- Fix version string behaving weirdly with ModMenu installed
- Integration for CEM replaced with EMF
2023-06-10 18:55:29 +02:00
Martin Prokoph
c921f3ff99 Update Traditional Chinese by @notlin4
Update Traditional Chinese by @notlin4
2023-06-10 16:52:45 +02:00
Martin Prokoph
3a873df26a Merge pull request #60 from Felix14-v2/1.19.4
Update ru_ru.json
2023-06-10 16:49:57 +02:00
Martin Prokoph
e3615a79c4 Merge pull request #62 from Madis0/patch-2
Readme badges
2023-05-24 19:02:01 +02:00
Madis Otenurm
2704c2c80b Update README.md 2023-05-16 07:43:05 +03:00
Felix14-v2
83897109fe Update ru_ru.json
Oops
2023-04-21 15:41:08 +03:00
Felix14-v2
fc20a1b182 Update ru_ru.json 2023-04-21 15:29:29 +03:00
Motschen
b979d5ac61 Puzzle 1.5.0 - 1.19.4, Options overhaul, Fixed splash screen
- Port to 1.19.4
- Overhaul the Puzzle Options screen
  - Categories are now displayed via tabs
- Fix #50 (Splash screen logo being pixelated)
- Add compatibility with Exordium
2023-03-15 18:54:29 +01:00
43 changed files with 394 additions and 393 deletions

View File

@@ -1,2 +1,4 @@
# 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 "0.12-SNAPSHOT" apply false id "fabric-loom" version "1.2-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"
@@ -131,9 +131,10 @@ dependencies {
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.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.github.Lortseam.completeconfig:base:${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'

View File

@@ -3,33 +3,37 @@ 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.19.3 minecraft_version=1.20.2
yarn_mappings=1.19.3+build.5 yarn_mappings=1.20.2+build.1
loader_version=0.14.12 loader_version=0.14.22
# Mod Properties # Mod Properties
mod_version = 1.4.2-1.19.3 mod_version = 1.6.0+1.20.2
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.70.0+1.19.3 fabric_version=0.89.2+1.20.2
mod_menu_version = 5.0.2 mod_menu_version = 7.0.1
midnightlib_version = 1.5.0-fabric
cull_leaves_version = 3.0.2-fabric cull_leaves_version = 3.0.2-fabric
ldl_version = 2.2.0+1.19.3 ldl_version = 2.3.2+1.20.1
lbg_version = 1.3.0+1.19 lbg_version = 1.5.2+1.20.1
iris_version = 1.19.3-v1.4.6 iris_version = 1.6.9+1.20.2
continuity_version = 2.0.0+1.19 continuity_version = 3.0.0-beta.3+1.20.1
animatica_version = 0.5+1.19 animatica_version = 0.6+1.20
colormatic_version = 3.1.2 colormatic_version = 3.1.2
borderless_mining_version = 1.1.6+1.19.3 borderless_mining_version = 1.1.8+1.20.1
dynamic_fps_version = 2.2.0 dynamic_fps_version = 3.2.0
toml4j_version = 0.7.2 toml4j_version = 0.7.2
cit_resewn_version = 1.1.1+1.19 cit_resewn_version = 1.1.3+1.20
cem_version = 0.7.1-1.19.3 complete_config_version = 2.3.0
complete_config_version = 2.2.0 spruceui_version=5.0.0+1.20
spruceui_version=4.1.0+1.19.3 emf_version=1.0.2
midnightlib_version=1.1.0-fabric etf_version=4.5.1
entitytexturefeatures_version=4.2.0.1.fabric.1.19.3 exordium_version=1.2.1-1.20.2
# 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-7.3-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View File

@@ -1,9 +1,11 @@
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 public static List<String> disabledIntegrations = new ArrayList<>(); @Entry(category = "gui", name = "Disabled integrations") public static List<String> disabledIntegrations = new ArrayList<>();
@Entry public static boolean enablePuzzleButton = true; @Entry(category = "gui", name = "Enable Puzzle button") public static boolean enablePuzzleButton = true;
@Entry public static boolean debugMessages = false; @Entry(category = "debug", name = "Enable debug messages") public static boolean debugMessages = false;
@Entry public static boolean checkUpdates = true; @Entry(category = "debug", name = "puzzle.option.check_for_updates") public static boolean checkUpdates = true;
@Entry public static boolean showPuzzleInfo = true; @Entry(category = "gui", name = "puzzle.option.show_version_info") public static boolean showPuzzleInfo = true;
@Entry public static boolean resourcepackSplashScreen = true; @Entry(category = "features", name = "puzzle.option.resourcepack_splash_screen") public static boolean resourcepackSplashScreen = true;
@Entry public static boolean unlimitedRotations = true; @Entry(category = "features", name = "puzzle.option.unlimited_model_rotations") public static boolean unlimitedRotations = true;
@Entry public static boolean biggerModels = true; @Entry(category = "features", name = "puzzle.option.bigger_custom_models") public static boolean biggerModels = true;
@Entry public static int backgroundColor = 15675965; @Entry(category = "features", name = "Splash Background Color") public static int backgroundColor = 15675965;
@Entry public static int progressBarColor = 16777215; @Entry(category = "features", name = "Splash Progress Bar Color") public static int progressBarColor = 16777215;
@Entry public static int progressBarBackgroundColor = 15675965; @Entry(category = "features", name = "Splash Progress Bar Background Color") public static int progressBarBackgroundColor = 15675965;
@Entry public static int progressFrameColor = 16777215; @Entry(category = "features", name = "Splash Progress Bar Frame Color") public static int progressFrameColor = 16777215;
@Entry public static boolean disableBlend = false; @Entry(category = "features", name = "puzzle.option.better_splash_screen_blend") public static boolean disableBlend = false;
} }

View File

@@ -4,7 +4,6 @@ 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;
@@ -14,7 +13,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 extends DrawableHelper { public abstract class MixinDebugHud {
@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,59 +1,50 @@
package net.puzzlemc.core.mixin; package net.puzzlemc.core.mixin;
import net.fabricmc.loader.api.FabricLoader; import eu.midnightdust.lib.util.PlatformFunctions;
import net.minecraft.client.gui.widget.PressableTextWidget;
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) {
yOffset = 20; int yOffset = 8;
if (FabricLoader.getInstance().isModLoaded("dashloader")) yOffset = yOffset + 10; if (PlatformFunctions.isModLoaded("modmenu") && ModMenuUtil.hasClassicButton()) {
yOffset += 12;
}
Text puzzleText;
if (UpdateChecker.isUpToDate) { if (UpdateChecker.isUpToDate) {
puzzleText = Text.of(PuzzleCore.version); puzzleText = Text.literal(versionText);
} }
else { else {
puzzleText = Text.translatable("").append(Text.of(PuzzleCore.version + " | ")).append(Text.translatable("puzzle.text.update_available")); puzzleText = Text.literal("").append(Text.of(versionText+" | ")).append(Text.translatable("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) {
float f = this.doBackgroundFade ? (float) (Util.getMeasuringTimeMs() - this.backgroundFadeStart) / 1000.0F : 1.0F; PressableTextWidget text = this.addDrawableChild(new PressableTextWidget(2, this.height - 12 - yOffset, this.textRenderer.getWidth(puzzleText), 10, puzzleText, (button) -> {
float g = this.doBackgroundFade ? MathHelper.clamp(f - 1.0F, 0.0F, 1.0F) : 1.0F; if (Objects.requireNonNull(this.client).options.getChatLinksPrompt().getValue()) {
int l = MathHelper.ceil(g * 255.0F) << 24; this.client.setScreen(new ConfirmLinkScreen(this::confirmLink, PuzzleCore.updateURL, true));
textRenderer.drawWithShadow(matrices, puzzleText,2,this.height - yOffset, 16777215 | l); } else {
if (mouseX > 2 && mouseX < 2 + this.puzzleTextWidth && mouseY > this.height - yOffset && mouseY < this.height - yOffset + 10) { Util.getOperatingSystem().open(PuzzleCore.updateURL);
fill(matrices, 2, this.height - yOffset + 9, 2 + this.puzzleTextWidth, this.height - yOffset + 10, 16777215 | l); }
} }, this.textRenderer));
if (UpdateChecker.isUpToDate) text.active = false;
} }
} }
@@ -63,16 +54,4 @@ 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.getChatLinksPrompt().getValue()) {
this.client.setScreen(new ConfirmLinkScreen(this::confirmLink, PuzzleCore.updateURL, true));
} else {
Util.getOperatingSystem().open(PuzzleCore.updateURL);
}
cir.setReturnValue(false);
}
}
} }

View File

@@ -0,0 +1,9 @@
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().getGame().getVersion().getId(); private static final String minecraftVersion = MinecraftClient.getInstance().getGameVersion();
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,6 +27,7 @@ repositories {
maven { maven {
url "https://maven.shedaniel.me/" url "https://maven.shedaniel.me/"
} }
maven { url "https://maven.quiltmc.org/repository/release/" }
} }
dependencies { dependencies {
@@ -35,25 +36,28 @@ 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}") modCompileOnlyApi ("maven.modrinth:lambdabettergrass:${project.lbg_version}")
modImplementation ("maven.modrinth:iris:${project.iris_version}") modCompileOnly "org.quiltmc:quilt-loader:${rootProject.quilt_loader_version}"
modImplementation ("maven.modrinth:cit-resewn:${project.cit_resewn_version}") modCompileOnlyApi "org.quiltmc.quilted-fabric-api:quilted-fabric-api:${rootProject.quilt_fabric_api_version}"
modCompileOnlyApi ("maven.modrinth:iris:${project.iris_version}")
modCompileOnly ("maven.modrinth:cit-resewn:${project.cit_resewn_version}")
modCompileOnlyApi ("maven.modrinth:continuity:${project.continuity_version}")
modCompileOnlyApi ("maven.modrinth:animatica:${project.animatica_version}")
modCompileOnlyApi ("maven.modrinth:colormatic:${project.colormatic_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 ("maven.modrinth:entitytexturefeatures:${project.entitytexturefeatures_version}") modImplementation("com.moandjiezana.toml:toml4j:${project.toml4j_version}")
modImplementation ("maven.modrinth:cem:${project.cem_version}") modImplementation ("maven.modrinth:entitytexturefeatures:${project.etf_version}")
modImplementation "com.github.Lortseam.completeconfig:base:${project.complete_config_version}" modImplementation ("maven.modrinth:entity-model-features:${project.emf_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'
} }
modCompileOnlyApi ("maven.modrinth:continuity:${project.continuity_version}") {
exclude module: "modmenu"
}
} }

View File

@@ -1,13 +1,12 @@
package net.puzzlemc.gui; package net.puzzlemc.gui;
import eu.midnightdust.lib.util.MidnightColorUtil;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
import net.irisshaders.iris.api.v0.IrisApi; 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.Style;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
import net.puzzlemc.gui.screen.widget.PuzzleWidget; import net.puzzlemc.gui.screen.widget.PuzzleWidget;
public class IrisCompat { public class IrisCompat {
@@ -18,7 +17,7 @@ public class IrisCompat {
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(Text.translatable("options.iris.shaderPackSelection.title"), (button) -> button.setMessage(Text.literal("").append(Text.translatable("iris.puzzle.option.open").formatted(Formatting.GOLD))), (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

@@ -4,38 +4,35 @@ import dev.lambdaurora.lambdabettergrass.LBGConfig;
import dev.lambdaurora.lambdabettergrass.LambdaBetterGrass; import dev.lambdaurora.lambdabettergrass.LambdaBetterGrass;
import dev.lambdaurora.lambdynlights.DynamicLightsConfig; import dev.lambdaurora.lambdynlights.DynamicLightsConfig;
import dev.lambdaurora.lambdynlights.LambDynLights; import dev.lambdaurora.lambdynlights.LambDynLights;
import dynamicfps.DynamicFPSConfig;
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.minecraft.screen.ScreenTexts;
import net.dorianpb.cem.internal.config.CemConfigFairy; import net.minecraft.util.Identifier;
import net.dorianpb.cem.internal.config.CemOptions;
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_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;
import traben.entity_texture_features.texture_handlers.ETFManager;
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 = Text.translatable("gui.yes").formatted(Formatting.GREEN);
public static final Text NO = Text.translatable("gui.no").formatted(Formatting.RED); public static final Text NO = Text.translatable("gui.no").formatted(Formatting.RED);
public static final Identifier PUZZLE_BUTTON = new Identifier(id, "icon/button");
@Override @Override
public void onInitializeClient() { public void onInitializeClient() {
@@ -54,7 +51,7 @@ public class PuzzleClient implements ClientModInitializer {
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 (FabricLoader.getInstance().isModLoaded("puzzle-splashscreen") && !PuzzleConfig.disabledIntegrations.contains("puzzle-splashscreen")) { if (isActive("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(Text.translatable("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);
@@ -62,7 +59,7 @@ public class PuzzleClient implements ClientModInitializer {
MinecraftClient.getInstance().getTextureManager().registerTexture(PuzzleSplashScreen.LOGO, new PuzzleSplashScreen.LogoTexture(PuzzleSplashScreen.LOGO)); MinecraftClient.getInstance().getTextureManager().registerTexture(PuzzleSplashScreen.LOGO, new PuzzleSplashScreen.LogoTexture(PuzzleSplashScreen.LOGO));
})); }));
} }
if (FabricLoader.getInstance().isModLoaded("puzzle-models") && !PuzzleConfig.disabledIntegrations.contains("puzzle-models")) { if (isActive("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(Text.translatable("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);
@@ -72,7 +69,7 @@ public class PuzzleClient implements ClientModInitializer {
PuzzleConfig.write(id); PuzzleConfig.write(id);
})); }));
} }
if (FabricLoader.getInstance().isModLoaded("cullleaves") && !PuzzleConfig.disabledIntegrations.contains("cullleaves")) { if (isActive("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(Text.translatable("cullleaves.puzzle.option.enabled"), (button) -> button.setMessage(CullLeavesConfig.enabled ? YES : NO), (button) -> {
CullLeavesConfig.enabled = !CullLeavesConfig.enabled; CullLeavesConfig.enabled = !CullLeavesConfig.enabled;
@@ -80,7 +77,7 @@ public class PuzzleClient implements ClientModInitializer {
MinecraftClient.getInstance().worldRenderer.reload(); MinecraftClient.getInstance().worldRenderer.reload();
})); }));
} }
if (FabricLoader.getInstance().isModLoaded("colormatic") && !PuzzleConfig.disabledIntegrations.contains("colormatic")) { if (isActive("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(Text.translatable("colormatic.config.option.clearSky"), (button) -> button.setMessage(colormaticConfig.clearSky ? YES : NO), (button) -> {
@@ -112,50 +109,7 @@ public class PuzzleClient implements ClientModInitializer {
catch (NumberFormatException ignored) {} catch (NumberFormatException ignored) {}
})); }));
} }
if (FabricLoader.getInstance().isModLoaded("dynamicfps") && !PuzzleConfig.disabledIntegrations.contains("dynamicfps")) { if (isActive("borderlessmining")) {
PuzzleApi.addToPerformanceOptions(new PuzzleWidget(Text.of("Dynamic FPS")));
DynamicFPSConfig fpsConfig = DynamicFPSMod.config;
PuzzleApi.addToPerformanceOptions(new PuzzleWidget(Text.translatable("config.dynamicfps.reduce_when_unfocused"), (button) -> button.setMessage(fpsConfig.reduceFPSWhenUnfocused ? YES : NO), (button) -> {
fpsConfig.reduceFPSWhenUnfocused = !fpsConfig.reduceFPSWhenUnfocused;
fpsConfig.save();
}));
PuzzleApi.addToPerformanceOptions(new PuzzleWidget(0, 60,Text.translatable("config.dynamicfps.unfocused_fps"), () -> fpsConfig.unfocusedFPS,
(button) -> button.setMessage(Text.of(fpsConfig.unfocusedFPS + " FPS")),
(slider) -> {
try {
fpsConfig.unfocusedFPS = slider.getInt();
}
catch (NumberFormatException ignored) {}
finally {fpsConfig.save();}
}));
PuzzleApi.addToPerformanceOptions(new PuzzleWidget(Text.translatable("config.dynamicfps.restore_when_hovered"), (button) -> button.setMessage(fpsConfig.restoreFPSWhenHovered ? YES : NO), (button) -> {
fpsConfig.restoreFPSWhenHovered = !fpsConfig.restoreFPSWhenHovered;
fpsConfig.save();
}));
PuzzleApi.addToPerformanceOptions(new PuzzleWidget(Text.translatable("config.dynamicfps.run_gc_on_unfocus"), (button) -> button.setMessage(fpsConfig.runGCOnUnfocus ? YES : NO), (button) -> {
fpsConfig.runGCOnUnfocus = !fpsConfig.runGCOnUnfocus;
fpsConfig.save();
}));
PuzzleApi.addToPerformanceOptions(new PuzzleWidget(0, 100,Text.translatable("config.dynamicfps.unfocused_volume"), () -> ((Number)(fpsConfig.unfocusedVolumeMultiplier * 100)).intValue(),
(button) -> button.setMessage(Text.of(((Number)(fpsConfig.unfocusedVolumeMultiplier * 100)).intValue() + "%")),
(slider) -> {
try {
fpsConfig.unfocusedVolumeMultiplier = ((Number)slider.getInt()).floatValue() / 100;
}
catch (NumberFormatException ignored) {}
finally {fpsConfig.save();}
}));
PuzzleApi.addToPerformanceOptions(new PuzzleWidget(0, 100,Text.translatable("config.dynamicfps.hidden_volume"), () -> ((Number)(fpsConfig.hiddenVolumeMultiplier * 100)).intValue(),
(button) -> button.setMessage(Text.of(((Number)(fpsConfig.hiddenVolumeMultiplier * 100)).intValue() + "%")),
(slider) -> {
try {
fpsConfig.hiddenVolumeMultiplier = ((Number)slider.getInt()).floatValue() / 100;
}
catch (NumberFormatException ignored) {}
finally {fpsConfig.save();}
}));
}
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(Text.translatable("config.borderlessmining.general.enabled"), (button) -> button.setMessage(bmConfig.isEnabledOrPending() ? YES : NO), (button) -> {
@@ -170,13 +124,13 @@ public class PuzzleClient implements ClientModInitializer {
})); }));
} }
} }
if (FabricLoader.getInstance().isModLoaded("iris") && !PuzzleConfig.disabledIntegrations.contains("iris")) { if (isActive("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 (FabricLoader.getInstance().isModLoaded("lambdynlights") && !PuzzleConfig.disabledIntegrations.contains("lambdynlights")) { if (isActive("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")));
@@ -187,7 +141,7 @@ public class PuzzleClient implements ClientModInitializer {
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(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(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(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())));
} }
if (FabricLoader.getInstance().isModLoaded("citresewn") && !PuzzleConfig.disabledIntegrations.contains("citresewn") && CITResewnConfig.INSTANCE != null) { if (isActive("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(Text.translatable("config.citresewn.enabled.title"), (button) -> button.setMessage(citConfig.enabled ? YES : NO), (button) -> {
@@ -217,30 +171,13 @@ public class PuzzleClient implements ClientModInitializer {
citConfig.write(); citConfig.write();
})); }));
} }
if (FabricLoader.getInstance().isModLoaded("lambdabettergrass") && !PuzzleConfig.disabledIntegrations.contains("lambdabettergrass")) { if (isActive("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(Text.translatable("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(Text.translatable("lambdabettergrass.option.better_snow"), (button) -> button.setMessage(lbgConfig.hasBetterLayer() ? YES : NO), (button) -> lbgConfig.setBetterLayer(!lbgConfig.hasBetterLayer())));
} }
if (FabricLoader.getInstance().isModLoaded("cem") && FabricLoader.getInstance().isModLoaded("completeconfig") && !PuzzleConfig.disabledIntegrations.contains("cem")) { if (isActive("continuity")) {
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.of("Custom Entity Models")));
CemConfig cemConfig = (CemConfig) CemConfigFairy.getConfig();
CemOptions cemOptions = CemConfigFairy.getConfig();
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("config.cem.use_optifine_folder"), (button) -> button.setMessage(cemConfig.useOptifineFolder() ? YES : NO), (button) -> {
((CemConfigAccessor)cemOptions).setUseOptifineFolder(!cemConfig.useOptifineFolder());
cemConfig.save();
}));
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("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(Text.translatable("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) -> {
@@ -249,15 +186,14 @@ public class PuzzleClient implements ClientModInitializer {
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(Text.translatable("options.continuity."+s), (button) -> button.setMessage(booleanOption.get() ? YES : NO), (button) -> {
booleanOption.set(!booleanOption.get()); booleanOption.set(!booleanOption.get());
contConfig.onChange();
contConfig.save(); contConfig.save();
})); }));
} catch (Exception ignored) {} } catch (Exception ignored) {}
}); });
} }
if (FabricLoader.getInstance().isModLoaded("entity_texture_features") && !PuzzleConfig.disabledIntegrations.contains("entity_texture_features")) { if (isActive("entity_texture_features")) {
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("config.entity_texture_features.title"))); PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("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(Text.translatable("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();
@@ -280,6 +216,21 @@ public class PuzzleClient implements ClientModInitializer {
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.force_models"), (button) -> button.setMessage(emfConfig.attemptRevertingEntityModelsAlteredByAnotherMod ? YES : NO), (button) -> {
emfConfig.attemptRevertingEntityModelsAlteredByAnotherMod = !emfConfig.attemptRevertingEntityModelsAlteredByAnotherMod;
EMFConfig.EMF_saveConfig();
}));
if (PlatformFunctions.isModLoaded("physicsmod")) {
PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.translatable("entity_model_features.config.physics"), (button) -> button.setMessage(emfConfig.attemptPhysicsModPatch_2 != EMFConfig.PhysicsModCompatChoice.OFF ?
Text.translatable("entity_model_features.config." + (emfConfig.attemptPhysicsModPatch_2 == EMFConfig.PhysicsModCompatChoice.VANILLA ? "physics.1" : "physics.2")) : ScreenTexts.OFF), (button) -> {
emfConfig.attemptPhysicsModPatch_2 = emfConfig.attemptPhysicsModPatch_2.next();
EMFConfig.EMF_saveConfig();
}));
}
}
lateInitDone = true; lateInitDone = true;
} }
public static Text message(CITResewnConfig config) { public static Text message(CITResewnConfig config) {
@@ -307,4 +258,7 @@ public class PuzzleClient implements ClientModInitializer {
return (Text.translatable("config.citresewn.cache_ms.ticks.any", ticks)).formatted(color); return (Text.translatable("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

@@ -1,17 +0,0 @@
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

@@ -1,9 +1,8 @@
package net.puzzlemc.gui.mixin; 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 net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.util.Identifier; import net.minecraft.client.gui.widget.TextIconButtonWidget;
import net.puzzlemc.core.config.PuzzleConfig; import net.puzzlemc.core.config.PuzzleConfig;
import net.puzzlemc.gui.PuzzleClient; import net.puzzlemc.gui.PuzzleClient;
import net.puzzlemc.gui.screen.PuzzleOptionsScreen; import net.puzzlemc.gui.screen.PuzzleOptionsScreen;
@@ -19,8 +18,6 @@ import java.util.Objects;
@Mixin(OptionsScreen.class) @Mixin(OptionsScreen.class)
public abstract class MixinOptionsScreen extends Screen { public abstract class MixinOptionsScreen extends Screen {
private static final Identifier PUZZLE_ICON_TEXTURE = new Identifier(PuzzleClient.id, "textures/gui/puzzle_button.png");
protected MixinOptionsScreen(Text title) { protected MixinOptionsScreen(Text title) {
super(title); super(title);
} }
@@ -31,7 +28,9 @@ 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"))); TextIconButtonWidget iconButton = TextIconButtonWidget.builder(Text.translatable("puzzle.screen.title"), (buttonWidget) -> (Objects.requireNonNull(this.client)).setScreen(new PuzzleOptionsScreen(this)), true).dimension(20, 20).texture(PuzzleClient.PUZZLE_BUTTON, 20, 20).build();
iconButton.setPosition(this.width / 2 - 178 + i, this.height / 6 - 12);
this.addDrawableChild(iconButton);
} }
} }
} }

View File

@@ -1,20 +1,33 @@
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.screen.ScreenTexts;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.puzzlemc.gui.PuzzleApi; import net.puzzlemc.gui.PuzzleApi;
import net.puzzlemc.gui.PuzzleClient; import net.puzzlemc.gui.PuzzleClient;
import net.puzzlemc.gui.screen.page.GraphicsPage; import net.puzzlemc.gui.screen.widget.PuzzleOptionListWidget;
import net.puzzlemc.gui.screen.page.MiscPage; import net.puzzlemc.gui.screen.widget.PuzzleWidget;
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(Text.translatable("puzzle.screen.title"));
@@ -24,25 +37,66 @@ public class PuzzleOptionsScreen extends Screen {
@Override @Override
protected void init() { protected void init() {
super.init();
if (!PuzzleClient.lateInitDone) PuzzleClient.lateInit(); 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);
if (!PuzzleApi.GRAPHICS_OPTIONS.isEmpty()) this.addDrawableChild(ButtonWidget.builder(graphicsPage.getTitle().copy().append("..."), (button) -> Objects.requireNonNull(client).setScreen(graphicsPage)).dimensions(this.width / 2 - 155, this.height / 6 + 48 - 6, 150, 20).build()); List<Tab> tabs = Lists.newArrayList();
if (!PuzzleApi.RESOURCE_OPTIONS.isEmpty()) this.addDrawableChild(ButtonWidget.builder(resourcesPage.getTitle().copy().append("..."), (button) -> Objects.requireNonNull(client).setScreen(resourcesPage)).dimensions(this.width / 2 + 5, this.height / 6 + 48 - 6, 150, 20).build()); if (!PuzzleApi.GRAPHICS_OPTIONS.isEmpty()) tabs.add(new GridScreenTab(graphicsTab));
if (!PuzzleApi.PERFORMANCE_OPTIONS.isEmpty()) this.addDrawableChild(ButtonWidget.builder(performancePage.getTitle().copy().append("..."), (button) -> Objects.requireNonNull(client).setScreen(performancePage)).dimensions(this.width / 2 - 155, this.height / 6 + 72 - 6, 150, 20).build()); if (!PuzzleApi.RESOURCE_OPTIONS.isEmpty()) tabs.add(new GridScreenTab(resourcesTab));
if (!PuzzleApi.MISC_OPTIONS.isEmpty()) this.addDrawableChild(ButtonWidget.builder(miscPage.getTitle().copy().append("..."), (button) -> Objects.requireNonNull(client).setScreen(miscPage)).dimensions(this.width / 2 + 5, this.height / 6 + 72 - 6, 150, 20).build()); if (!PuzzleApi.PERFORMANCE_OPTIONS.isEmpty()) tabs.add(new GridScreenTab(performanceTab));
this.addDrawableChild(ButtonWidget.builder(ScreenTexts.DONE, (button) -> Objects.requireNonNull(client).setScreen(parent)).dimensions(this.width / 2 - 100, this.height / 6 + 168, 200, 20).build()); 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();
if (client != null && client.world != null) this.list.setRenderBackground(false);
this.addDrawableChild(ButtonWidget.builder(ScreenTexts.DONE, (button) -> Objects.requireNonNull(client).setScreen(parent)).dimensions(this.width / 2 - 100, this.height - 28, 200, 20).build());
}
private void fillList() {
List<PuzzleWidget> options = List.of();
if (tabManager.getCurrentTab() == null) return;
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(MatrixStack matrices, int mouseX, int mouseY, float delta) { public void render(DrawContext context, int mouseX, int mouseY, float delta) {
this.renderBackground(matrices); super.render(context, mouseX, mouseY, delta);
super.render(matrices, mouseX, mouseY, delta); this.list.render(context, mouseX, mouseY, delta);
drawCenteredText(matrices, textRenderer, title, width/2, 15, 0xFFFFFF);
if (tooltip != null) {
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

@@ -1,53 +0,0 @@
package net.puzzlemc.gui.screen.page;
import net.minecraft.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(ButtonWidget.builder(ScreenTexts.DONE, (button) -> Objects.requireNonNull(client).setScreen(parent)).dimensions(this.width / 2 - 100, this.height - 28, 200, 20).build());
}
@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

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

View File

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

View File

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

View File

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

View File

@@ -1,5 +1,6 @@
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;
@@ -14,8 +15,10 @@ public class PuzzleButtonWidget extends ButtonWidget {
this.title = title; this.title = title;
} }
@Override @Override
public void renderButton(MatrixStack matrices, int mouseX, int mouseY, float delta) { public void renderButton(DrawContext context, int mouseX, int mouseY, float delta) {
title.setTitle(this); try {
super.renderButton(matrices, mouseX, mouseY, delta); title.setTitle(this);
} catch (Exception e) {e.printStackTrace(); this.visible = false;}
super.renderButton(context, mouseX, mouseY, delta);
} }
} }

View File

@@ -4,15 +4,15 @@ 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.text.Text; import net.minecraft.text.Text;
import net.minecraft.text.TranslatableTextContent; import net.minecraft.text.TranslatableTextContent;
import net.puzzlemc.gui.screen.page.AbstractPuzzleOptionsPage; import net.puzzlemc.gui.screen.PuzzleOptionsScreen;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import java.util.*; import java.util.*;
@@ -46,6 +46,9 @@ public class PuzzleOptionListWidget extends ElementListWidget<PuzzleOptionListWi
} }
} }
public void clear() {
super.clearEntries();
}
public int getRowWidth() { public int getRowWidth() {
return 400; return 400;
} }
@@ -77,15 +80,15 @@ public class PuzzleOptionListWidget extends ElementListWidget<PuzzleOptionListWi
return new ButtonEntry(button, text); return new ButtonEntry(button, text);
} }
public void render(MatrixStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { public void render(DrawContext context, 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.setY(y);
button.render(matrices, mouseX, mouseY, tickDelta); button.render(context, mouseX, mouseY, tickDelta);
} }
if (button == null) drawCenteredText(matrices,textRenderer, Text.literal(" ").append(text).append(" "),x + 200,y+5,0xFFFFFF); if (button == null) context.drawCenteredTextWithShadow(textRenderer, Text.literal(" ").append(text).append(" "),x + 200,y+5,0xFFFFFF);
else drawTextWithShadow(matrices,textRenderer, text,x+15,y+5,0xFFFFFF); else context.drawTextWithShadow(textRenderer, text,x+15,y+5,0xFFFFFF);
if (!(client.currentScreen instanceof AbstractPuzzleOptionsPage page)) return; if (!(client.currentScreen instanceof PuzzleOptionsScreen 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.getContent() instanceof TranslatableTextContent 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";

View File

@@ -17,7 +17,9 @@ public class PuzzleSliderWidget extends SliderWidget {
this.setTextAction = setTextAction; this.setTextAction = setTextAction;
this.changeAction = changeAction; this.changeAction = changeAction;
this.updateMessage(); try {
this.updateMessage();
} catch (Exception e) {e.printStackTrace(); this.visible = false;}
} }
public int getInt() { public int getInt() {
int difference = max - min; int difference = max - min;

View File

@@ -12,7 +12,9 @@ public class PuzzleTextFieldWidget extends TextFieldWidget {
super(textRenderer, x, y, width, height, Text.of("")); super(textRenderer, x, y, width, height, Text.of(""));
this.setValueAction = setValue; this.setValueAction = setValue;
this.change = change; this.change = change;
setValueAction.setTextValue(this); try {
setValueAction.setTextValue(this);
} catch (Exception e) {e.printStackTrace(); this.setVisible(false);}
} }
@Override @Override
public void write(String text) { public void write(String text) {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 179 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 B

View File

@@ -3,8 +3,7 @@
"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,6 +4,7 @@ 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

@@ -1,5 +1,6 @@
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,7 +1,10 @@
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;
@@ -22,10 +25,8 @@ 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.File; import java.io.*;
import java.io.FileInputStream; import java.net.URL;
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;
@@ -67,10 +68,6 @@ 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) {
@@ -107,8 +104,7 @@ public class PuzzleSplashScreen implements ClientModInitializer {
manager.findResources("textures", path -> path.getPath().contains("mojangstudios.png")).forEach((id, resource) -> { manager.findResources("textures", path -> path.getPath().contains("mojangstudios.png")).forEach((id, resource) -> {
try (InputStream stream = manager.getResource(id).get().getInputStream()) { try (InputStream stream = manager.getResource(id).get().getInputStream()) {
Files.copy(stream, LOGO_TEXTURE, StandardCopyOption.REPLACE_EXISTING); Files.copy(stream, LOGO_TEXTURE, StandardCopyOption.REPLACE_EXISTING);
InputStream input = new FileInputStream(String.valueOf(PuzzleSplashScreen.LOGO_TEXTURE)); client.getTextureManager().registerTexture(LOGO, new DynamicLogoTexture());
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);
} }
@@ -156,4 +152,18 @@ 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,12 +2,12 @@ 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;
import net.minecraft.client.texture.NativeImage; import net.minecraft.client.texture.NativeImage;
import net.minecraft.client.texture.NativeImageBackedTexture; import net.minecraft.client.texture.NativeImageBackedTexture;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.Util; import net.minecraft.util.Util;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
@@ -45,11 +45,7 @@ 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()) {
try { client.getTextureManager().registerTexture(LOGO, new PuzzleSplashScreen.DynamicLogoTexture());
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 {
@@ -65,12 +61,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(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) { private void puzzle$betterBlend(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) {
if (PuzzleConfig.disableBlend) RenderSystem.defaultBlendFunc(); if (PuzzleConfig.disableBlend && PuzzleConfig.resourcepackSplashScreen) RenderSystem.defaultBlendFunc();
} }
@Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/util/Window;getScaledWidth()I", shift = At.Shift.BEFORE)) @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;getScaledWindowWidth()I", shift = At.Shift.BEFORE, ordinal = 2))
private void puzzle$renderSplashBackground(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) { private void puzzle$renderSplashBackground(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) {
if (Files.exists(PuzzleSplashScreen.BACKGROUND_TEXTURE)) { if (Files.exists(PuzzleSplashScreen.BACKGROUND_TEXTURE) && PuzzleConfig.resourcepackSplashScreen) {
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();
@@ -83,32 +79,31 @@ 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::getPositionTexProgram);
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, s); RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, s);
drawTexture(matrices, 0, 0, 0, 0, 0, width, height, width, height); context.drawTexture(PuzzleSplashScreen.BACKGROUND, 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(MatrixStack matrices, int minX, int minY, int maxX, int maxY, float opacity, CallbackInfo ci) { private void puzzle$addProgressBarBackground(DrawContext context, 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);
fill(matrices, minX, minY, maxX, maxY, withAlpha(PuzzleConfig.progressBarBackgroundColor, m)); RenderSystem.disableBlend();
context.fill(minX, minY, maxX, maxY, withAlpha(PuzzleConfig.progressBarBackgroundColor, m));
} }
@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) @ModifyArg(method = "renderProgressBar", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;fill(IIIII)V"), index = 4)
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/screen/SplashOverlay;fill(Lnet/minecraft/client/util/math/MatrixStack;IIIII)V", ordinal = 0), index = 5) @ModifyArg(method = "renderProgressBar", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;fill(IIIII)V", ordinal = 0), index = 4)
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

@@ -0,0 +1,42 @@
{
"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 Einstellungen", "puzzle.page.graphics":"Grafik",
"puzzle.page.resources":"Resourcen Einstellungen", "puzzle.page.resources":"Resourcen",
"puzzle.page.performance":"Performance Einstellungen", "puzzle.page.performance":"Performance",
"puzzle.page.misc":"Sonstige Einstellungen", "puzzle.page.misc":"Sonstiges",
"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 Settings", "puzzle.page.graphics":"Graphics",
"puzzle.page.resources":"Resource Settings", "puzzle.page.resources":"Resource",
"puzzle.page.performance":"Performance Settings", "puzzle.page.performance":"Performance",
"puzzle.page.misc":"Miscellaneous Settings", "puzzle.page.misc":"Miscellaneous",
"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,6 +18,9 @@
"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":"Graafikasätted", "puzzle.page.graphics":"Graafika",
"puzzle.page.resources":"Ressursisätted", "puzzle.page.resources":"Ressursi",
"puzzle.page.performance":"Jõudlussätted", "puzzle.page.performance":"Jõudlus",
"puzzle.page.misc":"Muud sätted", "puzzle.page.misc":"Muud",
"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":"Ustawienia grafiki", "puzzle.page.graphics":"Grafiki",
"puzzle.page.resources":"Ustawienia zasobów", "puzzle.page.resources":"Zasobów",
"puzzle.page.performance":"Ustawienia wydajności", "puzzle.page.performance":"Wydajności",
"puzzle.page.misc":"Różne ustawienia", "puzzle.page.misc":"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,10 +1,10 @@
{ {
"puzzle.text.update_available":"Uma atualização está disponível!", "puzzle.text.update_available":"Uma atualização está disponível!",
"puzzle.screen.title":"Puzzle Definições", "puzzle.screen.title":"Puzzle Definições",
"puzzle.page.graphics":"Configurações gráficas", "puzzle.page.graphics":"Gráficas",
"puzzle.page.resources":"Configurações de recursos", "puzzle.page.resources":"Recursos",
"puzzle.page.performance":"Configurações de desempenho", "puzzle.page.performance":"Desempenho",
"puzzle.page.misc":"Configurações Diversas", "puzzle.page.misc":"Diversas",
"puzzle.option.check_for_updates":"Verifique se há atualizações", "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.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":"Mostrar informações da versão do Puzzle",

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.check_for_updates.tooltip":"Включить встроенную в Puzzle проверку обновлений", "puzzle.option.check_for_updates.tooltip":"Включить встроенную в Puzzle проверку обновлений",
"puzzle.option.show_version_info":"Показывать информацию о версии", "puzzle.option.show_version_info":"Показывать информацию о версии",
@@ -18,10 +18,13 @@
"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.bigger_custom_models.tooltip":"Увеличить предельный размер\nпользовательских моделей блоков\nи предметов с 3×3×3 до 5×5×5",
"puzzle.midnightconfig.title":"Расширенные настройки Puzzle", "puzzle.midnightconfig.title":"Расширенные настройки Puzzle",
"puzzle.midnightconfig.category.gui":"Интерфейс",
"puzzle.midnightconfig.category.features":"Функционал",
"puzzle.midnightconfig.category.debug":"Отладка",
"puzzle.midnightconfig.tooltip":"Только для продвинутых пользователей!", "puzzle.midnightconfig.tooltip":"Только для продвинутых пользователей!",
"cullleaves.puzzle.option.enabled": "Отбраковка листвы", "cullleaves.puzzle.option.enabled": "Отбраковка листьев",
"cullleaves.puzzle.option.enabled.tooltip": "Включить отбраковку блоков листвы\nдля улучшения производительности", "cullleaves.puzzle.option.enabled.tooltip": "Включить отбраковку блоков листьев\nдля улучшения производительности",
"iris.puzzle.option.enableShaders": "Шейдеры", "iris.puzzle.option.enableShaders": "Шейдеры",
"iris.puzzle.option.enableShaders.tooltip": "Включить выбранный набор шейдеров", "iris.puzzle.option.enableShaders.tooltip": "Включить выбранный набор шейдеров",
"iris.puzzle.option.open": "Выбрать ", "iris.puzzle.option.open": "Выбрать ",
@@ -35,5 +38,11 @@
"config.dynamicfps.unfocused_volume.tooltip": "Громкость звука игры в состоянии фона\n(когда активно другое окно)", "config.dynamicfps.unfocused_volume.tooltip": "Громкость звука игры в состоянии фона\n(когда активно другое окно)",
"config.dynamicfps.hidden_volume.tooltip": "Громкость звука игры в скрытом состоянии\n(когда окно свёрнуто, закрыто другим окном\nили находится на другом рабочем столе)", "config.dynamicfps.hidden_volume.tooltip": "Громкость звука игры в скрытом состоянии\n(когда окно свёрнуто, закрыто другим окном\nили находится на другом рабочем столе)",
"entity_texture_features.puzzle.emissive_type.brighter": "§eЯркие", "entity_texture_features.puzzle.emissive_type.brighter": "§eЯркие",
"entity_texture_features.puzzle.emissive_type.default": "§6Обычные" "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

@@ -0,0 +1,42 @@
{
"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

@@ -21,6 +21,7 @@
"environment": "client", "environment": "client",
"depends": { "depends": {
"fabric": "*" "fabric": "*",
"minecraft": ">=1.20.2"
} }
} }