just a copy of petroleum right now
This commit is contained in:
		
						commit
						183c81258a
					
				
					 88 changed files with 7405 additions and 0 deletions
				
			
		
							
								
								
									
										30
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,30 @@ | ||||||
|  | # gradle | ||||||
|  | 
 | ||||||
|  | .gradle/ | ||||||
|  | build/ | ||||||
|  | out/ | ||||||
|  | classes/ | ||||||
|  | 
 | ||||||
|  | # eclipse | ||||||
|  | 
 | ||||||
|  | *.launch | ||||||
|  | 
 | ||||||
|  | # idea | ||||||
|  | 
 | ||||||
|  | .idea/ | ||||||
|  | *.iml | ||||||
|  | *.ipr | ||||||
|  | *.iws | ||||||
|  | 
 | ||||||
|  | # vscode | ||||||
|  | 
 | ||||||
|  | .settings/ | ||||||
|  | .vscode/ | ||||||
|  | bin/ | ||||||
|  | .classpath | ||||||
|  | .project | ||||||
|  | 
 | ||||||
|  | # fabric | ||||||
|  | 
 | ||||||
|  | run/ | ||||||
|  | logs/ | ||||||
							
								
								
									
										10
									
								
								README.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								README.md
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | # Petroleum | ||||||
|  | ### A Minecraft "mod" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #### Features | ||||||
|  | 
 | ||||||
|  | - none, yet. | ||||||
|  | 
 | ||||||
|  | # | ||||||
|  | [by janeptrv](https://j4.pm) | ||||||
							
								
								
									
										80
									
								
								build.gradle
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								build.gradle
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,80 @@ | ||||||
|  | plugins { | ||||||
|  | 	id 'java' | ||||||
|  | 	id 'idea' | ||||||
|  | 	id 'fabric-loom' version '0.5.9' | ||||||
|  | 	id 'maven-publish' | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | sourceCompatibility = JavaVersion.VERSION_1_8 | ||||||
|  | targetCompatibility = JavaVersion.VERSION_1_8 | ||||||
|  | 
 | ||||||
|  | archivesBaseName = project.archives_base_name | ||||||
|  | version = project.mod_version | ||||||
|  | group = project.maven_group | ||||||
|  | 
 | ||||||
|  | dependencies { | ||||||
|  | 	//to change the versions see the gradle.properties file | ||||||
|  | 	minecraft "com.mojang:minecraft:${project.minecraft_version}" | ||||||
|  | 	mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" | ||||||
|  | 	modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" | ||||||
|  | 
 | ||||||
|  | 	// Fabric API. This is technically optional, but you probably want it anyway. | ||||||
|  | 	modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" | ||||||
|  | 
 | ||||||
|  | 	// PSA: Some older mods, compiled on Loom 0.2.1, might have outdated Maven POMs. | ||||||
|  | 	// You may need to force-disable transitiveness on them. | ||||||
|  | 	compileOnly "com.google.code.findbugs:jsr305:3.0.2" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | processResources { | ||||||
|  | 	inputs.property "version", project.version | ||||||
|  | 
 | ||||||
|  | 	from(sourceSets.main.resources.srcDirs) { | ||||||
|  | 		include "fabric.mod.json" | ||||||
|  | 		expand "version": project.version | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	from(sourceSets.main.resources.srcDirs) { | ||||||
|  | 		exclude "fabric.mod.json" | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ensure that the encoding is set to UTF-8, no matter what the system default is | ||||||
|  | // this fixes some edge cases with special characters not displaying correctly | ||||||
|  | // see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html | ||||||
|  | tasks.withType(JavaCompile) { | ||||||
|  | 	options.encoding = "UTF-8" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task | ||||||
|  | // if it is present. | ||||||
|  | // If you remove this task, sources will not be generated. | ||||||
|  | task sourcesJar(type: Jar, dependsOn: classes) { | ||||||
|  | 	classifier = "sources" | ||||||
|  | 	from sourceSets.main.allSource | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | jar { | ||||||
|  | 	from "LICENSE" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // configure the maven publication | ||||||
|  | publishing { | ||||||
|  | 	publications { | ||||||
|  | 		mavenJava(MavenPublication) { | ||||||
|  | 			// add all the jars that should be included when publishing to maven | ||||||
|  | 			artifact(remapJar) { | ||||||
|  | 				builtBy remapJar | ||||||
|  | 			} | ||||||
|  | 			artifact(sourcesJar) { | ||||||
|  | 				builtBy remapSourcesJar | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// select the repositories you want to publish to | ||||||
|  | 	repositories { | ||||||
|  | 		// uncomment to publish to the local maven | ||||||
|  | 		// mavenLocal() | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										17
									
								
								gradle.properties
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								gradle.properties
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,17 @@ | ||||||
|  | # Done to increase the memory available to gradle. | ||||||
|  | org.gradle.jvmargs=-Xmx1G | ||||||
|  | 
 | ||||||
|  | # Fabric Properties | ||||||
|  | 	# check these on https://fabricmc.net/use | ||||||
|  | 	minecraft_version=1.16.4 | ||||||
|  | 	yarn_mappings=1.16.4+build.7 | ||||||
|  | 	loader_version=0.10.8 | ||||||
|  | 
 | ||||||
|  | # Mod Properties | ||||||
|  | 	mod_version = 0.1.4 | ||||||
|  | 	maven_group = pm.j4 | ||||||
|  | 	archives_base_name = petroleum | ||||||
|  | 
 | ||||||
|  | # 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.28.1+1.16 | ||||||
							
								
								
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										5
									
								
								gradle/wrapper/gradle-wrapper.properties
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								gradle/wrapper/gradle-wrapper.properties
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,5 @@ | ||||||
|  | distributionBase=GRADLE_USER_HOME | ||||||
|  | distributionPath=wrapper/dists | ||||||
|  | distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip | ||||||
|  | zipStoreBase=GRADLE_USER_HOME | ||||||
|  | zipStorePath=wrapper/dists | ||||||
							
								
								
									
										183
									
								
								gradlew
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										183
									
								
								gradlew
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,183 @@ | ||||||
|  | #!/usr/bin/env sh | ||||||
|  | 
 | ||||||
|  | # | ||||||
|  | # Copyright 2015 the original author or authors. | ||||||
|  | # | ||||||
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | # you may not use this file except in compliance with the License. | ||||||
|  | # You may obtain a copy of the License at | ||||||
|  | # | ||||||
|  | #      https://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | # | ||||||
|  | # Unless required by applicable law or agreed to in writing, software | ||||||
|  | # distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | # See the License for the specific language governing permissions and | ||||||
|  | # limitations under the License. | ||||||
|  | # | ||||||
|  | 
 | ||||||
|  | ############################################################################## | ||||||
|  | ## | ||||||
|  | ##  Gradle start up script for UN*X | ||||||
|  | ## | ||||||
|  | ############################################################################## | ||||||
|  | 
 | ||||||
|  | # 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 | ||||||
|  | done | ||||||
|  | SAVED="`pwd`" | ||||||
|  | cd "`dirname \"$PRG\"`/" >/dev/null | ||||||
|  | APP_HOME="`pwd -P`" | ||||||
|  | cd "$SAVED" >/dev/null | ||||||
|  | 
 | ||||||
|  | APP_NAME="Gradle" | ||||||
|  | APP_BASE_NAME=`basename "$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" | ||||||
|  | 
 | ||||||
|  | warn () { | ||||||
|  |     echo "$*" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | die () { | ||||||
|  |     echo | ||||||
|  |     echo "$*" | ||||||
|  |     echo | ||||||
|  |     exit 1 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # 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 | ||||||
|  |     ;; | ||||||
|  | esac | ||||||
|  | 
 | ||||||
|  | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar | ||||||
|  | 
 | ||||||
|  | # Determine the Java command to use to start the JVM. | ||||||
|  | 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" | ||||||
|  |     else | ||||||
|  |         JAVACMD="$JAVA_HOME/bin/java" | ||||||
|  |     fi | ||||||
|  |     if [ ! -x "$JAVACMD" ] ; then | ||||||
|  |         die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME | ||||||
|  | 
 | ||||||
|  | Please set the JAVA_HOME variable in your environment to match the | ||||||
|  | location of your Java installation." | ||||||
|  |     fi | ||||||
|  | else | ||||||
|  |     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 | ||||||
|  | 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" ;; | ||||||
|  |     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, 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" | ||||||
|  | 
 | ||||||
|  | exec "$JAVACMD" "$@" | ||||||
							
								
								
									
										103
									
								
								gradlew.bat
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								gradlew.bat
									
										
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,103 @@ | ||||||
|  | @rem | ||||||
|  | @rem Copyright 2015 the original author or authors. | ||||||
|  | @rem | ||||||
|  | @rem Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | @rem you may not use this file except in compliance with the License. | ||||||
|  | @rem You may obtain a copy of the License at | ||||||
|  | @rem | ||||||
|  | @rem      https://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | @rem | ||||||
|  | @rem Unless required by applicable law or agreed to in writing, software | ||||||
|  | @rem distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | @rem See the License for the specific language governing permissions and | ||||||
|  | @rem limitations under the License. | ||||||
|  | @rem | ||||||
|  | 
 | ||||||
|  | @if "%DEBUG%" == "" @echo off | ||||||
|  | @rem ########################################################################## | ||||||
|  | @rem | ||||||
|  | @rem  Gradle startup script for Windows | ||||||
|  | @rem | ||||||
|  | @rem ########################################################################## | ||||||
|  | 
 | ||||||
|  | @rem Set local scope for the variables with windows NT shell | ||||||
|  | if "%OS%"=="Windows_NT" setlocal | ||||||
|  | 
 | ||||||
|  | set DIRNAME=%~dp0 | ||||||
|  | if "%DIRNAME%" == "" set DIRNAME=. | ||||||
|  | set APP_BASE_NAME=%~n0 | ||||||
|  | set APP_HOME=%DIRNAME% | ||||||
|  | 
 | ||||||
|  | @rem Resolve any "." and ".." in APP_HOME to make it shorter. | ||||||
|  | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi | ||||||
|  | 
 | ||||||
|  | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | ||||||
|  | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" | ||||||
|  | 
 | ||||||
|  | @rem Find java.exe | ||||||
|  | if defined JAVA_HOME goto findJavaFromJavaHome | ||||||
|  | 
 | ||||||
|  | set JAVA_EXE=java.exe | ||||||
|  | %JAVA_EXE% -version >NUL 2>&1 | ||||||
|  | if "%ERRORLEVEL%" == "0" goto init | ||||||
|  | 
 | ||||||
|  | echo. | ||||||
|  | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | ||||||
|  | echo. | ||||||
|  | echo Please set the JAVA_HOME variable in your environment to match the | ||||||
|  | echo location of your Java installation. | ||||||
|  | 
 | ||||||
|  | goto fail | ||||||
|  | 
 | ||||||
|  | :findJavaFromJavaHome | ||||||
|  | set JAVA_HOME=%JAVA_HOME:"=% | ||||||
|  | set JAVA_EXE=%JAVA_HOME%/bin/java.exe | ||||||
|  | 
 | ||||||
|  | if exist "%JAVA_EXE%" goto init | ||||||
|  | 
 | ||||||
|  | echo. | ||||||
|  | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% | ||||||
|  | echo. | ||||||
|  | echo Please set the JAVA_HOME variable in your environment to match the | ||||||
|  | echo location of your Java installation. | ||||||
|  | 
 | ||||||
|  | goto fail | ||||||
|  | 
 | ||||||
|  | :init | ||||||
|  | @rem Get command-line arguments, handling Windows variants | ||||||
|  | 
 | ||||||
|  | if not "%OS%" == "Windows_NT" goto win9xME_args | ||||||
|  | 
 | ||||||
|  | :win9xME_args | ||||||
|  | @rem Slurp the command line arguments. | ||||||
|  | set CMD_LINE_ARGS= | ||||||
|  | set _SKIP=2 | ||||||
|  | 
 | ||||||
|  | :win9xME_args_slurp | ||||||
|  | if "x%~1" == "x" goto execute | ||||||
|  | 
 | ||||||
|  | set CMD_LINE_ARGS=%* | ||||||
|  | 
 | ||||||
|  | :execute | ||||||
|  | @rem Setup the command line | ||||||
|  | 
 | ||||||
|  | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar | ||||||
|  | 
 | ||||||
|  | @rem Execute Gradle | ||||||
|  | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% | ||||||
|  | 
 | ||||||
|  | :end | ||||||
|  | @rem End local scope for the variables with windows NT shell | ||||||
|  | if "%ERRORLEVEL%"=="0" goto mainEnd | ||||||
|  | 
 | ||||||
|  | :fail | ||||||
|  | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of | ||||||
|  | rem the _cmd.exe /c_ return code! | ||||||
|  | if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 | ||||||
|  | exit /b 1 | ||||||
|  | 
 | ||||||
|  | :mainEnd | ||||||
|  | if "%OS%"=="Windows_NT" endlocal | ||||||
|  | 
 | ||||||
|  | :omega | ||||||
							
								
								
									
										168
									
								
								remappedSrc/pm/j4/petroleum/PetroleumMod.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								remappedSrc/pm/j4/petroleum/PetroleumMod.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,168 @@ | ||||||
|  | package pm.j4.petroleum; | ||||||
|  | 
 | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.Arrays; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Optional; | ||||||
|  | import net.fabricmc.api.ModInitializer; | ||||||
|  | import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; | ||||||
|  | import net.fabricmc.loader.api.FabricLoader; | ||||||
|  | import net.fabricmc.loader.api.ModContainer; | ||||||
|  | import net.fabricmc.loader.api.metadata.ModMetadata; | ||||||
|  | import net.minecraft.client.MinecraftClient; | ||||||
|  | import net.minecraft.client.options.KeyBinding; | ||||||
|  | import net.minecraft.server.integrated.IntegratedServer; | ||||||
|  | import pm.j4.petroleum.modules.ExampleModule; | ||||||
|  | import pm.j4.petroleum.modules.bindings.BindingManager; | ||||||
|  | import pm.j4.petroleum.modules.list.ModList; | ||||||
|  | import pm.j4.petroleum.modules.menu.ModMenu; | ||||||
|  | import pm.j4.petroleum.modules.splash.SplashText; | ||||||
|  | import pm.j4.petroleum.modules.xray.Xray; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigHolder; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigManager; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | //TODO: | ||||||
|  | // petroleum module checklist | ||||||
|  | // [ ] xray (lol) | ||||||
|  | // [ ] combat stuff. killaura, anti knockback, etc | ||||||
|  | // [ ] render stuff. tracers, nametags | ||||||
|  | // [ ] wurst taco. but a fish | ||||||
|  | // [ ] elytra fly | ||||||
|  | // [ ] movement stuff. nofall, jesus, speed | ||||||
|  | // [ ] elytra bhop | ||||||
|  | // [ ] boatfly | ||||||
|  | // [ ] anti anti cheat | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Petroleum mod. | ||||||
|  |  */ | ||||||
|  | public class PetroleumMod implements ModInitializer { | ||||||
|  | 	/** | ||||||
|  | 	 * The Mod data. | ||||||
|  | 	 */ | ||||||
|  | 	public static ModMetadata modData = null; | ||||||
|  | 	/** | ||||||
|  | 	 * The constant client. | ||||||
|  | 	 */ | ||||||
|  | 	private static MinecraftClient client; | ||||||
|  | 	/** | ||||||
|  | 	 * The constant activeMods. | ||||||
|  | 	 */ | ||||||
|  | 	private static final List<ModuleBase> activeMods = Arrays.asList( | ||||||
|  | 			new SplashText(), | ||||||
|  | 			new ModMenu(), | ||||||
|  | 			new ModList(), | ||||||
|  | 			new BindingManager(), | ||||||
|  | 			new ExampleModule(), | ||||||
|  | 			new Xray() | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Is active boolean. | ||||||
|  | 	 * | ||||||
|  | 	 * @param modName the mod name | ||||||
|  | 	 * @return the boolean | ||||||
|  | 	 */ | ||||||
|  | 	public static boolean isActive(String modName) { | ||||||
|  | 		return activeMods.stream().anyMatch(mod -> mod.getModuleName().equals(modName)); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets mod. | ||||||
|  | 	 * | ||||||
|  | 	 * @param modName the mod name | ||||||
|  | 	 * @return the mod | ||||||
|  | 	 */ | ||||||
|  | 	public static Optional<ModuleBase> getMod(String modName) { | ||||||
|  | 		return activeMods.stream().filter(mod -> mod.getModuleName().equals(modName)).findFirst(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets active mods. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the active mods | ||||||
|  | 	 */ | ||||||
|  | 	public static List<ModuleBase> getActiveMods() { | ||||||
|  | 		return activeMods; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The constant registeredBinds. | ||||||
|  | 	 */ | ||||||
|  | 	private static final List<KeyBinding> registeredBinds = new ArrayList<>(); | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Add bind. | ||||||
|  | 	 * | ||||||
|  | 	 * @param b the b | ||||||
|  | 	 */ | ||||||
|  | 	public static void addBind(KeyBinding b) { | ||||||
|  | 		registeredBinds.add(b); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Remove bind. | ||||||
|  | 	 * | ||||||
|  | 	 * @param b the b | ||||||
|  | 	 */ | ||||||
|  | 	public static void removeBind(KeyBinding b) { | ||||||
|  | 		registeredBinds.remove(b); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets active keybinds. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the active keybinds | ||||||
|  | 	 */ | ||||||
|  | 	public static List<KeyBinding> getActiveKeybinds() { | ||||||
|  | 		return registeredBinds; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets server address. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the server address | ||||||
|  | 	 */ | ||||||
|  | 	public static String getServerAddress() { | ||||||
|  | 		if (client != null && client.getServer() != null) { | ||||||
|  | 			IntegratedServer server = client.getServer(); | ||||||
|  | 			if (!server.isRemote()) { | ||||||
|  | 				return "localhost"; | ||||||
|  | 			} | ||||||
|  | 			if (server.isRemote() && !server.getServerIp().isEmpty()) { | ||||||
|  | 				return server.getServerIp(); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return null; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void onInitialize() { | ||||||
|  | 
 | ||||||
|  | 		ConfigManager.initConfig(); | ||||||
|  | 
 | ||||||
|  | 		// always update mod data | ||||||
|  | 		Optional<ModContainer> modContainer = FabricLoader.getInstance().getModContainer("petroleum"); | ||||||
|  | 		modContainer.ifPresent(container -> modData = container.getMetadata()); | ||||||
|  | 
 | ||||||
|  | 		Optional<ConfigHolder> conf = ConfigManager.getConfig(); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 		//initialize any keybinds, data, etc. | ||||||
|  | 		activeMods.forEach(ModuleBase::init); | ||||||
|  | 
 | ||||||
|  | 		//initialize keybind handler | ||||||
|  | 		conf.ifPresent(configHolder -> ClientTickEvents.END_CLIENT_TICK.register(client -> { | ||||||
|  | 			if (PetroleumMod.client != client) { | ||||||
|  | 				PetroleumMod.client = client; | ||||||
|  | 			} | ||||||
|  | 			for (KeyBinding b : PetroleumMod.getActiveKeybinds()) { | ||||||
|  | 				while (b.wasPressed()) { | ||||||
|  | 					configHolder.globalConfig.bindings.get(b).activate(client); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		})); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										70
									
								
								remappedSrc/pm/j4/petroleum/gui/PModMenuScreen.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								remappedSrc/pm/j4/petroleum/gui/PModMenuScreen.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,70 @@ | ||||||
|  | package pm.j4.petroleum.gui; | ||||||
|  | 
 | ||||||
|  | import com.mojang.blaze3d.systems.RenderSystem; | ||||||
|  | import java.util.Map; | ||||||
|  | import net.minecraft.client.gui.screen.Screen; | ||||||
|  | import net.minecraft.client.render.BufferBuilder; | ||||||
|  | import net.minecraft.client.render.Tessellator; | ||||||
|  | import net.minecraft.client.render.VertexFormats; | ||||||
|  | import net.minecraft.client.util.math.MatrixStack; | ||||||
|  | import net.minecraft.text.LiteralText; | ||||||
|  | import net.minecraft.text.TranslatableText; | ||||||
|  | import pm.j4.petroleum.modules.menu.ModMenu; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigManager; | ||||||
|  | import pm.j4.petroleum.util.data.ButtonInformation; | ||||||
|  | import pm.j4.petroleum.util.data.Category; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type P mod menu screen. | ||||||
|  |  */ | ||||||
|  | public class PModMenuScreen extends Screen { | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new P mod menu screen. | ||||||
|  | 	 */ | ||||||
|  | 	public PModMenuScreen() { | ||||||
|  | 		super(new TranslatableText("petroleum.modmenu")); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { | ||||||
|  | 		this.renderBackground(matrices); | ||||||
|  | 		super.render(matrices, mouseX, mouseY, delta); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	protected void init() { | ||||||
|  | 		Map<String, ButtonInformation> coordinateMap = ModMenu.getButtons(); | ||||||
|  | 		coordinateMap.forEach((category, coord) -> { | ||||||
|  | 			this.addButton(new PMovableButton((int) (coord.x * this.width), | ||||||
|  | 					(int) (coord.y * this.height), | ||||||
|  | 					category, | ||||||
|  | 					Category.getByCategory(category), | ||||||
|  | 					coord.open, | ||||||
|  | 					this)); | ||||||
|  | 		}); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void onClose() { | ||||||
|  | 		if (ConfigManager.getConfig().isPresent()) { | ||||||
|  | 			ConfigManager.getConfig().get().disableModule("petroleum.modmenu"); | ||||||
|  | 			this.buttons.forEach(button -> ((PMovableButton) button).updateCoordinate()); | ||||||
|  | 			ConfigManager.saveGlobalConfig(); | ||||||
|  | 		} | ||||||
|  | 		super.onClose(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void renderBackground(MatrixStack matrices) { | ||||||
|  | 		Tessellator t_1 = Tessellator.getInstance(); | ||||||
|  | 		BufferBuilder buffer = t_1.getBuffer(); | ||||||
|  | 		RenderSystem.enableBlend(); | ||||||
|  | 		buffer.begin(7, VertexFormats.POSITION_COLOR); | ||||||
|  | 		buffer.vertex(0, this.height, 0.0D).color(0.1F, 0.1F, 0.1F, 0.3F).next(); | ||||||
|  | 		buffer.vertex(this.width, this.height, 0.0D).color(0.1F, 0.1F, 0.1F, 0.3F).next(); | ||||||
|  | 		buffer.vertex(this.width, 0, 0.0D).color(0.1F, 0.1F, 0.1F, 0.3F).next(); | ||||||
|  | 		buffer.vertex(0, 0, 0.0D).color(0.1F, 0.1F, 0.1F, 0.3F).next(); | ||||||
|  | 		t_1.draw(); | ||||||
|  | 		RenderSystem.disableBlend(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										69
									
								
								remappedSrc/pm/j4/petroleum/gui/PModuleConfigEntry.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								remappedSrc/pm/j4/petroleum/gui/PModuleConfigEntry.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,69 @@ | ||||||
|  | package pm.j4.petroleum.gui; | ||||||
|  | 
 | ||||||
|  | import net.minecraft.client.MinecraftClient; | ||||||
|  | import net.minecraft.client.gui.widget.EntryListWidget; | ||||||
|  | import net.minecraft.client.util.math.MatrixStack; | ||||||
|  | import net.minecraft.text.LiteralText; | ||||||
|  | import net.minecraft.text.Text; | ||||||
|  | import pm.j4.petroleum.util.module.option.BooleanOption; | ||||||
|  | import pm.j4.petroleum.util.module.option.ConfigurationOption; | ||||||
|  | import pm.j4.petroleum.util.module.option.ListOption; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type P module config entry. | ||||||
|  |  */ | ||||||
|  | public class PModuleConfigEntry extends EntryListWidget.Entry<PModuleConfigEntry> { | ||||||
|  | 	/** | ||||||
|  | 	 * The Option. | ||||||
|  | 	 */ | ||||||
|  | 	protected final ConfigurationOption option; | ||||||
|  | 	/** | ||||||
|  | 	 * The Display text. | ||||||
|  | 	 */ | ||||||
|  | 	protected final Text displayText; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new P module config entry. | ||||||
|  | 	 * | ||||||
|  | 	 * @param option the option | ||||||
|  | 	 * @param text   the text | ||||||
|  | 	 */ | ||||||
|  | 	public PModuleConfigEntry(ConfigurationOption option, Text text) { | ||||||
|  | 		this.option = option; | ||||||
|  | 		this.displayText = text; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public boolean mouseClicked(double mouseX, double mouseY, int button) { | ||||||
|  | 		if (this.isMouseOver(mouseX, mouseY)) { | ||||||
|  | 			return true; | ||||||
|  | 		} | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void render(MatrixStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { | ||||||
|  | 		if (this.displayText != null) { | ||||||
|  | 			MinecraftClient.getInstance().textRenderer.drawWithShadow(matrices, displayText, x, y, 0xAAAAAA); | ||||||
|  | 		} | ||||||
|  | 		if (this.option != null) { | ||||||
|  | 			//TODO option text box (?) | ||||||
|  | 			// option should be centered or otherwise offset | ||||||
|  | 			// but not extend past the side of the pane | ||||||
|  | 			int fontHeight = MinecraftClient.getInstance().textRenderer.fontHeight; | ||||||
|  | 			MinecraftClient.getInstance().textRenderer.drawWithShadow(matrices, new LiteralText(option.getDescription() + " " + option.getStringValue()), x, y + fontHeight + 4, 0xFFFFFF); | ||||||
|  | 			String className = option.getClass().toString(); | ||||||
|  | 			if (className == BooleanOption.class.toString()) { | ||||||
|  | 				// boolean button | ||||||
|  | 			} | ||||||
|  | 			else if (className == ListOption.class.toString()) { | ||||||
|  | 				// handle list | ||||||
|  | 				// TODO: determine whether list options are viable, | ||||||
|  | 				//  considering that it would be easier to split lists into multiple PModuleConfigEntries | ||||||
|  | 			} | ||||||
|  | 			else { | ||||||
|  | 				// string button | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										115
									
								
								remappedSrc/pm/j4/petroleum/gui/PModuleConfigPane.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								remappedSrc/pm/j4/petroleum/gui/PModuleConfigPane.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,115 @@ | ||||||
|  | package pm.j4.petroleum.gui; | ||||||
|  | 
 | ||||||
|  | import com.mojang.blaze3d.platform.GlStateManager; | ||||||
|  | import com.mojang.blaze3d.systems.RenderSystem; | ||||||
|  | import net.minecraft.client.MinecraftClient; | ||||||
|  | import net.minecraft.client.font.TextRenderer; | ||||||
|  | import net.minecraft.client.gui.widget.EntryListWidget; | ||||||
|  | import net.minecraft.client.render.BufferBuilder; | ||||||
|  | import net.minecraft.client.render.Tessellator; | ||||||
|  | import net.minecraft.client.render.VertexFormats; | ||||||
|  | import net.minecraft.client.util.math.MatrixStack; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type P module config pane. | ||||||
|  |  */ | ||||||
|  | public class PModuleConfigPane extends EntryListWidget<PModuleConfigEntry> { | ||||||
|  | 	/** | ||||||
|  | 	 * The Parent. | ||||||
|  | 	 */ | ||||||
|  | 	private final POptionsScreen parent; | ||||||
|  | 	/** | ||||||
|  | 	 * The Last selected. | ||||||
|  | 	 */ | ||||||
|  | 	private POptionEntry lastSelected; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new P module config pane. | ||||||
|  | 	 * | ||||||
|  | 	 * @param client      the client | ||||||
|  | 	 * @param width       the width | ||||||
|  | 	 * @param height      the height | ||||||
|  | 	 * @param top         the top | ||||||
|  | 	 * @param bottom      the bottom | ||||||
|  | 	 * @param entryHeight the entry height | ||||||
|  | 	 * @param screen      the screen | ||||||
|  | 	 */ | ||||||
|  | 	public PModuleConfigPane(MinecraftClient client, int width, int height, int top, int bottom, int entryHeight, POptionsScreen screen) { | ||||||
|  | 		super(client, width, height, top, bottom, entryHeight); | ||||||
|  | 		this.parent = screen; | ||||||
|  | 		/** | ||||||
|  | 		 * The Text renderer. | ||||||
|  | 		 */ | ||||||
|  | 		TextRenderer textRenderer = client.textRenderer; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public PModuleConfigEntry getSelected() { | ||||||
|  | 		return null; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public int getRowWidth() { | ||||||
|  | 		return this.width - 10; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	protected int getScrollbarPositionX() { | ||||||
|  | 		return this.width - 6 + left; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { | ||||||
|  | 		POptionEntry selectedEntry = parent.getSelected(); | ||||||
|  | 		if (selectedEntry != lastSelected) { | ||||||
|  | 			lastSelected = selectedEntry; | ||||||
|  | 			clearEntries(); | ||||||
|  | 			setScrollAmount(-Double.MAX_VALUE); | ||||||
|  | 			String id = lastSelected.getModId(); | ||||||
|  | 			if (lastSelected != null && id != null && !id.isEmpty()) { | ||||||
|  | 				children().addAll(lastSelected.module.getConfigEntries()); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		Tessellator t_1 = Tessellator.getInstance(); | ||||||
|  | 		BufferBuilder buffer = t_1.getBuffer(); | ||||||
|  | 
 | ||||||
|  | 		RenderSystem.depthFunc(515); | ||||||
|  | 		RenderSystem.disableDepthTest(); | ||||||
|  | 		RenderSystem.enableBlend(); | ||||||
|  | 		RenderSystem.blendFuncSeparate(GlStateManager.SrcFactor.SRC_ALPHA, | ||||||
|  | 				GlStateManager.DstFactor.ONE_MINUS_DST_ALPHA, | ||||||
|  | 				GlStateManager.SrcFactor.ZERO, | ||||||
|  | 				GlStateManager.DstFactor.ONE); | ||||||
|  | 		RenderSystem.disableAlphaTest(); | ||||||
|  | 		RenderSystem.shadeModel(7425); | ||||||
|  | 		RenderSystem.disableTexture(); | ||||||
|  | 
 | ||||||
|  | 		buffer.begin(7, VertexFormats.POSITION_COLOR_TEXTURE); | ||||||
|  | 		buffer.vertex(this.left, (this.top + 4), 0.0D).texture(0.0F, 1.0F).color(0, 0, 0, 0).next(); | ||||||
|  | 		buffer.vertex(this.right, (this.top + 4), 0.0D).texture(1.0F, 1.0F).color(0, 0, 0, 0).next(); | ||||||
|  | 		buffer.vertex(this.right, this.top, 0.0D).texture(1.0F, 0.0F).color(0, 0, 0, 255).next(); | ||||||
|  | 		buffer.vertex(this.left, this.top, 0.0D).texture(0.0F, 0.0F).color(0, 0, 0, 255).next(); | ||||||
|  | 		buffer.vertex(this.left, this.bottom, 0.0D).texture(0.0F, 1.0F).color(0, 0, 0, 255).next(); | ||||||
|  | 		buffer.vertex(this.right, this.bottom, 0.0D).texture(1.0F, 1.0F).color(0, 0, 0, 255).next(); | ||||||
|  | 		buffer.vertex(this.right, (this.bottom - 4), 0.0D).texture(1.0F, 0.0F).color(0, 0, 0, 0).next(); | ||||||
|  | 		buffer.vertex(this.left, (this.bottom - 4), 0.0D).texture(0.0F, 0.0F).color(0, 0, 0, 0).next(); | ||||||
|  | 		t_1.draw(); | ||||||
|  | 
 | ||||||
|  | 		buffer.begin(7, VertexFormats.POSITION_COLOR); | ||||||
|  | 		buffer.vertex(this.left, this.bottom, 0.0D).color(0, 0, 0, 128).next(); | ||||||
|  | 		buffer.vertex(this.right, this.bottom, 0.0D).color(0, 0, 0, 128).next(); | ||||||
|  | 		buffer.vertex(this.right, this.top, 0.0D).color(0, 0, 0, 128).next(); | ||||||
|  | 		buffer.vertex(this.left, this.top, 0.0D).color(0, 0, 0, 128).next(); | ||||||
|  | 		t_1.draw(); | ||||||
|  | 
 | ||||||
|  | 		int rl = this.getRowLeft(); | ||||||
|  | 		int sc = this.top + 4 - (int) this.getScrollAmount(); | ||||||
|  | 		this.renderList(matrices, rl, sc, mouseX, mouseY, delta); | ||||||
|  | 
 | ||||||
|  | 		RenderSystem.enableTexture(); | ||||||
|  | 		RenderSystem.shadeModel(7424); | ||||||
|  | 		RenderSystem.enableAlphaTest(); | ||||||
|  | 		RenderSystem.disableBlend(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										281
									
								
								remappedSrc/pm/j4/petroleum/gui/PModuleConfigurationWidget.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										281
									
								
								remappedSrc/pm/j4/petroleum/gui/PModuleConfigurationWidget.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,281 @@ | ||||||
|  | package pm.j4.petroleum.gui; | ||||||
|  | 
 | ||||||
|  | import com.mojang.blaze3d.systems.RenderSystem; | ||||||
|  | import java.util.HashSet; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Objects; | ||||||
|  | import java.util.Set; | ||||||
|  | import net.minecraft.client.MinecraftClient; | ||||||
|  | import net.minecraft.client.gui.widget.AlwaysSelectedEntryListWidget; | ||||||
|  | import net.minecraft.client.render.BufferBuilder; | ||||||
|  | import net.minecraft.client.render.Tessellator; | ||||||
|  | import net.minecraft.client.render.VertexFormats; | ||||||
|  | import net.minecraft.client.util.math.MatrixStack; | ||||||
|  | import net.minecraft.util.math.MathHelper; | ||||||
|  | import net.minecraft.util.math.Matrix4f; | ||||||
|  | import pm.j4.petroleum.mixin.EntryListWidgetAccessor; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type P module configuration widget. | ||||||
|  |  */ | ||||||
|  | public class PModuleConfigurationWidget extends AlwaysSelectedEntryListWidget<POptionEntry> { | ||||||
|  | 	/** | ||||||
|  | 	 * The Parent. | ||||||
|  | 	 */ | ||||||
|  | 	private final POptionsScreen parent; | ||||||
|  | 	/** | ||||||
|  | 	 * The Module id. | ||||||
|  | 	 */ | ||||||
|  | 	private String moduleId = null; | ||||||
|  | 	/** | ||||||
|  | 	 * The Mods. | ||||||
|  | 	 */ | ||||||
|  | 	private List<ModuleBase> mods; | ||||||
|  | 	/** | ||||||
|  | 	 * The Extra mods. | ||||||
|  | 	 */ | ||||||
|  | 	private final Set<ModuleBase> extraMods = new HashSet<>(); | ||||||
|  | 	/** | ||||||
|  | 	 * The Scrolling. | ||||||
|  | 	 */ | ||||||
|  | 	private boolean scrolling = false; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new P module configuration widget. | ||||||
|  | 	 * | ||||||
|  | 	 * @param client      the client | ||||||
|  | 	 * @param width       the width | ||||||
|  | 	 * @param height      the height | ||||||
|  | 	 * @param y1          the y 1 | ||||||
|  | 	 * @param y2          the y 2 | ||||||
|  | 	 * @param entryHeight the entry height | ||||||
|  | 	 * @param list        the list | ||||||
|  | 	 * @param parent      the parent | ||||||
|  | 	 */ | ||||||
|  | 	public PModuleConfigurationWidget(MinecraftClient client, int width, int height, int y1, int y2, int entryHeight, PModuleConfigurationWidget list, POptionsScreen parent) { | ||||||
|  | 		super(client, width, height, y1, y2, entryHeight); | ||||||
|  | 		this.parent = parent; | ||||||
|  | 		if (list != null) { | ||||||
|  | 			mods = list.mods; | ||||||
|  | 		} | ||||||
|  | 		setScrollAmount(parent.getScrollPercent() * Math.max(0, this.getMaxPosition() - (this.bottom - this.top - 4))); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void setScrollAmount(double amount) { | ||||||
|  | 		super.setScrollAmount(amount); | ||||||
|  | 		int denominator = Math.max(0, this.getMaxPosition() - (this.bottom - this.top - 4)); | ||||||
|  | 		if (denominator <= 0) { | ||||||
|  | 			parent.updateScrollPercent(0); | ||||||
|  | 		} else { | ||||||
|  | 			parent.updateScrollPercent(getScrollAmount() / Math.max(0, this.getMaxPosition() - (this.bottom - this.top - 4))); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	protected boolean isFocused() { | ||||||
|  | 		return parent.getFocused() == this; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Select. | ||||||
|  | 	 * | ||||||
|  | 	 * @param entry the entry | ||||||
|  | 	 */ | ||||||
|  | 	public void select(POptionEntry entry) { | ||||||
|  | 		this.setSelected(entry); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void setSelected(POptionEntry entry) { | ||||||
|  | 		super.setSelected(entry); | ||||||
|  | 		moduleId = entry.getModId(); | ||||||
|  | 		parent.updateSelected(entry); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	protected boolean isSelectedItem(int index) { | ||||||
|  | 		return super.isSelectedItem(index); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public int addEntry(POptionEntry entry) { | ||||||
|  | 		if (extraMods.contains(entry.module)) { | ||||||
|  | 			return 0; | ||||||
|  | 		} | ||||||
|  | 		extraMods.add(entry.module); | ||||||
|  | 		int i = super.addEntry(entry); | ||||||
|  | 		if (entry.getModId().equals(moduleId)) { | ||||||
|  | 			setSelected(entry); | ||||||
|  | 		} | ||||||
|  | 		return i; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	protected boolean removeEntry(POptionEntry entry) { | ||||||
|  | 		extraMods.remove(entry.module); | ||||||
|  | 		return super.removeEntry(entry); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	protected POptionEntry remove(int index) { | ||||||
|  | 		extraMods.remove(getEntry(index).module); | ||||||
|  | 		return super.remove(index); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	protected void renderList(MatrixStack matrices, int x, int y, int mouseX, int mouseY, float delta) { | ||||||
|  | 		int itemCount = this.getItemCount(); | ||||||
|  | 		Tessellator t_1 = Tessellator.getInstance(); | ||||||
|  | 		BufferBuilder buffer = t_1.getBuffer(); | ||||||
|  | 
 | ||||||
|  | 		for (int index = 0; index < itemCount; ++index) { | ||||||
|  | 			int entryTop = this.getRowTop(index); | ||||||
|  | 			int entryBottom = this.getRowTop(index) + this.itemHeight; | ||||||
|  | 			if (entryBottom >= this.top && entryTop <= this.bottom) { | ||||||
|  | 				int entryHeight = this.itemHeight - 4; | ||||||
|  | 				POptionEntry entry = this.getEntry(index); | ||||||
|  | 				int rowWidth = this.getRowWidth(); | ||||||
|  | 				int entryLeft; | ||||||
|  | 				if (((EntryListWidgetAccessor) this).isRenderSelection() && this.isSelectedItem(index)) { | ||||||
|  | 					entryLeft = getRowLeft() - 2 + entry.getXOffset(); | ||||||
|  | 					int selectionRight = x + rowWidth + 2; | ||||||
|  | 					RenderSystem.disableTexture(); | ||||||
|  | 					float brightness = this.isFocused() ? 1.0F : 0.5F; | ||||||
|  | 					RenderSystem.color4f(brightness, brightness, brightness, 1.0F); | ||||||
|  | 					Matrix4f matrix = matrices.peek().getModel(); | ||||||
|  | 					buffer.begin(7, VertexFormats.POSITION); | ||||||
|  | 					buffer.vertex(matrix, entryLeft, entryTop + entryHeight + 2, 0.0F).next(); | ||||||
|  | 					buffer.vertex(matrix, selectionRight, entryTop + entryHeight + 2, 0.0F).next(); | ||||||
|  | 					buffer.vertex(matrix, selectionRight, entryTop - 2, 0.0F).next(); | ||||||
|  | 					buffer.vertex(matrix, entryLeft, entryTop - 2, 0.0F).next(); | ||||||
|  | 					t_1.draw(); | ||||||
|  | 					RenderSystem.color4f(0.0F, 0.0F, 0.0F, 1.0F); | ||||||
|  | 					buffer.begin(7, VertexFormats.POSITION); | ||||||
|  | 					buffer.vertex(matrix, entryLeft + 1, entryTop + entryHeight + 1, 0.0F).next(); | ||||||
|  | 					buffer.vertex(matrix, selectionRight, entryTop + entryHeight + 1, 0.0F).next(); | ||||||
|  | 					buffer.vertex(matrix, selectionRight, entryTop - 1, 0.0F).next(); | ||||||
|  | 					buffer.vertex(matrix, entryLeft + 1, entryTop - 1, 0.0F).next(); | ||||||
|  | 					t_1.draw(); | ||||||
|  | 					RenderSystem.enableTexture(); | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				entryLeft = this.getRowLeft(); | ||||||
|  | 				entry.render(matrices, | ||||||
|  | 						index, | ||||||
|  | 						entryTop, | ||||||
|  | 						entryLeft, | ||||||
|  | 						rowWidth, | ||||||
|  | 						entryHeight, | ||||||
|  | 						mouseX, | ||||||
|  | 						mouseY, | ||||||
|  | 						this.isMouseOver(mouseX, mouseY) && Objects.equals(this.getEntryAtPos(mouseX, mouseY), entry), | ||||||
|  | 						delta); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	protected void updateScrollingState(double mouseX, double mouseY, int button) { | ||||||
|  | 		super.updateScrollingState(mouseX, mouseY, button); | ||||||
|  | 		this.scrolling = button == 0 && | ||||||
|  | 				mouseX >= (double) this.getScrollbarPositionX() && | ||||||
|  | 				mouseX < (double) (this.getScrollbarPositionX() + 6); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public boolean mouseClicked(double mouseX, double mouseY, int button) { | ||||||
|  | 		this.updateScrollingState(mouseX, mouseY, button); | ||||||
|  | 		if (!this.isMouseOver(mouseX, mouseY)) { | ||||||
|  | 			return false; | ||||||
|  | 		} else { | ||||||
|  | 			POptionEntry entry = this.getEntryAtPos(mouseX, mouseY); | ||||||
|  | 			if (entry != null) { | ||||||
|  | 				if (entry.mouseClicked(mouseX, mouseY, button)) { | ||||||
|  | 					this.setFocused(entry); | ||||||
|  | 					this.setDragging(true); | ||||||
|  | 					return true; | ||||||
|  | 				} else if (button == 0) { | ||||||
|  | 					this.clickedHeader((int) (mouseX - (double) (this.left + this.width / 2 - this.getRowWidth() / 2)), | ||||||
|  | 							(int) (mouseY - (double) this.top) + (int) this.getScrollAmount() - 4); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return this.scrolling; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets entry at pos. | ||||||
|  | 	 * | ||||||
|  | 	 * @param x the x | ||||||
|  | 	 * @param y the y | ||||||
|  | 	 * @return the entry at pos | ||||||
|  | 	 */ | ||||||
|  | 	public final POptionEntry getEntryAtPos(double x, double y) { | ||||||
|  | 		int i = MathHelper.floor(y - (double) this.top) - this.headerHeight + (int) this.getScrollAmount() - 4; | ||||||
|  | 		int index = i / this.itemHeight; | ||||||
|  | 		return x < (double) this.getScrollbarPositionX() && | ||||||
|  | 				x >= (double) getRowLeft() && | ||||||
|  | 				x <= (double) (getRowLeft() + getRowWidth()) && | ||||||
|  | 				index >= 0 && i >= 0 && | ||||||
|  | 				index < this.getItemCount() ? this.children().get(index) : null; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	protected int getScrollbarPositionX() { | ||||||
|  | 		return this.width - 6; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public int getRowWidth() { | ||||||
|  | 		return this.width - (Math.max(0, this.getMaxPosition() - (this.bottom - this.top - 4)) > 0 ? 18 : 12); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public int getRowLeft() { | ||||||
|  | 		return left + 6; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets width. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the width | ||||||
|  | 	 */ | ||||||
|  | 	public int getWidth() { | ||||||
|  | 		return width; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets top. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the top | ||||||
|  | 	 */ | ||||||
|  | 	public int getTop() { | ||||||
|  | 		return this.top; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets parent. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the parent | ||||||
|  | 	 */ | ||||||
|  | 	public POptionsScreen getParent() { | ||||||
|  | 		return parent; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	protected int getMaxPosition() { | ||||||
|  | 		return super.getMaxPosition() + 4; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets displayed count. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the displayed count | ||||||
|  | 	 */ | ||||||
|  | 	public int getDisplayedCount() { | ||||||
|  | 		return children().size(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										389
									
								
								remappedSrc/pm/j4/petroleum/gui/PMovableButton.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										389
									
								
								remappedSrc/pm/j4/petroleum/gui/PMovableButton.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,389 @@ | ||||||
|  | package pm.j4.petroleum.gui; | ||||||
|  | 
 | ||||||
|  | import com.mojang.blaze3d.systems.RenderSystem; | ||||||
|  | import java.util.List; | ||||||
|  | import net.minecraft.client.MinecraftClient; | ||||||
|  | import net.minecraft.client.font.TextRenderer; | ||||||
|  | import net.minecraft.client.gui.widget.AbstractButtonWidget; | ||||||
|  | import net.minecraft.client.render.BufferBuilder; | ||||||
|  | import net.minecraft.client.render.Tessellator; | ||||||
|  | import net.minecraft.client.render.VertexFormats; | ||||||
|  | import net.minecraft.client.util.math.MatrixStack; | ||||||
|  | import net.minecraft.text.LiteralText; | ||||||
|  | import net.minecraft.text.TranslatableText; | ||||||
|  | import net.minecraft.util.math.MathHelper; | ||||||
|  | import net.minecraft.util.math.Matrix4f; | ||||||
|  | import pm.j4.petroleum.modules.menu.ModMenu; | ||||||
|  | import pm.j4.petroleum.util.data.ButtonInformation; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type P movable button. | ||||||
|  |  */ | ||||||
|  | public class PMovableButton extends AbstractButtonWidget { | ||||||
|  | 	/** | ||||||
|  | 	 * The Expanded. | ||||||
|  | 	 */ | ||||||
|  | 	private boolean expanded; | ||||||
|  | 	/** | ||||||
|  | 	 * The Collapsed width. | ||||||
|  | 	 */ | ||||||
|  | 	private final int collapsedWidth; | ||||||
|  | 	/** | ||||||
|  | 	 * The Expanded width. | ||||||
|  | 	 */ | ||||||
|  | 	private int expandedWidth; | ||||||
|  | 	/** | ||||||
|  | 	 * The Collapsed height. | ||||||
|  | 	 */ | ||||||
|  | 	private final int collapsedHeight; | ||||||
|  | 	/** | ||||||
|  | 	 * The Expanded height. | ||||||
|  | 	 */ | ||||||
|  | 	private int expandedHeight; | ||||||
|  | 	/** | ||||||
|  | 	 * The Module height. | ||||||
|  | 	 */ | ||||||
|  | 	private final int moduleHeight; | ||||||
|  | 	/** | ||||||
|  | 	 * The Modules. | ||||||
|  | 	 */ | ||||||
|  | 	private final List<ModuleBase> modules; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Stored x. | ||||||
|  | 	 */ | ||||||
|  | 	private int storedX; | ||||||
|  | 	/** | ||||||
|  | 	 * The Stored y. | ||||||
|  | 	 */ | ||||||
|  | 	private int storedY; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Spin. | ||||||
|  | 	 */ | ||||||
|  | 	private double spin; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Arrow size. | ||||||
|  | 	 */ | ||||||
|  | 	private final int arrowSize = 10; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Category. | ||||||
|  | 	 */ | ||||||
|  | 	private final String category; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Parent. | ||||||
|  | 	 */ | ||||||
|  | 	private final PModMenuScreen parent; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new P movable button. | ||||||
|  | 	 * | ||||||
|  | 	 * @param x            the x | ||||||
|  | 	 * @param y            the y | ||||||
|  | 	 * @param categoryName the category name | ||||||
|  | 	 * @param modules      the modules | ||||||
|  | 	 * @param open         the open | ||||||
|  | 	 * @param parent       the parent | ||||||
|  | 	 */ | ||||||
|  | 	public PMovableButton(int x, int y, String categoryName, List<ModuleBase> modules, boolean open, PModMenuScreen parent) { | ||||||
|  | 		super(x, y, 0, 0, new TranslatableText(categoryName)); | ||||||
|  | 		this.category = categoryName; | ||||||
|  | 		int w = MinecraftClient.getInstance().textRenderer.getWidth(new TranslatableText(categoryName)) + 8; | ||||||
|  | 		int h = MinecraftClient.getInstance().textRenderer.fontHeight + 8; | ||||||
|  | 		this.width = w; | ||||||
|  | 		this.collapsedWidth = w; | ||||||
|  | 		this.expandedWidth = 0; | ||||||
|  | 		this.height = h; | ||||||
|  | 		this.collapsedHeight = h; | ||||||
|  | 		this.expandedHeight = 0; | ||||||
|  | 		this.moduleHeight = h; | ||||||
|  | 		this.expanded = open; | ||||||
|  | 		this.modules = modules; | ||||||
|  | 		this.parent = parent; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void onClick(double mouseX, double mouseY) { | ||||||
|  | 		this.storedX = (int) mouseX; | ||||||
|  | 		this.storedY = (int) mouseY; | ||||||
|  | 		super.onClick(mouseX, mouseY); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * On extra click. | ||||||
|  | 	 * | ||||||
|  | 	 * @param mouseX the mouse x | ||||||
|  | 	 * @param mouseY the mouse y | ||||||
|  | 	 */ | ||||||
|  | 	private void onExtraClick(double mouseX, double mouseY) { | ||||||
|  | 		System.out.println("extra click"); | ||||||
|  | 		int increment = this.moduleHeight + 4; | ||||||
|  | 		int location = (int)mouseY - (this.y + this.collapsedHeight); | ||||||
|  | 		int index = location / increment; | ||||||
|  | 		System.out.println("index: " + index); | ||||||
|  | 		if(modules.size() >= index) { | ||||||
|  | 			ModuleBase affectedModule = modules.get(index); | ||||||
|  | 			System.out.println("module: " + affectedModule); | ||||||
|  | 			if(affectedModule.isActivatable()) { | ||||||
|  | 				System.out.println("toggling"); | ||||||
|  | 				affectedModule.toggle(); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		else { | ||||||
|  | 			System.out.println("index too great"); | ||||||
|  | 		} | ||||||
|  | 		//TODO module things | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void onRelease(double mouseX, double mouseY) { | ||||||
|  | 		int mx = (int) mouseX; | ||||||
|  | 		int my = (int) mouseY; | ||||||
|  | 		/** | ||||||
|  | 		 * The Padding. | ||||||
|  | 		 */ | ||||||
|  | 		int padding = 5; | ||||||
|  | 		if (storedX + padding > mx && storedX - padding < mx && | ||||||
|  | 				storedY + padding > my && storedY - padding < my) { | ||||||
|  | 			this.expanded = !this.expanded; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	protected void onDrag(double mouseX, double mouseY, double deltaX, double deltaY) { | ||||||
|  | 		this.x += (int) deltaX; | ||||||
|  | 		this.y += (int) deltaY; | ||||||
|  | 
 | ||||||
|  | 		// i really hate to do it but nowhere else will it properly save | ||||||
|  | 		this.updateCoordinate(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Update coordinate. | ||||||
|  | 	 */ | ||||||
|  | 	public void updateCoordinate() { | ||||||
|  | 		ModMenu.updateCoord(this.category, new ButtonInformation((this.x / (double) parent.width), (this.y / (double) parent.height), this.expanded)); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// fuck click sounds | ||||||
|  | 	@Override | ||||||
|  | 	public boolean mouseClicked(double mouseX, double mouseY, int button) { | ||||||
|  | 		if (this.active && this.visible) { | ||||||
|  | 			if (this.isValidClickButton(button)) { | ||||||
|  | 				boolean bl = this.clicked(mouseX, mouseY); | ||||||
|  | 				if (bl && mouseY > this.y + this.collapsedHeight && mouseY < this.y + this.expandedHeight) { | ||||||
|  | 					this.onExtraClick(mouseX, mouseY); | ||||||
|  | 					return true; | ||||||
|  | 				} else if (bl) { | ||||||
|  | 					this.onClick(mouseX, mouseY); | ||||||
|  | 					return true; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 		} | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Transition max width. | ||||||
|  | 	 * | ||||||
|  | 	 * @param width the width | ||||||
|  | 	 */ | ||||||
|  | 	private void transitionMaxWidth(int width) { | ||||||
|  | 		double increment = ((width - this.width) / 20.0); | ||||||
|  | 		int sign = (width > this.width) ? 1 : -1; | ||||||
|  | 		if (increment == 0) { | ||||||
|  | 			this.width = width; | ||||||
|  | 		} else if (increment < 1 && increment > -1) { | ||||||
|  | 			this.width += sign; | ||||||
|  | 		} else { | ||||||
|  | 			this.width += (int) increment; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Transition max height. | ||||||
|  | 	 * | ||||||
|  | 	 * @param height the height | ||||||
|  | 	 */ | ||||||
|  | 	private void transitionMaxHeight(int height) { | ||||||
|  | 		double increment = ((height - this.height) / 20.0); | ||||||
|  | 		int sign = (height > this.height) ? 1 : -1; | ||||||
|  | 		if (increment == 0) { | ||||||
|  | 			this.height = height; | ||||||
|  | 		} else if (increment < 1 && increment > -1) { | ||||||
|  | 			this.height += sign; | ||||||
|  | 		} else { | ||||||
|  | 			this.height += (int) increment; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void renderButton(MatrixStack matrices, int mouseX, int mouseY, float delta) { | ||||||
|  | 
 | ||||||
|  | 		if (this.expandedWidth == 0 || this.expandedHeight == 0) { | ||||||
|  | 			this.expandedHeight = this.collapsedHeight + ((this.moduleHeight + 4) * modules.size()); | ||||||
|  | 			modules.forEach(module -> { | ||||||
|  | 				this.expandedWidth = this.width; | ||||||
|  | 				int w = MinecraftClient.getInstance().textRenderer.getWidth(module.getReadableName()) + arrowSize + 8; | ||||||
|  | 				if (w > this.expandedWidth) { | ||||||
|  | 					this.expandedWidth = w; | ||||||
|  | 				} | ||||||
|  | 			}); | ||||||
|  | 			// this should only run when opening the screen for the first time | ||||||
|  | 			if (this.expanded) { | ||||||
|  | 				this.height = expandedHeight; | ||||||
|  | 				this.width = expandedWidth; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		MinecraftClient minecraftClient = MinecraftClient.getInstance(); | ||||||
|  | 		TextRenderer textRenderer = minecraftClient.textRenderer; | ||||||
|  | 		minecraftClient.getTextureManager().bindTexture(WIDGETS_LOCATION); | ||||||
|  | 		RenderSystem.color4f(1.0F, 1.0F, 1.0F, this.alpha); | ||||||
|  | 
 | ||||||
|  | 		RenderSystem.disableTexture(); | ||||||
|  | 		RenderSystem.defaultBlendFunc(); | ||||||
|  | 		float brightness = this.isFocused() ? 1.0F : 0.5F; | ||||||
|  | 		RenderSystem.color4f(brightness, brightness, brightness, 1.0F); | ||||||
|  | 		Matrix4f matrix = matrices.peek().getModel(); | ||||||
|  | 
 | ||||||
|  | 		int buttonLeft = this.x; | ||||||
|  | 		int buttonRight = this.x + width + 2; | ||||||
|  | 		int buttonTop = this.y; | ||||||
|  | 		int buttonBottom = this.y + this.collapsedHeight; | ||||||
|  | 		int buttonExpandedBottom = this.y + this.height; | ||||||
|  | 		Tessellator t_1 = Tessellator.getInstance(); | ||||||
|  | 		BufferBuilder buffer = t_1.getBuffer(); | ||||||
|  | 
 | ||||||
|  | 		RenderSystem.color4f(0.5F, 0.5F, 0.5F, 0.5F); | ||||||
|  | 		drawBox(t_1, buffer, matrix, buttonLeft, buttonRight, buttonTop - 2, buttonBottom + 2); | ||||||
|  | 
 | ||||||
|  | 		RenderSystem.color4f(0.0F, 0.0F, 0.0F, 0.3F); | ||||||
|  | 		drawBox(t_1, buffer, matrix, buttonLeft + 1, buttonRight - 1, buttonTop - 1, buttonBottom + 1); | ||||||
|  | 
 | ||||||
|  | 		RenderSystem.color4f(1.0F, 1.0F, 1.0F, 0.9F); | ||||||
|  | 		drawEquilateralTriangle(t_1, buffer, matrix, 40, 40, 180, arrowSize); | ||||||
|  | 		drawEquilateralTriangle(t_1, buffer, matrix, 60, 60, 0, arrowSize); | ||||||
|  | 		drawEquilateralTriangle(t_1, buffer, matrix, 40, 60, 90, arrowSize); | ||||||
|  | 		drawEquilateralTriangle(t_1, buffer, matrix, 60, 40, 360, arrowSize); | ||||||
|  | 		drawEquilateralTriangle(t_1, buffer, matrix, 80, 40, 270, arrowSize); | ||||||
|  | 		drawEquilateralTriangle(t_1, buffer, matrix, 80, 60, 120, arrowSize); | ||||||
|  | 
 | ||||||
|  | 		int j = this.active ? 16777215 : 10526880; | ||||||
|  | 		if (this.expanded) { | ||||||
|  | 			if (this.width != this.expandedWidth || this.height != this.expandedHeight) { | ||||||
|  | 				transitionMaxWidth(this.expandedWidth); | ||||||
|  | 				transitionMaxHeight(this.expandedHeight); | ||||||
|  | 				RenderSystem.color4f(0.5F, 0.5F, 0.5F, 0.5F); | ||||||
|  | 				drawBox(t_1, buffer, matrix, buttonLeft, buttonRight, buttonBottom + 1, buttonExpandedBottom + 2); | ||||||
|  | 
 | ||||||
|  | 				RenderSystem.color4f(0.0F, 0.0F, 0.0F, 0.3F); | ||||||
|  | 				drawBox(t_1, buffer, matrix, buttonLeft + 1, buttonRight - 1, buttonBottom + 2, buttonExpandedBottom + 1); | ||||||
|  | 				if ((this.height - 8) / 2 > (this.collapsedHeight)) { | ||||||
|  | 					drawCenteredText(matrices, textRenderer, new LiteralText("..."), this.x + this.width / 2, this.y + (this.height - 8) / 2, j | MathHelper.ceil(this.alpha * 255.0F) << 24); | ||||||
|  | 				} | ||||||
|  | 			} else { | ||||||
|  | 				for (int i = 0; i < modules.size(); i++) { | ||||||
|  | 					int adjustedIndex = i + 1; | ||||||
|  | 					int previousBottom = buttonBottom + (i * (this.moduleHeight + 4)); | ||||||
|  | 					int currentBottom = buttonBottom + ((i + 1) * (this.moduleHeight + 4)); | ||||||
|  | 
 | ||||||
|  | 					RenderSystem.defaultBlendFunc(); | ||||||
|  | 					RenderSystem.color4f(0.5F, 0.5F, 0.5F, 0.5F); | ||||||
|  | 					drawBox(t_1, buffer, matrix, buttonLeft, buttonRight, previousBottom + 1, currentBottom + 2); | ||||||
|  | 
 | ||||||
|  | 					RenderSystem.color4f(0.0F, 0.0F, 0.0F, 0.3F); | ||||||
|  | 					drawBox(t_1, buffer, matrix, buttonLeft + 1, buttonRight - 1, previousBottom + 2, currentBottom + 1); | ||||||
|  | 
 | ||||||
|  | 					drawCenteredText(matrices, | ||||||
|  | 							textRenderer, | ||||||
|  | 							modules.get(i).getReadableName(), | ||||||
|  | 							this.x + this.width / 2, | ||||||
|  | 							this.y + ((this.collapsedHeight - 8) / 2 + ((moduleHeight + 4) * adjustedIndex)), | ||||||
|  | 							j | MathHelper.ceil(this.alpha * 255.0F) << 24); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} else { | ||||||
|  | 			if (this.width != this.collapsedWidth || this.height != this.collapsedHeight) { | ||||||
|  | 				transitionMaxWidth(this.collapsedWidth); | ||||||
|  | 				transitionMaxHeight(this.collapsedHeight); | ||||||
|  | 				RenderSystem.color4f(0.5F, 0.5F, 0.5F, 0.5F); | ||||||
|  | 				drawBox(t_1, buffer, matrix, buttonLeft, buttonRight, buttonBottom + 1, buttonExpandedBottom + 2); | ||||||
|  | 
 | ||||||
|  | 				RenderSystem.color4f(0.0F, 0.0F, 0.0F, 0.3F); | ||||||
|  | 				drawBox(t_1, buffer, matrix, buttonLeft + 1, buttonRight - 1, buttonBottom + 2, buttonExpandedBottom + 1); | ||||||
|  | 				if ((this.height - 8) / 2 > (this.collapsedHeight)) { | ||||||
|  | 					drawCenteredText(matrices, textRenderer, new LiteralText("..."), this.x + this.width / 2, this.y + (this.height - 8) / 2, j | MathHelper.ceil(this.alpha * 255.0F) << 24); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		RenderSystem.enableTexture(); | ||||||
|  | 		drawCenteredText(matrices, textRenderer, this.getMessage(), this.x + this.width / 2, this.y + (this.collapsedHeight - 8) / 2, j | MathHelper.ceil(this.alpha * 255.0F) << 24); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Draw equilateral triangle. | ||||||
|  | 	 * | ||||||
|  | 	 * @param t_1      the t 1 | ||||||
|  | 	 * @param buffer   the buffer | ||||||
|  | 	 * @param matrix   the matrix | ||||||
|  | 	 * @param centerX  the center x | ||||||
|  | 	 * @param centerY  the center y | ||||||
|  | 	 * @param rotation the rotation | ||||||
|  | 	 * @param distance the distance | ||||||
|  | 	 */ | ||||||
|  | 	private void drawEquilateralTriangle(Tessellator t_1, BufferBuilder buffer, Matrix4f matrix, int centerX, int centerY, double rotation, int distance) { | ||||||
|  | 		double rotation1 = rotation; | ||||||
|  | 		double rotation2 = rotation + 120; | ||||||
|  | 		double rotation3 = rotation + 240; | ||||||
|  | 		int point1X = (int)(distance * Math.cos(Math.toRadians(rotation1))) + centerX; | ||||||
|  | 		int point1Y = (int)(distance * Math.sin(Math.toRadians(rotation1))) + centerY; | ||||||
|  | 		int point2X = (int)(distance * Math.cos(Math.toRadians(rotation2))) + centerX; | ||||||
|  | 		int point2Y = (int)(distance * Math.sin(Math.toRadians(rotation2))) + centerY; | ||||||
|  | 		int point3X = (int)(distance * Math.cos(Math.toRadians(rotation3))) + centerX; | ||||||
|  | 		int point3Y = (int)(distance * Math.sin(Math.toRadians(rotation3))) + centerY; | ||||||
|  | 
 | ||||||
|  | 		//RenderSystem.enableBlend(); | ||||||
|  | 		RenderSystem.disableBlend(); | ||||||
|  | 		buffer.begin(7, VertexFormats.POSITION_COLOR); | ||||||
|  | 		buffer.vertex(matrix, centerX, centerY, 0.0F).color(0.0F, 1.0F, 1.0F, 1.0F).next(); | ||||||
|  | 		buffer.vertex(matrix, centerX, point1Y, 0.0F).color(0.0F, 1.0F, 1.0F, 1.0F).next(); | ||||||
|  | 		buffer.vertex(matrix, point1X, point1Y, 0.0F).color(0.0F, 1.0F, 1.0F, 1.0F).next(); | ||||||
|  | 
 | ||||||
|  | 		buffer.vertex(matrix, centerX, centerY, 0.0F).color(0.5F, 1.0F, 1.0F, 1.0F).next(); | ||||||
|  | 		buffer.vertex(matrix, centerX, point2Y, 0.0F).color(0.5F, 1.0F, 1.0F, 1.0F).next(); | ||||||
|  | 		buffer.vertex(matrix, point2X, point2Y, 0.0F).color(0.5F, 1.0F, 1.0F, 1.0F).next(); | ||||||
|  | 
 | ||||||
|  | 		buffer.vertex(matrix, centerX, centerY, 0.0F).color(1.0F, 0.0F, 1.0F, 1.0F).next(); | ||||||
|  | 		buffer.vertex(matrix, centerX, point3Y, 0.0F).color(1.0F, 0.0F, 1.0F, 1.0F).next(); | ||||||
|  | 		buffer.vertex(matrix, point3X, point3Y, 0.0F).color(1.0F, 0.0F, 1.0F, 1.0F).next(); | ||||||
|  | 		t_1.draw(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Draw box. | ||||||
|  | 	 * | ||||||
|  | 	 * @param t_1          the t 1 | ||||||
|  | 	 * @param buffer       the buffer | ||||||
|  | 	 * @param matrix       the matrix | ||||||
|  | 	 * @param buttonLeft   the button left | ||||||
|  | 	 * @param buttonRight  the button right | ||||||
|  | 	 * @param buttonTop    the button top | ||||||
|  | 	 * @param buttonBottom the button bottom | ||||||
|  | 	 */ | ||||||
|  | 	private void drawBox(Tessellator t_1, BufferBuilder buffer, Matrix4f matrix, int buttonLeft, int buttonRight, int buttonTop, int buttonBottom) { | ||||||
|  | 		RenderSystem.enableBlend(); | ||||||
|  | 		buffer.begin(7, VertexFormats.POSITION); | ||||||
|  | 		buffer.vertex(matrix, buttonLeft, buttonBottom, 0.0F).next(); | ||||||
|  | 		buffer.vertex(matrix, buttonRight, buttonBottom, 0.0F).next(); | ||||||
|  | 		buffer.vertex(matrix, buttonRight, buttonTop, 0.0F).next(); | ||||||
|  | 		buffer.vertex(matrix, buttonLeft, buttonTop, 0.0F).next(); | ||||||
|  | 		t_1.draw(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										94
									
								
								remappedSrc/pm/j4/petroleum/gui/POptionEntry.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								remappedSrc/pm/j4/petroleum/gui/POptionEntry.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,94 @@ | ||||||
|  | package pm.j4.petroleum.gui; | ||||||
|  | 
 | ||||||
|  | import com.mojang.blaze3d.systems.RenderSystem; | ||||||
|  | import net.minecraft.client.MinecraftClient; | ||||||
|  | import net.minecraft.client.font.TextRenderer; | ||||||
|  | import net.minecraft.client.gui.widget.AlwaysSelectedEntryListWidget; | ||||||
|  | import net.minecraft.client.util.math.MatrixStack; | ||||||
|  | import net.minecraft.text.StringVisitable; | ||||||
|  | import net.minecraft.text.Text; | ||||||
|  | import net.minecraft.text.TranslatableText; | ||||||
|  | import net.minecraft.util.Language; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type P option entry. | ||||||
|  |  */ | ||||||
|  | public class POptionEntry extends AlwaysSelectedEntryListWidget.Entry<POptionEntry> { | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Module. | ||||||
|  | 	 */ | ||||||
|  | 	protected final ModuleBase module; | ||||||
|  | 	/** | ||||||
|  | 	 * The Client. | ||||||
|  | 	 */ | ||||||
|  | 	protected final MinecraftClient client; | ||||||
|  | 	/** | ||||||
|  | 	 * The List. | ||||||
|  | 	 */ | ||||||
|  | 	private final PModuleConfigurationWidget list; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new P option entry. | ||||||
|  | 	 * | ||||||
|  | 	 * @param mod  the mod | ||||||
|  | 	 * @param list the list | ||||||
|  | 	 */ | ||||||
|  | 	public POptionEntry(ModuleBase mod, PModuleConfigurationWidget list) { | ||||||
|  | 		this.module = mod; | ||||||
|  | 		this.client = MinecraftClient.getInstance(); | ||||||
|  | 		this.list = list; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	//TODO TEST move text to be centered | ||||||
|  | 	@Override | ||||||
|  | 	public void render(MatrixStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { | ||||||
|  | 		x += getXOffset(); | ||||||
|  | 		entryWidth -= getXOffset(); | ||||||
|  | 		RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); | ||||||
|  | 		Text name = this.getModName(); | ||||||
|  | 		StringVisitable nameString = name; | ||||||
|  | 		int maxNameWidth = entryWidth - 32 - 3; | ||||||
|  | 		TextRenderer font = this.client.textRenderer; | ||||||
|  | 		if (font.getWidth(name) > maxNameWidth) { | ||||||
|  | 			StringVisitable ellipse = StringVisitable.plain("..."); | ||||||
|  | 			nameString = StringVisitable.concat(font.trimToWidth(nameString, maxNameWidth - font.getWidth(ellipse)), ellipse); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		font.draw(matrices, Language.getInstance().reorder(nameString), x + 32 + 3, y + (entryHeight / 2), 0xFFFFFF); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public boolean mouseClicked(double x, double y, int b) { | ||||||
|  | 		this.list.select(this); | ||||||
|  | 		return true; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets mod id. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the mod id | ||||||
|  | 	 */ | ||||||
|  | 	public String getModId() { | ||||||
|  | 		return module.getModuleName(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets mod name. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the mod name | ||||||
|  | 	 */ | ||||||
|  | 	public TranslatableText getModName() { | ||||||
|  | 		return module.getReadableName(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets x offset. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the x offset | ||||||
|  | 	 */ | ||||||
|  | 	public int getXOffset() { | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										224
									
								
								remappedSrc/pm/j4/petroleum/gui/POptionsScreen.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										224
									
								
								remappedSrc/pm/j4/petroleum/gui/POptionsScreen.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,224 @@ | ||||||
|  | package pm.j4.petroleum.gui; | ||||||
|  | 
 | ||||||
|  | import com.mojang.blaze3d.systems.RenderSystem; | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Objects; | ||||||
|  | import java.util.stream.Collectors; | ||||||
|  | import net.minecraft.client.MinecraftClient; | ||||||
|  | import net.minecraft.client.gui.DrawableHelper; | ||||||
|  | import net.minecraft.client.gui.screen.Screen; | ||||||
|  | import net.minecraft.client.gui.screen.ScreenTexts; | ||||||
|  | import net.minecraft.client.gui.widget.ButtonWidget; | ||||||
|  | import net.minecraft.client.render.BufferBuilder; | ||||||
|  | import net.minecraft.client.render.Tessellator; | ||||||
|  | import net.minecraft.client.render.VertexFormats; | ||||||
|  | import net.minecraft.client.util.math.MatrixStack; | ||||||
|  | import net.minecraft.text.LiteralText; | ||||||
|  | import net.minecraft.text.StringVisitable; | ||||||
|  | import net.minecraft.text.Text; | ||||||
|  | import net.minecraft.text.TranslatableText; | ||||||
|  | import pm.j4.petroleum.PetroleumMod; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigManager; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type P options screen. | ||||||
|  |  */ | ||||||
|  | @SuppressWarnings("deprecation") | ||||||
|  | public class POptionsScreen extends Screen { | ||||||
|  | 	/** | ||||||
|  | 	 * The Previous screen. | ||||||
|  | 	 */ | ||||||
|  | 	private final Screen previousScreen; | ||||||
|  | 	/** | ||||||
|  | 	 * The Scroll percent. | ||||||
|  | 	 */ | ||||||
|  | 	private double scrollPercent = 0; | ||||||
|  | 	/** | ||||||
|  | 	 * The Modules. | ||||||
|  | 	 */ | ||||||
|  | 	private PModuleConfigurationWidget modules; | ||||||
|  | 	/** | ||||||
|  | 	 * The Config pane. | ||||||
|  | 	 */ | ||||||
|  | 	private PModuleConfigPane configPane; | ||||||
|  | 	/** | ||||||
|  | 	 * The Selected. | ||||||
|  | 	 */ | ||||||
|  | 	private POptionEntry selected; | ||||||
|  | 	/** | ||||||
|  | 	 * The Tooltip. | ||||||
|  | 	 */ | ||||||
|  | 	private Text tooltip; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Pane y. | ||||||
|  | 	 */ | ||||||
|  | 	private int paneY; | ||||||
|  | 	/** | ||||||
|  | 	 * The Right pane x. | ||||||
|  | 	 */ | ||||||
|  | 	private int rightPaneX; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new P options screen. | ||||||
|  | 	 * | ||||||
|  | 	 * @param previousScreen the previous screen | ||||||
|  | 	 */ | ||||||
|  | 	public POptionsScreen(Screen previousScreen) { | ||||||
|  | 		super(new TranslatableText("petroleum.options")); | ||||||
|  | 		this.previousScreen = previousScreen; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void onClose() { | ||||||
|  | 		super.onClose(); | ||||||
|  | 		assert this.client != null; | ||||||
|  | 		this.client.openScreen(previousScreen); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	protected void init() { | ||||||
|  | 		paneY = 48; | ||||||
|  | 		int paneWidth = this.width / 2 - 8; | ||||||
|  | 		rightPaneX = width - paneWidth; | ||||||
|  | 		this.modules = new PModuleConfigurationWidget(this.client, | ||||||
|  | 				this.width - paneWidth, | ||||||
|  | 				this.height, | ||||||
|  | 				paneY + 19, | ||||||
|  | 				this.height - 36, | ||||||
|  | 				36, | ||||||
|  | 				this.modules, | ||||||
|  | 				this); | ||||||
|  | 		this.modules.setLeftPos(0); | ||||||
|  | 		this.children.add(this.modules); | ||||||
|  | 		this.configPane = new PModuleConfigPane(this.client, | ||||||
|  | 				paneWidth, | ||||||
|  | 				this.height, | ||||||
|  | 				paneY + 19, | ||||||
|  | 				this.height - 36, | ||||||
|  | 				48, | ||||||
|  | 				this); | ||||||
|  | 		this.configPane.setLeftPos(paneWidth); | ||||||
|  | 		this.children.add(this.configPane); | ||||||
|  | 		List<ModuleBase> configurableModules = new ArrayList<>(); | ||||||
|  | 		if (ConfigManager.getConfig().isPresent()) { | ||||||
|  | 			configurableModules.addAll(PetroleumMod.getActiveMods() | ||||||
|  | 					.stream().filter(ModuleBase::configurable) | ||||||
|  | 					.collect(Collectors.toList())); | ||||||
|  | 		} | ||||||
|  | 		configurableModules.forEach(module -> this.modules.addEntry(new POptionEntry(module, this.modules))); | ||||||
|  | 		this.addButton(new ButtonWidget(this.width / 2 - 75, this.height - 30, 150, 20, ScreenTexts.DONE, (buttonWidget) -> { | ||||||
|  | 			ConfigManager.saveAllModules(); | ||||||
|  | 			assert this.client != null; | ||||||
|  | 			this.client.openScreen(this.previousScreen); | ||||||
|  | 		})); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { | ||||||
|  | 		this.renderBackground(matrices); | ||||||
|  | 
 | ||||||
|  | 		this.modules.render(matrices, mouseX, mouseY, delta); | ||||||
|  | 		if (selected != null) { | ||||||
|  | 			this.configPane.render(matrices, mouseX, mouseY, delta); | ||||||
|  | 		} | ||||||
|  | 		RenderSystem.disableBlend(); | ||||||
|  | 		drawTextWithShadow(matrices, this.textRenderer, this.title, this.modules.getWidth() / 2, 8, 16777215); | ||||||
|  | 		super.render(matrices, mouseX, mouseY, delta); | ||||||
|  | 
 | ||||||
|  | 		if (selected != null) { | ||||||
|  | 			int offset = 36; | ||||||
|  | 			int x = rightPaneX; | ||||||
|  | 			int maxNameWidth = this.width - (x + offset); | ||||||
|  | 			int lineSpacing = textRenderer.fontHeight + 1; | ||||||
|  | 			Text name = selected.getModName(); | ||||||
|  | 
 | ||||||
|  | 			StringVisitable trimmedName = name; | ||||||
|  | 
 | ||||||
|  | 			if (textRenderer.getWidth(name) > maxNameWidth) { | ||||||
|  | 				StringVisitable ellipsis = StringVisitable.plain("..."); | ||||||
|  | 				trimmedName = StringVisitable.concat(textRenderer.trimToWidth(name, maxNameWidth - textRenderer.getWidth(ellipsis)), ellipsis); | ||||||
|  | 			} | ||||||
|  | 			if (mouseX > x + offset && mouseY > paneY + 1 && mouseY < paneY + 1 + textRenderer.fontHeight && mouseX < x + offset + textRenderer.getWidth(trimmedName)) { | ||||||
|  | 				setTooltip(new LiteralText("Configure " + selected.getModName())); | ||||||
|  | 			} | ||||||
|  | 			textRenderer.draw(matrices, selected.getModName(), x + offset, paneY + 2 + lineSpacing, 0x808080); | ||||||
|  | 
 | ||||||
|  | 			if (this.tooltip != null) { | ||||||
|  | 				this.renderOrderedTooltip(matrices, textRenderer.wrapLines(this.tooltip, Integer.MAX_VALUE), mouseX, mouseY); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Sets tooltip. | ||||||
|  | 	 * | ||||||
|  | 	 * @param tooltip the tooltip | ||||||
|  | 	 */ | ||||||
|  | 	private void setTooltip(Text tooltip) { | ||||||
|  | 		this.tooltip = tooltip; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void renderBackground(MatrixStack matrices) { | ||||||
|  | 		POptionsScreen.overlayBackground(this.width, this.height); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Overlay background. | ||||||
|  | 	 * | ||||||
|  | 	 * @param x2 the x 2 | ||||||
|  | 	 * @param y2 the y 2 | ||||||
|  | 	 */ | ||||||
|  | 	static void overlayBackground(int x2, int y2) { | ||||||
|  | 		Tessellator t_1 = Tessellator.getInstance(); | ||||||
|  | 		BufferBuilder buffer = t_1.getBuffer(); | ||||||
|  | 		Objects.requireNonNull(MinecraftClient.getInstance()).getTextureManager().bindTexture(DrawableHelper.OPTIONS_BACKGROUND_TEXTURE); | ||||||
|  | 		RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); | ||||||
|  | 		buffer.begin(7, VertexFormats.POSITION_TEXTURE_COLOR); | ||||||
|  | 		buffer.vertex(0, y2, 0.0D).texture(0 / 32.0F, y2 / 32.0F).color(64, 64, 64, 255).next(); | ||||||
|  | 		buffer.vertex(x2, y2, 0.0D).texture(x2 / 32.0F, y2 / 32.0F).color(64, 64, 64, 255).next(); | ||||||
|  | 		buffer.vertex(x2, 0, 0.0D).texture(x2 / 32.0F, 0 / 32.0F).color(64, 64, 64, 255).next(); | ||||||
|  | 		buffer.vertex(0, 0, 0.0D).texture(0 / 32.0F, 0 / 32.0F).color(64, 64, 64, 255).next(); | ||||||
|  | 		t_1.draw(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets scroll percent. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the scroll percent | ||||||
|  | 	 */ | ||||||
|  | 	double getScrollPercent() { | ||||||
|  | 		return scrollPercent; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Update scroll percent. | ||||||
|  | 	 * | ||||||
|  | 	 * @param scrollPercent the scroll percent | ||||||
|  | 	 */ | ||||||
|  | 	void updateScrollPercent(double scrollPercent) { | ||||||
|  | 		this.scrollPercent = scrollPercent; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets selected. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the selected | ||||||
|  | 	 */ | ||||||
|  | 	POptionEntry getSelected() { | ||||||
|  | 		return selected; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Update selected. | ||||||
|  | 	 * | ||||||
|  | 	 * @param entry the entry | ||||||
|  | 	 */ | ||||||
|  | 	void updateSelected(POptionEntry entry) { | ||||||
|  | 		if (entry != null) { | ||||||
|  | 			this.selected = entry; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										38
									
								
								remappedSrc/pm/j4/petroleum/mixin/DebugHudMixin.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								remappedSrc/pm/j4/petroleum/mixin/DebugHudMixin.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,38 @@ | ||||||
|  | package pm.j4.petroleum.mixin; | ||||||
|  | 
 | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Optional; | ||||||
|  | import net.minecraft.client.gui.hud.DebugHud; | ||||||
|  | import net.minecraft.client.util.math.MatrixStack; | ||||||
|  | import org.spongepowered.asm.mixin.Mixin; | ||||||
|  | import org.spongepowered.asm.mixin.injection.At; | ||||||
|  | import org.spongepowered.asm.mixin.injection.Inject; | ||||||
|  | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; | ||||||
|  | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; | ||||||
|  | import pm.j4.petroleum.modules.splash.SplashText; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigHolder; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigManager; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Debug hud mixin. | ||||||
|  |  */ | ||||||
|  | @Mixin(DebugHud.class) | ||||||
|  | public class DebugHudMixin { | ||||||
|  | 	/** | ||||||
|  | 	 * Render text right. | ||||||
|  | 	 * | ||||||
|  | 	 * @param matrices the matrices | ||||||
|  | 	 * @param ci       the ci | ||||||
|  | 	 * @param list     the list | ||||||
|  | 	 */ | ||||||
|  | 	@Inject(method = "renderLeftText", | ||||||
|  | 			at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/client/gui/hud/DebugHud;getLeftText()Ljava/util/List;"), | ||||||
|  | 			locals = LocalCapture.CAPTURE_FAILSOFT) | ||||||
|  | 	protected void renderTextRight(MatrixStack matrices, CallbackInfo ci, List<String> list) { | ||||||
|  | 		Optional<ConfigHolder> config = ConfigManager.getConfig(); | ||||||
|  | 		if (config.isPresent() && config.get().isModuleEnabled("petroleum.splashtext")) { | ||||||
|  | 			list.add("[Petroleum] " + SplashText.get() + " loaded"); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,19 @@ | ||||||
|  | package pm.j4.petroleum.mixin; | ||||||
|  | 
 | ||||||
|  | import net.minecraft.client.gui.widget.EntryListWidget; | ||||||
|  | import org.spongepowered.asm.mixin.Mixin; | ||||||
|  | import org.spongepowered.asm.mixin.gen.Accessor; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The interface Entry list widget accessor. | ||||||
|  |  */ | ||||||
|  | @Mixin(EntryListWidget.class) | ||||||
|  | public interface EntryListWidgetAccessor { | ||||||
|  | 	/** | ||||||
|  | 	 * Is render selection boolean. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the boolean | ||||||
|  | 	 */ | ||||||
|  | 	@Accessor("renderSelection") | ||||||
|  | 	boolean isRenderSelection(); | ||||||
|  | } | ||||||
							
								
								
									
										89
									
								
								remappedSrc/pm/j4/petroleum/mixin/ModListMixin.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								remappedSrc/pm/j4/petroleum/mixin/ModListMixin.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,89 @@ | ||||||
|  | package pm.j4.petroleum.mixin; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Optional; | ||||||
|  | import java.util.stream.Collectors; | ||||||
|  | import net.minecraft.client.MinecraftClient; | ||||||
|  | import net.minecraft.client.font.TextRenderer; | ||||||
|  | import net.minecraft.client.gui.DrawableHelper; | ||||||
|  | import net.minecraft.client.gui.hud.InGameHud; | ||||||
|  | import net.minecraft.client.util.math.MatrixStack; | ||||||
|  | import net.minecraft.text.TranslatableText; | ||||||
|  | import org.spongepowered.asm.mixin.Mixin; | ||||||
|  | import org.spongepowered.asm.mixin.Shadow; | ||||||
|  | import org.spongepowered.asm.mixin.injection.At; | ||||||
|  | import org.spongepowered.asm.mixin.injection.Inject; | ||||||
|  | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; | ||||||
|  | import pm.j4.petroleum.modules.list.ModList; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigHolder; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigManager; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Mod list mixin. | ||||||
|  |  */ | ||||||
|  | @Mixin(InGameHud.class) | ||||||
|  | public abstract class ModListMixin extends DrawableHelper { | ||||||
|  | 	/** | ||||||
|  | 	 * The Scaled height. | ||||||
|  | 	 */ | ||||||
|  | 	@Shadow | ||||||
|  | 	private int scaledHeight; | ||||||
|  | 	/** | ||||||
|  | 	 * The Client. | ||||||
|  | 	 */ | ||||||
|  | 	private final MinecraftClient client; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets font renderer. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the font renderer | ||||||
|  | 	 */ | ||||||
|  | 	@Shadow | ||||||
|  | 	public abstract TextRenderer getFontRenderer(); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Mod list mixin. | ||||||
|  | 	 * | ||||||
|  | 	 * @param client the client | ||||||
|  | 	 */ | ||||||
|  | 	public ModListMixin(MinecraftClient client) { | ||||||
|  | 		this.client = client; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Render. | ||||||
|  | 	 * | ||||||
|  | 	 * @param matrices  the matrices | ||||||
|  | 	 * @param tickDelta the tick delta | ||||||
|  | 	 * @param ci        the ci | ||||||
|  | 	 */ | ||||||
|  | 	@Inject(method = "render(Lnet/minecraft/client/util/math/MatrixStack;F)V", | ||||||
|  | 			at = @At("HEAD")) | ||||||
|  | 	public void render(MatrixStack matrices, float tickDelta, CallbackInfo ci) { | ||||||
|  | 		Optional<ConfigHolder> config = ConfigManager.getConfig(); | ||||||
|  | 		if (config.isPresent() && | ||||||
|  | 				config.get().isModuleEnabled("petroleum.modlist") && | ||||||
|  | 				!this.client.options.hudHidden && | ||||||
|  | 				!this.client.options.debugEnabled) { | ||||||
|  | 			renderModuleList(matrices); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Render module list. | ||||||
|  | 	 * | ||||||
|  | 	 * @param matrices the matrices | ||||||
|  | 	 */ | ||||||
|  | 	private void renderModuleList(MatrixStack matrices) { | ||||||
|  | 		List<ModuleBase> modules = ModList.getActive(); | ||||||
|  | 		List<TranslatableText> activeModuleList = modules.stream().map(module -> module.getReadableName()).collect(Collectors.toList()); | ||||||
|  | 		int fontHeight = this.getFontRenderer().fontHeight; | ||||||
|  | 		int startHeight = this.scaledHeight - (activeModuleList.size() * (fontHeight + 4)); | ||||||
|  | 		for (int i = 0; i < activeModuleList.size(); i++) { | ||||||
|  | 			this.getFontRenderer().drawWithShadow(matrices, activeModuleList.get(i), 10, 10 + (i * (fontHeight + 4)), -1); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										42
									
								
								remappedSrc/pm/j4/petroleum/mixin/OptionsMenuMixin.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								remappedSrc/pm/j4/petroleum/mixin/OptionsMenuMixin.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,42 @@ | ||||||
|  | package pm.j4.petroleum.mixin; | ||||||
|  | 
 | ||||||
|  | import net.minecraft.client.gui.screen.Screen; | ||||||
|  | import net.minecraft.client.gui.screen.options.OptionsScreen; | ||||||
|  | import net.minecraft.client.gui.widget.ButtonWidget; | ||||||
|  | import net.minecraft.text.Text; | ||||||
|  | import net.minecraft.text.TranslatableText; | ||||||
|  | import org.spongepowered.asm.mixin.Mixin; | ||||||
|  | import org.spongepowered.asm.mixin.injection.At; | ||||||
|  | import org.spongepowered.asm.mixin.injection.Inject; | ||||||
|  | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; | ||||||
|  | import pm.j4.petroleum.gui.POptionsScreen; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Options menu mixin. | ||||||
|  |  */ | ||||||
|  | @Mixin(OptionsScreen.class) | ||||||
|  | public class OptionsMenuMixin extends Screen { | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Options menu mixin. | ||||||
|  | 	 * | ||||||
|  | 	 * @param title the title | ||||||
|  | 	 */ | ||||||
|  | 	protected OptionsMenuMixin(Text title) { | ||||||
|  | 		super(title); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Init. | ||||||
|  | 	 * | ||||||
|  | 	 * @param ci the ci | ||||||
|  | 	 */ | ||||||
|  | 	@Inject(at = @At(value = "TAIL"), | ||||||
|  | 			method = "init()V") | ||||||
|  | 	protected void init(CallbackInfo ci) { | ||||||
|  | 		this.addButton(new ButtonWidget(this.width / 2 - 75, this.height / 6 + 140, 150, 20, new TranslatableText("petroleum.options"), (buttonWidget) -> { | ||||||
|  | 			assert this.client != null; | ||||||
|  | 			this.client.openScreen(new POptionsScreen(this)); | ||||||
|  | 		})); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										132
									
								
								remappedSrc/pm/j4/petroleum/mixin/TitleScreenMixin.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								remappedSrc/pm/j4/petroleum/mixin/TitleScreenMixin.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,132 @@ | ||||||
|  | package pm.j4.petroleum.mixin; | ||||||
|  | 
 | ||||||
|  | import java.util.Optional; | ||||||
|  | import net.minecraft.client.gui.screen.Screen; | ||||||
|  | import net.minecraft.client.gui.screen.TitleScreen; | ||||||
|  | import net.minecraft.client.util.math.MatrixStack; | ||||||
|  | import net.minecraft.text.Text; | ||||||
|  | import org.spongepowered.asm.mixin.Mixin; | ||||||
|  | import org.spongepowered.asm.mixin.injection.At; | ||||||
|  | import org.spongepowered.asm.mixin.injection.Inject; | ||||||
|  | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; | ||||||
|  | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; | ||||||
|  | import pm.j4.petroleum.modules.splash.SplashText; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigHolder; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigManager; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Mixin attached to the TitleScreen. | ||||||
|  |  * Currently, it is only used to display a string of text with the mod's version. | ||||||
|  |  * Any other modules will likely extend the options screen or pause screen, | ||||||
|  |  * so the module is unlikely to be used elsewhere. | ||||||
|  |  */ | ||||||
|  | @Mixin(TitleScreen.class) | ||||||
|  | public class TitleScreenMixin extends Screen { | ||||||
|  | 	/** | ||||||
|  | 	 * The Opacity. | ||||||
|  | 	 */ | ||||||
|  | 	private double opacity = 0; | ||||||
|  | 	/** | ||||||
|  | 	 * The Ascending. | ||||||
|  | 	 */ | ||||||
|  | 	private boolean ascending = false; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Stub method. | ||||||
|  | 	 * Since the mixin injects itself into the *actual* TitleScreen used by the game, | ||||||
|  | 	 * this should never run. | ||||||
|  | 	 * | ||||||
|  | 	 * @param title the title | ||||||
|  | 	 */ | ||||||
|  | 	protected TitleScreenMixin(Text title) { | ||||||
|  | 		super(title); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Mixin injection into the render method. | ||||||
|  | 	 * It captures locals so that the text can be rendered alongside the | ||||||
|  | 	 * screen fade-in. | ||||||
|  | 	 * It injects before the call to @link com.mojang.bridge.game.GameVersion#getName() using INVOKE_ASSIGN, | ||||||
|  | 	 * because attempting to use a regular invoke statement on @link net.minecraft.client.gui.DrawHelper#drawStringWithShadow() | ||||||
|  | 	 * repeatedly failed. | ||||||
|  | 	 * <p> | ||||||
|  | 	 * | ||||||
|  | 	 * @param matrices the matrices | ||||||
|  | 	 * @param mouseX   the mouse x | ||||||
|  | 	 * @param mouseY   the mouse y | ||||||
|  | 	 * @param delta    the delta | ||||||
|  | 	 * @param ci       the ci | ||||||
|  | 	 * @param f        the f | ||||||
|  | 	 * @param i        the | ||||||
|  | 	 * @param j        the j | ||||||
|  | 	 * @param g        the g | ||||||
|  | 	 * @param l        the l | ||||||
|  | 	 */ | ||||||
|  | 	@Inject(method = "render", | ||||||
|  | 			at = @At( | ||||||
|  | 					value = "INVOKE_ASSIGN", | ||||||
|  | 					target = "Lcom/mojang/bridge/game/GameVersion;getName()Ljava/lang/String;", | ||||||
|  | 					ordinal = 0), | ||||||
|  | 			locals = LocalCapture.CAPTURE_FAILSOFT) | ||||||
|  | 	private void render(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci, float f, int i, int j, float g, int l) { | ||||||
|  | 		Optional<ConfigHolder> config = ConfigManager.getConfig(); | ||||||
|  | 		if (config.isPresent() && config.get().isModuleEnabled("petroleum.splashtext")) { | ||||||
|  | 			drawStringWithShadow(matrices, this.textRenderer, SplashText.get(), 2, this.height - 20, blink(13108374) | l); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * fades an integer color based on the values declared at the top of the class. | ||||||
|  | 	 * | ||||||
|  | 	 * @param color the integer representation of the color to fade. this should generally remain constant. | ||||||
|  | 	 * @return the color, adjusted for "opacity". It's RGB and not RGBA, so it just lowers all color values. | ||||||
|  | 	 */ | ||||||
|  | 	@SuppressWarnings("SameParameterValue") | ||||||
|  | 	private int blink(int color) { | ||||||
|  | 		/* | ||||||
|  | 		  The Speed. | ||||||
|  | 		 */ | ||||||
|  | 		int speed = 3; | ||||||
|  | 		/* | ||||||
|  | 		  The Opacity max. | ||||||
|  | 		 */ | ||||||
|  | 		double opacity_max = 1000; | ||||||
|  | 		if (ascending) { | ||||||
|  | 			opacity += speed; | ||||||
|  | 			if (opacity > opacity_max) { | ||||||
|  | 				opacity = opacity_max; | ||||||
|  | 				ascending = false; | ||||||
|  | 			} | ||||||
|  | 		} else { | ||||||
|  | 			opacity -= speed; | ||||||
|  | 			/* | ||||||
|  | 			  The Opacity min. | ||||||
|  | 			 */ | ||||||
|  | 			double opacity_min = 500; | ||||||
|  | 			if (opacity < opacity_min) { | ||||||
|  | 				opacity = opacity_min; | ||||||
|  | 				ascending = true; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		double opacityD = (opacity / opacity_max); | ||||||
|  | 		/* | ||||||
|  | 		  The R mask. | ||||||
|  | 		 */ | ||||||
|  | 		int r_mask = 16711680; | ||||||
|  | 		int r = ((color & r_mask) / Integer.parseInt("010000", 16)); | ||||||
|  | 		/* | ||||||
|  | 		  The G mask. | ||||||
|  | 		 */ | ||||||
|  | 		int g_mask = 65280; | ||||||
|  | 		int g = ((color & g_mask) / Integer.parseInt("000100", 16)); | ||||||
|  | 		/* | ||||||
|  | 		  The B mask. | ||||||
|  | 		 */ | ||||||
|  | 		int b_mask = 255; | ||||||
|  | 		int b = ((color & b_mask)); | ||||||
|  | 		return ((int) (r * opacityD) * Integer.parseInt("010000", 16)) | | ||||||
|  | 				((int) (g * opacityD) * Integer.parseInt("000100", 16)) | | ||||||
|  | 				((int) (b * opacityD)); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										37
									
								
								remappedSrc/pm/j4/petroleum/modules/ExampleModule.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								remappedSrc/pm/j4/petroleum/modules/ExampleModule.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,37 @@ | ||||||
|  | package pm.j4.petroleum.modules; | ||||||
|  | 
 | ||||||
|  | import java.util.HashMap; | ||||||
|  | import java.util.Map; | ||||||
|  | import net.minecraft.client.MinecraftClient; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | import pm.j4.petroleum.util.module.option.BooleanOption; | ||||||
|  | import pm.j4.petroleum.util.module.option.ConfigurationOption; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Example module. | ||||||
|  |  */ | ||||||
|  | public class ExampleModule extends ModuleBase { | ||||||
|  | 	/** | ||||||
|  | 	 * example mod | ||||||
|  | 	 */ | ||||||
|  | 	public ExampleModule() { | ||||||
|  | 		super("petroleum.example", | ||||||
|  | 				"petroleum.misc", | ||||||
|  | 				true, | ||||||
|  | 				false, | ||||||
|  | 				true); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	protected Map<String, ConfigurationOption> getDefaultConfig() { | ||||||
|  | 		Map<String, ConfigurationOption> options = new HashMap<>(); | ||||||
|  | 		options.put("petroleum.example_b_one", new BooleanOption("example")); | ||||||
|  | 		options.put("petroleum.example_b_two", new BooleanOption("example")); | ||||||
|  | 		return options; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void activate(MinecraftClient client) { | ||||||
|  | 		System.out.println("Example Mod Keybind Activate"); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,30 @@ | ||||||
|  | package pm.j4.petroleum.modules.bindings; | ||||||
|  | 
 | ||||||
|  | import net.minecraft.client.util.InputUtil; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Binding info. | ||||||
|  |  */ | ||||||
|  | public class BindingInfo { | ||||||
|  | 	/** | ||||||
|  | 	 * The Translation key. | ||||||
|  | 	 */ | ||||||
|  | 	public String translationKey; | ||||||
|  | 	/** | ||||||
|  | 	 * The Type. | ||||||
|  | 	 */ | ||||||
|  | 	public InputUtil.Type type; | ||||||
|  | 	/** | ||||||
|  | 	 * The Key. | ||||||
|  | 	 */ | ||||||
|  | 	public int key; | ||||||
|  | 	/** | ||||||
|  | 	 * The Category. | ||||||
|  | 	 */ | ||||||
|  | 	public String category; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Attached function id. | ||||||
|  | 	 */ | ||||||
|  | 	public String attachedModuleName; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,96 @@ | ||||||
|  | package pm.j4.petroleum.modules.bindings; | ||||||
|  | 
 | ||||||
|  | import java.util.*; | ||||||
|  | import net.minecraft.client.MinecraftClient; | ||||||
|  | import net.minecraft.client.options.KeyBinding; | ||||||
|  | import net.minecraft.client.util.InputUtil; | ||||||
|  | import net.minecraft.client.util.math.MatrixStack; | ||||||
|  | import net.minecraft.text.TranslatableText; | ||||||
|  | import org.lwjgl.glfw.GLFW; | ||||||
|  | import pm.j4.petroleum.PetroleumMod; | ||||||
|  | import pm.j4.petroleum.gui.PModuleConfigEntry; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigManager; | ||||||
|  | import pm.j4.petroleum.util.config.GlobalConfig; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | import pm.j4.petroleum.util.module.option.KeybindOption; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Binding manager. | ||||||
|  |  */ | ||||||
|  | public class BindingManager extends ModuleBase { | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Module base. | ||||||
|  | 	 * Parameters should be constant across restarts. | ||||||
|  | 	 */ | ||||||
|  | 	public BindingManager() { | ||||||
|  | 		super("petroleum.bindings", | ||||||
|  | 				"petroleum.misc", | ||||||
|  | 				false, | ||||||
|  | 				true, | ||||||
|  | 				true); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void init() { | ||||||
|  | 		registerBindings(); | ||||||
|  | 		super.init(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public List<PModuleConfigEntry> getConfigEntries() { | ||||||
|  | 		List<PModuleConfigEntry> entries = new ArrayList<>(); | ||||||
|  | 
 | ||||||
|  | 		Map<KeybindOption, ModuleBase> mapped = new HashMap<>(); | ||||||
|  | 		if (ConfigManager.getConfig().isPresent()) { | ||||||
|  | 			Map<KeyBinding, ModuleBase> binds = ConfigManager.getConfig().get().globalConfig.bindings; | ||||||
|  | 
 | ||||||
|  | 			binds.forEach((key, func) -> { | ||||||
|  | 				KeybindOption option = new KeybindOption(func.getModuleName() + " " + func.getCategory()); | ||||||
|  | 				option.fromKeybind(key, func); | ||||||
|  | 				mapped.put(option, func); | ||||||
|  | 			}); | ||||||
|  | 		} | ||||||
|  | 		mapped.forEach((configEntry, module) -> { | ||||||
|  | 			PModuleConfigEntry entry = new PModuleConfigEntry(configEntry, new TranslatableText(module.getModuleName())) { | ||||||
|  | 				//TODO keybinding. most likely involves mixin to take direct key input | ||||||
|  | 				// look into how keybinding in regular options screen works | ||||||
|  | 				@Override | ||||||
|  | 				public void render(MatrixStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { | ||||||
|  | 					if (this.displayText != null) { | ||||||
|  | 						MinecraftClient.getInstance().textRenderer.drawWithShadow(matrices, displayText, x, y, 0xAAAAAA); | ||||||
|  | 					} | ||||||
|  | 					if (this.option != null) { | ||||||
|  | 						int fontHeight = MinecraftClient.getInstance().textRenderer.fontHeight; | ||||||
|  | 						MinecraftClient.getInstance().textRenderer.drawWithShadow(matrices, "Key Value: " + this.option.getStringValue(), x, y + fontHeight + 4, 0xFFFFFF); | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			}; | ||||||
|  | 			entries.add(entry); | ||||||
|  | 		}); | ||||||
|  | 		return entries; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Register bindings. | ||||||
|  | 	 */ | ||||||
|  | 	private void registerBindings() { | ||||||
|  | 		if (!ConfigManager.getConfig().isPresent()) { | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 		GlobalConfig c = ConfigManager.getConfig().get().globalConfig; | ||||||
|  | 		Optional<ModuleBase> mod = PetroleumMod.getMod("petroleum.modmenu"); | ||||||
|  | 		if (mod.isPresent() && !c.isBound(mod.get())) { | ||||||
|  | 			//TODO | ||||||
|  | 			// the only explicit keybinding (for now.) | ||||||
|  | 			// once the binding manager has been completed, | ||||||
|  | 			// this should be migrated there, as a default binding | ||||||
|  | 			KeyBinding binding = new KeyBinding( | ||||||
|  | 					"key.petroleum.togglemodmenu", | ||||||
|  | 					InputUtil.Type.KEYSYM, | ||||||
|  | 					GLFW.GLFW_KEY_RIGHT_CONTROL, | ||||||
|  | 					"category.petroleum" | ||||||
|  | 			); | ||||||
|  | 			ConfigManager.getConfig().get().globalConfig.setBinding(binding, mod.get()); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										44
									
								
								remappedSrc/pm/j4/petroleum/modules/list/ModList.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								remappedSrc/pm/j4/petroleum/modules/list/ModList.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,44 @@ | ||||||
|  | package pm.j4.petroleum.modules.list; | ||||||
|  | 
 | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Optional; | ||||||
|  | import jdk.nashorn.internal.runtime.options.Option; | ||||||
|  | import pm.j4.petroleum.PetroleumMod; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigHolder; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigManager; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Mod list. | ||||||
|  |  */ | ||||||
|  | public class ModList extends ModuleBase { | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Mod list. | ||||||
|  | 	 */ | ||||||
|  | 	public ModList() { | ||||||
|  | 		super("petroleum.modlist", | ||||||
|  | 				"petroleum.misc", | ||||||
|  | 				true, | ||||||
|  | 				true, | ||||||
|  | 				true); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets active. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the active | ||||||
|  | 	 */ | ||||||
|  | 	public static List<ModuleBase> getActive() { | ||||||
|  | 		List<ModuleBase> result = new ArrayList<>(); | ||||||
|  | 		Optional<ConfigHolder> config = ConfigManager.getConfig(); | ||||||
|  | 		if(config.isPresent()) { | ||||||
|  | 			config.get().getEnabledModules().forEach((mod) -> { | ||||||
|  | 				if (!mod.isHidden()) { | ||||||
|  | 					result.add(mod); | ||||||
|  | 				} | ||||||
|  | 			}); | ||||||
|  | 		} | ||||||
|  | 		return result; | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										98
									
								
								remappedSrc/pm/j4/petroleum/modules/menu/ModMenu.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								remappedSrc/pm/j4/petroleum/modules/menu/ModMenu.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,98 @@ | ||||||
|  | package pm.j4.petroleum.modules.menu; | ||||||
|  | 
 | ||||||
|  | import java.util.HashMap; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
|  | import net.minecraft.client.MinecraftClient; | ||||||
|  | import pm.j4.petroleum.gui.PModMenuScreen; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigManager; | ||||||
|  | import pm.j4.petroleum.util.data.ButtonInformation; | ||||||
|  | import pm.j4.petroleum.util.data.Category; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Mod menu. | ||||||
|  |  */ | ||||||
|  | public class ModMenu extends ModuleBase { | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The constant coordinates. | ||||||
|  | 	 */ | ||||||
|  | 	private static final Map<String, ButtonInformation> coordinates = new HashMap<>(); | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Mod menu. | ||||||
|  | 	 */ | ||||||
|  | 	public ModMenu() { | ||||||
|  | 		super("petroleum.modmenu", | ||||||
|  | 				"petroleum.misc", | ||||||
|  | 				true, | ||||||
|  | 				true, | ||||||
|  | 				true); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// TODO figure out resizing | ||||||
|  | 	//  the number itself changes, so it should just be probably like some onResize bullshit in PModMenuScreen | ||||||
|  | 	@Override | ||||||
|  | 	public void init() { | ||||||
|  | 		Map<String, List<ModuleBase>> categories = Category.getCategoryMap(); | ||||||
|  | 		final double[] h = {.1}; | ||||||
|  | 		categories.forEach((category, moduleList) -> { | ||||||
|  | 			ButtonInformation conf = ConfigManager.getConfig().isPresent() ? | ||||||
|  | 					ConfigManager.getConfig().get().globalConfig.getButton(category) : | ||||||
|  | 					null; | ||||||
|  | 			ButtonInformation coord = conf != null ? conf : new ButtonInformation(.1, h[0], false); | ||||||
|  | 			h[0] += .01; | ||||||
|  | 			coordinates.put(category, coord); | ||||||
|  | 			if (ConfigManager.getConfig().isPresent()) { | ||||||
|  | 				ConfigManager.getConfig().get().globalConfig.setButton(category, coord); | ||||||
|  | 			} | ||||||
|  | 		}); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Update coord. | ||||||
|  | 	 * | ||||||
|  | 	 * @param b the b | ||||||
|  | 	 * @param c the c | ||||||
|  | 	 */ | ||||||
|  | 	public static void updateCoord(String b, ButtonInformation c) { | ||||||
|  | 		if (c.x < 0.05) { | ||||||
|  | 			c.x = 0.05; | ||||||
|  | 		} | ||||||
|  | 		if (c.x > .95) { | ||||||
|  | 			c.x = .95; | ||||||
|  | 		} | ||||||
|  | 		if (c.y < 0.05) { | ||||||
|  | 			c.y = 0.05; | ||||||
|  | 		} | ||||||
|  | 		if (c.y > .95) { | ||||||
|  | 			c.y = .95; | ||||||
|  | 		} | ||||||
|  | 		if (coordinates.containsKey(b)) { | ||||||
|  | 			coordinates.replace(b, c); | ||||||
|  | 			if (ConfigManager.getConfig().isPresent()) { | ||||||
|  | 				ConfigManager.getConfig().get().globalConfig.setButton(b, c); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void activate(MinecraftClient client) { | ||||||
|  | 		this.toggle(); | ||||||
|  | 		if (ConfigManager.getConfig().get().isModuleEnabled(this.getModuleName())) { | ||||||
|  | 			client.openScreen(new PModMenuScreen()); | ||||||
|  | 		} else { | ||||||
|  | 			client.openScreen(null); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets buttons. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the buttons | ||||||
|  | 	 */ | ||||||
|  | 	public static Map<String, ButtonInformation> getButtons() { | ||||||
|  | 		return coordinates; | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										56
									
								
								remappedSrc/pm/j4/petroleum/modules/splash/SplashText.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								remappedSrc/pm/j4/petroleum/modules/splash/SplashText.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,56 @@ | ||||||
|  | package pm.j4.petroleum.modules.splash; | ||||||
|  | 
 | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.HashMap; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
|  | import net.minecraft.client.MinecraftClient; | ||||||
|  | import net.minecraft.client.options.KeyBinding; | ||||||
|  | import net.minecraft.client.util.math.MatrixStack; | ||||||
|  | import net.minecraft.text.LiteralText; | ||||||
|  | import net.minecraft.text.Text; | ||||||
|  | import net.minecraft.text.TranslatableText; | ||||||
|  | import pm.j4.petroleum.PetroleumMod; | ||||||
|  | import pm.j4.petroleum.gui.PModuleConfigEntry; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigManager; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | import pm.j4.petroleum.util.module.option.BooleanOption; | ||||||
|  | import pm.j4.petroleum.util.module.option.ConfigurationOption; | ||||||
|  | import pm.j4.petroleum.util.module.option.KeybindOption; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Splash text. | ||||||
|  |  */ | ||||||
|  | public class SplashText extends ModuleBase { | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Splash text. | ||||||
|  | 	 */ | ||||||
|  | 	public SplashText() { | ||||||
|  | 		super("petroleum.splashtext", | ||||||
|  | 				"petroleum.misc", | ||||||
|  | 				false, | ||||||
|  | 				true, | ||||||
|  | 				true); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public List<PModuleConfigEntry> getConfigEntries() { | ||||||
|  | 		List<PModuleConfigEntry> entries = new ArrayList<>(); | ||||||
|  | 		ConfigurationOption activeToggle = new BooleanOption("Show the main menu version text:"); | ||||||
|  | 		PModuleConfigEntry activeEntry = new PModuleConfigEntry(activeToggle, new LiteralText("Active")); | ||||||
|  | 		entries.add(activeEntry); | ||||||
|  | 		return entries; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Get string. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the string | ||||||
|  | 	 */ | ||||||
|  | 	public static String get() { | ||||||
|  | 		if (PetroleumMod.modData != null) { | ||||||
|  | 			return "Petroleum v" + PetroleumMod.modData.getVersion().getFriendlyString(); | ||||||
|  | 		} | ||||||
|  | 		return "Petroleum vUnknown"; | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										19
									
								
								remappedSrc/pm/j4/petroleum/modules/xray/Xray.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								remappedSrc/pm/j4/petroleum/modules/xray/Xray.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,19 @@ | ||||||
|  | package pm.j4.petroleum.modules.xray; | ||||||
|  | 
 | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Xray. | ||||||
|  |  */ | ||||||
|  | public class Xray extends ModuleBase { | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Xray. | ||||||
|  | 	 */ | ||||||
|  | 	public Xray() { | ||||||
|  | 		super("petroleum.xray", | ||||||
|  | 				"petroleum.render", | ||||||
|  | 				true, | ||||||
|  | 				false, | ||||||
|  | 				true); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										59
									
								
								remappedSrc/pm/j4/petroleum/util/config/Config.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								remappedSrc/pm/j4/petroleum/util/config/Config.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,59 @@ | ||||||
|  | package pm.j4.petroleum.util.config; | ||||||
|  | 
 | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.List; | ||||||
|  | import pm.j4.petroleum.PetroleumMod; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Config. | ||||||
|  |  */ | ||||||
|  | public abstract class Config { | ||||||
|  | 	/** | ||||||
|  | 	 * The Enabled modules. | ||||||
|  | 	 */ | ||||||
|  | 	public List<String> enabledModules = new ArrayList<>(); | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Is enabled boolean. | ||||||
|  | 	 * | ||||||
|  | 	 * @param mod the mod | ||||||
|  | 	 * @return the boolean | ||||||
|  | 	 */ | ||||||
|  | 	public boolean isEnabled(String mod) { | ||||||
|  | 		return enabledModules.contains(mod); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Disable module. | ||||||
|  | 	 * | ||||||
|  | 	 * @param mod the mod | ||||||
|  | 	 */ | ||||||
|  | 	public void disableModule(String mod) { | ||||||
|  | 		if (isEnabled(mod) && PetroleumMod.isActive(mod) && PetroleumMod.getMod(mod).isPresent()) { | ||||||
|  | 			ModuleBase moduleInfo = PetroleumMod.getMod(mod).get(); | ||||||
|  | 			if (moduleInfo.isActivatable()) { | ||||||
|  | 				enabledModules.remove(mod); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Toggle module. | ||||||
|  | 	 * | ||||||
|  | 	 * @param mod the mod | ||||||
|  | 	 */ | ||||||
|  | 	public void toggleModule(String mod) { | ||||||
|  | 		if (PetroleumMod.isActive(mod) && PetroleumMod.getMod(mod).isPresent()) { | ||||||
|  | 			ModuleBase moduleInfo = PetroleumMod.getMod(mod).get(); | ||||||
|  | 			if (moduleInfo.isActivatable()) { | ||||||
|  | 				if (isEnabled(mod)) { | ||||||
|  | 					enabledModules.remove(mod); | ||||||
|  | 				} else { | ||||||
|  | 					enabledModules.add(mod); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										102
									
								
								remappedSrc/pm/j4/petroleum/util/config/ConfigHolder.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								remappedSrc/pm/j4/petroleum/util/config/ConfigHolder.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,102 @@ | ||||||
|  | package pm.j4.petroleum.util.config; | ||||||
|  | 
 | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
|  | import java.util.stream.Collectors; | ||||||
|  | import pm.j4.petroleum.PetroleumMod; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Config holder. | ||||||
|  |  */ | ||||||
|  | public class ConfigHolder { | ||||||
|  | 	/** | ||||||
|  | 	 * The Global config. | ||||||
|  | 	 */ | ||||||
|  | 	public GlobalConfig globalConfig; | ||||||
|  | 	/** | ||||||
|  | 	 * The Server configs. | ||||||
|  | 	 */ | ||||||
|  | 	public Map<String, ServerConfig> serverConfigs; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Is module enabled boolean. | ||||||
|  | 	 * | ||||||
|  | 	 * @param module the module | ||||||
|  | 	 * @return the boolean | ||||||
|  | 	 */ | ||||||
|  | 	public boolean isModuleEnabled(String module) { | ||||||
|  | 
 | ||||||
|  | 		if (!PetroleumMod.isActive(module)) { | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		if (globalConfig.isEnabled(module)) { | ||||||
|  | 			return true; | ||||||
|  | 		} | ||||||
|  | 		String server = this.getServer(); | ||||||
|  | 		if (serverConfigs.containsKey(server)) { | ||||||
|  | 			return serverConfigs.get(server).isEnabled(module); | ||||||
|  | 		} | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets enabled modules. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the enabled modules | ||||||
|  | 	 */ | ||||||
|  | 	public List<ModuleBase> getEnabledModules() { | ||||||
|  | 		List<ModuleBase> modules = PetroleumMod.getActiveMods(); | ||||||
|  | 		return modules.stream().filter(module -> | ||||||
|  | 				isModuleEnabled(module.getModuleName()) | ||||||
|  | 		).collect(Collectors.toList()); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets server. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the server | ||||||
|  | 	 */ | ||||||
|  | 	public String getServer() { | ||||||
|  | 		return PetroleumMod.getServerAddress(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Toggle module. | ||||||
|  | 	 * | ||||||
|  | 	 * @param module the module | ||||||
|  | 	 */ | ||||||
|  | 	public void toggleModule(String module) { | ||||||
|  | 		String server = this.getServer(); | ||||||
|  | 		if (serverConfigs.containsKey(server)) { | ||||||
|  | 			System.out.println("Toggling module " + module + " on server " + server); | ||||||
|  | 			serverConfigs.get(server).toggleModule(module); | ||||||
|  | 		} else { | ||||||
|  | 			globalConfig.toggleModule(module); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Disable module. | ||||||
|  | 	 * | ||||||
|  | 	 * @param module the module | ||||||
|  | 	 */ | ||||||
|  | 	public void disableModule(String module) { | ||||||
|  | 		String server = this.getServer(); | ||||||
|  | 		if (serverConfigs.containsKey(server)) { | ||||||
|  | 			System.out.println("disabling module " + module + " on server " + server); | ||||||
|  | 			serverConfigs.get(server).disableModule(module); | ||||||
|  | 		} else { | ||||||
|  | 			globalConfig.disableModule(module); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Save module. | ||||||
|  | 	 * | ||||||
|  | 	 * @param module the module | ||||||
|  | 	 */ | ||||||
|  | 	public static void saveModule(ModuleBase module) { | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										270
									
								
								remappedSrc/pm/j4/petroleum/util/config/ConfigManager.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										270
									
								
								remappedSrc/pm/j4/petroleum/util/config/ConfigManager.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,270 @@ | ||||||
|  | package pm.j4.petroleum.util.config; | ||||||
|  | 
 | ||||||
|  | import com.google.common.reflect.TypeToken; | ||||||
|  | import com.google.gson.*; | ||||||
|  | import java.io.*; | ||||||
|  | import java.lang.reflect.Type; | ||||||
|  | import java.util.*; | ||||||
|  | import net.fabricmc.loader.api.FabricLoader; | ||||||
|  | import pm.j4.petroleum.PetroleumMod; | ||||||
|  | import pm.j4.petroleum.modules.bindings.BindingInfo; | ||||||
|  | import pm.j4.petroleum.modules.menu.ModMenu; | ||||||
|  | import pm.j4.petroleum.util.data.ButtonInformation; | ||||||
|  | import pm.j4.petroleum.util.data.ModuleConfig; | ||||||
|  | import pm.j4.petroleum.util.data.OptionSerializiable; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Config manager. | ||||||
|  |  */ | ||||||
|  | public class ConfigManager { | ||||||
|  | 	/** | ||||||
|  | 	 * The constant GSON. | ||||||
|  | 	 */ | ||||||
|  | 	public static final Gson GSON = new GsonBuilder() | ||||||
|  | 			.registerTypeAdapter(GlobalConfig.class, SerializationHelper.getGlobalSerializer()) | ||||||
|  | 			.registerTypeAdapter(GlobalConfig.class, SerializationHelper.getGlobalDeserializer()) | ||||||
|  | 			.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).setPrettyPrinting().create(); | ||||||
|  | 	/** | ||||||
|  | 	 * The constant config. | ||||||
|  | 	 */ | ||||||
|  | 	private static ConfigHolder config; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Prepare config file. | ||||||
|  | 	 * | ||||||
|  | 	 * @param path     the path | ||||||
|  | 	 * @param filename the filename | ||||||
|  | 	 * @return the file | ||||||
|  | 	 */ | ||||||
|  | 	private static File prepareConfigFile(String path, String filename) { | ||||||
|  | 		if (path != "") { | ||||||
|  | 			File directory = new File(FabricLoader.getInstance().getConfigDir().toString(), path); | ||||||
|  | 			if (!directory.exists()) directory.mkdir(); | ||||||
|  | 		} | ||||||
|  | 		return new File(FabricLoader.getInstance().getConfigDir().toString(), path + filename); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Init config. | ||||||
|  | 	 */ | ||||||
|  | 	public static void initConfig() { | ||||||
|  | 		if (config != null) { | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		config = new ConfigHolder(); | ||||||
|  | 		config.globalConfig = new DefaultConfig(); | ||||||
|  | 		config.serverConfigs = new HashMap<>(); | ||||||
|  | 
 | ||||||
|  | 		config = load("petroleum/", "petroleum.json", ConfigHolder.class); | ||||||
|  | 		initModules(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Init modules. | ||||||
|  | 	 */ | ||||||
|  | 	public static void initModules() { | ||||||
|  | 		PetroleumMod.getActiveMods().forEach(module -> { | ||||||
|  | 			ModuleConfig options = load("petroleum/modules/", module.getModuleName() + ".json", ModuleConfig.class); | ||||||
|  | 			if (options != null && options.options != null) { | ||||||
|  | 				options.options.forEach((key, option) -> { | ||||||
|  | 					if (module.hasOption(option.key)) { | ||||||
|  | 						module.setConfigOption(option.key, option.value); | ||||||
|  | 					} | ||||||
|  | 				}); | ||||||
|  | 			} | ||||||
|  | 		}); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Load. | ||||||
|  | 	 * | ||||||
|  | 	 * @param <T>      the type parameter | ||||||
|  | 	 * @param path     the path | ||||||
|  | 	 * @param filename the filename | ||||||
|  | 	 * @param tClass   the t class | ||||||
|  | 	 * @return the t | ||||||
|  | 	 */ | ||||||
|  | 	private static <T> T load(String path, String filename, Class<T> tClass) { | ||||||
|  | 		File file = prepareConfigFile(path, filename); | ||||||
|  | 
 | ||||||
|  | 		try { | ||||||
|  | 			if (!file.exists()) { | ||||||
|  | 				save(path, filename, tClass.newInstance()); | ||||||
|  | 			} | ||||||
|  | 			if (file.exists()) { | ||||||
|  | 				BufferedReader reader = new BufferedReader(new FileReader(file)); | ||||||
|  | 				T parsedConfig = null; | ||||||
|  | 				try { | ||||||
|  | 					parsedConfig = GSON.fromJson(reader, tClass); | ||||||
|  | 				} catch (Exception e) { | ||||||
|  | 					System.out.println("Couldn't parse config file"); | ||||||
|  | 					e.printStackTrace(); | ||||||
|  | 				} | ||||||
|  | 				if (parsedConfig != null) { | ||||||
|  | 					return parsedConfig; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} catch (FileNotFoundException | InstantiationException | IllegalAccessException e) { | ||||||
|  | 			System.out.println("Couldn't load configuration file at " + path); | ||||||
|  | 			e.printStackTrace(); | ||||||
|  | 		} | ||||||
|  | 		return null; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Deserialize element t. | ||||||
|  | 	 * | ||||||
|  | 	 * @param <T>     the type parameter | ||||||
|  | 	 * @param element the element | ||||||
|  | 	 * @param tClass  the t class | ||||||
|  | 	 * @return the t | ||||||
|  | 	 */ | ||||||
|  | 	public static <T> T deserializeElement(JsonElement element, Class<T> tClass) { | ||||||
|  | 		return GSON.fromJson(element, tClass); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Save. | ||||||
|  | 	 * | ||||||
|  | 	 * @param <T>      the type parameter | ||||||
|  | 	 * @param path     the path | ||||||
|  | 	 * @param filename the filename | ||||||
|  | 	 * @param data     the data | ||||||
|  | 	 */ | ||||||
|  | 	private static <T> void save(String path, String filename, T data) { | ||||||
|  | 		File file = prepareConfigFile(path, filename); | ||||||
|  | 
 | ||||||
|  | 		String json = GSON.toJson(data); | ||||||
|  | 		try (FileWriter fileWriter = new FileWriter(file)) { | ||||||
|  | 			fileWriter.write(json); | ||||||
|  | 		} catch (IOException e) { | ||||||
|  | 			System.out.println("Couldn't save configuration file at " + path); | ||||||
|  | 			e.printStackTrace(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Save module. | ||||||
|  | 	 * | ||||||
|  | 	 * @param b the b | ||||||
|  | 	 */ | ||||||
|  | 	public static void saveModule(ModuleBase b) { | ||||||
|  | 		ModuleConfig c = new ModuleConfig(); | ||||||
|  | 		c.options = GlobalConfig.serializeModuleConfiguration(b); | ||||||
|  | 		save("petroleum/modules/", b.getModuleName() + ".json", c); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Save all modules. | ||||||
|  | 	 */ | ||||||
|  | 	public static void saveAllModules() { | ||||||
|  | 		List<ModuleBase> mods = PetroleumMod.getActiveMods(); | ||||||
|  | 		mods.forEach(ConfigManager::saveModule); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Save global config. | ||||||
|  | 	 */ | ||||||
|  | 	public static void saveGlobalConfig() { | ||||||
|  | 		save("petroleum/", "petroleum.json", config); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets config. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the config | ||||||
|  | 	 */ | ||||||
|  | 	public static Optional<ConfigHolder> getConfig() { | ||||||
|  | 		if (config == null) { | ||||||
|  | 			return Optional.empty(); | ||||||
|  | 		} | ||||||
|  | 		return Optional.of(config); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Serialization helper. | ||||||
|  |  */ | ||||||
|  | class SerializationHelper { | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The constant s. | ||||||
|  | 	 */ | ||||||
|  | 	private static final JsonSerializer<GlobalConfig> GLOBAL_CONFIG_JSON_SERIALIZER = (src, typeOfSrc, ctx) -> { | ||||||
|  | 		JsonObject jsonConfig = new JsonObject(); | ||||||
|  | 
 | ||||||
|  | 		JsonArray bindings = ctx.serialize(src.serializeBindings()).getAsJsonArray(); | ||||||
|  | 		jsonConfig.add("bindings", bindings); | ||||||
|  | 
 | ||||||
|  | 		JsonArray modules = ctx.serialize(src.enabledModules).getAsJsonArray(); | ||||||
|  | 		jsonConfig.add("enabled_modules", modules); | ||||||
|  | 
 | ||||||
|  | 		JsonObject tabCoordinates = new JsonObject(); | ||||||
|  | 		ModMenu.getButtons().forEach((category, coordinates) -> { | ||||||
|  | 			tabCoordinates.add(category, ctx.serialize(coordinates)); | ||||||
|  | 		}); | ||||||
|  | 		jsonConfig.add("button_coordinates", tabCoordinates); | ||||||
|  | 
 | ||||||
|  | 		return jsonConfig; | ||||||
|  | 	}; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The constant ds. | ||||||
|  | 	 */ | ||||||
|  | 	private static final JsonDeserializer<GlobalConfig> GLOBAL_CONFIG_JSON_DESERIALIZER = ((json, typeOfT, ctx) -> { | ||||||
|  | 		JsonObject obj = json.getAsJsonObject(); | ||||||
|  | 
 | ||||||
|  | 		List<BindingInfo> bindings = new ArrayList<>(); | ||||||
|  | 		if (obj.has("bindings")) { | ||||||
|  | 			obj.get("bindings").getAsJsonArray().forEach(b -> bindings.add(ctx.deserialize(b, BindingInfo.class))); | ||||||
|  | 		} | ||||||
|  | 		List<String> modules = new ArrayList<>(); | ||||||
|  | 		if (obj.has("enabled_modules")) { | ||||||
|  | 			obj.get("enabled_modules").getAsJsonArray().forEach(m -> modules.add(m.getAsString())); | ||||||
|  | 		} | ||||||
|  | 		GlobalConfig cfg = new GlobalConfig(); | ||||||
|  | 		Map<String, List<OptionSerializiable>> options; | ||||||
|  | 		Type type = new TypeToken<Map<String, List<OptionSerializiable>>>() { | ||||||
|  | 		}.getType(); | ||||||
|  | 		if (obj.has("module_configuration")) { | ||||||
|  | 			options = ctx.deserialize(obj.get("module_configuration"), type); | ||||||
|  | 		} else { | ||||||
|  | 			options = new HashMap<>(); | ||||||
|  | 		} | ||||||
|  | 		if (obj.has("button_coordinates")) { | ||||||
|  | 			obj.get("button_coordinates").getAsJsonObject().entrySet().forEach( | ||||||
|  | 					value -> { | ||||||
|  | 						cfg.setButton(value.getKey(), ctx.deserialize(value.getValue(), ButtonInformation.class)); | ||||||
|  | 					} | ||||||
|  | 			); | ||||||
|  | 		} | ||||||
|  | 		PetroleumMod.getActiveMods().forEach(module -> { | ||||||
|  | 			if (options.containsKey(module.getModuleName())) { | ||||||
|  | 				cfg.deserializeModuleConfiguration(options.get(module.getModuleName()), module); | ||||||
|  | 			} | ||||||
|  | 		}); | ||||||
|  | 		cfg.deserializeBindings(bindings); | ||||||
|  | 		cfg.enabledModules = modules; | ||||||
|  | 		return cfg; | ||||||
|  | 	}); | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets serializer. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the serializer | ||||||
|  | 	 */ | ||||||
|  | 	public static JsonSerializer<GlobalConfig> getGlobalSerializer() { | ||||||
|  | 		return GLOBAL_CONFIG_JSON_SERIALIZER; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets deserializer. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the deserializer | ||||||
|  | 	 */ | ||||||
|  | 	public static JsonDeserializer<GlobalConfig> getGlobalDeserializer() { | ||||||
|  | 		return GLOBAL_CONFIG_JSON_DESERIALIZER; | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										15
									
								
								remappedSrc/pm/j4/petroleum/util/config/DefaultConfig.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								remappedSrc/pm/j4/petroleum/util/config/DefaultConfig.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,15 @@ | ||||||
|  | package pm.j4.petroleum.util.config; | ||||||
|  | 
 | ||||||
|  | import java.util.Collections; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Default config. | ||||||
|  |  */ | ||||||
|  | public class DefaultConfig extends GlobalConfig { | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Default config. | ||||||
|  | 	 */ | ||||||
|  | 	public DefaultConfig() { | ||||||
|  | 		this.enabledModules = Collections.singletonList("petroleum.splashtext"); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										189
									
								
								remappedSrc/pm/j4/petroleum/util/config/GlobalConfig.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										189
									
								
								remappedSrc/pm/j4/petroleum/util/config/GlobalConfig.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,189 @@ | ||||||
|  | package pm.j4.petroleum.util.config; | ||||||
|  | 
 | ||||||
|  | import java.util.*; | ||||||
|  | import java.util.concurrent.atomic.AtomicBoolean; | ||||||
|  | import net.minecraft.client.options.KeyBinding; | ||||||
|  | import net.minecraft.client.util.InputUtil; | ||||||
|  | import pm.j4.petroleum.PetroleumMod; | ||||||
|  | import pm.j4.petroleum.modules.bindings.BindingInfo; | ||||||
|  | import pm.j4.petroleum.util.data.ButtonInformation; | ||||||
|  | import pm.j4.petroleum.util.data.OptionSerializiable; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | import pm.j4.petroleum.util.module.option.ConfigurationOption; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Global config. | ||||||
|  |  */ | ||||||
|  | public class GlobalConfig extends Config { | ||||||
|  | 	/** | ||||||
|  | 	 * The Bindings. | ||||||
|  | 	 */ | ||||||
|  | 	public final Map<KeyBinding, ModuleBase> bindings = new HashMap<>(); | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Is bound boolean. | ||||||
|  | 	 * | ||||||
|  | 	 * @param func the func | ||||||
|  | 	 * @return the boolean | ||||||
|  | 	 */ | ||||||
|  | 	public boolean isBound(ModuleBase func) { | ||||||
|  | 		AtomicBoolean found = new AtomicBoolean(false); | ||||||
|  | 		bindings.forEach((key, binding) -> { | ||||||
|  | 			if (binding.equals(func)) { | ||||||
|  | 				found.set(true); | ||||||
|  | 			} | ||||||
|  | 		}); | ||||||
|  | 		return found.get(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Sets binding. | ||||||
|  | 	 * | ||||||
|  | 	 * @param bind the bind | ||||||
|  | 	 * @param func the func | ||||||
|  | 	 */ | ||||||
|  | 	public void setBinding(KeyBinding bind, ModuleBase func) { | ||||||
|  | 		if (bindings.containsValue(func)) { | ||||||
|  | 			bindings.forEach((key, binding) -> { | ||||||
|  | 				if (binding.equals(func)) { | ||||||
|  | 					PetroleumMod.removeBind(key); | ||||||
|  | 					bindings.remove(key); | ||||||
|  | 				} | ||||||
|  | 			}); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if (PetroleumMod.isActive(func.getModuleName())) { | ||||||
|  | 			PetroleumMod.addBind(bind); | ||||||
|  | 			bindings.put(bind, func); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Convert binding. | ||||||
|  | 	 * | ||||||
|  | 	 * @param info the info | ||||||
|  | 	 */ | ||||||
|  | 	private void convertBinding(BindingInfo info) { | ||||||
|  | 		Optional<ModuleBase> match = PetroleumMod.getMod(info.attachedModuleName); | ||||||
|  | 		match.ifPresent(moduleBase -> setBinding(reconstructBinding(info), | ||||||
|  | 				moduleBase)); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Reconstruct binding key binding. | ||||||
|  | 	 * | ||||||
|  | 	 * @param info the info | ||||||
|  | 	 * @return the key binding | ||||||
|  | 	 */ | ||||||
|  | 	public static KeyBinding reconstructBinding(BindingInfo info) { | ||||||
|  | 		return new KeyBinding( | ||||||
|  | 				info.translationKey, | ||||||
|  | 				info.type, | ||||||
|  | 				info.key, | ||||||
|  | 				info.category | ||||||
|  | 		); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Extract binding info. | ||||||
|  | 	 * | ||||||
|  | 	 * @param b the b | ||||||
|  | 	 * @param f the f | ||||||
|  | 	 * @return the binding info | ||||||
|  | 	 */ | ||||||
|  | 	public static BindingInfo extractBinding(KeyBinding b, ModuleBase f) { | ||||||
|  | 		BindingInfo res = new BindingInfo(); | ||||||
|  | 		res.attachedModuleName = f.getModuleName(); | ||||||
|  | 
 | ||||||
|  | 		res.translationKey = b.getTranslationKey(); | ||||||
|  | 		InputUtil.Key k = b.getDefaultKey(); | ||||||
|  | 		res.type = k.getCategory(); | ||||||
|  | 		res.key = k.getCode(); | ||||||
|  | 		res.category = b.getCategory(); | ||||||
|  | 
 | ||||||
|  | 		return res; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Serialize bindings list. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the list | ||||||
|  | 	 */ | ||||||
|  | 	public List<BindingInfo> serializeBindings() { | ||||||
|  | 		List<BindingInfo> b = new ArrayList<>(); | ||||||
|  | 		bindings.forEach((k, f) -> b.add(extractBinding(k, f))); | ||||||
|  | 		return b; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Deserialize bindings. | ||||||
|  | 	 * | ||||||
|  | 	 * @param info the info | ||||||
|  | 	 */ | ||||||
|  | 	public void deserializeBindings(List<BindingInfo> info) { | ||||||
|  | 		info.forEach(this::convertBinding); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Serialize module configuration list. | ||||||
|  | 	 * | ||||||
|  | 	 * @param module the module | ||||||
|  | 	 * @return the list | ||||||
|  | 	 */ | ||||||
|  | 	public static Map<String, OptionSerializiable> serializeModuleConfiguration(ModuleBase module) { | ||||||
|  | 		Map<String, OptionSerializiable> opts = new HashMap<>(); | ||||||
|  | 		Map<String, ConfigurationOption> configuration = module.getModuleConfiguration(); | ||||||
|  | 		configuration.forEach((key, value) -> { | ||||||
|  | 			opts.put(key, new OptionSerializiable(key, value.toJson())); | ||||||
|  | 		}); | ||||||
|  | 		return opts; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Deserialize module configuration. | ||||||
|  | 	 * | ||||||
|  | 	 * @param opts   the opts | ||||||
|  | 	 * @param module the module | ||||||
|  | 	 */ | ||||||
|  | 	public void deserializeModuleConfiguration(List<OptionSerializiable> opts, ModuleBase module) { | ||||||
|  | 		opts.forEach(option -> { | ||||||
|  | 			if (module.hasOption(option.key)) { | ||||||
|  | 				module.setConfigOption(option.key, option.value); | ||||||
|  | 			} | ||||||
|  | 		}); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Button locations. | ||||||
|  | 	 */ | ||||||
|  | 	private final Map<String, ButtonInformation> buttonLocations = new HashMap<>(); | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Sets button. | ||||||
|  | 	 * | ||||||
|  | 	 * @param category          the category | ||||||
|  | 	 * @param buttonInformation the button information | ||||||
|  | 	 */ | ||||||
|  | 	public void setButton(String category, ButtonInformation buttonInformation) { | ||||||
|  | 		if (buttonLocations.containsKey(category)) { | ||||||
|  | 			buttonLocations.replace(category, buttonInformation); | ||||||
|  | 		} else { | ||||||
|  | 			buttonLocations.put(category, buttonInformation); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets button. | ||||||
|  | 	 * | ||||||
|  | 	 * @param category the category | ||||||
|  | 	 * @return the button | ||||||
|  | 	 */ | ||||||
|  | 	public ButtonInformation getButton(String category) { | ||||||
|  | 		if (buttonLocations.containsKey(category)) { | ||||||
|  | 			return buttonLocations.get(category); | ||||||
|  | 		} | ||||||
|  | 		System.out.println("Could not find button of category " + category); | ||||||
|  | 		return null; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
							
								
								
									
										11
									
								
								remappedSrc/pm/j4/petroleum/util/config/ServerConfig.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								remappedSrc/pm/j4/petroleum/util/config/ServerConfig.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,11 @@ | ||||||
|  | package pm.j4.petroleum.util.config; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Server config. | ||||||
|  |  */ | ||||||
|  | public class ServerConfig extends Config { | ||||||
|  | 	/** | ||||||
|  | 	 * The Address. | ||||||
|  | 	 */ | ||||||
|  | 	public String address = ""; | ||||||
|  | } | ||||||
							
								
								
									
										32
									
								
								remappedSrc/pm/j4/petroleum/util/data/ButtonInformation.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								remappedSrc/pm/j4/petroleum/util/data/ButtonInformation.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,32 @@ | ||||||
|  | package pm.j4.petroleum.util.data; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Button information. | ||||||
|  |  */ | ||||||
|  | public class ButtonInformation { | ||||||
|  | 	/** | ||||||
|  | 	 * The X. | ||||||
|  | 	 */ | ||||||
|  | 	public double x; | ||||||
|  | 	/** | ||||||
|  | 	 * The Y. | ||||||
|  | 	 */ | ||||||
|  | 	public double y; | ||||||
|  | 	/** | ||||||
|  | 	 * The Open. | ||||||
|  | 	 */ | ||||||
|  | 	public boolean open; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Button information. | ||||||
|  | 	 * | ||||||
|  | 	 * @param x    the x | ||||||
|  | 	 * @param y    the y | ||||||
|  | 	 * @param open the open | ||||||
|  | 	 */ | ||||||
|  | 	public ButtonInformation(double x, double y, boolean open) { | ||||||
|  | 		this.x = x; | ||||||
|  | 		this.y = y; | ||||||
|  | 		this.open = open; | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										47
									
								
								remappedSrc/pm/j4/petroleum/util/data/Category.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								remappedSrc/pm/j4/petroleum/util/data/Category.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,47 @@ | ||||||
|  | package pm.j4.petroleum.util.data; | ||||||
|  | 
 | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.HashMap; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
|  | import pm.j4.petroleum.PetroleumMod; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Category. | ||||||
|  |  */ | ||||||
|  | public class Category { | ||||||
|  | 	/** | ||||||
|  | 	 * Gets category map. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the category map | ||||||
|  | 	 */ | ||||||
|  | 	public static Map<String, List<ModuleBase>> getCategoryMap() { | ||||||
|  | 		List<ModuleBase> modules = PetroleumMod.getActiveMods(); | ||||||
|  | 		Map<String, List<ModuleBase>> categoryMap = new HashMap<>(); | ||||||
|  | 		modules.forEach(module -> { | ||||||
|  | 			if (!categoryMap.containsKey(module.getCategory())) { | ||||||
|  | 				List<ModuleBase> m = new ArrayList<>(); | ||||||
|  | 				m.add(module); | ||||||
|  | 				categoryMap.put(module.getCategory(), m); | ||||||
|  | 			} else { | ||||||
|  | 				List<ModuleBase> m = categoryMap.get(module.getCategory()); | ||||||
|  | 				List<ModuleBase> nm = new ArrayList<>(); | ||||||
|  | 				nm.addAll(m); | ||||||
|  | 				nm.add(module); | ||||||
|  | 				categoryMap.replace(module.getCategory(), nm); | ||||||
|  | 			} | ||||||
|  | 		}); | ||||||
|  | 		return categoryMap; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets by category. | ||||||
|  | 	 * | ||||||
|  | 	 * @param category the category | ||||||
|  | 	 * @return the by category | ||||||
|  | 	 */ | ||||||
|  | 	public static List<ModuleBase> getByCategory(String category) { | ||||||
|  | 		return getCategoryMap().containsKey(category) ? getCategoryMap().get(category) : new ArrayList<>(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										13
									
								
								remappedSrc/pm/j4/petroleum/util/data/ModuleConfig.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								remappedSrc/pm/j4/petroleum/util/data/ModuleConfig.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,13 @@ | ||||||
|  | package pm.j4.petroleum.util.data; | ||||||
|  | 
 | ||||||
|  | import java.util.Map; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Module config. | ||||||
|  |  */ | ||||||
|  | public class ModuleConfig { | ||||||
|  | 	/** | ||||||
|  | 	 * The Options. | ||||||
|  | 	 */ | ||||||
|  | 	public Map<String, OptionSerializiable> options; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,28 @@ | ||||||
|  | package pm.j4.petroleum.util.data; | ||||||
|  | 
 | ||||||
|  | import com.google.gson.JsonElement; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Option serializiable. | ||||||
|  |  */ | ||||||
|  | public class OptionSerializiable { | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Option serializiable. | ||||||
|  | 	 * | ||||||
|  | 	 * @param key   the key | ||||||
|  | 	 * @param value the value | ||||||
|  | 	 */ | ||||||
|  | 	public OptionSerializiable(String key, JsonElement value) { | ||||||
|  | 		this.value = value; | ||||||
|  | 		this.key = key; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Value. | ||||||
|  | 	 */ | ||||||
|  | 	public final JsonElement value; | ||||||
|  | 	/** | ||||||
|  | 	 * The Key. | ||||||
|  | 	 */ | ||||||
|  | 	public final String key; | ||||||
|  | } | ||||||
							
								
								
									
										229
									
								
								remappedSrc/pm/j4/petroleum/util/module/ModuleBase.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										229
									
								
								remappedSrc/pm/j4/petroleum/util/module/ModuleBase.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,229 @@ | ||||||
|  | package pm.j4.petroleum.util.module; | ||||||
|  | 
 | ||||||
|  | import com.google.gson.JsonElement; | ||||||
|  | import java.util.*; | ||||||
|  | import net.minecraft.client.MinecraftClient; | ||||||
|  | import net.minecraft.text.TranslatableText; | ||||||
|  | import pm.j4.petroleum.gui.PModuleConfigEntry; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigHolder; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigManager; | ||||||
|  | import pm.j4.petroleum.util.module.option.ConfigurationOption; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The Basis for all mods, used so that modules all have a common activation point and settings. | ||||||
|  |  */ | ||||||
|  | public abstract class ModuleBase { | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Module base. | ||||||
|  | 	 * Parameters should be constant across restarts. | ||||||
|  | 	 * | ||||||
|  | 	 * @param name          The name of the module | ||||||
|  | 	 * @param category      the category | ||||||
|  | 	 * @param activatable   Whether a module can be activated, or if it will remain in the state it was upon startup | ||||||
|  | 	 * @param hidden        Whether the module will show up in @link pm.j4.petroleum.modules.menu.ModMenu or the active module list | ||||||
|  | 	 * @param hasConfigMenu whether a button in the configuration menu will show | ||||||
|  | 	 */ | ||||||
|  | 	public ModuleBase(String name, String category, boolean activatable, boolean hidden, boolean hasConfigMenu) { | ||||||
|  | 		this.moduleName = name; | ||||||
|  | 		this.category = category; | ||||||
|  | 		this.readableName = new TranslatableText(name); | ||||||
|  | 		this.activatable = activatable; | ||||||
|  | 		this.hidden = hidden; | ||||||
|  | 		this.hasConfigMenu = hasConfigMenu; | ||||||
|  | 		this.moduleOptions = this.getDefaultConfig(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Init. | ||||||
|  | 	 */ | ||||||
|  | 	public void init() { | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Activate. Should be overridden. | ||||||
|  | 	 * | ||||||
|  | 	 * @param client the client | ||||||
|  | 	 */ | ||||||
|  | 	public void activate(MinecraftClient client) { | ||||||
|  | 		this.toggle(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Toggle mod. | ||||||
|  | 	 */ | ||||||
|  | 	public void toggle() { | ||||||
|  | 		Optional<ConfigHolder> config = ConfigManager.getConfig(); | ||||||
|  | 		config.ifPresent(configHolder -> configHolder.toggleModule(this.moduleName)); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Module's name. | ||||||
|  | 	 */ | ||||||
|  | 	private final String moduleName; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets module name. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the module name | ||||||
|  | 	 */ | ||||||
|  | 	public String getModuleName() { | ||||||
|  | 		return this.moduleName; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Category. | ||||||
|  | 	 */ | ||||||
|  | 	private final String category; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets category. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the category | ||||||
|  | 	 */ | ||||||
|  | 	public String getCategory() { | ||||||
|  | 		return this.category; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Readable name. | ||||||
|  | 	 */ | ||||||
|  | 	private final TranslatableText readableName; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets readable name. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the readable name | ||||||
|  | 	 */ | ||||||
|  | 	public TranslatableText getReadableName() { | ||||||
|  | 		return this.readableName; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Activatable. | ||||||
|  | 	 */ | ||||||
|  | 	private final boolean activatable; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Is activatable boolean. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the boolean | ||||||
|  | 	 */ | ||||||
|  | 	public boolean isActivatable() { | ||||||
|  | 		return activatable; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Hidden. | ||||||
|  | 	 */ | ||||||
|  | 	private final boolean hidden; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Is hidden boolean. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the boolean | ||||||
|  | 	 */ | ||||||
|  | 	public boolean isHidden() { | ||||||
|  | 		return hidden; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Has config menu. | ||||||
|  | 	 */ | ||||||
|  | 	private final boolean hasConfigMenu; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Configurable boolean. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the boolean | ||||||
|  | 	 */ | ||||||
|  | 	public boolean configurable() { | ||||||
|  | 		return hasConfigMenu; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Module options. | ||||||
|  | 	 */ | ||||||
|  | 	private final Map<String, ConfigurationOption> moduleOptions; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets module configuration. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the module configuration | ||||||
|  | 	 */ | ||||||
|  | 	public Map<String, ConfigurationOption> getModuleConfiguration() { | ||||||
|  | 		return moduleOptions; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Sets config option. | ||||||
|  | 	 * This will fail if the option is not already present in a module. | ||||||
|  | 	 * <p> | ||||||
|  | 	 * | ||||||
|  | 	 * @param key   the key | ||||||
|  | 	 * @param value the value | ||||||
|  | 	 * @return whether the operation was successful. | ||||||
|  | 	 */ | ||||||
|  | 	public boolean setConfigOption(String key, JsonElement value) { | ||||||
|  | 		if (moduleOptions.containsKey(key)) { | ||||||
|  | 			moduleOptions.get(key).fromJson(value); | ||||||
|  | 			return true; | ||||||
|  | 		} | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Has option boolean. | ||||||
|  | 	 * | ||||||
|  | 	 * @param key the key | ||||||
|  | 	 * @return the boolean | ||||||
|  | 	 */ | ||||||
|  | 	public boolean hasOption(String key) { | ||||||
|  | 		return moduleOptions.containsKey(key); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets default config. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the default config | ||||||
|  | 	 */ | ||||||
|  | 	protected Map<String, ConfigurationOption> getDefaultConfig() { | ||||||
|  | 		return new HashMap<>(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets config option. | ||||||
|  | 	 * | ||||||
|  | 	 * @param key the key | ||||||
|  | 	 * @return the config option | ||||||
|  | 	 */ | ||||||
|  | 	public Optional<ConfigurationOption> getConfigOption(String key) { | ||||||
|  | 		if (moduleOptions.containsKey(key)) { | ||||||
|  | 			return Optional.of(moduleOptions.get(key)); | ||||||
|  | 		} | ||||||
|  | 		return Optional.empty(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets config entries. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the config entries | ||||||
|  | 	 */ | ||||||
|  | 	public List<PModuleConfigEntry> getConfigEntries() { | ||||||
|  | 		List<PModuleConfigEntry> entries = new ArrayList<>(); | ||||||
|  | 		this.getModuleConfiguration().forEach((name, option) -> entries.add(new PModuleConfigEntry(option, new TranslatableText(name)))); | ||||||
|  | 		return entries; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Equals boolean. | ||||||
|  | 	 * | ||||||
|  | 	 * @param other the other | ||||||
|  | 	 * @return the boolean | ||||||
|  | 	 */ | ||||||
|  | 	public boolean equals(ModuleBase other) { | ||||||
|  | 		return Objects.equals(this.moduleName, other.getModuleName()); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,38 @@ | ||||||
|  | package pm.j4.petroleum.util.module.option; | ||||||
|  | 
 | ||||||
|  | import com.google.gson.JsonElement; | ||||||
|  | import com.google.gson.JsonPrimitive; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Boolean value. | ||||||
|  |  */ | ||||||
|  | public class BooleanOption extends ConfigurationOption { | ||||||
|  | 	/** | ||||||
|  | 	 * The Value. | ||||||
|  | 	 */ | ||||||
|  | 	private boolean value; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Boolean option. | ||||||
|  | 	 * | ||||||
|  | 	 * @param description the description | ||||||
|  | 	 */ | ||||||
|  | 	public BooleanOption(String description) { | ||||||
|  | 		super(description); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public String getStringValue() { | ||||||
|  | 		return Boolean.toString(value); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void fromJson(JsonElement e) { | ||||||
|  | 		this.value = e.getAsBoolean(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public JsonElement toJson() { | ||||||
|  | 		return new JsonPrimitive(value); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,59 @@ | ||||||
|  | package pm.j4.petroleum.util.module.option; | ||||||
|  | 
 | ||||||
|  | import com.google.gson.JsonElement; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Configuration option. | ||||||
|  |  */ | ||||||
|  | public abstract class ConfigurationOption { | ||||||
|  | 	/** | ||||||
|  | 	 * The Description. | ||||||
|  | 	 */ | ||||||
|  | 	private final String description; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Configuration option. | ||||||
|  | 	 * | ||||||
|  | 	 * @param description the description | ||||||
|  | 	 */ | ||||||
|  | 	protected ConfigurationOption(String description) { | ||||||
|  | 		this.description = description; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets description. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the description | ||||||
|  | 	 */ | ||||||
|  | 	public final String getDescription() { | ||||||
|  | 		return this.description; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets string value. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the string value | ||||||
|  | 	 */ | ||||||
|  | 	public abstract String getStringValue(); | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * From json. | ||||||
|  | 	 * | ||||||
|  | 	 * @param e the e | ||||||
|  | 	 */ | ||||||
|  | 	public abstract void fromJson(JsonElement e); | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * To json json element. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the json element | ||||||
|  | 	 */ | ||||||
|  | 	public abstract JsonElement toJson(); | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Update. | ||||||
|  | 	 */ | ||||||
|  | 	public void update() { | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,38 @@ | ||||||
|  | package pm.j4.petroleum.util.module.option; | ||||||
|  | 
 | ||||||
|  | import com.google.gson.JsonElement; | ||||||
|  | import com.google.gson.JsonPrimitive; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Integer value. | ||||||
|  |  */ | ||||||
|  | public class IntegerOption extends ConfigurationOption { | ||||||
|  | 	/** | ||||||
|  | 	 * The Value. | ||||||
|  | 	 */ | ||||||
|  | 	private int value; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Integer option. | ||||||
|  | 	 * | ||||||
|  | 	 * @param description the description | ||||||
|  | 	 */ | ||||||
|  | 	protected IntegerOption(String description) { | ||||||
|  | 		super(description); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public String getStringValue() { | ||||||
|  | 		return Integer.toString(value); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void fromJson(JsonElement e) { | ||||||
|  | 		this.value = e.getAsInt(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public JsonElement toJson() { | ||||||
|  | 		return new JsonPrimitive(value); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,60 @@ | ||||||
|  | package pm.j4.petroleum.util.module.option; | ||||||
|  | 
 | ||||||
|  | import com.google.gson.JsonElement; | ||||||
|  | import net.minecraft.client.options.KeyBinding; | ||||||
|  | import pm.j4.petroleum.modules.bindings.BindingInfo; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigManager; | ||||||
|  | import pm.j4.petroleum.util.config.GlobalConfig; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Keybind value. | ||||||
|  |  */ | ||||||
|  | public class KeybindOption extends ConfigurationOption { | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Value. | ||||||
|  | 	 */ | ||||||
|  | 	private KeyBinding value; | ||||||
|  | 	/** | ||||||
|  | 	 * The Converted value. | ||||||
|  | 	 */ | ||||||
|  | 	private BindingInfo convertedValue; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Keybind option. | ||||||
|  | 	 * | ||||||
|  | 	 * @param description the description | ||||||
|  | 	 */ | ||||||
|  | 	public KeybindOption(String description) { | ||||||
|  | 		super(description); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public String getStringValue() { | ||||||
|  | 		return value.getDefaultKey().getLocalizedText().getString(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void fromJson(JsonElement e) { | ||||||
|  | 		BindingInfo bindingInfo = ConfigManager.deserializeElement(e, BindingInfo.class); | ||||||
|  | 		this.convertedValue = bindingInfo; | ||||||
|  | 		this.value = GlobalConfig.reconstructBinding(bindingInfo); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public JsonElement toJson() { | ||||||
|  | 		return null; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * From keybind. | ||||||
|  | 	 * | ||||||
|  | 	 * @param bind the bind | ||||||
|  | 	 * @param base the base | ||||||
|  | 	 */ | ||||||
|  | 	public void fromKeybind(KeyBinding bind, ModuleBase base) { | ||||||
|  | 		this.value = bind; | ||||||
|  | 		this.convertedValue = GlobalConfig.extractBinding(bind, base); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,32 @@ | ||||||
|  | package pm.j4.petroleum.util.module.option; | ||||||
|  | 
 | ||||||
|  | import com.google.gson.JsonElement; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type List option. | ||||||
|  |  */ | ||||||
|  | public class ListOption extends ConfigurationOption { | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new List option. | ||||||
|  | 	 * | ||||||
|  | 	 * @param description the description | ||||||
|  | 	 */ | ||||||
|  | 	protected ListOption(String description) { | ||||||
|  | 		super(description); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public String getStringValue() { | ||||||
|  | 		return "ListObject"; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void fromJson(JsonElement e) { | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public JsonElement toJson() { | ||||||
|  | 		return null; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,38 @@ | ||||||
|  | package pm.j4.petroleum.util.module.option; | ||||||
|  | 
 | ||||||
|  | import com.google.gson.JsonElement; | ||||||
|  | import com.google.gson.JsonPrimitive; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type String value. | ||||||
|  |  */ | ||||||
|  | public class StringOption extends ConfigurationOption { | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Value. | ||||||
|  | 	 */ | ||||||
|  | 	private String value; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new String option. | ||||||
|  | 	 * | ||||||
|  | 	 * @param description the description | ||||||
|  | 	 */ | ||||||
|  | 	protected StringOption(String description) { | ||||||
|  | 		super(description); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public String getStringValue() { | ||||||
|  | 		return value; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void fromJson(JsonElement e) { | ||||||
|  | 		this.value = e.getAsString(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public JsonElement toJson() { | ||||||
|  | 		return new JsonPrimitive(value); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										10
									
								
								settings.gradle
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								settings.gradle
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,10 @@ | ||||||
|  | pluginManagement { | ||||||
|  |     repositories { | ||||||
|  |         jcenter() | ||||||
|  |         maven { | ||||||
|  |             name = 'Fabric' | ||||||
|  |             url = 'https://maven.fabricmc.net/' | ||||||
|  |         } | ||||||
|  |         gradlePluginPortal() | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										168
									
								
								src/main/java/pm/j4/petroleum/PetroleumMod.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								src/main/java/pm/j4/petroleum/PetroleumMod.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,168 @@ | ||||||
|  | package pm.j4.petroleum; | ||||||
|  | 
 | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.Arrays; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Optional; | ||||||
|  | import net.fabricmc.api.ModInitializer; | ||||||
|  | import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; | ||||||
|  | import net.fabricmc.loader.api.FabricLoader; | ||||||
|  | import net.fabricmc.loader.api.ModContainer; | ||||||
|  | import net.fabricmc.loader.api.metadata.ModMetadata; | ||||||
|  | import net.minecraft.client.MinecraftClient; | ||||||
|  | import net.minecraft.client.options.KeyBinding; | ||||||
|  | import net.minecraft.server.integrated.IntegratedServer; | ||||||
|  | import pm.j4.petroleum.modules.ExampleModule; | ||||||
|  | import pm.j4.petroleum.modules.bindings.BindingManager; | ||||||
|  | import pm.j4.petroleum.modules.list.ModList; | ||||||
|  | import pm.j4.petroleum.modules.menu.ModMenu; | ||||||
|  | import pm.j4.petroleum.modules.splash.SplashText; | ||||||
|  | import pm.j4.petroleum.modules.xray.Xray; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigHolder; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigManager; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | //TODO: | ||||||
|  | // petroleum module checklist | ||||||
|  | // [ ] xray (lol) | ||||||
|  | // [ ] combat stuff. killaura, anti knockback, etc | ||||||
|  | // [ ] render stuff. tracers, nametags | ||||||
|  | // [ ] wurst taco. but a fish | ||||||
|  | // [ ] elytra fly | ||||||
|  | // [ ] movement stuff. nofall, jesus, speed | ||||||
|  | // [ ] elytra bhop | ||||||
|  | // [ ] boatfly | ||||||
|  | // [ ] anti anti cheat | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Petroleum mod. | ||||||
|  |  */ | ||||||
|  | public class PetroleumMod implements ModInitializer { | ||||||
|  | 	/** | ||||||
|  | 	 * The Mod data. | ||||||
|  | 	 */ | ||||||
|  | 	public static ModMetadata modData = null; | ||||||
|  | 	/** | ||||||
|  | 	 * The constant client. | ||||||
|  | 	 */ | ||||||
|  | 	private static MinecraftClient client; | ||||||
|  | 	/** | ||||||
|  | 	 * The constant activeMods. | ||||||
|  | 	 */ | ||||||
|  | 	private static final List<ModuleBase> activeMods = Arrays.asList( | ||||||
|  | 			new SplashText(), | ||||||
|  | 			new ModMenu(), | ||||||
|  | 			new ModList(), | ||||||
|  | 			new BindingManager(), | ||||||
|  | 			new ExampleModule(), | ||||||
|  | 			new Xray() | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Is active boolean. | ||||||
|  | 	 * | ||||||
|  | 	 * @param modName the mod name | ||||||
|  | 	 * @return the boolean | ||||||
|  | 	 */ | ||||||
|  | 	public static boolean isActive(String modName) { | ||||||
|  | 		return activeMods.stream().anyMatch(mod -> mod.getModuleName().equals(modName)); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets mod. | ||||||
|  | 	 * | ||||||
|  | 	 * @param modName the mod name | ||||||
|  | 	 * @return the mod | ||||||
|  | 	 */ | ||||||
|  | 	public static Optional<ModuleBase> getMod(String modName) { | ||||||
|  | 		return activeMods.stream().filter(mod -> mod.getModuleName().equals(modName)).findFirst(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets active mods. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the active mods | ||||||
|  | 	 */ | ||||||
|  | 	public static List<ModuleBase> getActiveMods() { | ||||||
|  | 		return activeMods; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The constant registeredBinds. | ||||||
|  | 	 */ | ||||||
|  | 	private static final List<KeyBinding> registeredBinds = new ArrayList<>(); | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Add bind. | ||||||
|  | 	 * | ||||||
|  | 	 * @param b the b | ||||||
|  | 	 */ | ||||||
|  | 	public static void addBind(KeyBinding b) { | ||||||
|  | 		registeredBinds.add(b); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Remove bind. | ||||||
|  | 	 * | ||||||
|  | 	 * @param b the b | ||||||
|  | 	 */ | ||||||
|  | 	public static void removeBind(KeyBinding b) { | ||||||
|  | 		registeredBinds.remove(b); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets active keybinds. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the active keybinds | ||||||
|  | 	 */ | ||||||
|  | 	public static List<KeyBinding> getActiveKeybinds() { | ||||||
|  | 		return registeredBinds; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets server address. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the server address | ||||||
|  | 	 */ | ||||||
|  | 	public static String getServerAddress() { | ||||||
|  | 		if (client != null && client.getServer() != null) { | ||||||
|  | 			IntegratedServer server = client.getServer(); | ||||||
|  | 			if (!server.isRemote()) { | ||||||
|  | 				return "localhost"; | ||||||
|  | 			} | ||||||
|  | 			if (server.isRemote() && !server.getServerIp().isEmpty()) { | ||||||
|  | 				return server.getServerIp(); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return null; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void onInitialize() { | ||||||
|  | 
 | ||||||
|  | 		ConfigManager.initConfig(); | ||||||
|  | 
 | ||||||
|  | 		// always update mod data | ||||||
|  | 		Optional<ModContainer> modContainer = FabricLoader.getInstance().getModContainer("petroleum"); | ||||||
|  | 		modContainer.ifPresent(container -> modData = container.getMetadata()); | ||||||
|  | 
 | ||||||
|  | 		Optional<ConfigHolder> conf = ConfigManager.getConfig(); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 		//initialize any keybinds, data, etc. | ||||||
|  | 		activeMods.forEach(ModuleBase::init); | ||||||
|  | 
 | ||||||
|  | 		//initialize keybind handler | ||||||
|  | 		conf.ifPresent(configHolder -> ClientTickEvents.END_CLIENT_TICK.register(client -> { | ||||||
|  | 			if (PetroleumMod.client != client) { | ||||||
|  | 				PetroleumMod.client = client; | ||||||
|  | 			} | ||||||
|  | 			for (KeyBinding b : PetroleumMod.getActiveKeybinds()) { | ||||||
|  | 				while (b.wasPressed()) { | ||||||
|  | 					configHolder.globalConfig.bindings.get(b).activate(client); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		})); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										69
									
								
								src/main/java/pm/j4/petroleum/gui/PModMenuScreen.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								src/main/java/pm/j4/petroleum/gui/PModMenuScreen.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,69 @@ | ||||||
|  | package pm.j4.petroleum.gui; | ||||||
|  | 
 | ||||||
|  | import com.mojang.blaze3d.systems.RenderSystem; | ||||||
|  | import java.util.Map; | ||||||
|  | import net.minecraft.client.gui.screen.Screen; | ||||||
|  | import net.minecraft.client.render.BufferBuilder; | ||||||
|  | import net.minecraft.client.render.Tessellator; | ||||||
|  | import net.minecraft.client.render.VertexFormats; | ||||||
|  | import net.minecraft.client.util.math.MatrixStack; | ||||||
|  | import net.minecraft.text.TranslatableText; | ||||||
|  | import pm.j4.petroleum.modules.menu.ModMenu; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigManager; | ||||||
|  | import pm.j4.petroleum.util.data.ButtonInformation; | ||||||
|  | import pm.j4.petroleum.util.data.Category; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type P mod menu screen. | ||||||
|  |  */ | ||||||
|  | public class PModMenuScreen extends Screen { | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new P mod menu screen. | ||||||
|  | 	 */ | ||||||
|  | 	public PModMenuScreen() { | ||||||
|  | 		super(new TranslatableText("petroleum.modmenu")); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { | ||||||
|  | 		this.renderBackground(matrices); | ||||||
|  | 		super.render(matrices, mouseX, mouseY, delta); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	protected void init() { | ||||||
|  | 		Map<String, ButtonInformation> coordinateMap = ModMenu.getButtons(); | ||||||
|  | 		coordinateMap.forEach((category, coord) -> { | ||||||
|  | 			this.addButton(new PMovableButton((int) (coord.x * this.width), | ||||||
|  | 					(int) (coord.y * this.height), | ||||||
|  | 					category, | ||||||
|  | 					Category.getByCategory(category), | ||||||
|  | 					coord.open, | ||||||
|  | 					this)); | ||||||
|  | 		}); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void onClose() { | ||||||
|  | 		if (ConfigManager.getConfig().isPresent()) { | ||||||
|  | 			ConfigManager.getConfig().get().disableModule("petroleum.modmenu"); | ||||||
|  | 			this.buttons.forEach(button -> ((PMovableButton) button).updateCoordinate()); | ||||||
|  | 			ConfigManager.saveGlobalConfig(); | ||||||
|  | 		} | ||||||
|  | 		super.onClose(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void renderBackground(MatrixStack matrices) { | ||||||
|  | 		Tessellator t_1 = Tessellator.getInstance(); | ||||||
|  | 		BufferBuilder buffer = t_1.getBuffer(); | ||||||
|  | 		RenderSystem.enableBlend(); | ||||||
|  | 		buffer.begin(7, VertexFormats.POSITION_COLOR); | ||||||
|  | 		buffer.vertex(0, this.height, 0.0D).color(0.1F, 0.1F, 0.1F, 0.3F).next(); | ||||||
|  | 		buffer.vertex(this.width, this.height, 0.0D).color(0.1F, 0.1F, 0.1F, 0.3F).next(); | ||||||
|  | 		buffer.vertex(this.width, 0, 0.0D).color(0.1F, 0.1F, 0.1F, 0.3F).next(); | ||||||
|  | 		buffer.vertex(0, 0, 0.0D).color(0.1F, 0.1F, 0.1F, 0.3F).next(); | ||||||
|  | 		t_1.draw(); | ||||||
|  | 		RenderSystem.disableBlend(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										194
									
								
								src/main/java/pm/j4/petroleum/gui/PModuleConfigEntry.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										194
									
								
								src/main/java/pm/j4/petroleum/gui/PModuleConfigEntry.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,194 @@ | ||||||
|  | package pm.j4.petroleum.gui; | ||||||
|  | 
 | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Optional; | ||||||
|  | import net.minecraft.client.MinecraftClient; | ||||||
|  | import net.minecraft.client.gui.Element; | ||||||
|  | import net.minecraft.client.gui.widget.AbstractButtonWidget; | ||||||
|  | import net.minecraft.client.gui.widget.ButtonWidget; | ||||||
|  | import net.minecraft.client.gui.widget.ElementListWidget; | ||||||
|  | import net.minecraft.client.options.KeyBinding; | ||||||
|  | import net.minecraft.client.util.math.MatrixStack; | ||||||
|  | import net.minecraft.text.LiteralText; | ||||||
|  | import net.minecraft.text.Text; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigHolder; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigManager; | ||||||
|  | import pm.j4.petroleum.util.module.option.BooleanOption; | ||||||
|  | import pm.j4.petroleum.util.module.option.ConfigurationOption; | ||||||
|  | import pm.j4.petroleum.util.module.option.KeybindOption; | ||||||
|  | import pm.j4.petroleum.util.module.option.ListOption; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type P module config entry. | ||||||
|  |  */ | ||||||
|  | public class PModuleConfigEntry extends ElementListWidget.Entry<PModuleConfigEntry> { | ||||||
|  | 	/** | ||||||
|  | 	 * The Option. | ||||||
|  | 	 */ | ||||||
|  | 	protected ConfigurationOption option; | ||||||
|  | 	/** | ||||||
|  | 	 * The Display text. | ||||||
|  | 	 */ | ||||||
|  | 	protected final Text displayText; | ||||||
|  | 
 | ||||||
|  | 	private PModuleConfigPane parent; | ||||||
|  | 
 | ||||||
|  | 	private List<Element> elements = new ArrayList<>(); | ||||||
|  | 
 | ||||||
|  | 	private String trueValue; | ||||||
|  | 	private String falseValue; | ||||||
|  | 
 | ||||||
|  | 	private Element selected; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new P module config entry. | ||||||
|  | 	 * | ||||||
|  | 	 * @param option the option | ||||||
|  | 	 * @param text   the text | ||||||
|  | 	 */ | ||||||
|  | 	public PModuleConfigEntry(ConfigurationOption option, Text text, PModuleConfigPane parent) { | ||||||
|  | 		this.option = option; | ||||||
|  | 		this.displayText = text; | ||||||
|  | 		this.parent = parent; | ||||||
|  | 		this.trueValue = "Yes"; | ||||||
|  | 		this.falseValue = "No"; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public PModuleConfigEntry(ConfigurationOption option, Text text, PModuleConfigPane parent, String trueValue, String falseValue) { | ||||||
|  | 		this.option = option; | ||||||
|  | 		this.displayText = text; | ||||||
|  | 		this.parent = parent; | ||||||
|  | 		this.trueValue = trueValue; | ||||||
|  | 		this.falseValue = falseValue; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public List<? extends Element> children() { | ||||||
|  | 		return elements; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public boolean mouseClicked(double mouseX, double mouseY, int button) { | ||||||
|  | 		if (this.isMouseOver(mouseX, mouseY)) { | ||||||
|  | 			this.parent.setSelected(this); | ||||||
|  | 			System.out.println(displayText.getString() + " clicked"); | ||||||
|  | 			String className = option.getClass().toString(); | ||||||
|  | 			elements.forEach((widget) -> { | ||||||
|  | 				if (widget.mouseClicked(mouseX, mouseY, button)) { | ||||||
|  | 					System.out.println("Button clicked"); | ||||||
|  | 					selected = widget; | ||||||
|  | 				} | ||||||
|  | 			}); | ||||||
|  | 			return true; | ||||||
|  | 		} | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public boolean mouseReleased(double mouseX, double mouseY, int button) { | ||||||
|  | 		return this.isMouseOver(mouseX, mouseY); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public boolean keyPressed(int keyCode, int scanCode, int modifiers) { | ||||||
|  | 		if(this.selected != null) { | ||||||
|  | 			return this.selected.keyPressed(keyCode, scanCode, modifiers); | ||||||
|  | 		} | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public boolean keyReleased(int keyCode, int scanCode, int modifiers) { | ||||||
|  | 		if(this.selected != null) { | ||||||
|  | 			return this.selected.keyReleased(keyCode, scanCode, modifiers); | ||||||
|  | 		} | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void render(MatrixStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { | ||||||
|  | 		if (this.displayText != null) { | ||||||
|  | 			MinecraftClient.getInstance().textRenderer.drawWithShadow(matrices, displayText, x, y, 0xAAAAAA); | ||||||
|  | 		} | ||||||
|  | 		System.out.println(option); | ||||||
|  | 		if (this.option != null) { | ||||||
|  | 			//TODO option text box (?) | ||||||
|  | 			// option should be centered or otherwise offset | ||||||
|  | 			// but not extend past the side of the pane | ||||||
|  | 			int fontHeight = MinecraftClient.getInstance().textRenderer.fontHeight; | ||||||
|  | 			//TODO use TranslatableText instead of LiteralText | ||||||
|  | 			MinecraftClient.getInstance().textRenderer.drawWithShadow(matrices, new LiteralText(option.getDescription() + " " + option.getStringValue()), x, y + fontHeight + 4, 0xFFFFFF); | ||||||
|  | 
 | ||||||
|  | 			System.out.println(elements.size()); | ||||||
|  | 			if(elements.size() == 0) { | ||||||
|  | 				String className = option.getClass().toString(); | ||||||
|  | 				System.out.println(className); | ||||||
|  | 				if (className.equals(BooleanOption.class.toString())) { | ||||||
|  | 					System.out.println("boolean"); | ||||||
|  | 					elements.add(new ButtonWidget(x, y + (int)(fontHeight * 2.5), | ||||||
|  | 							entryWidth, | ||||||
|  | 							fontHeight * 2, | ||||||
|  | 							new LiteralText(((BooleanOption)option).getValue() ? this.trueValue : this.falseValue), (button) -> { | ||||||
|  | 						button.setMessage(new LiteralText((!((BooleanOption)option).getValue()) ? this.trueValue : this.falseValue)); | ||||||
|  | 						BooleanOption newValue = new BooleanOption(option.getConfigKey(), option.getDescription(), option.getParent()); | ||||||
|  | 						newValue.setValue((!((BooleanOption)option).getValue())); | ||||||
|  | 						option.getParent().updateConfigOption(newValue.getConfigKey(), newValue); | ||||||
|  | 						this.option = newValue; | ||||||
|  | 					})); | ||||||
|  | 				} | ||||||
|  | 				else if (className.equals(ListOption.class.toString())) { | ||||||
|  | 					// TODO: determine whether list options are viable, | ||||||
|  | 					//  considering that it would be easier to split lists into multiple PModuleConfigEntries | ||||||
|  | 					System.out.println("list"); | ||||||
|  | 				} | ||||||
|  | 				else if (className.equals(KeybindOption.class.toString())) { | ||||||
|  | 					System.out.println("keybind"); | ||||||
|  | 					ButtonWidget bindButton = new ButtonWidget(x, y + (int)(fontHeight * 2.5), | ||||||
|  | 							entryWidth, | ||||||
|  | 							fontHeight * 2, | ||||||
|  | 							new LiteralText(option.getStringValue().toUpperCase()), (button) -> { | ||||||
|  | 						button.setMessage(new LiteralText("Press any key...")); | ||||||
|  | 					}) { | ||||||
|  | 						@Override | ||||||
|  | 						public boolean keyPressed(int keyCode, int scanCode, int modifiers) { | ||||||
|  | 							if (this.active && this.visible) { | ||||||
|  | 								//TODO | ||||||
|  | 								if (keyCode != 257 && keyCode != 32 && keyCode != 335) { | ||||||
|  | 									KeybindOption newValue = new KeybindOption(option.getConfigKey(), option.getDescription(), option.getParent()); | ||||||
|  | 									KeyBinding bind = new KeyBinding(((KeybindOption)option).getTranslationKey(), keyCode, "category.petroleum"); | ||||||
|  | 									newValue.fromKeybind(bind, option.getParent()); | ||||||
|  | 									Optional<ConfigHolder> config = ConfigManager.getConfig(); | ||||||
|  | 									assert config.isPresent(); | ||||||
|  | 									config.get().globalConfig.setBinding(bind, option.getParent()); | ||||||
|  | 									option = newValue; | ||||||
|  | 									this.setMessage(new LiteralText(option.getStringValue().toUpperCase())); | ||||||
|  | 									selected = null; | ||||||
|  | 									return false; | ||||||
|  | 								} else { | ||||||
|  | 									this.playDownSound(MinecraftClient.getInstance().getSoundManager()); | ||||||
|  | 									this.onPress(); | ||||||
|  | 									return true; | ||||||
|  | 								} | ||||||
|  | 							} else { | ||||||
|  | 								return false; | ||||||
|  | 							} | ||||||
|  | 						} | ||||||
|  | 					}; | ||||||
|  | 					elements.add(bindButton); | ||||||
|  | 				} | ||||||
|  | 				else { | ||||||
|  | 					System.out.println("other/string"); | ||||||
|  | 					//TODO | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			else { | ||||||
|  | 				elements.forEach((widget) -> { | ||||||
|  | 					if (widget instanceof AbstractButtonWidget) { | ||||||
|  | 						((AbstractButtonWidget)widget).render(matrices, mouseX, mouseY, tickDelta); | ||||||
|  | 					} | ||||||
|  | 				}); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										120
									
								
								src/main/java/pm/j4/petroleum/gui/PModuleConfigPane.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								src/main/java/pm/j4/petroleum/gui/PModuleConfigPane.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,120 @@ | ||||||
|  | package pm.j4.petroleum.gui; | ||||||
|  | 
 | ||||||
|  | import com.mojang.blaze3d.platform.GlStateManager; | ||||||
|  | import com.mojang.blaze3d.systems.RenderSystem; | ||||||
|  | import net.minecraft.client.MinecraftClient; | ||||||
|  | import net.minecraft.client.font.TextRenderer; | ||||||
|  | import net.minecraft.client.gui.widget.ElementListWidget; | ||||||
|  | import net.minecraft.client.gui.widget.EntryListWidget; | ||||||
|  | import net.minecraft.client.render.BufferBuilder; | ||||||
|  | import net.minecraft.client.render.Tessellator; | ||||||
|  | import net.minecraft.client.render.VertexFormats; | ||||||
|  | import net.minecraft.client.util.math.MatrixStack; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type P module config pane. | ||||||
|  |  */ | ||||||
|  | public class PModuleConfigPane extends ElementListWidget<PModuleConfigEntry> { | ||||||
|  | 	/** | ||||||
|  | 	 * The Parent. | ||||||
|  | 	 */ | ||||||
|  | 	private final POptionsScreen parent; | ||||||
|  | 	/** | ||||||
|  | 	 * The Last selected. | ||||||
|  | 	 */ | ||||||
|  | 	private POptionEntry lastSelected; | ||||||
|  | 
 | ||||||
|  | 	private PModuleConfigEntry selectedConfigEntry; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new P module config pane. | ||||||
|  | 	 * | ||||||
|  | 	 * @param client      the client | ||||||
|  | 	 * @param width       the width | ||||||
|  | 	 * @param height      the height | ||||||
|  | 	 * @param top         the top | ||||||
|  | 	 * @param bottom      the bottom | ||||||
|  | 	 * @param entryHeight the entry height | ||||||
|  | 	 * @param screen      the screen | ||||||
|  | 	 */ | ||||||
|  | 	public PModuleConfigPane(MinecraftClient client, int width, int height, int top, int bottom, int entryHeight, POptionsScreen screen) { | ||||||
|  | 		super(client, width, height, top, bottom, entryHeight); | ||||||
|  | 		this.parent = screen; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public void setSelected(PModuleConfigEntry entry) { | ||||||
|  | 		selectedConfigEntry = entry; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public PModuleConfigEntry getSelected() { | ||||||
|  | 		return selectedConfigEntry; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public int getRowWidth() { | ||||||
|  | 		return this.width - 10; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	protected int getScrollbarPositionX() { | ||||||
|  | 		return this.width - 6 + left; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { | ||||||
|  | 		POptionEntry selectedEntry = parent.getSelected(); | ||||||
|  | 		if (selectedEntry != lastSelected) { | ||||||
|  | 			lastSelected = selectedEntry; | ||||||
|  | 			clearEntries(); | ||||||
|  | 			setScrollAmount(-Double.MAX_VALUE); | ||||||
|  | 			String id = lastSelected.getModId(); | ||||||
|  | 			if (lastSelected != null && id != null && !id.isEmpty()) { | ||||||
|  | 				children().addAll(lastSelected.module.getConfigEntries(this)); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		Tessellator t_1 = Tessellator.getInstance(); | ||||||
|  | 		BufferBuilder buffer = t_1.getBuffer(); | ||||||
|  | 
 | ||||||
|  | 		RenderSystem.depthFunc(515); | ||||||
|  | 		RenderSystem.disableDepthTest(); | ||||||
|  | 		RenderSystem.enableBlend(); | ||||||
|  | 		RenderSystem.blendFuncSeparate(GlStateManager.SrcFactor.SRC_ALPHA, | ||||||
|  | 				GlStateManager.DstFactor.ONE_MINUS_DST_ALPHA, | ||||||
|  | 				GlStateManager.SrcFactor.ZERO, | ||||||
|  | 				GlStateManager.DstFactor.ONE); | ||||||
|  | 		RenderSystem.disableAlphaTest(); | ||||||
|  | 		RenderSystem.shadeModel(7425); | ||||||
|  | 		RenderSystem.disableTexture(); | ||||||
|  | 
 | ||||||
|  | 		// darken config pane area | ||||||
|  | 
 | ||||||
|  | 		buffer.begin(7, VertexFormats.POSITION_COLOR_TEXTURE); | ||||||
|  | 		buffer.vertex(this.left, (this.top + 4), 0.0D).color(0, 0, 0, 0).texture(0.0F, 1.0F).next(); | ||||||
|  | 		buffer.vertex(this.right, (this.top + 4), 0.0D).color(0, 0, 0, 0).texture(1.0F, 1.0F).next(); | ||||||
|  | 		buffer.vertex(this.right, this.top, 0.0D).color(0, 0, 0, 255).texture(1.0F, 0.0F).next(); | ||||||
|  | 		buffer.vertex(this.left, this.top, 0.0D).color(0, 0, 0, 255).texture(0.0F, 0.0F).next(); | ||||||
|  | 		buffer.vertex(this.left, this.bottom, 0.0D).color(0, 0, 0, 255).texture(0.0F, 1.0F).next(); | ||||||
|  | 		buffer.vertex(this.right, this.bottom, 0.0D).color(0, 0, 0, 255).texture(1.0F, 1.0F).next(); | ||||||
|  | 		buffer.vertex(this.right, (this.bottom - 4), 0.0D).color(0, 0, 0, 0).texture(1.0F, 0.0F).next(); | ||||||
|  | 		buffer.vertex(this.left, (this.bottom - 4), 0.0D).color(0, 0, 0, 0).texture(0.0F, 0.0F).next(); | ||||||
|  | 		t_1.draw(); | ||||||
|  | 
 | ||||||
|  | 		buffer.begin(7, VertexFormats.POSITION_COLOR); | ||||||
|  | 		buffer.vertex(this.left, this.bottom, 0.0D).color(0, 0, 0, 128).next(); | ||||||
|  | 		buffer.vertex(this.right, this.bottom, 0.0D).color(0, 0, 0, 128).next(); | ||||||
|  | 		buffer.vertex(this.right, this.top, 0.0D).color(0, 0, 0, 128).next(); | ||||||
|  | 		buffer.vertex(this.left, this.top, 0.0D).color(0, 0, 0, 128).next(); | ||||||
|  | 		t_1.draw(); | ||||||
|  | 
 | ||||||
|  | 		int rl = this.getRowLeft(); | ||||||
|  | 		int sc = this.top + 4 - (int) this.getScrollAmount(); | ||||||
|  | 		this.renderList(matrices, rl, sc, mouseX, mouseY, delta); | ||||||
|  | 
 | ||||||
|  | 		RenderSystem.enableTexture(); | ||||||
|  | 		RenderSystem.shadeModel(7424); | ||||||
|  | 		RenderSystem.enableAlphaTest(); | ||||||
|  | 		RenderSystem.disableBlend(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,281 @@ | ||||||
|  | package pm.j4.petroleum.gui; | ||||||
|  | 
 | ||||||
|  | import com.mojang.blaze3d.systems.RenderSystem; | ||||||
|  | import java.util.HashSet; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Objects; | ||||||
|  | import java.util.Set; | ||||||
|  | import net.minecraft.client.MinecraftClient; | ||||||
|  | import net.minecraft.client.gui.widget.AlwaysSelectedEntryListWidget; | ||||||
|  | import net.minecraft.client.render.BufferBuilder; | ||||||
|  | import net.minecraft.client.render.Tessellator; | ||||||
|  | import net.minecraft.client.render.VertexFormats; | ||||||
|  | import net.minecraft.client.util.math.MatrixStack; | ||||||
|  | import net.minecraft.util.math.MathHelper; | ||||||
|  | import net.minecraft.util.math.Matrix4f; | ||||||
|  | import pm.j4.petroleum.mixin.EntryListWidgetAccessor; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type P module configuration widget. | ||||||
|  |  */ | ||||||
|  | public class PModuleConfigurationWidget extends AlwaysSelectedEntryListWidget<POptionEntry> { | ||||||
|  | 	/** | ||||||
|  | 	 * The Parent. | ||||||
|  | 	 */ | ||||||
|  | 	private final POptionsScreen parent; | ||||||
|  | 	/** | ||||||
|  | 	 * The Module id. | ||||||
|  | 	 */ | ||||||
|  | 	private String moduleId = null; | ||||||
|  | 	/** | ||||||
|  | 	 * The Mods. | ||||||
|  | 	 */ | ||||||
|  | 	private List<ModuleBase> mods; | ||||||
|  | 	/** | ||||||
|  | 	 * The Extra mods. | ||||||
|  | 	 */ | ||||||
|  | 	private final Set<ModuleBase> extraMods = new HashSet<>(); | ||||||
|  | 	/** | ||||||
|  | 	 * The Scrolling. | ||||||
|  | 	 */ | ||||||
|  | 	private boolean scrolling = false; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new P module configuration widget. | ||||||
|  | 	 * | ||||||
|  | 	 * @param client      the client | ||||||
|  | 	 * @param width       the width | ||||||
|  | 	 * @param height      the height | ||||||
|  | 	 * @param y1          the y 1 | ||||||
|  | 	 * @param y2          the y 2 | ||||||
|  | 	 * @param entryHeight the entry height | ||||||
|  | 	 * @param list        the list | ||||||
|  | 	 * @param parent      the parent | ||||||
|  | 	 */ | ||||||
|  | 	public PModuleConfigurationWidget(MinecraftClient client, int width, int height, int y1, int y2, int entryHeight, PModuleConfigurationWidget list, POptionsScreen parent) { | ||||||
|  | 		super(client, width, height, y1, y2, entryHeight); | ||||||
|  | 		this.parent = parent; | ||||||
|  | 		if (list != null) { | ||||||
|  | 			mods = list.mods; | ||||||
|  | 		} | ||||||
|  | 		setScrollAmount(parent.getScrollPercent() * Math.max(0, this.getMaxPosition() - (this.bottom - this.top - 4))); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void setScrollAmount(double amount) { | ||||||
|  | 		super.setScrollAmount(amount); | ||||||
|  | 		int denominator = Math.max(0, this.getMaxPosition() - (this.bottom - this.top - 4)); | ||||||
|  | 		if (denominator <= 0) { | ||||||
|  | 			parent.updateScrollPercent(0); | ||||||
|  | 		} else { | ||||||
|  | 			parent.updateScrollPercent(getScrollAmount() / Math.max(0, this.getMaxPosition() - (this.bottom - this.top - 4))); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	protected boolean isFocused() { | ||||||
|  | 		return parent.getFocused() == this; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Select. | ||||||
|  | 	 * | ||||||
|  | 	 * @param entry the entry | ||||||
|  | 	 */ | ||||||
|  | 	public void select(POptionEntry entry) { | ||||||
|  | 		this.setSelected(entry); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void setSelected(POptionEntry entry) { | ||||||
|  | 		super.setSelected(entry); | ||||||
|  | 		moduleId = entry.getModId(); | ||||||
|  | 		parent.updateSelected(entry); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	protected boolean isSelectedItem(int index) { | ||||||
|  | 		return super.isSelectedItem(index); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public int addEntry(POptionEntry entry) { | ||||||
|  | 		if (extraMods.contains(entry.module)) { | ||||||
|  | 			return 0; | ||||||
|  | 		} | ||||||
|  | 		extraMods.add(entry.module); | ||||||
|  | 		int i = super.addEntry(entry); | ||||||
|  | 		if (entry.getModId().equals(moduleId)) { | ||||||
|  | 			setSelected(entry); | ||||||
|  | 		} | ||||||
|  | 		return i; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	protected boolean removeEntry(POptionEntry entry) { | ||||||
|  | 		extraMods.remove(entry.module); | ||||||
|  | 		return super.removeEntry(entry); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	protected POptionEntry remove(int index) { | ||||||
|  | 		extraMods.remove(getEntry(index).module); | ||||||
|  | 		return super.remove(index); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	protected void renderList(MatrixStack matrices, int x, int y, int mouseX, int mouseY, float delta) { | ||||||
|  | 		int itemCount = this.getItemCount(); | ||||||
|  | 		Tessellator t_1 = Tessellator.getInstance(); | ||||||
|  | 		BufferBuilder buffer = t_1.getBuffer(); | ||||||
|  | 
 | ||||||
|  | 		for (int index = 0; index < itemCount; ++index) { | ||||||
|  | 			int entryTop = this.getRowTop(index); | ||||||
|  | 			int entryBottom = this.getRowTop(index) + this.itemHeight; | ||||||
|  | 			if (entryBottom >= this.top && entryTop <= this.bottom) { | ||||||
|  | 				int entryHeight = this.itemHeight - 4; | ||||||
|  | 				POptionEntry entry = this.getEntry(index); | ||||||
|  | 				int rowWidth = this.getRowWidth(); | ||||||
|  | 				int entryLeft; | ||||||
|  | 				if (((EntryListWidgetAccessor) this).isRenderSelection() && this.isSelectedItem(index)) { | ||||||
|  | 					entryLeft = getRowLeft() - 2 + entry.getXOffset(); | ||||||
|  | 					int selectionRight = x + rowWidth + 2; | ||||||
|  | 					RenderSystem.disableTexture(); | ||||||
|  | 					float brightness = this.isFocused() ? 1.0F : 0.5F; | ||||||
|  | 					RenderSystem.color4f(brightness, brightness, brightness, 1.0F); | ||||||
|  | 					Matrix4f matrix = matrices.peek().getModel(); | ||||||
|  | 					buffer.begin(7, VertexFormats.POSITION); | ||||||
|  | 					buffer.vertex(matrix, entryLeft, entryTop + entryHeight + 2, 0.0F).next(); | ||||||
|  | 					buffer.vertex(matrix, selectionRight, entryTop + entryHeight + 2, 0.0F).next(); | ||||||
|  | 					buffer.vertex(matrix, selectionRight, entryTop - 2, 0.0F).next(); | ||||||
|  | 					buffer.vertex(matrix, entryLeft, entryTop - 2, 0.0F).next(); | ||||||
|  | 					t_1.draw(); | ||||||
|  | 					RenderSystem.color4f(0.0F, 0.0F, 0.0F, 1.0F); | ||||||
|  | 					buffer.begin(7, VertexFormats.POSITION); | ||||||
|  | 					buffer.vertex(matrix, entryLeft + 1, entryTop + entryHeight + 1, 0.0F).next(); | ||||||
|  | 					buffer.vertex(matrix, selectionRight, entryTop + entryHeight + 1, 0.0F).next(); | ||||||
|  | 					buffer.vertex(matrix, selectionRight, entryTop - 1, 0.0F).next(); | ||||||
|  | 					buffer.vertex(matrix, entryLeft + 1, entryTop - 1, 0.0F).next(); | ||||||
|  | 					t_1.draw(); | ||||||
|  | 					RenderSystem.enableTexture(); | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				entryLeft = this.getRowLeft(); | ||||||
|  | 				entry.render(matrices, | ||||||
|  | 						index, | ||||||
|  | 						entryTop, | ||||||
|  | 						entryLeft, | ||||||
|  | 						rowWidth, | ||||||
|  | 						entryHeight, | ||||||
|  | 						mouseX, | ||||||
|  | 						mouseY, | ||||||
|  | 						this.isMouseOver(mouseX, mouseY) && Objects.equals(this.getEntryAtPos(mouseX, mouseY), entry), | ||||||
|  | 						delta); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	protected void updateScrollingState(double mouseX, double mouseY, int button) { | ||||||
|  | 		super.updateScrollingState(mouseX, mouseY, button); | ||||||
|  | 		this.scrolling = button == 0 && | ||||||
|  | 				mouseX >= (double) this.getScrollbarPositionX() && | ||||||
|  | 				mouseX < (double) (this.getScrollbarPositionX() + 6); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public boolean mouseClicked(double mouseX, double mouseY, int button) { | ||||||
|  | 		this.updateScrollingState(mouseX, mouseY, button); | ||||||
|  | 		if (!this.isMouseOver(mouseX, mouseY)) { | ||||||
|  | 			return false; | ||||||
|  | 		} else { | ||||||
|  | 			POptionEntry entry = this.getEntryAtPos(mouseX, mouseY); | ||||||
|  | 			if (entry != null) { | ||||||
|  | 				if (entry.mouseClicked(mouseX, mouseY, button)) { | ||||||
|  | 					this.setFocused(entry); | ||||||
|  | 					this.setDragging(true); | ||||||
|  | 					return true; | ||||||
|  | 				} else if (button == 0) { | ||||||
|  | 					this.clickedHeader((int) (mouseX - (double) (this.left + this.width / 2 - this.getRowWidth() / 2)), | ||||||
|  | 							(int) (mouseY - (double) this.top) + (int) this.getScrollAmount() - 4); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return this.scrolling; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets entry at pos. | ||||||
|  | 	 * | ||||||
|  | 	 * @param x the x | ||||||
|  | 	 * @param y the y | ||||||
|  | 	 * @return the entry at pos | ||||||
|  | 	 */ | ||||||
|  | 	public final POptionEntry getEntryAtPos(double x, double y) { | ||||||
|  | 		int i = MathHelper.floor(y - (double) this.top) - this.headerHeight + (int) this.getScrollAmount() - 4; | ||||||
|  | 		int index = i / this.itemHeight; | ||||||
|  | 		return x < (double) this.getScrollbarPositionX() && | ||||||
|  | 				x >= (double) getRowLeft() && | ||||||
|  | 				x <= (double) (getRowLeft() + getRowWidth()) && | ||||||
|  | 				index >= 0 && i >= 0 && | ||||||
|  | 				index < this.getItemCount() ? this.children().get(index) : null; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	protected int getScrollbarPositionX() { | ||||||
|  | 		return this.width - 6; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public int getRowWidth() { | ||||||
|  | 		return this.width - (Math.max(0, this.getMaxPosition() - (this.bottom - this.top - 4)) > 0 ? 18 : 12); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public int getRowLeft() { | ||||||
|  | 		return left + 6; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets width. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the width | ||||||
|  | 	 */ | ||||||
|  | 	public int getWidth() { | ||||||
|  | 		return width; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets top. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the top | ||||||
|  | 	 */ | ||||||
|  | 	public int getTop() { | ||||||
|  | 		return this.top; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets parent. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the parent | ||||||
|  | 	 */ | ||||||
|  | 	public POptionsScreen getParent() { | ||||||
|  | 		return parent; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	protected int getMaxPosition() { | ||||||
|  | 		return super.getMaxPosition() + 4; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets displayed count. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the displayed count | ||||||
|  | 	 */ | ||||||
|  | 	public int getDisplayedCount() { | ||||||
|  | 		return children().size(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										388
									
								
								src/main/java/pm/j4/petroleum/gui/PMovableButton.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										388
									
								
								src/main/java/pm/j4/petroleum/gui/PMovableButton.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,388 @@ | ||||||
|  | package pm.j4.petroleum.gui; | ||||||
|  | 
 | ||||||
|  | import com.mojang.blaze3d.systems.RenderSystem; | ||||||
|  | import java.util.List; | ||||||
|  | import net.minecraft.client.MinecraftClient; | ||||||
|  | import net.minecraft.client.font.TextRenderer; | ||||||
|  | import net.minecraft.client.gui.widget.AbstractButtonWidget; | ||||||
|  | import net.minecraft.client.render.BufferBuilder; | ||||||
|  | import net.minecraft.client.render.Tessellator; | ||||||
|  | import net.minecraft.client.render.VertexFormats; | ||||||
|  | import net.minecraft.client.util.math.MatrixStack; | ||||||
|  | import net.minecraft.text.LiteralText; | ||||||
|  | import net.minecraft.text.TranslatableText; | ||||||
|  | import net.minecraft.util.math.MathHelper; | ||||||
|  | import net.minecraft.util.math.Matrix4f; | ||||||
|  | import pm.j4.petroleum.modules.menu.ModMenu; | ||||||
|  | import pm.j4.petroleum.util.data.ButtonInformation; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type P movable button. | ||||||
|  |  */ | ||||||
|  | public class PMovableButton extends AbstractButtonWidget { | ||||||
|  | 	/** | ||||||
|  | 	 * The Expanded. | ||||||
|  | 	 */ | ||||||
|  | 	private boolean expanded; | ||||||
|  | 	/** | ||||||
|  | 	 * The Collapsed width. | ||||||
|  | 	 */ | ||||||
|  | 	private final int collapsedWidth; | ||||||
|  | 	/** | ||||||
|  | 	 * The Expanded width. | ||||||
|  | 	 */ | ||||||
|  | 	private int expandedWidth; | ||||||
|  | 	/** | ||||||
|  | 	 * The Collapsed height. | ||||||
|  | 	 */ | ||||||
|  | 	private final int collapsedHeight; | ||||||
|  | 	/** | ||||||
|  | 	 * The Expanded height. | ||||||
|  | 	 */ | ||||||
|  | 	private int expandedHeight; | ||||||
|  | 	/** | ||||||
|  | 	 * The Module height. | ||||||
|  | 	 */ | ||||||
|  | 	private final int moduleHeight; | ||||||
|  | 	/** | ||||||
|  | 	 * The Modules. | ||||||
|  | 	 */ | ||||||
|  | 	private final List<ModuleBase> modules; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Stored x. | ||||||
|  | 	 */ | ||||||
|  | 	private int storedX; | ||||||
|  | 	/** | ||||||
|  | 	 * The Stored y. | ||||||
|  | 	 */ | ||||||
|  | 	private int storedY; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Spin. | ||||||
|  | 	 */ | ||||||
|  | 	private double spin; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Arrow size. | ||||||
|  | 	 */ | ||||||
|  | 	private final int arrowSize = 10; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Category. | ||||||
|  | 	 */ | ||||||
|  | 	private final String category; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Parent. | ||||||
|  | 	 */ | ||||||
|  | 	private final PModMenuScreen parent; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new P movable button. | ||||||
|  | 	 * | ||||||
|  | 	 * @param x            the x | ||||||
|  | 	 * @param y            the y | ||||||
|  | 	 * @param categoryName the category name | ||||||
|  | 	 * @param modules      the modules | ||||||
|  | 	 * @param open         the open | ||||||
|  | 	 * @param parent       the parent | ||||||
|  | 	 */ | ||||||
|  | 	public PMovableButton(int x, int y, String categoryName, List<ModuleBase> modules, boolean open, PModMenuScreen parent) { | ||||||
|  | 		super(x, y, 0, 0, new TranslatableText(categoryName)); | ||||||
|  | 		this.category = categoryName; | ||||||
|  | 		int w = MinecraftClient.getInstance().textRenderer.getWidth(new TranslatableText(categoryName)) + 8; | ||||||
|  | 		int h = MinecraftClient.getInstance().textRenderer.fontHeight + 8; | ||||||
|  | 		this.width = w; | ||||||
|  | 		this.collapsedWidth = w; | ||||||
|  | 		this.expandedWidth = 0; | ||||||
|  | 		this.height = h; | ||||||
|  | 		this.collapsedHeight = h; | ||||||
|  | 		this.expandedHeight = 0; | ||||||
|  | 		this.moduleHeight = h; | ||||||
|  | 		this.expanded = open; | ||||||
|  | 		this.modules = modules; | ||||||
|  | 		this.parent = parent; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void onClick(double mouseX, double mouseY) { | ||||||
|  | 		this.storedX = (int) mouseX; | ||||||
|  | 		this.storedY = (int) mouseY; | ||||||
|  | 		super.onClick(mouseX, mouseY); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * On extra click. | ||||||
|  | 	 * | ||||||
|  | 	 * @param mouseX the mouse x | ||||||
|  | 	 * @param mouseY the mouse y | ||||||
|  | 	 */ | ||||||
|  | 	private void onExtraClick(double mouseX, double mouseY) { | ||||||
|  | 		System.out.println("extra click"); | ||||||
|  | 		int increment = this.moduleHeight + 4; | ||||||
|  | 		int location = (int)mouseY - (this.y + this.collapsedHeight); | ||||||
|  | 		int index = location / increment; | ||||||
|  | 		System.out.println("index: " + index); | ||||||
|  | 		if(modules.size() >= index) { | ||||||
|  | 			ModuleBase affectedModule = modules.get(index); | ||||||
|  | 			System.out.println("module: " + affectedModule); | ||||||
|  | 			if(affectedModule.isActivatable()) { | ||||||
|  | 				System.out.println("toggling"); | ||||||
|  | 				affectedModule.toggle(); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		else { | ||||||
|  | 			System.out.println("index too great"); | ||||||
|  | 		} | ||||||
|  | 		//TODO module things | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void onRelease(double mouseX, double mouseY) { | ||||||
|  | 		int mx = (int) mouseX; | ||||||
|  | 		int my = (int) mouseY; | ||||||
|  | 		/** | ||||||
|  | 		 * The Padding. | ||||||
|  | 		 */ | ||||||
|  | 		int padding = 5; | ||||||
|  | 		if (storedX + padding > mx && storedX - padding < mx && | ||||||
|  | 				storedY + padding > my && storedY - padding < my) { | ||||||
|  | 			this.expanded = !this.expanded; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	protected void onDrag(double mouseX, double mouseY, double deltaX, double deltaY) { | ||||||
|  | 		this.x += (int) deltaX; | ||||||
|  | 		this.y += (int) deltaY; | ||||||
|  | 
 | ||||||
|  | 		// i really hate to do it but nowhere else will it properly save | ||||||
|  | 		this.updateCoordinate(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Update coordinate. | ||||||
|  | 	 */ | ||||||
|  | 	public void updateCoordinate() { | ||||||
|  | 		ModMenu.updateCoord(this.category, new ButtonInformation((this.x / (double) parent.width), (this.y / (double) parent.height), this.expanded)); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// fuck click sounds | ||||||
|  | 	@Override | ||||||
|  | 	public boolean mouseClicked(double mouseX, double mouseY, int button) { | ||||||
|  | 		if (this.active && this.visible) { | ||||||
|  | 			if (this.isValidClickButton(button)) { | ||||||
|  | 				boolean bl = this.clicked(mouseX, mouseY); | ||||||
|  | 				if (bl && mouseY > this.y + this.collapsedHeight && mouseY < this.y + this.expandedHeight) { | ||||||
|  | 					this.onExtraClick(mouseX, mouseY); | ||||||
|  | 					return true; | ||||||
|  | 				} else if (bl) { | ||||||
|  | 					this.onClick(mouseX, mouseY); | ||||||
|  | 					return true; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 		} | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Transition max width. | ||||||
|  | 	 * | ||||||
|  | 	 * @param width the width | ||||||
|  | 	 */ | ||||||
|  | 	private void transitionMaxWidth(int width) { | ||||||
|  | 		double increment = ((width - this.width) / 20.0); | ||||||
|  | 		int sign = (width > this.width) ? 1 : -1; | ||||||
|  | 		if (increment == 0) { | ||||||
|  | 			this.width = width; | ||||||
|  | 		} else if (increment < 1 && increment > -1) { | ||||||
|  | 			this.width += sign; | ||||||
|  | 		} else { | ||||||
|  | 			this.width += (int) increment; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Transition max height. | ||||||
|  | 	 * | ||||||
|  | 	 * @param height the height | ||||||
|  | 	 */ | ||||||
|  | 	private void transitionMaxHeight(int height) { | ||||||
|  | 		double increment = ((height - this.height) / 20.0); | ||||||
|  | 		int sign = (height > this.height) ? 1 : -1; | ||||||
|  | 		if (increment == 0) { | ||||||
|  | 			this.height = height; | ||||||
|  | 		} else if (increment < 1 && increment > -1) { | ||||||
|  | 			this.height += sign; | ||||||
|  | 		} else { | ||||||
|  | 			this.height += (int) increment; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void renderButton(MatrixStack matrices, int mouseX, int mouseY, float delta) { | ||||||
|  | 
 | ||||||
|  | 		if (this.expandedWidth == 0 || this.expandedHeight == 0) { | ||||||
|  | 			this.expandedHeight = this.collapsedHeight + ((this.moduleHeight + 4) * modules.size()); | ||||||
|  | 			modules.forEach(module -> { | ||||||
|  | 				this.expandedWidth = this.width; | ||||||
|  | 				int w = MinecraftClient.getInstance().textRenderer.getWidth(module.getReadableName()) + arrowSize + 8; | ||||||
|  | 				if (w > this.expandedWidth) { | ||||||
|  | 					this.expandedWidth = w; | ||||||
|  | 				} | ||||||
|  | 			}); | ||||||
|  | 			// this should only run when opening the screen for the first time | ||||||
|  | 			if (this.expanded) { | ||||||
|  | 				this.height = expandedHeight; | ||||||
|  | 				this.width = expandedWidth; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		MinecraftClient minecraftClient = MinecraftClient.getInstance(); | ||||||
|  | 		TextRenderer textRenderer = minecraftClient.textRenderer; | ||||||
|  | 		minecraftClient.getTextureManager().bindTexture(WIDGETS_LOCATION); | ||||||
|  | 		RenderSystem.color4f(1.0F, 1.0F, 1.0F, this.alpha); | ||||||
|  | 
 | ||||||
|  | 		RenderSystem.disableTexture(); | ||||||
|  | 		RenderSystem.defaultBlendFunc(); | ||||||
|  | 		float brightness = this.isFocused() ? 1.0F : 0.5F; | ||||||
|  | 		RenderSystem.color4f(brightness, brightness, brightness, 1.0F); | ||||||
|  | 		Matrix4f matrix = matrices.peek().getModel(); | ||||||
|  | 
 | ||||||
|  | 		int buttonLeft = this.x; | ||||||
|  | 		int buttonRight = this.x + width + 2; | ||||||
|  | 		int buttonTop = this.y; | ||||||
|  | 		int buttonBottom = this.y + this.collapsedHeight; | ||||||
|  | 		int buttonExpandedBottom = this.y + this.height; | ||||||
|  | 		Tessellator t_1 = Tessellator.getInstance(); | ||||||
|  | 		BufferBuilder buffer = t_1.getBuffer(); | ||||||
|  | 
 | ||||||
|  | 		RenderSystem.color4f(0.5F, 0.5F, 0.5F, 0.5F); | ||||||
|  | 		drawBox(t_1, buffer, matrix, buttonLeft, buttonRight, buttonTop - 2, buttonBottom + 2); | ||||||
|  | 
 | ||||||
|  | 		RenderSystem.color4f(0.0F, 0.0F, 0.0F, 0.3F); | ||||||
|  | 		drawBox(t_1, buffer, matrix, buttonLeft + 1, buttonRight - 1, buttonTop - 1, buttonBottom + 1); | ||||||
|  | 
 | ||||||
|  | 		RenderSystem.color4f(1.0F, 1.0F, 1.0F, 0.9F); | ||||||
|  | 		drawEquilateralTriangle(t_1, buffer, matrix, 40, 40, 180, arrowSize); | ||||||
|  | 		drawEquilateralTriangle(t_1, buffer, matrix, 60, 60, 0, arrowSize); | ||||||
|  | 		drawEquilateralTriangle(t_1, buffer, matrix, 40, 60, 90, arrowSize); | ||||||
|  | 		drawEquilateralTriangle(t_1, buffer, matrix, 60, 40, 360, arrowSize); | ||||||
|  | 		drawEquilateralTriangle(t_1, buffer, matrix, 80, 40, 270, arrowSize); | ||||||
|  | 		drawEquilateralTriangle(t_1, buffer, matrix, 80, 60, 120, arrowSize); | ||||||
|  | 
 | ||||||
|  | 		int j = this.active ? 16777215 : 10526880; | ||||||
|  | 		if (this.expanded) { | ||||||
|  | 			if (this.width != this.expandedWidth || this.height != this.expandedHeight) { | ||||||
|  | 				transitionMaxWidth(this.expandedWidth); | ||||||
|  | 				transitionMaxHeight(this.expandedHeight); | ||||||
|  | 				RenderSystem.color4f(0.5F, 0.5F, 0.5F, 0.5F); | ||||||
|  | 				drawBox(t_1, buffer, matrix, buttonLeft, buttonRight, buttonBottom + 1, buttonExpandedBottom + 2); | ||||||
|  | 
 | ||||||
|  | 				RenderSystem.color4f(0.0F, 0.0F, 0.0F, 0.3F); | ||||||
|  | 				drawBox(t_1, buffer, matrix, buttonLeft + 1, buttonRight - 1, buttonBottom + 2, buttonExpandedBottom + 1); | ||||||
|  | 				if ((this.height - 8) / 2 > (this.collapsedHeight)) { | ||||||
|  | 					drawCenteredText(matrices, textRenderer, new LiteralText("..."), this.x + this.width / 2, this.y + (this.height - 8) / 2, j | MathHelper.ceil(this.alpha * 255.0F) << 24); | ||||||
|  | 				} | ||||||
|  | 			} else { | ||||||
|  | 				for (int i = 0; i < modules.size(); i++) { | ||||||
|  | 					int adjustedIndex = i + 1; | ||||||
|  | 					int previousBottom = buttonBottom + (i * (this.moduleHeight + 4)); | ||||||
|  | 					int currentBottom = buttonBottom + ((i + 1) * (this.moduleHeight + 4)); | ||||||
|  | 
 | ||||||
|  | 					RenderSystem.defaultBlendFunc(); | ||||||
|  | 					RenderSystem.color4f(0.5F, 0.5F, 0.5F, 0.5F); | ||||||
|  | 					drawBox(t_1, buffer, matrix, buttonLeft, buttonRight, previousBottom + 1, currentBottom + 2); | ||||||
|  | 
 | ||||||
|  | 					RenderSystem.color4f(0.0F, 0.0F, 0.0F, 0.3F); | ||||||
|  | 					drawBox(t_1, buffer, matrix, buttonLeft + 1, buttonRight - 1, previousBottom + 2, currentBottom + 1); | ||||||
|  | 
 | ||||||
|  | 					drawCenteredText(matrices, | ||||||
|  | 							textRenderer, | ||||||
|  | 							modules.get(i).getReadableName(), | ||||||
|  | 							this.x + this.width / 2, | ||||||
|  | 							this.y + ((this.collapsedHeight - 8) / 2 + ((moduleHeight + 4) * adjustedIndex)), | ||||||
|  | 							j | MathHelper.ceil(this.alpha * 255.0F) << 24); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} else { | ||||||
|  | 			if (this.width != this.collapsedWidth || this.height != this.collapsedHeight) { | ||||||
|  | 				transitionMaxWidth(this.collapsedWidth); | ||||||
|  | 				transitionMaxHeight(this.collapsedHeight); | ||||||
|  | 				RenderSystem.color4f(0.5F, 0.5F, 0.5F, 0.5F); | ||||||
|  | 				drawBox(t_1, buffer, matrix, buttonLeft, buttonRight, buttonBottom + 1, buttonExpandedBottom + 2); | ||||||
|  | 
 | ||||||
|  | 				RenderSystem.color4f(0.0F, 0.0F, 0.0F, 0.3F); | ||||||
|  | 				drawBox(t_1, buffer, matrix, buttonLeft + 1, buttonRight - 1, buttonBottom + 2, buttonExpandedBottom + 1); | ||||||
|  | 				if ((this.height - 8) / 2 > (this.collapsedHeight)) { | ||||||
|  | 					drawCenteredText(matrices, textRenderer, new LiteralText("..."), this.x + this.width / 2, this.y + (this.height - 8) / 2, j | MathHelper.ceil(this.alpha * 255.0F) << 24); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		RenderSystem.enableTexture(); | ||||||
|  | 		drawCenteredText(matrices, textRenderer, this.getMessage(), this.x + this.width / 2, this.y + (this.collapsedHeight - 8) / 2, j | MathHelper.ceil(this.alpha * 255.0F) << 24); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Draw equilateral triangle. | ||||||
|  | 	 * | ||||||
|  | 	 * @param t_1      the t 1 | ||||||
|  | 	 * @param buffer   the buffer | ||||||
|  | 	 * @param matrix   the matrix | ||||||
|  | 	 * @param centerX  the center x | ||||||
|  | 	 * @param centerY  the center y | ||||||
|  | 	 * @param rotation the rotation | ||||||
|  | 	 * @param distance the distance | ||||||
|  | 	 */ | ||||||
|  | 	private void drawEquilateralTriangle(Tessellator t_1, BufferBuilder buffer, Matrix4f matrix, int centerX, int centerY, double rotation, int distance) { | ||||||
|  | 		double rotation2 = rotation + 120; | ||||||
|  | 		double rotation3 = rotation + 240; | ||||||
|  | 		int point1X = (int)(distance * Math.cos(Math.toRadians(rotation))) + centerX; | ||||||
|  | 		int point1Y = (int)(distance * Math.sin(Math.toRadians(rotation))) + centerY; | ||||||
|  | 		int point2X = (int)(distance * Math.cos(Math.toRadians(rotation2))) + centerX; | ||||||
|  | 		int point2Y = (int)(distance * Math.sin(Math.toRadians(rotation2))) + centerY; | ||||||
|  | 		int point3X = (int)(distance * Math.cos(Math.toRadians(rotation3))) + centerX; | ||||||
|  | 		int point3Y = (int)(distance * Math.sin(Math.toRadians(rotation3))) + centerY; | ||||||
|  | 
 | ||||||
|  | 		//RenderSystem.enableBlend(); | ||||||
|  | 		RenderSystem.disableBlend(); | ||||||
|  | 		buffer.begin(7, VertexFormats.POSITION_COLOR); | ||||||
|  | 		buffer.vertex(matrix, centerX, centerY, 0.0F).color(0.0F, 1.0F, 1.0F, 1.0F).next(); | ||||||
|  | 		buffer.vertex(matrix, centerX, point1Y, 0.0F).color(0.0F, 1.0F, 1.0F, 1.0F).next(); | ||||||
|  | 		buffer.vertex(matrix, point1X, point1Y, 0.0F).color(0.0F, 1.0F, 1.0F, 1.0F).next(); | ||||||
|  | 
 | ||||||
|  | 		buffer.vertex(matrix, centerX, centerY, 0.0F).color(0.5F, 1.0F, 1.0F, 1.0F).next(); | ||||||
|  | 		buffer.vertex(matrix, centerX, point2Y, 0.0F).color(0.5F, 1.0F, 1.0F, 1.0F).next(); | ||||||
|  | 		buffer.vertex(matrix, point2X, point2Y, 0.0F).color(0.5F, 1.0F, 1.0F, 1.0F).next(); | ||||||
|  | 
 | ||||||
|  | 		buffer.vertex(matrix, centerX, centerY, 0.0F).color(1.0F, 0.0F, 1.0F, 1.0F).next(); | ||||||
|  | 		buffer.vertex(matrix, centerX, point3Y, 0.0F).color(1.0F, 0.0F, 1.0F, 1.0F).next(); | ||||||
|  | 		buffer.vertex(matrix, point3X, point3Y, 0.0F).color(1.0F, 0.0F, 1.0F, 1.0F).next(); | ||||||
|  | 		t_1.draw(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Draw box. | ||||||
|  | 	 * | ||||||
|  | 	 * @param t_1          the t 1 | ||||||
|  | 	 * @param buffer       the buffer | ||||||
|  | 	 * @param matrix       the matrix | ||||||
|  | 	 * @param buttonLeft   the button left | ||||||
|  | 	 * @param buttonRight  the button right | ||||||
|  | 	 * @param buttonTop    the button top | ||||||
|  | 	 * @param buttonBottom the button bottom | ||||||
|  | 	 */ | ||||||
|  | 	private void drawBox(Tessellator t_1, BufferBuilder buffer, Matrix4f matrix, int buttonLeft, int buttonRight, int buttonTop, int buttonBottom) { | ||||||
|  | 		RenderSystem.enableBlend(); | ||||||
|  | 		buffer.begin(7, VertexFormats.POSITION); | ||||||
|  | 		buffer.vertex(matrix, buttonLeft, buttonBottom, 0.0F).next(); | ||||||
|  | 		buffer.vertex(matrix, buttonRight, buttonBottom, 0.0F).next(); | ||||||
|  | 		buffer.vertex(matrix, buttonRight, buttonTop, 0.0F).next(); | ||||||
|  | 		buffer.vertex(matrix, buttonLeft, buttonTop, 0.0F).next(); | ||||||
|  | 		t_1.draw(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										94
									
								
								src/main/java/pm/j4/petroleum/gui/POptionEntry.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								src/main/java/pm/j4/petroleum/gui/POptionEntry.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,94 @@ | ||||||
|  | package pm.j4.petroleum.gui; | ||||||
|  | 
 | ||||||
|  | import com.mojang.blaze3d.systems.RenderSystem; | ||||||
|  | import net.minecraft.client.MinecraftClient; | ||||||
|  | import net.minecraft.client.font.TextRenderer; | ||||||
|  | import net.minecraft.client.gui.widget.AlwaysSelectedEntryListWidget; | ||||||
|  | import net.minecraft.client.util.math.MatrixStack; | ||||||
|  | import net.minecraft.text.StringVisitable; | ||||||
|  | import net.minecraft.text.Text; | ||||||
|  | import net.minecraft.text.TranslatableText; | ||||||
|  | import net.minecraft.util.Language; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type P option entry. | ||||||
|  |  */ | ||||||
|  | public class POptionEntry extends AlwaysSelectedEntryListWidget.Entry<POptionEntry> { | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Module. | ||||||
|  | 	 */ | ||||||
|  | 	protected final ModuleBase module; | ||||||
|  | 	/** | ||||||
|  | 	 * The Client. | ||||||
|  | 	 */ | ||||||
|  | 	protected final MinecraftClient client; | ||||||
|  | 	/** | ||||||
|  | 	 * The List. | ||||||
|  | 	 */ | ||||||
|  | 	private final PModuleConfigurationWidget list; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new P option entry. | ||||||
|  | 	 * | ||||||
|  | 	 * @param mod  the mod | ||||||
|  | 	 * @param list the list | ||||||
|  | 	 */ | ||||||
|  | 	public POptionEntry(ModuleBase mod, PModuleConfigurationWidget list) { | ||||||
|  | 		this.module = mod; | ||||||
|  | 		this.client = MinecraftClient.getInstance(); | ||||||
|  | 		this.list = list; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	//TODO TEST move text to be centered | ||||||
|  | 	@Override | ||||||
|  | 	public void render(MatrixStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { | ||||||
|  | 		x += getXOffset(); | ||||||
|  | 		entryWidth -= getXOffset(); | ||||||
|  | 		RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); | ||||||
|  | 		Text name = this.getModName(); | ||||||
|  | 		StringVisitable nameString = name; | ||||||
|  | 		int maxNameWidth = entryWidth - 32 - 3; | ||||||
|  | 		TextRenderer font = this.client.textRenderer; | ||||||
|  | 		if (font.getWidth(name) > maxNameWidth) { | ||||||
|  | 			StringVisitable ellipse = StringVisitable.plain("..."); | ||||||
|  | 			nameString = StringVisitable.concat(font.trimToWidth(nameString, maxNameWidth - font.getWidth(ellipse)), ellipse); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		font.draw(matrices, Language.getInstance().reorder(nameString), x + 32 + 3, y + (entryHeight / 2), 0xFFFFFF); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public boolean mouseClicked(double x, double y, int b) { | ||||||
|  | 		this.list.select(this); | ||||||
|  | 		return true; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets mod id. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the mod id | ||||||
|  | 	 */ | ||||||
|  | 	public String getModId() { | ||||||
|  | 		return module.getModuleName(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets mod name. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the mod name | ||||||
|  | 	 */ | ||||||
|  | 	public TranslatableText getModName() { | ||||||
|  | 		return module.getReadableName(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets x offset. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the x offset | ||||||
|  | 	 */ | ||||||
|  | 	public int getXOffset() { | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										222
									
								
								src/main/java/pm/j4/petroleum/gui/POptionsScreen.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										222
									
								
								src/main/java/pm/j4/petroleum/gui/POptionsScreen.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,222 @@ | ||||||
|  | package pm.j4.petroleum.gui; | ||||||
|  | 
 | ||||||
|  | import com.mojang.blaze3d.systems.RenderSystem; | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Objects; | ||||||
|  | import java.util.stream.Collectors; | ||||||
|  | import net.minecraft.client.MinecraftClient; | ||||||
|  | import net.minecraft.client.gui.DrawableHelper; | ||||||
|  | import net.minecraft.client.gui.screen.Screen; | ||||||
|  | import net.minecraft.client.gui.screen.ScreenTexts; | ||||||
|  | import net.minecraft.client.gui.widget.ButtonWidget; | ||||||
|  | import net.minecraft.client.render.BufferBuilder; | ||||||
|  | import net.minecraft.client.render.Tessellator; | ||||||
|  | import net.minecraft.client.render.VertexFormats; | ||||||
|  | import net.minecraft.client.util.math.MatrixStack; | ||||||
|  | import net.minecraft.text.*; | ||||||
|  | import pm.j4.petroleum.PetroleumMod; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigManager; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type P options screen. | ||||||
|  |  */ | ||||||
|  | @SuppressWarnings("deprecation") | ||||||
|  | public class POptionsScreen extends Screen { | ||||||
|  | 	/** | ||||||
|  | 	 * The Previous screen. | ||||||
|  | 	 */ | ||||||
|  | 	private final Screen previousScreen; | ||||||
|  | 	/** | ||||||
|  | 	 * The Scroll percent. | ||||||
|  | 	 */ | ||||||
|  | 	private double scrollPercent = 0; | ||||||
|  | 	/** | ||||||
|  | 	 * The Modules. | ||||||
|  | 	 */ | ||||||
|  | 	private PModuleConfigurationWidget modules; | ||||||
|  | 	/** | ||||||
|  | 	 * The Config pane. | ||||||
|  | 	 */ | ||||||
|  | 	private PModuleConfigPane configPane; | ||||||
|  | 	/** | ||||||
|  | 	 * The Selected. | ||||||
|  | 	 */ | ||||||
|  | 	private POptionEntry selected; | ||||||
|  | 	/** | ||||||
|  | 	 * The Tooltip. | ||||||
|  | 	 */ | ||||||
|  | 	private Text tooltip; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Pane y. | ||||||
|  | 	 */ | ||||||
|  | 	private int paneY; | ||||||
|  | 	/** | ||||||
|  | 	 * The Right pane x. | ||||||
|  | 	 */ | ||||||
|  | 	private int rightPaneX; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new P options screen. | ||||||
|  | 	 * | ||||||
|  | 	 * @param previousScreen the previous screen | ||||||
|  | 	 */ | ||||||
|  | 	public POptionsScreen(Screen previousScreen) { | ||||||
|  | 		super(new TranslatableText("petroleum.options")); | ||||||
|  | 		this.previousScreen = previousScreen; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void onClose() { | ||||||
|  | 		super.onClose(); | ||||||
|  | 		assert this.client != null; | ||||||
|  | 		this.client.openScreen(previousScreen); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	protected void init() { | ||||||
|  | 		paneY = 48; | ||||||
|  | 		int paneWidth = this.width / 2 - 8; | ||||||
|  | 		rightPaneX = width - paneWidth; | ||||||
|  | 		this.modules = new PModuleConfigurationWidget(this.client, | ||||||
|  | 				this.width - paneWidth, | ||||||
|  | 				this.height, | ||||||
|  | 				paneY + 19, | ||||||
|  | 				this.height - 36, | ||||||
|  | 				36, | ||||||
|  | 				this.modules, | ||||||
|  | 				this); | ||||||
|  | 		this.modules.setLeftPos(0); | ||||||
|  | 		this.children.add(this.modules); | ||||||
|  | 		this.configPane = new PModuleConfigPane(this.client, | ||||||
|  | 				paneWidth, | ||||||
|  | 				this.height, | ||||||
|  | 				paneY + 19, | ||||||
|  | 				this.height - 36, | ||||||
|  | 				48, | ||||||
|  | 				this); | ||||||
|  | 		this.configPane.setLeftPos(paneWidth); | ||||||
|  | 		this.children.add(this.configPane); | ||||||
|  | 		List<ModuleBase> configurableModules = new ArrayList<>(); | ||||||
|  | 		if (ConfigManager.getConfig().isPresent()) { | ||||||
|  | 			configurableModules.addAll(PetroleumMod.getActiveMods() | ||||||
|  | 					.stream().filter(ModuleBase::configurable) | ||||||
|  | 					.collect(Collectors.toList())); | ||||||
|  | 		} | ||||||
|  | 		configurableModules.forEach(module -> this.modules.addEntry(new POptionEntry(module, this.modules))); | ||||||
|  | 		this.addButton(new ButtonWidget(this.width / 2 - 75, this.height - 30, 150, 20, ScreenTexts.DONE, (buttonWidget) -> { | ||||||
|  | 			ConfigManager.saveAllModules(); | ||||||
|  | 			assert this.client != null; | ||||||
|  | 			this.client.openScreen(this.previousScreen); | ||||||
|  | 		})); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) { | ||||||
|  | 		this.renderBackground(matrices); | ||||||
|  | 
 | ||||||
|  | 		this.modules.render(matrices, mouseX, mouseY, delta); | ||||||
|  | 		if (selected != null) { | ||||||
|  | 			this.configPane.render(matrices, mouseX, mouseY, delta); | ||||||
|  | 		} | ||||||
|  | 		RenderSystem.disableBlend(); | ||||||
|  | 		drawTextWithShadow(matrices, this.textRenderer, this.title, this.modules.getWidth() / 2, 8, 16777215); | ||||||
|  | 		super.render(matrices, mouseX, mouseY, delta); | ||||||
|  | 
 | ||||||
|  | 		if (selected != null) { | ||||||
|  | 			int offset = 36; | ||||||
|  | 			int x = rightPaneX; | ||||||
|  | 			int maxNameWidth = this.width - (x + offset); | ||||||
|  | 			int lineSpacing = textRenderer.fontHeight + 1; | ||||||
|  | 			Text name = selected.getModName(); | ||||||
|  | 
 | ||||||
|  | 			StringVisitable trimmedName = name; | ||||||
|  | 
 | ||||||
|  | 			if (textRenderer.getWidth(name) > maxNameWidth) { | ||||||
|  | 				StringVisitable ellipsis = StringVisitable.plain("..."); | ||||||
|  | 				trimmedName = StringVisitable.concat(textRenderer.trimToWidth(name, maxNameWidth - textRenderer.getWidth(ellipsis)), ellipsis); | ||||||
|  | 			} | ||||||
|  | 			if (mouseX > x + offset && mouseY > paneY + 1 && mouseY < paneY + 1 + textRenderer.fontHeight && mouseX < x + offset + textRenderer.getWidth(trimmedName)) { | ||||||
|  | 				//TODO tooltop | ||||||
|  | 				//selected.getModName() | ||||||
|  | 			} | ||||||
|  | 			textRenderer.draw(matrices, selected.getModName(), x + offset, paneY + 2 + lineSpacing, 0x808080); | ||||||
|  | 
 | ||||||
|  | 			if (this.tooltip != null) { | ||||||
|  | 				this.renderOrderedTooltip(matrices, textRenderer.wrapLines(this.tooltip, Integer.MAX_VALUE), mouseX, mouseY); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Sets tooltip. | ||||||
|  | 	 * | ||||||
|  | 	 * @param tooltip the tooltip | ||||||
|  | 	 */ | ||||||
|  | 	private void setTooltip(Text tooltip) { | ||||||
|  | 		this.tooltip = tooltip; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void renderBackground(MatrixStack matrices) { | ||||||
|  | 		POptionsScreen.overlayBackground(this.width, this.height); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Overlay background. | ||||||
|  | 	 * | ||||||
|  | 	 * @param x2 the x 2 | ||||||
|  | 	 * @param y2 the y 2 | ||||||
|  | 	 */ | ||||||
|  | 	static void overlayBackground(int x2, int y2) { | ||||||
|  | 		Tessellator t_1 = Tessellator.getInstance(); | ||||||
|  | 		BufferBuilder buffer = t_1.getBuffer(); | ||||||
|  | 		Objects.requireNonNull(MinecraftClient.getInstance()).getTextureManager().bindTexture(DrawableHelper.OPTIONS_BACKGROUND_TEXTURE); | ||||||
|  | 		RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); | ||||||
|  | 		buffer.begin(7, VertexFormats.POSITION_TEXTURE_COLOR); | ||||||
|  | 		buffer.vertex(0, y2, 0.0D).texture(0 / 32.0F, y2 / 32.0F).color(64, 64, 64, 255).next(); | ||||||
|  | 		buffer.vertex(x2, y2, 0.0D).texture(x2 / 32.0F, y2 / 32.0F).color(64, 64, 64, 255).next(); | ||||||
|  | 		buffer.vertex(x2, 0, 0.0D).texture(x2 / 32.0F, 0 / 32.0F).color(64, 64, 64, 255).next(); | ||||||
|  | 		buffer.vertex(0, 0, 0.0D).texture(0 / 32.0F, 0 / 32.0F).color(64, 64, 64, 255).next(); | ||||||
|  | 		t_1.draw(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets scroll percent. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the scroll percent | ||||||
|  | 	 */ | ||||||
|  | 	double getScrollPercent() { | ||||||
|  | 		return scrollPercent; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Update scroll percent. | ||||||
|  | 	 * | ||||||
|  | 	 * @param scrollPercent the scroll percent | ||||||
|  | 	 */ | ||||||
|  | 	void updateScrollPercent(double scrollPercent) { | ||||||
|  | 		this.scrollPercent = scrollPercent; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets selected. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the selected | ||||||
|  | 	 */ | ||||||
|  | 	POptionEntry getSelected() { | ||||||
|  | 		return selected; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Update selected. | ||||||
|  | 	 * | ||||||
|  | 	 * @param entry the entry | ||||||
|  | 	 */ | ||||||
|  | 	void updateSelected(POptionEntry entry) { | ||||||
|  | 		if (entry != null) { | ||||||
|  | 			this.selected = entry; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										38
									
								
								src/main/java/pm/j4/petroleum/mixin/DebugHudMixin.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								src/main/java/pm/j4/petroleum/mixin/DebugHudMixin.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,38 @@ | ||||||
|  | package pm.j4.petroleum.mixin; | ||||||
|  | 
 | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Optional; | ||||||
|  | import net.minecraft.client.gui.hud.DebugHud; | ||||||
|  | import net.minecraft.client.util.math.MatrixStack; | ||||||
|  | import org.spongepowered.asm.mixin.Mixin; | ||||||
|  | import org.spongepowered.asm.mixin.injection.At; | ||||||
|  | import org.spongepowered.asm.mixin.injection.Inject; | ||||||
|  | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; | ||||||
|  | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; | ||||||
|  | import pm.j4.petroleum.modules.splash.SplashText; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigHolder; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigManager; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Debug hud mixin. | ||||||
|  |  */ | ||||||
|  | @Mixin(DebugHud.class) | ||||||
|  | public class DebugHudMixin { | ||||||
|  | 	/** | ||||||
|  | 	 * Render text right. | ||||||
|  | 	 * | ||||||
|  | 	 * @param matrices the matrices | ||||||
|  | 	 * @param ci       the ci | ||||||
|  | 	 * @param list     the list | ||||||
|  | 	 */ | ||||||
|  | 	@Inject(method = "renderLeftText", | ||||||
|  | 			at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/client/gui/hud/DebugHud;getLeftText()Ljava/util/List;"), | ||||||
|  | 			locals = LocalCapture.CAPTURE_FAILSOFT) | ||||||
|  | 	protected void renderTextRight(MatrixStack matrices, CallbackInfo ci, List<String> list) { | ||||||
|  | 		Optional<ConfigHolder> config = ConfigManager.getConfig(); | ||||||
|  | 		if (config.isPresent() && config.get().isModuleEnabled("petroleum.splashtext")) { | ||||||
|  | 			list.add("[Petroleum] " + SplashText.get() + " loaded"); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,19 @@ | ||||||
|  | package pm.j4.petroleum.mixin; | ||||||
|  | 
 | ||||||
|  | import net.minecraft.client.gui.widget.EntryListWidget; | ||||||
|  | import org.spongepowered.asm.mixin.Mixin; | ||||||
|  | import org.spongepowered.asm.mixin.gen.Accessor; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The interface Entry list widget accessor. | ||||||
|  |  */ | ||||||
|  | @Mixin(EntryListWidget.class) | ||||||
|  | public interface EntryListWidgetAccessor { | ||||||
|  | 	/** | ||||||
|  | 	 * Is render selection boolean. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the boolean | ||||||
|  | 	 */ | ||||||
|  | 	@Accessor("renderSelection") | ||||||
|  | 	boolean isRenderSelection(); | ||||||
|  | } | ||||||
							
								
								
									
										89
									
								
								src/main/java/pm/j4/petroleum/mixin/ModListMixin.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								src/main/java/pm/j4/petroleum/mixin/ModListMixin.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,89 @@ | ||||||
|  | package pm.j4.petroleum.mixin; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Optional; | ||||||
|  | import java.util.stream.Collectors; | ||||||
|  | import net.minecraft.client.MinecraftClient; | ||||||
|  | import net.minecraft.client.font.TextRenderer; | ||||||
|  | import net.minecraft.client.gui.DrawableHelper; | ||||||
|  | import net.minecraft.client.gui.hud.InGameHud; | ||||||
|  | import net.minecraft.client.util.math.MatrixStack; | ||||||
|  | import net.minecraft.text.TranslatableText; | ||||||
|  | import org.spongepowered.asm.mixin.Mixin; | ||||||
|  | import org.spongepowered.asm.mixin.Shadow; | ||||||
|  | import org.spongepowered.asm.mixin.injection.At; | ||||||
|  | import org.spongepowered.asm.mixin.injection.Inject; | ||||||
|  | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; | ||||||
|  | import pm.j4.petroleum.modules.list.ModList; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigHolder; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigManager; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Mod list mixin. | ||||||
|  |  */ | ||||||
|  | @Mixin(InGameHud.class) | ||||||
|  | public abstract class ModListMixin extends DrawableHelper { | ||||||
|  | 	/** | ||||||
|  | 	 * The Scaled height. | ||||||
|  | 	 */ | ||||||
|  | 	@Shadow | ||||||
|  | 	private int scaledHeight; | ||||||
|  | 	/** | ||||||
|  | 	 * The Client. | ||||||
|  | 	 */ | ||||||
|  | 	private final MinecraftClient client; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets font renderer. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the font renderer | ||||||
|  | 	 */ | ||||||
|  | 	@Shadow | ||||||
|  | 	public abstract TextRenderer getFontRenderer(); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Mod list mixin. | ||||||
|  | 	 * | ||||||
|  | 	 * @param client the client | ||||||
|  | 	 */ | ||||||
|  | 	public ModListMixin(MinecraftClient client) { | ||||||
|  | 		this.client = client; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Render. | ||||||
|  | 	 * | ||||||
|  | 	 * @param matrices  the matrices | ||||||
|  | 	 * @param tickDelta the tick delta | ||||||
|  | 	 * @param ci        the ci | ||||||
|  | 	 */ | ||||||
|  | 	@Inject(method = "render(Lnet/minecraft/client/util/math/MatrixStack;F)V", | ||||||
|  | 			at = @At("HEAD")) | ||||||
|  | 	public void render(MatrixStack matrices, float tickDelta, CallbackInfo ci) { | ||||||
|  | 		Optional<ConfigHolder> config = ConfigManager.getConfig(); | ||||||
|  | 		if (config.isPresent() && | ||||||
|  | 				config.get().isModuleEnabled("petroleum.modlist") && | ||||||
|  | 				!this.client.options.hudHidden && | ||||||
|  | 				!this.client.options.debugEnabled) { | ||||||
|  | 			renderModuleList(matrices); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Render module list. | ||||||
|  | 	 * | ||||||
|  | 	 * @param matrices the matrices | ||||||
|  | 	 */ | ||||||
|  | 	private void renderModuleList(MatrixStack matrices) { | ||||||
|  | 		List<ModuleBase> modules = ModList.getActive(); | ||||||
|  | 		List<TranslatableText> activeModuleList = modules.stream().map(module -> module.getReadableName()).collect(Collectors.toList()); | ||||||
|  | 		int fontHeight = this.getFontRenderer().fontHeight; | ||||||
|  | 		int startHeight = this.scaledHeight - (activeModuleList.size() * (fontHeight + 4)); | ||||||
|  | 		for (int i = 0; i < activeModuleList.size(); i++) { | ||||||
|  | 			this.getFontRenderer().drawWithShadow(matrices, activeModuleList.get(i), 10, 10 + (i * (fontHeight + 4)), -1); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										42
									
								
								src/main/java/pm/j4/petroleum/mixin/OptionsMenuMixin.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								src/main/java/pm/j4/petroleum/mixin/OptionsMenuMixin.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,42 @@ | ||||||
|  | package pm.j4.petroleum.mixin; | ||||||
|  | 
 | ||||||
|  | import net.minecraft.client.gui.screen.Screen; | ||||||
|  | import net.minecraft.client.gui.screen.options.OptionsScreen; | ||||||
|  | import net.minecraft.client.gui.widget.ButtonWidget; | ||||||
|  | import net.minecraft.text.Text; | ||||||
|  | import net.minecraft.text.TranslatableText; | ||||||
|  | import org.spongepowered.asm.mixin.Mixin; | ||||||
|  | import org.spongepowered.asm.mixin.injection.At; | ||||||
|  | import org.spongepowered.asm.mixin.injection.Inject; | ||||||
|  | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; | ||||||
|  | import pm.j4.petroleum.gui.POptionsScreen; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Options menu mixin. | ||||||
|  |  */ | ||||||
|  | @Mixin(OptionsScreen.class) | ||||||
|  | public class OptionsMenuMixin extends Screen { | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Options menu mixin. | ||||||
|  | 	 * | ||||||
|  | 	 * @param title the title | ||||||
|  | 	 */ | ||||||
|  | 	protected OptionsMenuMixin(Text title) { | ||||||
|  | 		super(title); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Init. | ||||||
|  | 	 * | ||||||
|  | 	 * @param ci the ci | ||||||
|  | 	 */ | ||||||
|  | 	@Inject(at = @At(value = "TAIL"), | ||||||
|  | 			method = "init()V") | ||||||
|  | 	protected void init(CallbackInfo ci) { | ||||||
|  | 		this.addButton(new ButtonWidget(this.width / 2 - 75, this.height / 6 + 140, 150, 20, new TranslatableText("petroleum.options"), (buttonWidget) -> { | ||||||
|  | 			assert this.client != null; | ||||||
|  | 			this.client.openScreen(new POptionsScreen(this)); | ||||||
|  | 		})); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										141
									
								
								src/main/java/pm/j4/petroleum/mixin/TitleScreenMixin.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										141
									
								
								src/main/java/pm/j4/petroleum/mixin/TitleScreenMixin.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,141 @@ | ||||||
|  | package pm.j4.petroleum.mixin; | ||||||
|  | 
 | ||||||
|  | import java.util.Optional; | ||||||
|  | import net.minecraft.client.gui.screen.Screen; | ||||||
|  | import net.minecraft.client.gui.screen.TitleScreen; | ||||||
|  | import net.minecraft.client.util.math.MatrixStack; | ||||||
|  | import net.minecraft.text.Text; | ||||||
|  | import org.spongepowered.asm.mixin.Mixin; | ||||||
|  | import org.spongepowered.asm.mixin.injection.At; | ||||||
|  | import org.spongepowered.asm.mixin.injection.Inject; | ||||||
|  | import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; | ||||||
|  | import org.spongepowered.asm.mixin.injection.callback.LocalCapture; | ||||||
|  | import pm.j4.petroleum.PetroleumMod; | ||||||
|  | import pm.j4.petroleum.modules.splash.SplashText; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigHolder; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigManager; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | import pm.j4.petroleum.util.module.option.BooleanOption; | ||||||
|  | import pm.j4.petroleum.util.module.option.ConfigurationOption; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Mixin attached to the TitleScreen. | ||||||
|  |  * Currently, it is only used to display a string of text with the mod's version. | ||||||
|  |  * Any other modules will likely extend the options screen or pause screen, | ||||||
|  |  * so the module is unlikely to be used elsewhere. | ||||||
|  |  */ | ||||||
|  | @Mixin(TitleScreen.class) | ||||||
|  | public class TitleScreenMixin extends Screen { | ||||||
|  | 	/** | ||||||
|  | 	 * The Opacity. | ||||||
|  | 	 */ | ||||||
|  | 	private double opacity = 0; | ||||||
|  | 	/** | ||||||
|  | 	 * The Ascending. | ||||||
|  | 	 */ | ||||||
|  | 	private boolean ascending = false; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Stub method. | ||||||
|  | 	 * Since the mixin injects itself into the *actual* TitleScreen used by the game, | ||||||
|  | 	 * this should never run. | ||||||
|  | 	 * | ||||||
|  | 	 * @param title the title | ||||||
|  | 	 */ | ||||||
|  | 	protected TitleScreenMixin(Text title) { | ||||||
|  | 		super(title); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Mixin injection into the render method. | ||||||
|  | 	 * It captures locals so that the text can be rendered alongside the | ||||||
|  | 	 * screen fade-in. | ||||||
|  | 	 * It injects before the call to @link com.mojang.bridge.game.GameVersion#getName() using INVOKE_ASSIGN, | ||||||
|  | 	 * because attempting to use a regular invoke statement on @link net.minecraft.client.gui.DrawHelper#drawStringWithShadow() | ||||||
|  | 	 * repeatedly failed. | ||||||
|  | 	 * <p> | ||||||
|  | 	 * | ||||||
|  | 	 * @param matrices the matrices | ||||||
|  | 	 * @param mouseX   the mouse x | ||||||
|  | 	 * @param mouseY   the mouse y | ||||||
|  | 	 * @param delta    the delta | ||||||
|  | 	 * @param ci       the ci | ||||||
|  | 	 * @param f        the f | ||||||
|  | 	 * @param i        the | ||||||
|  | 	 * @param j        the j | ||||||
|  | 	 * @param g        the g | ||||||
|  | 	 * @param l        the l | ||||||
|  | 	 */ | ||||||
|  | 	@Inject(method = "render", | ||||||
|  | 			at = @At( | ||||||
|  | 					value = "INVOKE_ASSIGN", | ||||||
|  | 					target = "Lcom/mojang/bridge/game/GameVersion;getName()Ljava/lang/String;", | ||||||
|  | 					ordinal = 0), | ||||||
|  | 			locals = LocalCapture.CAPTURE_FAILSOFT) | ||||||
|  | 	private void render(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci, float f, int i, int j, float g, int l) { | ||||||
|  | 		Optional<ConfigHolder> config = ConfigManager.getConfig(); | ||||||
|  | 		Optional<ModuleBase> splashText = PetroleumMod.getMod("petroleum.splashtext"); | ||||||
|  | 		if (config.isPresent() && config.get().isModuleEnabled("petroleum.splashtext") | ||||||
|  | 		&& splashText.isPresent()) { | ||||||
|  | 			Optional<ConfigurationOption> isActive = splashText.get().getConfigOption("petroleum.splashtext.active"); | ||||||
|  | 			if(isActive.isPresent() && ((BooleanOption)isActive.get()).getValue()) { | ||||||
|  | 				drawStringWithShadow(matrices, this.textRenderer, SplashText.get(), 2, this.height - 20, blink(13108374) | l); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * fades an integer color based on the values declared at the top of the class. | ||||||
|  | 	 * | ||||||
|  | 	 * @param color the integer representation of the color to fade. this should generally remain constant. | ||||||
|  | 	 * @return the color, adjusted for "opacity". It's RGB and not RGBA, so it just lowers all color values. | ||||||
|  | 	 */ | ||||||
|  | 	@SuppressWarnings("SameParameterValue") | ||||||
|  | 	private int blink(int color) { | ||||||
|  | 		/* | ||||||
|  | 		  The Speed. | ||||||
|  | 		 */ | ||||||
|  | 		int speed = 3; | ||||||
|  | 		/* | ||||||
|  | 		  The Opacity max. | ||||||
|  | 		 */ | ||||||
|  | 		double opacity_max = 1000; | ||||||
|  | 		if (ascending) { | ||||||
|  | 			opacity += speed; | ||||||
|  | 			if (opacity > opacity_max) { | ||||||
|  | 				opacity = opacity_max; | ||||||
|  | 				ascending = false; | ||||||
|  | 			} | ||||||
|  | 		} else { | ||||||
|  | 			opacity -= speed; | ||||||
|  | 			/* | ||||||
|  | 			  The Opacity min. | ||||||
|  | 			 */ | ||||||
|  | 			double opacity_min = 500; | ||||||
|  | 			if (opacity < opacity_min) { | ||||||
|  | 				opacity = opacity_min; | ||||||
|  | 				ascending = true; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		double opacityD = (opacity / opacity_max); | ||||||
|  | 		/* | ||||||
|  | 		  The R mask. | ||||||
|  | 		 */ | ||||||
|  | 		int r_mask = 16711680; | ||||||
|  | 		int r = ((color & r_mask) / Integer.parseInt("010000", 16)); | ||||||
|  | 		/* | ||||||
|  | 		  The G mask. | ||||||
|  | 		 */ | ||||||
|  | 		int g_mask = 65280; | ||||||
|  | 		int g = ((color & g_mask) / Integer.parseInt("000100", 16)); | ||||||
|  | 		/* | ||||||
|  | 		  The B mask. | ||||||
|  | 		 */ | ||||||
|  | 		int b_mask = 255; | ||||||
|  | 		int b = ((color & b_mask)); | ||||||
|  | 		return ((int) (r * opacityD) * Integer.parseInt("010000", 16)) | | ||||||
|  | 				((int) (g * opacityD) * Integer.parseInt("000100", 16)) | | ||||||
|  | 				((int) (b * opacityD)); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										42
									
								
								src/main/java/pm/j4/petroleum/modules/ExampleModule.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								src/main/java/pm/j4/petroleum/modules/ExampleModule.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,42 @@ | ||||||
|  | package pm.j4.petroleum.modules; | ||||||
|  | 
 | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.HashMap; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
|  | import net.minecraft.client.MinecraftClient; | ||||||
|  | import net.minecraft.text.LiteralText; | ||||||
|  | import pm.j4.petroleum.gui.PModuleConfigEntry; | ||||||
|  | import pm.j4.petroleum.gui.PModuleConfigPane; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | import pm.j4.petroleum.util.module.option.BooleanOption; | ||||||
|  | import pm.j4.petroleum.util.module.option.ConfigurationOption; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Example module. | ||||||
|  |  */ | ||||||
|  | public class ExampleModule extends ModuleBase { | ||||||
|  | 	/** | ||||||
|  | 	 * example mod | ||||||
|  | 	 */ | ||||||
|  | 	public ExampleModule() { | ||||||
|  | 		super("petroleum.example", | ||||||
|  | 				"petroleum.misc", | ||||||
|  | 				true, | ||||||
|  | 				false, | ||||||
|  | 				true); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public List<ConfigurationOption> getDefaultConfig() { | ||||||
|  | 		List<ConfigurationOption> options = new ArrayList<>(); | ||||||
|  | 		options.add(new BooleanOption("petroleum.example.b_one","example", this)); | ||||||
|  | 		options.add(new BooleanOption("petroleum.example.b_two","example", this)); | ||||||
|  | 		return options; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void activate(MinecraftClient client) { | ||||||
|  | 		System.out.println("Example Mod Keybind Activate"); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,30 @@ | ||||||
|  | package pm.j4.petroleum.modules.bindings; | ||||||
|  | 
 | ||||||
|  | import net.minecraft.client.util.InputUtil; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Binding info. | ||||||
|  |  */ | ||||||
|  | public class BindingInfo { | ||||||
|  | 	/** | ||||||
|  | 	 * The Translation key. | ||||||
|  | 	 */ | ||||||
|  | 	public String translationKey; | ||||||
|  | 	/** | ||||||
|  | 	 * The Type. | ||||||
|  | 	 */ | ||||||
|  | 	public InputUtil.Type type; | ||||||
|  | 	/** | ||||||
|  | 	 * The Key. | ||||||
|  | 	 */ | ||||||
|  | 	public int key; | ||||||
|  | 	/** | ||||||
|  | 	 * The Category. | ||||||
|  | 	 */ | ||||||
|  | 	public String category; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Attached function id. | ||||||
|  | 	 */ | ||||||
|  | 	public String attachedModuleName; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,89 @@ | ||||||
|  | package pm.j4.petroleum.modules.bindings; | ||||||
|  | 
 | ||||||
|  | import java.util.*; | ||||||
|  | import net.minecraft.client.MinecraftClient; | ||||||
|  | import net.minecraft.client.options.KeyBinding; | ||||||
|  | import net.minecraft.client.util.InputUtil; | ||||||
|  | import net.minecraft.client.util.math.MatrixStack; | ||||||
|  | import net.minecraft.text.TranslatableText; | ||||||
|  | import org.lwjgl.glfw.GLFW; | ||||||
|  | import pm.j4.petroleum.PetroleumMod; | ||||||
|  | import pm.j4.petroleum.gui.PModuleConfigEntry; | ||||||
|  | import pm.j4.petroleum.gui.PModuleConfigPane; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigManager; | ||||||
|  | import pm.j4.petroleum.util.config.GlobalConfig; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | import pm.j4.petroleum.util.module.option.ConfigurationOption; | ||||||
|  | import pm.j4.petroleum.util.module.option.KeybindOption; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Binding manager. | ||||||
|  |  */ | ||||||
|  | public class BindingManager extends ModuleBase { | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Module base. | ||||||
|  | 	 * Parameters should be constant across restarts. | ||||||
|  | 	 */ | ||||||
|  | 	public BindingManager() { | ||||||
|  | 		super("petroleum.bindings", | ||||||
|  | 				"petroleum.misc", | ||||||
|  | 				false, | ||||||
|  | 				true, | ||||||
|  | 				true); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void init() { | ||||||
|  | 		registerBindings(); | ||||||
|  | 		super.init(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public List<PModuleConfigEntry> getConfigEntries(PModuleConfigPane sourcePane) { | ||||||
|  | 
 | ||||||
|  | 		//TODO multiple binds per module | ||||||
|  | 		// thoughts: have modules include a list of module triggers/functions | ||||||
|  | 		// which replace the ModuleBase in bindings? | ||||||
|  | 		List<PModuleConfigEntry> entries = new ArrayList<>(); | ||||||
|  | 
 | ||||||
|  | 		Map<KeybindOption, ModuleBase> mapped = new HashMap<>(); | ||||||
|  | 		if (ConfigManager.getConfig().isPresent()) { | ||||||
|  | 			Map<KeyBinding, ModuleBase> binds = ConfigManager.getConfig().get().globalConfig.bindings; | ||||||
|  | 
 | ||||||
|  | 			binds.forEach((key, func) -> { | ||||||
|  | 				KeybindOption option = new KeybindOption(func.getModuleName() + " " + func.getCategory(), func.getModuleName() + " " + func.getCategory(), func); | ||||||
|  | 				option.fromKeybind(key, func); | ||||||
|  | 				mapped.put(option, func); | ||||||
|  | 			}); | ||||||
|  | 		} | ||||||
|  | 		mapped.forEach((configEntry, module) -> { | ||||||
|  | 			PModuleConfigEntry entry = new PModuleConfigEntry(configEntry, new TranslatableText(module.getModuleName()), sourcePane); | ||||||
|  | 			entries.add(entry); | ||||||
|  | 		}); | ||||||
|  | 		return entries; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Register bindings. | ||||||
|  | 	 */ | ||||||
|  | 	private void registerBindings() { | ||||||
|  | 		if (!ConfigManager.getConfig().isPresent()) { | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 		GlobalConfig c = ConfigManager.getConfig().get().globalConfig; | ||||||
|  | 		Optional<ModuleBase> mod = PetroleumMod.getMod("petroleum.modmenu"); | ||||||
|  | 		if (mod.isPresent() && !c.isBound(mod.get())) { | ||||||
|  | 			//TODO | ||||||
|  | 			// the only explicit keybinding (for now.) | ||||||
|  | 			// once the binding manager has been completed, | ||||||
|  | 			// this should be migrated there, as a default binding | ||||||
|  | 			KeyBinding binding = new KeyBinding( | ||||||
|  | 					"key.petroleum.togglemodmenu", | ||||||
|  | 					InputUtil.Type.KEYSYM, | ||||||
|  | 					GLFW.GLFW_KEY_RIGHT_CONTROL, | ||||||
|  | 					"category.petroleum" | ||||||
|  | 			); | ||||||
|  | 			ConfigManager.getConfig().get().globalConfig.setBinding(binding, mod.get()); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										40
									
								
								src/main/java/pm/j4/petroleum/modules/list/ModList.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								src/main/java/pm/j4/petroleum/modules/list/ModList.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,40 @@ | ||||||
|  | package pm.j4.petroleum.modules.list; | ||||||
|  | 
 | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Optional; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigHolder; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigManager; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Mod list. | ||||||
|  |  */ | ||||||
|  | public class ModList extends ModuleBase { | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Mod list. | ||||||
|  | 	 */ | ||||||
|  | 	public ModList() { | ||||||
|  | 		super("petroleum.modlist", | ||||||
|  | 				"petroleum.misc", | ||||||
|  | 				true, | ||||||
|  | 				true, | ||||||
|  | 				true); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets active. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the active | ||||||
|  | 	 */ | ||||||
|  | 	public static List<ModuleBase> getActive() { | ||||||
|  | 		List<ModuleBase> result = new ArrayList<>(); | ||||||
|  | 		Optional<ConfigHolder> config = ConfigManager.getConfig(); | ||||||
|  | 		config.ifPresent(configHolder -> configHolder.getEnabledModules().forEach((mod) -> { | ||||||
|  | 			if (!mod.isHidden()) { | ||||||
|  | 				result.add(mod); | ||||||
|  | 			} | ||||||
|  | 		})); | ||||||
|  | 		return result; | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										98
									
								
								src/main/java/pm/j4/petroleum/modules/menu/ModMenu.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								src/main/java/pm/j4/petroleum/modules/menu/ModMenu.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,98 @@ | ||||||
|  | package pm.j4.petroleum.modules.menu; | ||||||
|  | 
 | ||||||
|  | import java.util.HashMap; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
|  | import net.minecraft.client.MinecraftClient; | ||||||
|  | import pm.j4.petroleum.gui.PModMenuScreen; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigManager; | ||||||
|  | import pm.j4.petroleum.util.data.ButtonInformation; | ||||||
|  | import pm.j4.petroleum.util.data.Category; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Mod menu. | ||||||
|  |  */ | ||||||
|  | public class ModMenu extends ModuleBase { | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The constant coordinates. | ||||||
|  | 	 */ | ||||||
|  | 	private static final Map<String, ButtonInformation> coordinates = new HashMap<>(); | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Mod menu. | ||||||
|  | 	 */ | ||||||
|  | 	public ModMenu() { | ||||||
|  | 		super("petroleum.modmenu", | ||||||
|  | 				"petroleum.misc", | ||||||
|  | 				true, | ||||||
|  | 				true, | ||||||
|  | 				true); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// TODO figure out resizing | ||||||
|  | 	//  the number itself changes, so it should just be probably like some onResize bullshit in PModMenuScreen | ||||||
|  | 	@Override | ||||||
|  | 	public void init() { | ||||||
|  | 		Map<String, List<ModuleBase>> categories = Category.getCategoryMap(); | ||||||
|  | 		final double[] h = {.1}; | ||||||
|  | 		categories.forEach((category, moduleList) -> { | ||||||
|  | 			ButtonInformation conf = ConfigManager.getConfig().isPresent() ? | ||||||
|  | 					ConfigManager.getConfig().get().globalConfig.getButton(category) : | ||||||
|  | 					null; | ||||||
|  | 			ButtonInformation coord = conf != null ? conf : new ButtonInformation(.1, h[0], false); | ||||||
|  | 			h[0] += .01; | ||||||
|  | 			coordinates.put(category, coord); | ||||||
|  | 			if (ConfigManager.getConfig().isPresent()) { | ||||||
|  | 				ConfigManager.getConfig().get().globalConfig.setButton(category, coord); | ||||||
|  | 			} | ||||||
|  | 		}); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Update coord. | ||||||
|  | 	 * | ||||||
|  | 	 * @param b the b | ||||||
|  | 	 * @param c the c | ||||||
|  | 	 */ | ||||||
|  | 	public static void updateCoord(String b, ButtonInformation c) { | ||||||
|  | 		if (c.x < 0.05) { | ||||||
|  | 			c.x = 0.05; | ||||||
|  | 		} | ||||||
|  | 		if (c.x > .95) { | ||||||
|  | 			c.x = .95; | ||||||
|  | 		} | ||||||
|  | 		if (c.y < 0.05) { | ||||||
|  | 			c.y = 0.05; | ||||||
|  | 		} | ||||||
|  | 		if (c.y > .95) { | ||||||
|  | 			c.y = .95; | ||||||
|  | 		} | ||||||
|  | 		if (coordinates.containsKey(b)) { | ||||||
|  | 			coordinates.replace(b, c); | ||||||
|  | 			if (ConfigManager.getConfig().isPresent()) { | ||||||
|  | 				ConfigManager.getConfig().get().globalConfig.setButton(b, c); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void activate(MinecraftClient client) { | ||||||
|  | 		this.toggle(); | ||||||
|  | 		if (ConfigManager.getConfig().get().isModuleEnabled(this.getModuleName())) { | ||||||
|  | 			client.openScreen(new PModMenuScreen()); | ||||||
|  | 		} else { | ||||||
|  | 			client.openScreen(null); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets buttons. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the buttons | ||||||
|  | 	 */ | ||||||
|  | 	public static Map<String, ButtonInformation> getButtons() { | ||||||
|  | 		return coordinates; | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										46
									
								
								src/main/java/pm/j4/petroleum/modules/splash/SplashText.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								src/main/java/pm/j4/petroleum/modules/splash/SplashText.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,46 @@ | ||||||
|  | package pm.j4.petroleum.modules.splash; | ||||||
|  | 
 | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.List; | ||||||
|  | import net.minecraft.text.LiteralText; | ||||||
|  | import pm.j4.petroleum.PetroleumMod; | ||||||
|  | import pm.j4.petroleum.gui.PModuleConfigEntry; | ||||||
|  | import pm.j4.petroleum.gui.PModuleConfigPane; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | import pm.j4.petroleum.util.module.option.BooleanOption; | ||||||
|  | import pm.j4.petroleum.util.module.option.ConfigurationOption; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Splash text. | ||||||
|  |  */ | ||||||
|  | public class SplashText extends ModuleBase { | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Splash text. | ||||||
|  | 	 */ | ||||||
|  | 	public SplashText() { | ||||||
|  | 		super("petroleum.splashtext", | ||||||
|  | 				"petroleum.misc", | ||||||
|  | 				false, | ||||||
|  | 				true, | ||||||
|  | 				true); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public List<ConfigurationOption> getDefaultConfig() { | ||||||
|  | 		List<ConfigurationOption> options = new ArrayList<>(); | ||||||
|  | 		options.add(new BooleanOption("petroleum.splashtext.active", "Show the main menu version text.", this)); | ||||||
|  | 		return options; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Get string. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the string | ||||||
|  | 	 */ | ||||||
|  | 	public static String get() { | ||||||
|  | 		if (PetroleumMod.modData != null) { | ||||||
|  | 			return "Petroleum v" + PetroleumMod.modData.getVersion().getFriendlyString(); | ||||||
|  | 		} | ||||||
|  | 		return "Petroleum vUnknown"; | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										19
									
								
								src/main/java/pm/j4/petroleum/modules/xray/Xray.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								src/main/java/pm/j4/petroleum/modules/xray/Xray.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,19 @@ | ||||||
|  | package pm.j4.petroleum.modules.xray; | ||||||
|  | 
 | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Xray. | ||||||
|  |  */ | ||||||
|  | public class Xray extends ModuleBase { | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Xray. | ||||||
|  | 	 */ | ||||||
|  | 	public Xray() { | ||||||
|  | 		super("petroleum.xray", | ||||||
|  | 				"petroleum.render", | ||||||
|  | 				true, | ||||||
|  | 				false, | ||||||
|  | 				true); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										59
									
								
								src/main/java/pm/j4/petroleum/util/config/Config.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								src/main/java/pm/j4/petroleum/util/config/Config.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,59 @@ | ||||||
|  | package pm.j4.petroleum.util.config; | ||||||
|  | 
 | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.List; | ||||||
|  | import pm.j4.petroleum.PetroleumMod; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Config. | ||||||
|  |  */ | ||||||
|  | public abstract class Config { | ||||||
|  | 	/** | ||||||
|  | 	 * The Enabled modules. | ||||||
|  | 	 */ | ||||||
|  | 	public List<String> enabledModules = new ArrayList<>(); | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Is enabled boolean. | ||||||
|  | 	 * | ||||||
|  | 	 * @param mod the mod | ||||||
|  | 	 * @return the boolean | ||||||
|  | 	 */ | ||||||
|  | 	public boolean isEnabled(String mod) { | ||||||
|  | 		return enabledModules.contains(mod); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Disable module. | ||||||
|  | 	 * | ||||||
|  | 	 * @param mod the mod | ||||||
|  | 	 */ | ||||||
|  | 	public void disableModule(String mod) { | ||||||
|  | 		if (isEnabled(mod) && PetroleumMod.isActive(mod) && PetroleumMod.getMod(mod).isPresent()) { | ||||||
|  | 			ModuleBase moduleInfo = PetroleumMod.getMod(mod).get(); | ||||||
|  | 			if (moduleInfo.isActivatable()) { | ||||||
|  | 				enabledModules.remove(mod); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Toggle module. | ||||||
|  | 	 * | ||||||
|  | 	 * @param mod the mod | ||||||
|  | 	 */ | ||||||
|  | 	public void toggleModule(String mod) { | ||||||
|  | 		if (PetroleumMod.isActive(mod) && PetroleumMod.getMod(mod).isPresent()) { | ||||||
|  | 			ModuleBase moduleInfo = PetroleumMod.getMod(mod).get(); | ||||||
|  | 			if (moduleInfo.isActivatable()) { | ||||||
|  | 				if (isEnabled(mod)) { | ||||||
|  | 					enabledModules.remove(mod); | ||||||
|  | 				} else { | ||||||
|  | 					enabledModules.add(mod); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										94
									
								
								src/main/java/pm/j4/petroleum/util/config/ConfigHolder.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								src/main/java/pm/j4/petroleum/util/config/ConfigHolder.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,94 @@ | ||||||
|  | package pm.j4.petroleum.util.config; | ||||||
|  | 
 | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
|  | import java.util.stream.Collectors; | ||||||
|  | import pm.j4.petroleum.PetroleumMod; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Config holder. | ||||||
|  |  */ | ||||||
|  | public class ConfigHolder { | ||||||
|  | 	/** | ||||||
|  | 	 * The Global config. | ||||||
|  | 	 */ | ||||||
|  | 	public GlobalConfig globalConfig; | ||||||
|  | 	/** | ||||||
|  | 	 * The Server configs. | ||||||
|  | 	 */ | ||||||
|  | 	public Map<String, ServerConfig> serverConfigs; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Is module enabled boolean. | ||||||
|  | 	 * | ||||||
|  | 	 * @param module the module | ||||||
|  | 	 * @return the boolean | ||||||
|  | 	 */ | ||||||
|  | 	public boolean isModuleEnabled(String module) { | ||||||
|  | 
 | ||||||
|  | 		if (!PetroleumMod.isActive(module)) { | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		if (globalConfig.isEnabled(module)) { | ||||||
|  | 			return true; | ||||||
|  | 		} | ||||||
|  | 		String server = this.getServer(); | ||||||
|  | 		if (serverConfigs.containsKey(server)) { | ||||||
|  | 			return serverConfigs.get(server).isEnabled(module); | ||||||
|  | 		} | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets enabled modules. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the enabled modules | ||||||
|  | 	 */ | ||||||
|  | 	public List<ModuleBase> getEnabledModules() { | ||||||
|  | 		List<ModuleBase> modules = PetroleumMod.getActiveMods(); | ||||||
|  | 		return modules.stream().filter(module -> | ||||||
|  | 				isModuleEnabled(module.getModuleName()) | ||||||
|  | 		).collect(Collectors.toList()); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets server. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the server | ||||||
|  | 	 */ | ||||||
|  | 	public String getServer() { | ||||||
|  | 		return PetroleumMod.getServerAddress(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Toggle module. | ||||||
|  | 	 * | ||||||
|  | 	 * @param module the module | ||||||
|  | 	 */ | ||||||
|  | 	public void toggleModule(String module) { | ||||||
|  | 		String server = this.getServer(); | ||||||
|  | 		if (serverConfigs.containsKey(server)) { | ||||||
|  | 			System.out.println("Toggling module " + module + " on server " + server); | ||||||
|  | 			serverConfigs.get(server).toggleModule(module); | ||||||
|  | 		} else { | ||||||
|  | 			globalConfig.toggleModule(module); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Disable module. | ||||||
|  | 	 * | ||||||
|  | 	 * @param module the module | ||||||
|  | 	 */ | ||||||
|  | 	public void disableModule(String module) { | ||||||
|  | 		String server = this.getServer(); | ||||||
|  | 		if (serverConfigs.containsKey(server)) { | ||||||
|  | 			System.out.println("disabling module " + module + " on server " + server); | ||||||
|  | 			serverConfigs.get(server).disableModule(module); | ||||||
|  | 		} else { | ||||||
|  | 			globalConfig.disableModule(module); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | } | ||||||
							
								
								
									
										270
									
								
								src/main/java/pm/j4/petroleum/util/config/ConfigManager.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										270
									
								
								src/main/java/pm/j4/petroleum/util/config/ConfigManager.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,270 @@ | ||||||
|  | package pm.j4.petroleum.util.config; | ||||||
|  | 
 | ||||||
|  | import com.google.common.reflect.TypeToken; | ||||||
|  | import com.google.gson.*; | ||||||
|  | import java.io.*; | ||||||
|  | import java.lang.reflect.Type; | ||||||
|  | import java.util.*; | ||||||
|  | import net.fabricmc.loader.api.FabricLoader; | ||||||
|  | import pm.j4.petroleum.PetroleumMod; | ||||||
|  | import pm.j4.petroleum.modules.bindings.BindingInfo; | ||||||
|  | import pm.j4.petroleum.modules.menu.ModMenu; | ||||||
|  | import pm.j4.petroleum.util.data.ButtonInformation; | ||||||
|  | import pm.j4.petroleum.util.data.ModuleConfig; | ||||||
|  | import pm.j4.petroleum.util.data.OptionSerializiable; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Config manager. | ||||||
|  |  */ | ||||||
|  | public class ConfigManager { | ||||||
|  | 	/** | ||||||
|  | 	 * The constant GSON. | ||||||
|  | 	 */ | ||||||
|  | 	public static final Gson GSON = new GsonBuilder() | ||||||
|  | 			.registerTypeAdapter(GlobalConfig.class, SerializationHelper.getGlobalSerializer()) | ||||||
|  | 			.registerTypeAdapter(GlobalConfig.class, SerializationHelper.getGlobalDeserializer()) | ||||||
|  | 			.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).setPrettyPrinting().create(); | ||||||
|  | 	/** | ||||||
|  | 	 * The constant config. | ||||||
|  | 	 */ | ||||||
|  | 	private static ConfigHolder config; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Prepare config file. | ||||||
|  | 	 * | ||||||
|  | 	 * @param path     the path | ||||||
|  | 	 * @param filename the filename | ||||||
|  | 	 * @return the file | ||||||
|  | 	 */ | ||||||
|  | 	private static File prepareConfigFile(String path, String filename) { | ||||||
|  | 		if (path != "") { | ||||||
|  | 			File directory = new File(FabricLoader.getInstance().getConfigDir().toString(), path); | ||||||
|  | 			if (!directory.exists()) directory.mkdir(); | ||||||
|  | 		} | ||||||
|  | 		return new File(FabricLoader.getInstance().getConfigDir().toString(), path + filename); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Init config. | ||||||
|  | 	 */ | ||||||
|  | 	public static void initConfig() { | ||||||
|  | 		if (config != null) { | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		config = new ConfigHolder(); | ||||||
|  | 		config.globalConfig = new DefaultConfig(); | ||||||
|  | 		config.serverConfigs = new HashMap<>(); | ||||||
|  | 
 | ||||||
|  | 		config = load("petroleum/", "petroleum.json", ConfigHolder.class); | ||||||
|  | 		initModules(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Init modules. | ||||||
|  | 	 */ | ||||||
|  | 	public static void initModules() { | ||||||
|  | 		PetroleumMod.getActiveMods().forEach(module -> { | ||||||
|  | 			ModuleConfig options = load("petroleum/modules/", module.getModuleName() + ".json", ModuleConfig.class); | ||||||
|  | 			if (options != null && options.options != null) { | ||||||
|  | 				options.options.forEach((key, option) -> { | ||||||
|  | 					if (module.hasOption(option.key)) { | ||||||
|  | 						module.setConfigOption(option.key, option.value); | ||||||
|  | 					} | ||||||
|  | 				}); | ||||||
|  | 			} | ||||||
|  | 		}); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Load. | ||||||
|  | 	 * | ||||||
|  | 	 * @param <T>      the type parameter | ||||||
|  | 	 * @param path     the path | ||||||
|  | 	 * @param filename the filename | ||||||
|  | 	 * @param tClass   the t class | ||||||
|  | 	 * @return the t | ||||||
|  | 	 */ | ||||||
|  | 	private static <T> T load(String path, String filename, Class<T> tClass) { | ||||||
|  | 		File file = prepareConfigFile(path, filename); | ||||||
|  | 
 | ||||||
|  | 		try { | ||||||
|  | 			if (!file.exists()) { | ||||||
|  | 				save(path, filename, tClass.newInstance()); | ||||||
|  | 			} | ||||||
|  | 			if (file.exists()) { | ||||||
|  | 				BufferedReader reader = new BufferedReader(new FileReader(file)); | ||||||
|  | 				T parsedConfig = null; | ||||||
|  | 				try { | ||||||
|  | 					parsedConfig = GSON.fromJson(reader, tClass); | ||||||
|  | 				} catch (Exception e) { | ||||||
|  | 					System.out.println("Couldn't parse config file"); | ||||||
|  | 					e.printStackTrace(); | ||||||
|  | 				} | ||||||
|  | 				if (parsedConfig != null) { | ||||||
|  | 					return parsedConfig; | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} catch (FileNotFoundException | InstantiationException | IllegalAccessException e) { | ||||||
|  | 			System.out.println("Couldn't load configuration file at " + path); | ||||||
|  | 			e.printStackTrace(); | ||||||
|  | 		} | ||||||
|  | 		return null; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Deserialize element t. | ||||||
|  | 	 * | ||||||
|  | 	 * @param <T>     the type parameter | ||||||
|  | 	 * @param element the element | ||||||
|  | 	 * @param tClass  the t class | ||||||
|  | 	 * @return the t | ||||||
|  | 	 */ | ||||||
|  | 	public static <T> T deserializeElement(JsonElement element, Class<T> tClass) { | ||||||
|  | 		return GSON.fromJson(element, tClass); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Save. | ||||||
|  | 	 * | ||||||
|  | 	 * @param <T>      the type parameter | ||||||
|  | 	 * @param path     the path | ||||||
|  | 	 * @param filename the filename | ||||||
|  | 	 * @param data     the data | ||||||
|  | 	 */ | ||||||
|  | 	private static <T> void save(String path, String filename, T data) { | ||||||
|  | 		File file = prepareConfigFile(path, filename); | ||||||
|  | 
 | ||||||
|  | 		String json = GSON.toJson(data); | ||||||
|  | 		try (FileWriter fileWriter = new FileWriter(file)) { | ||||||
|  | 			fileWriter.write(json); | ||||||
|  | 		} catch (IOException e) { | ||||||
|  | 			System.out.println("Couldn't save configuration file at " + path); | ||||||
|  | 			e.printStackTrace(); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Save module. | ||||||
|  | 	 * | ||||||
|  | 	 * @param b the b | ||||||
|  | 	 */ | ||||||
|  | 	public static void saveModule(ModuleBase b) { | ||||||
|  | 		ModuleConfig c = new ModuleConfig(); | ||||||
|  | 		c.options = GlobalConfig.serializeModuleConfiguration(b); | ||||||
|  | 		save("petroleum/modules/", b.getModuleName() + ".json", c); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Save all modules. | ||||||
|  | 	 */ | ||||||
|  | 	public static void saveAllModules() { | ||||||
|  | 		List<ModuleBase> mods = PetroleumMod.getActiveMods(); | ||||||
|  | 		mods.forEach(ConfigManager::saveModule); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Save global config. | ||||||
|  | 	 */ | ||||||
|  | 	public static void saveGlobalConfig() { | ||||||
|  | 		save("petroleum/", "petroleum.json", config); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets config. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the config | ||||||
|  | 	 */ | ||||||
|  | 	public static Optional<ConfigHolder> getConfig() { | ||||||
|  | 		if (config == null) { | ||||||
|  | 			return Optional.empty(); | ||||||
|  | 		} | ||||||
|  | 		return Optional.of(config); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Serialization helper. | ||||||
|  |  */ | ||||||
|  | class SerializationHelper { | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The constant s. | ||||||
|  | 	 */ | ||||||
|  | 	private static final JsonSerializer<GlobalConfig> GLOBAL_CONFIG_JSON_SERIALIZER = (src, typeOfSrc, ctx) -> { | ||||||
|  | 		JsonObject jsonConfig = new JsonObject(); | ||||||
|  | 
 | ||||||
|  | 		JsonArray bindings = ctx.serialize(src.serializeBindings()).getAsJsonArray(); | ||||||
|  | 		jsonConfig.add("bindings", bindings); | ||||||
|  | 
 | ||||||
|  | 		JsonArray modules = ctx.serialize(src.enabledModules).getAsJsonArray(); | ||||||
|  | 		jsonConfig.add("enabled_modules", modules); | ||||||
|  | 
 | ||||||
|  | 		JsonObject tabCoordinates = new JsonObject(); | ||||||
|  | 		ModMenu.getButtons().forEach((category, coordinates) -> { | ||||||
|  | 			tabCoordinates.add(category, ctx.serialize(coordinates)); | ||||||
|  | 		}); | ||||||
|  | 		jsonConfig.add("button_coordinates", tabCoordinates); | ||||||
|  | 
 | ||||||
|  | 		return jsonConfig; | ||||||
|  | 	}; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The constant ds. | ||||||
|  | 	 */ | ||||||
|  | 	private static final JsonDeserializer<GlobalConfig> GLOBAL_CONFIG_JSON_DESERIALIZER = ((json, typeOfT, ctx) -> { | ||||||
|  | 		JsonObject obj = json.getAsJsonObject(); | ||||||
|  | 
 | ||||||
|  | 		List<BindingInfo> bindings = new ArrayList<>(); | ||||||
|  | 		if (obj.has("bindings")) { | ||||||
|  | 			obj.get("bindings").getAsJsonArray().forEach(b -> bindings.add(ctx.deserialize(b, BindingInfo.class))); | ||||||
|  | 		} | ||||||
|  | 		List<String> modules = new ArrayList<>(); | ||||||
|  | 		if (obj.has("enabled_modules")) { | ||||||
|  | 			obj.get("enabled_modules").getAsJsonArray().forEach(m -> modules.add(m.getAsString())); | ||||||
|  | 		} | ||||||
|  | 		GlobalConfig cfg = new GlobalConfig(); | ||||||
|  | 		Map<String, List<OptionSerializiable>> options; | ||||||
|  | 		Type type = new TypeToken<Map<String, List<OptionSerializiable>>>() { | ||||||
|  | 		}.getType(); | ||||||
|  | 		if (obj.has("module_configuration")) { | ||||||
|  | 			options = ctx.deserialize(obj.get("module_configuration"), type); | ||||||
|  | 		} else { | ||||||
|  | 			options = new HashMap<>(); | ||||||
|  | 		} | ||||||
|  | 		if (obj.has("button_coordinates")) { | ||||||
|  | 			obj.get("button_coordinates").getAsJsonObject().entrySet().forEach( | ||||||
|  | 					value -> { | ||||||
|  | 						cfg.setButton(value.getKey(), ctx.deserialize(value.getValue(), ButtonInformation.class)); | ||||||
|  | 					} | ||||||
|  | 			); | ||||||
|  | 		} | ||||||
|  | 		PetroleumMod.getActiveMods().forEach(module -> { | ||||||
|  | 			if (options.containsKey(module.getModuleName())) { | ||||||
|  | 				cfg.deserializeModuleConfiguration(options.get(module.getModuleName()), module); | ||||||
|  | 			} | ||||||
|  | 		}); | ||||||
|  | 		cfg.deserializeBindings(bindings); | ||||||
|  | 		cfg.enabledModules = modules; | ||||||
|  | 		return cfg; | ||||||
|  | 	}); | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets serializer. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the serializer | ||||||
|  | 	 */ | ||||||
|  | 	public static JsonSerializer<GlobalConfig> getGlobalSerializer() { | ||||||
|  | 		return GLOBAL_CONFIG_JSON_SERIALIZER; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets deserializer. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the deserializer | ||||||
|  | 	 */ | ||||||
|  | 	public static JsonDeserializer<GlobalConfig> getGlobalDeserializer() { | ||||||
|  | 		return GLOBAL_CONFIG_JSON_DESERIALIZER; | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										15
									
								
								src/main/java/pm/j4/petroleum/util/config/DefaultConfig.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								src/main/java/pm/j4/petroleum/util/config/DefaultConfig.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,15 @@ | ||||||
|  | package pm.j4.petroleum.util.config; | ||||||
|  | 
 | ||||||
|  | import java.util.Collections; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Default config. | ||||||
|  |  */ | ||||||
|  | public class DefaultConfig extends GlobalConfig { | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Default config. | ||||||
|  | 	 */ | ||||||
|  | 	public DefaultConfig() { | ||||||
|  | 		this.enabledModules = Collections.singletonList("petroleum.splashtext"); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										195
									
								
								src/main/java/pm/j4/petroleum/util/config/GlobalConfig.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										195
									
								
								src/main/java/pm/j4/petroleum/util/config/GlobalConfig.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,195 @@ | ||||||
|  | package pm.j4.petroleum.util.config; | ||||||
|  | 
 | ||||||
|  | import java.util.*; | ||||||
|  | import java.util.concurrent.atomic.AtomicBoolean; | ||||||
|  | import java.util.concurrent.atomic.AtomicReference; | ||||||
|  | import net.minecraft.client.options.KeyBinding; | ||||||
|  | import net.minecraft.client.util.InputUtil; | ||||||
|  | import pm.j4.petroleum.PetroleumMod; | ||||||
|  | import pm.j4.petroleum.modules.bindings.BindingInfo; | ||||||
|  | import pm.j4.petroleum.util.data.ButtonInformation; | ||||||
|  | import pm.j4.petroleum.util.data.OptionSerializiable; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | import pm.j4.petroleum.util.module.option.ConfigurationOption; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Global config. | ||||||
|  |  */ | ||||||
|  | public class GlobalConfig extends Config { | ||||||
|  | 	/** | ||||||
|  | 	 * The Bindings. | ||||||
|  | 	 */ | ||||||
|  | 	public final Map<KeyBinding, ModuleBase> bindings = new HashMap<>(); | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Is bound boolean. | ||||||
|  | 	 * | ||||||
|  | 	 * @param func the func | ||||||
|  | 	 * @return the boolean | ||||||
|  | 	 */ | ||||||
|  | 	public boolean isBound(ModuleBase func) { | ||||||
|  | 		AtomicBoolean found = new AtomicBoolean(false); | ||||||
|  | 		bindings.forEach((key, binding) -> { | ||||||
|  | 			if (binding.equals(func)) { | ||||||
|  | 				found.set(true); | ||||||
|  | 			} | ||||||
|  | 		}); | ||||||
|  | 		return found.get(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Sets binding. | ||||||
|  | 	 * | ||||||
|  | 	 * @param bind the bind | ||||||
|  | 	 * @param func the func | ||||||
|  | 	 */ | ||||||
|  | 	public void setBinding(KeyBinding bind, ModuleBase func) { | ||||||
|  | 		AtomicReference<KeyBinding> match = new AtomicReference<>(); | ||||||
|  | 		if (bindings.containsValue(func)) { | ||||||
|  | 			bindings.forEach((key, binding) -> { | ||||||
|  | 				if (binding.equals(func)) { | ||||||
|  | 					PetroleumMod.removeBind(key); | ||||||
|  | 					match.set(key); | ||||||
|  | 				} | ||||||
|  | 			}); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if (match.get() != null) { | ||||||
|  | 			bindings.remove(match.get()); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if (PetroleumMod.isActive(func.getModuleName())) { | ||||||
|  | 			PetroleumMod.addBind(bind); | ||||||
|  | 			bindings.put(bind, func); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Convert binding. | ||||||
|  | 	 * | ||||||
|  | 	 * @param info the info | ||||||
|  | 	 */ | ||||||
|  | 	private void convertBinding(BindingInfo info) { | ||||||
|  | 		Optional<ModuleBase> match = PetroleumMod.getMod(info.attachedModuleName); | ||||||
|  | 		match.ifPresent(moduleBase -> setBinding(reconstructBinding(info), | ||||||
|  | 				moduleBase)); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Reconstruct binding key binding. | ||||||
|  | 	 * | ||||||
|  | 	 * @param info the info | ||||||
|  | 	 * @return the key binding | ||||||
|  | 	 */ | ||||||
|  | 	public static KeyBinding reconstructBinding(BindingInfo info) { | ||||||
|  | 		return new KeyBinding( | ||||||
|  | 				info.translationKey, | ||||||
|  | 				info.type, | ||||||
|  | 				info.key, | ||||||
|  | 				info.category | ||||||
|  | 		); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Extract binding info. | ||||||
|  | 	 * | ||||||
|  | 	 * @param b the b | ||||||
|  | 	 * @param f the f | ||||||
|  | 	 * @return the binding info | ||||||
|  | 	 */ | ||||||
|  | 	public static BindingInfo extractBinding(KeyBinding b, ModuleBase f) { | ||||||
|  | 		BindingInfo res = new BindingInfo(); | ||||||
|  | 		res.attachedModuleName = f.getModuleName(); | ||||||
|  | 
 | ||||||
|  | 		res.translationKey = b.getTranslationKey(); | ||||||
|  | 		InputUtil.Key k = b.getDefaultKey(); | ||||||
|  | 		res.type = k.getCategory(); | ||||||
|  | 		res.key = k.getCode(); | ||||||
|  | 		res.category = b.getCategory(); | ||||||
|  | 
 | ||||||
|  | 		return res; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Serialize bindings list. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the list | ||||||
|  | 	 */ | ||||||
|  | 	public List<BindingInfo> serializeBindings() { | ||||||
|  | 		List<BindingInfo> b = new ArrayList<>(); | ||||||
|  | 		bindings.forEach((k, f) -> b.add(extractBinding(k, f))); | ||||||
|  | 		return b; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Deserialize bindings. | ||||||
|  | 	 * | ||||||
|  | 	 * @param info the info | ||||||
|  | 	 */ | ||||||
|  | 	public void deserializeBindings(List<BindingInfo> info) { | ||||||
|  | 		info.forEach(this::convertBinding); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Serialize module configuration list. | ||||||
|  | 	 * | ||||||
|  | 	 * @param module the module | ||||||
|  | 	 * @return the list | ||||||
|  | 	 */ | ||||||
|  | 	public static Map<String, OptionSerializiable> serializeModuleConfiguration(ModuleBase module) { | ||||||
|  | 		Map<String, OptionSerializiable> opts = new HashMap<>(); | ||||||
|  | 		Map<String, ConfigurationOption> configuration = module.getModuleConfiguration(); | ||||||
|  | 		configuration.forEach((key, value) -> { | ||||||
|  | 			opts.put(key, new OptionSerializiable(key, value.toJson())); | ||||||
|  | 		}); | ||||||
|  | 		return opts; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Deserialize module configuration. | ||||||
|  | 	 * | ||||||
|  | 	 * @param opts   the opts | ||||||
|  | 	 * @param module the module | ||||||
|  | 	 */ | ||||||
|  | 	public void deserializeModuleConfiguration(List<OptionSerializiable> opts, ModuleBase module) { | ||||||
|  | 		opts.forEach(option -> { | ||||||
|  | 			if (module.hasOption(option.key)) { | ||||||
|  | 				module.setConfigOption(option.key, option.value); | ||||||
|  | 			} | ||||||
|  | 		}); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Button locations. | ||||||
|  | 	 */ | ||||||
|  | 	private final Map<String, ButtonInformation> buttonLocations = new HashMap<>(); | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Sets button. | ||||||
|  | 	 * | ||||||
|  | 	 * @param category          the category | ||||||
|  | 	 * @param buttonInformation the button information | ||||||
|  | 	 */ | ||||||
|  | 	public void setButton(String category, ButtonInformation buttonInformation) { | ||||||
|  | 		if (buttonLocations.containsKey(category)) { | ||||||
|  | 			buttonLocations.replace(category, buttonInformation); | ||||||
|  | 		} else { | ||||||
|  | 			buttonLocations.put(category, buttonInformation); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets button. | ||||||
|  | 	 * | ||||||
|  | 	 * @param category the category | ||||||
|  | 	 * @return the button | ||||||
|  | 	 */ | ||||||
|  | 	public ButtonInformation getButton(String category) { | ||||||
|  | 		if (buttonLocations.containsKey(category)) { | ||||||
|  | 			return buttonLocations.get(category); | ||||||
|  | 		} | ||||||
|  | 		System.out.println("Could not find button of category " + category); | ||||||
|  | 		return null; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
							
								
								
									
										11
									
								
								src/main/java/pm/j4/petroleum/util/config/ServerConfig.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/main/java/pm/j4/petroleum/util/config/ServerConfig.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,11 @@ | ||||||
|  | package pm.j4.petroleum.util.config; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Server config. | ||||||
|  |  */ | ||||||
|  | public class ServerConfig extends Config { | ||||||
|  | 	/** | ||||||
|  | 	 * The Address. | ||||||
|  | 	 */ | ||||||
|  | 	public String address = ""; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,32 @@ | ||||||
|  | package pm.j4.petroleum.util.data; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Button information. | ||||||
|  |  */ | ||||||
|  | public class ButtonInformation { | ||||||
|  | 	/** | ||||||
|  | 	 * The X. | ||||||
|  | 	 */ | ||||||
|  | 	public double x; | ||||||
|  | 	/** | ||||||
|  | 	 * The Y. | ||||||
|  | 	 */ | ||||||
|  | 	public double y; | ||||||
|  | 	/** | ||||||
|  | 	 * The Open. | ||||||
|  | 	 */ | ||||||
|  | 	public final boolean open; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Button information. | ||||||
|  | 	 * | ||||||
|  | 	 * @param x    the x | ||||||
|  | 	 * @param y    the y | ||||||
|  | 	 * @param open the open | ||||||
|  | 	 */ | ||||||
|  | 	public ButtonInformation(double x, double y, boolean open) { | ||||||
|  | 		this.x = x; | ||||||
|  | 		this.y = y; | ||||||
|  | 		this.open = open; | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										47
									
								
								src/main/java/pm/j4/petroleum/util/data/Category.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								src/main/java/pm/j4/petroleum/util/data/Category.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,47 @@ | ||||||
|  | package pm.j4.petroleum.util.data; | ||||||
|  | 
 | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.HashMap; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
|  | import pm.j4.petroleum.PetroleumMod; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Category. | ||||||
|  |  */ | ||||||
|  | public class Category { | ||||||
|  | 	/** | ||||||
|  | 	 * Gets category map. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the category map | ||||||
|  | 	 */ | ||||||
|  | 	public static Map<String, List<ModuleBase>> getCategoryMap() { | ||||||
|  | 		List<ModuleBase> modules = PetroleumMod.getActiveMods(); | ||||||
|  | 		Map<String, List<ModuleBase>> categoryMap = new HashMap<>(); | ||||||
|  | 		modules.forEach(module -> { | ||||||
|  | 			if (!categoryMap.containsKey(module.getCategory())) { | ||||||
|  | 				List<ModuleBase> m = new ArrayList<>(); | ||||||
|  | 				m.add(module); | ||||||
|  | 				categoryMap.put(module.getCategory(), m); | ||||||
|  | 			} else { | ||||||
|  | 				List<ModuleBase> m = categoryMap.get(module.getCategory()); | ||||||
|  | 				List<ModuleBase> nm = new ArrayList<>(); | ||||||
|  | 				nm.addAll(m); | ||||||
|  | 				nm.add(module); | ||||||
|  | 				categoryMap.replace(module.getCategory(), nm); | ||||||
|  | 			} | ||||||
|  | 		}); | ||||||
|  | 		return categoryMap; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets by category. | ||||||
|  | 	 * | ||||||
|  | 	 * @param category the category | ||||||
|  | 	 * @return the by category | ||||||
|  | 	 */ | ||||||
|  | 	public static List<ModuleBase> getByCategory(String category) { | ||||||
|  | 		return getCategoryMap().containsKey(category) ? getCategoryMap().get(category) : new ArrayList<>(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										13
									
								
								src/main/java/pm/j4/petroleum/util/data/ModuleConfig.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/main/java/pm/j4/petroleum/util/data/ModuleConfig.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,13 @@ | ||||||
|  | package pm.j4.petroleum.util.data; | ||||||
|  | 
 | ||||||
|  | import java.util.Map; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Module config. | ||||||
|  |  */ | ||||||
|  | public class ModuleConfig { | ||||||
|  | 	/** | ||||||
|  | 	 * The Options. | ||||||
|  | 	 */ | ||||||
|  | 	public Map<String, OptionSerializiable> options; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,28 @@ | ||||||
|  | package pm.j4.petroleum.util.data; | ||||||
|  | 
 | ||||||
|  | import com.google.gson.JsonElement; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Option serializiable. | ||||||
|  |  */ | ||||||
|  | public class OptionSerializiable { | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Option serializiable. | ||||||
|  | 	 * | ||||||
|  | 	 * @param key   the key | ||||||
|  | 	 * @param value the value | ||||||
|  | 	 */ | ||||||
|  | 	public OptionSerializiable(String key, JsonElement value) { | ||||||
|  | 		this.value = value; | ||||||
|  | 		this.key = key; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Value. | ||||||
|  | 	 */ | ||||||
|  | 	public final JsonElement value; | ||||||
|  | 	/** | ||||||
|  | 	 * The Key. | ||||||
|  | 	 */ | ||||||
|  | 	public final String key; | ||||||
|  | } | ||||||
							
								
								
									
										248
									
								
								src/main/java/pm/j4/petroleum/util/module/ModuleBase.java
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										248
									
								
								src/main/java/pm/j4/petroleum/util/module/ModuleBase.java
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,248 @@ | ||||||
|  | package pm.j4.petroleum.util.module; | ||||||
|  | 
 | ||||||
|  | import com.google.gson.JsonElement; | ||||||
|  | import java.util.*; | ||||||
|  | import net.minecraft.client.MinecraftClient; | ||||||
|  | import net.minecraft.text.TranslatableText; | ||||||
|  | import pm.j4.petroleum.gui.PModuleConfigEntry; | ||||||
|  | import pm.j4.petroleum.gui.PModuleConfigPane; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigHolder; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigManager; | ||||||
|  | import pm.j4.petroleum.util.module.option.ConfigurationOption; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The Basis for all mods, used so that modules all have a common activation point and settings. | ||||||
|  |  */ | ||||||
|  | public abstract class ModuleBase { | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Module base. | ||||||
|  | 	 * Parameters should be constant across restarts. | ||||||
|  | 	 * | ||||||
|  | 	 * @param name          The name of the module | ||||||
|  | 	 * @param category      the category | ||||||
|  | 	 * @param activatable   Whether a module can be activated, or if it will remain in the state it was upon startup | ||||||
|  | 	 * @param hidden        Whether the module will show up in @link pm.j4.petroleum.modules.menu.ModMenu or the active module list | ||||||
|  | 	 * @param hasConfigMenu whether a button in the configuration menu will show | ||||||
|  | 	 */ | ||||||
|  | 	public ModuleBase(String name, String category, boolean activatable, boolean hidden, boolean hasConfigMenu) { | ||||||
|  | 		this.moduleName = name; | ||||||
|  | 		this.category = category; | ||||||
|  | 		this.readableName = new TranslatableText(name); | ||||||
|  | 		this.activatable = activatable; | ||||||
|  | 		this.hidden = hidden; | ||||||
|  | 		this.hasConfigMenu = hasConfigMenu; | ||||||
|  | 		this.moduleOptions = this.convertDefaultConfig(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Init. | ||||||
|  | 	 */ | ||||||
|  | 	public void init() { | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Activate. Should be overridden. | ||||||
|  | 	 * | ||||||
|  | 	 * @param client the client | ||||||
|  | 	 */ | ||||||
|  | 	public void activate(MinecraftClient client) { | ||||||
|  | 		this.toggle(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Toggle mod. | ||||||
|  | 	 */ | ||||||
|  | 	public void toggle() { | ||||||
|  | 		Optional<ConfigHolder> config = ConfigManager.getConfig(); | ||||||
|  | 		config.ifPresent(configHolder -> configHolder.toggleModule(this.moduleName)); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Module's name. | ||||||
|  | 	 */ | ||||||
|  | 	private final String moduleName; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets module name. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the module name | ||||||
|  | 	 */ | ||||||
|  | 	public String getModuleName() { | ||||||
|  | 		return this.moduleName; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Category. | ||||||
|  | 	 */ | ||||||
|  | 	private final String category; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets category. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the category | ||||||
|  | 	 */ | ||||||
|  | 	public String getCategory() { | ||||||
|  | 		return this.category; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Readable name. | ||||||
|  | 	 */ | ||||||
|  | 	private final TranslatableText readableName; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets readable name. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the readable name | ||||||
|  | 	 */ | ||||||
|  | 	public TranslatableText getReadableName() { | ||||||
|  | 		return this.readableName; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Activatable. | ||||||
|  | 	 */ | ||||||
|  | 	private final boolean activatable; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Is activatable boolean. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the boolean | ||||||
|  | 	 */ | ||||||
|  | 	public boolean isActivatable() { | ||||||
|  | 		return activatable; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Hidden. | ||||||
|  | 	 */ | ||||||
|  | 	private final boolean hidden; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Is hidden boolean. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the boolean | ||||||
|  | 	 */ | ||||||
|  | 	public boolean isHidden() { | ||||||
|  | 		return hidden; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Has config menu. | ||||||
|  | 	 */ | ||||||
|  | 	private final boolean hasConfigMenu; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Configurable boolean. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the boolean | ||||||
|  | 	 */ | ||||||
|  | 	public boolean configurable() { | ||||||
|  | 		return hasConfigMenu; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Module options. | ||||||
|  | 	 */ | ||||||
|  | 	private final Map<String, ConfigurationOption> moduleOptions; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets module configuration. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the module configuration | ||||||
|  | 	 */ | ||||||
|  | 	public Map<String, ConfigurationOption> getModuleConfiguration() { | ||||||
|  | 		return moduleOptions; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Sets config option. | ||||||
|  | 	 * This will fail if the option is not already present in a module. | ||||||
|  | 	 * <p> | ||||||
|  | 	 * | ||||||
|  | 	 * @param key   the key | ||||||
|  | 	 * @param value the value | ||||||
|  | 	 * @return whether the operation was successful. | ||||||
|  | 	 */ | ||||||
|  | 	public boolean setConfigOption(String key, JsonElement value) { | ||||||
|  | 		if (moduleOptions.containsKey(key)) { | ||||||
|  | 			moduleOptions.get(key).fromJson(value); | ||||||
|  | 			return true; | ||||||
|  | 		} | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public void updateConfigOption(String key, ConfigurationOption option) { | ||||||
|  | 		System.out.println("update config option" + key + option.getStringValue()); | ||||||
|  | 		System.out.println(moduleOptions.keySet()); | ||||||
|  | 		if(moduleOptions.containsKey(key)) { | ||||||
|  | 			System.out.println("matched"); | ||||||
|  | 			moduleOptions.replace(key, option); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Has option boolean. | ||||||
|  | 	 * | ||||||
|  | 	 * @param key the key | ||||||
|  | 	 * @return the boolean | ||||||
|  | 	 */ | ||||||
|  | 	public boolean hasOption(String key) { | ||||||
|  | 		return moduleOptions.containsKey(key); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets default config. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the default config | ||||||
|  | 	 */ | ||||||
|  | 	protected List<ConfigurationOption> getDefaultConfig() { | ||||||
|  | 		return new ArrayList<>(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private Map<String, ConfigurationOption> convertDefaultConfig() { | ||||||
|  | 		List<ConfigurationOption> options = this.getDefaultConfig(); | ||||||
|  | 		Map<String, ConfigurationOption> mapped = new HashMap<>(); | ||||||
|  | 		options.forEach((option) -> { | ||||||
|  | 			mapped.put(option.getConfigKey(), option); | ||||||
|  | 		}); | ||||||
|  | 		return mapped; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets config option. | ||||||
|  | 	 * | ||||||
|  | 	 * @param key the key | ||||||
|  | 	 * @return the config option | ||||||
|  | 	 */ | ||||||
|  | 	public Optional<ConfigurationOption> getConfigOption(String key) { | ||||||
|  | 		if (moduleOptions.containsKey(key)) { | ||||||
|  | 			return Optional.of(moduleOptions.get(key)); | ||||||
|  | 		} | ||||||
|  | 		return Optional.empty(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets config entries. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the config entries | ||||||
|  | 	 */ | ||||||
|  | 	public List<PModuleConfigEntry> getConfigEntries(PModuleConfigPane sourcePane) { | ||||||
|  | 		List<PModuleConfigEntry> entries = new ArrayList<>(); | ||||||
|  | 		this.getModuleConfiguration().forEach((name, option) -> entries.add(new PModuleConfigEntry(option, new TranslatableText(name), sourcePane))); | ||||||
|  | 		return entries; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Equals boolean. | ||||||
|  | 	 * | ||||||
|  | 	 * @param other the other | ||||||
|  | 	 * @return the boolean | ||||||
|  | 	 */ | ||||||
|  | 	public boolean equals(ModuleBase other) { | ||||||
|  | 		return Objects.equals(this.moduleName, other.getModuleName()); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,45 @@ | ||||||
|  | package pm.j4.petroleum.util.module.option; | ||||||
|  | 
 | ||||||
|  | import com.google.gson.JsonElement; | ||||||
|  | import com.google.gson.JsonPrimitive; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Boolean value. | ||||||
|  |  */ | ||||||
|  | public class BooleanOption extends ConfigurationOption { | ||||||
|  | 	/** | ||||||
|  | 	 * The Value. | ||||||
|  | 	 */ | ||||||
|  | 	private boolean value; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Configuration option. | ||||||
|  | 	 * | ||||||
|  | 	 * @param key | ||||||
|  | 	 * @param description the description | ||||||
|  | 	 */ | ||||||
|  | 	public BooleanOption(String key, String description, ModuleBase parent) { | ||||||
|  | 		super(key, description, parent); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public boolean getValue() { | ||||||
|  | 		return value; | ||||||
|  | 	} | ||||||
|  | 	public void setValue(boolean value) { this.value = value; } | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public String getStringValue() { | ||||||
|  | 		return Boolean.toString(value); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void fromJson(JsonElement e) { | ||||||
|  | 		this.value = e.getAsBoolean(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public JsonElement toJson() { | ||||||
|  | 		return new JsonPrimitive(value); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,59 @@ | ||||||
|  | package pm.j4.petroleum.util.module.option; | ||||||
|  | 
 | ||||||
|  | import com.google.gson.JsonElement; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Configuration option. | ||||||
|  |  */ | ||||||
|  | public abstract class ConfigurationOption { | ||||||
|  | 	/** | ||||||
|  | 	 * The Description. | ||||||
|  | 	 */ | ||||||
|  | 	private final String description; | ||||||
|  | 	private final String key; | ||||||
|  | 	private final ModuleBase parent; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Configuration option. | ||||||
|  | 	 * | ||||||
|  | 	 * @param description the description | ||||||
|  | 	 */ | ||||||
|  | 	public ConfigurationOption(String key, String description, ModuleBase parent) { | ||||||
|  | 		this.description = description; | ||||||
|  | 		this.key = key; | ||||||
|  | 		this.parent = parent; | ||||||
|  | 	} | ||||||
|  | 	/** | ||||||
|  | 	 * Gets description. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the description | ||||||
|  | 	 */ | ||||||
|  | 	public final String getDescription() { | ||||||
|  | 		return this.description; | ||||||
|  | 	} | ||||||
|  | 	public final String getConfigKey() { return key; } | ||||||
|  | 	public final ModuleBase getParent() { return parent; } | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Gets string value. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the string value | ||||||
|  | 	 */ | ||||||
|  | 	public abstract String getStringValue(); | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * From json. | ||||||
|  | 	 * | ||||||
|  | 	 * @param e the e | ||||||
|  | 	 */ | ||||||
|  | 	public abstract void fromJson(JsonElement e); | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * To json json element. | ||||||
|  | 	 * | ||||||
|  | 	 * @return the json element | ||||||
|  | 	 */ | ||||||
|  | 	public abstract JsonElement toJson(); | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -0,0 +1,42 @@ | ||||||
|  | package pm.j4.petroleum.util.module.option; | ||||||
|  | 
 | ||||||
|  | import com.google.gson.JsonElement; | ||||||
|  | import com.google.gson.JsonPrimitive; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Integer value. | ||||||
|  |  */ | ||||||
|  | public class IntegerOption extends ConfigurationOption { | ||||||
|  | 	/** | ||||||
|  | 	 * The Value. | ||||||
|  | 	 */ | ||||||
|  | 	private int value; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Configuration option. | ||||||
|  | 	 * | ||||||
|  | 	 * @param key | ||||||
|  | 	 * @param description the description | ||||||
|  | 	 * @param parent | ||||||
|  | 	 */ | ||||||
|  | 	public IntegerOption(String key, String description, ModuleBase parent) { | ||||||
|  | 		super(key, description, parent); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public String getStringValue() { | ||||||
|  | 		return Integer.toString(value); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void fromJson(JsonElement e) { | ||||||
|  | 		this.value = e.getAsInt(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public JsonElement toJson() { | ||||||
|  | 		return new JsonPrimitive(value); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,66 @@ | ||||||
|  | package pm.j4.petroleum.util.module.option; | ||||||
|  | 
 | ||||||
|  | import com.google.gson.JsonElement; | ||||||
|  | import net.minecraft.client.options.KeyBinding; | ||||||
|  | import pm.j4.petroleum.modules.bindings.BindingInfo; | ||||||
|  | import pm.j4.petroleum.util.config.ConfigManager; | ||||||
|  | import pm.j4.petroleum.util.config.GlobalConfig; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type Keybind value. | ||||||
|  |  */ | ||||||
|  | public class KeybindOption extends ConfigurationOption { | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Value. | ||||||
|  | 	 */ | ||||||
|  | 	private KeyBinding value; | ||||||
|  | 	/** | ||||||
|  | 	 * The Converted value. | ||||||
|  | 	 */ | ||||||
|  | 	private BindingInfo convertedValue; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Configuration option. | ||||||
|  | 	 * | ||||||
|  | 	 * @param key | ||||||
|  | 	 * @param description the description | ||||||
|  | 	 * @param parent | ||||||
|  | 	 */ | ||||||
|  | 	public KeybindOption(String key, String description, ModuleBase parent) { | ||||||
|  | 		super(key, description, parent); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public String getTranslationKey() { | ||||||
|  | 		return value.getTranslationKey(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public String getStringValue() { | ||||||
|  | 		return value.getDefaultKey().getLocalizedText().getString(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void fromJson(JsonElement e) { | ||||||
|  | 		BindingInfo bindingInfo = ConfigManager.deserializeElement(e, BindingInfo.class); | ||||||
|  | 		this.convertedValue = bindingInfo; | ||||||
|  | 		this.value = GlobalConfig.reconstructBinding(bindingInfo); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public JsonElement toJson() { | ||||||
|  | 		return null; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * From keybind. | ||||||
|  | 	 * | ||||||
|  | 	 * @param bind the bind | ||||||
|  | 	 * @param base the base | ||||||
|  | 	 */ | ||||||
|  | 	public void fromKeybind(KeyBinding bind, ModuleBase base) { | ||||||
|  | 		this.value = bind; | ||||||
|  | 		this.convertedValue = GlobalConfig.extractBinding(bind, base); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,37 @@ | ||||||
|  | package pm.j4.petroleum.util.module.option; | ||||||
|  | 
 | ||||||
|  | import com.google.gson.JsonElement; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type List option. | ||||||
|  |  */ | ||||||
|  | public class ListOption extends ConfigurationOption { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Configuration option. | ||||||
|  | 	 * | ||||||
|  | 	 * @param key | ||||||
|  | 	 * @param description the description | ||||||
|  | 	 * @param parent | ||||||
|  | 	 */ | ||||||
|  | 	public ListOption(String key, String description, ModuleBase parent) { | ||||||
|  | 		super(key, description, parent); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public String getStringValue() { | ||||||
|  | 		return "ListObject"; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void fromJson(JsonElement e) { | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public JsonElement toJson() { | ||||||
|  | 		return null; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,42 @@ | ||||||
|  | package pm.j4.petroleum.util.module.option; | ||||||
|  | 
 | ||||||
|  | import com.google.gson.JsonElement; | ||||||
|  | import com.google.gson.JsonPrimitive; | ||||||
|  | import pm.j4.petroleum.util.module.ModuleBase; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * The type String value. | ||||||
|  |  */ | ||||||
|  | public class StringOption extends ConfigurationOption { | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * The Value. | ||||||
|  | 	 */ | ||||||
|  | 	private String value; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Instantiates a new Configuration option. | ||||||
|  | 	 * | ||||||
|  | 	 * @param key | ||||||
|  | 	 * @param description the description | ||||||
|  | 	 * @param parent | ||||||
|  | 	 */ | ||||||
|  | 	public StringOption(String key, String description, ModuleBase parent) { | ||||||
|  | 		super(key, description, parent); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	public String getStringValue() { | ||||||
|  | 		return value; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void fromJson(JsonElement e) { | ||||||
|  | 		this.value = e.getAsString(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public JsonElement toJson() { | ||||||
|  | 		return new JsonPrimitive(value); | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										
											BIN
										
									
								
								src/main/resources/assets/petroleum/icon.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/main/resources/assets/petroleum/icon.png
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 2.6 KiB | 
							
								
								
									
										13
									
								
								src/main/resources/assets/petroleum/lang/en_us.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/main/resources/assets/petroleum/lang/en_us.json
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,13 @@ | ||||||
|  | { | ||||||
|  |   "petroleum.bindings": "Binding Manager", | ||||||
|  |   "petroleum.example": "Test Module", | ||||||
|  |   "petroleum.splashtext": "Splash Text", | ||||||
|  |   "petroleum.modlist": "Module List", | ||||||
|  |   "petroleum.modmenu": "Mod Menu", | ||||||
|  | 
 | ||||||
|  |   "petroleum.xray": "X-ray", | ||||||
|  | 
 | ||||||
|  |   "petroleum.misc": "Miscellaneous", | ||||||
|  |   "petroleum.render": "Render", | ||||||
|  |   "petroleum.options": "Petroleum Options" | ||||||
|  | } | ||||||
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 145 B | 
							
								
								
									
										34
									
								
								src/main/resources/fabric.mod.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								src/main/resources/fabric.mod.json
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,34 @@ | ||||||
|  | { | ||||||
|  |   "schemaVersion": 1, | ||||||
|  |   "id": "petroleum", | ||||||
|  |   "version": "${version}", | ||||||
|  | 
 | ||||||
|  |   "name": "Petroleum", | ||||||
|  |   "description": "Burn it down.", | ||||||
|  |   "authors": [ | ||||||
|  |     "janeptrv" | ||||||
|  |   ], | ||||||
|  |   "contact": { | ||||||
|  |     "homepage": "https://j4.pm/", | ||||||
|  |     "sources": "https://gitdab.com/jane/petroleum" | ||||||
|  |   }, | ||||||
|  |   "license": "WTFPL", | ||||||
|  |   "icon": "assets/petroleum/icon.png", | ||||||
|  |   "environment": "*", | ||||||
|  |   "entrypoints": { | ||||||
|  |     "main": [ | ||||||
|  |       "pm.j4.petroleum.PetroleumMod" | ||||||
|  |     ] | ||||||
|  |   }, | ||||||
|  |   "mixins": [ | ||||||
|  |     "petroleum.mixins.json" | ||||||
|  |   ], | ||||||
|  |   "depends": { | ||||||
|  |     "fabricloader": ">=0.7.4", | ||||||
|  |     "fabric": "*", | ||||||
|  |     "minecraft": "1.16.x" | ||||||
|  |   }, | ||||||
|  |   "suggests": { | ||||||
|  |     "flamingo": "*" | ||||||
|  |   } | ||||||
|  | } | ||||||
							
								
								
									
										18
									
								
								src/main/resources/petroleum.mixins.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								src/main/resources/petroleum.mixins.json
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,18 @@ | ||||||
|  | { | ||||||
|  |   "required": true, | ||||||
|  |   "minVersion": "0.8", | ||||||
|  |   "package": "pm.j4.petroleum.mixin", | ||||||
|  |   "compatibilityLevel": "JAVA_8", | ||||||
|  |   "mixins": [ | ||||||
|  |   ], | ||||||
|  |   "client": [ | ||||||
|  |     "DebugHudMixin", | ||||||
|  |     "EntryListWidgetAccessor", | ||||||
|  |     "ModListMixin", | ||||||
|  |     "OptionsMenuMixin", | ||||||
|  |     "TitleScreenMixin" | ||||||
|  |   ], | ||||||
|  |   "injectors": { | ||||||
|  |     "defaultRequire": 1 | ||||||
|  |   } | ||||||
|  | } | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue