From d7315f04ba95c6565f1f87dac58027e3e7e98b7e Mon Sep 17 00:00:00 2001 From: stfwi Date: Sun, 10 Feb 2019 16:48:46 +0100 Subject: [PATCH 01/14] Initial gitignore and gradle files. --- .gitignore | 31 +++++ build.gradle | 76 +++++++++++ gradle.properties | 14 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53319 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 164 +++++++++++++++++++++++ gradlew.bat | 90 +++++++++++++ license | 2 +- 8 files changed, 382 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 gradlew create mode 100644 gradlew.bat diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bc342eb --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +bin +*.launch +.settings +.metadata +.classpath +.project +out +*.ipr +*.iws +*.iml +.idea +build +.gradle +*.tmp +*.log +*.jks +eclipse +run +tests +/dist +signing.* +src/main/java/archive +src/main/resources/assets/minecraft +.vscode +/classes +/dev +/tmp +/archive +/assets-src +.gimp +*.xcf diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..8d52f57 --- /dev/null +++ b/build.gradle @@ -0,0 +1,76 @@ +// @file build.gradle +// Engineer's decor mod gradle build relay (mc1.12.2) +// +buildscript { + repositories { + jcenter() + maven { url = "http://files.minecraftforge.net/maven" } + } + dependencies { + classpath 'net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT' + } +} +apply plugin: 'net.minecraftforge.gradle.forge' +sourceCompatibility = targetCompatibility = '1.8' +compileJava { // Need this here so eclipse task generates correctly. + sourceCompatibility = targetCompatibility = '1.8' +} + +//----------------------------------------------------------------------------- +version = "${version_engineersdecor}" +group = "wile.engineersdecor" +archivesBaseName = "engineersdecor-${version_minecraft}" + +def signing = { -> + def sp = new Properties() + if(file("signing.properties").exists()) file("signing.properties").withInputStream { sp.load(it) } + return sp +}() + +def git_version = { -> + def stdout = new ByteArrayOutputStream() + exec { + commandLine 'git', 'log', '-1', '--format=%h' + standardOutput = stdout + } + return stdout.toString().trim() +}() + +minecraft { + version = "${version_minecraft}-${version_forge}" + runDir = "run" + mappings = "stable_39" + replace '@MOD_BUILDID@', "#${git_version}" + replace '@MOD_SIGNSHA1@', signing.getProperty('fingerprint_sha1') + replace '@MOD_VERSION@', "${version_engineersdecor}" + replace '@MOD_MCVERSION@', "${version_minecraft}" + replaceIn "ModEngineersDecor.java" +} + +dependencies { +} + +processResources { + inputs.property "version", project.version + inputs.property "mcversion", project.minecraft.version + from(sourceSets.main.resources.srcDirs) { + include 'mcmod.info' + expand 'version':project.version, 'mcversion':project.minecraft.version + } + from(sourceSets.main.resources.srcDirs) { + exclude 'mcmod.info' + } +} + +task signJar(type: SignJar, dependsOn: reobfJar) { + onlyIf { signing.getProperty("keystore_file"); } + keyStore = signing.getProperty("keystore_file") + alias = signing.getProperty("keystore_alias") + storePass = signing.getProperty("keystore_pass") + keyPass = signing.getProperty("keystore_keypass") + inputFile = jar.archivePath + outputFile = jar.archivePath +} +build.dependsOn signJar + +// EOF diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..ce61bf7 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,14 @@ +# @file gradle.properties +org.gradle.daemon=false +org.gradle.jvmargs=-Xmx8G +version_minecraft=1.12.2 +version_forge=14.23.5.2768 +version_engineersdecor=1.0.0-b1 +# +# jar signing data loaded from signing.properties in the project root. +# +#signing.keystore_file= +#signing.keystore_alias= +#signing.keystore_pass= +#signing.keystore_keypass= +#fingerprint_sha1.fp_sha1= diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..d3b83982b9b1bccad955349d702be9b884c6e049 GIT binary patch literal 53319 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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..bac49df --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Sun Nov 25 15:35:29 CET 2018 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-bin.zip diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..27309d9 --- /dev/null +++ b/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## 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="" + +# 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 + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..f6d5974 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,90 @@ +@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= + +@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 +if "%@eval[2+2]" == "4" goto 4NT_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=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +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 diff --git a/license b/license index 37ec652..e86a396 100644 --- a/license +++ b/license @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2018-2018 Stefan Wilhelm (wile) +Copyright (c) 2018-2019 Stefan Wilhelm (wile) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 67d3b6e922dac63c002bf820769ced5ef57c2e19 Mon Sep 17 00:00:00 2001 From: stfwi Date: Sun, 10 Feb 2019 16:54:42 +0100 Subject: [PATCH 02/14] Initial build and sanatizing scripts ported from rsgauges. --- .gitignore | 1 + scripts/sanatize-dist-check.js | 40 ++++++++ scripts/sanatize-sync-languages.js | 122 +++++++++++++++++++++++ scripts/sanatize-tabs-to-spaces.js | 25 +++++ scripts/sanatize-trailing-whitespaces.js | 25 +++++ scripts/sanatize-version-check.js | 42 ++++++++ scripts/task-dist.js | 33 ++++++ scripts/task-update-json.js | 65 ++++++++++++ 8 files changed, 353 insertions(+) create mode 100644 scripts/sanatize-dist-check.js create mode 100644 scripts/sanatize-sync-languages.js create mode 100644 scripts/sanatize-tabs-to-spaces.js create mode 100644 scripts/sanatize-trailing-whitespaces.js create mode 100644 scripts/sanatize-version-check.js create mode 100644 scripts/task-dist.js create mode 100644 scripts/task-update-json.js diff --git a/.gitignore b/.gitignore index bc342eb..a2db5a4 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,4 @@ src/main/resources/assets/minecraft /assets-src .gimp *.xcf +desktop.ini diff --git a/scripts/sanatize-dist-check.js b/scripts/sanatize-dist-check.js new file mode 100644 index 0000000..bdb67ef --- /dev/null +++ b/scripts/sanatize-dist-check.js @@ -0,0 +1,40 @@ +#!/usr/bin/djs +if((!fs.chdir(fs.dirname(fs.realpath(sys.script))+"/..")) || (!fs.isdir(".git"))) throw new Error("Failed to switch to mod source directory."); + +const uncommitted_changes = sys.shell("git status -s").trim(); + +const gittags = sys.shell('git log -1 --format="%D"') + .replace(/[\s]/g,"").split(",") + .filter(function(s){ return s.indexOf("tag:")==0;}) + .map(function(s){ return s.replace(/^tag:/,"");}); + +const version_engineersdecor = fs.readfile("gradle.properties", function(line){ + if(line.trim().indexOf("version_engineersdecor")!=0) return false; + return line.replace(/^.*?=/,"").trim() +}).trim(); + +const git_remote = sys.shell("git remote -v").trim(); +const git_branch = sys.shell("git rev-parse --abbrev-ref HEAD").trim(); +const git_diff = sys.shell("git diff").trim(); +var fails = []; + +if(version_engineersdecor=="") fails.push("Could not determine 'version_engineersdecor' from gradle properties."); +if(!gittags.length) fails.push("Version not tagged."); +if(!gittags.filter(function(s){return s.indexOf(version_engineersdecor.replace(/[-]/g,""))>=0}).length) fails.push("No tag version not found matching the gradle properties version."); +if(git_remote.replace(/[\s]/g,"").indexOf("git@github.com:stfwi/engineers-decor.git(push)") < 0) fails.push("Not the reference repository."); +if((git_branch != "develop") && (git_branch != "master")) { + fails.push("No valid branch for dist. (branch:'"+git_branch+"')"); +} else if((git_branch == "develop") && (version_engineersdecor.replace(/[^\w\.-]/g,"")=="")) { + fails.push("Cannot make release dist on develop branch."); +} else if((git_branch == "master") && (version_engineersdecor.replace(/[^\w\.-]/g,"")!="")) { + fails.push("Cannot make beta dist on master branch."); +} +if(git_diff !== "") fails.push("Not everything committed to the GIT repository."); +if((!fs.isfile("signing.jks")) || (!fs.isfile("signing.properties"))) fails.push("Jar signing files missing."); + +if(fails.length>0) { + for(var i in fails) fails[i] = " - " + fails[i]; + alert("Dist check failed"); + alert(fails.join("\n")+"\n"); + exit(1); +} diff --git a/scripts/sanatize-sync-languages.js b/scripts/sanatize-sync-languages.js new file mode 100644 index 0000000..3390036 --- /dev/null +++ b/scripts/sanatize-sync-languages.js @@ -0,0 +1,122 @@ +#!/usr/bin/djs +if((!fs.chdir(fs.dirname(fs.realpath(sys.script))+"/..")) || (!fs.isdir("src"))) throw new Error("Failed to switch to mod source directory."); + +function load() { + var lang_data = {}; + fs.find("./src/main/resources/assets/engineersdecor/lang", '*.lang', function(f){ + var lang_code = fs.basename(f).replace(/\..*$/,"").trim().toLowerCase(); + var lines = fs.readfile(f).trim().split("\n"); + var was_eol_escape = false; + for(var i in lines) { + if(was_eol_escape) { + var k=0; + for(k=i-1; k>=0; --k) { + if(lines[k] != null) { + lines[k] += "\n" + lines[i]; + break; + } + } + was_eol_escape = lines[i].match(/[^\\][\\]$/) != null; + lines[i] = null; + } else { + lines[i] = lines[i].trim(); + was_eol_escape = lines[i].match(/[^\\][\\]$/) != null; + } + } + lang_data[lang_code] = lines.filter(function(l){return (l!==null);}); + return false; + }); + return lang_data; +} + +function reference_content(lang_data, reflang_code) { + var lang_lines = []; + for(var i in lang_data[reflang_code]) { + var txt = lang_data[reflang_code][i].trim(); + if((txt.search(/^#/)>=0) || (txt.search("=")<0)) { lang_lines.push(txt); continue; }; // comment "#" or empty line in the ref lang file + var kv = txt.split("=", 2); + var key = kv[0].trim(); + var val = kv[1].trim(); + var o = {key:key, tr:{}}; + o.tr[reflang_code] = val; + lang_lines.push(o); + } + delete lang_data[reflang_code]; + return lang_lines; +} + +function add_language(lang_lines, lang_name, lang_data) { + const find_line = function(lines, key) { + for(var i in lines) { + if((typeof(lines[i]) !== "object")) continue; + if(lines[i].key.toLowerCase()==key.toLowerCase()) return i; + } + return -1; + }; + for(var i in lang_data) { + var txt = lang_data[i].trim(); + if(txt.search(/^#/)>=0) continue; + if(txt.search("=")<0) continue; + var kv = txt.split("=", 2); + var key = kv[0].trim(); + var val = kv[1].trim(); + var line_i = find_line(lang_lines, key); + if(line_i >= 0) { + lang_data[i] = undefined; + lang_lines[line_i].tr[lang_name] = val; + } + } + return lang_data; +} + +function complete_lang_lines(lang_lines, lang_names, reflang_code) { + var lang_outputs = {}; + for(var i in lang_names) lang_outputs[lang_names[i]] = []; + for(var i_line in lang_lines) { + var entry = lang_lines[i_line]; + if(typeof(entry) !== "object") { + for(var i in lang_names) lang_outputs[lang_names[i]].push(entry); + } else { + for(var i in lang_names) { + var name = lang_names[i]; + if(entry.tr[name] !== undefined) { + lang_outputs[name].push(entry.key + "=" + entry.tr[name]); + } else { + var added = entry.key + "=" + entry.tr[reflang_code]; + if((entry.key.search(/\.tip$/)>0) || (entry.key.search(/\.help$/)>0)) added = "#" + added; + lang_outputs[name].push(added); + if(added.search(/^#/)<0) print("[warn] Lang: Added default language for missing entry in " + name + ": '" + added + "'"); + } + } + } + } + return lang_outputs; +} + +const reflang_code = "en_us"; +var lang_data = load(); +var lang_names = Object.keys(lang_data); +var lang_lines = reference_content(lang_data, reflang_code); +for(var lang_name in lang_data) { + lang_data[lang_name] = add_language(lang_lines, lang_name, lang_data[lang_name]); + lang_data[lang_name] = lang_data[lang_name].filter(function(l){ return !!l; }); + if(lang_data[lang_name].length == 0) delete lang_data[lang_name]; +} +var output_data = complete_lang_lines(lang_lines, lang_names, reflang_code); +for(var i in output_data) output_data[i] = output_data[i].join("\n") + "\n\n"; + +// Remaining lines in lang files (not in the reference lang file) +for(var lang_name in lang_data) { + for(var i in lang_data[lang_name]) { + if(lang_data[lang_name][i].search(/^#/)<0) { + var added = "# " + lang_data[lang_name][i].replace(/^[#\s]+/,""); + output_data[lang_name] += added + "\n"; + print("[warn] Lang: Commented out unknown key in " + lang_name + ": '" + added + "'"); + } + } +} +for(var name in output_data) output_data[name] = output_data[name].trim() + "\n"; + +for(var name in output_data) { + fs.writefile("./src/main/resources/assets/engineersdecor/lang/" + name + ".lang", output_data[name]); +} diff --git a/scripts/sanatize-tabs-to-spaces.js b/scripts/sanatize-tabs-to-spaces.js new file mode 100644 index 0000000..1bb65a8 --- /dev/null +++ b/scripts/sanatize-tabs-to-spaces.js @@ -0,0 +1,25 @@ +#!/usr/bin/djs +if((!fs.chdir(fs.dirname(fs.realpath(sys.script))+"/..")) || (!fs.isdir("src"))) throw new Error("Failed to switch to mod source directory."); + +var file_list = (function() { + var ls = []; + const ext = ['java','lang']; + for(var i in ext) ls = ls.concat(fs.find("./src", '*.'+ext[i])); + for(var i in ls) ls[i] = ls[i].replace(/\\/g,"/"); + ls.sort(); + ls.push("readme.md"); + return ls; +})(); + +for(var file_i in file_list) { + var file = file_list[file_i]; + var txt = fs.readfile(file); + if(txt===undefined) throw new Error("Failed to read '" + file + "'"); + const txt_length = txt.length; + txt = txt.replace(/[\t]/g," "); + const n = txt.length - txt_length; + if(n > 0) { + print("File '" + file + "': Changed " + n + " tabs to 2 spaces." ); + fs.writefile(file, txt); + } +} diff --git a/scripts/sanatize-trailing-whitespaces.js b/scripts/sanatize-trailing-whitespaces.js new file mode 100644 index 0000000..ee683d8 --- /dev/null +++ b/scripts/sanatize-trailing-whitespaces.js @@ -0,0 +1,25 @@ +#!/usr/bin/djs +if((!fs.chdir(fs.dirname(fs.realpath(sys.script))+"/..")) || (!fs.isdir("src"))) throw new Error("Failed to switch to mod source directory."); + +var file_list = (function() { + var ls = []; + const ext = ['java','json','lang']; + for(var i in ext) ls = ls.concat(fs.find("./src", '*.'+ext[i])); + for(var i in ls) ls[i] = ls[i].replace(/\\/g,"/"); + ls.sort(); + ls.push("readme.md"); + return ls; +})(); + +for(var file_i in file_list) { + var file = file_list[file_i]; + var txt = fs.readfile(file); + if(txt===undefined) throw new Error("Failed to read '" + file + "'"); + const txt_length = txt.length; + txt = txt.replace(/[\r\t ]+[\n]/g,"\n"); + const n = txt_length - txt.length; + if(n > 0) { + print("File '" + file + "': Fixed " + n + " lines with trailing whitespaces." ); + fs.writefile(file, txt); + } +} diff --git a/scripts/sanatize-version-check.js b/scripts/sanatize-version-check.js new file mode 100644 index 0000000..975a02f --- /dev/null +++ b/scripts/sanatize-version-check.js @@ -0,0 +1,42 @@ +#!/usr/bin/djs +"use strict"; + +if((!fs.chdir(fs.dirname(fs.realpath(sys.script))+"/..")) || (!fs.isdir("src"))) throw new Error("Failed to switch to mod base directory."); + +var version_minecraft=""; +var version_forge=""; +var version_engineersdecor=""; + +fs.readfile("gradle.properties", function(line){ + if(line.search(/^[\s]*version_minecraft[\s]*=/i) >= 0) { + version_minecraft = line.replace(/^[^=]+=/,"").trim(); + } else if(line.search(/^[\s]*version_forge[\s]*=/i) >= 0) { + version_forge = line.replace(/^[^=]+=/,"").trim(); + } else if(line.search(/^[\s]*version_engineersdecor[\s]*=/i) >= 0) { + version_engineersdecor = line.replace(/^[^=]+=/,"").trim(); + } + return false; +}) + +const combined_version = version_minecraft + "-" + version_engineersdecor; + +var readme_version_found = fs.readfile("readme.md", function(line){ + var m = line.match(/^[\s]+-[\s]+v([\d]+[\.][\d]+[\.][\d]+[-][abrc][\d]+)/i); + if((!m) || (!m.length) || (m.length < 2)) { + m = line.match(/^[\s]+-[\s]+v([\d]+[\.][\d]+[\.][\d]+)/i); + if((!m) || (!m.length) || (m.length < 2)) return false; + } + return m[1]==version_engineersdecor; +}); + +var ok=true; +if(!readme_version_found) { + alert("Version 'v" + version_engineersdecor + "' not found in the readme changelog."); + ok = false; +} +if(!ok) { + alert("Version data:"); + alert(" - combined_version : '" + combined_version + "'"); + alert(" - version_forge : '" + version_forge + "'"); + exit(1); +} diff --git a/scripts/task-dist.js b/scripts/task-dist.js new file mode 100644 index 0000000..6af7d72 --- /dev/null +++ b/scripts/task-dist.js @@ -0,0 +1,33 @@ +#!/usr/bin/djs +"use strict"; +if((!fs.chdir(fs.dirname(fs.realpath(sys.script))+"/..")) || (!fs.isdir(".git"))) throw new Error("Failed to switch to mod source directory."); + +function readme_history(file_path) { + var readme = fs.readfile(file_path); + if(!readme) throw new Error("Failed to load readme.md"); + readme = readme.split(/[\r]?[\n]/); + while((readme.length > 0) && readme[0].search(/^## Revision history/i)<0) readme.shift(); + while((readme.length > 0) && readme[0].trim()=="") readme.shift(); + // revision history section + if(!readme.length) throw new Error("Revision history section not found in readme"); + readme.shift(); + var end_of_history = readme.length; + for(var i=0; i= 0) { end_of_history=i; break; } + if(end_of_history >= readme.length) throw new Error("Could not find the end-of-history header marker."); + // remove empty lines, splitters + while(readme.length >= end_of_history) readme.pop(); + while((readme.length >0) && (readme[readme.length-1].replace(/[\s-]/g,"")=="")) readme.pop(); + + const min_indent = readme + .map(function(s){return s.search(/[^\s]/)}) + .filter(function(e){return e>=0}) + .reduce(function(acc,e){return (e 1) { + for(var i in readme) { readme[i] = readme[i].substr(min_indent-2); } + } + return readme.join("\n"); +} + +const html = "
\n" + (readme_history("readme.md").replace(/&/g, "&").replace(/>/g, ">").replace(/";
+fs.writefile("dist/revision-history.html", html);
diff --git a/scripts/task-update-json.js b/scripts/task-update-json.js
new file mode 100644
index 0000000..b3624cd
--- /dev/null
+++ b/scripts/task-update-json.js
@@ -0,0 +1,65 @@
+#!/usr/bin/djs
+"use strict";
+const root_dir = fs.realpath(fs.dirname(sys.script)+"/..");
+
+function read_history() {
+  var readme = fs.readfile(root_dir + "/readme.md");
+  if(!readme) throw new Error("Failed to load readme.md");
+  readme = readme.split(/[\r]?[\n]/);
+  while((readme.length > 0) && readme[0].search(/^## Revision history/i)<0) readme.shift();
+  // revision history section
+  if(!readme.length) throw new Error("Revision history section not found in readme");
+  readme.shift();
+  var end_of_history = readme.length;
+  for(var i=0; i= 0) { end_of_history=i; break; }
+  if(end_of_history >= readme.length) throw new Error("Could not find the end-of-history header marker.");
+  // remove empty lines, splitters
+  while(readme.length >= end_of_history) readme.pop();
+  for(var i in readme) readme[i] = readme[i].replace(/[\s]+$/g,"").replace(/[\t]/g,"  ");
+  readme = readme.filter(function(a){return a.replace(/[\s-]+/g,"")!="";});
+  // condense multilines to single line entries for each fix or feature. ([A] ... [M] ...)
+  for(var i=readme.length-1; i>0; --i) {
+    var line = readme[i].replace(/^\s+/,"");
+    if(line.search(/^[\[\-]/) < 0) {
+      readme[i-1] += " " + line;
+      readme[i] = "";
+    }
+  }
+  readme = readme.filter(function(a){return a!="";});
+  // Condense log entries sepatated with newlines to one line for each version
+  for(var i=readme.length-1; i>0; --i) {
+    var line = readme[i].replace(/^\s+/,"");
+    if(line.search(/^-/) < 0) {
+      readme[i-1] += "\n" + line;
+      readme[i] = "";
+    }
+  }
+  readme = readme.filter(function(a){return a!="";});
+  // Separate versions.
+  var history = {};
+  for(var i in readme) {
+    var line = readme[i].replace(/^[\sv-]+/g,"").trim();
+    var ver = line.substr(0, line.search(" ")).trim().toLowerCase();
+    var txt = line.substr(line.search(" ")).trim();
+    if(history[ver] !== undefined) throw new Error("Double definition of version '" + ver + "' in the readme revision history.");
+    history[ver] = txt;
+  }
+  return history;
+}
+
+var history = read_history();
+var latest_release = "";
+var latest_beta = "";
+for(var ver in history) { latest_beta=ver; break; }
+for(var ver in history) if(ver.search(/(rc|b|a)/) < 0) { latest_release=ver; break; }
+
+var update_json = {
+  homepage: "https://www.curseforge.com/minecraft/mc-mods/redstone-gauges-and-switches/",
+  "1.12.2": history,
+  promos: {
+    "1.12.2-recommended": latest_release,
+    "1.12.2-latest": latest_beta,
+  }
+}
+
+fs.writefile(root_dir + "/meta/update.json", JSON.stringify(update_json, null, 2));

From f8aaf132a65b7040340142697cc14c0f2d178b71 Mon Sep 17 00:00:00 2001
From: stfwi 
Date: Sun, 10 Feb 2019 17:00:38 +0100
Subject: [PATCH 03/14] Initial sources added.

---
 .../engineersdecor/ModEngineersDecor.java     | 108 ++++++++++
 .../engineersdecor/blocks/BlockDecor.java     | 159 +++++++++++++++
 .../blocks/BlockDecorDirected.java            | 112 +++++++++++
 .../engineersdecor/blocks/BlockDecorFull.java |  60 ++++++
 .../blocks/BlockDecorLadder.java              | 134 ++++++++++++
 .../blocks/BlockDecorStairs.java              |  27 +++
 .../wile/engineersdecor/blocks/ModBlocks.java | 109 ++++++++++
 .../engineersdecor/detail/ClientProxy.java    |  27 +++
 .../engineersdecor/detail/ModAuxiliaries.java | 136 +++++++++++++
 .../wile/engineersdecor/detail/ModConfig.java |  52 +++++
 .../detail/RecipeCondModSpecific.java         |  69 +++++++
 .../engineersdecor/detail/ServerProxy.java    |  26 +++
 .../blockstates/clinker_brick_block.json      |  20 ++
 .../blockstates/clinker_brick_stairs.json     |  56 ++++++
 .../blockstates/iron_sheet_roof.json          |  55 +++++
 .../blockstates/iron_sheet_roof_block.json    |  11 +
 .../blockstates/metal_rung_ladder.json        |   9 +
 .../blockstates/metal_rung_steps.json         |   9 +
 .../blockstates/slag_brick_block.json         |  20 ++
 .../blockstates/slag_brick_stairs.json        |  56 ++++++
 .../blockstates/treated_wood_ladder.json      |   9 +
 .../blockstates/treated_wood_pole.json        |  17 ++
 .../blockstates/treated_wood_table.json       |   8 +
 .../assets/engineersdecor/lang/en_us.lang     |  49 +++++
 .../resources/assets/engineersdecor/logo.png  | Bin 0 -> 124533 bytes
 .../models/block/clinker_brick_model.json     |   1 +
 .../models/block/decor_full_block_model.json  |   1 +
 .../models/block/metal_rung_ladder_model.json | 159 +++++++++++++++
 .../models/block/metal_rung_steps_model.json  | 166 +++++++++++++++
 .../block/pole/straight_pole_model.json       |  75 +++++++
 .../models/block/slag_brick_model.json        |   1 +
 .../block/stairs/decor_inner_roof_model.json  | 163 +++++++++++++++
 .../stairs/decor_inner_stairs_model.json      |  45 +++++
 .../block/stairs/decor_outer_roof_model.json  |  99 +++++++++
 .../stairs/decor_outer_stairs_model.json      |  33 +++
 .../stairs/decor_straight_roof_model.json     | 114 +++++++++++
 .../stairs/decor_straight_stairs_model.json   |  48 +++++
 .../block/treated_wood_ladder_model.json      |  94 +++++++++
 .../block/treated_wood_table_model.json       | 190 ++++++++++++++++++
 .../engineersdecor/recipes/_constants.json    | 132 ++++++++++++
 .../engineersdecor/recipes/_factories.json    |   5 +
 .../recipes/clinker_brick_recipe.json         |  28 +++
 .../recipes/clinker_brick_stairs_recipe.json  |  24 +++
 ...clinker_brick_stairs_recipe_decompose.json |  23 +++
 .../recipes/metal_rung_ladder_recipe.json     |  25 +++
 .../recipes/metal_rung_steps_recipe.json      |  25 +++
 .../recipes/slag_brick_recipe_with_slag.json  |  29 +++
 .../slag_brick_recipe_without_slag.json       |  29 +++
 .../recipes/slag_brick_stairs_recipe.json     |  24 +++
 .../recipes/treated_wood_ladder_recipe.json   |  25 +++
 .../recipes/treated_wood_pole_recipe.json     |  29 +++
 .../recipes/treated_wood_table_recipe.json    |  29 +++
 .../clinker_brick/clinker_brick_texture0.png  | Bin 0 -> 748 bytes
 .../clinker_brick/clinker_brick_texture1.png  | Bin 0 -> 736 bytes
 .../clinker_brick/clinker_brick_texture2.png  | Bin 0 -> 731 bytes
 .../clinker_brick/clinker_brick_texture3.png  | Bin 0 -> 728 bytes
 .../clinker_brick/clinker_brick_texture4.png  | Bin 0 -> 746 bytes
 .../clinker_brick/clinker_brick_texture5.png  | Bin 0 -> 724 bytes
 .../clinker_brick/clinker_brick_texture6.png  | Bin 0 -> 740 bytes
 .../clinker_brick/clinker_brick_texture7.png  | Bin 0 -> 739 bytes
 .../blocks/iestyle/ironsheet_roof.png         | Bin 0 -> 415 bytes
 .../blocks/iestyle/ironsheet_roof_top.png     | Bin 0 -> 509 bytes
 .../textures/blocks/iestyle/steel_texture.png | Bin 0 -> 527 bytes
 .../textures/blocks/iestyle/treated_wood.png  | Bin 0 -> 513 bytes
 .../iestyle/treated_wood_pole_texture.png     | Bin 0 -> 596 bytes
 .../pole/treated_wood_pole_side_texture.png   | Bin 0 -> 293 bytes
 .../pole/treated_wood_pole_top_texture.png    | Bin 0 -> 197 bytes
 .../blocks/slag_brick/slag_brick_texture0.png | Bin 0 -> 734 bytes
 .../blocks/slag_brick/slag_brick_texture1.png | Bin 0 -> 707 bytes
 .../blocks/slag_brick/slag_brick_texture2.png | Bin 0 -> 728 bytes
 .../blocks/slag_brick/slag_brick_texture3.png | Bin 0 -> 748 bytes
 .../blocks/slag_brick/slag_brick_texture4.png | Bin 0 -> 723 bytes
 .../blocks/slag_brick/slag_brick_texture5.png | Bin 0 -> 729 bytes
 .../blocks/slag_brick/slag_brick_texture6.png | Bin 0 -> 751 bytes
 .../blocks/slag_brick/slag_brick_texture7.png | Bin 0 -> 742 bytes
 src/main/resources/mcmod.info                 |  16 ++
 src/main/resources/pack.mcmeta                |   7 +
 77 files changed, 2977 insertions(+)
 create mode 100644 src/main/java/wile/engineersdecor/ModEngineersDecor.java
 create mode 100644 src/main/java/wile/engineersdecor/blocks/BlockDecor.java
 create mode 100644 src/main/java/wile/engineersdecor/blocks/BlockDecorDirected.java
 create mode 100644 src/main/java/wile/engineersdecor/blocks/BlockDecorFull.java
 create mode 100644 src/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java
 create mode 100644 src/main/java/wile/engineersdecor/blocks/BlockDecorStairs.java
 create mode 100644 src/main/java/wile/engineersdecor/blocks/ModBlocks.java
 create mode 100644 src/main/java/wile/engineersdecor/detail/ClientProxy.java
 create mode 100644 src/main/java/wile/engineersdecor/detail/ModAuxiliaries.java
 create mode 100644 src/main/java/wile/engineersdecor/detail/ModConfig.java
 create mode 100644 src/main/java/wile/engineersdecor/detail/RecipeCondModSpecific.java
 create mode 100644 src/main/java/wile/engineersdecor/detail/ServerProxy.java
 create mode 100644 src/main/resources/assets/engineersdecor/blockstates/clinker_brick_block.json
 create mode 100644 src/main/resources/assets/engineersdecor/blockstates/clinker_brick_stairs.json
 create mode 100644 src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof.json
 create mode 100644 src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof_block.json
 create mode 100644 src/main/resources/assets/engineersdecor/blockstates/metal_rung_ladder.json
 create mode 100644 src/main/resources/assets/engineersdecor/blockstates/metal_rung_steps.json
 create mode 100644 src/main/resources/assets/engineersdecor/blockstates/slag_brick_block.json
 create mode 100644 src/main/resources/assets/engineersdecor/blockstates/slag_brick_stairs.json
 create mode 100644 src/main/resources/assets/engineersdecor/blockstates/treated_wood_ladder.json
 create mode 100644 src/main/resources/assets/engineersdecor/blockstates/treated_wood_pole.json
 create mode 100644 src/main/resources/assets/engineersdecor/blockstates/treated_wood_table.json
 create mode 100644 src/main/resources/assets/engineersdecor/lang/en_us.lang
 create mode 100644 src/main/resources/assets/engineersdecor/logo.png
 create mode 100644 src/main/resources/assets/engineersdecor/models/block/clinker_brick_model.json
 create mode 100644 src/main/resources/assets/engineersdecor/models/block/decor_full_block_model.json
 create mode 100644 src/main/resources/assets/engineersdecor/models/block/metal_rung_ladder_model.json
 create mode 100644 src/main/resources/assets/engineersdecor/models/block/metal_rung_steps_model.json
 create mode 100644 src/main/resources/assets/engineersdecor/models/block/pole/straight_pole_model.json
 create mode 100644 src/main/resources/assets/engineersdecor/models/block/slag_brick_model.json
 create mode 100644 src/main/resources/assets/engineersdecor/models/block/stairs/decor_inner_roof_model.json
 create mode 100644 src/main/resources/assets/engineersdecor/models/block/stairs/decor_inner_stairs_model.json
 create mode 100644 src/main/resources/assets/engineersdecor/models/block/stairs/decor_outer_roof_model.json
 create mode 100644 src/main/resources/assets/engineersdecor/models/block/stairs/decor_outer_stairs_model.json
 create mode 100644 src/main/resources/assets/engineersdecor/models/block/stairs/decor_straight_roof_model.json
 create mode 100644 src/main/resources/assets/engineersdecor/models/block/stairs/decor_straight_stairs_model.json
 create mode 100644 src/main/resources/assets/engineersdecor/models/block/treated_wood_ladder_model.json
 create mode 100644 src/main/resources/assets/engineersdecor/models/block/treated_wood_table_model.json
 create mode 100644 src/main/resources/assets/engineersdecor/recipes/_constants.json
 create mode 100644 src/main/resources/assets/engineersdecor/recipes/_factories.json
 create mode 100644 src/main/resources/assets/engineersdecor/recipes/clinker_brick_recipe.json
 create mode 100644 src/main/resources/assets/engineersdecor/recipes/clinker_brick_stairs_recipe.json
 create mode 100644 src/main/resources/assets/engineersdecor/recipes/clinker_brick_stairs_recipe_decompose.json
 create mode 100644 src/main/resources/assets/engineersdecor/recipes/metal_rung_ladder_recipe.json
 create mode 100644 src/main/resources/assets/engineersdecor/recipes/metal_rung_steps_recipe.json
 create mode 100644 src/main/resources/assets/engineersdecor/recipes/slag_brick_recipe_with_slag.json
 create mode 100644 src/main/resources/assets/engineersdecor/recipes/slag_brick_recipe_without_slag.json
 create mode 100644 src/main/resources/assets/engineersdecor/recipes/slag_brick_stairs_recipe.json
 create mode 100644 src/main/resources/assets/engineersdecor/recipes/treated_wood_ladder_recipe.json
 create mode 100644 src/main/resources/assets/engineersdecor/recipes/treated_wood_pole_recipe.json
 create mode 100644 src/main/resources/assets/engineersdecor/recipes/treated_wood_table_recipe.json
 create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture0.png
 create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture1.png
 create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture2.png
 create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture3.png
 create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture4.png
 create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture5.png
 create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture6.png
 create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture7.png
 create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/iestyle/ironsheet_roof.png
 create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/iestyle/ironsheet_roof_top.png
 create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/iestyle/steel_texture.png
 create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood.png
 create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_pole_texture.png
 create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/pole/treated_wood_pole_side_texture.png
 create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/pole/treated_wood_pole_top_texture.png
 create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture0.png
 create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture1.png
 create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture2.png
 create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture3.png
 create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture4.png
 create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture5.png
 create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture6.png
 create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture7.png
 create mode 100644 src/main/resources/mcmod.info
 create mode 100644 src/main/resources/pack.mcmeta

diff --git a/src/main/java/wile/engineersdecor/ModEngineersDecor.java b/src/main/java/wile/engineersdecor/ModEngineersDecor.java
new file mode 100644
index 0000000..1c1a0e9
--- /dev/null
+++ b/src/main/java/wile/engineersdecor/ModEngineersDecor.java
@@ -0,0 +1,108 @@
+/*
+ * @file ModEngineersDecor.java
+ * @author Stefan Wilhelm (wile)
+ * @copyright (C) 2019 Stefan Wilhelm
+ * @license MIT (see https://opensource.org/licenses/MIT)
+ *
+ * Main mod class.
+ */
+package wile.engineersdecor;
+
+import wile.engineersdecor.detail.ModConfig;
+import wile.engineersdecor.blocks.ModBlocks;
+import net.minecraftforge.client.event.ModelRegistryEvent;
+import net.minecraftforge.fml.common.Mod;
+import net.minecraftforge.fml.common.SidedProxy;
+import net.minecraftforge.fml.relauncher.SideOnly;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import net.minecraftforge.event.RegistryEvent;
+import net.minecraftforge.fml.common.event.FMLInitializationEvent;
+import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
+import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.ItemStack;
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import org.apache.logging.log4j.Logger;
+import javax.annotation.Nonnull;
+
+@Mod(
+  modid = ModEngineersDecor.MODID,
+  name = ModEngineersDecor.MODNAME,
+  version = ModEngineersDecor.MODVERSION,
+  dependencies = "required-after:forge@[14.23.5.2768,)",
+  useMetadata = true,
+  updateJSON = "https://raw.githubusercontent.com/stfwi/engineersdecor/develop/meta/update.json",
+  certificateFingerprint = ((ModEngineersDecor.MODFINGERPRINT==("@"+"MOD_SIGNSHA1"+"@")) ? "" : ModEngineersDecor.MODFINGERPRINT)
+)
+@SuppressWarnings({"unused", "ConstantConditions"})
+public class ModEngineersDecor
+{
+  public static final String MODID = "engineersdecor";
+  public static final String MODNAME = "Engineer's Decor";
+  public static final String MODVERSION = "@MOD_VERSION@";
+  public static final String MODMCVERSION = "@MOD_MCVERSION@";
+  public static final String MODFINGERPRINT = "@MOD_SIGNSHA1@";
+  public static final String MODBUILDID = "@MOD_BUILDID@";
+  public static Logger logger;
+
+  @Mod.Instance
+  public static ModEngineersDecor instance;
+
+  @SidedProxy(clientSide = "wile.engineersdecor.detail.ClientProxy", serverSide = "wile.engineersdecor.detail.ServerProxy")
+  public static IProxy proxy;
+
+  public interface IProxy
+  {
+    default void preInit(FMLPreInitializationEvent e) {}
+    default void init(FMLInitializationEvent e) {}
+    default void postInit(FMLPostInitializationEvent e) {}
+  }
+
+  @Mod.EventHandler
+  public void preInit(FMLPreInitializationEvent event)
+  {
+    logger = event.getModLog();
+    logger.info(MODNAME + ": Version " + MODMCVERSION + "-" + MODVERSION + ( (MODBUILDID=="@"+"MOD_BUILDID"+"@") ? "" : (" "+MODBUILDID) ) + ".");
+    if(MODFINGERPRINT=="@"+"MOD_SIGNSHA1"+"@") {
+      logger.warn(MODNAME + ": Mod is NOT signed by the author.");
+    } else {
+      logger.info(MODNAME + ": Found valid fingerprint " + MODFINGERPRINT + ".");
+    }
+    proxy.preInit(event);
+  }
+
+  @Mod.EventHandler
+  public void init(FMLInitializationEvent event)
+  { proxy.init(event); }
+
+  @Mod.EventHandler
+  public void postInit(FMLPostInitializationEvent event)
+  { ModConfig.onPostInit(event); proxy.postInit(event); }
+
+  @Mod.EventBusSubscriber
+  public static final class RegistrationSubscriptions
+  {
+    @SubscribeEvent
+    public static void registerBlocks(RegistryEvent.Register event)
+    { ModBlocks.registerBlocks(event); }
+
+    @SubscribeEvent
+    public static void registerItems(RegistryEvent.Register event)
+    { ModBlocks.registerItemBlocks(event); }
+
+    @SideOnly(Side.CLIENT)
+    @SubscribeEvent
+    public static void registerModels(ModelRegistryEvent event)
+    { ModBlocks.initModels(); }
+  }
+
+  public static final CreativeTabs CREATIVE_TAB_ENGINEERSDECOR = (new CreativeTabs("tabengineersdecor") {
+    @Override
+    @SideOnly(Side.CLIENT)
+    public @Nonnull ItemStack createIcon()
+    { return new ItemStack(ModBlocks.CLINKER_BRICK_WALL); }
+  });
+
+}
diff --git a/src/main/java/wile/engineersdecor/blocks/BlockDecor.java b/src/main/java/wile/engineersdecor/blocks/BlockDecor.java
new file mode 100644
index 0000000..b764f4b
--- /dev/null
+++ b/src/main/java/wile/engineersdecor/blocks/BlockDecor.java
@@ -0,0 +1,159 @@
+/*
+ * @file BlockDecorFull.java
+ * @author Stefan Wilhelm (wile)
+ * @copyright (C) 2019 Stefan Wilhelm
+ * @license MIT (see https://opensource.org/licenses/MIT)
+ *
+ * Common functionality class for decor blocks.
+ * Mainly needed for:
+ * - MC block defaults.
+ * - Tooltip functionality
+ * - Model initialisation
+ */
+package wile.engineersdecor.blocks;
+
+import net.minecraft.block.SoundType;
+import net.minecraft.util.*;
+import wile.engineersdecor.ModEngineersDecor;
+import wile.engineersdecor.detail.ModAuxiliaries;
+import net.minecraft.block.Block;
+import net.minecraft.block.material.EnumPushReaction;
+import net.minecraft.block.material.Material;
+import net.minecraft.block.state.BlockStateContainer;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraft.item.ItemStack;
+import net.minecraft.client.util.ITooltipFlag;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.math.AxisAlignedBB;
+import net.minecraft.util.math.BlockPos;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.List;
+
+public class BlockDecor extends Block
+{
+
+  public final long config;
+  public static final long CFG_CUTOUT = 0x0000000000000001L;
+
+
+  public BlockDecor(@Nonnull String registryName, long config, @Nullable Material material, float hardness, float resistance, @Nullable SoundType sound)
+  {
+    super((material!=null) ? (material) : (Material.IRON));
+    setCreativeTab(ModEngineersDecor.CREATIVE_TAB_ENGINEERSDECOR);
+    setRegistryName(ModEngineersDecor.MODID, registryName);
+    setTranslationKey(ModEngineersDecor.MODID + "." + registryName);
+    setTickRandomly(false);
+    setHardness((hardness > 0) ? hardness : 5.0f);
+    setResistance((resistance > 0) ? resistance : 10.0f);
+    setSoundType((sound==null) ? SoundType.STONE : sound);
+    this.config = config;
+  }
+
+  @Override
+  @Nullable
+  @SuppressWarnings("deprecation")
+  public AxisAlignedBB getCollisionBoundingBox(IBlockState state, IBlockAccess world, BlockPos pos)
+  { return getBoundingBox(state, world, pos); }
+
+  @Override
+  @SideOnly(Side.CLIENT)
+  public void addInformation(ItemStack stack, @Nullable World world, List tooltip, ITooltipFlag flag)
+  { ModAuxiliaries.Tooltip.addInformation(stack, world, tooltip, flag, true); }
+
+  @Override
+  @SideOnly(Side.CLIENT)
+  public BlockRenderLayer getRenderLayer()
+  { return ((config & CFG_CUTOUT)!=0) ? BlockRenderLayer.CUTOUT : BlockRenderLayer.SOLID; }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public boolean isFullCube(IBlockState state)
+  { return ((config & CFG_CUTOUT)==0); }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public boolean isNormalCube(IBlockState state)
+  { return ((config & CFG_CUTOUT)==0); }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public boolean isOpaqueCube(IBlockState state)
+  { return ((config & CFG_CUTOUT)==0); }
+
+  @Override
+  public boolean canSpawnInBlock()
+  { return false; }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public EnumPushReaction getPushReaction(IBlockState state)
+  { return EnumPushReaction.NORMAL; }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public IBlockState getStateFromMeta(int meta)
+  { return getDefaultState(); }
+
+  @Override
+  public int getMetaFromState(IBlockState state)
+  { return 0; }
+
+  @Override
+  protected BlockStateContainer createBlockState()
+  { return new BlockStateContainer(this); }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public IBlockState getActualState(IBlockState state, IBlockAccess world, BlockPos pos)
+  { return state; }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public IBlockState withRotation(IBlockState state, Rotation rot)
+  { return state; }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public IBlockState withMirror(IBlockState state, Mirror mirrorIn)
+  { return state; }
+
+  @Override
+  public boolean hasTileEntity(IBlockState state)
+  { return false; }
+
+  @Override
+  public void onBlockPlacedBy(World world, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack)
+  {}
+
+  @Override
+  public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
+  { return false; }
+
+  @Override
+  public void onBlockClicked(World world, BlockPos pos, EntityPlayer player)
+  {}
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public void neighborChanged(IBlockState state, World world, BlockPos pos, Block blockIn, BlockPos fromPos)
+  {}
+
+  @Override
+  public boolean canPlaceBlockOnSide(World world, BlockPos pos, EnumFacing side)
+  { return super.canPlaceBlockOnSide(world, pos, side); }
+
+  @Override
+  public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer, EnumHand hand)
+  { return super.getStateForPlacement(world, pos, facing, hitX, hitY, hitZ, meta, placer, hand); }
+
+  @Override
+  public boolean removedByPlayer(IBlockState state, World world, BlockPos pos, EntityPlayer player, boolean willHarvest)
+  { return super.removedByPlayer(state, world, pos, player, willHarvest); }
+
+}
diff --git a/src/main/java/wile/engineersdecor/blocks/BlockDecorDirected.java b/src/main/java/wile/engineersdecor/blocks/BlockDecorDirected.java
new file mode 100644
index 0000000..5e9529a
--- /dev/null
+++ b/src/main/java/wile/engineersdecor/blocks/BlockDecorDirected.java
@@ -0,0 +1,112 @@
+/*
+ * @file BlockDecorDirected.java
+ * @author Stefan Wilhelm (wile)
+ * @copyright (C) 2019 Stefan Wilhelm
+ * @license MIT (see https://opensource.org/licenses/MIT)
+ *
+ * Smaller (cutout) block with a defined facing.
+ */
+package wile.engineersdecor.blocks;
+
+import net.minecraft.block.SoundType;
+import wile.engineersdecor.detail.ModAuxiliaries;
+import net.minecraft.block.state.BlockStateContainer;
+import net.minecraft.block.BlockDirectional;
+import net.minecraft.block.material.Material;
+import net.minecraft.block.properties.PropertyDirection;
+import net.minecraft.block.state.BlockFaceShape;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.world.World;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.util.Mirror;
+import net.minecraft.util.Rotation;
+import net.minecraft.util.BlockRenderLayer;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.math.AxisAlignedBB;
+import net.minecraft.util.math.BlockPos;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+
+public class BlockDecorDirected extends BlockDecor
+{
+  public static final PropertyDirection FACING = BlockDirectional.FACING;
+  protected final ArrayList AABBs;
+
+  public BlockDecorDirected(@Nonnull String registryName, long config, @Nullable Material material, float hardness, float resistance, @Nullable SoundType sound, @Nonnull AxisAlignedBB unrotatedAABB)
+  {
+    super(registryName, config, material, hardness, resistance, sound);
+    AABBs = new ArrayList(Arrays.asList(
+      ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.DOWN),
+      ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.UP),
+      ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.NORTH),
+      ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.SOUTH),
+      ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.WEST),
+      ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.EAST),
+      ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.EAST),
+      ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.EAST)
+    ));
+  }
+
+  @Override
+  public boolean isOpaqueCube(IBlockState state)
+  { return false; }
+
+  @Override
+  public boolean isFullCube(IBlockState state)
+  { return false; }
+
+  @Override
+  public boolean isNormalCube(IBlockState state)
+  { return false; }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public BlockFaceShape getBlockFaceShape(IBlockAccess world, IBlockState state, BlockPos pos, EnumFacing face)
+  { return BlockFaceShape.UNDEFINED; }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos)
+  { return AABBs.get(((EnumFacing)state.getValue(FACING)).getIndex() & 0x7); }
+
+  @Override
+  @Nullable
+  public AxisAlignedBB getCollisionBoundingBox(IBlockState state, IBlockAccess world, BlockPos pos)
+  { return getBoundingBox(state, world, pos); }
+
+  @Override
+  @SideOnly(Side.CLIENT)
+  public BlockRenderLayer getRenderLayer()
+  { return BlockRenderLayer.CUTOUT; }
+
+  @Override
+  public IBlockState getStateFromMeta(int meta)
+  { return this.getDefaultState().withProperty(FACING, EnumFacing.byIndex(meta & 0x7)); }
+
+  @Override
+  public int getMetaFromState(IBlockState state)
+  { return state.getValue(FACING).getIndex(); }
+
+  @Override
+  protected BlockStateContainer createBlockState()
+  { return new BlockStateContainer(this, FACING); }
+
+  @Override
+  public IBlockState withRotation(IBlockState state, Rotation rot)
+  { return state.withProperty(FACING, rot.rotate((EnumFacing)state.getValue(FACING))); }
+
+  @Override
+  public IBlockState withMirror(IBlockState state, Mirror mirrorIn)
+  { return state.withRotation(mirrorIn.toRotation((EnumFacing)state.getValue(FACING))); }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer)
+  { return this.getDefaultState().withProperty(FACING, facing); }
+}
diff --git a/src/main/java/wile/engineersdecor/blocks/BlockDecorFull.java b/src/main/java/wile/engineersdecor/blocks/BlockDecorFull.java
new file mode 100644
index 0000000..8038120
--- /dev/null
+++ b/src/main/java/wile/engineersdecor/blocks/BlockDecorFull.java
@@ -0,0 +1,60 @@
+/*
+ * @file BlockDecorFull.java
+ * @author Stefan Wilhelm (wile)
+ * @copyright (C) 2019 Stefan Wilhelm
+ * @license MIT (see https://opensource.org/licenses/MIT)
+ *
+ * Full block characteristics class.
+ */
+package wile.engineersdecor.blocks;
+
+import net.minecraft.block.SoundType;
+import net.minecraft.block.material.Material;
+import net.minecraft.block.state.BlockFaceShape;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.math.AxisAlignedBB;
+import net.minecraft.util.math.BlockPos;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+
+public class BlockDecorFull extends BlockDecor
+{
+  public BlockDecorFull(@Nonnull String registryName, long config, @Nullable Material material, float hardness, float resistance, @Nullable SoundType sound)
+  {
+    super(registryName, config, material, hardness, resistance, sound);
+    setLightOpacity(1);
+  }
+
+  @Override
+  public boolean isOpaqueCube(IBlockState state)
+  { return true; }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public BlockFaceShape getBlockFaceShape(IBlockAccess world, IBlockState state, BlockPos pos, EnumFacing face)
+  { return BlockFaceShape.SOLID; }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos)
+  { return FULL_BLOCK_AABB; }
+
+  @Override
+  @Nullable
+  public AxisAlignedBB getCollisionBoundingBox(IBlockState state, IBlockAccess world, BlockPos pos)
+  { return FULL_BLOCK_AABB; }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public boolean isFullCube(IBlockState state)
+  { return true; }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public boolean isNormalCube(IBlockState state)
+  { return true; }
+
+}
diff --git a/src/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java b/src/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java
new file mode 100644
index 0000000..a52e781
--- /dev/null
+++ b/src/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java
@@ -0,0 +1,134 @@
+/*
+ * @file BlockDecorLadder.java
+ * @author Stefan Wilhelm (wile)
+ * @copyright (C) 2019 Stefan Wilhelm
+ * @license MIT (see https://opensource.org/licenses/MIT)
+ *
+ * Ladder block. The implementation is based on the vanilla
+ * net.minecraft.block.BlockLadder. Minor changes to enable
+ * later configuration (for block list based construction
+ * time configuration), does not drop when the block behind
+ * is broken, etc.
+ */
+package wile.engineersdecor.blocks;
+
+import net.minecraft.block.SoundType;
+import wile.engineersdecor.detail.ModAuxiliaries;
+import net.minecraft.block.BlockHorizontal;
+import net.minecraft.block.properties.PropertyDirection;
+import net.minecraft.block.material.Material;
+import net.minecraft.block.state.BlockFaceShape;
+import net.minecraft.block.state.BlockStateContainer;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.util.*;
+import net.minecraft.util.math.AxisAlignedBB;
+import net.minecraft.util.math.BlockPos;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+
+public class BlockDecorLadder extends BlockDecor
+{
+  public static final PropertyDirection FACING = BlockHorizontal.FACING;
+  protected static final AxisAlignedBB EDLADDER_SOUTH_AABB = ModAuxiliaries.getPixeledAABB(3, 0, 0, 13, 16, 2);
+  protected static final AxisAlignedBB EDLADDER_EAST_AABB  = ModAuxiliaries.getRotatedAABB(EDLADDER_SOUTH_AABB, EnumFacing.EAST);
+  protected static final AxisAlignedBB EDLADDER_WEST_AABB  = ModAuxiliaries.getRotatedAABB(EDLADDER_SOUTH_AABB, EnumFacing.WEST);
+  protected static final AxisAlignedBB EDLADDER_NORTH_AABB = ModAuxiliaries.getRotatedAABB(EDLADDER_SOUTH_AABB, EnumFacing.NORTH);
+
+
+  public BlockDecorLadder(@Nonnull String registryName, long config, @Nullable Material material, float hardness, float resistance, @Nullable SoundType sound)
+  {
+    super(registryName, config, material, hardness, resistance, sound);
+    setLightOpacity(0);
+    setResistance(2.0f);
+    setHardness(0.3f);
+  }
+
+  @Override
+  @SideOnly(Side.CLIENT)
+  public BlockRenderLayer getRenderLayer()
+  { return BlockRenderLayer.CUTOUT; }
+
+  @Override
+  public boolean isOpaqueCube(IBlockState state)
+  { return false; }
+
+  @Override
+  public boolean isFullCube(IBlockState state)
+  { return false; }
+
+  @Override
+  public boolean isNormalCube(IBlockState state)
+  { return false; }
+
+  @Override
+  public boolean isLadder(IBlockState state, IBlockAccess world, BlockPos pos, EntityLivingBase entity)
+  { return true; }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public BlockFaceShape getBlockFaceShape(IBlockAccess world, IBlockState state, BlockPos pos, EnumFacing face)
+  { return BlockFaceShape.UNDEFINED; }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos)
+  {
+    switch ((EnumFacing)state.getValue(FACING)) {
+      case NORTH: return EDLADDER_NORTH_AABB;
+      case SOUTH: return EDLADDER_SOUTH_AABB;
+      case WEST: return EDLADDER_WEST_AABB;
+      default: return EDLADDER_EAST_AABB;
+    }
+  }
+
+  @Override
+  public IBlockState getStateFromMeta(int meta)
+  {
+    final EnumFacing facing = EnumFacing.byIndex(meta & 0x7);
+    return this.getDefaultState().withProperty(FACING, (facing.getAxis()==EnumFacing.Axis.Y) ? EnumFacing.NORTH : facing);
+  }
+
+  @Override
+  public int getMetaFromState(IBlockState state)
+  { return state.getValue(FACING).getIndex(); }
+
+  @Override
+  protected BlockStateContainer createBlockState()
+  { return new BlockStateContainer(this, FACING); }
+
+  @Override
+  public IBlockState withRotation(IBlockState state, Rotation rot)
+  { return state.withProperty(FACING, rot.rotate((EnumFacing)state.getValue(FACING))); }
+
+  @Override
+  public IBlockState withMirror(IBlockState state, Mirror mirrorIn)
+  { return state.withRotation(mirrorIn.toRotation((EnumFacing)state.getValue(FACING))); }
+
+  @Override
+  public boolean canPlaceBlockOnSide(World world, BlockPos pos, EnumFacing side)
+  { return canAttachTo(world, pos.west(), side) || canAttachTo(world, pos.east(), side) || canAttachTo(world, pos.north(), side) || canAttachTo(world, pos.south(), side); }
+
+  @Override
+  @SuppressWarnings("deprecation")
+  public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer)
+  {
+    if(facing.getAxis().isHorizontal() && canAttachTo(world, pos.offset(facing.getOpposite()), facing)) return this.getDefaultState().withProperty(FACING, facing);
+    for(EnumFacing e:EnumFacing.Plane.HORIZONTAL) {
+      if(this.canAttachTo(world, pos.offset(e.getOpposite()), e)) return this.getDefaultState().withProperty(FACING, e);
+    }
+    return this.getDefaultState();
+  }
+
+  private boolean canAttachTo(World world, BlockPos pos, EnumFacing side)
+  {
+    final IBlockState state = world.getBlockState(pos);
+    return (!isExceptBlockForAttachWithPiston(state.getBlock())) && (state.getBlockFaceShape(world, pos, side) == BlockFaceShape.SOLID);
+  }
+
+}
diff --git a/src/main/java/wile/engineersdecor/blocks/BlockDecorStairs.java b/src/main/java/wile/engineersdecor/blocks/BlockDecorStairs.java
new file mode 100644
index 0000000..6201aaa
--- /dev/null
+++ b/src/main/java/wile/engineersdecor/blocks/BlockDecorStairs.java
@@ -0,0 +1,27 @@
+/*
+ * @file BlockDecorStairs.java
+ * @author Stefan Wilhelm (wile)
+ * @copyright (C) 2019 Stefan Wilhelm
+ * @license MIT (see https://opensource.org/licenses/MIT)
+ *
+ * Stairs and roof blocks, almost entirely based on vanilla stairs.
+ */
+package wile.engineersdecor.blocks;
+
+import net.minecraft.block.SoundType;
+import net.minecraft.block.state.IBlockState;
+import wile.engineersdecor.ModEngineersDecor;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+
+public class BlockDecorStairs extends net.minecraft.block.BlockStairs
+{
+  public BlockDecorStairs(@Nonnull String registryName, IBlockState modelState)
+  {
+    super(modelState);
+    setCreativeTab(ModEngineersDecor.CREATIVE_TAB_ENGINEERSDECOR);
+    setRegistryName(ModEngineersDecor.MODID, registryName);
+    setTranslationKey(ModEngineersDecor.MODID + "." + registryName);
+  }
+}
diff --git a/src/main/java/wile/engineersdecor/blocks/ModBlocks.java b/src/main/java/wile/engineersdecor/blocks/ModBlocks.java
new file mode 100644
index 0000000..2c81dda
--- /dev/null
+++ b/src/main/java/wile/engineersdecor/blocks/ModBlocks.java
@@ -0,0 +1,109 @@
+/*
+ * @file ModBlocks.java
+ * @author Stefan Wilhelm (wile)
+ * @copyright (C) 2018 Stefan Wilhelm
+ * @license MIT (see https://opensource.org/licenses/MIT)
+ *
+ * Definition and initialisation of blocks of this
+ * module, along with their tile entities if applicable.
+ *
+ * Note: Straight forward definition of different blocks/entities
+ *       to make recipes, models and texture definitions easier.
+ */
+package wile.engineersdecor.blocks;
+
+import net.minecraft.block.SoundType;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.block.model.ModelResourceLocation;
+import net.minecraftforge.client.model.ModelLoader;
+import wile.engineersdecor.ModEngineersDecor;
+import wile.engineersdecor.detail.ModAuxiliaries;
+import wile.engineersdecor.detail.ModConfig;
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemBlock;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.event.RegistryEvent;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Collections;
+import javax.annotation.Nonnull;
+
+@SuppressWarnings("unused")
+public class ModBlocks
+{
+  // Full blocks
+  public static final BlockDecorFull CLINKER_BRICK_WALL = new BlockDecorFull("clinker_brick_block", 0, Material.ROCK, 1.5f, 20f, SoundType.STONE);
+  public static final BlockDecorFull SLAG_BRICK_WALL  = new BlockDecorFull("slag_brick_block", 0, Material.ROCK, 1.8f, 25f, SoundType.STONE);
+  public static final BlockDecorFull IRON_SHEET_ROOF_FULLBLOCK = new BlockDecorFull("iron_sheet_roof_block", 0, Material.IRON, 1.8f, 25f, SoundType.METAL);
+  // Ladders
+  public static final BlockDecorLadder METAL_RUNG_LADDER = new BlockDecorLadder("metal_rung_ladder", 0, Material.IRON, 1.8f, 25f, SoundType.METAL);
+  public static final BlockDecorLadder METAL_RUNG_STEPS = new BlockDecorLadder("metal_rung_steps", 0, Material.IRON, 1.8f, 25f, SoundType.METAL);
+  public static final BlockDecorLadder TREATED_WOOD_LADDER = new BlockDecorLadder("treated_wood_ladder", 0, Material.WOOD, 1.0f, 15f, SoundType.WOOD);
+  // Stairs or stairs-like
+  public static final BlockDecorStairs CLINKER_BRICK_STAIRS = new BlockDecorStairs("clinker_brick_stairs", CLINKER_BRICK_WALL.getDefaultState());
+  public static final BlockDecorStairs SLAG_BRICK_STAIRS = new BlockDecorStairs("slag_brick_stairs", SLAG_BRICK_WALL.getDefaultState());
+  public static final BlockDecorStairs IRON_SHEET_ROOF = new BlockDecorStairs("iron_sheet_roof", IRON_SHEET_ROOF_FULLBLOCK.getDefaultState());
+  // Oblongs and poles
+  public static final BlockDecorDirected TREATED_WOOD_POLE = new BlockDecorDirected("treated_wood_pole", 0, Material.WOOD, 1.0f, 15f, SoundType.WOOD, ModAuxiliaries.getPixeledAABB(5.8,5.8,0, 10.2,10.2,16));
+  // Furniture
+  public static final BlockDecor TREATED_WOOD_TABLE = new BlockDecor("treated_wood_table", BlockDecor.CFG_CUTOUT, Material.WOOD, 1.0f, 15f, SoundType.WOOD);
+
+  private static final Block modBlocks[] = {
+    SLAG_BRICK_WALL,
+    CLINKER_BRICK_WALL,
+    METAL_RUNG_LADDER,
+    METAL_RUNG_STEPS,
+    TREATED_WOOD_LADDER,
+    CLINKER_BRICK_STAIRS,
+    SLAG_BRICK_STAIRS,
+    TREATED_WOOD_POLE,
+    TREATED_WOOD_TABLE
+  };
+
+  private static final Block devBlocks[] = {
+    IRON_SHEET_ROOF, // model looks not good enough yet
+  };
+
+  private static ArrayList registeredBlocks = new ArrayList<>();
+
+  @Nonnull
+  public static List getRegisteredBlocks()
+  { return Collections.unmodifiableList(registeredBlocks); }
+
+  // Invoked from CommonProxy.registerBlocks()
+  public static final void registerBlocks(RegistryEvent.Register event)
+  {
+    // Config based registry selection
+    ArrayList allBlocks = new ArrayList<>();
+    Collections.addAll(allBlocks, modBlocks);
+    if(ModConfig.zmisc.with_experimental) Collections.addAll(allBlocks, devBlocks);
+    for(Block e:allBlocks) registeredBlocks.add(e);
+    for(Block e:registeredBlocks) event.getRegistry().register(e);
+    ModEngineersDecor.logger.info("Registered " + Integer.toString(registeredBlocks.size()) + " blocks.");
+  }
+
+  // Invoked from ClientProxy.registerModels()
+  @SideOnly(Side.CLIENT)
+  public static final void initModels()
+  {
+    for(Block e:registeredBlocks) {
+      ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(e), 0, new ModelResourceLocation(e.getRegistryName(), "inventory"));
+    }
+  }
+
+  // Invoked from CommonProxy.registerItems()
+  public static final void registerItemBlocks(RegistryEvent.Register event)
+  {
+    int n = 0;
+    for(Block e:registeredBlocks) {
+      ResourceLocation rl = e.getRegistryName();
+      if(rl == null) continue;
+      event.getRegistry().register(new ItemBlock(e).setRegistryName(rl));
+      ++n;
+    }
+  }
+
+}
diff --git a/src/main/java/wile/engineersdecor/detail/ClientProxy.java b/src/main/java/wile/engineersdecor/detail/ClientProxy.java
new file mode 100644
index 0000000..9a9bb4e
--- /dev/null
+++ b/src/main/java/wile/engineersdecor/detail/ClientProxy.java
@@ -0,0 +1,27 @@
+/*
+ * @file ClientProxy.java
+ * @author Stefan Wilhelm (wile)
+ * @copyright (C) 2018 Stefan Wilhelm
+ * @license MIT (see https://opensource.org/licenses/MIT)
+ *
+ * Client side only initialisation.
+ */
+package wile.engineersdecor.detail;
+
+import wile.engineersdecor.ModEngineersDecor;
+import net.minecraftforge.client.model.obj.OBJLoader;
+import net.minecraftforge.fml.common.event.FMLInitializationEvent;
+import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
+import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
+
+public class ClientProxy implements ModEngineersDecor.IProxy
+{
+  public void preInit(FMLPreInitializationEvent e)
+  { OBJLoader.INSTANCE.addDomain(ModEngineersDecor.MODID); }
+
+  public void init(FMLInitializationEvent e)
+  {}
+
+  public void postInit(FMLPostInitializationEvent e)
+  {}
+}
diff --git a/src/main/java/wile/engineersdecor/detail/ModAuxiliaries.java b/src/main/java/wile/engineersdecor/detail/ModAuxiliaries.java
new file mode 100644
index 0000000..905108c
--- /dev/null
+++ b/src/main/java/wile/engineersdecor/detail/ModAuxiliaries.java
@@ -0,0 +1,136 @@
+/*
+ * @file ModAuxiliaries.java
+ * @author Stefan Wilhelm (wile)
+ * @copyright (C) 2018 Stefan Wilhelm
+ * @license MIT (see https://opensource.org/licenses/MIT)
+ *
+ * General commonly used functionality.
+ */
+package wile.engineersdecor.detail;
+
+import net.minecraft.util.EnumFacing;
+import wile.engineersdecor.ModEngineersDecor;
+import net.minecraft.item.ItemStack;
+import net.minecraft.client.util.ITooltipFlag;
+import net.minecraft.world.World;
+import net.minecraft.util.text.TextComponentTranslation;
+import net.minecraft.util.text.TextFormatting;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraft.util.math.AxisAlignedBB;
+import net.minecraftforge.fml.relauncher.SideOnly;
+
+import org.lwjgl.input.Keyboard;
+import javax.annotation.Nullable;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class ModAuxiliaries
+{
+  /**
+   * Text localisation wrapper, implicitly prepends `ModEngineersDecor.MODID` to the
+   * translation keys. Forces formatting argument, nullable if no special formatting shall be applied..
+   */
+  public static TextComponentTranslation localizable(String modtrkey, @Nullable TextFormatting color, Object... args)
+  {
+    TextComponentTranslation tr = new TextComponentTranslation(ModEngineersDecor.MODID+"."+modtrkey, args);
+    if(color!=null) tr.getStyle().setColor(color);
+    return tr;
+  }
+
+  @SideOnly(Side.CLIENT)
+  public static String localize(String translationKey, Object... args)
+  {
+    TextComponentTranslation tr = new TextComponentTranslation(translationKey, args);
+    tr.getStyle().setColor(TextFormatting.RESET);
+    final String ft = tr.getFormattedText();
+    if(ft.contains("${")) {
+      // Non-recursive, non-argument lang file entry cross referencing.
+      Pattern pt = Pattern.compile("\\$\\{([\\w\\.]+)\\}");
+      Matcher mt = pt.matcher(ft);
+      StringBuffer sb = new StringBuffer();
+      while(mt.find()) mt.appendReplacement(sb, (new TextComponentTranslation(mt.group(1))).getFormattedText().trim());
+      mt.appendTail(sb);
+      return sb.toString();
+    } else {
+      return ft;
+    }
+  }
+
+  /**
+   * Returns true if a given key is translated for the current language.
+   */
+  @SideOnly(Side.CLIENT)
+  public static boolean hasTranslation(String key)
+  { return net.minecraft.client.resources.I18n.hasKey(key); }
+
+  public static final class Tooltip
+  {
+    @SideOnly(Side.CLIENT)
+    public static boolean extendedTipCondition()
+    { return (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT)||Keyboard.isKeyDown(Keyboard.KEY_RSHIFT)); }
+
+    @SideOnly(Side.CLIENT)
+    public static boolean helpCondition()
+    { return extendedTipCondition() && ((Keyboard.isKeyDown(Keyboard.KEY_LCONTROL)||Keyboard.isKeyDown(Keyboard.KEY_RCONTROL))); }
+
+    /**
+     * Adds an extended tooltip or help tooltip depending on the key states of CTRL and SHIFT.
+     * Returns true if the localisable help/tip was added, false if not (either not CTL/SHIFT or
+     * no translation found).
+     */
+    @SideOnly(Side.CLIENT)
+    public static boolean addInformation(@Nullable String advancedTooltipTranslationKey, @Nullable String helpTranslationKey, List tooltip, ITooltipFlag flag, boolean addAdvancedTooltipHints)
+    {
+      // Note: intentionally not using keybinding here, this must be `control` or `shift`. MC uses lwjgl Keyboard,
+      //       so using this also here should be ok.
+      final boolean help_available = (helpTranslationKey != null) && ModAuxiliaries.hasTranslation(helpTranslationKey + ".help");
+      final boolean tip_available = (advancedTooltipTranslationKey != null) && ModAuxiliaries.hasTranslation(helpTranslationKey + ".tip");
+      if((!help_available) && (!tip_available)) return false;
+      if(helpCondition()) {
+        if(!help_available) return false;
+        String s = localize(helpTranslationKey + ".help");
+        if(s.isEmpty()) return false;
+        tooltip.add(s);
+        return true;
+      } else if(extendedTipCondition()) {
+        if(!tip_available) return false;
+        String s = localize(advancedTooltipTranslationKey + ".tip");
+        if(s.isEmpty()) return false;
+        tooltip.add(s);
+        return true;
+      } else if(addAdvancedTooltipHints) {
+        String s = "";
+        if(tip_available) s += localize(ModEngineersDecor.MODID + ".tooltip.hint.extended") + (help_available ? " " : "");
+        if(help_available) s += localize(ModEngineersDecor.MODID + ".tooltip.hint.help");
+        tooltip.add(s);
+      }
+      return false;
+    }
+
+    /**
+     * Adds an extended tooltip or help tooltip for a given stack depending on the key states of CTRL and SHIFT.
+     * Format in the lang file is (e.g. for items): "item.MODID.REGISTRYNAME.tip" and "item.MODID.REGISTRYNAME.help".
+     * Return value see method pattern above.
+     */
+    @SideOnly(Side.CLIENT)
+    public static boolean addInformation(ItemStack stack, @Nullable World world, List tooltip, ITooltipFlag flag, boolean addAdvancedTooltipHints)
+    { return addInformation(stack.getTranslationKey(), stack.getTranslationKey(), tooltip, flag, addAdvancedTooltipHints); }
+  }
+
+  public static final AxisAlignedBB getPixeledAABB(double x0, double y0, double z0, double x1, double y1, double z1)
+  { return new AxisAlignedBB(x0/16.0, y0/16.0, z0/16.0, x1/16.0, y1/16.0, z1/16.0); }
+
+  public static final AxisAlignedBB getRotatedAABB(AxisAlignedBB bb, EnumFacing new_facing)
+  {
+    switch(new_facing.getIndex()) {
+      case 0: return new AxisAlignedBB(1-bb.maxX, 1-bb.maxZ, 1-bb.maxY, 1-bb.minX, 1-bb.minZ, 1-bb.minY); // D
+      case 1: return new AxisAlignedBB(1-bb.maxX,   bb.minZ,   bb.minY, 1-bb.minX,   bb.maxZ,   bb.maxY); // U
+      case 2: return new AxisAlignedBB(1-bb.maxX,   bb.minY, 1-bb.maxZ, 1-bb.minX,   bb.maxY, 1-bb.minZ); // N
+      case 3: return new AxisAlignedBB(  bb.minX,   bb.minY,   bb.minZ,   bb.maxX,   bb.maxY,   bb.maxZ); // S --> bb
+      case 4: return new AxisAlignedBB(1-bb.maxZ,   bb.minY,   bb.minX, 1-bb.minZ,   bb.maxY,   bb.maxX); // W
+      case 5: return new AxisAlignedBB(  bb.minZ,   bb.minY, 1-bb.maxX,   bb.maxZ,   bb.maxY, 1-bb.minX); // E
+    }
+    return bb;
+  }
+}
diff --git a/src/main/java/wile/engineersdecor/detail/ModConfig.java b/src/main/java/wile/engineersdecor/detail/ModConfig.java
new file mode 100644
index 0000000..79d42c4
--- /dev/null
+++ b/src/main/java/wile/engineersdecor/detail/ModConfig.java
@@ -0,0 +1,52 @@
+/*
+ * @file ModConfig.java
+ * @author Stefan Wilhelm (wile)
+ * @copyright (C) 2018 Stefan Wilhelm
+ * @license MIT (see https://opensource.org/licenses/MIT)
+ *
+ * Main class for module settings. Handles reading and
+ * saving the config file.
+ */
+package wile.engineersdecor.detail;
+
+import wile.engineersdecor.ModEngineersDecor;
+import net.minecraftforge.common.config.Config;
+import net.minecraftforge.common.config.ConfigManager;
+import net.minecraftforge.fml.common.Mod;
+import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import net.minecraftforge.fml.client.event.ConfigChangedEvent;
+
+@Config(modid = ModEngineersDecor.MODID)
+@Config.LangKey("engineersdecor.config.title")
+public class ModConfig
+{
+  @Config.Comment({
+    "Settings for beta testing and trouble shooting. Some of the settings " +
+    "may be moved to other categories after testing."
+  })
+  @Config.Name("Miscellaneous")
+  public static final SettingsZTesting zmisc = new SettingsZTesting();
+  public static final class SettingsZTesting
+  {
+    @Config.Comment({ "Enables experimental features. Use at own risk." })
+    @Config.Name("With experimental")
+    public boolean with_experimental = false;
+  }
+
+  @SuppressWarnings("unused")
+  @Mod.EventBusSubscriber(modid=ModEngineersDecor.MODID)
+  private static final class EventHandler
+  {
+    @SubscribeEvent
+    public static void onConfigChanged(final ConfigChangedEvent.OnConfigChangedEvent event) {
+      if(!event.getModID().equals(ModEngineersDecor.MODID)) return;
+      ConfigManager.sync(ModEngineersDecor.MODID, Config.Type.INSTANCE);
+    }
+  }
+
+  @SuppressWarnings("unused")
+  public static final void onPostInit(FMLPostInitializationEvent event)
+  {}
+
+}
diff --git a/src/main/java/wile/engineersdecor/detail/RecipeCondModSpecific.java b/src/main/java/wile/engineersdecor/detail/RecipeCondModSpecific.java
new file mode 100644
index 0000000..e89ae5d
--- /dev/null
+++ b/src/main/java/wile/engineersdecor/detail/RecipeCondModSpecific.java
@@ -0,0 +1,69 @@
+/*
+ * @file RecipeCondRegistered.java
+ * @author Stefan Wilhelm (wile)
+ * @copyright (C) 2018 Stefan Wilhelm
+ * @license MIT (see https://opensource.org/licenses/MIT)
+ *
+ * Recipe condition to enable opt'ing out JSON based recipes, referenced
+ * in assets/engineersdecor/recipes/_factories.json with full path (therefore
+ * I had to make a separate file for that instead of a few lines in
+ * ModAuxiliaries).
+ */
+package wile.engineersdecor.detail;
+
+import wile.engineersdecor.ModEngineersDecor;
+import net.minecraft.block.Block;
+import net.minecraft.item.Item;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.common.crafting.IConditionFactory;
+import net.minecraftforge.common.crafting.JsonContext;
+import net.minecraftforge.registries.IForgeRegistry;
+import net.minecraftforge.fml.common.registry.ForgeRegistries;
+
+import com.google.gson.*;
+import java.util.function.BooleanSupplier;
+
+
+public class RecipeCondModSpecific implements IConditionFactory
+{
+  public static final BooleanSupplier RECIPE_INCLUDE = ()->true;
+  public static final BooleanSupplier RECIPE_EXCLUDE = ()->false;
+
+  @Override
+  public BooleanSupplier parse(JsonContext context, JsonObject json) {
+    try {
+      final IForgeRegistry block_registry = ForgeRegistries.BLOCKS;
+      final IForgeRegistry item_registry = ForgeRegistries.ITEMS;
+      final JsonArray items = json.getAsJsonArray("required");
+      if(items!=null) {
+        for(JsonElement e: items) {
+          if(!e.isJsonPrimitive()) continue;
+          final ResourceLocation rl = new ResourceLocation(((JsonPrimitive)e).getAsString());
+          if((!block_registry.containsKey(rl)) && (!item_registry.containsKey(rl))) return RECIPE_EXCLUDE; // required item not registered
+        }
+      }
+      final JsonPrimitive result = json.getAsJsonPrimitive("result");
+      if(result != null) {
+        final ResourceLocation rl = new ResourceLocation(result.getAsString());
+        if((!block_registry.containsKey(rl)) && (!item_registry.containsKey(rl))) return RECIPE_EXCLUDE; // required result not registered
+      }
+      final JsonArray missing = json.getAsJsonArray("missing");
+      if((missing!=null) && (missing.size() > 0)) {
+        for(JsonElement e: missing) {
+          if(!e.isJsonPrimitive()) continue;
+          final ResourceLocation rl = new ResourceLocation(((JsonPrimitive)e).getAsString());
+          // At least one item missing, enable this recipe as alternative recipe for another one that check the missing item as required item.
+          // --> e.g. if IE not installed there is no slag. One recipe requires slag, and another one (for the same result) is used if there
+          //     is no slag.
+          if((!block_registry.containsKey(rl)) && (!item_registry.containsKey(rl))) return RECIPE_INCLUDE;
+        }
+        return RECIPE_EXCLUDE; // all required there, but there is no item missing, so another recipe
+      } else {
+        return RECIPE_INCLUDE; // no missing given, means include if result and required are all there.
+      }
+    } catch(Throwable ex) {
+      ModEngineersDecor.logger.error("rsgauges::ResultRegisteredCondition failed: " + ex.toString());
+    }
+    return RECIPE_EXCLUDE; // skip on exception.
+  }
+}
diff --git a/src/main/java/wile/engineersdecor/detail/ServerProxy.java b/src/main/java/wile/engineersdecor/detail/ServerProxy.java
new file mode 100644
index 0000000..3007c27
--- /dev/null
+++ b/src/main/java/wile/engineersdecor/detail/ServerProxy.java
@@ -0,0 +1,26 @@
+/*
+ * @file ServerProxy.java
+ * @author Stefan Wilhelm (wile)
+ * @copyright (C) 2018 Stefan Wilhelm
+ * @license MIT (see https://opensource.org/licenses/MIT)
+ *
+ * Module initialisation event handling, server side only.
+ */
+package wile.engineersdecor.detail;
+
+import wile.engineersdecor.ModEngineersDecor;
+import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
+import net.minecraftforge.fml.common.event.FMLInitializationEvent;
+import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
+
+public class ServerProxy implements ModEngineersDecor.IProxy
+{
+  public void preInit(FMLPreInitializationEvent e)
+  {}
+
+  public void init(FMLInitializationEvent e)
+  {}
+
+  public void postInit(FMLPostInitializationEvent e)
+  {}
+}
diff --git a/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_block.json b/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_block.json
new file mode 100644
index 0000000..bf91a4e
--- /dev/null
+++ b/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_block.json
@@ -0,0 +1,20 @@
+{
+  "forge_marker": 1,
+  "defaults": {
+    "model": "engineersdecor:clinker_brick_model",
+    "textures": { "all": "engineersdecor:blocks/clinker_brick/clinker_brick_texture0" }
+  },
+  "variants": {
+    "normal": [
+      { "textures": { "all": "engineersdecor:blocks/clinker_brick/clinker_brick_texture0" } },
+      { "textures": { "all": "engineersdecor:blocks/clinker_brick/clinker_brick_texture1" } },
+      { "textures": { "all": "engineersdecor:blocks/clinker_brick/clinker_brick_texture2" } },
+      { "textures": { "all": "engineersdecor:blocks/clinker_brick/clinker_brick_texture3" } },
+      { "textures": { "all": "engineersdecor:blocks/clinker_brick/clinker_brick_texture4" } },
+      { "textures": { "all": "engineersdecor:blocks/clinker_brick/clinker_brick_texture5" } },
+      { "textures": { "all": "engineersdecor:blocks/clinker_brick/clinker_brick_texture6" } },
+      { "textures": { "all": "engineersdecor:blocks/clinker_brick/clinker_brick_texture7" } }
+    ],
+    "inventory": [{}]
+  }
+}
diff --git a/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_stairs.json b/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_stairs.json
new file mode 100644
index 0000000..164f4ce
--- /dev/null
+++ b/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_stairs.json
@@ -0,0 +1,56 @@
+{
+  "forge_marker": 1,
+  "defaults": {
+    "model": "engineersdecor:stairs/decor_straight_stairs_model",
+    "textures": {
+      "particle": "engineersdecor:blocks/clinker_brick/clinker_brick_texture0",
+      "bottom": "engineersdecor:blocks/clinker_brick/clinker_brick_texture0",
+      "top": "engineersdecor:blocks/clinker_brick/clinker_brick_texture0",
+      "side": "engineersdecor:blocks/clinker_brick/clinker_brick_texture0"
+    }
+  },
+  "variants": {
+    "normal": [{}],
+    "inventory": [{}],
+    "facing=east,half=bottom,shape=straight":  { "model": "engineersdecor:stairs/decor_straight_stairs_model" },
+    "facing=west,half=bottom,shape=straight":  { "model": "engineersdecor:stairs/decor_straight_stairs_model", "y": 180, "uvlock": true },
+    "facing=south,half=bottom,shape=straight": { "model": "engineersdecor:stairs/decor_straight_stairs_model", "y": 90, "uvlock": true },
+    "facing=north,half=bottom,shape=straight": { "model": "engineersdecor:stairs/decor_straight_stairs_model", "y": 270, "uvlock": true },
+    "facing=east,half=bottom,shape=outer_right":  { "model": "engineersdecor:stairs/decor_outer_stairs_model" },
+    "facing=west,half=bottom,shape=outer_right":  { "model": "engineersdecor:stairs/decor_outer_stairs_model", "y": 180, "uvlock": true },
+    "facing=south,half=bottom,shape=outer_right": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "y": 90, "uvlock": true },
+    "facing=north,half=bottom,shape=outer_right": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "y": 270, "uvlock": true },
+    "facing=east,half=bottom,shape=outer_left":  { "model": "engineersdecor:stairs/decor_outer_stairs_model", "y": 270, "uvlock": true },
+    "facing=west,half=bottom,shape=outer_left":  { "model": "engineersdecor:stairs/decor_outer_stairs_model", "y": 90, "uvlock": true },
+    "facing=south,half=bottom,shape=outer_left": { "model": "engineersdecor:stairs/decor_outer_stairs_model" },
+    "facing=north,half=bottom,shape=outer_left": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "y": 180, "uvlock": true },
+    "facing=east,half=bottom,shape=inner_right":  { "model": "engineersdecor:stairs/decor_inner_stairs_model" },
+    "facing=west,half=bottom,shape=inner_right":  { "model": "engineersdecor:stairs/decor_inner_stairs_model", "y": 180, "uvlock": true },
+    "facing=south,half=bottom,shape=inner_right": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "y": 90, "uvlock": true },
+    "facing=north,half=bottom,shape=inner_right": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "y": 270, "uvlock": true },
+    "facing=east,half=bottom,shape=inner_left":  { "model": "engineersdecor:stairs/decor_inner_stairs_model", "y": 270, "uvlock": true },
+    "facing=west,half=bottom,shape=inner_left":  { "model": "engineersdecor:stairs/decor_inner_stairs_model", "y": 90, "uvlock": true },
+    "facing=south,half=bottom,shape=inner_left": { "model": "engineersdecor:stairs/decor_inner_stairs_model" },
+    "facing=north,half=bottom,shape=inner_left": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "y": 180, "uvlock": true },
+    "facing=east,half=top,shape=straight":  { "model": "engineersdecor:stairs/decor_straight_stairs_model", "x": 180, "uvlock": true },
+    "facing=west,half=top,shape=straight":  { "model": "engineersdecor:stairs/decor_straight_stairs_model", "x": 180, "y": 180, "uvlock": true },
+    "facing=south,half=top,shape=straight": { "model": "engineersdecor:stairs/decor_straight_stairs_model", "x": 180, "y": 90, "uvlock": true },
+    "facing=north,half=top,shape=straight": { "model": "engineersdecor:stairs/decor_straight_stairs_model", "x": 180, "y": 270, "uvlock": true },
+    "facing=east,half=top,shape=outer_right":  { "model": "engineersdecor:stairs/decor_outer_stairs_model", "x": 180, "y": 90, "uvlock": true },
+    "facing=west,half=top,shape=outer_right":  { "model": "engineersdecor:stairs/decor_outer_stairs_model", "x": 180, "y": 270, "uvlock": true },
+    "facing=south,half=top,shape=outer_right": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "x": 180, "y": 180, "uvlock": true },
+    "facing=north,half=top,shape=outer_right": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "x": 180, "uvlock": true },
+    "facing=east,half=top,shape=outer_left":  { "model": "engineersdecor:stairs/decor_outer_stairs_model", "x": 180, "uvlock": true },
+    "facing=west,half=top,shape=outer_left":  { "model": "engineersdecor:stairs/decor_outer_stairs_model", "x": 180, "y": 180, "uvlock": true },
+    "facing=south,half=top,shape=outer_left": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "x": 180, "y": 90, "uvlock": true },
+    "facing=north,half=top,shape=outer_left": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "x": 180, "y": 270, "uvlock": true },
+    "facing=east,half=top,shape=inner_right":  { "model": "engineersdecor:stairs/decor_inner_stairs_model", "x": 180, "y": 90, "uvlock": true },
+    "facing=west,half=top,shape=inner_right":  { "model": "engineersdecor:stairs/decor_inner_stairs_model", "x": 180, "y": 270, "uvlock": true },
+    "facing=south,half=top,shape=inner_right": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "x": 180, "y": 180, "uvlock": true },
+    "facing=north,half=top,shape=inner_right": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "x": 180, "uvlock": true },
+    "facing=east,half=top,shape=inner_left":  { "model": "engineersdecor:stairs/decor_inner_stairs_model", "x": 180, "uvlock": true },
+    "facing=west,half=top,shape=inner_left":  { "model": "engineersdecor:stairs/decor_inner_stairs_model", "x": 180, "y": 180, "uvlock": true },
+    "facing=south,half=top,shape=inner_left": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "x": 180, "y": 90, "uvlock": true },
+    "facing=north,half=top,shape=inner_left": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "x": 180, "y": 270, "uvlock": true }
+  }
+}
diff --git a/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof.json b/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof.json
new file mode 100644
index 0000000..364adae
--- /dev/null
+++ b/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof.json
@@ -0,0 +1,55 @@
+{
+  "forge_marker": 1,
+  "defaults": {
+    "model": "engineersdecor:stairs/decor_straight_roof_model",
+    "textures": {
+      "bottom": "engineersdecor:blocks/iestyle/ironsheet_roof_top",
+      "side": "engineersdecor:blocks/iestyle/ironsheet_roof",
+      "top": "engineersdecor:blocks/iestyle/ironsheet_roof_top"
+    }
+  },
+  "variants": {
+    "normal": [{}],
+    "inventory": [{}],
+    "facing=east,half=bottom,shape=straight":  { "model": "engineersdecor:stairs/decor_straight_roof_model" },
+    "facing=west,half=bottom,shape=straight":  { "model": "engineersdecor:stairs/decor_straight_roof_model", "y": 180, "uvlock": true },
+    "facing=south,half=bottom,shape=straight": { "model": "engineersdecor:stairs/decor_straight_roof_model", "y": 90, "uvlock": true },
+    "facing=north,half=bottom,shape=straight": { "model": "engineersdecor:stairs/decor_straight_roof_model", "y": 270, "uvlock": true },
+    "facing=east,half=bottom,shape=outer_right":  { "model": "engineersdecor:stairs/decor_outer_roof_model" },
+    "facing=west,half=bottom,shape=outer_right":  { "model": "engineersdecor:stairs/decor_outer_roof_model", "y": 180, "uvlock": true },
+    "facing=south,half=bottom,shape=outer_right": { "model": "engineersdecor:stairs/decor_outer_roof_model", "y": 90, "uvlock": true },
+    "facing=north,half=bottom,shape=outer_right": { "model": "engineersdecor:stairs/decor_outer_roof_model", "y": 270, "uvlock": true },
+    "facing=east,half=bottom,shape=outer_left":  { "model": "engineersdecor:stairs/decor_outer_roof_model", "y": 270, "uvlock": true },
+    "facing=west,half=bottom,shape=outer_left":  { "model": "engineersdecor:stairs/decor_outer_roof_model", "y": 90, "uvlock": true },
+    "facing=south,half=bottom,shape=outer_left": { "model": "engineersdecor:stairs/decor_outer_roof_model" },
+    "facing=north,half=bottom,shape=outer_left": { "model": "engineersdecor:stairs/decor_outer_roof_model", "y": 180, "uvlock": true },
+    "facing=east,half=bottom,shape=inner_right":  { "model": "engineersdecor:stairs/decor_inner_roof_model" },
+    "facing=west,half=bottom,shape=inner_right":  { "model": "engineersdecor:stairs/decor_inner_roof_model", "y": 180, "uvlock": true },
+    "facing=south,half=bottom,shape=inner_right": { "model": "engineersdecor:stairs/decor_inner_roof_model", "y": 90, "uvlock": true },
+    "facing=north,half=bottom,shape=inner_right": { "model": "engineersdecor:stairs/decor_inner_roof_model", "y": 270, "uvlock": true },
+    "facing=east,half=bottom,shape=inner_left":  { "model": "engineersdecor:stairs/decor_inner_roof_model", "y": 270, "uvlock": true },
+    "facing=west,half=bottom,shape=inner_left":  { "model": "engineersdecor:stairs/decor_inner_roof_model", "y": 90, "uvlock": true },
+    "facing=south,half=bottom,shape=inner_left": { "model": "engineersdecor:stairs/decor_inner_roof_model" },
+    "facing=north,half=bottom,shape=inner_left": { "model": "engineersdecor:stairs/decor_inner_roof_model", "y": 180, "uvlock": true },
+    "facing=east,half=top,shape=straight":  { "model": "engineersdecor:stairs/decor_straight_roof_model", "x": 180, "uvlock": true },
+    "facing=west,half=top,shape=straight":  { "model": "engineersdecor:stairs/decor_straight_roof_model", "x": 180, "y": 180, "uvlock": true },
+    "facing=south,half=top,shape=straight": { "model": "engineersdecor:stairs/decor_straight_roof_model", "x": 180, "y": 90, "uvlock": true },
+    "facing=north,half=top,shape=straight": { "model": "engineersdecor:stairs/decor_straight_roof_model", "x": 180, "y": 270, "uvlock": true },
+    "facing=east,half=top,shape=outer_right":  { "model": "engineersdecor:stairs/decor_outer_roof_model", "x": 180, "y": 90, "uvlock": true },
+    "facing=west,half=top,shape=outer_right":  { "model": "engineersdecor:stairs/decor_outer_roof_model", "x": 180, "y": 270, "uvlock": true },
+    "facing=south,half=top,shape=outer_right": { "model": "engineersdecor:stairs/decor_outer_roof_model", "x": 180, "y": 180, "uvlock": true },
+    "facing=north,half=top,shape=outer_right": { "model": "engineersdecor:stairs/decor_outer_roof_model", "x": 180, "uvlock": true },
+    "facing=east,half=top,shape=outer_left":  { "model": "engineersdecor:stairs/decor_outer_roof_model", "x": 180, "uvlock": true },
+    "facing=west,half=top,shape=outer_left":  { "model": "engineersdecor:stairs/decor_outer_roof_model", "x": 180, "y": 180, "uvlock": true },
+    "facing=south,half=top,shape=outer_left": { "model": "engineersdecor:stairs/decor_outer_roof_model", "x": 180, "y": 90, "uvlock": true },
+    "facing=north,half=top,shape=outer_left": { "model": "engineersdecor:stairs/decor_outer_roof_model", "x": 180, "y": 270, "uvlock": true },
+    "facing=east,half=top,shape=inner_right":  { "model": "engineersdecor:stairs/decor_inner_roof_model", "x": 180, "y": 90, "uvlock": true },
+    "facing=west,half=top,shape=inner_right":  { "model": "engineersdecor:stairs/decor_inner_roof_model", "x": 180, "y": 270, "uvlock": true },
+    "facing=south,half=top,shape=inner_right": { "model": "engineersdecor:stairs/decor_inner_roof_model", "x": 180, "y": 180, "uvlock": true },
+    "facing=north,half=top,shape=inner_right": { "model": "engineersdecor:stairs/decor_inner_roof_model", "x": 180, "uvlock": true },
+    "facing=east,half=top,shape=inner_left":  { "model": "engineersdecor:stairs/decor_inner_roof_model", "x": 180, "uvlock": true },
+    "facing=west,half=top,shape=inner_left":  { "model": "engineersdecor:stairs/decor_inner_roof_model", "x": 180, "y": 180, "uvlock": true },
+    "facing=south,half=top,shape=inner_left": { "model": "engineersdecor:stairs/decor_inner_roof_model", "x": 180, "y": 90, "uvlock": true },
+    "facing=north,half=top,shape=inner_left": { "model": "engineersdecor:stairs/decor_inner_roof_model", "x": 180, "y": 270, "uvlock": true }
+  }
+}
diff --git a/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof_block.json b/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof_block.json
new file mode 100644
index 0000000..38c1161
--- /dev/null
+++ b/src/main/resources/assets/engineersdecor/blockstates/iron_sheet_roof_block.json
@@ -0,0 +1,11 @@
+{
+  "forge_marker": 1,
+  "defaults": {
+    "model": "engineersdecor:decor_full_block_model",
+    "textures": { "all": "engineersdecor:blocks/iestyle/ironsheet_roof" }
+  },
+  "variants": {
+    "normal": [{}],
+    "inventory": [{}]
+  }
+}
diff --git a/src/main/resources/assets/engineersdecor/blockstates/metal_rung_ladder.json b/src/main/resources/assets/engineersdecor/blockstates/metal_rung_ladder.json
new file mode 100644
index 0000000..3494594
--- /dev/null
+++ b/src/main/resources/assets/engineersdecor/blockstates/metal_rung_ladder.json
@@ -0,0 +1,9 @@
+{
+  "forge_marker": 1,
+  "defaults": { "model": "engineersdecor:metal_rung_ladder_model" },
+  "variants": {
+    "normal": [{}],
+    "facing": { "north":{"y":0}, "south":{"y":180}, "west":{"y":270}, "east":{"y":90}, "up": {"x":0}, "down": {"x":0} },
+    "inventory": [{}]
+  }
+}
diff --git a/src/main/resources/assets/engineersdecor/blockstates/metal_rung_steps.json b/src/main/resources/assets/engineersdecor/blockstates/metal_rung_steps.json
new file mode 100644
index 0000000..47bea7f
--- /dev/null
+++ b/src/main/resources/assets/engineersdecor/blockstates/metal_rung_steps.json
@@ -0,0 +1,9 @@
+{
+  "forge_marker": 1,
+  "defaults": { "model": "engineersdecor:metal_rung_steps_model" },
+  "variants": {
+    "normal": [{}],
+    "facing": { "north":{"y":0}, "south":{"y":180}, "west":{"y":270}, "east":{"y":90}, "up": {"x":0}, "down": {"x":0} },
+    "inventory": [{}]
+  }
+}
diff --git a/src/main/resources/assets/engineersdecor/blockstates/slag_brick_block.json b/src/main/resources/assets/engineersdecor/blockstates/slag_brick_block.json
new file mode 100644
index 0000000..10a9f06
--- /dev/null
+++ b/src/main/resources/assets/engineersdecor/blockstates/slag_brick_block.json
@@ -0,0 +1,20 @@
+{
+  "forge_marker": 1,
+  "defaults": {
+    "model": "engineersdecor:slag_brick_model",
+    "textures": { "all": "engineersdecor:blocks/slag_brick/slag_brick_texture0" }
+  },
+  "variants": {
+    "normal": [
+      { "textures": { "all": "engineersdecor:blocks/slag_brick/slag_brick_texture0" } },
+      { "textures": { "all": "engineersdecor:blocks/slag_brick/slag_brick_texture1" } },
+      { "textures": { "all": "engineersdecor:blocks/slag_brick/slag_brick_texture2" } },
+      { "textures": { "all": "engineersdecor:blocks/slag_brick/slag_brick_texture3" } },
+      { "textures": { "all": "engineersdecor:blocks/slag_brick/slag_brick_texture4" } },
+      { "textures": { "all": "engineersdecor:blocks/slag_brick/slag_brick_texture5" } },
+      { "textures": { "all": "engineersdecor:blocks/slag_brick/slag_brick_texture6" } },
+      { "textures": { "all": "engineersdecor:blocks/slag_brick/slag_brick_texture7" } }
+    ],
+    "inventory": [{}]
+  }
+}
diff --git a/src/main/resources/assets/engineersdecor/blockstates/slag_brick_stairs.json b/src/main/resources/assets/engineersdecor/blockstates/slag_brick_stairs.json
new file mode 100644
index 0000000..ac54ba7
--- /dev/null
+++ b/src/main/resources/assets/engineersdecor/blockstates/slag_brick_stairs.json
@@ -0,0 +1,56 @@
+{
+  "forge_marker": 1,
+  "defaults": {
+    "model": "engineersdecor:stairs/decor_straight_stairs_model",
+    "textures": {
+      "particle": "engineersdecor:blocks/slag_brick/slag_brick_texture0",
+      "bottom": "engineersdecor:blocks/slag_brick/slag_brick_texture0",
+      "top"   : "engineersdecor:blocks/slag_brick/slag_brick_texture0",
+      "side"  : "engineersdecor:blocks/slag_brick/slag_brick_texture0"
+    }
+  },
+  "variants": {
+    "normal": [{}],
+    "inventory": [{}],
+    "facing=east,half=bottom,shape=straight":  { "model": "engineersdecor:stairs/decor_straight_stairs_model" },
+    "facing=west,half=bottom,shape=straight":  { "model": "engineersdecor:stairs/decor_straight_stairs_model", "y": 180, "uvlock": true },
+    "facing=south,half=bottom,shape=straight": { "model": "engineersdecor:stairs/decor_straight_stairs_model", "y": 90, "uvlock": true },
+    "facing=north,half=bottom,shape=straight": { "model": "engineersdecor:stairs/decor_straight_stairs_model", "y": 270, "uvlock": true },
+    "facing=east,half=bottom,shape=outer_right":  { "model": "engineersdecor:stairs/decor_outer_stairs_model" },
+    "facing=west,half=bottom,shape=outer_right":  { "model": "engineersdecor:stairs/decor_outer_stairs_model", "y": 180, "uvlock": true },
+    "facing=south,half=bottom,shape=outer_right": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "y": 90, "uvlock": true },
+    "facing=north,half=bottom,shape=outer_right": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "y": 270, "uvlock": true },
+    "facing=east,half=bottom,shape=outer_left":  { "model": "engineersdecor:stairs/decor_outer_stairs_model", "y": 270, "uvlock": true },
+    "facing=west,half=bottom,shape=outer_left":  { "model": "engineersdecor:stairs/decor_outer_stairs_model", "y": 90, "uvlock": true },
+    "facing=south,half=bottom,shape=outer_left": { "model": "engineersdecor:stairs/decor_outer_stairs_model" },
+    "facing=north,half=bottom,shape=outer_left": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "y": 180, "uvlock": true },
+    "facing=east,half=bottom,shape=inner_right":  { "model": "engineersdecor:stairs/decor_inner_stairs_model" },
+    "facing=west,half=bottom,shape=inner_right":  { "model": "engineersdecor:stairs/decor_inner_stairs_model", "y": 180, "uvlock": true },
+    "facing=south,half=bottom,shape=inner_right": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "y": 90, "uvlock": true },
+    "facing=north,half=bottom,shape=inner_right": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "y": 270, "uvlock": true },
+    "facing=east,half=bottom,shape=inner_left":  { "model": "engineersdecor:stairs/decor_inner_stairs_model", "y": 270, "uvlock": true },
+    "facing=west,half=bottom,shape=inner_left":  { "model": "engineersdecor:stairs/decor_inner_stairs_model", "y": 90, "uvlock": true },
+    "facing=south,half=bottom,shape=inner_left": { "model": "engineersdecor:stairs/decor_inner_stairs_model" },
+    "facing=north,half=bottom,shape=inner_left": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "y": 180, "uvlock": true },
+    "facing=east,half=top,shape=straight":  { "model": "engineersdecor:stairs/decor_straight_stairs_model", "x": 180, "uvlock": true },
+    "facing=west,half=top,shape=straight":  { "model": "engineersdecor:stairs/decor_straight_stairs_model", "x": 180, "y": 180, "uvlock": true },
+    "facing=south,half=top,shape=straight": { "model": "engineersdecor:stairs/decor_straight_stairs_model", "x": 180, "y": 90, "uvlock": true },
+    "facing=north,half=top,shape=straight": { "model": "engineersdecor:stairs/decor_straight_stairs_model", "x": 180, "y": 270, "uvlock": true },
+    "facing=east,half=top,shape=outer_right":  { "model": "engineersdecor:stairs/decor_outer_stairs_model", "x": 180, "y": 90, "uvlock": true },
+    "facing=west,half=top,shape=outer_right":  { "model": "engineersdecor:stairs/decor_outer_stairs_model", "x": 180, "y": 270, "uvlock": true },
+    "facing=south,half=top,shape=outer_right": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "x": 180, "y": 180, "uvlock": true },
+    "facing=north,half=top,shape=outer_right": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "x": 180, "uvlock": true },
+    "facing=east,half=top,shape=outer_left":  { "model": "engineersdecor:stairs/decor_outer_stairs_model", "x": 180, "uvlock": true },
+    "facing=west,half=top,shape=outer_left":  { "model": "engineersdecor:stairs/decor_outer_stairs_model", "x": 180, "y": 180, "uvlock": true },
+    "facing=south,half=top,shape=outer_left": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "x": 180, "y": 90, "uvlock": true },
+    "facing=north,half=top,shape=outer_left": { "model": "engineersdecor:stairs/decor_outer_stairs_model", "x": 180, "y": 270, "uvlock": true },
+    "facing=east,half=top,shape=inner_right":  { "model": "engineersdecor:stairs/decor_inner_stairs_model", "x": 180, "y": 90, "uvlock": true },
+    "facing=west,half=top,shape=inner_right":  { "model": "engineersdecor:stairs/decor_inner_stairs_model", "x": 180, "y": 270, "uvlock": true },
+    "facing=south,half=top,shape=inner_right": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "x": 180, "y": 180, "uvlock": true },
+    "facing=north,half=top,shape=inner_right": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "x": 180, "uvlock": true },
+    "facing=east,half=top,shape=inner_left":  { "model": "engineersdecor:stairs/decor_inner_stairs_model", "x": 180, "uvlock": true },
+    "facing=west,half=top,shape=inner_left":  { "model": "engineersdecor:stairs/decor_inner_stairs_model", "x": 180, "y": 180, "uvlock": true },
+    "facing=south,half=top,shape=inner_left": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "x": 180, "y": 90, "uvlock": true },
+    "facing=north,half=top,shape=inner_left": { "model": "engineersdecor:stairs/decor_inner_stairs_model", "x": 180, "y": 270, "uvlock": true }
+  }
+}
diff --git a/src/main/resources/assets/engineersdecor/blockstates/treated_wood_ladder.json b/src/main/resources/assets/engineersdecor/blockstates/treated_wood_ladder.json
new file mode 100644
index 0000000..cd223cc
--- /dev/null
+++ b/src/main/resources/assets/engineersdecor/blockstates/treated_wood_ladder.json
@@ -0,0 +1,9 @@
+{
+  "forge_marker": 1,
+  "defaults": { "model": "engineersdecor:treated_wood_ladder_model" },
+  "variants": {
+    "normal": [{}],
+    "facing": { "north":{"y":0}, "south":{"y":180}, "west":{"y":270}, "east":{"y":90}, "up": {"x":0}, "down": {"x":0} },
+    "inventory": [{}]
+  }
+}
diff --git a/src/main/resources/assets/engineersdecor/blockstates/treated_wood_pole.json b/src/main/resources/assets/engineersdecor/blockstates/treated_wood_pole.json
new file mode 100644
index 0000000..dc6ff19
--- /dev/null
+++ b/src/main/resources/assets/engineersdecor/blockstates/treated_wood_pole.json
@@ -0,0 +1,17 @@
+{
+  "forge_marker": 1,
+  "defaults": {
+    "model": "engineersdecor:pole/straight_pole_model",
+    "x":-90,
+    "textures": {
+      "particle": "engineersdecor:blocks/pole/treated_wood_pole_side_texture",
+      "side": "engineersdecor:blocks/pole/treated_wood_pole_side_texture",
+      "top": "engineersdecor:blocks/pole/treated_wood_pole_top_texture"
+    }
+  },
+  "variants": {
+    "normal": [{}],
+    "facing": { "north": {"y":0}, "south": {"y":0}, "west": {"y":90}, "east": {"y":90}, "up": {"x":90}, "down": {"x":90} },
+    "inventory": [{}]
+  }
+}
diff --git a/src/main/resources/assets/engineersdecor/blockstates/treated_wood_table.json b/src/main/resources/assets/engineersdecor/blockstates/treated_wood_table.json
new file mode 100644
index 0000000..f4ac097
--- /dev/null
+++ b/src/main/resources/assets/engineersdecor/blockstates/treated_wood_table.json
@@ -0,0 +1,8 @@
+{
+  "forge_marker": 1,
+  "defaults": { "model": "engineersdecor:treated_wood_table_model" },
+  "variants": {
+    "normal": [{}],
+    "inventory": [{}]
+  }
+}
diff --git a/src/main/resources/assets/engineersdecor/lang/en_us.lang b/src/main/resources/assets/engineersdecor/lang/en_us.lang
new file mode 100644
index 0000000..81466ef
--- /dev/null
+++ b/src/main/resources/assets/engineersdecor/lang/en_us.lang
@@ -0,0 +1,49 @@
+#
+# Engineer's Decor lang file
+#
+#PARSE_ESCAPES
+#
+#-----------------------------------------------------------------------------------------------------------
+itemGroup.tabengineersdecor=Engineer's Decor
+engineersdecor.config.title=Engineer's Decor config
+engineersdecor.tooltip.hint.extended=§6[§9SHIFT§r More info§6]§r
+engineersdecor.tooltip.hint.help=§6[§9CTRL-SHIFT§r Help§6]§r
+
+#-----------------------------------------------------------------------------------------------------------
+# Wall blocks
+#-----------------------------------------------------------------------------------------------------------
+tile.engineersdecor.clinker_brick_block.name=Clinker brick
+tile.engineersdecor.clinker_brick_block.help=§6A brick wall block with position dependent texture variations.§r\nLooks slightly darker and more color intensive than the vanilla brick block.
+tile.engineersdecor.slag_brick_block.name=Slag brick
+tile.engineersdecor.slag_brick_block.help=§6A gray-brown brick wall block with position dependent texture variations.
+
+#-----------------------------------------------------------------------------------------------------------
+# Ladder blocks
+#-----------------------------------------------------------------------------------------------------------
+tile.engineersdecor.metal_rung_ladder.name=Metal rung ladder
+tile.engineersdecor.metal_rung_ladder.help=§6Typical industrial wall ladder, consisting of horizontal metal rod rungs.
+tile.engineersdecor.metal_rung_steps.name=Staggered metal steps
+tile.engineersdecor.metal_rung_steps.help=§6Staggered rod rungs affixed to a wall, allowing to climb up, fall down, and so on.
+tile.engineersdecor.treated_wood_ladder.name=Treated wood ladder
+tile.engineersdecor.treated_wood_ladder.help=§6Weather-proof wooden ladder.
+
+#-----------------------------------------------------------------------------------------------------------
+# Stairs and roofs
+#-----------------------------------------------------------------------------------------------------------
+tile.engineersdecor.clinker_brick_stairs.name=Clinker brick stairs
+tile.engineersdecor.clinker_brick_stairs.help=§6§rLooks slightly darker and more color intensive than the vanilla brick block.
+tile.engineersdecor.slag_brick_stairs.name=Clinker brick stairs
+tile.engineersdecor.slag_brick_stairs.help=§6§rLooks slightly darker and more color intensive than the vanilla brick block.
+tile.engineersdecor.iron_sheet_roof.name=Iron sheet metal roof
+tile.engineersdecor.iron_sheet_roof.help=§6Well, it's a roof.
+
+#-----------------------------------------------------------------------------------------------------------
+# Poles
+#-----------------------------------------------------------------------------------------------------------
+tile.engineersdecor.treated_wood_pole.name=Straight treated wood pole
+tile.engineersdecor.treated_wood_pole.help=§6Straight pole fragment with the diameter of a wire relay.§r\n\
+              Can be useful as alternative to the wire posts if special special lengths are needed, \
+              or as support for structures.
+
+# EOF
+#-----------------------------------------------------------------------------------------------------------
diff --git a/src/main/resources/assets/engineersdecor/logo.png b/src/main/resources/assets/engineersdecor/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..793e40fa8368084b9aa8755cf662bb9cb0246061
GIT binary patch
literal 124533
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

9aVqwu+a&@croS?!d1#tfMqA8ul^lbwR|CW*K_@ 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%0AfV*C%T&Ag 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

|y3R}0{K-m)i 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 N002ovPDHLkV1kK-NUZ<> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture3.png b/src/main/resources/assets/engineersdecor/textures/blocks/clinker_brick/clinker_brick_texture3.png new file mode 100644 index 0000000000000000000000000000000000000000..cb6f0f794046c8f7b8dc1530e434dda1924d6281 GIT binary patch literal 728 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 VW6X4xaI63T002ovPDHLkV1jWASGWKG literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/ironsheet_roof.png b/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/ironsheet_roof.png new file mode 100644 index 0000000000000000000000000000000000000000..23dff87467dd928f1f9f79ada28aa073fd4d3e63 GIT binary patch literal 415 zcmV;Q0bu@#P)pGQAtEWR4C6)Qn9YWKn%;}0_uPmDN=!|z_0RI3>^_jOh_#J2ReMY zH@Ms*Q(HTZ<0hO=r@rsE+pVfTpUzE>-E~U?RvciaJgJot5w^!@Aq3()!p6Q z%t8pNDk37Hs`Yg?o0%B^cc0+<{jREn&*w9MoO3B<97p-q?RGOWrPweGWV`z?43)(1 zv~WBgMP!<=TrN4$-8Y*J?S&9_yPdm}vsf$uOscF>3Nd%*KmaMFoHLhHZf0gp)1;ID zlu}4lRr?lQ0RUj^77;TO5hnAS71@=bb=N9Z*|jIeSWychRE+Y}tDW4Zx|+lQ)GY!0 zCLtm@XJ!b%m<-val$>))Nkl%M4?BNrKA&4PO0gJY(=<%)*Xn-;^!<1|Dm;!OGgZ}k z8mjtwy+mXJ4u=DWlu~#Otl#Ip@Bfdl7EhxFwcqdg2V#sQ`~mXs-IB-WO=$oC002ov JPDHLkV1nvRwIu)m literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/ironsheet_roof_top.png b/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/ironsheet_roof_top.png new file mode 100644 index 0000000000000000000000000000000000000000..a5f038273c5b831a6f28a2bc0fe1dc8280a98e51 GIT binary patch literal 509 zcmVpGuSrBfR5;6BlfiE4Fc3x0%s7q$Z0M@||FWM|saqsKKpcDKEn2(f zd6UFSe9ygiA|D?g;qIJHCq#tv`Ap84hvK`CV%TuK2L2La@q z(Y~2dLPTh-p{ke}W;UJyBH~+B6;=JdcXt3Tm&>?D1Sus_N&v&cwr#BIN=k|Top$Aj zKt!0P34mHF?mjXprLe9mW`?^D5d|y#Zm=Zu-5UCG^t=adrDG|?MstpPC4^9zlL@Y~7Hy4`L=sgra<5gFM;1lzWu z%d*f~qt-g=+O};F_0W2_oygt44|qHt|3l#Jlv1d*Qc4*Fef2!1Y5Hwpx7)F3cD*(^ulbkc_x&rVIh$bMRkNiYz00000NkvXXu0mjfwTVGd000McNliru;{pi{B{-AiBuoGR0h~!h zK~yNuJ(63l!!QU$c^D_LQ*~9{|5932iQ@(v?g!HSLw>-_8SwRbrIg$~r8LF>004-B znGrFiq^itpW{8+X1ORf*DJ5nmqA^C!834>IZixsHd+%mO*L9hhyEC(@B4VvoL=X`G zR5hj{Vtk`giipH%6!(22;=b=GrFC5aV9uFyCL(60F$N-*QdBhz%sEBmIF3?E?>*E; zmpLcJIA)G!%$##(=1{ord(OGm8gH1H=A4L#h^;jd2_V;X5m5j*j^nzn7^|w3b4J8v zSwv)6mUt9S0#um%hejd#zVF`q7-Qe}Ip?x0+qS7{bp3w6IcIk#A_|mdR%-=-)|#re z)&Su5`<>_ccsy#Y5$>Fmh$!HwDiN*gno@c`pCVF9A)?RcbKkeSyStesW}b6K?5(x1 zK}5%Kgy>RA2zGZ7p*g3!pXbTU+qRk67{km0V$Qj>773V{suDAY@BcuE==b}%dx$i% z_xoK+8DlVW8e_x?j4>kYm;eCo-dYQEkqiK&u%fEHcM&nOKoK8e$D)WO`UAb#ODa19 R!+QV#002ovPDHLkV1m?9;k*C< literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood.png b/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..f87d077e8462184d81f2ead4e51e73565923a1bd GIT binary patch literal 513 zcmV+c0{;DpP)<{Avq?ljR5;5$lg+UdF${#iZfSPmNCZSe{uu#p#*#SLi>rKbmDIo1 zub)3gHr37h3K$`asv;ujZfrBt%m9FG?q~735+h;373NvR>q@RLS0+^j16{=x$;@zt zscOPT1KBfl4d34{T+Ld=h>ehOP{p$fNAUZ8cttY6U4;b*=ouWwh7g3sy%rK=h@Pga zNEGhArklS{aj)W)0YEtTTEz@V!ZNiA+uNV&rUy1t@y?_Ny5XJ4y`E#F zs2*(LWBLGTd+Pu!(Y*~?y;Jy{Rhz|(S+zJLWOq}51<%*b6-K~Qjb&DCq;FT!-Twi4 zws*Gnt}AzZ&l!-QXLmq?do3~($;c)nu)TW#(A|4c7=Rh5gUEnnzMh3FbP6R2fAl}q zd?E#SMUXbv@xg+bCbR)kA}sQ$CM0?Wor=y`lwnpC8C!E^f_7pfSlwhCJ=4W>BYlds zZyrhAjRhs06p}h`g!Tt{<%Q(`hJO68j3frm&<5>k5}DnaObH`#8`7f6j@i(RyP?@R|#AB?~e( zxFf)vN$Uru!fS4_3NyjQ45f%HD2Uv|>%_eN1@!M9^@YYx_2U!y6|L~ts3 z&BV+oimc+=!5D+R6CxR7@H$VrHwq!&rteA|QTCoh1kIgYMP+iH=iB+t-bwEr00AWK zgNWe6l`S1N<@3C5+~XEk6(Rx%&+GhxAMPZDH^X0ZAtHnbM{gu>t&O|i+pi+?4pC+j z5v(dy;97x-8i=yz)_AxA`>!-*c+jUz39z}SXAAs^uy%FwN4e}8`Lf6DrA9c zqq}2jbaxy@O$iGBI47+cqDEF?BB&~B77&;jqQcCivbe5`T}j3L@f{>!&Fg0000slu#Q1H5^ zi(`nz>A8~)!;Tp6xcu*#yL7=V;R1no|K+|vUK;Mx&VHrtq-el@1$U*luv`c2iHU zt&3LFG@HJw$JB3K!pwP|E*o5Z(pMNac<5Z*bh+A(F_=H8B;G4^<slu#P_W$7 z#WBR<^xFxBe1`&foZ}yL&15d%duRV$My6rzzZs2XO0G_^zo)rOOFr2+`LK)nz5MX} zYPK5*33WF6{{)LqU<_uPc~E0<>9%`*A#7}`dX&oh%b6Ke)~Ygl>Kv|TJF?vTfUDA? q?_2FFc$tqH`BWOL`f>5m6OH^lCw1X@IW-^$GkCiCxvXo~-ZNOTPT#^VSelVDr%lPk;HI*1!?g%MM3KF>t=!aeVTC=Z}A&3xT;9wK{RC zjcNt2mDPI1YPsN#^DVhlwo_oWNK84i9(n*uF?QL=x!~@^dCm-r#Oqv`rirN-U5KQV zsO}Uq0L&@?`(ogYVwJa6J@U=hU$y3q*hSXsH2}NIO8_)R+ze5rxpVFMb@tBf)N(>#f zRuG|DCEh-|$G>qPPnmvL(%dPva`W~bZp<^)8$pHtCd5E|@$3{)K}6Yne8R6!zC{FL zI1E_4ky3nfKl}N+16@#_KRG478YhAZsq1iaM3rpL#cm|Th_*&;jV6i}Lsi-5!uezi5 zK%?^R<`@micsVlkOXADl&ZyNCJGR1PM}l@mD^K6&^V zv6!*l&u9p=*4`*vn*%WPOa6SlL$8p5tCu?ac_zjfDBc(XNQ{IKuu@1N(RCd$C|&BH zHEON6J53Je0>qoQj(BIvlv+qBfjg+O=sHk%?}NKo&Uk~8XH*sU16{SsKU^4MF27uT Q4*&oF07*qoM6N<$g4{Sz3jhEB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture1.png b/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture1.png new file mode 100644 index 0000000000000000000000000000000000000000..1e56869407adc39e092e737a5912cc28048c2eae GIT binary patch literal 707 zcmV;!0zCbRP)U>nkjCI*CzeE}cDnIH(hffL`sNrXlMqS%Bal7ZkjlhAFh_uO;#Pi+Ss zI{tv)q@Z9e7K*cy_uam&SGqtcS#uGn>^CfKn=BuH;;BcWjr4oaY zQlhz2Y6YOy2Ee{l@J^|Xi|Zxw%~xOa)p|oP!^{v7ru|5nCe#eC6;Z`vVzC(5?{?H$ z@eT;sZ%>X%K>(rDO0+;nu^?Q%cAW?JzXM>mpJ?s`RRGq@1@9kzjF||}UyQtQX+w6% zb0wHD&h=cl9ryg3?YJkzfO&UNVakOVBkm4>h>*jk*%yPA$yHi@@ zgTs%Q=b7f6pz;rcU;+F6*JDHl5#`Fe2OK}V4iym#c=ufOaT6BdnNMlF>WrzZfcE?mHy6M~X+=HhFw(^_L1ckKS$ zv05&$qoeN$DzsAm)AH@R_jvfz5sv(=z_T>1HE!Pd1WN+B6vpDv3WWIT0-}LhDoA)~ z&{4oU?B^NFwK7gKsJ;@vB*uuUFboNLr?rN=)8%Zr0CwZn9i}N$S|O#xa=D@d!;sJ+ p@#eJyYR-6vl4n%)d~B^Y{sL>rLE72U*`fdd002ovPDHLkV1o5ZMza6_ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture2.png b/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture2.png new file mode 100644 index 0000000000000000000000000000000000000000..8832f881774cd89fd689884e0b7a887092048796 GIT binary patch literal 728 zcmV;}0w?{6P)YwvRl z*bW>EDr!p;4Cz2@0_s!v0zQZ{K@fZcCq9J(b>Iag88n6NKq6Q#7s%INejcm!21|*Q5+XwPN}VP&C64<&qDsmGi^a%cx5M4(0SKf&etX1V z0tnTeoQyz8CcJn4fIlyP1rb!0V=1hbOWYe~%ITd8QW9Z%tc=Mh-YH!$gZ(tWf-1Yo z@m9z=alJb*;jymE4a znc=PB)yYF9TBEpg`~F9`JJVFCwJ;8|nNulPGSbt>j}R3^l+(Kx{Pg{|3`waiP(Vaz z5tu6X9(>H@FFzn645s|^?}2o+J7OvfITIn&9z^ZzrWx0I9Ek`@>xdev%Ar)Qck^4i z9A<*cWGWYeP!OP%{jWlxCc@GT1=QnPf^HGDOf? z0}=M6&N&9sTW9C2)*D0xd#QpOeDKEEIbI4qpq2?$rT2alr2hcS4?`m2$s7^E+&CF}E)NSsUpTCdW)5Q^1ORGn?AOM+R<>i0F3U;=G$)dF%(bx@dM*wN z=FWB~)MhNz065eJ9@J(u59G5?K8j%&>G~d3MMRhnd+I!sRB>}eK)b>)^i0!)w}uBG zpuapmqhtYu+8Ui^f`n$_-S$dtQC&{pf4TMenv#NcmF+-itx{FkBG1|KiZt# ze&NNJZcxpc=7rXb!?JR|yP}%0)JpC$$-^ND^I93k4U&}L{QC$2tiLtnl5Hvh?ibzT`a1L00J!P)f~3USoZWsRtCAwH2tpE)GAShvYvt+G z$Vt$#DAk;`uJnCD0CQ)*HiiH#h4ABkA_$;1qsxg-GxGVTABT1Y?UbxatBu{$a{xBm zEpAS$6*J@7_3K>jb|iu6YGN}E=pR2l#LP(&G!G)2lrkQ{=^MBC{+kC}+isYv@#oJV zBBYd9*UCG0-$iR{Tpkuu&O`*Q9WQI)#}?zj-xqsQPS5Bk5zL&!vY@J&>cJ+1sFHK0 z)k?{QuItd8=t>6>m>KR)$nm)VdgGOwJU_2gtCUh0#|;7WeIfOQmtTL2wyt2f%7KOQ1R?`STYn^@V)Y@=&^6^-i7KJCZG0!t|>kKJV zO2OP|y#vs@0dQy?JZRl`=3+!X|McSs5Au*%tyTc+w_5--XS{brm2l_Q?b{r7J9_VU z00Q~Z!!H4t4+lg90JD?YyYGL%)i)171XX3Om1!L5-AGBfytgI;?6zCn>_i}Pq9!=m zP}#jBj%lL1pOV)^0IeHC(o<|-eD+BI45ctm6Lp?3Git5WS^-$CR-~LsIpf_B z72F&Z$bbBHg_)xgbPpmN)r3cIdG`$-fBS%EZ%xe2&W}2EqSnUxt^4HGJDbB1O^JxO zsjP(qFpW$8da_5)mVxt2ow+q~&WYy1lt6MOr9^Lyk_y8xkdrc$0U|In+?}{78{`-6 zyv%cRrCFnt0`8#7Vi-W-&fVA12sCAm#~BeJA{fqj{11f5U+GS^s+<4-002ovPDHLk FV1i8MOQrw- literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture5.png b/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture5.png new file mode 100644 index 0000000000000000000000000000000000000000..baa5672d7a3391c37f6337c5ff796d4408a6e384 GIT binary patch literal 729 zcmV;~0w(>5P)`lfe4UDkc};~Gkb4$RW-rP z5^&N|{ix1&>WV`j_;iE@VhVR9RgvqECj-k6K2NElY9L9{a2Kfn494q-Kxk%^oOs-JT+B1C-hG#|uRjM7RF$b#R^y17lag|La!Sr3JbAt&B?X|*#V6vtDk*ye}7$4{`~C``RR5dsW6m6?}DgOEqK1$l5$3S$9t!XBAQTDE^6c1)<`Po zIAlbG+A531fB+YBr6aUvxF#%O&q42WU@V!d>m>m4*{7d${-=4K0a#tRLU@ppQfuXf z7q8;(OuH@H^DV1!N&e%PGu#7}jzy>UKs6D)bA0jd`v#Yq&eY9<0@7L(Vx7hmZg)76aBAgi=ajnkK3RW(FO?gHj3r zyYqAMjaP2*(o|{Q7>0pyT+t7MbTRPG`yXJn5*=EdQB~p)Fo1snF~nMV47dP*00000 LNkvXXu0mjfJU~jx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture6.png b/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture6.png new file mode 100644 index 0000000000000000000000000000000000000000..6895552a90f6df672bd49c30ffb70a82209ba348 GIT binary patch literal 751 zcmVkq_ZZI8rB3gO@wR)cjJ46bW4j*o zR`K3hF6S&)8^&6hOfpCUcY*-vtmX@9ZJd`zDHV4|$FVS&F?PrDfT*CV^d3Oq5u}tT zw z9t?vaqP%$HCilO)jfgNL<@aCiVT-dJNrfS2A_P&TG^eye^*|%&5rim{y(y~7wp5m9 zjiiE22cveU)WT#kAV7B~+_9w8P{KPA0TBdHTPG*QBalx&`8aB8m>K(rhqT)0y>Yf) zGdnoIyOWYqN?|^KNEt`2UVEO$tH;cyd)SY6?+_k{z$6f z?N5I3VD*SnD(}4aJ~pw$dOM;iQO8Pa7hn%(v6wTP?(z5P98LP9eHEd1XFHCVS)zK7 z=|sR}GSF&eNCT_o97{?bGDOgO$K45$iyZ^@^2se;s1?f@fHD?>3!^;QW4l??O2Gqa h8BtZ-{olQG{s9}HY&2FWSkV9g002ovPDHLkV1nF#Ub_GQ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture7.png b/src/main/resources/assets/engineersdecor/textures/blocks/slag_brick/slag_brick_texture7.png new file mode 100644 index 0000000000000000000000000000000000000000..966aee469c9fa7b77c264e1d6ee01b14ca13b631 GIT binary patch literal 742 zcmVizq* zX~CJG*hU)D(qIz=#eowS;RalYV@Eo11%mrf5o|NkAcDEmr3gSNm8WwCcgzgkwjF?qP@9orAcaT>3hscT0<|^()>5(7 zD76tnK)(6vOW(JQhCnGh<8)xpnUXUS1AXccRbuKGhMskvskLGb2*h76zeC*s!EsUy zI7$q{t9Q?Mbae?Ls498inZ}V?8zCqs_b!N0gk>v?eaD;&u^J|V03jUa*68i>#jBk_&XbDqb57!!Tp zvCcE|vhe!pIY-CGtjmG`>#{Hm0{|fg;@^)SAS#F`CubM@@ym~hKn#&BZ&Y`tv1i#T zuf2K7KYu+!MCgL@_~8}tdd>tDx|CR#m0TOm9HD?HUK`JrOf#n+CsdVnFKh)w1RcAG zh_IKP!_g5_m#DSj?uZ+t4n&?Sfdi#BYBRP{k*~k_+)J(0S_vUwZj^n;nlT*?bp1ft zH=aECmuWii((%h|>q2YBG!Dc+f4`zNL&d4)xErbgbLZskcX{~p5A;#lO5-WKa6*84 z7w;2Gt*qNlF-KKjC|hdf1c)(mJ!drN|E!!ShP#vc9(9~KXB0>=5@P^2hAwgE&M`44 zsY?XC{f4zhX-2i%y7<;R_c@In=8Y|9#&N=dzVFb!!;)O{!Q1I-#Dg1fWc+|X*{ YKL~Si=sh)*xBvhE07*qoM6N<$f>D!Ai~s-t literal 0 HcmV?d00001 diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info new file mode 100644 index 0000000..570f937 --- /dev/null +++ b/src/main/resources/mcmod.info @@ -0,0 +1,16 @@ +[ + { + "modid": "engineersdecor", + "name": "Engineer's Decor", + "description": "Adds cosmetic blocks for the engineer's workshop, factory and home.", + "version": "${version}", + "mcversion": "${mcversion}", + "url": "https://github.com/stfwi/engineers-decor/", + "authorList": ["wile"], + "credits": "The Forge smiths, the Modders of the World.", + "logoFile": "assets/engineersdecor/logo.png", + "screenshots": [], + "useDependencyInformation": false, + "dependencies": ["Forge"] + } +] diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta new file mode 100644 index 0000000..73a4b04 --- /dev/null +++ b/src/main/resources/pack.mcmeta @@ -0,0 +1,7 @@ +{ + "pack": { + "description": "engineersdecor resources", + "pack_format": 3, + "_comment": "A pack_format of 3 should be used starting with Minecraft 1.11. All resources, including language files, should be lowercase (eg: en_us.lang). A pack_format of 2 will load your mod resources with LegacyV2Adapter, which requires language files to have uppercase letters (eg: en_US.lang)." + } +} From a7c7a926a95309c0935d210b8175bc1f732f7225 Mon Sep 17 00:00:00 2001 From: stfwi Date: Sun, 10 Feb 2019 17:50:52 +0100 Subject: [PATCH 04/14] Lang file completed, creative tab model set. --- .../java/wile/engineersdecor/ModEngineersDecor.java | 2 +- .../resources/assets/engineersdecor/lang/en_us.lang | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/wile/engineersdecor/ModEngineersDecor.java b/src/main/java/wile/engineersdecor/ModEngineersDecor.java index 1c1a0e9..d5a79cf 100644 --- a/src/main/java/wile/engineersdecor/ModEngineersDecor.java +++ b/src/main/java/wile/engineersdecor/ModEngineersDecor.java @@ -102,7 +102,7 @@ public class ModEngineersDecor @Override @SideOnly(Side.CLIENT) public @Nonnull ItemStack createIcon() - { return new ItemStack(ModBlocks.CLINKER_BRICK_WALL); } + { return new ItemStack(ModBlocks.TREATED_WOOD_LADDER); } }); } diff --git a/src/main/resources/assets/engineersdecor/lang/en_us.lang b/src/main/resources/assets/engineersdecor/lang/en_us.lang index 81466ef..5fbd2b4 100644 --- a/src/main/resources/assets/engineersdecor/lang/en_us.lang +++ b/src/main/resources/assets/engineersdecor/lang/en_us.lang @@ -31,9 +31,9 @@ tile.engineersdecor.treated_wood_ladder.help=§6Weather-proof wooden ladder. # Stairs and roofs #----------------------------------------------------------------------------------------------------------- tile.engineersdecor.clinker_brick_stairs.name=Clinker brick stairs -tile.engineersdecor.clinker_brick_stairs.help=§6§rLooks slightly darker and more color intensive than the vanilla brick block. +tile.engineersdecor.clinker_brick_stairs.help=§6Looks slightly darker and more color intensive than the vanilla brick block. tile.engineersdecor.slag_brick_stairs.name=Clinker brick stairs -tile.engineersdecor.slag_brick_stairs.help=§6§rLooks slightly darker and more color intensive than the vanilla brick block. +tile.engineersdecor.slag_brick_stairs.help=§6Looks slightly darker and more color intensive than the vanilla brick block. tile.engineersdecor.iron_sheet_roof.name=Iron sheet metal roof tile.engineersdecor.iron_sheet_roof.help=§6Well, it's a roof. @@ -45,5 +45,11 @@ tile.engineersdecor.treated_wood_pole.help=§6Straight pole fragment with the di Can be useful as alternative to the wire posts if special special lengths are needed, \ or as support for structures. +#----------------------------------------------------------------------------------------------------------- +# Furniture +#----------------------------------------------------------------------------------------------------------- +tile.engineersdecor.treated_wood_table.name=Treated wood table +tile.engineersdecor.treated_wood_table.help=§6Robust four-legged wood table. + # EOF #----------------------------------------------------------------------------------------------------------- From 7740557c1b9abf8276f91b669cc5eff63626f19b Mon Sep 17 00:00:00 2001 From: stfwi Date: Sun, 10 Feb 2019 17:55:46 +0100 Subject: [PATCH 05/14] Update.json synchronised. --- meta/update.json | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 meta/update.json diff --git a/meta/update.json b/meta/update.json new file mode 100644 index 0000000..1f060ab --- /dev/null +++ b/meta/update.json @@ -0,0 +1,10 @@ +{ + "homepage": "https://www.curseforge.com/minecraft/mc-mods/redstone-gauges-and-switches/", + "1.12.2": { + "1.0.0-b1": "[A] Initial structure.\n[A] Added clinker bricks and clinker brick stairs.\n[A] Added slag bricks and slag brick stairs.\n[A] Added metal rung ladder.\n[A] Added staggered metal steps ladder.\n[A] Added treated wood ladder.\n[A] Added treated wood pole.\n[A] Added treated wood table." + }, + "promos": { + "1.12.2-recommended": "", + "1.12.2-latest": "1.0.0-b1" + } +} \ No newline at end of file From 70dda8ead273ee9eac9de02cf686da2d196605b5 Mon Sep 17 00:00:00 2001 From: stfwi Date: Mon, 11 Feb 2019 19:25:48 +0100 Subject: [PATCH 06/14] Made mod ladders being explicitly derived from BlockLadder (thanks to Nihiltres). --- Makefile | 11 +++ .../blocks/BlockDecorLadder.java | 76 ++++++------------- .../blocks/BlockDecorStairs.java | 2 - 3 files changed, 35 insertions(+), 54 deletions(-) diff --git a/Makefile b/Makefile index 4d60e9f..0393610 100644 --- a/Makefile +++ b/Makefile @@ -96,3 +96,14 @@ dist: sanatize dist-check clean-all mod @mkdir -p dist @cp build/libs/$(MOD_JAR_PREFIX)* dist/ @djs scripts/task-dist.js + +# For reviewers: I am using a local repository for experimental changes, +# this target copies the local working tree to the location of the +# repository that you cloned. +sync-main-repo: sanatize + @echo "Synchronising to github repository working tree ..." + @cd ../engineersdecor-github; rm -rf build documentation gradle meta scripts src + @cd ../engineersdecor-github; rm -f .gitignore build.gradle gradle.properties gradlew gradlew.bat license Makefile readme.md + @cp -r documentation gradle meta scripts src ../engineersdecor-github/ + @cp .gitignore build.gradle gradle.properties gradlew gradlew.bat license Makefile readme.md ../engineersdecor-github/ + @cd ../engineersdecor-github; git status -s diff --git a/src/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java b/src/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java index a52e781..2f0b68a 100644 --- a/src/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java +++ b/src/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java @@ -12,13 +12,17 @@ */ package wile.engineersdecor.blocks; +import net.minecraft.block.BlockLadder; import net.minecraft.block.SoundType; +import net.minecraft.block.material.EnumPushReaction; +import net.minecraft.client.util.ITooltipFlag; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import wile.engineersdecor.ModEngineersDecor; import wile.engineersdecor.detail.ModAuxiliaries; -import net.minecraft.block.BlockHorizontal; -import net.minecraft.block.properties.PropertyDirection; import net.minecraft.block.material.Material; import net.minecraft.block.state.BlockFaceShape; -import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; @@ -26,15 +30,13 @@ import net.minecraft.entity.EntityLivingBase; import net.minecraft.util.*; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.List; -public class BlockDecorLadder extends BlockDecor +public class BlockDecorLadder extends BlockLadder { - public static final PropertyDirection FACING = BlockHorizontal.FACING; protected static final AxisAlignedBB EDLADDER_SOUTH_AABB = ModAuxiliaries.getPixeledAABB(3, 0, 0, 13, 16, 2); protected static final AxisAlignedBB EDLADDER_EAST_AABB = ModAuxiliaries.getRotatedAABB(EDLADDER_SOUTH_AABB, EnumFacing.EAST); protected static final AxisAlignedBB EDLADDER_WEST_AABB = ModAuxiliaries.getRotatedAABB(EDLADDER_SOUTH_AABB, EnumFacing.WEST); @@ -43,37 +45,21 @@ public class BlockDecorLadder extends BlockDecor public BlockDecorLadder(@Nonnull String registryName, long config, @Nullable Material material, float hardness, float resistance, @Nullable SoundType sound) { - super(registryName, config, material, hardness, resistance, sound); + super(); + setCreativeTab(ModEngineersDecor.CREATIVE_TAB_ENGINEERSDECOR); + setRegistryName(ModEngineersDecor.MODID, registryName); + setTranslationKey(ModEngineersDecor.MODID + "." + registryName); + setTickRandomly(false); + setHardness((hardness > 0) ? hardness : 5.0f); + setResistance((resistance > 0) ? resistance : 10.0f); + setSoundType((sound==null) ? SoundType.STONE : sound); setLightOpacity(0); - setResistance(2.0f); - setHardness(0.3f); } @Override @SideOnly(Side.CLIENT) - public BlockRenderLayer getRenderLayer() - { return BlockRenderLayer.CUTOUT; } - - @Override - public boolean isOpaqueCube(IBlockState state) - { return false; } - - @Override - public boolean isFullCube(IBlockState state) - { return false; } - - @Override - public boolean isNormalCube(IBlockState state) - { return false; } - - @Override - public boolean isLadder(IBlockState state, IBlockAccess world, BlockPos pos, EntityLivingBase entity) - { return true; } - - @Override - @SuppressWarnings("deprecation") - public BlockFaceShape getBlockFaceShape(IBlockAccess world, IBlockState state, BlockPos pos, EnumFacing face) - { return BlockFaceShape.UNDEFINED; } + public void addInformation(ItemStack stack, @Nullable World world, List tooltip, ITooltipFlag flag) + { ModAuxiliaries.Tooltip.addInformation(stack, world, tooltip, flag, true); } @Override @SuppressWarnings("deprecation") @@ -88,27 +74,13 @@ public class BlockDecorLadder extends BlockDecor } @Override - public IBlockState getStateFromMeta(int meta) - { - final EnumFacing facing = EnumFacing.byIndex(meta & 0x7); - return this.getDefaultState().withProperty(FACING, (facing.getAxis()==EnumFacing.Axis.Y) ? EnumFacing.NORTH : facing); - } + public boolean canSpawnInBlock() + { return false; } @Override - public int getMetaFromState(IBlockState state) - { return state.getValue(FACING).getIndex(); } - - @Override - protected BlockStateContainer createBlockState() - { return new BlockStateContainer(this, FACING); } - - @Override - public IBlockState withRotation(IBlockState state, Rotation rot) - { return state.withProperty(FACING, rot.rotate((EnumFacing)state.getValue(FACING))); } - - @Override - public IBlockState withMirror(IBlockState state, Mirror mirrorIn) - { return state.withRotation(mirrorIn.toRotation((EnumFacing)state.getValue(FACING))); } + @SuppressWarnings("deprecation") + public EnumPushReaction getPushReaction(IBlockState state) + { return EnumPushReaction.NORMAL; } @Override public boolean canPlaceBlockOnSide(World world, BlockPos pos, EnumFacing side) diff --git a/src/main/java/wile/engineersdecor/blocks/BlockDecorStairs.java b/src/main/java/wile/engineersdecor/blocks/BlockDecorStairs.java index 6201aaa..af107b4 100644 --- a/src/main/java/wile/engineersdecor/blocks/BlockDecorStairs.java +++ b/src/main/java/wile/engineersdecor/blocks/BlockDecorStairs.java @@ -8,11 +8,9 @@ */ package wile.engineersdecor.blocks; -import net.minecraft.block.SoundType; import net.minecraft.block.state.IBlockState; import wile.engineersdecor.ModEngineersDecor; import javax.annotation.Nonnull; -import javax.annotation.Nullable; public class BlockDecorStairs extends net.minecraft.block.BlockStairs From 6d293bde25f327133e3331e96663cee4aa7a1746 Mon Sep 17 00:00:00 2001 From: stfwi Date: Tue, 12 Feb 2019 20:24:45 +0100 Subject: [PATCH 07/14] Block construction time AABB config added for horizontal blocks. Added placement config for player horizontal lookvec reference. Added credits.md. --- .../engineersdecor/blocks/BlockDecor.java | 7 ++--- .../blocks/BlockDecorDirected.java | 26 +++++++++++------- .../blocks/BlockDecorLadder.java | 6 ++--- .../wile/engineersdecor/blocks/ModBlocks.java | 23 ++++++++++------ .../engineersdecor/detail/ModAuxiliaries.java | 27 +++++++++++++------ .../assets/engineersdecor/lang/en_us.lang | 2 +- src/main/resources/mcmod.info | 2 +- 7 files changed, 60 insertions(+), 33 deletions(-) diff --git a/src/main/java/wile/engineersdecor/blocks/BlockDecor.java b/src/main/java/wile/engineersdecor/blocks/BlockDecor.java index b764f4b..8b24e00 100644 --- a/src/main/java/wile/engineersdecor/blocks/BlockDecor.java +++ b/src/main/java/wile/engineersdecor/blocks/BlockDecor.java @@ -38,9 +38,10 @@ import java.util.List; public class BlockDecor extends Block { - public final long config; - public static final long CFG_CUTOUT = 0x0000000000000001L; - + public final long config; // the config combines some aspects of blocks, allowing to define different behaviour at construction time, without excessive polymorphy. + public static final long CFG_CUTOUT = 0x0000000000000001L; // cutout rendering + public static final long CFG_HORIZIONTAL = 0x0000000000000002L; // horizontal block, affects bounding box calculation at construction time + public static final long CFG_HORIZIONTAL_PLACEMENT = 0x0000000000000004L; // placed in the horizontzal direction the player is looking when placing. public BlockDecor(@Nonnull String registryName, long config, @Nullable Material material, float hardness, float resistance, @Nullable SoundType sound) { diff --git a/src/main/java/wile/engineersdecor/blocks/BlockDecorDirected.java b/src/main/java/wile/engineersdecor/blocks/BlockDecorDirected.java index 5e9529a..0a0d798 100644 --- a/src/main/java/wile/engineersdecor/blocks/BlockDecorDirected.java +++ b/src/main/java/wile/engineersdecor/blocks/BlockDecorDirected.java @@ -41,15 +41,15 @@ public class BlockDecorDirected extends BlockDecor public BlockDecorDirected(@Nonnull String registryName, long config, @Nullable Material material, float hardness, float resistance, @Nullable SoundType sound, @Nonnull AxisAlignedBB unrotatedAABB) { super(registryName, config, material, hardness, resistance, sound); + final boolean is_horizontal = ((config & CFG_HORIZIONTAL)!=0); AABBs = new ArrayList(Arrays.asList( - ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.DOWN), - ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.UP), - ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.NORTH), - ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.SOUTH), - ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.WEST), - ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.EAST), - ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.EAST), - ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.EAST) + ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.DOWN, is_horizontal), + ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.UP, is_horizontal), + ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.NORTH, is_horizontal), + ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.SOUTH, is_horizontal), + ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.WEST, is_horizontal), + ModAuxiliaries.getRotatedAABB(unrotatedAABB, EnumFacing.EAST, is_horizontal), + unrotatedAABB, unrotatedAABB // Array fill to ensure that the array size covers 4 bit (meta & 0x07). )); } @@ -108,5 +108,13 @@ public class BlockDecorDirected extends BlockDecor @Override @SuppressWarnings("deprecation") public IBlockState getStateForPlacement(World world, BlockPos pos, EnumFacing facing, float hitX, float hitY, float hitZ, int meta, EntityLivingBase placer) - { return this.getDefaultState().withProperty(FACING, facing); } + { + if((config & CFG_HORIZIONTAL_PLACEMENT)!=0) { + // placement in direction the player is facing + return getDefaultState().withProperty(FACING, placer.getHorizontalFacing()); + } else { + // default: placement on the face the player clicking + return getDefaultState().withProperty(FACING, facing); + } + } } diff --git a/src/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java b/src/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java index 2f0b68a..a9a456f 100644 --- a/src/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java +++ b/src/main/java/wile/engineersdecor/blocks/BlockDecorLadder.java @@ -38,9 +38,9 @@ import java.util.List; public class BlockDecorLadder extends BlockLadder { protected static final AxisAlignedBB EDLADDER_SOUTH_AABB = ModAuxiliaries.getPixeledAABB(3, 0, 0, 13, 16, 2); - protected static final AxisAlignedBB EDLADDER_EAST_AABB = ModAuxiliaries.getRotatedAABB(EDLADDER_SOUTH_AABB, EnumFacing.EAST); - protected static final AxisAlignedBB EDLADDER_WEST_AABB = ModAuxiliaries.getRotatedAABB(EDLADDER_SOUTH_AABB, EnumFacing.WEST); - protected static final AxisAlignedBB EDLADDER_NORTH_AABB = ModAuxiliaries.getRotatedAABB(EDLADDER_SOUTH_AABB, EnumFacing.NORTH); + protected static final AxisAlignedBB EDLADDER_EAST_AABB = ModAuxiliaries.getRotatedAABB(EDLADDER_SOUTH_AABB, EnumFacing.EAST, false); + protected static final AxisAlignedBB EDLADDER_WEST_AABB = ModAuxiliaries.getRotatedAABB(EDLADDER_SOUTH_AABB, EnumFacing.WEST, false); + protected static final AxisAlignedBB EDLADDER_NORTH_AABB = ModAuxiliaries.getRotatedAABB(EDLADDER_SOUTH_AABB, EnumFacing.NORTH, false); public BlockDecorLadder(@Nonnull String registryName, long config, @Nullable Material material, float hardness, float resistance, @Nullable SoundType sound) diff --git a/src/main/java/wile/engineersdecor/blocks/ModBlocks.java b/src/main/java/wile/engineersdecor/blocks/ModBlocks.java index 2c81dda..1f6bb5c 100644 --- a/src/main/java/wile/engineersdecor/blocks/ModBlocks.java +++ b/src/main/java/wile/engineersdecor/blocks/ModBlocks.java @@ -34,22 +34,29 @@ import javax.annotation.Nonnull; @SuppressWarnings("unused") public class ModBlocks { - // Full blocks public static final BlockDecorFull CLINKER_BRICK_WALL = new BlockDecorFull("clinker_brick_block", 0, Material.ROCK, 1.5f, 20f, SoundType.STONE); public static final BlockDecorFull SLAG_BRICK_WALL = new BlockDecorFull("slag_brick_block", 0, Material.ROCK, 1.8f, 25f, SoundType.STONE); public static final BlockDecorFull IRON_SHEET_ROOF_FULLBLOCK = new BlockDecorFull("iron_sheet_roof_block", 0, Material.IRON, 1.8f, 25f, SoundType.METAL); - // Ladders + public static final BlockDecorLadder METAL_RUNG_LADDER = new BlockDecorLadder("metal_rung_ladder", 0, Material.IRON, 1.8f, 25f, SoundType.METAL); public static final BlockDecorLadder METAL_RUNG_STEPS = new BlockDecorLadder("metal_rung_steps", 0, Material.IRON, 1.8f, 25f, SoundType.METAL); public static final BlockDecorLadder TREATED_WOOD_LADDER = new BlockDecorLadder("treated_wood_ladder", 0, Material.WOOD, 1.0f, 15f, SoundType.WOOD); - // Stairs or stairs-like + public static final BlockDecorStairs CLINKER_BRICK_STAIRS = new BlockDecorStairs("clinker_brick_stairs", CLINKER_BRICK_WALL.getDefaultState()); public static final BlockDecorStairs SLAG_BRICK_STAIRS = new BlockDecorStairs("slag_brick_stairs", SLAG_BRICK_WALL.getDefaultState()); public static final BlockDecorStairs IRON_SHEET_ROOF = new BlockDecorStairs("iron_sheet_roof", IRON_SHEET_ROOF_FULLBLOCK.getDefaultState()); - // Oblongs and poles - public static final BlockDecorDirected TREATED_WOOD_POLE = new BlockDecorDirected("treated_wood_pole", 0, Material.WOOD, 1.0f, 15f, SoundType.WOOD, ModAuxiliaries.getPixeledAABB(5.8,5.8,0, 10.2,10.2,16)); - // Furniture - public static final BlockDecor TREATED_WOOD_TABLE = new BlockDecor("treated_wood_table", BlockDecor.CFG_CUTOUT, Material.WOOD, 1.0f, 15f, SoundType.WOOD); + + public static final BlockDecorDirected TREATED_WOOD_POLE = new BlockDecorDirected( + "treated_wood_pole", + BlockDecor.CFG_CUTOUT, + Material.WOOD, 1.0f, 15f, SoundType.WOOD, + ModAuxiliaries.getPixeledAABB(5.8,5.8,0, 10.2,10.2,16) + ); + public static final BlockDecor TREATED_WOOD_TABLE = new BlockDecor( + "treated_wood_table", + BlockDecor.CFG_CUTOUT, + Material.WOOD, 1.0f, 15f, SoundType.WOOD + ); private static final Block modBlocks[] = { SLAG_BRICK_WALL, @@ -60,7 +67,7 @@ public class ModBlocks CLINKER_BRICK_STAIRS, SLAG_BRICK_STAIRS, TREATED_WOOD_POLE, - TREATED_WOOD_TABLE + TREATED_WOOD_TABLE, }; private static final Block devBlocks[] = { diff --git a/src/main/java/wile/engineersdecor/detail/ModAuxiliaries.java b/src/main/java/wile/engineersdecor/detail/ModAuxiliaries.java index 905108c..3bea0b2 100644 --- a/src/main/java/wile/engineersdecor/detail/ModAuxiliaries.java +++ b/src/main/java/wile/engineersdecor/detail/ModAuxiliaries.java @@ -121,15 +121,26 @@ public class ModAuxiliaries public static final AxisAlignedBB getPixeledAABB(double x0, double y0, double z0, double x1, double y1, double z1) { return new AxisAlignedBB(x0/16.0, y0/16.0, z0/16.0, x1/16.0, y1/16.0, z1/16.0); } - public static final AxisAlignedBB getRotatedAABB(AxisAlignedBB bb, EnumFacing new_facing) + public static final AxisAlignedBB getRotatedAABB(AxisAlignedBB bb, EnumFacing new_facing, boolean horizontal_rotation) { - switch(new_facing.getIndex()) { - case 0: return new AxisAlignedBB(1-bb.maxX, 1-bb.maxZ, 1-bb.maxY, 1-bb.minX, 1-bb.minZ, 1-bb.minY); // D - case 1: return new AxisAlignedBB(1-bb.maxX, bb.minZ, bb.minY, 1-bb.minX, bb.maxZ, bb.maxY); // U - case 2: return new AxisAlignedBB(1-bb.maxX, bb.minY, 1-bb.maxZ, 1-bb.minX, bb.maxY, 1-bb.minZ); // N - case 3: return new AxisAlignedBB( bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); // S --> bb - case 4: return new AxisAlignedBB(1-bb.maxZ, bb.minY, bb.minX, 1-bb.minZ, bb.maxY, bb.maxX); // W - case 5: return new AxisAlignedBB( bb.minZ, bb.minY, 1-bb.maxX, bb.maxZ, bb.maxY, 1-bb.minX); // E + if(!horizontal_rotation) { + switch(new_facing.getIndex()) { + case 0: return new AxisAlignedBB(1-bb.maxX, 1-bb.maxZ, 1-bb.maxY, 1-bb.minX, 1-bb.minZ, 1-bb.minY); // D + case 1: return new AxisAlignedBB(1-bb.maxX, bb.minZ, bb.minY, 1-bb.minX, bb.maxZ, bb.maxY); // U + case 2: return new AxisAlignedBB(1-bb.maxX, bb.minY, 1-bb.maxZ, 1-bb.minX, bb.maxY, 1-bb.minZ); // N + case 3: return new AxisAlignedBB( bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); // S --> bb + case 4: return new AxisAlignedBB(1-bb.maxZ, bb.minY, bb.minX, 1-bb.minZ, bb.maxY, bb.maxX); // W + case 5: return new AxisAlignedBB( bb.minZ, bb.minY, 1-bb.maxX, bb.maxZ, bb.maxY, 1-bb.minX); // E + } + } else { + switch(new_facing.getIndex()) { + case 0: return new AxisAlignedBB( bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); // D --> bb + case 1: return new AxisAlignedBB( bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); // U --> bb + case 2: return new AxisAlignedBB( bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); // N --> bb + case 3: return new AxisAlignedBB(1-bb.maxX, bb.minY, 1-bb.maxZ, 1-bb.minX, bb.maxY, 1-bb.minZ); // S + case 4: return new AxisAlignedBB( bb.minZ, bb.minY, 1-bb.maxX, bb.maxZ, bb.maxY, 1-bb.minX); // W + case 5: return new AxisAlignedBB(1-bb.maxZ, bb.minY, bb.minX, 1-bb.minZ, bb.maxY, bb.maxX); // E + } } return bb; } diff --git a/src/main/resources/assets/engineersdecor/lang/en_us.lang b/src/main/resources/assets/engineersdecor/lang/en_us.lang index 5fbd2b4..0856da8 100644 --- a/src/main/resources/assets/engineersdecor/lang/en_us.lang +++ b/src/main/resources/assets/engineersdecor/lang/en_us.lang @@ -38,7 +38,7 @@ tile.engineersdecor.iron_sheet_roof.name=Iron sheet metal roof tile.engineersdecor.iron_sheet_roof.help=§6Well, it's a roof. #----------------------------------------------------------------------------------------------------------- -# Poles +# Poles and supports #----------------------------------------------------------------------------------------------------------- tile.engineersdecor.treated_wood_pole.name=Straight treated wood pole tile.engineersdecor.treated_wood_pole.help=§6Straight pole fragment with the diameter of a wire relay.§r\n\ diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index 570f937..d3a4be4 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -7,7 +7,7 @@ "mcversion": "${mcversion}", "url": "https://github.com/stfwi/engineers-decor/", "authorList": ["wile"], - "credits": "The Forge smiths, the Modders of the World.", + "credits": "BluSunrize, malte0811, et al., the Forge Smiths, the Modders of the World.", "logoFile": "assets/engineersdecor/logo.png", "screenshots": [], "useDependencyInformation": false, From d64890228a15b2cf61b1a3266f9346db790f1e22 Mon Sep 17 00:00:00 2001 From: stfwi Date: Tue, 12 Feb 2019 22:35:21 +0100 Subject: [PATCH 08/14] Added rebar concrete. --- gradle.properties | 2 +- meta/update.json | 3 +- readme.md | 3 ++ .../wile/engineersdecor/blocks/ModBlocks.java | 6 ++-- .../blockstates/clinker_brick_block.json | 2 +- .../blockstates/rebar_concrete.json | 20 ++++++++++++ .../assets/engineersdecor/lang/en_us.lang | 4 ++- .../models/block/clinker_brick_model.json | 1 - .../engineersdecor/recipes/_constants.json | 8 ++++- .../recipes/rebar_concrete_recipe.json | 29 ++++++++++++++++++ .../concrete/rebar_concrete_texture0.png | Bin 0 -> 608 bytes .../concrete/rebar_concrete_texture1.png | Bin 0 -> 615 bytes .../concrete/rebar_concrete_texture2.png | Bin 0 -> 641 bytes .../concrete/rebar_concrete_texture3.png | Bin 0 -> 620 bytes .../concrete/rebar_concrete_texture4.png | Bin 0 -> 614 bytes .../concrete/rebar_concrete_texture5.png | Bin 0 -> 619 bytes .../concrete/rebar_concrete_texture6.png | Bin 0 -> 613 bytes .../concrete/rebar_concrete_texture7.png | Bin 0 -> 615 bytes 18 files changed, 70 insertions(+), 8 deletions(-) create mode 100644 src/main/resources/assets/engineersdecor/blockstates/rebar_concrete.json delete mode 100644 src/main/resources/assets/engineersdecor/models/block/clinker_brick_model.json create mode 100644 src/main/resources/assets/engineersdecor/recipes/rebar_concrete_recipe.json create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture0.png create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture1.png create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture2.png create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture3.png create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture4.png create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture5.png create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture6.png create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture7.png diff --git a/gradle.properties b/gradle.properties index ce61bf7..552907b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.daemon=false org.gradle.jvmargs=-Xmx8G version_minecraft=1.12.2 version_forge=14.23.5.2768 -version_engineersdecor=1.0.0-b1 +version_engineersdecor=1.0.0-b2 # # jar signing data loaded from signing.properties in the project root. # diff --git a/meta/update.json b/meta/update.json index 1f060ab..5f0dc95 100644 --- a/meta/update.json +++ b/meta/update.json @@ -1,7 +1,8 @@ { "homepage": "https://www.curseforge.com/minecraft/mc-mods/redstone-gauges-and-switches/", "1.12.2": { - "1.0.0-b1": "[A] Initial structure.\n[A] Added clinker bricks and clinker brick stairs.\n[A] Added slag bricks and slag brick stairs.\n[A] Added metal rung ladder.\n[A] Added staggered metal steps ladder.\n[A] Added treated wood ladder.\n[A] Added treated wood pole.\n[A] Added treated wood table." + "1.0.0-b1": "[A] Initial structure.\n[A] Added clinker bricks and clinker brick stairs.\n[A] Added slag bricks and slag brick stairs.\n[A] Added metal rung ladder.\n[A] Added staggered metal steps ladder.\n[A] Added treated wood ladder.\n[A] Added treated wood pole.\n[A] Added treated wood table.", + "1.0.0-b2": "[A] Added rebar concrete (steel reinforced, expensive, creeper-proof)." }, "promos": { "1.12.2-recommended": "", diff --git a/readme.md b/readme.md index 5096bf6..97b53d0 100644 --- a/readme.md +++ b/readme.md @@ -74,6 +74,9 @@ More to come slowly but steadily. [A] Added treated wood pole. [A] Added treated wood table. + - v1.0.0-b2 [A] Added rebar concrete (steel reinforced, expensive, creeper-proof). + + ### Community references Mods covering similar features, or may fit well together with IE and the decorations of this mod: diff --git a/src/main/java/wile/engineersdecor/blocks/ModBlocks.java b/src/main/java/wile/engineersdecor/blocks/ModBlocks.java index 1f6bb5c..4e32f34 100644 --- a/src/main/java/wile/engineersdecor/blocks/ModBlocks.java +++ b/src/main/java/wile/engineersdecor/blocks/ModBlocks.java @@ -34,9 +34,10 @@ import javax.annotation.Nonnull; @SuppressWarnings("unused") public class ModBlocks { - public static final BlockDecorFull CLINKER_BRICK_WALL = new BlockDecorFull("clinker_brick_block", 0, Material.ROCK, 1.5f, 20f, SoundType.STONE); - public static final BlockDecorFull SLAG_BRICK_WALL = new BlockDecorFull("slag_brick_block", 0, Material.ROCK, 1.8f, 25f, SoundType.STONE); + public static final BlockDecorFull CLINKER_BRICK_WALL = new BlockDecorFull("clinker_brick_block", 0, Material.ROCK, 2f, 50f, SoundType.STONE); + public static final BlockDecorFull SLAG_BRICK_WALL = new BlockDecorFull("slag_brick_block", 0, Material.ROCK, 2f, 50f, SoundType.STONE); public static final BlockDecorFull IRON_SHEET_ROOF_FULLBLOCK = new BlockDecorFull("iron_sheet_roof_block", 0, Material.IRON, 1.8f, 25f, SoundType.METAL); + public static final BlockDecorFull REBAR_CONCRETE = new BlockDecorFull("rebar_concrete", 0, Material.ROCK, 8f, 2000f, SoundType.STONE); public static final BlockDecorLadder METAL_RUNG_LADDER = new BlockDecorLadder("metal_rung_ladder", 0, Material.IRON, 1.8f, 25f, SoundType.METAL); public static final BlockDecorLadder METAL_RUNG_STEPS = new BlockDecorLadder("metal_rung_steps", 0, Material.IRON, 1.8f, 25f, SoundType.METAL); @@ -68,6 +69,7 @@ public class ModBlocks SLAG_BRICK_STAIRS, TREATED_WOOD_POLE, TREATED_WOOD_TABLE, + REBAR_CONCRETE, }; private static final Block devBlocks[] = { diff --git a/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_block.json b/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_block.json index bf91a4e..04aa8d2 100644 --- a/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_block.json +++ b/src/main/resources/assets/engineersdecor/blockstates/clinker_brick_block.json @@ -1,7 +1,7 @@ { "forge_marker": 1, "defaults": { - "model": "engineersdecor:clinker_brick_model", + "model": "engineersdecor:decor_full_block_model", "textures": { "all": "engineersdecor:blocks/clinker_brick/clinker_brick_texture0" } }, "variants": { diff --git a/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete.json b/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete.json new file mode 100644 index 0000000..cbeaeeb --- /dev/null +++ b/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete.json @@ -0,0 +1,20 @@ +{ + "forge_marker": 1, + "defaults": { + "model": "engineersdecor:decor_full_block_model", + "textures": { "all": "engineersdecor:blocks/concrete/rebar_concrete_texture0" } + }, + "variants": { + "normal": [ + { "textures": { "all": "engineersdecor:blocks/concrete/rebar_concrete_texture0" } }, + { "textures": { "all": "engineersdecor:blocks/concrete/rebar_concrete_texture1" } }, + { "textures": { "all": "engineersdecor:blocks/concrete/rebar_concrete_texture2" } }, + { "textures": { "all": "engineersdecor:blocks/concrete/rebar_concrete_texture3" } }, + { "textures": { "all": "engineersdecor:blocks/concrete/rebar_concrete_texture4" } }, + { "textures": { "all": "engineersdecor:blocks/concrete/rebar_concrete_texture5" } }, + { "textures": { "all": "engineersdecor:blocks/concrete/rebar_concrete_texture6" } }, + { "textures": { "all": "engineersdecor:blocks/concrete/rebar_concrete_texture7" } } + ], + "inventory": [{}] + } +} diff --git a/src/main/resources/assets/engineersdecor/lang/en_us.lang b/src/main/resources/assets/engineersdecor/lang/en_us.lang index 0856da8..f45193a 100644 --- a/src/main/resources/assets/engineersdecor/lang/en_us.lang +++ b/src/main/resources/assets/engineersdecor/lang/en_us.lang @@ -10,12 +10,14 @@ engineersdecor.tooltip.hint.extended=§6[§9SHIFT§r More info§6]§r engineersdecor.tooltip.hint.help=§6[§9CTRL-SHIFT§r Help§6]§r #----------------------------------------------------------------------------------------------------------- -# Wall blocks +# Stone/"ceramic material" based blocks #----------------------------------------------------------------------------------------------------------- tile.engineersdecor.clinker_brick_block.name=Clinker brick tile.engineersdecor.clinker_brick_block.help=§6A brick wall block with position dependent texture variations.§r\nLooks slightly darker and more color intensive than the vanilla brick block. tile.engineersdecor.slag_brick_block.name=Slag brick tile.engineersdecor.slag_brick_block.help=§6A gray-brown brick wall block with position dependent texture variations. +tile.engineersdecor.rebar_concrete.name=Rebar concrete +tile.engineersdecor.rebar_concrete.help=§6Steel reinforced concrete block.§r Expensive but Creeper-proof like obsidian. #----------------------------------------------------------------------------------------------------------- # Ladder blocks diff --git a/src/main/resources/assets/engineersdecor/models/block/clinker_brick_model.json b/src/main/resources/assets/engineersdecor/models/block/clinker_brick_model.json deleted file mode 100644 index f7aee27..0000000 --- a/src/main/resources/assets/engineersdecor/models/block/clinker_brick_model.json +++ /dev/null @@ -1 +0,0 @@ -{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:blocks/clinker_brick/clinker_brick_texture0" } } \ No newline at end of file diff --git a/src/main/resources/assets/engineersdecor/recipes/_constants.json b/src/main/resources/assets/engineersdecor/recipes/_constants.json index d47adc8..fb9df22 100644 --- a/src/main/resources/assets/engineersdecor/recipes/_constants.json +++ b/src/main/resources/assets/engineersdecor/recipes/_constants.json @@ -114,7 +114,6 @@ ], "name": "ingotAnyBrick" }, - { "ingredient": [ { @@ -127,6 +126,13 @@ } ], "name": "stickFerroMetal" + }, + { + "ingredient": { + "item": "immersiveengineering:stone_decoration", + "data": 5 + }, + "name": "blockConcreteIe" } ] \ No newline at end of file diff --git a/src/main/resources/assets/engineersdecor/recipes/rebar_concrete_recipe.json b/src/main/resources/assets/engineersdecor/recipes/rebar_concrete_recipe.json new file mode 100644 index 0000000..f3cf998 --- /dev/null +++ b/src/main/resources/assets/engineersdecor/recipes/rebar_concrete_recipe.json @@ -0,0 +1,29 @@ +{ + "conditions": [ + { + "type": "engineersdecor:grc", + "result": "engineersdecor:rebar_concrete", + "required": ["immersiveengineering:stone_decoration"] + } + ], + "type": "minecraft:crafting_shaped", + "pattern": [ + "SCS", + "CSC", + "SCS" + ], + "key": { + "C": { + "item": "#blockConcreteIe", + "data": 0 + }, + "S": { + "item": "#stickSteel", + "data": 0 + } + }, + "result": { + "item": "engineersdecor:rebar_concrete", + "count": 4 + } +} diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture0.png b/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture0.png new file mode 100644 index 0000000000000000000000000000000000000000..1b9127e683a41f031dddaaadd338c5e80eaf7ad3 GIT binary patch literal 608 zcmV-m0-ybfP)L_t(I%Po^R5*$ek1Cv+vjHLg` zmA(JpnXZGRjFtsDi~y2^{P*W~B2KulPb1yTy>NFLctxFY+8tgIb_!&;Uhsfe+N!0dVdl6Q5rI;OfB-^2DuSz^W=@17s+?@@ncQ<>YOFaCfy$<+`0Ipe%P zh$w2#J_lF%2TU+C0IHjF5;vy=vWggisGuT>s?lBicwdNs`?L7HCu`oA8SnQGpvZHW z_l<~9=b-9_sBqRo)IpW1V(*QpAQq?!Yj3I=(dXUwDKJN=#w^Gx=A48(dvDZ?;ZEgY z-V;~BR5@o;T?j?E;oXpX@&5Uf&g7mO5h21+k!KzkN&<#?AUquI`$of*@0#>Eh$!L4 ub-nn0Zq7*%d8%AWX0g}g^Zh_KCcm6iqV|+b>Z$5Fk541vG=Aj`1AZ?$Dx^F zE?Sjg2ImyLIciR?f#g8(T8lX*f1VQ%85=Vw2^qAkVy{IXgV$P&-Y|@a0Ex%woGPq} z*f*_rY6t6n(OW~A#Tb*(C$2_BqTl?{JB2|NXD2(0LbzbgC#{J#=j7g-h#&gsxQTTy zW^Y_;0mg}gB$_)$5tYb9&qzF$$AD=bF?&P{XYS_}1#yi;Y|`yfj) zlhB}H#=34s?-+&L0g%KTgWft3o6Pzo%W!w7KqP9dG3P|?Jf2UeqA2E=?CU}@?rSrC zL5)7x`;Y;JQ01XA7`=U-ZXzS8O1w3yK2@*lLKOGeU`AB&z7EPv%!J9PN=Ex1(!DqP zzL3P@@x)zFaPAubGLc$CF02Z9lo=U^%p$9Jj6p_lt&7Lk7kO@Ws4wf`{WW{sT}ON9(r^eFOji002ovPDHLkV1i0S B7s3Dl literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture2.png b/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture2.png new file mode 100644 index 0000000000000000000000000000000000000000..21818378598a36601024251086b9dd58efbf244e GIT binary patch literal 641 zcmV-{0)G98P)q0~^Q{L}4SG!O-*!^UTFWe1LB{R?+$?xC);pEAY&q)(5i>)(WnxVlIdXmpgq-iaT>`jv6}-_v7M- zq9oc{BVwbblv)r`4j?D_^Lin`9Gy7_9B>nMY{nQwCa$We2xd;ijI**CO@=g6Dm+=0d;cT1vr88FOJOR5#p> z(Z6sr_FAL}A_fRw?~cevYl@)}i#{f1&RidgwF5JwxO26Jau5N|!A;>L5rLdUO_lq8 zV(zqdvF0K&F}07*lf2&pIfper}sbHmm2&zWC9%LrkiqqHP>;%AAA1h_%T`M1?s9 bxi|j<6Mtb0bY_sa00000NkvXXu0mjf7w{dK literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture3.png b/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture3.png new file mode 100644 index 0000000000000000000000000000000000000000..84788f2ccf9a8d3bb5d18982bbffa0b74a0a953b GIT binary patch literal 620 zcmV-y0+aoTP)(2(Hj05S_dd2oa1gS{4&2QveVF)oUtMZ>+(Bgi~t2?4D+{(L|5G0D9c zy|YUguu`l_`urdnZiRF(b9xNi43qGPKzZ0FsVYqMldy_02H(#@ty5~4IqO|yZp@%O z2yf2HqP0MX>$)h3F8v6b4v3YB1Mbe8laq-l@i{L>4_fbl@jNeCMMUR)7v36`;vR#< z=+Vh6r~({+pD)hd7-FA;nW%H9O6Huj)+pdPhi0(O=H$WMkqXaDz%YYrcIFtEIg(g= zv)79x?&~I^F?vUtU`Dit&->>7+?=&(F?iMn#5o6V4UfTf{V+>#vgl)QPH_aW-$ljX zT?@Q1$KdQuivS5#veyPTkp7G}RU&#L%p6m3e?IKBI2eYQ^QZOm{V+ctl$#V_PHUYp zgQ_ID8^71fXpP*H|9a@ zqNn*}q9Vdt2cS?;RSd!a;f`8hs#Fel4Lt%X#5yn&JR;bcD9t*9Y53eXuEOj2L`2#9 z#!L}}V+Ge$R23@%cmGKbH?HS5W{#V)JWw0D8+RkCafa*qkUh9N)rEe4zZg-V2@{6G z1pa${czxdV47oQ`o9>N@vf{v05e7FiT!r`h#wn^Bv%n2JPWHX=^T0&dI~jzoO?7h| zCmt)fJ{P_YNLZoNfSK_)PZ;Rj+}Xh3=EMpllg^E*8pnB{YM{Z+CMz*B-mfPS&gXrx z+!#?zmF}jpP&KsjCijhqkX1k01J~!m%zqFg*gb>_BhWK=I6F69)rc5siklE&s0-at z-Kc<@f&SdRtLSdjj4;F3c|Z^Qx;P$RT-TefW*EdAvB0Fs9=ZoL2Pp<+)X>hN{U zC`=XRfeL`K@8r5S|9pL+3f0QKH=UdLyJo8RACxgumR(6JJpcdz07*qoM6N<$f^eD^ A5&!@I literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture5.png b/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture5.png new file mode 100644 index 0000000000000000000000000000000000000000..6b8b76b3fb1396596a33a8a5de490151fe09526d GIT binary patch literal 619 zcmV-x0+juUP)SvLrbS1Ct*~)jjuH zcm2KoOute|BDqG7j|fC2ApiaQPl+fQixS7oDGF6%J`e9PI0ffyDw8o@?6YZRm>Vi6 zYJ!SF1-(0&MIRUAx|nOBA~aKaAM8Ep%_$L7KzAgc-yfie2-bQK;OFxPsu;a-KM(3g zo<(bo`=0DI`SZC^Goz0SYZofcIf=IhfQlgMTw_2fAxb1%qodw26WrW60p}cibgE$O zMR#Z3H)>8*0uWjB%h>0j)=+o!D?$)8&Iu|L_eK?5uQ%?_7=uFStpnfe`s+s5vp@}1 z;r)6M2r9z84)-%rGpM4wVg{9osWW<~B2WQLVC}=46Ec8ArD%UK0w|PBCh=hosxzk#M3{-_Un~ESK0LZiP*XvDHvew4b*?WTuuj|Fx8$_rCQfAptWdGVl`xRj?1e87ki=uC+L- zxG9;5yOX)8*i;sBHCzSv<}`1tIk7&zoIq7!?jXt-Mij&glH@iJ1U(m!sOkQo zt~$^2yQ@eb7agd3n8o5DfB*fbBjFszX9cgr`FVesb5h-$?%a`71r>?;fv6zes43np zjKhdXhASZ7^n(f4ePo&jzL6HRY=3?%{T_G&>}=7 zu{VeyV#IYJqNs>)i~|*i7HF{Hm>Hm`9hfSyi$w5oQkfu%yP{@Bb+h*c0wThWgbFG) zl}YS{2&fuDQ=N=40MM$0F6Nx5G+n`AimIVLo*M2{!!RczK%MHQ0gZU#+}DR;MgbX% zmBsu0rV+Y|Ih3xAs^aE!6$)r~Ll>ZA22zQ;(G{HIag1*6U1T*~jk{7+lo)EmX#`ON z;5;YQLPT-SiQ9t{8Uf6dj9?6>bEBrl7>=4zt=v1fqj4Q(mu=bq9JLXczYm=5f*u<1i`%9VWC2 z>$;xz379#b_r+QP0PLkBHFcj49We!ZA$^7H+TnPF;({vN2X zBN#4F$#5f2kbOWDtt#9N8WceQ1a<@OiYxW&B?&b*n2}AGB;~2RGs0@P{rLH0bctc2r5vOR0eZS&OWFct`ieJwGE&N z6d%*s`{Q-EvF1cn(JY2LT}^kA*(jgs`fR09P=*_GEmW0=L{yk=y#D(ap^1}BcLKr0 z=x!^$9|#Y;?{^p3Pbp0%R5DlLFigRb@V(Jg!M0j4@Gl=DILb z+ys(F;^1SVBHXz-`!I%MX2jW4LB>aSWc=zZ{s)RWPylvupm6{I002ovPDHLkV1mY{ B1`PlJ literal 0 HcmV?d00001 From df78b23b499567208aba75803bb2d0884d33c9fd Mon Sep 17 00:00:00 2001 From: stfwi Date: Wed, 13 Feb 2019 17:22:21 +0100 Subject: [PATCH 09/14] Added credits.md file to have this bundled in the repository root. --- credits.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 credits.md diff --git a/credits.md b/credits.md new file mode 100644 index 0000000..14493f4 --- /dev/null +++ b/credits.md @@ -0,0 +1,13 @@ + +As addon for Immersive Engineering, this mod is heavily inspired +by the designs and the code base of IE, and I would like to give +special credits to the Software Engineers of Immersive Engineering +(BluSunrize, malte0811, et al). Please see: + + - https://github.com/BluSunrize/ImmersiveEngineering/ + - https://github.com/BluSunrize/ImmersiveEngineering/graphs/contributors + +Mod components derived/inspired by IE: + + - Style color scheme of treated wood/steel/concrete to match IE color scheme. + - Recipe _constants.json file (for using IE items as ingredients) From 3b2e829da2a540cbb384b4db5f02675e70be8c4f Mon Sep 17 00:00:00 2001 From: stfwi Date: Wed, 13 Feb 2019 21:09:31 +0100 Subject: [PATCH 10/14] Asset directory structure reordering. Textures for rebar concrete and table improved. --- gradle.properties | 2 +- meta/update.json | 7 +- readme.md | 7 +- .../blockstates/metal_rung_ladder.json | 2 +- .../blockstates/metal_rung_steps.json | 2 +- .../blockstates/slag_brick_block.json | 2 +- .../blockstates/treated_wood_ladder.json | 2 +- .../blockstates/treated_wood_table.json | 2 +- .../furniture/treated_wood_table_model.json | 190 ++++++++++++++++++ .../{ => ladder}/metal_rung_ladder_model.json | 0 .../{ => ladder}/metal_rung_steps_model.json | 0 .../treated_wood_ladder_model.json | 4 +- .../models/block/slag_brick_model.json | 1 - .../block/treated_wood_table_model.json | 190 ------------------ .../concrete/rebar_concrete_texture0.png | Bin 608 -> 607 bytes .../concrete/rebar_concrete_texture1.png | Bin 615 -> 623 bytes .../concrete/rebar_concrete_texture2.png | Bin 641 -> 639 bytes .../concrete/rebar_concrete_texture3.png | Bin 620 -> 618 bytes .../concrete/rebar_concrete_texture4.png | Bin 614 -> 612 bytes .../concrete/rebar_concrete_texture5.png | Bin 619 -> 619 bytes .../concrete/rebar_concrete_texture6.png | Bin 613 -> 611 bytes .../concrete/rebar_concrete_texture7.png | Bin 615 -> 615 bytes .../textures/blocks/iestyle/treated_wood.png | Bin 513 -> 535 bytes .../treated_wood_framed_nailed_texture.png | Bin 0 -> 584 bytes .../iestyle/treated_wood_framed_texture.png | Bin 0 -> 563 bytes .../iestyle/treated_wood_rough_texture.png | Bin 0 -> 565 bytes 26 files changed, 206 insertions(+), 205 deletions(-) create mode 100644 src/main/resources/assets/engineersdecor/models/block/furniture/treated_wood_table_model.json rename src/main/resources/assets/engineersdecor/models/block/{ => ladder}/metal_rung_ladder_model.json (100%) rename src/main/resources/assets/engineersdecor/models/block/{ => ladder}/metal_rung_steps_model.json (100%) rename src/main/resources/assets/engineersdecor/models/block/{ => ladder}/treated_wood_ladder_model.json (95%) delete mode 100644 src/main/resources/assets/engineersdecor/models/block/slag_brick_model.json delete mode 100644 src/main/resources/assets/engineersdecor/models/block/treated_wood_table_model.json create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_framed_nailed_texture.png create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_framed_texture.png create mode 100644 src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_rough_texture.png diff --git a/gradle.properties b/gradle.properties index 552907b..efe0ec8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.daemon=false org.gradle.jvmargs=-Xmx8G version_minecraft=1.12.2 version_forge=14.23.5.2768 -version_engineersdecor=1.0.0-b2 +version_engineersdecor=1.0.0-b3 # # jar signing data loaded from signing.properties in the project root. # diff --git a/meta/update.json b/meta/update.json index 5f0dc95..9eb12f9 100644 --- a/meta/update.json +++ b/meta/update.json @@ -1,11 +1,12 @@ { "homepage": "https://www.curseforge.com/minecraft/mc-mods/redstone-gauges-and-switches/", "1.12.2": { - "1.0.0-b1": "[A] Initial structure.\n[A] Added clinker bricks and clinker brick stairs.\n[A] Added slag bricks and slag brick stairs.\n[A] Added metal rung ladder.\n[A] Added staggered metal steps ladder.\n[A] Added treated wood ladder.\n[A] Added treated wood pole.\n[A] Added treated wood table.", - "1.0.0-b2": "[A] Added rebar concrete (steel reinforced, expensive, creeper-proof)." + "1.0.0-b3": "[A] Textures of rebar concrete and treated wood table improved.", + "1.0.0-b2": "[A] Added rebar concrete (steel reinforced, expensive, creeper-proof).", + "1.0.0-b1": "[A] Initial structure.\n[A] Added clinker bricks and clinker brick stairs.\n[A] Added slag bricks and slag brick stairs.\n[A] Added metal rung ladder.\n[A] Added staggered metal steps ladder.\n[A] Added treated wood ladder.\n[A] Added treated wood pole.\n[A] Added treated wood table." }, "promos": { "1.12.2-recommended": "", - "1.12.2-latest": "1.0.0-b1" + "1.12.2-latest": "1.0.0-b3" } } \ No newline at end of file diff --git a/readme.md b/readme.md index 97b53d0..bd394cf 100644 --- a/readme.md +++ b/readme.md @@ -65,6 +65,10 @@ More to come slowly but steadily. ---- ## Revision history + - v1.0.0-b3 [A] Textures of rebar concrete and treated wood table improved. + + - v1.0.0-b2 [A] Added rebar concrete (steel reinforced, expensive, creeper-proof). + - v1.0.0-b1 [A] Initial structure. [A] Added clinker bricks and clinker brick stairs. [A] Added slag bricks and slag brick stairs. @@ -74,9 +78,6 @@ More to come slowly but steadily. [A] Added treated wood pole. [A] Added treated wood table. - - v1.0.0-b2 [A] Added rebar concrete (steel reinforced, expensive, creeper-proof). - - ### Community references Mods covering similar features, or may fit well together with IE and the decorations of this mod: diff --git a/src/main/resources/assets/engineersdecor/blockstates/metal_rung_ladder.json b/src/main/resources/assets/engineersdecor/blockstates/metal_rung_ladder.json index 3494594..f80feba 100644 --- a/src/main/resources/assets/engineersdecor/blockstates/metal_rung_ladder.json +++ b/src/main/resources/assets/engineersdecor/blockstates/metal_rung_ladder.json @@ -1,6 +1,6 @@ { "forge_marker": 1, - "defaults": { "model": "engineersdecor:metal_rung_ladder_model" }, + "defaults": { "model": "engineersdecor:ladder/metal_rung_ladder_model" }, "variants": { "normal": [{}], "facing": { "north":{"y":0}, "south":{"y":180}, "west":{"y":270}, "east":{"y":90}, "up": {"x":0}, "down": {"x":0} }, diff --git a/src/main/resources/assets/engineersdecor/blockstates/metal_rung_steps.json b/src/main/resources/assets/engineersdecor/blockstates/metal_rung_steps.json index 47bea7f..d759868 100644 --- a/src/main/resources/assets/engineersdecor/blockstates/metal_rung_steps.json +++ b/src/main/resources/assets/engineersdecor/blockstates/metal_rung_steps.json @@ -1,6 +1,6 @@ { "forge_marker": 1, - "defaults": { "model": "engineersdecor:metal_rung_steps_model" }, + "defaults": { "model": "engineersdecor:ladder/metal_rung_steps_model" }, "variants": { "normal": [{}], "facing": { "north":{"y":0}, "south":{"y":180}, "west":{"y":270}, "east":{"y":90}, "up": {"x":0}, "down": {"x":0} }, diff --git a/src/main/resources/assets/engineersdecor/blockstates/slag_brick_block.json b/src/main/resources/assets/engineersdecor/blockstates/slag_brick_block.json index 10a9f06..23fc1ef 100644 --- a/src/main/resources/assets/engineersdecor/blockstates/slag_brick_block.json +++ b/src/main/resources/assets/engineersdecor/blockstates/slag_brick_block.json @@ -1,7 +1,7 @@ { "forge_marker": 1, "defaults": { - "model": "engineersdecor:slag_brick_model", + "model": "engineersdecor:decor_full_block_model", "textures": { "all": "engineersdecor:blocks/slag_brick/slag_brick_texture0" } }, "variants": { diff --git a/src/main/resources/assets/engineersdecor/blockstates/treated_wood_ladder.json b/src/main/resources/assets/engineersdecor/blockstates/treated_wood_ladder.json index cd223cc..ea5b906 100644 --- a/src/main/resources/assets/engineersdecor/blockstates/treated_wood_ladder.json +++ b/src/main/resources/assets/engineersdecor/blockstates/treated_wood_ladder.json @@ -1,6 +1,6 @@ { "forge_marker": 1, - "defaults": { "model": "engineersdecor:treated_wood_ladder_model" }, + "defaults": { "model": "engineersdecor:ladder/treated_wood_ladder_model" }, "variants": { "normal": [{}], "facing": { "north":{"y":0}, "south":{"y":180}, "west":{"y":270}, "east":{"y":90}, "up": {"x":0}, "down": {"x":0} }, diff --git a/src/main/resources/assets/engineersdecor/blockstates/treated_wood_table.json b/src/main/resources/assets/engineersdecor/blockstates/treated_wood_table.json index f4ac097..2279c04 100644 --- a/src/main/resources/assets/engineersdecor/blockstates/treated_wood_table.json +++ b/src/main/resources/assets/engineersdecor/blockstates/treated_wood_table.json @@ -1,6 +1,6 @@ { "forge_marker": 1, - "defaults": { "model": "engineersdecor:treated_wood_table_model" }, + "defaults": { "model": "engineersdecor:furniture/treated_wood_table_model" }, "variants": { "normal": [{}], "inventory": [{}] diff --git a/src/main/resources/assets/engineersdecor/models/block/furniture/treated_wood_table_model.json b/src/main/resources/assets/engineersdecor/models/block/furniture/treated_wood_table_model.json new file mode 100644 index 0000000..04b7880 --- /dev/null +++ b/src/main/resources/assets/engineersdecor/models/block/furniture/treated_wood_table_model.json @@ -0,0 +1,190 @@ +{ + "credit": "I made this with the Blockbench", + "parent": "block/cube", + "textures": { + "o": "engineersdecor:blocks/iestyle/treated_wood_framed_texture", + "particle": "engineersdecor:blocks/iestyle/treated_wood_framed_texture" + }, + "elements": [ + { + "from": [1, 0, 1], + "to": [3, 14, 3], + "faces": { + "north": {"uv": [13, 2, 15, 16], "texture": "#o"}, + "east": {"uv": [13, 2, 15, 16], "texture": "#o"}, + "south": {"uv": [1, 2, 3, 16], "texture": "#o"}, + "west": {"uv": [1, 2, 3, 16], "texture": "#o"}, + "up": {"uv": [1, 1, 3, 3], "texture": "#o"}, + "down": {"uv": [1, 13, 3, 15], "texture": "#o", "cullface": "down"} + } + }, + { + "from": [13, 0, 1], + "to": [15, 14, 3], + "faces": { + "north": {"uv": [1, 2, 3, 16], "texture": "#o"}, + "east": {"uv": [13, 2, 15, 16], "texture": "#o"}, + "south": {"uv": [13, 2, 15, 16], "texture": "#o"}, + "west": {"uv": [1, 2, 3, 16], "texture": "#o"}, + "up": {"uv": [13, 1, 15, 3], "texture": "#o"}, + "down": {"uv": [13, 13, 15, 15], "texture": "#o", "cullface": "down"} + } + }, + { + "from": [13, 0, 13], + "to": [15, 14, 15], + "faces": { + "north": {"uv": [1, 2, 3, 16], "texture": "#o"}, + "east": {"uv": [1, 2, 3, 16], "texture": "#o"}, + "south": {"uv": [13, 2, 15, 16], "texture": "#o"}, + "west": {"uv": [13, 2, 15, 16], "texture": "#o"}, + "up": {"uv": [13, 13, 15, 15], "texture": "#o"}, + "down": {"uv": [13, 1, 15, 3], "texture": "#o", "cullface": "down"} + } + }, + { + "from": [1, 0, 13], + "to": [3, 14, 15], + "faces": { + "north": {"uv": [13, 2, 15, 16], "texture": "#o"}, + "east": {"uv": [1, 2, 3, 16], "texture": "#o"}, + "south": {"uv": [1, 2, 3, 16], "texture": "#o"}, + "west": {"uv": [13, 2, 15, 16], "texture": "#o"}, + "up": {"uv": [1, 13, 3, 15], "texture": "#o"}, + "down": {"uv": [1, 1, 3, 3], "texture": "#o", "cullface": "down"} + } + }, + { + "from": [0, 14, 0], + "to": [16, 15.875, 16], + "faces": { + "north": {"uv": [0, 0.125, 16, 2], "texture": "#o"}, + "east": {"uv": [0, 0.125, 16, 2], "texture": "#o"}, + "south": {"uv": [0, 0.125, 16, 2], "texture": "#o"}, + "west": {"uv": [0, 0.125, 16, 2], "texture": "#o"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#o"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#o"} + } + }, + { + "from": [0.125, 15.875, 0.125], + "to": [15.875, 16, 15.875], + "faces": { + "north": {"uv": [0.25, 0, 15.75, 0.125], "texture": "#o"}, + "east": {"uv": [0.25, 0, 15.75, 0.125], "texture": "#o"}, + "south": {"uv": [0.25, 0, 15.75, 0.125], "texture": "#o"}, + "west": {"uv": [0.25, 0, 15.75, 0.125], "texture": "#o"}, + "up": {"uv": [0.25, 0.25, 15.75, 15.75], "texture": "#o"}, + "down": {"uv": [0.25, 0.25, 15.75, 15.75], "texture": "#o"} + } + }, + { + "from": [13, 13.5, 3], + "to": [15, 14, 5], + "faces": { + "north": {"uv": [1, 2, 3, 2.5], "texture": "#o"}, + "east": {"uv": [11, 2, 13, 2.5], "texture": "#o"}, + "south": {"uv": [13, 2, 15, 2.5], "texture": "#o"}, + "west": {"uv": [3, 2, 5, 2.5], "texture": "#o"}, + "up": {"uv": [13, 3, 15, 5], "texture": "#o"}, + "down": {"uv": [13, 11, 15, 13], "texture": "#o"} + } + }, + { + "from": [13, 13.5, 11], + "to": [15, 14, 13], + "faces": { + "north": {"uv": [1, 2, 3, 2.5], "texture": "#o"}, + "east": {"uv": [3, 2, 5, 2.5], "texture": "#o"}, + "south": {"uv": [13, 2, 15, 2.5], "texture": "#o"}, + "west": {"uv": [11, 2, 13, 2.5], "texture": "#o"}, + "up": {"uv": [13, 11, 15, 13], "texture": "#o"}, + "down": {"uv": [13, 3, 15, 5], "texture": "#o"} + } + }, + { + "from": [1, 13.5, 11], + "to": [3, 14, 13], + "faces": { + "north": {"uv": [13, 2, 15, 2.5], "texture": "#o"}, + "east": {"uv": [3, 2, 5, 2.5], "texture": "#o"}, + "south": {"uv": [1, 2, 3, 2.5], "texture": "#o"}, + "west": {"uv": [11, 2, 13, 2.5], "texture": "#o"}, + "up": {"uv": [1, 11, 3, 13], "texture": "#o"}, + "down": {"uv": [1, 3, 3, 5], "texture": "#o"} + } + }, + { + "from": [1, 13.5, 3], + "to": [3, 14, 5], + "faces": { + "north": {"uv": [13, 2, 15, 2.5], "texture": "#o"}, + "east": {"uv": [11, 2, 13, 2.5], "texture": "#o"}, + "south": {"uv": [1, 2, 3, 2.5], "texture": "#o"}, + "west": {"uv": [3, 2, 5, 2.5], "texture": "#o"}, + "up": {"uv": [1, 3, 3, 5], "texture": "#o"}, + "down": {"uv": [1, 11, 3, 13], "texture": "#o"} + } + }, + { + "from": [11, 13.5, 1], + "to": [13, 14, 3], + "faces": { + "north": {"uv": [3, 2, 5, 2.5], "texture": "#o"}, + "east": {"uv": [13, 2, 15, 2.5], "texture": "#o"}, + "south": {"uv": [11, 2, 13, 2.5], "texture": "#o"}, + "west": {"uv": [1, 2, 3, 2.5], "texture": "#o"}, + "up": {"uv": [11, 1, 13, 3], "texture": "#o"}, + "down": {"uv": [11, 13, 13, 15], "texture": "#o"} + } + }, + { + "from": [3, 13.5, 1], + "to": [5, 14, 3], + "faces": { + "north": {"uv": [11, 2, 13, 2.5], "texture": "#o"}, + "east": {"uv": [13, 2, 15, 2.5], "texture": "#o"}, + "south": {"uv": [3, 2, 5, 2.5], "texture": "#o"}, + "west": {"uv": [1, 2, 3, 2.5], "texture": "#o"}, + "up": {"uv": [3, 1, 5, 3], "texture": "#o"}, + "down": {"uv": [3, 13, 5, 15], "texture": "#o"} + } + }, + { + "from": [11, 13.5, 13], + "to": [13, 14, 15], + "faces": { + "north": {"uv": [3, 2, 5, 2.5], "texture": "#o"}, + "east": {"uv": [1, 2, 3, 2.5], "texture": "#o"}, + "south": {"uv": [11, 2, 13, 2.5], "texture": "#o"}, + "west": {"uv": [13, 2, 15, 2.5], "texture": "#o"}, + "up": {"uv": [11, 13, 13, 15], "texture": "#o"}, + "down": {"uv": [11, 1, 13, 3], "texture": "#o"} + } + }, + { + "from": [3, 13.5, 13], + "to": [5, 14, 15], + "faces": { + "north": {"uv": [11, 2, 13, 2.5], "texture": "#o"}, + "east": {"uv": [1, 2, 3, 2.5], "texture": "#o"}, + "south": {"uv": [3, 2, 5, 2.5], "texture": "#o"}, + "west": {"uv": [13, 2, 15, 2.5], "texture": "#o"}, + "up": {"uv": [3, 13, 5, 15], "texture": "#o"}, + "down": {"uv": [3, 1, 5, 3], "texture": "#o"} + } + } + ], + "display": { + "ground": { + "scale": [0.2, 0.2, 0.2] + }, + "gui": { + "rotation": [30, 225, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "scale": [0.5, 0.5, 0.5] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/engineersdecor/models/block/metal_rung_ladder_model.json b/src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_ladder_model.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/metal_rung_ladder_model.json rename to src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_ladder_model.json diff --git a/src/main/resources/assets/engineersdecor/models/block/metal_rung_steps_model.json b/src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_steps_model.json similarity index 100% rename from src/main/resources/assets/engineersdecor/models/block/metal_rung_steps_model.json rename to src/main/resources/assets/engineersdecor/models/block/ladder/metal_rung_steps_model.json diff --git a/src/main/resources/assets/engineersdecor/models/block/treated_wood_ladder_model.json b/src/main/resources/assets/engineersdecor/models/block/ladder/treated_wood_ladder_model.json similarity index 95% rename from src/main/resources/assets/engineersdecor/models/block/treated_wood_ladder_model.json rename to src/main/resources/assets/engineersdecor/models/block/ladder/treated_wood_ladder_model.json index b5821af..4e07b10 100644 --- a/src/main/resources/assets/engineersdecor/models/block/treated_wood_ladder_model.json +++ b/src/main/resources/assets/engineersdecor/models/block/ladder/treated_wood_ladder_model.json @@ -2,8 +2,8 @@ "credit": "I made this with the Blockbench", "parent": "block/cube", "textures": { - "o": "engineersdecor:blocks/iestyle/treated_wood", - "particle": "engineersdecor:blocks/iestyle/treated_wood" + "o": "engineersdecor:blocks/iestyle/treated_wood_rough_texture", + "particle": "engineersdecor:blocks/iestyle/treated_wood_rough_texture" }, "elements": [ { diff --git a/src/main/resources/assets/engineersdecor/models/block/slag_brick_model.json b/src/main/resources/assets/engineersdecor/models/block/slag_brick_model.json deleted file mode 100644 index 7054c6f..0000000 --- a/src/main/resources/assets/engineersdecor/models/block/slag_brick_model.json +++ /dev/null @@ -1 +0,0 @@ -{ "parent": "block/cube_all", "textures": { "all": "engineersdecor:blocks/slag_brick/slag_brick_texture0" } } \ No newline at end of file diff --git a/src/main/resources/assets/engineersdecor/models/block/treated_wood_table_model.json b/src/main/resources/assets/engineersdecor/models/block/treated_wood_table_model.json deleted file mode 100644 index 749de34..0000000 --- a/src/main/resources/assets/engineersdecor/models/block/treated_wood_table_model.json +++ /dev/null @@ -1,190 +0,0 @@ -{ - "credit": "I made this with the Blockbench", - "parent": "block/cube", - "textures": { - "o": "engineersdecor:blocks/iestyle/treated_wood", - "particle": "engineersdecor:blocks/iestyle/treated_wood" - }, - "elements": [ - { - "from": [1, 0, 1], - "to": [3, 14, 3], - "faces": { - "north": {"texture": "#o"}, - "east": {"texture": "#o"}, - "south": {"texture": "#o"}, - "west": {"texture": "#o"}, - "up": {"texture": "#o"}, - "down": {"texture": "#o", "cullface": "down"} - } - }, - { - "from": [13, 0, 1], - "to": [15, 14, 3], - "faces": { - "north": {"texture": "#o"}, - "east": {"texture": "#o"}, - "south": {"texture": "#o"}, - "west": {"texture": "#o"}, - "up": {"texture": "#o"}, - "down": {"texture": "#o", "cullface": "down"} - } - }, - { - "from": [13, 0, 13], - "to": [15, 14, 15], - "faces": { - "north": {"texture": "#o"}, - "east": {"texture": "#o"}, - "south": {"texture": "#o"}, - "west": {"texture": "#o"}, - "up": {"texture": "#o"}, - "down": {"texture": "#o", "cullface": "down"} - } - }, - { - "from": [1, 0, 13], - "to": [3, 14, 15], - "faces": { - "north": {"texture": "#o"}, - "east": {"texture": "#o"}, - "south": {"texture": "#o"}, - "west": {"texture": "#o"}, - "up": {"texture": "#o"}, - "down": {"texture": "#o", "cullface": "down"} - } - }, - { - "from": [0, 14, 0], - "to": [16, 15.875, 16], - "faces": { - "north": {"texture": "#o"}, - "east": {"texture": "#o"}, - "south": {"texture": "#o"}, - "west": {"texture": "#o"}, - "up": {"texture": "#o"}, - "down": {"texture": "#o"} - } - }, - { - "from": [0.25, 15.875, 0.25], - "to": [15.75, 16, 15.75], - "faces": { - "north": {"texture": "#o"}, - "east": {"texture": "#o"}, - "south": {"texture": "#o"}, - "west": {"texture": "#o"}, - "up": {"texture": "#o"}, - "down": {"texture": "#o"} - } - }, - { - "from": [13, 13.5, 3], - "to": [15, 14, 5], - "faces": { - "north": {"texture": "#o"}, - "east": {"texture": "#o"}, - "south": {"texture": "#o"}, - "west": {"texture": "#o"}, - "up": {"texture": "#o"}, - "down": {"texture": "#o"} - } - }, - { - "from": [13, 13.5, 11], - "to": [15, 14, 13], - "faces": { - "north": {"texture": "#o"}, - "east": {"texture": "#o"}, - "south": {"texture": "#o"}, - "west": {"texture": "#o"}, - "up": {"texture": "#o"}, - "down": {"texture": "#o"} - } - }, - { - "from": [1, 13.5, 11], - "to": [3, 14, 13], - "faces": { - "north": {"texture": "#o"}, - "east": {"texture": "#o"}, - "south": {"texture": "#o"}, - "west": {"texture": "#o"}, - "up": {"texture": "#o"}, - "down": {"texture": "#o"} - } - }, - { - "from": [1, 13.5, 3], - "to": [3, 14, 5], - "faces": { - "north": {"texture": "#o"}, - "east": {"texture": "#o"}, - "south": {"texture": "#o"}, - "west": {"texture": "#o"}, - "up": {"texture": "#o"}, - "down": {"texture": "#o"} - } - }, - { - "from": [11, 13.5, 1], - "to": [13, 14, 3], - "faces": { - "north": {"texture": "#o"}, - "east": {"texture": "#o"}, - "south": {"texture": "#o"}, - "west": {"texture": "#o"}, - "up": {"texture": "#o"}, - "down": {"texture": "#o"} - } - }, - { - "from": [3, 13.5, 1], - "to": [5, 14, 3], - "faces": { - "north": {"texture": "#o"}, - "east": {"texture": "#o"}, - "south": {"texture": "#o"}, - "west": {"texture": "#o"}, - "up": {"texture": "#o"}, - "down": {"texture": "#o"} - } - }, - { - "from": [11, 13.5, 13], - "to": [13, 14, 15], - "faces": { - "north": {"texture": "#o"}, - "east": {"texture": "#o"}, - "south": {"texture": "#o"}, - "west": {"texture": "#o"}, - "up": {"texture": "#o"}, - "down": {"texture": "#o"} - } - }, - { - "from": [3, 13.5, 13], - "to": [5, 14, 15], - "faces": { - "north": {"texture": "#o"}, - "east": {"texture": "#o"}, - "south": {"texture": "#o"}, - "west": {"texture": "#o"}, - "up": {"texture": "#o"}, - "down": {"texture": "#o"} - } - } - ], - "display": { - "ground": { - "scale": [0.2, 0.2, 0.2] - }, - "gui": { - "rotation": [30, 225, 0], - "scale": [0.625, 0.625, 0.625] - }, - "fixed": { - "scale": [0.5, 0.5, 0.5] - } - } -} \ No newline at end of file diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture0.png b/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture0.png index 1b9127e683a41f031dddaaadd338c5e80eaf7ad3..c0157c1ed2b505f64fe0f78a5b07ad5ea969967d 100644 GIT binary patch delta 544 zcmV+*0^j}M1m6UZN`C?WNkl#V(T6Jl>N;u$26ESf1ran9lD z4TXYAM4Zn&WFA^;L=>%Gh#9JisG??!IT1DV`)+zpkOdi!^?4E%q15@z@rZ$lB=bCr z)NxhFM5_unWq+SQ0I4UkjLqx5iE}swY7JF`0!XqFyyM=S6N#CV8Qk}c`_pqX1R-K0 zqTk{|5D>vsP&21BN6k<*GJ>%drpB5R5y&VilNCubM^)K#Ju%MlMnq9__Bpr;S)eMI zDOE*Qa!%pqq(EfSdP7uD5k=LgN`Aa9M8Mqu_>9S3Z+}dU*Xsw6#5v3{5E1emRNW92 z&RU2%sFIogK{9Ko!Q78!(FgZ^63kJuFl$66b57bfg=&VIaiW-G(^N54&e>!oLekvu zDu}&!{rpKqFy=-?p2Lbfb-z#oFwEP-MJ8hmw3+f*lR5_xrMYokH=p<5oB)yMl~ajG i_L{suZyBhPpYI*b64 zg#7pCcOp)>uumi1%)M}T8hAypvgj_(-b7qf7bb$b;ie8|ti3Ta#u#WgnMHT=|9x|f z3v=f+F6O$q#-JKZ!M}51CYT3nFZN#0psEz`>-}Q4P+hF~!G9x|b5WI4H9p2bL~sw* zTtpb|&fW(zW1RvKGLu#VF;o&87hQ>(84axUCBg}R;!#NN>Q~DRa6~U zg(|eWaZ~m=ynlu=+(kvH+Pq&c@*GZsTA*ss07Z3y57gtaYZk0s0IhLh=C~OVfl`Qo z075@1f~%lrPJ|<>oNVry+;d@StT_>Z%BHJWS%f*N%AV^vU)$iWq^YpdyN@(Ovv_UxEh$!L4b-nn0Zq7*%d8%AW jX0g}g^BVm?HzvYg;>$yI4I^S&00000NkvXXu0mjf2dMwe diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture1.png b/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture1.png index bc04cffccc14b43f115945358e677dd317896591..5645eab913003496386dfa32c734dda5009b5da3 100644 GIT binary patch delta 559 zcmV+~0?_^E1n&fpOMeeZL_t(I%Po?*ax6Cx1hWqSvwY+S%9X8OSA-054glRPW9gPt zN0$8a_g^8}pf+n4qdC{}psExw+*w(ywWtjKe0;KE<06PDo(ZZ&CiLcSu{F#bD9-ER z7zh0|D3r<#6e)^PXaUcCg9ty@#heqVV$X+&;OLE=NmR1egMX+(!F`{swa|#9_rd4~ zZjHSI5g;br1Vo{Vy^-C6NUzAW>85MWG1eHst|i(s@&Iw^^T~M3D4TU)RNF%UcmiKdTR)U zngO7yjNa+35wXZD1aKAJrh$^8?#>tkHRJX10aX;m=z~2cs>*XOMr*7rdh5)&$bdpi zsenpGZ>XxYW@IG%rpZjqo%4B6in$kv5LKM_!ZQ<4M1O^W`sn)BcH4`h&;s2O7IeJl}F6mL!+gJ*66!E*<#57yq)4n}(;ZM_jY zP%SEwU_uoN%=IQjC2r%x&nSheV6AaoC+?j!AKa9+HxYrG@;`DnU0Wa8-LwDz002ovPDHLkV1hvF45|PC delta 551 zcmV+?0@(fU1m^^hOMeGRL_t(I%SF;la%)En1kpsHKjf1Z=&8qEy$2%u-fjRMP!V21 zWmFvd=kLGD)G>m6iqV|+b>Z$5Fk541vG=Aj`1AZ?$Dx^FE?Sjg2ImyLIciR?f#g8( zT8lX*f1VQ%85=Vw2^qAkVy{IXgV$P&-Y|@a0Ex%woGPq}*nc;zcWMXge$iV)nZ+2B z(I>7(M55pP(L04f6=x?qi$b_y&L^#jHs|Etn}{F!=(ve>FJ^CCYXQcIgCv?eMiG_B zMCCzHG#7I|s0bo9V@%AP)(0l>{r!!}sf2S5m=hTo(C&NFdS~AkX5tjI3|2tqVUEdq zzcC7vKIfX#8-Gj%l7vxYL1xlqNFvTnbLUzM^^Uw#W!(E9OEQztpkcy< z#2ka(IuV=9`XtM6cc?%lYOOKnMD9GEPpG0O=9uj3LNe}aGk!shKG^$^0fkWIp)we~ zeV%S2BdJQfHL5;Uuj@h-_t{`ZRPnwJ%1q3J$*4+3`+pzOy*K;5ki_Hh#9dHu?i&Cy zky=A8tO|MK-=7y$5)sH9^Zua=$b`4Xn3L;1q={CMc%STZs1wXSxYnYNPDX+idE&EJ zpCk9#xCE6n$;sH185xJnBCB|eK}K+`i^ta&d2V*(FEV|&SJ0ZlYafOSmyi{woY&7A pcj3LW)*u`A4>s4wf`{WW{sT}ON9(r^eFOji002ovPDHLkV1kDq3rYY0 diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture2.png b/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture2.png index 21818378598a36601024251086b9dd58efbf244e..f1a97dbb02d10c2a4420374acd683ff4dfdbe623 100644 GIT binary patch delta 575 zcmV-F0>J%&1^)z)OMf3pL_t(I%Po^hk|Re91RYCO6-jBHH&>nYd)Y|ctjxrs1LqD{ z1i}OI_g_C7agL$vXwKpM`}KvIky$*BK{Tie_kHun>rdvI9PX$oE@F&h5PKscWEbak zA)=Tm@AsSQyijTE`C`s*L=;h_D$&T|*ROx@V~|xu1hEzsn}0bckMrPOix!yoH)h7( z!F|8kJMpUIJRigg_6n}+z+4a!E_d#^81AeYv>I8>^KsFlD21NqMP!0B;~0o24M-RN zeSIOonm21rXmC>^gE=Qzg{ulGVCG~lx&R;>&hw(Xd7e)qi>@YOA?B!oyQB9#KY?T* zBCIS_1hK)+0Dlo;Z!#8;T<1moo{7EDF$S*2TpLs2aKqi0_cv}v>`jRvVu0}dz7c6u zg%U%nlJ}gLIctAh>`2Uv;m&oQD2)ivjhjM4W+Gjvsq%cjFn7-LVy{hBVQL?oUA*5D z=_V2O-i$HmEL06$Yf||s(fhtJSE!GoxudF#F?jEdbbleL>`2b*Br8!-BO-A(&chMF z-9CZtjnIe)&&QMQf^I4{dvBycAFn5m=aY5cm>)!a7S>usCQ)FfpR>%l9#7Pi$VSJ& za|ejABPawnW39zFj^Fq;xdT52-A(i+GdYGq7Yc%Oaa`jyUT delta 577 zcmV-H0>1tK1c3#ROMf9rL_t(I%Po@2l3Oq0~^Q{L}4SG!O-*!^UTFWe1LB{R?+$?xC);pZ`4)^2Yh@vFgS|ehkrj%L`Q4Sy{ z`SW@qz#N@92OMw{c5KENL?*7Ps0e0G#N;FZ#DUf>&NOz{a5MH=qzEDg2w(4x z$VY36p%IHdCT7lDABwdDGo!e3wT5yK0nWiq;Up1(oJ38P`+j2Xw05!PA~G?xkIs|4 z-vc>^Kp10wvWZ01(76_|2O`3|cgz*?bJ5&URZ1zm*MCAzBC702+SP~*RMpr!a5q|Y z1U^j@VXlR65E1Uj%{lqOUz4>KazG!?oBR2L**oTyou7p{Cp&_jV5Xn9%(;%AAA1h_%T`M1?s9xi|j<6Mtb0bY_sa P00000NkvXXu0mjfOuZ21 diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture3.png b/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture3.png index 84788f2ccf9a8d3bb5d18982bbffa0b74a0a953b..6e39b40631b61eb2d2859c45b1e35f3cd22ad6b2 100644 GIT binary patch delta 554 zcmV+_0@eNO1nLBkOMePUL_t(I%Po^Zjx9F~152`OcR%EO*=C*d2Y;s9w!|!E4nP)I z0PWv@{uUO5!#af{WQHV4;xi}DK7cTZ=#!I&5kd4I%o>GA8Lc@H4Pi(i75{zx;hGoC z9rGY_)7(f2&c@e1?6oj6-nH0!Llx`!MiPI0KAbFM;(5N1#D6}?*^BqxL_{D7_n>(q zK~~|->2B=384=_zu!dPTOs|F z_ZYYtCgBl*@_(>TQdO7=RZ(X#n(_T^-gn{6se*e95`H}tQ~{2^&lhKJ46)C_ zOw>74C38+%Ym~%u4$WYl&B=qiBNd*RfMEvL?94GRbAKeU_GYgaN!-^>L}T=hGQo^! z4WIYT{kb`7(_-+f4Ty6N-Wnc*>-yO&!O5bJ!8yed#C{hQgLf_P#_XN5URraIP$he9 za0BT#yr~k=8)4>{iu?0nuf-9VirEbBgXjBUem*ESDZrf8I%5V^Npv^(2(HSoGa|@cU=6dz2yse8GyJ+P1Y|Dy2qHR?XcXVSf5BOt=L^+ARkY@uN&qqo zKY4J2=!3l$l?O8ej4>{XqD8~K(Idz_WC;PSIsSY<^fAf37`?Mg7_d^TO8WdD8E%Di zFmrkg+zgZOh<`wN*e9tfO!bqniZKS?&qA$JYM43eU1V;|pgag~&dQ>-K#1$QD2Xop z2%8Rwm5BrH&YY8zi7D|pFGdeq?||_9DkoL&fXYe zpM#mGbErz@oV3;`;5mn8u+HY>!QGJx&rHBDgKKu?7=M^Kl307Q*NY_X>n5TxdPkXH zMzn^{`{w@KoV95&c-98QIR|eIkHK~QFiUW<=wonBaRjm7MaAG<3%oJM;OtF{00~vH z*9JF`{){(OB6=gt98+1bhr}gvwFh3uZn-pM9Yn?HJswBD_zt_uXjot?! us>J&&#wF-n_s!ZH$=K`t^HxB@4E_gNQFlp}1!XG$0000Bdwz zjuVlFDQbqQjo(iK!&-}7n{GjXsU{h|j)g^lH2J(S4=RhE=6~876%p1t0EL38Vh{!h zchmw?rS|aD&?BHitOGN_BZAx;rCH}xYB$uLYeQ^o&0fKrop$eUvT00000@?lK1m*;gOMeDQL_t(I%PrDLlH5oTL(%V3klA%YZME*xt1AaGeCS2#0s!n8 z*H|9a@qJO9PWTGO%S_hy|P*n`V z0O5{WV5(FOcMUxPD#SW46Fef=nJCRVgK7BOH?G3#`9wt7`^HQWgkuHQRa6x#0(bvO z4>zvoH)f8Tvpi56x*K;Rt8s?w`j9=iJJp4Lf4>+}pa~O(!UX<%eRzG|^bEN-Q=9IM zin8LsR1pR@Gk;u#_xr{vsvEPw4LnZvz47zFMA$nSgsx3>a~vlgE4V%vz79xOq11qx z@iVH(u3<7;1`}5PxB)3*AuNsDPV+{@lH*=x)@E zFvHh*Ko9%6I38bI*PE_p7{na0z@*6@x(77}DF$WK(9WX%wtcP}Q^(yw6jy~#Ityi( z{(-DYn1X2(gw9Q@g{x2lJSyYKlYV_TxgE|L>GJV5^a{Zk@F?n#MZ z<`jjhaX$~QF^GbQMP)L^$%;iY!`x6oQ4>@ID(StES@dx*j)QwnRD@`Zawqe-32V41nSY79lbKW|8G(&~tDxST^L0XQ z%sZL&(|rf#4(g22L6seWyU|ByCp?jO#wIZ4T13I?7(Aah-WxF|YK9^|*lJ`I5u2={ z`+*k%8N9x}h_(1!H~PD3X580}dc#R(Y+Ri_8fwN`6Mv1)_cPIF;;kVBYbWyqnLia`}{sVtGSU+t{0Y3l$002ovPDHLkV1foA_>KSo delta 547 zcmV+;0^I%U1nUHlQ-6{>vLrbS1Ct*~)jjuHcm2KoOute|BDqG7j|fC2ApiaQPl+fQ zixS7oDGF6%J`e9PI0ffyDw8o@?6YZRm>Vi6YJ!SF1-(0&MIRUAx|nOBA~aKaAM8Ep z%_$L7KzAgc-yfie2-bQK;OFxPsu;a-KM(3go<(bo`=0DI`G51dQ8S~D3u_lD&N+#< z27rnn>Re+$DIrQET%)7jF%#U}IRWP!d~~W{?L~KI-ZyGaRRR!M^vl@ipw>`#^eaLT zHO>ht6Zb|HT(39o&KQG2=&b|a?E33Q*RwzkRpI@55eO>6y$<&?Q8TEbyJ7~FiK#Ps zry@`ROknN9oPQHCfJCKee=!0mluRfDcO~M0cQh&P`Jie5wAP4(h@iRCT7wK!g*cmv zAR_?Cv+>vKO;xhi#?;w+g9@+f#n~G~s034(1y?ur*^q_zhOg&`D#3f_{<#qXlMYhf zc7Zt;_gY*{*!v*?Gbb|e69rYU54{;G-zToMII6fQnSY79lewwbR2FhITm|>$G;gdq zu|B?>KviMxAj%j<6vQfee^C@CAx`3Xf`hU4<`lfI!80dq49?!DDvFSmm^lfY6J!P5 zFT4=Q!~54S&ffgo6BQWEvC*0LM7`l8>jbV&A00Jg?}fid=kqM|S$Jy*haJhhA4I^- lzAHsRfgA|zv(X5I;(xq&OlsmRM1cSR002ovPDHLkV1j_7{P6$) diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture6.png b/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture6.png index ffe671a66f793c64574249bfb2a7dd9bbfd6fec1..99e6367d26bd269bdfdae3848542517411d3d58b 100644 GIT binary patch delta 547 zcmV+;0^I%O1mgsdOMe4NL_t(I%O#OXcEmOi#ZUt!w(SdMn{|$FcS~dqS?B^E?*sDR zzyEY3oWuC6;B`2^?++L1Rp1r32L}2YGzb7dtV?RBJ4=0pkh;*#9oMisv$H*F~$Hus}j1H zbE4981&1lBj{10RxKjH+@759jGHML z!5B{GMoo<|95tgF?zOlh`Fee^?uDw5QOq$|S?v49RmdGrrQA2`zJaCyQ(>6V-IyC{ z1|s}k7l%C!uKR--WF?9yf>2e=!vW|ngeEiD_eDl9=YPaZk%voF^Eyvl-EebaEwbR= zf$1YjR5{OySCiGmO56q_P#C)!HBm&2zxSKWGvj?o<~U3l;E) zq}S&A=ZB2oa}^?rn(}&`tUJ*2K)bkiFpraN7>7|A=rEyGSl5NBp#o;k=Y6qOfI#d` lVN@3P^&DZxhHfg0{{g$@S8%`sEFu5^002ovPDHLkV1jn%{+<8; delta 549 zcmV+=0^0rK1my&fOMeAPL_t(I%Po>glH@iJ1U(m!sOkQot~$^2yQ@eb7agd3n8o5D zfB*fbBjFszX9cgr`FVesb5h-$?%a`71r>?;fv6zes43npjKhdXhASZ7^n(f4ePo&jzL6HRY=3?%{T_G&>}=7v41y+AY#OIA)=^=aEt>L zhZbnC;g}hqs2!Lpv5Q3TaZ;Heio2p_Ms>6I1p*?%j)V#-HkC>2g$Sq`LQ|cLF#yo2 zgf8Zss5D){VT!7uKAsxxRKqYQB0!z$rU8w3;@sDVVMYNNiInQdN`~YQt#+Q3K#SC)Gkkan6a`gA*D7 z%#@5^45xFWrp6eKno+IXJGi5Gz5cN7g{qKI%rRJ5?6q+-a>qj{_szO*peYf|jN#A1 z=7ySq2tU`w;YJHwYhi9=C5kA5P*u#s0q8D-CNtUhMSn&x=fq4AK>ydj&J$NR+?-g8 zEVy@I`ivy1oae-=$!cN;ZiWan%C1ID6cOY1{U$T{{`x{_=9~x+dqFi+;wqRaRYB|< z74V3p*XHZ{n~dOd)$?&vUaymN2YMc87xxb4ancRrFe(EbCbSCcx}Nt5m^q*K#aaOZ nu{VWLSsvWihaDTbsVx2j`R7(`E{|+000000NkvXXu0mjfCnW{- diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture7.png b/src/main/resources/assets/engineersdecor/textures/blocks/concrete/rebar_concrete_texture7.png index 8f075850ffdb44018371d36cf80824f51ffc25f5..8ee5d608a3a31d8572f0d001df5bbac9ea9ca81d 100644 GIT binary patch delta 544 zcmV+*0^j}T1m^^hQhz;@yN+8)3`7qf-F+qd`y6h(|G&0oZZ{trNN^<#hysc@Ecy4J zU+rVkm7FNnaP~Q@Yq3wD-C#~;aL(b!^CwkFWum62s^Mc$4RbiCAZFY<7-JCKm@1Do z`SEyi-!JF@Rk{+dhVR#lc`aUleq-jCD56St;VSG1h6{8uTz|}*a3X2#wd>X5lvYoY24 zcZMqN?g;R;4}XH7!Ut0@=j7~zy5Tx8fy_b;pa~Qo)7d-dDux?tPDBLNVz|>;bQhV8 z@>bV-Dvg3N+?Z>js>BJzjOotT@Ba{i*uius5KN5jrXmqhluj}e5x7r~mF(9G>BBXR zIR|3O_c^#gNuy?{Df?`E@1VQ!(ad3FG;<8TzW&hNJb%=1bHogxs4Ox9bLX)ZI9@H*+qkg6n!!4H z1RzukZpPV3iIc6EJ31E6=fc-oL?)RxHXQc}0;WoygQ;=$jR<5UZb}!p8JUGvB^igc z9#Bo3LskNUn3GjJ9}mnYZq7Le>;pQh(EHw)544MQUF=Lul%37Vz|7ctLme_VYb{ir z;m%OS-5mj5`+pz^Do~YF26Il%KByb66B9nQ4WJ1WAJf_U<8`>P=0sG{EQUK>O?Q&n zD4*&2Y^709h8uG&RF#NCRG4nO{`(i9iIYrs0>Q-SZYmNHMd>6n5rO*znZf>fA$7Qx zF{dLcywAY}N*XmoP1$GTdk5W(k7f=dqnX2b{e08FLw^kSfv6%Bl|@Ei?mX5)=e005 z;sk1g0^WDfqM%OVbQjgl-T|V_wa9{^$9|# zY;?{^p3Pbp0%R5DlLFigRb@V(Jg!M0j4@Gl=DILb+ys(F;^1SVBHXz-`!I%MX2jW4 iLB>aSWEuSGEdB?II#2+1aiDPk0000#2zd>-zrSp@+sJkJk3 z5eC{Kf~sP(%ns#35n=IFB!R%$WwWS^*`eCVW)~vChVFtAZXpCLKQpXCS5X!TbX9Ry zw0S!qe&3{_Oh>ehOP{p$fNAUZ8 zcttY6U4;b*=ouWwh7g3sy%rK=h@PgaNEGhArklS{aj)W)0YEtTTEz@V z!ZNiA+uNV&rUy1t@y?_Ny5XJ4y`E#Fs2*(LWBLGTd+Pu!(Y*~?y;Jy{Rhz|(S+zJL zWOq}51<%*b6@Ny+Q;lU-ZKQ8k(%t_7dbW4A_O2^;e9sw>pl5eLf_p786UoRXBe1=D z0MOlgQ5b+3sDsFWWWJt-EOZJb34ioI)qElactwyl*YUxEnI^OWQX(w!sU{?P2Azt| zS(IT`6&YJ|W`cHNBUs&J96i&;bR&I=wQn9t-Hin$onRD_I&Xyb2YKa%<65h4e6*3(Ek#w*PGx(@ZCP7>Ws dbsv`7+<(q7B*O*5cKQGS002ovPDHLkV1gmO<7@x` diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_framed_nailed_texture.png b/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_framed_nailed_texture.png new file mode 100644 index 0000000000000000000000000000000000000000..6c7a9c6a31e1792ec9b69f68830709363666cdb2 GIT binary patch literal 584 zcmV-O0=NB%P)KG6{I0EnQs0$i{IA}_VE4dt-u48(7>vMfJh+# zo6p@0Lss#}V`H0&4E8{U7>2W(4AB@_#DFCBX$I&vStcV`k;I%PF=Mm4NkR8O4|te1 zJ!Y*W1g5dYm5Yd=ED*3yV+VuD5Llo<1?M!5A`uv1c(w7E$Vg^}(*q3GDvZetssek6 zFf+y;q}xVdlp+)&Lu3S325nQdXd4VyEh;a}FoH8CeB&VqyOH2|6=aer-g}do*kHr! zY+~S17ZNCwB6+>u#O))AfN>+6$RH4b*k{8GnE)mfC`2Y;5yb1v0PwVxLWvZn+u3AZCCN z=q9#7g6pyP`g~B41W(K?U_-6soO=g7chA@WByc=L1cJM{Ok&3T{UL;S)Z+O_ z9ub6e6D#?$7E<2hyrbgB|94K+7QgY6|32=+*!M4X57%0#K>?M;IfwLpwr`g>9sB|| W!aZ(xSK7}200003?sN>!VeyTup0?}c0neY;(HF6i48V+%w1HqLcx4c` zhh2*qGd*~Qdj~~e2aSmkva!u;707(fhjR~6dhBKdgO~wApoiE73HEF8*UyWJB!H@o z5Or-lgAKKkd!HTjJUwFrkihj25eS~C@IU%OKt$Pc+x`Fm002ovPDHLkV1n}U B>WKgV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_rough_texture.png b/src/main/resources/assets/engineersdecor/textures/blocks/iestyle/treated_wood_rough_texture.png new file mode 100644 index 0000000000000000000000000000000000000000..fccfc829aee2f0926cd1761d456eb999ec0a3532 GIT binary patch literal 565 zcmV-50?Pe~P)^u(1V#5og)niLYx= z4YDbkdrnp*1-zNOJE`y10=hvG)y*6OcNWjP$U0HF8)&+cy_1m0Ol)C^wHDp*>+@ko zFdXK#5l{`!yRpGC_jTrLCz(y{LNra0b>I%$P)!R)m|?N@!ZQE%ffhDdMN>$ycM)-B zZoq=fCM>d>IVNW=t}zJ*-Hm)0bQRsrm=kwxByoQR?@q=rYcFJT#W)NqsZ6Hl_b0>^ zL9WH9YL=Q>?~$n+$H0hZZ-$_=7&a0J5hEyI%z?wfHH~D3O&tO0Zmux#J+ctc66mm^ z3TG8R&#|s{ky*U!#6l*k(f5AdO*nw&d0*bO7)H!F35&HhRmB*=yElzcH%;R(_qPjG zr!Sc=jxbfl&$IZqH(?(^VvyfF-Hm`}=jnw-=r9 Date: Sun, 17 Feb 2019 22:31:47 +0100 Subject: [PATCH 11/14] Added rebar concrete wall. Improved textures. --- meta/update.json | 2 +- readme.md | 1 + .../engineersdecor/blocks/BlockDecor.java | 5 +- .../engineersdecor/blocks/BlockDecorFull.java | 2 +- .../engineersdecor/blocks/BlockDecorWall.java | 180 ++++++++++++++++++ .../wile/engineersdecor/blocks/ModBlocks.java | 26 ++- .../blockstates/rebar_concrete_stairs.json | 56 ++++++ .../blockstates/rebar_concrete_wall.json | 17 ++ .../assets/engineersdecor/lang/en_us.lang | 9 +- .../block/wall/concrete_wall_inventory.json | 164 ++++++++++++++++ .../models/block/wall/concrete_wall_post.json | 21 ++ .../models/block/wall/concrete_wall_side.json | 65 +++++++ .../recipes/rebar_concrete_stairs_recipe.json | 24 +++ 13 files changed, 558 insertions(+), 14 deletions(-) create mode 100644 src/main/java/wile/engineersdecor/blocks/BlockDecorWall.java create mode 100644 src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_stairs.json create mode 100644 src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_wall.json create mode 100644 src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_inventory.json create mode 100644 src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_post.json create mode 100644 src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_side.json create mode 100644 src/main/resources/assets/engineersdecor/recipes/rebar_concrete_stairs_recipe.json diff --git a/meta/update.json b/meta/update.json index 9eb12f9..3bd21dd 100644 --- a/meta/update.json +++ b/meta/update.json @@ -1,7 +1,7 @@ { "homepage": "https://www.curseforge.com/minecraft/mc-mods/redstone-gauges-and-switches/", "1.12.2": { - "1.0.0-b3": "[A] Textures of rebar concrete and treated wood table improved.", + "1.0.0-b3": "[A] Textures of rebar concrete and treated wood table improved.\n[A] Added rebar concrete wall.", "1.0.0-b2": "[A] Added rebar concrete (steel reinforced, expensive, creeper-proof).", "1.0.0-b1": "[A] Initial structure.\n[A] Added clinker bricks and clinker brick stairs.\n[A] Added slag bricks and slag brick stairs.\n[A] Added metal rung ladder.\n[A] Added staggered metal steps ladder.\n[A] Added treated wood ladder.\n[A] Added treated wood pole.\n[A] Added treated wood table." }, diff --git a/readme.md b/readme.md index bd394cf..443a9c9 100644 --- a/readme.md +++ b/readme.md @@ -66,6 +66,7 @@ More to come slowly but steadily. ## Revision history - v1.0.0-b3 [A] Textures of rebar concrete and treated wood table improved. + [A] Added rebar concrete wall. - v1.0.0-b2 [A] Added rebar concrete (steel reinforced, expensive, creeper-proof). diff --git a/src/main/java/wile/engineersdecor/blocks/BlockDecor.java b/src/main/java/wile/engineersdecor/blocks/BlockDecor.java index 8b24e00..ce3d794 100644 --- a/src/main/java/wile/engineersdecor/blocks/BlockDecor.java +++ b/src/main/java/wile/engineersdecor/blocks/BlockDecor.java @@ -38,10 +38,13 @@ import java.util.List; public class BlockDecor extends Block { - public final long config; // the config combines some aspects of blocks, allowing to define different behaviour at construction time, without excessive polymorphy. + // The config combines some aspects of blocks, allowing to define different behaviour at construction time, without excessive polymorphy. + // It's an old school flag set as it is used internally only and shall not have as littlt impact on performance as possible. + public final long config; public static final long CFG_CUTOUT = 0x0000000000000001L; // cutout rendering public static final long CFG_HORIZIONTAL = 0x0000000000000002L; // horizontal block, affects bounding box calculation at construction time public static final long CFG_HORIZIONTAL_PLACEMENT = 0x0000000000000004L; // placed in the horizontzal direction the player is looking when placing. + public static final long CFG_WALL_DOOR_CONNECTION = 0x0000000000000008L; // wall block connects to fence gates and doors. public BlockDecor(@Nonnull String registryName, long config, @Nullable Material material, float hardness, float resistance, @Nullable SoundType sound) { diff --git a/src/main/java/wile/engineersdecor/blocks/BlockDecorFull.java b/src/main/java/wile/engineersdecor/blocks/BlockDecorFull.java index 8038120..a237d36 100644 --- a/src/main/java/wile/engineersdecor/blocks/BlockDecorFull.java +++ b/src/main/java/wile/engineersdecor/blocks/BlockDecorFull.java @@ -25,7 +25,7 @@ public class BlockDecorFull extends BlockDecor public BlockDecorFull(@Nonnull String registryName, long config, @Nullable Material material, float hardness, float resistance, @Nullable SoundType sound) { super(registryName, config, material, hardness, resistance, sound); - setLightOpacity(1); + setLightOpacity(255); } @Override diff --git a/src/main/java/wile/engineersdecor/blocks/BlockDecorWall.java b/src/main/java/wile/engineersdecor/blocks/BlockDecorWall.java new file mode 100644 index 0000000..ed9a40e --- /dev/null +++ b/src/main/java/wile/engineersdecor/blocks/BlockDecorWall.java @@ -0,0 +1,180 @@ +/* + * @file BlockDecorWall.java + * @author Stefan Wilhelm (wile) + * @copyright (C) 2019 Stefan Wilhelm + * @license MIT (see https://opensource.org/licenses/MIT) + * + * Wall blocks. This block is derived from vanilla BlockWall + */ +package wile.engineersdecor.blocks; + +import net.minecraft.block.*; +import net.minecraft.block.material.Material; +import net.minecraft.block.properties.IProperty; +import net.minecraft.block.properties.PropertyBool; +import net.minecraft.block.state.BlockFaceShape; +import net.minecraft.block.state.BlockStateContainer; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.Entity; +import net.minecraft.init.Blocks; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.List; + +/** + * As strange as it is, I could not properly get a block derived from BlockWall working, + * either the VARIANT made issues, or the item model was duplicated (using state mapper), + * so, this is now basically a BlockWall without the VARIANT propery. Anyway a solved issue + * in mc1.13+. Deriving from BlockDecor to have the tooltip, creativetab etc already set up. + */ +public class BlockDecorWall extends BlockDecor +{ + public static final PropertyBool UP = BlockWall.UP; + public static final PropertyBool NORTH = BlockWall.NORTH; + public static final PropertyBool EAST = BlockWall.EAST; + public static final PropertyBool SOUTH = BlockWall.SOUTH; + public static final PropertyBool WEST = BlockWall.WEST; + + private static final double d_0 = 0.0d; + private static final double d_1 = 1.0d; + private static final double d_a = 0.25d; + private static final double d_b = 1.0d-d_a; + private static final double d_k = 0.26d; // 0.3125D; + private static final double d_l = 1.0d-d_k; + protected static final AxisAlignedBB[] AABB_BY_INDEX = new AxisAlignedBB[] { + new AxisAlignedBB(d_a, d_0, d_a, d_b, d_1, d_b), + new AxisAlignedBB(d_a, d_0, d_a, d_b, d_1, d_1), + new AxisAlignedBB(d_0, d_0, d_a, d_b, d_1, d_b), + new AxisAlignedBB(d_0, d_0, d_a, d_b, d_1, d_1), + new AxisAlignedBB(d_a, d_0, d_0, d_b, d_1, d_b), + new AxisAlignedBB(d_k, d_0, d_0, d_l, d_1, d_1), + new AxisAlignedBB(d_0, d_0, d_0, d_b, d_1, d_b), + new AxisAlignedBB(d_0, d_0, d_0, d_b, d_1, d_1), + new AxisAlignedBB(d_a, d_0, d_a, d_1, d_1, d_b), + new AxisAlignedBB(d_a, d_0, d_a, d_1, d_1, d_1), + new AxisAlignedBB(d_0, d_0, d_k, d_1, d_1, d_l), + new AxisAlignedBB(d_0, d_0, d_a, d_1, d_1, d_1), + new AxisAlignedBB(d_a, d_0, d_0, d_1, d_1, d_b), + new AxisAlignedBB(d_a, d_0, d_0, d_1, d_1, d_1), + new AxisAlignedBB(d_0, d_0, d_0, d_1, d_1, d_b), + new AxisAlignedBB(d_0, d_0, d_0, d_1, d_1, d_1) + }; + private static final double clip_height = 1.5d; + protected static final AxisAlignedBB[] CLIP_AABB_BY_INDEX = new AxisAlignedBB[] { AABB_BY_INDEX[0].setMaxY(clip_height), AABB_BY_INDEX[1].setMaxY(clip_height), AABB_BY_INDEX[2].setMaxY(clip_height), AABB_BY_INDEX[3].setMaxY(clip_height), AABB_BY_INDEX[4].setMaxY(clip_height), AABB_BY_INDEX[5].setMaxY(clip_height), AABB_BY_INDEX[6].setMaxY(clip_height), AABB_BY_INDEX[7].setMaxY(clip_height), AABB_BY_INDEX[8].setMaxY(clip_height), AABB_BY_INDEX[9].setMaxY(clip_height), AABB_BY_INDEX[10].setMaxY(clip_height), AABB_BY_INDEX[11].setMaxY(clip_height), AABB_BY_INDEX[12].setMaxY(clip_height), AABB_BY_INDEX[13].setMaxY(clip_height), AABB_BY_INDEX[14].setMaxY(clip_height), AABB_BY_INDEX[15].setMaxY(clip_height) }; + + public BlockDecorWall(@Nonnull String registryName, long config, @Nullable Material material, float hardness, float resistance, @Nullable SoundType sound) + { + super(registryName, config, material, hardness, resistance, sound); + setDefaultState(blockState.getBaseState().withProperty(UP, false).withProperty(NORTH, false).withProperty(EAST, false).withProperty(SOUTH, false).withProperty(WEST, false)); + } + + @Override + @SuppressWarnings("deprecation") + public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) + { return AABB_BY_INDEX[getAABBIndex(getActualState(state, source, pos))]; } + + @Override + @SuppressWarnings("deprecation") + public void addCollisionBoxToList(IBlockState state, World world, BlockPos pos, AxisAlignedBB entityBox, List collidingBoxes, @Nullable Entity entityIn, boolean isActualState) + { addCollisionBoxToList(pos, entityBox, collidingBoxes, CLIP_AABB_BY_INDEX[getAABBIndex(isActualState ? state : getActualState(state, world, pos))]); } + + @Nullable + @Override + @SuppressWarnings("deprecation") + public AxisAlignedBB getCollisionBoundingBox(IBlockState state, IBlockAccess world, BlockPos pos) + { return CLIP_AABB_BY_INDEX[getAABBIndex(getActualState(state, world, pos))]; } + + private static int getAABBIndex(IBlockState state) + { return ((!(state.getValue(NORTH))) ? 0 : (1< Date: Mon, 18 Feb 2019 21:34:29 +0100 Subject: [PATCH 12/14] Added IE concrete wall. Fixed missing rebar concrete wall recipe. --- gradle.properties | 2 +- meta/update.json | 3 ++- readme.md | 11 ++++++++ .../engineersdecor/ModEngineersDecor.java | 2 +- .../wile/engineersdecor/blocks/ModBlocks.java | 11 ++++++++ .../blockstates/concrete_wall.json | 17 +++++++++++++ .../assets/engineersdecor/lang/en_us.lang | 2 ++ ...oncrete_wall_recipe_with_ie_installed.json | 25 +++++++++++++++++++ .../recipes/rebar_concrete_wall_recipe.json | 24 ++++++++++++++++++ 9 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/assets/engineersdecor/blockstates/concrete_wall.json create mode 100644 src/main/resources/assets/engineersdecor/recipes/concrete_wall_recipe_with_ie_installed.json create mode 100644 src/main/resources/assets/engineersdecor/recipes/rebar_concrete_wall_recipe.json diff --git a/gradle.properties b/gradle.properties index efe0ec8..e36c4ee 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.daemon=false org.gradle.jvmargs=-Xmx8G version_minecraft=1.12.2 version_forge=14.23.5.2768 -version_engineersdecor=1.0.0-b3 +version_engineersdecor=1.0.0-b4 # # jar signing data loaded from signing.properties in the project root. # diff --git a/meta/update.json b/meta/update.json index 3bd21dd..d057ae1 100644 --- a/meta/update.json +++ b/meta/update.json @@ -1,12 +1,13 @@ { "homepage": "https://www.curseforge.com/minecraft/mc-mods/redstone-gauges-and-switches/", "1.12.2": { + "1.0.0-b4": "[F] Fixed vanished recipe for the rebar concrete wall.\n[A] Concrete wall, material: IE concrete.", "1.0.0-b3": "[A] Textures of rebar concrete and treated wood table improved.\n[A] Added rebar concrete wall.", "1.0.0-b2": "[A] Added rebar concrete (steel reinforced, expensive, creeper-proof).", "1.0.0-b1": "[A] Initial structure.\n[A] Added clinker bricks and clinker brick stairs.\n[A] Added slag bricks and slag brick stairs.\n[A] Added metal rung ladder.\n[A] Added staggered metal steps ladder.\n[A] Added treated wood ladder.\n[A] Added treated wood pole.\n[A] Added treated wood table." }, "promos": { "1.12.2-recommended": "", - "1.12.2-latest": "1.0.0-b3" + "1.12.2-latest": "1.0.0-b4" } } \ No newline at end of file diff --git a/readme.md b/readme.md index 443a9c9..b743e8f 100644 --- a/readme.md +++ b/readme.md @@ -26,6 +26,14 @@ no tile entities or user interactions are used. Current feature set: explosion resistance than the vanilla brick wall. Also available as stairs, also with reverse recipe. +- Rebar (steel) reinforced concrete: Expensive but creeper-proof. Crafted 3x3 from + four concrete blocks and five steel rods. Texture design oriented at the IE concrete, + slightly darker, eight (position dependent) random texture variations with rust + traces. Also creaftable in form of *stairs* and *walls*. + +- Concrete wall: Solid concrete wall (not the vanilla wall design), crafted 3x3 + from six IE concrete blocks (normal wall recipe). + - *Treated wood ladder*: Crafted 3x3 with the known ladder pattern, items are treated wood sticks. @@ -65,6 +73,9 @@ More to come slowly but steadily. ---- ## Revision history + - v1.0.0-b4 [F] Fixed vanished recipe for the rebar concrete wall. + [A] Concrete wall, material: IE concrete. + - v1.0.0-b3 [A] Textures of rebar concrete and treated wood table improved. [A] Added rebar concrete wall. diff --git a/src/main/java/wile/engineersdecor/ModEngineersDecor.java b/src/main/java/wile/engineersdecor/ModEngineersDecor.java index d5a79cf..45b0dee 100644 --- a/src/main/java/wile/engineersdecor/ModEngineersDecor.java +++ b/src/main/java/wile/engineersdecor/ModEngineersDecor.java @@ -31,7 +31,7 @@ import javax.annotation.Nonnull; modid = ModEngineersDecor.MODID, name = ModEngineersDecor.MODNAME, version = ModEngineersDecor.MODVERSION, - dependencies = "required-after:forge@[14.23.5.2768,)", + dependencies = "required-after:forge@[14.23.5.2768,);before:immersiveengineering", useMetadata = true, updateJSON = "https://raw.githubusercontent.com/stfwi/engineersdecor/develop/meta/update.json", certificateFingerprint = ((ModEngineersDecor.MODFINGERPRINT==("@"+"MOD_SIGNSHA1"+"@")) ? "" : ModEngineersDecor.MODFINGERPRINT) diff --git a/src/main/java/wile/engineersdecor/blocks/ModBlocks.java b/src/main/java/wile/engineersdecor/blocks/ModBlocks.java index f8870bc..ac89cca 100644 --- a/src/main/java/wile/engineersdecor/blocks/ModBlocks.java +++ b/src/main/java/wile/engineersdecor/blocks/ModBlocks.java @@ -16,6 +16,7 @@ import net.minecraft.block.SoundType; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.block.model.ModelResourceLocation; import net.minecraftforge.client.model.ModelLoader; +import net.minecraftforge.fml.common.Loader; import wile.engineersdecor.ModEngineersDecor; import wile.engineersdecor.detail.ModAuxiliaries; import wile.engineersdecor.detail.ModConfig; @@ -50,6 +51,8 @@ public class ModBlocks public static final BlockDecorStairs REBAR_CONCRETE_STAIRS = new BlockDecorStairs("rebar_concrete_stairs", REBAR_CONCRETE_BLOCK.getDefaultState()); public static final BlockDecorWall REBAR_CONCRETE_WALL = new BlockDecorWall("rebar_concrete_wall", BlockDecor.CFG_WALL_DOOR_CONNECTION, Material.ROCK, 8f, 2000f, SoundType.STONE); + public static final BlockDecorWall CONCRETE_WALL = new BlockDecorWall("concrete_wall", BlockDecor.CFG_WALL_DOOR_CONNECTION, Material.ROCK, 8f, 50f, SoundType.STONE); + public static final BlockDecorDirected TREATED_WOOD_POLE = new BlockDecorDirected( "treated_wood_pole", BlockDecor.CFG_CUTOUT, @@ -80,6 +83,10 @@ public class ModBlocks REBAR_CONCRETE_WALL, }; + private static final Block ieDependentBlocks[] = { + CONCRETE_WALL + }; + private static final Block devBlocks[] = { IRON_SHEET_ROOF, // model looks not good enough yet }; @@ -96,6 +103,10 @@ public class ModBlocks // Config based registry selection ArrayList allBlocks = new ArrayList<>(); Collections.addAll(allBlocks, modBlocks); + if(Loader.isModLoaded("immersiveengineering")) { + ModEngineersDecor.logger.info("Immersive Engineering installed, registering dependent blocks..."); + Collections.addAll(allBlocks, ieDependentBlocks); + } if(ModConfig.zmisc.with_experimental) Collections.addAll(allBlocks, devBlocks); for(Block e:allBlocks) registeredBlocks.add(e); for(Block e:registeredBlocks) event.getRegistry().register(e); diff --git a/src/main/resources/assets/engineersdecor/blockstates/concrete_wall.json b/src/main/resources/assets/engineersdecor/blockstates/concrete_wall.json new file mode 100644 index 0000000..24b0b25 --- /dev/null +++ b/src/main/resources/assets/engineersdecor/blockstates/concrete_wall.json @@ -0,0 +1,17 @@ +{ + "forge_marker": 1, + "defaults": { + "textures": { + "wall": "immersiveengineering:blocks/stone_decoration_concrete", + "particle": "immersiveengineering:blocks/stone_decoration_concrete" + } + }, + "variants": { + "inventory": { "model": "engineersdecor:wall/concrete_wall_inventory" }, + "up" : { "false":{}, "true": {"submodel": {"concrete_wall_up" : {"model": "engineersdecor:wall/concrete_wall_post" }}} }, + "north": { "false":{}, "true": {"submodel": {"concrete_wall_north" : {"model": "engineersdecor:wall/concrete_wall_side", "uvlock": true, "y": 0 }}} }, + "east" : { "false":{}, "true": {"submodel": {"concrete_wall_east" : {"model": "engineersdecor:wall/concrete_wall_side", "uvlock": true, "y": 90 }}} }, + "south": { "false":{}, "true": {"submodel": {"concrete_wall_south" : {"model": "engineersdecor:wall/concrete_wall_side", "uvlock": true, "y": 180 }}} }, + "west" : { "false":{}, "true": {"submodel": {"concrete_wall_west" : {"model": "engineersdecor:wall/concrete_wall_side", "uvlock": true, "y": 270 }}} } + } +} diff --git a/src/main/resources/assets/engineersdecor/lang/en_us.lang b/src/main/resources/assets/engineersdecor/lang/en_us.lang index 41d7cfe..6000cab 100644 --- a/src/main/resources/assets/engineersdecor/lang/en_us.lang +++ b/src/main/resources/assets/engineersdecor/lang/en_us.lang @@ -20,6 +20,8 @@ tile.engineersdecor.rebar_concrete.name=Rebar concrete tile.engineersdecor.rebar_concrete.help=§6Steel reinforced concrete block.§r Expensive but Creeper-proof like obsidian. tile.engineersdecor.rebar_concrete_wall.name=Rebar concrete wall tile.engineersdecor.rebar_concrete_wall.help=§6Steel reinforced concrete wall.§r Expensive but Creeper-proof like obsidian. +tile.engineersdecor.concrete_wall.name=Concrete wall +tile.engineersdecor.concrete_wall.help=§6Wall made of solid concrete. #----------------------------------------------------------------------------------------------------------- # Ladder blocks diff --git a/src/main/resources/assets/engineersdecor/recipes/concrete_wall_recipe_with_ie_installed.json b/src/main/resources/assets/engineersdecor/recipes/concrete_wall_recipe_with_ie_installed.json new file mode 100644 index 0000000..87a9306 --- /dev/null +++ b/src/main/resources/assets/engineersdecor/recipes/concrete_wall_recipe_with_ie_installed.json @@ -0,0 +1,25 @@ +{ + "conditions": [ + { + "type": "engineersdecor:grc", + "result": "engineersdecor:concrete_wall", + "required": ["immersiveengineering:stone_decoration"] + } + ], + "type": "minecraft:crafting_shaped", + "pattern": [ + " ", + "CCC", + "CCC" + ], + "key": { + "C": { + "item": "#blockConcreteIe", + "data": 0 + } + }, + "result": { + "item": "engineersdecor:concrete_wall", + "count": 6 + } +} diff --git a/src/main/resources/assets/engineersdecor/recipes/rebar_concrete_wall_recipe.json b/src/main/resources/assets/engineersdecor/recipes/rebar_concrete_wall_recipe.json new file mode 100644 index 0000000..4ec19fa --- /dev/null +++ b/src/main/resources/assets/engineersdecor/recipes/rebar_concrete_wall_recipe.json @@ -0,0 +1,24 @@ +{ + "conditions": [ + { + "type": "engineersdecor:grc", + "result": "engineersdecor:rebar_concrete_wall" + } + ], + "type": "minecraft:crafting_shaped", + "pattern": [ + " ", + "CCC", + "CCC" + ], + "key": { + "C": { + "item": "engineersdecor:rebar_concrete", + "data": 0 + } + }, + "result": { + "item": "engineersdecor:rebar_concrete_wall", + "count": 6 + } +} From 1012bf11bad5aa978052a6306e1e2bbe02493c73 Mon Sep 17 00:00:00 2001 From: stfwi Date: Mon, 18 Feb 2019 22:36:21 +0100 Subject: [PATCH 13/14] Fixed wall breaking particle issue. --- .../assets/engineersdecor/blockstates/concrete_wall.json | 1 + .../engineersdecor/blockstates/rebar_concrete_wall.json | 1 + .../models/block/wall/concrete_wall_default.json | 9 +++++++++ .../models/block/wall/concrete_wall_post.json | 3 ++- 4 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_default.json diff --git a/src/main/resources/assets/engineersdecor/blockstates/concrete_wall.json b/src/main/resources/assets/engineersdecor/blockstates/concrete_wall.json index 24b0b25..7956471 100644 --- a/src/main/resources/assets/engineersdecor/blockstates/concrete_wall.json +++ b/src/main/resources/assets/engineersdecor/blockstates/concrete_wall.json @@ -1,6 +1,7 @@ { "forge_marker": 1, "defaults": { + "model": "engineersdecor:wall/concrete_wall_default", "textures": { "wall": "immersiveengineering:blocks/stone_decoration_concrete", "particle": "immersiveengineering:blocks/stone_decoration_concrete" diff --git a/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_wall.json b/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_wall.json index 6bc8139..9590325 100644 --- a/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_wall.json +++ b/src/main/resources/assets/engineersdecor/blockstates/rebar_concrete_wall.json @@ -1,6 +1,7 @@ { "forge_marker": 1, "defaults": { + "model": "engineersdecor:wall/concrete_wall_default", "textures": { "wall": "engineersdecor:blocks/concrete/rebar_concrete_texture0", "particle": "engineersdecor:blocks/concrete/rebar_concrete_texture0" diff --git a/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_default.json b/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_default.json new file mode 100644 index 0000000..3e07444 --- /dev/null +++ b/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_default.json @@ -0,0 +1,9 @@ +{ + "textures": { + "wall": "engineersdecor:blocks/concrete/rebar_concrete_texture0", + "particle": "engineersdecor:blocks/concrete/rebar_concrete_texture0" + }, + "elements": [{ + "from": [7.9, 7.9, 7.9], "to": [8, 8, 8], "faces": { "down": {"texture": "#wall"} } + }] +} diff --git a/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_post.json b/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_post.json index e055ab7..d88fb8a 100644 --- a/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_post.json +++ b/src/main/resources/assets/engineersdecor/models/block/wall/concrete_wall_post.json @@ -1,7 +1,8 @@ { "credit": "I made this with the Blockbench", "textures": { - "wall": "engineersdecor:blocks/concrete/rebar_concrete_texture0" + "wall": "engineersdecor:blocks/concrete/rebar_concrete_texture0", + "particle": "engineersdecor:blocks/concrete/rebar_concrete_texture0" }, "elements": [ { From fe01dca8313067f09a7f6d1626d66a14374c0d42 Mon Sep 17 00:00:00 2001 From: stfwi Date: Sun, 24 Feb 2019 20:11:13 +0100 Subject: [PATCH 14/14] Release v1.0.0-mc1.12.2. --- Makefile | 6 +----- gradle.properties | 2 +- meta/update.json | 7 ++++--- readme.md | 4 ++++ scripts/sync-main-repo.js | 16 ++++++++++++++++ scripts/task-update-json.js | 2 +- 6 files changed, 27 insertions(+), 10 deletions(-) create mode 100644 scripts/sync-main-repo.js diff --git a/Makefile b/Makefile index 0393610..4594403 100644 --- a/Makefile +++ b/Makefile @@ -102,8 +102,4 @@ dist: sanatize dist-check clean-all mod # repository that you cloned. sync-main-repo: sanatize @echo "Synchronising to github repository working tree ..." - @cd ../engineersdecor-github; rm -rf build documentation gradle meta scripts src - @cd ../engineersdecor-github; rm -f .gitignore build.gradle gradle.properties gradlew gradlew.bat license Makefile readme.md - @cp -r documentation gradle meta scripts src ../engineersdecor-github/ - @cp .gitignore build.gradle gradle.properties gradlew gradlew.bat license Makefile readme.md ../engineersdecor-github/ - @cd ../engineersdecor-github; git status -s + @djs scripts/sync-main-repo.js diff --git a/gradle.properties b/gradle.properties index e36c4ee..af0c148 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.daemon=false org.gradle.jvmargs=-Xmx8G version_minecraft=1.12.2 version_forge=14.23.5.2768 -version_engineersdecor=1.0.0-b4 +version_engineersdecor=1.0.0 # # jar signing data loaded from signing.properties in the project root. # diff --git a/meta/update.json b/meta/update.json index d057ae1..3e4df43 100644 --- a/meta/update.json +++ b/meta/update.json @@ -1,13 +1,14 @@ { - "homepage": "https://www.curseforge.com/minecraft/mc-mods/redstone-gauges-and-switches/", + "homepage": "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/", "1.12.2": { + "1.0.0": "[R] Release based on v1.0.0-b4", "1.0.0-b4": "[F] Fixed vanished recipe for the rebar concrete wall.\n[A] Concrete wall, material: IE concrete.", "1.0.0-b3": "[A] Textures of rebar concrete and treated wood table improved.\n[A] Added rebar concrete wall.", "1.0.0-b2": "[A] Added rebar concrete (steel reinforced, expensive, creeper-proof).", "1.0.0-b1": "[A] Initial structure.\n[A] Added clinker bricks and clinker brick stairs.\n[A] Added slag bricks and slag brick stairs.\n[A] Added metal rung ladder.\n[A] Added staggered metal steps ladder.\n[A] Added treated wood ladder.\n[A] Added treated wood pole.\n[A] Added treated wood table." }, "promos": { - "1.12.2-recommended": "", - "1.12.2-latest": "1.0.0-b4" + "1.12.2-recommended": "1.0.0", + "1.12.2-latest": "1.0.0" } } \ No newline at end of file diff --git a/readme.md b/readme.md index b743e8f..2c045f4 100644 --- a/readme.md +++ b/readme.md @@ -73,6 +73,10 @@ More to come slowly but steadily. ---- ## Revision history + ------------------------------------------------------------------- + - v1.0.0 [R] Release based on v1.0.0-b4 + ------------------------------------------------------------------- + - v1.0.0-b4 [F] Fixed vanished recipe for the rebar concrete wall. [A] Concrete wall, material: IE concrete. diff --git a/scripts/sync-main-repo.js b/scripts/sync-main-repo.js new file mode 100644 index 0000000..5144f5d --- /dev/null +++ b/scripts/sync-main-repo.js @@ -0,0 +1,16 @@ +#!/usr/bin/djs +"use strict"; +const main_repo_local = fs.realpath("../engineersdecor-github"); +if((!fs.chdir(fs.dirname(fs.realpath(sys.script))+"/..")) || (!fs.isdir(".git"))) throw new Error("Failed to switch to mod source directory."); +const test_repo_local = fs.cwd(); +if(main_repo_local == "") throw new Error("Main repository (real) path not found."); +if(fs.realpath(main_repo_local) == fs.realpath(test_repo_local)) throw new Error("This is already the main repository"); +if((!fs.chdir(main_repo_local)) || (!fs.isdir(".git"))) throw new Error("Failed to switch to main repository directory."); +if(fs.cwd().search("-github") < 0) throw new Error("Main repository is missing the '*-github' tag in the path name."); +sys.shell("rm -rf build documentation gradle meta scripts src") +sys.shell("rm -f .gitignore build.gradle gradle.properties gradlew gradlew.bat license Makefile readme.md") +if((!fs.chdir(test_repo_local)) || (!fs.isdir(".git"))) throw new Error("Failed to switch to local dev directory."); +sys.shell("cp -r documentation gradle meta scripts src " + main_repo_local + "/") +sys.shell("cp .gitignore build.gradle gradle.properties gradlew gradlew.bat license Makefile readme.md " + main_repo_local + "/") +if((!fs.chdir(main_repo_local)) || (!fs.isdir(".git"))) throw new Error("Failed to switch to main repository directory."); +print(sys.shell("git status -s")) diff --git a/scripts/task-update-json.js b/scripts/task-update-json.js index b3624cd..9923852 100644 --- a/scripts/task-update-json.js +++ b/scripts/task-update-json.js @@ -54,7 +54,7 @@ for(var ver in history) { latest_beta=ver; break; } for(var ver in history) if(ver.search(/(rc|b|a)/) < 0) { latest_release=ver; break; } var update_json = { - homepage: "https://www.curseforge.com/minecraft/mc-mods/redstone-gauges-and-switches/", + homepage: "https://www.curseforge.com/minecraft/mc-mods/engineers-decor/", "1.12.2": history, promos: { "1.12.2-recommended": latest_release,