First steps to 1.0.0

- Fix modmenu compat
- Better Puzzle settings button based on MidnightLib
- Partially fix puzzle-splashscreen
This commit is contained in:
Motschen
2021-11-14 18:25:23 +01:00
parent c9b0e81f77
commit 92439549cc
22 changed files with 279 additions and 258 deletions

View File

@@ -132,6 +132,7 @@ dependencies {
modImplementation ("maven.modrinth:iris:${project.iris_version}") modImplementation ("maven.modrinth:iris:${project.iris_version}")
modImplementation ("maven.modrinth:cit-resewn:${project.cit_resewn_version}") modImplementation ("maven.modrinth:cit-resewn:${project.cit_resewn_version}")
modImplementation ("maven.modrinth:continuity:${project.continuity_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:3440846"
modImplementation("org.aperlambda:lambdajcommon:1.8.1") { modImplementation("org.aperlambda:lambdajcommon:1.8.1") {
@@ -140,6 +141,7 @@ 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}"
include "maven.modrinth:midnightlib:${project.midnightlib_version}"
subprojects.each { subprojects.each {
api project(path: ":${it.name}", configuration: "dev") api project(path: ":${it.name}", configuration: "dev")
@@ -154,9 +156,7 @@ publishing {
builtBy(remapJar) builtBy(remapJar)
} }
pom.withXml { pom.withXml {
def depsNode = asNode().appendNode("dependencies")
subprojects.each { subprojects.each {
def depNode = depsNode.appendNode("dependency")
depNode.appendNode("groupId", it.group) depNode.appendNode("groupId", it.group)
depNode.appendNode("artifactId", it.name) depNode.appendNode("artifactId", it.name)
depNode.appendNode("version", it.version) depNode.appendNode("version", it.version)

View File

@@ -8,8 +8,8 @@ org.gradle.jvmargs=-Xmx1G
loader_version=0.11.7 loader_version=0.11.7
# Mod Properties # Mod Properties
mod_version = 0.4.0 mod_version = 1.0.0
maven_group = eu.midnightdust maven_group = net.puzzlemc
archives_base_name = puzzle archives_base_name = puzzle
# Dependencies # Dependencies
@@ -22,6 +22,7 @@ org.gradle.jvmargs=-Xmx1G
lbg_version = 1.2.1+1.17 lbg_version = 1.2.1+1.17
iris_version = mc1.17.1-1.1.2 iris_version = mc1.17.1-1.1.2
continuity_version = 1.0.0+1.17 continuity_version = 1.0.0+1.17
animatica_version = 0.1+1.17
cit_resewn_version = 0.7.1 cit_resewn_version = 0.7.1
spruceui_version=3.3.0+1.17 spruceui_version=3.3.0+1.17
midnightlib_version=0.2.5 midnightlib_version=0.3.0

Binary file not shown.

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.0.1-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

269
gradlew vendored
View File

@@ -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"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with 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 # Attempt to set APP_HOME
# Resolve links: $0 may be a link # Resolve links: $0 may be a link
PRG="$0" app_path=$0
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do # Need this for daisy-chained symlinks.
ls=`ls -ld "$PRG"` while
link=`expr "$ls" : '.*-> \(.*\)$'` APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
if expr "$link" : '/.*' > /dev/null; then [ -h "$app_path" ]
PRG="$link" do
else ls=$( ls -ld "$app_path" )
PRG=`dirname "$PRG"`"/$link" link=${ls#*' -> '}
fi case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle" 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. # 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"' DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum" MAX_FD=maximum
warn () { warn () {
echo "$*" echo "$*"
} } >&2
die () { die () {
echo echo
echo "$*" echo "$*"
echo echo
exit 1 exit 1
} } >&2
# OS specific support (must be 'true' or 'false'). # OS specific support (must be 'true' or 'false').
cygwin=false cygwin=false
msys=false msys=false
darwin=false darwin=false
nonstop=false nonstop=false
case "`uname`" in case "$( uname )" in #(
CYGWIN* ) CYGWIN* ) cygwin=true ;; #(
cygwin=true Darwin* ) darwin=true ;; #(
;; MSYS* | MINGW* ) msys=true ;; #(
Darwin* ) NONSTOP* ) nonstop=true ;;
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 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 [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables # IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java" JAVACMD=$JAVA_HOME/jre/sh/java
else else
JAVACMD="$JAVA_HOME/bin/java" JAVACMD=$JAVA_HOME/bin/java
fi fi
if [ ! -x "$JAVACMD" ] ; then if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 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." location of your Java installation."
fi fi
else 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. 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 Please set the JAVA_HOME variable in your environment to match the
@@ -106,80 +140,95 @@ location of your Java installation."
fi fi
# Increase the maximum file descriptors if we can. # Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
MAX_FD_LIMIT=`ulimit -H -n` case $MAX_FD in #(
if [ $? -eq 0 ] ; then max*)
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then MAX_FD=$( ulimit -H -n ) ||
MAX_FD="$MAX_FD_LIMIT" warn "Could not query maximum file descriptor limit"
fi esac
ulimit -n $MAX_FD case $MAX_FD in #(
if [ $? -ne 0 ] ; then '' | soft) :;; #(
warn "Could not set maximum file descriptor limit: $MAX_FD" *)
fi ulimit -n "$MAX_FD" ||
else warn "Could not set maximum file descriptor limit to $MAX_FD"
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" ;;
esac esac
fi fi
# Escape application args # Collect all arguments for the java command, stacking in reverse order:
save () { # * args from the command line
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done # * the main class name
echo " " # * -classpath
} # * -D...appname settings
APP_ARGS=`save "$@"` # * --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 # For Cygwin or MSYS, switch paths to Windows format before running java
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 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" "$@" exec "$JAVACMD" "$@"

View File

@@ -6,7 +6,7 @@ import net.fabricmc.api.ClientModInitializer;
public class PuzzleCore implements 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 name = "Puzzle";
public final static String id = "puzzle"; public final static String id = "puzzle";
public final static String website = "https://github.com/PuzzleMC/Puzzle"; public final static String website = "https://github.com/PuzzleMC/Puzzle";

View File

@@ -13,7 +13,7 @@ import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.*; import java.util.*;
// MidnightConfigLite v0.1.0 // MidnightConfigLite v0.2.0
// Just writing and parsing of config files // Just writing and parsing of config files
/** Based on https://github.com/Minenash/TinyConfig /** Based on https://github.com/Minenash/TinyConfig
@@ -21,13 +21,8 @@ import java.util.*;
public class MidnightConfigLite { public class MidnightConfigLite {
private static final List<EntryInfo> entries = new ArrayList<>();
protected static class EntryInfo { protected static class EntryInfo {
Field field;
Object defaultValue; Object defaultValue;
Object value;
String tempValue;
} }
public static final Map<String,Class<?>> configClass = new HashMap<>(); public static final Map<String,Class<?>> configClass = new HashMap<>();
@@ -48,15 +43,6 @@ public class MidnightConfigLite {
} }
try { gson.fromJson(Files.newBufferedReader(path), config); } try { gson.fromJson(Files.newBufferedReader(path), config); }
catch (Exception e) { write(modid); } 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) { public static void write(String modid) {

View File

@@ -6,8 +6,8 @@
"name": "Puzzle", "name": "Puzzle",
"description": "Unites optifine replacement mods in a clean & vanilla-style gui", "description": "Unites optifine replacement mods in a clean & vanilla-style gui",
"authors": [ "authors": [
"Motschen", "PuzzleMC",
"TeamMidnightDust" "Motschen"
], ],
"contact": { "contact": {
"homepage": "https://www.midnightdust.eu/", "homepage": "https://www.midnightdust.eu/",
@@ -26,7 +26,7 @@
}, },
"custom": { "custom": {
"modmenu": { "modmenu": {
"parent": "puzzle-core" "parent": "puzzle"
} }
}, },

View File

@@ -6,8 +6,8 @@
"name": "Puzzle Blocks", "name": "Puzzle Blocks",
"description": "Lets resourcepacks change render layers of blocks", "description": "Lets resourcepacks change render layers of blocks",
"authors": [ "authors": [
"Motschen", "PuzzleMC",
"TeamMidnightDust" "Motschen"
], ],
"contact": { "contact": {
"homepage": "https://www.midnightdust.eu/", "homepage": "https://www.midnightdust.eu/",

View File

@@ -29,7 +29,7 @@ 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}"
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:cull-leaves:${project.cull_leaves_version}")
modImplementation ("maven.modrinth:lambdynamiclights:${project.ldl_version}") modImplementation ("maven.modrinth:lambdynamiclights:${project.ldl_version}")
modImplementation ("maven.modrinth:lambdabettergrass:${project.lbg_version}") modImplementation ("maven.modrinth:lambdabettergrass:${project.lbg_version}")

View File

@@ -7,22 +7,23 @@ import net.puzzlemc.gui.screen.PuzzleOptionsScreen;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
@Environment(EnvType.CLIENT) @Environment(EnvType.CLIENT)
public class ModMenuIntegration implements ModMenuApi { public class ModMenuIntegration implements ModMenuApi {
//Used to set the config screen for all modules // //Used to set the config screen for all modules //
// @Override @Override
// public Map<String, ConfigScreenFactory<?>> getProvidedConfigScreenFactories() { public Map<String, ConfigScreenFactory<?>> getProvidedConfigScreenFactories() {
// Map<String, ConfigScreenFactory<?>> map = ImmutableMap.of(); Map<String, ConfigScreenFactory<?>> map = new HashMap<>();
// map.put("puzzle",PuzzleOptionsScreen::new); map.put("puzzle",PuzzleOptionsScreen::new);
// map.put("puzzle-gui",PuzzleOptionsScreen::new); map.put("puzzle-gui",PuzzleOptionsScreen::new);
// map.put("puzzle-blocks",PuzzleOptionsScreen::new); map.put("puzzle-blocks",PuzzleOptionsScreen::new);
// map.put("puzzle-base",PuzzleOptionsScreen::new); map.put("puzzle-base",PuzzleOptionsScreen::new);
// map.put("puzzle-models",PuzzleOptionsScreen::new); map.put("puzzle-models",PuzzleOptionsScreen::new);
// map.put("puzzle-randomentities",PuzzleOptionsScreen::new); map.put("puzzle-randomentities",PuzzleOptionsScreen::new);
// map.put("puzzle-splashscreen",PuzzleOptionsScreen::new); map.put("puzzle-splashscreen",PuzzleOptionsScreen::new);
// return map; return map;
// } }
} }

View File

@@ -1,9 +1,11 @@
package net.puzzlemc.gui.mixin; 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.puzzlemc.gui.screen.PuzzleOptionsScreen;
import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.option.OptionsScreen; import net.minecraft.client.gui.screen.option.OptionsScreen;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText; import net.minecraft.text.TranslatableText;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
@@ -15,15 +17,16 @@ import java.util.Objects;
@Mixin(OptionsScreen.class) @Mixin(OptionsScreen.class)
public class MixinOptionsScreen extends Screen { 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) { protected MixinOptionsScreen(Text title) {
super(title); super(title);
} }
@Inject(at = @At("TAIL"),method = "init") @Inject(at = @At("HEAD"), method = "init")
public void init(CallbackInfo ci) { private void midnightlib$init(CallbackInfo ci) {
PuzzleOptionsScreen puzzleScreen = new PuzzleOptionsScreen(this); this.addDrawableChild(new TexturedOverlayButtonWidget(this.width / 2 - 178, this.height / 6 - 12, 20, 20, 0, 0, 20, PUZZLE_ICON_TEXTURE, 32, 64, (buttonWidget) -> {
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))); (Objects.requireNonNull(this.client)).setScreen(new PuzzleOptionsScreen(this));
}, new TranslatableText("midnightlib.overview.title")));
} }
} }

View File

@@ -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);
}
}

View File

@@ -1,6 +1,5 @@
package net.puzzlemc.gui.screen.widget; package net.puzzlemc.gui.screen.widget;
import com.google.common.collect.ImmutableMap;
import net.fabricmc.api.EnvType; 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;
@@ -10,8 +9,8 @@ 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.util.math.MatrixStack; import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.LiteralText;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import java.util.*; import java.util.*;
@@ -33,7 +32,7 @@ public class PuzzleOptionListWidget extends ElementListWidget<PuzzleOptionListWi
public void addAll(List<PuzzleWidget> buttons) { public void addAll(List<PuzzleWidget> buttons) {
for (PuzzleWidget button : buttons) { for (PuzzleWidget button : buttons) {
if (button.buttonType == ButtonType.TEXT) { if (button.buttonType == ButtonType.TEXT) {
this.addButton(new DummyButtonWidget(), button.descriptionText); this.addButton(null, button.descriptionText);
} else if (button.buttonType == ButtonType.BUTTON) { } else if (button.buttonType == ButtonType.BUTTON) {
this.addButton(new PuzzleButtonWidget(this.width / 2 - 155 + 160, 0, 150, 20, button.buttonTextAction, button.onPress), button.descriptionText); this.addButton(new PuzzleButtonWidget(this.width / 2 - 155 + 160, 0, 150, 20, button.buttonTextAction, button.onPress), button.descriptionText);
} else if (button.buttonType == ButtonType.SLIDER) { } else if (button.buttonType == ButtonType.SLIDER) {
@@ -53,38 +52,30 @@ public class PuzzleOptionListWidget extends ElementListWidget<PuzzleOptionListWi
return super.getScrollbarPositionX() + 60; return super.getScrollbarPositionX() + 60;
} }
public Optional<ClickableWidget> 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<ButtonEntry> { public static class ButtonEntry extends ElementListWidget.Entry<ButtonEntry> {
private static final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer; private static final TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer;
private final List<ClickableWidget> buttons; private List<ClickableWidget> buttons = new ArrayList<>();
private final Map<ClickableWidget, Text> buttonsWithText; private final ClickableWidget button;
private final Text text;
private ButtonEntry(ImmutableMap<ClickableWidget, Text> buttons) { private ButtonEntry(ClickableWidget button, Text text) {
this.buttons = buttons.keySet().asList(); if (button != null)
this.buttonsWithText = buttons; this.buttons.add(button);
this.button = button;
this.text = text;
} }
public static ButtonEntry create(ClickableWidget button, 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) { 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.y = y;
button.render(matrices, mouseX, mouseY, tickDelta); 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<? extends Element> children() { public List<? extends Element> children() {

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -6,8 +6,8 @@
"name": "Puzzle GUI", "name": "Puzzle GUI",
"description": "Unites optifine replacement mods in a clean & vanilla-style gui", "description": "Unites optifine replacement mods in a clean & vanilla-style gui",
"authors": [ "authors": [
"Motschen", "PuzzleMC",
"TeamMidnightDust" "Motschen"
], ],
"contact": { "contact": {
"homepage": "https://www.midnightdust.eu/", "homepage": "https://www.midnightdust.eu/",

View File

@@ -6,8 +6,8 @@
"name": "Puzzle Models", "name": "Puzzle Models",
"description": "Provides more freedom for item and block models!", "description": "Provides more freedom for item and block models!",
"authors": [ "authors": [
"Motschen", "PuzzleMC",
"TeamMidnightDust" "Motschen"
], ],
"contact": { "contact": {
"homepage": "https://www.midnightdust.eu/", "homepage": "https://www.midnightdust.eu/",

View File

@@ -1,9 +1,9 @@
package net.puzzlemc.splashscreen; package net.puzzlemc.splashscreen;
import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.ClientModInitializer;
import net.minecraft.client.texture.NativeImageBackedTexture;
import net.puzzlemc.core.config.PuzzleConfig; import net.puzzlemc.core.config.PuzzleConfig;
import net.puzzlemc.core.util.ColorUtil; import net.puzzlemc.core.util.ColorUtil;
import net.puzzlemc.splashscreen.util.ConfigTexture;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment; import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.resource.ResourceManagerHelper; import net.fabricmc.fabric.api.resource.ResourceManagerHelper;
@@ -22,6 +22,7 @@ import org.apache.logging.log4j.LogManager;
import java.awt.*; import java.awt.*;
import java.io.File; import java.io.File;
import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.nio.file.Files; 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"))) { for (Identifier id : manager.findResources("textures", path -> path.contains("mojangstudios.png"))) {
try (InputStream stream = manager.getResource(id).getInputStream()) { try (InputStream stream = manager.getResource(id).getInputStream()) {
//LogManager.getLogger().info("Logo copied to cache!");
Files.copy(stream, LOGO_TEXTURE, StandardCopyOption.REPLACE_EXISTING); 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) { } 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);
} }

View File

@@ -1,13 +1,17 @@
package net.puzzlemc.splashscreen.mixin; package net.puzzlemc.splashscreen.mixin;
import com.mojang.blaze3d.platform.GlStateManager;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
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.texture.NativeImage;
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;
import net.puzzlemc.core.config.PuzzleConfig; import net.puzzlemc.core.config.PuzzleConfig;
import net.puzzlemc.splashscreen.PuzzleSplashScreen; import net.puzzlemc.splashscreen.PuzzleSplashScreen;
import net.puzzlemc.splashscreen.util.ConfigTexture;
import org.spongepowered.asm.mixin.Final; 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.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.ModifyArg;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; 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) @Mixin(value = SplashOverlay.class, priority = 2000)
public class MixinSplashScreen { public abstract class MixinSplashScreen extends Overlay {
@Shadow @Final static Identifier LOGO; @Shadow @Final static Identifier LOGO;
@Shadow @Final private boolean reloading;
@Shadow private long reloadStartTime;
@Shadow private long reloadCompleteTime; @Shadow private long reloadCompleteTime;
@Inject(method = "init(Lnet/minecraft/client/MinecraftClient;)V", at = @At("TAIL"), cancellable=true) @Shadow @Final private MinecraftClient client;
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 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; 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);
if (PuzzleConfig.resourcepackSplashScreen && PuzzleConfig.backgroundColor != 15675965)
return PuzzleConfig.backgroundColor | m << 24; 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 // private int modifyProgressFrame(int color) { // Set the Progress Bar Frame Color to our configured value //
return PuzzleConfig.progressFrameColor | 255 << 24; 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 // private int modifyProgressColor(int color) { // Set the Progress Bar Color to our configured value //
return PuzzleConfig.progressBarColor | 255 << 24; return PuzzleConfig.progressBarColor | 255 << 24;
} }
private static int withAlpha(int color, int alpha) {
return color & 16777215 | alpha << 24;
}
} }

View File

@@ -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);
}
}
}

View File

@@ -6,8 +6,8 @@
"name": "Puzzle Splash Screen", "name": "Puzzle Splash Screen",
"description": "Allows resourcepacks to define a custom splash screen", "description": "Allows resourcepacks to define a custom splash screen",
"authors": [ "authors": [
"Motschen", "PuzzleMC",
"TeamMidnightDust" "Motschen"
], ],
"contact": { "contact": {
"homepage": "https://www.midnightdust.eu/", "homepage": "https://www.midnightdust.eu/",

View File

@@ -1,5 +1,5 @@
{ {
"1.17-rc1": "Puzzle A1", "1.17": "Puzzle R1",
"1.17-rc2": "Puzzle A1", "1.18-pre1": "Puzzle R1",
"1.17": "Puzzle A1" "1.18": "Puzzle R1"
} }