5 Commits
Author SHA1 Message Date
chylex bc2690402f Add Gradle convention plugins with a basic NeoForge mod 2024-02-19 21:18:35 +01:00
chylex 5864c6273d Add Gradle 8.6 wrapper 2024-02-19 14:20:19 +01:00
chylex 6a2f878c35 Add .gitattributes and .gitignore 2024-02-19 14:20:19 +01:00
chylex ae765d4d8c Add README 2024-02-19 14:19:38 +01:00
chylex 8cb7d6f973 Initial commit 2023-01-17 02:30:39 +01:00
1557 changed files with 712 additions and 61478 deletions
+1
View File
@@ -0,0 +1 @@
* text=auto eol=lf
+9 -22
View File
@@ -1,28 +1,15 @@
# idea # IntelliJ
out
/.idea/
*.iml
*.ipr *.ipr
*.iws *.iws
*.iml
.idea/gradle.xml # Gradle
.idea/tasks.xml
.idea/workspace.xml
.idea/codeStyles .gradle/
.idea/libraries build/
# eclipse # Game
bin
*.launch
.settings
.metadata
.classpath
.project
# gradle /run/
build
.gradle
# game
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"
}
}
+10
View File
@@ -0,0 +1,10 @@
plugins {
idea
}
idea {
module {
excludeDirs.add(file("gradle"))
excludeDirs.add(file("run"))
}
}
+16 -2
View File
@@ -1,3 +1,17 @@
# Sets default memory used for gradle commands. Can be overridden by user or command line properties. # Mod
# This is required to provide enough memory for the Minecraft decompilation process. group=com.chylex.hee
version=2.0.0-dev
# Dependencies
neoForgeVersion=20.4.162-beta
kotlinForForgeVersion=4.10.0
# Constraints
minecraftVersionRange=[1.20.4,)
neoForgeVersionRange=(20.4.161,)
kotlinForForgeVersionRange=[4.10.0,)
# Gradle
org.gradle.jvmargs=-Xmx3G org.gradle.jvmargs=-Xmx3G
org.gradle.caching=true
org.gradle.parallel=true
+10
View File
@@ -0,0 +1,10 @@
# IntelliJ
/.idea/
*.iml
*.ipr
*.iws
# Gradle
/gradle/wrapper/gradle-wrapper.jar
+31
View File
@@ -0,0 +1,31 @@
plugins {
idea
`kotlin-dsl`
`maven-publish`
}
group = "com.chylex.hee.gradle"
version = "1"
idea {
module {
excludeDirs.add(file("gradle"))
excludeDirs.add(file("repository"))
}
}
repositories {
gradlePluginPortal()
maven(url = "https://maven.neoforged.net/releases") { name = "NeoForge" }
}
dependencies {
implementation(group = "net.neoforged.gradle", name = "userdev", version = "7.0.93")
implementation(group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version = "1.9.22")
}
publishing {
repositories {
maven(url = projectDir.resolve("repository"))
}
}
+6
View File
@@ -0,0 +1,6 @@
# Gradle
org.gradle.caching=true
org.gradle.parallel=true
# Publishing
systemProp.org.gradle.internal.publish.checksums.insecure=true
+7
View File
@@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
@@ -0,0 +1 @@
42f393b1af836d81c0685598ecb1a89b
@@ -0,0 +1 @@
8625fdab93abbf9771592aa5f11955074d3ebc90
@@ -0,0 +1,80 @@
{
"formatVersion": "1.1",
"component": {
"group": "com.chylex.hee.gradle",
"module": "hee-gradle-plugins",
"version": "1",
"attributes": {
"org.gradle.status": "release"
}
},
"createdBy": {
"gradle": {
"version": "8.6"
}
},
"variants": [
{
"name": "apiElements",
"attributes": {
"org.gradle.category": "library",
"org.gradle.dependency.bundling": "external",
"org.gradle.jvm.environment": "standard-jvm",
"org.gradle.jvm.version": 17,
"org.gradle.libraryelements": "jar",
"org.gradle.usage": "java-api",
"org.jetbrains.kotlin.platform.type": "jvm"
},
"files": [
{
"name": "hee-gradle-plugins-1.jar",
"url": "hee-gradle-plugins-1.jar",
"size": 720929,
"sha512": "ce831f763f1ea8f746be1fad620c48a9af1ef4fff7554b8b71659fbce3cef18511658d33e74a4fb828963fc24ab71054144506bce2183c230eb22b7a4d7b5701",
"sha256": "98abc2b58bb424374c73a093b53665d22bbff48c967330a470813438b1c0d08d",
"sha1": "8625fdab93abbf9771592aa5f11955074d3ebc90",
"md5": "42f393b1af836d81c0685598ecb1a89b"
}
]
},
{
"name": "runtimeElements",
"attributes": {
"org.gradle.category": "library",
"org.gradle.dependency.bundling": "external",
"org.gradle.jvm.environment": "standard-jvm",
"org.gradle.jvm.version": 17,
"org.gradle.libraryelements": "jar",
"org.gradle.usage": "java-runtime",
"org.jetbrains.kotlin.platform.type": "jvm"
},
"dependencies": [
{
"group": "net.neoforged.gradle",
"module": "userdev",
"version": {
"requires": "7.0.93"
}
},
{
"group": "org.jetbrains.kotlin",
"module": "kotlin-gradle-plugin",
"version": {
"requires": "1.9.22"
}
}
],
"files": [
{
"name": "hee-gradle-plugins-1.jar",
"url": "hee-gradle-plugins-1.jar",
"size": 720929,
"sha512": "ce831f763f1ea8f746be1fad620c48a9af1ef4fff7554b8b71659fbce3cef18511658d33e74a4fb828963fc24ab71054144506bce2183c230eb22b7a4d7b5701",
"sha256": "98abc2b58bb424374c73a093b53665d22bbff48c967330a470813438b1c0d08d",
"sha1": "8625fdab93abbf9771592aa5f11955074d3ebc90",
"md5": "42f393b1af836d81c0685598ecb1a89b"
}
]
}
]
}
@@ -0,0 +1 @@
b64f069ed52a81e6279daf77a88eb1db
@@ -0,0 +1 @@
bc0d28a9c647edb17e260da2219ae765873c2ac3
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!-- This module was also published with a richer model, Gradle metadata, -->
<!-- which should be used instead. Do not delete the following line which -->
<!-- is to indicate to Gradle or any Gradle module metadata file consumer -->
<!-- that they should prefer consuming it instead. -->
<!-- do_not_remove: published-with-gradle-metadata -->
<modelVersion>4.0.0</modelVersion>
<groupId>com.chylex.hee.gradle</groupId>
<artifactId>hee-gradle-plugins</artifactId>
<version>1</version>
<dependencies>
<dependency>
<groupId>net.neoforged.gradle</groupId>
<artifactId>userdev</artifactId>
<version>7.0.93</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-gradle-plugin</artifactId>
<version>1.9.22</version>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
@@ -0,0 +1 @@
8d1141435ff5bbac0d3a2a4164d933f6
@@ -0,0 +1 @@
b9bcb22e5e722ddc506c20c71c307819a4221633
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>com.chylex.hee.gradle</groupId>
<artifactId>hee-gradle-plugins</artifactId>
<versioning>
<latest>1</latest>
<release>1</release>
<versions>
<version>1</version>
</versions>
<lastUpdated>20240219200641</lastUpdated>
</versioning>
</metadata>
@@ -0,0 +1 @@
ee287950a70b8a7c180ca0c8770bd29b
@@ -0,0 +1 @@
7624af63729550165bc4b33206660d1dfb9d6f63
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>hee.java</groupId>
<artifactId>hee.java.gradle.plugin</artifactId>
<version>1</version>
<packaging>pom</packaging>
<dependencies>
<dependency>
<groupId>com.chylex.hee.gradle</groupId>
<artifactId>hee-gradle-plugins</artifactId>
<version>1</version>
</dependency>
</dependencies>
</project>
@@ -0,0 +1 @@
f196bd1a3bc41dee8da6f62de657232d
@@ -0,0 +1 @@
28057427bd53cdd856eaf9ee66a132d9a1125be1
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>hee.java</groupId>
<artifactId>hee.java.gradle.plugin</artifactId>
<versioning>
<latest>1</latest>
<release>1</release>
<versions>
<version>1</version>
</versions>
<lastUpdated>20240219200634</lastUpdated>
</versioning>
</metadata>
@@ -0,0 +1 @@
fc0d8363883a1491b8eb9aee24ca6403
@@ -0,0 +1 @@
c06522e4d92f148b720287c643661e461c91b62a
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>hee.kotlin</groupId>
<artifactId>hee.kotlin.gradle.plugin</artifactId>
<version>1</version>
<packaging>pom</packaging>
<dependencies>
<dependency>
<groupId>com.chylex.hee.gradle</groupId>
<artifactId>hee-gradle-plugins</artifactId>
<version>1</version>
</dependency>
</dependencies>
</project>
@@ -0,0 +1 @@
8c4f03e97711738d21870d5a9918bc7e
@@ -0,0 +1 @@
32e486aa78a2b3428b3f1151dbc7fbf674d4b009
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>hee.kotlin</groupId>
<artifactId>hee.kotlin.gradle.plugin</artifactId>
<versioning>
<latest>1</latest>
<release>1</release>
<versions>
<version>1</version>
</versions>
<lastUpdated>20240219200634</lastUpdated>
</versioning>
</metadata>
@@ -0,0 +1 @@
fb4927d7ecb6f5d699ae818cd32e6d2c
@@ -0,0 +1 @@
8634ddd9fe7af67ab0703ac73dfffad531005f44
@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>hee.minecraft</groupId>
<artifactId>hee.minecraft.gradle.plugin</artifactId>
<version>1</version>
<packaging>pom</packaging>
<dependencies>
<dependency>
<groupId>com.chylex.hee.gradle</groupId>
<artifactId>hee-gradle-plugins</artifactId>
<version>1</version>
</dependency>
</dependencies>
</project>
@@ -0,0 +1 @@
e600fee6a3545c69c77dc076b28eb823
@@ -0,0 +1 @@
7e65b2d10962b59d1ddc7cfcf54b6db6c21c384b
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>hee.minecraft</groupId>
<artifactId>hee.minecraft.gradle.plugin</artifactId>
<versioning>
<latest>1</latest>
<release>1</release>
<versions>
<version>1</version>
</versions>
<lastUpdated>20240219200634</lastUpdated>
</versioning>
</metadata>
@@ -0,0 +1 @@
19ff71d9deccb0e3d5dad71de26fa9a2
@@ -0,0 +1 @@
d2d7360c1ceb2661c436c52bcde03d689487d25b
+1
View File
@@ -0,0 +1 @@
rootProject.name = "hee-gradle-plugins"
@@ -0,0 +1,21 @@
plugins {
java
}
sourceSets {
configureEach {
java.setSrcDirs(listOf(file("./$name/java")))
resources.setSrcDirs(listOf(file("./$name/resources")))
}
}
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(17))
}
}
tasks.withType<JavaCompile> {
options.encoding = "UTF-8"
}
@@ -0,0 +1,25 @@
val kotlinForForgeVersion: String by project
plugins {
id("hee.java")
kotlin("jvm")
}
sourceSets {
configureEach {
java.setSrcDirs(emptyList<File>())
kotlin.setSrcDirs(listOf(file("./$name/kotlin")))
}
}
repositories {
maven(url = "https://thedarkcolour.github.io/KotlinForForge") {
name = "KotlinForForge"
content { includeGroup("thedarkcolour") }
}
}
dependencies {
implementation(kotlin("stdlib"))
implementation("thedarkcolour:kotlinforforge-neoforge:${kotlinForForgeVersion}")
}
@@ -0,0 +1,12 @@
val neoForgeVersion: String by project
plugins {
id("hee.java")
id("net.neoforged.gradle.userdev")
}
dependencies {
implementation("net.neoforged:neoforge:$neoForgeVersion")
}
runs.clear()
Binary file not shown.
+3 -2
View File
@@ -1,6 +1,7 @@
#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-8.6-bin.zip
networkTimeout=10000
validateDistributionUrl=true
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
+197 -112
View File
@@ -1,78 +1,127 @@
#!/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/HEAD/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="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle" # This is normally unused
APP_BASE_NAME=`basename "$0"` # shellcheck disable=SC2034
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. # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
DEFAULT_JVM_OPTS="" APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
# 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,84 +130,120 @@ 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. if ! command -v java >/dev/null 2>&1
then
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
location of your Java installation." location of your Java installation."
fi 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 # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
MAX_FD="$MAX_FD_LIMIT" # shellcheck disable=SC2039,SC3045
fi MAX_FD=$( ulimit -H -n ) ||
ulimit -n $MAX_FD warn "Could not query maximum file descriptor limit"
if [ $? -ne 0 ] ; then esac
warn "Could not set maximum file descriptor limit: $MAX_FD" case $MAX_FD in #(
fi '' | soft) :;; #(
else *)
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
fi # shellcheck disable=SC2039,SC3045
fi ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
# 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
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
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
+40 -38
View File
@@ -1,3 +1,19 @@
@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 @if "%DEBUG%"=="" @echo off
@rem ########################################################################## @rem ##########################################################################
@rem @rem
@@ -10,24 +26,28 @@ if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0 set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=. if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
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. 1>&2
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. 1>&2
echo. echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. echo location of your Java installation. 1>&2
goto fail goto fail
@@ -35,54 +55,36 @@ 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. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. echo location of your Java installation. 1>&2
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)
+18
View File
@@ -0,0 +1,18 @@
rootProject.name = "hee"
pluginManagement {
repositories {
gradlePluginPortal()
maven(url = "https://maven.neoforged.net/releases") { name = "NeoForge" }
maven(url = rootDir.resolve("gradle/plugins/repository"))
}
plugins {
id("hee.java") version "1"
id("hee.kotlin") version "1"
id("hee.minecraft") version "1"
}
}
include(":neoforge")
project(":neoforge").projectDir = file("./src/neoforge")
-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()
}
}

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