first commit (checkpoint before destruction)
This commit is contained in:
commit
e5a415ddd5
21
.gitignore
vendored
Normal file
21
.gitignore
vendored
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
#Gradle
|
||||||
|
.gradle/
|
||||||
|
build/
|
||||||
|
out/
|
||||||
|
classes/
|
||||||
|
|
||||||
|
#IDEA
|
||||||
|
.idea/
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
*.iws
|
||||||
|
|
||||||
|
#vscode
|
||||||
|
.settings/
|
||||||
|
.vscode/
|
||||||
|
bin/
|
||||||
|
.classpath
|
||||||
|
.project
|
||||||
|
|
||||||
|
#fabric
|
||||||
|
run/
|
21
LICENSE
Normal file
21
LICENSE
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2020 QuImUfu
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
79
build.gradle
Normal file
79
build.gradle
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
plugins {
|
||||||
|
id 'fabric-loom' version '0.2.6-SNAPSHOT'
|
||||||
|
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
|
||||||
|
|
||||||
|
minecraft {
|
||||||
|
}
|
||||||
|
|
||||||
|
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}"
|
||||||
|
|
||||||
|
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_api_version}"
|
||||||
|
}
|
||||||
|
|
||||||
|
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(jar) {
|
||||||
|
builtBy remapJar
|
||||||
|
}
|
||||||
|
artifact("${project.buildDir.absolutePath}/libs/${archivesBaseName}-${project.version}.jar"){
|
||||||
|
builtBy remapJar
|
||||||
|
}
|
||||||
|
artifact(sourcesJar) {
|
||||||
|
builtBy remapSourcesJar
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// select the repositories you want to publish to
|
||||||
|
repositories {
|
||||||
|
// uncomment to publish to the local maven
|
||||||
|
// mavenLocal()
|
||||||
|
}
|
||||||
|
}
|
14
gradle.properties
Normal file
14
gradle.properties
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
org.gradle.jvmargs = -Xmx1G
|
||||||
|
|
||||||
|
#Fabric properties
|
||||||
|
minecraft_version = 1.15.2
|
||||||
|
yarn_mappings = 1.15.2+build.15
|
||||||
|
loader_version = 0.8.2+build.194
|
||||||
|
|
||||||
|
#Mod properties
|
||||||
|
mod_version = 0.7.0
|
||||||
|
maven_group = quimufu.simple_creator
|
||||||
|
archives_base_name = simple_creator
|
||||||
|
|
||||||
|
#Dependencies
|
||||||
|
fabric_api_version = 0.5.12+build.296-1.15
|
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-5.5.1-bin.zip
|
||||||
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
zipStorePath=wrapper/dists
|
188
gradlew
vendored
Executable file
188
gradlew
vendored
Executable file
|
@ -0,0 +1,188 @@
|
||||||
|
#!/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, switch paths to Windows format before running java
|
||||||
|
if $cygwin ; 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=$((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"
|
||||||
|
|
||||||
|
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
|
||||||
|
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
|
||||||
|
cd "$(dirname "$0")"
|
||||||
|
fi
|
||||||
|
|
||||||
|
exec "$JAVACMD" "$@"
|
100
gradlew.bat
vendored
Normal file
100
gradlew.bat
vendored
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
@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 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
|
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()
|
||||||
|
}
|
||||||
|
}
|
292
src/main/java/quimufu/simple_creator/BlockResourceLoader.java
Normal file
292
src/main/java/quimufu/simple_creator/BlockResourceLoader.java
Normal file
|
@ -0,0 +1,292 @@
|
||||||
|
package quimufu.simple_creator;
|
||||||
|
|
||||||
|
import com.google.common.collect.Maps;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.GsonBuilder;
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.Material;
|
||||||
|
import net.minecraft.block.MaterialColor;
|
||||||
|
import net.minecraft.block.piston.PistonBehavior;
|
||||||
|
import net.minecraft.item.BlockItem;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemGroup;
|
||||||
|
import net.minecraft.sound.BlockSoundGroup;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
|
import net.minecraft.util.JsonHelper;
|
||||||
|
import net.minecraft.util.Pair;
|
||||||
|
import net.minecraft.util.registry.Registry;
|
||||||
|
import org.apache.logging.log4j.Level;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static quimufu.simple_creator.SimpleCreatorMod.log;
|
||||||
|
|
||||||
|
|
||||||
|
public class BlockResourceLoader extends GenericManualResourceLoader<Pair<Block, Item>> {
|
||||||
|
private static final Gson GSON = (new GsonBuilder()).setPrettyPrinting().disableHtmlEscaping().create();
|
||||||
|
private static final String dataType = "blocks";
|
||||||
|
public static Map<Identifier, Block> blocks = Maps.newHashMap();
|
||||||
|
public static Map<Identifier, Item> blockItems = Maps.newHashMap();
|
||||||
|
|
||||||
|
BlockResourceLoader() {
|
||||||
|
super(GSON, dataType);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void register(Identifier id, Pair<Block, Item> thing) {
|
||||||
|
Registry.register(Registry.BLOCK, id, thing.getLeft());
|
||||||
|
Registry.register(Registry.ITEM, id, thing.getRight());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void save(Identifier id, Pair<Block, Item> thing) {
|
||||||
|
blocks.put(id, thing.getLeft());
|
||||||
|
blockItems.put(id, thing.getRight());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Pair<Block, Item> deserialize(Pair<Identifier, JsonObject> e) {
|
||||||
|
JsonObject jo = e.getRight();
|
||||||
|
|
||||||
|
PistonBehavior pistonBehavior;
|
||||||
|
boolean blocksMovement;
|
||||||
|
boolean burnable;
|
||||||
|
boolean breakByHand;
|
||||||
|
boolean liquid;
|
||||||
|
boolean replaceable;
|
||||||
|
boolean solid;
|
||||||
|
MaterialColor color;
|
||||||
|
boolean blocksLight;
|
||||||
|
Material material;
|
||||||
|
String materialStr = JsonHelper.getString(jo, "material", "stone");
|
||||||
|
material = getMaterial(materialStr);
|
||||||
|
|
||||||
|
|
||||||
|
// construct block information
|
||||||
|
BlockSoundGroup soundGroup;
|
||||||
|
Identifier dropTableId;
|
||||||
|
boolean collidable;
|
||||||
|
int luminance;
|
||||||
|
float resistance;
|
||||||
|
float hardness;
|
||||||
|
float slipperiness;
|
||||||
|
float slowDownMultiplier;
|
||||||
|
float jumpVelocityMultiplier;
|
||||||
|
boolean opaque;
|
||||||
|
|
||||||
|
String soundGroupStr = JsonHelper.getString(jo, "soundGroup", "stone");
|
||||||
|
soundGroup = getSoundGroup(soundGroupStr);
|
||||||
|
String dropTableIdStr = JsonHelper.getString(jo, "dropTableId", null);
|
||||||
|
dropTableId = getDropTableId(dropTableIdStr);
|
||||||
|
collidable = JsonHelper.getBoolean(jo, "collidable", true);
|
||||||
|
luminance = JsonHelper.getInt(jo, "lightLevel", 0);
|
||||||
|
resistance = JsonHelper.getFloat(jo, "explosionResistance", 6.0F);
|
||||||
|
hardness = JsonHelper.getFloat(jo, "hardness", 1.5F);
|
||||||
|
slipperiness = JsonHelper.getFloat(jo, "slipperiness", 0.6F);
|
||||||
|
slowDownMultiplier = JsonHelper.getFloat(jo, "slowDownMultiplier", 1.0F);
|
||||||
|
jumpVelocityMultiplier = JsonHelper.getFloat(jo, "jumpVelocityMultiplier", 1.0F);
|
||||||
|
opaque = JsonHelper.getBoolean(jo, "opaque", true);
|
||||||
|
|
||||||
|
// save block information in Block.Settings (!!hacky!!)
|
||||||
|
Block.Settings bs = Block.Settings.of(material, material.getColor());
|
||||||
|
Field[] fields = Block.Settings.class.getDeclaredFields();
|
||||||
|
try {
|
||||||
|
fields[0].setAccessible(true);
|
||||||
|
fields[0].set(bs, material);
|
||||||
|
fields[1].setAccessible(true);
|
||||||
|
fields[1].set(bs, material.getColor());
|
||||||
|
fields[2].setAccessible(true);
|
||||||
|
fields[2].setBoolean(bs, collidable);
|
||||||
|
fields[3].setAccessible(true);
|
||||||
|
fields[3].set(bs, soundGroup);
|
||||||
|
fields[4].setAccessible(true);
|
||||||
|
fields[4].setInt(bs, luminance);
|
||||||
|
fields[5].setAccessible(true);
|
||||||
|
fields[5].setFloat(bs, resistance);
|
||||||
|
fields[6].setAccessible(true);
|
||||||
|
fields[6].setFloat(bs, hardness);
|
||||||
|
fields[8].setAccessible(true);
|
||||||
|
fields[8].setFloat(bs, slipperiness);
|
||||||
|
fields[9].setAccessible(true);
|
||||||
|
fields[9].setFloat(bs, slowDownMultiplier);
|
||||||
|
fields[10].setAccessible(true);
|
||||||
|
fields[10].setFloat(bs, jumpVelocityMultiplier);
|
||||||
|
fields[11].setAccessible(true);
|
||||||
|
fields[11].set(bs, dropTableId);
|
||||||
|
fields[12].setAccessible(true);
|
||||||
|
fields[12].setBoolean(bs, opaque);
|
||||||
|
} catch (IllegalAccessException ex) {
|
||||||
|
ex.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
// parse item group
|
||||||
|
String group = JsonHelper.getString(jo, "group", "misc");
|
||||||
|
ItemGroup g = ItemResourceLoader.findGroup(group);
|
||||||
|
//create block and corresponding item
|
||||||
|
Block resB = new Block(bs);
|
||||||
|
Item resI = new BlockItem(resB, new Item.Settings().group(g));
|
||||||
|
|
||||||
|
return new Pair<>(resB, resI);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Identifier getDropTableId(String s) {
|
||||||
|
if (s == null)
|
||||||
|
return null;
|
||||||
|
Identifier i = Identifier.tryParse(s);
|
||||||
|
if (i == null) {
|
||||||
|
log(Level.WARN, "Drop table invalid " + s + ", using default");
|
||||||
|
i = null;
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
private BlockSoundGroup getSoundGroup(String s) {
|
||||||
|
switch (s.toUpperCase()) {
|
||||||
|
case "WOOD":
|
||||||
|
return BlockSoundGroup.WOOD;
|
||||||
|
case "GRAVEL":
|
||||||
|
return BlockSoundGroup.GRAVEL;
|
||||||
|
case "GRASS":
|
||||||
|
return BlockSoundGroup.GRASS;
|
||||||
|
case "STONE":
|
||||||
|
return BlockSoundGroup.STONE;
|
||||||
|
case "METAL":
|
||||||
|
return BlockSoundGroup.METAL;
|
||||||
|
case "GLASS":
|
||||||
|
return BlockSoundGroup.GLASS;
|
||||||
|
case "WOOL":
|
||||||
|
return BlockSoundGroup.WOOL;
|
||||||
|
case "SAND":
|
||||||
|
return BlockSoundGroup.SAND;
|
||||||
|
case "SNOW":
|
||||||
|
return BlockSoundGroup.SNOW;
|
||||||
|
case "LADDER":
|
||||||
|
return BlockSoundGroup.LADDER;
|
||||||
|
case "ANVIL":
|
||||||
|
return BlockSoundGroup.ANVIL;
|
||||||
|
case "SLIME":
|
||||||
|
return BlockSoundGroup.SLIME;
|
||||||
|
case "HONEY":
|
||||||
|
return BlockSoundGroup.HONEY;
|
||||||
|
case "WET_GRASS":
|
||||||
|
return BlockSoundGroup.WET_GRASS;
|
||||||
|
case "CORAL":
|
||||||
|
return BlockSoundGroup.CORAL;
|
||||||
|
case "BAMBOO":
|
||||||
|
return BlockSoundGroup.BAMBOO;
|
||||||
|
case "BAMBOO_SAPLING":
|
||||||
|
return BlockSoundGroup.BAMBOO_SAPLING;
|
||||||
|
case "SCAFFOLDING":
|
||||||
|
return BlockSoundGroup.SCAFFOLDING;
|
||||||
|
case "SWEET_BERRY_BUSH":
|
||||||
|
return BlockSoundGroup.SWEET_BERRY_BUSH;
|
||||||
|
case "CROP":
|
||||||
|
return BlockSoundGroup.CROP;
|
||||||
|
case "STEM":
|
||||||
|
return BlockSoundGroup.STEM;
|
||||||
|
case "NETHER_WART":
|
||||||
|
return BlockSoundGroup.NETHER_WART;
|
||||||
|
case "LANTERN":
|
||||||
|
return BlockSoundGroup.LANTERN;
|
||||||
|
default:
|
||||||
|
log(Level.WARN, "Sound group " + s + " not found, using stone");
|
||||||
|
return BlockSoundGroup.STONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Material getMaterial(String s) {
|
||||||
|
switch (s.toUpperCase()) {
|
||||||
|
case "AIR":
|
||||||
|
return Material.AIR;
|
||||||
|
case "STRUCTURE_VOID":
|
||||||
|
return Material.STRUCTURE_VOID;
|
||||||
|
case "PORTAL":
|
||||||
|
return Material.PORTAL;
|
||||||
|
case "CARPET":
|
||||||
|
return Material.CARPET;
|
||||||
|
case "PLANT":
|
||||||
|
return Material.PLANT;
|
||||||
|
case "UNDERWATER_PLANT":
|
||||||
|
return Material.UNDERWATER_PLANT;
|
||||||
|
case "REPLACEABLE_PLANT":
|
||||||
|
return Material.REPLACEABLE_PLANT;
|
||||||
|
case "SEAGRASS":
|
||||||
|
return Material.SEAGRASS;
|
||||||
|
case "WATER":
|
||||||
|
return Material.WATER;
|
||||||
|
case "BUBBLE_COLUMN":
|
||||||
|
return Material.BUBBLE_COLUMN;
|
||||||
|
case "LAVA":
|
||||||
|
return Material.LAVA;
|
||||||
|
case "SNOW":
|
||||||
|
return Material.SNOW;
|
||||||
|
case "FIRE":
|
||||||
|
return Material.FIRE;
|
||||||
|
case "PART":
|
||||||
|
return Material.PART;
|
||||||
|
case "COBWEB":
|
||||||
|
return Material.COBWEB;
|
||||||
|
case "REDSTONE_LAMP":
|
||||||
|
return Material.REDSTONE_LAMP;
|
||||||
|
case "CLAY":
|
||||||
|
return Material.CLAY;
|
||||||
|
case "EARTH":
|
||||||
|
return Material.EARTH;
|
||||||
|
case "ORGANIC":
|
||||||
|
return Material.ORGANIC;
|
||||||
|
case "PACKED_ICE":
|
||||||
|
return Material.PACKED_ICE;
|
||||||
|
case "SAND":
|
||||||
|
return Material.SAND;
|
||||||
|
case "SPONGE":
|
||||||
|
return Material.SPONGE;
|
||||||
|
case "SHULKER_BOX":
|
||||||
|
return Material.SHULKER_BOX;
|
||||||
|
case "WOOD":
|
||||||
|
return Material.WOOD;
|
||||||
|
case "BAMBOO_SAPLING":
|
||||||
|
return Material.BAMBOO_SAPLING;
|
||||||
|
case "BAMBOO":
|
||||||
|
return Material.BAMBOO;
|
||||||
|
case "WOOL":
|
||||||
|
return Material.WOOL;
|
||||||
|
case "TNT":
|
||||||
|
return Material.TNT;
|
||||||
|
case "LEAVES":
|
||||||
|
return Material.LEAVES;
|
||||||
|
case "GLASS":
|
||||||
|
return Material.GLASS;
|
||||||
|
case "ICE":
|
||||||
|
return Material.ICE;
|
||||||
|
case "CACTUS":
|
||||||
|
return Material.CACTUS;
|
||||||
|
case "STONE":
|
||||||
|
return Material.STONE;
|
||||||
|
case "METAL":
|
||||||
|
return Material.METAL;
|
||||||
|
case "SNOW_BLOCK":
|
||||||
|
return Material.SNOW_BLOCK;
|
||||||
|
case "ANVIL":
|
||||||
|
return Material.ANVIL;
|
||||||
|
case "BARRIER":
|
||||||
|
return Material.BARRIER;
|
||||||
|
case "PISTON":
|
||||||
|
return Material.PISTON;
|
||||||
|
case "UNUSED_PLANT":
|
||||||
|
return Material.UNUSED_PLANT;
|
||||||
|
case "PUMPKIN":
|
||||||
|
return Material.PUMPKIN;
|
||||||
|
case "EGG":
|
||||||
|
return Material.EGG;
|
||||||
|
case "CAKE":
|
||||||
|
return Material.CAKE;
|
||||||
|
default:
|
||||||
|
log(Level.WARN, "Material " + s + " not found, using stone");
|
||||||
|
return Material.STONE;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
124
src/main/java/quimufu/simple_creator/FlexibleBlockSettings.java
Normal file
124
src/main/java/quimufu/simple_creator/FlexibleBlockSettings.java
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
/*package quimufu.simple_creator;
|
||||||
|
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.Material;
|
||||||
|
import net.minecraft.block.MaterialColor;
|
||||||
|
import net.minecraft.sound.BlockSoundGroup;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
|
|
||||||
|
public class FlexibleBlockSettings extends Block {
|
||||||
|
|
||||||
|
public Material getMaterial() {
|
||||||
|
return material;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BlockSoundGroup getSoundGroup() {
|
||||||
|
return soundGroup;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Identifier getDropTableId() {
|
||||||
|
return dropTableId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDropTableId(Identifier dropTableId) {
|
||||||
|
this.dropTableId = dropTableId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCollidable() {
|
||||||
|
return collidable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCollidable(boolean collidable) {
|
||||||
|
this.collidable = collidable;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getLuminance() {
|
||||||
|
return luminance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLuminance(int luminance) {
|
||||||
|
this.luminance = luminance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getResistance() {
|
||||||
|
return resistance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setResistance(float resistance) {
|
||||||
|
this.resistance = resistance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getHardness() {
|
||||||
|
return hardness;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHardness(float hardness) {
|
||||||
|
this.hardness = hardness;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float getSlipperiness() {
|
||||||
|
return slipperiness;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSlipperiness(float slipperiness) {
|
||||||
|
this.slipperiness = slipperiness;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getSlowDownMultiplier() {
|
||||||
|
return slowDownMultiplier;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSlowDownMultiplier(float slowDownMultiplier) {
|
||||||
|
this.slowDownMultiplier = slowDownMultiplier;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float getJumpVelocityMultiplier() {
|
||||||
|
return jumpVelocityMultiplier;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setJumpVelocityMultiplier(float jumpVelocityMultiplier) {
|
||||||
|
this.jumpVelocityMultiplier = jumpVelocityMultiplier;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isOpaque() {
|
||||||
|
return opaque;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOpaque(boolean opaque) {
|
||||||
|
this.opaque = opaque;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MaterialColor getMaterialColor() {
|
||||||
|
return materialColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMaterialColor(MaterialColor materialColor) {
|
||||||
|
this.materialColor = materialColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isRandomTicks() {
|
||||||
|
return randomTicks;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRandomTicks(boolean randomTicks) {
|
||||||
|
this.randomTicks = randomTicks;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isDynamicBounds() {
|
||||||
|
return dynamicBounds;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDynamicBounds(boolean dynamicBounds) {
|
||||||
|
this.dynamicBounds = dynamicBounds;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public FlexibleBlockSettings() {
|
||||||
|
super(Settings.of(Material.AIR));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
|
@ -0,0 +1,33 @@
|
||||||
|
package quimufu.simple_creator;
|
||||||
|
|
||||||
|
import net.minecraft.block.Material;
|
||||||
|
import net.minecraft.block.MaterialColor;
|
||||||
|
import net.minecraft.block.piston.PistonBehavior;
|
||||||
|
|
||||||
|
public class FlexibleMaterialBuilder extends Material.Builder {
|
||||||
|
|
||||||
|
public FlexibleMaterialBuilder(MaterialColor color) {
|
||||||
|
super(color);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Material.Builder blocksPistons() {
|
||||||
|
return super.blocksPistons();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Material.Builder burnable() {
|
||||||
|
return super.burnable();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Material.Builder destroyedByPiston() {
|
||||||
|
return super.destroyedByPiston();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Material.Builder requiresTool() {
|
||||||
|
return super.requiresTool();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,94 @@
|
||||||
|
package quimufu.simple_creator;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import net.fabricmc.fabric.impl.resource.loader.ModResourcePackCreator;
|
||||||
|
import net.minecraft.resource.*;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
|
import net.minecraft.util.JsonHelper;
|
||||||
|
import net.minecraft.util.Pair;
|
||||||
|
import org.apache.logging.log4j.Level;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static quimufu.simple_creator.SimpleCreatorMod.log;
|
||||||
|
|
||||||
|
public abstract class GenericManualResourceLoader<T> {
|
||||||
|
private Gson GSON;
|
||||||
|
private String dataType;
|
||||||
|
|
||||||
|
GenericManualResourceLoader(Gson gson, String dt) {
|
||||||
|
GSON = gson;
|
||||||
|
dataType = dt;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void loadItems(ArrayList<Pair<Identifier, JsonObject>> itemJsonList) {
|
||||||
|
log(Level.INFO, "Start loading " + dataType);
|
||||||
|
for (Pair<Identifier, JsonObject> e : itemJsonList) {
|
||||||
|
Identifier id = e.getLeft();
|
||||||
|
log(Level.INFO, "Loading " + dataType.substring(0,dataType.length()-1) + " " + id);
|
||||||
|
T thing = deserialize(e);
|
||||||
|
save(id, thing);
|
||||||
|
log(Level.INFO, "Registering " + dataType.substring(0,dataType.length()-1) + " " + id);
|
||||||
|
register(id, thing);
|
||||||
|
}
|
||||||
|
log(Level.INFO, "Finished loading " + dataType);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract void register(Identifier id, T thing);
|
||||||
|
|
||||||
|
protected abstract T deserialize(Pair<Identifier, JsonObject> e);
|
||||||
|
|
||||||
|
protected abstract void save(Identifier id, T item);
|
||||||
|
|
||||||
|
public void load() {
|
||||||
|
ResourcePackManager<ResourcePackProfile> resourcePackManager = new ResourcePackManager<>(ResourcePackProfile::new);
|
||||||
|
resourcePackManager.registerProvider(new VanillaDataPackProvider());
|
||||||
|
resourcePackManager.registerProvider(new FileResourcePackProvider(new File("./datapacks")));
|
||||||
|
resourcePackManager.registerProvider(new ModResourcePackCreator(ResourceType.SERVER_DATA));
|
||||||
|
resourcePackManager.scanPacks();
|
||||||
|
List<ResourcePackProfile> ep = Lists.newArrayList(resourcePackManager.getEnabledProfiles());
|
||||||
|
for (ResourcePackProfile rpp : resourcePackManager.getProfiles()) {
|
||||||
|
if (!ep.contains(rpp)) {
|
||||||
|
rpp.getInitialPosition().insert(ep, rpp, resourcePackProfile -> resourcePackProfile, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
resourcePackManager.setEnabledProfiles(ep);
|
||||||
|
|
||||||
|
|
||||||
|
ArrayList<Pair<Identifier, JsonObject>> itemJsonList = new ArrayList<>();
|
||||||
|
for (ResourcePackProfile rpp : resourcePackManager.getEnabledProfiles()) {
|
||||||
|
ResourcePack rp = rpp.createResourcePack();
|
||||||
|
log(Level.INFO, "Loading ResourcePack " + rp.getName());
|
||||||
|
for (String ns : rp.getNamespaces(ResourceType.SERVER_DATA)) {
|
||||||
|
log(Level.INFO, "Loading namespace " + ns);
|
||||||
|
Collection<Identifier> ressurces = rp.findResources(ResourceType.SERVER_DATA, ns, dataType, 5, s -> s.endsWith(".json"));
|
||||||
|
for (Identifier id : ressurces) {
|
||||||
|
Identifier idNice = new Identifier(id.getNamespace(), getName(id));
|
||||||
|
try {
|
||||||
|
InputStream is = rp.open(ResourceType.SERVER_DATA, id);
|
||||||
|
Reader r = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
|
||||||
|
JsonObject jo = JsonHelper.deserialize(GSON, r, JsonObject.class);
|
||||||
|
if (jo != null)
|
||||||
|
itemJsonList.add(new Pair<>(idNice, jo));
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
loadItems(itemJsonList);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getName(Identifier id) {
|
||||||
|
String path = id.getPath();
|
||||||
|
int startLength = dataType.length() + 1;
|
||||||
|
int endLength = ".json".length();
|
||||||
|
return path.substring(startLength, path.length() - endLength);
|
||||||
|
}
|
||||||
|
}
|
149
src/main/java/quimufu/simple_creator/ItemResourceLoader.java
Normal file
149
src/main/java/quimufu/simple_creator/ItemResourceLoader.java
Normal file
|
@ -0,0 +1,149 @@
|
||||||
|
package quimufu.simple_creator;
|
||||||
|
|
||||||
|
import com.google.common.collect.Maps;
|
||||||
|
import com.google.gson.*;
|
||||||
|
import net.minecraft.entity.effect.StatusEffect;
|
||||||
|
import net.minecraft.entity.effect.StatusEffectInstance;
|
||||||
|
import net.minecraft.item.FoodComponent;
|
||||||
|
import net.minecraft.item.Item;
|
||||||
|
import net.minecraft.item.ItemGroup;
|
||||||
|
import net.minecraft.util.Identifier;
|
||||||
|
import net.minecraft.util.JsonHelper;
|
||||||
|
import net.minecraft.util.Pair;
|
||||||
|
import net.minecraft.util.Rarity;
|
||||||
|
import net.minecraft.util.registry.Registry;
|
||||||
|
import org.apache.logging.log4j.Level;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static quimufu.simple_creator.SimpleCreatorMod.log;
|
||||||
|
|
||||||
|
public class ItemResourceLoader extends GenericManualResourceLoader<Item> {
|
||||||
|
private static final Gson GSON = (new GsonBuilder()).setPrettyPrinting().disableHtmlEscaping().create();
|
||||||
|
private static final String dataType = "items";
|
||||||
|
public static Map<Identifier, Item> items = Maps.newHashMap();
|
||||||
|
|
||||||
|
ItemResourceLoader() {
|
||||||
|
super(GSON, dataType);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void register(Identifier id, Item thing) {
|
||||||
|
Registry.register(Registry.ITEM, id, thing);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Item deserialize(Pair<Identifier, JsonObject> e) {
|
||||||
|
JsonObject jo = e.getRight();
|
||||||
|
String group = JsonHelper.getString(jo, "group", "misc");
|
||||||
|
ItemGroup g = findGroup(group);
|
||||||
|
int durability = JsonHelper.getInt(jo, "durability", 0);
|
||||||
|
byte stackSize = JsonHelper.getByte(jo, "stackSize", (byte) 1);
|
||||||
|
boolean isFood = JsonHelper.hasElement(jo, "food");
|
||||||
|
String rarity = JsonHelper.getString(jo, "rarity", "common");
|
||||||
|
|
||||||
|
|
||||||
|
Item.Settings settings = new Item.Settings();
|
||||||
|
settings.group(g);
|
||||||
|
if (isFood) {
|
||||||
|
if (durability != 0) {
|
||||||
|
log(Level.WARN, "durability does not work with food");
|
||||||
|
log(Level.WARN, "ignoring");
|
||||||
|
}
|
||||||
|
settings.maxCount(stackSize);
|
||||||
|
JsonObject jsonFoodObject = JsonHelper.getObject(jo, "food");
|
||||||
|
settings.food(deserializeFoodComponent(jsonFoodObject));
|
||||||
|
} else if (durability != 0 && stackSize != 1) {
|
||||||
|
log(Level.WARN, "durability and stackSize do not work together");
|
||||||
|
log(Level.WARN, "ignoring stackSize");
|
||||||
|
settings.maxDamage(durability);
|
||||||
|
} else {
|
||||||
|
if (durability != 0) {
|
||||||
|
settings.maxDamage(durability);
|
||||||
|
} else {
|
||||||
|
settings.maxCount(stackSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
settings.rarity(findRarity(rarity));
|
||||||
|
return new Item(settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void save(Identifier id, Item item) {
|
||||||
|
items.put(id, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static FoodComponent deserializeFoodComponent(JsonObject jo) {
|
||||||
|
FoodComponent fc;
|
||||||
|
FoodComponent.Builder fcb = new FoodComponent.Builder();
|
||||||
|
fcb.hunger(JsonHelper.getInt(jo, "hunger", 4));
|
||||||
|
fcb.saturationModifier(JsonHelper.getFloat(jo, "saturationModifier", 0.3F));
|
||||||
|
if (JsonHelper.getBoolean(jo, "isAlwaysEdible", false))
|
||||||
|
fcb.alwaysEdible();
|
||||||
|
if (JsonHelper.getBoolean(jo, "isWolfFood", false))
|
||||||
|
fcb.meat();
|
||||||
|
if (JsonHelper.getBoolean(jo, "isFast", false))
|
||||||
|
fcb.snack();
|
||||||
|
if (JsonHelper.hasArray(jo, "effects")) {
|
||||||
|
JsonArray jsonEffectsArray = JsonHelper.getArray(jo, "effects");
|
||||||
|
deserializeEffects(fcb, jsonEffectsArray);
|
||||||
|
}
|
||||||
|
fc = fcb.build();
|
||||||
|
return fc;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void deserializeEffects(FoodComponent.Builder fcb, JsonArray ja) {
|
||||||
|
for (JsonElement e : ja) {
|
||||||
|
StatusEffect type;
|
||||||
|
int duration = 0;
|
||||||
|
int amplifier = 0;
|
||||||
|
boolean ambient = false;
|
||||||
|
boolean visible = true;
|
||||||
|
float chance = 1.F;
|
||||||
|
JsonObject jo = JsonHelper.asObject(e, "effects");
|
||||||
|
String effect = JsonHelper.getString(jo, "effect");
|
||||||
|
Identifier ei = Identifier.tryParse(effect);
|
||||||
|
if (ei != null) {
|
||||||
|
StatusEffect se = Registry.STATUS_EFFECT.get(ei);
|
||||||
|
if (se != null) {
|
||||||
|
type = se;
|
||||||
|
} else {
|
||||||
|
log(Level.WARN, "Effect " + ei + " not found, skipping");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log(Level.WARN, "Effect id " + effect + " invalid, skipping");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
duration = JsonHelper.getInt(jo, "duration", duration);
|
||||||
|
amplifier = JsonHelper.getInt(jo, "amplifier", amplifier);
|
||||||
|
ambient = JsonHelper.getBoolean(jo, "ambient", ambient);
|
||||||
|
visible = JsonHelper.getBoolean(jo, "visible", visible);
|
||||||
|
chance = JsonHelper.getFloat(jo, "chance", chance);
|
||||||
|
fcb.statusEffect(new StatusEffectInstance(type, duration, amplifier, ambient, visible), chance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Rarity findRarity(String filter) {
|
||||||
|
for (Rarity r : Rarity.values()) {
|
||||||
|
if (r.name().toLowerCase().equals(filter.toLowerCase()))
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
log(Level.WARN, "Rarity " + filter + " not found, using common");
|
||||||
|
log(Level.INFO, "Valid groups:" + Arrays.stream(Rarity.values()).map(Rarity::name).map(String::toLowerCase));
|
||||||
|
return Rarity.COMMON;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ItemGroup findGroup(String filter) {
|
||||||
|
for (ItemGroup g : ItemGroup.GROUPS) {
|
||||||
|
if (g.getName().toLowerCase().equals(filter.toLowerCase())) {
|
||||||
|
return g;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log(Level.WARN, "Item Group " + filter + " not found, using misc");
|
||||||
|
log(Level.INFO, "Valid groups:" + Arrays.stream(ItemGroup.GROUPS).map(ItemGroup::getId));
|
||||||
|
return ItemGroup.MISC;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
29
src/main/java/quimufu/simple_creator/SimpleCreatorMod.java
Normal file
29
src/main/java/quimufu/simple_creator/SimpleCreatorMod.java
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
package quimufu.simple_creator;
|
||||||
|
|
||||||
|
import net.fabricmc.api.ModInitializer;
|
||||||
|
|
||||||
|
import org.apache.logging.log4j.Level;
|
||||||
|
import org.apache.logging.log4j.LogManager;
|
||||||
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
|
public class SimpleCreatorMod implements ModInitializer {
|
||||||
|
|
||||||
|
public static Logger LOGGER = LogManager.getLogger();
|
||||||
|
public static ItemResourceLoader irl = new ItemResourceLoader();
|
||||||
|
public static BlockResourceLoader brl = new BlockResourceLoader();
|
||||||
|
|
||||||
|
public static final String MOD_ID = "simple_creator";
|
||||||
|
public static final String MOD_NAME = "Simple Item/Block Creator";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onInitialize() {
|
||||||
|
log(Level.INFO, "Initializing");
|
||||||
|
irl.load();
|
||||||
|
brl.load();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void log(Level level, String message){
|
||||||
|
LOGGER.log(level, "["+MOD_NAME+"] " + message);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
"variants": {
|
||||||
|
"": [
|
||||||
|
{ "model": "block/bedrock" },
|
||||||
|
{ "model": "block/bedrock_mirrored" },
|
||||||
|
{ "model": "block/bedrock", "y": 180 },
|
||||||
|
{ "model": "block/bedrock_mirrored", "y": 180 }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
BIN
src/main/resources/assets/simple_creator/icon.png
Normal file
BIN
src/main/resources/assets/simple_creator/icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 23 KiB |
3
src/main/resources/assets/simple_creator/lang/en_us.json
Normal file
3
src/main/resources/assets/simple_creator/lang/en_us.json
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"item.simple_creator.test_item": "Forbidden Fruit"
|
||||||
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
{
|
||||||
|
"parent": "block/bedrock"
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
{
|
||||||
|
"parent": "item/generated",
|
||||||
|
"textures": {
|
||||||
|
"layer0": "item/apple"
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
{
|
||||||
|
"material": "LAVA",
|
||||||
|
"mapColor" :
|
||||||
|
"soundGroup": "wool",
|
||||||
|
"dropTableId": "minecraft:blocks/diamond_ore",
|
||||||
|
"collidable": true,
|
||||||
|
"lightLevel": 1,
|
||||||
|
"explosionResistance": 5.0,
|
||||||
|
"hardness": 0.5,
|
||||||
|
"slipperiness": 0.6,
|
||||||
|
"slowDownMultiplier": 2.0,
|
||||||
|
"jumpVelocityMultiplier": 2.0,
|
||||||
|
"opaque": true,
|
||||||
|
"group": "food"
|
||||||
|
}
|
23
src/main/resources/data/simple_creator/items/test_item.json
Normal file
23
src/main/resources/data/simple_creator/items/test_item.json
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
{
|
||||||
|
"group" :"food",
|
||||||
|
"durability" : 15,
|
||||||
|
"stackSize": 25,
|
||||||
|
"rarity" :"rare",
|
||||||
|
"food": {
|
||||||
|
"hunger": 4,
|
||||||
|
"saturationModifier": 0.3,
|
||||||
|
"isAlwaysEdible": true,
|
||||||
|
"isWolfFood": false,
|
||||||
|
"isFast": true,
|
||||||
|
"effects": [
|
||||||
|
{
|
||||||
|
"effect": "minecraft:poison",
|
||||||
|
"duration": 200,
|
||||||
|
"amplifier": 1,
|
||||||
|
"ambient": false,
|
||||||
|
"visible": true,
|
||||||
|
"chance": 1.0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
"type": "minecraft:block",
|
||||||
|
"pools": [
|
||||||
|
{
|
||||||
|
"rolls": 1,
|
||||||
|
"entries": [
|
||||||
|
{
|
||||||
|
"type": "minecraft:item",
|
||||||
|
"conditions": [
|
||||||
|
{
|
||||||
|
"condition": "minecraft:survives_explosion"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "simple_creator:test_block"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
27
src/main/resources/fabric.mod.json
Normal file
27
src/main/resources/fabric.mod.json
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
{
|
||||||
|
"schemaVersion": 1,
|
||||||
|
"id": "simple_creator",
|
||||||
|
"version": "${version}",
|
||||||
|
"name": "Simple Item/Block Creator",
|
||||||
|
"description": "Makes it possible to add simple blocks/items via datapacks.",
|
||||||
|
"authors": [
|
||||||
|
"QuImUfu"
|
||||||
|
],
|
||||||
|
"contributors": [],
|
||||||
|
"contact": {},
|
||||||
|
"license": "MIT",
|
||||||
|
"icon": "assets/simple_creator/icon.png",
|
||||||
|
"environment": "*",
|
||||||
|
"entrypoints": {
|
||||||
|
"main": [
|
||||||
|
"quimufu.simple_creator.SimpleCreatorMod"
|
||||||
|
],
|
||||||
|
"client": [],
|
||||||
|
"server": []
|
||||||
|
},
|
||||||
|
"mixins": [],
|
||||||
|
"depends": {
|
||||||
|
"fabricloader": ">=0.4.0",
|
||||||
|
"fabric": "*"
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user