diff --git a/build.gradle b/build.gradle index 0b352ff..79757b5 100755 --- a/build.gradle +++ b/build.gradle @@ -132,6 +132,7 @@ dependencies { modImplementation ("maven.modrinth:iris:${project.iris_version}") 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("org.aperlambda:lambdajcommon:1.8.1") { @@ -140,6 +141,7 @@ dependencies { } modImplementation "dev.lambdaurora:spruceui:${project.spruceui_version}" modImplementation "maven.modrinth:midnightlib:${project.midnightlib_version}" + include "maven.modrinth:midnightlib:${project.midnightlib_version}" subprojects.each { api project(path: ":${it.name}", configuration: "dev") @@ -154,9 +156,7 @@ publishing { builtBy(remapJar) } pom.withXml { - def depsNode = asNode().appendNode("dependencies") subprojects.each { - def depNode = depsNode.appendNode("dependency") depNode.appendNode("groupId", it.group) depNode.appendNode("artifactId", it.name) depNode.appendNode("version", it.version) diff --git a/gradle.properties b/gradle.properties index 768b256..6d99005 100755 --- a/gradle.properties +++ b/gradle.properties @@ -8,8 +8,8 @@ org.gradle.jvmargs=-Xmx1G loader_version=0.11.7 # Mod Properties - mod_version = 0.4.0 - maven_group = eu.midnightdust + mod_version = 1.0.0 + maven_group = net.puzzlemc archives_base_name = puzzle # Dependencies @@ -22,6 +22,7 @@ org.gradle.jvmargs=-Xmx1G 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.7.1 spruceui_version=3.3.0+1.17 - midnightlib_version=0.2.5 + midnightlib_version=0.3.0 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e708b1c..7454180 100755 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e5338d3..e750102 100755 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 4f906e0..1b6c787 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ -#!/usr/bin/env sh +#!/bin/sh # -# Copyright 2015 the original author or authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,67 +17,101 @@ # ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## # Attempt to set APP_HOME + # Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +APP_BASE_NAME=${0##*/} # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -87,9 +121,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -98,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -106,80 +140,95 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" 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 151a49d..a8b7e34 100755 --- a/puzzle-base/src/main/java/net/puzzlemc/core/PuzzleCore.java +++ b/puzzle-base/src/main/java/net/puzzlemc/core/PuzzleCore.java @@ -6,7 +6,7 @@ import net.fabricmc.api.ClientModInitializer; public class PuzzleCore implements ClientModInitializer { - public final static String version = "Puzzle A1"; + public final static String version = "Puzzle R1"; public final static String name = "Puzzle"; public final static String id = "puzzle"; public final static String website = "https://github.com/PuzzleMC/Puzzle"; diff --git a/puzzle-base/src/main/java/net/puzzlemc/core/config/MidnightConfigLite.java b/puzzle-base/src/main/java/net/puzzlemc/core/config/MidnightConfigLite.java index 8caa14f..d5d9a07 100755 --- a/puzzle-base/src/main/java/net/puzzlemc/core/config/MidnightConfigLite.java +++ b/puzzle-base/src/main/java/net/puzzlemc/core/config/MidnightConfigLite.java @@ -13,7 +13,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.*; -// MidnightConfigLite v0.1.0 +// MidnightConfigLite v0.2.0 // Just writing and parsing of config files /** Based on https://github.com/Minenash/TinyConfig @@ -21,13 +21,8 @@ import java.util.*; public class MidnightConfigLite { - private static final List entries = new ArrayList<>(); - protected static class EntryInfo { - Field field; Object defaultValue; - Object value; - String tempValue; } public static final Map> configClass = new HashMap<>(); @@ -48,15 +43,6 @@ public class MidnightConfigLite { } try { gson.fromJson(Files.newBufferedReader(path), config); } catch (Exception e) { write(modid); } - - for (EntryInfo info : entries) { - if (info.field.isAnnotationPresent(Entry.class)) - try { - info.value = info.field.get(null); - info.tempValue = info.value.toString(); - } catch (IllegalAccessException ignored) { - } - } } public static void write(String modid) { diff --git a/puzzle-base/src/main/resources/fabric.mod.json b/puzzle-base/src/main/resources/fabric.mod.json index 1c7e434..6fc5e03 100755 --- a/puzzle-base/src/main/resources/fabric.mod.json +++ b/puzzle-base/src/main/resources/fabric.mod.json @@ -6,8 +6,8 @@ "name": "Puzzle", "description": "Unites optifine replacement mods in a clean & vanilla-style gui", "authors": [ - "Motschen", - "TeamMidnightDust" + "PuzzleMC", + "Motschen" ], "contact": { "homepage": "https://www.midnightdust.eu/", @@ -26,7 +26,7 @@ }, "custom": { "modmenu": { - "parent": "puzzle-core" + "parent": "puzzle" } }, diff --git a/puzzle-blocks/src/main/resources/fabric.mod.json b/puzzle-blocks/src/main/resources/fabric.mod.json index 60e1023..d8ebea8 100755 --- a/puzzle-blocks/src/main/resources/fabric.mod.json +++ b/puzzle-blocks/src/main/resources/fabric.mod.json @@ -6,8 +6,8 @@ "name": "Puzzle Blocks", "description": "Lets resourcepacks change render layers of blocks", "authors": [ - "Motschen", - "TeamMidnightDust" + "PuzzleMC", + "Motschen" ], "contact": { "homepage": "https://www.midnightdust.eu/", diff --git a/puzzle-gui/build.gradle b/puzzle-gui/build.gradle index f7708b3..3a05bf5 100755 --- a/puzzle-gui/build.gradle +++ b/puzzle-gui/build.gradle @@ -29,7 +29,7 @@ dependencies { modImplementation "dev.lambdaurora:spruceui:${project.spruceui_version}" modImplementation "maven.modrinth:midnightlib:${project.midnightlib_version}" - api ("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:lambdynamiclights:${project.ldl_version}") modImplementation ("maven.modrinth:lambdabettergrass:${project.lbg_version}") diff --git a/puzzle-gui/src/main/java/net/puzzlemc/gui/config/ModMenuIntegration.java b/puzzle-gui/src/main/java/net/puzzlemc/gui/config/ModMenuIntegration.java index 5d50a55..60d77c6 100755 --- a/puzzle-gui/src/main/java/net/puzzlemc/gui/config/ModMenuIntegration.java +++ b/puzzle-gui/src/main/java/net/puzzlemc/gui/config/ModMenuIntegration.java @@ -7,22 +7,23 @@ import net.puzzlemc.gui.screen.PuzzleOptionsScreen; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import java.util.HashMap; import java.util.Map; @Environment(EnvType.CLIENT) public class ModMenuIntegration implements ModMenuApi { //Used to set the config screen for all modules // -// @Override -// public Map> getProvidedConfigScreenFactories() { -// Map> map = ImmutableMap.of(); -// map.put("puzzle",PuzzleOptionsScreen::new); -// map.put("puzzle-gui",PuzzleOptionsScreen::new); -// map.put("puzzle-blocks",PuzzleOptionsScreen::new); -// map.put("puzzle-base",PuzzleOptionsScreen::new); -// map.put("puzzle-models",PuzzleOptionsScreen::new); -// map.put("puzzle-randomentities",PuzzleOptionsScreen::new); -// map.put("puzzle-splashscreen",PuzzleOptionsScreen::new); -// return map; -// } + @Override + public Map> getProvidedConfigScreenFactories() { + Map> map = new HashMap<>(); + map.put("puzzle",PuzzleOptionsScreen::new); + map.put("puzzle-gui",PuzzleOptionsScreen::new); + map.put("puzzle-blocks",PuzzleOptionsScreen::new); + map.put("puzzle-base",PuzzleOptionsScreen::new); + map.put("puzzle-models",PuzzleOptionsScreen::new); + map.put("puzzle-randomentities",PuzzleOptionsScreen::new); + map.put("puzzle-splashscreen",PuzzleOptionsScreen::new); + return map; + } } \ No newline at end of file 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 3f20a6b..b7ac898 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 @@ -1,9 +1,11 @@ package net.puzzlemc.gui.mixin; +import eu.midnightdust.lib.util.screen.TexturedOverlayButtonWidget; +import net.minecraft.util.Identifier; +import net.puzzlemc.gui.PuzzleClient; import net.puzzlemc.gui.screen.PuzzleOptionsScreen; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.option.OptionsScreen; -import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.text.Text; import net.minecraft.text.TranslatableText; import org.spongepowered.asm.mixin.Mixin; @@ -15,15 +17,16 @@ import java.util.Objects; @Mixin(OptionsScreen.class) public class MixinOptionsScreen extends Screen { + private static final Identifier PUZZLE_ICON_TEXTURE = new Identifier(PuzzleClient.id, "textures/gui/puzzle_button.png"); protected MixinOptionsScreen(Text title) { super(title); } - @Inject(at = @At("TAIL"),method = "init") - public void init(CallbackInfo ci) { - PuzzleOptionsScreen puzzleScreen = new PuzzleOptionsScreen(this); - this.addDrawableChild(new ButtonWidget(this.width / 2 - 155, this.height / 6 + 144 - 6, 150, 20, new TranslatableText("puzzle.screen.title").append("..."), (button) -> Objects.requireNonNull(this.client).setScreen(puzzleScreen))); + @Inject(at = @At("HEAD"), method = "init") + private void midnightlib$init(CallbackInfo ci) { + this.addDrawableChild(new TexturedOverlayButtonWidget(this.width / 2 - 178, this.height / 6 - 12, 20, 20, 0, 0, 20, PUZZLE_ICON_TEXTURE, 32, 64, (buttonWidget) -> { + (Objects.requireNonNull(this.client)).setScreen(new PuzzleOptionsScreen(this)); + }, new TranslatableText("midnightlib.overview.title"))); } - } diff --git a/puzzle-gui/src/main/java/net/puzzlemc/gui/screen/widget/DummyButtonWidget.java b/puzzle-gui/src/main/java/net/puzzlemc/gui/screen/widget/DummyButtonWidget.java deleted file mode 100755 index f766e66..0000000 --- a/puzzle-gui/src/main/java/net/puzzlemc/gui/screen/widget/DummyButtonWidget.java +++ /dev/null @@ -1,10 +0,0 @@ -package net.puzzlemc.gui.screen.widget; - -import net.minecraft.client.gui.widget.ButtonWidget; -import net.minecraft.text.Text; - -public class DummyButtonWidget extends ButtonWidget { - public DummyButtonWidget() { - super(-1,-1,0,0,Text.of(""),null); - } -} diff --git a/puzzle-gui/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleOptionListWidget.java b/puzzle-gui/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleOptionListWidget.java index 22c0c73..4cb9677 100755 --- a/puzzle-gui/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleOptionListWidget.java +++ b/puzzle-gui/src/main/java/net/puzzlemc/gui/screen/widget/PuzzleOptionListWidget.java @@ -1,6 +1,5 @@ package net.puzzlemc.gui.screen.widget; -import com.google.common.collect.ImmutableMap; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.MinecraftClient; @@ -10,8 +9,8 @@ import net.minecraft.client.gui.Selectable; import net.minecraft.client.gui.widget.ClickableWidget; import net.minecraft.client.gui.widget.ElementListWidget; import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.text.LiteralText; import net.minecraft.text.Text; -import net.minecraft.text.TranslatableText; import org.apache.logging.log4j.LogManager; import java.util.*; @@ -33,7 +32,7 @@ public class PuzzleOptionListWidget extends ElementListWidget buttons) { for (PuzzleWidget button : buttons) { if (button.buttonType == ButtonType.TEXT) { - this.addButton(new DummyButtonWidget(), button.descriptionText); + this.addButton(null, button.descriptionText); } else if (button.buttonType == ButtonType.BUTTON) { this.addButton(new PuzzleButtonWidget(this.width / 2 - 155 + 160, 0, 150, 20, button.buttonTextAction, button.onPress), button.descriptionText); } else if (button.buttonType == ButtonType.SLIDER) { @@ -53,38 +52,30 @@ public class PuzzleOptionListWidget extends ElementListWidget getHoveredButton(double mouseX, double mouseY) { - for (ButtonEntry buttonEntry : this.children()) { - for (ClickableWidget widget : buttonEntry.buttons) { - if (widget.isMouseOver(mouseX, mouseY)) { - return Optional.of(widget); - } - } - } - return Optional.empty(); - } - public static class ButtonEntry extends ElementListWidget.Entry { private static final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; - private final List buttons; - private final Map buttonsWithText; + private List buttons = new ArrayList<>(); + private final ClickableWidget button; + private final Text text; - private ButtonEntry(ImmutableMap buttons) { - this.buttons = buttons.keySet().asList(); - this.buttonsWithText = buttons; + private ButtonEntry(ClickableWidget button, Text text) { + if (button != null) + this.buttons.add(button); + this.button = button; + this.text = text; } public static ButtonEntry create(ClickableWidget button, Text text) { - return new ButtonEntry(ImmutableMap.of(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) { - this.buttonsWithText.forEach((button, text) -> { + if (button != null) { button.y = y; button.render(matrices, mouseX, mouseY, tickDelta); - if (button instanceof DummyButtonWidget) drawCenteredText(matrices,textRenderer, text,x + 200,y+5,0xFFFFFF); - else drawTextWithShadow(matrices,textRenderer, text,x+15,y+5,0xFFFFFF); - }); + } + if (button == null) drawCenteredText(matrices,textRenderer, new LiteralText("------ ").append(text).append(" ------"),x + 200,y+5,0xFFFFFF); + else drawTextWithShadow(matrices,textRenderer, text,x+15,y+5,0xFFFFFF); } public List children() { diff --git a/puzzle-gui/src/main/resources/assets/puzzle/textures/gui/puzzle_button.png b/puzzle-gui/src/main/resources/assets/puzzle/textures/gui/puzzle_button.png new file mode 100644 index 0000000..7d64eca Binary files /dev/null and b/puzzle-gui/src/main/resources/assets/puzzle/textures/gui/puzzle_button.png differ diff --git a/puzzle-gui/src/main/resources/fabric.mod.json b/puzzle-gui/src/main/resources/fabric.mod.json index 358efe8..5db7dc9 100755 --- a/puzzle-gui/src/main/resources/fabric.mod.json +++ b/puzzle-gui/src/main/resources/fabric.mod.json @@ -6,8 +6,8 @@ "name": "Puzzle GUI", "description": "Unites optifine replacement mods in a clean & vanilla-style gui", "authors": [ - "Motschen", - "TeamMidnightDust" + "PuzzleMC", + "Motschen" ], "contact": { "homepage": "https://www.midnightdust.eu/", diff --git a/puzzle-models/src/main/resources/fabric.mod.json b/puzzle-models/src/main/resources/fabric.mod.json index 03223a0..d975ec5 100755 --- a/puzzle-models/src/main/resources/fabric.mod.json +++ b/puzzle-models/src/main/resources/fabric.mod.json @@ -6,8 +6,8 @@ "name": "Puzzle Models", "description": "Provides more freedom for item and block models!", "authors": [ - "Motschen", - "TeamMidnightDust" + "PuzzleMC", + "Motschen" ], "contact": { "homepage": "https://www.midnightdust.eu/", diff --git a/puzzle-splashscreen/src/main/java/net/puzzlemc/splashscreen/PuzzleSplashScreen.java b/puzzle-splashscreen/src/main/java/net/puzzlemc/splashscreen/PuzzleSplashScreen.java index 9d9ccb2..b5245f6 100755 --- a/puzzle-splashscreen/src/main/java/net/puzzlemc/splashscreen/PuzzleSplashScreen.java +++ b/puzzle-splashscreen/src/main/java/net/puzzlemc/splashscreen/PuzzleSplashScreen.java @@ -1,9 +1,9 @@ package net.puzzlemc.splashscreen; import net.fabricmc.api.ClientModInitializer; +import net.minecraft.client.texture.NativeImageBackedTexture; import net.puzzlemc.core.config.PuzzleConfig; import net.puzzlemc.core.util.ColorUtil; -import net.puzzlemc.splashscreen.util.ConfigTexture; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.resource.ResourceManagerHelper; @@ -22,6 +22,7 @@ import org.apache.logging.log4j.LogManager; import java.awt.*; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; @@ -90,9 +91,13 @@ public class PuzzleSplashScreen implements ClientModInitializer { } for (Identifier id : manager.findResources("textures", path -> path.contains("mojangstudios.png"))) { try (InputStream stream = manager.getResource(id).getInputStream()) { - //LogManager.getLogger().info("Logo copied to cache!"); Files.copy(stream, LOGO_TEXTURE, StandardCopyOption.REPLACE_EXISTING); - client.getTextureManager().registerTexture(LOGO, new ConfigTexture(LOGO)); + DefaultResourcePack defaultResourcePack = client.getResourcePackProvider().getPack(); + InputStream defaultLogo = defaultResourcePack.open(ResourceType.CLIENT_RESOURCES, LOGO); + InputStream input = new FileInputStream(String.valueOf(PuzzleSplashScreen.LOGO_TEXTURE)); + if (input != defaultLogo) + client.getTextureManager().registerTexture(LOGO, new NativeImageBackedTexture(NativeImage.read(input))); + else Files.delete(LOGO_TEXTURE); } catch (Exception e) { LogManager.getLogger("Puzzle").error("Error occurred while loading custom minecraft logo " + id.toString(), e); } diff --git a/puzzle-splashscreen/src/main/java/net/puzzlemc/splashscreen/mixin/MixinSplashScreen.java b/puzzle-splashscreen/src/main/java/net/puzzlemc/splashscreen/mixin/MixinSplashScreen.java index 8ca81c7..e8c741a 100755 --- a/puzzle-splashscreen/src/main/java/net/puzzlemc/splashscreen/mixin/MixinSplashScreen.java +++ b/puzzle-splashscreen/src/main/java/net/puzzlemc/splashscreen/mixin/MixinSplashScreen.java @@ -1,13 +1,17 @@ package net.puzzlemc.splashscreen.mixin; +import com.mojang.blaze3d.platform.GlStateManager; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.screen.Overlay; import net.minecraft.client.gui.screen.SplashOverlay; +import net.minecraft.client.texture.NativeImage; +import net.minecraft.client.texture.NativeImageBackedTexture; +import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.Identifier; import net.minecraft.util.Util; import net.minecraft.util.math.MathHelper; import net.puzzlemc.core.config.PuzzleConfig; import net.puzzlemc.splashscreen.PuzzleSplashScreen; -import net.puzzlemc.splashscreen.util.ConfigTexture; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -16,37 +20,66 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; + @Mixin(value = SplashOverlay.class, priority = 2000) -public class MixinSplashScreen { +public abstract class MixinSplashScreen extends Overlay { @Shadow @Final static Identifier LOGO; - @Shadow @Final private boolean reloading; - @Shadow private long reloadStartTime; @Shadow private long reloadCompleteTime; - @Inject(method = "init(Lnet/minecraft/client/MinecraftClient;)V", at = @At("TAIL"), cancellable=true) - private static void init(MinecraftClient client, CallbackInfo ci) { // Load our custom textures at game start // - if (PuzzleConfig.resourcepackSplashScreen && PuzzleSplashScreen.LOGO_TEXTURE.toFile().exists()) client.getTextureManager().registerTexture(LOGO, new ConfigTexture(LOGO)); - } - //@ModifyArg(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/SplashScreen;fill(Lnet/minecraft/client/util/math/MatrixStack;IIIII)V"), index = 5) - private int modifyBackgroundColor(int color) { // Set the Background Color to our configured value // - long l = Util.getMeasuringTimeMs(); - if (this.reloading && this.reloadStartTime == -1L) { - this.reloadStartTime = l; - } + @Shadow @Final private MinecraftClient client; + @Shadow private long reloadStartTime; + + @Inject(method = "init(Lnet/minecraft/client/MinecraftClient;)V", at = @At("TAIL")) + private static void init(MinecraftClient client, CallbackInfo ci) { // Load our custom textures at game start // + if (PuzzleConfig.resourcepackSplashScreen && PuzzleSplashScreen.LOGO_TEXTURE.toFile().exists()) { + try { + InputStream input = new FileInputStream(String.valueOf(PuzzleSplashScreen.LOGO_TEXTURE)); + client.getTextureManager().registerTexture(LOGO, new NativeImageBackedTexture(NativeImage.read(input))); + } catch (IOException ignored) {} + } + } + @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/SplashOverlay;fill(Lnet/minecraft/client/util/math/MatrixStack;IIIII)V", shift = At.Shift.AFTER, ordinal = 0)) + private void modifyBackgroundColor(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) { // Set the Background Color to our configured value // + long l = Util.getMeasuringTimeMs(); 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); - - return PuzzleConfig.backgroundColor | m << 24; + if (PuzzleConfig.resourcepackSplashScreen && PuzzleConfig.backgroundColor != 15675965) + fill(matrices, 0, 0, client.getWindow().getScaledWidth(), client.getWindow().getScaledHeight(), withAlpha(PuzzleConfig.backgroundColor, m)); + } + @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/SplashOverlay;fill(Lnet/minecraft/client/util/math/MatrixStack;IIIII)V", shift = At.Shift.AFTER, ordinal = 1)) + private void modifyBackgroundColor2(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) { // Set the Background Color to our configured value // + long l = Util.getMeasuringTimeMs(); + float g = this.reloadStartTime > -1L ? (float)(l - this.reloadStartTime) / 500.0F : -1.0F; + int m = MathHelper.ceil(MathHelper.clamp((double)g, 0.15D, 1.0D) * 255.0D); + if (PuzzleConfig.resourcepackSplashScreen && PuzzleConfig.backgroundColor != 15675965) + fill(matrices, 0, 0, client.getWindow().getScaledWidth(), client.getWindow().getScaledHeight(), withAlpha(PuzzleConfig.backgroundColor, m)); + } + @Inject(method = "render", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/platform/GlStateManager;_clear(IZ)V", shift = At.Shift.AFTER)) + private void modifyBackgroundColor3(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) { // Set the Background Color to our configured value // + if (PuzzleConfig.resourcepackSplashScreen && PuzzleConfig.backgroundColor != 15675965) { + int m = PuzzleConfig.backgroundColor; + float p = (float) (m >> 16 & 255) / 255.0F; + float q = (float) (m >> 8 & 255) / 255.0F; + float r = (float) (m & 255) / 255.0F; + GlStateManager._clearColor(p, q, r, 1.0F); + GlStateManager._clear(16384, MinecraftClient.IS_SYSTEM_MAC); + } } - //@ModifyArg(method = "renderProgressBar", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/SplashScreen;fill(Lnet/minecraft/client/util/math/MatrixStack;IIIII)V"), index = 5) + @ModifyArg(method = "renderProgressBar", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/SplashOverlay;fill(Lnet/minecraft/client/util/math/MatrixStack;IIIII)V"), index = 5) private int modifyProgressFrame(int color) { // Set the Progress Bar Frame Color to our configured value // return PuzzleConfig.progressFrameColor | 255 << 24; } - //@ModifyArg(method = "renderProgressBar", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/SplashScreen;fill(Lnet/minecraft/client/util/math/MatrixStack;IIIII)V", ordinal = 4), index = 5) + @ModifyArg(method = "renderProgressBar", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/SplashOverlay;fill(Lnet/minecraft/client/util/math/MatrixStack;IIIII)V", ordinal = 4), index = 5) private int modifyProgressColor(int color) { // Set the Progress Bar Color to our configured value // return PuzzleConfig.progressBarColor | 255 << 24; } + private static int withAlpha(int color, int alpha) { + return color & 16777215 | alpha << 24; + } } diff --git a/puzzle-splashscreen/src/main/java/net/puzzlemc/splashscreen/util/ConfigTexture.java b/puzzle-splashscreen/src/main/java/net/puzzlemc/splashscreen/util/ConfigTexture.java deleted file mode 100755 index b854636..0000000 --- a/puzzle-splashscreen/src/main/java/net/puzzlemc/splashscreen/util/ConfigTexture.java +++ /dev/null @@ -1,38 +0,0 @@ -package net.puzzlemc.splashscreen.util; - -import net.minecraft.client.resource.metadata.TextureResourceMetadata; -import net.minecraft.client.texture.NativeImage; -import net.minecraft.client.texture.ResourceTexture; -import net.minecraft.resource.ResourceManager; -import net.minecraft.util.Identifier; -import net.puzzlemc.splashscreen.PuzzleSplashScreen; - -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; - -public class ConfigTexture extends ResourceTexture { - - // Load textures from the config directory // - public ConfigTexture(Identifier location) { - super(location); - } - - protected TextureData loadTextureData(ResourceManager resourceManager) { - try { - InputStream input = new FileInputStream(String.valueOf(PuzzleSplashScreen.LOGO_TEXTURE)); - TextureData texture; - - try { - texture = new TextureData(new TextureResourceMetadata(false, true), NativeImage.read(input)); - } finally { - input.close(); - } - - return texture; - } catch (IOException var18) { - return new TextureData(var18); - } - } - -} \ No newline at end of file diff --git a/puzzle-splashscreen/src/main/resources/fabric.mod.json b/puzzle-splashscreen/src/main/resources/fabric.mod.json index 8722a59..dd057b8 100755 --- a/puzzle-splashscreen/src/main/resources/fabric.mod.json +++ b/puzzle-splashscreen/src/main/resources/fabric.mod.json @@ -6,8 +6,8 @@ "name": "Puzzle Splash Screen", "description": "Allows resourcepacks to define a custom splash screen", "authors": [ - "Motschen", - "TeamMidnightDust" + "PuzzleMC", + "Motschen" ], "contact": { "homepage": "https://www.midnightdust.eu/", diff --git a/puzzle_versions.json b/puzzle_versions.json index e3c7092..129dd3d 100644 --- a/puzzle_versions.json +++ b/puzzle_versions.json @@ -1,5 +1,5 @@ { - "1.17-rc1": "Puzzle A1", - "1.17-rc2": "Puzzle A1", - "1.17": "Puzzle A1" + "1.17": "Puzzle R1", + "1.18-pre1": "Puzzle R1", + "1.18": "Puzzle R1" }