4 Commits
Author SHA1 Message Date
chylex cfab626586 Add README 2023-01-17 03:05:20 +01:00
chylex cc6e26152d Add .gitignore and .gitattributes 2023-01-17 02:41:52 +01:00
chylex cc299af6b8 Add Gradle 7.5.1 wrapper 2023-01-17 02:31:58 +01:00
chylex 8cb7d6f973 Initial commit 2023-01-17 02:30:39 +01:00
1514 changed files with 227 additions and 61461 deletions
+1
View File
@@ -0,0 +1 @@
* text=auto eol=lf
+7 -18
View File
@@ -1,28 +1,17 @@
# gradle
/.gradle/
build/
# idea # idea
out /.idea/
*.ipr
*.iws
*.iml
.idea/gradle.xml
.idea/tasks.xml
.idea/workspace.xml
.idea/codeStyles
.idea/libraries
# eclipse # eclipse
bin /bin/
*.launch *.launch
.settings .settings
.metadata .metadata
.classpath .classpath
.project .project
# gradle
build
.gradle
# game # game
run/* /run/
!run/*.ps1
-40
View File
@@ -1,40 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaProjectCodeInsightSettings">
<excluded-names>
<name>akka</name>
<name>com.ibm</name>
<name>com.sun</name>
<name>java.awt</name>
<name>java.beans</name>
<name>java.rmi</name>
<name>javafx</name>
<name>javax.rmi</name>
<name>javax.swing</name>
<name>javax.xml</name>
<name>jdk.internal</name>
<name>net.java.games.input.Component.Identifier.Key</name>
<name>net.minecraft.init.Blocks</name>
<name>net.minecraft.init.Items</name>
<name>net.minecraft.init.MobEffects</name>
<name>net.minecraft.init.PotionTypes</name>
<name>net.minecraft.init.SoundEvents</name>
<name>net.minecraft.util.EnumActionResult</name>
<name>net.minecraft.util.EnumFacing</name>
<name>net.minecraft.util.EnumHand</name>
<name>net.minecraft.world.EnumDifficulty</name>
<name>net.minecraftforge.fml.common.Mod.EventBusSubscriber</name>
<name>net.minecraftforge.fml.common.eventhandler.Event</name>
<name>net.minecraftforge.fml.common.eventhandler.EventPriority</name>
<name>net.minecraftforge.fml.common.eventhandler.SubscribeEvent</name>
<name>net.minecraftforge.fml.relauncher.Side</name>
<name>net.minecraftforge.fml.relauncher.SideOnly</name>
<name>org.ietf</name>
<name>org.omg</name>
<name>org.w3c</name>
<name>org.xml</name>
<name>scala</name>
<name>sun</name>
</excluded-names>
</component>
</project>
-10
View File
@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="1.8">
<module name="Hardcore-Ender-Expansion-2.api" target="1.8" />
<module name="Hardcore-Ender-Expansion-2.main" target="1.8" />
<module name="Hardcore-Ender-Expansion-2.test" target="1.8" />
</bytecodeTargetLevel>
</component>
</project>
-6
View File
@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" defaultCharsetForPropertiesFiles="UTF-8">
<file url="PROJECT" charset="UTF-8" />
</component>
</project>
-22
View File
@@ -1,22 +0,0 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="CascadeIf" enabled="false" level="INFO" enabled_by_default="false" />
<inspection_tool class="ClassName" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<option name="namePattern" value="[A-Z][_A-Za-z\d]*" />
</inspection_tool>
<inspection_tool class="FoldInitializerAndIfToElvis" enabled="false" level="INFO" enabled_by_default="false" />
<inspection_tool class="FunctionName" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<option name="namePattern" value="([A-Za-z][A-Za-z\d]*)|([A-Z][_A-Z\d]*)" />
</inspection_tool>
<inspection_tool class="RedundantSuppression" enabled="true" level="WARNING" enabled_by_default="true">
<option name="IGNORE_ALL" value="true" />
</inspection_tool>
<inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
<option name="processCode" value="true" />
<option name="processLiterals" value="true" />
<option name="processComments" value="true" />
</inspection_tool>
<inspection_tool class="UnusedProperty" enabled="false" level="WARNING" enabled_by_default="false" />
</profile>
</component>
-10
View File
@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Kotlin2JsCompilerArguments">
<option name="sourceMapEmbedSources" />
<option name="sourceMapPrefix" />
</component>
<component name="Kotlin2JvmCompilerArguments">
<option name="jvmTarget" value="1.8" />
</component>
</project>
-41
View File
@@ -1,41 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="EntryPointsManager">
<list size="6">
<item index="0" class="java.lang.String" itemvalue="net.minecraftforge.fml.common.Mod" />
<item index="1" class="java.lang.String" itemvalue="net.minecraftforge.fml.common.Mod.EventBusSubscriber" />
<item index="2" class="java.lang.String" itemvalue="net.minecraftforge.fml.common.Mod.EventHandler" />
<item index="3" class="java.lang.String" itemvalue="net.minecraftforge.fml.common.eventhandler.SubscribeEvent" />
<item index="4" class="java.lang.String" itemvalue="net.minecraftforge.fml.common.network.NetworkCheckHandler" />
<item index="5" class="java.lang.String" itemvalue="net.minecraftforge.fml.relauncher.IFMLLoadingPlugin.Name" />
</list>
</component>
<component name="NullableNotNullManager">
<option name="myDefaultNullable" value="javax.annotation.Nullable" />
<option name="myDefaultNotNull" value="javax.annotation.Nonnull" />
<option name="myNullables">
<value>
<list size="5">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
<item index="2" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" />
<item index="3" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
<item index="4" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
</list>
</value>
</option>
<option name="myNotNulls">
<value>
<list size="4">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
</list>
</value>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="false" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/bin" />
</component>
</project>
-11
View File
@@ -1,11 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/modules/Hardcore-Ender-Expansion-2.iml" filepath="$PROJECT_DIR$/.idea/modules/Hardcore-Ender-Expansion-2.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/Hardcore-Ender-Expansion-2.api.iml" filepath="$PROJECT_DIR$/.idea/modules/Hardcore-Ender-Expansion-2.api.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/Hardcore-Ender-Expansion-2.main.iml" filepath="$PROJECT_DIR$/.idea/modules/Hardcore-Ender-Expansion-2.main.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/Hardcore-Ender-Expansion-2.test.iml" filepath="$PROJECT_DIR$/.idea/modules/Hardcore-Ender-Expansion-2.test.iml" />
</modules>
</component>
</project>
-15
View File
@@ -1,15 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Minecraft Client" type="Application" factoryName="Application" singleton="true">
<option name="MAIN_CLASS_NAME" value="GradleStart" />
<module name="Hardcore-Ender-Expansion-2.main" />
<option name="PROGRAM_PARAMETERS" value="--username Player" />
<option name="VM_PARAMETERS" value="-Dhee.debug -Dfml.coreMods.load=chylex.hee.system.core.CoremodPlugin -XX:HotswapDeoptClassPath='chylex.,net.,com.sun.proxy.$Proxy,sun.reflect.Generated'" />
<option name="WORKING_DIRECTORY" value="./run" />
<extension enabled="false" name="coverage" runner="idea" sample_coverage="true" />
<RunnerSettings RunnerId="Run" />
<ConfigurationWrapper RunnerId="Run" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>
-14
View File
@@ -1,14 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Minecraft Server" type="Application" factoryName="Application" singleton="true">
<option name="MAIN_CLASS_NAME" value="GradleStartServer" />
<module name="Hardcore-Ender-Expansion-2.main" />
<option name="VM_PARAMETERS" value="-Dhee.debug -Dfml.coreMods.load=chylex.hee.system.core.CoremodPlugin -XX:HotswapDeoptClassPath='chylex.,net.,com.sun.proxy.$Proxy,sun.reflect.Generated'" />
<option name="WORKING_DIRECTORY" value="./run" />
<extension enabled="false" name="coverage" runner="idea" sample_coverage="true" />
<RunnerSettings RunnerId="Run" />
<ConfigurationWrapper RunnerId="Run" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>
-14
View File
@@ -1,14 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Unit Tests" type="JUnit" factoryName="JUnit" singleton="true">
<module name="Hardcore-Ender-Expansion-2_test" />
<option name="PACKAGE_NAME" value="chylex.hee.test" />
<option name="MAIN_CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="package" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="./run" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>
-18
View File
@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Statistic">
<option name="fileTypes" value="cfg;info;md" />
<option name="separateTabsFileTypes" value="java;json;kt;lang;mcmeta;py" />
<option name="excludedDirectories">
<list>
<option value="$PROJECT_DIR$/.gradle" />
<option value="$PROJECT_DIR$/gradle" />
<option value="$PROJECT_DIR$/.idea" />
<option value="$PROJECT_DIR$/run" />
<option value="$PROJECT_DIR$/bin" />
<option value="$PROJECT_DIR$/assets" />
<option value="$PROJECT_DIR$/build" />
</list>
</option>
</component>
</project>
+1
View File
@@ -1,2 +1,3 @@
# Hardcore Ender Expansion 2 # Hardcore Ender Expansion 2
Work in progress. PRs will not be accepted before release. Work in progress. PRs will not be accepted before release.
Binary file not shown.
Binary file not shown.
-1
View File
@@ -1 +0,0 @@
{"meta":{"format_version":"3.0","model_format":"modded_entity","box_uv":true},"name":"ender_eye","geo_name":"EnderEye","resolution":{"width":128,"height":64},"elements":[{"name":"head","from":[-9,0,-9],"to":[9,18,9],"autouv":0,"color":6,"origin":[0,0.5,0],"uuid":"fb9acb7e-e386-2daf-51e7-e487f7edb51e"},{"name":"eye","from":[-8,1,-9],"to":[8,17,-8],"autouv":0,"color":5,"origin":[0,0,0],"uv_offset":[15,47],"uuid":"0f34925f-0ce7-73d1-b6bc-3ebc6b954619"},{"name":"left","from":[9,-17,-2],"to":[12,10,1],"autouv":0,"color":3,"origin":[0,0,0],"uv_offset":[73,0],"uuid":"683a14b0-c7d3-ee33-e790-ec456d2eafa1"},{"name":"right","from":[-12,-17,-2],"to":[-9,10,1],"autouv":0,"color":6,"shade":false,"origin":[0,0,0],"uv_offset":[73,0],"uuid":"edc957d9-62dd-52d4-82a3-9db5f0f81fee"}],"outliner":[{"name":"head","uuid":"2a0767df-d550-08ea-5bef-585cc941b58f","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[0,9,0],"children":["fb9acb7e-e386-2daf-51e7-e487f7edb51e"]},{"name":"eye","uuid":"3ed25df7-6cab-0a5f-3900-39521430d664","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[0,9,0],"children":["0f34925f-0ce7-73d1-b6bc-3ebc6b954619"]},{"name":"arms","uuid":"50918f7b-a888-8c07-5851-72c157cac008","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[0,8.5,-0.5],"children":["683a14b0-c7d3-ee33-e790-ec456d2eafa1","edc957d9-62dd-52d4-82a3-9db5f0f81fee"]}],"textures":[{"path":"C:\\Dan\\Projekty\\Hardcore-Ender-Expansion-2\\src\\main\\resources\\assets\\hee\\textures\\entity\\ender_eye.png","name":"ender_eye.png","folder":"entity","namespace":"hee","id":"0","particle":false,"mode":"link","saved":true,"uuid":"43e48689-95e3-8430-06f8-1c61b6f96c9d"}]}
Binary file not shown.
Binary file not shown.
-1
View File
@@ -1 +0,0 @@
{"meta":{"format_version":"3.0","model_format":"modded_entity","box_uv":true},"name":"IgneousPlate","geo_name":"IgneousPlate","resolution":{"width":32,"height":16},"elements":[{"name":"cube","from":[-14,-12,0],"to":[-12,-4,2],"autouv":0,"color":3,"origin":[3.5,8,1],"uv_offset":[0,6],"uuid":"90291b85-56cc-94f2-58ac-e37c867ac90a"},{"name":"cube","from":[-4,-12,0],"to":[-2,-4,2],"autouv":0,"color":1,"origin":[0,0,0],"uv_offset":[8,6],"uuid":"cf15a4d3-d9cb-be21-c49a-1e2cf8ba68e9"},{"name":"cube","from":[-14,-4,0],"to":[-2,-2,2],"autouv":0,"color":7,"origin":[0,0,0],"uuid":"5e21b956-681a-3556-7acd-a7098ee9fb5c"},{"name":"cube","from":[-14,-14,0],"to":[-2,-12,2],"autouv":0,"color":4,"origin":[0,0,0],"uv_offset":[0,4],"uuid":"e944760c-3ee1-ca95-0a38-f470471948ba"},{"name":"cube","from":[-12,-12,0.5],"to":[-4,-4,1.5],"autouv":0,"color":3,"origin":[0,0,0],"uv_offset":[14,7],"uuid":"0566d9d0-a1b5-e435-e234-caa759b3aec4"}],"outliner":[{"name":"outerBox","uuid":"a5f25de6-2619-4ae4-2de8-c1cdec9112b7","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[0,0,0],"children":["90291b85-56cc-94f2-58ac-e37c867ac90a","cf15a4d3-d9cb-be21-c49a-1e2cf8ba68e9","5e21b956-681a-3556-7acd-a7098ee9fb5c","e944760c-3ee1-ca95-0a38-f470471948ba"]},{"name":"innerBox","uuid":"62290e42-d30b-2154-940b-a50c3c127698","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[0,0,0],"children":["0566d9d0-a1b5-e435-e234-caa759b3aec4"]}],"textures":[{"path":"C:\\Dan\\Projekty\\Hardcore-Ender-Expansion-2\\src\\main\\resources\\assets\\hee\\textures\\entity\\igneous_plate.png","name":"igneous_plate.png","folder":"entity","namespace":"hee","id":"0","particle":false,"mode":"link","saved":true,"uuid":"f1c8b220-6b45-6f19-175d-ba78fba868a3"}]}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
-78
View File
@@ -1,78 +0,0 @@
buildscript{
ext.kotlin_version = "1.3.40"
repositories{
jcenter()
mavenCentral()
maven{
url = "http://files.minecraftforge.net/maven"
}
}
dependencies{
classpath "net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlin_version}"
}
}
apply plugin: "net.minecraftforge.gradle.forge"
apply plugin: "kotlin"
sourceCompatibility = targetCompatibility = "1.8"
tasks.withType(JavaCompile){
sourceCompatibility = targetCompatibility = "1.8"
}
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile){
kotlinOptions{
jvmTarget = "1.8"
apiVersion = "1.3"
languageVersion = "1.3"
freeCompilerArgs = [
"-Xno-call-assertions",
"-Xno-param-assertions",
"-Xno-receiver-assertions",
"-Xjvm-default=enable",
"-Xuse-experimental=kotlin.ExperimentalUnsignedTypes",
"-Xuse-experimental=kotlin.contracts.ExperimentalContracts",
"-XXLanguage:+InlineClasses"
]
}
}
minecraft{
version = "1.12.2-14.23.5.2768"
runDir = "run"
mappings = "stable_39"
makeObfSourceJar = false
}
dependencies{
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
compile "org.jetbrains.kotlin:kotlin-reflect"
testCompile "org.junit.jupiter:junit-jupiter-api:5.3.0-RC1"
}
test{
systemProperty "junit.jupiter.testinstance.lifecycle.default", "per_class"
}
def modinfo = null
processResources{
File file = new File(++sourceSets.main.resources.srcDirs.iterator(), "mcmod.info")
modinfo = new groovy.json.JsonSlurper().parseText(file.getText())[0]
rename("hee_at.cfg", "META-INF/hee_at.cfg")
}
jar{
archiveName = "HardcoreEnderExpansion MC-${project.minecraft.version} v${modinfo.version}.jar"
manifest{
attributes "FMLAT": "hee_at.cfg"
}
}
-3
View File
@@ -1,3 +0,0 @@
# Sets default memory used for gradle commands. Can be overridden by user or command line properties.
# This is required to provide enough memory for the Minecraft decompilation process.
org.gradle.jvmargs=-Xmx3G
Binary file not shown.
+1 -2
View File
@@ -1,6 +1,5 @@
#Wed Oct 31 13:34:38 CET 2018
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-bin.zip
Vendored
+186 -110
View File
@@ -1,78 +1,129 @@
#!/usr/bin/env bash #!/bin/sh
#
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
############################################################################## ##############################################################################
## #
## Gradle start up script for UN*X # Gradle start up script for POSIX generated by Gradle.
## #
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
############################################################################## ##############################################################################
# Attempt to set APP_HOME # Attempt to set APP_HOME
# Resolve links: $0 may be a link # Resolve links: $0 may be a link
PRG="$0" app_path=$0
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do # Need this for daisy-chained symlinks.
ls=`ls -ld "$PRG"` while
link=`expr "$ls" : '.*-> \(.*\)$'` APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
if expr "$link" : '/.*' > /dev/null; then [ -h "$app_path" ]
PRG="$link" do
else ls=$( ls -ld "$app_path" )
PRG=`dirname "$PRG"`"/$link" link=${ls#*' -> '}
fi case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle" APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"` APP_BASE_NAME=${0##*/}
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS="" DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum" MAX_FD=maximum
warn ( ) { warn () {
echo "$*" echo "$*"
} } >&2
die ( ) { die () {
echo echo
echo "$*" echo "$*"
echo echo
exit 1 exit 1
} } >&2
# OS specific support (must be 'true' or 'false'). # OS specific support (must be 'true' or 'false').
cygwin=false cygwin=false
msys=false msys=false
darwin=false darwin=false
nonstop=false nonstop=false
case "`uname`" in case "$( uname )" in #(
CYGWIN* ) CYGWIN* ) cygwin=true ;; #(
cygwin=true Darwin* ) darwin=true ;; #(
;; MSYS* | MINGW* ) msys=true ;; #(
Darwin* ) NONSTOP* ) nonstop=true ;;
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM. # Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables # IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java" JAVACMD=$JAVA_HOME/jre/sh/java
else else
JAVACMD="$JAVA_HOME/bin/java" JAVACMD=$JAVA_HOME/bin/java
fi fi
if [ ! -x "$JAVACMD" ] ; then if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -81,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation." location of your Java installation."
fi fi
else else
JAVACMD="java" JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the Please set the JAVA_HOME variable in your environment to match the
@@ -89,76 +140,101 @@ location of your Java installation."
fi fi
# Increase the maximum file descriptors if we can. # Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
MAX_FD_LIMIT=`ulimit -H -n` case $MAX_FD in #(
if [ $? -eq 0 ] ; then max*)
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then MAX_FD=$( ulimit -H -n ) ||
MAX_FD="$MAX_FD_LIMIT" warn "Could not query maximum file descriptor limit"
fi esac
ulimit -n $MAX_FD case $MAX_FD in #(
if [ $? -ne 0 ] ; then '' | soft) :;; #(
warn "Could not set maximum file descriptor limit: $MAX_FD" *)
fi ulimit -n "$MAX_FD" ||
else warn "Could not set maximum file descriptor limit to $MAX_FD"
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac esac
fi fi
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules # Collect all arguments for the java command, stacking in reverse order:
function splitJvmOpts() { # * args from the command line
JVM_OPTS=("$@") # * the main class name
} # * -classpath
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS # * -D...appname settings
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" # * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" # For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"
Vendored
+31 -30
View File
@@ -1,4 +1,20 @@
@if "%DEBUG%" == "" @echo off @rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%"=="" @echo off
@rem ########################################################################## @rem ##########################################################################
@rem @rem
@rem Gradle startup script for Windows @rem Gradle startup script for Windows
@@ -9,19 +25,22 @@
if "%OS%"=="Windows_NT" setlocal if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0 set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=. if "%DIRNAME%"=="" set DIRNAME=.
set APP_BASE_NAME=%~n0 set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME% set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. @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 DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe @rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1 %JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init if %ERRORLEVEL% equ 0 goto execute
echo. echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@@ -35,7 +54,7 @@ goto fail
set JAVA_HOME=%JAVA_HOME:"=% set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init if exist "%JAVA_EXE%" goto execute
echo. echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
@@ -45,44 +64,26 @@ echo location of your Java installation.
goto fail goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
goto execute
:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$
:execute :execute
@rem Setup the command line @rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle @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% "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end :end
@rem End local scope for the variables with windows NT shell @rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd if %ERRORLEVEL% equ 0 goto mainEnd
:fail :fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code! rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 set EXIT_CODE=%ERRORLEVEL%
exit /b 1 if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd :mainEnd
if "%OS%"=="Windows_NT" endlocal if "%OS%"=="Windows_NT" endlocal
-5
View File
@@ -1,5 +0,0 @@
Param([Parameter(Mandatory = $True, Position = 1)][string] $filePath)
Add-Type -AssemblyName System.Windows.Forms
$files = new-object System.Collections.Specialized.StringCollection
$files.Add($filePath)
[System.Windows.Forms.Clipboard]::SetFileDropList($files)
-3
View File
@@ -1,3 +0,0 @@
Param([Parameter(Mandatory = $True, Position = 1)][string] $processId)
Add-Type -MemberDefinition '[DllImport("user32.dll")]public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);' -Name Functions -Namespace Win32
[Win32.Functions]::ShowWindow((Get-Process -Id $processId).MainWindowHandle, 3)
-104
View File
@@ -1,104 +0,0 @@
package chylex.hee
import chylex.hee.game.block.util.CustomPlantType
import chylex.hee.game.commands.HeeServerCommand
import chylex.hee.game.entity.CustomCreatureType
import chylex.hee.game.entity.item.EntityItemIgneousRock
import chylex.hee.game.entity.living.EntityMobEnderman
import chylex.hee.game.entity.living.behavior.EndermanBlockHandler
import chylex.hee.game.item.util.CustomRarity
import chylex.hee.game.item.util.CustomToolMaterial
import chylex.hee.game.mechanics.causatum.EnderCausatum
import chylex.hee.game.mechanics.instability.Instability
import chylex.hee.game.mechanics.trinket.TrinketHandler
import chylex.hee.game.world.WorldProviderEndCustom
import chylex.hee.game.world.feature.OverworldFeatures
import chylex.hee.game.world.territory.storage.TokenPlayerStorage
import chylex.hee.init.ModCreativeTabs
import chylex.hee.init.ModGuiHandler
import chylex.hee.init.ModLoot
import chylex.hee.init.ModNetwork
import chylex.hee.init.ModPotions
import chylex.hee.init.ModRecipes
import chylex.hee.proxy.Environment
import chylex.hee.system.Debug
import chylex.hee.system.IntegrityCheck
import chylex.hee.system.migration.forge.Side
import net.minecraftforge.fml.common.Mod
import net.minecraftforge.fml.common.Mod.EventHandler
import net.minecraftforge.fml.common.event.FMLInitializationEvent
import net.minecraftforge.fml.common.event.FMLLoadCompleteEvent
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent
import net.minecraftforge.fml.common.event.FMLServerStartingEvent
import net.minecraftforge.fml.common.network.NetworkCheckHandler
import org.apache.logging.log4j.Logger
@Mod(modid = HEE.ID, useMetadata = true, modLanguageAdapter = "chylex.hee.system.core.KotlinAdapter")
object HEE{
const val ID = "hee"
const val DIM = 1
lateinit var log: Logger
lateinit var version: String
val proxy = Environment.constructProxy()
init{
CustomRarity
CustomToolMaterial
CustomCreatureType
CustomPlantType
}
@EventHandler
fun onPreInit(e: FMLPreInitializationEvent){
log = e.modLog
version = e.modMetadata.version
Debug.initialize()
ModNetwork.initialize()
ModGuiHandler.initialize()
ModCreativeTabs.initialize()
TrinketHandler.register()
EnderCausatum.register()
Instability.register()
TokenPlayerStorage.register()
WorldProviderEndCustom.register()
proxy.onPreInit()
}
@EventHandler
fun onInit(@Suppress("UNUSED_PARAMETER") e: FMLInitializationEvent){
ModLoot.initialize()
ModRecipes.initialize()
OverworldFeatures.register()
proxy.onInit()
}
@EventHandler
fun onPostInit(@Suppress("UNUSED_PARAMETER") e: FMLPostInitializationEvent){
CustomToolMaterial.setupRepairItems()
EntityItemIgneousRock.setupSmeltingTransformations()
EntityMobEnderman.setupBiomeSpawns()
EndermanBlockHandler.setupCarriableBlocks()
ModPotions.setupVanillaOverrides()
OverworldFeatures.setupVanillaOverrides()
}
@EventHandler
fun onLoadComplete(@Suppress("UNUSED_PARAMETER") e: FMLLoadCompleteEvent){
IntegrityCheck.verify()
}
@EventHandler
fun onServerStarting(e: FMLServerStartingEvent){
e.registerServerCommand(HeeServerCommand)
}
@NetworkCheckHandler
fun onNetworkCheck(mods: Map<String, String>, @Suppress("UNUSED_PARAMETER") side: Side): Boolean{
return mods.isNotEmpty() && mods[ID] == version
}
}
@@ -1,30 +0,0 @@
package chylex.hee.client.gui
import chylex.hee.client.gui.base.GuiBaseChestContainer
import chylex.hee.game.container.ContainerAmuletOfRecovery
import chylex.hee.network.server.PacketServerContainerEvent
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.gui.GuiButton
import net.minecraft.client.resources.I18n
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.util.EnumHand
import net.minecraftforge.fml.client.config.GuiButtonExt
@Sided(Side.CLIENT)
class GuiAmuletOfRecovery(player: EntityPlayer, itemHeldIn: EnumHand) : GuiBaseChestContainer(ContainerAmuletOfRecovery(player, itemHeldIn)){
override fun initGui(){
super.initGui()
val moveAllTitle = I18n.format("gui.hee.amulet_of_recovery.move_all")
val moveAllWidth = (fontRenderer.getStringWidth(moveAllTitle) + 14).coerceAtMost(xSize / 2)
buttonList.add(GuiButtonExt(1000, guiLeft + xSize - moveAllWidth - 7, (height / 2) + 6, moveAllWidth, 11, moveAllTitle))
}
override fun actionPerformed(button: GuiButton){
when(button.id){
1000 -> PacketServerContainerEvent(0).sendToServer()
else -> super.actionPerformed(button)
}
}
}
@@ -1,68 +0,0 @@
package chylex.hee.client.gui
import chylex.hee.client.render.util.GL
import chylex.hee.client.util.MC
import chylex.hee.game.block.entity.TileEntityBrewingStandCustom
import chylex.hee.game.container.ContainerBrewingStandCustom
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import chylex.hee.system.util.getStack
import chylex.hee.system.util.isNotEmpty
import chylex.hee.system.util.totalTime
import net.minecraft.client.gui.inventory.GuiBrewingStand
import net.minecraft.entity.player.InventoryPlayer
@Sided(Side.CLIENT)
class GuiBrewingStandCustom(inventory: InventoryPlayer, private val brewingStand: TileEntityBrewingStandCustom) : GuiBrewingStand(inventory, brewingStand){
private companion object{
private val TEX_BACKGROUND = Resource.Custom("textures/gui/brewing_stand.png")
private val BUBBLE_LENGTHS = intArrayOf(0, 6, 11, 16, 20, 24, 29)
}
private var brewStartTime = brewingStand.world.totalTime
init{
inventorySlots = ContainerBrewingStandCustom(inventory, brewingStand)
}
override fun drawGuiContainerBackgroundLayer(partialTicks: Float, mouseX: Int, mouseY: Int){
val x = (width - xSize) / 2
val y = (height - ySize) / 2
GL.color(1F, 1F, 1F, 1F)
MC.textureManager.bindTexture(TEX_BACKGROUND)
drawTexturedModalRect(x, y, 0, 0, xSize, ySize)
val worldTime = brewingStand.world.totalTime
val brewTime = brewingStand.brewTime
if (brewTime > 0){
val brewProgress = (28F * (1F - (brewTime / 400F))).toInt()
if (brewProgress > 0){
drawTexturedModalRect(x + 97, y + 16, 176, 0, 9, brewProgress)
}
val bubbleLength = BUBBLE_LENGTHS[((worldTime - brewStartTime).toInt() / 2) % 7]
if (bubbleLength > 0){
drawTexturedModalRect(x + 63, y + 43 - bubbleLength, 185, 29 - bubbleLength, 12, bubbleLength)
}
}
else{
brewStartTime = worldTime
}
if (brewingStand.getStack(TileEntityBrewingStandCustom.SLOT_MODIFIER).isNotEmpty){
drawTexturedModalRect(x + 62, y + 45, 197, 0, 14, 2)
}
for(slotIndex in TileEntityBrewingStandCustom.SLOTS_POTIONS){
val slot = inventorySlots.getSlot(slotIndex)
if (!slot.hasStack){
drawTexturedModalRect(x + slot.xPos, y + slot.yPos, 211, 0, 16, 16)
}
}
}
}
@@ -1,10 +0,0 @@
package chylex.hee.client.gui
import chylex.hee.client.gui.base.GuiBaseChestContainer
import chylex.hee.game.block.entity.TileEntityLootChest
import chylex.hee.game.container.ContainerLootChest
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.entity.player.EntityPlayer
@Sided(Side.CLIENT)
class GuiLootChest(player: EntityPlayer, tile: TileEntityLootChest) : GuiBaseChestContainer(ContainerLootChest(player, tile))
@@ -1,17 +0,0 @@
package chylex.hee.client.gui
import chylex.hee.client.gui.base.GuiBaseChestContainer
import chylex.hee.game.block.entity.TileEntityVoidPortalStorage
import chylex.hee.game.container.ContainerPortalTokenStorage
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.any
import chylex.hee.system.util.nonEmptySlots
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.ItemStack
@Sided(Side.CLIENT)
class GuiPortalTokenStorage(player: EntityPlayer, tile: TileEntityVoidPortalStorage) : GuiBaseChestContainer(ContainerPortalTokenStorage(player, tile)){
fun canActivateToken(stack: ItemStack): Boolean{
return (inventorySlots as ContainerPortalTokenStorage).lowerChestInventory.nonEmptySlots.any { it.stack === stack }
}
}
@@ -1,42 +0,0 @@
package chylex.hee.client.gui
import chylex.hee.client.gui.base.GuiBaseCustomInventory
import chylex.hee.game.container.ContainerTrinketPouch
import chylex.hee.game.container.base.ContainerBaseCustomInventory
import chylex.hee.game.item.ItemTrinketPouch.Inventory
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.color.IntColor.Companion.RGBA
import chylex.hee.system.util.facades.Resource
import chylex.hee.system.util.size
import net.minecraft.client.gui.Gui
import net.minecraft.entity.player.EntityPlayer
@Sided(Side.CLIENT)
class GuiTrinketPouch(player: EntityPlayer, inventorySlot: Int) : GuiBaseCustomInventory<Inventory>(ContainerTrinketPouch(player, inventorySlot)){
override val texBackground = Resource.Custom("textures/gui/trinket_pouch.png")
override val titleContainer = "gui.hee.trinket_pouch.title"
private val hiddenSlots: Int
private val hiddenSlotColor = RGBA(0u, 0.25F).i
init{
ySize = ContainerTrinketPouch.HEIGHT
hiddenSlots = ContainerTrinketPouch.MAX_SLOTS - (inventorySlots as ContainerBaseCustomInventory<*>).containerInventory.size
}
override fun drawGuiContainerBackgroundLayer(partialTicks: Float, mouseX: Int, mouseY: Int){
super.drawGuiContainerBackgroundLayer(partialTicks, mouseX, mouseY)
val middleSlot = ContainerTrinketPouch.MAX_SLOTS / 2
repeat(hiddenSlots){
renderSlotCover(middleSlot + ((ContainerTrinketPouch.MAX_SLOTS - it) / 2) * (if (it % 2 == 0) -1 else 1))
}
}
private fun renderSlotCover(index: Int){
val x = guiLeft + 44 + (index * 18)
val y = guiTop + 18
Gui.drawRect(x, y, x + 16, y + 16, hiddenSlotColor)
}
}
@@ -1,49 +0,0 @@
package chylex.hee.client.gui.base
import chylex.hee.client.render.util.GL
import chylex.hee.client.util.MC
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.color.IntColor.Companion.RGB
import chylex.hee.system.util.facades.Resource
import chylex.hee.system.util.size
import net.minecraft.client.gui.inventory.GuiContainer
import net.minecraft.inventory.ContainerChest
@Sided(Side.CLIENT)
abstract class GuiBaseChestContainer(container: ContainerChest) : GuiContainer(container){
private companion object{
private val TEX_BACKGROUND = Resource.Vanilla("textures/gui/container/generic_54.png")
private val COLOR_TEXT = RGB(64u).i
}
private val containerRows = container.lowerChestInventory.size / 9
private val titleContainer = container.lowerChestInventory.displayName.unformattedText
private val titleInventory = MC.player?.inventory?.displayName?.unformattedText ?: "" // 'mc' not initialized yet
init{
ySize = 114 + (containerRows * 18)
}
override fun drawScreen(mouseX: Int, mouseY: Int, partialTicks: Float){
drawDefaultBackground()
super.drawScreen(mouseX, mouseY, partialTicks)
renderHoveredToolTip(mouseX, mouseY)
}
override fun drawGuiContainerBackgroundLayer(partialTicks: Float, mouseX: Int, mouseY: Int){
val x = (width - xSize) / 2
val y = (height - ySize) / 2
val heightContainer = 17 + (containerRows * 18)
GL.color(1F, 1F, 1F, 1F)
mc.textureManager.bindTexture(TEX_BACKGROUND)
drawTexturedModalRect(x, y, 0, 0, xSize, heightContainer)
drawTexturedModalRect(x, y + heightContainer, 0, 126, xSize, 96)
}
override fun drawGuiContainerForegroundLayer(mouseX: Int, mouseY: Int){
fontRenderer.drawString(titleContainer, 8, 6, COLOR_TEXT)
fontRenderer.drawString(titleInventory, 8, ySize - 94, COLOR_TEXT)
}
}
@@ -1,43 +0,0 @@
package chylex.hee.client.gui.base
import chylex.hee.client.render.util.GL
import chylex.hee.client.util.MC
import chylex.hee.game.container.base.ContainerBaseCustomInventory
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.color.IntColor.Companion.RGB
import net.minecraft.client.gui.inventory.GuiContainer
import net.minecraft.client.resources.I18n
import net.minecraft.inventory.IInventory
import net.minecraft.util.ResourceLocation
@Sided(Side.CLIENT)
abstract class GuiBaseCustomInventory<T : IInventory>(container: ContainerBaseCustomInventory<T>) : GuiContainer(container){
private companion object{
private val COLOR_TEXT = RGB(64u).i
}
protected abstract val texBackground: ResourceLocation
protected abstract val titleContainer: String
private val titleInventory = MC.player?.inventory?.displayName?.unformattedText ?: "" // 'mc' not initialized yet
override fun drawScreen(mouseX: Int, mouseY: Int, partialTicks: Float){
drawDefaultBackground()
super.drawScreen(mouseX, mouseY, partialTicks)
renderHoveredToolTip(mouseX, mouseY)
}
override fun drawGuiContainerBackgroundLayer(partialTicks: Float, mouseX: Int, mouseY: Int){
val x = (width - xSize) / 2
val y = (height - ySize) / 2
GL.color(1F, 1F, 1F, 1F)
mc.textureManager.bindTexture(texBackground)
drawTexturedModalRect(x, y, 0, 0, xSize, ySize)
}
override fun drawGuiContainerForegroundLayer(mouseX: Int, mouseY: Int){
fontRenderer.drawString(I18n.format(titleContainer), 8, 6, COLOR_TEXT)
fontRenderer.drawString(titleInventory, 8, ySize - 94, COLOR_TEXT)
}
}
@@ -1,44 +0,0 @@
package chylex.hee.client.model
import chylex.hee.client.util.MC
import chylex.hee.system.migration.Hand.MAIN_HAND
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.Vec3
import chylex.hee.system.util.lookPosVec
import chylex.hee.system.util.subtractY
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.util.EnumHand
import net.minecraft.util.EnumHandSide.RIGHT
import net.minecraft.util.math.MathHelper
import net.minecraft.util.math.Vec3d
import kotlin.math.abs
import kotlin.math.pow
object ModelHelper{
@Sided(Side.CLIENT)
fun getHandPosition(player: EntityPlayer, hand: EnumHand): Vec3d{
val yawOffsetMp = (if (player.primaryHand == RIGHT) 1 else -1) * (if (hand == MAIN_HAND) 1 else -1)
if (player === MC.player && MC.settings.thirdPersonView == 0){
val pitch = MathHelper.wrapDegrees(player.rotationPitch)
val yaw = MathHelper.wrapDegrees(player.rotationYaw)
val fov = MC.settings.fovSetting
return player
.lookPosVec
.subtractY(0.1 + (pitch.coerceIn(-90F, 45F) * 0.0034))
.add(Vec3.fromYaw(yaw + (yawOffsetMp * fov * 0.6F)).scale(0.25))
.add(Vec3.fromYaw(yaw + 165F - (fov - 90F) / 2F).scale(abs(pitch.coerceIn(0F, 90F) / 90.0).pow(1.5) * (0.3 - abs(fov - 90.0) / 600F)))
// TODO kinda weird and inaccurate, maybe use the camera transformations somehow?
}
else{
val handOffset = if (player.isSneaking) 1.15 else 0.75
return player
.lookPosVec
.subtractY(handOffset)
.add(Vec3.fromYaw(player.renderYawOffset + yawOffsetMp * 39F).scale(0.52))
}
}
}
@@ -1,43 +0,0 @@
package chylex.hee.client.model.block
import chylex.hee.client.render.util.beginBox
import chylex.hee.client.render.util.render
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.model.ModelBase
import net.minecraft.client.model.ModelRenderer
import kotlin.math.PI
import kotlin.math.abs
import kotlin.math.sin
@Sided(Side.CLIENT)
object ModelBlockIgneousPlate : ModelBase(){
const val ANIMATION_PERIOD = PI
private val outerBox: ModelRenderer
private val innerBox: ModelRenderer
init{
textureWidth = 32
textureHeight = 16
outerBox = ModelRenderer(this).apply {
beginBox.offset(12F, 4F, 0F).size( 2, 8, 2).tex(0, 6).add()
beginBox.offset( 2F, 4F, 0F).size( 2, 8, 2).tex(8, 6).add()
beginBox.offset( 2F, 2F, 0F).size(12, 2, 2).tex(0, 0).add()
beginBox.offset( 2F, 12F, 0F).size(12, 2, 2).tex(0, 4).add()
}
innerBox = ModelRenderer(this).apply {
beginBox.offset(4F, 4F, 0.5F).size(8, 8, 1).tex(14, 7).add()
}
}
fun renderOuterBox(){
outerBox.render()
}
fun renderInnerBox(animation: Double){
innerBox.offsetZ = -abs(sin(-animation)).toFloat() * 0.0925F
innerBox.render()
}
}
@@ -1,69 +0,0 @@
package chylex.hee.client.model.entity
import chylex.hee.client.render.util.beginBox
import chylex.hee.game.entity.living.EntityBossEnderEye
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.toRadians
import net.minecraft.client.model.ModelBase
import net.minecraft.client.model.ModelRenderer
import net.minecraft.entity.Entity
import net.minecraft.entity.EntityLivingBase
@Sided(Side.CLIENT)
object ModelEntityBossEnderEye : ModelBase(){
const val SCALE = 16F / 18F
private val head: ModelRenderer
private val eyes: Array<ModelRenderer>
private val arms: ModelRenderer
init{
textureWidth = 128
textureHeight = 64
head = ModelRenderer(this).apply {
setRotationPoint(0F, 15F, 0F)
beginBox.offset(-9F, -9F, -9F).size(18, 18, 18).tex(0, 0).add()
}
eyes = Array(8){
ModelRenderer(this).apply {
setRotationPoint(0F, 15F, 0F)
beginBox.offset(-8F, -8F, -9F).size(16, 16, 1).tex(-1 + (16 * it), 47).add()
cubeList[0].let { it.quadList = arrayOf(it.quadList[4]) } // front face only
}
}
arms = ModelRenderer(this).apply {
setRotationPoint(0F, 15.5F, -0.5F)
beginBox.offset(-12F, -1.5F, -1.5F).size(3, 27, 3).tex(73, 0).add()
beginBox.offset( 9F, -1.5F, -1.5F).size(3, 27, 3).tex(73, 0).mirror().add()
}
}
override fun setLivingAnimations(entity: EntityLivingBase, limbSwing: Float, limbSwingAmount: Float, partialTicks: Float){
super.setLivingAnimations(entity, limbSwing, limbSwingAmount, partialTicks)
arms.rotateAngleX = (entity as? EntityBossEnderEye)?.clientArmAngle?.get(partialTicks)?.toRadians() ?: 0F
}
override fun setRotationAngles(limbSwing: Float, limbSwingAmount: Float, ageInTicks: Float, netHeadYaw: Float, headPitch: Float, scale: Float, entity: Entity){
super.setRotationAngles(limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scale, entity)
head.rotateAngleX = headPitch.toRadians()
}
override fun render(entity: Entity, limbSwing: Float, limbSwingAmount: Float, ageInTicks: Float, netHeadYaw: Float, headPitch: Float, scale: Float){
super.render(entity, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scale)
val boss = entity as? EntityBossEnderEye
val eyeState = when{
boss == null -> 1
boss.isSleeping -> 0
else -> boss.demonLevel + 1
}
head.render(scale)
eyes[eyeState].also { it.rotateAngleX = head.rotateAngleX }.render(scale)
arms.render(scale)
}
}
@@ -1,25 +0,0 @@
package chylex.hee.client.model.entity
import chylex.hee.client.render.util.beginBox
import chylex.hee.client.render.util.render
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.model.ModelBase
import net.minecraft.client.model.ModelRenderer
@Sided(Side.CLIENT)
object ModelEntityTokenHolder : ModelBase(){
private val box: ModelRenderer
init{
textureWidth = 64
textureHeight = 32
box = ModelRenderer(this).apply {
beginBox.offset(-8F, -8F, -8F).size(16, 16, 16).add()
}
}
fun render(){
box.render()
}
}
@@ -1,51 +0,0 @@
package chylex.hee.client.model.item
import chylex.hee.client.util.MC
import chylex.hee.init.ModItems
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.migration.forge.SubscribeEvent
import chylex.hee.system.util.facades.Resource
import net.minecraft.client.renderer.block.model.IBakedModel
import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType
import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType.FIRST_PERSON_LEFT_HAND
import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType.FIRST_PERSON_RIGHT_HAND
import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType.THIRD_PERSON_LEFT_HAND
import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType.THIRD_PERSON_RIGHT_HAND
import net.minecraft.client.renderer.block.model.ModelBakery
import net.minecraft.client.renderer.block.model.ModelResourceLocation
import net.minecraftforge.client.event.ModelBakeEvent
import net.minecraftforge.client.model.BakedModelWrapper
import net.minecraftforge.common.MinecraftForge
import org.apache.commons.lang3.tuple.Pair
import javax.vecmath.Matrix4f
@Sided(Side.CLIENT)
class ModelItemAmuletOfRecovery private constructor(sourceModel: IBakedModel) : BakedModelWrapper<IBakedModel>(sourceModel){
companion object{
private val RESOURCE_NORMAL = ModelResourceLocation(Resource.Custom("amulet_of_recovery"), "inventory")
private val RESOURCE_HELD = ModelResourceLocation(Resource.Custom("amulet_of_recovery_held"), "held")
fun register(){
ModelBakery.registerItemVariants(ModItems.AMULET_OF_RECOVERY, RESOURCE_NORMAL, RESOURCE_HELD)
MinecraftForge.EVENT_BUS.register(this)
}
@SubscribeEvent
fun onModelBake(e: ModelBakeEvent){
with(e.modelRegistry){
putObject(RESOURCE_NORMAL, ModelItemAmuletOfRecovery(getObject(RESOURCE_NORMAL)!!))
}
}
}
override fun handlePerspective(transformType: TransformType): Pair<out IBakedModel, Matrix4f> = when(transformType){
FIRST_PERSON_LEFT_HAND,
FIRST_PERSON_RIGHT_HAND,
THIRD_PERSON_LEFT_HAND,
THIRD_PERSON_RIGHT_HAND ->
MC.itemRenderer.itemModelMesher.modelManager.getModel(RESOURCE_HELD).handlePerspective(transformType)
else ->
super.handlePerspective(transformType)
}
}
@@ -1,160 +0,0 @@
package chylex.hee.client.render
import chylex.hee.HEE
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.GL.DF_ONE_MINUS_SRC_ALPHA
import chylex.hee.client.render.util.GL.DF_ZERO
import chylex.hee.client.render.util.GL.FOG_EXP
import chylex.hee.client.render.util.GL.SF_ONE
import chylex.hee.client.render.util.GL.SF_SRC_ALPHA
import chylex.hee.client.util.MC
import chylex.hee.game.block.BlockAbstractPortal
import chylex.hee.game.block.entity.TileEntityEnergyCluster
import chylex.hee.game.block.info.Materials
import chylex.hee.game.mechanics.energy.IEnergyQuantity
import chylex.hee.game.mechanics.energy.IEnergyQuantity.Companion.MAX_POSSIBLE_VALUE
import chylex.hee.game.mechanics.energy.IEnergyQuantity.Companion.displayString
import chylex.hee.init.ModBlocks
import chylex.hee.init.ModItems
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.SubscribeAllEvents
import chylex.hee.system.migration.forge.SubscribeEvent
import chylex.hee.system.util.color.IntColor
import chylex.hee.system.util.color.IntColor.Companion.RGB
import chylex.hee.system.util.color.IntColor.Companion.RGBA
import chylex.hee.system.util.facades.Resource
import chylex.hee.system.util.getBlock
import chylex.hee.system.util.getTile
import net.minecraft.client.gui.Gui
import net.minecraft.client.renderer.ActiveRenderInfo
import net.minecraft.client.resources.I18n
import net.minecraft.util.math.RayTraceResult.Type.BLOCK
import net.minecraft.util.text.TextFormatting
import net.minecraftforge.client.event.DrawBlockHighlightEvent
import net.minecraftforge.client.event.EntityViewRenderEvent.FogDensity
import net.minecraftforge.client.event.RenderGameOverlayEvent
import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType.HELMET
@SubscribeAllEvents(Side.CLIENT, modid = HEE.ID)
object OverlayRenderer{
private const val BORDER_SIZE = 4
private const val LINE_SPACING = 7
private val TEX_ENDER_GOO_OVERLAY = Resource.Custom("textures/overlay/ender_goo.png")
private val TEX_PURIFIED_ENDER_GOO_OVERLAY = Resource.Custom("textures/overlay/purified_ender_goo.png")
private var clusterLookedAt: TileEntityEnergyCluster? = null
// Ender Goo
@JvmStatic
@SubscribeEvent
fun onFogDensity(e: FogDensity){
val entity = e.entity
val inside = ActiveRenderInfo.getBlockStateAtEntityViewpoint(entity.world, entity, e.renderPartialTicks.toFloat()).material
if (inside === Materials.ENDER_GOO || inside === Materials.PURIFIED_ENDER_GOO){
GL.setFogMode(FOG_EXP)
e.density = if (inside === Materials.ENDER_GOO) 0.66F else 0.06F
e.isCanceled = true // otherwise the event is ignored
}
}
@JvmStatic
@SubscribeEvent
fun onRenderHelmetOverlayPre(e: RenderGameOverlayEvent.Pre){
if (e.type != HELMET){
return
}
val player = MC.player ?: return
val inside = ActiveRenderInfo.getBlockStateAtEntityViewpoint(player.world, player, e.partialTicks).material
if ((inside === Materials.ENDER_GOO || inside === Materials.PURIFIED_ENDER_GOO) && MC.settings.thirdPersonView == 0 && !player.isSpectator){
val scaledResolution = MC.resolution
val brightness = player.brightness
GL.color(brightness, brightness, brightness, 1F)
GL.blendFunc(SF_SRC_ALPHA, DF_ONE_MINUS_SRC_ALPHA, SF_ONE, DF_ZERO)
if (inside === Materials.ENDER_GOO){
MC.textureManager.bindTexture(TEX_ENDER_GOO_OVERLAY)
}
else{
MC.textureManager.bindTexture(TEX_PURIFIED_ENDER_GOO_OVERLAY)
}
MC.instance.ingameGUI.drawTexturedModalRect(0, 0, 0, 0, scaledResolution.scaledWidth, scaledResolution.scaledHeight)
GL.color(1F, 1F, 1F, 1F)
}
}
// Energy Cluster
@JvmStatic
@SubscribeEvent
fun onRenderText(@Suppress("UNUSED_PARAMETER") e: RenderGameOverlayEvent.Text){
fun drawTextOffScreenCenter(x: Int, y: Int, line: Int, text: String, color: IntColor){
val scaledResolution = MC.resolution
with(MC.fontRenderer){
val centerX = x + (scaledResolution.scaledWidth / 2)
val centerY = y + (scaledResolution.scaledHeight / 2) + (line * (LINE_SPACING + FONT_HEIGHT))
val textWidth = getStringWidth(text)
val textHeight = FONT_HEIGHT
val offsetX = -(textWidth / 2)
val offsetY = -(textHeight / 2)
Gui.drawRect(centerX + offsetX - BORDER_SIZE, centerY + offsetY - BORDER_SIZE, centerX - offsetX + BORDER_SIZE - 1, centerY - offsetY + BORDER_SIZE - 1, RGBA(0u, 0.6F).i)
drawStringWithShadow(text, (centerX + offsetX).toFloat(), (centerY + offsetY).toFloat(), color.i)
}
}
clusterLookedAt?.let {
clusterLookedAt = null
fun getQuantityString(quantity: IEnergyQuantity): String{
return if (it.energyLevel == MAX_POSSIBLE_VALUE)
"${TextFormatting.OBFUSCATED}##${TextFormatting.RESET}"
else
quantity.displayString
}
val isIgnored = MC.player?.let { player -> ModItems.ENERGY_ORACLE.isClusterIgnored(player, it.pos) } == true
val firstLine = if (isIgnored) -1 else 0
val health = it.currentHealth
drawTextOffScreenCenter(0, -40, firstLine, I18n.format("hee.energy.overlay.health", health), health.textColor)
val level = getQuantityString(it.energyLevel)
val capacity = getQuantityString(it.energyRegenCapacity)
drawTextOffScreenCenter(0, -40, firstLine + 1, I18n.format("hee.energy.overlay.level", level, capacity), RGB(220u))
if (isIgnored){
drawTextOffScreenCenter(0, -40, firstLine + 2, I18n.format("hee.energy.overlay.ignored"), RGB(160u))
}
}
}
// Block outlines
@JvmStatic
@SubscribeEvent
fun onRenderBlockOutline(e: DrawBlockHighlightEvent){
if (e.target.typeOfHit == BLOCK){ // why the fuck is this still called for air and entities
val world = e.player.world
val pos = e.target.blockPos
val block = pos.getBlock(world)
if (block === ModBlocks.ENERGY_CLUSTER){
clusterLookedAt = pos.getTile(world)
e.isCanceled = true
}
else if (block is BlockAbstractPortal){
e.isCanceled = true
}
}
}
}
@@ -1,237 +0,0 @@
package chylex.hee.client.render
import chylex.hee.HEE
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.GL.DF_ONE_MINUS_SRC_ALPHA
import chylex.hee.client.render.util.GL.DF_ZERO
import chylex.hee.client.render.util.GL.SF_ONE
import chylex.hee.client.render.util.GL.SF_SRC_ALPHA
import chylex.hee.client.util.MC
import chylex.hee.game.particle.ParticleVoid
import chylex.hee.game.particle.spawner.ParticleSpawnerCustom
import chylex.hee.game.particle.util.IOffset.InBox
import chylex.hee.game.particle.util.IShape.Point
import chylex.hee.game.world.WorldProviderEndCustom
import chylex.hee.game.world.territory.TerritoryType
import chylex.hee.game.world.territory.TerritoryVoid
import chylex.hee.system.Debug
import chylex.hee.system.migration.forge.EventPriority
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.SubscribeAllEvents
import chylex.hee.system.migration.forge.SubscribeEvent
import chylex.hee.system.util.color.IntColor
import chylex.hee.system.util.color.IntColor.Companion.RGB
import chylex.hee.system.util.floorToInt
import chylex.hee.system.util.lookDirVec
import chylex.hee.system.util.math.LerpedFloat
import chylex.hee.system.util.posVec
import chylex.hee.system.util.scale
import net.minecraft.client.resources.I18n
import net.minecraft.entity.player.EntityPlayer
import net.minecraftforge.client.event.RenderGameOverlayEvent
import net.minecraftforge.common.MinecraftForge
import net.minecraftforge.fml.common.gameevent.TickEvent.ClientTickEvent
import net.minecraftforge.fml.common.gameevent.TickEvent.Phase
import org.lwjgl.opengl.GL11.GL_GREATER
import kotlin.math.min
import kotlin.math.pow
@SubscribeAllEvents(Side.CLIENT, modid = HEE.ID)
object TerritoryRenderer{
private var prevChunkX = Int.MAX_VALUE
private var prevTerritory: TerritoryType? = null
@JvmStatic
@SubscribeEvent
fun onClientTick(e: ClientTickEvent){
if (e.phase == Phase.START){
val player = MC.player
if (player != null && player.world.provider is WorldProviderEndCustom && player.ticksExisted > 0){
Void.tick(player)
Title.tick()
val newChunkX = player.chunkCoordX
if (prevChunkX != newChunkX){
prevChunkX = newChunkX
val newTerritory = TerritoryType.fromX(player.posX.floorToInt())
if (prevTerritory != newTerritory){
prevTerritory = newTerritory
if (newTerritory != null){
Void.reset()
Title.display(newTerritory)
newTerritory.desc.environment.setupClient()
}
}
}
prevTerritory?.desc?.environment?.tickClient()
}
else if (prevTerritory != null){
prevTerritory = null
prevChunkX = Int.MAX_VALUE
Void.reset()
Title.reset()
}
}
}
// Void handling
val VOID_FACTOR_VALUE
get() = Void.voidFactor.get(MC.partialTicks)
private object Void{
private val VOID_PARTICLE = ParticleSpawnerCustom(
type = ParticleVoid,
pos = InBox(8F)
)
val voidFactor = LerpedFloat(TerritoryVoid.OUTSIDE_VOID_FACTOR)
init{
if (Debug.enabled){
MinecraftForge.EVENT_BUS.register(this)
}
}
fun tick(player: EntityPlayer){
val factor = TerritoryVoid.getVoidFactor(player).also(voidFactor::update)
if (factor == TerritoryVoid.OUTSIDE_VOID_FACTOR || MC.instance.isGamePaused){
return
}
if (factor > -1F){
val rand = player.rng
val mp = min(1F, (factor * 0.275F) + 0.275F)
val extra = (mp.pow(1.5F) * 12F).floorToInt()
VOID_PARTICLE.spawn(Point(player, heightMp = 0.5F, amount = 2 + extra), rand)
VOID_PARTICLE.spawn(Point(player.posVec.add(player.lookDirVec.scale(5)), amount = extra / 2), rand)
}
}
fun reset(){
voidFactor.updateImmediately(TerritoryVoid.OUTSIDE_VOID_FACTOR)
}
@SubscribeEvent
fun onRenderGameOverlayText(e: RenderGameOverlayEvent.Text){
if (MC.settings.showDebugInfo && MC.player?.dimension == HEE.DIM){
with(e.left){
add("")
add("End Void Factor: ${"%.3f".format(voidFactor.currentValue)}")
}
}
}
}
// Text rendering
@SubscribeAllEvents(Side.CLIENT, modid = HEE.ID)
private object Title{
private const val FADE_TICKS = 22
private var textTime = 0
private var textFade = 0
private var textTitle = ""
private var textMainColor = RGB(0u)
private var textShadowColor = RGB(0u)
fun display(newTerritory: TerritoryType){
val title = I18n.format(newTerritory.translationKey)
textTime = 60 + (2 * title.length)
textFade = FADE_TICKS
textTitle = title
with(newTerritory.desc.colors){
if (tokenTop.asVec.lengthSquared() > tokenBottom.asVec.lengthSquared()){
textMainColor = tokenTop
textShadowColor = tokenBottom
}
else{
textMainColor = tokenBottom
textShadowColor = tokenTop
}
textShadowColor = textShadowColor.let { RGB(it.red / 2, it.green / 2, it.blue / 2) }
}
}
fun tick(){
if (textTime > 0){
--textTime
--textFade
}
}
fun reset(){
textTime = 0
}
@JvmStatic
@SubscribeEvent(EventPriority.HIGHEST)
fun onRenderGameOverlayText(e: RenderGameOverlayEvent.Text){
if (textTime == 0){
return
}
val fontRenderer = MC.fontRenderer
val resolution = e.resolution
val width = resolution.scaledWidth
val height = resolution.scaledHeight
val opacity = when{
textFade > 0 -> ((FADE_TICKS - (textFade - e.partialTicks)) / FADE_TICKS.toFloat()).coerceIn(0F, 1F)
textTime < FADE_TICKS -> ((textTime - e.partialTicks) / FADE_TICKS.toFloat()).coerceIn(0F, 1F)
else -> 1F
}
GL.pushMatrix()
GL.translate(width * 0.5F, height * 0.5F, 0F)
GL.enableBlend()
GL.blendFunc(SF_SRC_ALPHA, DF_ONE_MINUS_SRC_ALPHA, SF_ONE, DF_ZERO)
GL.alphaFunc(GL_GREATER, 0F)
GL.pushMatrix()
GL.scale(3F, 3F, 3F)
val x = -fontRenderer.getStringWidth(textTitle) * 0.5F
val y = -fontRenderer.FONT_HEIGHT - 2F
drawTitle(x + 0.5F, y + 0.5F, textShadowColor.withAlpha(opacity.pow(1.25F)))
drawTitle(x, y, textMainColor.withAlpha(opacity))
GL.popMatrix()
GL.alphaFunc(GL_GREATER, 0.1F)
GL.disableBlend()
GL.popMatrix()
}
private fun drawTitle(x: Float, y: Float, color: IntColor) = with(MC.fontRenderer){
resetStyles()
red = color.red / 255F
green = color.green / 255F
blue = color.blue / 255F
alpha = color.alpha / 255F
posX = x
posY = y
val text = if (bidiFlag)
bidiReorder(textTitle)
else
textTitle
GL.color(red, green, blue, alpha)
renderStringAtPos(text, false)
}
}
}
@@ -1,66 +0,0 @@
package chylex.hee.client.render.block
import chylex.hee.client.render.util.GL
import chylex.hee.game.block.entity.base.TileEntityBaseChest
import chylex.hee.system.migration.Facing.EAST
import chylex.hee.system.migration.Facing.NORTH
import chylex.hee.system.migration.Facing.WEST
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.model.ModelChest
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer
import net.minecraft.util.ResourceLocation
import org.lwjgl.opengl.GL11.GL_MODELVIEW
import org.lwjgl.opengl.GL11.GL_TEXTURE
import kotlin.math.PI
import kotlin.math.pow
@Sided(Side.CLIENT)
abstract class RenderTileAbstractChest<T : TileEntityBaseChest> : TileEntitySpecialRenderer<T>(){
protected abstract val texture: ResourceLocation
private val modelChest = ModelChest()
override fun render(tile: T, x: Double, y: Double, z: Double, partialTicks: Float, destroyStage: Int, alpha: Float){
if (destroyStage >= 0){
bindTexture(DESTROY_STAGES[destroyStage])
GL.matrixMode(GL_TEXTURE)
GL.pushMatrix()
GL.scale(4F, 4F, 1F)
GL.translate(0.0625F, 0.0625F, 0.0625F)
GL.matrixMode(GL_MODELVIEW)
}
else{
bindTexture(texture)
}
GL.pushMatrix()
GL.enableRescaleNormal()
GL.color(1F, 1F, 1F, alpha)
GL.translate(x, y + 1F, z + 1F)
GL.scale(1F, -1F, -1F)
GL.translate(0.5F, 0.5F, 0.5F)
val rotation = when(tile.facing){
EAST -> 270F
NORTH -> 180F
WEST -> 90F
else -> 0F
}
GL.rotate(rotation, 0F, 1F, 0F)
GL.translate(-0.5F, -0.5F, -0.5F)
modelChest.chestLid.rotateAngleX = -(1F - (1F - tile.lidAngle.get(partialTicks)).pow(3)) * PI.toFloat() * 0.5F
modelChest.renderAll()
GL.disableRescaleNormal()
GL.popMatrix()
GL.color(1F, 1F, 1F, 1F)
if (destroyStage >= 0){
GL.matrixMode(GL_TEXTURE)
GL.popMatrix()
GL.matrixMode(GL_MODELVIEW)
}
}
}
@@ -1,232 +0,0 @@
package chylex.hee.client.render.block
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.GL.DF_ONE
import chylex.hee.client.render.util.GL.DF_ONE_MINUS_SRC_ALPHA
import chylex.hee.client.render.util.GL.SF_ONE
import chylex.hee.client.render.util.GL.SF_SRC_ALPHA
import chylex.hee.client.render.util.GL.TEX_Q
import chylex.hee.client.render.util.GL.TEX_R
import chylex.hee.client.render.util.GL.TEX_S
import chylex.hee.client.render.util.GL.TEX_T
import chylex.hee.client.render.util.TESSELLATOR
import chylex.hee.client.render.util.draw
import chylex.hee.client.util.MC
import chylex.hee.game.block.BlockAbstractPortal
import chylex.hee.game.block.BlockAbstractPortal.IPortalController
import chylex.hee.game.block.entity.TileEntityPortalInner
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import chylex.hee.system.util.square
import net.minecraft.client.renderer.ActiveRenderInfo
import net.minecraft.client.renderer.GLAllocation
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer
import net.minecraft.client.renderer.vertex.DefaultVertexFormats
import net.minecraft.util.ResourceLocation
import net.minecraft.util.math.BlockPos
import net.minecraft.util.math.Vec3d
import net.minecraft.world.World
import org.lwjgl.opengl.GL11.GL_EYE_LINEAR
import org.lwjgl.opengl.GL11.GL_EYE_PLANE
import org.lwjgl.opengl.GL11.GL_MODELVIEW
import org.lwjgl.opengl.GL11.GL_OBJECT_LINEAR
import org.lwjgl.opengl.GL11.GL_OBJECT_PLANE
import org.lwjgl.opengl.GL11.GL_QUADS
import org.lwjgl.opengl.GL11.GL_TEXTURE
import java.util.Random
import kotlin.math.pow
@Sided(Side.CLIENT)
abstract class RenderTileAbstractPortal<T : TileEntityPortalInner, C : IPortalController> : TileEntitySpecialRenderer<T>(){
private companion object{
private val TEX_BACKGROUND = Resource.Vanilla("textures/environment/end_sky.png")
private val TEX_PARTICLE_LAYER = Resource.Vanilla("textures/entity/end_portal.png")
private val BUFFER = GLAllocation.createDirectFloatBuffer(16)
private fun updateBuffer(value1: Float, value2: Float, value3: Float, value4: Float) = BUFFER.apply {
clear()
put(value1)
put(value2)
put(value3)
put(value4)
flip()
}
private fun getLayerCount(distSq: Double) = when{
distSq > square(60) -> 5
distSq > square(48) -> 7
distSq > square(38) -> 9
distSq > square(30) -> 11
distSq > square(24) -> 13
distSq > square(20) -> 14
else -> 15
}
}
private var cameraTarget = Vec3d.ZERO
private var globalTranslation = 0F
private var isAnimating = false
private var animationProgress = 0F
private fun calculateEasing(layer: Int): Float{
return if (isAnimating)
(1.1F - square(animationProgress * 4.5F - 4.816F) + 22.1F * (1F - ((layer - 1F) / 14F).pow(1.2F))).coerceIn(0F, 1F).pow(1.5F)
else
animationProgress
}
// Properties
protected val rand = Random()
protected val color = FloatArray(3)
protected abstract fun findController(world: World, pos: BlockPos): C?
protected abstract fun generateSeed(controller: C): Long
protected abstract fun generateNextColor(controller: C, layer: Int)
// Rendering
override fun render(tile: T, x: Double, y: Double, z: Double, partialTicks: Float, destroyStage: Int, alpha: Float){
val controller = findController(tile.world, tile.pos)
rand.setSeed(controller?.let { generateSeed(it) } ?: 0L)
animationProgress = controller?.clientAnimationProgress?.get(partialTicks) ?: 0F
isAnimating = animationProgress > 0F && animationProgress < 1F
cameraTarget = ActiveRenderInfo.getCameraPosition()
globalTranslation = ((MC.systemTime % BlockAbstractPortal.TRANSLATION_SPEED_LONG) / BlockAbstractPortal.TRANSLATION_SPEED) - (controller?.clientPortalOffset?.get(partialTicks) ?: 0F)
val offsetY = -y - 0.75
val topY = offsetY + cameraTarget.y
// setup
GL.disableLighting()
GL.enableBlend()
GL.enableTexGenCoord(TEX_S)
GL.enableTexGenCoord(TEX_T)
GL.enableTexGenCoord(TEX_R)
GL.enableTexGenCoord(TEX_Q)
MC.entityRenderer.setupFogColor(true)
// background
GL.blendFunc(SF_SRC_ALPHA, DF_ONE_MINUS_SRC_ALPHA)
controller?.let { generateNextColor(it, 0) }
transformColor { 0.1F } // discards provided value
renderLayer(
x, y, z,
texture = TEX_BACKGROUND,
layerPosition = (topY / (topY + 65.0)) - offsetY,
layerRotation = 0F,
layerScale = 0.125F,
cameraOffsetMp = 65.0 / topY
)
// inner layers
GL.blendFunc(SF_ONE, DF_ONE)
val layerCount = getLayerCount((x * x) + (y * y) + (z * z))
for(layer in 1..15){
val layerIndexRev = 16 - layer
val colorMultiplier = 1F / (layerIndexRev + 1F)
controller?.let { generateNextColor(it, layer) }
transformColor { it * colorMultiplier * calculateEasing(layer) }
if (layerIndexRev <= layerCount){
renderLayer(
x, y, z,
texture = TEX_PARTICLE_LAYER,
layerPosition = (topY / (topY + layerIndexRev)) - offsetY,
layerRotation = 2F * ((square(layer) * 4321) + (layer * 9)),
layerScale = 0.0625F,
cameraOffsetMp = layerIndexRev / topY
)
}
}
// cleanup
MC.entityRenderer.setupFogColor(false)
GL.disableTexGenCoord(TEX_S)
GL.disableTexGenCoord(TEX_T)
GL.disableTexGenCoord(TEX_R)
GL.disableTexGenCoord(TEX_Q)
GL.disableBlend()
GL.enableLighting()
}
// Utilities
private inline fun transformColor(func: (Float) -> Float){
color[0] = func(color[0])
color[1] = func(color[1])
color[2] = func(color[2])
}
private fun renderLayer(renderX: Double, renderY: Double, renderZ: Double, texture: ResourceLocation, layerPosition: Double, layerRotation: Float, layerScale: Float, cameraOffsetMp: Double){
val globalX = rendererDispatcher.entityX
val globalY = rendererDispatcher.entityY
val globalZ = rendererDispatcher.entityZ
// texture
if (texture != TEX_BACKGROUND){
bindTexture(TEX_BACKGROUND) // force re-bind to fix a bug in older AMD drivers
}
bindTexture(texture)
GL.pushMatrix()
GL.translate(globalX, layerPosition, globalZ)
GL.texGenMode(TEX_S, GL_OBJECT_LINEAR)
GL.texGenMode(TEX_T, GL_OBJECT_LINEAR)
GL.texGenMode(TEX_R, GL_OBJECT_LINEAR)
GL.texGenMode(TEX_Q, GL_EYE_LINEAR)
GL.texGenParam(TEX_S, GL_OBJECT_PLANE, updateBuffer(1F, 0F, 0F, 0F))
GL.texGenParam(TEX_T, GL_OBJECT_PLANE, updateBuffer(0F, 0F, 1F, 0F))
GL.texGenParam(TEX_R, GL_OBJECT_PLANE, updateBuffer(1F, 0F, 0F, 1F))
GL.texGenParam(TEX_Q, GL_EYE_PLANE, updateBuffer(0F, 1F, 0F, 0F))
GL.popMatrix()
// position
GL.matrixMode(GL_TEXTURE)
GL.pushMatrix()
GL.loadIdentity()
GL.translate(0F, globalTranslation, 0F)
GL.scale(layerScale, layerScale, layerScale)
GL.translate(0.5F, 0.5F, 0.5F)
GL.rotate(layerRotation, 0F, 0F, 1F)
GL.translate((cameraTarget.x * cameraOffsetMp) - globalX - 0.5, (cameraTarget.z * cameraOffsetMp) - globalZ - 0.5, -globalY * 2)
// rendering
TESSELLATOR.draw(GL_QUADS, DefaultVertexFormats.POSITION_COLOR){
pos(renderX + 0.0, renderY + 0.75, renderZ + 0.0).color(color[0], color[1], color[2], 1F).endVertex()
pos(renderX + 0.0, renderY + 0.75, renderZ + 1.0).color(color[0], color[1], color[2], 1F).endVertex()
pos(renderX + 1.0, renderY + 0.75, renderZ + 1.0).color(color[0], color[1], color[2], 1F).endVertex()
pos(renderX + 1.0, renderY + 0.75, renderZ + 0.0).color(color[0], color[1], color[2], 1F).endVertex()
}
GL.popMatrix()
GL.matrixMode(GL_MODELVIEW)
}
}
@@ -1,41 +0,0 @@
package chylex.hee.client.render.block
import chylex.hee.game.block.entity.TileEntityDarkChest
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import net.minecraft.client.renderer.tileentity.TileEntityChestRenderer
import net.minecraft.client.renderer.tileentity.TileEntityItemStackRenderer
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher
import net.minecraft.item.ItemStack
import net.minecraft.tileentity.TileEntityChest
@Sided(Side.CLIENT)
object RenderTileDarkChest : TileEntityChestRenderer(){
private val TEX_SINGLE = Resource.Custom("textures/entity/dark_chest_single.png")
private val TEX_DOUBLE = Resource.Custom("textures/entity/dark_chest_double.png")
init{
isChristmas = false
}
override fun render(tile: TileEntityChest, x: Double, y: Double, z: Double, partialTicks: Float, destroyStage: Int, alpha: Float){
val prevTexSingle = TEXTURE_NORMAL
val prevTexDouble = TEXTURE_NORMAL_DOUBLE
TEXTURE_NORMAL = TEX_SINGLE
TEXTURE_NORMAL_DOUBLE = TEX_DOUBLE
super.render(tile, x, y, z, partialTicks, destroyStage, alpha)
TEXTURE_NORMAL = prevTexSingle
TEXTURE_NORMAL_DOUBLE = prevTexDouble
}
object AsItem : TileEntityItemStackRenderer(){
private val tile = TileEntityDarkChest()
override fun renderByItem(stack: ItemStack, partialTicks: Float){
TileEntityRendererDispatcher.instance.render(tile, 0.0, 0.0, 0.0, partialTicks)
}
}
}
@@ -1,38 +0,0 @@
package chylex.hee.client.render.block
import chylex.hee.HEE
import chylex.hee.game.block.BlockAbstractPortal
import chylex.hee.game.block.BlockAbstractPortal.IPortalController
import chylex.hee.game.block.entity.TileEntityEndPortalAcceptor
import chylex.hee.game.block.entity.TileEntityPortalInner
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.closestTickingTile
import chylex.hee.system.util.math.LerpedFloat
import net.minecraft.util.math.BlockPos
import net.minecraft.world.World
@Sided(Side.CLIENT)
object RenderTileEndPortal : RenderTileAbstractPortal<TileEntityPortalInner.End, IPortalController>(){
private object AlwaysOnController : IPortalController{
override val clientAnimationProgress = LerpedFloat(1F)
override val clientPortalOffset = LerpedFloat(0F)
}
override fun findController(world: World, pos: BlockPos): IPortalController?{
if (world.provider.dimension == HEE.DIM){
return AlwaysOnController
}
return pos.closestTickingTile<TileEntityEndPortalAcceptor>(world, BlockAbstractPortal.MAX_DISTANCE_FROM_FRAME)
}
override fun generateSeed(controller: IPortalController): Long{
return 31100L
}
override fun generateNextColor(controller: IPortalController, layer: Int){
color[0] = (rand.nextFloat() * 0.5F) + 0.1F
color[1] = (rand.nextFloat() * 0.5F) + 0.4F
color[2] = (rand.nextFloat() * 0.5F) + 0.5F
}
}
@@ -1,60 +0,0 @@
package chylex.hee.client.render.block
import chylex.hee.client.render.util.GL
import chylex.hee.client.util.MC
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import net.minecraft.client.model.ModelRenderer
import net.minecraft.client.model.ModelSkeletonHead
import net.minecraft.client.renderer.tileentity.TileEntityItemStackRenderer
import net.minecraft.entity.Entity
import net.minecraft.item.ItemStack
@Sided(Side.CLIENT)
object RenderTileEndermanHead{
private val TEX_ENDERMAN = Resource.Custom("textures/entity/enderman_head.png")
private val MODEL_HEAD = ModelSkeletonHead(0, 0, 64, 32)
@Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS")
private fun renderHead(){
MC.textureManager.bindTexture(TEX_ENDERMAN)
MODEL_HEAD.render(null, 0F, 0F, 0F, 180F, 0F, 0.0625F)
}
object AsItem : TileEntityItemStackRenderer(){
override fun renderByItem(stack: ItemStack, partialTicks: Float){
GL.pushMatrix()
GL.disableCull()
GL.translate(0.5F, 0F, 0.5F)
GL.enableRescaleNormal()
GL.scale(-1F, -1F, 1F)
GL.enableAlpha()
renderHead()
GL.enableCull()
GL.popMatrix()
}
}
object AsHeadLayer{
operator fun invoke(entity: Entity, headModel: ModelRenderer){
GL.pushMatrix()
GL.disableCull()
if (entity.isSneaking){
GL.translate(0F, 0.2F, 0F)
}
headModel.postRender(0.0625F)
GL.color(1F, 1F, 1F, 1F)
GL.scale(1.1875F, 1.1875F, -1.1875F)
renderHead()
GL.enableCull()
GL.popMatrix()
}
}
}
@@ -1,109 +0,0 @@
package chylex.hee.client.render.block
import chylex.hee.HEE
import chylex.hee.game.block.entity.TileEntityExperienceGate
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.migration.forge.SubscribeAllEvents
import chylex.hee.system.migration.forge.SubscribeEvent
import chylex.hee.system.util.facades.Resource
import chylex.hee.system.util.floorToInt
import net.minecraft.client.renderer.BufferBuilder
import net.minecraft.client.renderer.texture.TextureAtlasSprite
import net.minecraft.util.math.BlockPos
import net.minecraft.world.World
import net.minecraftforge.client.event.TextureStitchEvent
import net.minecraftforge.client.model.animation.FastTESR
@Sided(Side.CLIENT)
@SubscribeAllEvents(Side.CLIENT, modid = HEE.ID)
object RenderTileExperienceGate : FastTESR<TileEntityExperienceGate>(){
private const val SPRITE_COUNT = 40
private val TEX = Array(SPRITE_COUNT){ Resource.Custom("block/experience_gate_top_bar_$it") }
private val SPRITES = mutableListOf<TextureAtlasSprite>()
private val FRAMES_CORNER = intArrayOf(9, 10, 11, 12, 13, 14, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39)
private val FRAMES_STRAIGHT = intArrayOf(9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24)
private val FRAMES = arrayOf(
intArrayOf(0, 1, 2),
FRAMES_STRAIGHT,
FRAMES_CORNER,
FRAMES_STRAIGHT,
intArrayOf(5, 6, 7, 8, 4),
FRAMES_STRAIGHT,
FRAMES_CORNER,
FRAMES_STRAIGHT,
intArrayOf(3, 4)
)
private val FRAME_COUNT = 1 + FRAMES.sumBy { it.size }
private val FRAME_OFFSETS = FRAMES.indices.map { index -> 1 + FRAMES.take(index).sumBy { it.size } }.toIntArray()
@JvmStatic
@SubscribeEvent
fun onTextureStitchPre(e: TextureStitchEvent.Pre){
with(e.map){
TEX.forEach { registerSprite(it) }
}
}
@JvmStatic
@SubscribeEvent
fun onTextureStitchPost(e: TextureStitchEvent.Post){
SPRITES.clear()
with(e.map){
TEX.forEach { SPRITES.add(getAtlasSprite(it.toString())) }
}
}
private fun getTexture(index: Int, frame: Int): TextureAtlasSprite?{
return FRAMES[index].getOrNull((frame - FRAME_OFFSETS[index]).coerceAtMost(FRAMES[index].lastIndex))?.let(SPRITES::getOrNull)
}
override fun renderTileEntityFast(tile: TileEntityExperienceGate, x: Double, y: Double, z: Double, partialTicks: Float, destroyStage: Int, partial: Float, buffer: BufferBuilder){
val world = tile.world
val pos = tile.pos
val progress = tile.chargeProgress
val frame = if (progress == 0F) 0 else 1 + (progress * (FRAME_COUNT - 2)).floorToInt()
val topLeftBlock = getTexture(8, frame) ?: getTexture(0, frame)
topLeftBlock?.let { buffer.renderTextureAt(x - 1.0, y, z - 1.0, world, pos.add(-1, 1, -1), it, 0b000) }
getTexture(1, frame)?.let { buffer.renderTextureAt(x + 0.0, y, z - 1.0, world, pos.add( 0, 1, -1), it, 0b111) }
getTexture(2, frame)?.let { buffer.renderTextureAt(x + 1.0, y, z - 1.0, world, pos.add( 1, 1, -1), it, 0b011) }
getTexture(3, frame)?.let { buffer.renderTextureAt(x + 1.0, y, z + 0.0, world, pos.add( 1, 1, 0), it, 0b110) }
getTexture(4, frame)?.let { buffer.renderTextureAt(x + 1.0, y, z + 1.0, world, pos.add( 1, 1, 1), it, 0b110) }
getTexture(5, frame)?.let { buffer.renderTextureAt(x + 0.0, y, z + 1.0, world, pos.add( 0, 1, 1), it, 0b001) }
getTexture(6, frame)?.let { buffer.renderTextureAt(x - 1.0, y, z + 1.0, world, pos.add(-1, 1, 1), it, 0b101) }
getTexture(7, frame)?.let { buffer.renderTextureAt(x - 1.0, y, z + 0.0, world, pos.add(-1, 1, 0), it, 0b000) }
}
private fun BufferBuilder.renderTextureAt(x: Double, y: Double, z: Double, world: World, pos: BlockPos, tex: TextureAtlasSprite, rot: Int){
val rotX = (((rot shr 1) and 1) - 0.5) * 1.002
val rotZ = (((rot shr 2) and 1) - 0.5) * 1.002
val u1 = tex.minU.toDouble()
val u2 = tex.maxU.toDouble()
val v1 = tex.minV.toDouble()
val v2 = tex.maxV.toDouble()
val c = if (rot and 1 == 0){
doubleArrayOf(u1, u2, u2, u1, v1, v1, v2, v2)
}
else{
doubleArrayOf(u1, u1, u2, u2, v1, v2, v2, v1)
}
val light = world.getCombinedLight(pos, 0)
val sky = (light shr 16) and 65535
val block = light and 65535
this.pos(x + 0.5 + rotX, y + 1.001, z + 0.5 + rotZ).color(255, 255, 255, 255).tex(c[0], c[4]).lightmap(sky, block).endVertex()
this.pos(x + 0.5 - rotX, y + 1.001, z + 0.5 + rotZ).color(255, 255, 255, 255).tex(c[1], c[5]).lightmap(sky, block).endVertex()
this.pos(x + 0.5 - rotX, y + 1.001, z + 0.5 - rotZ).color(255, 255, 255, 255).tex(c[2], c[6]).lightmap(sky, block).endVertex()
this.pos(x + 0.5 + rotX, y + 1.001, z + 0.5 - rotZ).color(255, 255, 255, 255).tex(c[3], c[7]).lightmap(sky, block).endVertex()
}
}
@@ -1,112 +0,0 @@
package chylex.hee.client.render.block
import chylex.hee.client.model.block.ModelBlockIgneousPlate
import chylex.hee.client.render.util.GL
import chylex.hee.game.block.BlockIgneousPlate
import chylex.hee.game.block.entity.TileEntityIgneousPlate
import chylex.hee.init.ModBlocks
import chylex.hee.system.migration.Facing.EAST
import chylex.hee.system.migration.Facing.NORTH
import chylex.hee.system.migration.Facing.UP
import chylex.hee.system.migration.Facing.WEST
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.color.IntColor.Companion.RGB
import chylex.hee.system.util.component1
import chylex.hee.system.util.component2
import chylex.hee.system.util.component3
import chylex.hee.system.util.facades.Resource
import chylex.hee.system.util.floorToInt
import chylex.hee.system.util.get
import chylex.hee.system.util.getState
import chylex.hee.system.util.offsetTowards
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer
import net.minecraft.util.math.Vec3d
import org.lwjgl.opengl.GL11.GL_MODELVIEW
import org.lwjgl.opengl.GL11.GL_TEXTURE
@Sided(Side.CLIENT)
object RenderTileIgneousPlate : TileEntitySpecialRenderer<TileEntityIgneousPlate>(){
private val TEX_PLATE = Resource.Custom("textures/entity/igneous_plate.png")
private val COLOR_TRANSITIONS = arrayOf(
RGB(207, 187, 161).asVec,
RGB(247, 205, 82).asVec,
RGB(235, 23, 23).asVec
)
private fun getInnerBoxColor(combinedHeat: Float): Vec3d{
val index = combinedHeat.floorToInt().coerceIn(0, COLOR_TRANSITIONS.lastIndex - 1)
val progress = combinedHeat.toDouble() - index
return COLOR_TRANSITIONS[index].offsetTowards(COLOR_TRANSITIONS[index + 1], progress)
}
override fun render(tile: TileEntityIgneousPlate, x: Double, y: Double, z: Double, partialTicks: Float, destroyStage: Int, alpha: Float){
if (destroyStage >= 0){
bindTexture(DESTROY_STAGES[destroyStage])
GL.matrixMode(GL_TEXTURE)
GL.pushMatrix()
GL.scale(4F, 2F, 1F)
GL.matrixMode(GL_MODELVIEW)
}
else{
bindTexture(TEX_PLATE)
}
val state = tile.pos.getState(tile.world)
if (state.block !== ModBlocks.IGNEOUS_PLATE){
return
}
GL.pushMatrix()
GL.translate(x, y, z)
when(state[BlockIgneousPlate.FACING_NOT_DOWN]){
UP -> {
GL.translate(0F, 0F, 1F)
GL.rotate(-90F, 1F, 0F, 0F)
}
NORTH -> {
GL.translate(1F, 0F, 1F)
GL.rotate(180F, 0F, 1F, 0F)
}
WEST -> {
GL.translate(1F, 0F, 0F)
GL.rotate(-90F, 0F, 1F, 0F)
}
EAST -> {
GL.translate(0F, 0F, 1F)
GL.rotate(90F, 0F, 1F, 0F)
}
else -> {}
}
GL.enableRescaleNormal()
GL.color(1F, 1F, 1F, alpha)
if (destroyStage < 0){
ModelBlockIgneousPlate.renderOuterBox()
val (r, g, b) = getInnerBoxColor(tile.clientCombinedHeat)
GL.color(r.toFloat(), g.toFloat(), b.toFloat(), alpha)
}
GL.disableLighting()
ModelBlockIgneousPlate.renderInnerBox(tile.clientThrustAnimation.get(partialTicks))
GL.enableLighting()
GL.disableRescaleNormal()
GL.popMatrix()
if (destroyStage >= 0){
GL.matrixMode(GL_TEXTURE)
GL.popMatrix()
GL.matrixMode(GL_MODELVIEW)
}
}
}
@@ -1,128 +0,0 @@
package chylex.hee.client.render.block
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.TESSELLATOR
import chylex.hee.client.render.util.draw
import chylex.hee.client.util.MC
import chylex.hee.game.block.BlockJarODust
import chylex.hee.game.block.entity.TileEntityJarODust
import chylex.hee.game.mechanics.dust.DustLayers
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import chylex.hee.system.util.floorToInt
import chylex.hee.system.util.getListOfCompounds
import chylex.hee.system.util.heeTagOrNull
import net.minecraft.block.Block
import net.minecraft.client.renderer.RenderHelper
import net.minecraft.client.renderer.tileentity.TileEntityItemStackRenderer
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer
import net.minecraft.client.renderer.vertex.DefaultVertexFormats
import net.minecraft.item.ItemStack
import org.lwjgl.opengl.GL11.GL_QUADS
@Sided(Side.CLIENT)
object RenderTileJarODust : TileEntitySpecialRenderer<TileEntityJarODust>(){
private val TEX_LAYER = Resource.Custom("textures/entity/dust_layer.png")
private const val TEX_MP = 1.6
private val AABB = BlockJarODust.AABB
private const val EPSILON_Y = 0.025
private const val EPSILON_XZ = 0.005
override fun render(tile: TileEntityJarODust, x: Double, y: Double, z: Double, partialTicks: Float, destroyStage: Int, alpha: Float){
GL.color(1F, 1F, 1F, alpha)
RenderHelper.disableStandardItemLighting()
renderLayers(tile.layers, x, y, z)
}
private fun renderLayers(layers: DustLayers, x: Double, y: Double, z: Double){ // TODO could work as FastTESR
val contents = layers.contents.takeUnless { it.isEmpty() } ?: return
val unit = AABB.let { it.maxY - it.minY - (EPSILON_Y * 2) } / layers.totalCapacity
MC.textureManager.bindTexture(TEX_LAYER)
GL.pushMatrix()
GL.translate(x, y + AABB.minY + EPSILON_Y, z)
val minX = AABB.minX + EPSILON_XZ
val maxX = AABB.maxX - EPSILON_XZ
val minZ = AABB.minZ + EPSILON_XZ
val maxZ = AABB.maxZ - EPSILON_XZ
var minY = 0.0
for((index, info) in contents.withIndex()){
val (dustType, dustAmount) = info
val color = dustType.color
val height = dustAmount * unit
val maxY = minY + height
val texMin = 0.01 + (minY * TEX_MP)
val texMax = 0.01 + (maxY * TEX_MP)
val sideR = (color[0] / 1.125F).floorToInt().coerceAtLeast(0)
val sideG = (color[1] / 1.125F).floorToInt().coerceAtLeast(0)
val sideB = (color[2] / 1.125F).floorToInt().coerceAtLeast(0)
TESSELLATOR.draw(GL_QUADS, DefaultVertexFormats.POSITION_TEX_COLOR){
pos(minX, minY, minZ).tex(texMin, 0.0).color(sideR, sideG, sideB, 255).endVertex()
pos(minX, minY, maxZ).tex(texMin, 1.0).color(sideR, sideG, sideB, 255).endVertex()
pos(minX, maxY, maxZ).tex(texMax, 1.0).color(sideR, sideG, sideB, 255).endVertex()
pos(minX, maxY, minZ).tex(texMax, 0.0).color(sideR, sideG, sideB, 255).endVertex()
pos(maxX, minY, maxZ).tex(texMin, 0.0).color(sideR, sideG, sideB, 255).endVertex()
pos(maxX, minY, minZ).tex(texMin, 1.0).color(sideR, sideG, sideB, 255).endVertex()
pos(maxX, maxY, minZ).tex(texMax, 1.0).color(sideR, sideG, sideB, 255).endVertex()
pos(maxX, maxY, maxZ).tex(texMax, 0.0).color(sideR, sideG, sideB, 255).endVertex()
pos(maxX, minY, minZ).tex(texMin, 0.0).color(sideR, sideG, sideB, 255).endVertex()
pos(minX, minY, minZ).tex(texMin, 1.0).color(sideR, sideG, sideB, 255).endVertex()
pos(minX, maxY, minZ).tex(texMax, 1.0).color(sideR, sideG, sideB, 255).endVertex()
pos(maxX, maxY, minZ).tex(texMax, 0.0).color(sideR, sideG, sideB, 255).endVertex()
pos(minX, minY, maxZ).tex(texMin, 0.0).color(sideR, sideG, sideB, 255).endVertex()
pos(maxX, minY, maxZ).tex(texMin, 1.0).color(sideR, sideG, sideB, 255).endVertex()
pos(maxX, maxY, maxZ).tex(texMax, 1.0).color(sideR, sideG, sideB, 255).endVertex()
pos(minX, maxY, maxZ).tex(texMax, 0.0).color(sideR, sideG, sideB, 255).endVertex()
}
if (index == contents.lastIndex){
val topR = (color[0] * 1.125F).floorToInt().coerceAtMost(255)
val topG = (color[1] * 1.125F).floorToInt().coerceAtMost(255)
val topB = (color[2] * 1.125F).floorToInt().coerceAtMost(255)
TESSELLATOR.draw(GL_QUADS, DefaultVertexFormats.POSITION_TEX_COLOR){
pos(minX, maxY, minZ).tex(0.0, 0.0).color(topR, topG, topB, 255).endVertex()
pos(minX, maxY, maxZ).tex(0.0, 1.0).color(topR, topG, topB, 255).endVertex()
pos(maxX, maxY, maxZ).tex(1.0, 1.0).color(topR, topG, topB, 255).endVertex()
pos(maxX, maxY, minZ).tex(1.0, 0.0).color(topR, topG, topB, 255).endVertex()
}
}
minY = maxY
}
GL.popMatrix()
}
// TODO not implemented at the moment
object AsItem : TileEntityItemStackRenderer(){
private val layers = DustLayers(TileEntityJarODust.DUST_CAPACITY)
override fun renderByItem(stack: ItemStack, partialTicks: Float){
val dispatcher = MC.instance.blockRendererDispatcher
val state = Block.getBlockFromItem(stack.item).defaultState
val model = dispatcher.blockModelShapes.getModelForState(state)
dispatcher.blockModelRenderer.renderModelBrightness(model, state, 1F, true)
stack.heeTagOrNull?.getListOfCompounds(BlockJarODust.LAYERS_TAG)?.let {
layers.deserializeNBT(it)
renderLayers(layers, 0.0, 0.0, 0.0)
}
}
}
}
@@ -1,21 +0,0 @@
package chylex.hee.client.render.block
import chylex.hee.game.block.entity.TileEntityLootChest
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import net.minecraft.client.renderer.tileentity.TileEntityItemStackRenderer
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher
import net.minecraft.item.ItemStack
@Sided(Side.CLIENT)
object RenderTileLootChest : RenderTileAbstractChest<TileEntityLootChest>(){
override val texture = Resource.Custom("textures/entity/loot_chest.png")
object AsItem : TileEntityItemStackRenderer(){
private val tile = TileEntityLootChest()
override fun renderByItem(stack: ItemStack, partialTicks: Float){
TileEntityRendererDispatcher.instance.render(tile, 0.0, 0.0, 0.0, partialTicks)
}
}
}
@@ -1,39 +0,0 @@
package chylex.hee.client.render.block
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.ItemRenderHelper
import chylex.hee.client.util.MC
import chylex.hee.game.block.entity.TileEntityMinersBurialAltar
import chylex.hee.init.ModItems
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType.GROUND
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer
import net.minecraft.item.ItemStack
import net.minecraftforge.client.ForgeHooksClient
@Sided(Side.CLIENT)
object RenderTileMinersBurialAltar : TileEntitySpecialRenderer<TileEntityMinersBurialAltar>(){
private val PUZZLE_MEDALLION = ItemStack(ModItems.PUZZLE_MEDALLION)
private const val SCALE_XZ = 1.85F
override fun render(tile: TileEntityMinersBurialAltar, x: Double, y: Double, z: Double, partialTicks: Float, destroyStage: Int, alpha: Float){
if (!tile.hasMedallion){
return
}
ItemRenderHelper.beginItemModel()
GL.pushMatrix()
GL.translate(x, y, z)
GL.pushMatrix()
GL.translate(0.5F, 0.7725F - (0.035F * tile.clientMedallionAnimProgress), 0.625F + 0.125F * (SCALE_XZ - 1F))
GL.rotate(270F, 1F, 0F, 0F)
GL.scale(SCALE_XZ, SCALE_XZ, 1.5F)
MC.itemRenderer.renderItem(PUZZLE_MEDALLION, ForgeHooksClient.handleCameraTransforms(ItemRenderHelper.getItemModel(PUZZLE_MEDALLION), GROUND, false))
GL.popMatrix()
GL.popMatrix()
ItemRenderHelper.endItemModel()
}
}
@@ -1,28 +0,0 @@
package chylex.hee.client.render.block
import chylex.hee.client.render.util.GL
import chylex.hee.client.util.MC
import chylex.hee.game.block.entity.base.TileEntityBaseSpawner
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer
import kotlin.math.max
@Sided(Side.CLIENT)
object RenderTileSpawner : TileEntitySpecialRenderer<TileEntityBaseSpawner>(){
override fun render(tile: TileEntityBaseSpawner, x: Double, y: Double, z: Double, partialTicks: Float, destroyStage: Int, alpha: Float){
val entity = tile.clientEntity
val scale = 0.53125F / max(entity.width, entity.height).coerceAtLeast(1F)
GL.pushMatrix()
GL.translate(x + 0.5, y + 0.4, z + 0.5)
GL.rotate(tile.clientRotation.get(partialTicks) * 10F, 0F, 1F, 0F)
GL.translate(0F, -0.2F, 0F)
GL.rotate(-30F, 1F, 0F, 0F)
GL.scale(scale, scale, scale)
entity.setLocationAndAngles(x, y, z, 0F, 0F)
MC.renderManager.renderEntity(entity, 0.0, 0.0, 0.0, 0F, partialTicks, false)
GL.popMatrix()
}
}
@@ -1,70 +0,0 @@
package chylex.hee.client.render.block
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.ItemRenderHelper
import chylex.hee.client.render.util.TESSELLATOR
import chylex.hee.client.render.util.draw
import chylex.hee.client.util.MC
import chylex.hee.game.block.entity.TileEntityJarODust
import chylex.hee.game.block.entity.base.TileEntityBaseTable
import chylex.hee.game.mechanics.dust.DustLayers
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.Vec3
import chylex.hee.system.util.addY
import chylex.hee.system.util.center
import chylex.hee.system.util.color.IntColor.Companion.RGBA
import chylex.hee.system.util.getTile
import chylex.hee.system.util.lookPosVec
import net.minecraft.client.renderer.OpenGlHelper
import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType.GUI
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer
import net.minecraft.client.renderer.vertex.DefaultVertexFormats
import net.minecraft.item.ItemStack
import net.minecraftforge.client.ForgeHooksClient
import net.minecraftforge.client.model.pipeline.LightUtil
import org.lwjgl.opengl.GL11.GL_QUADS
@Sided(Side.CLIENT)
object RenderTileTable : TileEntitySpecialRenderer<TileEntityBaseTable>(){
private val COLOR = RGBA(180, 180, 180, 120).i
private const val Y_OFFSET = 0.8F
override fun render(tile: TileEntityBaseTable, x: Double, y: Double, z: Double, partialTicks: Float, destroyStage: Int, alpha: Float){
val dustType = tile.tableDustType ?: return
if (tile.pos.up().getTile<TileEntityJarODust>(world)?.layers?.getDustType(DustLayers.Side.BOTTOM) == dustType){
return
}
ItemRenderHelper.beginItemModel()
GL.pushMatrix()
GL.translate(x, y, z)
GL.pushMatrix()
val rotation = (MC.systemTime % 360000L) / 25F
val center = tile.pos.center.addY(Y_OFFSET.toDouble())
val flip = if (center.subtract(MC.player!!.lookPosVec).dotProduct(Vec3.fromYaw(360F - rotation)) > 0.0) 180F else 0F
GL.translate(0.5F, 0.5F + Y_OFFSET, 0.5F)
GL.rotate(rotation + flip, 0F, 1F, 0F)
GL.scale(0.5F, 0.5F, 0.02F)
val itemStack = ItemStack(dustType.item)
val itemModel = ForgeHooksClient.handleCameraTransforms(ItemRenderHelper.getItemModel(itemStack), GUI, false)
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 61680F, 0F)
GL.translate(-0.5F, -0.5F, -0.5F)
TESSELLATOR.draw(GL_QUADS, DefaultVertexFormats.ITEM){
val quads = itemModel.getQuads(null, null, 0L)
for(quad in quads){
LightUtil.renderQuadColor(this, quad, COLOR)
}
}
GL.popMatrix()
GL.popMatrix()
ItemRenderHelper.endItemModel()
}
}
@@ -1,180 +0,0 @@
package chylex.hee.client.render.block
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.ItemRenderHelper
import chylex.hee.client.render.util.TESSELLATOR
import chylex.hee.client.render.util.draw
import chylex.hee.client.util.MC
import chylex.hee.game.block.BlockTablePedestal
import chylex.hee.game.block.entity.TileEntityTablePedestal
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import chylex.hee.system.util.nextFloat
import chylex.hee.system.util.size
import chylex.hee.system.util.square
import chylex.hee.system.util.toRadians
import net.minecraft.client.renderer.RenderItem
import net.minecraft.client.renderer.block.model.IBakedModel
import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType.GROUND
import net.minecraft.client.renderer.texture.TextureManager
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer
import net.minecraft.client.renderer.vertex.DefaultVertexFormats
import net.minecraft.item.Item
import net.minecraft.item.ItemStack
import net.minecraftforge.client.ForgeHooksClient
import org.lwjgl.opengl.GL11.GL_ALWAYS
import org.lwjgl.opengl.GL11.GL_GREATER
import org.lwjgl.opengl.GL11.GL_QUADS
import java.util.Collections
import java.util.Random
import kotlin.math.cos
import kotlin.math.sin
@Sided(Side.CLIENT)
object RenderTileTablePedestal : TileEntitySpecialRenderer<TileEntityTablePedestal>(){
private val TEX_SHADOW = Resource.Vanilla("textures/misc/shadow.png")
private val RAND = Random()
private const val SHADOW_XZ_MIN = 0.325
private const val SHADOW_XZ_MAX = 0.675
private val SHADOW_Y = BlockTablePedestal.COMBINED_BOX.maxY + 0.0015625 // between the top of the pedestal and the status indicator
private const val SPREAD_DEPTH_PER_2D_MODEL = 0.09375F
private const val SPREAD_RAND_2D = 0.13125F
private const val SPREAD_RAND_3D_XZ = 0.2625F
private const val SPREAD_RAND_3D_Y = 0.39375F
private val ITEM_ANGLES = (1..9).run {
val section = 360F / endInclusive
map { (it - 0.5F) * section }
}
private fun getItemModelCount(stackSize: Int) = when{
stackSize > 48 -> 5
stackSize > 32 -> 4
stackSize > 16 -> 3
stackSize > 1 -> 2
else -> 1
}
override fun render(tile: TileEntityTablePedestal, x: Double, y: Double, z: Double, partialTicks: Float, destroyStage: Int, alpha: Float){
val textureManager = MC.textureManager
val itemRenderer = MC.itemRenderer
ItemRenderHelper.beginItemModel()
GL.pushMatrix()
GL.translate(x, y, z)
val pos = tile.pos
val stacks = tile.stacksForRendering
val itemRotation = (MC.systemTime % 360000L) / 20F
val baseSeed = pos.toLong()
val offsetAngleIndices = if (stacks.size <= 1)
Collections.emptyList()
else
ITEM_ANGLES.toMutableList()
val shadowAlpha = if (MC.settings.entityShadows)
(0.25 * world.getLightBrightness(pos) * (1.0 - (square(x) + square(y) + square(z)) / 256.0)).toFloat().coerceAtMost(1F)
else
0F
for((index, stack) in stacks.withIndex()){
renderItemStack(textureManager, itemRenderer, stack, index, itemRotation, baseSeed, offsetAngleIndices, shadowAlpha)
}
GL.popMatrix()
ItemRenderHelper.endItemModel()
}
private fun renderItemStack(textureManager: TextureManager, renderer: RenderItem, stack: ItemStack, index: Int, baseRotation: Float, baseSeed: Long, offsetAngleIndices: MutableList<Float>, shadowAlpha: Float){
GL.pushMatrix()
var offsetY = 0F
var rotationMp = 1F
if (index > 0 && offsetAngleIndices.isNotEmpty()){
val seed = baseSeed + ((Item.getIdFromItem(stack.item) + stack.metadata) xor (33867 shl index))
RAND.setSeed(seed)
val locDistance = RAND.nextFloat(0.26F, 0.29F)
val locIndex = RAND.nextInt(offsetAngleIndices.size)
val locAngle = (offsetAngleIndices.removeAt(locIndex) + RAND.nextFloat(-3F, 3F)).toRadians()
GL.translate(cos(locAngle) * locDistance, 0F, sin(locAngle) * locDistance)
offsetY = RAND.nextFloat(0F, 0.05F)
rotationMp = RAND.nextFloat(0.4F, 1.2F)
}
if (shadowAlpha > 0F){
GL.depthMask(false)
GL.alphaFunc(GL_ALWAYS, 0F)
textureManager.bindTexture(TEX_SHADOW)
renderShadow(shadowAlpha)
GL.depthMask(true)
GL.alphaFunc(GL_GREATER, 0.1F)
textureManager.bindTexture(ItemRenderHelper.TEX_BLOCKS_ITEMS)
}
val baseModel = ItemRenderHelper.getItemModel(stack)
val isModel3D = baseModel.isGui3d
val baseY = if (isModel3D) 0.8325F else 1F
GL.translate(0.5F, baseY + offsetY, 0.5F)
GL.rotate(baseRotation * rotationMp, 0F, 1F, 0F)
renderItemWithSpread(renderer, stack, ForgeHooksClient.handleCameraTransforms(baseModel, GROUND, false), isModel3D)
GL.popMatrix()
}
private fun renderItemWithSpread(renderer: RenderItem, stack: ItemStack, model: IBakedModel, isModel3D: Boolean){
val extraModels = getItemModelCount(stack.size) - 1
if (extraModels > 0){
RAND.setSeed((Item.getIdFromItem(stack.item) + stack.metadata).toLong())
if (!isModel3D){
GL.translate(0F, 0F, -SPREAD_DEPTH_PER_2D_MODEL * (extraModels / 2F))
}
}
renderer.renderItem(stack, model)
repeat(extraModels){
GL.pushMatrix()
if (isModel3D){
GL.translate(
RAND.nextFloat(-SPREAD_RAND_3D_XZ, SPREAD_RAND_3D_XZ),
RAND.nextFloat(-SPREAD_RAND_3D_Y, SPREAD_RAND_3D_Y),
RAND.nextFloat(-SPREAD_RAND_3D_XZ, SPREAD_RAND_3D_XZ)
)
}
else{
GL.translate(
RAND.nextFloat(-SPREAD_RAND_2D, SPREAD_RAND_2D),
RAND.nextFloat(-SPREAD_RAND_2D, SPREAD_RAND_2D),
SPREAD_DEPTH_PER_2D_MODEL * (it + 1)
)
}
renderer.renderItem(stack, model)
GL.popMatrix()
}
}
private fun renderShadow(alpha: Float){
TESSELLATOR.draw(GL_QUADS, DefaultVertexFormats.POSITION_TEX_COLOR){
pos(SHADOW_XZ_MIN, SHADOW_Y, SHADOW_XZ_MIN).tex(0.0, 0.0).color(1F, 1F, 1F, alpha).endVertex()
pos(SHADOW_XZ_MIN, SHADOW_Y, SHADOW_XZ_MAX).tex(0.0, 1.0).color(1F, 1F, 1F, alpha).endVertex()
pos(SHADOW_XZ_MAX, SHADOW_Y, SHADOW_XZ_MAX).tex(1.0, 1.0).color(1F, 1F, 1F, alpha).endVertex()
pos(SHADOW_XZ_MAX, SHADOW_Y, SHADOW_XZ_MIN).tex(1.0, 0.0).color(1F, 1F, 1F, alpha).endVertex()
}
}
}
@@ -1,41 +0,0 @@
package chylex.hee.client.render.block
import chylex.hee.game.block.BlockAbstractPortal
import chylex.hee.game.block.BlockVoidPortalInner.Companion.TYPE
import chylex.hee.game.block.BlockVoidPortalInner.IVoidPortalController
import chylex.hee.game.block.BlockVoidPortalInner.Type.HUB
import chylex.hee.game.block.BlockVoidPortalInner.Type.RETURN_ACTIVE
import chylex.hee.game.block.entity.TileEntityPortalInner
import chylex.hee.game.block.entity.TileEntityVoidPortalStorage
import chylex.hee.game.world.territory.TerritoryInstance.Companion.THE_HUB_INSTANCE
import chylex.hee.init.ModBlocks
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.closestTickingTile
import chylex.hee.system.util.get
import chylex.hee.system.util.getState
import chylex.hee.system.util.math.LerpedFloat
import net.minecraft.util.math.BlockPos
import net.minecraft.world.World
@Sided(Side.CLIENT)
object RenderTileVoidPortal : RenderTileAbstractPortal<TileEntityPortalInner.Void, IVoidPortalController>(){
private object ActiveReturnController : IVoidPortalController{
override val currentInstance = THE_HUB_INSTANCE
override val clientAnimationProgress = LerpedFloat(1F)
override val clientPortalOffset = LerpedFloat(0F)
}
override fun findController(world: World, pos: BlockPos) = when(pos.getState(world).takeIf { it.block === ModBlocks.VOID_PORTAL_INNER }?.get(TYPE)){
HUB -> pos.closestTickingTile<TileEntityVoidPortalStorage>(world, BlockAbstractPortal.MAX_DISTANCE_FROM_FRAME)
RETURN_ACTIVE -> ActiveReturnController
else -> null
}
override fun generateSeed(controller: IVoidPortalController): Long{
return controller.currentInstance?.territory?.desc?.colors?.portalSeed ?: 0L
}
override fun generateNextColor(controller: IVoidPortalController, layer: Int){
controller.currentInstance?.territory?.desc?.colors?.nextPortalColor(rand, color)
}
}
@@ -1,25 +0,0 @@
package chylex.hee.client.render.entity
import chylex.hee.client.model.entity.ModelEntityBossEnderEye
import chylex.hee.client.model.entity.ModelEntityBossEnderEye.SCALE
import chylex.hee.client.render.util.GL
import chylex.hee.game.entity.living.EntityBossEnderEye
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import net.minecraft.client.renderer.entity.RenderLiving
import net.minecraft.client.renderer.entity.RenderManager
import net.minecraft.util.ResourceLocation
@Sided(Side.CLIENT)
class RenderEntityBossEnderEye(manager: RenderManager) : RenderLiving<EntityBossEnderEye>(manager, ModelEntityBossEnderEye, SCALE){
private val texture = Resource.Custom("textures/entity/ender_eye.png")
override fun preRenderCallback(entity: EntityBossEnderEye, partialTicks: Float){
GL.scale(SCALE, SCALE, SCALE)
super.preRenderCallback(entity, partialTicks)
}
override fun getEntityTexture(entity: EntityBossEnderEye): ResourceLocation{
return texture
}
}
@@ -1,11 +0,0 @@
package chylex.hee.client.render.entity
import chylex.hee.client.util.MC
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.renderer.entity.RenderEntityItem
import net.minecraft.client.renderer.entity.RenderManager
@Sided(Side.CLIENT)
class RenderEntityItemNoBob(manager: RenderManager) : RenderEntityItem(manager, MC.itemRenderer){
override fun shouldBob() = false
}
@@ -1,77 +0,0 @@
package chylex.hee.client.render.entity
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.GL.DF_ONE_MINUS_SRC_ALPHA
import chylex.hee.client.render.util.GL.SF_SRC_ALPHA
import chylex.hee.game.entity.living.EntityMobAbstractEnderman
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.nextFloat
import chylex.hee.system.util.totalTime
import net.minecraft.client.renderer.entity.RenderEnderman
import net.minecraft.client.renderer.entity.RenderManager
import net.minecraft.entity.monster.EntityEnderman
import org.lwjgl.opengl.GL11.GL_GREATER
import java.util.Random
@Sided(Side.CLIENT)
open class RenderEntityMobAbstractEnderman(manager: RenderManager) : RenderEnderman(manager){
private val rand = Random()
override fun doRender(entity: EntityEnderman, x: Double, y: Double, z: Double, rotationYaw: Float, partialTicks: Float){
if (entity !is EntityMobAbstractEnderman){
return
}
if (entity.isShaking){
rand.setSeed(entity.world.totalTime)
super.doRender(entity, x + (rand.nextGaussian() * 0.01), y + (rand.nextGaussian() * 0.01), z + (rand.nextGaussian() * 0.01), rotationYaw, partialTicks)
}
else{
super.doRender(entity, x, y, z, rotationYaw, partialTicks)
}
val cloneCount = getCloneCount(entity)
if (cloneCount > 0){
rand.setSeed(entity.world.totalTime * 2L / 3L)
val prevPrevYaw = entity.prevRotationYawHead
val prevYaw = entity.rotationYawHead
val prevPrevPitch = entity.prevRotationPitch
val prevPitch = entity.rotationPitch
repeat(cloneCount){
GL.enableBlend()
GL.blendFunc(SF_SRC_ALPHA, DF_ONE_MINUS_SRC_ALPHA)
GL.alphaFunc(GL_GREATER, 0.004F)
GL.depthMask(false)
GL.color(1F, 1F, 1F, rand.nextFloat(0.05F, 0.3F))
if (rand.nextInt(3) == 0){
entity.rotationYawHead += rand.nextFloat(-45F, 45F)
entity.prevRotationYawHead = entity.rotationYawHead
entity.rotationPitch += rand.nextFloat(-30F, 30F)
entity.prevRotationPitch = entity.rotationPitch
}
super.doRender(entity, x + rand.nextGaussian() * 0.04, y + rand.nextGaussian() * 0.025, z + rand.nextGaussian() * 0.04, rotationYaw, partialTicks)
}
entity.prevRotationYawHead = prevPrevYaw
entity.rotationYawHead = prevYaw
entity.prevRotationPitch = prevPrevPitch
entity.rotationPitch = prevPitch
GL.depthMask(true)
GL.alphaFunc(GL_GREATER, 0.1F)
GL.disableBlend()
}
}
protected open fun getCloneCount(entity: EntityMobAbstractEnderman): Int{
return if (entity.hurtTime == 0 && entity.isAggressive) 2 else 0
}
}
@@ -1,14 +0,0 @@
package chylex.hee.client.render.entity
import chylex.hee.game.entity.living.EntityMobAbstractEnderman
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.renderer.entity.RenderManager
@Sided(Side.CLIENT)
class RenderEntityMobAngryEnderman(manager: RenderManager) : RenderEntityMobAbstractEnderman(manager){
override fun getCloneCount(entity: EntityMobAbstractEnderman) = when{
entity.hurtTime != 0 -> 0
entity.isAggressive -> 2
else -> 1
}
}
@@ -1,33 +0,0 @@
package chylex.hee.client.render.entity
import chylex.hee.client.render.entity.layer.LayerSpiderlingEyes
import chylex.hee.client.render.util.GL
import chylex.hee.game.entity.living.EntityMobSpiderling
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import net.minecraft.client.model.ModelSpider
import net.minecraft.client.renderer.entity.RenderLiving
import net.minecraft.client.renderer.entity.RenderManager
import net.minecraft.util.ResourceLocation
@Sided(Side.CLIENT)
class RenderEntityMobSpiderling(manager: RenderManager) : RenderLiving<EntityMobSpiderling>(manager, ModelSpider(), 0.5F){
private val texture = Resource.Custom("textures/entity/spiderling.png")
init{
addLayer(LayerSpiderlingEyes(this, (mainModel as ModelSpider).spiderHead))
}
override fun preRenderCallback(entity: EntityMobSpiderling, partialTicks: Float){
GL.scale(0.5F, 0.5F, 0.5F)
super.preRenderCallback(entity, partialTicks)
}
override fun getEntityTexture(entity: EntityMobSpiderling): ResourceLocation{
return texture
}
override fun getDeathMaxRotation(entity: EntityMobSpiderling): Float{
return 180F
}
}
@@ -1,39 +0,0 @@
package chylex.hee.client.render.entity
import chylex.hee.client.render.util.GL
import chylex.hee.game.entity.living.EntityMobUndread
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import net.minecraft.client.model.ModelZombie
import net.minecraft.client.renderer.entity.RenderBiped
import net.minecraft.client.renderer.entity.RenderManager
import net.minecraft.client.renderer.entity.layers.LayerBipedArmor
import net.minecraft.util.ResourceLocation
@Sided(Side.CLIENT)
class RenderEntityMobUndread(manager: RenderManager) : RenderBiped<EntityMobUndread>(manager, ModelZombie(), 0.5F){
private val texture = Resource.Custom("textures/entity/undread.png")
init{
addLayer(object : LayerBipedArmor(this){
override fun initArmor(){
modelLeggings = ModelZombie(0.5125F, true)
modelArmor = ModelZombie(1F, true)
}
})
}
override fun preRenderCallback(entity: EntityMobUndread, partialTicks: Float){
GL.scale(1.025F, 0.965F, 1.025F)
super.preRenderCallback(entity, partialTicks)
}
override fun getEntityTexture(entity: EntityMobUndread): ResourceLocation{
return texture
}
override fun getDeathMaxRotation(entity: EntityMobUndread): Float{
val uuid = entity.uniqueID
return 15F * (if ((uuid.leastSignificantBits % 2L) xor (uuid.mostSignificantBits % 2L) == 0L) 1F else -1F)
}
}
@@ -1,17 +0,0 @@
package chylex.hee.client.render.entity
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import net.minecraft.client.renderer.entity.RenderBat
import net.minecraft.client.renderer.entity.RenderManager
import net.minecraft.entity.passive.EntityBat
import net.minecraft.util.ResourceLocation
@Sided(Side.CLIENT)
class RenderEntityMobVampireBat(manager: RenderManager) : RenderBat(manager){
private val texture = Resource.Custom("textures/entity/vampire_bat.png")
override fun getEntityTexture(entity: EntityBat): ResourceLocation{
return texture
}
}
@@ -1,57 +0,0 @@
package chylex.hee.client.render.entity
import chylex.hee.client.render.util.GL
import chylex.hee.game.entity.living.EntityMobVillagerDying
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.totalTime
import net.minecraft.client.model.ModelVillager
import net.minecraft.client.renderer.entity.RenderLiving
import net.minecraft.client.renderer.entity.RenderManager
import net.minecraft.util.ResourceLocation
import java.util.Random
import kotlin.math.min
@Sided(Side.CLIENT)
class RenderEntityMobVillagerDying(manager: RenderManager) : RenderLiving<EntityMobVillagerDying>(manager, ModelVillager(0F), 0.5F){
private val rand = Random()
override fun doRender(entity: EntityMobVillagerDying, x: Double, y: Double, z: Double, rotationYaw: Float, partialTicks: Float){
rand.setSeed(entity.world.totalTime)
val mp = min(1F, entity.deathTime / 50F) * 0.005F
super.doRender(entity, x + (rand.nextGaussian() * mp), y + (rand.nextGaussian() * mp), z + (rand.nextGaussian() * mp), rotationYaw, partialTicks)
}
override fun getEntityTexture(entity: EntityMobVillagerDying): ResourceLocation?{
return entity.profession?.skin
}
override fun preRenderCallback(entity: EntityMobVillagerDying, partialTicks: Float){
val scale: Float
if (entity.isChild){
scale = 0.46875F
shadowSize = 0.25F
}
else{
scale = 0.9375F
shadowSize = 0.5F
}
GL.scale(scale, scale, scale)
}
override fun setBrightness(entity: EntityMobVillagerDying, partialTicks: Float, combineTextures: Boolean): Boolean{
val prevDeathTime = entity.deathTime
entity.deathTime = 0
val result = super.setBrightness(entity, partialTicks, combineTextures)
entity.deathTime = prevDeathTime
return result
}
override fun getDeathMaxRotation(entity: EntityMobVillagerDying): Float{
return 0F
}
}
@@ -1,14 +0,0 @@
package chylex.hee.client.render.entity
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.renderer.culling.ICamera
import net.minecraft.client.renderer.entity.Render
import net.minecraft.client.renderer.entity.RenderManager
import net.minecraft.entity.Entity
import net.minecraft.util.ResourceLocation
@Sided(Side.CLIENT)
class RenderEntityNothing(manager: RenderManager) : Render<Entity>(manager){
override fun shouldRender(entity: Entity, camera: ICamera, camX: Double, camY: Double, camZ: Double) = false
override fun getEntityTexture(entity: Entity): ResourceLocation? = null
}
@@ -1,51 +0,0 @@
package chylex.hee.client.render.entity
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.ItemRenderHelper
import chylex.hee.client.util.MC
import chylex.hee.game.entity.projectile.EntityProjectileEyeOfEnder
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.migration.vanilla.Items
import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType.GROUND
import net.minecraft.client.renderer.entity.Render
import net.minecraft.client.renderer.entity.RenderManager
import net.minecraft.item.ItemStack
import net.minecraft.util.ResourceLocation
import net.minecraftforge.client.ForgeHooksClient
@Sided(Side.CLIENT)
class RenderEntityProjectileEyeOfEnder(manager: RenderManager) : Render<EntityProjectileEyeOfEnder>(manager){
private companion object{
private val RENDERED_ITEM = ItemStack(Items.ENDER_EYE)
}
override fun doRender(entity: EntityProjectileEyeOfEnder, x: Double, y: Double, z: Double, rotationYaw: Float, partialTicks: Float){
ItemRenderHelper.beginItemModel()
GL.pushMatrix()
GL.translate(x, y + entity.renderBob.get(partialTicks), z)
GL.rotate(rotationYaw, 0F, 1F, 0F)
GL.color(1F, 1F, 1F, 1F)
if (renderOutlines){
GL.enableColorMaterial()
GL.enableOutlineMode(getTeamColor(entity))
}
MC.itemRenderer.renderItem(RENDERED_ITEM, ForgeHooksClient.handleCameraTransforms(ItemRenderHelper.getItemModel(RENDERED_ITEM), GROUND, false))
if (renderOutlines){
GL.disableOutlineMode()
GL.disableColorMaterial()
}
GL.popMatrix()
ItemRenderHelper.endItemModel()
super.doRender(entity, x, y, z, rotationYaw, partialTicks)
}
override fun getEntityTexture(entity: EntityProjectileEyeOfEnder): ResourceLocation{
return ItemRenderHelper.TEX_BLOCKS_ITEMS
}
}
@@ -1,54 +0,0 @@
package chylex.hee.client.render.entity
import chylex.hee.client.model.entity.ModelEntityTokenHolder
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.GL.DF_ONE_MINUS_SRC_ALPHA
import chylex.hee.client.render.util.GL.SF_SRC_ALPHA
import chylex.hee.game.entity.item.EntityTokenHolder
import chylex.hee.game.item.ItemPortalToken.TokenType.NORMAL
import chylex.hee.game.item.ItemPortalToken.TokenType.RARE
import chylex.hee.game.item.ItemPortalToken.TokenType.SOLITARY
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import net.minecraft.client.renderer.entity.Render
import net.minecraft.client.renderer.entity.RenderManager
import net.minecraft.util.ResourceLocation
import kotlin.math.pow
@Sided(Side.CLIENT)
class RenderEntityTokenHolder(manager: RenderManager) : Render<EntityTokenHolder>(manager){
private val textures = mapOf(
NORMAL to Resource.Custom("textures/entity/token_holder.png"),
RARE to Resource.Custom("textures/entity/token_holder_rare.png"),
SOLITARY to Resource.Custom("textures/entity/token_holder_solitary.png")
)
override fun doRender(entity: EntityTokenHolder, x: Double, y: Double, z: Double, rotationYaw: Float, partialTicks: Float){
val charge = entity.renderCharge.get(partialTicks)
val scale = 0.25F + (0.25F * charge.pow(1.5F))
val alpha = 0.35F + (0.475F * charge.pow(5.5F))
GL.pushMatrix()
GL.translate(x, y + (entity.height * 0.5F), z)
GL.pushMatrix()
GL.scale(scale, scale, scale)
GL.rotate(entity.renderRotation.get(partialTicks), 0F, 1F, 0F)
GL.rotate(55F, 1F, 0F, 1F)
GL.enableBlend()
GL.blendFunc(SF_SRC_ALPHA, DF_ONE_MINUS_SRC_ALPHA)
GL.color(1F, 1F, 1F, alpha)
bindEntityTexture(entity)
ModelEntityTokenHolder.render()
GL.popMatrix()
GL.disableBlend()
GL.popMatrix()
}
override fun getEntityTexture(entity: EntityTokenHolder): ResourceLocation?{
return textures[entity.tokenType]
}
}
@@ -1,20 +0,0 @@
package chylex.hee.client.render.entity.layer
import chylex.hee.client.render.block.RenderTileEndermanHead
import chylex.hee.init.ModItems
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.model.ModelRenderer
import net.minecraft.client.renderer.entity.layers.LayerRenderer
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.inventory.EntityEquipmentSlot.HEAD
@Sided(Side.CLIENT)
class LayerEndermanHead(private val headModel: ModelRenderer) : LayerRenderer<EntityPlayer>{
override fun doRenderLayer(entity: EntityPlayer, limbSwing: Float, limbSwingAmount: Float, partialTicks: Float, entityTickTime: Float, rotationYaw: Float, rotationPitch: Float, scale: Float){
if (entity.getItemStackFromSlot(HEAD).item === ModItems.ENDERMAN_HEAD){
RenderTileEndermanHead.AsHeadLayer(entity, headModel)
}
}
override fun shouldCombineTextures() = false
}
@@ -1,55 +0,0 @@
package chylex.hee.client.render.entity.layer
import chylex.hee.client.render.entity.RenderEntityMobSpiderling
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.GL.DF_ONE
import chylex.hee.client.render.util.GL.SF_ONE
import chylex.hee.client.util.MC
import chylex.hee.game.entity.living.EntityMobSpiderling
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import net.minecraft.client.model.ModelRenderer
import net.minecraft.client.renderer.OpenGlHelper
import net.minecraft.client.renderer.entity.layers.LayerRenderer
@Sided(Side.CLIENT)
class LayerSpiderlingEyes(private val spiderlingRenderer: RenderEntityMobSpiderling, private val headRenderer: ModelRenderer) : LayerRenderer<EntityMobSpiderling>{
private val texture = Resource.Custom("textures/entity/spiderling_eyes.png")
override fun doRenderLayer(entity: EntityMobSpiderling, limbSwing: Float, limbSwingAmount: Float, partialTicks: Float, ageInTicks: Float, netHeadYaw: Float, headPitch: Float, scale: Float){
if (entity.isSleeping){
return
}
spiderlingRenderer.bindTexture(texture)
GL.color(1F, 1F, 1F, 1F)
GL.disableAlpha()
GL.enableBlend()
GL.blendFunc(SF_ONE, DF_ONE)
GL.depthMask(!entity.isInvisible)
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 61680F, 0F)
MC.entityRenderer.setupFogColor(true)
if (headPitch == 0F){
GL.pushMatrix()
GL.scale(1.001, 1.001, 1.001) // hack around z-fighting
headRenderer.render(scale)
GL.popMatrix()
}
else{
headRenderer.render(scale)
}
spiderlingRenderer.setLightmap(entity)
MC.entityRenderer.setupFogColor(false)
GL.disableBlend()
GL.enableAlpha()
}
override fun shouldCombineTextures(): Boolean{
return false
}
}
@@ -1,11 +0,0 @@
package chylex.hee.client.render.territory
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.Minecraft
import net.minecraft.client.multiplayer.WorldClient
import net.minecraftforge.client.IRenderHandler
object EmptyRenderer : IRenderHandler(){
@Sided(Side.CLIENT)
override fun render(partialTicks: Float, world: WorldClient, mc: Minecraft){}
}
@@ -1,49 +0,0 @@
package chylex.hee.client.render.territory
import chylex.hee.client.render.TerritoryRenderer
import chylex.hee.client.render.territory.components.SkyCubeStatic
import chylex.hee.client.render.util.GL
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import chylex.hee.system.util.remapRange
import net.minecraft.client.Minecraft
import net.minecraft.client.multiplayer.WorldClient
import net.minecraft.client.renderer.EntityRenderer
import net.minecraft.util.math.Vec3d
import net.minecraftforge.client.IRenderHandler
import kotlin.math.pow
class EnvironmentRenderer(private vararg val renderers: IRenderHandler) : IRenderHandler(){
companion object{
val currentSkyAlpha
@Sided(Side.CLIENT)
get() = remapRange(TerritoryRenderer.VOID_FACTOR_VALUE, (-1F)..(0.5F), (1F)..(0F)).coerceIn(0F, 1F)
val currentFogDensityMp
@Sided(Side.CLIENT)
get() = 1F + (9F * remapRange(TerritoryRenderer.VOID_FACTOR_VALUE, (-0.5F)..(1F), (0F)..(1F)).coerceIn(0F, 1F).pow(1.5F))
val VANILLA = EnvironmentRenderer(
SkyCubeStatic(
texture = Resource.Vanilla("textures/environment/end_sky.png"),
color = (40.0 / 255.0).let { Vec3d(it, it, it) },
distance = 100.0
)
)
}
@Sided(Side.CLIENT)
override fun render(partialTicks: Float, world: WorldClient, mc: Minecraft){
if (mc.gameSettings.anaglyph && EntityRenderer.anaglyphField != 0){
return
}
GL.depthMask(false)
for(renderer in renderers){
renderer.render(partialTicks, world, mc)
}
GL.depthMask(true)
}
}
@@ -1,78 +0,0 @@
package chylex.hee.client.render.territory.components
import chylex.hee.client.render.territory.EnvironmentRenderer
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.GL.DF_ONE_MINUS_SRC_ALPHA
import chylex.hee.client.render.util.GL.DF_ZERO
import chylex.hee.client.render.util.GL.SF_ONE
import chylex.hee.client.render.util.GL.SF_SRC_ALPHA
import chylex.hee.client.render.util.TESSELLATOR
import chylex.hee.client.render.util.draw
import chylex.hee.client.util.MC
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.Minecraft
import net.minecraft.client.multiplayer.WorldClient
import net.minecraft.client.renderer.RenderHelper
import net.minecraft.client.renderer.vertex.DefaultVertexFormats
import net.minecraft.util.ResourceLocation
import net.minecraft.util.math.Vec3d
import net.minecraftforge.client.IRenderHandler
import org.lwjgl.opengl.GL11.GL_GREATER
import org.lwjgl.opengl.GL11.GL_QUADS
abstract class SkyCubeBase : IRenderHandler(){
protected companion object{
const val DEFAULT_ALPHA = 1F
const val DEFAULT_DISTANCE = 125.0
}
protected abstract val texture: ResourceLocation
protected abstract val color: Vec3d
protected open val alpha = DEFAULT_ALPHA
protected open val distance = DEFAULT_DISTANCE
@Sided(Side.CLIENT)
override fun render(partialTicks: Float, world: WorldClient, mc: Minecraft){
val dist = distance
val col = color
val red = col.x.toFloat()
val green = col.y.toFloat()
val blue = col.z.toFloat()
GL.enableBlend()
GL.blendFunc(SF_SRC_ALPHA, DF_ONE_MINUS_SRC_ALPHA, SF_ONE, DF_ZERO)
GL.enableAlpha()
GL.alphaFunc(GL_GREATER, 0F)
GL.disableFog()
RenderHelper.disableStandardItemLighting()
GL.color(red, green, blue, alpha * EnvironmentRenderer.currentSkyAlpha)
MC.textureManager.bindTexture(texture)
for(side in 0..5){
GL.pushMatrix()
when(side){
1 -> GL.rotate( 90F, 1F, 0F, 0F)
2 -> GL.rotate(-90F, 1F, 0F, 0F)
3 -> GL.rotate(180F, 1F, 0F, 0F)
4 -> GL.rotate( 90F, 0F, 0F, 1F)
5 -> GL.rotate(-90F, 0F, 0F, 1F)
}
TESSELLATOR.draw(GL_QUADS, DefaultVertexFormats.POSITION_TEX){
pos(-dist, -dist, -dist).tex( 0.0, 0.0).endVertex()
pos(-dist, -dist, dist).tex( 0.0, 16.0).endVertex()
pos( dist, -dist, dist).tex(16.0, 16.0).endVertex()
pos( dist, -dist, -dist).tex(16.0, 0.0).endVertex()
}
GL.popMatrix()
}
GL.enableFog()
GL.disableAlpha()
GL.disableBlend()
}
}
@@ -1,10 +0,0 @@
package chylex.hee.client.render.territory.components
import net.minecraft.util.ResourceLocation
import net.minecraft.util.math.Vec3d
class SkyCubeStatic(
override val texture: ResourceLocation,
override val color: Vec3d,
override val alpha: Float = DEFAULT_ALPHA,
override val distance: Double = DEFAULT_DISTANCE
) : SkyCubeBase()
@@ -1,119 +0,0 @@
package chylex.hee.client.render.territory.components
import chylex.hee.client.render.territory.EnvironmentRenderer
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.GL.DF_ONE_MINUS_SRC_ALPHA
import chylex.hee.client.render.util.GL.SF_SRC_ALPHA
import chylex.hee.client.render.util.TESSELLATOR
import chylex.hee.client.render.util.draw
import chylex.hee.client.util.MC
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.square
import net.minecraft.client.Minecraft
import net.minecraft.client.multiplayer.WorldClient
import net.minecraft.client.renderer.vertex.DefaultVertexFormats
import net.minecraft.util.ResourceLocation
import net.minecraft.util.math.Vec3d
import net.minecraftforge.client.IRenderHandler
import org.lwjgl.opengl.GL11.GL_FLAT
import org.lwjgl.opengl.GL11.GL_GREATER
import org.lwjgl.opengl.GL11.GL_QUADS
import org.lwjgl.opengl.GL11.GL_SMOOTH
import kotlin.math.pow
import kotlin.math.sqrt
abstract class SkyDomeBase : IRenderHandler(){
@Sided(Side.CLIENT)
private object Skybox{
data class Vertex(val x: Float, val y: Float, val z: Float, val u: Float, val v: Float, val c: Float)
private const val SIZE = 8
private const val COUNT = 15
private fun yOffset(xp: Float, zp: Float): Float{
return 32F - (1.15F * (square(xp) + square(zp)).pow(0.75F))
}
private fun yColor(xp: Float, zp: Float): Float{
val distance = sqrt(square(xp) + square(zp)) / (COUNT - 2F)
val stretched = 1F - ((distance - 0.4F) / 0.6F)
return stretched.coerceIn(0F, 1F)
}
val VERTICES = lazy {
val list = mutableListOf<Vertex>()
for(xi in -COUNT..COUNT){
for(zi in -COUNT..COUNT){
if (square(xi) + square(zi) < square(COUNT)){
val x1 = ((xi * SIZE) - SIZE / 2).toFloat()
val x2 = ((xi * SIZE) + SIZE / 2).toFloat()
val z1 = ((zi * SIZE) - SIZE / 2).toFloat()
val z2 = ((zi * SIZE) + SIZE / 2).toFloat()
val y11 = yOffset(xi - 0.5F, zi - 0.5F)
val y12 = yOffset(xi - 0.5F, zi + 0.5F)
val y21 = yOffset(xi + 0.5F, zi - 0.5F)
val y22 = yOffset(xi + 0.5F, zi + 0.5F)
val c11 = yColor(xi - 0.5F, zi - 0.5F)
val c12 = yColor(xi - 0.5F, zi + 0.5F)
val c21 = yColor(xi + 0.5F, zi - 0.5F)
val c22 = yColor(xi + 0.5F, zi + 0.5F)
list.add(Vertex(x = x1, y = y11, z = z1, u = 0F, v = 0F, c = c11))
list.add(Vertex(x = x2, y = y21, z = z1, u = 0F, v = 3F, c = c21))
list.add(Vertex(x = x2, y = y22, z = z2, u = 3F, v = 3F, c = c22))
list.add(Vertex(x = x1, y = y12, z = z2, u = 3F, v = 0F, c = c12))
}
}
}
list.toList()
}
}
protected companion object{
const val DEFAULT_ALPHA = 1F
}
protected abstract val texture: ResourceLocation
protected abstract val color: Vec3d
protected open val alpha = DEFAULT_ALPHA
@Sided(Side.CLIENT)
override fun render(partialTicks: Float, world: WorldClient, mc: Minecraft){
val col = color
val alp = alpha * EnvironmentRenderer.currentSkyAlpha
val red = col.x.toFloat()
val green = col.y.toFloat()
val blue = col.z.toFloat()
GL.enableBlend()
GL.blendFunc(SF_SRC_ALPHA, DF_ONE_MINUS_SRC_ALPHA)
GL.enableAlpha()
GL.alphaFunc(GL_GREATER, 0F)
GL.enableFog()
GL.shadeModel(GL_SMOOTH)
GL.enableTexture2D()
MC.textureManager.bindTexture(texture)
TESSELLATOR.draw(GL_QUADS, DefaultVertexFormats.POSITION_TEX_COLOR){
for((x, y, z, u, v, c) in Skybox.VERTICES.value){
pos(x.toDouble(), y.toDouble(), z.toDouble())
tex(u.toDouble(), v.toDouble())
color(red * c, green * c, blue * c, alp)
endVertex()
}
}
GL.shadeModel(GL_FLAT)
GL.disableFog()
GL.disableAlpha()
GL.disableBlend()
}
}
@@ -1,9 +0,0 @@
package chylex.hee.client.render.territory.components
import net.minecraft.util.ResourceLocation
import net.minecraft.util.math.Vec3d
class SkyDomeStatic(
override val texture: ResourceLocation,
override val color: Vec3d,
override val alpha: Float = DEFAULT_ALPHA
) : SkyDomeBase()
@@ -1,73 +0,0 @@
package chylex.hee.client.render.territory.components
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.GL.DF_ONE
import chylex.hee.client.render.util.GL.DF_ZERO
import chylex.hee.client.render.util.GL.SF_ONE
import chylex.hee.client.render.util.GL.SF_SRC_ALPHA
import chylex.hee.client.render.util.TESSELLATOR
import chylex.hee.client.render.util.draw
import chylex.hee.client.util.MC
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.Minecraft
import net.minecraft.client.multiplayer.WorldClient
import net.minecraft.client.renderer.vertex.DefaultVertexFormats
import net.minecraft.util.ResourceLocation
import net.minecraft.util.math.Vec3d
import net.minecraftforge.client.IRenderHandler
import org.lwjgl.opengl.GL11.GL_GREATER
import org.lwjgl.opengl.GL11.GL_QUADS
abstract class SunBase : IRenderHandler(){
protected companion object{
val DEFAULT_COLOR = Vec3d(1.0, 1.0, 1.0)
const val DEFAULT_ALPHA = 1F
const val DEFAULT_DISTANCE = 100.0
}
protected abstract val texture: ResourceLocation
protected open val color = DEFAULT_COLOR
protected open val alpha = DEFAULT_ALPHA
protected abstract val size: Double
protected open val distance = DEFAULT_DISTANCE
protected open fun setRotation(world: WorldClient, partialTicks: Float){
GL.rotate(-90F, 0F, 1F, 0F)
GL.rotate(world.getCelestialAngle(partialTicks) * 360F, 1F, 0F, 0F)
}
@Sided(Side.CLIENT)
override fun render(partialTicks: Float, world: WorldClient, mc: Minecraft){
val width = size
val dist = distance
val col = color
val red = col.x.toFloat()
val green = col.y.toFloat()
val blue = col.z.toFloat()
GL.enableBlend()
GL.blendFunc(SF_SRC_ALPHA, DF_ONE, SF_ONE, DF_ZERO)
GL.enableAlpha()
GL.alphaFunc(GL_GREATER, 0F)
GL.disableFog()
GL.pushMatrix()
setRotation(world, partialTicks)
GL.color(red, green, blue, alpha)
MC.textureManager.bindTexture(texture)
TESSELLATOR.draw(GL_QUADS, DefaultVertexFormats.POSITION_TEX){
pos(-width, dist, -width).tex(0.0, 0.0).endVertex()
pos( width, dist, -width).tex(1.0, 0.0).endVertex()
pos( width, dist, width).tex(1.0, 1.0).endVertex()
pos(-width, dist, width).tex(0.0, 1.0).endVertex()
}
GL.popMatrix()
GL.enableFog()
GL.disableAlpha()
GL.disableBlend()
}
}
@@ -1,11 +0,0 @@
package chylex.hee.client.render.territory.components
import net.minecraft.util.ResourceLocation
import net.minecraft.util.math.Vec3d
class SunStatic(
override val texture: ResourceLocation,
override val color: Vec3d = DEFAULT_COLOR,
override val alpha: Float = DEFAULT_ALPHA,
override val size: Double,
override val distance: Double = DEFAULT_DISTANCE
) : SunBase()
@@ -1,15 +0,0 @@
package chylex.hee.client.render.territory.lightmaps
interface ILightmap{
fun update(colors: FloatArray, sunBrightness: Float, skyLight: Float, blockLight: Float, partialTicks: Float)
companion object{
fun calcLightFactor(light: Float, mp: Float = 0.6F): Float{
return light * ((((light * mp) + (1F - mp)) * mp) + (1F - mp))
}
fun calcLightSqFactor(light: Float, mp: Float = 0.6F): Float{
return light * ((light * light * mp) + (1F - mp))
}
}
}
@@ -1,36 +0,0 @@
package chylex.hee.client.render.territory.lightmaps
import kotlin.math.max
fun ILightmap.mergeSkyLightIntoBlockLight() = object : ILightmap{
override fun update(colors: FloatArray, sunBrightness: Float, skyLight: Float, blockLight: Float, partialTicks: Float){
this@mergeSkyLightIntoBlockLight.update(colors, sunBrightness, skyLight, max(skyLight, blockLight), partialTicks)
}
}
fun ILightmap.transformSunBrightness(transformer: (Float) -> Float) = object : ILightmap{
override fun update(colors: FloatArray, sunBrightness: Float, skyLight: Float, blockLight: Float, partialTicks: Float){
this@transformSunBrightness.update(colors, transformer(sunBrightness), skyLight, blockLight, partialTicks)
}
}
fun ILightmap.transformSkyLight(transformer: (Float) -> Float) = object : ILightmap{
override fun update(colors: FloatArray, sunBrightness: Float, skyLight: Float, blockLight: Float, partialTicks: Float){
this@transformSkyLight.update(colors, sunBrightness, transformer(skyLight), blockLight, partialTicks)
}
}
fun ILightmap.transformBlockLight(transformer: (Float) -> Float) = object : ILightmap{
override fun update(colors: FloatArray, sunBrightness: Float, skyLight: Float, blockLight: Float, partialTicks: Float){
this@transformBlockLight.update(colors, sunBrightness, skyLight, transformer(blockLight), partialTicks)
}
}
fun ILightmap.transformColors(red: (Float) -> Float, green: (Float) -> Float, blue: (Float) -> Float) = object : ILightmap{
override fun update(colors: FloatArray, sunBrightness: Float, skyLight: Float, blockLight: Float, partialTicks: Float){
this@transformColors.update(colors, sunBrightness, skyLight, blockLight, partialTicks)
colors[0] = red(colors[0])
colors[1] = green(colors[1])
colors[2] = blue(colors[2])
}
}
@@ -1,19 +0,0 @@
package chylex.hee.client.render.territory.lightmaps
import chylex.hee.client.render.territory.lightmaps.ILightmap.Companion.calcLightFactor
import chylex.hee.client.render.territory.lightmaps.ILightmap.Companion.calcLightSqFactor
object OverworldLightmap : ILightmap{
override fun update(colors: FloatArray, sunBrightness: Float, skyLight: Float, blockLight: Float, partialTicks: Float){
val sunFactor = skyLight * ((sunBrightness * 0.65F) + 0.35F)
val blockFactor = calcLightFactor(blockLight)
val blockSqFactor = calcLightSqFactor(blockLight)
val red = sunFactor + blockLight
val green = sunFactor + blockFactor
val blue = skyLight + blockSqFactor
colors[0] = (red * 0.96F) + 0.03F
colors[1] = (green * 0.96F) + 0.03F
colors[2] = (blue * 0.96F) + 0.03F
}
}
@@ -1,14 +0,0 @@
package chylex.hee.client.render.territory.lightmaps
import chylex.hee.client.render.territory.lightmaps.ILightmap.Companion.calcLightFactor
import chylex.hee.client.render.territory.lightmaps.ILightmap.Companion.calcLightSqFactor
object VanillaEndLightmap : ILightmap{
override fun update(colors: FloatArray, sunBrightness: Float, skyLight: Float, blockLight: Float, partialTicks: Float){
val blockFactor = calcLightFactor(blockLight)
val blockSqFactor = calcLightSqFactor(blockLight)
colors[0] = (blockLight * 0.75F) + 0.22F
colors[1] = (blockFactor * 0.75F) + 0.28F
colors[2] = (blockSqFactor * 0.75F) + 0.25F
}
}
@@ -1,8 +0,0 @@
package chylex.hee.client.render.util
import net.minecraft.block.Block
import net.minecraft.client.renderer.color.IBlockColor
import net.minecraft.client.renderer.color.IItemColor
const val NO_TINT = -1
fun IBlockColor.asItem(block: Block) = IItemColor { _, tintIndex -> colorMultiplier(block.defaultState, null, null, tintIndex) }
@@ -1,78 +0,0 @@
package chylex.hee.client.render.util
import chylex.hee.client.util.MC
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.color.HCL
@Sided(Side.CLIENT)
class ColorTransition(private val defaultColor: HCL, private val transitionDuration: Float){
private var currentFrom: HCL = defaultColor
private var currentTo: HCL? = null
private var currentProgress = 0F
private val transitionQueue = ArrayList<HCL>(4)
private var lastUpdateTime = 0L
val currentTargetColor
get() = currentTo ?: currentFrom
val lastColorInQueue
get() = transitionQueue.lastOrNull()
fun resetAll(){
resetQueue()
currentFrom = defaultColor
currentTo = null
currentProgress = 0F
lastUpdateTime = MC.systemTime
}
fun resetQueue(){
transitionQueue.clear()
}
fun enqueue(color: HCL){
if (currentTo == null){
currentTo = color
}
else{
transitionQueue.add(color)
}
}
fun updateGetColor(): HCL{
val currentTime = MC.systemTime
val elapsedTime = currentTime - lastUpdateTime
lastUpdateTime = currentTime
val transitionTo = currentTo
if (transitionTo == null){
return currentFrom
}
currentProgress += elapsedTime / transitionDuration
if (currentProgress >= 1F){
currentProgress = 0F
currentFrom = transitionTo
currentTo = if (transitionQueue.isEmpty()) null else transitionQueue.removeAt(0)
return currentFrom
}
else{
val hueSource = if (transitionTo.chroma > 0F && currentFrom.chroma == 0F) transitionTo else currentFrom
return HCL(
hue = hueSource.hue,
chroma = currentFrom.chroma + (transitionTo.chroma - currentFrom.chroma) * currentProgress,
luminance = currentFrom.luminance + (transitionTo.luminance - currentFrom.luminance) * currentProgress
)
}
}
}
@@ -1,136 +0,0 @@
package chylex.hee.client.render.util
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.renderer.GlStateManager
import net.minecraft.client.renderer.GlStateManager.DestFactor
import net.minecraft.client.renderer.GlStateManager.FogMode
import net.minecraft.client.renderer.GlStateManager.SourceFactor
import net.minecraft.client.renderer.GlStateManager.TexGen
import java.nio.FloatBuffer
typealias GLSM = GlStateManager
@Sided(Side.CLIENT)
object GL{
// General
fun depthMask(enable: Boolean) = GLSM.depthMask(enable)
fun enableCull() = GLSM.enableCull()
fun disableCull() = GLSM.disableCull()
fun enableRescaleNormal() = GLSM.enableRescaleNormal()
fun disableRescaleNormal() = GLSM.disableRescaleNormal()
// Blend
fun enableBlend() = GLSM.enableBlend()
fun disableBlend() = GLSM.disableBlend()
fun blendFunc(s: SourceFactor, d: DestFactor) = GLSM.blendFunc(s, d)
fun blendFunc(srgb: SourceFactor, drgb: DestFactor, sa: SourceFactor, da: DestFactor) = GLSM.tryBlendFuncSeparate(srgb, drgb, sa, da)
// Alpha
fun enableAlpha() = GLSM.enableAlpha()
fun disableAlpha() = GLSM.disableAlpha()
fun alphaFunc(func: Int, ref: Float) = GLSM.alphaFunc(func, ref)
// Fog
fun enableFog() = GLSM.enableFog()
fun disableFog() = GLSM.disableFog()
fun setFogMode(mode: FogMode) = GLSM.setFog(mode)
fun setFogDensity(density: Float) = GLSM.setFogDensity(density)
// Lighting
fun enableLighting() = GLSM.enableLighting()
fun disableLighting() = GLSM.disableLighting()
fun shadeModel(model: Int) = GLSM.shadeModel(model)
// Color
fun enableColorMaterial() = GLSM.enableColorMaterial()
fun disableColorMaterial() = GLSM.disableColorMaterial()
fun color(red: Float, green: Float, blue: Float) = GLSM.color(red, green, blue)
fun color(red: Float, green: Float, blue: Float, alpha: Float) = GLSM.color(red, green, blue, alpha)
// Texture
fun enableTexture2D() = GLSM.enableTexture2D()
fun disableTexture2D() = GLSM.disableTexture2D()
fun enableOutlineMode(color: Int) = GLSM.enableOutlineMode(color)
fun disableOutlineMode() = GLSM.disableOutlineMode()
fun enableTexGenCoord(tex: TexGen) = GLSM.enableTexGenCoord(tex)
fun disableTexGenCoord(tex: TexGen) = GLSM.disableTexGenCoord(tex)
fun texGenMode(tex: TexGen, mode: Int) = GLSM.texGen(tex, mode)
fun texGenParam(tex: TexGen, param: Int, buffer: FloatBuffer) = GLSM.texGen(tex, param, buffer)
// Matrix
fun loadIdentity() = GLSM.loadIdentity()
fun pushMatrix() = GLSM.pushMatrix()
fun popMatrix() = GLSM.popMatrix()
fun matrixMode(mode: Int) = GLSM.matrixMode(mode)
fun translate(x: Float, y: Float, z: Float) = GLSM.translate(x, y, z)
fun translate(x: Double, y: Double, z: Double) = GLSM.translate(x, y, z)
fun scale(x: Float, y: Float, z: Float) = GLSM.scale(x, y, z)
fun scale(x: Double, y: Double, z: Double) = GLSM.scale(x, y, z)
fun rotate(angle: Float, x: Float, y: Float, z: Float) = GLSM.rotate(angle, x, y, z)
// fun rotate(angle: Double, x: Double, y: Double, z: Double) = GLSM.rotate(angle, x, y, z)
// Constants
val TEX_S = TexGen.S
val TEX_T = TexGen.T
val TEX_R = TexGen.R
val TEX_Q = TexGen.Q
val SF_CONSTANT_ALPHA = SourceFactor.CONSTANT_ALPHA
val SF_CONSTANT_COLOR = SourceFactor.CONSTANT_COLOR
val SF_DST_ALPHA = SourceFactor.DST_ALPHA
val SF_DST_COLOR = SourceFactor.DST_COLOR
val SF_ONE = SourceFactor.ONE
val SF_ONE_MINUS_CONSTANT_ALPHA = SourceFactor.ONE_MINUS_CONSTANT_ALPHA
val SF_ONE_MINUS_CONSTANT_COLOR = SourceFactor.ONE_MINUS_CONSTANT_COLOR
val SF_ONE_MINUS_DST_ALPHA = SourceFactor.ONE_MINUS_DST_ALPHA
val SF_ONE_MINUS_DST_COLOR = SourceFactor.ONE_MINUS_DST_COLOR
val SF_ONE_MINUS_SRC_ALPHA = SourceFactor.ONE_MINUS_SRC_ALPHA
val SF_ONE_MINUS_SRC_COLOR = SourceFactor.ONE_MINUS_SRC_COLOR
val SF_SRC_ALPHA = SourceFactor.SRC_ALPHA
val SF_SRC_ALPHA_SATURATE = SourceFactor.SRC_ALPHA_SATURATE
val SF_SRC_COLOR = SourceFactor.SRC_COLOR
val SF_ZERO = SourceFactor.ZERO
val DF_CONSTANT_ALPHA = DestFactor.CONSTANT_ALPHA
val DF_CONSTANT_COLOR = DestFactor.CONSTANT_COLOR
val DF_DST_ALPHA = DestFactor.DST_ALPHA
val DF_DST_COLOR = DestFactor.DST_COLOR
val DF_ONE = DestFactor.ONE
val DF_ONE_MINUS_CONSTANT_ALPHA = DestFactor.ONE_MINUS_CONSTANT_ALPHA
val DF_ONE_MINUS_CONSTANT_COLOR = DestFactor.ONE_MINUS_CONSTANT_COLOR
val DF_ONE_MINUS_DST_ALPHA = DestFactor.ONE_MINUS_DST_ALPHA
val DF_ONE_MINUS_DST_COLOR = DestFactor.ONE_MINUS_DST_COLOR
val DF_ONE_MINUS_SRC_ALPHA = DestFactor.ONE_MINUS_SRC_ALPHA
val DF_ONE_MINUS_SRC_COLOR = DestFactor.ONE_MINUS_SRC_COLOR
val DF_SRC_ALPHA = DestFactor.SRC_ALPHA
val DF_SRC_COLOR = DestFactor.SRC_COLOR
val DF_ZERO = DestFactor.ZERO
val FOG_LINEAR = FogMode.LINEAR
val FOG_EXP = FogMode.EXP
val FOG_EXP2 = FogMode.EXP2
}
@@ -1,45 +0,0 @@
package chylex.hee.client.render.util
import chylex.hee.client.render.util.GL.DF_ONE_MINUS_SRC_ALPHA
import chylex.hee.client.render.util.GL.DF_ZERO
import chylex.hee.client.render.util.GL.SF_ONE
import chylex.hee.client.render.util.GL.SF_SRC_ALPHA
import chylex.hee.client.util.MC
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.renderer.RenderHelper
import net.minecraft.client.renderer.block.model.IBakedModel
import net.minecraft.client.renderer.texture.ITextureObject
import net.minecraft.client.renderer.texture.TextureMap
import net.minecraft.item.ItemStack
import net.minecraft.util.ResourceLocation
import org.lwjgl.opengl.GL11.GL_GREATER
@Sided(Side.CLIENT)
object ItemRenderHelper{
val TEX_BLOCKS_ITEMS: ResourceLocation = TextureMap.LOCATION_BLOCKS_TEXTURE
private lateinit var texBlocksItemsObj: ITextureObject
fun beginItemModel(){
with(MC.textureManager){
texBlocksItemsObj = getTexture(TEX_BLOCKS_ITEMS).also { it.setBlurMipmap(false, false) }
bindTexture(TEX_BLOCKS_ITEMS)
}
RenderHelper.enableStandardItemLighting()
GL.alphaFunc(GL_GREATER, 0.1F)
GL.enableRescaleNormal()
GL.enableBlend()
GL.blendFunc(SF_SRC_ALPHA, DF_ONE_MINUS_SRC_ALPHA, SF_ONE, DF_ZERO)
}
fun getItemModel(stack: ItemStack): IBakedModel{
return MC.itemRenderer.getItemModelWithOverrides(stack, MC.world, null)
}
fun endItemModel(){
GL.disableBlend()
GL.disableRescaleNormal()
texBlocksItemsObj.restoreLastBlurMipmap()
}
}
@@ -1,55 +0,0 @@
package chylex.hee.client.render.util
import net.minecraft.client.model.ModelBox
import net.minecraft.client.model.ModelRenderer
class ModelBoxBuilder(private val model: ModelRenderer){
private var x = 0F
private var y = 0F
private var z = 0F
private var w = 0
private var h = 0
private var d = 0
private var u: Int? = null
private var v: Int? = null
private var mirror = false
fun offset(x: Float, y: Float, z: Float): ModelBoxBuilder{
this.x = x
this.y = y
this.z = z
return this
}
fun size(w: Int, h: Int, d: Int): ModelBoxBuilder{
this.w = w
this.h = h
this.d = d
return this
}
fun tex(u: Int, v: Int): ModelBoxBuilder{
this.u = u
this.v = v
return this
}
fun mirror(): ModelBoxBuilder{
this.mirror = true
return this
}
fun add(){
val u = u
val v = v
if (u == null || v == null){
model.addBox(x, y, z, w, h, d, mirror)
}
else{
model.cubeList.add(ModelBox(model, u, v, x, y, z, w, h, d, 0F, mirror))
}
}
}
@@ -1,9 +0,0 @@
package chylex.hee.client.render.util
import net.minecraft.client.model.ModelRenderer
val ModelRenderer.beginBox
get() = ModelBoxBuilder(this)
fun ModelRenderer.render(){
this.render(1F / 16F)
}
@@ -1,12 +0,0 @@
package chylex.hee.client.render.util
import net.minecraft.client.renderer.BufferBuilder
import net.minecraft.client.renderer.Tessellator
import net.minecraft.client.renderer.vertex.VertexFormat
val TESSELLATOR: Tessellator = Tessellator.getInstance()
inline fun Tessellator.draw(mode: Int, format: VertexFormat, procedure: BufferBuilder.() -> Unit){
this.buffer.begin(mode, format)
this.buffer.apply(procedure)
this.draw()
}
@@ -1,26 +0,0 @@
package chylex.hee.client.sound
import chylex.hee.game.entity.projectile.EntityProjectileSpatialDash
import chylex.hee.system.migration.vanilla.Sounds
import chylex.hee.system.util.nextFloat
import net.minecraft.client.audio.MovingSound
import net.minecraft.util.SoundCategory
class MovingSoundSpatialDash(private val entity: EntityProjectileSpatialDash) : MovingSound(Sounds.ITEM_ELYTRA_FLYING, SoundCategory.PLAYERS){
init{
volume = 0.9F
pitch = entity.world.rand.nextFloat(1.1F, 1.4F)
repeat = true
repeatDelay = 0
}
override fun update(){
if (entity.isDead){
donePlaying = true
return
}
xPosF = entity.posX.toFloat()
yPosF = entity.posY.toFloat()
zPosF = entity.posZ.toFloat()
}
}
@@ -1,66 +0,0 @@
package chylex.hee.client.util
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.Minecraft
import net.minecraft.client.entity.EntityPlayerSP
import net.minecraft.client.gui.FontRenderer
import net.minecraft.client.gui.GuiScreen
import net.minecraft.client.gui.ScaledResolution
import net.minecraft.client.multiplayer.WorldClient
import net.minecraft.client.particle.ParticleManager
import net.minecraft.client.renderer.EntityRenderer
import net.minecraft.client.renderer.RenderItem
import net.minecraft.client.renderer.entity.RenderManager
import net.minecraft.client.renderer.texture.TextureManager
import net.minecraft.client.settings.GameSettings
@Sided(Side.CLIENT)
object MC{
@JvmField
val instance: Minecraft = Minecraft.getMinecraft()
// General
val settings: GameSettings
get() = instance.gameSettings
val resolution
get() = ScaledResolution(instance)
val systemTime
get() = Minecraft.getSystemTime()
// Game state
val player: EntityPlayerSP?
get() = instance.player
val world: WorldClient?
get() = instance.world
val currentScreen: GuiScreen?
get() = instance.currentScreen
// Rendering
val partialTicks: Float
get() = instance.renderPartialTicks
val textureManager: TextureManager
get() = instance.textureManager
val renderManager: RenderManager
get() = instance.renderManager
val particleManager: ParticleManager
get() = instance.effectRenderer
val entityRenderer: EntityRenderer
get() = instance.entityRenderer
val itemRenderer: RenderItem
get() = instance.renderItem
val fontRenderer: FontRenderer
get() = instance.fontRenderer
}
@@ -1,111 +0,0 @@
package chylex.hee.game.block
import chylex.hee.HEE
import chylex.hee.system.migration.forge.SubscribeAllEvents
import chylex.hee.system.migration.forge.SubscribeEvent
import chylex.hee.system.migration.vanilla.Blocks
import chylex.hee.system.migration.vanilla.Items
import chylex.hee.system.migration.vanilla.Sounds
import chylex.hee.system.util.Pos
import chylex.hee.system.util.facades.Stats
import chylex.hee.system.util.get
import chylex.hee.system.util.getBlock
import chylex.hee.system.util.isNotEmpty
import chylex.hee.system.util.playUniversal
import net.minecraft.block.BlockCauldron
import net.minecraft.block.state.IBlockState
import net.minecraft.entity.Entity
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.ItemStack
import net.minecraft.util.EnumFacing
import net.minecraft.util.EnumHand
import net.minecraft.util.SoundCategory
import net.minecraft.util.math.BlockPos
import net.minecraft.world.World
import net.minecraftforge.event.entity.player.EntityItemPickupEvent
@SubscribeAllEvents(modid = HEE.ID)
abstract class BlockAbstractCauldron : BlockCauldron(){
companion object{
const val MAX_LEVEL = 3
@JvmStatic
@SubscribeEvent
fun onEntityItemPickup(e: EntityItemPickupEvent){
val item = e.item
val pos = Pos(item)
if (pos.getBlock(item.world) is BlockCauldron && Pos(e.entityPlayer) != pos){
e.isCanceled = true
}
}
}
init{
@Suppress("LeakingThis")
setHardness(2F)
}
protected abstract fun createFilledBucket(): ItemStack?
protected abstract fun createFilledBottle(): ItemStack?
override fun setWaterLevel(world: World, pos: BlockPos, state: IBlockState, level: Int){
super.setWaterLevel(world, pos, if (level == 0) Blocks.CAULDRON.defaultState else state, level)
}
private fun useAndUpdateHeldItem(player: EntityPlayer, hand: EnumHand, newHeldItem: ItemStack){
val oldHeldItem = player.getHeldItem(hand)
oldHeldItem.shrink(1)
if (oldHeldItem.isEmpty){
player.setHeldItem(hand, newHeldItem)
}
else if (!player.inventory.addItemStackToInventory(newHeldItem)){
player.dropItem(newHeldItem, false)
}
}
final override fun onBlockActivated(world: World, pos: BlockPos, state: IBlockState, player: EntityPlayer, hand: EnumHand, facing: EnumFacing, hitX: Float, hitY: Float, hitZ: Float): Boolean{
val item = player.getHeldItem(hand).takeIf { it.isNotEmpty }?.item
if (item == null){
return true
}
if (item === Items.BUCKET){
val filledBucket = createFilledBucket()
if (filledBucket != null && state[LEVEL] == MAX_LEVEL){
if (!world.isRemote){
player.addStat(Stats.CAULDRON_USED)
useAndUpdateHeldItem(player, hand, filledBucket)
setWaterLevel(world, pos, state, 0)
}
Sounds.ITEM_BUCKET_FILL.playUniversal(player, pos, SoundCategory.BLOCKS)
}
return true
}
else if (item === Items.GLASS_BOTTLE){
val filledBottle = createFilledBottle()
if (filledBottle != null && state[LEVEL] > 0){
if (!world.isRemote){
player.addStat(Stats.CAULDRON_USED)
useAndUpdateHeldItem(player, hand, filledBottle)
setWaterLevel(world, pos, state, state[LEVEL] - 1)
}
Sounds.ITEM_BOTTLE_FILL.playUniversal(player, pos, SoundCategory.BLOCKS)
}
return true
}
return false
}
override fun onEntityCollision(world: World, pos: BlockPos, state: IBlockState, entity: Entity){}
override fun fillWithRain(world: World, pos: BlockPos){}
}
@@ -1,113 +0,0 @@
package chylex.hee.game.block
import chylex.hee.game.block.entity.base.TileEntityBaseChest
import chylex.hee.game.block.info.BlockBuilder
import chylex.hee.game.entity.living.ai.AIOcelotSitOverride.IOcelotCanSitOn
import chylex.hee.init.ModGuiHandler.GuiType
import chylex.hee.system.migration.Facing.DOWN
import chylex.hee.system.migration.Facing.NORTH
import chylex.hee.system.util.get
import chylex.hee.system.util.getState
import chylex.hee.system.util.getTile
import chylex.hee.system.util.selectExistingEntities
import chylex.hee.system.util.withFacing
import net.minecraft.block.BlockDirectional.FACING
import net.minecraft.block.ITileEntityProvider
import net.minecraft.block.state.BlockFaceShape.UNDEFINED
import net.minecraft.block.state.BlockStateContainer
import net.minecraft.block.state.IBlockState
import net.minecraft.entity.EntityLivingBase
import net.minecraft.entity.passive.EntityOcelot
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.ItemStack
import net.minecraft.tileentity.TileEntity
import net.minecraft.util.EnumBlockRenderType.ENTITYBLOCK_ANIMATED
import net.minecraft.util.EnumFacing
import net.minecraft.util.EnumHand
import net.minecraft.util.Mirror
import net.minecraft.util.Rotation
import net.minecraft.util.math.AxisAlignedBB
import net.minecraft.util.math.BlockPos
import net.minecraft.world.IBlockAccess
import net.minecraft.world.World
abstract class BlockAbstractChest<T : TileEntityBaseChest>(builder: BlockBuilder) : BlockSimple(builder), ITileEntityProvider, IOcelotCanSitOn{
private companion object{
private val AABB = AxisAlignedBB(0.0625, 0.0, 0.0625, 0.9375, 0.875, 0.9375)
}
init{
defaultState = blockState.baseState.withFacing(NORTH)
}
override fun createBlockState() = BlockStateContainer(this, FACING)
// Placement and interaction
abstract fun createNewTileEntity(): T
abstract val guiType: GuiType
final override fun createNewTileEntity(world: World, meta: Int): TileEntity{
return createNewTileEntity()
}
override fun getStateForPlacement(world: World, pos: BlockPos, facing: EnumFacing, hitX: Float, hitY: Float, hitZ: Float, meta: Int, placer: EntityLivingBase, hand: EnumHand): IBlockState{
return this.withFacing(placer.horizontalFacing.opposite)
}
final override fun onBlockPlacedBy(world: World, pos: BlockPos, state: IBlockState, placer: EntityLivingBase, stack: ItemStack){
if (stack.hasDisplayName()){
pos.getTile<TileEntityBaseChest>(world)?.setCustomName(stack.displayName)
}
}
final override fun onBlockActivated(world: World, pos: BlockPos, state: IBlockState, player: EntityPlayer, hand: EnumHand, facing: EnumFacing, hitX: Float, hitY: Float, hitZ: Float): Boolean{
if (world.isRemote){
return true
}
val posAbove = pos.up()
if (posAbove.getState(world).doesSideBlockChestOpening(world, posAbove, DOWN)){
return true
}
if (world.selectExistingEntities.inBox<EntityOcelot>(AxisAlignedBB(posAbove)).any { it.isSitting }){
return true
}
pos.getTile<TileEntityBaseChest>(world)?.let {
guiType.open(player, pos.x, pos.y, pos.z)
}
return true
}
// Ocelot behavior
override fun canOcelotSitOn(world: World, pos: BlockPos): Boolean{
return pos.getTile<TileEntityBaseChest>(world)?.isLidClosed == true
}
// State handling
override fun withRotation(state: IBlockState, rot: Rotation): IBlockState{
return state.withFacing(rot.rotate(state[FACING]))
}
override fun withMirror(state: IBlockState, mirror: Mirror): IBlockState{
return state.withFacing(mirror.mirror(state[FACING]))
}
override fun getMetaFromState(state: IBlockState) = state[FACING].index
override fun getStateFromMeta(meta: Int) = this.withFacing(EnumFacing.byIndex(meta))
// Shape and rendering
final override fun getBoundingBox(state: IBlockState, source: IBlockAccess, pos: BlockPos) = AABB
final override fun getBlockFaceShape(world: IBlockAccess, state: IBlockState, pos: BlockPos, face: EnumFacing) = UNDEFINED
final override fun isFullCube(state: IBlockState) = false
final override fun isOpaqueCube(state: IBlockState) = false
final override fun getRenderType(state: IBlockState) = ENTITYBLOCK_ANIMATED
final override fun hasCustomBreakingProgress(state: IBlockState) = true
}

Some files were not shown because too many files have changed in this diff Show More