Browse Source

Build20181209

zry 5 years ago
parent
commit
703ccc2d9f
50 changed files with 2636 additions and 1 deletions
  1. 124 0
      .idea/uiDesigner.xml
  2. 6 0
      .idea/vcs.xml
  3. 3 1
      README.md
  4. 63 0
      build.gradle
  5. 3 0
      copy_for_test.bat
  6. 164 0
      gradlew
  7. 90 0
      gradlew.bat
  8. 52 0
      src/main/java/com/zjinja/mcmod/decor/ZJinJaDecoration.java
  9. 30 0
      src/main/java/com/zjinja/mcmod/decor/element_base/EBaseBlock.java
  10. 19 0
      src/main/java/com/zjinja/mcmod/decor/element_base/EBaseItem.java
  11. 125 0
      src/main/java/com/zjinja/mcmod/decor/element_base/EBaseTileBlock.java
  12. 16 0
      src/main/java/com/zjinja/mcmod/decor/element_base/EBaseTileRenderer.java
  13. 26 0
      src/main/java/com/zjinja/mcmod/decor/element_templates/renderer/TileRenderResourceSpecifiedRenderer.java
  14. 78 0
      src/main/java/com/zjinja/mcmod/decor/element_templates/renderer/WaveFrontRenderer.java
  15. 48 0
      src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_CellingLightLarge.java
  16. 48 0
      src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_FenceLightNormal.java
  17. 48 0
      src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_FenceLightTiny.java
  18. 78 0
      src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_FireHydrant.java
  19. 28 0
      src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_FireHydrantPole.java
  20. 48 0
      src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_FullSizeSign.java
  21. 49 0
      src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_H7FSign.java
  22. 82 0
      src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_H7FTDSignM.java
  23. 48 0
      src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_IronDrain.java
  24. 13 0
      src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_LogoBlock.java
  25. 48 0
      src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_MotooriKosuzu.java
  26. 48 0
      src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_PZ30.java
  27. 48 0
      src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_SiameseConnector.java
  28. 67 0
      src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_StaticSlaveBlock4Dir.java
  29. 49 0
      src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_Thick0202Sign.java
  30. 49 0
      src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_Thick0402Sign.java
  31. 6 0
      src/main/java/com/zjinja/mcmod/decor/elements/te/TE_H7FTDSignS.java
  32. 16 0
      src/main/java/com/zjinja/mcmod/decor/elements/te/TE_RenderResourceSpecifiedTileEntity.java
  33. 27 0
      src/main/java/com/zjinja/mcmod/decor/misc/ConfigLoader.java
  34. 80 0
      src/main/java/com/zjinja/mcmod/decor/misc/I18NHandler.java
  35. 43 0
      src/main/java/com/zjinja/mcmod/decor/misc/RenderResource.java
  36. 31 0
      src/main/java/com/zjinja/mcmod/decor/proxy/ClientProxy.java
  37. 34 0
      src/main/java/com/zjinja/mcmod/decor/proxy/CommonProxy.java
  38. 26 0
      src/main/java/com/zjinja/mcmod/decor/proxy/ServerProxy.java
  39. 109 0
      src/main/java/com/zjinja/mcmod/decor/registers/GeneralRegister.java
  40. 32 0
      src/main/java/com/zjinja/mcmod/decor/registers/TileEntityModelBinder.java
  41. 14 0
      src/main/java/com/zjinja/mcmod/decor/registers/UserBlockRegistry.java
  42. 12 0
      src/main/java/com/zjinja/mcmod/decor/registers/UserItemRegistry.java
  43. 65 0
      src/main/java/com/zjinja/mcmod/decor/registers/UserTileBlockRegistry.java
  44. 18 0
      src/main/java/com/zjinja/mcmod/decor/utils/model_dir_util/BoundingBoxVector.java
  45. 353 0
      src/main/java/com/zjinja/mcmod/decor/utils/model_dir_util/ModelDirectionUtil.java
  46. 31 0
      src/main/java/com/zjinja/mcmod/decor/utils/model_dir_util/OffsetVector.java
  47. 66 0
      src/main/java/com/zjinja/mcmod/decor/utils/model_dir_util/PlaceSideEnum.java
  48. 17 0
      src/main/java/com/zjinja/mcmod/decor/utils/model_dir_util/RotationVector.java
  49. 42 0
      src/main/resources/assets/zjinjadecoration/lang/zh_CN.lang
  50. 16 0
      src/main/resources/mcmod.info

+ 124 - 0
.idea/uiDesigner.xml

@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Palette2">
+    <group name="Swing">
+      <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
+      </item>
+      <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
+        <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
+        <initial-values>
+          <property name="text" value="Button" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="RadioButton" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="CheckBox" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="Label" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
+          <preferred-size width="-1" height="20" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
+      </item>
+    </group>
+  </component>
+</project>

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="" vcs="Git" />
+  </component>
+</project>

+ 3 - 1
README.md

@@ -1,3 +1,5 @@
 # ZJinJaDecoration
 
-参见http://office9.z-touhou.org/p/32/
+# 项目说明
+
+参见 http://office9.z-touhou.org/p/32/

+ 63 - 0
build.gradle

@@ -0,0 +1,63 @@
+buildscript {
+    repositories {
+        mavenCentral()
+        maven {
+            name = "forge"
+            url = "http://files.minecraftforge.net/maven"
+        }
+        maven {
+            name = "sonatype"
+            url = "https://oss.sonatype.org/content/repositories/snapshots/"
+        }
+    }
+    dependencies {
+        classpath 'net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT'
+    }
+}
+
+apply plugin: 'forge'
+
+version = "1.0"
+group= "com.zjinja.mcmod.decor" // http://maven.apache.org/guides/mini/guide-naming-conventions.html
+archivesBaseName = "zjinjadecoration"
+
+minecraft {
+    version = "1.7.10-10.13.4.1614-1.7.10"
+    runDir = "eclipse"
+}
+
+dependencies {
+    // you may put jars on which you depend on in ./libs
+    // or you may define them like so..
+    //compile "some.group:artifact:version:classifier"
+    //compile "some.group:artifact:version"
+      
+    // real examples
+    //compile 'com.mod-buildcraft:buildcraft:6.0.8:dev'  // adds buildcraft to the dev env
+    //compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env
+
+    // for more info...
+    // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html
+    // http://www.gradle.org/docs/current/userguide/dependency_management.html
+
+}
+
+processResources
+{
+    // this will ensure that this task is redone when the versions change.
+    inputs.property "version", project.version
+    inputs.property "mcversion", project.minecraft.version
+
+    // replace stuff in mcmod.info, nothing else
+    from(sourceSets.main.resources.srcDirs) {
+        include 'mcmod.info'
+                
+        // replace version and mcversion
+        expand 'version':project.version, 'mcversion':project.minecraft.version
+    }
+        
+    // copy everything else, thats not the mcmod.info
+    from(sourceSets.main.resources.srcDirs) {
+        exclude 'mcmod.info'
+    }
+}

+ 3 - 0
copy_for_test.bat

@@ -0,0 +1,3 @@
+del %MC_MOD_DEV_TESTCL%\.minecraft\mods\zjinjadecoration-*.jar
+copy %MC_MOD_DEV%\ZJinJaDecoration\build\libs\zjinjadecoration-*.jar %MC_MOD_DEV_TESTCL%\.minecraft\mods\zjinjadecoration-*.jar
+pause

+ 164 - 0
gradlew

@@ -0,0 +1,164 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# 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
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+esac
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched.
+if $cygwin ; then
+    [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+fi
+
+# 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\"`/" >&-
+APP_HOME="`pwd -P`"
+cd "$SAVED" >&-
+
+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" ] ; 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"`
+
+    # 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 "$@"

+ 90 - 0
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
+
+@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=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@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 Windowz 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

+ 52 - 0
src/main/java/com/zjinja/mcmod/decor/ZJinJaDecoration.java

@@ -0,0 +1,52 @@
+package com.zjinja.mcmod.decor;
+
+import com.zjinja.mcmod.decor.misc.ConfigLoader;
+import com.zjinja.mcmod.decor.misc.I18NHandler;
+import com.zjinja.mcmod.decor.proxy.CommonProxy;
+import cpw.mods.fml.common.Mod;
+import cpw.mods.fml.common.SidedProxy;
+import cpw.mods.fml.common.event.FMLInitializationEvent;
+import cpw.mods.fml.common.event.FMLPostInitializationEvent;
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import net.minecraft.server.management.ServerConfigurationManager;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+@Mod(modid = ZJinJaDecoration.MODID, version = ZJinJaDecoration.VERSION)
+public class ZJinJaDecoration {
+    @Mod.Instance("ZJinjaDecoration")
+    public static ZJinJaDecoration instance;
+    public static final String MODID = "zjinjadecoration";
+    public static final String VERSION = "1.0";
+    public static boolean DebugMode = true;
+    public static Logger logger = LogManager.getLogger(MODID);
+    public static I18NHandler I18N;
+
+    @SidedProxy(
+            clientSide = "com.zjinja.mcmod.decor.proxy.ClientProxy",
+            serverSide = "com.zjinja.mcmod.decor.proxy.ServerProxy"
+    )
+    public static CommonProxy proxy;
+
+    public static ZJinJaDecoration getInstance() {
+        return instance;
+    }
+
+    @Mod.EventHandler
+    public void preInit(FMLPreInitializationEvent event){
+        new ConfigLoader(event);
+        I18N = new I18NHandler(ConfigLoader.Conf.locale);
+        proxy.preInit(event);
+    }
+
+    @Mod.EventHandler
+    public void init(FMLInitializationEvent event){
+        proxy.init(event);
+    }
+
+    @Mod.EventHandler
+    public void postInit(FMLPostInitializationEvent event){
+        proxy.postInit(event);
+    }
+
+}

+ 30 - 0
src/main/java/com/zjinja/mcmod/decor/element_base/EBaseBlock.java

@@ -0,0 +1,30 @@
+package com.zjinja.mcmod.decor.element_base;
+
+import com.zjinja.mcmod.decor.ZJinJaDecoration;
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.creativetab.CreativeTabs;
+
+public class EBaseBlock extends Block {
+    public EBaseBlock(Material material) {
+        super(material);
+    }
+
+    public void Regist(String blockName, CreativeTabs creativeTabs[]){
+        setBlockName(blockName);
+        setBlockTextureName(ZJinJaDecoration.MODID + ":" + blockName.toLowerCase());
+        if(creativeTabs != null) {
+            for (CreativeTabs iv: creativeTabs) {
+                setCreativeTab(iv);
+            }
+        }
+    }
+
+    public void setBasicProperty(float hardness, float lightLevel, float resistance, SoundType stepSoundType){
+        setHardness(hardness);
+        setLightLevel(lightLevel);
+        setResistance(resistance);
+        setStepSound(stepSoundType);
+    }
+
+}

+ 19 - 0
src/main/java/com/zjinja/mcmod/decor/element_base/EBaseItem.java

@@ -0,0 +1,19 @@
+package com.zjinja.mcmod.decor.element_base;
+
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+
+public class EBaseItem extends Item {
+    public EBaseItem(){
+        super();
+    }
+
+    public void Regist(String name, CreativeTabs creativeTabs[]){
+        setUnlocalizedName(name);
+        if(creativeTabs != null) {
+            for (CreativeTabs iv: creativeTabs) {
+                setCreativeTab(iv);
+            }
+        }
+    }
+}

+ 125 - 0
src/main/java/com/zjinja/mcmod/decor/element_base/EBaseTileBlock.java

@@ -0,0 +1,125 @@
+package com.zjinja.mcmod.decor.element_base;
+
+import com.zjinja.mcmod.decor.ZJinJaDecoration;
+import com.zjinja.mcmod.decor.utils.model_dir_util.BoundingBoxVector;
+import com.zjinja.mcmod.decor.utils.model_dir_util.ModelDirectionUtil;
+import net.minecraft.block.Block;
+import net.minecraft.block.ITileEntityProvider;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.AxisAlignedBB;
+import net.minecraft.util.MovingObjectPosition;
+import net.minecraft.util.Vec3;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+
+public class EBaseTileBlock extends EBaseBlock implements ITileEntityProvider {
+    public Class<? extends TileEntity> TEClass;
+    public ModelDirectionUtil DirUtil;
+    public String TextureLocation = "";
+    public String IconLocation = "";
+
+    public EBaseTileBlock(Material material, Class<? extends TileEntity> teClass) {
+        super(material);
+        TEClass = teClass;
+        this.isBlockContainer = true;
+        DirUtil = new ModelDirectionUtil();
+    }
+
+    @Override
+    public void Regist(String blockName, CreativeTabs creativeTabs[]){
+        super.Regist(blockName, creativeTabs);
+        setIconLocation(blockName);
+        setTextureLocationLocation(blockName);
+    }
+
+    public boolean AutoBindRenderer() { return true; }
+
+    public TileEntitySpecialRenderer GetTileRenderer(){
+        return new EBaseTileRenderer();
+    }
+
+    protected void setTextureLocationLocation(String blockName){
+        this.TextureLocation = ZJinJaDecoration.MODID + ":" + blockName.toLowerCase();
+    }
+
+    protected void setIconLocation(String blockName){
+        this.IconLocation = ZJinJaDecoration.MODID + ":" + blockName.toLowerCase();
+    }
+
+    public TileEntity createNewTileEntity(World world, int meta) {
+        try {
+            return TEClass.newInstance();
+        } catch (InstantiationException e) {
+            return null;
+        } catch (IllegalAccessException e) {
+            return null;
+        }
+    }
+
+    @Override
+    public void registerBlockIcons(IIconRegister icon){
+        this.blockIcon = icon.registerIcon(this.IconLocation);
+    }
+
+    @Override
+    public int getRenderType() {return -1; }
+
+    @Override
+    public boolean isOpaqueCube() {return false; }
+
+    @Override
+    public boolean renderAsNormalBlock(){ return false;}
+
+    protected void setBoundsByMeta(int meta){
+        BoundingBoxVector bbv = DirUtil.GetAbsBoundingBoxByMeta(meta);
+        setBlockBounds(bbv.x1, bbv.y1, bbv.z1, bbv.x2, bbv.y2, bbv.z2);
+    }
+
+    @Override
+    public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z){
+        this.setBlockBoundsBasedOnState(world, x, y, z);
+        return AxisAlignedBB.getBoundingBox(
+                x + this.minX, y + this.minY, z + this.minZ,
+                x + this.maxX, y + this.maxY, z + this.maxZ
+        );
+    }
+
+    @Override
+    public MovingObjectPosition collisionRayTrace(World world, int x, int y, int z, Vec3 src, Vec3 dst){
+        this.setBlockBoundsBasedOnState(world, x, y, z);
+        return super.collisionRayTrace(world, x, y, z, src, dst);
+    }
+
+    @Override
+    public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z){
+        int meta = world.getBlockMetadata(x, y, z);
+        setBoundsByMeta(meta);
+    }
+
+    @Override
+    public void onBlockAdded(World world, int x, int y, int z){
+        super.onBlockAdded(world, x, y, z);
+    }
+
+    @Override
+    public void breakBlock(World world, int x, int y, int z, Block block, int flag){
+        super.breakBlock(world, x, y, z, block, flag);
+        world.removeTileEntity(x, y, z);
+    }
+
+    @Override
+    public boolean onBlockEventReceived(World world, int x, int y, int z, int i, int j){
+        super.onBlockEventReceived(world, x, y, z, i, j);
+        TileEntity tileEntity = world.getTileEntity(x, y, z);
+        if(tileEntity != null){
+            return tileEntity.receiveClientEvent(i, j);
+        }else {
+            return false;
+        }
+    }
+
+}

+ 16 - 0
src/main/java/com/zjinja/mcmod/decor/element_base/EBaseTileRenderer.java

@@ -0,0 +1,16 @@
+package com.zjinja.mcmod.decor.element_base;
+
+import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
+import net.minecraft.tileentity.TileEntity;
+
+public class EBaseTileRenderer extends TileEntitySpecialRenderer {
+
+    public EBaseTileRenderer(){
+
+    }
+
+    @Override
+    public void renderTileEntityAt(TileEntity p_147500_1_, double p_147500_2_, double p_147500_4_, double p_147500_6_, float p_147500_8_) {
+
+    }
+}

+ 26 - 0
src/main/java/com/zjinja/mcmod/decor/element_templates/renderer/TileRenderResourceSpecifiedRenderer.java

@@ -0,0 +1,26 @@
+package com.zjinja.mcmod.decor.element_templates.renderer;
+
+import com.zjinja.mcmod.decor.element_base.EBaseTileBlock;
+import com.zjinja.mcmod.decor.elements.te.TE_RenderResourceSpecifiedTileEntity;
+import net.minecraft.block.Block;
+import net.minecraft.client.Minecraft;
+import net.minecraft.tileentity.TileEntity;
+
+public class TileRenderResourceSpecifiedRenderer extends WaveFrontRenderer {
+
+    @Override
+    public void renderTileEntityAt(TileEntity te, double x, double y, double z, float scale){
+        preRender(x, y, z);
+        Block block = te.getWorldObj().getBlock(te.xCoord, te.yCoord, te.zCoord);
+        int meta = te.getWorldObj().getBlockMetadata(te.xCoord, te.yCoord, te.zCoord);
+        if(te instanceof TE_RenderResourceSpecifiedTileEntity){
+            TE_RenderResourceSpecifiedTileEntity ate = (TE_RenderResourceSpecifiedTileEntity) te;
+            if(block instanceof EBaseTileBlock){
+                EBaseTileBlock tileBlock = (EBaseTileBlock)block;
+                Minecraft.getMinecraft().getTextureManager().bindTexture(ate.RenderResouceData.Texture);
+                render(ate.RenderResouceData.Model, tileBlock, meta);
+            }
+        }
+        postRender();
+    }
+}

+ 78 - 0
src/main/java/com/zjinja/mcmod/decor/element_templates/renderer/WaveFrontRenderer.java

@@ -0,0 +1,78 @@
+package com.zjinja.mcmod.decor.element_templates.renderer;
+
+import com.zjinja.mcmod.decor.ZJinJaDecoration;
+import com.zjinja.mcmod.decor.element_base.EBaseTileBlock;
+import com.zjinja.mcmod.decor.element_base.EBaseTileRenderer;
+import net.minecraft.block.Block;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.RenderHelper;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.client.model.obj.WavefrontObject;
+import org.lwjgl.opengl.GL11;
+
+public class WaveFrontRenderer extends EBaseTileRenderer {
+    protected WavefrontObject WaveFrontModel;
+    protected ResourceLocation TextureRes;
+
+    public WaveFrontRenderer(){
+    }
+
+    public void LoadResources(String ObjLocation, String TextureLocation){
+        String modelloc = "models/blocks/" + ObjLocation + ".obj";
+        String textureloc = "textures/blocks/" + TextureLocation + ".png";
+        if(ZJinJaDecoration.DebugMode) {
+            ZJinJaDecoration.logger.warn("[Model Location] " + modelloc);
+            ZJinJaDecoration.logger.warn("[Texture Location] " + textureloc);
+        }
+        WaveFrontModel = new WavefrontObject(new ResourceLocation(ZJinJaDecoration.MODID, modelloc));
+        TextureRes = new ResourceLocation(ZJinJaDecoration.MODID, textureloc);
+    }
+
+    protected void preRender(double x, double y, double z){
+        GL11.glPushMatrix();
+
+        GL11.glTranslatef((float)x + 0.5F, (float)y + 0.5F, (float)z + 0.5F);
+        RenderHelper.disableStandardItemLighting();
+        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
+        GL11.glEnable(GL11.GL_BLEND);
+        GL11.glEnable(GL11.GL_CULL_FACE);
+
+        if(Minecraft.isAmbientOcclusionEnabled()){
+            GL11.glShadeModel(GL11.GL_SMOOTH);
+        }else {
+            GL11.glShadeModel(GL11.GL_FLAT);
+        }
+        Tessellator.instance.setColorOpaque_F(1.0F, 1.0F, 1.0F);
+    }
+
+    protected void render(WavefrontObject model,EBaseTileBlock tileBlock, int meta){
+        GL11.glPushMatrix();
+        GL11.glScalef(0.0625F, 0.0625F, 0.0625F);
+        tileBlock.DirUtil.GLTransformByMeta(meta);
+        model.renderAll();
+        GL11.glPopMatrix();
+        GL11.glPopMatrix();
+        GL11.glPopMatrix();
+        GL11.glPopMatrix();
+    }
+
+    protected void postRender(){
+        RenderHelper.enableStandardItemLighting();
+        GL11.glPopMatrix();
+    }
+
+    @Override
+    public void renderTileEntityAt(TileEntity te, double x, double y, double z, float scale){
+        preRender(x, y, z);
+        Block block = te.getWorldObj().getBlock(te.xCoord, te.yCoord, te.zCoord);
+        int meta = te.getWorldObj().getBlockMetadata(te.xCoord, te.yCoord, te.zCoord);
+        if(block instanceof EBaseTileBlock){
+            EBaseTileBlock tileBlock = (EBaseTileBlock)block;
+            Minecraft.getMinecraft().getTextureManager().bindTexture(TextureRes);
+            render(WaveFrontModel, tileBlock, meta);
+        }
+        postRender();
+    }
+}

+ 48 - 0
src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_CellingLightLarge.java

@@ -0,0 +1,48 @@
+package com.zjinja.mcmod.decor.elements.blocks;
+
+import com.zjinja.mcmod.decor.element_base.EBaseTileBlock;
+import com.zjinja.mcmod.decor.element_templates.renderer.TileRenderResourceSpecifiedRenderer;
+import com.zjinja.mcmod.decor.elements.te.TE_RenderResourceSpecifiedTileEntity;
+import com.zjinja.mcmod.decor.misc.RenderResource;
+import com.zjinja.mcmod.decor.utils.model_dir_util.BoundingBoxVector;
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+public class B_CellingLightLarge extends EBaseTileBlock {
+    private RenderResource RenderResourceData;
+
+    public B_CellingLightLarge() {
+        super(Material.wood, TE_RenderResourceSpecifiedTileEntity.class);
+        setBasicProperty(1.0F, 1.0F, 10.0F, Block.soundTypeGlass);
+        DirUtil.FastDefine_4Dir();
+        DirUtil.DefineRelBoundingBox(new BoundingBoxVector(0.0F, 0.875F, 0.0F, 1.0F, 1.0F, 1.0F));
+        RenderResourceData = new RenderResource();
+        RenderResourceData.LoadBlockResource("cellinglightlarge", "cellinglightlarge_tex");
+
+    }
+    @Override
+    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack){
+        DirUtil.FastPlaceConv_4Dir(world, x, y, z, player, itemStack);
+    }
+
+    @Override
+    public int onBlockPlaced(World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int smeta)
+    {
+        return side;
+    }
+
+    @Override
+    public TileEntitySpecialRenderer GetTileRenderer(){
+        return new TileRenderResourceSpecifiedRenderer();
+    }
+
+    @Override
+    public TileEntity createNewTileEntity(World world, int meta) {
+        return new TE_RenderResourceSpecifiedTileEntity(RenderResourceData);
+    }
+}

+ 48 - 0
src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_FenceLightNormal.java

@@ -0,0 +1,48 @@
+package com.zjinja.mcmod.decor.elements.blocks;
+
+import com.zjinja.mcmod.decor.element_base.EBaseTileBlock;
+import com.zjinja.mcmod.decor.element_templates.renderer.TileRenderResourceSpecifiedRenderer;
+import com.zjinja.mcmod.decor.elements.te.TE_RenderResourceSpecifiedTileEntity;
+import com.zjinja.mcmod.decor.misc.RenderResource;
+import com.zjinja.mcmod.decor.utils.model_dir_util.BoundingBoxVector;
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+public class B_FenceLightNormal extends EBaseTileBlock {
+    private RenderResource RenderResourceData;
+
+    public B_FenceLightNormal() {
+        super(Material.wood, TE_RenderResourceSpecifiedTileEntity.class);
+        setBasicProperty(2.0F, 1.0F, 2.0F, Block.soundTypeGlass);
+        DirUtil.FastDefine_4Dir();
+        DirUtil.DefineRelBoundingBox(new BoundingBoxVector(0.1875F, 0.0F, 0.1875F, 0.8125F, 0.9375F, 0.8125F));
+        RenderResourceData = new RenderResource();
+        RenderResourceData.LoadBlockResource("fencelightnormal", "fencelightnormal_tex");
+
+    }
+    @Override
+    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack){
+        DirUtil.FastPlaceConv_4Dir(world, x, y, z, player, itemStack);
+    }
+
+    @Override
+    public int onBlockPlaced(World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int smeta)
+    {
+        return side;
+    }
+
+    @Override
+    public TileEntitySpecialRenderer GetTileRenderer(){
+        return new TileRenderResourceSpecifiedRenderer();
+    }
+
+    @Override
+    public TileEntity createNewTileEntity(World world, int meta) {
+        return new TE_RenderResourceSpecifiedTileEntity(RenderResourceData);
+    }
+}

+ 48 - 0
src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_FenceLightTiny.java

@@ -0,0 +1,48 @@
+package com.zjinja.mcmod.decor.elements.blocks;
+
+import com.zjinja.mcmod.decor.element_base.EBaseTileBlock;
+import com.zjinja.mcmod.decor.element_templates.renderer.TileRenderResourceSpecifiedRenderer;
+import com.zjinja.mcmod.decor.elements.te.TE_RenderResourceSpecifiedTileEntity;
+import com.zjinja.mcmod.decor.misc.RenderResource;
+import com.zjinja.mcmod.decor.utils.model_dir_util.BoundingBoxVector;
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+public class B_FenceLightTiny extends EBaseTileBlock {
+    private RenderResource RenderResourceData;
+
+    public B_FenceLightTiny() {
+        super(Material.wood, TE_RenderResourceSpecifiedTileEntity.class);
+        setBasicProperty(2.0F, 1.0F, 2.0F, Block.soundTypeGlass);
+        DirUtil.FastDefine_4Dir();
+        DirUtil.DefineRelBoundingBox(new BoundingBoxVector(0.375F, 0.0F, 0.375F, 0.625F, 0.25F, 0.625F));
+        RenderResourceData = new RenderResource();
+        RenderResourceData.LoadBlockResource("fencelighttiny", "fencelighttiny_tex");
+
+    }
+    @Override
+    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack){
+        DirUtil.FastPlaceConv_4Dir(world, x, y, z, player, itemStack);
+    }
+
+    @Override
+    public int onBlockPlaced(World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int smeta)
+    {
+        return side;
+    }
+
+    @Override
+    public TileEntitySpecialRenderer GetTileRenderer(){
+        return new TileRenderResourceSpecifiedRenderer();
+    }
+
+    @Override
+    public TileEntity createNewTileEntity(World world, int meta) {
+        return new TE_RenderResourceSpecifiedTileEntity(RenderResourceData);
+    }
+}

+ 78 - 0
src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_FireHydrant.java

@@ -0,0 +1,78 @@
+package com.zjinja.mcmod.decor.elements.blocks;
+
+import com.zjinja.mcmod.decor.ZJinJaDecoration;
+import com.zjinja.mcmod.decor.element_base.EBaseTileBlock;
+import com.zjinja.mcmod.decor.element_templates.renderer.TileRenderResourceSpecifiedRenderer;
+import com.zjinja.mcmod.decor.elements.te.TE_RenderResourceSpecifiedTileEntity;
+import com.zjinja.mcmod.decor.misc.RenderResource;
+import com.zjinja.mcmod.decor.utils.model_dir_util.BoundingBoxVector;
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.world.World;
+
+public class B_FireHydrant extends EBaseTileBlock {
+    protected RenderResource RenderResourceData;
+
+    public B_FireHydrant() {
+        super(Material.wood, TE_RenderResourceSpecifiedTileEntity.class);
+        setBasicProperty(3.0F, 0.1F, 5.0F, Block.soundTypeMetal);
+        DirUtil.FastDefine_4Dir();
+        Init();
+
+    }
+
+    protected void Init(){
+        DirUtil.DefineRelBoundingBox(new BoundingBoxVector(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.0625F));
+        RenderResourceData = new RenderResource();
+        RenderResourceData.LoadBlockResource("firehydrant", "firehydrant_tex");
+    }
+
+    @Override
+    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack){
+        DirUtil.FastPlaceConv_4Dir(world, x, y, z, player, itemStack);
+    }
+
+    @Override
+    public int onBlockPlaced(World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int smeta)
+    {
+        return side;
+    }
+
+    @Override
+    public TileEntitySpecialRenderer GetTileRenderer(){
+        return new TileRenderResourceSpecifiedRenderer();
+    }
+
+    @Override
+    public TileEntity createNewTileEntity(World world, int meta) {
+        return new TE_RenderResourceSpecifiedTileEntity(RenderResourceData);
+    }
+
+    @Override
+    public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ)
+    {
+        world.extinguishFire(player,x,y,z,2);
+        ItemStack held = player.getHeldItem();
+        if(held == null){return false;}
+        if(held.isItemEqual(new ItemStack(Items.bucket,1))){
+            player.setCurrentItemOrArmor(0,new ItemStack(Items.water_bucket,1));
+            if(!world.isRemote){
+                player.addChatMessage(new ChatComponentText(ZJinJaDecoration.I18N.translateKey("cmsg.playerGetWaterFromFireHydrant")));
+            }
+        }else{
+            if(!world.isRemote) {
+                player.addChatMessage(new ChatComponentText(
+                        ZJinJaDecoration.I18N.translateKey("cmsg.playerNeedBucketToGetWaterFromFireHydrant")));
+
+            }
+        }
+        return true;
+    }
+}

+ 28 - 0
src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_FireHydrantPole.java

@@ -0,0 +1,28 @@
+package com.zjinja.mcmod.decor.elements.blocks;
+
+import com.zjinja.mcmod.decor.ZJinJaDecoration;
+import com.zjinja.mcmod.decor.element_base.EBaseTileBlock;
+import com.zjinja.mcmod.decor.element_templates.renderer.TileRenderResourceSpecifiedRenderer;
+import com.zjinja.mcmod.decor.elements.te.TE_RenderResourceSpecifiedTileEntity;
+import com.zjinja.mcmod.decor.misc.RenderResource;
+import com.zjinja.mcmod.decor.utils.model_dir_util.BoundingBoxVector;
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Items;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ChatComponentText;
+import net.minecraft.world.World;
+
+public class B_FireHydrantPole extends B_FireHydrant {
+
+    @Override
+    protected void Init(){
+        DirUtil.DefineRelBoundingBox(new BoundingBoxVector(0.25F, 0.0F, 0.3125F, 0.75F, 0.625F, 0.75F));
+        RenderResourceData = new RenderResource();
+        RenderResourceData.LoadBlockResource("firehydrantpole", "firehydrantpole_tex");
+    }
+}

+ 48 - 0
src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_FullSizeSign.java

@@ -0,0 +1,48 @@
+package com.zjinja.mcmod.decor.elements.blocks;
+
+import com.zjinja.mcmod.decor.element_base.EBaseTileBlock;
+import com.zjinja.mcmod.decor.element_templates.renderer.TileRenderResourceSpecifiedRenderer;
+import com.zjinja.mcmod.decor.elements.te.TE_RenderResourceSpecifiedTileEntity;
+import com.zjinja.mcmod.decor.misc.RenderResource;
+import com.zjinja.mcmod.decor.utils.model_dir_util.BoundingBoxVector;
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+public class B_FullSizeSign extends EBaseTileBlock {
+    private RenderResource RenderResourceData;
+
+    public B_FullSizeSign(String texture) {
+        super(Material.wood, TE_RenderResourceSpecifiedTileEntity.class);
+        setBasicProperty(2.0F, 0.0F, 10.0F, Block.soundTypeWood);
+        DirUtil.FastDefine_4Dir();
+        DirUtil.DefineRelBoundingBox(new BoundingBoxVector(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.0625F));
+        RenderResourceData = new RenderResource();
+        RenderResourceData.LoadBlockResource("fullsizesign", texture);
+
+    }
+    @Override
+    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack){
+        DirUtil.FastPlaceConv_4Dir(world, x, y, z, player, itemStack);
+    }
+
+    @Override
+    public int onBlockPlaced(World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int smeta)
+    {
+        return side;
+    }
+
+    @Override
+    public TileEntitySpecialRenderer GetTileRenderer(){
+        return new TileRenderResourceSpecifiedRenderer();
+    }
+
+    @Override
+    public TileEntity createNewTileEntity(World world, int meta) {
+        return new TE_RenderResourceSpecifiedTileEntity(RenderResourceData);
+    }
+}

+ 49 - 0
src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_H7FSign.java

@@ -0,0 +1,49 @@
+package com.zjinja.mcmod.decor.elements.blocks;
+
+import com.zjinja.mcmod.decor.element_base.EBaseTileBlock;
+import com.zjinja.mcmod.decor.element_templates.renderer.TileRenderResourceSpecifiedRenderer;
+import com.zjinja.mcmod.decor.elements.te.TE_RenderResourceSpecifiedTileEntity;
+import com.zjinja.mcmod.decor.misc.RenderResource;
+import com.zjinja.mcmod.decor.utils.model_dir_util.BoundingBoxVector;
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+public class B_H7FSign extends EBaseTileBlock {
+    private RenderResource RenderResourceData;
+
+    public B_H7FSign(String texture) {
+        super(Material.wood, TE_RenderResourceSpecifiedTileEntity.class);
+        setBasicProperty(2.0F, 0.0F, 10.0F, Block.soundTypeWood);
+        DirUtil.FastDefine_4Dir();
+        DirUtil.DefineRelBoundingBox(new BoundingBoxVector(0.0F, 0.25F, 0.0F, 1.0F, 0.6875F, 0.0625F));
+        RenderResourceData = new RenderResource();
+        RenderResourceData.LoadBlockResource("h7fsign", texture);
+
+    }
+
+    @Override
+    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack){
+        DirUtil.FastPlaceConv_4Dir(world, x, y, z, player, itemStack);
+    }
+
+    @Override
+    public int onBlockPlaced(World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int smeta)
+    {
+        return side;
+    }
+
+    @Override
+    public TileEntitySpecialRenderer GetTileRenderer(){
+        return new TileRenderResourceSpecifiedRenderer();
+    }
+
+    @Override
+    public TileEntity createNewTileEntity(World world, int meta) {
+        return new TE_RenderResourceSpecifiedTileEntity(RenderResourceData);
+    }
+}

+ 82 - 0
src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_H7FTDSignM.java

@@ -0,0 +1,82 @@
+package com.zjinja.mcmod.decor.elements.blocks;
+
+import com.zjinja.mcmod.decor.ZJinJaDecoration;
+import com.zjinja.mcmod.decor.element_base.EBaseTileBlock;
+import com.zjinja.mcmod.decor.element_templates.renderer.TileRenderResourceSpecifiedRenderer;
+import com.zjinja.mcmod.decor.elements.te.TE_RenderResourceSpecifiedTileEntity;
+import com.zjinja.mcmod.decor.misc.RenderResource;
+import com.zjinja.mcmod.decor.registers.GeneralRegister;
+import com.zjinja.mcmod.decor.utils.model_dir_util.BoundingBoxVector;
+import com.zjinja.mcmod.decor.utils.model_dir_util.OffsetVector;
+import com.zjinja.mcmod.decor.utils.model_dir_util.PlaceSideEnum;
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.texture.IIconRegister;
+import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+public class B_H7FTDSignM extends EBaseTileBlock {
+    private RenderResource RenderResourceData;
+
+    public B_H7FTDSignM(String texture) {
+        super(Material.wood, TE_RenderResourceSpecifiedTileEntity.class);
+        setBasicProperty(1.0F, 0.3F, 10.0F, Block.soundTypeGlass);
+        DirUtil.FastDefine_4Dir();
+        DirUtil.DefineRelBoundingBox(new BoundingBoxVector(0.5F, 0.25F, 0.0F, 1.0F, 0.6875F, 0.0625F));
+        RenderResourceData = new RenderResource();
+        RenderResourceData.LoadBlockResource("h7ftdsign", texture);
+
+    }
+
+    @Override
+    public boolean canPlaceBlockOnSide(World world, int x, int y, int z, int side){
+        if(side < 2) return false;
+        int meta = PlaceSideEnum.TransToRotation(PlaceSideEnum.valueOf(side));
+        OffsetVector ov = DirUtil.CalcOffsetFromRelOffset(meta, 1,0,0);
+        int nsx = x + ov.getIntX();
+        int nsy = y + ov.getIntY();
+        int nsz = z + ov.getIntZ();
+        return world.isAirBlock(nsx, nsy, nsz);
+    }
+
+    @Override
+    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack){
+        DirUtil.FastPlaceConv_4Dir(world, x, y, z, player, itemStack);
+        int meta = world.getBlockMetadata(x, y, z);
+        OffsetVector ov = DirUtil.CalcOffsetFromRelOffset(meta, 1,0,0);
+        int nsx = x + ov.getIntX();
+        int nsy = y + ov.getIntY();
+        int nsz = z + ov.getIntZ();
+        Block SlaveBlock = ZJinJaDecoration.proxy.Registry.GetBlockByName("h7ftdsigns");
+        world.setBlock(nsx, nsy, nsz, SlaveBlock, meta, 2);
+    }
+
+    @Override
+    public int onBlockPlaced(World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int smeta)
+    {
+        return side;
+    }
+
+    @Override
+    public TileEntitySpecialRenderer GetTileRenderer(){
+        return new TileRenderResourceSpecifiedRenderer();
+    }
+
+    @Override
+    public TileEntity createNewTileEntity(World world, int meta) {
+        return new TE_RenderResourceSpecifiedTileEntity(RenderResourceData);
+    }
+
+    @Override
+    public void breakBlock(World world, int x, int y, int z, Block block, int meta){
+        OffsetVector ov = DirUtil.CalcOffsetFromRelOffset(meta, 1,0,0);
+        int nsx = x + ov.getIntX();
+        int nsy = y + ov.getIntY();
+        int nsz = z + ov.getIntZ();
+        super.breakBlock(world, x, y, z,block, meta);
+        world.setBlockToAir(nsx, nsy, nsz);
+    }
+}

+ 48 - 0
src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_IronDrain.java

@@ -0,0 +1,48 @@
+package com.zjinja.mcmod.decor.elements.blocks;
+
+import com.zjinja.mcmod.decor.element_base.EBaseTileBlock;
+import com.zjinja.mcmod.decor.element_templates.renderer.TileRenderResourceSpecifiedRenderer;
+import com.zjinja.mcmod.decor.elements.te.TE_RenderResourceSpecifiedTileEntity;
+import com.zjinja.mcmod.decor.misc.RenderResource;
+import com.zjinja.mcmod.decor.utils.model_dir_util.BoundingBoxVector;
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+public class B_IronDrain extends EBaseTileBlock {
+    private RenderResource RenderResourceData;
+
+    public B_IronDrain() {
+        super(Material.wood, TE_RenderResourceSpecifiedTileEntity.class);
+        setBasicProperty(5.0F, 0.0F, 10.0F, Block.soundTypeMetal);
+        DirUtil.FastDefine_4Dir();
+        DirUtil.DefineRelBoundingBox(new BoundingBoxVector(0.0F, 0.9375F, 0.0F, 1.0F, 1.0F, 1.0F));
+        RenderResourceData = new RenderResource();
+        RenderResourceData.LoadBlockResource("irondrain", "ctex_ironbar");
+
+    }
+    @Override
+    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack){
+        DirUtil.FastPlaceConv_4Dir(world, x, y, z, player, itemStack);
+    }
+
+    @Override
+    public int onBlockPlaced(World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int smeta)
+    {
+        return side;
+    }
+
+    @Override
+    public TileEntitySpecialRenderer GetTileRenderer(){
+        return new TileRenderResourceSpecifiedRenderer();
+    }
+
+    @Override
+    public TileEntity createNewTileEntity(World world, int meta) {
+        return new TE_RenderResourceSpecifiedTileEntity(RenderResourceData);
+    }
+}

+ 13 - 0
src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_LogoBlock.java

@@ -0,0 +1,13 @@
+package com.zjinja.mcmod.decor.elements.blocks;
+
+import com.zjinja.mcmod.decor.element_base.EBaseBlock;
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+
+public class B_LogoBlock extends EBaseBlock {
+
+    public B_LogoBlock() {
+        super(Material.glass);
+        setBasicProperty(2.0F, 1.0F, 10.0F, Block.soundTypeGlass);
+    }
+}

+ 48 - 0
src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_MotooriKosuzu.java

@@ -0,0 +1,48 @@
+package com.zjinja.mcmod.decor.elements.blocks;
+
+import com.zjinja.mcmod.decor.element_base.EBaseTileBlock;
+import com.zjinja.mcmod.decor.element_templates.renderer.TileRenderResourceSpecifiedRenderer;
+import com.zjinja.mcmod.decor.elements.te.TE_RenderResourceSpecifiedTileEntity;
+import com.zjinja.mcmod.decor.misc.RenderResource;
+import com.zjinja.mcmod.decor.utils.model_dir_util.BoundingBoxVector;
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+public class B_MotooriKosuzu extends EBaseTileBlock {
+    private RenderResource RenderResourceData;
+
+    public B_MotooriKosuzu() {
+        super(Material.wood, TE_RenderResourceSpecifiedTileEntity.class);
+        setBasicProperty(1.0F, 1.0F, 10.0F, Block.soundTypeGlass);
+        DirUtil.FastDefine_4Dir();
+        DirUtil.DefineRelBoundingBox(new BoundingBoxVector(0.0F, 0.0F, 0.0F, 1.0F, 1.5F, 1.0F));
+        RenderResourceData = new RenderResource();
+        RenderResourceData.LoadBlockResource("motoorikosuzu", "motoorikosuzu_tex");
+
+    }
+    @Override
+    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack){
+        DirUtil.FastPlaceConv_4Dir(world, x, y, z, player, itemStack);
+    }
+
+    @Override
+    public int onBlockPlaced(World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int smeta)
+    {
+        return side;
+    }
+
+    @Override
+    public TileEntitySpecialRenderer GetTileRenderer(){
+        return new TileRenderResourceSpecifiedRenderer();
+    }
+
+    @Override
+    public TileEntity createNewTileEntity(World world, int meta) {
+        return new TE_RenderResourceSpecifiedTileEntity(RenderResourceData);
+    }
+}

+ 48 - 0
src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_PZ30.java

@@ -0,0 +1,48 @@
+package com.zjinja.mcmod.decor.elements.blocks;
+
+import com.zjinja.mcmod.decor.element_base.EBaseTileBlock;
+import com.zjinja.mcmod.decor.element_templates.renderer.TileRenderResourceSpecifiedRenderer;
+import com.zjinja.mcmod.decor.elements.te.TE_RenderResourceSpecifiedTileEntity;
+import com.zjinja.mcmod.decor.misc.RenderResource;
+import com.zjinja.mcmod.decor.utils.model_dir_util.BoundingBoxVector;
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+public class B_PZ30 extends EBaseTileBlock {
+    private RenderResource RenderResourceData;
+
+    public B_PZ30() {
+        super(Material.wood, TE_RenderResourceSpecifiedTileEntity.class);
+        setBasicProperty(5.0F, 0.0F, 10.0F, Block.soundTypeMetal);
+        DirUtil.FastDefine_4Dir();
+        DirUtil.DefineRelBoundingBox(new BoundingBoxVector(0.0F, 0.1875F, 0.0F, 1.0F, 0.8125F, 0.015625F));
+        RenderResourceData = new RenderResource();
+        RenderResourceData.LoadBlockResource("pz30", "pz30_tex");
+
+    }
+    @Override
+    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack){
+        DirUtil.FastPlaceConv_4Dir(world, x, y, z, player, itemStack);
+    }
+
+    @Override
+    public int onBlockPlaced(World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int smeta)
+    {
+        return side;
+    }
+
+    @Override
+    public TileEntitySpecialRenderer GetTileRenderer(){
+        return new TileRenderResourceSpecifiedRenderer();
+    }
+
+    @Override
+    public TileEntity createNewTileEntity(World world, int meta) {
+        return new TE_RenderResourceSpecifiedTileEntity(RenderResourceData);
+    }
+}

+ 48 - 0
src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_SiameseConnector.java

@@ -0,0 +1,48 @@
+package com.zjinja.mcmod.decor.elements.blocks;
+
+import com.zjinja.mcmod.decor.element_base.EBaseTileBlock;
+import com.zjinja.mcmod.decor.element_templates.renderer.TileRenderResourceSpecifiedRenderer;
+import com.zjinja.mcmod.decor.elements.te.TE_RenderResourceSpecifiedTileEntity;
+import com.zjinja.mcmod.decor.misc.RenderResource;
+import com.zjinja.mcmod.decor.utils.model_dir_util.BoundingBoxVector;
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+public class B_SiameseConnector extends EBaseTileBlock {
+    private RenderResource RenderResourceData;
+
+    public B_SiameseConnector() {
+        super(Material.wood, TE_RenderResourceSpecifiedTileEntity.class);
+        setBasicProperty(5.0F, 0.0F, 10.0F, Block.soundTypeMetal);
+        DirUtil.FastDefine_4Dir();
+        DirUtil.DefineRelBoundingBox(new BoundingBoxVector(0.1875F, 0.25F, 0.0F, 0.8125F, 0.8125F, 0.1875F));
+        RenderResourceData = new RenderResource();
+        RenderResourceData.LoadBlockResource("siameseconnector", "siameseconnector_tex");
+
+    }
+    @Override
+    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack){
+        DirUtil.FastPlaceConv_4Dir(world, x, y, z, player, itemStack);
+    }
+
+    @Override
+    public int onBlockPlaced(World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int smeta)
+    {
+        return side;
+    }
+
+    @Override
+    public TileEntitySpecialRenderer GetTileRenderer(){
+        return new TileRenderResourceSpecifiedRenderer();
+    }
+
+    @Override
+    public TileEntity createNewTileEntity(World world, int meta) {
+        return new TE_RenderResourceSpecifiedTileEntity(RenderResourceData);
+    }
+}

+ 67 - 0
src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_StaticSlaveBlock4Dir.java

@@ -0,0 +1,67 @@
+package com.zjinja.mcmod.decor.elements.blocks;
+
+import com.zjinja.mcmod.decor.ZJinJaDecoration;
+import com.zjinja.mcmod.decor.element_base.EBaseTileBlock;
+import com.zjinja.mcmod.decor.element_templates.renderer.TileRenderResourceSpecifiedRenderer;
+import com.zjinja.mcmod.decor.elements.te.TE_H7FTDSignS;
+import com.zjinja.mcmod.decor.elements.te.TE_RenderResourceSpecifiedTileEntity;
+import com.zjinja.mcmod.decor.misc.RenderResource;
+import com.zjinja.mcmod.decor.utils.model_dir_util.BoundingBoxVector;
+import com.zjinja.mcmod.decor.utils.model_dir_util.OffsetVector;
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+public class B_StaticSlaveBlock4Dir extends EBaseTileBlock {
+    private int OffsetX,OffsetY,OffsetZ;
+
+    public B_StaticSlaveBlock4Dir(BoundingBoxVector bbbox, float hardness, float lightLevel,
+                                  float resistance, SoundType soundType,
+                                  int offsetX, int offsetY, int offsetZ) {
+        super(Material.wood, TE_RenderResourceSpecifiedTileEntity.class);
+        setBasicProperty(hardness, lightLevel, resistance, soundType);
+        DirUtil.FastDefine_4Dir();
+        DirUtil.DefineRelBoundingBox(bbbox);
+        OffsetX = offsetX;
+        OffsetY = offsetY;
+        OffsetZ = offsetZ;
+    }
+
+    @Override
+    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack){
+        DirUtil.FastPlaceConv_4Dir(world, x, y, z, player, itemStack);
+    }
+
+    @Override
+    public int onBlockPlaced(World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int smeta)
+    {
+        return side;
+    }
+
+    @Override
+    public boolean AutoBindRenderer(){return false; }
+
+    @Override
+    public TileEntitySpecialRenderer GetTileRenderer(){
+        return null;
+    }
+
+    @Override
+    public TileEntity createNewTileEntity(World world, int meta) {
+        return new TE_H7FTDSignS();
+    }
+
+    @Override
+    public void breakBlock(World world, int x, int y, int z, Block block, int meta){
+        OffsetVector ov = DirUtil.CalcOffsetFromRelOffset(meta, OffsetX, OffsetY, OffsetZ);
+        int nsx = x + ov.getIntX();
+        int nsy = y + ov.getIntY();
+        int nsz = z + ov.getIntZ();
+        super.breakBlock(world, x, y, z,block, meta);
+        world.setBlockToAir(nsx, nsy, nsz);
+    }
+}

+ 49 - 0
src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_Thick0202Sign.java

@@ -0,0 +1,49 @@
+package com.zjinja.mcmod.decor.elements.blocks;
+
+import com.zjinja.mcmod.decor.element_base.EBaseTileBlock;
+import com.zjinja.mcmod.decor.element_templates.renderer.TileRenderResourceSpecifiedRenderer;
+import com.zjinja.mcmod.decor.elements.te.TE_RenderResourceSpecifiedTileEntity;
+import com.zjinja.mcmod.decor.misc.RenderResource;
+import com.zjinja.mcmod.decor.utils.model_dir_util.BoundingBoxVector;
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+public class B_Thick0202Sign extends EBaseTileBlock {
+    private RenderResource RenderResourceData;
+
+    public B_Thick0202Sign(String texture) {
+        super(Material.wood, TE_RenderResourceSpecifiedTileEntity.class);
+        setBasicProperty(2.0F, 0.0F, 10.0F, Block.soundTypeMetal);
+        DirUtil.FastDefine_4Dir();
+        DirUtil.DefineRelBoundingBox(new BoundingBoxVector(0.4375F, 0.4375F, 0.0F, 0.5625F, 0.5625F, 0.015625F));
+        RenderResourceData = new RenderResource();
+        RenderResourceData.LoadBlockResource("thick0202sign", texture);
+
+    }
+
+    @Override
+    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack){
+        DirUtil.FastPlaceConv_4Dir(world, x, y, z, player, itemStack);
+    }
+
+    @Override
+    public int onBlockPlaced(World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int smeta)
+    {
+        return side;
+    }
+
+    @Override
+    public TileEntitySpecialRenderer GetTileRenderer(){
+        return new TileRenderResourceSpecifiedRenderer();
+    }
+
+    @Override
+    public TileEntity createNewTileEntity(World world, int meta) {
+        return new TE_RenderResourceSpecifiedTileEntity(RenderResourceData);
+    }
+}

+ 49 - 0
src/main/java/com/zjinja/mcmod/decor/elements/blocks/B_Thick0402Sign.java

@@ -0,0 +1,49 @@
+package com.zjinja.mcmod.decor.elements.blocks;
+
+import com.zjinja.mcmod.decor.element_base.EBaseTileBlock;
+import com.zjinja.mcmod.decor.element_templates.renderer.TileRenderResourceSpecifiedRenderer;
+import com.zjinja.mcmod.decor.elements.te.TE_RenderResourceSpecifiedTileEntity;
+import com.zjinja.mcmod.decor.misc.RenderResource;
+import com.zjinja.mcmod.decor.utils.model_dir_util.BoundingBoxVector;
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.world.World;
+
+public class B_Thick0402Sign extends EBaseTileBlock {
+    private RenderResource RenderResourceData;
+
+    public B_Thick0402Sign(String texture) {
+        super(Material.wood, TE_RenderResourceSpecifiedTileEntity.class);
+        setBasicProperty(2.0F, 0.0F, 10.0F, Block.soundTypeMetal);
+        DirUtil.FastDefine_4Dir();
+        DirUtil.DefineRelBoundingBox(new BoundingBoxVector(0.375F, 0.4375F, 0.0F, 0.625F, 0.5625F, 0.015625F));
+        RenderResourceData = new RenderResource();
+        RenderResourceData.LoadBlockResource("thick0402sign", texture);
+
+    }
+
+    @Override
+    public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack){
+        DirUtil.FastPlaceConv_4Dir(world, x, y, z, player, itemStack);
+    }
+
+    @Override
+    public int onBlockPlaced(World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int smeta)
+    {
+        return side;
+    }
+
+    @Override
+    public TileEntitySpecialRenderer GetTileRenderer(){
+        return new TileRenderResourceSpecifiedRenderer();
+    }
+
+    @Override
+    public TileEntity createNewTileEntity(World world, int meta) {
+        return new TE_RenderResourceSpecifiedTileEntity(RenderResourceData);
+    }
+}

+ 6 - 0
src/main/java/com/zjinja/mcmod/decor/elements/te/TE_H7FTDSignS.java

@@ -0,0 +1,6 @@
+package com.zjinja.mcmod.decor.elements.te;
+
+import net.minecraft.tileentity.TileEntity;
+
+public class TE_H7FTDSignS extends TileEntity {
+}

+ 16 - 0
src/main/java/com/zjinja/mcmod/decor/elements/te/TE_RenderResourceSpecifiedTileEntity.java

@@ -0,0 +1,16 @@
+package com.zjinja.mcmod.decor.elements.te;
+
+import com.zjinja.mcmod.decor.ZJinJaDecoration;
+import com.zjinja.mcmod.decor.misc.RenderResource;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.client.model.obj.WavefrontObject;
+
+public class TE_RenderResourceSpecifiedTileEntity extends TileEntity {
+    public RenderResource RenderResouceData;
+
+    public TE_RenderResourceSpecifiedTileEntity(RenderResource renderResource){
+        super();
+        RenderResouceData = renderResource;
+    }
+}

+ 27 - 0
src/main/java/com/zjinja/mcmod/decor/misc/ConfigLoader.java

@@ -0,0 +1,27 @@
+package com.zjinja.mcmod.decor.misc;
+
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import net.minecraftforge.common.config.Configuration;
+
+public class ConfigLoader {
+
+    public static class ConfigInstance{
+        public boolean enableDebug;
+        public String locale;
+        public boolean enableNZEAPI;
+    }
+
+    public static ConfigInstance Conf;
+
+    public ConfigLoader(FMLPreInitializationEvent event){
+        Configuration config = new Configuration(event.getSuggestedConfigurationFile());
+        config.load();
+
+        Conf = new ConfigInstance();
+        Conf.enableDebug = config.get(Configuration.CATEGORY_GENERAL,"EnableDebug",false).getBoolean(false);
+        Conf.enableNZEAPI = config.get(Configuration.CATEGORY_GENERAL,"EnableNZEAPI",false).getBoolean(false);
+        Conf.locale = config.get(Configuration.CATEGORY_GENERAL,"Locale","zh_CN").getString();
+
+        config.save();
+    }
+}

+ 80 - 0
src/main/java/com/zjinja/mcmod/decor/misc/I18NHandler.java

@@ -0,0 +1,80 @@
+package com.zjinja.mcmod.decor.misc;
+
+import com.google.common.base.Splitter;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Maps;
+import com.zjinja.mcmod.decor.ZJinJaDecoration;
+import net.minecraft.util.StringTranslate;
+import org.apache.commons.io.Charsets;
+import org.apache.commons.io.IOUtils;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.IllegalFormatException;
+import java.util.Iterator;
+import java.util.regex.Pattern;
+
+public class I18NHandler {
+    private static final Splitter equalSignSplitter = Splitter.on('=').limit(2);
+    private static final Pattern numericVariablePattern = Pattern.compile("%(\\d+\\$)?[\\d\\.]*[df]");
+    private HashMap<String,String> table = Maps.newHashMap();
+
+    public I18NHandler(String locale){
+        try {
+            InputStream is = StringTranslate.class.getResourceAsStream(
+                    String.format("/serverside/%s/i18n/%s.lang", ZJinJaDecoration.MODID, locale)
+            );
+            Iterator iterator = IOUtils.readLines(is, Charsets.UTF_8).iterator();
+            while (iterator.hasNext())
+            {
+                String s = (String)iterator.next();
+                if (!s.isEmpty() && s.charAt(0) != '#')
+                {
+                    String[] astring = (String[]) Iterables.toArray(equalSignSplitter.split(s), String.class);
+
+                    if (astring != null && astring.length == 2)
+                    {
+                        String s1 = astring[0];
+                        String s2 = numericVariablePattern.matcher(astring[1]).replaceAll("%$1s");
+                        table.put(s1, s2);
+                    }
+                }
+            }
+            ZJinJaDecoration.logger.info(String.format("[zjinjadecoration-I18N] %d Locale Dictionary Items Loaded.\n",table.size()));
+        }catch (IOException e){
+            ZJinJaDecoration.logger.error(String.format("[zjinjadecoration] Error: Failed Load I18N Locale Resource: '%s'.\n",locale));
+            e.printStackTrace();
+        }
+    }
+
+    private String tryTranslateKey(String key)
+    {
+        String s1 = this.table.get(key);
+        return s1 == null ? key : s1;
+    }
+
+    public synchronized boolean containsTranslateKey(String key)
+    {
+        return this.table.containsKey(key);
+    }
+
+    public synchronized String translateKeyFormat(String key, Object ... param)
+    {
+        String s1 = this.tryTranslateKey(key);
+
+        try
+        {
+            return String.format(s1, param);
+        }
+        catch (IllegalFormatException illegalformatexception)
+        {
+            return "Format error: " + s1;
+        }
+    }
+
+    public synchronized String translateKey(String key)
+    {
+        return this.tryTranslateKey(key);
+    }
+}

+ 43 - 0
src/main/java/com/zjinja/mcmod/decor/misc/RenderResource.java

@@ -0,0 +1,43 @@
+package com.zjinja.mcmod.decor.misc;
+
+import com.zjinja.mcmod.decor.ZJinJaDecoration;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.client.model.obj.WavefrontObject;
+
+public class RenderResource {
+    public WavefrontObject Model;
+    public ResourceLocation Texture;
+
+    public RenderResource(WavefrontObject model, ResourceLocation texture){
+        Model = model;
+        Texture = texture;
+    }
+
+    public RenderResource(String ModelPath, String TexturePath){
+        LoadResource(ModelPath, TexturePath);
+    }
+
+    public RenderResource(){
+        Model = null;
+        Texture = null;
+    }
+
+    public void LoadResource(String ModelPath, String TexturePath){
+        Model = new WavefrontObject(new ResourceLocation(ZJinJaDecoration.MODID, ModelPath));
+        Texture = new ResourceLocation(ZJinJaDecoration.MODID, TexturePath);
+    }
+
+    public void LoadBlockResource(String ModelName, String TextureName){
+        String modelloc = "models/blocks/" + ModelName + ".obj";
+        String textureloc = "textures/blocks/" + TextureName + ".png";
+        if(ZJinJaDecoration.DebugMode) {
+            ZJinJaDecoration.logger.warn("[Model Location] " + modelloc);
+            ZJinJaDecoration.logger.warn("[Texture Location] " + textureloc);
+        }
+        LoadResource(modelloc, textureloc);
+    }
+
+    public void LoadBlockResource(String BlockName){
+        LoadBlockResource(BlockName, BlockName);
+    }
+}

+ 31 - 0
src/main/java/com/zjinja/mcmod/decor/proxy/ClientProxy.java

@@ -0,0 +1,31 @@
+package com.zjinja.mcmod.decor.proxy;
+
+import com.zjinja.mcmod.decor.ZJinJaDecoration;
+import com.zjinja.mcmod.decor.registers.TileEntityModelBinder;
+import cpw.mods.fml.common.event.FMLInitializationEvent;
+import cpw.mods.fml.common.event.FMLPostInitializationEvent;
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+
+public class ClientProxy extends CommonProxy {
+    private TileEntityModelBinder tileEntityModelBinder;
+
+    @Override
+    public void preInit(FMLPreInitializationEvent event){
+        super.preInit(event);
+    }
+
+    @Override
+    public void init(FMLInitializationEvent event){
+        super.init(event);
+        if(ZJinJaDecoration.DebugMode){
+            ZJinJaDecoration.logger.warn("ClientProxy Init Event.");
+        }
+        tileEntityModelBinder = new TileEntityModelBinder();
+        tileEntityModelBinder.AutoBind();
+    }
+
+    @Override
+    public void postInit(FMLPostInitializationEvent event){
+        super.postInit(event);
+    }
+}

+ 34 - 0
src/main/java/com/zjinja/mcmod/decor/proxy/CommonProxy.java

@@ -0,0 +1,34 @@
+package com.zjinja.mcmod.decor.proxy;
+
+import com.zjinja.mcmod.decor.registers.GeneralRegister;
+import cpw.mods.fml.common.event.FMLInitializationEvent;
+import cpw.mods.fml.common.event.FMLPostInitializationEvent;
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+
+public class CommonProxy {
+    public GeneralRegister Registry;
+
+    public void preInit(FMLPreInitializationEvent event)
+    {
+        Registry = new GeneralRegister(event);
+        /*
+        new NetworkWrapper(event);
+        new CreativeTabLoader(event);
+        new ItemLoader(event);
+        new BlockLoader(event);
+        */
+    }
+
+    public void init(FMLInitializationEvent event)
+    {
+        /*
+        new TileEntityLoader(event);
+        new EntityLoader(event);
+        EventRegister.registerCommon();
+        */
+    }
+
+    public void postInit(FMLPostInitializationEvent event)
+    {
+    }
+}

+ 26 - 0
src/main/java/com/zjinja/mcmod/decor/proxy/ServerProxy.java

@@ -0,0 +1,26 @@
+package com.zjinja.mcmod.decor.proxy;
+
+import com.zjinja.mcmod.decor.ZJinJaDecoration;
+import com.zjinja.mcmod.decor.misc.I18NHandler;
+import cpw.mods.fml.common.event.FMLInitializationEvent;
+import cpw.mods.fml.common.event.FMLPostInitializationEvent;
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import net.minecraft.client.Minecraft;
+
+public class ServerProxy extends CommonProxy {
+    @Override
+    public void preInit(FMLPreInitializationEvent event){
+        super.preInit(event);
+    }
+
+    @Override
+    public void init(FMLInitializationEvent event){
+        super.init(event);
+    }
+
+    @Override
+    public void postInit(FMLPostInitializationEvent event){
+        super.postInit(event);
+    }
+}
+

+ 109 - 0
src/main/java/com/zjinja/mcmod/decor/registers/GeneralRegister.java

@@ -0,0 +1,109 @@
+package com.zjinja.mcmod.decor.registers;
+
+import com.zjinja.mcmod.decor.ZJinJaDecoration;
+import com.zjinja.mcmod.decor.element_base.EBaseBlock;
+import com.zjinja.mcmod.decor.element_base.EBaseItem;
+import com.zjinja.mcmod.decor.element_base.EBaseTileBlock;
+import cpw.mods.fml.common.event.FMLPreInitializationEvent;
+import cpw.mods.fml.common.registry.GameRegistry;
+import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.item.Item;
+
+import java.util.HashMap;
+
+public class GeneralRegister {
+    public static CreativeTabs tabZJinJaDecoration;
+    private HashMap<String, EBaseBlock> BlockList = new HashMap<String, EBaseBlock>();
+    private HashMap<String, EBaseTileBlock> TileBlockList = new HashMap<String, EBaseTileBlock>();
+    private HashMap<String, EBaseItem> ItemList = new HashMap<String, EBaseItem>();
+
+    public GeneralRegister(FMLPreInitializationEvent preInitializationEvent){
+        tabZJinJaDecoration = new CreativeTabs("tabZJinJaDecoration") {
+            @Override
+            public Item getTabIconItem() {
+                return Item.getItemFromBlock(ZJinJaDecoration.proxy.Registry.BlockList.get("logoblock"));
+            }
+        };
+        UserBlockRegistry ubr = new UserBlockRegistry(this);
+        UserTileBlockRegistry utbr = new UserTileBlockRegistry(this);
+        UserItemRegistry uir = new UserItemRegistry(this);
+        uir.Regist();
+        utbr.Regist();
+        ubr.Regist();
+    }
+
+    public EBaseBlock GetBlockByName(String name){
+        if(BlockList.containsKey(name)){
+            return BlockList.get(name);
+        }else {
+            if (TileBlockList.containsKey(name)){
+                return  TileBlockList.get(name);
+            }else {
+                return null;
+            }
+        }
+    }
+
+    public EBaseTileBlock GetTileBlockByName(String name){
+        if(TileBlockList.containsKey(name)){
+            return TileBlockList.get(name);
+        }else {
+            return null;
+        }
+    }
+
+    public EBaseItem GetItemByName(String name){
+        if(ItemList.containsKey(name)){
+            return ItemList.get(name);
+        }else {
+            return null;
+        }
+    }
+
+    public HashMap<String, EBaseTileBlock> GetTileBlockList(){
+        return TileBlockList;
+    }
+
+    public void RegistItem(EBaseItem item, String Name, CreativeTabs creativeTabs[]){
+        ItemList.put(Name.toLowerCase(), item);
+        item.Regist(Name.toLowerCase(), creativeTabs);
+        GameRegistry.registerItem(item, Name.toLowerCase());
+    }
+
+    public void RegistItem(EBaseItem item, String Name, CreativeTabs creativeTabs){
+        RegistItem(item, Name, new CreativeTabs[]{creativeTabs});
+    }
+
+    public void RegistItem(EBaseItem item, String Name){
+        RegistItem(item, Name, (CreativeTabs[]) null);
+    }
+
+    public void RegistBlock(EBaseBlock block, String Name, CreativeTabs creativeTabs[]){
+        BlockList.put(Name.toLowerCase(), block);
+        block.Regist(Name.toLowerCase(), creativeTabs);
+        GameRegistry.registerBlock(block, Name.toLowerCase());
+    }
+
+    public void RegistBlock(EBaseBlock block, String Name){
+        RegistBlock(block, Name, (CreativeTabs[])null);
+    }
+
+    public void RegistBlock(EBaseBlock block, String Name, CreativeTabs creativeTabs){
+        RegistBlock(block, Name, new CreativeTabs[]{creativeTabs});
+    }
+
+    public void RegistTileBlock(EBaseTileBlock tileBlock, String Name, CreativeTabs creativeTabs[]){
+        TileBlockList.put(Name.toLowerCase(), tileBlock);
+        tileBlock.Regist(Name.toLowerCase(), creativeTabs);
+        GameRegistry.registerBlock(tileBlock, Name.toLowerCase());
+        GameRegistry.registerTileEntity(tileBlock.TEClass, "tile" + Name.toLowerCase());
+    }
+
+    public void RegistTileBlock(EBaseTileBlock tileBlock, String Name, CreativeTabs creativeTabs){
+        RegistTileBlock(tileBlock, Name, new CreativeTabs[]{creativeTabs});
+    }
+
+    public void RegistTileBlock(EBaseTileBlock tileBlock, String Name) {
+        RegistTileBlock(tileBlock, Name, (CreativeTabs[])null);
+    }
+}

+ 32 - 0
src/main/java/com/zjinja/mcmod/decor/registers/TileEntityModelBinder.java

@@ -0,0 +1,32 @@
+package com.zjinja.mcmod.decor.registers;
+
+import com.zjinja.mcmod.decor.ZJinJaDecoration;
+import com.zjinja.mcmod.decor.element_base.EBaseTileBlock;
+import cpw.mods.fml.client.registry.ClientRegistry;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class TileEntityModelBinder {
+    public TileEntityModelBinder(){
+
+    }
+
+    public void AutoBind(){
+        HashMap<String, EBaseTileBlock> TileList = ZJinJaDecoration.proxy.Registry.GetTileBlockList();
+        if(ZJinJaDecoration.DebugMode){
+            ZJinJaDecoration.logger.warn("Auto TileRenderer Binding Loop...");
+        }
+        for (Map.Entry<String, EBaseTileBlock> iv : TileList.entrySet()) {
+            if (iv.getValue().AutoBindRenderer()) {
+                if(ZJinJaDecoration.DebugMode){
+                    ZJinJaDecoration.logger.warn("[AutoTileRendererBind] " + iv.getKey());
+                }
+                ClientRegistry.bindTileEntitySpecialRenderer(
+                        iv.getValue().TEClass,
+                        iv.getValue().GetTileRenderer()
+                );
+            }
+        }
+    }
+}

+ 14 - 0
src/main/java/com/zjinja/mcmod/decor/registers/UserBlockRegistry.java

@@ -0,0 +1,14 @@
+package com.zjinja.mcmod.decor.registers;
+
+import com.zjinja.mcmod.decor.elements.blocks.B_LogoBlock;
+
+public class UserBlockRegistry {
+    private GeneralRegister gr;
+    public UserBlockRegistry(GeneralRegister generalRegister){
+        gr = generalRegister;
+    }
+
+    public void Regist(){
+        gr.RegistBlock(new B_LogoBlock(), "logoblock", GeneralRegister.tabZJinJaDecoration);
+    }
+}

+ 12 - 0
src/main/java/com/zjinja/mcmod/decor/registers/UserItemRegistry.java

@@ -0,0 +1,12 @@
+package com.zjinja.mcmod.decor.registers;
+
+public class UserItemRegistry {
+    private GeneralRegister gr;
+    public UserItemRegistry(GeneralRegister generalRegister){
+        gr = generalRegister;
+    }
+
+    public void Regist(){
+
+    }
+}

+ 65 - 0
src/main/java/com/zjinja/mcmod/decor/registers/UserTileBlockRegistry.java

@@ -0,0 +1,65 @@
+package com.zjinja.mcmod.decor.registers;
+
+import com.zjinja.mcmod.decor.elements.blocks.*;
+import com.zjinja.mcmod.decor.utils.model_dir_util.BoundingBoxVector;
+import net.minecraft.block.Block;
+
+public class UserTileBlockRegistry {
+    private GeneralRegister gr;
+    public UserTileBlockRegistry(GeneralRegister generalRegister){
+        gr = generalRegister;
+    }
+
+    public void Regist(){
+        gr.RegistTileBlock(new B_FullSizeSign("logosign"), "logosign", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_FullSizeSign("funnyface"), "funnyface", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_FullSizeSign("zryavanta"), "zryavanta");
+        gr.RegistTileBlock(new B_FullSizeSign("radiationhazard"), "radiationhazard", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_FullSizeSign("helmet"), "helmet", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_FullSizeSign("fallingobj"), "fallingobj", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_FullSizeSign("staffonly"), "staffonly", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_FullSizeSign("elecshock"), "elecshock", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_FullSizeSign("nosmoking"), "nosmoking", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_FullSizeSign("parkinglot"), "parkinglot", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_FullSizeSign("touhoupp"), "touhoupp", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_FullSizeSign("vault"), "vault", GeneralRegister.tabZJinJaDecoration);
+
+        gr.RegistTileBlock(new B_H7FSign("toiletclosersign"), "toiletclosersign", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_H7FSign("toiletdissign"), "toiletdissign", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_H7FSign("toiletfemalesign"), "toiletfemalesign", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_H7FSign("toiletflushsign"), "toiletflushsign", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_H7FSign("toiletmalesign"), "toiletmalesign", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_H7FSign("toiletsign"), "toiletsign", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_H7FSign("toilettransgdsign"), "toilettransgdsign", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_H7FSign("babycare"), "babycare", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_H7FSign("exitsignstd"), "exitsignstd", GeneralRegister.tabZJinJaDecoration);
+
+        gr.RegistTileBlock(new B_StaticSlaveBlock4Dir(
+                new BoundingBoxVector(0.0F, 0.25F, 0.0F, 0.5F, 0.6875F, 0.0625F),
+                1.0F, 0.3F, 10.0F, Block.soundTypeGlass,
+                -1,0,0
+        ), "h7ftdsigns");
+
+        gr.RegistTileBlock(new B_H7FTDSignM("exitsignstd"), "exitsignstdtd", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_H7FTDSignM("toiletdissign"), "toiletdissigntd", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_H7FTDSignM("toiletfemalesign"), "toiletfemalesigntd", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_H7FTDSignM("toiletmalesign"), "toiletmalesigntd", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_H7FTDSignM("toiletsign"), "toiletsigntd", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_H7FTDSignM("toilettransgdsign"), "toilettransgdsigntd", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_H7FTDSignM("babycare"), "babycaretd", GeneralRegister.tabZJinJaDecoration);
+
+        gr.RegistTileBlock(new B_CellingLightLarge(), "cellinglightlarge", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_MotooriKosuzu(), "motoorikosuzu", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_FireHydrant(), "firehydrant", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_FireHydrantPole(), "firehydrantpole", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_IronDrain(), "irondrain", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_SiameseConnector(), "siameseconnector", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_PZ30(), "pz30", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_FenceLightNormal(), "fencelightnormal", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_FenceLightTiny(), "fencelighttiny", GeneralRegister.tabZJinJaDecoration);
+
+        gr.RegistTileBlock(new B_Thick0202Sign("lpgndtestpoint_tex"), "lpgndtestpoint", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_Thick0202Sign("socket4p25a_tex"), "socket4p25a", GeneralRegister.tabZJinJaDecoration);
+        gr.RegistTileBlock(new B_Thick0402Sign("equipotentialtermsmall_tex"), "equipotentialtermsmall", GeneralRegister.tabZJinJaDecoration);
+    }
+}

+ 18 - 0
src/main/java/com/zjinja/mcmod/decor/utils/model_dir_util/BoundingBoxVector.java

@@ -0,0 +1,18 @@
+package com.zjinja.mcmod.decor.utils.model_dir_util;
+
+public class BoundingBoxVector {
+    public float x1,y1,z1,x2,y2,z2;
+
+    public BoundingBoxVector(float _x1, float _y1, float _z1, float _x2, float _y2, float _z2){
+        x1 = _x1;
+        y1 = _y1;
+        z1 = _z1;
+        x2 = _x2;
+        y2 = _y2;
+        z2 = _z2;
+    }
+
+    public BoundingBoxVector(){
+        this(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
+    }
+}

+ 353 - 0
src/main/java/com/zjinja/mcmod/decor/utils/model_dir_util/ModelDirectionUtil.java

@@ -0,0 +1,353 @@
+package com.zjinja.mcmod.decor.utils.model_dir_util;
+
+import com.zjinja.mcmod.decor.ZJinJaDecoration;
+import net.minecraft.entity.EntityLivingBase;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.MathHelper;
+import net.minecraft.util.Vec3;
+import net.minecraft.world.World;
+import org.lwjgl.opengl.GL11;
+
+public class ModelDirectionUtil {
+    public RotationVector RotationMetaTable[];
+    public BoundingBoxVector RelBoundingBox;
+    public BoundingBoxVector AbsBoundingBoxMetaTable[];
+
+    public ModelDirectionUtil(){
+        RotationMetaTable = new RotationVector[16];
+        for(int i = 0; i < 16; i++){
+            RotationMetaTable[i] = new RotationVector();
+        }
+        RelBoundingBox = new BoundingBoxVector();
+        AbsBoundingBoxMetaTable = new BoundingBoxVector[16];
+        for(int i = 0; i < 16; i++){
+            AbsBoundingBoxMetaTable[i] = new BoundingBoxVector();
+        }
+    }
+
+    public void DefineMetaRotation(int Meta, RotationVector rv){
+        int index = Meta % 16;
+        RotationMetaTable[index] = rv;
+    }
+
+    public void DefineRelBoundingBox(BoundingBoxVector rbbv){
+        RelBoundingBox = rbbv;
+        for(int i = 0; i < 16; i++){
+            AbsBoundingBoxMetaTable[i] = CalcMetaBoundingBoxTableItem(i);
+        }
+    }
+
+    public RotationVector GetRotationByMeta(int meta){
+        int rmeta = meta % 16;
+        RotationVector rrv = RotationMetaTable[rmeta];
+        return rrv;
+    }
+
+    private BoundingBoxVector CalcMetaBoundingBoxTableItem(int meta){
+        RotationVector rrv = GetRotationByMeta(meta);
+        int rx,ry,rz;
+        float tx1,tx2,ty1,ty2,tz1,tz2;
+        float ux1,ux2,uy1,uy2,uz1,uz2;
+        rx = rrv.RotateX % 4;
+        ry = rrv.RotateY % 4;
+        rz = rrv.RotateZ % 4;
+
+        if(ZJinJaDecoration.DebugMode){
+            ZJinJaDecoration.logger.warn(
+                    String.format("Rotation @ Meta=%d: (%d,%d,%d)",
+                            meta, rx, ry, rz
+                    )
+            );
+        }
+
+        // Coordinate Transformation Before Rotation
+        tx1 = RelBoundingBox.x1 - 0.5F;
+        tx2 = RelBoundingBox.x2 - 0.5F;
+        ty1 = RelBoundingBox.y1 - 0.5F;
+        ty2 = RelBoundingBox.y2 - 0.5F;
+        tz1 = RelBoundingBox.z1 - 0.5F;
+        tz2 = RelBoundingBox.z2 - 0.5F;
+
+        if(ZJinJaDecoration.DebugMode){
+            ZJinJaDecoration.logger.warn(
+                    String.format("Coordinate Transformation: Meta=%d: Pos1=(%f,%f,%f), Pos2=(%f,%f,%f)",
+                            meta, tx1, ty1, tz1, tx2, ty2, tz2
+                    )
+            );
+        }
+
+        //Rotating X Axis
+        switch (rx){
+            default:
+                ux1 = tx1;
+                ux2 = tx2;
+                uy1 = ty1;
+                uy2 = ty2;
+                uz1 = tz1;
+                uz2 = tz2;
+                break;
+            case 1:
+                ux1 = tx1;
+                ux2 = tx2;
+                uy1 = -tz1;
+                uy2 = -tz2;
+                uz1 = ty1;
+                uz2 = ty2;
+                break;
+            case 2:
+                ux1 = tx1;
+                ux2 = tx2;
+                uy1 = -ty1;
+                uy2 = -ty2;
+                uz1 = -tz1;
+                uz2 = -tz2;
+                break;
+            case 3:
+                ux1 = tx1;
+                ux2 = tx2;
+                uy1 = tz1;
+                uy2 = tz2;
+                uz1 = -ty1;
+                uz2 = -ty2;
+                break;
+        }
+
+        if(ZJinJaDecoration.DebugMode){
+            ZJinJaDecoration.logger.warn(
+                    String.format("After X Axis Trans: Meta=%d: Pos1=(%f,%f,%f), Pos2=(%f,%f,%f)",
+                            meta, ux1, uy1, uz1, ux2, uy2, uz2
+                    )
+            );
+        }
+        //Rotating Y Axis
+        switch (ry){
+            default:
+                tx1 = ux1;
+                tx2 = ux2;
+                ty1 = uy1;
+                ty2 = uy2;
+                tz1 = uz1;
+                tz2 = uz2;
+                break;
+            case 1:
+                tx1 = -uz1;
+                tx2 = -uz2;
+                ty1 = uy1;
+                ty2 = uy2;
+                tz1 = ux1;
+                tz2 = ux2;
+                break;
+            case 2:
+                tx1 = -ux1;
+                tx2 = -ux2;
+                ty1 = uy1;
+                ty2 = uy2;
+                tz1 = -uz1;
+                tz2 = -uz2;
+                break;
+            case 3:
+                tx1 = uz1;
+                tx2 = uz2;
+                ty1 = uy1;
+                ty2 = uy2;
+                tz1 = -ux1;
+                tz2 = -ux2;
+                break;
+        }
+        if(ZJinJaDecoration.DebugMode){
+            ZJinJaDecoration.logger.warn(
+                    String.format("After Y Axis Trans: Meta=%d: Pos1=(%f,%f,%f), Pos2=(%f,%f,%f)",
+                            meta, tx1, ty1, tz1, tx2, ty2, tz2
+                    )
+            );
+        }
+        //Rotating Z Axis
+        switch (rz){
+            default:
+                ux1 = tx1;
+                ux2 = tx2;
+                uy1 = ty1;
+                uy2 = ty2;
+                uz1 = tz1;
+                uz2 = tz2;
+                break;
+            case 1:
+                ux1 = -ty1;
+                ux2 = -ty2;
+                uy1 = tx1;
+                uy2 = tx2;
+                uz1 = tz1;
+                uz2 = tz2;
+                break;
+            case 2:
+                ux1 = -tx1;
+                ux2 = -tx2;
+                uy1 = -ty1;
+                uy2 = -ty2;
+                uz1 = tz1;
+                uz2 = tz2;
+                break;
+            case 3:
+                ux1 = ty1;
+                ux2 = ty2;
+                uy1 = -tx1;
+                uy2 = -tx2;
+                uz1 = tz1;
+                uz2 = tz2;
+                break;
+        }
+        if(ZJinJaDecoration.DebugMode){
+            ZJinJaDecoration.logger.warn(
+                    String.format("After Z Axis Trans: Meta=%d: Pos1=(%f,%f,%f), Pos2=(%f,%f,%f)",
+                            meta, ux1, uy1, uz1, ux2, uy2, uz2
+                    )
+            );
+        }
+        float minx,miny,minz,maxx,maxy,maxz;
+        minx = Math.min(ux1 + 0.5F, ux2 + 0.5F);
+        maxx = Math.max(ux1 + 0.5F, ux2 + 0.5F);
+        miny = Math.min(uy1 + 0.5F, uy2 + 0.5F);
+        maxy = Math.max(uy1 + 0.5F, uy2 + 0.5F);
+        minz = Math.min(uz1 + 0.5F, uz2 + 0.5F);
+        maxz = Math.max(uz1 + 0.5F, uz2 + 0.5F);
+        // Coordinate Transformation After Rotation
+        BoundingBoxVector abbv = new BoundingBoxVector(minx, miny, minz, maxx, maxy, maxz);
+        if(ZJinJaDecoration.DebugMode){
+            ZJinJaDecoration.logger.warn(
+                    String.format("BoundingBox @ Meta=%d: Pos1=(%f,%f,%f), Pos2=(%f,%f,%f)",
+                            meta, minx, miny, minz, maxx, maxy, maxz)
+            );
+        }
+        return abbv;
+    }
+
+    public BoundingBoxVector GetAbsBoundingBoxByMeta(int meta){
+        int rmeta = meta % 16;
+        return AbsBoundingBoxMetaTable[rmeta];
+    }
+
+    public void GLTransformByMeta(int meta){
+        RotationVector rv = GetRotationByMeta(meta);
+        float ax,ay,az;
+        ax = rv.RotateX % 4 * 90.0F;
+        ay = rv.RotateY % 4 * 90.0F;
+        az = rv.RotateZ % 4 * 90.0F;
+        GL11.glPushMatrix();
+        GL11.glRotatef(ax, -1.0F, 0.0F, 0.0F);
+        GL11.glPushMatrix();
+        GL11.glRotatef(ay, 0.0F, -1.0F, 0.0F);
+        GL11.glPushMatrix();
+        GL11.glRotatef(az, 0.0F, 0.0F, -1.0F);
+    }
+
+    public OffsetVector CalcOffsetFromRelOffset(int meta, float OffsetX, float OffsetY, float OffsetZ){
+        RotationVector rrv = GetRotationByMeta(meta);
+        int rx,ry,rz;
+        float tx,ty,tz, ux, uy, uz;
+        rx = rrv.RotateX % 4;
+        ry = rrv.RotateY % 4;
+        rz = rrv.RotateZ % 4;
+
+        //Rotating X Axis
+        switch (rx){
+            default:
+                ux = OffsetX;
+                uy = OffsetY;
+                uz = OffsetZ;
+                break;
+            case 1:
+                ux = OffsetX;
+                uy = -OffsetZ;
+                uz = OffsetY;
+                break;
+            case 2:
+                ux = OffsetX;
+                uy = -OffsetY;
+                uz = -OffsetZ;
+                break;
+            case 3:
+                ux = OffsetX;
+                uy = OffsetZ;
+                uz = -OffsetY;
+                break;
+        }
+
+        //Rotating Y Axis
+        switch (ry){
+            default:
+                tx = ux;
+                ty = uy;
+                tz = uz;
+                break;
+            case 1:
+                tx = -uz;
+                ty = uy;
+                tz = ux;
+                break;
+            case 2:
+                tx = -ux;
+                ty = uy;
+                tz = -uz;
+                break;
+            case 3:
+                tx = uz;
+                ty = uy;
+                tz = -ux;
+                break;
+        }
+        //Rotating Z Axis
+        switch (rz){
+            default:
+                ux = tx;
+                uy = ty;
+                uz = tz;
+                break;
+            case 1:
+                ux = -ty;
+                uy = tx;
+                uz = tz;
+                break;
+            case 2:
+                ux = -tx;
+                uy = -ty;
+                uz = tz;
+                break;
+            case 3:
+                ux = ty;
+                uy = -tx;
+                uz = tz;
+                break;
+        }
+        return new OffsetVector(ux, uy, uz);
+    }
+
+    public void FastDefine_4Dir(){
+        DefineMetaRotation(0, new RotationVector(0,0,0));
+        DefineMetaRotation(1, new RotationVector(0,1,0));
+        DefineMetaRotation(2, new RotationVector(0,2,0));
+        DefineMetaRotation(3, new RotationVector(0,3,0));
+        DefineMetaRotation(4, new RotationVector(0,0,0));
+        DefineMetaRotation(5, new RotationVector(0,1,0));
+        DefineMetaRotation(6, new RotationVector(0,2,0));
+        DefineMetaRotation(7, new RotationVector(0,3,0));
+        DefineMetaRotation(8, new RotationVector(0,0,0));
+        DefineMetaRotation(9, new RotationVector(0,1,0));
+        DefineMetaRotation(10, new RotationVector(0,2,0));
+        DefineMetaRotation(11, new RotationVector(0,3,0));
+        DefineMetaRotation(12, new RotationVector(0,0,0));
+        DefineMetaRotation(13, new RotationVector(0,1,0));
+        DefineMetaRotation(14, new RotationVector(0,2,0));
+        DefineMetaRotation(15, new RotationVector(0,3,0));
+    }
+
+    public void FastPlaceConv_4Dir(World world, int x, int y, int z, EntityLivingBase player, ItemStack itemStack){
+        int side = world.getBlockMetadata(x, y, z);
+        int l = MathHelper.floor_double((double)(player.rotationYaw * 4.0F / 360.0F) + 0.5D) & 3;
+        int ro = PlaceSideEnum.TransToRotation(PlaceSideEnum.valueOf(side));
+        if(ro == -1){
+            ro = PlaceSideEnum.TransToRotation(PlaceSideEnum.fromYaw(l));
+        }
+        world.setBlockMetadataWithNotify(x, y, z, ro, 2);
+    }
+
+}

+ 31 - 0
src/main/java/com/zjinja/mcmod/decor/utils/model_dir_util/OffsetVector.java

@@ -0,0 +1,31 @@
+package com.zjinja.mcmod.decor.utils.model_dir_util;
+
+import net.minecraft.util.MathHelper;
+
+public class OffsetVector {
+    public float X = 0.0F;
+    public float Y = 0.0F;
+    public float Z = 0.0F;
+
+    public OffsetVector(float rx, float ry, float rz){
+        X = rx;
+        Y = ry;
+        Z = rz;
+    }
+
+    public OffsetVector(){
+        this(0, 0, 0);
+    }
+
+    public int getIntX(){
+        return MathHelper.floor_float(X);
+    }
+
+    public int getIntY(){
+        return MathHelper.floor_float(Y);
+    }
+
+    public int getIntZ(){
+        return MathHelper.floor_float(Z);
+    }
+}

+ 66 - 0
src/main/java/com/zjinja/mcmod/decor/utils/model_dir_util/PlaceSideEnum.java

@@ -0,0 +1,66 @@
+package com.zjinja.mcmod.decor.utils.model_dir_util;
+
+public enum PlaceSideEnum {
+    FaceToSky(0),
+    FaceToGround(1),
+    FaceToSouth(2),
+    FaceToNorth(3),
+    FaceToEast(4),
+    FaceToWest(5);
+
+    private int value;
+
+    private PlaceSideEnum(int value) {     //必须是private的,否则编译错误
+        this.value = value;
+    }
+
+    public static PlaceSideEnum valueOf(int value) {
+        switch (value) {
+            case 0:
+                return FaceToSky;
+            case 1:
+                return FaceToGround;
+            case 2:
+                return FaceToSouth;
+            case 3:
+                return FaceToNorth;
+            case 4:
+                return FaceToEast;
+            case 5:
+                return FaceToWest;
+            default:
+                return FaceToSky;
+        }
+    }
+
+    public static PlaceSideEnum fromYaw(int yaw){
+        switch (yaw % 4){
+            case 0:
+                return FaceToSouth;
+            case 1:
+                return FaceToWest;
+            case 2:
+                return FaceToNorth;
+            case 3:
+                return FaceToEast;
+            default:
+                return FaceToSky;
+        }
+    }
+
+    public static int TransToRotation(PlaceSideEnum pse){
+        switch (pse){
+            case FaceToNorth:
+                return 0;
+            case FaceToEast:
+                return 1;
+            case FaceToSouth:
+                return 2;
+            case FaceToWest:
+                return 3;
+            default:
+                return -1;
+        }
+    }
+
+}

+ 17 - 0
src/main/java/com/zjinja/mcmod/decor/utils/model_dir_util/RotationVector.java

@@ -0,0 +1,17 @@
+package com.zjinja.mcmod.decor.utils.model_dir_util;
+
+public class RotationVector {
+    public int RotateX = 0;
+    public int RotateY = 0;
+    public int RotateZ = 0;
+
+    public RotationVector(int rx, int ry, int rz){
+        RotateX = rx % 4;
+        RotateY = ry % 4;
+        RotateZ = rz % 4;
+    }
+
+    public RotationVector(){
+        this(0, 0, 0);
+    }
+}

+ 42 - 0
src/main/resources/assets/zjinjadecoration/lang/zh_CN.lang

@@ -0,0 +1,42 @@
+itemGroup.tabZJinJaDecoration=Z神社新装潢
+tile.logoblock.name=Z神社新装潢Logo方块
+tile.logosign.name=Z神社新装潢Logo指示牌
+tile.funnyface.name=滑稽指示牌
+tile.zryavanta.name=ZRY头像指示牌
+tile.radiationhazard.name=电离辐射危险指示牌
+tile.helmet.name=请佩戴安全帽标志牌
+tile.fallingobj.name=当心落物标志牌
+tile.staffonly.name=非工作人员禁止入内指示牌
+tile.elecshock.name=当心触电指示牌
+tile.nosmoking.name=严禁烟火指示牌
+tile.parkinglot.name=停车场指示牌
+tile.touhoupp.name=P点(东方)
+tile.vault.name=应急掩蔽场所
+tile.toiletclosersign.name=向前一小步文明一大步标志牌
+tile.toiletdissign.name=无障碍卫生间标志牌
+tile.toiletfemalesign.name=女卫生间标志牌
+tile.toiletflushsign.name=来也匆匆去也冲冲标志牌
+tile.toiletmalesign.name=男卫生间标志牌
+tile.toiletsign.name=洗手间标志牌
+tile.toilettransgdsign.name=跨性别卫生间标志牌
+tile.babycare.name=母婴卫生间标志牌
+tile.cellinglightlarge.name=大号吸顶灯
+tile.motoorikosuzu.name=防撞桶
+tile.firehydrant.name=消火栓
+tile.exitsignstd.name=安全出口标志
+tile.exitsignstdtd.name=双开门安全出口标志
+tile.toiletdissigntd.name=双开门无障碍卫生间标志牌
+tile.toiletfemalesigntd.name=双开门女卫生间标志牌
+tile.toiletmalesigntd.name=双开门男卫生间标志牌
+tile.toiletsigntd.name=双开门洗手间标志牌
+tile.toilettransgdsigntd.name=双开门跨性别卫生间标志牌
+tile.babycaretd.name=双开门母婴卫生间标志牌
+tile.irondrain.name=铁质下水道格栅
+tile.firehydrantpole.name=路边消防栓
+tile.siameseconnector.name=消防水泵接合器
+tile.lpgndtestpoint.name=防雷接地测试点
+tile.equipotentialtermsmall.name=等电位端子联结盒
+tile.equipotentialterm.name=等电位端子联结箱
+tile.pz30.name=PZ-30照明配电箱
+tile.fencelightnormal.name=栏杆灯
+tile.fencelighttiny.name=栅栏小灯

+ 16 - 0
src/main/resources/mcmod.info

@@ -0,0 +1,16 @@
+[
+{
+  "modid": "zjinjadecoration",
+  "name": "ZJinJaDecoration",
+  "description": "Mod For Building Decorating.",
+  "version": "${version}",
+  "mcversion": "${mcversion}",
+  "url": "http://mcmod.zjinja.com/zjinjadecoration/",
+  "updateUrl": "",
+  "authorList": ["ZRY"],
+  "credits": "Powered By ZRY. Special thanks: NSDN, NSMC.",
+  "logoFile": "assets/logo.png",
+  "screenshots": [],
+  "dependencies": []
+}
+]