From d8ce15e5da283c50200042bef751d82570b4b07e Mon Sep 17 00:00:00 2001 From: Motschen Date: Thu, 30 Dec 2021 12:42:18 +0100 Subject: [PATCH] Update to 1.18.1, New Icon, CEM integration, Better Iris integration --- build.gradle | 20 ++-- gradle.properties | 26 ++--- .../java/net/puzzlemc/core/PuzzleCore.java | 4 +- .../puzzlemc/core/mixin/MixinDebugHud.java | 2 +- .../puzzlemc/core/mixin/MixinTitleScreen.java | 2 +- .../src/main/resources/assets/puzzle/icon.png | Bin 3317 -> 2387 bytes .../resources/assets/puzzle/lang/en_us.json | 17 ---- .../src/main/resources/fabric.mod.json | 4 +- .../main/resources/puzzle-base.mixins.json | 2 +- .../src/main/resources/assets/puzzle/icon.png | Bin 3317 -> 2387 bytes puzzle-gui/build.gradle | 10 +- .../java/net/puzzlemc/gui/PuzzleClient.java | 92 ++++++++++++++---- .../puzzlemc/gui/mixin/CemConfigAccessor.java | 17 ++++ .../gui/mixin/MixinOptionsScreen.java | 2 +- .../gui/screen/PuzzleOptionsScreen.java | 9 +- .../src/main/resources/assets/puzzle/icon.png | Bin 3317 -> 2387 bytes .../resources/assets/puzzle/lang/en_us.json | 17 ---- .../src/main/resources/puzzle-gui.mixins.json | 5 +- .../src/main/resources/assets/puzzle/icon.png | Bin 3317 -> 2387 bytes .../main/resources/puzzle-models.mixins.json | 2 +- .../splashscreen/PuzzleSplashScreen.java | 8 +- .../src/main/resources/assets/puzzle/icon.png | Bin 3317 -> 2387 bytes .../resources/puzzle-splashscreen.mixins.json | 2 +- puzzle_versions.json | 5 - src/main/resources/assets/puzzle/icon.png | Bin 3317 -> 2387 bytes .../resources/assets/puzzle/lang/en_us.json | 6 +- 26 files changed, 147 insertions(+), 105 deletions(-) mode change 100755 => 100644 puzzle-base/src/main/resources/assets/puzzle/icon.png delete mode 100755 puzzle-base/src/main/resources/assets/puzzle/lang/en_us.json mode change 100755 => 100644 puzzle-blocks/src/main/resources/assets/puzzle/icon.png create mode 100644 puzzle-gui/src/main/java/net/puzzlemc/gui/mixin/CemConfigAccessor.java mode change 100755 => 100644 puzzle-gui/src/main/resources/assets/puzzle/icon.png delete mode 100755 puzzle-gui/src/main/resources/assets/puzzle/lang/en_us.json mode change 100755 => 100644 puzzle-models/src/main/resources/assets/puzzle/icon.png mode change 100755 => 100644 puzzle-splashscreen/src/main/resources/assets/puzzle/icon.png delete mode 100644 puzzle_versions.json mode change 100755 => 100644 src/main/resources/assets/puzzle/icon.png diff --git a/build.gradle b/build.gradle index 79757b5..eb45563 100755 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ // Based on https://github.com/OnyxStudios/Cardinal-Components-API/blob/1.17/build.gradle plugins { - id "fabric-loom" version "0.8-SNAPSHOT" apply false + id "fabric-loom" version "0.10-SNAPSHOT" apply false id "com.matthewprenger.cursegradle" version "1.4.0" id "maven-publish" id "java-library" @@ -17,13 +17,11 @@ subprojects { archivesBaseName = project.name group = "${rootProject.group}.${rootProject.archivesBaseName}" - - //apply from: "https://raw.githubusercontent.com/OnyxStudios/Gradle-Scripts/master/scripts/fabric/basic_project.gradle" } allprojects { apply plugin: "fabric-loom" - sourceCompatibility = targetCompatibility = JavaVersion.VERSION_16 + sourceCompatibility = targetCompatibility = JavaVersion.VERSION_17 version = System.getenv("TRAVIS_TAG") ?: rootProject.mod_version configurations { @@ -55,7 +53,7 @@ allprojects { // see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html tasks.withType(JavaCompile).configureEach { it.options.encoding = "UTF-8" - it.options.release = 16 + it.options.release = 17 } java { @@ -119,10 +117,17 @@ repositories { includeGroup "curse.maven" } } + maven { + name = 'JitPack' + url 'https://jitpack.io' + } + maven { + url "https://maven.shedaniel.me/" + } } dependencies { - modImplementation "net.fabricmc.fabric-api:fabric-api:0.34.8+1.17" + modImplementation ("net.fabricmc.fabric-api:fabric-api:${project.fabric_version}") modImplementation ("com.terraformersmc:modmenu:${project.mod_menu_version}") { exclude group: "net.fabricmc.fabric-api" } @@ -133,7 +138,8 @@ dependencies { modImplementation ("maven.modrinth:cit-resewn:${project.cit_resewn_version}") modImplementation ("maven.modrinth:continuity:${project.continuity_version}") modImplementation ("maven.modrinth:animatica:${project.animatica_version}") - modImplementation "curse.maven:custom-entity-models-cem-477078:3440846" + modImplementation ("curse.maven:custom-entity-models-cem-477078:${project.cem_version}") + modImplementation "com.gitlab.Lortseam:completeconfig:${project.complete_config_version}" modImplementation("org.aperlambda:lambdajcommon:1.8.1") { exclude group: 'com.google.code.gson' diff --git a/gradle.properties b/gradle.properties index b337246..ab20ad2 100755 --- a/gradle.properties +++ b/gradle.properties @@ -3,26 +3,28 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://fabricmc.net/use - minecraft_version=1.17.1 - yarn_mappings=1.17.1+build.61 - loader_version=0.11.7 + minecraft_version=1.18.1 + yarn_mappings=1.18.1+build.12 + loader_version=0.12.12 # Mod Properties - mod_version = 1.1.0 + mod_version = 0.1.0-pre1 maven_group = net.puzzlemc archives_base_name = puzzle # Dependencies # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api - fabric_version=0.40.1+1.17 + fabric_version=0.45.0+1.18 mod_menu_version = 2.0.13 - cull_leaves_version = 2.3.0 + cull_leaves_version = 2.3.2 ldl_version = 2.1.0+1.17 - lbg_version = 1.2.1+1.17 - iris_version = mc1.17.1-1.1.2 - continuity_version = 1.0.0+1.17 - animatica_version = 0.1+1.17 - cit_resewn_version = 0.8.1 - spruceui_version=3.3.0+1.17 + lbg_version = 1.2.2+1.17 + iris_version = mc1.18.1-1.1.3 + continuity_version = 1.0.3+1.18 + animatica_version = 0.2+1.18 + cit_resewn_version = 0.8.1-1.18 + cem_version = 3561474 + complete_config_version = 1.0.0 + spruceui_version=3.3.2+1.17 midnightlib_version=0.3.1 diff --git a/puzzle-base/src/main/java/net/puzzlemc/core/PuzzleCore.java b/puzzle-base/src/main/java/net/puzzlemc/core/PuzzleCore.java index a8b7e34..61d9848 100755 --- a/puzzle-base/src/main/java/net/puzzlemc/core/PuzzleCore.java +++ b/puzzle-base/src/main/java/net/puzzlemc/core/PuzzleCore.java @@ -6,13 +6,13 @@ import net.fabricmc.api.ClientModInitializer; public class PuzzleCore implements ClientModInitializer { - public final static String version = "Puzzle R1"; + public final static String version = "Puzzle B0"; public final static String name = "Puzzle"; public final static String id = "puzzle"; public final static String website = "https://github.com/PuzzleMC/Puzzle"; public static String updateURL = website; //+"download"; - public final static String UPDATE_URL = "https://raw.githubusercontent.com/PuzzleMC/Puzzle/1.17/puzzle_versions.json"; + public final static String UPDATE_URL = "https://raw.githubusercontent.com/PuzzleMC/Puzzle-Versions/main/puzzle_versions.json"; @Override public void onInitializeClient() { diff --git a/puzzle-base/src/main/java/net/puzzlemc/core/mixin/MixinDebugHud.java b/puzzle-base/src/main/java/net/puzzlemc/core/mixin/MixinDebugHud.java index 1ea775d..61e7d9a 100755 --- a/puzzle-base/src/main/java/net/puzzlemc/core/mixin/MixinDebugHud.java +++ b/puzzle-base/src/main/java/net/puzzlemc/core/mixin/MixinDebugHud.java @@ -14,7 +14,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.List; @Mixin(DebugHud.class) -public class MixinDebugHud extends DrawableHelper { +public abstract class MixinDebugHud extends DrawableHelper { @Inject(at = @At("RETURN"), method = "getRightText", cancellable = true) private void puzzle$getRightText(CallbackInfoReturnable> cir) { if (PuzzleConfig.showPuzzleInfo) { diff --git a/puzzle-base/src/main/java/net/puzzlemc/core/mixin/MixinTitleScreen.java b/puzzle-base/src/main/java/net/puzzlemc/core/mixin/MixinTitleScreen.java index 9447944..0a6d46e 100755 --- a/puzzle-base/src/main/java/net/puzzlemc/core/mixin/MixinTitleScreen.java +++ b/puzzle-base/src/main/java/net/puzzlemc/core/mixin/MixinTitleScreen.java @@ -20,7 +20,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.Objects; @Mixin(TitleScreen.class) -public class MixinTitleScreen extends Screen { +public abstract class MixinTitleScreen extends Screen { @Shadow @Final private boolean doBackgroundFade; @Shadow private long backgroundFadeStart; diff --git a/puzzle-base/src/main/resources/assets/puzzle/icon.png b/puzzle-base/src/main/resources/assets/puzzle/icon.png old mode 100755 new mode 100644 index c170db5014e32e33dbba3c7ea9c977b40ededce1..0050c65296e5f22a25407a433cd2679b1c85c244 GIT binary patch literal 2387 zcmY*bXH=8h68%Ca3PC{HqZjF&t5S?yiWC(hy<-9wt{_B0APPto5Tz*>rHY73v(Te- zp8jAt z21rzR`LdN900_-F+5PEpx#CBq|3wd?;$TYR{t-wbI0uJ%1g}3m58fU9!Tr zeO@n}tgYPz8V0zbfwO`>!dxvE?=6s*^DpxJE}*N;W&6Innp!Lsd3E>uHNwgddHs5-gQF9 z9ip_~9E!riHH*l14NVj0`Rb9qD#t9l)-1eB2xX&62hz!?U7Ur*-7voXoDP?LoPXSB2NtV(G0L}`sfOh)9)j9(c<WQUI&O`A;c-d z8U-nq_dt!Bl|`ep3KoX+X1GE!Mh;2zd^d<16Re}O<&6;C=*7QZU6?!0zxTu^ z_i=4i*q-ilu|VuIA={Np1R4FCB7uSQ5Z>h9!iPo=`**>4{Sy)#CAHlqCQ??EOY5~&bNDF1 zNw*$f-Ho1JWRhiS?hGhgZ6Rh@k<2n)eg#!21h+-r)^oA64b&LNJ9aXIr@}Y zA73hFT{;}lpe}CltRQ+reBXC;JTRT~e$K-#32x$hp<;lAysJC5p2i$^QH_hE<-Su* zlucNL?YLAIuj!v4v1m24+%MCuXGBGr-?G)QvW$xF+dGmuBs6V5x) ztmgTc5Bc)1CNCGHoeoYJW4tNgWi!vMw8s#QX5pWgf-b%h1zLvHr{A5c=sUr$M>^IS zuOH=*-_)5as0klf*_vHv+zpx^ba(F?4eka$qMx*#Adyb_v%vx-OWzkp%8|E6QtGrx z*wxS3)2wkz95!0x;P&G3%xGR7Xrc{cSUEFew)~-;zS~+a84hJ$-%nlvxv>4mSY}H7 z7H6-N+r2cOo}Aj)`WQ>#Z8otvhq#=#2erJReY6RR%zP&Fu!M_$ zEez#W0@7GuZB($;z0S?iG$lp=ronv*_)n*TjV(Be=i|Yi;0sjgQGh7LY1|}EyiTSW zw<0_d2SZDPQNkHL6wo@(0oGKm2c?br_ zLtm_Xi1dqIN4yU_V@hw%rKYJ*G|DfXMJ>To=?@p{(xg-3_E>cL8e&0O9d^YX7WoT{G$bBUF|r}x$Jh~VmrgNp+= n=^HtDg1A-=EMmjKSxWsgD8q}1uA-a|5#VI+V)xAEeENR?b%&di literal 3317 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 literal 3317 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 button.setMessage(Iris.getIrisConfig().areShadersEnabled() ? YES : NO), (button) -> { + IrisConfig irisConfig = Iris.getIrisConfig(); + irisConfig.setShadersEnabled(!irisConfig.areShadersEnabled()); + try { + Iris.getIrisConfig().save(); + } catch (IOException var6) { + Iris.logger.error("Error saving configuration file!"); + Iris.logger.catching(var6); + } - if (FabricLoader.getInstance().isModLoaded("lambdynlights")) { - DynamicLightsConfig ldlConfig = LambDynLights.get().config; - PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.of("LambDynamicLights"))); - PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("lambdynlights.option.mode"), (button) -> button.setMessage(ldlConfig.getDynamicLightsMode().getTranslatedText()), (button) -> ldlConfig.setDynamicLightsMode(ldlConfig.getDynamicLightsMode().next()))); - PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("").append("DynLights: ").append(new TranslatableText("lambdynlights.option.light_sources.entities")), (button) -> button.setMessage(ldlConfig.getEntitiesLightSource().get() ? YES : NO), (button) -> ldlConfig.getEntitiesLightSource().set(!ldlConfig.getEntitiesLightSource().get()))); - PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("").append("DynLights: ").append(new TranslatableText("lambdynlights.option.light_sources.block_entities")), (button) -> button.setMessage(ldlConfig.getBlockEntitiesLightSource().get() ? YES : NO), (button) -> ldlConfig.getBlockEntitiesLightSource().set(!ldlConfig.getBlockEntitiesLightSource().get()))); - PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("").append("DynLights: ").append(new TranslatableText("entity.minecraft.creeper")), (button) -> button.setMessage(ldlConfig.getCreeperLightingMode().getTranslatedText()), (button) -> ldlConfig.setCreeperLightingMode(ldlConfig.getCreeperLightingMode().next()))); - PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("").append("DynLights: ").append(new TranslatableText("block.minecraft.tnt")), (button) -> button.setMessage(ldlConfig.getTntLightingMode().getTranslatedText()), (button) -> ldlConfig.setTntLightingMode(ldlConfig.getTntLightingMode().next()))); - PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("").append("DynLights: ").append(new TranslatableText("lambdynlights.option.light_sources.water_sensitive_check")), (button) -> button.setMessage(ldlConfig.getWaterSensitiveCheck().get() ? YES : NO), (button) -> ldlConfig.getWaterSensitiveCheck().set(!ldlConfig.getWaterSensitiveCheck().get()))); + try { + Iris.reload(); + } catch (IOException var5) { + Iris.logger.error("Error reloading shader pack while applying changes!"); + Iris.logger.catching(var5); + } + })); + PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("options.iris.shaderPackSelection.title"), (button) -> button.setMessage(Text.of("OPEN")), (button) -> { + MinecraftClient client = MinecraftClient.getInstance(); + ShaderPackScreen shaderPackPage = new ShaderPackScreen(client.currentScreen); + client.setScreen(shaderPackPage); + })); } + if (FabricLoader.getInstance().isModLoaded("continuity")) { PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.of("Continuity"))); ContinuityConfig contConfig = ContinuityConfig.INSTANCE; @@ -100,17 +125,21 @@ public class PuzzleClient implements ClientModInitializer { contConfig.save(); })); } - - if (FabricLoader.getInstance().isModLoaded("lambdabettergrass")) { - LBGConfig lbgConfig = LambdaBetterGrass.get().config; - PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.of("LambdaBetterGrass"))); - PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("lambdabettergrass.option.mode"), (button) -> button.setMessage(lbgConfig.getMode().getTranslatedText()), (button) -> lbgConfig.setMode(lbgConfig.getMode().next()))); - PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("lambdabettergrass.option.better_snow"), (button) -> button.setMessage(lbgConfig.hasBetterLayer() ? YES : NO), (button) -> lbgConfig.setBetterLayer(!lbgConfig.hasBetterLayer()))); - } } - public static boolean citInitialized = false; - public static void initCITResewn() { // CITResewn is initialized after Puzzle, so we can't access it in our ClientModInitializer - if (!citInitialized && FabricLoader.getInstance().isModLoaded("citresewn") && CITResewn.INSTANCE != null && CITResewnConfig.INSTANCE() != null) { + public static boolean lateInitDone = false; + public static void lateInit() { // Some mods are initialized after Puzzle, so we can't access them in our ClientModInitializer + if (FabricLoader.getInstance().isModLoaded("lambdynlights")) { + DynamicLightsConfig ldlConfig = LambDynLights.get().config; + + PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.of("LambDynamicLights"))); + PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("lambdynlights.option.mode"), (button) -> button.setMessage(ldlConfig.getDynamicLightsMode().getTranslatedText()), (button) -> ldlConfig.setDynamicLightsMode(ldlConfig.getDynamicLightsMode().next()))); + PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("").append("DynLights: ").append(new TranslatableText("lambdynlights.option.light_sources.entities")), (button) -> button.setMessage(ldlConfig.getEntitiesLightSource().get() ? YES : NO), (button) -> ldlConfig.getEntitiesLightSource().set(!ldlConfig.getEntitiesLightSource().get()))); + PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("").append("DynLights: ").append(new TranslatableText("lambdynlights.option.light_sources.block_entities")), (button) -> button.setMessage(ldlConfig.getBlockEntitiesLightSource().get() ? YES : NO), (button) -> ldlConfig.getBlockEntitiesLightSource().set(!ldlConfig.getBlockEntitiesLightSource().get()))); + PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("").append("DynLights: ").append(new TranslatableText("entity.minecraft.creeper")), (button) -> button.setMessage(ldlConfig.getCreeperLightingMode().getTranslatedText()), (button) -> ldlConfig.setCreeperLightingMode(ldlConfig.getCreeperLightingMode().next()))); + PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("").append("DynLights: ").append(new TranslatableText("block.minecraft.tnt")), (button) -> button.setMessage(ldlConfig.getTntLightingMode().getTranslatedText()), (button) -> ldlConfig.setTntLightingMode(ldlConfig.getTntLightingMode().next()))); + PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("").append("DynLights: ").append(new TranslatableText("lambdynlights.option.light_sources.water_sensitive_check")), (button) -> button.setMessage(ldlConfig.getWaterSensitiveCheck().get() ? YES : NO), (button) -> ldlConfig.getWaterSensitiveCheck().set(!ldlConfig.getWaterSensitiveCheck().get()))); + } + if (FabricLoader.getInstance().isModLoaded("citresewn") && CITResewn.INSTANCE != null && CITResewnConfig.INSTANCE() != null) { PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.of("CIT Resewn"))); CITResewnConfig citConfig = CITResewnConfig.INSTANCE(); PuzzleApi.addToResourceOptions(new PuzzleWidget(new TranslatableText("config.citresewn.enabled.title"), (button) -> button.setMessage(citConfig.enabled ? YES : NO), (button) -> { @@ -139,8 +168,31 @@ public class PuzzleClient implements ClientModInitializer { catch (NumberFormatException ignored) {} citConfig.write(); })); - citInitialized = true; } + if (FabricLoader.getInstance().isModLoaded("lambdabettergrass")) { + LBGConfig lbgConfig = LambdaBetterGrass.get().config; + PuzzleApi.addToGraphicsOptions(new PuzzleWidget(Text.of("LambdaBetterGrass"))); + PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("lambdabettergrass.option.mode"), (button) -> button.setMessage(lbgConfig.getMode().getTranslatedText()), (button) -> lbgConfig.setMode(lbgConfig.getMode().next()))); + PuzzleApi.addToGraphicsOptions(new PuzzleWidget(new TranslatableText("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")) { + PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.of("Custom Entity Models"))); + CemConfig cemConfig = (CemConfig) CemConfigFairy.getConfig(); + CemOptions cemOptions = CemConfigFairy.getConfig(); + PuzzleApi.addToResourceOptions(new PuzzleWidget(new TranslatableText("config.cem.use_optifine_folder"), (button) -> button.setMessage(cemConfig.useOptifineFolder() ? YES : NO), (button) -> { + ((CemConfigAccessor)cemOptions).setUseOptifineFolder(!cemConfig.useOptifineFolder()); + cemConfig.save(); + })); + PuzzleApi.addToResourceOptions(new PuzzleWidget(new TranslatableText("config.cem.use_new_model_creation_fix"), (button) -> button.setMessage(cemConfig.useTransparentParts() ? YES : NO), (button) -> { + ((CemConfigAccessor)cemOptions).setUseModelCreationFix(!cemConfig.useTransparentParts()); + cemConfig.save(); + })); + PuzzleApi.addToResourceOptions(new PuzzleWidget(new TranslatableText("config.cem.use_old_animations"), (button) -> button.setMessage(cemConfig.useOldAnimations() ? YES : NO), (button) -> { + ((CemConfigAccessor)cemOptions).setUseOldAnimations(!cemConfig.useOldAnimations()); + cemConfig.save(); + })); + } + lateInitDone = true; } public static Text message(CITResewnConfig config) { int ticks = config.cache_ms; diff --git a/puzzle-gui/src/main/java/net/puzzlemc/gui/mixin/CemConfigAccessor.java b/puzzle-gui/src/main/java/net/puzzlemc/gui/mixin/CemConfigAccessor.java new file mode 100644 index 0000000..07bcdc9 --- /dev/null +++ b/puzzle-gui/src/main/java/net/puzzlemc/gui/mixin/CemConfigAccessor.java @@ -0,0 +1,17 @@ +package net.puzzlemc.gui.mixin; + +import net.dorianpb.cem.internal.config.CemConfig; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(value = CemConfig.class, remap = false) +public interface CemConfigAccessor { + @Accessor("use_optifine_folder") + void setUseOptifineFolder(boolean value); + + @Accessor("use_new_model_creation_fix") + void setUseModelCreationFix(boolean value); + + @Accessor("use_old_animations") + void setUseOldAnimations(boolean value); +} diff --git a/puzzle-gui/src/main/java/net/puzzlemc/gui/mixin/MixinOptionsScreen.java b/puzzle-gui/src/main/java/net/puzzlemc/gui/mixin/MixinOptionsScreen.java index b94b5ed..b12285e 100755 --- a/puzzle-gui/src/main/java/net/puzzlemc/gui/mixin/MixinOptionsScreen.java +++ b/puzzle-gui/src/main/java/net/puzzlemc/gui/mixin/MixinOptionsScreen.java @@ -16,7 +16,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.util.Objects; @Mixin(OptionsScreen.class) -public 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) { diff --git a/puzzle-gui/src/main/java/net/puzzlemc/gui/screen/PuzzleOptionsScreen.java b/puzzle-gui/src/main/java/net/puzzlemc/gui/screen/PuzzleOptionsScreen.java index 60c6aae..341d859 100755 --- a/puzzle-gui/src/main/java/net/puzzlemc/gui/screen/PuzzleOptionsScreen.java +++ b/puzzle-gui/src/main/java/net/puzzlemc/gui/screen/PuzzleOptionsScreen.java @@ -1,7 +1,6 @@ package net.puzzlemc.gui.screen; import net.fabricmc.loader.api.FabricLoader; -import net.puzzlemc.gui.PuzzleApi; import net.puzzlemc.gui.PuzzleClient; import net.puzzlemc.gui.screen.page.GraphicsPage; import net.puzzlemc.gui.screen.page.MiscPage; @@ -26,7 +25,7 @@ public class PuzzleOptionsScreen extends Screen { @Override protected void init() { super.init(); - PuzzleClient.initCITResewn(); + if (!PuzzleClient.lateInitDone) PuzzleClient.lateInit(); GraphicsPage graphicsPage = new GraphicsPage(this); MiscPage miscPage = new MiscPage(this); PerformancePage performancePage = new PerformancePage(this); @@ -36,9 +35,9 @@ public class PuzzleOptionsScreen extends Screen { this.addDrawableChild(new ButtonWidget(this.width / 2 + 5, this.height / 6 + 48 - 6, 150, 20, resourcesPage.getTitle().copy().append("..."), (button) -> Objects.requireNonNull(client).setScreen(resourcesPage))); this.addDrawableChild(new ButtonWidget(this.width / 2 - 155, this.height / 6 + 72 - 6, 150, 20, performancePage.getTitle().copy().append("..."), (button) -> Objects.requireNonNull(client).setScreen(performancePage))); this.addDrawableChild(new ButtonWidget(this.width / 2 + 5, this.height / 6 + 72 - 6, 150, 20, miscPage.getTitle().copy().append("..."), (button) -> Objects.requireNonNull(client).setScreen(miscPage))); - if (FabricLoader.getInstance().isModLoaded("iris")) { - this.addDrawableChild(IrisButton.getButton(this.width / 2 - 155, this.height / 6 + 96 - 6, 150, 20, this, client)); - } +// if (FabricLoader.getInstance().isModLoaded("iris")) { +// this.addDrawableChild(IrisButton.getButton(this.width / 2 - 155, this.height / 6 + 96 - 6, 310, 20, this, client)); +// } this.addDrawableChild(new ButtonWidget(this.width / 2 - 100, this.height / 6 + 168, 200, 20, ScreenTexts.DONE, (button) -> Objects.requireNonNull(client).setScreen(parent))); } diff --git a/puzzle-gui/src/main/resources/assets/puzzle/icon.png b/puzzle-gui/src/main/resources/assets/puzzle/icon.png old mode 100755 new mode 100644 index c170db5014e32e33dbba3c7ea9c977b40ededce1..0050c65296e5f22a25407a433cd2679b1c85c244 GIT binary patch literal 2387 zcmY*bXH=8h68%Ca3PC{HqZjF&t5S?yiWC(hy<-9wt{_B0APPto5Tz*>rHY73v(Te- zp8jAt z21rzR`LdN900_-F+5PEpx#CBq|3wd?;$TYR{t-wbI0uJ%1g}3m58fU9!Tr zeO@n}tgYPz8V0zbfwO`>!dxvE?=6s*^DpxJE}*N;W&6Innp!Lsd3E>uHNwgddHs5-gQF9 z9ip_~9E!riHH*l14NVj0`Rb9qD#t9l)-1eB2xX&62hz!?U7Ur*-7voXoDP?LoPXSB2NtV(G0L}`sfOh)9)j9(c<WQUI&O`A;c-d z8U-nq_dt!Bl|`ep3KoX+X1GE!Mh;2zd^d<16Re}O<&6;C=*7QZU6?!0zxTu^ z_i=4i*q-ilu|VuIA={Np1R4FCB7uSQ5Z>h9!iPo=`**>4{Sy)#CAHlqCQ??EOY5~&bNDF1 zNw*$f-Ho1JWRhiS?hGhgZ6Rh@k<2n)eg#!21h+-r)^oA64b&LNJ9aXIr@}Y zA73hFT{;}lpe}CltRQ+reBXC;JTRT~e$K-#32x$hp<;lAysJC5p2i$^QH_hE<-Su* zlucNL?YLAIuj!v4v1m24+%MCuXGBGr-?G)QvW$xF+dGmuBs6V5x) ztmgTc5Bc)1CNCGHoeoYJW4tNgWi!vMw8s#QX5pWgf-b%h1zLvHr{A5c=sUr$M>^IS zuOH=*-_)5as0klf*_vHv+zpx^ba(F?4eka$qMx*#Adyb_v%vx-OWzkp%8|E6QtGrx z*wxS3)2wkz95!0x;P&G3%xGR7Xrc{cSUEFew)~-;zS~+a84hJ$-%nlvxv>4mSY}H7 z7H6-N+r2cOo}Aj)`WQ>#Z8otvhq#=#2erJReY6RR%zP&Fu!M_$ zEez#W0@7GuZB($;z0S?iG$lp=ronv*_)n*TjV(Be=i|Yi;0sjgQGh7LY1|}EyiTSW zw<0_d2SZDPQNkHL6wo@(0oGKm2c?br_ zLtm_Xi1dqIN4yU_V@hw%rKYJ*G|DfXMJ>To=?@p{(xg-3_E>cL8e&0O9d^YX7WoT{G$bBUF|r}x$Jh~VmrgNp+= n=^HtDg1A-=EMmjKSxWsgD8q}1uA-a|5#VI+V)xAEeENR?b%&di literal 3317 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 literal 3317 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 literal 3317 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 literal 3317 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