21 Commits

Author SHA1 Message Date
Christian Knaapen
04f0f4f314 Fixed mod not loading 2025-03-15 19:56:01 +01:00
Christian Knaapen
c9782a8b69 Gradle tweaks 2025-03-15 15:41:39 +01:00
Christian Knaapen
302efe2ee4 Working on compatibility with Create 6. 2025-03-15 15:24:44 +01:00
Christian Knaapen
8ed699b30e Update flywheel version 2024-10-12 13:52:31 +02:00
Christian Knaapen
34dc492d3e Version update 2024-10-12 13:05:45 +02:00
Christian Knaapen
1d833b106f Merge remote-tracking branch 'jarvabb/1.20-alternative' into 1.20-alternative 2024-10-12 13:05:31 +02:00
Jarva
1c0220548c fix: wrap runnable to fix class loading issues 2024-01-16 11:20:39 +00:00
Christian Knaapen
e16b4e8489 Updated version 2023-12-23 21:46:13 +01:00
Christian Knaapen
3f588d917a Merge remote-tracking branch 'bysco/1.20-powercap' into 1.20-alternative 2023-12-23 21:45:29 +01:00
Christian Knaapen
582020177c Updated version 2023-12-23 21:41:15 +01:00
Christian Knaapen
22670b6b4a Merge remote-tracking branch 'bysco/port/1.20' into 1.20-alternative 2023-12-23 21:39:34 +01:00
Mrbysco
08c3b4b42d Switch Power Level to a player capability 2023-11-21 20:22:20 +01:00
Mrbysco
28d47a0cbb Fix textures not being recognized
Mojang no longer automatically loads textures in `textures/items` as they now load textures from `textures/item`
2023-11-21 02:48:06 +01:00
Mrbysco
00cb48b929 Fix loot modifiers
altenative was renamed to any_of
2023-11-21 02:46:50 +01:00
Christian Knaapen
0d6613c3ba Merge branch 'port/1.20' into 1.20-alternative 2023-11-18 20:57:39 +01:00
Christian Knaapen
1607aa35ce Fixed not being able to target tile entities when you want to break them (protection off). 2023-11-18 20:53:28 +01:00
Mrbysco
b75cfc45d8 Fix missing calls 2023-11-18 20:49:10 +01:00
Christian Knaapen
4537dd409d Updated version to 3.6 2023-11-18 12:23:14 +01:00
Christian Knaapen
268d6e7a6b Merge branch 'port/1.20' into 1.20-alternative 2023-11-18 11:59:09 +01:00
Mrbysco
ca44da71e7 Fresh port to 1.20
Note: I changed `BuildModeCategoryEnum` to actually use the Color class instead of using Vector4f. Same counts for `RadialMenu`
2023-11-18 00:38:56 +01:00
Christian Knaapen
8570bde282 Fixed not being able to load when the newest version of Create is installed. 2023-10-22 13:38:47 +02:00
185 changed files with 1878 additions and 3450 deletions

6
.gitignore vendored
View File

@@ -20,7 +20,7 @@ build
# other # other
eclipse eclipse
run run
logs/* runs
run-data
# Files from Forge MDK repo
forge*changelog.txt

View File

@@ -1,101 +1,94 @@
buildscript {
repositories {
maven { url = 'https://maven.minecraftforge.net' }
mavenCentral()
jcenter()
maven { url = 'https://repo.spongepowered.org/repository/maven-public' }
maven { url = 'https://maven.parchmentmc.org' }
}
dependencies {
classpath "net.minecraftforge.gradle:ForgeGradle:${forgegradle_version}"
classpath "org.spongepowered:mixingradle:${mixingradle_version}"
classpath "org.parchmentmc:librarian:${librarian_version}"
}
}
plugins { plugins {
id 'com.matthewprenger.cursegradle' version "${cursegradle_version}" id "idea"
id "eclipse"
id "maven-publish"
id 'net.neoforged.moddev.legacyforge' version '2.0.78'
id "org.jetbrains.gradle.plugin.idea-ext" version "1.1.8" // https://github.com/JetBrains/gradle-idea-ext-plugin
id "net.darkhax.curseforgegradle" version "1.1.26"
} }
apply plugin: 'net.minecraftforge.gradle'
apply plugin: 'org.parchmentmc.librarian.forgegradle'
apply plugin: 'eclipse'
apply plugin: 'maven-publish'
apply plugin: 'org.spongepowered.mixin'
jarJar.enable() apply from: "./gradle/java.gradle"
apply from: "gradle/property_loader.gradle"
boolean flywheelInWorkspace = findProject(':Flywheel') != null
ext.buildNumber = System.getenv('BUILD_NUMBER') ext.buildNumber = System.getenv('BUILD_NUMBER')
version = mod_version
group = 'nl.requios.effortlessbuilding' group = 'nl.requios.effortlessbuilding'
archivesBaseName = "effortlessbuilding-${artifact_minecraft_version}" base {
archivesName = "effortlessbuilding-${artifact_minecraft_version}"
version = mod_version
}
java.toolchain.languageVersion = JavaLanguageVersion.of(17) java.toolchain.languageVersion = JavaLanguageVersion.of(17)
println('Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getProperty('java.vm.version') + ' (' + System.getProperty('java.vendor') + ') Arch: ' + System.getProperty('os.arch')) println('Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getProperty('java.vm.version') + ' (' + System.getProperty('java.vendor') + ') Arch: ' + System.getProperty('os.arch'))
minecraft { legacyForge {
mappings channel: 'parchment', version: "${parchment_version}-${minecraft_version}" version = "$minecraft_version-$forge_version"
accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg')
if (file('src/main/resources/META-INF/accesstransformer.cfg').exists()) {
accessTransformers.from "src/main/resources/META-INF/accesstransformer.cfg"
}
parchment {
minecraftVersion = minecraft_version
mappingsVersion = parchment_version
}
runs { runs {
client { // applies to all the run configs below
workingDirectory project.file('run') configureEach {
arg '-mixin.config=flywheel.mixins.json' systemProperty 'forge.logging.markers', ''
systemProperty 'forge.logging.console.level', 'info'
jvmArguments = ["-XX:+IgnoreUnrecognizedVMOptions", "-XX:+AllowEnhancedClassRedefinition"]
//jvmArgs("-XX:-OmitStackTraceInFastThrow") // uncomment when you get exceptions with null messages etc
//jvmArgs '-XX:+UnlockCommercialFeatures' // uncomment for profiling //jvmArgs '-XX:+UnlockCommercialFeatures' // uncomment for profiling
property 'forge.logging.console.level', 'info'
mods { systemProperty 'mixin.debug.export', 'true'
effortlessbuilding { systemProperty 'mixin.debug.verbose', 'true'
source sourceSets.main
} }
if (flywheelInWorkspace) { client {
flywheel { client()
source project(":Flywheel").sourceSets.main
} gameDirectory = project.file('run')
}
}
} }
server { server {
workingDirectory project.file('run/server') server()
property 'forge.logging.console.level', 'info'
mods { gameDirectory = project.file('run/server')
effortlessbuilding {
source sourceSets.main
}
}
} }
data { data {
workingDirectory project.file('run') data()
property 'forge.logging.markers', 'REGISTRIES,REGISTRYDUMP'
property 'forge.logging.console.level', 'debug' gameDirectory = project.file('run')
args '--mod', 'effortlessbuilding', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources') systemProperty 'forge.logging.markers', 'REGISTRIES,REGISTRYDUMP'
systemProperty 'forge.logging.console.level', 'debug'
programArguments.addAll("--mod", mod_id as String, "--all", "--output", file("src/generated/resources/").getAbsolutePath(), "--existing", file("src/main/resources").getAbsolutePath())
}
gameTestServer {
type = "gameTestServer"
gameDirectory = project.file('run/gametest')
// setForceExit false <- FIXME 1.20
}
}
mods { mods {
effortlessbuilding { effortlessbuilding {
source sourceSets.main sourceSet sourceSets.main
}
}
} }
if (flywheelInWorkspace) { // Include resources generated by data generators.
flywheel { sourceSets.main.resources { srcDir 'src/generated/resources' }
source project(":Flywheel").sourceSets.main
}
}
}
}
}
}
repositories { repositories {
maven { maven { url = "https://maven.createmod.net" } // Ponder, Flywheel
// location of the maven for Registrate and Flywheel maven { url = "https://maven.tterrag.com" } // Registrate
name = 'tterrag maven'
url = 'https://maven.tterrag.com'
}
maven { maven {
url = 'https://www.cursemaven.com' url = 'https://www.cursemaven.com'
@@ -118,23 +111,26 @@ repositories {
} }
dependencies { dependencies {
minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" jarJar("net.createmod.ponder:Ponder-Forge-${minecraft_version}:${ponder_version}")
jarJar("com.jozufozu.flywheel:flywheel-forge-${flywheel_minecraft_version}:${flywheel_version}") { modCompileOnly("dev.engine-room.flywheel:flywheel-forge-api-${flywheel_minecraft_version}:${flywheel_version}")
jarJar.ranged(it, '[0.6.9,0.6.10)') modRuntimeOnly(jarJar("dev.engine-room.flywheel:flywheel-forge-${flywheel_minecraft_version}:${flywheel_version}") {
version {
strictly "[1.0,2.0)"
prefer flywheel_version
} }
})
modRuntimeOnly("dev.engine-room.vanillin:vanillin-forge-${flywheel_minecraft_version}:${vanillin_version}")
if (flywheelInWorkspace) { modImplementation("net.createmod.ponder:Ponder-Forge-${minecraft_version}:${ponder_version}")
implementation project(':Flywheel')
} else {
implementation fg.deobf("com.jozufozu.flywheel:flywheel-forge-${flywheel_minecraft_version}:${flywheel_version}")
}
// Prevent Mixin annotation processor from getting into IntelliJ's annotation processor settings // Prevent Mixin annotation processor from getting into IntelliJ's annotation processor settings
// This allows 'Settings > Build, Execution, and Deployment > Build Tools > Gradle > Build and run using' set to IntelliJ to work correctly // This allows 'Settings > Build, Execution, and Deployment > Build Tools > Gradle > Build and run using' set to IntelliJ to work correctly
if (!Boolean.getBoolean('idea.sync.active')) { if (!Boolean.getBoolean('idea.sync.active')) {
annotationProcessor "org.spongepowered:mixin:${mixin_version}:processor" annotationProcessor "org.spongepowered:mixin:${mixin_version}:processor"
} }
compileOnly('org.jetbrains:annotations:24.0.1')
} }
sourceSets.main.resources { sourceSets.main.resources {
@@ -145,6 +141,13 @@ tasks.withType(JavaCompile).configureEach {
options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation
} }
idea {
module {
downloadJavadoc = true
downloadSources = true
}
}
compileJava { compileJava {
options.compilerArgs = ['-Xdiags:verbose'] options.compilerArgs = ['-Xdiags:verbose']
} }
@@ -152,12 +155,12 @@ compileJava {
jar { jar {
manifest { manifest {
attributes([ attributes([
"Specification-Title": "effortlessbuilding", "Specification-Title" : mod_id,
"Specification-Vendor": "requios", "Specification-Vendor" : mod_author,
"Specification-Version" : "1", "Specification-Version" : "1",
"Implementation-Title": project.jar.baseName, "Implementation-Title" : project.name,
"Implementation-Version" : project.jar.archiveVersion, "Implementation-Version" : project.jar.archiveVersion,
"Implementation-Vendor" :"requios", "Implementation-Vendor" : mod_author,
"Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")
]) ])
} }
@@ -178,24 +181,17 @@ java {
withJavadocJar() withJavadocJar()
} }
jar.finalizedBy('reobfJar') tasks.build.dependsOn tasks.jarJar
tasks.jarJar.finalizedBy('reobfJarJar')
publishing { project.publishing {
publications { publications {
mavenJava(MavenPublication) { mavenJava(MavenPublication) {
artifactId = archivesBaseName artifactId base.archivesName.get()
from components.java from components.java
fg.component(it)
jarJar.component(it)
}
}
repositories { artifact(tasks.jar) {
if (project.hasProperty('mavendir')) { classifier = "all"
maven { url mavendir } }
} }
} }
} }

View File

@@ -3,18 +3,27 @@
org.gradle.jvmargs=-Xmx3G org.gradle.jvmargs=-Xmx3G
org.gradle.daemon=false org.gradle.daemon=false
mod_version = 3.4 mod_version = 3.10
artifact_minecraft_version = 1.19.2 artifact_minecraft_version = 1.20.1
minecraft_version = 1.19.2 minecraft_version = 1.20.1
forge_version = 43.1.47 forge_version = 47.1.3
forgegradle_version = 5.1.53 forgegradle_version = 6.0.7
mixingradle_version = 0.7-SNAPSHOT mixingradle_version = 0.7-SNAPSHOT
mixin_version = 0.8.5 mixin_version = 0.8.5
librarian_version = 1.+ librarian_version = 1.+
cursegradle_version = 1.4.0 cursegradle_version = 1.4.0
parchment_version = 2022.11.27 parchment_version = 2023.09.03
flywheel_minecraft_version = 1.19.2 flywheel_minecraft_version = 1.20.1
flywheel_version = 0.6.9-18 flywheel_version = 1.0.1
vanillin_version = 1.0.0-beta-217
ponder_version = 1.0.51
# mod options
mod_id = effortlessbuilding
mod_name = Effortless Building
mod_author = Requios
mod_description = Makes building easier by providing tools like mirrors, arrays, build modes and a block randomizer. For survival and creative mode.
mod_license = GNU LGPLv3

39
gradle/java.gradle Normal file
View File

@@ -0,0 +1,39 @@
apply plugin: 'java'
java.toolchain.languageVersion = JavaLanguageVersion.of(17)
java.withSourcesJar()
java.withJavadocJar()
jar {
manifest {
attributes([
'Specification-Title' : mod_name,
'Specification-Vendor' : mod_author,
'Specification-Version' : project.jar.archiveVersion,
'Implementation-Title' : project.name,
'Implementation-Version' : project.jar.archiveVersion,
'Implementation-Vendor' : mod_author,
'Implementation-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"),
'Timestampe' : System.currentTimeMillis(),
'Built-On-Java' : "${System.getProperty('java.vm.version')} (${System.getProperty('java.vm.vendor')})",
'Built-On-Minecraft' : minecraft_version
])
}
}
tasks.withType(JavaCompile).configureEach {
it.options.encoding = 'UTF-8'
it.options.release = 17
}
// Disables Gradle's custom module metadata from being published to maven. The
// metadata includes mapped dependencies which are not reasonably consumable by
// other mod developers.
tasks.withType(GenerateModuleMetadata) {
enabled = false
}
javadoc {
// Suppress annoying warnings when generating JavaDoc files.
options.addStringOption('Xdoclint:none', '-quiet')
}

View File

@@ -0,0 +1,48 @@
/*
This module can inject build properties from a JSON file. Each property in the
JSON file will be mapped to a build property using the key of that property.
Property keys ending with _comment will be skipped.
If a secretFile property exists and points to a valid JSON file that file will
be automatically loaded. You can manually load a file using the loadProperties
method.
*/
import groovy.json.JsonSlurper
// Auto detects a secret file and injects it.
if (project.rootProject.hasProperty("secretFile")) {
project.logger.lifecycle("Automatically loading properties from the secretFile")
final def secretsFile = project.rootProject.file(project.rootProject.getProperty("secretFile"))
if (secretsFile.exists() && secretsFile.name.endsWith(".json")) {
loadProperties(secretsFile)
}
}
// Loads properties using a specified json file.
def loadProperties(propertyFile) {
if (propertyFile.exists()) {
propertyFile.withReader {
Map propMap = new JsonSlurper().parse it
for (entry in propMap) {
// Filter entries that use _comment in the key.
if (!entry.key.endsWith("_comment")) {
project.ext.set(entry.key, entry.value)
}
}
project.logger.lifecycle("Successfully loaded " + propMap.size() + " properties")
propMap.clear()
}
} else {
project.logger.warn("The property file " + propertyFile.getName() + " could not be loaded. It does not exist.")
}
}
// Allows other scripts to use these methods.
ext {
loadProperties = this.&loadProperties
}

Binary file not shown.

View File

@@ -1,5 +1,7 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

28
gradlew vendored
View File

@@ -1,7 +1,7 @@
#!/bin/sh #!/bin/sh
# #
# Copyright <EFBFBD> 2015-2021 the original authors. # Copyright © 2015-2021 the original authors.
# #
# Licensed under the Apache License, Version 2.0 (the "License"); # Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. # you may not use this file except in compliance with the License.
@@ -32,10 +32,10 @@
# Busybox and similar reduced shells will NOT work, because this script # Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features: # requires all of these POSIX shell features:
# * functions; # * functions;
# * expansions <EFBFBD>$var<EFBFBD>, <EFBFBD>${var}<EFBFBD>, <EFBFBD>${var:-default}<EFBFBD>, <EFBFBD>${var+SET}<EFBFBD>, # * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# <EFBFBD>${var#prefix}<EFBFBD>, <EFBFBD>${var%suffix}<EFBFBD>, and <EFBFBD>$( cmd )<EFBFBD>; # «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially <EFBFBD>case<EFBFBD>; # * compound commands having a testable exit status, especially «case»;
# * various built-in commands including <EFBFBD>command<EFBFBD>, <EFBFBD>set<EFBFBD>, and <EFBFBD>ulimit<EFBFBD>. # * various built-in commands including «command», «set», and «ulimit».
# #
# Important for patching: # Important for patching:
# #
@@ -55,7 +55,7 @@
# Darwin, MinGW, and NonStop. # Darwin, MinGW, and NonStop.
# #
# (3) This script is generated from the Groovy template # (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project. # within the Gradle project.
# #
# You can find Gradle at https://github.com/gradle/gradle/. # You can find Gradle at https://github.com/gradle/gradle/.
@@ -80,10 +80,10 @@ do
esac esac
done done
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # This is normally unused
# shellcheck disable=SC2034
APP_NAME="Gradle"
APP_BASE_NAME=${0##*/} APP_BASE_NAME=${0##*/}
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
@@ -143,12 +143,16 @@ fi
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #( case $MAX_FD in #(
max*) max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
MAX_FD=$( ulimit -H -n ) || MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit" warn "Could not query maximum file descriptor limit"
esac esac
case $MAX_FD in #( case $MAX_FD in #(
'' | soft) :;; #( '' | soft) :;; #(
*) *)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC3045
ulimit -n "$MAX_FD" || ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD" warn "Could not set maximum file descriptor limit to $MAX_FD"
esac esac
@@ -205,6 +209,12 @@ set -- \
org.gradle.wrapper.GradleWrapperMain \ 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. # Use "xargs" to parse quoted args.
# #
# With -n1 it outputs one arg per line, with the quotes and backslashes removed. # With -n1 it outputs one arg per line, with the quotes and backslashes removed.

11
gradlew.bat vendored
View File

@@ -26,6 +26,7 @@ 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%
@@ -40,7 +41,7 @@ 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 execute if %ERRORLEVEL% equ 0 goto execute
echo. echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
: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

View File

@@ -1,6 +1,15 @@
pluginManagement { pluginManagement {
repositories { repositories {
gradlePluginPortal() gradlePluginPortal()
mavenCentral()
maven { url = 'https://maven.minecraftforge.net/' } maven { url = 'https://maven.minecraftforge.net/' }
maven { url = 'https://repo.spongepowered.org/repository/maven-public' }
maven { url = 'https://maven.parchmentmc.org' }
} }
} }
plugins {
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0'
}
rootProject.name = 'Effortless Building'

View File

@@ -1,8 +1,7 @@
package nl.requios.effortlessbuilding; package nl.requios.effortlessbuilding;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.GuiComponent;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
@@ -50,19 +49,12 @@ public enum AllGuiTextures implements ScreenElement {
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
@Override @Override
public void render(PoseStack ms, int x, int y) { public void render(GuiGraphics ms, int x, int y) {
bind(); ms.blit(location, x, y, 0, startX, startY, width, height, 256, 256);
GuiComponent.blit(ms, x, y, 0, startX, startY, width, height, 256, 256);
} }
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public void render(PoseStack ms, int x, int y, GuiComponent component) { public void render(GuiGraphics ms, int x, int y, Color c) {
bind();
component.blit(ms, x, y, startX, startY, width, height);
}
@OnlyIn(Dist.CLIENT)
public void render(PoseStack ms, int x, int y, Color c) {
bind(); bind();
UIRenderHelper.drawColoredTexture(ms, c, x, y, startX, startY, width, height); UIRenderHelper.drawColoredTexture(ms, c, x, y, startX, startY, width, height);
} }

View File

@@ -1,10 +1,8 @@
package nl.requios.effortlessbuilding; package nl.requios.effortlessbuilding;
import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexConsumer;
import com.mojang.math.Matrix4f; import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.GuiComponent;
import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.LightTexture;
import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
@@ -16,6 +14,7 @@ import nl.requios.effortlessbuilding.create.Create;
import nl.requios.effortlessbuilding.create.foundation.gui.element.DelegatedStencilElement; import nl.requios.effortlessbuilding.create.foundation.gui.element.DelegatedStencilElement;
import nl.requios.effortlessbuilding.create.foundation.gui.element.ScreenElement; import nl.requios.effortlessbuilding.create.foundation.gui.element.ScreenElement;
import nl.requios.effortlessbuilding.create.foundation.utility.Color; import nl.requios.effortlessbuilding.create.foundation.utility.Color;
import org.joml.Matrix4f;
public class AllIcons implements ScreenElement { public class AllIcons implements ScreenElement {
@@ -101,22 +100,10 @@ public class AllIcons implements ScreenElement {
return new AllIcons(x = 0, ++y); return new AllIcons(x = 0, ++y);
} }
@OnlyIn(Dist.CLIENT)
public void bind() {
RenderSystem.setShaderTexture(0, ICON_ATLAS);
}
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
@Override @Override
public void render(PoseStack matrixStack, int x, int y) { public void render(GuiGraphics guiGraphics, int x, int y) {
bind(); guiGraphics.blit(ICON_ATLAS, x, y, 0, iconX, iconY, 16, 16, 256, 256);
GuiComponent.blit(matrixStack, x, y, 0, iconX, iconY, 16, 16, 256, 256);
}
@OnlyIn(Dist.CLIENT)
public void render(PoseStack matrixStack, int x, int y, GuiComponent component) {
bind();
component.blit(matrixStack, x, y, iconX, iconY, 16, 16);
} }
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)

View File

@@ -17,10 +17,10 @@ import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import nl.requios.effortlessbuilding.buildmode.BuildModeEnum; import nl.requios.effortlessbuilding.buildmode.BuildModeEnum;
import nl.requios.effortlessbuilding.buildmode.ModeOptions; import nl.requios.effortlessbuilding.buildmode.ModeOptions;
import nl.requios.effortlessbuilding.capability.CapabilityHandler;
import nl.requios.effortlessbuilding.gui.buildmode.PlayerSettingsGui; import nl.requios.effortlessbuilding.gui.buildmode.PlayerSettingsGui;
import nl.requios.effortlessbuilding.gui.buildmode.RadialMenu; import nl.requios.effortlessbuilding.gui.buildmode.RadialMenu;
import nl.requios.effortlessbuilding.gui.buildmodifier.ModifiersScreen; import nl.requios.effortlessbuilding.gui.buildmodifier.ModifiersScreen;
import nl.requios.effortlessbuilding.systems.PowerLevel;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
@EventBusSubscriber(Dist.CLIENT) @EventBusSubscriber(Dist.CLIENT)
@@ -134,7 +134,7 @@ public class ClientEvents {
//Radial menu //Radial menu
if (keyBindings[0].isDown()) { if (keyBindings[0].isDown()) {
if (!EffortlessBuildingClient.POWER_LEVEL.isDisabled(player)) { if (!CapabilityHandler.isDisabled(player)) {
if (!RadialMenu.instance.isVisible()) { if (!RadialMenu.instance.isVisible()) {
Minecraft.getInstance().setScreen(RadialMenu.instance); Minecraft.getInstance().setScreen(RadialMenu.instance);
} }
@@ -175,7 +175,7 @@ public class ClientEvents {
if (player == null) return; if (player == null) return;
//Disabled if max reach is 0, might be set in the config that way. //Disabled if max reach is 0, might be set in the config that way.
if (EffortlessBuildingClient.POWER_LEVEL.isDisabled(player)) { if (CapabilityHandler.isDisabled(player)) {
EffortlessBuilding.log(player, "Build modifiers are disabled until your power level has increased. Increase your power level by consuming certain items."); EffortlessBuilding.log(player, "Build modifiers are disabled until your power level has increased. Increase your power level by consuming certain items.");
} else { } else {
mc.setScreen(new ModifiersScreen()); mc.setScreen(new ModifiersScreen());

View File

@@ -2,10 +2,12 @@ package nl.requios.effortlessbuilding;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.common.util.FakePlayer;
import net.minecraftforge.event.AttachCapabilitiesEvent;
import net.minecraftforge.event.RegisterCommandsEvent; import net.minecraftforge.event.RegisterCommandsEvent;
import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.TickEvent;
import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerEvent;
@@ -14,9 +16,13 @@ import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.LogicalSide;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import net.minecraftforge.network.PacketDistributor; import net.minecraftforge.network.PacketDistributor;
import nl.requios.effortlessbuilding.capability.CapabilityHandler;
import nl.requios.effortlessbuilding.capability.IPowerLevel;
import nl.requios.effortlessbuilding.capability.PowerLevelCapability;
import nl.requios.effortlessbuilding.compatibility.CompatHelper; import nl.requios.effortlessbuilding.compatibility.CompatHelper;
import nl.requios.effortlessbuilding.network.ModifierSettingsPacket; import nl.requios.effortlessbuilding.network.ModifierSettingsPacket;
import nl.requios.effortlessbuilding.network.PacketHandler; import nl.requios.effortlessbuilding.network.PacketHandler;
import nl.requios.effortlessbuilding.network.PowerLevelPacket;
import nl.requios.effortlessbuilding.systems.ServerBuildState; import nl.requios.effortlessbuilding.systems.ServerBuildState;
import nl.requios.effortlessbuilding.utilities.PowerLevelCommand; import nl.requios.effortlessbuilding.utilities.PowerLevelCommand;
@@ -74,7 +80,10 @@ public class CommonEvents {
//Don't cancel event if our custom logic is breaking blocks //Don't cancel event if our custom logic is breaking blocks
if (EffortlessBuilding.SERVER_BLOCK_PLACER.isPlacingOrBreakingBlocks()) return; if (EffortlessBuilding.SERVER_BLOCK_PLACER.isPlacingOrBreakingBlocks()) return;
if (!ServerBuildState.isLikeVanilla(player) && EffortlessBuilding.SERVER_POWER_LEVEL.canBreakFar(player)) { IPowerLevel powerLevel = player.getCapability(CapabilityHandler.POWER_LEVEL_CAPABILITY).orElse(null);
if (powerLevel == null) return; //Should never be null but just to be sure
if (!ServerBuildState.isLikeVanilla(player) && powerLevel.canBreakFar(player)) {
event.setCanceled(true); event.setCanceled(true);
} }
} }
@@ -94,7 +103,34 @@ public class CommonEvents {
ServerBuildState.handleNewPlayer(player); ServerBuildState.handleNewPlayer(player);
PacketHandler.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new ModifierSettingsPacket(player)); PacketHandler.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new ModifierSettingsPacket(player));
EffortlessBuilding.SERVER_POWER_LEVEL.sendToClient(player);
IPowerLevel powerLevel = player.getCapability(CapabilityHandler.POWER_LEVEL_CAPABILITY).orElse(null);
if (powerLevel == null) return; //Should never be null but just to be sure
PacketHandler.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new PowerLevelPacket(powerLevel.getPowerLevel()));
}
@SubscribeEvent
public static void registerCaps(AttachCapabilitiesEvent<Entity> event) {
if (event.getObject() instanceof Player) {
event.addCapability(CapabilityHandler.POWER_LEVEL_CAP, new PowerLevelCapability());
}
}
@SubscribeEvent
public static void onClone(PlayerEvent.Clone event) {
// If not dead, player is returning from the End
if (!event.isWasDeath()) return;
Player original = event.getOriginal();
Player clone = event.getEntity();
// Copy the power level from the original player to the clone
original.getCapability(CapabilityHandler.POWER_LEVEL_CAPABILITY).ifPresent(dataOriginal ->
clone.getCapability(CapabilityHandler.POWER_LEVEL_CAPABILITY).ifPresent(dataClone -> {
dataClone.setPowerLevel(dataOriginal.getPowerLevel());
})
);
} }
@SubscribeEvent @SubscribeEvent

View File

@@ -3,12 +3,16 @@ package nl.requios.effortlessbuilding;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.flag.FeatureFlags;
import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.item.CreativeModeTabs;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.loot.IGlobalLootModifier; import net.minecraftforge.common.loot.IGlobalLootModifier;
import net.minecraftforge.event.BuildCreativeModeTabContentsEvent;
import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.ModLoadingContext;
@@ -31,11 +35,12 @@ import nl.requios.effortlessbuilding.proxy.IProxy;
import nl.requios.effortlessbuilding.proxy.ServerProxy; import nl.requios.effortlessbuilding.proxy.ServerProxy;
import nl.requios.effortlessbuilding.systems.ItemUsageTracker; import nl.requios.effortlessbuilding.systems.ItemUsageTracker;
import nl.requios.effortlessbuilding.systems.ServerBlockPlacer; import nl.requios.effortlessbuilding.systems.ServerBlockPlacer;
import nl.requios.effortlessbuilding.systems.ServerPowerLevel;
import nl.requios.effortlessbuilding.systems.UndoRedo; import nl.requios.effortlessbuilding.systems.UndoRedo;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import java.util.List;
@Mod(EffortlessBuilding.MODID) @Mod(EffortlessBuilding.MODID)
public class EffortlessBuilding { public class EffortlessBuilding {
@@ -48,7 +53,6 @@ public class EffortlessBuilding {
public static final ServerBlockPlacer SERVER_BLOCK_PLACER = new ServerBlockPlacer(); public static final ServerBlockPlacer SERVER_BLOCK_PLACER = new ServerBlockPlacer();
public static final UndoRedo UNDO_REDO = new UndoRedo(); public static final UndoRedo UNDO_REDO = new UndoRedo();
public static final ItemUsageTracker ITEM_USAGE_TRACKER = new ItemUsageTracker(); public static final ItemUsageTracker ITEM_USAGE_TRACKER = new ItemUsageTracker();
public static final ServerPowerLevel SERVER_POWER_LEVEL = new ServerPowerLevel();
//Registration //Registration
private static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MODID); private static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MODID);
@@ -78,6 +82,7 @@ public class EffortlessBuilding {
IEventBus forgeEventBus = MinecraftForge.EVENT_BUS; IEventBus forgeEventBus = MinecraftForge.EVENT_BUS;
modEventBus.addListener(EffortlessBuilding::setup); modEventBus.addListener(EffortlessBuilding::setup);
modEventBus.addListener(EffortlessBuilding::addTabContents);
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> EffortlessBuildingClient.onConstructorClient(modEventBus, forgeEventBus)); DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> EffortlessBuildingClient.onConstructorClient(modEventBus, forgeEventBus));
@@ -88,9 +93,9 @@ public class EffortlessBuilding {
LOOT_MODIFIERS.register(FMLJavaModLoadingContext.get().getModEventBus()); LOOT_MODIFIERS.register(FMLJavaModLoadingContext.get().getModEventBus());
//Register config //Register config
ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, CommonConfig.spec); modLoadingContext.registerConfig(ModConfig.Type.COMMON, CommonConfig.spec);
ModLoadingContext.get().registerConfig(ModConfig.Type.CLIENT, ClientConfig.spec); modLoadingContext.registerConfig(ModConfig.Type.CLIENT, ClientConfig.spec);
ModLoadingContext.get().registerConfig(ModConfig.Type.SERVER, ServerConfig.spec); modLoadingContext.registerConfig(ModConfig.Type.SERVER, ServerConfig.spec);
} }
public static void setup(final FMLCommonSetupEvent event) { public static void setup(final FMLCommonSetupEvent event) {
@@ -99,8 +104,15 @@ public class EffortlessBuilding {
CompatHelper.setup(); CompatHelper.setup();
} }
public static void addTabContents(final BuildCreativeModeTabContentsEvent event) {
if (event.getTabKey() == CreativeModeTabs.TOOLS_AND_UTILITIES) {
List<ItemStack> stacks = ITEMS.getEntries().stream().map(reg -> new ItemStack(reg.get())).toList();
event.acceptAll(stacks);
}
}
public static <T extends AbstractContainerMenu> MenuType<T> registerContainer(IContainerFactory<T> fact){ public static <T extends AbstractContainerMenu> MenuType<T> registerContainer(IContainerFactory<T> fact){
MenuType<T> type = new MenuType<T>(fact); MenuType<T> type = new MenuType<T>(fact, FeatureFlags.REGISTRY.allFlags());
return type; return type;
} }

View File

@@ -20,7 +20,6 @@ public class EffortlessBuildingClient {
public static final BlockPreviews BLOCK_PREVIEWS = new BlockPreviews(); public static final BlockPreviews BLOCK_PREVIEWS = new BlockPreviews();
public static final BuilderFilter BUILDER_FILTER = new BuilderFilter(); public static final BuilderFilter BUILDER_FILTER = new BuilderFilter();
public static final ItemUsageTracker ITEM_USAGE_TRACKER = new ItemUsageTracker(); public static final ItemUsageTracker ITEM_USAGE_TRACKER = new ItemUsageTracker();
public static final PowerLevel POWER_LEVEL = new PowerLevel();
public static void onConstructorClient(IEventBus modEventBus, IEventBus forgeEventBus) { public static void onConstructorClient(IEventBus modEventBus, IEventBus forgeEventBus) {
modEventBus.addListener(EffortlessBuildingClient::clientSetup); modEventBus.addListener(EffortlessBuildingClient::clientSetup);

View File

@@ -1,16 +1,16 @@
package nl.requios.effortlessbuilding.buildmode; package nl.requios.effortlessbuilding.buildmode;
import com.mojang.math.Vector4f; import nl.requios.effortlessbuilding.create.foundation.utility.Color;
public enum BuildModeCategoryEnum { public enum BuildModeCategoryEnum {
BASIC(new Vector4f(0f, .5f, 1f, .8f)), BASIC(new Color(0f, .5f, 1f, .8f)),
DIAGONAL(new Vector4f(0.56f, 0.28f, 0.87f, .8f)), DIAGONAL(new Color(0.56f, 0.28f, 0.87f, .8f)),
CIRCULAR(new Vector4f(0.29f, 0.76f, 0.3f, 1f)), CIRCULAR(new Color(0.29f, 0.76f, 0.3f, 1f)),
ROOF(new Vector4f(0.83f, 0.87f, 0.23f, .8f)); ROOF(new Color(0.83f, 0.87f, 0.23f, .8f));
public final Vector4f color; public final Color color;
BuildModeCategoryEnum(Vector4f color) { BuildModeCategoryEnum(Color color) {
this.color = color; this.color = color;
} }
} }

View File

@@ -109,7 +109,7 @@ public class BuildModes {
if (!skipRaytrace) { if (!skipRaytrace) {
//collision within a 1 block radius to selected is fine //collision within a 1 block radius to selected is fine
ClipContext rayTraceContext = new ClipContext(start, lineBound, ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, player); ClipContext rayTraceContext = new ClipContext(start, lineBound, ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, player);
HitResult rayTraceResult = player.level.clip(rayTraceContext); HitResult rayTraceResult = player.level().clip(rayTraceContext);
intersects = rayTraceResult != null && rayTraceResult.getType() == HitResult.Type.BLOCK && intersects = rayTraceResult != null && rayTraceResult.getType() == HitResult.Type.BLOCK &&
planeBound.subtract(rayTraceResult.getLocation()).lengthSqr() > 4; planeBound.subtract(rayTraceResult.getLocation()).lengthSqr() > 4;
} }

View File

@@ -103,7 +103,7 @@ public class ModeOptions {
case CIRCLE_START_CORNER -> circleStart = ActionEnum.CIRCLE_START_CORNER; case CIRCLE_START_CORNER -> circleStart = ActionEnum.CIRCLE_START_CORNER;
} }
if (player.level.isClientSide && if (player.level().isClientSide &&
action != ActionEnum.OPEN_MODIFIER_SETTINGS && action != ActionEnum.OPEN_MODIFIER_SETTINGS &&
action != ActionEnum.OPEN_PLAYER_SETTINGS && action != ActionEnum.OPEN_PLAYER_SETTINGS &&
action != ActionEnum.PREVIOUS_BUILD_MODE && action != ActionEnum.PREVIOUS_BUILD_MODE &&

View File

@@ -5,6 +5,7 @@ import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import nl.requios.effortlessbuilding.EffortlessBuildingClient; import nl.requios.effortlessbuilding.EffortlessBuildingClient;
import nl.requios.effortlessbuilding.capability.CapabilityHandler;
import nl.requios.effortlessbuilding.utilities.BlockEntry; import nl.requios.effortlessbuilding.utilities.BlockEntry;
import nl.requios.effortlessbuilding.utilities.BlockSet; import nl.requios.effortlessbuilding.utilities.BlockSet;
@@ -64,7 +65,7 @@ public abstract class ThreeClicksBuildMode extends BaseBuildMode {
if (secondPos == null) return; if (secondPos == null) return;
//Limit amount of blocks we can place per row //Limit amount of blocks we can place per row
int axisLimit = EffortlessBuildingClient.POWER_LEVEL.getMaxBlocksPerAxis(player); int axisLimit = CapabilityHandler.getMaxBlocksPerAxis(player, false);
int x1 = firstPos.getX(), x2 = secondPos.getX(); int x1 = firstPos.getX(), x2 = secondPos.getX();
int y1 = firstPos.getY(), y2 = secondPos.getY(); int y1 = firstPos.getY(), y2 = secondPos.getY();
@@ -93,7 +94,7 @@ public abstract class ThreeClicksBuildMode extends BaseBuildMode {
if (thirdPos == null) return; if (thirdPos == null) return;
//Limit amount of blocks you can place per row //Limit amount of blocks you can place per row
int axisLimit = EffortlessBuildingClient.POWER_LEVEL.getMaxBlocksPerAxis(player); int axisLimit = CapabilityHandler.getMaxBlocksPerAxis(player, false);
int x1 = firstPos.getX(), x2 = secondPos.getX(), x3 = thirdPos.getX(); int x1 = firstPos.getX(), x2 = secondPos.getX(), x3 = thirdPos.getX();
int y1 = firstPos.getY(), y2 = secondPos.getY(), y3 = thirdPos.getY(); int y1 = firstPos.getY(), y2 = secondPos.getY(), y3 = thirdPos.getY();
@@ -139,7 +140,7 @@ public abstract class ThreeClicksBuildMode extends BaseBuildMode {
criteriaList.add(new HeightCriteria(zBound, secondPos, start)); criteriaList.add(new HeightCriteria(zBound, secondPos, start));
//Remove invalid criteria //Remove invalid criteria
int reach = EffortlessBuildingClient.POWER_LEVEL.getBuildModeReach(player); int reach = CapabilityHandler.getBuildModeReach(player);
criteriaList.removeIf(criteria -> !criteria.isValid(start, look, reach, player, skipRaytrace)); criteriaList.removeIf(criteria -> !criteria.isValid(start, look, reach, player, skipRaytrace));
//If none are valid, return empty list of blocks //If none are valid, return empty list of blocks
@@ -164,7 +165,7 @@ public abstract class ThreeClicksBuildMode extends BaseBuildMode {
} }
} }
} }
return new BlockPos(selected.lineBound); return BlockPos.containing(selected.lineBound);
} }
// protected abstract BlockEntry findSecondPos(List<BlockEntry> blocks); // protected abstract BlockEntry findSecondPos(List<BlockEntry> blocks);
@@ -197,7 +198,7 @@ public abstract class ThreeClicksBuildMode extends BaseBuildMode {
//Make it from a plane into a line, on y axis only //Make it from a plane into a line, on y axis only
private Vec3 toLongestLine(Vec3 boundVec, BlockPos secondPos) { private Vec3 toLongestLine(Vec3 boundVec, BlockPos secondPos) {
BlockPos bound = new BlockPos(boundVec); BlockPos bound = BlockPos.containing(boundVec);
return new Vec3(secondPos.getX(), bound.getY(), secondPos.getZ()); return new Vec3(secondPos.getX(), bound.getY(), secondPos.getZ());
} }

View File

@@ -4,9 +4,9 @@ import net.minecraft.client.Minecraft;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import nl.requios.effortlessbuilding.EffortlessBuildingClient; import nl.requios.effortlessbuilding.EffortlessBuildingClient;
import nl.requios.effortlessbuilding.capability.CapabilityHandler;
import nl.requios.effortlessbuilding.utilities.BlockEntry; import nl.requios.effortlessbuilding.utilities.BlockEntry;
import nl.requios.effortlessbuilding.utilities.BlockSet; import nl.requios.effortlessbuilding.utilities.BlockSet;
import nl.requios.effortlessbuilding.systems.PowerLevel;
import java.util.List; import java.util.List;
@@ -49,7 +49,7 @@ public abstract class TwoClicksBuildMode extends BaseBuildMode {
if (secondPos == null) return; if (secondPos == null) return;
//Limit amount of blocks we can place per row //Limit amount of blocks we can place per row
int axisLimit = EffortlessBuildingClient.POWER_LEVEL.getMaxBlocksPerAxis(player); int axisLimit = CapabilityHandler.getMaxBlocksPerAxis(player, false);
int x1 = firstPos.getX(), x2 = secondPos.getX(); int x1 = firstPos.getX(), x2 = secondPos.getX();
int y1 = firstPos.getY(), y2 = secondPos.getY(); int y1 = firstPos.getY(), y2 = secondPos.getY();

View File

@@ -20,7 +20,7 @@ public class DiagonalLine extends ThreeClicksBuildMode {
int iterations = (int) Math.ceil(first.distanceTo(second) * sampleMultiplier); int iterations = (int) Math.ceil(first.distanceTo(second) * sampleMultiplier);
for (double t = 0; t <= 1.0; t += 1.0 / iterations) { for (double t = 0; t <= 1.0; t += 1.0 / iterations) {
Vec3 lerp = first.add(second.subtract(first).scale(t)); Vec3 lerp = first.add(second.subtract(first).scale(t));
BlockPos candidate = new BlockPos(lerp); BlockPos candidate = BlockPos.containing(lerp);
//Only add if not equal to the last in the list //Only add if not equal to the last in the list
if (list.isEmpty() || !list.get(list.size() - 1).equals(candidate)) if (list.isEmpty() || !list.get(list.size() - 1).equals(candidate))
list.add(candidate); list.add(candidate);

View File

@@ -3,11 +3,10 @@ package nl.requios.effortlessbuilding.buildmode.buildmodes;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import nl.requios.effortlessbuilding.EffortlessBuildingClient;
import nl.requios.effortlessbuilding.buildmode.BuildModes; import nl.requios.effortlessbuilding.buildmode.BuildModes;
import nl.requios.effortlessbuilding.buildmode.ModeOptions; import nl.requios.effortlessbuilding.buildmode.ModeOptions;
import nl.requios.effortlessbuilding.buildmode.TwoClicksBuildMode; import nl.requios.effortlessbuilding.buildmode.TwoClicksBuildMode;
import nl.requios.effortlessbuilding.systems.PowerLevel; import nl.requios.effortlessbuilding.capability.CapabilityHandler;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -25,7 +24,7 @@ public class Floor extends TwoClicksBuildMode {
criteriaList.add(new Criteria(yBound, start)); criteriaList.add(new Criteria(yBound, start));
//Remove invalid criteria //Remove invalid criteria
int reach = EffortlessBuildingClient.POWER_LEVEL.getBuildModeReach(player); int reach = CapabilityHandler.getBuildModeReach(player);
criteriaList.removeIf(criteria -> !criteria.isValid(start, look, reach, player, skipRaytrace)); criteriaList.removeIf(criteria -> !criteria.isValid(start, look, reach, player, skipRaytrace));
//If none are valid, return empty list of blocks //If none are valid, return empty list of blocks
@@ -34,7 +33,7 @@ public class Floor extends TwoClicksBuildMode {
//Then only 1 can be valid, return that one //Then only 1 can be valid, return that one
Criteria selected = criteriaList.get(0); Criteria selected = criteriaList.get(0);
return new BlockPos(selected.planeBound); return BlockPos.containing(selected.planeBound);
} }
public static List<BlockPos> getFloorBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) { public static List<BlockPos> getFloorBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) {

View File

@@ -1,12 +1,11 @@
package nl.requios.effortlessbuilding.buildmode.buildmodes; package nl.requios.effortlessbuilding.buildmode.buildmodes;
import net.minecraft.world.entity.player.Player;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import nl.requios.effortlessbuilding.EffortlessBuildingClient;
import nl.requios.effortlessbuilding.buildmode.BuildModes; import nl.requios.effortlessbuilding.buildmode.BuildModes;
import nl.requios.effortlessbuilding.buildmode.TwoClicksBuildMode; import nl.requios.effortlessbuilding.buildmode.TwoClicksBuildMode;
import nl.requios.effortlessbuilding.systems.PowerLevel; import nl.requios.effortlessbuilding.capability.CapabilityHandler;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -32,7 +31,7 @@ public class Line extends TwoClicksBuildMode {
criteriaList.add(new Criteria(zBound, firstPos, start)); criteriaList.add(new Criteria(zBound, firstPos, start));
//Remove invalid criteria //Remove invalid criteria
int reach = EffortlessBuildingClient.POWER_LEVEL.getBuildModeReach(player); int reach = CapabilityHandler.getBuildModeReach(player);
criteriaList.removeIf(criteria -> !criteria.isValid(start, look, reach, player, skipRaytrace)); criteriaList.removeIf(criteria -> !criteria.isValid(start, look, reach, player, skipRaytrace));
//If none are valid, return empty list of blocks //If none are valid, return empty list of blocks
@@ -59,7 +58,7 @@ public class Line extends TwoClicksBuildMode {
} }
return new BlockPos(selected.lineBound); return BlockPos.containing(selected.lineBound);
} }
public static List<BlockPos> getLineBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) { public static List<BlockPos> getLineBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) {
@@ -90,7 +89,7 @@ public class Line extends TwoClicksBuildMode {
public static void addZLineBlocks(List<BlockPos> list, int z1, int z2, int x, int y) { public static void addZLineBlocks(List<BlockPos> list, int z1, int z2, int x, int y) {
for (int z = z1; z1 < z2 ? z <= z2 : z >= z2; z += z1 < z2 ? 1 : -1) { for (int z = z1; z1 < z2 ? z <= z2 : z >= z2; z += z1 < z2 ? 1 : -1) {
list.add(new BlockPos(x, y, z)); list.add(BlockPos.containing(x, y, z));
} }
} }
@@ -120,7 +119,7 @@ public class Line extends TwoClicksBuildMode {
//Make it from a plane into a line //Make it from a plane into a line
//Select the axis that is longest //Select the axis that is longest
private Vec3 toLongestLine(Vec3 boundVec, BlockPos firstPos) { private Vec3 toLongestLine(Vec3 boundVec, BlockPos firstPos) {
BlockPos bound = new BlockPos(boundVec); BlockPos bound = BlockPos.containing(boundVec);
BlockPos firstToSecond = bound.subtract(firstPos); BlockPos firstToSecond = bound.subtract(firstPos);
firstToSecond = new BlockPos(Math.abs(firstToSecond.getX()), Math.abs(firstToSecond.getY()), Math.abs(firstToSecond.getZ())); firstToSecond = new BlockPos(Math.abs(firstToSecond.getX()), Math.abs(firstToSecond.getY()), Math.abs(firstToSecond.getZ()));

View File

@@ -2,10 +2,9 @@ package nl.requios.effortlessbuilding.buildmode.buildmodes;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import nl.requios.effortlessbuilding.EffortlessBuildingClient;
import nl.requios.effortlessbuilding.buildmode.ModeOptions; import nl.requios.effortlessbuilding.buildmode.ModeOptions;
import nl.requios.effortlessbuilding.buildmode.ThreeClicksBuildMode; import nl.requios.effortlessbuilding.buildmode.ThreeClicksBuildMode;
import nl.requios.effortlessbuilding.systems.PowerLevel; import nl.requios.effortlessbuilding.capability.CapabilityHandler;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -16,7 +15,7 @@ public class SlopeFloor extends ThreeClicksBuildMode {
public static List<BlockPos> getSlopeFloorBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) { public static List<BlockPos> getSlopeFloorBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3) {
List<BlockPos> list = new ArrayList<>(); List<BlockPos> list = new ArrayList<>();
int axisLimit = EffortlessBuildingClient.POWER_LEVEL.getMaxBlocksPerAxis(player); int axisLimit = CapabilityHandler.getMaxBlocksPerAxis(player, false);
//Determine whether to use x or z axis to slope up //Determine whether to use x or z axis to slope up
boolean onXAxis = true; boolean onXAxis = true;

View File

@@ -3,11 +3,10 @@ package nl.requios.effortlessbuilding.buildmode.buildmodes;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import nl.requios.effortlessbuilding.EffortlessBuildingClient;
import nl.requios.effortlessbuilding.buildmode.BuildModes; import nl.requios.effortlessbuilding.buildmode.BuildModes;
import nl.requios.effortlessbuilding.buildmode.ModeOptions; import nl.requios.effortlessbuilding.buildmode.ModeOptions;
import nl.requios.effortlessbuilding.buildmode.TwoClicksBuildMode; import nl.requios.effortlessbuilding.buildmode.TwoClicksBuildMode;
import nl.requios.effortlessbuilding.systems.PowerLevel; import nl.requios.effortlessbuilding.capability.CapabilityHandler;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -29,7 +28,7 @@ public class Wall extends TwoClicksBuildMode {
criteriaList.add(new Criteria(zBound, firstPos, start, look)); criteriaList.add(new Criteria(zBound, firstPos, start, look));
//Remove invalid criteria //Remove invalid criteria
int reach = EffortlessBuildingClient.POWER_LEVEL.getBuildModeReach(player); int reach = CapabilityHandler.getBuildModeReach(player);
criteriaList.removeIf(criteria -> !criteria.isValid(start, look, reach, player, skipRaytrace)); criteriaList.removeIf(criteria -> !criteria.isValid(start, look, reach, player, skipRaytrace));
//If none are valid, return empty list of blocks //If none are valid, return empty list of blocks
@@ -49,7 +48,7 @@ public class Wall extends TwoClicksBuildMode {
} }
} }
return new BlockPos(selected.planeBound); return BlockPos.containing(selected.planeBound);
} }
public static List<BlockPos> getWallBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) { public static List<BlockPos> getWallBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) {

View File

@@ -1,24 +1,12 @@
package nl.requios.effortlessbuilding.buildmodifier; package nl.requios.effortlessbuilding.buildmodifier;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtUtils;
import net.minecraft.nbt.Tag;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.core.Direction;
import net.minecraft.world.InteractionHand;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.world.phys.Vec3;
import net.minecraft.core.Vec3i; import net.minecraft.core.Vec3i;
import net.minecraftforge.items.IItemHandler;
import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem;
import nl.requios.effortlessbuilding.utilities.BlockEntry; import nl.requios.effortlessbuilding.utilities.BlockEntry;
import nl.requios.effortlessbuilding.utilities.BlockSet; import nl.requios.effortlessbuilding.utilities.BlockSet;
import java.util.ArrayList;
import java.util.List;
public class Array extends BaseModifier { public class Array extends BaseModifier {
public Vec3i offset = BlockPos.ZERO; public Vec3i offset = BlockPos.ZERO;

View File

@@ -1,7 +1,6 @@
package nl.requios.effortlessbuilding.buildmodifier; package nl.requios.effortlessbuilding.buildmodifier;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.Tag;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import nl.requios.effortlessbuilding.utilities.BlockSet; import nl.requios.effortlessbuilding.utilities.BlockSet;

View File

@@ -2,13 +2,11 @@ package nl.requios.effortlessbuilding.buildmodifier;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtUtils;
import net.minecraft.nbt.Tag;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import nl.requios.effortlessbuilding.EffortlessBuildingClient; import nl.requios.effortlessbuilding.capability.CapabilityHandler;
import nl.requios.effortlessbuilding.utilities.BlockEntry; import nl.requios.effortlessbuilding.utilities.BlockEntry;
import nl.requios.effortlessbuilding.utilities.BlockSet; import nl.requios.effortlessbuilding.utilities.BlockSet;
@@ -44,13 +42,13 @@ public class Mirror extends BaseModifier {
@Override @Override
public void onPowerLevelChanged(int powerLevel) { public void onPowerLevelChanged(int powerLevel) {
radius = EffortlessBuildingClient.POWER_LEVEL.getMaxMirrorRadius(Minecraft.getInstance().player); radius = CapabilityHandler.getMaxMirrorRadius(Minecraft.getInstance().player, false);
} }
private void performMirrorX(BlockSet blocks, BlockEntry blockEntry) { private void performMirrorX(BlockSet blocks, BlockEntry blockEntry) {
//find mirror position //find mirror position
double x = position.x + (position.x - blockEntry.blockPos.getX() - 0.5); double x = position.x + (position.x - blockEntry.blockPos.getX() - 0.5);
BlockPos newBlockPos = new BlockPos(x, blockEntry.blockPos.getY(), blockEntry.blockPos.getZ()); BlockPos newBlockPos = BlockPos.containing(x, blockEntry.blockPos.getY(), blockEntry.blockPos.getZ());
if (blocks.containsKey(newBlockPos)) return; if (blocks.containsKey(newBlockPos)) return;
@@ -66,7 +64,7 @@ public class Mirror extends BaseModifier {
private void performMirrorY(BlockSet blocks, BlockEntry blockEntry) { private void performMirrorY(BlockSet blocks, BlockEntry blockEntry) {
//find mirror position //find mirror position
double y = position.y + (position.y - blockEntry.blockPos.getY() - 0.5); double y = position.y + (position.y - blockEntry.blockPos.getY() - 0.5);
BlockPos newBlockPos = new BlockPos(blockEntry.blockPos.getX(), y, blockEntry.blockPos.getZ()); BlockPos newBlockPos = BlockPos.containing(blockEntry.blockPos.getX(), y, blockEntry.blockPos.getZ());
if (blocks.containsKey(newBlockPos)) return; if (blocks.containsKey(newBlockPos)) return;
@@ -81,7 +79,7 @@ public class Mirror extends BaseModifier {
private void performMirrorZ(BlockSet blocks, BlockEntry blockEntry) { private void performMirrorZ(BlockSet blocks, BlockEntry blockEntry) {
//find mirror position //find mirror position
double z = position.z + (position.z - blockEntry.blockPos.getZ() - 0.5); double z = position.z + (position.z - blockEntry.blockPos.getZ() - 0.5);
BlockPos newBlockPos = new BlockPos(blockEntry.blockPos.getX(), blockEntry.blockPos.getY(), z); BlockPos newBlockPos = BlockPos.containing(blockEntry.blockPos.getX(), blockEntry.blockPos.getY(), z);
if (blocks.containsKey(newBlockPos)) return; if (blocks.containsKey(newBlockPos)) return;

View File

@@ -4,23 +4,15 @@ import net.minecraft.client.Minecraft;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.core.Direction;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.level.block.Mirror; import net.minecraft.world.level.block.Mirror;
import net.minecraft.world.level.block.Rotation; import net.minecraft.world.level.block.Rotation;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import net.minecraftforge.items.IItemHandler; import nl.requios.effortlessbuilding.capability.CapabilityHandler;
import nl.requios.effortlessbuilding.EffortlessBuildingClient;
import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem;
import nl.requios.effortlessbuilding.utilities.BlockEntry; import nl.requios.effortlessbuilding.utilities.BlockEntry;
import nl.requios.effortlessbuilding.utilities.BlockSet; import nl.requios.effortlessbuilding.utilities.BlockSet;
import java.util.ArrayList;
import java.util.List;
public class RadialMirror extends BaseModifier { public class RadialMirror extends BaseModifier {
public Vec3 position = new Vec3(0.5, 64.5, 0.5); public Vec3 position = new Vec3(0.5, 64.5, 0.5);
@@ -51,7 +43,7 @@ public class RadialMirror extends BaseModifier {
@Override @Override
public void onPowerLevelChanged(int powerLevel) { public void onPowerLevelChanged(int powerLevel) {
radius = EffortlessBuildingClient.POWER_LEVEL.getMaxMirrorRadius(Minecraft.getInstance().player); radius = CapabilityHandler.getMaxMirrorRadius(Minecraft.getInstance().player, false);
} }
public void performRadialMirror(BlockSet blocks, BlockEntry blockEntry) { public void performRadialMirror(BlockSet blocks, BlockEntry blockEntry) {
@@ -77,7 +69,7 @@ public class RadialMirror extends BaseModifier {
} }
Vec3 relNewVec = relStartVec.yRot((float) curAngle); Vec3 relNewVec = relStartVec.yRot((float) curAngle);
BlockPos newBlockPos = new BlockPos(position.add(relNewVec)); BlockPos newBlockPos = BlockPos.containing(position.add(relNewVec));
if (blocks.containsKey(newBlockPos)) continue; if (blocks.containsKey(newBlockPos)) continue;
@@ -120,11 +112,11 @@ public class RadialMirror extends BaseModifier {
BlockState newBlockState = blockState; BlockState newBlockState = blockState;
if (startAngleToCenter < -0.751 * Math.PI || startAngleToCenter > 0.749 * Math.PI) { if (startAngleToCenter < -0.751 * Math.PI || startAngleToCenter > 0.749 * Math.PI) {
newBlockState = blockState.rotate(player.level, startPos, Rotation.CLOCKWISE_180); newBlockState = blockState.rotate(player.level(), startPos, Rotation.CLOCKWISE_180);
} else if (startAngleToCenter < -0.251 * Math.PI) { } else if (startAngleToCenter < -0.251 * Math.PI) {
newBlockState = blockState.rotate(player.level, startPos, Rotation.COUNTERCLOCKWISE_90); newBlockState = blockState.rotate(player.level(), startPos, Rotation.COUNTERCLOCKWISE_90);
} else if (startAngleToCenter > 0.249 * Math.PI) { } else if (startAngleToCenter > 0.249 * Math.PI) {
newBlockState = blockState.rotate(player.level, startPos, Rotation.CLOCKWISE_90); newBlockState = blockState.rotate(player.level(), startPos, Rotation.CLOCKWISE_90);
} }
return newBlockState; return newBlockState;
@@ -135,17 +127,17 @@ public class RadialMirror extends BaseModifier {
double angleToCenter = Mth.atan2(relVec.x, relVec.z); //between -PI and PI double angleToCenter = Mth.atan2(relVec.x, relVec.z); //between -PI and PI
if (angleToCenter < -0.751 * Math.PI || angleToCenter > 0.749 * Math.PI) { if (angleToCenter < -0.751 * Math.PI || angleToCenter > 0.749 * Math.PI) {
newBlockState = blockState.rotate(player.level, startPos, Rotation.CLOCKWISE_180); newBlockState = blockState.rotate(player.level(), startPos, Rotation.CLOCKWISE_180);
if (alternate) { if (alternate) {
newBlockState = newBlockState.mirror(Mirror.FRONT_BACK); newBlockState = newBlockState.mirror(Mirror.FRONT_BACK);
} }
} else if (angleToCenter < -0.251 * Math.PI) { } else if (angleToCenter < -0.251 * Math.PI) {
newBlockState = blockState.rotate(player.level, startPos, Rotation.CLOCKWISE_90); newBlockState = blockState.rotate(player.level(), startPos, Rotation.CLOCKWISE_90);
if (alternate) { if (alternate) {
newBlockState = newBlockState.mirror(Mirror.LEFT_RIGHT); newBlockState = newBlockState.mirror(Mirror.LEFT_RIGHT);
} }
} else if (angleToCenter > 0.249 * Math.PI) { } else if (angleToCenter > 0.249 * Math.PI) {
newBlockState = blockState.rotate(player.level, startPos, Rotation.COUNTERCLOCKWISE_90); newBlockState = blockState.rotate(player.level(), startPos, Rotation.COUNTERCLOCKWISE_90);
if (alternate) { if (alternate) {
newBlockState = newBlockState.mirror(Mirror.LEFT_RIGHT); newBlockState = newBlockState.mirror(Mirror.LEFT_RIGHT);
} }

View File

@@ -0,0 +1,137 @@
package nl.requios.effortlessbuilding.capability;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.player.Player;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.CapabilityManager;
import net.minecraftforge.common.capabilities.CapabilityToken;
import net.minecraftforge.network.PacketDistributor;
import nl.requios.effortlessbuilding.CommonConfig;
import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.network.PacketHandler;
import nl.requios.effortlessbuilding.network.PowerLevelPacket;
public class CapabilityHandler {
public static final ResourceLocation POWER_LEVEL_CAP = new ResourceLocation(EffortlessBuilding.MODID, "power_level");
public static final Capability<IPowerLevel> POWER_LEVEL_CAPABILITY = CapabilityManager.get(new CapabilityToken<>() {
});
public static void syncToClient(Player player) {
IPowerLevel powerLevel = player.getCapability(CapabilityHandler.POWER_LEVEL_CAPABILITY).orElse(null);
if (powerLevel == null) return; //Should never be null but just to be sure
PacketHandler.INSTANCE.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new PowerLevelPacket(powerLevel.getPowerLevel()));
}
//Helper methods to reduce boilerplate code
public static boolean canReplaceBlocks(Player player) {
if (player != null) {
IPowerLevel powerLevel = player.getCapability(CapabilityHandler.POWER_LEVEL_CAPABILITY).orElse(null);
if (powerLevel != null) {
return powerLevel.canReplaceBlocks(player);
}
}
return false;
}
public static int getMaxBlocksPerAxis(Player player, boolean nextPowerLevel) {
if (player != null) {
IPowerLevel powerLevel = player.getCapability(CapabilityHandler.POWER_LEVEL_CAPABILITY).orElse(null);
if (powerLevel != null) {
return powerLevel.getMaxBlocksPerAxis(player, nextPowerLevel);
}
}
return CommonConfig.maxBlocksPerAxis.level0.get();
}
public static int getMaxBlocksPlacedAtOnce(Player player, boolean nextPowerLevel) {
if (player != null) {
IPowerLevel powerLevel = player.getCapability(CapabilityHandler.POWER_LEVEL_CAPABILITY).orElse(null);
if (powerLevel != null) {
return powerLevel.getMaxBlocksPlacedAtOnce(player, nextPowerLevel);
}
}
return CommonConfig.maxBlocksPlacedAtOnce.level0.get();
}
public static int getMaxMirrorRadius(Player player, boolean nextPowerLevel) {
if (player != null) {
IPowerLevel powerLevel = player.getCapability(CapabilityHandler.POWER_LEVEL_CAPABILITY).orElse(null);
if (powerLevel != null) {
return powerLevel.getMaxMirrorRadius(player, nextPowerLevel);
}
}
return CommonConfig.maxMirrorRadius.level0.get();
}
public static int getBuildModeReach(Player player) {
if (player != null) {
IPowerLevel powerLevel = player.getCapability(CapabilityHandler.POWER_LEVEL_CAPABILITY).orElse(null);
if (powerLevel != null) {
return powerLevel.getBuildModeReach(player);
}
}
return CommonConfig.maxMirrorRadius.level0.get() + 6;
}
public static int getPlacementReach(Player player, boolean nextPowerLevel) {
if (player != null) {
IPowerLevel powerLevel = player.getCapability(CapabilityHandler.POWER_LEVEL_CAPABILITY).orElse(null);
if (powerLevel != null) {
return powerLevel.getPlacementReach(player, nextPowerLevel);
}
}
return CommonConfig.reach.level0.get();
}
public static int getPowerLevel(Player player) {
if (player != null) {
IPowerLevel powerLevel = player.getCapability(CapabilityHandler.POWER_LEVEL_CAPABILITY).orElse(null);
if (powerLevel != null) {
return powerLevel.getPowerLevel();
}
}
return 0;
}
public static int getNextPowerLevel(Player player) {
if (player != null) {
IPowerLevel powerLevel = player.getCapability(CapabilityHandler.POWER_LEVEL_CAPABILITY).orElse(null);
if (powerLevel != null) {
return powerLevel.getNextPowerLevel();
}
}
return 0;
}
public static boolean canIncreasePowerLevel(Player player) {
if (player != null) {
IPowerLevel powerLevel = player.getCapability(CapabilityHandler.POWER_LEVEL_CAPABILITY).orElse(null);
if (powerLevel != null) {
return powerLevel.canIncreasePowerLevel();
}
}
return false;
}
public static boolean isDisabled(Player player) {
if (player != null) {
IPowerLevel powerLevel = player.getCapability(CapabilityHandler.POWER_LEVEL_CAPABILITY).orElse(null);
if (powerLevel != null) {
return powerLevel.isDisabled(player);
}
}
return false;
}
public static boolean canBreakFar(Player player) {
if (player != null) {
IPowerLevel powerLevel = player.getCapability(CapabilityHandler.POWER_LEVEL_CAPABILITY).orElse(null);
if (powerLevel != null) {
return powerLevel.canBreakFar(player);
}
}
return false;
}
}

View File

@@ -0,0 +1,38 @@
package nl.requios.effortlessbuilding.capability;
import net.minecraft.world.entity.player.Player;
import net.minecraftforge.common.capabilities.AutoRegisterCapability;
@AutoRegisterCapability
public interface IPowerLevel {
int getPowerLevel();
int getNextPowerLevel();
void setPowerLevel(int powerLevel);
boolean canIncreasePowerLevel();
void increasePowerLevel();
int getPlacementReach(Player player, boolean nextPowerLevel);
int getBuildModeReach(Player player);
int getMaxBlocksPlacedAtOnce(Player player, boolean nextPowerLevel);
int getMaxBlocksPerAxis(Player player, boolean nextPowerLevel);
int getMaxMirrorRadius(Player player, boolean nextPowerLevel);
boolean isDisabled(Player player);
boolean canBreakFar(Player player);
boolean canReplaceBlocks(Player player);
}

View File

@@ -0,0 +1,127 @@
package nl.requios.effortlessbuilding.capability;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.entity.player.Player;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.ICapabilitySerializable;
import net.minecraftforge.common.util.LazyOptional;
import nl.requios.effortlessbuilding.CommonConfig;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class PowerLevelCapability implements IPowerLevel, ICapabilitySerializable<CompoundTag> {
public static final int MAX_POWER_LEVEL = 3; //Common access
private int powerLevel = 0;
@Override
public int getPowerLevel() {
return this.powerLevel;
}
@Override
public int getNextPowerLevel() {
return Math.min(getPowerLevel() + 1, MAX_POWER_LEVEL);
}
@Override
public void setPowerLevel(int powerLevel) {
this.powerLevel = powerLevel;
}
@Override
public boolean canIncreasePowerLevel() {
return getPowerLevel() < MAX_POWER_LEVEL;
}
@Override
public void increasePowerLevel() {
if (canIncreasePowerLevel()) {
setPowerLevel(getPowerLevel() + 1);
}
}
@Override
public int getPlacementReach(Player player, boolean nextPowerLevel) {
if (player.isCreative()) return CommonConfig.reach.creative.get();
return switch (nextPowerLevel ? getNextPowerLevel() : getPowerLevel()) {
case 1 -> CommonConfig.reach.level1.get();
case 2 -> CommonConfig.reach.level2.get();
case 3 -> CommonConfig.reach.level3.get();
default -> CommonConfig.reach.level0.get();
};
}
//How far away we can detect the second and third click of build modes (distance to player)
@Override
public int getBuildModeReach(Player player) {
//A bit further than placement reach, so you can build lines when looking to the side without having to move.
return getPlacementReach(player, false) + 6;
}
@Override
public int getMaxBlocksPlacedAtOnce(Player player, boolean nextPowerLevel) {
if (player.isCreative()) return CommonConfig.maxBlocksPlacedAtOnce.creative.get();
return switch (nextPowerLevel ? getNextPowerLevel() : getPowerLevel()) {
case 1 -> CommonConfig.maxBlocksPlacedAtOnce.level1.get();
case 2 -> CommonConfig.maxBlocksPlacedAtOnce.level2.get();
case 3 -> CommonConfig.maxBlocksPlacedAtOnce.level3.get();
default -> CommonConfig.maxBlocksPlacedAtOnce.level0.get();
};
}
@Override
public int getMaxBlocksPerAxis(Player player, boolean nextPowerLevel) {
if (player.isCreative()) return CommonConfig.maxBlocksPerAxis.creative.get();
return switch (nextPowerLevel ? getNextPowerLevel() : getPowerLevel()) {
case 1 -> CommonConfig.maxBlocksPerAxis.level1.get();
case 2 -> CommonConfig.maxBlocksPerAxis.level2.get();
case 3 -> CommonConfig.maxBlocksPerAxis.level3.get();
default -> CommonConfig.maxBlocksPerAxis.level0.get();
};
}
@Override
public int getMaxMirrorRadius(Player player, boolean nextPowerLevel) {
if (player.isCreative()) return CommonConfig.maxMirrorRadius.creative.get();
return switch (getPowerLevel() + (nextPowerLevel ? 1 : 0)) {
case 1 -> CommonConfig.maxMirrorRadius.level1.get();
case 2 -> CommonConfig.maxMirrorRadius.level2.get();
case 3 -> CommonConfig.maxMirrorRadius.level3.get();
default -> CommonConfig.maxMirrorRadius.level0.get();
};
}
@Override
public boolean isDisabled(Player player) {
return getMaxBlocksPlacedAtOnce(player, false) <= 0 || getMaxBlocksPerAxis(player, false) <= 0;
}
@Override
public boolean canBreakFar(Player player) {
return player.getAbilities().instabuild;
}
@Override
public boolean canReplaceBlocks(Player player) {
return player.getAbilities().instabuild;
}
@Override
public @NotNull <T> LazyOptional<T> getCapability(@NotNull Capability<T> cap, @Nullable Direction side) {
return CapabilityHandler.POWER_LEVEL_CAPABILITY.orEmpty(cap, LazyOptional.of(() -> this));
}
@Override
public CompoundTag serializeNBT() {
CompoundTag tag = new CompoundTag();
tag.putInt("powerLevel", getPowerLevel());
return tag;
}
@Override
public void deserializeNBT(CompoundTag nbt) {
setPowerLevel(nbt.getInt("powerLevel"));
}
}

View File

@@ -7,7 +7,6 @@ import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemHandlerHelper;
import nl.requios.effortlessbuilding.create.foundation.item.ItemHelper; import nl.requios.effortlessbuilding.create.foundation.item.ItemHelper;
import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem; import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem;

View File

@@ -1,13 +1,8 @@
package nl.requios.effortlessbuilding.create; package nl.requios.effortlessbuilding.create;
import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.platform.InputConstants;
import net.minecraft.client.KeyMapping;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.Screen;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.RegisterKeyMappingsEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
public class AllKeys { public class AllKeys {

View File

@@ -1,9 +1,10 @@
package nl.requios.effortlessbuilding.create; package nl.requios.effortlessbuilding.create;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import net.createmod.catnip.render.BindableTexture;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
public enum AllSpecialTextures { public enum AllSpecialTextures implements BindableTexture {
BLANK("blank.png"), BLANK("blank.png"),
CHECKERED("checkerboard.png"), CHECKERED("checkerboard.png"),
@@ -18,7 +19,7 @@ public enum AllSpecialTextures {
public static final String ASSET_PATH = "textures/special/"; public static final String ASSET_PATH = "textures/special/";
private ResourceLocation location; private ResourceLocation location;
private AllSpecialTextures(String filename) { AllSpecialTextures(String filename) {
location = Create.asResource(ASSET_PATH + filename); location = Create.asResource(ASSET_PATH + filename);
} }

View File

@@ -1,12 +1,10 @@
package nl.requios.effortlessbuilding.create; package nl.requios.effortlessbuilding.create;
import nl.requios.effortlessbuilding.create.foundation.render.SuperByteBufferCache; import net.createmod.catnip.render.SuperByteBufferCache;
import nl.requios.effortlessbuilding.create.foundation.utility.ghost.GhostBlocks; import nl.requios.effortlessbuilding.create.foundation.utility.ghost.GhostBlocks;
import nl.requios.effortlessbuilding.create.foundation.utility.outliner.Outliner;
public class CreateClient { public class CreateClient {
public static final SuperByteBufferCache BUFFER_CACHE = new SuperByteBufferCache(); public static final SuperByteBufferCache BUFFER_CACHE = new SuperByteBufferCache();
public static final Outliner OUTLINER = new Outliner();
public static final GhostBlocks GHOST_BLOCKS = new GhostBlocks(); public static final GhostBlocks GHOST_BLOCKS = new GhostBlocks();
public static void invalidateRenderers() { public static void invalidateRenderers() {

View File

@@ -1,12 +1,7 @@
package nl.requios.effortlessbuilding.create; package nl.requios.effortlessbuilding.create;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.phys.AABB;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import nl.requios.effortlessbuilding.create.foundation.utility.Color;
@Mod.EventBusSubscriber(Dist.CLIENT) @Mod.EventBusSubscriber(Dist.CLIENT)
public class CreateClientTest { public class CreateClientTest {

View File

@@ -2,13 +2,13 @@ package nl.requios.effortlessbuilding.create.events;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import net.createmod.catnip.outliner.Outliner;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.RenderLevelLastEvent; import net.minecraftforge.client.event.RenderLevelStageEvent;
import net.minecraftforge.client.event.ViewportEvent; import net.minecraftforge.client.event.ViewportEvent;
import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.TickEvent;
import net.minecraftforge.event.TickEvent.ClientTickEvent; import net.minecraftforge.event.TickEvent.ClientTickEvent;
@@ -17,10 +17,11 @@ import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import nl.requios.effortlessbuilding.create.Create; import nl.requios.effortlessbuilding.create.Create;
import nl.requios.effortlessbuilding.create.CreateClient; import nl.requios.effortlessbuilding.create.CreateClient;
import nl.requios.effortlessbuilding.create.foundation.render.SuperRenderTypeBuffer;
import nl.requios.effortlessbuilding.create.foundation.utility.AnimationTickHolder; import nl.requios.effortlessbuilding.create.foundation.utility.AnimationTickHolder;
import nl.requios.effortlessbuilding.create.foundation.utility.CameraAngleAnimationService; import nl.requios.effortlessbuilding.create.foundation.utility.CameraAngleAnimationService;
import nl.requios.effortlessbuilding.create.foundation.utility.worldWrappers.WrappedClientWorld; import nl.requios.effortlessbuilding.create.foundation.utility.worldWrappers.WrappedClientWorld;
import net.createmod.catnip.render.DefaultSuperRenderTypeBuffer;
import net.createmod.catnip.render.SuperRenderTypeBuffer;
@EventBusSubscriber(Dist.CLIENT) @EventBusSubscriber(Dist.CLIENT)
public class ClientEvents { public class ClientEvents {
@@ -35,7 +36,7 @@ public class ClientEvents {
AnimationTickHolder.tick(); AnimationTickHolder.tick();
CreateClient.GHOST_BLOCKS.tickGhosts(); CreateClient.GHOST_BLOCKS.tickGhosts();
CreateClient.OUTLINER.tickOutlines(); // Outliner.getInstance().tickOutlines();
CameraAngleAnimationService.tick(); CameraAngleAnimationService.tick();
} }
@@ -58,7 +59,9 @@ public class ClientEvents {
} }
@SubscribeEvent @SubscribeEvent
public static void onRenderWorld(RenderLevelLastEvent event) { public static void onRenderWorld(RenderLevelStageEvent event) {
if(event.getStage() != RenderLevelStageEvent.Stage.AFTER_CUTOUT_BLOCKS) return;
Vec3 cameraPos = Minecraft.getInstance().gameRenderer.getMainCamera() Vec3 cameraPos = Minecraft.getInstance().gameRenderer.getMainCamera()
.getPosition(); .getPosition();
float pt = AnimationTickHolder.getPartialTicks(); float pt = AnimationTickHolder.getPartialTicks();
@@ -66,11 +69,11 @@ public class ClientEvents {
PoseStack ms = event.getPoseStack(); PoseStack ms = event.getPoseStack();
ms.pushPose(); ms.pushPose();
ms.translate(-cameraPos.x(), -cameraPos.y(), -cameraPos.z()); ms.translate(-cameraPos.x(), -cameraPos.y(), -cameraPos.z());
SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance(); SuperRenderTypeBuffer buffer = DefaultSuperRenderTypeBuffer.getInstance();
CreateClient.GHOST_BLOCKS.renderAll(ms, buffer); CreateClient.GHOST_BLOCKS.renderAll(ms, buffer);
CreateClient.OUTLINER.renderOutlines(ms, buffer, pt); // Outliner.getInstance().renderOutlines(ms, buffer, pt);
buffer.draw(); buffer.draw();
RenderSystem.enableCull(); RenderSystem.enableCull();

View File

@@ -10,7 +10,7 @@ public class ModFilePackResources extends PathPackResources {
protected final String sourcePath; protected final String sourcePath;
public ModFilePackResources(String name, IModFile modFile, String sourcePath) { public ModFilePackResources(String name, IModFile modFile, String sourcePath) {
super(name, modFile.findResource(sourcePath)); super(name, true, modFile.findResource(sourcePath));
this.modFile = modFile; this.modFile = modFile;
this.sourcePath = sourcePath; this.sourcePath = sourcePath;
} }

View File

@@ -1,6 +1,6 @@
package nl.requios.effortlessbuilding.create.foundation.block.render; package nl.requios.effortlessbuilding.create.foundation.block.render;
import com.jozufozu.flywheel.core.StitchedSprite; import net.createmod.catnip.render.StitchedSprite;
import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;

View File

@@ -2,16 +2,18 @@ package nl.requios.effortlessbuilding.create.foundation.gui;
import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.platform.InputConstants;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import nl.requios.effortlessbuilding.create.foundation.gui.widget.AbstractSimiWidget; import net.minecraft.client.gui.GuiGraphics;
import nl.requios.effortlessbuilding.create.foundation.utility.Components;
import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraft.client.gui.components.Widget; import net.minecraft.client.gui.components.EditBox;
import net.minecraft.client.gui.components.Renderable;
import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.components.events.GuiEventListener;
import net.minecraft.client.gui.narration.NarratableEntry; import net.minecraft.client.gui.narration.NarratableEntry;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import nl.requios.effortlessbuilding.create.foundation.gui.widget.AbstractSimiWidget;
import nl.requios.effortlessbuilding.create.foundation.utility.Components;
import nl.requios.effortlessbuilding.gui.buildmodifier.ModifiersScreenList; import nl.requios.effortlessbuilding.gui.buildmodifier.ModifiersScreenList;
import java.util.Collection; import java.util.Collection;
@@ -65,19 +67,26 @@ public abstract class AbstractSimiScreen extends Screen {
} }
} }
@Override
public boolean mouseClicked(double pMouseX, double pMouseY, int pButton) {
if (getFocused() != null && !getFocused().isMouseOver(pMouseX, pMouseY))
setFocused(null);
return super.mouseClicked(pMouseX, pMouseY, pButton);
}
@Override @Override
public boolean isPauseScreen() { public boolean isPauseScreen() {
return false; return false;
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
protected <W extends GuiEventListener & Widget & NarratableEntry> void addRenderableWidgets(W... widgets) { protected <W extends GuiEventListener & Renderable & NarratableEntry> void addRenderableWidgets(W... widgets) {
for (W widget : widgets) { for (W widget : widgets) {
addRenderableWidget(widget); addRenderableWidget(widget);
} }
} }
protected <W extends GuiEventListener & Widget & NarratableEntry> void addRenderableWidgets(Collection<W> widgets) { protected <W extends GuiEventListener & Renderable & NarratableEntry> void addRenderableWidgets(Collection<W> widgets) {
for (W widget : widgets) { for (W widget : widgets) {
addRenderableWidget(widget); addRenderableWidget(widget);
} }
@@ -96,17 +105,18 @@ public abstract class AbstractSimiScreen extends Screen {
} }
@Override @Override
public void render(PoseStack ms, int mouseX, int mouseY, float partialTicks) { public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) {
partialTicks = minecraft.getFrameTime(); partialTicks = minecraft.getFrameTime();
PoseStack ms = graphics.pose();
ms.pushPose(); ms.pushPose();
prepareFrame(); prepareFrame();
renderWindowBackground(ms, mouseX, mouseY, partialTicks); renderWindowBackground(graphics, mouseX, mouseY, partialTicks);
renderWindow(ms, mouseX, mouseY, partialTicks); renderWindow(graphics, mouseX, mouseY, partialTicks);
super.render(ms, mouseX, mouseY, partialTicks); super.render(graphics, mouseX, mouseY, partialTicks);
renderWindowForeground(ms, mouseX, mouseY, partialTicks); renderWindowForeground(graphics, mouseX, mouseY, partialTicks);
endFrame(); endFrame();
@@ -116,7 +126,7 @@ public abstract class AbstractSimiScreen extends Screen {
@Override @Override
public boolean keyPressed(int keyCode, int scanCode, int modifiers) { public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
boolean keyPressed = super.keyPressed(keyCode, scanCode, modifiers); boolean keyPressed = super.keyPressed(keyCode, scanCode, modifiers);
if (keyPressed || getFocused() != null) if (keyPressed || getFocused() instanceof EditBox)
return keyPressed; return keyPressed;
InputConstants.Key mouseKey = InputConstants.getKey(keyCode, scanCode); InputConstants.Key mouseKey = InputConstants.getKey(keyCode, scanCode);
@@ -130,37 +140,36 @@ public abstract class AbstractSimiScreen extends Screen {
protected void prepareFrame() {} protected void prepareFrame() {}
protected void renderWindowBackground(PoseStack ms, int mouseX, int mouseY, float partialTicks) { protected void renderWindowBackground(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) {
renderBackground(ms); renderBackground(graphics);
} }
protected abstract void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks); protected abstract void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks);
protected void renderWindowForeground(PoseStack ms, int mouseX, int mouseY, float partialTicks) { protected void renderWindowForeground(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) {
for (Widget widget : renderables) { for (Renderable widget : renderables) {
if (widget instanceof AbstractSimiWidget simiWidget && simiWidget.isHoveredOrFocused() if (widget instanceof AbstractSimiWidget simiWidget && simiWidget.isMouseOver(mouseX, mouseY)
&& simiWidget.visible) { && simiWidget.visible) {
List<Component> tooltip = simiWidget.getToolTip(); List<Component> tooltip = simiWidget.getToolTip();
if (tooltip.isEmpty()) if (tooltip.isEmpty())
continue; continue;
int ttx = simiWidget.lockedTooltipX == -1 ? mouseX : simiWidget.lockedTooltipX + simiWidget.x; int ttx = simiWidget.lockedTooltipX == -1 ? mouseX : simiWidget.lockedTooltipX + simiWidget.getX();
int tty = simiWidget.lockedTooltipY == -1 ? mouseY : simiWidget.lockedTooltipY + simiWidget.y; int tty = simiWidget.lockedTooltipY == -1 ? mouseY : simiWidget.lockedTooltipY + simiWidget.getY();
renderComponentTooltip(ms, tooltip, ttx, tty); graphics.renderComponentTooltip(font, tooltip, ttx, tty);
} }
//Added //Added
if (widget instanceof ModifiersScreenList list) { if (widget instanceof ModifiersScreenList list) {
list.renderWindowForeground(ms, mouseX, mouseY, partialTicks); list.renderWindowForeground(graphics, mouseX, mouseY, partialTicks);
} }
} }
} }
protected void endFrame() {} protected void endFrame() {}
@Deprecated @Deprecated
protected void debugWindowArea(PoseStack matrixStack) { protected void debugWindowArea(GuiGraphics graphics) {
fill(matrixStack, guiLeft + windowWidth, guiTop + windowHeight, guiLeft, guiTop, 0xD3D3D3D3); graphics.fill(guiLeft + windowWidth, guiTop + windowHeight, guiLeft, guiTop, 0xD3D3D3D3);
} }
@Override @Override

View File

@@ -1,14 +1,13 @@
package nl.requios.effortlessbuilding.create.foundation.gui; package nl.requios.effortlessbuilding.create.foundation.gui;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.gui.GuiGraphics;
import nl.requios.effortlessbuilding.create.Create;
import nl.requios.effortlessbuilding.create.foundation.gui.element.ScreenElement;
import nl.requios.effortlessbuilding.create.foundation.utility.Color;
import net.minecraft.client.gui.GuiComponent;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import nl.requios.effortlessbuilding.create.Create;
import nl.requios.effortlessbuilding.create.foundation.gui.element.ScreenElement;
import nl.requios.effortlessbuilding.create.foundation.utility.Color;
public enum AllGuiTextures implements ScreenElement { public enum AllGuiTextures implements ScreenElement {
@@ -74,22 +73,14 @@ public enum AllGuiTextures implements ScreenElement {
} }
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
@Override public void render(GuiGraphics graphics, int x, int y) {
public void render(PoseStack ms, int x, int y) { graphics.blit(location, x, y, startX, startY, width, height);
bind();
GuiComponent.blit(ms, x, y, 0, startX, startY, width, height, 256, 256);
} }
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public void render(PoseStack ms, int x, int y, GuiComponent component) { public void render(GuiGraphics graphics, int x, int y, Color c) {
bind(); bind();
component.blit(ms, x, y, startX, startY, width, height); UIRenderHelper.drawColoredTexture(graphics, c, x, y, startX, startY, width, height);
}
@OnlyIn(Dist.CLIENT)
public void render(PoseStack ms, int x, int y, Color c) {
bind();
UIRenderHelper.drawColoredTexture(ms, c, x, y, startX, startY, width, height);
} }
} }

View File

@@ -3,12 +3,7 @@ package nl.requios.effortlessbuilding.create.foundation.gui;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexConsumer;
import com.mojang.math.Matrix4f; import net.minecraft.client.gui.GuiGraphics;
import nl.requios.effortlessbuilding.create.Create;
import nl.requios.effortlessbuilding.create.foundation.gui.element.DelegatedStencilElement;
import nl.requios.effortlessbuilding.create.foundation.gui.element.ScreenElement;
import nl.requios.effortlessbuilding.create.foundation.utility.Color;
import net.minecraft.client.gui.GuiComponent;
import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.LightTexture;
import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
@@ -16,6 +11,11 @@ import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import nl.requios.effortlessbuilding.create.Create;
import nl.requios.effortlessbuilding.create.foundation.gui.element.DelegatedStencilElement;
import nl.requios.effortlessbuilding.create.foundation.gui.element.ScreenElement;
import nl.requios.effortlessbuilding.create.foundation.utility.Color;
import org.joml.Matrix4f;
public class AllIcons implements ScreenElement { public class AllIcons implements ScreenElement {
@@ -81,7 +81,7 @@ public class AllIcons implements ScreenElement {
public static final AllIcons public static final AllIcons
I_TOOL_DEPLOY = newRow(), I_TOOL_DEPLOY = newRow(),
I_SKIP_MISSING = next(), I_SKIP_MISSING = next(),
I_SKIP_TILES = next(), I_SKIP_BLOCK_ENTITIES = next(),
I_DICE = next(), I_DICE = next(),
I_TUNNEL_SPLIT = next(), I_TUNNEL_SPLIT = next(),
I_TUNNEL_FORCED_SPLIT = next(), I_TUNNEL_FORCED_SPLIT = next(),
@@ -173,20 +173,13 @@ public class AllIcons implements ScreenElement {
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
@Override @Override
public void render(PoseStack matrixStack, int x, int y) { public void render(GuiGraphics graphics, int x, int y) {
bind(); graphics.blit(ICON_ATLAS, x, y, 0, iconX, iconY, 16, 16, 256, 256);
GuiComponent.blit(matrixStack, x, y, 0, iconX, iconY, 16, 16, 256, 256);
}
@OnlyIn(Dist.CLIENT)
public void render(PoseStack matrixStack, int x, int y, GuiComponent component) {
bind();
component.blit(matrixStack, x, y, iconX, iconY, 16, 16);
} }
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public void render(PoseStack ms, MultiBufferSource buffer, int color) { public void render(PoseStack ms, MultiBufferSource buffer, int color) {
VertexConsumer builder = buffer.getBuffer(RenderType.textSeeThrough(ICON_ATLAS)); VertexConsumer builder = buffer.getBuffer(RenderType.text(ICON_ATLAS));
Matrix4f matrix = ms.last().pose(); Matrix4f matrix = ms.last().pose();
Color rgb = new Color(color); Color rgb = new Color(color);
int light = LightTexture.FULL_BRIGHT; int light = LightTexture.FULL_BRIGHT;

View File

@@ -2,13 +2,14 @@ package nl.requios.effortlessbuilding.create.foundation.gui;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import nl.requios.effortlessbuilding.create.foundation.gui.element.BoxElement;
import nl.requios.effortlessbuilding.create.foundation.gui.element.TextStencilElement;
import nl.requios.effortlessbuilding.create.foundation.gui.widget.BoxWidget;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.FormattedText; import net.minecraft.network.chat.FormattedText;
import net.minecraft.network.chat.Style; import net.minecraft.network.chat.Style;
import nl.requios.effortlessbuilding.create.foundation.gui.element.BoxElement;
import nl.requios.effortlessbuilding.create.foundation.gui.element.TextStencilElement;
import nl.requios.effortlessbuilding.create.foundation.gui.widget.BoxWidget;
import org.lwjgl.opengl.GL30; import org.lwjgl.opengl.GL30;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
@@ -173,11 +174,12 @@ public class ConfirmationScreen extends AbstractSimiScreen {
} }
@Override @Override
protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { protected void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) {
textBackground.render(ms); textBackground.render(graphics);
int offset = font.lineHeight + 1; int offset = font.lineHeight + 1;
int lineY = y - offset; int lineY = y - offset;
PoseStack ms = graphics.pose();
ms.pushPose(); ms.pushPose();
ms.translate(0, 0, 200); ms.translate(0, 0, 200);
@@ -185,21 +187,21 @@ public class ConfirmationScreen extends AbstractSimiScreen {
lineY += offset; lineY += offset;
if (line == null) if (line == null)
continue; continue;
font.draw(ms, line.getString(), x, lineY, 0xeaeaea); graphics.drawString(font, line.getString(), x, lineY, 0xeaeaea, false);
} }
ms.popPose(); ms.popPose();
} }
@Override @Override
protected void renderWindowBackground(PoseStack ms, int mouseX, int mouseY, float partialTicks) { protected void renderWindowBackground(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) {
endFrame(); endFrame();
source.render(ms, 0, 0, 10); // zero mouse coords to prevent further tooltips source.render(graphics, 0, 0, 10); // zero mouse coords to prevent further tooltips
prepareFrame(); prepareFrame();
this.fillGradient(ms, 0, 0, this.width, this.height, 0x70101010, 0x80101010); graphics.fillGradient(0, 0, this.width, this.height, 0x70101010, 0x80101010);
} }

View File

@@ -1,8 +1,10 @@
package nl.requios.effortlessbuilding.create.foundation.gui; package nl.requios.effortlessbuilding.create.foundation.gui;
import org.joml.Matrix4f;
import org.joml.Vector3f;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.math.Matrix4f; import com.mojang.math.Axis;
import com.mojang.math.Vector3f;
public class CustomLightingSettings implements ILightingSettings { public class CustomLightingSettings implements ILightingSettings {
@@ -19,20 +21,20 @@ public class CustomLightingSettings implements ILightingSettings {
} }
protected void init(float yRot1, float xRot1, float yRot2, float xRot2, boolean doubleLight) { protected void init(float yRot1, float xRot1, float yRot2, float xRot2, boolean doubleLight) {
light1 = Vector3f.ZP.copy(); light1 = new Vector3f(0, 0, 1);
light1.transform(Vector3f.YP.rotationDegrees(yRot1)); light1.rotate(Axis.YP.rotationDegrees(yRot1));
light1.transform(Vector3f.XN.rotationDegrees(xRot1)); light1.rotate(Axis.XN.rotationDegrees(xRot1));
if (doubleLight) { if (doubleLight) {
light2 = Vector3f.ZP.copy(); light2 = new Vector3f(0, 0, 1);
light2.transform(Vector3f.YP.rotationDegrees(yRot2)); light2.rotate(Axis.YP.rotationDegrees(yRot2));
light2.transform(Vector3f.XN.rotationDegrees(xRot2)); light2.rotate(Axis.XN.rotationDegrees(xRot2));
} else { } else {
light2 = Vector3f.ZERO; light2 = new Vector3f();
} }
lightMatrix = new Matrix4f(); lightMatrix = new Matrix4f();
lightMatrix.setIdentity(); lightMatrix.identity();
} }
@Override @Override

View File

@@ -1,10 +1,18 @@
package nl.requios.effortlessbuilding.create.foundation.gui; package nl.requios.effortlessbuilding.create.foundation.gui;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Nonnull;
import org.joml.Matrix4f;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.Tesselator; import com.mojang.blaze3d.vertex.Tesselator;
import com.mojang.math.Matrix4f;
import net.minecraft.client.gui.Font; import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent;
import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.network.chat.FormattedText; import net.minecraft.network.chat.FormattedText;
@@ -12,13 +20,9 @@ import net.minecraft.network.chat.Style;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.ForgeHooksClient;
import net.minecraftforge.client.event.RenderTooltipEvent; import net.minecraftforge.client.event.RenderTooltipEvent;
import net.minecraftforge.client.gui.ScreenUtils; import net.minecraftforge.client.extensions.IForgeGuiGraphics;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.List;
public class RemovedGuiUtils { public class RemovedGuiUtils {
@Nonnull @Nonnull
private static ItemStack cachedTooltipStack = ItemStack.EMPTY; private static ItemStack cachedTooltipStack = ItemStack.EMPTY;
@@ -31,41 +35,43 @@ public class RemovedGuiUtils {
cachedTooltipStack = ItemStack.EMPTY; cachedTooltipStack = ItemStack.EMPTY;
} }
public static void drawHoveringText(PoseStack mStack, List<? extends FormattedText> textLines, int mouseX, public static void drawHoveringText(GuiGraphics graphics, List<? extends FormattedText> textLines, int mouseX,
int mouseY, int screenWidth, int screenHeight, int maxTextWidth, Font font) { int mouseY, int screenWidth, int screenHeight, int maxTextWidth, Font font) {
drawHoveringText(mStack, textLines, mouseX, mouseY, screenWidth, screenHeight, maxTextWidth, drawHoveringText(graphics, textLines, mouseX, mouseY, screenWidth, screenHeight, maxTextWidth,
ScreenUtils.DEFAULT_BACKGROUND_COLOR, ScreenUtils.DEFAULT_BORDER_COLOR_START, ScreenUtils.DEFAULT_BORDER_COLOR_END, IForgeGuiGraphics.DEFAULT_BACKGROUND_COLOR, IForgeGuiGraphics.DEFAULT_BORDER_COLOR_START, IForgeGuiGraphics.DEFAULT_BORDER_COLOR_END,
font); font);
} }
public static void drawHoveringText(PoseStack mStack, List<? extends FormattedText> textLines, int mouseX, public static void drawHoveringText(GuiGraphics graphics, List<? extends FormattedText> textLines, int mouseX,
int mouseY, int screenWidth, int screenHeight, int maxTextWidth, int backgroundColor, int borderColorStart, int mouseY, int screenWidth, int screenHeight, int maxTextWidth, int backgroundColor, int borderColorStart,
int borderColorEnd, Font font) { int borderColorEnd, Font font) {
drawHoveringText(cachedTooltipStack, mStack, textLines, mouseX, mouseY, screenWidth, screenHeight, maxTextWidth, drawHoveringText(cachedTooltipStack, graphics, textLines, mouseX, mouseY, screenWidth, screenHeight, maxTextWidth,
backgroundColor, borderColorStart, borderColorEnd, font); backgroundColor, borderColorStart, borderColorEnd, font);
} }
public static void drawHoveringText(@Nonnull final ItemStack stack, PoseStack mStack, public static void drawHoveringText(@Nonnull final ItemStack stack, GuiGraphics graphics,
List<? extends FormattedText> textLines, int mouseX, int mouseY, int screenWidth, int screenHeight, List<? extends FormattedText> textLines, int mouseX, int mouseY, int screenWidth, int screenHeight,
int maxTextWidth, Font font) { int maxTextWidth, Font font) {
drawHoveringText(stack, mStack, textLines, mouseX, mouseY, screenWidth, screenHeight, maxTextWidth, drawHoveringText(stack, graphics, textLines, mouseX, mouseY, screenWidth, screenHeight, maxTextWidth,
ScreenUtils.DEFAULT_BACKGROUND_COLOR, ScreenUtils.DEFAULT_BORDER_COLOR_START, ScreenUtils.DEFAULT_BORDER_COLOR_END, IForgeGuiGraphics.DEFAULT_BACKGROUND_COLOR, IForgeGuiGraphics.DEFAULT_BORDER_COLOR_START, IForgeGuiGraphics.DEFAULT_BORDER_COLOR_END,
font); font);
} }
public static void drawHoveringText(@Nonnull final ItemStack stack, PoseStack pStack, public static void drawHoveringText(@Nonnull final ItemStack stack, GuiGraphics graphics,
List<? extends FormattedText> textLines, int mouseX, int mouseY, int screenWidth, int screenHeight, List<? extends FormattedText> textLines, int mouseX, int mouseY, int screenWidth, int screenHeight,
int maxTextWidth, int backgroundColor, int borderColorStart, int borderColorEnd, Font font) { int maxTextWidth, int backgroundColor, int borderColorStart, int borderColorEnd, Font font) {
if (textLines.isEmpty()) if (textLines.isEmpty())
return; return;
List<ClientTooltipComponent> list = ForgeHooksClient.gatherTooltipComponents(stack, textLines, List<ClientTooltipComponent> list = ForgeHooksClient.gatherTooltipComponents(stack, textLines,
stack.getTooltipImage(), mouseX, screenWidth, screenHeight, font, font); stack.getTooltipImage(), mouseX, screenWidth, screenHeight, font);
RenderTooltipEvent.Pre event = RenderTooltipEvent.Pre event =
new RenderTooltipEvent.Pre(stack, pStack, mouseX, mouseY, screenWidth, screenHeight, font, list); new RenderTooltipEvent.Pre(stack, graphics, mouseX, mouseY, screenWidth, screenHeight, font, list, null);
if (MinecraftForge.EVENT_BUS.post(event)) if (MinecraftForge.EVENT_BUS.post(event))
return; return;
PoseStack pStack = graphics.pose();
mouseX = event.getX(); mouseX = event.getX();
mouseY = event.getY(); mouseY = event.getY();
screenWidth = event.getScreenWidth(); screenWidth = event.getScreenWidth();
@@ -144,7 +150,7 @@ public class RemovedGuiUtils {
tooltipY = screenHeight - tooltipHeight - 4; tooltipY = screenHeight - tooltipHeight - 4;
final int zLevel = 400; final int zLevel = 400;
RenderTooltipEvent.Color colorEvent = new RenderTooltipEvent.Color(stack, pStack, tooltipX, tooltipY, RenderTooltipEvent.Color colorEvent = new RenderTooltipEvent.Color(stack, graphics, tooltipX, tooltipY,
font, backgroundColor, borderColorStart, borderColorEnd, list); font, backgroundColor, borderColorStart, borderColorEnd, list);
MinecraftForge.EVENT_BUS.post(colorEvent); MinecraftForge.EVENT_BUS.post(colorEvent);
backgroundColor = colorEvent.getBackgroundStart(); backgroundColor = colorEvent.getBackgroundStart();
@@ -154,24 +160,24 @@ public class RemovedGuiUtils {
pStack.pushPose(); pStack.pushPose();
Matrix4f mat = pStack.last() Matrix4f mat = pStack.last()
.pose(); .pose();
ScreenUtils.drawGradientRect(mat, zLevel, tooltipX - 3, tooltipY - 4, tooltipX + tooltipTextWidth + 3, graphics.fillGradient(tooltipX - 3, tooltipY - 4, tooltipX + tooltipTextWidth + 3,
tooltipY - 3, backgroundColor, backgroundColor); tooltipY - 3, zLevel, backgroundColor, backgroundColor);
ScreenUtils.drawGradientRect(mat, zLevel, tooltipX - 3, tooltipY + tooltipHeight + 3, graphics.fillGradient(tooltipX - 3, tooltipY + tooltipHeight + 3,
tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 4, backgroundColor, backgroundColor); tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 4, zLevel, backgroundColor, backgroundColor);
ScreenUtils.drawGradientRect(mat, zLevel, tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3, graphics.fillGradient(tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3,
tooltipY + tooltipHeight + 3, backgroundColor, backgroundColor); tooltipY + tooltipHeight + 3, zLevel, backgroundColor, backgroundColor);
ScreenUtils.drawGradientRect(mat, zLevel, tooltipX - 4, tooltipY - 3, tooltipX - 3, tooltipY + tooltipHeight + 3, graphics.fillGradient(tooltipX - 4, tooltipY - 3, tooltipX - 3, tooltipY + tooltipHeight + 3,
backgroundColor, backgroundColor); zLevel, backgroundColor, backgroundColor);
ScreenUtils.drawGradientRect(mat, zLevel, tooltipX + tooltipTextWidth + 3, tooltipY - 3, graphics.fillGradient(tooltipX + tooltipTextWidth + 3, tooltipY - 3,
tooltipX + tooltipTextWidth + 4, tooltipY + tooltipHeight + 3, backgroundColor, backgroundColor); tooltipX + tooltipTextWidth + 4, tooltipY + tooltipHeight + 3, zLevel, backgroundColor, backgroundColor);
ScreenUtils.drawGradientRect(mat, zLevel, tooltipX - 3, tooltipY - 3 + 1, tooltipX - 3 + 1, graphics.fillGradient(tooltipX - 3, tooltipY - 3 + 1, tooltipX - 3 + 1,
tooltipY + tooltipHeight + 3 - 1, borderColorStart, borderColorEnd); tooltipY + tooltipHeight + 3 - 1, zLevel, borderColorStart, borderColorEnd);
ScreenUtils.drawGradientRect(mat, zLevel, tooltipX + tooltipTextWidth + 2, tooltipY - 3 + 1, graphics.fillGradient(tooltipX + tooltipTextWidth + 2, tooltipY - 3 + 1,
tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3 - 1, borderColorStart, borderColorEnd); tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3 - 1, zLevel, borderColorStart, borderColorEnd);
ScreenUtils.drawGradientRect(mat, zLevel, tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3, graphics.fillGradient(tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3,
tooltipY - 3 + 1, borderColorStart, borderColorStart); tooltipY - 3 + 1, zLevel, borderColorStart, borderColorStart);
ScreenUtils.drawGradientRect(mat, zLevel, tooltipX - 3, tooltipY + tooltipHeight + 2, graphics.fillGradient(tooltipX - 3, tooltipY + tooltipHeight + 2,
tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3, borderColorEnd, borderColorEnd); tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3, zLevel, borderColorEnd, borderColorEnd);
MultiBufferSource.BufferSource renderType = MultiBufferSource.immediate(Tesselator.getInstance() MultiBufferSource.BufferSource renderType = MultiBufferSource.immediate(Tesselator.getInstance()
.getBuilder()); .getBuilder());

View File

@@ -5,19 +5,21 @@ import com.mojang.blaze3d.platform.GlConst;
import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.platform.Window;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.*; import com.mojang.blaze3d.vertex.BufferBuilder;
import com.mojang.math.Matrix4f; import com.mojang.blaze3d.vertex.DefaultVertexFormat;
import com.mojang.math.Vector3f; import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.Tesselator;
import com.mojang.blaze3d.vertex.VertexFormat;
import com.mojang.math.Axis;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.renderer.GameRenderer;
import nl.requios.effortlessbuilding.create.foundation.utility.Color; import nl.requios.effortlessbuilding.create.foundation.utility.Color;
import nl.requios.effortlessbuilding.create.foundation.utility.Couple; import nl.requios.effortlessbuilding.create.foundation.utility.Couple;
import net.minecraft.client.Minecraft; import org.joml.Matrix4f;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraftforge.client.gui.ScreenUtils;
import org.lwjgl.opengl.GL20; import org.lwjgl.opengl.GL20;
import org.lwjgl.opengl.GL30; import org.lwjgl.opengl.GL30;
import javax.annotation.Nonnull;
public class UIRenderHelper { public class UIRenderHelper {
/** /**
@@ -53,14 +55,14 @@ public class UIRenderHelper {
GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, dst.frameBufferId); GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, dst.frameBufferId);
} }
public static void streak(PoseStack ms, float angle, int x, int y, int breadth, int length) { public static void streak(GuiGraphics graphics, float angle, int x, int y, int breadth, int length) {
streak(ms, angle, x, y, breadth, length, Theme.i(Theme.Key.STREAK)); streak(graphics, angle, x, y, breadth, length, Theme.i(Theme.Key.STREAK));
} }
// angle in degrees; 0° -> fading to the right // angle in degrees; 0° -> fading to the right
// x and y specify the middle point of the starting edge // x and y specify the middle point of the starting edge
// breadth is the total width of the streak // breadth is the total width of the streak
public static void streak(PoseStack ms, float angle, int x, int y, int breadth, int length, int color) { public static void streak(GuiGraphics graphics, float angle, int x, int y, int breadth, int length, int color) {
int a1 = 0xa0 << 24; int a1 = 0xa0 << 24;
int a2 = 0x80 << 24; int a2 = 0x80 << 24;
int a3 = 0x10 << 24; int a3 = 0x10 << 24;
@@ -72,59 +74,60 @@ public class UIRenderHelper {
int c3 = a3 | color; int c3 = a3 | color;
int c4 = a4 | color; int c4 = a4 | color;
PoseStack ms = graphics.pose();
ms.pushPose(); ms.pushPose();
ms.translate(x, y, 0); ms.translate(x, y, 0);
ms.mulPose(Vector3f.ZP.rotationDegrees(angle - 90)); ms.mulPose(Axis.ZP.rotationDegrees(angle - 90));
streak(ms, breadth / 2, length, c1, c2, c3, c4); streak(graphics, breadth / 2, length, c1, c2, c3, c4);
ms.popPose(); ms.popPose();
} }
public static void streak(PoseStack ms, float angle, int x, int y, int breadth, int length, Color c) { public static void streak(GuiGraphics graphics, float angle, int x, int y, int breadth, int length, Color c) {
Color color = c.copy().setImmutable(); Color color = c.copy().setImmutable();
int c1 = color.scaleAlpha(0.625f).getRGB(); int c1 = color.scaleAlpha(0.625f).getRGB();
int c2 = color.scaleAlpha(0.5f).getRGB(); int c2 = color.scaleAlpha(0.5f).getRGB();
int c3 = color.scaleAlpha(0.0625f).getRGB(); int c3 = color.scaleAlpha(0.0625f).getRGB();
int c4 = color.scaleAlpha(0f).getRGB(); int c4 = color.scaleAlpha(0f).getRGB();
PoseStack ms = graphics.pose();
ms.pushPose(); ms.pushPose();
ms.translate(x, y, 0); ms.translate(x, y, 0);
ms.mulPose(Vector3f.ZP.rotationDegrees(angle - 90)); ms.mulPose(Axis.ZP.rotationDegrees(angle - 90));
streak(ms, breadth / 2, length, c1, c2, c3, c4); streak(graphics, breadth / 2, length, c1, c2, c3, c4);
ms.popPose(); ms.popPose();
} }
private static void streak(PoseStack ms, int width, int height, int c1, int c2, int c3, int c4) { private static void streak(GuiGraphics graphics, int width, int height, int c1, int c2, int c3, int c4) {
double split1 = .5; double split1 = .5;
double split2 = .75; double split2 = .75;
Matrix4f model = ms.last().pose(); graphics.fillGradient(-width, 0, width, (int) (split1 * height), 0, c1, c2);
ScreenUtils.drawGradientRect(model, 0, -width, 0, width, (int) (split1 * height), c1, c2); graphics.fillGradient(-width, (int) (split1 * height), width, (int) (split2 * height), 0, c2, c3);
ScreenUtils.drawGradientRect(model, 0, -width, (int) (split1 * height), width, (int) (split2 * height), c2, c3); graphics.fillGradient(-width, (int) (split2 * height), width, height, 0, c3, c4);
ScreenUtils.drawGradientRect(model, 0, -width, (int) (split2 * height), width, height, c3, c4);
} }
/** /**
* @see #angledGradient(MatrixStack, float, int, int, int, int, int, Color, Color) * @see #angledGradient(GuiGraphics, float, int, int, int, int, int, Color, Color)
*/ */
public static void angledGradient(@Nonnull PoseStack ms, float angle, int x, int y, int breadth, int length, Couple<Color> c) { public static void angledGradient(GuiGraphics graphics, float angle, int x, int y, int breadth, int length, Couple<Color> c) {
angledGradient(ms, angle, x, y, 0, breadth, length, c); angledGradient(graphics, angle, x, y, 0, breadth, length, c);
} }
/** /**
* @see #angledGradient(MatrixStack, float, int, int, int, int, int, Color, Color) * @see #angledGradient(GuiGraphics, float, int, int, int, int, int, Color, Color)
*/ */
public static void angledGradient(@Nonnull PoseStack ms, float angle, int x, int y, int z, int breadth, int length, Couple<Color> c) { public static void angledGradient(GuiGraphics graphics, float angle, int x, int y, int z, int breadth, int length, Couple<Color> c) {
angledGradient(ms, angle, x, y, z, breadth, length, c.getFirst(), c.getSecond()); angledGradient(graphics, angle, x, y, z, breadth, length, c.getFirst(), c.getSecond());
} }
/** /**
* @see #angledGradient(MatrixStack, float, int, int, int, int, int, Color, Color) * @see #angledGradient(GuiGraphics, float, int, int, int, int, int, Color, Color)
*/ */
public static void angledGradient(@Nonnull PoseStack ms, float angle, int x, int y, int breadth, int length, Color color1, Color color2) { public static void angledGradient(GuiGraphics graphics, float angle, int x, int y, int breadth, int length, Color color1, Color color2) {
angledGradient(ms, angle, x, y, 0, breadth, length, color1, color2); angledGradient(graphics, angle, x, y, 0, breadth, length, color1, color2);
} }
/** /**
@@ -135,31 +138,32 @@ public class UIRenderHelper {
* @param color2 the color at the ending edge * @param color2 the color at the ending edge
* @param breadth the total width of the gradient * @param breadth the total width of the gradient
*/ */
public static void angledGradient(@Nonnull PoseStack ms, float angle, int x, int y, int z, int breadth, int length, Color color1, Color color2) { public static void angledGradient(GuiGraphics graphics, float angle, int x, int y, int z, int breadth, int length, Color color1, Color color2) {
PoseStack ms = graphics.pose();
ms.pushPose(); ms.pushPose();
ms.translate(x, y, z); ms.translate(x, y, z);
ms.mulPose(Vector3f.ZP.rotationDegrees(angle - 90)); ms.mulPose(Axis.ZP.rotationDegrees(angle - 90));
Matrix4f model = ms.last().pose();
int w = breadth / 2; int w = breadth / 2;
ScreenUtils.drawGradientRect(model, 0, -w, 0, w, length, color1.getRGB(), color2.getRGB()); graphics.fillGradient(-w, 0, w, length, 0, color1.getRGB(), color2.getRGB());
ms.popPose(); ms.popPose();
} }
public static void breadcrumbArrow(PoseStack matrixStack, int x, int y, int z, int width, int height, int indent, Couple<Color> colors) {breadcrumbArrow(matrixStack, x, y, z, width, height, indent, colors.getFirst(), colors.getSecond());} public static void breadcrumbArrow(GuiGraphics graphics, int x, int y, int z, int width, int height, int indent, Couple<Color> colors) {breadcrumbArrow(graphics, x, y, z, width, height, indent, colors.getFirst(), colors.getSecond());}
// draws a wide chevron-style breadcrumb arrow pointing left // draws a wide chevron-style breadcrumb arrow pointing left
public static void breadcrumbArrow(PoseStack matrixStack, int x, int y, int z, int width, int height, int indent, Color startColor, Color endColor) { public static void breadcrumbArrow(GuiGraphics graphics, int x, int y, int z, int width, int height, int indent, Color startColor, Color endColor) {
PoseStack matrixStack = graphics.pose();
matrixStack.pushPose(); matrixStack.pushPose();
matrixStack.translate(x - indent, y, z); matrixStack.translate(x - indent, y, z);
breadcrumbArrow(matrixStack, width, height, indent, startColor, endColor); breadcrumbArrow(graphics, width, height, indent, startColor, endColor);
matrixStack.popPose(); matrixStack.popPose();
} }
private static void breadcrumbArrow(PoseStack ms, int width, int height, int indent, Color c1, Color c2) { private static void breadcrumbArrow(GuiGraphics graphics, int width, int height, int indent, Color c1, Color c2) {
/* /*
* 0,0 x1,y1 ********************* x4,y4 ***** x7,y7 * 0,0 x1,y1 ********************* x4,y4 ***** x7,y7
@@ -189,7 +193,7 @@ public class UIRenderHelper {
Color fc3 = Color.mixColors(c1, c2, (indent + width) / (width + 2f * indent)); Color fc3 = Color.mixColors(c1, c2, (indent + width) / (width + 2f * indent));
Color fc4 = Color.mixColors(c1, c2, 1); Color fc4 = Color.mixColors(c1, c2, 1);
RenderSystem.disableTexture(); // RenderSystem.disableTexture();
RenderSystem.enableBlend(); RenderSystem.enableBlend();
RenderSystem.disableCull(); RenderSystem.disableCull();
RenderSystem.defaultBlendFunc(); RenderSystem.defaultBlendFunc();
@@ -197,7 +201,7 @@ public class UIRenderHelper {
Tesselator tessellator = Tesselator.getInstance(); Tesselator tessellator = Tesselator.getInstance();
BufferBuilder bufferbuilder = tessellator.getBuilder(); BufferBuilder bufferbuilder = tessellator.getBuilder();
Matrix4f model = ms.last().pose(); Matrix4f model = graphics.pose().last().pose();
bufferbuilder.begin(VertexFormat.Mode.TRIANGLES, DefaultVertexFormat.POSITION_COLOR); bufferbuilder.begin(VertexFormat.Mode.TRIANGLES, DefaultVertexFormat.POSITION_COLOR);
bufferbuilder.vertex(model, x0, y0, 0).color(fc1.getRed(), fc1.getGreen(), fc1.getBlue(), fc1.getAlpha()).endVertex(); bufferbuilder.vertex(model, x0, y0, 0).color(fc1.getRed(), fc1.getGreen(), fc1.getBlue(), fc1.getAlpha()).endVertex();
@@ -227,27 +231,34 @@ public class UIRenderHelper {
tessellator.end(); tessellator.end();
RenderSystem.enableCull(); RenderSystem.enableCull();
RenderSystem.disableBlend(); RenderSystem.disableBlend();
RenderSystem.enableTexture(); // RenderSystem.enableTexture();
} }
//just like AbstractGui#drawTexture, but with a color at every vertex //just like AbstractGui#drawTexture, but with a color at every vertex
public static void drawColoredTexture(PoseStack ms, Color c, int x, int y, int tex_left, int tex_top, int width, int height) { public static void drawColoredTexture(GuiGraphics graphics, Color c, int x, int y, int tex_left, int tex_top, int width, int height) {
drawColoredTexture(ms, c, x, y, 0, (float) tex_left, (float) tex_top, width, height, 256, 256); drawColoredTexture(graphics, c, x, y, 0, (float) tex_left, (float) tex_top, width, height, 256, 256);
} }
public static void drawColoredTexture(PoseStack ms, Color c, int x, int y, int z, float tex_left, float tex_top, int width, int height, int sheet_width, int sheet_height) { public static void drawColoredTexture(GuiGraphics graphics, Color c, int x, int y, int z, float tex_left, float tex_top, int width, int height, int sheet_width, int sheet_height) {
drawColoredTexture(ms, c, x, x + width, y, y + height, z, width, height, tex_left, tex_top, sheet_width, sheet_height); drawColoredTexture(graphics, c, x, x + width, y, y + height, z, width, height, tex_left, tex_top, sheet_width, sheet_height);
} }
public static void drawStretched(PoseStack ms, int left, int top, int w, int h, int z, AllGuiTextures tex) { public static void drawStretched(GuiGraphics graphics, int left, int top, int w, int h, int z, AllGuiTextures tex) {
tex.bind(); tex.bind();
drawTexturedQuad(ms.last() drawTexturedQuad(graphics.pose().last()
.pose(), Color.WHITE, left, left + w, top, top + h, z, tex.startX / 256f, (tex.startX + tex.width) / 256f, .pose(), Color.WHITE, left, left + w, top, top + h, z, tex.startX / 256f, (tex.startX + tex.width) / 256f,
tex.startY / 256f, (tex.startY + tex.height) / 256f); tex.startY / 256f, (tex.startY + tex.height) / 256f);
} }
private static void drawColoredTexture(PoseStack ms, Color c, int left, int right, int top, int bot, int z, int tex_width, int tex_height, float tex_left, float tex_top, int sheet_width, int sheet_height) { public static void drawCropped(GuiGraphics graphics, int left, int top, int w, int h, int z, AllGuiTextures tex) {
drawTexturedQuad(ms.last().pose(), c, left, right, top, bot, z, (tex_left + 0.0F) / (float) sheet_width, (tex_left + (float) tex_width) / (float) sheet_width, (tex_top + 0.0F) / (float) sheet_height, (tex_top + (float) tex_height) / (float) sheet_height); tex.bind();
drawTexturedQuad(graphics.pose().last()
.pose(), Color.WHITE, left, left + w, top, top + h, z, tex.startX / 256f, (tex.startX + w) / 256f,
tex.startY / 256f, (tex.startY + h) / 256f);
}
private static void drawColoredTexture(GuiGraphics graphics, Color c, int left, int right, int top, int bot, int z, int tex_width, int tex_height, float tex_left, float tex_top, int sheet_width, int sheet_height) {
drawTexturedQuad(graphics.pose().last().pose(), c, left, right, top, bot, z, (tex_left + 0.0F) / (float) sheet_width, (tex_left + (float) tex_width) / (float) sheet_width, (tex_top + 0.0F) / (float) sheet_height, (tex_top + (float) tex_height) / (float) sheet_height);
} }
private static void drawTexturedQuad(Matrix4f m, Color c, int left, int right, int top, int bot, int z, float u1, float u2, float v1, float v2) { private static void drawTexturedQuad(Matrix4f m, Color c, int left, int right, int top, int bot, int z, float u1, float u2, float v1, float v2) {
@@ -266,7 +277,7 @@ public class UIRenderHelper {
} }
public static void flipForGuiRender(PoseStack poseStack) { public static void flipForGuiRender(PoseStack poseStack) {
poseStack.mulPoseMatrix(Matrix4f.createScaleMatrix(1, -1, 1)); poseStack.mulPoseMatrix(new Matrix4f().scaling(1, -1, 1));
} }
public static class CustomRenderTarget extends RenderTarget { public static class CustomRenderTarget extends RenderTarget {
@@ -291,7 +302,7 @@ public class UIRenderHelper {
float tx = (float) viewWidth / (float) width; float tx = (float) viewWidth / (float) width;
float ty = (float) viewHeight / (float) height; float ty = (float) viewHeight / (float) height;
RenderSystem.enableTexture(); // RenderSystem.enableTexture();
RenderSystem.enableDepthTest(); RenderSystem.enableDepthTest();
RenderSystem.setShader(() -> Minecraft.getInstance().gameRenderer.blitShader); RenderSystem.setShader(() -> Minecraft.getInstance().gameRenderer.blitShader);
RenderSystem.getShader().setSampler("DiffuseSampler", colorTextureId); RenderSystem.getShader().setSampler("DiffuseSampler", colorTextureId);

View File

@@ -1,12 +1,10 @@
package nl.requios.effortlessbuilding.create.foundation.gui.container; package nl.requios.effortlessbuilding.create.foundation.gui.container;
import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.platform.InputConstants;
import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.gui.GuiGraphics;
import nl.requios.effortlessbuilding.create.foundation.gui.AllGuiTextures;
import nl.requios.effortlessbuilding.create.foundation.gui.TickableGuiEventListener;
import nl.requios.effortlessbuilding.create.foundation.gui.widget.AbstractSimiWidget;
import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraft.client.gui.components.Widget; import net.minecraft.client.gui.components.EditBox;
import net.minecraft.client.gui.components.Renderable;
import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.components.events.GuiEventListener;
import net.minecraft.client.gui.narration.NarratableEntry; import net.minecraft.client.gui.narration.NarratableEntry;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
@@ -17,6 +15,8 @@ import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import nl.requios.effortlessbuilding.create.foundation.gui.TickableGuiEventListener;
import nl.requios.effortlessbuilding.create.foundation.gui.widget.AbstractSimiWidget;
import javax.annotation.ParametersAreNonnullByDefault; import javax.annotation.ParametersAreNonnullByDefault;
import java.util.Collection; import java.util.Collection;
@@ -66,13 +66,13 @@ public abstract class AbstractSimiContainerScreen<T extends AbstractContainerMen
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
protected <W extends GuiEventListener & Widget & NarratableEntry> void addRenderableWidgets(W... widgets) { protected <W extends GuiEventListener & Renderable & NarratableEntry> void addRenderableWidgets(W... widgets) {
for (W widget : widgets) { for (W widget : widgets) {
addRenderableWidget(widget); addRenderableWidget(widget);
} }
} }
protected <W extends GuiEventListener & Widget & NarratableEntry> void addRenderableWidgets(Collection<W> widgets) { protected <W extends GuiEventListener & Renderable & NarratableEntry> void addRenderableWidgets(Collection<W> widgets) {
for (W widget : widgets) { for (W widget : widgets) {
addRenderableWidget(widget); addRenderableWidget(widget);
} }
@@ -91,34 +91,34 @@ public abstract class AbstractSimiContainerScreen<T extends AbstractContainerMen
} }
@Override @Override
public void render(PoseStack matrixStack, int mouseX, int mouseY, float partialTicks) { public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) {
partialTicks = minecraft.getFrameTime(); partialTicks = minecraft.getFrameTime();
renderBackground(matrixStack); renderBackground(graphics);
super.render(matrixStack, mouseX, mouseY, partialTicks); super.render(graphics, mouseX, mouseY, partialTicks);
renderForeground(matrixStack, mouseX, mouseY, partialTicks); renderForeground(graphics, mouseX, mouseY, partialTicks);
} }
@Override @Override
protected void renderLabels(PoseStack poseStack, int mouseX, int mouseY) { protected void renderLabels(GuiGraphics graphics, int mouseX, int mouseY) {
// no-op to prevent screen- and inventory-title from being rendered at incorrect // no-op to prevent screen- and inventory-title from being rendered at incorrect
// location // location
// could also set this.titleX/Y and this.playerInventoryTitleX/Y to the proper // could also set this.titleX/Y and this.playerInventoryTitleX/Y to the proper
// values instead // values instead
} }
protected void renderForeground(PoseStack ms, int mouseX, int mouseY, float partialTicks) { protected void renderForeground(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) {
renderTooltip(ms, mouseX, mouseY); renderTooltip(graphics, mouseX, mouseY);
for (Widget widget : renderables) { for (Renderable widget : renderables) {
if (widget instanceof AbstractSimiWidget simiWidget && simiWidget.isHoveredOrFocused()) { if (widget instanceof AbstractSimiWidget simiWidget && simiWidget.isMouseOver(mouseX, mouseY)) {
List<Component> tooltip = simiWidget.getToolTip(); List<Component> tooltip = simiWidget.getToolTip();
if (tooltip.isEmpty()) if (tooltip.isEmpty())
continue; continue;
int ttx = simiWidget.lockedTooltipX == -1 ? mouseX : simiWidget.lockedTooltipX + simiWidget.x; int ttx = simiWidget.lockedTooltipX == -1 ? mouseX : simiWidget.lockedTooltipX + simiWidget.getX();
int tty = simiWidget.lockedTooltipY == -1 ? mouseY : simiWidget.lockedTooltipY + simiWidget.y; int tty = simiWidget.lockedTooltipY == -1 ? mouseY : simiWidget.lockedTooltipY + simiWidget.getY();
renderComponentTooltip(ms, tooltip, ttx, tty); graphics.renderComponentTooltip(font, tooltip, ttx, tty);
} }
} }
} }
@@ -127,19 +127,26 @@ public abstract class AbstractSimiContainerScreen<T extends AbstractContainerMen
return leftPos - windowXOffset + (imageWidth - textureWidth) / 2; return leftPos - windowXOffset + (imageWidth - textureWidth) / 2;
} }
// public void renderPlayerInventory(PoseStack ms, int x, int y) { // public void renderPlayerInventory(GuiGraphics graphics, int x, int y) {
// AllGuiTextures.PLAYER_INVENTORY.render(ms, x, y, this); // AllGuiTextures.PLAYER_INVENTORY.render(graphics, x, y);
// font.draw(ms, playerInventoryTitle, x + 8, y + 6, 0x404040); // graphics.drawString(font, playerInventoryTitle, x + 8, y + 6, 0x404040, false);
// } // }
@Override @Override
public boolean keyPressed(int pKeyCode, int pScanCode, int pModifiers) { public boolean keyPressed(int pKeyCode, int pScanCode, int pModifiers) {
InputConstants.Key mouseKey = InputConstants.getKey(pKeyCode, pScanCode); InputConstants.Key mouseKey = InputConstants.getKey(pKeyCode, pScanCode);
if (getFocused() != null && this.minecraft.options.keyInventory.isActiveAndMatches(mouseKey)) if (getFocused() instanceof EditBox && this.minecraft.options.keyInventory.isActiveAndMatches(mouseKey))
return false; return false;
return super.keyPressed(pKeyCode, pScanCode, pModifiers); return super.keyPressed(pKeyCode, pScanCode, pModifiers);
} }
@Override
public boolean mouseClicked(double pMouseX, double pMouseY, int pButton) {
if (getFocused() != null && !getFocused().isMouseOver(pMouseX, pMouseY))
setFocused(null);
return super.mouseClicked(pMouseX, pMouseY, pButton);
}
@Override @Override
public GuiEventListener getFocused() { public GuiEventListener getFocused() {
GuiEventListener focused = super.getFocused(); GuiEventListener focused = super.getFocused();
@@ -160,14 +167,14 @@ public abstract class AbstractSimiContainerScreen<T extends AbstractContainerMen
} }
@Deprecated @Deprecated
protected void debugWindowArea(PoseStack matrixStack) { protected void debugWindowArea(GuiGraphics graphics) {
fill(matrixStack, leftPos + imageWidth, topPos + imageHeight, leftPos, topPos, 0xD3D3D3D3); graphics.fill(leftPos + imageWidth, topPos + imageHeight, leftPos, topPos, 0xD3D3D3D3);
} }
@Deprecated @Deprecated
protected void debugExtraAreas(PoseStack matrixStack) { protected void debugExtraAreas(GuiGraphics graphics) {
for (Rect2i area : getExtraAreas()) { for (Rect2i area : getExtraAreas()) {
fill(matrixStack, area.getX() + area.getWidth(), area.getY() + area.getHeight(), area.getX(), area.getY(), graphics.fill(area.getX() + area.getWidth(), area.getY() + area.getHeight(), area.getX(), area.getY(),
0xD3D3D3D3); 0xD3D3D3D3);
} }
} }

View File

@@ -1,35 +0,0 @@
package nl.requios.effortlessbuilding.create.foundation.gui.container;
import nl.requios.effortlessbuilding.create.foundation.networking.SimplePacketBase;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.server.level.ServerPlayer;
import net.minecraftforge.network.NetworkEvent.Context;
import java.util.function.Supplier;
public class ClearContainerPacket extends SimplePacketBase {
public ClearContainerPacket() {}
public ClearContainerPacket(FriendlyByteBuf buffer) {}
@Override
public void write(FriendlyByteBuf buffer) {}
@Override
public void handle(Supplier<Context> context) {
context.get()
.enqueueWork(() -> {
ServerPlayer player = context.get()
.getSender();
if (player == null)
return;
if (!(player.containerMenu instanceof IClearableContainer))
return;
((IClearableContainer) player.containerMenu).clearContents();
});
context.get()
.setPacketHandled(true);
}
}

View File

@@ -0,0 +1,30 @@
package nl.requios.effortlessbuilding.create.foundation.gui.container;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.server.level.ServerPlayer;
import net.minecraftforge.network.NetworkEvent.Context;
import nl.requios.effortlessbuilding.create.foundation.networking.SimplePacketBase;
public class ClearMenuPacket extends SimplePacketBase {
public ClearMenuPacket() {}
public ClearMenuPacket(FriendlyByteBuf buffer) {}
@Override
public void write(FriendlyByteBuf buffer) {}
@Override
public boolean handle(Context context) {
context.enqueueWork(() -> {
ServerPlayer player = context.getSender();
if (player == null)
return;
if (!(player.containerMenu instanceof IClearableMenu))
return;
((IClearableMenu) player.containerMenu).clearContents();
});
return true;
}
}

View File

@@ -10,15 +10,15 @@ import net.minecraft.world.item.ItemStack;
import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.items.ItemStackHandler; import net.minecraftforge.items.ItemStackHandler;
public abstract class GhostItemContainer<T> extends ContainerBase<T> implements IClearableContainer { public abstract class GhostItemMenu<T> extends MenuBase<T> implements IClearableMenu {
public ItemStackHandler ghostInventory; public ItemStackHandler ghostInventory;
protected GhostItemContainer(MenuType<?> type, int id, Inventory inv, FriendlyByteBuf extraData) { protected GhostItemMenu(MenuType<?> type, int id, Inventory inv, FriendlyByteBuf extraData) {
super(type, id, inv, extraData); super(type, id, inv, extraData);
} }
protected GhostItemContainer(MenuType<?> type, int id, Inventory inv, T contentHolder) { protected GhostItemMenu(MenuType<?> type, int id, Inventory inv, T contentHolder) {
super(type, id, inv, contentHolder); super(type, id, inv, contentHolder);
} }

View File

@@ -1,12 +1,10 @@
package nl.requios.effortlessbuilding.create.foundation.gui.container; package nl.requios.effortlessbuilding.create.foundation.gui.container;
import nl.requios.effortlessbuilding.create.foundation.networking.SimplePacketBase;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraftforge.network.NetworkEvent.Context; import net.minecraftforge.network.NetworkEvent.Context;
import nl.requios.effortlessbuilding.create.foundation.networking.SimplePacketBase;
import java.util.function.Supplier;
public class GhostItemSubmitPacket extends SimplePacketBase { public class GhostItemSubmitPacket extends SimplePacketBase {
@@ -30,23 +28,18 @@ public class GhostItemSubmitPacket extends SimplePacketBase {
} }
@Override @Override
public void handle(Supplier<Context> context) { public boolean handle(Context context) {
context.get() context.enqueueWork(() -> {
.enqueueWork(() -> { ServerPlayer player = context.getSender();
ServerPlayer player = context.get()
.getSender();
if (player == null) if (player == null)
return; return;
if (player.containerMenu instanceof GhostItemContainer) { if (player.containerMenu instanceof GhostItemMenu<?> menu) {
GhostItemContainer<?> c = (GhostItemContainer<?>) player.containerMenu; menu.ghostInventory.setStackInSlot(slot, item);
c.ghostInventory.setStackInSlot(slot, item); menu.getSlot(36 + slot).setChanged();
c.getSlot(36 + slot).setChanged();
} }
}); });
context.get() return true;
.setPacketHandled(true);
} }
} }

View File

@@ -1,14 +0,0 @@
package nl.requios.effortlessbuilding.create.foundation.gui.container;
//import nl.requios.effortlessbuilding.create.foundation.networking.AllPackets;
public interface IClearableContainer {
default void sendClearPacket() {
// AllPackets.channel.sendToServer(new ClearContainerPacket());
}
@Deprecated //warning: does not work
public void clearContents();
}

View File

@@ -0,0 +1,11 @@
package nl.requios.effortlessbuilding.create.foundation.gui.container;
public interface IClearableMenu {
default void sendClearPacket() {
// PacketHandler.INSTANCE.sendToServer(new ClearMenuPacket());
}
public void clearContents();
}

View File

@@ -1,6 +1,5 @@
package nl.requios.effortlessbuilding.create.foundation.gui.container; package nl.requios.effortlessbuilding.create.foundation.gui.container;
import nl.requios.effortlessbuilding.create.foundation.utility.IInteractionChecker;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
@@ -9,19 +8,20 @@ import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.inventory.Slot; import net.minecraft.world.inventory.Slot;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import nl.requios.effortlessbuilding.create.foundation.utility.IInteractionChecker;
public abstract class ContainerBase<T> extends AbstractContainerMenu { public abstract class MenuBase<T> extends AbstractContainerMenu {
public Player player; public Player player;
public Inventory playerInventory; public Inventory playerInventory;
public T contentHolder; public T contentHolder;
protected ContainerBase(MenuType<?> type, int id, Inventory inv, FriendlyByteBuf extraData) { protected MenuBase(MenuType<?> type, int id, Inventory inv, FriendlyByteBuf extraData) {
super(type, id); super(type, id);
init(inv, createOnClient(extraData)); init(inv, createOnClient(extraData));
} }
protected ContainerBase(MenuType<?> type, int id, Inventory inv, T contentHolder) { protected MenuBase(MenuType<?> type, int id, Inventory inv, T contentHolder) {
super(type, id); super(type, id);
init(inv, contentHolder); init(inv, contentHolder);
} }

View File

@@ -1,11 +1,16 @@
package nl.requios.effortlessbuilding.create.foundation.gui.element; package nl.requios.effortlessbuilding.create.foundation.gui.element;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.*; import com.mojang.blaze3d.vertex.BufferBuilder;
import com.mojang.math.Matrix4f; import com.mojang.blaze3d.vertex.DefaultVertexFormat;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.Tesselator;
import com.mojang.blaze3d.vertex.VertexFormat;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.renderer.GameRenderer;
import nl.requios.effortlessbuilding.create.foundation.utility.Color; import nl.requios.effortlessbuilding.create.foundation.utility.Color;
import nl.requios.effortlessbuilding.create.foundation.utility.Couple; import nl.requios.effortlessbuilding.create.foundation.utility.Couple;
import net.minecraft.client.renderer.GameRenderer; import org.joml.Matrix4f;
public class BoxElement extends RenderElement { public class BoxElement extends RenderElement {
@@ -60,8 +65,8 @@ public class BoxElement extends RenderElement {
} }
@Override @Override
public void render(PoseStack ms) { public void render(GuiGraphics graphics) {
renderBox(ms); renderBox(graphics.pose());
} }
//total box width = 1 * 2 (outer border) + 1 * 2 (inner color border) + 2 * borderOffset + width //total box width = 1 * 2 (outer border) + 1 * 2 (inner color border) + 2 * borderOffset + width
@@ -83,7 +88,7 @@ public class BoxElement extends RenderElement {
* |_____________| * |_____________|
* *
* */ * */
RenderSystem.disableTexture(); // RenderSystem.disableTexture();
RenderSystem.enableBlend(); RenderSystem.enableBlend();
RenderSystem.defaultBlendFunc(); RenderSystem.defaultBlendFunc();
RenderSystem.setShader(GameRenderer::getPositionColorShader); RenderSystem.setShader(GameRenderer::getPositionColorShader);
@@ -148,6 +153,6 @@ public class BoxElement extends RenderElement {
tessellator.end(); tessellator.end();
RenderSystem.disableBlend(); RenderSystem.disableBlend();
RenderSystem.enableTexture(); // RenderSystem.enableTexture();
} }
} }

View File

@@ -1,8 +1,10 @@
package nl.requios.effortlessbuilding.create.foundation.gui.element; package nl.requios.effortlessbuilding.create.foundation.gui.element;
import javax.annotation.Nonnull;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import javax.annotation.Nonnull; import net.minecraft.client.gui.GuiGraphics;
public class CombinedStencilElement extends StencilElement { public class CombinedStencilElement extends StencilElement {
@@ -43,26 +45,27 @@ public class CombinedStencilElement extends StencilElement {
} }
@Override @Override
protected void renderStencil(PoseStack ms) { protected void renderStencil(GuiGraphics graphics) {
PoseStack ms = graphics.pose();
ms.pushPose(); ms.pushPose();
element1.transform(ms); element1.transform(ms);
element1.withBounds(width, height); element1.withBounds(width, height);
element1.renderStencil(ms); element1.renderStencil(graphics);
ms.popPose(); ms.popPose();
ms.pushPose(); ms.pushPose();
element2.transform(ms); element2.transform(ms);
element2.withBounds(width, height); element2.withBounds(width, height);
element2.renderStencil(ms); element2.renderStencil(graphics);
ms.popPose(); ms.popPose();
} }
@Override @Override
protected void renderElement(PoseStack ms) { protected void renderElement(GuiGraphics graphics) {
if (mode.rendersFirst()) if (mode.rendersFirst())
element1.<StencilElement>withBounds(width, height).renderElement(ms); element1.<StencilElement>withBounds(width, height).renderElement(graphics);
if (mode.rendersSecond()) if (mode.rendersSecond())
element2.<StencilElement>withBounds(width, height).renderElement(ms); element2.<StencilElement>withBounds(width, height).renderElement(graphics);
} }
public enum ElementMode { public enum ElementMode {

View File

@@ -1,13 +1,13 @@
package nl.requios.effortlessbuilding.create.foundation.gui.element; package nl.requios.effortlessbuilding.create.foundation.gui.element;
import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.gui.GuiGraphics;
import nl.requios.effortlessbuilding.create.foundation.gui.UIRenderHelper; import nl.requios.effortlessbuilding.create.foundation.gui.UIRenderHelper;
import nl.requios.effortlessbuilding.create.foundation.utility.Color; import nl.requios.effortlessbuilding.create.foundation.utility.Color;
public class DelegatedStencilElement extends StencilElement { public class DelegatedStencilElement extends StencilElement {
protected static final ElementRenderer EMPTY_RENDERER = (ms, width, height, alpha) -> {}; protected static final ElementRenderer EMPTY_RENDERER = (graphics, width, height, alpha) -> {};
protected static final ElementRenderer DEFAULT_ELEMENT = (ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, -3, 5, height+4, width+6, new Color(0xff_10dd10).scaleAlpha(alpha), new Color(0xff_1010dd).scaleAlpha(alpha)); protected static final ElementRenderer DEFAULT_ELEMENT = (graphics, width, height, alpha) -> UIRenderHelper.angledGradient(graphics, 0, -3, 5, height+4, width+6, new Color(0xff_10dd10).scaleAlpha(alpha), new Color(0xff_1010dd).scaleAlpha(alpha));
protected ElementRenderer stencil; protected ElementRenderer stencil;
protected ElementRenderer element; protected ElementRenderer element;
@@ -35,18 +35,18 @@ public class DelegatedStencilElement extends StencilElement {
} }
@Override @Override
protected void renderStencil(PoseStack ms) { protected void renderStencil(GuiGraphics graphics) {
stencil.render(ms, width, height, 1); stencil.render(graphics, width, height, 1);
} }
@Override @Override
protected void renderElement(PoseStack ms) { protected void renderElement(GuiGraphics graphics) {
element.render(ms, width, height, alpha); element.render(graphics, width, height, alpha);
} }
@FunctionalInterface @FunctionalInterface
public interface ElementRenderer { public interface ElementRenderer {
void render(PoseStack ms, int width, int height, float alpha); void render(GuiGraphics graphics, int width, int height, float alpha);
} }
} }

View File

@@ -1,31 +1,27 @@
package nl.requios.effortlessbuilding.create.foundation.gui.element; package nl.requios.effortlessbuilding.create.foundation.gui.element;
import com.jozufozu.flywheel.core.PartialModel;
import com.jozufozu.flywheel.core.model.ModelUtil;
import com.mojang.blaze3d.platform.GlStateManager.DestFactor; import com.mojang.blaze3d.platform.GlStateManager.DestFactor;
import com.mojang.blaze3d.platform.GlStateManager.SourceFactor; import com.mojang.blaze3d.platform.GlStateManager.SourceFactor;
import com.mojang.blaze3d.platform.Lighting; import com.mojang.blaze3d.platform.Lighting;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Vector3f; import com.mojang.math.Axis;
//import nl.requios.effortlessbuilding.create.foundation.fluid.FluidRenderer; import dev.engine_room.flywheel.lib.model.baked.PartialModel;
import nl.requios.effortlessbuilding.create.foundation.gui.ILightingSettings; import net.createmod.ponder.render.VirtualRenderHelper;
import nl.requios.effortlessbuilding.create.foundation.gui.UIRenderHelper;
import nl.requios.effortlessbuilding.create.foundation.utility.Color;
import nl.requios.effortlessbuilding.create.foundation.utility.VecHelper;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.LightTexture;
import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.Sheets; import net.minecraft.client.renderer.Sheets;
import net.minecraft.client.renderer.block.BlockRenderDispatcher; import net.minecraft.client.renderer.block.BlockRenderDispatcher;
import net.minecraft.client.renderer.block.model.ItemTransforms;
import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.client.renderer.entity.ItemRenderer;
import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.util.RandomSource; import net.minecraft.util.RandomSource;
import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.world.inventory.InventoryMenu;
import net.minecraft.world.item.ItemDisplayContext;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.ItemLike;
import net.minecraft.world.level.block.BaseFireBlock; import net.minecraft.world.level.block.BaseFireBlock;
@@ -35,7 +31,10 @@ import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.material.Fluid;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import net.minecraftforge.client.RenderTypeHelper; import net.minecraftforge.client.RenderTypeHelper;
import net.minecraftforge.fluids.FluidStack; import nl.requios.effortlessbuilding.create.foundation.gui.ILightingSettings;
import nl.requios.effortlessbuilding.create.foundation.gui.UIRenderHelper;
import nl.requios.effortlessbuilding.create.foundation.utility.Color;
import nl.requios.effortlessbuilding.create.foundation.utility.VecHelper;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@@ -125,9 +124,9 @@ public class GuiGameElement {
matrixStack.translate(xLocal, yLocal, zLocal); matrixStack.translate(xLocal, yLocal, zLocal);
UIRenderHelper.flipForGuiRender(matrixStack); UIRenderHelper.flipForGuiRender(matrixStack);
matrixStack.translate(rotationOffset.x, rotationOffset.y, rotationOffset.z); matrixStack.translate(rotationOffset.x, rotationOffset.y, rotationOffset.z);
matrixStack.mulPose(Vector3f.ZP.rotationDegrees((float) zRot)); matrixStack.mulPose(Axis.ZP.rotationDegrees((float) zRot));
matrixStack.mulPose(Vector3f.XP.rotationDegrees((float) xRot)); matrixStack.mulPose(Axis.XP.rotationDegrees((float) xRot));
matrixStack.mulPose(Vector3f.YP.rotationDegrees((float) yRot)); matrixStack.mulPose(Axis.YP.rotationDegrees((float) yRot));
matrixStack.translate(-rotationOffset.x, -rotationOffset.y, -rotationOffset.z); matrixStack.translate(-rotationOffset.x, -rotationOffset.y, -rotationOffset.z);
} }
@@ -162,7 +161,8 @@ public class GuiGameElement {
} }
@Override @Override
public void render(PoseStack matrixStack) { public void render(GuiGraphics graphics) {
PoseStack matrixStack = graphics.pose();
prepareMatrix(matrixStack); prepareMatrix(matrixStack);
Minecraft mc = Minecraft.getInstance(); Minecraft mc = Minecraft.getInstance();
@@ -184,19 +184,19 @@ public class GuiGameElement {
RenderType renderType = Sheets.translucentCullBlockSheet(); RenderType renderType = Sheets.translucentCullBlockSheet();
blockRenderer.getModelRenderer() blockRenderer.getModelRenderer()
.renderModel(ms.last(), buffer.getBuffer(renderType), blockState, blockModel, 1, 1, 1, .renderModel(ms.last(), buffer.getBuffer(renderType), blockState, blockModel, 1, 1, 1,
LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, ModelUtil.VIRTUAL_DATA, null); LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, VirtualRenderHelper.VIRTUAL_DATA, null);
} else { } else {
int color = Minecraft.getInstance() int color = Minecraft.getInstance()
.getBlockColors() .getBlockColors()
.getColor(blockState, null, null, 0); .getColor(blockState, null, null, 0);
Color rgb = new Color(color == -1 ? this.color : color); Color rgb = new Color(color == -1 ? this.color : color);
for (RenderType chunkType : blockModel.getRenderTypes(blockState, RandomSource.create(42L), ModelUtil.VIRTUAL_DATA)) { for (RenderType chunkType : blockModel.getRenderTypes(blockState, RandomSource.create(42L), VirtualRenderHelper.VIRTUAL_DATA)) {
RenderType renderType = RenderTypeHelper.getEntityRenderType(chunkType, true); RenderType renderType = RenderTypeHelper.getEntityRenderType(chunkType, true);
blockRenderer.getModelRenderer() blockRenderer.getModelRenderer()
.renderModel(ms.last(), buffer.getBuffer(renderType), blockState, blockModel, .renderModel(ms.last(), buffer.getBuffer(renderType), blockState, blockModel,
rgb.getRedAsFloat(), rgb.getGreenAsFloat(), rgb.getBlueAsFloat(), rgb.getRedAsFloat(), rgb.getGreenAsFloat(), rgb.getBlueAsFloat(),
LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, ModelUtil.VIRTUAL_DATA, chunkType); LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, VirtualRenderHelper.VIRTUAL_DATA, chunkType);
} }
} }
@@ -256,7 +256,8 @@ public class GuiGameElement {
} }
@Override @Override
public void render(PoseStack matrixStack) { public void render(GuiGraphics graphics) {
PoseStack matrixStack = graphics.pose();
prepareMatrix(matrixStack); prepareMatrix(matrixStack);
transformMatrix(matrixStack); transformMatrix(matrixStack);
renderItemIntoGUI(matrixStack, stack, customLighting == null); renderItemIntoGUI(matrixStack, stack, customLighting == null);
@@ -270,10 +271,11 @@ public class GuiGameElement {
renderer.textureManager.getTexture(InventoryMenu.BLOCK_ATLAS).setFilter(false, false); renderer.textureManager.getTexture(InventoryMenu.BLOCK_ATLAS).setFilter(false, false);
RenderSystem.setShaderTexture(0, InventoryMenu.BLOCK_ATLAS); RenderSystem.setShaderTexture(0, InventoryMenu.BLOCK_ATLAS);
RenderSystem.enableBlend(); RenderSystem.enableBlend();
RenderSystem.enableCull();
RenderSystem.blendFunc(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA); RenderSystem.blendFunc(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA);
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
matrixStack.pushPose(); matrixStack.pushPose();
matrixStack.translate(0, 0, 100.0F + renderer.blitOffset); matrixStack.translate(0, 0, 100.0F);
matrixStack.translate(8.0F, -8.0F, 0.0F); matrixStack.translate(8.0F, -8.0F, 0.0F);
matrixStack.scale(16.0F, 16.0F, 16.0F); matrixStack.scale(16.0F, 16.0F, 16.0F);
MultiBufferSource.BufferSource buffer = Minecraft.getInstance().renderBuffers().bufferSource(); MultiBufferSource.BufferSource buffer = Minecraft.getInstance().renderBuffers().bufferSource();
@@ -282,8 +284,10 @@ public class GuiGameElement {
Lighting.setupForFlatItems(); Lighting.setupForFlatItems();
} }
renderer.render(stack, ItemTransforms.TransformType.GUI, false, matrixStack, buffer, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, bakedModel); renderer.render(stack, ItemDisplayContext.GUI, false, matrixStack, buffer, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, bakedModel);
RenderSystem.disableDepthTest();
buffer.endBatch(); buffer.endBatch();
RenderSystem.enableDepthTest(); RenderSystem.enableDepthTest();
if (useDefaultLighting && flatLighting) { if (useDefaultLighting && flatLighting) {
Lighting.setupFor3DItems(); Lighting.setupFor3DItems();

View File

@@ -1,12 +1,12 @@
package nl.requios.effortlessbuilding.create.foundation.gui.element; package nl.requios.effortlessbuilding.create.foundation.gui.element;
import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.gui.GuiGraphics;
public abstract class RenderElement implements ScreenElement { public abstract class RenderElement implements ScreenElement {
public static final RenderElement EMPTY = new RenderElement() { public static final RenderElement EMPTY = new RenderElement() {
@Override @Override
public void render(PoseStack ms) { public void render(GuiGraphics graphics) {
} }
}; };
@@ -66,11 +66,11 @@ public abstract class RenderElement implements ScreenElement {
return z; return z;
} }
public abstract void render(PoseStack ms); public abstract void render(GuiGraphics graphics);
@Override @Override
public void render(PoseStack ms, int x, int y) { public void render(GuiGraphics graphics, int x, int y) {
this.at(x, y).render(ms); this.at(x, y).render(graphics);
} }
public static class SimpleRenderElement extends RenderElement { public static class SimpleRenderElement extends RenderElement {
@@ -82,8 +82,8 @@ public abstract class RenderElement implements ScreenElement {
} }
@Override @Override
public void render(PoseStack ms) { public void render(GuiGraphics graphics) {
renderable.render(ms, (int) x, (int) y); renderable.render(graphics, (int) x, (int) y);
} }
} }
} }

View File

@@ -1,12 +1,12 @@
package nl.requios.effortlessbuilding.create.foundation.gui.element; package nl.requios.effortlessbuilding.create.foundation.gui.element;
import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.gui.GuiGraphics;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
public interface ScreenElement { public interface ScreenElement {
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
void render(PoseStack ms, int x, int y); void render(GuiGraphics graphics, int x, int y);
} }

View File

@@ -1,27 +1,31 @@
package nl.requios.effortlessbuilding.create.foundation.gui.element; package nl.requios.effortlessbuilding.create.foundation.gui.element;
import org.lwjgl.opengl.GL11;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import org.lwjgl.opengl.GL11; import net.minecraft.client.gui.GuiGraphics;
public abstract class StencilElement extends RenderElement { public abstract class StencilElement extends RenderElement {
@Override @Override
public void render(PoseStack ms) { public void render(GuiGraphics graphics) {
PoseStack ms = graphics.pose();
ms.pushPose(); ms.pushPose();
transform(ms); transform(ms);
prepareStencil(ms); prepareStencil(ms);
renderStencil(ms); renderStencil(graphics);
prepareElement(ms); prepareElement(ms);
renderElement(ms); renderElement(graphics);
cleanUp(ms); cleanUp(ms);
ms.popPose(); ms.popPose();
} }
protected abstract void renderStencil(PoseStack ms); protected abstract void renderStencil(GuiGraphics graphics);
protected abstract void renderElement(PoseStack ms); protected abstract void renderElement(GuiGraphics graphics);
protected void transform(PoseStack ms) { protected void transform(PoseStack ms) {
ms.translate(x, y, z); ms.translate(x, y, z);

View File

@@ -1,9 +1,10 @@
package nl.requios.effortlessbuilding.create.foundation.gui.element; package nl.requios.effortlessbuilding.create.foundation.gui.element;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import nl.requios.effortlessbuilding.create.foundation.utility.Components;
import net.minecraft.client.gui.Font; import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.MutableComponent;
import nl.requios.effortlessbuilding.create.foundation.utility.Components;
public class TextStencilElement extends DelegatedStencilElement { public class TextStencilElement extends DelegatedStencilElement {
@@ -45,8 +46,7 @@ public class TextStencilElement extends DelegatedStencilElement {
} }
@Override @Override
protected void renderStencil(PoseStack ms) { protected void renderStencil(GuiGraphics graphics) {
float x = 0, y = 0; float x = 0, y = 0;
if (centerHorizontally) if (centerHorizontally)
x = width / 2f - font.width(component) / 2f; x = width / 2f - font.width(component) / 2f;
@@ -54,11 +54,11 @@ public class TextStencilElement extends DelegatedStencilElement {
if (centerVertically) if (centerVertically)
y = height / 2f - (font.lineHeight - 1) / 2f; y = height / 2f - (font.lineHeight - 1) / 2f;
font.draw(ms, component, x, y, 0xff_000000); graphics.drawString(font, component, Math.round(x), Math.round(y), 0xff_000000, false);
} }
@Override @Override
protected void renderElement(PoseStack ms) { protected void renderElement(GuiGraphics graphics) {
float x = 0, y = 0; float x = 0, y = 0;
if (centerHorizontally) if (centerHorizontally)
x = width / 2f - font.width(component) / 2f; x = width / 2f - font.width(component) / 2f;
@@ -66,9 +66,10 @@ public class TextStencilElement extends DelegatedStencilElement {
if (centerVertically) if (centerVertically)
y = height / 2f - (font.lineHeight - 1) / 2f; y = height / 2f - (font.lineHeight - 1) / 2f;
PoseStack ms = graphics.pose();
ms.pushPose(); ms.pushPose();
ms.translate(x, y, 0); ms.translate(x, y, 0);
element.render(ms, font.width(component), font.lineHeight + 2, alpha); element.render(graphics, font.width(component), font.lineHeight + 2, alpha);
ms.popPose(); ms.popPose();
} }

View File

@@ -1,11 +1,13 @@
package nl.requios.effortlessbuilding.create.foundation.gui.widget; package nl.requios.effortlessbuilding.create.foundation.gui.widget;
import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.gui.GuiGraphics;
import nl.requios.effortlessbuilding.create.foundation.gui.TickableGuiEventListener;
import nl.requios.effortlessbuilding.create.foundation.utility.Components;
import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraft.client.gui.narration.NarrationElementOutput; import net.minecraft.client.gui.narration.NarrationElementOutput;
import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipPositioner;
import net.minecraft.client.gui.screens.inventory.tooltip.DefaultTooltipPositioner;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import nl.requios.effortlessbuilding.create.foundation.gui.TickableGuiEventListener;
import nl.requios.effortlessbuilding.create.foundation.utility.Components;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.util.LinkedList; import java.util.LinkedList;
@@ -15,6 +17,7 @@ import java.util.function.BiConsumer;
public abstract class AbstractSimiWidget extends AbstractWidget implements TickableGuiEventListener { public abstract class AbstractSimiWidget extends AbstractWidget implements TickableGuiEventListener {
public static final int HEADER_RGB = 0x5391E1; public static final int HEADER_RGB = 0x5391E1;
public static final int HINT_RGB = 0x96B7E0;
protected float z; protected float z;
protected boolean wasHovered = false; protected boolean wasHovered = false;
@@ -36,6 +39,11 @@ public abstract class AbstractSimiWidget extends AbstractWidget implements Ticka
super(x, y, width, height, message); super(x, y, width, height, message);
} }
@Override
protected ClientTooltipPositioner createTooltipPositioner() {
return DefaultTooltipPositioner.INSTANCE;
}
public <T extends AbstractSimiWidget> T withCallback(BiConsumer<Integer, Integer> cb) { public <T extends AbstractSimiWidget> T withCallback(BiConsumer<Integer, Integer> cb) {
this.onClick = cb; this.onClick = cb;
//noinspection unchecked //noinspection unchecked
@@ -60,26 +68,22 @@ public abstract class AbstractSimiWidget extends AbstractWidget implements Ticka
public void tick() {} public void tick() {}
@Override @Override
public void render(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { public void renderWidget(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) {
if (visible) { beforeRender(graphics, mouseX, mouseY, partialTicks);
isHovered = mouseX >= x && mouseY >= y && mouseX < x + width && mouseY < y + height; doRender(graphics, mouseX, mouseY, partialTicks);
beforeRender(ms, mouseX, mouseY, partialTicks); afterRender(graphics, mouseX, mouseY, partialTicks);
renderButton(ms, mouseX, mouseY, partialTicks);
afterRender(ms, mouseX, mouseY, partialTicks);
wasHovered = isHoveredOrFocused(); wasHovered = isHoveredOrFocused();
} }
protected void beforeRender(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) {
graphics.pose().pushPose();
} }
protected void beforeRender(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { protected void doRender(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) {
ms.pushPose();
} }
@Override protected void afterRender(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) {
public void renderButton(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { graphics.pose().popPose();
}
protected void afterRender(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) {
ms.popPose();
} }
public void runCallback(double mouseX, double mouseY) { public void runCallback(double mouseX, double mouseY) {
@@ -92,7 +96,7 @@ public abstract class AbstractSimiWidget extends AbstractWidget implements Ticka
} }
@Override @Override
public void updateNarration(NarrationElementOutput pNarrationElementOutput) { public void updateWidgetNarration(NarrationElementOutput pNarrationElementOutput) {
defaultButtonNarrationText(pNarrationElementOutput); defaultButtonNarrationText(pNarrationElementOutput);
} }
} }

View File

@@ -1,8 +1,7 @@
package nl.requios.effortlessbuilding.create.foundation.gui.widget; package nl.requios.effortlessbuilding.create.foundation.gui.widget;
import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.gui.GuiGraphics;
import nl.requios.effortlessbuilding.create.foundation.gui.Theme; import nl.requios.effortlessbuilding.create.foundation.gui.Theme;
import nl.requios.effortlessbuilding.create.foundation.gui.Theme.Key;
import nl.requios.effortlessbuilding.create.foundation.gui.UIRenderHelper; import nl.requios.effortlessbuilding.create.foundation.gui.UIRenderHelper;
import nl.requios.effortlessbuilding.create.foundation.gui.element.BoxElement; import nl.requios.effortlessbuilding.create.foundation.gui.element.BoxElement;
import nl.requios.effortlessbuilding.create.foundation.gui.element.DelegatedStencilElement; import nl.requios.effortlessbuilding.create.foundation.gui.element.DelegatedStencilElement;
@@ -10,7 +9,6 @@ import nl.requios.effortlessbuilding.create.foundation.utility.Color;
import nl.requios.effortlessbuilding.create.foundation.utility.Couple; import nl.requios.effortlessbuilding.create.foundation.utility.Couple;
import nl.requios.effortlessbuilding.create.foundation.utility.animation.LerpedFloat; import nl.requios.effortlessbuilding.create.foundation.utility.animation.LerpedFloat;
import javax.annotation.Nonnull;
import java.util.function.Function; import java.util.function.Function;
public class BoxWidget extends ElementWidget { public class BoxWidget extends ElementWidget {
@@ -98,8 +96,8 @@ public class BoxWidget extends ElementWidget {
} }
@Override @Override
protected void beforeRender(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { protected void beforeRender(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) {
super.beforeRender(ms, mouseX, mouseY, partialTicks); super.beforeRender(graphics, mouseX, mouseY, partialTicks);
if (isHovered != wasHovered) { if (isHovered != wasHovered) {
startGradientAnimation( startGradientAnimation(
@@ -121,7 +119,7 @@ public class BoxWidget extends ElementWidget {
} }
@Override @Override
public void renderButton(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { public void doRender(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) {
float fadeValue = fade.getValue(partialTicks); float fadeValue = fade.getValue(partialTicks);
if (fadeValue < .1f) if (fadeValue < .1f)
return; return;
@@ -129,11 +127,11 @@ public class BoxWidget extends ElementWidget {
box.withAlpha(fadeValue); box.withAlpha(fadeValue);
box.withBackground(customBackground != null ? customBackground : Theme.c(Theme.Key.PONDER_BACKGROUND_TRANSPARENT)) box.withBackground(customBackground != null ? customBackground : Theme.c(Theme.Key.PONDER_BACKGROUND_TRANSPARENT))
.gradientBorder(gradientColor1, gradientColor2) .gradientBorder(gradientColor1, gradientColor2)
.at(x, y, z) .at(getX(), getY(), z)
.withBounds(width, height) .withBounds(width, height)
.render(ms); .render(graphics);
super.renderButton(ms, mouseX, mouseY, partialTicks); super.doRender(graphics, mouseX, mouseY, partialTicks);
wasHovered = isHovered; wasHovered = isHovered;
} }
@@ -146,7 +144,7 @@ public class BoxWidget extends ElementWidget {
float padX = 2 + paddingX; float padX = 2 + paddingX;
float padY = 2 + paddingY; float padY = 2 + paddingY;
return x - padX <= mX && y - padY <= mY && mX < x + padX + width && mY < y + padY + height; return getX() - padX <= mX && getY() - padY <= mY && mX < getX() + padX + width && mY < getY() + padY + height;
} }
@Override @Override
@@ -209,19 +207,19 @@ public class BoxWidget extends ElementWidget {
return customBorderBot != null ? customBorderBot : Theme.c(getIdleTheme(), false); return customBorderBot != null ? customBorderBot : Theme.c(getIdleTheme(), false);
} }
public Key getDisabledTheme() { public Theme.Key getDisabledTheme() {
return Theme.Key.BUTTON_DISABLE; return Theme.Key.BUTTON_DISABLE;
} }
public Key getIdleTheme() { public Theme.Key getIdleTheme() {
return Theme.Key.BUTTON_IDLE; return Theme.Key.BUTTON_IDLE;
} }
public Key getHoverTheme() { public Theme.Key getHoverTheme() {
return Theme.Key.BUTTON_HOVER; return Theme.Key.BUTTON_HOVER;
} }
public Key getClickTheme() { public Theme.Key getClickTheme() {
return Theme.Key.BUTTON_CLICK; return Theme.Key.BUTTON_CLICK;
} }

View File

@@ -1,11 +1,11 @@
package nl.requios.effortlessbuilding.create.foundation.gui.widget; package nl.requios.effortlessbuilding.create.foundation.gui.widget;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.gui.GuiGraphics;
import nl.requios.effortlessbuilding.create.foundation.gui.element.RenderElement; import nl.requios.effortlessbuilding.create.foundation.gui.element.RenderElement;
import nl.requios.effortlessbuilding.create.foundation.gui.element.ScreenElement; import nl.requios.effortlessbuilding.create.foundation.gui.element.ScreenElement;
import nl.requios.effortlessbuilding.create.foundation.utility.animation.LerpedFloat; import nl.requios.effortlessbuilding.create.foundation.utility.animation.LerpedFloat;
import javax.annotation.Nonnull;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.UnaryOperator; import java.util.function.UnaryOperator;
@@ -117,21 +117,22 @@ public class ElementWidget extends AbstractSimiWidget {
} }
@Override @Override
protected void beforeRender(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { protected void beforeRender(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) {
super.beforeRender(ms, mouseX, mouseY, partialTicks); super.beforeRender(graphics, mouseX, mouseY, partialTicks);
isHovered = isMouseOver(mouseX, mouseY); isHovered = isMouseOver(mouseX, mouseY);
float fadeValue = fade.getValue(partialTicks); float fadeValue = fade.getValue(partialTicks);
element.withAlpha(fadeValue); element.withAlpha(fadeValue);
if (fadeValue < 1) { if (fadeValue < 1) {
ms.translate((1 - fadeValue) * fadeModX, (1 - fadeValue) * fadeModY, 0); graphics.pose().translate((1 - fadeValue) * fadeModX, (1 - fadeValue) * fadeModY, 0);
} }
} }
@Override @Override
public void renderButton(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { public void doRender(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) {
PoseStack ms = graphics.pose();
ms.pushPose(); ms.pushPose();
ms.translate(x + paddingX, y + paddingY, z); ms.translate(getX() + paddingX, getY() + paddingY, z);
float innerWidth = width - 2 * paddingX; float innerWidth = width - 2 * paddingX;
float innerHeight = height - 2 * paddingY; float innerHeight = height - 2 * paddingY;
float eX = element.getX(), eY = element.getY(); float eX = element.getX(), eY = element.getY();
@@ -143,7 +144,7 @@ public class ElementWidget extends AbstractSimiWidget {
innerWidth /= xScale; innerWidth /= xScale;
innerHeight /= yScale; innerHeight /= yScale;
} }
element.withBounds((int) innerWidth, (int) innerHeight).render(ms); element.withBounds((int) innerWidth, (int) innerHeight).render(graphics);
ms.popPose(); ms.popPose();
if (rescaleElement) { if (rescaleElement) {
element.at(eX, eY); element.at(eX, eY);

View File

@@ -1,12 +1,10 @@
package nl.requios.effortlessbuilding.create.foundation.gui.widget; package nl.requios.effortlessbuilding.create.foundation.gui.widget;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.network.chat.Component;
import nl.requios.effortlessbuilding.create.foundation.gui.AllGuiTextures; import nl.requios.effortlessbuilding.create.foundation.gui.AllGuiTextures;
import nl.requios.effortlessbuilding.create.foundation.gui.element.ScreenElement; import nl.requios.effortlessbuilding.create.foundation.gui.element.ScreenElement;
import net.minecraft.network.chat.Component;
import javax.annotation.Nonnull;
public class IconButton extends AbstractSimiWidget { public class IconButton extends AbstractSimiWidget {
@@ -22,22 +20,21 @@ public class IconButton extends AbstractSimiWidget {
} }
@Override @Override
public void renderButton(@Nonnull PoseStack matrixStack, int mouseX, int mouseY, float partialTicks) { public void doRender(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) {
if (visible) { if (visible) {
isHovered = mouseX >= x && mouseY >= y && mouseX < x + width && mouseY < y + height; isHovered = mouseX >= getX() && mouseY >= getY() && mouseX < getX() + width && mouseY < getY() + height;
AllGuiTextures button = !active ? AllGuiTextures.BUTTON_DOWN AllGuiTextures button = !active ? AllGuiTextures.BUTTON_DOWN
: isHoveredOrFocused() ? AllGuiTextures.BUTTON_HOVER : AllGuiTextures.BUTTON; : isMouseOver(mouseX, mouseY) ? AllGuiTextures.BUTTON_HOVER : AllGuiTextures.BUTTON;
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F);
drawBg(matrixStack, button); drawBg(graphics, button);
icon.render(matrixStack, x + 1, y + 1); icon.render(graphics, getX() + 1, getY() + 1);
} }
} }
protected void drawBg(PoseStack matrixStack, AllGuiTextures button) { protected void drawBg(GuiGraphics graphics, AllGuiTextures button) {
AllGuiTextures.BUTTON.bind(); graphics.blit(button.location, getX(), getY(), button.startX, button.startY, button.width, button.height);
blit(matrixStack, x, y, button.startX, button.startY, button.width, button.height);
} }
public void setToolTip(Component text) { public void setToolTip(Component text) {

View File

@@ -1,11 +1,9 @@
package nl.requios.effortlessbuilding.create.foundation.gui.widget; package nl.requios.effortlessbuilding.create.foundation.gui.widget;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.gui.GuiGraphics;
import nl.requios.effortlessbuilding.create.foundation.gui.AllGuiTextures;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import nl.requios.effortlessbuilding.create.foundation.gui.AllGuiTextures;
import javax.annotation.Nonnull;
public class Indicator extends AbstractSimiWidget { public class Indicator extends AbstractSimiWidget {
@@ -13,12 +11,12 @@ public class Indicator extends AbstractSimiWidget {
public Indicator(int x, int y, Component tooltip) { public Indicator(int x, int y, Component tooltip) {
super(x, y, AllGuiTextures.INDICATOR.width, AllGuiTextures.INDICATOR.height); super(x, y, AllGuiTextures.INDICATOR.width, AllGuiTextures.INDICATOR.height);
this.toolTip = ImmutableList.of(tooltip); this.toolTip = toolTip.isEmpty() ? ImmutableList.of() : ImmutableList.of(tooltip);
this.state = State.OFF; this.state = State.OFF;
} }
@Override @Override
public void render(@Nonnull PoseStack matrixStack, int mouseX, int mouseY, float partialTicks ) { public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks ) {
if (!visible) if (!visible)
return; return;
AllGuiTextures toDraw; AllGuiTextures toDraw;
@@ -30,7 +28,7 @@ public class Indicator extends AbstractSimiWidget {
case GREEN: toDraw = AllGuiTextures.INDICATOR_GREEN; break; case GREEN: toDraw = AllGuiTextures.INDICATOR_GREEN; break;
default: toDraw = AllGuiTextures.INDICATOR; break; default: toDraw = AllGuiTextures.INDICATOR; break;
} }
toDraw.render(matrixStack, x, y, this); toDraw.render(graphics, getX(), getY());
} }
public enum State { public enum State {

View File

@@ -1,12 +1,12 @@
package nl.requios.effortlessbuilding.create.foundation.gui.widget; package nl.requios.effortlessbuilding.create.foundation.gui.widget;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
import nl.requios.effortlessbuilding.create.foundation.utility.Components;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font; import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.MutableComponent;
import nl.requios.effortlessbuilding.create.foundation.utility.Components;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
@@ -70,7 +70,7 @@ public class Label extends AbstractSimiWidget {
} }
@Override @Override
public void renderButton(@Nonnull PoseStack matrixStack, int mouseX, int mouseY, float partialTicks) { protected void doRender(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) {
if (text == null || text.getString().isEmpty()) if (text == null || text.getString().isEmpty())
return; return;
@@ -79,10 +79,7 @@ public class Label extends AbstractSimiWidget {
if (suffix != null && !suffix.isEmpty()) if (suffix != null && !suffix.isEmpty())
copy.append(suffix); copy.append(suffix);
if (hasShadow) graphics.drawString(font, copy, getX(), getY(), color, hasShadow);
font.drawShadow(matrixStack, copy, x, y, color);
else
font.draw(matrixStack, copy, x, y, color);
} }
} }

View File

@@ -1,14 +1,11 @@
package nl.requios.effortlessbuilding.create.foundation.gui.widget; package nl.requios.effortlessbuilding.create.foundation.gui.widget;
import nl.requios.effortlessbuilding.create.AllKeys;
//import nl.requios.effortlessbuilding.create.AllSoundEvents;
import nl.requios.effortlessbuilding.create.foundation.utility.Components;
import nl.requios.effortlessbuilding.create.foundation.utility.Lang;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
import net.minecraft.client.Minecraft;
//import net.minecraft.client.resources.sounds.SimpleSoundInstance;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.MutableComponent;
import nl.requios.effortlessbuilding.create.AllKeys;
import nl.requios.effortlessbuilding.create.foundation.utility.Components;
import nl.requios.effortlessbuilding.create.foundation.utility.Lang;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Function; import java.util.function.Function;
@@ -20,8 +17,10 @@ public class ScrollInput extends AbstractSimiWidget {
protected Component title = Lang.translateDirect("gui.scrollInput.defaultTitle"); protected Component title = Lang.translateDirect("gui.scrollInput.defaultTitle");
protected final Component scrollToModify = Lang.translateDirect("gui.scrollInput.scrollToModify"); protected final Component scrollToModify = Lang.translateDirect("gui.scrollInput.scrollToModify");
protected final Component shiftScrollsFaster = Lang.translateDirect("gui.scrollInput.shiftScrollsFaster"); protected final Component shiftScrollsFaster = Lang.translateDirect("gui.scrollInput.shiftScrollsFaster");
protected Component hint = null;
protected Label displayLabel; protected Label displayLabel;
protected boolean inverted; protected boolean inverted;
protected boolean soundPlayed;
protected Function<Integer, Component> formatter; protected Function<Integer, Component> formatter;
protected int min, max; protected int min, max;
@@ -36,6 +35,7 @@ public class ScrollInput extends AbstractSimiWidget {
shiftStep = 5; shiftStep = 5;
step = standardStep(); step = standardStep();
formatter = i -> Components.literal(String.valueOf(i)); formatter = i -> Components.literal(String.valueOf(i));
soundPlayed = false;
} }
public Function<StepContext, Integer> standardStep() { public Function<StepContext, Integer> standardStep() {
@@ -74,6 +74,12 @@ public class ScrollInput extends AbstractSimiWidget {
return this; return this;
} }
public ScrollInput addHint(MutableComponent hint) {
this.hint = hint;
updateTooltip();
return this;
}
public ScrollInput withStepFunction(Function<StepContext, Integer> step) { public ScrollInput withStepFunction(Function<StepContext, Integer> step) {
this.step = step; this.step = step;
return this; return this;
@@ -86,6 +92,12 @@ public class ScrollInput extends AbstractSimiWidget {
return this; return this;
} }
@Override
public void tick() {
super.tick();
soundPlayed = false;
}
public int getState() { public int getState() {
return state; return state;
} }
@@ -128,7 +140,12 @@ public class ScrollInput extends AbstractSimiWidget {
clampState(); clampState();
if (priorState != state) { if (priorState != state) {
// Minecraft.getInstance().getSoundManager().play(SimpleSoundInstance.forUI(AllSoundEvents.SCROLL_VALUE.getMainEvent(), 1.5f + 0.1f * (state-min)/(max-min))); // if (!soundPlayed)
// Minecraft.getInstance()
// .getSoundManager()
// .play(SimpleSoundInstance.forUI(AllSoundEvents.SCROLL_VALUE.getMainEvent(),
// 1.5f + 0.1f * (state - min) / (max - min)));
// soundPlayed = true;
onChanged(); onChanged();
} }
@@ -161,6 +178,9 @@ public class ScrollInput extends AbstractSimiWidget {
return; return;
toolTip.add(title.plainCopy() toolTip.add(title.plainCopy()
.withStyle(s -> s.withColor(HEADER_RGB))); .withStyle(s -> s.withColor(HEADER_RGB)));
if (hint != null)
toolTip.add(hint.plainCopy()
.withStyle(s -> s.withColor(HINT_RGB)));
toolTip.add(scrollToModify.plainCopy() toolTip.add(scrollToModify.plainCopy()
.withStyle(ChatFormatting.ITALIC, ChatFormatting.DARK_GRAY)); .withStyle(ChatFormatting.ITALIC, ChatFormatting.DARK_GRAY));
toolTip.add(shiftScrollsFaster.plainCopy() toolTip.add(shiftScrollsFaster.plainCopy()

View File

@@ -1,10 +1,10 @@
package nl.requios.effortlessbuilding.create.foundation.gui.widget; package nl.requios.effortlessbuilding.create.foundation.gui.widget;
import nl.requios.effortlessbuilding.create.foundation.utility.Components;
import nl.requios.effortlessbuilding.create.foundation.utility.Lang;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.MutableComponent;
import nl.requios.effortlessbuilding.create.foundation.utility.Components;
import nl.requios.effortlessbuilding.create.foundation.utility.Lang;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -42,7 +42,8 @@ public class SelectionScrollInput extends ScrollInput {
if (this.min + 1 == min) if (this.min + 1 == min)
min--; min--;
if (min > this.min) if (min > this.min)
toolTip.add(Components.literal("> ...").withStyle(ChatFormatting.GRAY)); toolTip.add(Components.literal("> ...")
.withStyle(ChatFormatting.GRAY));
if (this.max - 1 == max) if (this.max - 1 == max)
max++; max++;
for (int i = min; i < max; i++) { for (int i = min; i < max; i++) {
@@ -58,8 +59,12 @@ public class SelectionScrollInput extends ScrollInput {
.withStyle(ChatFormatting.GRAY)); .withStyle(ChatFormatting.GRAY));
} }
if (max < this.max) if (max < this.max)
toolTip.add(Components.literal("> ...").withStyle(ChatFormatting.GRAY)); toolTip.add(Components.literal("> ...")
.withStyle(ChatFormatting.GRAY));
if (hint != null)
toolTip.add(hint.plainCopy()
.withStyle(s -> s.withColor(HINT_RGB)));
toolTip.add(scrollToSelect.plainCopy() toolTip.add(scrollToSelect.plainCopy()
.withStyle(ChatFormatting.DARK_GRAY, ChatFormatting.ITALIC)); .withStyle(ChatFormatting.DARK_GRAY, ChatFormatting.ITALIC));
} }

View File

@@ -1,10 +1,10 @@
package nl.requios.effortlessbuilding.create.foundation.gui.widget; package nl.requios.effortlessbuilding.create.foundation.gui.widget;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.network.chat.Component;
import java.util.List; import java.util.List;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.network.chat.Component;
public class TooltipArea extends AbstractSimiWidget { public class TooltipArea extends AbstractSimiWidget {
public TooltipArea(int x, int y, int width, int height) { public TooltipArea(int x, int y, int width, int height) {
@@ -12,9 +12,9 @@ public class TooltipArea extends AbstractSimiWidget {
} }
@Override @Override
public void renderButton(PoseStack ms, int mouseX, int mouseY, float partialTicks) { public void renderWidget(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) {
if (visible) if (visible)
isHovered = mouseX >= x && mouseY >= y && mouseX < x + width && mouseY < y + height; isHovered = mouseX >= getX() && mouseY >= getY() && mouseX < getX() + width && mouseY < getY() + height;
} }
public TooltipArea withTooltip(List<Component> tooltip) { public TooltipArea withTooltip(List<Component> tooltip) {

View File

@@ -122,7 +122,7 @@ public class ItemHelper {
return true; return true;
if (stacks1.length == stacks2.length) { if (stacks1.length == stacks2.length) {
for (int i = 0; i < stacks1.length; i++) for (int i = 0; i < stacks1.length; i++)
if (!ItemStack.isSame(stacks1[i], stacks2[i])) if (!ItemStack.isSameItem(stacks1[i], stacks2[i]))
return false; return false;
return true; return true;
} }

View File

@@ -1,10 +1,7 @@
package nl.requios.effortlessbuilding.create.foundation.item; package nl.requios.effortlessbuilding.create.foundation.item;
import net.minecraft.core.NonNullList;
import net.minecraft.tags.TagKey; import net.minecraft.tags.TagKey;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.tags.ITagManager; import net.minecraftforge.registries.tags.ITagManager;
@@ -17,12 +14,6 @@ public class TagDependentIngredientItem extends Item {
this.tag = tag; this.tag = tag;
} }
@Override
public void fillItemCategory(CreativeModeTab tab, NonNullList<ItemStack> list) {
if (!shouldHide())
super.fillItemCategory(tab, list);
}
public boolean shouldHide() { public boolean shouldHide() {
ITagManager<Item> tagManager = ForgeRegistries.ITEMS.tags(); ITagManager<Item> tagManager = ForgeRegistries.ITEMS.tags();
return !tagManager.isKnownTagName(tag) || tagManager.getTag(tag).isEmpty(); return !tagManager.isKnownTagName(tag) || tagManager.getTag(tag).isEmpty();

View File

@@ -1,32 +1,33 @@
package nl.requios.effortlessbuilding.create.foundation.item; package nl.requios.effortlessbuilding.create.foundation.item;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.mojang.bridge.game.Language;
import nl.requios.effortlessbuilding.create.foundation.item.ItemDescription.Palette;
import nl.requios.effortlessbuilding.create.foundation.utility.Components;
import nl.requios.effortlessbuilding.create.foundation.utility.Couple;
import nl.requios.effortlessbuilding.create.foundation.utility.FontHelper;
import nl.requios.effortlessbuilding.create.foundation.utility.Lang;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font; import net.minecraft.client.gui.Font;
import net.minecraft.client.resources.language.I18n; import net.minecraft.client.resources.language.I18n;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.MutableComponent;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.ItemLike;
import nl.requios.effortlessbuilding.create.foundation.item.ItemDescription.Palette;
import nl.requios.effortlessbuilding.create.foundation.utility.Components;
import nl.requios.effortlessbuilding.create.foundation.utility.Couple;
import nl.requios.effortlessbuilding.create.foundation.utility.FontHelper;
import nl.requios.effortlessbuilding.create.foundation.utility.Lang;
import java.text.BreakIterator; import java.text.BreakIterator;
import java.util.*; import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier; import java.util.function.Supplier;
public class TooltipHelper { public class TooltipHelper {
public static final int maxWidthPerLine = 200; public static final int maxWidthPerLine = 200;
public static final Map<String, ItemDescription> cachedTooltips = new HashMap<>(); public static final Map<String, ItemDescription> cachedTooltips = new HashMap<>();
public static Language cachedLanguage;
private static boolean gogglesMode; private static boolean gogglesMode;
private static final Map<Item, Supplier<String>> tooltipReferrals = new HashMap<>(); private static final Map<Item, Supplier<String>> tooltipReferrals = new HashMap<>();
@@ -212,36 +213,6 @@ public class TooltipHelper {
// return lines; // return lines;
// } // }
private static void checkLocale() {
Language currentLanguage = Minecraft.getInstance()
.getLanguageManager()
.getSelected();
if (cachedLanguage != currentLanguage) {
cachedTooltips.clear();
cachedLanguage = currentLanguage;
}
}
public static boolean hasTooltip(ItemStack stack, Player player) {
checkLocale();
String key = getTooltipTranslationKey(stack);
if (cachedTooltips.containsKey(key))
return cachedTooltips.get(key) != ItemDescription.MISSING;
return findTooltip(stack);
}
public static ItemDescription getTooltip(ItemStack stack) {
checkLocale();
String key = getTooltipTranslationKey(stack);
if (cachedTooltips.containsKey(key)) {
ItemDescription itemDescription = cachedTooltips.get(key);
if (itemDescription != ItemDescription.MISSING)
return itemDescription;
}
return null;
}
private static boolean findTooltip(ItemStack stack) { private static boolean findTooltip(ItemStack stack) {
String key = getTooltipTranslationKey(stack); String key = getTooltipTranslationKey(stack);
if (I18n.exists(key)) { if (I18n.exists(key)) {

View File

@@ -1,12 +0,0 @@
package nl.requios.effortlessbuilding.create.foundation.item.render;
import nl.requios.effortlessbuilding.create.Create;
import net.minecraft.client.resources.model.BakedModel;
public abstract class CreateCustomRenderedItemModel extends CustomRenderedItemModel {
public CreateCustomRenderedItemModel(BakedModel template, String basePath) {
super(template, Create.ID, basePath);
}
}

View File

@@ -1,29 +1,14 @@
package nl.requios.effortlessbuilding.create.foundation.item.render; package nl.requios.effortlessbuilding.create.foundation.item.render;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.renderer.block.model.ItemTransforms;
import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.client.resources.model.BlockModelRotation; import net.minecraft.world.item.ItemDisplayContext;
import net.minecraft.client.resources.model.ModelBakery;
import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.client.event.ModelEvent;
import net.minecraftforge.client.model.BakedModelWrapper; import net.minecraftforge.client.model.BakedModelWrapper;
import java.util.HashMap; public class CustomRenderedItemModel extends BakedModelWrapper<BakedModel> {
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public abstract class CustomRenderedItemModel extends BakedModelWrapper<BakedModel> { public CustomRenderedItemModel(BakedModel originalModel) {
super(originalModel);
protected String namespace;
protected String basePath;
protected Map<String, BakedModel> partials = new HashMap<>();
public CustomRenderedItemModel(BakedModel template, String namespace, String basePath) {
super(template);
this.namespace = namespace;
this.basePath = basePath;
} }
@Override @Override
@@ -32,43 +17,16 @@ public abstract class CustomRenderedItemModel extends BakedModelWrapper<BakedMod
} }
@Override @Override
public BakedModel applyTransform(ItemTransforms.TransformType cameraTransformType, PoseStack mat, boolean leftHand) { public BakedModel applyTransform(ItemDisplayContext cameraItemDisplayContext, PoseStack mat,
// Super call returns originalModel, but we want to return this, else ISTER boolean leftHand) {
// Super call returns originalModel, but we want to return this, else BEWLR
// won't be used. // won't be used.
super.applyTransform(cameraTransformType, mat, leftHand); super.applyTransform(cameraItemDisplayContext, mat, leftHand);
return this; return this;
} }
public final BakedModel getOriginalModel() { public BakedModel getOriginalModel() {
return originalModel; return originalModel;
} }
public BakedModel getPartial(String name) {
return partials.get(name);
}
public final List<ResourceLocation> getModelLocations() {
return partials.keySet().stream().map(this::getPartialModelLocation).collect(Collectors.toList());
}
protected void addPartials(String... partials) {
for (String name : partials)
this.partials.put(name, null);
}
public void loadPartials(ModelEvent.BakingCompleted event) {
ModelBakery modelLoader = event.getModelBakery();
for (String name : partials.keySet())
partials.put(name, loadPartial(modelLoader, name));
}
@SuppressWarnings("deprecation")
protected BakedModel loadPartial(ModelBakery modelLoader, String name) {
return modelLoader.bake(getPartialModelLocation(name), BlockModelRotation.X0_Y0);
}
protected ResourceLocation getPartialModelLocation(String name) {
return new ResourceLocation(namespace, "item/" + basePath + "/" + name);
}
} }

View File

@@ -2,19 +2,19 @@ package nl.requios.effortlessbuilding.create.foundation.item.render;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexConsumer;
import nl.requios.effortlessbuilding.create.foundation.render.RenderTypes;
import nl.requios.effortlessbuilding.create.foundation.utility.Iterate;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.block.model.ItemTransforms;
import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.client.renderer.entity.ItemRenderer;
import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.util.RandomSource; import net.minecraft.util.RandomSource;
import net.minecraft.world.item.ItemDisplayContext;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraftforge.client.extensions.common.IClientItemExtensions; import net.minecraftforge.client.extensions.common.IClientItemExtensions;
import net.minecraftforge.client.model.data.ModelData; import net.minecraftforge.client.model.data.ModelData;
import nl.requios.effortlessbuilding.create.foundation.render.RenderTypes;
import nl.requios.effortlessbuilding.create.foundation.utility.Iterate;
public class PartialItemModelRenderer { public class PartialItemModelRenderer {
@@ -23,12 +23,12 @@ public class PartialItemModelRenderer {
private final RandomSource random = RandomSource.create(); private final RandomSource random = RandomSource.create();
private ItemStack stack; private ItemStack stack;
private ItemTransforms.TransformType transformType; private ItemDisplayContext transformType;
private PoseStack ms; private PoseStack ms;
private MultiBufferSource buffer; private MultiBufferSource buffer;
private int overlay; private int overlay;
public static PartialItemModelRenderer of(ItemStack stack, ItemTransforms.TransformType transformType, public static PartialItemModelRenderer of(ItemStack stack, ItemDisplayContext transformType,
PoseStack ms, MultiBufferSource buffer, int overlay) { PoseStack ms, MultiBufferSource buffer, int overlay) {
PartialItemModelRenderer instance = INSTANCE; PartialItemModelRenderer instance = INSTANCE;
instance.stack = stack; instance.stack = stack;

View File

@@ -5,10 +5,8 @@ import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraftforge.network.NetworkEvent.Context; import net.minecraftforge.network.NetworkEvent.Context;
import net.minecraftforge.network.PacketDistributor;
import java.util.HashSet; import java.util.HashSet;
import java.util.function.Supplier;
public interface ISyncPersistentData { public interface ISyncPersistentData {
@@ -37,9 +35,8 @@ public interface ISyncPersistentData {
} }
@Override @Override
public void handle(Supplier<Context> context) { public boolean handle(Context context) {
context.get() context.enqueueWork(() -> {
.enqueueWork(() -> {
Entity entityByID = Minecraft.getInstance().level.getEntity(entityId); Entity entityByID = Minecraft.getInstance().level.getEntity(entityId);
CompoundTag data = entityByID.getPersistentData(); CompoundTag data = entityByID.getPersistentData();
new HashSet<>(data.getAllKeys()).forEach(data::remove); new HashSet<>(data.getAllKeys()).forEach(data::remove);
@@ -48,8 +45,7 @@ public interface ISyncPersistentData {
return; return;
((ISyncPersistentData) entityByID).onPersistentDataUpdated(); ((ISyncPersistentData) entityByID).onPersistentDataUpdated();
}); });
context.get() return true;
.setPacketHandled(true);
} }
} }

View File

@@ -3,12 +3,10 @@ package nl.requios.effortlessbuilding.create.foundation.networking;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraftforge.network.NetworkEvent.Context; import net.minecraftforge.network.NetworkEvent.Context;
import java.util.function.Supplier;
public abstract class SimplePacketBase { public abstract class SimplePacketBase {
public abstract void write(FriendlyByteBuf buffer); public abstract void write(FriendlyByteBuf buffer);
public abstract void handle(Supplier<Context> context); public abstract boolean handle(Context context);
} }

View File

@@ -1,32 +0,0 @@
package nl.requios.effortlessbuilding.create.foundation.render;
import com.jozufozu.flywheel.core.model.ModelUtil;
import com.jozufozu.flywheel.core.model.ShadeSeparatedBufferedData;
import com.jozufozu.flywheel.util.Pair;
import com.mojang.blaze3d.vertex.BufferBuilder.RenderedBuffer;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.block.BlockRenderDispatcher;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.world.level.block.state.BlockState;
public class BakedModelRenderHelper {
public static SuperByteBuffer standardBlockRender(BlockState renderedState) {
BlockRenderDispatcher dispatcher = Minecraft.getInstance()
.getBlockRenderer();
return standardModelRender(dispatcher.getBlockModel(renderedState), renderedState);
}
public static SuperByteBuffer standardModelRender(BakedModel model, BlockState referenceState) {
return standardModelRender(model, referenceState, new PoseStack());
}
public static SuperByteBuffer standardModelRender(BakedModel model, BlockState referenceState, PoseStack ms) {
ShadeSeparatedBufferedData data = ModelUtil.getBufferedData(model, referenceState, ms);
SuperByteBuffer sbb = new SuperByteBuffer(data);
data.release();
return sbb;
}
}

View File

@@ -1,88 +0,0 @@
package nl.requios.effortlessbuilding.create.foundation.render;
import com.jozufozu.flywheel.core.PartialModel;
import com.jozufozu.flywheel.util.transform.TransformStack;
import com.mojang.blaze3d.vertex.PoseStack;
import nl.requios.effortlessbuilding.EffortlessBuildingClient;
import nl.requios.effortlessbuilding.create.CreateClient;
import nl.requios.effortlessbuilding.create.foundation.render.SuperByteBufferCache.Compartment;
import nl.requios.effortlessbuilding.create.foundation.utility.AngleHelper;
import net.minecraft.core.Direction;
import net.minecraft.world.level.block.state.BlockState;
import org.apache.commons.lang3.tuple.Pair;
import java.util.function.Supplier;
import static net.minecraft.world.level.block.state.properties.BlockStateProperties.FACING;
public class CachedBufferer {
public static final Compartment<BlockState> GENERIC_TILE = new Compartment<>();
public static final Compartment<PartialModel> PARTIAL = new Compartment<>();
public static final Compartment<Pair<Direction, PartialModel>> DIRECTIONAL_PARTIAL = new Compartment<>();
public static SuperByteBuffer block(BlockState toRender) {
return block(GENERIC_TILE, toRender);
}
public static SuperByteBuffer block(Compartment<BlockState> compartment, BlockState toRender) {
return CreateClient.BUFFER_CACHE.get(compartment, toRender, () -> BakedModelRenderHelper.standardBlockRender(toRender));
}
public static SuperByteBuffer partial(PartialModel partial, BlockState referenceState) {
return CreateClient.BUFFER_CACHE.get(PARTIAL, partial,
() -> BakedModelRenderHelper.standardModelRender(partial.get(), referenceState));
}
public static SuperByteBuffer partial(PartialModel partial, BlockState referenceState,
Supplier<PoseStack> modelTransform) {
return CreateClient.BUFFER_CACHE.get(PARTIAL, partial,
() -> BakedModelRenderHelper.standardModelRender(partial.get(), referenceState, modelTransform.get()));
}
public static SuperByteBuffer partialFacing(PartialModel partial, BlockState referenceState) {
Direction facing = referenceState.getValue(FACING);
return partialFacing(partial, referenceState, facing);
}
public static SuperByteBuffer partialFacing(PartialModel partial, BlockState referenceState, Direction facing) {
return partialDirectional(partial, referenceState, facing,
rotateToFace(facing));
}
public static SuperByteBuffer partialFacingVertical(PartialModel partial, BlockState referenceState, Direction facing) {
return partialDirectional(partial, referenceState, facing,
rotateToFaceVertical(facing));
}
public static SuperByteBuffer partialDirectional(PartialModel partial, BlockState referenceState, Direction dir,
Supplier<PoseStack> modelTransform) {
return CreateClient.BUFFER_CACHE.get(DIRECTIONAL_PARTIAL, Pair.of(dir, partial),
() -> BakedModelRenderHelper.standardModelRender(partial.get(), referenceState, modelTransform.get()));
}
public static Supplier<PoseStack> rotateToFace(Direction facing) {
return () -> {
PoseStack stack = new PoseStack();
TransformStack.cast(stack)
.centre()
.rotateY(AngleHelper.horizontalAngle(facing))
.rotateX(AngleHelper.verticalAngle(facing))
.unCentre();
return stack;
};
}
public static Supplier<PoseStack> rotateToFaceVertical(Direction facing) {
return () -> {
PoseStack stack = new PoseStack();
TransformStack.cast(stack)
.centre()
.rotateY(AngleHelper.horizontalAngle(facing))
.rotateX(AngleHelper.verticalAngle(facing) + 90)
.unCentre();
return stack;
};
}
}

View File

@@ -1,30 +0,0 @@
package nl.requios.effortlessbuilding.create.foundation.render;
import com.jozufozu.flywheel.util.DiffuseLightCalculator;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import javax.annotation.Nullable;
public final class ForcedDiffuseState {
private static final ThreadLocal<ObjectArrayList<DiffuseLightCalculator>> FORCED_DIFFUSE = ThreadLocal.withInitial(ObjectArrayList::new);
private ForcedDiffuseState() {
}
public static void pushCalculator(DiffuseLightCalculator calculator) {
FORCED_DIFFUSE.get().push(calculator);
}
public static void popCalculator() {
FORCED_DIFFUSE.get().pop();
}
@Nullable
public static DiffuseLightCalculator getForcedCalculator() {
ObjectArrayList<DiffuseLightCalculator> stack = FORCED_DIFFUSE.get();
if (stack.isEmpty()) {
return null;
}
return stack.top();
}
}

View File

@@ -6,16 +6,8 @@ import nl.requios.effortlessbuilding.create.AllSpecialTextures;
import nl.requios.effortlessbuilding.create.Create; import nl.requios.effortlessbuilding.create.Create;
import net.minecraft.client.renderer.RenderStateShard; import net.minecraft.client.renderer.RenderStateShard;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.ShaderInstance;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.packs.resources.ResourceManager;
import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.world.inventory.InventoryMenu;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.RegisterShadersEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import java.io.IOException;
// TODO 1.17: use custom shaders instead of vanilla ones // TODO 1.17: use custom shaders instead of vanilla ones
public class RenderTypes extends RenderStateShard { public class RenderTypes extends RenderStateShard {
@@ -79,7 +71,7 @@ public class RenderTypes extends RenderStateShard {
private static final RenderType ADDITIVE = RenderType.create(createLayerName("additive"), DefaultVertexFormat.BLOCK, private static final RenderType ADDITIVE = RenderType.create(createLayerName("additive"), DefaultVertexFormat.BLOCK,
VertexFormat.Mode.QUADS, 256, true, true, RenderType.CompositeState.builder() VertexFormat.Mode.QUADS, 256, true, true, RenderType.CompositeState.builder()
.setShaderState(BLOCK_SHADER) .setShaderState(RENDERTYPE_SOLID_SHADER)
.setTextureState(new TextureStateShard(InventoryMenu.BLOCK_ATLAS, false, false)) .setTextureState(new TextureStateShard(InventoryMenu.BLOCK_ATLAS, false, false))
.setTransparencyState(ADDITIVE_TRANSPARENCY) .setTransparencyState(ADDITIVE_TRANSPARENCY)
.setCullState(NO_CULL) .setCullState(NO_CULL)

View File

@@ -2,6 +2,7 @@ package nl.requios.effortlessbuilding.create.foundation.render;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexConsumer;
import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.LightTexture;
import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;

View File

@@ -1,495 +0,0 @@
package nl.requios.effortlessbuilding.create.foundation.render;
import java.nio.ByteBuffer;
import java.util.function.IntPredicate;
import com.jozufozu.flywheel.api.vertex.ShadedVertexList;
import com.jozufozu.flywheel.api.vertex.VertexList;
import com.jozufozu.flywheel.backend.ShadersModHandler;
import com.jozufozu.flywheel.core.model.ShadeSeparatedBufferedData;
import com.jozufozu.flywheel.core.vertex.BlockVertexList;
import com.jozufozu.flywheel.util.DiffuseLightCalculator;
import com.jozufozu.flywheel.util.transform.TStack;
import com.jozufozu.flywheel.util.transform.Transform;
import com.mojang.blaze3d.vertex.BufferBuilder;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import com.mojang.math.Matrix3f;
import com.mojang.math.Matrix4f;
import com.mojang.math.Quaternion;
import com.mojang.math.Vector3f;
import com.mojang.math.Vector4f;
import nl.requios.effortlessbuilding.create.foundation.block.render.SpriteShiftEntry;
import nl.requios.effortlessbuilding.create.foundation.utility.Color;
import it.unimi.dsi.fastutil.longs.Long2IntMap;
import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.LevelRenderer;
import net.minecraft.client.renderer.LightTexture;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.util.Mth;
import net.minecraft.world.level.Level;
public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<SuperByteBuffer> {
private final VertexList template;
private final IntPredicate shadedPredicate;
// Vertex Position
private final PoseStack transforms = new PoseStack();
// Vertex Coloring
private boolean shouldColor;
private int r, g, b, a;
private boolean disableDiffuseMult;
private DiffuseLightCalculator diffuseCalculator;
// Vertex Texture Coords
private SpriteShiftFunc spriteShiftFunc;
// Vertex Overlay Color
private boolean hasOverlay;
private int overlay = OverlayTexture.NO_OVERLAY;
// Vertex Lighting
private boolean useWorldLight;
private Matrix4f lightTransform;
private boolean hasCustomLight;
private int packedLightCoords;
private boolean hybridLight;
// Vertex Normals
private boolean fullNormalTransform;
// Temporary
private static final Long2IntMap WORLD_LIGHT_CACHE = new Long2IntOpenHashMap();
public SuperByteBuffer(ByteBuffer vertexBuffer, BufferBuilder.DrawState drawState, int unshadedStartVertex) {
int vertexCount = drawState.vertexCount();
int stride = drawState.format().getVertexSize();
ShadedVertexList template = new BlockVertexList.Shaded(vertexBuffer, vertexCount, stride, unshadedStartVertex);
shadedPredicate = template::isShaded;
this.template = template;
transforms.pushPose();
}
public SuperByteBuffer(ShadeSeparatedBufferedData data) {
this(data.vertexBuffer(), data.drawState(), data.unshadedStartVertex());
}
public SuperByteBuffer(ByteBuffer vertexBuffer, BufferBuilder.DrawState drawState) {
int vertexCount = drawState.vertexCount();
int stride = drawState.format().getVertexSize();
template = new BlockVertexList(vertexBuffer, vertexCount, stride);
shadedPredicate = index -> true;
transforms.pushPose();
}
public void renderInto(PoseStack input, VertexConsumer builder) {
if (isEmpty())
return;
Matrix4f modelMat = input.last()
.pose()
.copy();
Matrix4f localTransforms = transforms.last()
.pose();
modelMat.multiply(localTransforms);
Matrix3f normalMat;
if (fullNormalTransform) {
normalMat = input.last()
.normal()
.copy();
Matrix3f localNormalTransforms = transforms.last()
.normal();
normalMat.mul(localNormalTransforms);
} else {
normalMat = transforms.last()
.normal()
.copy();
}
if (useWorldLight) {
WORLD_LIGHT_CACHE.clear();
}
final Vector4f pos = new Vector4f();
final Vector3f normal = new Vector3f();
final Vector4f lightPos = new Vector4f();
DiffuseLightCalculator diffuseCalculator = ForcedDiffuseState.getForcedCalculator();
final boolean disableDiffuseMult =
this.disableDiffuseMult || (ShadersModHandler.isShaderPackInUse() && diffuseCalculator == null);
if (diffuseCalculator == null) {
diffuseCalculator = this.diffuseCalculator;
if (diffuseCalculator == null) {
diffuseCalculator = DiffuseLightCalculator.forCurrentLevel();
}
}
final int vertexCount = template.getVertexCount();
for (int i = 0; i < vertexCount; i++) {
float x = template.getX(i);
float y = template.getY(i);
float z = template.getZ(i);
pos.set(x, y, z, 1F);
pos.transform(modelMat);
builder.vertex(pos.x(), pos.y(), pos.z());
float normalX = template.getNX(i);
float normalY = template.getNY(i);
float normalZ = template.getNZ(i);
normal.set(normalX, normalY, normalZ);
normal.transform(normalMat);
float nx = normal.x();
float ny = normal.y();
float nz = normal.z();
byte r, g, b, a;
if (shouldColor) {
r = (byte) this.r;
g = (byte) this.g;
b = (byte) this.b;
a = (byte) this.a;
} else {
r = template.getR(i);
g = template.getG(i);
b = template.getB(i);
a = template.getA(i);
}
if (disableDiffuseMult) {
builder.color(r, g, b, a);
} else {
float instanceDiffuse = diffuseCalculator.getDiffuse(nx, ny, nz, shadedPredicate.test(i));
int colorR = transformColor(r, instanceDiffuse);
int colorG = transformColor(g, instanceDiffuse);
int colorB = transformColor(b, instanceDiffuse);
builder.color(colorR, colorG, colorB, a);
}
float u = template.getU(i);
float v = template.getV(i);
if (spriteShiftFunc != null) {
spriteShiftFunc.shift(builder, u, v);
} else {
builder.uv(u, v);
}
if (hasOverlay) {
builder.overlayCoords(overlay);
}
int light;
if (useWorldLight) {
lightPos.set(((x - .5f) * 15 / 16f) + .5f, (y - .5f) * 15 / 16f + .5f, (z - .5f) * 15 / 16f + .5f, 1f);
lightPos.transform(localTransforms);
if (lightTransform != null) {
lightPos.transform(lightTransform);
}
light = getLight(Minecraft.getInstance().level, lightPos);
if (hasCustomLight) {
light = maxLight(light, packedLightCoords);
}
} else if (hasCustomLight) {
light = packedLightCoords;
} else {
light = template.getLight(i);
}
if (hybridLight) {
builder.uv2(maxLight(light, template.getLight(i)));
} else {
builder.uv2(light);
}
builder.normal(nx, ny, nz);
builder.endVertex();
}
reset();
}
public SuperByteBuffer reset() {
while (!transforms.clear())
transforms.popPose();
transforms.pushPose();
shouldColor = false;
r = 0;
g = 0;
b = 0;
a = 0;
disableDiffuseMult = false;
diffuseCalculator = null;
spriteShiftFunc = null;
hasOverlay = false;
overlay = OverlayTexture.NO_OVERLAY;
useWorldLight = false;
lightTransform = null;
hasCustomLight = false;
packedLightCoords = 0;
hybridLight = false;
fullNormalTransform = false;
return this;
}
public boolean isEmpty() {
return template.isEmpty();
}
public void delete() {
template.delete();
}
public PoseStack getTransforms() {
return transforms;
}
@Override
public SuperByteBuffer translate(double x, double y, double z) {
transforms.translate(x, y, z);
return this;
}
@Override
public SuperByteBuffer multiply(Quaternion quaternion) {
transforms.mulPose(quaternion);
return this;
}
@Override
public SuperByteBuffer scale(float factorX, float factorY, float factorZ) {
transforms.scale(factorX, factorY, factorZ);
return this;
}
@Override
public SuperByteBuffer pushPose() {
transforms.pushPose();
return this;
}
@Override
public SuperByteBuffer popPose() {
transforms.popPose();
return this;
}
@Override
public SuperByteBuffer mulPose(Matrix4f pose) {
transforms.last()
.pose()
.multiply(pose);
return this;
}
@Override
public SuperByteBuffer mulNormal(Matrix3f normal) {
transforms.last()
.normal()
.mul(normal);
return this;
}
public SuperByteBuffer transform(PoseStack stack) {
transforms.last()
.pose()
.multiply(stack.last()
.pose());
transforms.last()
.normal()
.mul(stack.last()
.normal());
return this;
}
public SuperByteBuffer rotateCentered(Direction axis, float radians) {
translate(.5f, .5f, .5f).rotate(axis, radians)
.translate(-.5f, -.5f, -.5f);
return this;
}
public SuperByteBuffer rotateCentered(Quaternion q) {
translate(.5f, .5f, .5f).multiply(q)
.translate(-.5f, -.5f, -.5f);
return this;
}
public SuperByteBuffer color(int r, int g, int b, int a) {
shouldColor = true;
this.r = r;
this.g = g;
this.b = b;
this.a = a;
return this;
}
public SuperByteBuffer color(int color) {
shouldColor = true;
r = ((color >> 16) & 0xFF);
g = ((color >> 8) & 0xFF);
b = (color & 0xFF);
a = 255;
return this;
}
public SuperByteBuffer color(Color c) {
return color(c.getRGB());
}
/**
* Prevents vertex colors from being multiplied by the diffuse value calculated
* from the final transformed normal vector. Useful for entity rendering, when
* diffuse is applied automatically later.
*/
public SuperByteBuffer disableDiffuse() {
disableDiffuseMult = true;
return this;
}
public SuperByteBuffer diffuseCalculator(DiffuseLightCalculator diffuseCalculator) {
this.diffuseCalculator = diffuseCalculator;
return this;
}
public SuperByteBuffer shiftUV(SpriteShiftEntry entry) {
this.spriteShiftFunc = (builder, u, v) -> {
builder.uv(entry.getTargetU(u), entry.getTargetV(v));
};
return this;
}
public SuperByteBuffer shiftUVScrolling(SpriteShiftEntry entry, float scrollV) {
return this.shiftUVScrolling(entry, 0, scrollV);
}
public SuperByteBuffer shiftUVScrolling(SpriteShiftEntry entry, float scrollU, float scrollV) {
this.spriteShiftFunc = (builder, u, v) -> {
float targetU = u - entry.getOriginal()
.getU0() + entry.getTarget()
.getU0()
+ scrollU;
float targetV = v - entry.getOriginal()
.getV0() + entry.getTarget()
.getV0()
+ scrollV;
builder.uv(targetU, targetV);
};
return this;
}
public SuperByteBuffer shiftUVtoSheet(SpriteShiftEntry entry, float uTarget, float vTarget, int sheetSize) {
this.spriteShiftFunc = (builder, u, v) -> {
float targetU = entry.getTarget()
.getU((SpriteShiftEntry.getUnInterpolatedU(entry.getOriginal(), u) / sheetSize) + uTarget * 16);
float targetV = entry.getTarget()
.getV((SpriteShiftEntry.getUnInterpolatedV(entry.getOriginal(), v) / sheetSize) + vTarget * 16);
builder.uv(targetU, targetV);
};
return this;
}
public SuperByteBuffer overlay() {
hasOverlay = true;
return this;
}
public SuperByteBuffer overlay(int overlay) {
hasOverlay = true;
this.overlay = overlay;
return this;
}
public SuperByteBuffer light() {
useWorldLight = true;
return this;
}
public SuperByteBuffer light(Matrix4f lightTransform) {
useWorldLight = true;
this.lightTransform = lightTransform;
return this;
}
public SuperByteBuffer light(int packedLightCoords) {
hasCustomLight = true;
this.packedLightCoords = packedLightCoords;
return this;
}
public SuperByteBuffer light(Matrix4f lightTransform, int packedLightCoords) {
light(lightTransform);
light(packedLightCoords);
return this;
}
/**
* Uses max light from calculated light (world light or custom light) and vertex
* light for the final light value. Ineffective if any other light method was
* not called.
*/
public SuperByteBuffer hybridLight() {
hybridLight = true;
return this;
}
/**
* Transforms normals not only by the local matrix stack, but also by the passed
* matrix stack.
*/
public SuperByteBuffer fullNormalTransform() {
fullNormalTransform = true;
return this;
}
public SuperByteBuffer forEntityRender() {
disableDiffuse();
overlay();
fullNormalTransform();
return this;
}
public static int transformColor(byte component, float scale) {
return Mth.clamp((int) (Byte.toUnsignedInt(component) * scale), 0, 255);
}
public static int transformColor(int component, float scale) {
return Mth.clamp((int) (component * scale), 0, 255);
}
public static int maxLight(int packedLight1, int packedLight2) {
int blockLight1 = LightTexture.block(packedLight1);
int skyLight1 = LightTexture.sky(packedLight1);
int blockLight2 = LightTexture.block(packedLight2);
int skyLight2 = LightTexture.sky(packedLight2);
return LightTexture.pack(Math.max(blockLight1, blockLight2), Math.max(skyLight1, skyLight2));
}
private static int getLight(Level world, Vector4f lightPos) {
BlockPos pos = new BlockPos(lightPos.x(), lightPos.y(), lightPos.z());
return WORLD_LIGHT_CACHE.computeIfAbsent(pos.asLong(), $ -> LevelRenderer.getLightColor(world, pos));
}
@FunctionalInterface
public interface SpriteShiftFunc {
void shift(VertexConsumer builder, float u, float v);
}
@FunctionalInterface
public interface VertexLighter {
int getPackedLight(float x, float y, float z);
}
}

View File

@@ -1,54 +0,0 @@
package nl.requios.effortlessbuilding.create.foundation.render;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
public class SuperByteBufferCache {
protected final Map<Compartment<?>, Cache<Object, SuperByteBuffer>> caches = new HashMap<>();
public synchronized void registerCompartment(Compartment<?> compartment) {
caches.put(compartment, CacheBuilder.newBuilder()
.build());
}
public synchronized void registerCompartment(Compartment<?> compartment, long ticksUntilExpired) {
caches.put(compartment, CacheBuilder.newBuilder()
.expireAfterAccess(ticksUntilExpired * 50, TimeUnit.MILLISECONDS)
.build());
}
public <T> SuperByteBuffer get(Compartment<T> compartment, T key, Callable<SuperByteBuffer> callable) {
Cache<Object, SuperByteBuffer> cache = caches.get(compartment);
if (cache != null) {
try {
return cache.get(key, callable);
} catch (ExecutionException e) {
e.printStackTrace();
}
}
return null;
}
public <T> void invalidate(Compartment<T> compartment, T key) {
caches.get(compartment).invalidate(key);
}
public <T> void invalidate(Compartment<?> compartment) {
caches.get(compartment).invalidateAll();
}
public void invalidate() {
caches.forEach((compartment, cache) -> cache.invalidateAll());
}
public static class Compartment<T> {
}
}

View File

@@ -1,94 +0,0 @@
package nl.requios.effortlessbuilding.create.foundation.render;
import com.mojang.blaze3d.vertex.BufferBuilder;
import com.mojang.blaze3d.vertex.VertexConsumer;
import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap;
import net.minecraft.Util;
import net.minecraft.client.renderer.ChunkBufferBuilderPack;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.Sheets;
import net.minecraft.client.resources.model.ModelBakery;
import java.util.SortedMap;
public class SuperRenderTypeBuffer implements MultiBufferSource {
private static final SuperRenderTypeBuffer INSTANCE = new SuperRenderTypeBuffer();
public static SuperRenderTypeBuffer getInstance() {
return INSTANCE;
}
private SuperRenderTypeBufferPhase earlyBuffer;
private SuperRenderTypeBufferPhase defaultBuffer;
private SuperRenderTypeBufferPhase lateBuffer;
public SuperRenderTypeBuffer() {
earlyBuffer = new SuperRenderTypeBufferPhase();
defaultBuffer = new SuperRenderTypeBufferPhase();
lateBuffer = new SuperRenderTypeBufferPhase();
}
public VertexConsumer getEarlyBuffer(RenderType type) {
return earlyBuffer.bufferSource.getBuffer(type);
}
@Override
public VertexConsumer getBuffer(RenderType type) {
return defaultBuffer.bufferSource.getBuffer(type);
}
public VertexConsumer getLateBuffer(RenderType type) {
return lateBuffer.bufferSource.getBuffer(type);
}
public void draw() {
earlyBuffer.bufferSource.endBatch();
defaultBuffer.bufferSource.endBatch();
lateBuffer.bufferSource.endBatch();
}
public void draw(RenderType type) {
earlyBuffer.bufferSource.endBatch(type);
defaultBuffer.bufferSource.endBatch(type);
lateBuffer.bufferSource.endBatch(type);
}
private static class SuperRenderTypeBufferPhase {
// Visible clones from RenderBuffers
private final ChunkBufferBuilderPack fixedBufferPack = new ChunkBufferBuilderPack();
private final SortedMap<RenderType, BufferBuilder> fixedBuffers = Util.make(new Object2ObjectLinkedOpenHashMap<>(), map -> {
map.put(Sheets.solidBlockSheet(), fixedBufferPack.builder(RenderType.solid()));
map.put(Sheets.cutoutBlockSheet(), fixedBufferPack.builder(RenderType.cutout()));
map.put(Sheets.bannerSheet(), fixedBufferPack.builder(RenderType.cutoutMipped()));
map.put(Sheets.translucentCullBlockSheet(), fixedBufferPack.builder(RenderType.translucent()));
put(map, Sheets.shieldSheet());
put(map, Sheets.bedSheet());
put(map, Sheets.shulkerBoxSheet());
put(map, Sheets.signSheet());
put(map, Sheets.chestSheet());
put(map, RenderType.translucentNoCrumbling());
put(map, RenderType.armorGlint());
put(map, RenderType.armorEntityGlint());
put(map, RenderType.glint());
put(map, RenderType.glintDirect());
put(map, RenderType.glintTranslucent());
put(map, RenderType.entityGlint());
put(map, RenderType.entityGlintDirect());
put(map, RenderType.waterMask());
put(map, RenderTypes.getOutlineSolid());
ModelBakery.DESTROY_TYPES.forEach((p_173062_) -> {
put(map, p_173062_);
});
});
private final BufferSource bufferSource = MultiBufferSource.immediateWithBuffers(fixedBuffers, new BufferBuilder(256));
private static void put(Object2ObjectLinkedOpenHashMap<RenderType, BufferBuilder> map, RenderType type) {
map.put(type, new BufferBuilder(type.bufferSize()));
}
}
}

View File

@@ -1,113 +0,0 @@
package nl.requios.effortlessbuilding.create.foundation.render;
import com.jozufozu.flywheel.backend.Backend;
import com.jozufozu.flywheel.backend.instancing.InstancedRenderRegistry;
import com.jozufozu.flywheel.config.BackendType;
import com.jozufozu.flywheel.core.virtual.VirtualRenderWorld;
import com.jozufozu.flywheel.util.transform.TransformStack;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Matrix4f;
import com.mojang.math.Vector4f;
import nl.requios.effortlessbuilding.create.Create;
import nl.requios.effortlessbuilding.create.foundation.utility.AnimationTickHolder;
import nl.requios.effortlessbuilding.create.foundation.utility.RegisteredObjects;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.LevelRenderer;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.blockentity.BlockEntityRenderer;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
import javax.annotation.Nullable;
import java.util.Iterator;
public class TileEntityRenderHelper {
public static void renderTileEntities(Level world, Iterable<BlockEntity> customRenderTEs, PoseStack ms,
MultiBufferSource buffer) {
renderTileEntities(world, null, customRenderTEs, ms, null, buffer);
}
public static void renderTileEntities(Level world, Iterable<BlockEntity> customRenderTEs, PoseStack ms,
MultiBufferSource buffer, float pt) {
renderTileEntities(world, null, customRenderTEs, ms, null, buffer, pt);
}
public static void renderTileEntities(Level world, @Nullable VirtualRenderWorld renderWorld,
Iterable<BlockEntity> customRenderTEs, PoseStack ms, @Nullable Matrix4f lightTransform, MultiBufferSource buffer) {
renderTileEntities(world, renderWorld, customRenderTEs, ms, lightTransform, buffer,
AnimationTickHolder.getPartialTicks());
}
public static void renderTileEntities(Level world, @Nullable VirtualRenderWorld renderWorld,
Iterable<BlockEntity> customRenderTEs, PoseStack ms, @Nullable Matrix4f lightTransform, MultiBufferSource buffer,
float pt) {
Iterator<BlockEntity> iterator = customRenderTEs.iterator();
while (iterator.hasNext()) {
BlockEntity tileEntity = iterator.next();
if (Backend.getBackendType() == BackendType.INSTANCING && Backend.isFlywheelWorld(renderWorld) && InstancedRenderRegistry.shouldSkipRender(tileEntity))
continue;
BlockEntityRenderer<BlockEntity> renderer = Minecraft.getInstance().getBlockEntityRenderDispatcher().getRenderer(tileEntity);
if (renderer == null) {
iterator.remove();
continue;
}
BlockPos pos = tileEntity.getBlockPos();
ms.pushPose();
TransformStack.cast(ms)
.translate(pos);
try {
int worldLight = getCombinedLight(world, getLightPos(lightTransform, pos), renderWorld, pos);
if (renderWorld != null) {
// Swap the real world for the render world so that the renderer gets contraption-local information
tileEntity.setLevel(renderWorld);
renderer.render(tileEntity, pt, ms, buffer, worldLight, OverlayTexture.NO_OVERLAY);
tileEntity.setLevel(world);
} else {
renderer.render(tileEntity, pt, ms, buffer, worldLight, OverlayTexture.NO_OVERLAY);
}
} catch (Exception e) {
iterator.remove();
String message = "BlockEntity " + RegisteredObjects.getKeyOrThrow(tileEntity.getType())
.toString() + " could not be rendered virtually.";
// if (AllConfigs.CLIENT.explainRenderErrors.get())
Create.LOGGER.error(message, e);
// else
// Create.LOGGER.error(message);
}
ms.popPose();
}
}
private static BlockPos getLightPos(@Nullable Matrix4f lightTransform, BlockPos contraptionPos) {
if (lightTransform != null) {
Vector4f lightVec = new Vector4f(contraptionPos.getX() + .5f, contraptionPos.getY() + .5f, contraptionPos.getZ() + .5f, 1);
lightVec.transform(lightTransform);
return new BlockPos(lightVec.x(), lightVec.y(), lightVec.z());
} else {
return contraptionPos;
}
}
public static int getCombinedLight(Level world, BlockPos worldPos, @Nullable VirtualRenderWorld renderWorld,
BlockPos renderWorldPos) {
int worldLight = LevelRenderer.getLightColor(world, worldPos);
if (renderWorld != null) {
int renderWorldLight = LevelRenderer.getLightColor(renderWorld, renderWorldPos);
return SuperByteBuffer.maxLight(worldLight, renderWorldLight);
}
return worldLight;
}
}

View File

@@ -2,9 +2,9 @@ package nl.requios.effortlessbuilding.create.foundation.utility;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.core.Registry;
import net.minecraft.core.SectionPos; import net.minecraft.core.SectionPos;
import net.minecraft.core.particles.ParticleTypes; import net.minecraft.core.particles.ParticleTypes;
import net.minecraft.core.registries.Registries;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundEvents;
@@ -20,7 +20,12 @@ import net.minecraft.world.item.enchantment.Enchantments;
import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.BlockGetter;
import net.minecraft.world.level.GameRules; import net.minecraft.world.level.GameRules;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.BaseRailBlock;
import net.minecraft.world.level.block.BedBlock;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.IceBlock;
import net.minecraft.world.level.block.SlimeBlock;
import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BlockStateProperties;
@@ -29,10 +34,8 @@ import net.minecraft.world.level.block.state.properties.SlabType;
import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.chunk.LevelChunk;
import net.minecraft.world.level.chunk.LevelChunkSection; import net.minecraft.world.level.chunk.LevelChunkSection;
import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.FluidState;
import net.minecraft.world.level.material.Material;
import net.minecraftforge.common.IPlantable; import net.minecraftforge.common.IPlantable;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.util.BlockSnapshot;
import net.minecraftforge.event.level.BlockEvent; import net.minecraftforge.event.level.BlockEvent;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@@ -181,9 +184,8 @@ public class BlockHelper {
.ultraWarm()) .ultraWarm())
return false; return false;
Material material = world.getBlockState(pos.below()) BlockState belowState = world.getBlockState(pos.below());
.getMaterial(); if (belowState.blocksMotion() || belowState.liquid())
if (material.blocksMotion() || material.isLiquid())
world.setBlockAndUpdate(pos, Blocks.WATER.defaultBlockState()); world.setBlockAndUpdate(pos, Blocks.WATER.defaultBlockState());
return true; return true;
} }
@@ -211,8 +213,8 @@ public class BlockHelper {
int idx = chunk.getSectionIndex(target.getY()); int idx = chunk.getSectionIndex(target.getY());
LevelChunkSection chunksection = chunk.getSection(idx); LevelChunkSection chunksection = chunk.getSection(idx);
if (chunksection == null) { if (chunksection == null) {
chunksection = new LevelChunkSection(chunk.getSectionYFromSectionIndex(idx), world.registryAccess() chunksection = new LevelChunkSection(world.registryAccess()
.registryOrThrow(Registry.BIOME_REGISTRY)); .registryOrThrow(Registries.BIOME));
chunk.getSections()[idx] = chunksection; chunk.getSections()[idx] = chunksection;
} }
BlockState old = chunksection.setBlockState(SectionPos.sectionRelative(target.getX()), BlockState old = chunksection.setBlockState(SectionPos.sectionRelative(target.getX()),

View File

@@ -1,9 +1,9 @@
package nl.requios.effortlessbuilding.create.foundation.utility; package nl.requios.effortlessbuilding.create.foundation.utility;
import com.google.common.hash.Hashing; import com.google.common.hash.Hashing;
import com.mojang.math.Vector3f;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import org.joml.Vector3f;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.util.function.UnaryOperator; import java.util.function.UnaryOperator;

View File

@@ -2,7 +2,6 @@ package nl.requios.effortlessbuilding.create.foundation.utility;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.registries.IForgeRegistry; import net.minecraftforge.registries.IForgeRegistry;
import nl.requios.effortlessbuilding.EffortlessBuilding;
import nl.requios.effortlessbuilding.create.Create; import nl.requios.effortlessbuilding.create.Create;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;

View File

@@ -2,11 +2,11 @@ package nl.requios.effortlessbuilding.create.foundation.utility;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.Tesselator; import com.mojang.blaze3d.vertex.Tesselator;
import com.mojang.math.Matrix4f;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.Font; import net.minecraft.client.gui.Font;
import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.LightTexture;
import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.MultiBufferSource;
import org.joml.Matrix4f;
import java.text.BreakIterator; import java.text.BreakIterator;
import java.util.LinkedList; import java.util.LinkedList;
@@ -78,7 +78,7 @@ public final class FontHelper {
MultiBufferSource.BufferSource irendertypebuffer$impl = MultiBufferSource.immediate(Tesselator.getInstance() MultiBufferSource.BufferSource irendertypebuffer$impl = MultiBufferSource.immediate(Tesselator.getInstance()
.getBuilder()); .getBuilder());
int i = font.drawInBatch(p_228078_1_, p_228078_2_, p_228078_3_, p_228078_4_, p_228078_6_, p_228078_5_, int i = font.drawInBatch(p_228078_1_, p_228078_2_, p_228078_3_, p_228078_4_, p_228078_6_, p_228078_5_,
irendertypebuffer$impl, false, 0, LightTexture.FULL_BRIGHT); irendertypebuffer$impl, Font.DisplayMode.NORMAL, 0, LightTexture.FULL_BRIGHT);
irendertypebuffer$impl.endBatch(); irendertypebuffer$impl.endBatch();
return i; return i;
} }

View File

@@ -17,7 +17,6 @@ public class LangNumberFormat {
public void update() { public void update() {
format = NumberFormat.getInstance(Minecraft.getInstance() format = NumberFormat.getInstance(Minecraft.getInstance()
.getLanguageManager() .getLanguageManager()
.getSelected()
.getJavaLocale()); .getJavaLocale());
format.setMaximumFractionDigits(2); format.setMaximumFractionDigits(2);
format.setMinimumFractionDigits(0); format.setMinimumFractionDigits(0);

View File

@@ -1,7 +1,5 @@
package nl.requios.effortlessbuilding.create.foundation.utility; package nl.requios.effortlessbuilding.create.foundation.utility;
import com.mojang.math.Quaternion;
import com.mojang.math.Vector3f;
import net.minecraft.client.Camera; import net.minecraft.client.Camera;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
@@ -19,6 +17,8 @@ import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.block.Mirror; import net.minecraft.world.level.block.Mirror;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import org.joml.Quaternionf;
import org.joml.Vector3f;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@@ -237,13 +237,12 @@ public class VecHelper {
*/ */
Camera ari = Minecraft.getInstance().gameRenderer.getMainCamera(); Camera ari = Minecraft.getInstance().gameRenderer.getMainCamera();
Vec3 camera_pos = ari.getPosition(); Vec3 camera_pos = ari.getPosition();
Quaternion camera_rotation_conj = ari.rotation() Quaternionf camera_rotation_conj = new Quaternionf(ari.rotation());
.copy(); camera_rotation_conj.conjugate();
camera_rotation_conj.conj();
Vector3f result3f = new Vector3f((float) (camera_pos.x - target.x), (float) (camera_pos.y - target.y), Vector3f result3f = new Vector3f((float) (camera_pos.x - target.x), (float) (camera_pos.y - target.y),
(float) (camera_pos.z - target.z)); (float) (camera_pos.z - target.z));
result3f.transform(camera_rotation_conj); result3f.rotate(camera_rotation_conj);
// ----- compensate for view bobbing (if active) ----- // ----- compensate for view bobbing (if active) -----
// the following code adapted from GameRenderer::applyBobbing (to invert it) // the following code adapted from GameRenderer::applyBobbing (to invert it)
@@ -257,18 +256,18 @@ public class VecHelper {
float f = distwalked_modified - playerentity.walkDistO; float f = distwalked_modified - playerentity.walkDistO;
float f1 = -(distwalked_modified + f * partialTicks); float f1 = -(distwalked_modified + f * partialTicks);
float f2 = Mth.lerp(partialTicks, playerentity.oBob, playerentity.bob); float f2 = Mth.lerp(partialTicks, playerentity.oBob, playerentity.bob);
Quaternion q2 = Quaternionf q2 =
new Quaternion(Vector3f.XP, Math.abs(Mth.cos(f1 * (float) Math.PI - 0.2F) * f2) * 5.0F, true); com.mojang.math.Axis.XP.rotationDegrees(Math.abs(Mth.cos(f1 * (float) Math.PI - 0.2F) * f2) * 5.0F);
q2.conj(); q2.conjugate();
result3f.transform(q2); result3f.rotate(q2);
Quaternion q1 = new Quaternion(Vector3f.ZP, Mth.sin(f1 * (float) Math.PI) * f2 * 3.0F, true); Quaternionf q1 = com.mojang.math.Axis.ZP.rotationDegrees(Mth.sin(f1 * (float) Math.PI) * f2 * 3.0F);
q1.conj(); q1.conjugate();
result3f.transform(q1); result3f.rotate(q1);
Vector3f bob_translation = new Vector3f((Mth.sin(f1 * (float) Math.PI) * f2 * 0.5F), Vector3f bob_translation = new Vector3f((Mth.sin(f1 * (float) Math.PI) * f2 * 0.5F),
(-Math.abs(Mth.cos(f1 * (float) Math.PI) * f2)), 0.0f); (-Math.abs(Mth.cos(f1 * (float) Math.PI) * f2)), 0.0f);
bob_translation.setY(-bob_translation.y()); // this is weird but hey, if it works bob_translation.y = -bob_translation.y(); // this is weird but hey, if it works
result3f.add(bob_translation); result3f.add(bob_translation);
} }
} }

View File

@@ -1,13 +1,13 @@
package nl.requios.effortlessbuilding.create.foundation.utility; package nl.requios.effortlessbuilding.create.foundation.utility;
import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.LevelAccessor;
public class WorldHelper { public class WorldHelper {
public static ResourceLocation getDimensionID(LevelAccessor world) { public static ResourceLocation getDimensionID(LevelAccessor world) {
return world.registryAccess() return world.registryAccess()
.registryOrThrow(Registry.DIMENSION_TYPE_REGISTRY) .registryOrThrow(Registries.DIMENSION_TYPE)
.getKey(world.dimensionType()); .getKey(world.dimensionType());
} }
} }

View File

@@ -1,10 +1,9 @@
package nl.requios.effortlessbuilding.create.foundation.utility.ghost; package nl.requios.effortlessbuilding.create.foundation.utility.ghost;
import net.createmod.catnip.theme.Color;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import nl.requios.effortlessbuilding.create.foundation.utility.Color;
import nl.requios.effortlessbuilding.create.foundation.utility.outliner.Outline;
import java.util.function.Supplier; import java.util.function.Supplier;

View File

@@ -1,9 +1,10 @@
package nl.requios.effortlessbuilding.create.foundation.utility.ghost; package nl.requios.effortlessbuilding.create.foundation.utility.ghost;
import com.jozufozu.flywheel.core.model.ModelUtil;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexConsumer;
import nl.requios.effortlessbuilding.create.foundation.render.SuperRenderTypeBuffer; import net.createmod.catnip.render.SuperRenderTypeBuffer;
import net.createmod.catnip.theme.Color;
import net.createmod.ponder.render.VirtualRenderHelper;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.LevelRenderer;
import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.LightTexture;
@@ -19,7 +20,6 @@ import net.minecraft.util.Mth;
import net.minecraft.util.RandomSource; import net.minecraft.util.RandomSource;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.client.model.data.ModelData; import net.minecraftforge.client.model.data.ModelData;
import nl.requios.effortlessbuilding.create.foundation.utility.Color;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.List; import java.util.List;
@@ -56,10 +56,10 @@ public abstract class GhostBlockRenderer {
ms.pushPose(); ms.pushPose();
ms.translate(pos.getX(), pos.getY(), pos.getZ()); ms.translate(pos.getX(), pos.getY(), pos.getZ());
for (RenderType layer : model.getRenderTypes(state, RandomSource.create(42L), ModelUtil.VIRTUAL_DATA)) { for (RenderType layer : model.getRenderTypes(state, RandomSource.create(42L), VirtualRenderHelper.VIRTUAL_DATA)) {
VertexConsumer vb = buffer.getEarlyBuffer(layer); VertexConsumer vb = buffer.getEarlyBuffer(layer);
renderer.renderModel(ms.last(), vb, state, model, 1f, 1f, 1f, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, renderer.renderModel(ms.last(), vb, state, model, 1f, 1f, 1f, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY,
ModelUtil.VIRTUAL_DATA, layer); VirtualRenderHelper.VIRTUAL_DATA, layer);
} }
ms.popPose(); ms.popPose();
@@ -92,8 +92,7 @@ public abstract class GhostBlockRenderer {
ms.translate(-.5, -.5, -.5); ms.translate(-.5, -.5, -.5);
renderModel(ms.last(), vb, state, model, color.getRedAsFloat(), color.getGreenAsFloat(), color.getBlueAsFloat(), alpha, renderModel(ms.last(), vb, state, model, color.getRedAsFloat(), color.getGreenAsFloat(), color.getBlueAsFloat(), alpha,
LevelRenderer.getLightColor(mc.level, pos), OverlayTexture.NO_OVERLAY, LevelRenderer.getLightColor(mc.level, pos), OverlayTexture.NO_OVERLAY, VirtualRenderHelper.VIRTUAL_DATA, layer);
ModelUtil.VIRTUAL_DATA, layer);
ms.popPose(); ms.popPose();
} }

View File

@@ -1,8 +1,7 @@
package nl.requios.effortlessbuilding.create.foundation.utility.ghost; package nl.requios.effortlessbuilding.create.foundation.utility.ghost;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import nl.requios.effortlessbuilding.EffortlessBuilding; import net.createmod.catnip.render.SuperRenderTypeBuffer;
import nl.requios.effortlessbuilding.create.foundation.render.SuperRenderTypeBuffer;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;

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