11 Commits
1.20 ... 1.19.4

Author SHA1 Message Date
Christian Knaapen
2bec37ce0a Merge branch 'port/1.19.4' into 1.19.4 2023-12-23 21:21:02 +01:00
Mrbysco
5fce26a796 Initial backport to 1.19.4 2023-12-23 21:09:58 +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
206 changed files with 2446 additions and 4108 deletions

View File

@@ -2,7 +2,6 @@ buildscript {
repositories { repositories {
maven { url = 'https://maven.minecraftforge.net' } maven { url = 'https://maven.minecraftforge.net' }
mavenCentral() mavenCentral()
jcenter()
maven { url = 'https://repo.spongepowered.org/repository/maven-public' } maven { url = 'https://repo.spongepowered.org/repository/maven-public' }
maven { url = 'https://maven.parchmentmc.org' } maven { url = 'https://maven.parchmentmc.org' }
} }
@@ -30,7 +29,9 @@ ext.buildNumber = System.getenv('BUILD_NUMBER')
version = mod_version version = mod_version
group = 'nl.requios.effortlessbuilding' group = 'nl.requios.effortlessbuilding'
archivesBaseName = "effortlessbuilding-${artifact_minecraft_version}" base {
archivesName = "effortlessbuilding-${artifact_minecraft_version}"
}
java.toolchain.languageVersion = JavaLanguageVersion.of(17) java.toolchain.languageVersion = JavaLanguageVersion.of(17)
@@ -121,7 +122,7 @@ dependencies {
minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}"
jarJar("com.jozufozu.flywheel:flywheel-forge-${flywheel_minecraft_version}:${flywheel_version}") { jarJar("com.jozufozu.flywheel:flywheel-forge-${flywheel_minecraft_version}:${flywheel_version}") {
jarJar.ranged(it, '[0.6.9,0.6.10)') jarJar.ranged(it, '[0.6.9,0.7)')
} }
if (flywheelInWorkspace) { if (flywheelInWorkspace) {
@@ -155,7 +156,7 @@ jar {
"Specification-Title": "effortlessbuilding", "Specification-Title": "effortlessbuilding",
"Specification-Vendor": "requios", "Specification-Vendor": "requios",
"Specification-Version": "1", "Specification-Version": "1",
"Implementation-Title": project.jar.archiveBaseName, "Implementation-Title": project.name,
"Implementation-Version": project.jar.archiveVersion, "Implementation-Version": project.jar.archiveVersion,
"Implementation-Vendor" :"requios", "Implementation-Vendor" :"requios",
"Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")
@@ -167,7 +168,7 @@ task jarJarRelease {
group = 'jarjar' group = 'jarjar'
doLast { doLast {
tasks.jarJar { tasks.jarJar {
archiveClassifier = '' classifier = ''
} }
} }
finalizedBy tasks.jarJar finalizedBy tasks.jarJar
@@ -184,7 +185,7 @@ tasks.jarJar.finalizedBy('reobfJarJar')
publishing { publishing {
publications { publications {
mavenJava(MavenPublication) { mavenJava(MavenPublication) {
artifactId = archivesBaseName artifactId = base.archivesName.get()
from components.java from components.java
fg.component(it) fg.component(it)

View File

@@ -3,18 +3,18 @@
org.gradle.jvmargs=-Xmx3G org.gradle.jvmargs=-Xmx3G
org.gradle.daemon=false org.gradle.daemon=false
mod_version = 3.4 mod_version = 3.7
artifact_minecraft_version = 1.20.1 artifact_minecraft_version = 1.19.4
minecraft_version = 1.20.1 minecraft_version = 1.19.4
forge_version = 47.0.43 forge_version = 45.2.6
forgegradle_version = 6.0.6 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 = 2023.06.26 parchment_version = 2023.06.26
flywheel_minecraft_version = 1.20.1 flywheel_minecraft_version = 1.19.3
flywheel_version = 0.6.9-5 flywheel_version = 0.6.9-2

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.

15
gradlew.bat vendored
View File

@@ -14,7 +14,7 @@
@rem limitations under the License. @rem limitations under the License.
@rem @rem
@if "%DEBUG%" == "" @echo off @if "%DEBUG%"=="" @echo off
@rem ########################################################################## @rem ##########################################################################
@rem @rem
@rem Gradle startup script for Windows @rem Gradle startup script for Windows
@@ -25,7 +25,8 @@
if "%OS%"=="Windows_NT" setlocal 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 +1,10 @@
rootProject.name = 'EffortlessBuilding' pluginManagement {
repositories {
gradlePluginPortal()
maven { url = 'https://maven.minecraftforge.net/' }
}
}
plugins {
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.5.0'
}

View File

@@ -1,7 +1,8 @@
package nl.requios.effortlessbuilding; package nl.requios.effortlessbuilding;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.gui.GuiGraphics; import com.mojang.blaze3d.vertex.PoseStack;
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;
@@ -48,14 +49,21 @@ public enum AllGuiTextures implements ScreenElement {
} }
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public void render(GuiGraphics graphics, int x, int y) { @Override
public void render(PoseStack poseStack, int x, int y) {
bind(); bind();
graphics.blit(location, x, y, startX, startY, width, height, width, height); GuiComponent.blit(poseStack, x, y, 0, startX, startY, width, height, 256, 256);
} }
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public void render(GuiGraphics graphics, int x, int y, Color c) { public void render(PoseStack poseStack, int x, int y, GuiComponent component) {
bind(); bind();
UIRenderHelper.drawColoredTexture(graphics, c, x, y, startX, startY, width, height); component.blit(poseStack, x, y, 0, startX, startY, width, height, 256, 256);
}
@OnlyIn(Dist.CLIENT)
public void render(PoseStack poseStack, int x, int y, Color c, GuiComponent component) {
bind();
UIRenderHelper.drawColoredTexture(poseStack, c, x, y, startX, startY, width, height);
} }
} }

View File

@@ -3,8 +3,7 @@ package nl.requios.effortlessbuilding;
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 net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.GuiComponent;
import org.joml.Matrix4f;
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 +15,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,16 +101,15 @@ public class AllIcons implements ScreenElement {
return new AllIcons(x = 0, ++y); return new AllIcons(x = 0, ++y);
} }
@OnlyIn(Dist.CLIENT)
public void bind() { public void bind() {
RenderSystem.setShaderTexture(0, ICON_ATLAS); RenderSystem.setShaderTexture(0, ICON_ATLAS);
} }
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
@Override @Override
public void render(GuiGraphics graphics, int x, int y) { public void render(PoseStack ms, int x, int y) {
bind(); bind();
graphics.blit(ICON_ATLAS, x, y, 0, iconX, iconY, 16, 16, 256, 256); GuiComponent.blit(ms, x, y, 0, iconX, iconY, 16, 16, 256, 256);
} }
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)

View File

@@ -20,7 +20,6 @@ import nl.requios.effortlessbuilding.buildmode.ModeOptions;
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)

View File

@@ -5,7 +5,6 @@ import net.minecraft.world.InteractionHand;
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.CreativeModeTabRegistry;
import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.common.util.FakePlayer;
import net.minecraftforge.event.RegisterCommandsEvent; import net.minecraftforge.event.RegisterCommandsEvent;
import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.TickEvent;

View File

@@ -1,21 +0,0 @@
package nl.requios.effortlessbuilding;
import net.minecraft.world.item.CreativeModeTab;
public class EBCreativeModeTab implements CreativeModeTab.DisplayItemsGenerator {
@Override
public void accept(CreativeModeTab.ItemDisplayParameters pParameters, CreativeModeTab.Output pOutput) {
pOutput.accept(EffortlessBuilding.RANDOMIZER_BAG_ITEM.get());
pOutput.accept(EffortlessBuilding.GOLDEN_RANDOMIZER_BAG_ITEM.get());
pOutput.accept(EffortlessBuilding.DIAMOND_RANDOMIZER_BAG_ITEM.get());
pOutput.accept(EffortlessBuilding.REACH_UPGRADE_1_ITEM.get());
pOutput.accept(EffortlessBuilding.REACH_UPGRADE_2_ITEM.get());
pOutput.accept(EffortlessBuilding.REACH_UPGRADE_3_ITEM.get());
pOutput.accept(EffortlessBuilding.MUSCLES_ITEM.get());
pOutput.accept(EffortlessBuilding.ELASTIC_HAND_ITEM.get());
pOutput.accept(EffortlessBuilding.BUILDING_TECHNIQUES_BOOK_ITEM.get());
}
}

View File

@@ -1,18 +1,18 @@
package nl.requios.effortlessbuilding; package nl.requios.effortlessbuilding;
import com.mojang.serialization.Codec; import com.mojang.serialization.Codec;
import net.minecraft.core.registries.Registries;
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.FeatureFlagSet; 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.CreativeModeTab; 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.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.CreativeModeTabEvent;
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;
@@ -40,6 +40,8 @@ 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 {
@@ -58,7 +60,6 @@ public class EffortlessBuilding {
private static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MODID); private static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MODID);
private static final DeferredRegister<MenuType<?>> CONTAINERS = DeferredRegister.create(ForgeRegistries.MENU_TYPES, EffortlessBuilding.MODID); private static final DeferredRegister<MenuType<?>> CONTAINERS = DeferredRegister.create(ForgeRegistries.MENU_TYPES, EffortlessBuilding.MODID);
public static final DeferredRegister<Codec<? extends IGlobalLootModifier>> LOOT_MODIFIERS = DeferredRegister.create(ForgeRegistries.Keys.GLOBAL_LOOT_MODIFIER_SERIALIZERS, EffortlessBuilding.MODID); public static final DeferredRegister<Codec<? extends IGlobalLootModifier>> LOOT_MODIFIERS = DeferredRegister.create(ForgeRegistries.Keys.GLOBAL_LOOT_MODIFIER_SERIALIZERS, EffortlessBuilding.MODID);
private static final DeferredRegister<CreativeModeTab> CREATIVE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, EffortlessBuilding.MODID);
public static final RegistryObject<Item> RANDOMIZER_BAG_ITEM = ITEMS.register("randomizer_bag", RandomizerBagItem::new); public static final RegistryObject<Item> RANDOMIZER_BAG_ITEM = ITEMS.register("randomizer_bag", RandomizerBagItem::new);
public static final RegistryObject<Item> GOLDEN_RANDOMIZER_BAG_ITEM = ITEMS.register("golden_randomizer_bag", GoldenRandomizerBagItem::new); public static final RegistryObject<Item> GOLDEN_RANDOMIZER_BAG_ITEM = ITEMS.register("golden_randomizer_bag", GoldenRandomizerBagItem::new);
@@ -74,12 +75,6 @@ public class EffortlessBuilding {
public static final RegistryObject<MenuType<GoldenRandomizerBagContainer>> GOLDEN_RANDOMIZER_BAG_CONTAINER = CONTAINERS.register("golden_randomizer_bag", () -> registerContainer(GoldenRandomizerBagContainer::new)); public static final RegistryObject<MenuType<GoldenRandomizerBagContainer>> GOLDEN_RANDOMIZER_BAG_CONTAINER = CONTAINERS.register("golden_randomizer_bag", () -> registerContainer(GoldenRandomizerBagContainer::new));
public static final RegistryObject<MenuType<DiamondRandomizerBagContainer>> DIAMOND_RANDOMIZER_BAG_CONTAINER = CONTAINERS.register("diamond_randomizer_bag", () -> registerContainer(DiamondRandomizerBagContainer::new)); public static final RegistryObject<MenuType<DiamondRandomizerBagContainer>> DIAMOND_RANDOMIZER_BAG_CONTAINER = CONTAINERS.register("diamond_randomizer_bag", () -> registerContainer(DiamondRandomizerBagContainer::new));
public static final RegistryObject<CreativeModeTab> CREATIVE_TAB = CREATIVE_TABS.register("effortlessbuilding",
() -> CreativeModeTab.builder()
.title(Component.translatable("key.effortlessbuilding.category"))
.icon(() -> new ItemStack(RANDOMIZER_BAG_ITEM.get()))
.displayItems(new EBCreativeModeTab())
.build());
public EffortlessBuilding() { public EffortlessBuilding() {
instance = this; instance = this;
@@ -89,6 +84,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));
@@ -98,12 +94,10 @@ public class EffortlessBuilding {
var singleItemLootModifier = SingleItemLootModifier.CODEC; //load this class to register the loot modifier var singleItemLootModifier = SingleItemLootModifier.CODEC; //load this class to register the loot modifier
LOOT_MODIFIERS.register(FMLJavaModLoadingContext.get().getModEventBus()); LOOT_MODIFIERS.register(FMLJavaModLoadingContext.get().getModEventBus());
CREATIVE_TABS.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) {
@@ -112,8 +106,15 @@ public class EffortlessBuilding {
CompatHelper.setup(); CompatHelper.setup();
} }
public static void addTabContents(final CreativeModeTabEvent.BuildContents event) {
if (event.getTab() == 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, FeatureFlagSet.of()); MenuType<T> type = new MenuType<T>(fact, FeatureFlags.REGISTRY.allFlags());
return type; return type;
} }

View File

@@ -1,16 +1,16 @@
package nl.requios.effortlessbuilding.buildmode; package nl.requios.effortlessbuilding.buildmode;
import org.joml.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

@@ -6,7 +6,6 @@ import net.minecraft.world.entity.player.Player;
import nl.requios.effortlessbuilding.EffortlessBuildingClient; import nl.requios.effortlessbuilding.EffortlessBuildingClient;
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;

View File

@@ -7,7 +7,6 @@ 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 java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;

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.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 java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -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));
} }
} }

View File

@@ -5,7 +5,6 @@ import net.minecraft.core.BlockPos;
import nl.requios.effortlessbuilding.EffortlessBuildingClient; 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 java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;

View File

@@ -7,7 +7,6 @@ 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 java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;

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,8 +2,6 @@ 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;

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.EffortlessBuildingClient; 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);
@@ -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

@@ -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,69 +1,12 @@
package nl.requios.effortlessbuilding.create; package nl.requios.effortlessbuilding.create;
import org.lwjgl.glfw.GLFW;
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 org.lwjgl.glfw.GLFW;
import net.minecraftforge.client.event.RegisterKeyMappingsEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
//@EventBusSubscriber(value = Dist.CLIENT, bus = EventBusSubscriber.Bus.MOD)
public class AllKeys { public class AllKeys {
// TOOL_MENU("toolmenu", GLFW.GLFW_KEY_LEFT_ALT),
// ACTIVATE_TOOL("", GLFW.GLFW_KEY_LEFT_CONTROL),
// TOOLBELT("toolbelt", GLFW.GLFW_KEY_LEFT_ALT),
//
// ;
//
// private KeyMapping keybind;
// private String description;
// private int key;
// private boolean modifiable;
//
// private AllKeys(String description, int defaultKey) {
// this.description = Create.ID + ".keyinfo." + description;
// this.key = defaultKey;
// this.modifiable = !description.isEmpty();
// }
//
// @SubscribeEvent
// public static void register(RegisterKeyMappingsEvent event) {
// for (AllKeys key : values()) {
// key.keybind = new KeyMapping(key.description, key.key, Create.NAME);
// if (!key.modifiable)
// continue;
//
// event.register(key.keybind);
// }
// }
//
// public KeyMapping getKeybind() {
// return keybind;
// }
//
// public boolean isPressed() {
// if (!modifiable)
// return isKeyDown(key);
// return keybind.isDown();
// }
//
// public String getBoundKey() {
// return keybind.getTranslatedKeyMessage()
// .getString()
// .toUpperCase();
// }
//
// public int getBoundCode() {
// return keybind.getKey()
// .getValue();
// }
public static boolean isKeyDown(int key) { public static boolean isKeyDown(int key) {
return InputConstants.isKeyDown(Minecraft.getInstance() return InputConstants.isKeyDown(Minecraft.getInstance()
.getWindow() .getWindow()

View File

@@ -1,7 +1,6 @@
package nl.requios.effortlessbuilding.create; package nl.requios.effortlessbuilding.create;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
public enum AllSpecialTextures { public enum AllSpecialTextures {

View File

@@ -2,7 +2,7 @@ package nl.requios.effortlessbuilding.create;
import nl.requios.effortlessbuilding.create.foundation.render.SuperByteBufferCache; import nl.requios.effortlessbuilding.create.foundation.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.outliner.Outliner; 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();

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

@@ -1,11 +1,9 @@
package nl.requios.effortlessbuilding.create.foundation.events; 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.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.world.item.Item;
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;
@@ -13,13 +11,11 @@ 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;
import net.minecraftforge.event.entity.player.ItemTooltipEvent;
import net.minecraftforge.event.level.LevelEvent; import net.minecraftforge.event.level.LevelEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; 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.item.TooltipModifier;
import nl.requios.effortlessbuilding.create.foundation.render.SuperRenderTypeBuffer; 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;
@@ -62,21 +58,23 @@ public class ClientEvents {
@SubscribeEvent @SubscribeEvent
public static void onRenderWorld(RenderLevelStageEvent event) { public static void onRenderWorld(RenderLevelStageEvent event) {
if (event.getStage() != RenderLevelStageEvent.Stage.AFTER_PARTICLES) if(event.getStage() != RenderLevelStageEvent.Stage.AFTER_CUTOUT_BLOCKS) return;
return;
Vec3 cameraPos = Minecraft.getInstance().gameRenderer.getMainCamera()
.getPosition();
float pt = AnimationTickHolder.getPartialTicks();
PoseStack ms = event.getPoseStack(); PoseStack ms = event.getPoseStack();
ms.pushPose(); ms.pushPose();
ms.translate(-cameraPos.x(), -cameraPos.y(), -cameraPos.z());
SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance(); SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance();
float partialTicks = AnimationTickHolder.getPartialTicks();
Vec3 camera = Minecraft.getInstance().gameRenderer.getMainCamera()
.getPosition();
CreateClient.GHOST_BLOCKS.renderAll(ms, buffer, camera); CreateClient.GHOST_BLOCKS.renderAll(ms, buffer);
CreateClient.OUTLINER.renderOutlines(ms, buffer, camera, partialTicks);
CreateClient.OUTLINER.renderOutlines(ms, buffer, pt);
buffer.draw(); buffer.draw();
RenderSystem.enableCull(); RenderSystem.enableCull();
ms.popPose(); ms.popPose();
} }
@@ -91,20 +89,6 @@ public class ClientEvents {
event.setPitch(CameraAngleAnimationService.getPitch(partialTicks)); event.setPitch(CameraAngleAnimationService.getPitch(partialTicks));
} }
@SubscribeEvent
public static void addToItemTooltip(ItemTooltipEvent event) {
// if (!AllConfigs.client().tooltips.get())
// return;
if (event.getEntity() == null)
return;
Item item = event.getItemStack().getItem();
TooltipModifier modifier = TooltipModifier.REGISTRY.get(item);
if (modifier != null && modifier != TooltipModifier.EMPTY) {
modifier.modify(event);
}
}
public static boolean isGameActive() { public static boolean isGameActive() {
return !(Minecraft.getInstance().level == null || Minecraft.getInstance().player == null); return !(Minecraft.getInstance().level == null || Minecraft.getInstance().player == null);
} }

View File

@@ -0,0 +1,39 @@
package nl.requios.effortlessbuilding.create.events;
import net.minecraft.world.level.LevelAccessor;
import net.minecraftforge.event.level.LevelEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import nl.requios.effortlessbuilding.create.foundation.utility.WorldAttached;
@EventBusSubscriber
public class CommonEvents {
@SubscribeEvent
public static void onUnloadWorld(LevelEvent.Unload event) {
LevelAccessor world = event.getLevel();
WorldAttached.invalidateWorld(world);
}
@EventBusSubscriber(bus = EventBusSubscriber.Bus.MOD)
public static class ModBusEvents {
// @SubscribeEvent
// public static void addPackFinders(AddPackFindersEvent event) {
// if (event.getPackType() == PackType.CLIENT_RESOURCES) {
// IModFileInfo modFileInfo = ModList.get().getModFileById(Create.ID);
// if (modFileInfo == null) {
// Create.LOGGER.error("Could not find Create mod file info; built-in resource packs will be missing!");
// return;
// }
// IModFile modFile = modFileInfo.getFile();
// event.addRepositorySource((consumer, constructor) -> {
// consumer.accept(Pack.create(Create.asResource("legacy_copper").toString(), false, () -> new ModFilePackResources("Create Legacy Copper", modFile, "resourcepacks/legacy_copper"), constructor, Pack.Position.TOP, PackSource.DEFAULT));
// });
// }
// }
}
}

View File

@@ -1,9 +1,6 @@
package nl.requios.effortlessbuilding.create.foundation; package nl.requios.effortlessbuilding.create.foundation;
import nl.requios.effortlessbuilding.create.CreateClient;
//import nl.requios.effortlessbuilding.create.foundation.sound.SoundScapes;
import nl.requios.effortlessbuilding.create.foundation.utility.LangNumberFormat; import nl.requios.effortlessbuilding.create.foundation.utility.LangNumberFormat;
import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.ResourceManager;
import net.minecraft.server.packs.resources.ResourceManagerReloadListener; import net.minecraft.server.packs.resources.ResourceManagerReloadListener;
@@ -11,7 +8,7 @@ public class ClientResourceReloadListener implements ResourceManagerReloadListen
@Override @Override
public void onResourceManagerReload(ResourceManager resourceManager) { public void onResourceManagerReload(ResourceManager resourceManager) {
CreateClient.invalidateRenderers(); // CreateClient.invalidateRenderers();
// SoundScapes.invalidateAll(); // SoundScapes.invalidateAll();
LangNumberFormat.numberFormat.update(); LangNumberFormat.numberFormat.update();
} }

View File

@@ -1,10 +1,10 @@
package nl.requios.effortlessbuilding.create.foundation; package nl.requios.effortlessbuilding.create.foundation;
import java.nio.file.Path;
import net.minecraftforge.forgespi.locating.IModFile; import net.minecraftforge.forgespi.locating.IModFile;
import net.minecraftforge.resource.PathPackResources; import net.minecraftforge.resource.PathPackResources;
import java.nio.file.Path;
public class ModFilePackResources extends PathPackResources { public class ModFilePackResources extends PathPackResources {
protected final IModFile modFile; protected final IModFile modFile;
protected final String sourcePath; protected final String sourcePath;

View File

@@ -1,18 +0,0 @@
package nl.requios.effortlessbuilding.create.foundation.events;
import net.minecraft.world.level.LevelAccessor;
import net.minecraftforge.event.level.LevelEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
import nl.requios.effortlessbuilding.create.foundation.utility.WorldAttached;
@EventBusSubscriber
public class CommonEvents {
@SubscribeEvent
public static void onUnloadWorld(LevelEvent.Unload event) {
LevelAccessor world = event.getLevel();
WorldAttached.invalidateWorld(world);
}
}

View File

@@ -1,14 +1,7 @@
package nl.requios.effortlessbuilding.create.foundation.gui; package nl.requios.effortlessbuilding.create.foundation.gui;
import java.util.Collection;
import java.util.List;
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 nl.requios.effortlessbuilding.create.foundation.utility.Components;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.components.EditBox;
import net.minecraft.client.gui.components.Renderable; import net.minecraft.client.gui.components.Renderable;
@@ -18,6 +11,12 @@ 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 java.util.Collection;
import java.util.List;
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public abstract class AbstractSimiScreen extends Screen { public abstract class AbstractSimiScreen extends Screen {
@@ -105,18 +104,16 @@ public abstract class AbstractSimiScreen extends Screen {
} }
@Override @Override
public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { public void render(PoseStack ms, int mouseX, int mouseY, float partialTicks) {
partialTicks = minecraft.getFrameTime(); partialTicks = minecraft.getFrameTime();
PoseStack ms = graphics.pose();
ms.pushPose(); ms.pushPose();
prepareFrame(); prepareFrame();
renderWindowBackground(graphics, mouseX, mouseY, partialTicks); renderWindowBackground(ms, mouseX, mouseY, partialTicks);
renderWindow(graphics, mouseX, mouseY, partialTicks); renderWindow(ms, mouseX, mouseY, partialTicks);
super.render(graphics, mouseX, mouseY, partialTicks); super.render(ms, mouseX, mouseY, partialTicks);
renderWindowForeground(graphics, mouseX, mouseY, partialTicks); renderWindowForeground(ms, mouseX, mouseY, partialTicks);
endFrame(); endFrame();
@@ -140,13 +137,13 @@ public abstract class AbstractSimiScreen extends Screen {
protected void prepareFrame() {} protected void prepareFrame() {}
protected void renderWindowBackground(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { protected void renderWindowBackground(PoseStack ms, int mouseX, int mouseY, float partialTicks) {
renderBackground(graphics); renderBackground(ms);
} }
protected abstract void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks); protected abstract void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks);
protected void renderWindowForeground(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { protected void renderWindowForeground(PoseStack ms, int mouseX, int mouseY, float partialTicks) {
for (Renderable widget : renderables) { for (Renderable widget : renderables) {
if (widget instanceof AbstractSimiWidget simiWidget && simiWidget.isMouseOver(mouseX, mouseY) if (widget instanceof AbstractSimiWidget simiWidget && simiWidget.isMouseOver(mouseX, mouseY)
&& simiWidget.visible) { && simiWidget.visible) {
@@ -155,7 +152,12 @@ public abstract class AbstractSimiScreen extends Screen {
continue; continue;
int ttx = simiWidget.lockedTooltipX == -1 ? mouseX : simiWidget.lockedTooltipX + simiWidget.getX(); int ttx = simiWidget.lockedTooltipX == -1 ? mouseX : simiWidget.lockedTooltipX + simiWidget.getX();
int tty = simiWidget.lockedTooltipY == -1 ? mouseY : simiWidget.lockedTooltipY + simiWidget.getY(); int tty = simiWidget.lockedTooltipY == -1 ? mouseY : simiWidget.lockedTooltipY + simiWidget.getY();
graphics.renderComponentTooltip(font, tooltip, ttx, tty); renderComponentTooltip(ms, tooltip, ttx, tty);
}
//Added
if (widget instanceof ModifiersScreenList list) {
list.renderWindowForeground(ms, mouseX, mouseY, partialTicks);
} }
} }
} }
@@ -163,8 +165,8 @@ public abstract class AbstractSimiScreen extends Screen {
protected void endFrame() {} protected void endFrame() {}
@Deprecated @Deprecated
protected void debugWindowArea(GuiGraphics graphics) { protected void debugWindowArea(PoseStack graphics) {
graphics.fill(guiLeft + windowWidth, guiTop + windowHeight, guiLeft, guiTop, 0xD3D3D3D3); fill(graphics, guiLeft + windowWidth, guiTop + windowHeight, guiLeft, guiTop, 0xD3D3D3D3);
} }
@Override @Override

View File

@@ -1,164 +1,17 @@
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.GuiComponent;
import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import nl.requios.effortlessbuilding.create.Create; import nl.requios.effortlessbuilding.create.Create;
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 net.minecraft.client.gui.GuiGraphics;
import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
public enum AllGuiTextures implements ScreenElement { public enum AllGuiTextures implements ScreenElement {
// Inventories
// PLAYER_INVENTORY("player_inventory", 176, 108),
// WAND_OF_SYMMETRY("curiosities", 0, 131, 188, 101),
// BLOCKZAPPER("curiosities", 0, 99, 214, 97),
// TERRAINZAPPER("curiosities", 234, 103),
// TERRAINZAPPER_INACTIVE_PARAM("curiosities", 238, 0, 18, 18),
//
// LOGO("logo", 256, 256),
// CURSEFORGE_LOGO("platform_icons/curseforge", 256, 256),
// MODRINTH_LOGO("platform_icons/modrinth", 256, 256),
//
// SCHEMATIC("schematics", 192, 121),
// SCHEMATIC_SLOT("widgets", 54, 0, 16, 16),
// SCHEMATIC_PROMPT("schematics_2", 213, 77),
// HUD_BACKGROUND("overlay", 0, 0, 16, 16),
//
// SCHEMATIC_TABLE("schematics", 0, 121, 214, 83),
// SCHEMATIC_TABLE_PROGRESS("schematics", 0, 204, 84, 16),
//
// SCHEMATICANNON_TOP("schematics_2", 0, 77, 213, 42),
// SCHEMATICANNON_BOTTOM("schematics_2", 0, 119, 213, 99),
// SCHEMATICANNON_PROGRESS("schematics_2", 76, 239, 114, 16),
// SCHEMATICANNON_CHECKLIST_PROGRESS("schematics_2", 191, 240, 16, 14),
// SCHEMATICANNON_HIGHLIGHT("schematics_2", 1, 229, 26, 26),
// SCHEMATICANNON_FUEL("schematics_2", 28, 222, 47, 16),
// SCHEMATICANNON_FUEL_CREATIVE("schematics_2", 28, 239, 47, 16),
//
// STOCKSWITCH("logistics", 182, 95),
// STOCKSWITCH_ARROW_UP("logistics", 191, 0, 7, 24),
// STOCKSWITCH_ARROW_DOWN("logistics", 198, 0, 7, 24),
// STOCKSWITCH_CURSOR("logistics", 206, 0, 7, 16),
// STOCKSWITCH_INTERVAL("logistics", 0, 95, 100, 18),
// STOCKSWITCH_UNPOWERED_LANE("logistics", 37, 20, 100, 18),
// STOCKSWITCH_POWERED_LANE("logistics", 37, 42, 100, 18),
//
// FILTER("filters", 214, 99),
// ATTRIBUTE_FILTER("filters", 0, 99, 241, 85),
//
// TOOLBOX("toolbox", 188, 171),
// TOOLBELT_SLOT("minecraft", "widgets", 24, 23, 22, 22),
// TOOLBELT_SLOT_HIGHLIGHT("minecraft", "widgets", 0, 22, 24, 24),
// TOOLBELT_MAIN_SLOT("widgets", 0, 97, 24, 24),
// TOOLBELT_EMPTY_SLOT("widgets", 27, 98, 22, 22),
// TOOLBELT_INACTIVE_SLOT("widgets", 52, 98, 22, 22),
//
// TOOLBELT_HOTBAR_OFF("widgets", 0, 130, 20, 24),
// TOOLBELT_HOTBAR_ON("widgets", 20, 130, 20, 24),
// TOOLBELT_SELECTED_OFF("widgets", 0, 155, 22, 22),
// TOOLBELT_SELECTED_ON("widgets", 22, 155, 22, 22),
//
// SEQUENCER("sequencer", 173, 161),
// SEQUENCER_INSTRUCTION("sequencer", 0, 16, 162, 22),
// SEQUENCER_DELAY("sequencer", 0, 60, 162, 22),
// SEQUENCER_END("sequencer", 0, 82, 162, 22),
// SEQUENCER_EMPTY("sequencer", 0, 104, 162, 22),
// SEQUENCER_AWAIT("sequencer", 0, 162, 162, 22),
//
// LINKED_CONTROLLER("curiosities_2", 179, 109),
// BLUEPRINT("curiosities_2", 0, 109, 179, 109),
//
// CLIPBOARD("clipboard", 0, 0, 256, 256),
//
// DATA_GATHERER("display_link", 235, 162),
// DATA_AREA_START("display_link", 0, 163, 2, 18),
// DATA_AREA_SPEECH("display_link", 8, 163, 5, 18),
// DATA_AREA("display_link", 3, 163, 1, 18),
// DATA_AREA_END("display_link", 5, 163, 2, 18),
//
// SCHEDULE("schedule", 256, 226),
// SCHEDULE_CARD_DARK("schedule", 5, 233, 1, 1),
// SCHEDULE_CARD_MEDIUM("schedule", 6, 233, 1, 1),
// SCHEDULE_CARD_LIGHT("schedule", 7, 233, 1, 1),
// SCHEDULE_CARD_MOVE_UP("schedule", 51, 230, 12, 12),
// SCHEDULE_CARD_MOVE_DOWN("schedule", 65, 230, 12, 12),
// SCHEDULE_CARD_REMOVE("schedule", 51, 243, 12, 12),
// SCHEDULE_CARD_DUPLICATE("schedule", 65, 243, 12, 12),
// SCHEDULE_CARD_NEW("schedule", 79, 239, 16, 16),
// SCHEDULE_CONDITION_NEW("schedule", 96, 239, 19, 16),
// SCHEDULE_CONDITION_LEFT("schedule", 116, 239, 6, 16),
// SCHEDULE_CONDITION_LEFT_CLEAN("schedule", 147, 239, 2, 16),
// SCHEDULE_CONDITION_MIDDLE("schedule", 123, 239, 1, 16),
// SCHEDULE_CONDITION_ITEM("schedule", 125, 239, 18, 16),
// SCHEDULE_CONDITION_RIGHT("schedule", 144, 239, 2, 16),
// SCHEDULE_CONDITION_APPEND("schedule", 150, 245, 10, 10),
// SCHEDULE_SCROLL_LEFT("schedule", 161, 247, 4, 8),
// SCHEDULE_SCROLL_RIGHT("schedule", 166, 247, 4, 8),
// SCHEDULE_STRIP_DARK("schedule", 5, 235, 3, 1),
// SCHEDULE_STRIP_LIGHT("schedule", 5, 237, 3, 1),
// SCHEDULE_STRIP_WAIT("schedule", 1, 239, 11, 16),
// SCHEDULE_STRIP_TRAVEL("schedule", 12, 239, 11, 16),
// SCHEDULE_STRIP_DOTTED("schedule", 23, 239, 11, 16),
// SCHEDULE_STRIP_END("schedule", 34, 239, 11, 16),
// SCHEDULE_STRIP_ACTION("schedule", 209, 239, 11, 16),
// SCHEDULE_EDITOR("schedule_2", 256, 89),
// SCHEDULE_EDITOR_ADDITIONAL_SLOT("schedule_2", 55, 47, 32, 18),
// SCHEDULE_EDITOR_INACTIVE_SLOT("schedule_2", 0, 91, 18, 18),
// SCHEDULE_POINTER("schedule", 185, 239, 21, 16),
// SCHEDULE_POINTER_OFFSCREEN("schedule", 171, 239, 13, 16),
//
// STATION("schedule_2", 0, 111, 200, 127),
// STATION_ASSEMBLING("assemble", 200, 178),
// STATION_TEXTBOX_TOP("assemble", 1, 179, 150, 18),
// STATION_TEXTBOX_MIDDLE("assemble", 1, 198, 150, 1),
// STATION_TEXTBOX_BOTTOM("assemble", 1, 200, 150, 4),
// STATION_TEXTBOX_SPEECH("assemble", 152, 179, 8, 6),
// STATION_EDIT_NAME("schedule_2", 0, 239, 13, 13),
// STATION_EDIT_TRAIN_NAME("schedule_2", 89, 239, 13, 13),
// I_NEW_TRAIN("schedule_2", 14, 239, 24, 16),
// I_DISASSEMBLE_TRAIN("schedule_2", 39, 239, 24, 16),
// I_ASSEMBLE_TRAIN("schedule_2", 64, 239, 24, 16),
//
// ELEVATOR_CONTACT("display_link", 20, 172, 233, 82),
//
// BRASS_FRAME_TL("value_settings", 65, 9, 4, 4),
// BRASS_FRAME_TR("value_settings", 70, 9, 4, 4),
// BRASS_FRAME_BL("value_settings", 65, 19, 4, 4),
// BRASS_FRAME_BR("value_settings", 70, 19, 4, 4),
// BRASS_FRAME_LEFT("value_settings", 65, 14, 3, 4),
// BRASS_FRAME_RIGHT("value_settings", 71, 14, 3, 4),
// BRASS_FRAME_TOP("value_settings", 0, 24, 256, 3),
// BRASS_FRAME_BOTTOM("value_settings", 0, 27, 256, 3),
//
// VALUE_SETTINGS_MILESTONE("value_settings", 0, 0, 7, 8),
// VALUE_SETTINGS_WIDE_MILESTONE("value_settings", 75, 14, 13, 8),
// VALUE_SETTINGS_BAR("value_settings", 7, 0, 249, 8),
// VALUE_SETTINGS_BAR_BG("value_settings", 75, 9, 1, 1),
// VALUE_SETTINGS_OUTER_BG("value_settings", 80, 9, 1, 1),
// VALUE_SETTINGS_CURSOR_LEFT("value_settings", 0, 9, 3, 14),
// VALUE_SETTINGS_CURSOR("value_settings", 4, 9, 56, 14),
// VALUE_SETTINGS_CURSOR_RIGHT("value_settings", 61, 9, 3, 14),
// VALUE_SETTINGS_CURSOR_ICON("value_settings", 0, 44, 22, 20),
// VALUE_SETTINGS_LABEL_BG("value_settings", 0, 31, 81, 11),
//
// // JEI
// JEI_SLOT("jei/widgets", 18, 18),
// JEI_CHANCE_SLOT("jei/widgets", 20, 156, 18, 18),
// JEI_CATALYST_SLOT("jei/widgets", 0, 156, 18, 18),
// JEI_ARROW("jei/widgets", 19, 10, 42, 10),
// JEI_LONG_ARROW("jei/widgets", 19, 0, 71, 10),
// JEI_DOWN_ARROW("jei/widgets", 0, 21, 18, 14),
// JEI_LIGHT("jei/widgets", 0, 42, 52, 11),
// JEI_QUESTION_MARK("jei/widgets", 0, 178, 12, 16),
// JEI_SHADOW("jei/widgets", 0, 56, 52, 11),
// BLOCKZAPPER_UPGRADE_RECIPE("jei/widgets", 0, 75, 144, 66),
// JEI_HEAT_BAR("jei/widgets", 0, 201, 169, 19),
// JEI_NO_HEAT_BAR("jei/widgets", 0, 221, 169, 19),
// Widgets // Widgets
BUTTON("widgets", 18, 18), BUTTON("widgets", 18, 18),
BUTTON_HOVER("widgets", 18, 0, 18, 18), BUTTON_HOVER("widgets", 18, 0, 18, 18),
@@ -177,21 +30,15 @@ public enum AllGuiTextures implements ScreenElement {
SPEECH_TOOLTIP_BACKGROUND("widgets", 0, 24, 8, 8), SPEECH_TOOLTIP_BACKGROUND("widgets", 0, 24, 8, 8),
SPEECH_TOOLTIP_COLOR("widgets", 8, 24, 8, 8), SPEECH_TOOLTIP_COLOR("widgets", 8, 24, 8, 8),
// TRAIN_HUD_SPEED_BG("widgets", 0, 190, 182, 5), TRAIN_HUD_SPEED_BG("widgets", 0, 190, 182, 5),
// TRAIN_HUD_SPEED("widgets", 0, 185, 182, 5), TRAIN_HUD_SPEED("widgets", 0, 185, 182, 5),
// TRAIN_HUD_THROTTLE("widgets", 0, 195, 182, 5), TRAIN_HUD_THROTTLE("widgets", 0, 195, 182, 5),
// TRAIN_HUD_THROTTLE_POINTER("widgets", 0, 209, 6, 9), TRAIN_HUD_THROTTLE_POINTER("widgets", 0, 209, 6, 9),
// TRAIN_HUD_FRAME("widgets", 0, 200, 186, 7), TRAIN_HUD_FRAME("widgets", 0, 200, 186, 7),
// TRAIN_HUD_DIRECTION("widgets", 77, 165, 28, 20), TRAIN_HUD_DIRECTION("widgets", 77, 165, 28, 20),
// TRAIN_PROMPT_L("widgets", 8, 209, 3, 16), TRAIN_PROMPT_L("widgets", 8, 209, 3, 16),
// TRAIN_PROMPT_R("widgets", 11, 209, 3, 16), TRAIN_PROMPT_R("widgets", 11, 209, 3, 16),
// TRAIN_PROMPT("widgets", 0, 230, 256, 16), TRAIN_PROMPT("widgets", 0, 230, 256, 16),
// PlacementIndicator
// PLACEMENT_INDICATOR_SHEET("placement_indicator", 0, 0, 16, 256),
// ComputerCraft
// COMPUTER("computer", 200, 102);
; ;
@@ -226,15 +73,21 @@ public enum AllGuiTextures implements ScreenElement {
RenderSystem.setShaderTexture(0, location); RenderSystem.setShaderTexture(0, location);
} }
@OnlyIn(Dist.CLIENT) public void render(PoseStack ms, int x, int y) {
public void render(GuiGraphics graphics, int x, int y) { bind();
graphics.blit(location, x, y, startX, startY, width, height); GuiComponent.blit(ms, x, y, startX, startY, width, height);
} }
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public void render(GuiGraphics graphics, int x, int y, Color c) { public void render(PoseStack ms, int x, int y, GuiComponent component) {
bind(); bind();
UIRenderHelper.drawColoredTexture(graphics, c, x, y, startX, startY, width, height); component.blit(ms, 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

@@ -1,16 +1,9 @@
package nl.requios.effortlessbuilding.create.foundation.gui; package nl.requios.effortlessbuilding.create.foundation.gui;
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.VertexConsumer; import com.mojang.blaze3d.vertex.VertexConsumer;
import nl.requios.effortlessbuilding.create.Create; import net.minecraft.client.gui.GuiComponent;
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.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;
@@ -18,10 +11,15 @@ 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 {
public static final ResourceLocation ICON_ATLAS = Create.asResource("textures/gui/icons.png"); public static final ResourceLocation ICON_ATLAS = Create.asResource("textures/gui/create_icons.png");
public static final int ICON_ATLAS_SIZE = 256; public static final int ICON_ATLAS_SIZE = 256;
private static int x = 0, y = -1; private static int x = 0, y = -1;
@@ -106,10 +104,6 @@ public class AllIcons implements ScreenElement {
I_ADD_INVERTED_ATTRIBUTE = next(), I_ADD_INVERTED_ATTRIBUTE = next(),
I_FLIP = next(), I_FLIP = next(),
I_ROLLER_PAVE = next(),
I_ROLLER_FILL = next(),
I_ROLLER_WIDE_FILL = next(),
I_PLAY = newRow(), I_PLAY = newRow(),
I_PAUSE = next(), I_PAUSE = next(),
I_STOP = next(), I_STOP = next(),
@@ -129,13 +123,8 @@ public class AllIcons implements ScreenElement {
I_FOLLOW_DIAGONAL = next(), I_FOLLOW_DIAGONAL = next(),
I_FOLLOW_MATERIAL = next(), I_FOLLOW_MATERIAL = next(),
I_CLEAR_CHECKED = next(),
I_SCHEMATIC = newRow(), I_SCHEMATIC = newRow(),
I_SEQ_REPEAT = next(), I_SEQ_REPEAT = next(),
VALUE_BOX_HOVER_6PX = next(),
VALUE_BOX_HOVER_4PX = next(),
VALUE_BOX_HOVER_8PX = next(),
I_MTD_LEFT = newRow(), I_MTD_LEFT = newRow(),
I_MTD_CLOSE = next(), I_MTD_CLOSE = next(),
@@ -184,8 +173,9 @@ public class AllIcons implements ScreenElement {
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
@Override @Override
public void render(GuiGraphics graphics, int x, int y) { public void render(PoseStack ms, int x, int y) {
graphics.blit(ICON_ATLAS, x, y, 0, iconX, iconY, 16, 16, 256, 256); bind();
GuiComponent.blit(ms, x, y, 0, iconX, iconY, 16, 16, 256, 256);
} }
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)

View File

@@ -1,24 +1,20 @@
package nl.requios.effortlessbuilding.create.foundation.gui; package nl.requios.effortlessbuilding.create.foundation.gui;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import javax.annotation.Nonnull;
import org.lwjgl.opengl.GL30;
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 javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
public class ConfirmationScreen extends AbstractSimiScreen { public class ConfirmationScreen extends AbstractSimiScreen {
@@ -177,12 +173,11 @@ public class ConfirmationScreen extends AbstractSimiScreen {
} }
@Override @Override
protected void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) {
textBackground.render(graphics); textBackground.render(ms);
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);
@@ -190,21 +185,21 @@ public class ConfirmationScreen extends AbstractSimiScreen {
lineY += offset; lineY += offset;
if (line == null) if (line == null)
continue; continue;
graphics.drawString(font, line.getString(), x, lineY, 0xeaeaea, false); font.draw(ms, line.getString(), x, lineY, 0xeaeaea);
} }
ms.popPose(); ms.popPose();
} }
@Override @Override
protected void renderWindowBackground(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { protected void renderWindowBackground(PoseStack ms, int mouseX, int mouseY, float partialTicks) {
endFrame(); endFrame();
source.render(graphics, 0, 0, 10); // zero mouse coords to prevent further tooltips source.render(ms, 0, 0, 10); // zero mouse coords to prevent further tooltips
prepareFrame(); prepareFrame();
graphics.fillGradient(0, 0, this.width, this.height, 0x70101010, 0x80101010); fillGradient(ms, 0, 0, this.width, this.height, 0x70101010, 0x80101010);
} }

View File

@@ -1,115 +0,0 @@
package nl.requios.effortlessbuilding.create.foundation.gui;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import nl.requios.effortlessbuilding.create.foundation.gui.widget.ScrollInput;
import nl.requios.effortlessbuilding.create.foundation.gui.widget.TooltipArea;
import nl.requios.effortlessbuilding.create.foundation.utility.Couple;
import nl.requios.effortlessbuilding.create.foundation.utility.Pair;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.components.AbstractWidget;
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.narration.NarratableEntry;
import net.minecraft.nbt.CompoundTag;
public class ModularGuiLine {
List<Pair<AbstractWidget, String>> widgets;
List<Couple<Integer>> customBoxes;
boolean speechBubble;
public ModularGuiLine() {
widgets = new ArrayList<>();
customBoxes = new ArrayList<>();
speechBubble = false;
}
public void renderWidgetBG(int guiLeft, GuiGraphics graphics) {
boolean first = true;
if (!customBoxes.isEmpty()) {
for (Couple<Integer> couple : customBoxes) {
int x = couple.getFirst() + guiLeft;
int width = couple.getSecond();
box(graphics, x, width, first & speechBubble);
first = false;
}
return;
}
for (Pair<AbstractWidget, String> pair : widgets) {
if (pair.getSecond()
.equals("Dummy"))
continue;
AbstractWidget aw = pair.getFirst();
int x = aw.getX();
int width = aw.getWidth();
if (aw instanceof EditBox) {
x -= 5;
width += 9;
}
box(graphics, x, width, first & speechBubble);
first = false;
}
}
private void box(GuiGraphics graphics, int x, int width, boolean b) {
// UIRenderHelper.drawStretched(graphics, x, 0, width, 18, 0, AllGuiTextures.DATA_AREA);
// if (b)
// AllGuiTextures.DATA_AREA_SPEECH.render(graphics, x - 3, 0);
// else
// AllGuiTextures.DATA_AREA_START.render(graphics, x, 0);
// AllGuiTextures.DATA_AREA_END.render(graphics, x + width - 2, 0);
}
public void saveValues(CompoundTag data) {
for (Pair<AbstractWidget, String> pair : widgets) {
AbstractWidget w = pair.getFirst();
String key = pair.getSecond();
if (w instanceof EditBox eb)
data.putString(key, eb.getValue());
if (w instanceof ScrollInput si)
data.putInt(key, si.getState());
}
}
@SuppressWarnings("unchecked")
public <T extends GuiEventListener & Renderable & NarratableEntry> void loadValues(CompoundTag data,
Consumer<T> addRenderable, Consumer<T> addRenderableOnly) {
for (Pair<AbstractWidget, String> pair : widgets) {
AbstractWidget w = pair.getFirst();
String key = pair.getSecond();
if (w instanceof EditBox eb)
eb.setValue(data.getString(key));
if (w instanceof ScrollInput si)
si.setState(data.getInt(key));
if (w instanceof TooltipArea)
addRenderableOnly.accept((T) w);
else
addRenderable.accept((T) w);
}
}
public void forEach(Consumer<GuiEventListener> callback) {
widgets.forEach(p -> callback.accept(p.getFirst()));
}
public void clear() {
widgets.clear();
customBoxes.clear();
}
public void add(Pair<AbstractWidget, String> pair) {
widgets.add(pair);
}
}

View File

@@ -1,91 +0,0 @@
package nl.requios.effortlessbuilding.create.foundation.gui;
import java.util.function.BiConsumer;
import nl.requios.effortlessbuilding.create.foundation.gui.widget.Label;
import nl.requios.effortlessbuilding.create.foundation.gui.widget.ScrollInput;
import nl.requios.effortlessbuilding.create.foundation.gui.widget.SelectionScrollInput;
import nl.requios.effortlessbuilding.create.foundation.gui.widget.TooltipArea;
import nl.requios.effortlessbuilding.create.foundation.utility.Components;
import nl.requios.effortlessbuilding.create.foundation.utility.Couple;
import nl.requios.effortlessbuilding.create.foundation.utility.Pair;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.components.EditBox;
public class ModularGuiLineBuilder {
private ModularGuiLine target;
private Font font;
private int x;
private int y;
public ModularGuiLineBuilder(Font font, ModularGuiLine target, int x, int y) {
this.font = font;
this.target = target;
this.x = x;
this.y = y;
}
public ModularGuiLineBuilder addScrollInput(int x, int width, BiConsumer<ScrollInput, Label> inputTransform,
String dataKey) {
ScrollInput input = new ScrollInput(x + this.x, y - 4, width, 18);
addScrollInput(input, inputTransform, dataKey);
return this;
}
public ModularGuiLineBuilder addSelectionScrollInput(int x, int width,
BiConsumer<SelectionScrollInput, Label> inputTransform, String dataKey) {
SelectionScrollInput input = new SelectionScrollInput(x + this.x, y - 4, width, 18);
addScrollInput(input, inputTransform, dataKey);
return this;
}
public ModularGuiLineBuilder customArea(int x, int width) {
target.customBoxes.add(Couple.create(x, width));
return this;
}
public ModularGuiLineBuilder speechBubble() {
target.speechBubble = true;
return this;
}
private <T extends ScrollInput> void addScrollInput(T input, BiConsumer<T, Label> inputTransform, String dataKey) {
Label label = new Label(input.getX() + 5, y, Components.immutableEmpty());
label.withShadow();
inputTransform.accept(input, label);
input.writingTo(label);
target.add(Pair.of(label, "Dummy"));
target.add(Pair.of(input, dataKey));
}
public ModularGuiLineBuilder addIntegerTextInput(int x, int width, BiConsumer<EditBox, TooltipArea> inputTransform,
String dataKey) {
return addTextInput(x, width, inputTransform.andThen((editBox, $) -> editBox.setFilter(s -> {
if (s.isEmpty())
return true;
try {
Integer.parseInt(s);
return true;
} catch (NumberFormatException e) {
return false;
}
})), dataKey);
}
public ModularGuiLineBuilder addTextInput(int x, int width, BiConsumer<EditBox, TooltipArea> inputTransform,
String dataKey) {
EditBox input = new EditBox(font, x + this.x + 5, y, width - 9, 8, Components.immutableEmpty());
input.setBordered(false);
input.setTextColor(0xffffff);
input.setFocused(false);
input.mouseClicked(0, 0, 0);
TooltipArea tooltipArea = new TooltipArea(this.x + x, y - 4, width, 18);
inputTransform.accept(input, tooltipArea);
target.add(Pair.of(input, dataKey));
target.add(Pair.of(tooltipArea, "Dummy"));
return this;
}
}

View File

@@ -1,203 +1,202 @@
package nl.requios.effortlessbuilding.create.foundation.gui; //package nl.requios.effortlessbuilding.create.foundation.gui;
//
import java.util.ArrayList; //import java.util.ArrayList;
import java.util.List; //import java.util.List;
//
import javax.annotation.Nonnull; //import javax.annotation.Nonnull;
//
import org.joml.Matrix4f; //import net.minecraft.client.gui.GuiComponent;
//import org.joml.Matrix4f;
import com.mojang.blaze3d.systems.RenderSystem; //
import com.mojang.blaze3d.vertex.PoseStack; //import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.Tesselator; //import com.mojang.blaze3d.vertex.PoseStack;
//import com.mojang.blaze3d.vertex.Tesselator;
import net.minecraft.client.gui.Font; //
import net.minecraft.client.gui.GuiGraphics; //import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; //import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.renderer.MultiBufferSource; //import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent;
import net.minecraft.network.chat.FormattedText; //import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.network.chat.Style; //import net.minecraft.network.chat.FormattedText;
import net.minecraft.world.item.ItemStack; //import net.minecraft.network.chat.Style;
import net.minecraftforge.client.ForgeHooksClient; //import net.minecraft.world.item.ItemStack;
import net.minecraftforge.client.event.RenderTooltipEvent; //import net.minecraftforge.client.ForgeHooksClient;
import net.minecraftforge.client.extensions.IForgeGuiGraphics; //import net.minecraftforge.client.event.RenderTooltipEvent;
import net.minecraftforge.common.MinecraftForge; //import net.minecraftforge.client.extensions.IForgeGuiGraphics;
//import net.minecraftforge.common.MinecraftForge;
public class RemovedGuiUtils { //
@Nonnull //public class RemovedGuiUtils {
private static ItemStack cachedTooltipStack = ItemStack.EMPTY; // @Nonnull
// private static ItemStack cachedTooltipStack = ItemStack.EMPTY;
public static void preItemToolTip(@Nonnull ItemStack stack) { //
cachedTooltipStack = stack; // public static void preItemToolTip(@Nonnull ItemStack stack) {
} // cachedTooltipStack = stack;
// }
public static void postItemToolTip() { //
cachedTooltipStack = ItemStack.EMPTY; // public static void postItemToolTip() {
} // cachedTooltipStack = ItemStack.EMPTY;
// }
public static void drawHoveringText(GuiGraphics graphics, List<? extends FormattedText> textLines, int mouseX, //
int mouseY, int screenWidth, int screenHeight, int maxTextWidth, Font font) { // public static void drawHoveringText(PoseStack graphics, List<? extends FormattedText> textLines, int mouseX,
drawHoveringText(graphics, textLines, mouseX, mouseY, screenWidth, screenHeight, maxTextWidth, // int mouseY, int screenWidth, int screenHeight, int maxTextWidth, Font font) {
IForgeGuiGraphics.DEFAULT_BACKGROUND_COLOR, IForgeGuiGraphics.DEFAULT_BORDER_COLOR_START, IForgeGuiGraphics.DEFAULT_BORDER_COLOR_END, // drawHoveringText(graphics, textLines, mouseX, mouseY, screenWidth, screenHeight, maxTextWidth,
font); // IForgeGuiGraphics.DEFAULT_BACKGROUND_COLOR, IForgeGuiGraphics.DEFAULT_BORDER_COLOR_START, IForgeGuiGraphics.DEFAULT_BORDER_COLOR_END,
} // font);
// }
public static void drawHoveringText(GuiGraphics graphics, List<? extends FormattedText> textLines, int mouseX, //
int mouseY, int screenWidth, int screenHeight, int maxTextWidth, int backgroundColor, int borderColorStart, // public static void drawHoveringText(PoseStack graphics, List<? extends FormattedText> textLines, int mouseX,
int borderColorEnd, Font font) { // int mouseY, int screenWidth, int screenHeight, int maxTextWidth, int backgroundColor, int borderColorStart,
drawHoveringText(cachedTooltipStack, graphics, textLines, mouseX, mouseY, screenWidth, screenHeight, maxTextWidth, // int borderColorEnd, Font font) {
backgroundColor, borderColorStart, borderColorEnd, font); // drawHoveringText(cachedTooltipStack, graphics, textLines, mouseX, mouseY, screenWidth, screenHeight, maxTextWidth,
} // backgroundColor, borderColorStart, borderColorEnd, font);
// }
public static void drawHoveringText(@Nonnull final ItemStack stack, GuiGraphics graphics, //
List<? extends FormattedText> textLines, int mouseX, int mouseY, int screenWidth, int screenHeight, // public static void drawHoveringText(@Nonnull final ItemStack stack, PoseStack graphics,
int maxTextWidth, Font font) { // List<? extends FormattedText> textLines, int mouseX, int mouseY, int screenWidth, int screenHeight,
drawHoveringText(stack, graphics, textLines, mouseX, mouseY, screenWidth, screenHeight, maxTextWidth, // int maxTextWidth, Font font) {
IForgeGuiGraphics.DEFAULT_BACKGROUND_COLOR, IForgeGuiGraphics.DEFAULT_BORDER_COLOR_START, IForgeGuiGraphics.DEFAULT_BORDER_COLOR_END, // drawHoveringText(stack, graphics, textLines, mouseX, mouseY, screenWidth, screenHeight, maxTextWidth,
font); // IForgeGuiGraphics.DEFAULT_BACKGROUND_COLOR, IForgeGuiGraphics.DEFAULT_BORDER_COLOR_START, IForgeGuiGraphics.DEFAULT_BORDER_COLOR_END,
} // font);
// }
public static void drawHoveringText(@Nonnull final ItemStack stack, GuiGraphics graphics, //
List<? extends FormattedText> textLines, int mouseX, int mouseY, int screenWidth, int screenHeight, // public static void drawHoveringText(@Nonnull final ItemStack stack, PoseStack pStack,
int maxTextWidth, int backgroundColor, int borderColorStart, int borderColorEnd, Font font) { // List<? extends FormattedText> textLines, int mouseX, int mouseY, int screenWidth, int screenHeight,
if (textLines.isEmpty()) // int maxTextWidth, int backgroundColor, int borderColorStart, int borderColorEnd, Font font) {
return; // if (textLines.isEmpty())
// return;
List<ClientTooltipComponent> list = ForgeHooksClient.gatherTooltipComponents(stack, textLines, //
stack.getTooltipImage(), mouseX, screenWidth, screenHeight, font); // List<ClientTooltipComponent> list = ForgeHooksClient.gatherTooltipComponents(stack, textLines,
RenderTooltipEvent.Pre event = // stack.getTooltipImage(), mouseX, screenWidth, screenHeight, font);
new RenderTooltipEvent.Pre(stack, graphics, mouseX, mouseY, screenWidth, screenHeight, font, list, null); // RenderTooltipEvent.Pre event =
if (MinecraftForge.EVENT_BUS.post(event)) // new RenderTooltipEvent.Pre(stack, pStack, mouseX, mouseY, screenWidth, screenHeight, font, list, null);
return; // if (MinecraftForge.EVENT_BUS.post(event))
// return;
PoseStack pStack = graphics.pose(); //
// mouseX = event.getX();
mouseX = event.getX(); // mouseY = event.getY();
mouseY = event.getY(); // screenWidth = event.getScreenWidth();
screenWidth = event.getScreenWidth(); // screenHeight = event.getScreenHeight();
screenHeight = event.getScreenHeight(); // font = event.getFont();
font = event.getFont(); //
// // RenderSystem.disableRescaleNormal();
// RenderSystem.disableRescaleNormal(); // RenderSystem.disableDepthTest();
RenderSystem.disableDepthTest(); // int tooltipTextWidth = 0;
int tooltipTextWidth = 0; //
// for (FormattedText textLine : textLines) {
for (FormattedText textLine : textLines) { // int textLineWidth = font.width(textLine);
int textLineWidth = font.width(textLine); // if (textLineWidth > tooltipTextWidth)
if (textLineWidth > tooltipTextWidth) // tooltipTextWidth = textLineWidth;
tooltipTextWidth = textLineWidth; // }
} //
// boolean needsWrap = false;
boolean needsWrap = false; //
// int titleLinesCount = 1;
int titleLinesCount = 1; // int tooltipX = mouseX + 12;
int tooltipX = mouseX + 12; // if (tooltipX + tooltipTextWidth + 4 > screenWidth) {
if (tooltipX + tooltipTextWidth + 4 > screenWidth) { // tooltipX = mouseX - 16 - tooltipTextWidth;
tooltipX = mouseX - 16 - tooltipTextWidth; // if (tooltipX < 4) // if the tooltip doesn't fit on the screen
if (tooltipX < 4) // if the tooltip doesn't fit on the screen // {
{ // if (mouseX > screenWidth / 2)
if (mouseX > screenWidth / 2) // tooltipTextWidth = mouseX - 12 - 8;
tooltipTextWidth = mouseX - 12 - 8; // else
else // tooltipTextWidth = screenWidth - 16 - mouseX;
tooltipTextWidth = screenWidth - 16 - mouseX; // needsWrap = true;
needsWrap = true; // }
} // }
} //
// if (maxTextWidth > 0 && tooltipTextWidth > maxTextWidth) {
if (maxTextWidth > 0 && tooltipTextWidth > maxTextWidth) { // tooltipTextWidth = maxTextWidth;
tooltipTextWidth = maxTextWidth; // needsWrap = true;
needsWrap = true; // }
} //
// if (needsWrap) {
if (needsWrap) { // int wrappedTooltipWidth = 0;
int wrappedTooltipWidth = 0; // List<FormattedText> wrappedTextLines = new ArrayList<>();
List<FormattedText> wrappedTextLines = new ArrayList<>(); // for (int i = 0; i < textLines.size(); i++) {
for (int i = 0; i < textLines.size(); i++) { // FormattedText textLine = textLines.get(i);
FormattedText textLine = textLines.get(i); // List<FormattedText> wrappedLine = font.getSplitter()
List<FormattedText> wrappedLine = font.getSplitter() // .splitLines(textLine, tooltipTextWidth, Style.EMPTY);
.splitLines(textLine, tooltipTextWidth, Style.EMPTY); // if (i == 0)
if (i == 0) // titleLinesCount = wrappedLine.size();
titleLinesCount = wrappedLine.size(); //
// for (FormattedText line : wrappedLine) {
for (FormattedText line : wrappedLine) { // int lineWidth = font.width(line);
int lineWidth = font.width(line); // if (lineWidth > wrappedTooltipWidth)
if (lineWidth > wrappedTooltipWidth) // wrappedTooltipWidth = lineWidth;
wrappedTooltipWidth = lineWidth; // wrappedTextLines.add(line);
wrappedTextLines.add(line); // }
} // }
} // tooltipTextWidth = wrappedTooltipWidth;
tooltipTextWidth = wrappedTooltipWidth; // textLines = wrappedTextLines;
textLines = wrappedTextLines; //
// if (mouseX > screenWidth / 2)
if (mouseX > screenWidth / 2) // tooltipX = mouseX - 16 - tooltipTextWidth;
tooltipX = mouseX - 16 - tooltipTextWidth; // else
else // tooltipX = mouseX + 12;
tooltipX = mouseX + 12; // }
} //
// int tooltipY = mouseY - 12;
int tooltipY = mouseY - 12; // int tooltipHeight = 8;
int tooltipHeight = 8; //
// if (textLines.size() > 1) {
if (textLines.size() > 1) { // tooltipHeight += (textLines.size() - 1) * 10;
tooltipHeight += (textLines.size() - 1) * 10; // if (textLines.size() > titleLinesCount)
if (textLines.size() > titleLinesCount) // tooltipHeight += 2; // gap between title lines and next lines
tooltipHeight += 2; // gap between title lines and next lines // }
} //
// if (tooltipY < 4)
if (tooltipY < 4) // tooltipY = 4;
tooltipY = 4; // else if (tooltipY + tooltipHeight + 4 > screenHeight)
else if (tooltipY + tooltipHeight + 4 > screenHeight) // 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(); // borderColorStart = colorEvent.getBorderStart();
borderColorStart = colorEvent.getBorderStart(); // borderColorEnd = colorEvent.getBorderEnd();
borderColorEnd = colorEvent.getBorderEnd(); //
// pStack.pushPose();
pStack.pushPose(); // Matrix4f mat = pStack.last()
Matrix4f mat = pStack.last() // .pose();
.pose(); // GuiComponent.fillGradient(pStack, tooltipX - 3, tooltipY - 4, tooltipX + tooltipTextWidth + 3,
graphics.fillGradient(tooltipX - 3, tooltipY - 4, tooltipX + tooltipTextWidth + 3, // tooltipY - 3, zLevel, backgroundColor, backgroundColor);
tooltipY - 3, zLevel, backgroundColor, backgroundColor); // GuiComponent.fillGradient(pStack, tooltipX - 3, tooltipY + tooltipHeight + 3,
graphics.fillGradient(tooltipX - 3, tooltipY + tooltipHeight + 3, // tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 4, zLevel, backgroundColor, backgroundColor);
tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 4, zLevel, backgroundColor, backgroundColor); // GuiComponent.fillGradient(pStack, tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3,
graphics.fillGradient(tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3, // tooltipY + tooltipHeight + 3, zLevel, backgroundColor, backgroundColor);
tooltipY + tooltipHeight + 3, zLevel, backgroundColor, backgroundColor); // GuiComponent.fillGradient(pStack, tooltipX - 4, tooltipY - 3, tooltipX - 3, tooltipY + tooltipHeight + 3,
graphics.fillGradient(tooltipX - 4, tooltipY - 3, tooltipX - 3, tooltipY + tooltipHeight + 3, // zLevel, backgroundColor, backgroundColor);
zLevel, backgroundColor, backgroundColor); // GuiComponent.fillGradient(pStack, tooltipX + tooltipTextWidth + 3, tooltipY - 3,
graphics.fillGradient(tooltipX + tooltipTextWidth + 3, tooltipY - 3, // tooltipX + tooltipTextWidth + 4, tooltipY + tooltipHeight + 3, zLevel, backgroundColor, backgroundColor);
tooltipX + tooltipTextWidth + 4, tooltipY + tooltipHeight + 3, zLevel, backgroundColor, backgroundColor); // GuiComponent.fillGradient(pStack, tooltipX - 3, tooltipY - 3 + 1, tooltipX - 3 + 1,
graphics.fillGradient(tooltipX - 3, tooltipY - 3 + 1, tooltipX - 3 + 1, // tooltipY + tooltipHeight + 3 - 1, zLevel, borderColorStart, borderColorEnd);
tooltipY + tooltipHeight + 3 - 1, zLevel, borderColorStart, borderColorEnd); // GuiComponent.fillGradient(pStack, tooltipX + tooltipTextWidth + 2, tooltipY - 3 + 1,
graphics.fillGradient(tooltipX + tooltipTextWidth + 2, tooltipY - 3 + 1, // tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3 - 1, zLevel, borderColorStart, borderColorEnd);
tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3 - 1, zLevel, borderColorStart, borderColorEnd); // GuiComponent.fillGradient(pStack, tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3,
graphics.fillGradient(tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3, // tooltipY - 3 + 1, zLevel, borderColorStart, borderColorStart);
tooltipY - 3 + 1, zLevel, borderColorStart, borderColorStart); // GuiComponent.fillGradient(pStack, tooltipX - 3, tooltipY + tooltipHeight + 2,
graphics.fillGradient(tooltipX - 3, tooltipY + tooltipHeight + 2, // tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3, zLevel, 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()); // pStack.translate(0.0D, 0.0D, zLevel);
pStack.translate(0.0D, 0.0D, zLevel); //
// for (int lineNumber = 0; lineNumber < list.size(); ++lineNumber) {
for (int lineNumber = 0; lineNumber < list.size(); ++lineNumber) { // ClientTooltipComponent line = list.get(lineNumber);
ClientTooltipComponent line = list.get(lineNumber); //
// if (line != null)
if (line != null) // line.renderText(font, tooltipX, tooltipY, mat, renderType);
line.renderText(font, tooltipX, tooltipY, mat, renderType); //
// if (lineNumber + 1 == titleLinesCount)
if (lineNumber + 1 == titleLinesCount) // tooltipY += 2;
tooltipY += 2; //
// tooltipY += 10;
tooltipY += 10; // }
} //
// renderType.endBatch();
renderType.endBatch(); // pStack.popPose();
pStack.popPose(); //
// RenderSystem.enableDepthTest();
RenderSystem.enableDepthTest(); // }
} //}
}

View File

@@ -1,18 +1,12 @@
package nl.requios.effortlessbuilding.create.foundation.gui; package nl.requios.effortlessbuilding.create.foundation.gui;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
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 javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.*;
public class Theme { public class Theme {
private static final List<Theme> THEMES = new ArrayList<>(); private static final List<Theme> THEMES = new ArrayList<>();

View File

@@ -1,9 +1,5 @@
package nl.requios.effortlessbuilding.create.foundation.gui; package nl.requios.effortlessbuilding.create.foundation.gui;
import org.joml.Matrix4f;
import org.lwjgl.opengl.GL20;
import org.lwjgl.opengl.GL30;
import com.mojang.blaze3d.pipeline.RenderTarget; import com.mojang.blaze3d.pipeline.RenderTarget;
import com.mojang.blaze3d.platform.GlConst; import com.mojang.blaze3d.platform.GlConst;
import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.platform.GlStateManager;
@@ -15,12 +11,14 @@ import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.Tesselator; import com.mojang.blaze3d.vertex.Tesselator;
import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.blaze3d.vertex.VertexFormat;
import com.mojang.math.Axis; import com.mojang.math.Axis;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraftforge.client.gui.ScreenUtils;
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 org.joml.Matrix4f;
import net.minecraft.client.Minecraft; import org.lwjgl.opengl.GL20;
import net.minecraft.client.gui.GuiGraphics; import org.lwjgl.opengl.GL30;
import net.minecraft.client.renderer.GameRenderer;
public class UIRenderHelper { public class UIRenderHelper {
@@ -57,14 +55,14 @@ public class UIRenderHelper {
GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, dst.frameBufferId); GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, dst.frameBufferId);
} }
public static void streak(GuiGraphics graphics, float angle, int x, int y, int breadth, int length) { public static void streak(PoseStack ms, float angle, int x, int y, int breadth, int length) {
streak(graphics, angle, x, y, breadth, length, Theme.i(Theme.Key.STREAK)); streak(ms, 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(GuiGraphics graphics, float angle, int x, int y, int breadth, int length, int color) { public static void streak(PoseStack ms, 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;
@@ -76,60 +74,59 @@ 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(Axis.ZP.rotationDegrees(angle - 90)); ms.mulPose(Axis.ZP.rotationDegrees(angle - 90));
streak(graphics, breadth / 2, length, c1, c2, c3, c4); streak(ms, breadth / 2, length, c1, c2, c3, c4);
ms.popPose(); ms.popPose();
} }
public static void streak(GuiGraphics graphics, float angle, int x, int y, int breadth, int length, Color c) { public static void streak(PoseStack ms, 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(Axis.ZP.rotationDegrees(angle - 90)); ms.mulPose(Axis.ZP.rotationDegrees(angle - 90));
streak(graphics, breadth / 2, length, c1, c2, c3, c4); streak(ms, breadth / 2, length, c1, c2, c3, c4);
ms.popPose(); ms.popPose();
} }
private static void streak(GuiGraphics graphics, int width, int height, int c1, int c2, int c3, int c4) { private static void streak(PoseStack ms, int width, int height, int c1, int c2, int c3, int c4) {
double split1 = .5; double split1 = .5;
double split2 = .75; double split2 = .75;
graphics.fillGradient(-width, 0, width, (int) (split1 * height), 0, c1, c2); Matrix4f model = ms.last().pose();
graphics.fillGradient(-width, (int) (split1 * height), width, (int) (split2 * height), 0, c2, c3); ScreenUtils.drawGradientRect(model, -width, 0, width, (int) (split1 * height), 0, c1, c2);
graphics.fillGradient(-width, (int) (split2 * height), width, height, 0, c3, c4); ScreenUtils.drawGradientRect(model, -width, (int) (split1 * height), width, (int) (split2 * height), 0, c2, c3);
ScreenUtils.drawGradientRect(model, -width, (int) (split2 * height), width, height, 0, c3, c4);
} }
/** /**
* @see #angledGradient(MatrixStack, float, int, int, int, int, int, Color, Color) * @see #angledGradient(PoseStack, float, int, int, int, int, int, Color, Color)
*/ */
public static void angledGradient(GuiGraphics graphics, float angle, int x, int y, int breadth, int length, Couple<Color> c) { public static void angledGradient(PoseStack ms, float angle, int x, int y, int breadth, int length, Couple<Color> c) {
angledGradient(graphics, angle, x, y, 0, breadth, length, c); angledGradient(ms, angle, x, y, 0, breadth, length, c);
} }
/** /**
* @see #angledGradient(MatrixStack, float, int, int, int, int, int, Color, Color) * @see #angledGradient(PoseStack, float, int, int, int, int, int, Color, Color)
*/ */
public static void angledGradient(GuiGraphics graphics, float angle, int x, int y, int z, int breadth, int length, Couple<Color> c) { public static void angledGradient(PoseStack ms, float angle, int x, int y, int z, int breadth, int length, Couple<Color> c) {
angledGradient(graphics, angle, x, y, z, breadth, length, c.getFirst(), c.getSecond()); angledGradient(ms, angle, x, y, z, breadth, length, c.getFirst(), c.getSecond());
} }
/** /**
* @see #angledGradient(MatrixStack, float, int, int, int, int, int, Color, Color) * @see #angledGradient(PoseStack, float, int, int, int, int, int, Color, Color)
*/ */
public static void angledGradient(GuiGraphics graphics, float angle, int x, int y, int breadth, int length, Color color1, Color color2) { public static void angledGradient(PoseStack ms, float angle, int x, int y, int breadth, int length, Color color1, Color color2) {
angledGradient(graphics, angle, x, y, 0, breadth, length, color1, color2); angledGradient(ms, angle, x, y, 0, breadth, length, color1, color2);
} }
/** /**
@@ -140,32 +137,31 @@ 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(GuiGraphics graphics, float angle, int x, int y, int z, int breadth, int length, Color color1, Color color2) { public static void angledGradient(PoseStack ms, 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(Axis.ZP.rotationDegrees(angle - 90)); ms.mulPose(Axis.ZP.rotationDegrees(angle - 90));
int w = breadth / 2; int w = breadth / 2;
graphics.fillGradient(-w, 0, w, length, 0, color1.getRGB(), color2.getRGB()); Matrix4f model = ms.last().pose();
ScreenUtils.drawGradientRect(model, -w, 0, w, length, 0, color1.getRGB(), color2.getRGB());
ms.popPose(); ms.popPose();
} }
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());} public static void breadcrumbArrow(PoseStack ms, int x, int y, int z, int width, int height, int indent, Couple<Color> colors) {breadcrumbArrow(ms, 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(GuiGraphics graphics, int x, int y, int z, int width, int height, int indent, Color startColor, Color endColor) { public static void breadcrumbArrow(PoseStack ms, int x, int y, int z, int width, int height, int indent, Color startColor, Color endColor) {
PoseStack matrixStack = graphics.pose(); ms.pushPose();
matrixStack.pushPose(); ms.translate(x - indent, y, z);
matrixStack.translate(x - indent, y, z);
breadcrumbArrow(graphics, width, height, indent, startColor, endColor); breadcrumbArrow(ms, width, height, indent, startColor, endColor);
matrixStack.popPose(); ms.popPose();
} }
private static void breadcrumbArrow(GuiGraphics graphics, int width, int height, int indent, Color c1, Color c2) { private static void breadcrumbArrow(PoseStack ms, 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
@@ -203,7 +199,7 @@ public class UIRenderHelper {
Tesselator tessellator = Tesselator.getInstance(); Tesselator tessellator = Tesselator.getInstance();
BufferBuilder bufferbuilder = tessellator.getBuilder(); BufferBuilder bufferbuilder = tessellator.getBuilder();
Matrix4f model = graphics.pose().last().pose(); Matrix4f model = ms.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();
@@ -237,30 +233,30 @@ public class UIRenderHelper {
} }
//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(GuiGraphics graphics, Color c, int x, int y, int tex_left, int tex_top, int width, int height) { public static void drawColoredTexture(PoseStack ms, Color c, int x, int y, int tex_left, int tex_top, int width, int height) {
drawColoredTexture(graphics, c, x, y, 0, (float) tex_left, (float) tex_top, width, height, 256, 256); drawColoredTexture(ms, c, x, y, 0, (float) tex_left, (float) tex_top, width, height, 256, 256);
} }
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) { 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) {
drawColoredTexture(graphics, c, x, x + width, y, y + height, z, width, height, tex_left, tex_top, sheet_width, sheet_height); drawColoredTexture(ms, c, x, x + width, y, y + height, z, width, height, tex_left, tex_top, sheet_width, sheet_height);
} }
public static void drawStretched(GuiGraphics graphics, int left, int top, int w, int h, int z, AllGuiTextures tex) { public static void drawStretched(PoseStack ms, int left, int top, int w, int h, int z, AllGuiTextures tex) {
tex.bind(); tex.bind();
drawTexturedQuad(graphics.pose().last() drawTexturedQuad(ms.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);
} }
public static void drawCropped(GuiGraphics graphics, int left, int top, int w, int h, int z, AllGuiTextures tex) { public static void drawCropped(PoseStack ms, int left, int top, int w, int h, int z, AllGuiTextures tex) {
tex.bind(); tex.bind();
drawTexturedQuad(graphics.pose().last() drawTexturedQuad(ms.last()
.pose(), Color.WHITE, left, left + w, top, top + h, z, tex.startX / 256f, (tex.startX + w) / 256f, .pose(), Color.WHITE, left, left + w, top, top + h, z, tex.startX / 256f, (tex.startX + w) / 256f,
tex.startY / 256f, (tex.startY + h) / 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) { 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) {
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); 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);
} }
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) {

View File

@@ -1,17 +1,7 @@
package nl.requios.effortlessbuilding.create.foundation.gui.menu; package nl.requios.effortlessbuilding.create.foundation.gui.container;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import javax.annotation.ParametersAreNonnullByDefault;
import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.platform.InputConstants;
import nl.requios.effortlessbuilding.create.foundation.gui.AllGuiTextures; import com.mojang.blaze3d.vertex.PoseStack;
import nl.requios.effortlessbuilding.create.foundation.gui.TickableGuiEventListener;
import nl.requios.effortlessbuilding.create.foundation.gui.widget.AbstractSimiWidget;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.components.EditBox;
import net.minecraft.client.gui.components.Renderable; import net.minecraft.client.gui.components.Renderable;
@@ -25,6 +15,13 @@ 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 java.util.Collection;
import java.util.Collections;
import java.util.List;
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
@ParametersAreNonnullByDefault @ParametersAreNonnullByDefault
@@ -94,26 +91,26 @@ public abstract class AbstractSimiContainerScreen<T extends AbstractContainerMen
} }
@Override @Override
public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { public void render(PoseStack ms, int mouseX, int mouseY, float partialTicks) {
partialTicks = minecraft.getFrameTime(); partialTicks = minecraft.getFrameTime();
renderBackground(graphics); renderBackground(ms);
super.render(graphics, mouseX, mouseY, partialTicks); super.render(ms, mouseX, mouseY, partialTicks);
renderForeground(graphics, mouseX, mouseY, partialTicks); renderForeground(ms, mouseX, mouseY, partialTicks);
} }
@Override @Override
protected void renderLabels(GuiGraphics graphics, int mouseX, int mouseY) { protected void renderLabels(PoseStack ms, 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(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { protected void renderForeground(PoseStack ms, int mouseX, int mouseY, float partialTicks) {
renderTooltip(graphics, mouseX, mouseY); renderTooltip(ms, mouseX, mouseY);
for (Renderable widget : renderables) { for (Renderable widget : renderables) {
if (widget instanceof AbstractSimiWidget simiWidget && simiWidget.isMouseOver(mouseX, mouseY)) { if (widget instanceof AbstractSimiWidget simiWidget && simiWidget.isMouseOver(mouseX, mouseY)) {
List<Component> tooltip = simiWidget.getToolTip(); List<Component> tooltip = simiWidget.getToolTip();
@@ -121,7 +118,7 @@ public abstract class AbstractSimiContainerScreen<T extends AbstractContainerMen
continue; continue;
int ttx = simiWidget.lockedTooltipX == -1 ? mouseX : simiWidget.lockedTooltipX + simiWidget.getX(); int ttx = simiWidget.lockedTooltipX == -1 ? mouseX : simiWidget.lockedTooltipX + simiWidget.getX();
int tty = simiWidget.lockedTooltipY == -1 ? mouseY : simiWidget.lockedTooltipY + simiWidget.getY(); int tty = simiWidget.lockedTooltipY == -1 ? mouseY : simiWidget.lockedTooltipY + simiWidget.getY();
graphics.renderComponentTooltip(font, tooltip, ttx, tty); renderComponentTooltip(ms, tooltip, ttx, tty);
} }
} }
} }
@@ -130,10 +127,10 @@ public abstract class AbstractSimiContainerScreen<T extends AbstractContainerMen
return leftPos - windowXOffset + (imageWidth - textureWidth) / 2; return leftPos - windowXOffset + (imageWidth - textureWidth) / 2;
} }
public void renderPlayerInventory(GuiGraphics graphics, int x, int y) { // public void renderPlayerInventory(PoseStack graphics, int x, int y) {
// AllGuiTextures.PLAYER_INVENTORY.render(graphics, x, y); // AllGuiTextures.PLAYER_INVENTORY.render(graphics, x, y);
graphics.drawString(font, playerInventoryTitle, x + 8, y + 6, 0x404040, false); // 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) {
@@ -170,14 +167,14 @@ public abstract class AbstractSimiContainerScreen<T extends AbstractContainerMen
} }
@Deprecated @Deprecated
protected void debugWindowArea(GuiGraphics graphics) { protected void debugWindowArea(PoseStack ms) {
graphics.fill(leftPos + imageWidth, topPos + imageHeight, leftPos, topPos, 0xD3D3D3D3); fill(ms, leftPos + imageWidth, topPos + imageHeight, leftPos, topPos, 0xD3D3D3D3);
} }
@Deprecated @Deprecated
protected void debugExtraAreas(GuiGraphics graphics) { protected void debugExtraAreas(PoseStack ms) {
for (Rect2i area : getExtraAreas()) { for (Rect2i area : getExtraAreas()) {
graphics.fill(area.getX() + area.getWidth(), area.getY() + area.getHeight(), area.getX(), area.getY(), fill(ms, area.getX() + area.getWidth(), area.getY() + area.getHeight(), area.getX(), area.getY(),
0xD3D3D3D3); 0xD3D3D3D3);
} }
} }

View File

@@ -1,10 +1,9 @@
package nl.requios.effortlessbuilding.create.foundation.gui.menu; 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.minecraftforge.network.NetworkEvent.Context; import net.minecraftforge.network.NetworkEvent.Context;
import nl.requios.effortlessbuilding.create.foundation.networking.SimplePacketBase;
public class ClearMenuPacket extends SimplePacketBase { public class ClearMenuPacket extends SimplePacketBase {

View File

@@ -1,4 +1,4 @@
package nl.requios.effortlessbuilding.create.foundation.gui.menu; package nl.requios.effortlessbuilding.create.foundation.gui.container;
import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Inventory;

View File

@@ -1,11 +1,10 @@
package nl.requios.effortlessbuilding.create.foundation.gui.menu; 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;
public class GhostItemSubmitPacket extends SimplePacketBase { public class GhostItemSubmitPacket extends SimplePacketBase {

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,4 @@
package nl.requios.effortlessbuilding.create.foundation.gui.menu; 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;
@@ -10,6 +8,7 @@ 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 MenuBase<T> extends AbstractContainerMenu { public abstract class MenuBase<T> extends AbstractContainerMenu {

View File

@@ -1,18 +1,15 @@
package nl.requios.effortlessbuilding.create.foundation.gui.element; package nl.requios.effortlessbuilding.create.foundation.gui.element;
import org.joml.Matrix4f;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.BufferBuilder;
import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.DefaultVertexFormat;
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.blaze3d.vertex.VertexFormat; import com.mojang.blaze3d.vertex.VertexFormat;
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 org.joml.Matrix4f;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.renderer.GameRenderer;
public class BoxElement extends RenderElement { public class BoxElement extends RenderElement {
@@ -67,8 +64,8 @@ public class BoxElement extends RenderElement {
} }
@Override @Override
public void render(GuiGraphics graphics) { public void render(PoseStack ms) {
renderBox(graphics.pose()); renderBox(ms);
} }
//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

View File

@@ -4,8 +4,6 @@ import javax.annotation.Nonnull;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.gui.GuiGraphics;
public class CombinedStencilElement extends StencilElement { public class CombinedStencilElement extends StencilElement {
private StencilElement element1; private StencilElement element1;
@@ -45,22 +43,21 @@ public class CombinedStencilElement extends StencilElement {
} }
@Override @Override
protected void renderStencil(GuiGraphics graphics) { protected void renderStencil(PoseStack ms) {
PoseStack ms = graphics.pose();
ms.pushPose(); ms.pushPose();
element1.transform(ms); element1.transform(ms);
element1.withBounds(width, height); element1.withBounds(width, height);
element1.renderStencil(graphics); element1.renderStencil(ms);
ms.popPose(); ms.popPose();
ms.pushPose(); ms.pushPose();
element2.transform(ms); element2.transform(ms);
element2.withBounds(width, height); element2.withBounds(width, height);
element2.renderStencil(graphics); element2.renderStencil(ms);
ms.popPose(); ms.popPose();
} }
@Override @Override
protected void renderElement(GuiGraphics graphics) { protected void renderElement(PoseStack graphics) {
if (mode.rendersFirst()) if (mode.rendersFirst())
element1.<StencilElement>withBounds(width, height).renderElement(graphics); element1.<StencilElement>withBounds(width, height).renderElement(graphics);

View File

@@ -1,10 +1,9 @@
package nl.requios.effortlessbuilding.create.foundation.gui.element; package nl.requios.effortlessbuilding.create.foundation.gui.element;
import com.mojang.blaze3d.vertex.PoseStack;
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;
import net.minecraft.client.gui.GuiGraphics;
public class DelegatedStencilElement extends StencilElement { public class DelegatedStencilElement extends StencilElement {
protected static final ElementRenderer EMPTY_RENDERER = (graphics, width, height, alpha) -> {}; protected static final ElementRenderer EMPTY_RENDERER = (graphics, width, height, alpha) -> {};
@@ -36,18 +35,18 @@ public class DelegatedStencilElement extends StencilElement {
} }
@Override @Override
protected void renderStencil(GuiGraphics graphics) { protected void renderStencil(PoseStack ms) {
stencil.render(graphics, width, height, 1); stencil.render(ms, width, height, 1);
} }
@Override @Override
protected void renderElement(GuiGraphics graphics) { protected void renderElement(PoseStack ms) {
element.render(graphics, width, height, alpha); element.render(ms, width, height, alpha);
} }
@FunctionalInterface @FunctionalInterface
public interface ElementRenderer { public interface ElementRenderer {
void render(GuiGraphics graphics, int width, int height, float alpha); void render(PoseStack ms, int width, int height, float alpha);
} }
} }

View File

@@ -1,23 +1,14 @@
package nl.requios.effortlessbuilding.create.foundation.gui.element; package nl.requios.effortlessbuilding.create.foundation.gui.element;
import javax.annotation.Nullable;
import com.jozufozu.flywheel.core.PartialModel; import com.jozufozu.flywheel.core.PartialModel;
import com.jozufozu.flywheel.core.model.ModelUtil; import com.jozufozu.flywheel.core.model.ModelUtil;
import com.mojang.blaze3d.platform.GlStateManager;
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.Axis; import com.mojang.math.Axis;
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 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;
@@ -39,7 +30,12 @@ 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;
public class GuiGameElement { public class GuiGameElement {
@@ -164,8 +160,7 @@ public class GuiGameElement {
} }
@Override @Override
public void render(GuiGraphics graphics) { public void render(PoseStack matrixStack) {
PoseStack matrixStack = graphics.pose();
prepareMatrix(matrixStack); prepareMatrix(matrixStack);
Minecraft mc = Minecraft.getInstance(); Minecraft mc = Minecraft.getInstance();
@@ -234,7 +229,7 @@ public class GuiGameElement {
// FluidRenderer.renderFluidBox(new FluidStack(blockState.getFluidState() // FluidRenderer.renderFluidBox(new FluidStack(blockState.getFluidState()
// .getType(), 1000), 0, 0, 0, 1, 1, 1, buffer, ms, LightTexture.FULL_BRIGHT, false); // .getType(), 1000), 0, 0, 0, 1, 1, 1, buffer, ms, LightTexture.FULL_BRIGHT, false);
buffer.endBatch(); // buffer.endBatch();
} }
} }
@@ -259,8 +254,7 @@ public class GuiGameElement {
} }
@Override @Override
public void render(GuiGraphics graphics) { public void render(PoseStack matrixStack) {
PoseStack matrixStack = graphics.pose();
prepareMatrix(matrixStack); prepareMatrix(matrixStack);
transformMatrix(matrixStack); transformMatrix(matrixStack);
renderItemIntoGUI(matrixStack, stack, customLighting == null); renderItemIntoGUI(matrixStack, stack, customLighting == null);
@@ -275,7 +269,7 @@ public class GuiGameElement {
RenderSystem.setShaderTexture(0, InventoryMenu.BLOCK_ATLAS); RenderSystem.setShaderTexture(0, InventoryMenu.BLOCK_ATLAS);
RenderSystem.enableBlend(); RenderSystem.enableBlend();
RenderSystem.enableCull(); RenderSystem.enableCull();
RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.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); matrixStack.translate(0, 0, 100.0F);

View File

@@ -1,12 +1,12 @@
package nl.requios.effortlessbuilding.create.foundation.gui.element; package nl.requios.effortlessbuilding.create.foundation.gui.element;
import net.minecraft.client.gui.GuiGraphics; import com.mojang.blaze3d.vertex.PoseStack;
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(GuiGraphics graphics) { public void render(PoseStack ms) {
} }
}; };
@@ -66,11 +66,11 @@ public abstract class RenderElement implements ScreenElement {
return z; return z;
} }
public abstract void render(GuiGraphics graphics); public abstract void render(PoseStack ms);
@Override @Override
public void render(GuiGraphics graphics, int x, int y) { public void render(PoseStack ms, int x, int y) {
this.at(x, y).render(graphics); this.at(x, y).render(ms);
} }
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(GuiGraphics graphics) { public void render(PoseStack ms) {
renderable.render(graphics, (int) x, (int) y); renderable.render(ms, (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 net.minecraft.client.gui.GuiGraphics; import com.mojang.blaze3d.vertex.PoseStack;
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(GuiGraphics graphics, int x, int y); void render(PoseStack poseStack, int x, int y);
} }

View File

@@ -6,26 +6,24 @@ 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 net.minecraft.client.gui.GuiGraphics;
public abstract class StencilElement extends RenderElement { public abstract class StencilElement extends RenderElement {
@Override @Override
public void render(GuiGraphics graphics) { public void render(PoseStack ms) {
PoseStack ms = graphics.pose();
ms.pushPose(); ms.pushPose();
transform(ms); transform(ms);
prepareStencil(ms); prepareStencil(ms);
renderStencil(graphics); renderStencil(ms);
prepareElement(ms); prepareElement(ms);
renderElement(graphics); renderElement(ms);
cleanUp(ms); cleanUp(ms);
ms.popPose(); ms.popPose();
} }
protected abstract void renderStencil(GuiGraphics graphics); protected abstract void renderStencil(PoseStack graphics);
protected abstract void renderElement(GuiGraphics graphics); protected abstract void renderElement(PoseStack graphics);
protected void transform(PoseStack ms) { protected void transform(PoseStack ms) {
ms.translate(x, y, z); ms.translate(x, y, z);

View File

@@ -1,11 +1,9 @@
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 {
@@ -47,7 +45,7 @@ public class TextStencilElement extends DelegatedStencilElement {
} }
@Override @Override
protected void renderStencil(GuiGraphics graphics) { protected void renderStencil(PoseStack ms) {
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;
@@ -55,11 +53,11 @@ public class TextStencilElement extends DelegatedStencilElement {
if (centerVertically) if (centerVertically)
y = height / 2f - (font.lineHeight - 1) / 2f; y = height / 2f - (font.lineHeight - 1) / 2f;
graphics.drawString(font, component, Math.round(x), Math.round(y), 0xff_000000, false); font.draw(ms, component, Math.round(x), Math.round(y), 0xff_000000);
} }
@Override @Override
protected void renderElement(GuiGraphics graphics) { protected void renderElement(PoseStack ms) {
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;
@@ -67,10 +65,9 @@ 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(graphics, font.width(component), font.lineHeight + 2, alpha); element.render(ms, font.width(component), font.lineHeight + 2, alpha);
ms.popPose(); ms.popPose();
} }

View File

@@ -1,13 +0,0 @@
package nl.requios.effortlessbuilding.create.foundation.gui.menu;
//import nl.requios.effortlessbuilding.create.AllPackets;
public interface IClearableMenu {
default void sendClearPacket() {
// AllPackets.getChannel().sendToServer(new ClearMenuPacket());
}
public void clearContents();
}

View File

@@ -1,20 +1,18 @@
package nl.requios.effortlessbuilding.create.foundation.gui.widget; package nl.requios.effortlessbuilding.create.foundation.gui.widget;
import java.util.LinkedList; import com.mojang.blaze3d.vertex.PoseStack;
import java.util.List;
import java.util.function.BiConsumer;
import javax.annotation.Nonnull;
import nl.requios.effortlessbuilding.create.foundation.gui.TickableGuiEventListener;
import nl.requios.effortlessbuilding.create.foundation.utility.Components;
import net.minecraft.client.gui.GuiGraphics;
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.ClientTooltipPositioner;
import net.minecraft.client.gui.screens.inventory.tooltip.DefaultTooltipPositioner; 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 java.util.LinkedList;
import java.util.List;
import java.util.function.BiConsumer;
public abstract class AbstractSimiWidget extends AbstractWidget implements TickableGuiEventListener { public abstract class AbstractSimiWidget extends AbstractWidget implements TickableGuiEventListener {
@@ -70,22 +68,22 @@ public abstract class AbstractSimiWidget extends AbstractWidget implements Ticka
public void tick() {} public void tick() {}
@Override @Override
public void renderWidget(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { public void renderWidget(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) {
beforeRender(graphics, mouseX, mouseY, partialTicks); beforeRender(ms, mouseX, mouseY, partialTicks);
renderButton(graphics, mouseX, mouseY, partialTicks); doRender(ms, mouseX, mouseY, partialTicks);
afterRender(graphics, mouseX, mouseY, partialTicks); afterRender(ms, mouseX, mouseY, partialTicks);
wasHovered = isHoveredOrFocused(); wasHovered = isHoveredOrFocused();
} }
protected void beforeRender(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { protected void beforeRender(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) {
graphics.pose().pushPose(); ms.pushPose();
} }
protected void renderButton(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { protected void doRender(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) {
} }
protected void afterRender(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { protected void afterRender(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) {
graphics.pose().popPose(); ms.popPose();
} }
public void runCallback(double mouseX, double mouseY) { public void runCallback(double mouseX, double mouseY) {

View File

@@ -1,9 +1,7 @@
package nl.requios.effortlessbuilding.create.foundation.gui.widget; package nl.requios.effortlessbuilding.create.foundation.gui.widget;
import java.util.function.Function; import com.mojang.blaze3d.vertex.PoseStack;
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;
@@ -11,7 +9,7 @@ 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 net.minecraft.client.gui.GuiGraphics; 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(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { protected void beforeRender(PoseStack ms, int mouseX, int mouseY, float partialTicks) {
super.beforeRender(graphics, mouseX, mouseY, partialTicks); super.beforeRender(ms, 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(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { public void doRender(PoseStack ms, int mouseX, int mouseY, float partialTicks) {
float fadeValue = fade.getValue(partialTicks); float fadeValue = fade.getValue(partialTicks);
if (fadeValue < .1f) if (fadeValue < .1f)
return; return;
@@ -131,9 +129,9 @@ public class BoxWidget extends ElementWidget {
.gradientBorder(gradientColor1, gradientColor2) .gradientBorder(gradientColor1, gradientColor2)
.at(getX(), getY(), z) .at(getX(), getY(), z)
.withBounds(width, height) .withBounds(width, height)
.render(graphics); .render(ms);
super.renderButton(graphics, mouseX, mouseY, partialTicks); super.doRender(ms, mouseX, mouseY, partialTicks);
wasHovered = isHovered; wasHovered = isHovered;
} }
@@ -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,14 +1,12 @@
package nl.requios.effortlessbuilding.create.foundation.gui.widget; package nl.requios.effortlessbuilding.create.foundation.gui.widget;
import java.util.function.Consumer;
import java.util.function.UnaryOperator;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
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 net.minecraft.client.gui.GuiGraphics; import java.util.function.Consumer;
import java.util.function.UnaryOperator;
public class ElementWidget extends AbstractSimiWidget { public class ElementWidget extends AbstractSimiWidget {
@@ -118,20 +116,19 @@ public class ElementWidget extends AbstractSimiWidget {
} }
@Override @Override
protected void beforeRender(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { protected void beforeRender(PoseStack ms, int mouseX, int mouseY, float partialTicks) {
super.beforeRender(graphics, mouseX, mouseY, partialTicks); super.beforeRender(ms, 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) {
graphics.pose().translate((1 - fadeValue) * fadeModX, (1 - fadeValue) * fadeModY, 0); ms.translate((1 - fadeValue) * fadeModX, (1 - fadeValue) * fadeModY, 0);
} }
} }
@Override @Override
public void renderButton(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { public void doRender(PoseStack ms, int mouseX, int mouseY, float partialTicks) {
PoseStack ms = graphics.pose();
ms.pushPose(); ms.pushPose();
ms.translate(getX() + paddingX, getY() + paddingY, z); ms.translate(getX() + paddingX, getY() + paddingY, z);
float innerWidth = width - 2 * paddingX; float innerWidth = width - 2 * paddingX;
@@ -145,7 +142,7 @@ public class ElementWidget extends AbstractSimiWidget {
innerWidth /= xScale; innerWidth /= xScale;
innerHeight /= yScale; innerHeight /= yScale;
} }
element.withBounds((int) innerWidth, (int) innerHeight).render(graphics); element.withBounds((int) innerWidth, (int) innerHeight).render(ms);
ms.popPose(); ms.popPose();
if (rescaleElement) { if (rescaleElement) {
element.at(eX, eY); element.at(eX, eY);

View File

@@ -1,12 +1,11 @@
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.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.client.gui.GuiGraphics;
import net.minecraft.network.chat.Component;
public class IconButton extends AbstractSimiWidget { public class IconButton extends AbstractSimiWidget {
protected ScreenElement icon; protected ScreenElement icon;
@@ -21,7 +20,7 @@ public class IconButton extends AbstractSimiWidget {
} }
@Override @Override
public void renderButton(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { public void doRender(PoseStack ms, int mouseX, int mouseY, float partialTicks) {
if (visible) { if (visible) {
isHovered = mouseX >= getX() && mouseY >= getY() && mouseX < getX() + width && mouseY < getY() + height; isHovered = mouseX >= getX() && mouseY >= getY() && mouseX < getX() + width && mouseY < getY() + height;
@@ -29,13 +28,14 @@ public class IconButton extends AbstractSimiWidget {
: isMouseOver(mouseX, mouseY) ? 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(graphics, button); drawBg(ms, button);
icon.render(graphics, getX() + 1, getY() + 1); icon.render(ms, getX() + 1, getY() + 1);
} }
} }
protected void drawBg(GuiGraphics graphics, AllGuiTextures button) { protected void drawBg(PoseStack ms, AllGuiTextures button) {
graphics.blit(button.location, getX(), getY(), button.startX, button.startY, button.width, button.height); AllGuiTextures.BUTTON.bind();
blit(ms, getX(), getY(), button.startX, button.startY, button.width, button.height);
} }
public void setToolTip(Component text) { public void setToolTip(Component text) {

View File

@@ -1,10 +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 nl.requios.effortlessbuilding.create.foundation.gui.AllGuiTextures; import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import nl.requios.effortlessbuilding.create.foundation.gui.AllGuiTextures;
public class Indicator extends AbstractSimiWidget { public class Indicator extends AbstractSimiWidget {
@@ -17,7 +16,7 @@ public class Indicator extends AbstractSimiWidget {
} }
@Override @Override
public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks ) { public void render(PoseStack ms, int mouseX, int mouseY, float partialTicks ) {
if (!visible) if (!visible)
return; return;
AllGuiTextures toDraw; AllGuiTextures toDraw;
@@ -29,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(graphics, getX(), getY()); toDraw.render(ms, getX(), getY());
} }
public enum State { public enum State {

View File

@@ -1,15 +1,14 @@
package nl.requios.effortlessbuilding.create.foundation.gui.widget; package nl.requios.effortlessbuilding.create.foundation.gui.widget;
import javax.annotation.Nonnull;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import nl.requios.effortlessbuilding.create.foundation.utility.Components; import com.mojang.blaze3d.vertex.PoseStack;
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;
public class Label extends AbstractSimiWidget { public class Label extends AbstractSimiWidget {
@@ -71,7 +70,7 @@ public class Label extends AbstractSimiWidget {
} }
@Override @Override
protected void renderButton(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { protected void doRender(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) {
if (text == null || text.getString().isEmpty()) if (text == null || text.getString().isEmpty())
return; return;
@@ -80,7 +79,10 @@ public class Label extends AbstractSimiWidget {
if (suffix != null && !suffix.isEmpty()) if (suffix != null && !suffix.isEmpty())
copy.append(suffix); copy.append(suffix);
graphics.drawString(font, copy, getX(), getY(), color, hasShadow); if (hasShadow)
font.drawShadow(ms, copy, getX(), getY(), color);
else
font.draw(ms, copy, getX(), getY(), color);
} }
} }

View File

@@ -1,19 +1,14 @@
package nl.requios.effortlessbuilding.create.foundation.gui.widget; package nl.requios.effortlessbuilding.create.foundation.gui.widget;
import java.util.function.Consumer; import net.minecraft.ChatFormatting;
import java.util.function.Function; import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import nl.requios.effortlessbuilding.create.AllKeys; import nl.requios.effortlessbuilding.create.AllKeys;
//import nl.requios.effortlessbuilding.create.AllSoundEvents;
//import nl.requios.effortlessbuilding.create.foundation.blockEntity.behaviour.scrollValue.ScrollValueBehaviour.StepContext;
import nl.requios.effortlessbuilding.create.foundation.utility.Components; import nl.requios.effortlessbuilding.create.foundation.utility.Components;
import nl.requios.effortlessbuilding.create.foundation.utility.Lang; import nl.requios.effortlessbuilding.create.foundation.utility.Lang;
import net.minecraft.ChatFormatting; import java.util.function.Consumer;
import net.minecraft.client.Minecraft; import java.util.function.Function;
import net.minecraft.client.resources.sounds.SimpleSoundInstance;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
public class ScrollInput extends AbstractSimiWidget { public class ScrollInput extends AbstractSimiWidget {
@@ -123,6 +118,8 @@ public class ScrollInput extends AbstractSimiWidget {
@Override @Override
public boolean mouseScrolled(double mouseX, double mouseY, double delta) { public boolean mouseScrolled(double mouseX, double mouseY, double delta) {
if (!this.visible || !this.isHovered) return false; //Added
if (inverted) if (inverted)
delta *= -1; delta *= -1;
@@ -152,7 +149,8 @@ public class ScrollInput extends AbstractSimiWidget {
onChanged(); onChanged();
} }
return priorState != state; // return priorState != state;
return true; //Changed
} }
protected void clampState() { protected void clampState() {

View File

@@ -1,14 +1,13 @@
package nl.requios.effortlessbuilding.create.foundation.gui.widget; package nl.requios.effortlessbuilding.create.foundation.gui.widget;
import java.util.ArrayList;
import java.util.List;
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.List;
public class SelectionScrollInput extends ScrollInput { public class SelectionScrollInput extends ScrollInput {

View File

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

View File

@@ -1,253 +1,182 @@
package nl.requios.effortlessbuilding.create.foundation.item; package nl.requios.effortlessbuilding.create.foundation.item;
import static net.minecraft.ChatFormatting.DARK_GRAY; import net.minecraft.ChatFormatting;
import static net.minecraft.ChatFormatting.GRAY; import net.minecraft.client.gui.screens.Screen;
import static net.minecraft.ChatFormatting.WHITE; import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;
import org.apache.commons.lang3.tuple.Pair;
import org.jetbrains.annotations.Nullable;
import com.google.common.collect.ImmutableList;
import nl.requios.effortlessbuilding.create.foundation.item.TooltipHelper.Palette;
import nl.requios.effortlessbuilding.create.foundation.utility.Components; import nl.requios.effortlessbuilding.create.foundation.utility.Components;
import nl.requios.effortlessbuilding.create.foundation.utility.Lang; import nl.requios.effortlessbuilding.create.foundation.utility.Lang;
import net.minecraft.client.Minecraft; import java.util.ArrayList;
import net.minecraft.client.gui.screens.Screen; import java.util.Arrays;
import net.minecraft.client.resources.language.I18n; import java.util.List;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.ItemLike;
import net.minecraftforge.event.entity.player.ItemTooltipEvent;
public record ItemDescription(ImmutableList<Component> lines, ImmutableList<Component> linesOnShift, ImmutableList<Component> linesOnCtrl) { import static net.minecraft.ChatFormatting.*;
private static final Map<Item, Supplier<String>> CUSTOM_TOOLTIP_KEYS = new IdentityHashMap<>(); import static nl.requios.effortlessbuilding.create.foundation.item.TooltipHelper.cutStringTextComponent;
import static nl.requios.effortlessbuilding.create.foundation.item.TooltipHelper.cutTextComponent;
@Nullable public class ItemDescription {
public static ItemDescription create(Item item, Palette palette) {
return create(getTooltipTranslationKey(item), palette); public static final ItemDescription MISSING = new ItemDescription(null);
public static Component trim = Components.literal(" ").withStyle(WHITE, STRIKETHROUGH);
public enum Palette {
Blue(BLUE, AQUA),
Green(DARK_GREEN, GREEN),
Yellow(GOLD, YELLOW),
Red(DARK_RED, RED),
Purple(DARK_PURPLE, LIGHT_PURPLE),
Gray(DARK_GRAY, GRAY),
;
private Palette(ChatFormatting primary, ChatFormatting highlight) {
color = primary;
hColor = highlight;
}
public ChatFormatting color;
public ChatFormatting hColor;
} }
@Nullable private List<Component> lines;
public static ItemDescription create(String translationKey, Palette palette) { private List<Component> linesOnShift;
if (!canFillBuilder(translationKey)) { private List<Component> linesOnCtrl;
return null; private Palette palette;
}
Builder builder = new Builder(palette); public ItemDescription(Palette palette) {
fillBuilder(builder, translationKey); this.palette = palette;
return builder.build(); lines = new ArrayList<>();
linesOnShift = new ArrayList<>();
linesOnCtrl = new ArrayList<>();
} }
public static boolean canFillBuilder(String translationKey) { public ItemDescription withSummary(Component summary) {
return I18n.exists(translationKey); addStrings(linesOnShift, cutTextComponent(summary, palette.color, palette.hColor));
return this;
} }
public static void fillBuilder(Builder builder, String translationKey) { public static String makeProgressBar(int length, int filledLength) {
// Summary String bar = " ";
String summaryKey = translationKey + ".summary"; int emptySpaces = length - filledLength;
if (I18n.exists(summaryKey)) { for (int i = 0; i < filledLength; i++)
builder.addSummary(I18n.get(summaryKey)); bar += "\u2588";
} for (int i = 0; i < emptySpaces; i++)
bar += "\u2592";
// Behaviours return bar + " ";
for (int i = 1; i < 100; i++) {
String conditionKey = translationKey + ".condition" + i;
String behaviourKey = translationKey + ".behaviour" + i;
if (!I18n.exists(conditionKey))
break;
builder.addBehaviour(I18n.get(conditionKey), I18n.get(behaviourKey));
}
// Actions
for (int i = 1; i < 100; i++) {
String controlKey = translationKey + ".control" + i;
String actionKey = translationKey + ".action" + i;
if (!I18n.exists(controlKey))
break;
builder.addAction(I18n.get(controlKey), I18n.get(actionKey));
}
} }
public static void useKey(Item item, Supplier<String> supplier) { public ItemDescription withBehaviour(String condition, String behaviour) {
CUSTOM_TOOLTIP_KEYS.put(item, supplier); add(linesOnShift, Components.literal(condition).withStyle(GRAY));
addStrings(linesOnShift, cutStringTextComponent(behaviour, palette.color, palette.hColor, 1));
return this;
} }
public static void useKey(ItemLike item, String string) { public ItemDescription withControl(String condition, String action) {
useKey(item.asItem(), () -> string); add(linesOnCtrl, Components.literal(condition).withStyle(GRAY));
addStrings(linesOnCtrl, cutStringTextComponent(action, palette.color, palette.hColor, 1));
return this;
} }
public static void referKey(ItemLike item, Supplier<? extends ItemLike> otherItem) { public ItemDescription createTabs() {
useKey(item.asItem(), () -> otherItem.get() boolean hasDescription = !linesOnShift.isEmpty();
.asItem() boolean hasControls = !linesOnCtrl.isEmpty();
.getDescriptionId());
}
public static String getTooltipTranslationKey(Item item) { if (hasDescription || hasControls) {
if (CUSTOM_TOOLTIP_KEYS.containsKey(item)) { String[] holdDesc = Lang.translateDirect("tooltip.holdForDescription", "$")
return CUSTOM_TOOLTIP_KEYS.get(item).get() + ".tooltip"; .getString()
} .split("\\$");
return item.getDescriptionId() + ".tooltip"; String[] holdCtrl = Lang.translateDirect("tooltip.holdForControls", "$")
} .getString()
.split("\\$");
MutableComponent keyShift = Lang.translateDirect("tooltip.keyShift");
MutableComponent keyCtrl = Lang.translateDirect("tooltip.keyCtrl");
for (List<Component> list : Arrays.asList(lines, linesOnShift, linesOnCtrl)) {
boolean shift = list == linesOnShift;
boolean ctrl = list == linesOnCtrl;
public ImmutableList<Component> getCurrentLines() { if (holdDesc.length != 2 || holdCtrl.length != 2) {
if (Screen.hasShiftDown()) { list.add(0, Components.literal("Invalid lang formatting!"));
return linesOnShift; continue;
} else if (Screen.hasControlDown()) {
return linesOnCtrl;
} else {
return lines;
}
}
public static class Builder {
protected final Palette palette;
protected final List<String> summary = new ArrayList<>();
protected final List<Pair<String, String>> behaviours = new ArrayList<>();
protected final List<Pair<String, String>> actions = new ArrayList<>();
public Builder(Palette palette) {
this.palette = palette;
}
public Builder addSummary(String summaryLine) {
summary.add(summaryLine);
return this;
}
public Builder addBehaviour(String condition, String behaviour) {
behaviours.add(Pair.of(condition, behaviour));
return this;
}
public Builder addAction(String condition, String action) {
actions.add(Pair.of(condition, action));
return this;
}
public ItemDescription build() {
List<Component> lines = new ArrayList<>();
List<Component> linesOnShift = new ArrayList<>();
List<Component> linesOnCtrl = new ArrayList<>();
for (String summaryLine : summary) {
linesOnShift.addAll(TooltipHelper.cutStringTextComponent(summaryLine, palette));
}
if (!behaviours.isEmpty()) {
linesOnShift.add(Components.immutableEmpty());
}
for (Pair<String, String> behaviourPair : behaviours) {
String condition = behaviourPair.getLeft();
String behaviour = behaviourPair.getRight();
linesOnShift.add(Components.literal(condition).withStyle(GRAY));
linesOnShift.addAll(TooltipHelper.cutStringTextComponent(behaviour, palette.primary(), palette.highlight(), 1));
}
for (Pair<String, String> actionPair : actions) {
String condition = actionPair.getLeft();
String action = actionPair.getRight();
linesOnCtrl.add(Components.literal(condition).withStyle(GRAY));
linesOnCtrl.addAll(TooltipHelper.cutStringTextComponent(action, palette.primary(), palette.highlight(), 1));
}
boolean hasDescription = !linesOnShift.isEmpty();
boolean hasControls = !linesOnCtrl.isEmpty();
if (hasDescription || hasControls) {
String[] holdDesc = Lang.translateDirect("tooltip.holdForDescription", "$")
.getString()
.split("\\$");
String[] holdCtrl = Lang.translateDirect("tooltip.holdForControls", "$")
.getString()
.split("\\$");
MutableComponent keyShift = Lang.translateDirect("tooltip.keyShift");
MutableComponent keyCtrl = Lang.translateDirect("tooltip.keyCtrl");
for (List<Component> list : Arrays.asList(lines, linesOnShift, linesOnCtrl)) {
boolean shift = list == linesOnShift;
boolean ctrl = list == linesOnCtrl;
if (holdDesc.length != 2 || holdCtrl.length != 2) {
list.add(0, Components.literal("Invalid lang formatting!"));
continue;
}
if (hasControls) {
MutableComponent tabBuilder = Components.empty();
tabBuilder.append(Components.literal(holdCtrl[0]).withStyle(DARK_GRAY));
tabBuilder.append(keyCtrl.plainCopy()
.withStyle(ctrl ? WHITE : GRAY));
tabBuilder.append(Components.literal(holdCtrl[1]).withStyle(DARK_GRAY));
list.add(0, tabBuilder);
}
if (hasDescription) {
MutableComponent tabBuilder = Components.empty();
tabBuilder.append(Components.literal(holdDesc[0]).withStyle(DARK_GRAY));
tabBuilder.append(keyShift.plainCopy()
.withStyle(shift ? WHITE : GRAY));
tabBuilder.append(Components.literal(holdDesc[1]).withStyle(DARK_GRAY));
list.add(0, tabBuilder);
}
if (shift || ctrl)
list.add(hasDescription && hasControls ? 2 : 1, Components.immutableEmpty());
} }
}
if (!hasDescription) { if (hasControls) {
linesOnCtrl.clear(); MutableComponent tabBuilder = Components.empty();
linesOnShift.addAll(lines); tabBuilder.append(Components.literal(holdCtrl[0]).withStyle(DARK_GRAY));
} tabBuilder.append(keyCtrl.plainCopy()
if (!hasControls) { .withStyle(ctrl ? WHITE : GRAY));
linesOnCtrl.clear(); tabBuilder.append(Components.literal(holdCtrl[1]).withStyle(DARK_GRAY));
linesOnCtrl.addAll(lines); list.add(0, tabBuilder);
} }
return new ItemDescription(ImmutableList.copyOf(lines), ImmutableList.copyOf(linesOnShift), ImmutableList.copyOf(linesOnCtrl)); if (hasDescription) {
MutableComponent tabBuilder = Components.empty();
tabBuilder.append(Components.literal(holdDesc[0]).withStyle(DARK_GRAY));
tabBuilder.append(keyShift.plainCopy()
.withStyle(shift ? WHITE : GRAY));
tabBuilder.append(Components.literal(holdDesc[1]).withStyle(DARK_GRAY));
list.add(0, tabBuilder);
}
if (shift || ctrl)
list.add(hasDescription && hasControls ? 2 : 1, Components.immutableEmpty());
}
} }
if (!hasDescription)
linesOnShift = lines;
if (!hasControls)
linesOnCtrl = lines;
return this;
} }
public static class Modifier implements TooltipModifier { public static String hightlight(String s, Palette palette) {
protected final Item item; return palette.hColor + s + palette.color;
protected final Palette palette;
protected String cachedLanguage;
protected ItemDescription description;
public Modifier(Item item, Palette palette) {
this.item = item;
this.palette = palette;
}
@Override
public void modify(ItemTooltipEvent context) {
if (checkLocale()) {
description = create(item, palette);
}
if (description == null) {
return;
}
context.getToolTip().addAll(1, description.getCurrentLines());
}
protected boolean checkLocale() {
String currentLanguage = Minecraft.getInstance()
.getLanguageManager()
.getSelected();
if (!currentLanguage.equals(cachedLanguage)) {
cachedLanguage = currentLanguage;
return true;
}
return false;
}
} }
public static void addStrings(List<Component> infoList, List<Component> textLines) {
textLines.forEach(s -> add(infoList, s));
}
public static void add(List<Component> infoList, List<Component> textLines) {
infoList.addAll(textLines);
}
public static void add(List<Component> infoList, Component line) {
infoList.add(line);
}
public Palette getPalette() {
return palette;
}
public List<Component> addInformation(List<Component> tooltip) {
if (Screen.hasShiftDown()) {
tooltip.addAll(linesOnShift);
return tooltip;
}
if (Screen.hasControlDown()) {
tooltip.addAll(linesOnCtrl);
return tooltip;
}
tooltip.addAll(lines);
return tooltip;
}
public List<Component> getLines() {
return lines;
}
public List<Component> getLinesOnCtrl() {
return linesOnCtrl;
}
public List<Component> getLinesOnShift() {
return linesOnShift;
}
} }

View File

@@ -1,16 +1,6 @@
package nl.requios.effortlessbuilding.create.foundation.item; package nl.requios.effortlessbuilding.create.foundation.item;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;
import javax.annotation.Nullable;
import org.apache.commons.lang3.mutable.MutableInt;
import nl.requios.effortlessbuilding.create.foundation.utility.Pair; import nl.requios.effortlessbuilding.create.foundation.utility.Pair;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.NonNullList; import net.minecraft.core.NonNullList;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
@@ -20,17 +10,16 @@ import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemHandlerHelper;
import org.apache.commons.lang3.mutable.MutableInt;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;
public class ItemHelper { public class ItemHelper {
public static boolean sameItem(ItemStack stack, ItemStack otherStack) {
return !otherStack.isEmpty() && stack.is(otherStack.getItem());
}
public static Predicate<ItemStack> sameItemPredicate(ItemStack stack) {
return s -> sameItem(stack, s);
}
public static void dropContents(Level world, BlockPos pos, IItemHandler inv) { public static void dropContents(Level world, BlockPos pos, IItemHandler inv) {
for (int slot = 0; slot < inv.getSlots(); slot++) for (int slot = 0; slot < inv.getSlots(); slot++)
Containers.dropItemStack(world, pos.getX(), pos.getY(), pos.getZ(), inv.getStackInSlot(slot)); Containers.dropItemStack(world, pos.getX(), pos.getY(), pos.getZ(), inv.getStackInSlot(slot));
@@ -133,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.isSameItem(stacks1[i], stacks2[i])) if (!ItemStack.isSame(stacks1[i], stacks2[i]))
return false; return false;
return true; return true;
} }

View File

@@ -1,28 +1,37 @@
package nl.requios.effortlessbuilding.create.foundation.item; package nl.requios.effortlessbuilding.create.foundation.item;
import java.text.BreakIterator;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import com.google.common.base.Strings; import com.google.common.base.Strings;
//import nl.requios.effortlessbuilding.create.content.equipment.goggles.IHaveGoggleInformation;
import nl.requios.effortlessbuilding.create.foundation.utility.Components;
import nl.requios.effortlessbuilding.create.foundation.utility.Couple;
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.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.MutableComponent;
import net.minecraft.network.chat.Style; import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
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.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;
public class TooltipHelper { public class TooltipHelper {
public static final int MAX_WIDTH_PER_LINE = 200; public static final int maxWidthPerLine = 200;
public static final Map<String, ItemDescription> cachedTooltips = new HashMap<>();
private static boolean gogglesMode;
private static final Map<Item, Supplier<String>> tooltipReferrals = new HashMap<>();
public static MutableComponent holdShift(Palette palette, boolean highlighted) { public static MutableComponent holdShift(Palette color, boolean highlighted) {
return Lang.translateDirect("tooltip.holdForDescription", Lang.translateDirect("tooltip.keyShift") return Lang.translateDirect("tooltip.holdForDescription", Lang.translateDirect("tooltip.keyShift")
.withStyle(ChatFormatting.GRAY)) .withStyle(ChatFormatting.GRAY))
.withStyle(ChatFormatting.DARK_GRAY); .withStyle(ChatFormatting.DARK_GRAY);
@@ -34,64 +43,87 @@ public class TooltipHelper {
.append(Lang.translateDirect(hintKey + ".title")) .append(Lang.translateDirect(hintKey + ".title"))
.withStyle(ChatFormatting.GOLD)); .withStyle(ChatFormatting.GOLD));
Component hint = Lang.translateDirect(hintKey); Component hint = Lang.translateDirect(hintKey);
List<Component> cutComponent = cutTextComponent(hint, Palette.GRAY_AND_WHITE); List<Component> cutComponent = TooltipHelper.cutTextComponent(hint, ChatFormatting.GRAY, ChatFormatting.WHITE);
for (Component component : cutComponent) for (Component component : cutComponent)
tooltip.add(spacing.plainCopy() tooltip.add(spacing.plainCopy()
.append(component)); .append(component));
} }
public static String makeProgressBar(int length, int filledLength) { public static void referTo(ItemLike item, Supplier<? extends ItemLike> itemWithTooltip) {
String bar = " "; tooltipReferrals.put(item.asItem(), () -> itemWithTooltip.get()
int emptySpaces = length - filledLength; .asItem()
for (int i = 0; i < filledLength; i++) .getDescriptionId());
bar += "\u2588";
for (int i = 0; i < emptySpaces; i++)
bar += "\u2592";
return bar + " ";
} }
public static Style styleFromColor(ChatFormatting color) { public static void referTo(ItemLike item, String string) {
return Style.EMPTY.applyFormat(color); tooltipReferrals.put(item.asItem(), () -> string);
} }
public static Style styleFromColor(int hex) { @Deprecated
return Style.EMPTY.withColor(hex); public static List<String> cutString(Component s, ChatFormatting defaultColor, ChatFormatting highlightColor) {
return cutString(s.getString(), defaultColor, highlightColor, 0);
} }
public static List<Component> cutStringTextComponent(String s, Palette palette) { @Deprecated
return cutTextComponent(Components.literal(s), palette); public static List<String> cutString(String s, ChatFormatting defaultColor, ChatFormatting highlightColor,
} int indent) {
// Apply markup
public static List<Component> cutTextComponent(Component c, Palette palette) { String markedUp = s.replaceAll("_([^_]+)_", highlightColor + "$1" + defaultColor);
return cutTextComponent(c, palette.primary(), palette.highlight());
}
public static List<Component> cutStringTextComponent(String s, Style primaryStyle,
Style highlightStyle) {
return cutTextComponent(Components.literal(s), primaryStyle, highlightStyle);
}
public static List<Component> cutTextComponent(Component c, Style primaryStyle,
Style highlightStyle) {
return cutTextComponent(c, primaryStyle, highlightStyle, 0);
}
public static List<Component> cutStringTextComponent(String c, Style primaryStyle,
Style highlightStyle, int indent) {
return cutTextComponent(Components.literal(c), primaryStyle, highlightStyle, indent);
}
public static List<Component> cutTextComponent(Component c, Style primaryStyle,
Style highlightStyle, int indent) {
String s = c.getString();
// Split words // Split words
List<String> words = new LinkedList<>(); List<String> words = new LinkedList<>();
BreakIterator iterator = BreakIterator.getLineInstance(Minecraft.getInstance().getLocale()); BreakIterator iterator = BreakIterator.getLineInstance(Minecraft.getInstance().getLocale());
iterator.setText(s); iterator.setText(markedUp);
int start = iterator.first(); int start = iterator.first();
for (int end = iterator.next(); end != BreakIterator.DONE; start = end, end = iterator.next()) { for (int end = iterator.next(); end != BreakIterator.DONE; start = end, end = iterator.next()) {
String word = s.substring(start, end); String word = markedUp.substring(start, end);
words.add(word);
}
Font font = Minecraft.getInstance().font;
List<String> lines = FontHelper.cutString(font, markedUp, maxWidthPerLine);
// Format
String lineStart = Strings.repeat(" ", indent);
List<String> formattedLines = new ArrayList<>(lines.size());
String format = defaultColor.toString();
for (String line : lines) {
String formattedLine = format + lineStart + line;
formattedLines.add(formattedLine);
// format = TextFormatting.getFormatString(formattedLine);
}
return formattedLines;
}
public static List<Component> cutStringTextComponent(String c, ChatFormatting defaultColor,
ChatFormatting highlightColor) {
return cutTextComponent(Components.literal(c), defaultColor, highlightColor, 0);
}
public static List<Component> cutTextComponent(Component c, ChatFormatting defaultColor,
ChatFormatting highlightColor) {
return cutTextComponent(c, defaultColor, highlightColor, 0);
}
public static List<Component> cutStringTextComponent(String c, ChatFormatting defaultColor,
ChatFormatting highlightColor, int indent) {
return cutTextComponent(Components.literal(c), defaultColor, highlightColor, indent);
}
public static List<Component> cutTextComponent(Component c, ChatFormatting defaultColor,
ChatFormatting highlightColor, int indent) {
String s = c.getString();
// Apply markup
String markedUp = s;// .replaceAll("_([^_]+)_", highlightColor + "$1" + defaultColor);
// Split words
List<String> words = new LinkedList<>();
BreakIterator iterator = BreakIterator.getLineInstance(Minecraft.getInstance().getLocale());
iterator.setText(markedUp);
int start = iterator.first();
for (int end = iterator.next(); end != BreakIterator.DONE; start = end, end = iterator.next()) {
String word = markedUp.substring(start, end);
words.add(word); words.add(word);
} }
@@ -102,7 +134,7 @@ public class TooltipHelper {
int width = 0; int width = 0;
for (String word : words) { for (String word : words) {
int newWidth = font.width(word.replaceAll("_", "")); int newWidth = font.width(word.replaceAll("_", ""));
if (width + newWidth > MAX_WIDTH_PER_LINE) { if (width + newWidth > maxWidthPerLine) {
if (width > 0) { if (width > 0) {
String line = currentLine.toString(); String line = currentLine.toString();
lines.add(line); lines.add(line);
@@ -122,16 +154,16 @@ public class TooltipHelper {
// Format // Format
MutableComponent lineStart = Components.literal(Strings.repeat(" ", indent)); MutableComponent lineStart = Components.literal(Strings.repeat(" ", indent));
lineStart.withStyle(primaryStyle); lineStart.withStyle(defaultColor);
List<Component> formattedLines = new ArrayList<>(lines.size()); List<Component> formattedLines = new ArrayList<>(lines.size());
Couple<Style> styles = Couple.create(highlightStyle, primaryStyle); Couple<ChatFormatting> f = Couple.create(highlightColor, defaultColor);
boolean currentlyHighlighted = false; boolean currentlyHighlighted = false;
for (String string : lines) { for (String string : lines) {
MutableComponent currentComponent = lineStart.plainCopy(); MutableComponent currentComponent = lineStart.plainCopy();
String[] split = string.split("_"); String[] split = string.split("_");
for (String part : split) { for (String part : split) {
currentComponent.append(Components.literal(part).withStyle(styles.get(currentlyHighlighted))); currentComponent.append(Components.literal(part).withStyle(f.get(currentlyHighlighted)));
currentlyHighlighted = !currentlyHighlighted; currentlyHighlighted = !currentlyHighlighted;
} }
@@ -142,25 +174,110 @@ public class TooltipHelper {
return formattedLines; return formattedLines;
} }
public record Palette(Style primary, Style highlight) { // public static List<ITextComponent> cutTextComponentOld(ITextComponent c, TextFormatting defaultColor,
public static final Palette STANDARD_CREATE = new Palette(styleFromColor(0xC9974C), styleFromColor(0xF1DD79)); // TextFormatting highlightColor, int indent) {
// IFormattableTextComponent lineStart = StringTextComponent.EMPTY.copy();
// for (int i = 0; i < indent; i++)
// lineStart.append(" ");
// lineStart.formatted(defaultColor);
//
// List<ITextComponent> lines = new ArrayList<>();
// String rawText = getUnformattedDeepText(c);
// String[] words = rawText.split(" ");
// String word;
// IFormattableTextComponent currentLine = lineStart.copy();
//
// boolean firstWord = true;
// boolean lastWord;
//
// // Apply hard wrap
// for (int i = 0; i < words.length; i++) {
// word = words[i];
// lastWord = i == words.length - 1;
//
// if (!lastWord && !firstWord && getComponentLength(currentLine) + word.length() > maxCharsPerLine) {
// lines.add(currentLine);
// currentLine = lineStart.copy();
// firstWord = true;
// }
//
// currentLine.append(new StringTextComponent((firstWord ? "" : " ") + word.replace("_", ""))
// .formatted(word.matches("_([^_]+)_") ? highlightColor : defaultColor));
// firstWord = false;
// }
//
// if (!firstWord) {
// lines.add(currentLine);
// }
//
// return lines;
// }
public static final Palette BLUE = ofColors(ChatFormatting.BLUE, ChatFormatting.AQUA); private static boolean findTooltip(ItemStack stack) {
public static final Palette GREEN = ofColors(ChatFormatting.DARK_GREEN, ChatFormatting.GREEN); String key = getTooltipTranslationKey(stack);
public static final Palette YELLOW = ofColors(ChatFormatting.GOLD, ChatFormatting.YELLOW); if (I18n.exists(key)) {
public static final Palette RED = ofColors(ChatFormatting.DARK_RED, ChatFormatting.RED); cachedTooltips.put(key, buildToolTip(key, stack));
public static final Palette PURPLE = ofColors(ChatFormatting.DARK_PURPLE, ChatFormatting.LIGHT_PURPLE); return true;
public static final Palette GRAY = ofColors(ChatFormatting.DARK_GRAY, ChatFormatting.GRAY);
public static final Palette ALL_GRAY = ofColors(ChatFormatting.GRAY, ChatFormatting.GRAY);
public static final Palette GRAY_AND_BLUE = ofColors(ChatFormatting.GRAY, ChatFormatting.BLUE);
public static final Palette GRAY_AND_WHITE = ofColors(ChatFormatting.GRAY, ChatFormatting.WHITE);
public static final Palette GRAY_AND_GOLD = ofColors(ChatFormatting.GRAY, ChatFormatting.GOLD);
public static final Palette GRAY_AND_RED = ofColors(ChatFormatting.GRAY, ChatFormatting.RED);
public static Palette ofColors(ChatFormatting primary, ChatFormatting highlight) {
return new Palette(styleFromColor(primary), styleFromColor(highlight));
} }
cachedTooltips.put(key, ItemDescription.MISSING);
return false;
} }
private static ItemDescription buildToolTip(String translationKey, ItemStack stack) {
ItemDescription tooltip = new ItemDescription(Palette.Blue);
String summaryKey = translationKey + ".summary";
// Summary
if (I18n.exists(summaryKey))
tooltip = tooltip.withSummary(Components.literal(I18n.get(summaryKey)));
// Requirements
// if (stack.getItem() instanceof BlockItem) {
// BlockItem item = (BlockItem) stack.getItem();
// if (item.getBlock() instanceof IRotate || item.getBlock() instanceof EngineBlock) {
// tooltip = tooltip.withKineticStats(item.getBlock());
// }
// }
// Behaviours
for (int i = 1; i < 100; i++) {
String conditionKey = translationKey + ".condition" + i;
String behaviourKey = translationKey + ".behaviour" + i;
if (!I18n.exists(conditionKey))
break;
if (i == 1)
tooltip.getLinesOnShift()
.add(Components.immutableEmpty());
tooltip.withBehaviour(I18n.get(conditionKey), I18n.get(behaviourKey));
}
// Controls
for (int i = 1; i < 100; i++) {
String controlKey = translationKey + ".control" + i;
String actionKey = translationKey + ".action" + i;
if (!I18n.exists(controlKey))
break;
tooltip.withControl(I18n.get(controlKey), I18n.get(actionKey));
}
return tooltip.createTabs();
}
public static String getTooltipTranslationKey(ItemStack stack) {
Item item = stack.getItem();
if (tooltipReferrals.containsKey(item))
return tooltipReferrals.get(item)
.get() + ".tooltip";
return item.getDescriptionId(stack) + ".tooltip";
}
// private static int getComponentLength(ITextComponent component) {
// AtomicInteger l = new AtomicInteger();
// TextProcessing.visitFormatted(component, Style.EMPTY, (s, style, charConsumer) -> {
// l.getAndIncrement();
// return true;
// });
// return l.get();
// }
} }

View File

@@ -1,43 +0,0 @@
package nl.requios.effortlessbuilding.create.foundation.item;
import org.jetbrains.annotations.Nullable;
import nl.requios.effortlessbuilding.create.foundation.utility.AttachedRegistry;
import net.minecraft.world.item.Item;
import net.minecraftforge.event.entity.player.ItemTooltipEvent;
import net.minecraftforge.registries.ForgeRegistries;
public interface TooltipModifier {
AttachedRegistry<Item, TooltipModifier> REGISTRY = new AttachedRegistry<>(ForgeRegistries.ITEMS);
TooltipModifier EMPTY = new TooltipModifier() {
@Override
public void modify(ItemTooltipEvent context) {
}
@Override
public TooltipModifier andThen(TooltipModifier after) {
return after;
}
};
void modify(ItemTooltipEvent context);
default TooltipModifier andThen(TooltipModifier after) {
if (after == EMPTY) {
return this;
}
return tooltip -> {
modify(tooltip);
after.modify(tooltip);
};
}
static TooltipModifier mapNull(@Nullable TooltipModifier modifier) {
if (modifier == null) {
return EMPTY;
}
return modifier;
}
}

View File

@@ -1,7 +1,6 @@
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.resources.model.BakedModel; import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemDisplayContext;
import net.minecraftforge.client.model.BakedModelWrapper; import net.minecraftforge.client.model.BakedModelWrapper;
@@ -19,7 +18,7 @@ public class CustomRenderedItemModel extends BakedModelWrapper<BakedModel> {
@Override @Override
public BakedModel applyTransform(ItemDisplayContext cameraItemDisplayContext, PoseStack mat, public BakedModel applyTransform(ItemDisplayContext cameraItemDisplayContext, PoseStack mat,
boolean leftHand) { boolean leftHand) {
// Super call returns originalModel, but we want to return this, else BEWLR // Super call returns originalModel, but we want to return this, else BEWLR
// won't be used. // won't be used.
super.applyTransform(cameraItemDisplayContext, mat, leftHand); super.applyTransform(cameraItemDisplayContext, mat, leftHand);

View File

@@ -1,33 +0,0 @@
package nl.requios.effortlessbuilding.create.foundation.item.render;
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.world.item.ItemDisplayContext;
import net.minecraft.world.item.ItemStack;
public abstract class CustomRenderedItemModelRenderer extends BlockEntityWithoutLevelRenderer {
public CustomRenderedItemModelRenderer() {
super(null, null);
}
@Override
public void renderByItem(ItemStack stack, ItemDisplayContext transformType, PoseStack ms, MultiBufferSource buffer, int light, int overlay) {
CustomRenderedItemModel mainModel = (CustomRenderedItemModel) Minecraft.getInstance()
.getItemRenderer()
.getModel(stack, null, null, 0);
PartialItemModelRenderer renderer = PartialItemModelRenderer.of(stack, transformType, ms, buffer, overlay);
ms.pushPose();
ms.translate(0.5F, 0.5F, 0.5F);
render(stack, mainModel, renderer, transformType, ms, buffer, light, overlay);
ms.popPose();
}
protected abstract void render(ItemStack stack, CustomRenderedItemModel model, PartialItemModelRenderer renderer, ItemDisplayContext transformType,
PoseStack ms, MultiBufferSource buffer, int light, int overlay);
}

View File

@@ -2,9 +2,6 @@ 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;
@@ -16,6 +13,8 @@ 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 {
@@ -48,13 +47,13 @@ public class PartialItemModelRenderer {
render(model, RenderTypes.getItemPartialSolid(), light); render(model, RenderTypes.getItemPartialSolid(), light);
} }
public void renderSolidGlowing(BakedModel model, int light) { // public void renderSolidGlowing(BakedModel model, int light) {
render(model, RenderTypes.getGlowingSolid(), light); // render(model, RenderTypes.getGlowingSolid(), light);
} // }
//
public void renderGlowing(BakedModel model, int light) { // public void renderGlowing(BakedModel model, int light) {
render(model, RenderTypes.getGlowingTranslucent(), light); // render(model, RenderTypes.getGlowingTranslucent(), light);
} // }
public void render(BakedModel model, RenderType type, int light) { public void render(BakedModel model, RenderType type, int light) {
if (stack.isEmpty()) if (stack.isEmpty())

View File

@@ -1,13 +0,0 @@
package nl.requios.effortlessbuilding.create.foundation.mixin.accessor;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.Level;
@Mixin(Entity.class)
public interface EntityAccessor {
@Invoker("setLevel")
void create$callSetLevel(Level level);
}

View File

@@ -1,13 +0,0 @@
package nl.requios.effortlessbuilding.create.foundation.mixin.accessor;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;
import net.minecraft.client.Camera;
import net.minecraft.client.renderer.GameRenderer;
@Mixin(GameRenderer.class)
public interface GameRendererAccessor {
@Invoker("getFov")
double create$callGetFov(Camera camera, float partialTicks, boolean useFOVSetting);
}

View File

@@ -1,24 +1,17 @@
package nl.requios.effortlessbuilding.create.foundation.networking; package nl.requios.effortlessbuilding.create.foundation.networking;
import java.util.HashSet;
//import nl.requios.effortlessbuilding.create.AllPackets;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.nbt.CompoundTag; 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;
public interface ISyncPersistentData { public interface ISyncPersistentData {
void onPersistentDataUpdated(); void onPersistentDataUpdated();
// default void syncPersistentDataWithTracking(Entity self) {
// AllPackets.getChannel().send(PacketDistributor.TRACKING_ENTITY.with(() -> self), new PersistentDataPacket(self));
// }
public static class PersistentDataPacket extends SimplePacketBase { public static class PersistentDataPacket extends SimplePacketBase {
private int entityId; private int entityId;

View File

@@ -1,230 +0,0 @@
package nl.requios.effortlessbuilding.create.foundation.outliner;
import java.util.Optional;
import org.joml.Vector3f;
import org.joml.Vector4f;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import nl.requios.effortlessbuilding.create.AllSpecialTextures;
import nl.requios.effortlessbuilding.create.foundation.render.RenderTypes;
import nl.requios.effortlessbuilding.create.foundation.render.SuperRenderTypeBuffer;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.core.Direction;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
public class AABBOutline extends Outline {
protected AABB bb;
protected final Vector3f minPosTemp1 = new Vector3f();
protected final Vector3f maxPosTemp1 = new Vector3f();
protected final Vector4f colorTemp1 = new Vector4f();
protected final Vector3f pos0Temp = new Vector3f();
protected final Vector3f pos1Temp = new Vector3f();
protected final Vector3f pos2Temp = new Vector3f();
protected final Vector3f pos3Temp = new Vector3f();
protected final Vector3f normalTemp = new Vector3f();
protected final Vector3f originTemp = new Vector3f();
public AABBOutline(AABB bb) {
setBounds(bb);
}
public AABB getBounds() {
return bb;
}
public void setBounds(AABB bb) {
this.bb = bb;
}
@Override
public void render(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera, float pt) {
params.loadColor(colorTemp);
Vector4f color = colorTemp;
int lightmap = params.lightmap;
boolean disableLineNormals = params.disableLineNormals;
renderBox(ms, buffer, camera, bb, color, lightmap, disableLineNormals);
}
protected void renderBox(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera, AABB box, Vector4f color, int lightmap, boolean disableLineNormals) {
Vector3f minPos = minPosTemp1;
Vector3f maxPos = maxPosTemp1;
boolean cameraInside = box.contains(camera);
boolean cull = !cameraInside && !params.disableCull;
float inflate = cameraInside ? -1 / 128f : 1 / 128f;
box = box.move(camera.scale(-1));
minPos.set((float) box.minX - inflate, (float) box.minY - inflate, (float) box.minZ - inflate);
maxPos.set((float) box.maxX + inflate, (float) box.maxY + inflate, (float) box.maxZ + inflate);
renderBoxFaces(ms, buffer, cull, params.getHighlightedFace(), minPos, maxPos, color, lightmap);
float lineWidth = params.getLineWidth();
if (lineWidth == 0)
return;
VertexConsumer consumer = buffer.getBuffer(RenderTypes.getOutlineSolid());
renderBoxEdges(ms, consumer, minPos, maxPos, lineWidth, color, lightmap, disableLineNormals);
}
protected void renderBoxFaces(PoseStack ms, SuperRenderTypeBuffer buffer, boolean cull, Direction highlightedFace, Vector3f minPos, Vector3f maxPos, Vector4f color, int lightmap) {
PoseStack.Pose pose = ms.last();
renderBoxFace(pose, buffer, cull, highlightedFace, minPos, maxPos, Direction.DOWN, color, lightmap);
renderBoxFace(pose, buffer, cull, highlightedFace, minPos, maxPos, Direction.UP, color, lightmap);
renderBoxFace(pose, buffer, cull, highlightedFace, minPos, maxPos, Direction.NORTH, color, lightmap);
renderBoxFace(pose, buffer, cull, highlightedFace, minPos, maxPos, Direction.SOUTH, color, lightmap);
renderBoxFace(pose, buffer, cull, highlightedFace, minPos, maxPos, Direction.WEST, color, lightmap);
renderBoxFace(pose, buffer, cull, highlightedFace, minPos, maxPos, Direction.EAST, color, lightmap);
}
protected void renderBoxFace(PoseStack.Pose pose, SuperRenderTypeBuffer buffer, boolean cull, Direction highlightedFace, Vector3f minPos, Vector3f maxPos, Direction face, Vector4f color, int lightmap) {
boolean highlighted = face == highlightedFace;
// TODO: Presumably, the other texture should be used, but this was not noticed before so fixing it may lead to suboptimal visuals.
// Optional<AllSpecialTextures> optionalFaceTexture = highlighted ? params.hightlightedFaceTexture : params.faceTexture;
Optional<AllSpecialTextures> optionalFaceTexture = params.faceTexture;
if (!optionalFaceTexture.isPresent())
return;
AllSpecialTextures faceTexture = optionalFaceTexture.get();
RenderType renderType = RenderTypes.getOutlineTranslucent(faceTexture.getLocation(), cull);
VertexConsumer consumer = buffer.getLateBuffer(renderType);
float alphaMult = highlighted ? 1 : 0.5f;
colorTemp1.set(color.x(), color.y(), color.z(), color.w() * alphaMult);
color = colorTemp1;
renderBoxFace(pose, consumer, minPos, maxPos, face, color, lightmap);
}
protected void renderBoxFace(PoseStack.Pose pose, VertexConsumer consumer, Vector3f minPos, Vector3f maxPos, Direction face, Vector4f color, int lightmap) {
Vector3f pos0 = pos0Temp;
Vector3f pos1 = pos1Temp;
Vector3f pos2 = pos2Temp;
Vector3f pos3 = pos3Temp;
Vector3f normal = normalTemp;
float minX = minPos.x();
float minY = minPos.y();
float minZ = minPos.z();
float maxX = maxPos.x();
float maxY = maxPos.y();
float maxZ = maxPos.z();
float maxU;
float maxV;
switch (face) {
case DOWN -> {
// 0 1 2 3
pos0.set(minX, minY, maxZ);
pos1.set(minX, minY, minZ);
pos2.set(maxX, minY, minZ);
pos3.set(maxX, minY, maxZ);
maxU = maxX - minX;
maxV = maxZ - minZ;
normal.set(0, -1, 0);
}
case UP -> {
// 4 5 6 7
pos0.set(minX, maxY, minZ);
pos1.set(minX, maxY, maxZ);
pos2.set(maxX, maxY, maxZ);
pos3.set(maxX, maxY, minZ);
maxU = maxX - minX;
maxV = maxZ - minZ;
normal.set(0, 1, 0);
}
case NORTH -> {
// 7 2 1 4
pos0.set(maxX, maxY, minZ);
pos1.set(maxX, minY, minZ);
pos2.set(minX, minY, minZ);
pos3.set(minX, maxY, minZ);
maxU = maxX - minX;
maxV = maxY - minY;
normal.set(0, 0, -1);
}
case SOUTH -> {
// 5 0 3 6
pos0.set(minX, maxY, maxZ);
pos1.set(minX, minY, maxZ);
pos2.set(maxX, minY, maxZ);
pos3.set(maxX, maxY, maxZ);
maxU = maxX - minX;
maxV = maxY - minY;
normal.set(0, 0, 1);
}
case WEST -> {
// 4 1 0 5
pos0.set(minX, maxY, minZ);
pos1.set(minX, minY, minZ);
pos2.set(minX, minY, maxZ);
pos3.set(minX, maxY, maxZ);
maxU = maxZ - minZ;
maxV = maxY - minY;
normal.set(-1, 0, 0);
}
case EAST -> {
// 6 3 2 7
pos0.set(maxX, maxY, maxZ);
pos1.set(maxX, minY, maxZ);
pos2.set(maxX, minY, minZ);
pos3.set(maxX, maxY, minZ);
maxU = maxZ - minZ;
maxV = maxY - minY;
normal.set(1, 0, 0);
}
default -> {
maxU = 1;
maxV = 1;
}
}
bufferQuad(pose, consumer, pos0, pos1, pos2, pos3, color, 0, 0, maxU, maxV, lightmap, normal);
}
protected void renderBoxEdges(PoseStack ms, VertexConsumer consumer, Vector3f minPos, Vector3f maxPos, float lineWidth, Vector4f color, int lightmap, boolean disableNormals) {
Vector3f origin = originTemp;
PoseStack.Pose pose = ms.last();
float lineLengthX = maxPos.x() - minPos.x();
float lineLengthY = maxPos.y() - minPos.y();
float lineLengthZ = maxPos.z() - minPos.z();
origin.set(minPos);
bufferCuboidLine(pose, consumer, origin, Direction.EAST, lineLengthX, lineWidth, color, lightmap, disableNormals);
bufferCuboidLine(pose, consumer, origin, Direction.UP, lineLengthY, lineWidth, color, lightmap, disableNormals);
bufferCuboidLine(pose, consumer, origin, Direction.SOUTH, lineLengthZ, lineWidth, color, lightmap, disableNormals);
origin.set(maxPos.x(), minPos.y(), minPos.z());
bufferCuboidLine(pose, consumer, origin, Direction.UP, lineLengthY, lineWidth, color, lightmap, disableNormals);
bufferCuboidLine(pose, consumer, origin, Direction.SOUTH, lineLengthZ, lineWidth, color, lightmap, disableNormals);
origin.set(minPos.x(), maxPos.y(), minPos.z());
bufferCuboidLine(pose, consumer, origin, Direction.EAST, lineLengthX, lineWidth, color, lightmap, disableNormals);
bufferCuboidLine(pose, consumer, origin, Direction.SOUTH, lineLengthZ, lineWidth, color, lightmap, disableNormals);
origin.set(minPos.x(), minPos.y(), maxPos.z());
bufferCuboidLine(pose, consumer, origin, Direction.EAST, lineLengthX, lineWidth, color, lightmap, disableNormals);
bufferCuboidLine(pose, consumer, origin, Direction.UP, lineLengthY, lineWidth, color, lightmap, disableNormals);
origin.set(minPos.x(), maxPos.y(), maxPos.z());
bufferCuboidLine(pose, consumer, origin, Direction.EAST, lineLengthX, lineWidth, color, lightmap, disableNormals);
origin.set(maxPos.x(), minPos.y(), maxPos.z());
bufferCuboidLine(pose, consumer, origin, Direction.UP, lineLengthY, lineWidth, color, lightmap, disableNormals);
origin.set(maxPos.x(), maxPos.y(), minPos.z());
bufferCuboidLine(pose, consumer, origin, Direction.SOUTH, lineLengthZ, lineWidth, color, lightmap, disableNormals);
}
}

View File

@@ -1,272 +0,0 @@
package nl.requios.effortlessbuilding.create.foundation.outliner;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import org.joml.Vector3f;
import org.joml.Vector4f;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import nl.requios.effortlessbuilding.create.AllSpecialTextures;
import nl.requios.effortlessbuilding.create.foundation.render.RenderTypes;
import nl.requios.effortlessbuilding.create.foundation.render.SuperRenderTypeBuffer;
import nl.requios.effortlessbuilding.create.foundation.utility.Iterate;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.Direction.Axis;
import net.minecraft.core.Direction.AxisDirection;
import net.minecraft.world.phys.Vec3;
public class BlockClusterOutline extends Outline {
private final Cluster cluster;
protected final Vector3f pos0Temp = new Vector3f();
protected final Vector3f pos1Temp = new Vector3f();
protected final Vector3f pos2Temp = new Vector3f();
protected final Vector3f pos3Temp = new Vector3f();
protected final Vector3f normalTemp = new Vector3f();
protected final Vector3f originTemp = new Vector3f();
public BlockClusterOutline(Iterable<BlockPos> positions) {
cluster = new Cluster();
positions.forEach(cluster::include);
}
@Override
public void render(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera, float pt) {
params.loadColor(colorTemp);
Vector4f color = colorTemp;
int lightmap = params.lightmap;
boolean disableLineNormals = params.disableLineNormals;
renderFaces(ms, buffer, camera, pt, color, lightmap);
renderEdges(ms, buffer, camera, pt, color, lightmap, disableLineNormals);
}
protected void renderFaces(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera, float pt, Vector4f color, int lightmap) {
Optional<AllSpecialTextures> optionalFaceTexture = params.faceTexture;
if (!optionalFaceTexture.isPresent())
return;
if (cluster.isEmpty())
return;
ms.pushPose();
ms.translate(cluster.anchor.getX() - camera.x, cluster.anchor.getY() - camera.y,
cluster.anchor.getZ() - camera.z);
AllSpecialTextures faceTexture = optionalFaceTexture.get();
PoseStack.Pose pose = ms.last();
RenderType renderType = RenderTypes.getOutlineTranslucent(faceTexture.getLocation(), true);
VertexConsumer consumer = buffer.getLateBuffer(renderType);
cluster.visibleFaces.forEach((face, axisDirection) -> {
Direction direction = Direction.get(axisDirection, face.axis);
BlockPos pos = face.pos;
if (axisDirection == AxisDirection.POSITIVE)
pos = pos.relative(direction.getOpposite());
bufferBlockFace(pose, consumer, pos, direction, color, lightmap);
});
ms.popPose();
}
protected void renderEdges(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera, float pt, Vector4f color, int lightmap, boolean disableNormals) {
float lineWidth = params.getLineWidth();
if (lineWidth == 0)
return;
if (cluster.isEmpty())
return;
ms.pushPose();
ms.translate(cluster.anchor.getX() - camera.x, cluster.anchor.getY() - camera.y,
cluster.anchor.getZ() - camera.z);
PoseStack.Pose pose = ms.last();
VertexConsumer consumer = buffer.getBuffer(RenderTypes.getOutlineSolid());
cluster.visibleEdges.forEach(edge -> {
BlockPos pos = edge.pos;
Vector3f origin = originTemp;
origin.set(pos.getX(), pos.getY(), pos.getZ());
Direction direction = Direction.get(AxisDirection.POSITIVE, edge.axis);
bufferCuboidLine(pose, consumer, origin, direction, 1, lineWidth, color, lightmap, disableNormals);
});
ms.popPose();
}
public static void loadFaceData(Direction face, Vector3f pos0, Vector3f pos1, Vector3f pos2, Vector3f pos3, Vector3f normal) {
switch (face) {
case DOWN -> {
// 0 1 2 3
pos0.set(0, 0, 1);
pos1.set(0, 0, 0);
pos2.set(1, 0, 0);
pos3.set(1, 0, 1);
normal.set(0, -1, 0);
}
case UP -> {
// 4 5 6 7
pos0.set(0, 1, 0);
pos1.set(0, 1, 1);
pos2.set(1, 1, 1);
pos3.set(1, 1, 0);
normal.set(0, 1, 0);
}
case NORTH -> {
// 7 2 1 4
pos0.set(1, 1, 0);
pos1.set(1, 0, 0);
pos2.set(0, 0, 0);
pos3.set(0, 1, 0);
normal.set(0, 0, -1);
}
case SOUTH -> {
// 5 0 3 6
pos0.set(0, 1, 1);
pos1.set(0, 0, 1);
pos2.set(1, 0, 1);
pos3.set(1, 1, 1);
normal.set(0, 0, 1);
}
case WEST -> {
// 4 1 0 5
pos0.set(0, 1, 0);
pos1.set(0, 0, 0);
pos2.set(0, 0, 1);
pos3.set(0, 1, 1);
normal.set(-1, 0, 0);
}
case EAST -> {
// 6 3 2 7
pos0.set(1, 1, 1);
pos1.set(1, 0, 1);
pos2.set(1, 0, 0);
pos3.set(1, 1, 0);
normal.set(1, 0, 0);
}
}
}
public static void addPos(float x, float y, float z, Vector3f pos0, Vector3f pos1, Vector3f pos2, Vector3f pos3) {
pos0.add(x, y, z);
pos1.add(x, y, z);
pos2.add(x, y, z);
pos3.add(x, y, z);
}
protected void bufferBlockFace(PoseStack.Pose pose, VertexConsumer consumer, BlockPos pos, Direction face, Vector4f color, int lightmap) {
Vector3f pos0 = pos0Temp;
Vector3f pos1 = pos1Temp;
Vector3f pos2 = pos2Temp;
Vector3f pos3 = pos3Temp;
Vector3f normal = normalTemp;
loadFaceData(face, pos0, pos1, pos2, pos3, normal);
addPos(pos.getX() + face.getStepX() * 1 / 128f,
pos.getY() + face.getStepY() * 1 / 128f,
pos.getZ() + face.getStepZ() * 1 / 128f,
pos0, pos1, pos2, pos3);
bufferQuad(pose, consumer, pos0, pos1, pos2, pos3, color, lightmap, normal);
}
private static class Cluster {
private BlockPos anchor;
private Map<MergeEntry, AxisDirection> visibleFaces;
private Set<MergeEntry> visibleEdges;
public Cluster() {
visibleEdges = new HashSet<>();
visibleFaces = new HashMap<>();
}
public boolean isEmpty() {
return anchor == null;
}
public void include(BlockPos pos) {
if (anchor == null)
anchor = pos;
pos = pos.subtract(anchor);
// 6 FACES
for (Axis axis : Iterate.axes) {
Direction direction = Direction.get(AxisDirection.POSITIVE, axis);
for (int offset : Iterate.zeroAndOne) {
MergeEntry entry = new MergeEntry(axis, pos.relative(direction, offset));
if (visibleFaces.remove(entry) == null)
visibleFaces.put(entry, offset == 0 ? AxisDirection.NEGATIVE : AxisDirection.POSITIVE);
}
}
// 12 EDGES
for (Axis axis : Iterate.axes) {
for (Axis axis2 : Iterate.axes) {
if (axis == axis2)
continue;
for (Axis axis3 : Iterate.axes) {
if (axis == axis3)
continue;
if (axis2 == axis3)
continue;
Direction direction = Direction.get(AxisDirection.POSITIVE, axis2);
Direction direction2 = Direction.get(AxisDirection.POSITIVE, axis3);
for (int offset : Iterate.zeroAndOne) {
BlockPos entryPos = pos.relative(direction, offset);
for (int offset2 : Iterate.zeroAndOne) {
entryPos = entryPos.relative(direction2, offset2);
MergeEntry entry = new MergeEntry(axis, entryPos);
if (!visibleEdges.remove(entry))
visibleEdges.add(entry);
}
}
}
break;
}
}
}
}
private static class MergeEntry {
private Axis axis;
private BlockPos pos;
public MergeEntry(Axis axis, BlockPos pos) {
this.axis = axis;
this.pos = pos;
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (!(o instanceof MergeEntry))
return false;
MergeEntry other = (MergeEntry) o;
return this.axis == other.axis && this.pos.equals(other.pos);
}
@Override
public int hashCode() {
return this.pos.hashCode() * 31 + axis.ordinal();
}
}
}

View File

@@ -1,39 +0,0 @@
package nl.requios.effortlessbuilding.create.foundation.outliner;
import com.jozufozu.flywheel.util.transform.TransformStack;
import com.mojang.blaze3d.vertex.PoseStack;
import nl.requios.effortlessbuilding.create.foundation.render.SuperRenderTypeBuffer;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.LightTexture;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.world.item.ItemDisplayContext;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.phys.Vec3;
public class ItemOutline extends Outline {
protected Vec3 pos;
protected ItemStack stack;
public ItemOutline(Vec3 pos, ItemStack stack) {
this.pos = pos;
this.stack = stack;
}
@Override
public void render(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera, float pt) {
Minecraft mc = Minecraft.getInstance();
ms.pushPose();
TransformStack.cast(ms)
.translate(pos.x - camera.x, pos.y - camera.y, pos.z - camera.z)
.scale(params.alpha);
mc.getItemRenderer().render(stack, ItemDisplayContext.FIXED, false, ms,
buffer, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY,
mc.getItemRenderer().getModel(stack, null, null, 0));
ms.popPose();
}
}

View File

@@ -1,89 +0,0 @@
package nl.requios.effortlessbuilding.create.foundation.outliner;
import org.joml.Vector3d;
import org.joml.Vector4f;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import nl.requios.effortlessbuilding.create.foundation.render.RenderTypes;
import nl.requios.effortlessbuilding.create.foundation.render.SuperRenderTypeBuffer;
import net.minecraft.util.Mth;
import net.minecraft.world.phys.Vec3;
public class LineOutline extends Outline {
protected final Vector3d start = new Vector3d(0, 0, 0);
protected final Vector3d end = new Vector3d(0, 0, 0);
public LineOutline set(Vector3d start, Vector3d end) {
this.start.set(start.x, start.y, start.z);
this.end.set(end.x, end.y, end.z);
return this;
}
public LineOutline set(Vec3 start, Vec3 end) {
this.start.set(start.x, start.y, start.z);
this.end.set(end.x, end.y, end.z);
return this;
}
@Override
public void render(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera, float pt) {
float width = params.getLineWidth();
if (width == 0)
return;
VertexConsumer consumer = buffer.getBuffer(RenderTypes.getOutlineSolid());
params.loadColor(colorTemp);
Vector4f color = colorTemp;
int lightmap = params.lightmap;
boolean disableLineNormals = params.disableLineNormals;
renderInner(ms, consumer, camera, pt, width, color, lightmap, disableLineNormals);
}
protected void renderInner(PoseStack ms, VertexConsumer consumer, Vec3 camera, float pt, float width,
Vector4f color, int lightmap, boolean disableNormals) {
bufferCuboidLine(ms, consumer, camera, start, end, width, color, lightmap, disableNormals);
}
public static class EndChasingLineOutline extends LineOutline {
private float progress = 0;
private float prevProgress = 0;
private boolean lockStart;
private final Vector3d startTemp = new Vector3d(0, 0, 0);
public EndChasingLineOutline(boolean lockStart) {
this.lockStart = lockStart;
}
public EndChasingLineOutline setProgress(float progress) {
prevProgress = this.progress;
this.progress = progress;
return this;
}
@Override
protected void renderInner(PoseStack ms, VertexConsumer consumer, Vec3 camera, float pt, float width,
Vector4f color, int lightmap, boolean disableNormals) {
float distanceToTarget = Mth.lerp(pt, prevProgress, progress);
Vector3d end;
if (lockStart) {
end = this.start;
} else {
end = this.end;
distanceToTarget = 1 - distanceToTarget;
}
Vector3d start = this.startTemp;
double x = (this.start.x - end.x) * distanceToTarget + end.x;
double y = (this.start.y - end.y) * distanceToTarget + end.y;
double z = (this.start.z - end.z) * distanceToTarget + end.z;
start.set((float) x, (float) y, (float) z);
bufferCuboidLine(ms, consumer, camera, start, end, width, color, lightmap, disableNormals);
}
}
}

View File

@@ -1,601 +0,0 @@
package nl.requios.effortlessbuilding.create.foundation.outliner;
import java.util.Optional;
import javax.annotation.Nullable;
import org.joml.Matrix3f;
import org.joml.Matrix4f;
import org.joml.Vector3d;
import org.joml.Vector3f;
import org.joml.Vector4f;
import com.jozufozu.flywheel.util.transform.TransformStack;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer;
import nl.requios.effortlessbuilding.create.AllSpecialTextures;
import nl.requios.effortlessbuilding.create.foundation.render.SuperRenderTypeBuffer;
import nl.requios.effortlessbuilding.create.foundation.utility.AngleHelper;
import nl.requios.effortlessbuilding.create.foundation.utility.Color;
import net.minecraft.client.renderer.LightTexture;
import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.core.Direction;
import net.minecraft.util.Mth;
import net.minecraft.world.phys.Vec3;
public abstract class Outline {
protected final OutlineParams params;
protected final Vector4f colorTemp = new Vector4f();
protected final Vector3f diffPosTemp = new Vector3f();
protected final Vector3f minPosTemp = new Vector3f();
protected final Vector3f maxPosTemp = new Vector3f();
protected final Vector4f posTransformTemp = new Vector4f();
protected final Vector3f normalTransformTemp = new Vector3f();
public Outline() {
params = new OutlineParams();
}
public OutlineParams getParams() {
return params;
}
public abstract void render(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 camera, float pt);
public void tick() {}
public void bufferCuboidLine(PoseStack poseStack, VertexConsumer consumer, Vec3 camera, Vector3d start, Vector3d end,
float width, Vector4f color, int lightmap, boolean disableNormals) {
Vector3f diff = this.diffPosTemp;
diff.set((float) (end.x - start.x), (float) (end.y - start.y), (float) (end.z - start.z));
float length = Mth.sqrt(diff.x() * diff.x() + diff.y() * diff.y() + diff.z() * diff.z());
float hAngle = AngleHelper.deg(Mth.atan2(diff.x(), diff.z()));
float hDistance = Mth.sqrt(diff.x() * diff.x() + diff.z() * diff.z());
float vAngle = AngleHelper.deg(Mth.atan2(hDistance, diff.y())) - 90;
poseStack.pushPose();
TransformStack.cast(poseStack)
.translate(start.x - camera.x, start.y - camera.y, start.z - camera.z)
.rotateY(hAngle)
.rotateX(vAngle);
bufferCuboidLine(poseStack.last(), consumer, new Vector3f(), Direction.SOUTH, length, width, color, lightmap,
disableNormals);
poseStack.popPose();
}
public void bufferCuboidLine(PoseStack.Pose pose, VertexConsumer consumer, Vector3f origin, Direction direction,
float length, float width, Vector4f color, int lightmap, boolean disableNormals) {
Vector3f minPos = minPosTemp;
Vector3f maxPos = maxPosTemp;
float halfWidth = width / 2;
minPos.set(origin.x() - halfWidth, origin.y() - halfWidth, origin.z() - halfWidth);
maxPos.set(origin.x() + halfWidth, origin.y() + halfWidth, origin.z() + halfWidth);
switch (direction) {
case DOWN -> {
minPos.add(0, -length, 0);
}
case UP -> {
maxPos.add(0, length, 0);
}
case NORTH -> {
minPos.add(0, 0, -length);
}
case SOUTH -> {
maxPos.add(0, 0, length);
}
case WEST -> {
minPos.add(-length, 0, 0);
}
case EAST -> {
maxPos.add(length, 0, 0);
}
}
bufferCuboid(pose, consumer, minPos, maxPos, color, lightmap, disableNormals);
}
public void bufferCuboid(PoseStack.Pose pose, VertexConsumer consumer, Vector3f minPos, Vector3f maxPos,
Vector4f color, int lightmap, boolean disableNormals) {
Vector4f posTransformTemp = this.posTransformTemp;
Vector3f normalTransformTemp = this.normalTransformTemp;
float minX = minPos.x();
float minY = minPos.y();
float minZ = minPos.z();
float maxX = maxPos.x();
float maxY = maxPos.y();
float maxZ = maxPos.z();
Matrix4f posMatrix = pose.pose();
posTransformTemp.set(minX, minY, maxZ, 1);
posTransformTemp.mul(posMatrix);
double x0 = posTransformTemp.x();
double y0 = posTransformTemp.y();
double z0 = posTransformTemp.z();
posTransformTemp.set(minX, minY, minZ, 1);
posTransformTemp.mul(posMatrix);
double x1 = posTransformTemp.x();
double y1 = posTransformTemp.y();
double z1 = posTransformTemp.z();
posTransformTemp.set(maxX, minY, minZ, 1);
posTransformTemp.mul(posMatrix);
double x2 = posTransformTemp.x();
double y2 = posTransformTemp.y();
double z2 = posTransformTemp.z();
posTransformTemp.set(maxX, minY, maxZ, 1);
posTransformTemp.mul(posMatrix);
double x3 = posTransformTemp.x();
double y3 = posTransformTemp.y();
double z3 = posTransformTemp.z();
posTransformTemp.set(minX, maxY, minZ, 1);
posTransformTemp.mul(posMatrix);
double x4 = posTransformTemp.x();
double y4 = posTransformTemp.y();
double z4 = posTransformTemp.z();
posTransformTemp.set(minX, maxY, maxZ, 1);
posTransformTemp.mul(posMatrix);
double x5 = posTransformTemp.x();
double y5 = posTransformTemp.y();
double z5 = posTransformTemp.z();
posTransformTemp.set(maxX, maxY, maxZ, 1);
posTransformTemp.mul(posMatrix);
double x6 = posTransformTemp.x();
double y6 = posTransformTemp.y();
double z6 = posTransformTemp.z();
posTransformTemp.set(maxX, maxY, minZ, 1);
posTransformTemp.mul(posMatrix);
double x7 = posTransformTemp.x();
double y7 = posTransformTemp.y();
double z7 = posTransformTemp.z();
float r = color.x();
float g = color.y();
float b = color.z();
float a = color.w();
Matrix3f normalMatrix = pose.normal();
// down
if (disableNormals) {
normalTransformTemp.set(0, 1, 0);
} else {
normalTransformTemp.set(0, -1, 0);
}
normalTransformTemp.mul(normalMatrix);
float nx0 = normalTransformTemp.x();
float ny0 = normalTransformTemp.y();
float nz0 = normalTransformTemp.z();
consumer.vertex(x0, y0, z0)
.color(r, g, b, a)
.uv(0, 0)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx0, ny0, nz0)
.endVertex();
consumer.vertex(x1, y1, z1)
.color(r, g, b, a)
.uv(0, 1)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx0, ny0, nz0)
.endVertex();
consumer.vertex(x2, y2, z2)
.color(r, g, b, a)
.uv(1, 1)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx0, ny0, nz0)
.endVertex();
consumer.vertex(x3, y3, z3)
.color(r, g, b, a)
.uv(1, 0)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx0, ny0, nz0)
.endVertex();
// up
normalTransformTemp.set(0, 1, 0);
normalTransformTemp.mul(normalMatrix);
float nx1 = normalTransformTemp.x();
float ny1 = normalTransformTemp.y();
float nz1 = normalTransformTemp.z();
consumer.vertex(x4, y4, z4)
.color(r, g, b, a)
.uv(0, 0)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx1, ny1, nz1)
.endVertex();
consumer.vertex(x5, y5, z5)
.color(r, g, b, a)
.uv(0, 1)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx1, ny1, nz1)
.endVertex();
consumer.vertex(x6, y6, z6)
.color(r, g, b, a)
.uv(1, 1)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx1, ny1, nz1)
.endVertex();
consumer.vertex(x7, y7, z7)
.color(r, g, b, a)
.uv(1, 0)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx1, ny1, nz1)
.endVertex();
// north
if (disableNormals) {
normalTransformTemp.set(0, 1, 0);
} else {
normalTransformTemp.set(0, 0, -1);
}
normalTransformTemp.mul(normalMatrix);
float nx2 = normalTransformTemp.x();
float ny2 = normalTransformTemp.y();
float nz2 = normalTransformTemp.z();
consumer.vertex(x7, y7, z7)
.color(r, g, b, a)
.uv(0, 0)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx2, ny2, nz2)
.endVertex();
consumer.vertex(x2, y2, z2)
.color(r, g, b, a)
.uv(0, 1)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx2, ny2, nz2)
.endVertex();
consumer.vertex(x1, y1, z1)
.color(r, g, b, a)
.uv(1, 1)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx2, ny2, nz2)
.endVertex();
consumer.vertex(x4, y4, z4)
.color(r, g, b, a)
.uv(1, 0)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx2, ny2, nz2)
.endVertex();
// south
if (disableNormals) {
normalTransformTemp.set(0, 1, 0);
} else {
normalTransformTemp.set(0, 0, 1);
}
normalTransformTemp.mul(normalMatrix);
float nx3 = normalTransformTemp.x();
float ny3 = normalTransformTemp.y();
float nz3 = normalTransformTemp.z();
consumer.vertex(x5, y5, z5)
.color(r, g, b, a)
.uv(0, 0)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx3, ny3, nz3)
.endVertex();
consumer.vertex(x0, y0, z0)
.color(r, g, b, a)
.uv(0, 1)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx3, ny3, nz3)
.endVertex();
consumer.vertex(x3, y3, z3)
.color(r, g, b, a)
.uv(1, 1)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx3, ny3, nz3)
.endVertex();
consumer.vertex(x6, y6, z6)
.color(r, g, b, a)
.uv(1, 0)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx3, ny3, nz3)
.endVertex();
// west
if (disableNormals) {
normalTransformTemp.set(0, 1, 0);
} else {
normalTransformTemp.set(-1, 0, 0);
}
normalTransformTemp.mul(normalMatrix);
float nx4 = normalTransformTemp.x();
float ny4 = normalTransformTemp.y();
float nz4 = normalTransformTemp.z();
consumer.vertex(x4, y4, z4)
.color(r, g, b, a)
.uv(0, 0)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx4, ny4, nz4)
.endVertex();
consumer.vertex(x1, y1, z1)
.color(r, g, b, a)
.uv(0, 1)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx4, ny4, nz4)
.endVertex();
consumer.vertex(x0, y0, z0)
.color(r, g, b, a)
.uv(1, 1)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx4, ny4, nz4)
.endVertex();
consumer.vertex(x5, y5, z5)
.color(r, g, b, a)
.uv(1, 0)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx4, ny4, nz4)
.endVertex();
// east
if (disableNormals) {
normalTransformTemp.set(0, 1, 0);
} else {
normalTransformTemp.set(1, 0, 0);
}
normalTransformTemp.mul(normalMatrix);
float nx5 = normalTransformTemp.x();
float ny5 = normalTransformTemp.y();
float nz5 = normalTransformTemp.z();
consumer.vertex(x6, y6, z6)
.color(r, g, b, a)
.uv(0, 0)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx5, ny5, nz5)
.endVertex();
consumer.vertex(x3, y3, z3)
.color(r, g, b, a)
.uv(0, 1)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx5, ny5, nz5)
.endVertex();
consumer.vertex(x2, y2, z2)
.color(r, g, b, a)
.uv(1, 1)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx5, ny5, nz5)
.endVertex();
consumer.vertex(x7, y7, z7)
.color(r, g, b, a)
.uv(1, 0)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx5, ny5, nz5)
.endVertex();
}
public void bufferQuad(PoseStack.Pose pose, VertexConsumer consumer, Vector3f pos0, Vector3f pos1, Vector3f pos2,
Vector3f pos3, Vector4f color, int lightmap, Vector3f normal) {
bufferQuad(pose, consumer, pos0, pos1, pos2, pos3, color, 0, 0, 1, 1, lightmap, normal);
}
public void bufferQuad(PoseStack.Pose pose, VertexConsumer consumer, Vector3f pos0, Vector3f pos1, Vector3f pos2,
Vector3f pos3, Vector4f color, float minU, float minV, float maxU, float maxV, int lightmap, Vector3f normal) {
Vector4f posTransformTemp = this.posTransformTemp;
Vector3f normalTransformTemp = this.normalTransformTemp;
Matrix4f posMatrix = pose.pose();
posTransformTemp.set(pos0.x(), pos0.y(), pos0.z(), 1);
posTransformTemp.mul(posMatrix);
double x0 = posTransformTemp.x();
double y0 = posTransformTemp.y();
double z0 = posTransformTemp.z();
posTransformTemp.set(pos1.x(), pos1.y(), pos1.z(), 1);
posTransformTemp.mul(posMatrix);
double x1 = posTransformTemp.x();
double y1 = posTransformTemp.y();
double z1 = posTransformTemp.z();
posTransformTemp.set(pos2.x(), pos2.y(), pos2.z(), 1);
posTransformTemp.mul(posMatrix);
double x2 = posTransformTemp.x();
double y2 = posTransformTemp.y();
double z2 = posTransformTemp.z();
posTransformTemp.set(pos3.x(), pos3.y(), pos3.z(), 1);
posTransformTemp.mul(posMatrix);
double x3 = posTransformTemp.x();
double y3 = posTransformTemp.y();
double z3 = posTransformTemp.z();
float r = color.x();
float g = color.y();
float b = color.z();
float a = color.w();
normalTransformTemp.set(normal);
normalTransformTemp.mul(pose.normal());
float nx = normalTransformTemp.x();
float ny = normalTransformTemp.y();
float nz = normalTransformTemp.z();
consumer.vertex(x0, y0, z0)
.color(r, g, b, a)
.uv(minU, minV)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx, ny, nz)
.endVertex();
consumer.vertex(x1, y1, z1)
.color(r, g, b, a)
.uv(minU, maxV)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx, ny, nz)
.endVertex();
consumer.vertex(x2, y2, z2)
.color(r, g, b, a)
.uv(maxU, maxV)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx, ny, nz)
.endVertex();
consumer.vertex(x3, y3, z3)
.color(r, g, b, a)
.uv(maxU, minV)
.overlayCoords(OverlayTexture.NO_OVERLAY)
.uv2(lightmap)
.normal(nx, ny, nz)
.endVertex();
}
public static class OutlineParams {
protected Optional<AllSpecialTextures> faceTexture;
protected Optional<AllSpecialTextures> hightlightedFaceTexture;
protected Direction highlightedFace;
protected boolean fadeLineWidth;
protected boolean disableCull;
protected boolean disableLineNormals;
protected float alpha;
protected int lightmap;
protected Color rgb;
private float lineWidth;
public OutlineParams() {
faceTexture = hightlightedFaceTexture = Optional.empty();
alpha = 1;
lineWidth = 1 / 32f;
fadeLineWidth = true;
rgb = Color.WHITE;
lightmap = LightTexture.FULL_BRIGHT;
}
// builder
public OutlineParams colored(int color) {
rgb = new Color(color, false);
return this;
}
public OutlineParams colored(Color c) {
rgb = c.copy();
return this;
}
public OutlineParams lightmap(int light) {
lightmap = light;
return this;
}
public OutlineParams lineWidth(float width) {
this.lineWidth = width;
return this;
}
public OutlineParams withFaceTexture(AllSpecialTextures texture) {
this.faceTexture = Optional.ofNullable(texture);
return this;
}
public OutlineParams clearTextures() {
return this.withFaceTextures(null, null);
}
public OutlineParams withFaceTextures(AllSpecialTextures texture, AllSpecialTextures highlightTexture) {
this.faceTexture = Optional.ofNullable(texture);
this.hightlightedFaceTexture = Optional.ofNullable(highlightTexture);
return this;
}
public OutlineParams highlightFace(@Nullable Direction face) {
highlightedFace = face;
return this;
}
public OutlineParams disableLineNormals() {
disableLineNormals = true;
return this;
}
public OutlineParams disableCull() {
disableCull = true;
return this;
}
// getter
public float getLineWidth() {
return fadeLineWidth ? alpha * lineWidth : lineWidth;
}
public Direction getHighlightedFace() {
return highlightedFace;
}
public void loadColor(Vector4f vec) {
vec.set(rgb.getRedAsFloat(), rgb.getGreenAsFloat(), rgb.getBlueAsFloat(), rgb.getAlphaAsFloat() * alpha);
}
}
}

View File

@@ -1,9 +1,9 @@
package nl.requios.effortlessbuilding.create.foundation.render; package nl.requios.effortlessbuilding.create.foundation.render;
import com.jozufozu.flywheel.core.model.ModelUtil; 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;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.block.BlockRenderDispatcher; import net.minecraft.client.renderer.block.BlockRenderDispatcher;
import net.minecraft.client.resources.model.BakedModel; import net.minecraft.client.resources.model.BakedModel;
@@ -13,7 +13,7 @@ public class BakedModelRenderHelper {
public static SuperByteBuffer standardBlockRender(BlockState renderedState) { public static SuperByteBuffer standardBlockRender(BlockState renderedState) {
BlockRenderDispatcher dispatcher = Minecraft.getInstance() BlockRenderDispatcher dispatcher = Minecraft.getInstance()
.getBlockRenderer(); .getBlockRenderer();
return standardModelRender(dispatcher.getBlockModel(renderedState), renderedState); return standardModelRender(dispatcher.getBlockModel(renderedState), renderedState);
} }
@@ -22,10 +22,7 @@ public class BakedModelRenderHelper {
} }
public static SuperByteBuffer standardModelRender(BakedModel model, BlockState referenceState, PoseStack ms) { public static SuperByteBuffer standardModelRender(BakedModel model, BlockState referenceState, PoseStack ms) {
ShadeSeparatedBufferedData data = ModelUtil.getBufferedData(model, referenceState, ms); Pair<BufferBuilder.RenderedBuffer, Integer> pair = ModelUtil.getBufferBuilder(model, referenceState, ms);
SuperByteBuffer sbb = new SuperByteBuffer(data); return new SuperByteBuffer(pair.first(), pair.second());
data.release();
return sbb;
} }
} }

View File

@@ -1,29 +1,27 @@
package nl.requios.effortlessbuilding.create.foundation.render; package nl.requios.effortlessbuilding.create.foundation.render;
import static net.minecraft.world.level.block.state.properties.BlockStateProperties.FACING;
import java.util.function.Supplier;
import org.apache.commons.lang3.tuple.Pair;
import com.jozufozu.flywheel.core.PartialModel; import com.jozufozu.flywheel.core.PartialModel;
import com.jozufozu.flywheel.util.transform.TransformStack; import com.jozufozu.flywheel.util.transform.TransformStack;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import nl.requios.effortlessbuilding.create.CreateClient; import nl.requios.effortlessbuilding.create.CreateClient;
import nl.requios.effortlessbuilding.create.foundation.render.SuperByteBufferCache.Compartment; import nl.requios.effortlessbuilding.create.foundation.render.SuperByteBufferCache.Compartment;
import nl.requios.effortlessbuilding.create.foundation.utility.AngleHelper; import nl.requios.effortlessbuilding.create.foundation.utility.AngleHelper;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.world.level.block.state.BlockState; 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 class CachedBufferer {
public static final Compartment<BlockState> GENERIC_BLOCK = new Compartment<>(); public static final Compartment<BlockState> GENERIC_TILE = new Compartment<>();
public static final Compartment<PartialModel> PARTIAL = new Compartment<>(); public static final Compartment<PartialModel> PARTIAL = new Compartment<>();
public static final Compartment<Pair<Direction, PartialModel>> DIRECTIONAL_PARTIAL = new Compartment<>(); public static final Compartment<Pair<Direction, PartialModel>> DIRECTIONAL_PARTIAL = new Compartment<>();
public static SuperByteBuffer block(BlockState toRender) { public static SuperByteBuffer block(BlockState toRender) {
return block(GENERIC_BLOCK, toRender); return block(GENERIC_TILE, toRender);
} }
public static SuperByteBuffer block(Compartment<BlockState> compartment, BlockState toRender) { public static SuperByteBuffer block(Compartment<BlockState> compartment, BlockState toRender) {

View File

@@ -1,11 +1,10 @@
package nl.requios.effortlessbuilding.create.foundation.render; package nl.requios.effortlessbuilding.create.foundation.render;
import javax.annotation.Nullable;
import com.jozufozu.flywheel.util.DiffuseLightCalculator; import com.jozufozu.flywheel.util.DiffuseLightCalculator;
import it.unimi.dsi.fastutil.objects.ObjectArrayList; import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import javax.annotation.Nullable;
public final class ForcedDiffuseState { public final class ForcedDiffuseState {
private static final ThreadLocal<ObjectArrayList<DiffuseLightCalculator>> FORCED_DIFFUSE = ThreadLocal.withInitial(ObjectArrayList::new); private static final ThreadLocal<ObjectArrayList<DiffuseLightCalculator>> FORCED_DIFFUSE = ThreadLocal.withInitial(ObjectArrayList::new);

View File

@@ -1,33 +1,24 @@
package nl.requios.effortlessbuilding.create.foundation.render; package nl.requios.effortlessbuilding.create.foundation.render;
import java.io.IOException;
import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.DefaultVertexFormat;
import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.blaze3d.vertex.VertexFormat;
import nl.requios.effortlessbuilding.create.AllSpecialTextures; 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.ResourceProvider;
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;
// 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 {
public static final RenderStateShard.ShaderStateShard GLOWING_SHADER = new RenderStateShard.ShaderStateShard(() -> Shaders.glowingShader); // public static final ShaderStateShard GLOWING_SHADER = new ShaderStateShard(() -> Shaders.glowingShader);
private static final RenderType OUTLINE_SOLID = private static final RenderType OUTLINE_SOLID =
RenderType.create(createLayerName("outline_solid"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, false, RenderType.create(createLayerName("outline_solid"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, false,
false, RenderType.CompositeState.builder() false, RenderType.CompositeState.builder()
.setShaderState(RENDERTYPE_ENTITY_SOLID_SHADER) .setShaderState(RENDERTYPE_ENTITY_SOLID_SHADER)
.setTextureState(new RenderStateShard.TextureStateShard(AllSpecialTextures.BLANK.getLocation(), false, false)) .setTextureState(new TextureStateShard(AllSpecialTextures.BLANK.getLocation(), false, false))
.setCullState(CULL) .setCullState(CULL)
.setLightmapState(LIGHTMAP) .setLightmapState(LIGHTMAP)
.setOverlayState(OVERLAY) .setOverlayState(OVERLAY)
@@ -41,7 +32,7 @@ public class RenderTypes extends RenderStateShard {
return RenderType.create(createLayerName("outline_translucent" + (cull ? "_cull" : "")), return RenderType.create(createLayerName("outline_translucent" + (cull ? "_cull" : "")),
DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, false, true, RenderType.CompositeState.builder() DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, false, true, RenderType.CompositeState.builder()
.setShaderState(cull ? RENDERTYPE_ENTITY_TRANSLUCENT_CULL_SHADER : RENDERTYPE_ENTITY_TRANSLUCENT_SHADER) .setShaderState(cull ? RENDERTYPE_ENTITY_TRANSLUCENT_CULL_SHADER : RENDERTYPE_ENTITY_TRANSLUCENT_SHADER)
.setTextureState(new RenderStateShard.TextureStateShard(texture, false, false)) .setTextureState(new TextureStateShard(texture, false, false))
.setTransparencyState(TRANSLUCENT_TRANSPARENCY) .setTransparencyState(TRANSLUCENT_TRANSPARENCY)
.setCullState(cull ? CULL : NO_CULL) .setCullState(cull ? CULL : NO_CULL)
.setLightmapState(LIGHTMAP) .setLightmapState(LIGHTMAP)
@@ -50,38 +41,38 @@ public class RenderTypes extends RenderStateShard {
.createCompositeState(false)); .createCompositeState(false));
} }
public static RenderType getGlowingSolid(ResourceLocation texture) { // public static RenderType getGlowingSolid(ResourceLocation texture) {
return RenderType.create(createLayerName("glowing_solid"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, // return RenderType.create(createLayerName("glowing_solid"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256,
true, false, RenderType.CompositeState.builder() // true, false, RenderType.CompositeState.builder()
.setShaderState(GLOWING_SHADER) // .setShaderState(GLOWING_SHADER)
.setTextureState(new RenderStateShard.TextureStateShard(texture, false, false)) // .setTextureState(new TextureStateShard(texture, false, false))
.setCullState(CULL) // .setCullState(CULL)
.setLightmapState(LIGHTMAP) // .setLightmapState(LIGHTMAP)
.setOverlayState(OVERLAY) // .setOverlayState(OVERLAY)
.createCompositeState(true)); // .createCompositeState(true));
} // }
//
// private static final RenderType GLOWING_SOLID_DEFAULT = getGlowingSolid(InventoryMenu.BLOCK_ATLAS);
//
// public static RenderType getGlowingSolid() {
// return GLOWING_SOLID_DEFAULT;
// }
private static final RenderType GLOWING_SOLID_DEFAULT = getGlowingSolid(InventoryMenu.BLOCK_ATLAS); // public static RenderType getGlowingTranslucent(ResourceLocation texture) {
// return RenderType.create(createLayerName("glowing_translucent"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS,
public static RenderType getGlowingSolid() { // 256, true, true, RenderType.CompositeState.builder()
return GLOWING_SOLID_DEFAULT; // .setShaderState(GLOWING_SHADER)
} // .setTextureState(new TextureStateShard(texture, false, false))
// .setTransparencyState(TRANSLUCENT_TRANSPARENCY)
public static RenderType getGlowingTranslucent(ResourceLocation texture) { // .setLightmapState(LIGHTMAP)
return RenderType.create(createLayerName("glowing_translucent"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, // .setOverlayState(OVERLAY)
256, true, true, RenderType.CompositeState.builder() // .createCompositeState(true));
.setShaderState(GLOWING_SHADER) // }
.setTextureState(new RenderStateShard.TextureStateShard(texture, false, false))
.setTransparencyState(TRANSLUCENT_TRANSPARENCY)
.setLightmapState(LIGHTMAP)
.setOverlayState(OVERLAY)
.createCompositeState(true));
}
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(RENDERTYPE_SOLID_SHADER) .setShaderState(RENDERTYPE_SOLID_SHADER)
.setTextureState(new RenderStateShard.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)
.setLightmapState(LIGHTMAP) .setLightmapState(LIGHTMAP)
@@ -92,11 +83,11 @@ public class RenderTypes extends RenderStateShard {
return ADDITIVE; return ADDITIVE;
} }
private static final RenderType GLOWING_TRANSLUCENT_DEFAULT = getGlowingTranslucent(InventoryMenu.BLOCK_ATLAS); // private static final RenderType GLOWING_TRANSLUCENT_DEFAULT = getGlowingTranslucent(InventoryMenu.BLOCK_ATLAS);
public static RenderType getGlowingTranslucent() { // public static RenderType getGlowingTranslucent() {
return GLOWING_TRANSLUCENT_DEFAULT; // return GLOWING_TRANSLUCENT_DEFAULT;
} // }
private static final RenderType ITEM_PARTIAL_SOLID = private static final RenderType ITEM_PARTIAL_SOLID =
RenderType.create(createLayerName("item_partial_solid"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, RenderType.create(createLayerName("item_partial_solid"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true,
@@ -147,15 +138,15 @@ public class RenderTypes extends RenderStateShard {
super(null, null, null); super(null, null, null);
} }
@EventBusSubscriber(value = Dist.CLIENT, bus = EventBusSubscriber.Bus.MOD) // @EventBusSubscriber(value = Dist.CLIENT, bus = EventBusSubscriber.Bus.MOD)
private static class Shaders { // private static class Shaders {
private static ShaderInstance glowingShader; // private static ShaderInstance glowingShader;
//
@SubscribeEvent // @SubscribeEvent
public static void onRegisterShaders(RegisterShadersEvent event) throws IOException { // public static void onRegisterShaders(RegisterShadersEvent event) throws IOException {
ResourceProvider resourceProvider = event.getResourceProvider(); // ResourceManager resourceManager = event.getResourceManager();
event.registerShader(new ShaderInstance(resourceProvider, Create.asResource("glowing_shader"), DefaultVertexFormat.NEW_ENTITY), shader -> glowingShader = shader); // event.registerShader(new ShaderInstance(resourceManager, Create.asResource("glowing_shader"), DefaultVertexFormat.NEW_ENTITY), shader -> glowingShader = shader);
} // }
} // }
} }

View File

@@ -1,9 +1,7 @@
package nl.requios.effortlessbuilding.create.foundation.render; package nl.requios.effortlessbuilding.create.foundation.render;
import com.jozufozu.flywheel.util.Color;
import java.nio.ByteBuffer; import nl.requios.effortlessbuilding.create.foundation.block.render.SpriteShiftEntry;
import java.util.function.IntPredicate;
import org.joml.Matrix3f; import org.joml.Matrix3f;
import org.joml.Matrix4f; import org.joml.Matrix4f;
import org.joml.Quaternionf; import org.joml.Quaternionf;
@@ -11,18 +9,15 @@ import org.joml.Vector3f;
import org.joml.Vector4f; import org.joml.Vector4f;
import com.jozufozu.flywheel.api.vertex.ShadedVertexList; import com.jozufozu.flywheel.api.vertex.ShadedVertexList;
import com.jozufozu.flywheel.api.vertex.VertexList;
import com.jozufozu.flywheel.backend.ShadersModHandler; import com.jozufozu.flywheel.backend.ShadersModHandler;
import com.jozufozu.flywheel.core.model.ShadeSeparatedBufferedData;
import com.jozufozu.flywheel.core.vertex.BlockVertexList; import com.jozufozu.flywheel.core.vertex.BlockVertexList;
import com.jozufozu.flywheel.util.DiffuseLightCalculator; import com.jozufozu.flywheel.util.DiffuseLightCalculator;
import com.jozufozu.flywheel.util.transform.TStack; import com.jozufozu.flywheel.util.transform.TStack;
import com.jozufozu.flywheel.util.transform.Transform; import com.jozufozu.flywheel.util.transform.Transform;
import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.BufferBuilder.DrawState;
import com.mojang.blaze3d.vertex.BufferBuilder.RenderedBuffer;
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.block.render.SpriteShiftEntry;
import nl.requios.effortlessbuilding.create.foundation.utility.Color;
import it.unimi.dsi.fastutil.longs.Long2IntMap; import it.unimi.dsi.fastutil.longs.Long2IntMap;
import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap; import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap;
@@ -37,11 +32,10 @@ import net.minecraft.world.level.Level;
public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<SuperByteBuffer> { public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<SuperByteBuffer> {
private final VertexList template; private final ShadedVertexList template;
private final IntPredicate shadedPredicate;
// Vertex Position // Vertex Position
private final PoseStack transforms = new PoseStack(); private final PoseStack transforms;
// Vertex Coloring // Vertex Coloring
private boolean shouldColor; private boolean shouldColor;
@@ -69,28 +63,11 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<Super
// Temporary // Temporary
private static final Long2IntMap WORLD_LIGHT_CACHE = new Long2IntOpenHashMap(); private static final Long2IntMap WORLD_LIGHT_CACHE = new Long2IntOpenHashMap();
public SuperByteBuffer(ByteBuffer vertexBuffer, BufferBuilder.DrawState drawState, int unshadedStartVertex) { public SuperByteBuffer(RenderedBuffer buf, int unshadedStartVertex) {
int vertexCount = drawState.vertexCount(); DrawState drawState = buf.drawState();
int stride = drawState.format().getVertexSize(); template = new BlockVertexList.Shaded(buf.vertexBuffer(), drawState.vertexCount(), drawState.format().getVertexSize(), unshadedStartVertex);
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 = new PoseStack();
transforms.pushPose(); transforms.pushPose();
} }
@@ -99,21 +76,21 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<Super
return; return;
Matrix4f modelMat = new Matrix4f(input.last() Matrix4f modelMat = new Matrix4f(input.last()
.pose()); .pose());
Matrix4f localTransforms = transforms.last() Matrix4f localTransforms = transforms.last()
.pose(); .pose();
modelMat.mul(localTransforms); modelMat.mul(localTransforms);
Matrix3f normalMat; Matrix3f normalMat;
if (fullNormalTransform) { if (fullNormalTransform) {
normalMat = new Matrix3f(input.last() normalMat = new Matrix3f(input.last()
.normal()); .normal());
Matrix3f localNormalTransforms = transforms.last() Matrix3f localNormalTransforms = transforms.last()
.normal(); .normal();
normalMat.mul(localNormalTransforms); normalMat.mul(localNormalTransforms);
} else { } else {
normalMat = new Matrix3f(transforms.last() normalMat = new Matrix3f(transforms.last()
.normal()); .normal());
} }
if (useWorldLight) { if (useWorldLight) {
@@ -126,7 +103,7 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<Super
DiffuseLightCalculator diffuseCalculator = ForcedDiffuseState.getForcedCalculator(); DiffuseLightCalculator diffuseCalculator = ForcedDiffuseState.getForcedCalculator();
final boolean disableDiffuseMult = final boolean disableDiffuseMult =
this.disableDiffuseMult || (ShadersModHandler.isShaderPackInUse() && diffuseCalculator == null); this.disableDiffuseMult || (ShadersModHandler.isShaderPackInUse() && diffuseCalculator == null);
if (diffuseCalculator == null) { if (diffuseCalculator == null) {
diffuseCalculator = this.diffuseCalculator; diffuseCalculator = this.diffuseCalculator;
if (diffuseCalculator == null) { if (diffuseCalculator == null) {
@@ -169,7 +146,7 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<Super
if (disableDiffuseMult) { if (disableDiffuseMult) {
builder.color(r, g, b, a); builder.color(r, g, b, a);
} else { } else {
float instanceDiffuse = diffuseCalculator.getDiffuse(nx, ny, nz, shadedPredicate.test(i)); float instanceDiffuse = diffuseCalculator.getDiffuse(nx, ny, nz, template.isShaded(i));
int colorR = transformColor(r, instanceDiffuse); int colorR = transformColor(r, instanceDiffuse);
int colorG = transformColor(g, instanceDiffuse); int colorG = transformColor(g, instanceDiffuse);
int colorB = transformColor(b, instanceDiffuse); int colorB = transformColor(b, instanceDiffuse);
@@ -248,10 +225,6 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<Super
return template.isEmpty(); return template.isEmpty();
} }
public void delete() {
template.delete();
}
public PoseStack getTransforms() { public PoseStack getTransforms() {
return transforms; return transforms;
} }
@@ -289,40 +262,40 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<Super
@Override @Override
public SuperByteBuffer mulPose(Matrix4f pose) { public SuperByteBuffer mulPose(Matrix4f pose) {
transforms.last() transforms.last()
.pose() .pose()
.mul(pose); .mul(pose);
return this; return this;
} }
@Override @Override
public SuperByteBuffer mulNormal(Matrix3f normal) { public SuperByteBuffer mulNormal(Matrix3f normal) {
transforms.last() transforms.last()
.normal() .normal()
.mul(normal); .mul(normal);
return this; return this;
} }
public SuperByteBuffer transform(PoseStack stack) { public SuperByteBuffer transform(PoseStack stack) {
transforms.last() transforms.last()
.pose() .pose()
.mul(stack.last() .mul(stack.last()
.pose()); .pose());
transforms.last() transforms.last()
.normal() .normal()
.mul(stack.last() .mul(stack.last()
.normal()); .normal());
return this; return this;
} }
public SuperByteBuffer rotateCentered(Direction axis, float radians) { public SuperByteBuffer rotateCentered(Direction axis, float radians) {
translate(.5f, .5f, .5f).rotate(axis, radians) translate(.5f, .5f, .5f).rotate(axis, radians)
.translate(-.5f, -.5f, -.5f); .translate(-.5f, -.5f, -.5f);
return this; return this;
} }
public SuperByteBuffer rotateCentered(Quaternionf q) { public SuperByteBuffer rotateCentered(Quaternionf q) {
translate(.5f, .5f, .5f).multiply(q) translate(.5f, .5f, .5f).multiply(q)
.translate(-.5f, -.5f, -.5f); .translate(-.5f, -.5f, -.5f);
return this; return this;
} }
@@ -377,13 +350,13 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<Super
public SuperByteBuffer shiftUVScrolling(SpriteShiftEntry entry, float scrollU, float scrollV) { public SuperByteBuffer shiftUVScrolling(SpriteShiftEntry entry, float scrollU, float scrollV) {
this.spriteShiftFunc = (builder, u, v) -> { this.spriteShiftFunc = (builder, u, v) -> {
float targetU = u - entry.getOriginal() float targetU = u - entry.getOriginal()
.getU0() + entry.getTarget() .getU0() + entry.getTarget()
.getU0() .getU0()
+ scrollU; + scrollU;
float targetV = v - entry.getOriginal() float targetV = v - entry.getOriginal()
.getV0() + entry.getTarget() .getV0() + entry.getTarget()
.getV0() .getV0()
+ scrollV; + scrollV;
builder.uv(targetU, targetV); builder.uv(targetU, targetV);
}; };
return this; return this;
@@ -392,9 +365,9 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<Super
public SuperByteBuffer shiftUVtoSheet(SpriteShiftEntry entry, float uTarget, float vTarget, int sheetSize) { public SuperByteBuffer shiftUVtoSheet(SpriteShiftEntry entry, float uTarget, float vTarget, int sheetSize) {
this.spriteShiftFunc = (builder, u, v) -> { this.spriteShiftFunc = (builder, u, v) -> {
float targetU = entry.getTarget() float targetU = entry.getTarget()
.getU((SpriteShiftEntry.getUnInterpolatedU(entry.getOriginal(), u) / sheetSize) + uTarget * 16); .getU((SpriteShiftEntry.getUnInterpolatedU(entry.getOriginal(), u) / sheetSize) + uTarget * 16);
float targetV = entry.getTarget() float targetV = entry.getTarget()
.getV((SpriteShiftEntry.getUnInterpolatedV(entry.getOriginal(), v) / sheetSize) + vTarget * 16); .getV((SpriteShiftEntry.getUnInterpolatedV(entry.getOriginal(), v) / sheetSize) + vTarget * 16);
builder.uv(targetU, targetV); builder.uv(targetU, targetV);
}; };
return this; return this;

View File

@@ -15,15 +15,13 @@ public class SuperByteBufferCache {
public synchronized void registerCompartment(Compartment<?> compartment) { public synchronized void registerCompartment(Compartment<?> compartment) {
caches.put(compartment, CacheBuilder.newBuilder() caches.put(compartment, CacheBuilder.newBuilder()
.<Object, SuperByteBuffer>removalListener(n -> n.getValue().delete()) .build());
.build());
} }
public synchronized void registerCompartment(Compartment<?> compartment, long ticksUntilExpired) { public synchronized void registerCompartment(Compartment<?> compartment, long ticksUntilExpired) {
caches.put(compartment, CacheBuilder.newBuilder() caches.put(compartment, CacheBuilder.newBuilder()
.expireAfterAccess(ticksUntilExpired * 50, TimeUnit.MILLISECONDS) .expireAfterAccess(ticksUntilExpired * 50, TimeUnit.MILLISECONDS)
.<Object, SuperByteBuffer>removalListener(n -> n.getValue().delete()) .build());
.build());
} }
public <T> SuperByteBuffer get(Compartment<T> compartment, T key, Callable<SuperByteBuffer> callable) { public <T> SuperByteBuffer get(Compartment<T> compartment, T key, Callable<SuperByteBuffer> callable) {

View File

@@ -84,7 +84,7 @@ public class SuperRenderTypeBuffer implements MultiBufferSource {
put(map, p_173062_); put(map, p_173062_);
}); });
}); });
private final MultiBufferSource.BufferSource bufferSource = MultiBufferSource.immediateWithBuffers(fixedBuffers, new BufferBuilder(256)); private final BufferSource bufferSource = MultiBufferSource.immediateWithBuffers(fixedBuffers, new BufferBuilder(256));
private static void put(Object2ObjectLinkedOpenHashMap<RenderType, BufferBuilder> map, RenderType type) { private static void put(Object2ObjectLinkedOpenHashMap<RenderType, BufferBuilder> map, RenderType type) {
map.put(type, new BufferBuilder(type.bufferSize())); map.put(type, new BufferBuilder(type.bufferSize()));

View File

@@ -1,23 +1,11 @@
package nl.requios.effortlessbuilding.create.foundation.render; package nl.requios.effortlessbuilding.create.foundation.render;
import java.util.Iterator;
import javax.annotation.Nullable;
import org.joml.Matrix4f;
import org.joml.Vector4f;
import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.Backend;
import com.jozufozu.flywheel.backend.instancing.InstancedRenderRegistry; import com.jozufozu.flywheel.backend.instancing.InstancedRenderRegistry;
import com.jozufozu.flywheel.config.BackendType; import com.jozufozu.flywheel.config.BackendType;
import com.jozufozu.flywheel.core.virtual.VirtualRenderWorld; import com.jozufozu.flywheel.core.virtual.VirtualRenderWorld;
import com.jozufozu.flywheel.util.transform.TransformStack; import com.jozufozu.flywheel.util.transform.TransformStack;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import nl.requios.effortlessbuilding.create.Create;
import nl.requios.effortlessbuilding.create.foundation.utility.AnimationTickHolder;
import nl.requios.effortlessbuilding.create.foundation.utility.RegisteredObjects;
//import nl.requios.effortlessbuilding.create.infrastructure.config.AllConfigs;
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.MultiBufferSource; import net.minecraft.client.renderer.MultiBufferSource;
@@ -26,41 +14,49 @@ import net.minecraft.client.renderer.texture.OverlayTexture;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntity;
import nl.requios.effortlessbuilding.create.Create;
import nl.requios.effortlessbuilding.create.foundation.utility.AnimationTickHolder;
import nl.requios.effortlessbuilding.create.foundation.utility.RegisteredObjects;
import org.joml.Matrix4f;
import org.joml.Vector4f;
public class BlockEntityRenderHelper { import javax.annotation.Nullable;
import java.util.Iterator;
public static void renderBlockEntities(Level world, Iterable<BlockEntity> customRenderBEs, PoseStack ms, public class TileEntityRenderHelper {
public static void renderTileEntities(Level world, Iterable<BlockEntity> customRenderTEs, PoseStack ms,
MultiBufferSource buffer) { MultiBufferSource buffer) {
renderBlockEntities(world, null, customRenderBEs, ms, null, buffer); renderTileEntities(world, null, customRenderTEs, ms, null, buffer);
} }
public static void renderBlockEntities(Level world, Iterable<BlockEntity> customRenderBEs, PoseStack ms, public static void renderTileEntities(Level world, Iterable<BlockEntity> customRenderTEs, PoseStack ms,
MultiBufferSource buffer, float pt) { MultiBufferSource buffer, float pt) {
renderBlockEntities(world, null, customRenderBEs, ms, null, buffer, pt); renderTileEntities(world, null, customRenderTEs, ms, null, buffer, pt);
} }
public static void renderBlockEntities(Level world, @Nullable VirtualRenderWorld renderWorld, public static void renderTileEntities(Level world, @Nullable VirtualRenderWorld renderWorld,
Iterable<BlockEntity> customRenderBEs, PoseStack ms, @Nullable Matrix4f lightTransform, MultiBufferSource buffer) { Iterable<BlockEntity> customRenderTEs, PoseStack ms, @Nullable Matrix4f lightTransform, MultiBufferSource buffer) {
renderBlockEntities(world, renderWorld, customRenderBEs, ms, lightTransform, buffer, renderTileEntities(world, renderWorld, customRenderTEs, ms, lightTransform, buffer,
AnimationTickHolder.getPartialTicks()); AnimationTickHolder.getPartialTicks());
} }
public static void renderBlockEntities(Level world, @Nullable VirtualRenderWorld renderWorld, public static void renderTileEntities(Level world, @Nullable VirtualRenderWorld renderWorld,
Iterable<BlockEntity> customRenderBEs, PoseStack ms, @Nullable Matrix4f lightTransform, MultiBufferSource buffer, Iterable<BlockEntity> customRenderTEs, PoseStack ms, @Nullable Matrix4f lightTransform, MultiBufferSource buffer,
float pt) { float pt) {
Iterator<BlockEntity> iterator = customRenderBEs.iterator(); Iterator<BlockEntity> iterator = customRenderTEs.iterator();
while (iterator.hasNext()) { while (iterator.hasNext()) {
BlockEntity blockEntity = iterator.next(); BlockEntity tileEntity = iterator.next();
if (Backend.getBackendType() == BackendType.INSTANCING && Backend.isFlywheelWorld(renderWorld) && InstancedRenderRegistry.shouldSkipRender(blockEntity)) if (Backend.getBackendType() == BackendType.INSTANCING && Backend.isFlywheelWorld(renderWorld) && InstancedRenderRegistry.shouldSkipRender(tileEntity))
continue; continue;
BlockEntityRenderer<BlockEntity> renderer = Minecraft.getInstance().getBlockEntityRenderDispatcher().getRenderer(blockEntity); BlockEntityRenderer<BlockEntity> renderer = Minecraft.getInstance().getBlockEntityRenderDispatcher().getRenderer(tileEntity);
if (renderer == null) { if (renderer == null) {
iterator.remove(); iterator.remove();
continue; continue;
} }
BlockPos pos = blockEntity.getBlockPos(); BlockPos pos = tileEntity.getBlockPos();
ms.pushPose(); ms.pushPose();
TransformStack.cast(ms) TransformStack.cast(ms)
.translate(pos); .translate(pos);
@@ -70,22 +66,22 @@ public class BlockEntityRenderHelper {
if (renderWorld != null) { if (renderWorld != null) {
// Swap the real world for the render world so that the renderer gets contraption-local information // Swap the real world for the render world so that the renderer gets contraption-local information
blockEntity.setLevel(renderWorld); tileEntity.setLevel(renderWorld);
renderer.render(blockEntity, pt, ms, buffer, worldLight, OverlayTexture.NO_OVERLAY); renderer.render(tileEntity, pt, ms, buffer, worldLight, OverlayTexture.NO_OVERLAY);
blockEntity.setLevel(world); tileEntity.setLevel(world);
} else { } else {
renderer.render(blockEntity, pt, ms, buffer, worldLight, OverlayTexture.NO_OVERLAY); renderer.render(tileEntity, pt, ms, buffer, worldLight, OverlayTexture.NO_OVERLAY);
} }
} catch (Exception e) { } catch (Exception e) {
iterator.remove(); iterator.remove();
String message = "BlockEntity " + RegisteredObjects.getKeyOrThrow(blockEntity.getType()) String message = "BlockEntity " + RegisteredObjects.getKeyOrThrow(tileEntity.getType())
.toString() + " could not be rendered virtually."; .toString() + " could not be rendered virtually.";
// if (AllConfigs.client().explainRenderErrors.get()) // if (AllConfigs.CLIENT.explainRenderErrors.get())
// Create.LOGGER.error(message, e); Create.LOGGER.error(message, e);
// else // else
Create.LOGGER.error(message); // Create.LOGGER.error(message);
} }
ms.popPose(); ms.popPose();

View File

@@ -1,10 +1,5 @@
package nl.requios.effortlessbuilding.create.foundation.utility; package nl.requios.effortlessbuilding.create.foundation.utility;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import javax.annotation.Nullable;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionHand;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
@@ -13,6 +8,10 @@ import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraftforge.event.ForgeEventFactory; import net.minecraftforge.event.ForgeEventFactory;
import javax.annotation.Nullable;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
public abstract class AbstractBlockBreakQueue { public abstract class AbstractBlockBreakQueue {
protected Consumer<BlockPos> makeCallbackFor(Level world, float effectChance, ItemStack toDamage, protected Consumer<BlockPos> makeCallbackFor(Level world, float effectChance, ItemStack toDamage,
@Nullable Player playerEntity, BiConsumer<BlockPos, ItemStack> drop) { @Nullable Player playerEntity, BiConsumer<BlockPos, ItemStack> drop) {

View File

@@ -1,9 +1,6 @@
package nl.requios.effortlessbuilding.create.foundation.utility; package nl.requios.effortlessbuilding.create.foundation.utility;
//import nl.requios.effortlessbuilding.create.foundation.ponder.PonderWorld;
//import nl.requios.effortlessbuilding.create.foundation.ponder.ui.PonderUI;
import nl.requios.effortlessbuilding.create.foundation.utility.worldWrappers.WrappedClientWorld; import nl.requios.effortlessbuilding.create.foundation.utility.worldWrappers.WrappedClientWorld;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.LevelAccessor;
@@ -46,7 +43,7 @@ public class AnimationTickHolder {
public static int getTicks(LevelAccessor world) { public static int getTicks(LevelAccessor world) {
if (world instanceof WrappedClientWorld) if (world instanceof WrappedClientWorld)
return getTicks(((WrappedClientWorld) world).getWrappedWorld()); return getTicks(((WrappedClientWorld) world).getWrappedWorld());
return /*world instanceof PonderWorld ? PonderUI.ponderTicks : */getTicks(); return getTicks();
} }
public static float getRenderTime(LevelAccessor world) { public static float getRenderTime(LevelAccessor world) {
@@ -54,6 +51,6 @@ public class AnimationTickHolder {
} }
public static float getPartialTicks(LevelAccessor world) { public static float getPartialTicks(LevelAccessor world) {
return /*world instanceof PonderWorld ? PonderUI.getPartialTicks() : */getPartialTicks(); return getPartialTicks();
} }
} }

View File

@@ -1,146 +0,0 @@
package nl.requios.effortlessbuilding.create.foundation.utility;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import org.jetbrains.annotations.Nullable;
import nl.requios.effortlessbuilding.create.Create;
import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.registries.IForgeRegistry;
public class AttachedRegistry<K, V> {
private static final List<AttachedRegistry<?, ?>> ALL = new ArrayList<>();
protected final IForgeRegistry<K> objectRegistry;
protected final Map<ResourceLocation, V> idMap = new HashMap<>();
protected final Map<K, V> objectMap = new IdentityHashMap<>();
protected final Map<ResourceLocation, Function<K, V>> deferredRegistrations = new HashMap<>();
protected boolean unwrapped = false;
public AttachedRegistry(IForgeRegistry<K> objectRegistry) {
this.objectRegistry = objectRegistry;
ALL.add(this);
}
public void register(ResourceLocation id, V value) {
if (!unwrapped) {
idMap.put(id, value);
} else {
K object = objectRegistry.getValue(id);
if (object != null) {
objectMap.put(object, value);
} else {
Create.LOGGER.warn("Could not get object for id '" + id + "' in AttachedRegistry after unwrapping!");
}
}
}
public void register(K object, V value) {
if (unwrapped) {
objectMap.put(object, value);
} else {
ResourceLocation id = objectRegistry.getKey(object);
if (id != null) {
idMap.put(id, value);
} else {
Create.LOGGER.warn("Could not get id of object '" + object + "' in AttachedRegistry before unwrapping!");
}
}
}
public void registerDeferred(ResourceLocation id, Function<K, V> func) {
if (!unwrapped) {
deferredRegistrations.put(id, func);
} else {
K object = objectRegistry.getValue(id);
if (object != null) {
objectMap.put(object, func.apply(object));
} else {
Create.LOGGER.warn("Could not get object for id '" + id + "' in AttachedRegistry after unwrapping!");
}
}
}
public void registerDeferred(K object, Function<K, V> func) {
if (unwrapped) {
objectMap.put(object, func.apply(object));
} else {
ResourceLocation id = objectRegistry.getKey(object);
if (id != null) {
deferredRegistrations.put(id, func);
} else {
Create.LOGGER.warn("Could not get id of object '" + object + "' in AttachedRegistry before unwrapping!");
}
}
}
@Nullable
public V get(ResourceLocation id) {
if (!unwrapped) {
return idMap.get(id);
} else {
K object = objectRegistry.getValue(id);
if (object != null) {
return objectMap.get(object);
} else {
Create.LOGGER.warn("Could not get object for id '" + id + "' in AttachedRegistry after unwrapping!");
return null;
}
}
}
@Nullable
public V get(K object) {
if (unwrapped) {
return objectMap.get(object);
} else {
ResourceLocation id = objectRegistry.getKey(object);
if (id != null) {
return idMap.get(id);
} else {
Create.LOGGER.warn("Could not get id of object '" + object + "' in AttachedRegistry before unwrapping!");
return null;
}
}
}
public boolean isUnwrapped() {
return unwrapped;
}
protected void unwrap() {
deferredRegistrations.forEach((id, func) -> {
K object = objectRegistry.getValue(id);
if (object != null) {
objectMap.put(object, func.apply(object));
} else {
Create.LOGGER.warn("Could not get object for id '" + id + "' in AttachedRegistry during unwrapping!");
}
});
idMap.forEach((id, value) -> {
K object = objectRegistry.getValue(id);
if (object != null) {
objectMap.put(object, value);
} else {
Create.LOGGER.warn("Could not get object for id '" + id + "' in AttachedRegistry during unwrapping!");
}
});
deferredRegistrations.clear();
idMap.clear();
unwrapped = true;
}
public static void unwrapAll() {
for (AttachedRegistry<?, ?> registry : ALL) {
registry.unwrap();
}
}
}

View File

@@ -1,14 +1,5 @@
package nl.requios.effortlessbuilding.create.foundation.utility; package nl.requios.effortlessbuilding.create.foundation.utility;
import java.util.function.Consumer;
import javax.annotation.Nullable;
//import nl.requios.effortlessbuilding.create.AllBlocks;
//import nl.requios.effortlessbuilding.create.AllTags.AllBlockTags;
//import nl.requios.effortlessbuilding.create.content.kinetics.base.KineticBlockEntity;
//import nl.requios.effortlessbuilding.create.foundation.blockEntity.IMergeableBE;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.core.SectionPos; import net.minecraft.core.SectionPos;
@@ -47,6 +38,9 @@ import net.minecraftforge.common.IPlantable;
import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.level.BlockEvent; import net.minecraftforge.event.level.BlockEvent;
import javax.annotation.Nullable;
import java.util.function.Consumer;
public class BlockHelper { public class BlockHelper {
public static BlockState setZeroAge(BlockState blockState) { public static BlockState setZeroAge(BlockState blockState) {
@@ -161,7 +155,7 @@ public class BlockHelper {
if (world.random.nextFloat() < effectChance) if (world.random.nextFloat() < effectChance)
world.levelEvent(2001, pos, Block.getId(state)); world.levelEvent(2001, pos, Block.getId(state));
BlockEntity blockEntity = state.hasBlockEntity() ? world.getBlockEntity(pos) : null; BlockEntity tileentity = state.hasBlockEntity() ? world.getBlockEntity(pos) : null;
if (player != null) { if (player != null) {
BlockEvent.BreakEvent event = new BlockEvent.BreakEvent(world, pos, state, player); BlockEvent.BreakEvent event = new BlockEvent.BreakEvent(world, pos, state, player);
@@ -180,7 +174,7 @@ public class BlockHelper {
if (world instanceof ServerLevel && world.getGameRules() if (world instanceof ServerLevel && world.getGameRules()
.getBoolean(GameRules.RULE_DOBLOCKDROPS) && !world.restoringBlockSnapshots .getBoolean(GameRules.RULE_DOBLOCKDROPS) && !world.restoringBlockSnapshots
&& (player == null || !player.isCreative())) { && (player == null || !player.isCreative())) {
for (ItemStack itemStack : Block.getDrops(state, (ServerLevel) world, pos, blockEntity, player, usedTool)) for (ItemStack itemStack : Block.getDrops(state, (ServerLevel) world, pos, tileentity, player, usedTool))
droppedItemCallback.accept(itemStack); droppedItemCallback.accept(itemStack);
// Simulating IceBlock#playerDestroy. Not calling method directly as it would drop item // Simulating IceBlock#playerDestroy. Not calling method directly as it would drop item
@@ -190,8 +184,8 @@ public class BlockHelper {
.ultraWarm()) .ultraWarm())
return false; return false;
BlockState blockstate = world.getBlockState(pos.below()); BlockState belowState = world.getBlockState(pos.below());
if (blockstate.blocksMotion() || blockstate.liquid()) if (belowState.getMaterial().blocksMotion() || belowState.getMaterial().isLiquid())
world.setBlockAndUpdate(pos, Blocks.WATER.defaultBlockState()); world.setBlockAndUpdate(pos, Blocks.WATER.defaultBlockState());
return true; return true;
} }
@@ -219,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(world.registryAccess() chunksection = new LevelChunkSection(chunk.getSectionYFromSectionIndex(idx), world.registryAccess()
.registryOrThrow(Registries.BIOME)); .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()),
@@ -233,24 +227,9 @@ public class BlockHelper {
.getBlock(), target.below()); .getBlock(), target.below());
} }
public static CompoundTag prepareBlockEntityData(BlockState blockState, BlockEntity blockEntity) { public static boolean placeSchematicBlock(Level world, Player player, BlockState state, BlockPos target, ItemStack stack,
CompoundTag data = null;
if (blockEntity == null)
return data;
/*if (AllBlockTags.SAFE_NBT.matches(blockState)) {
data = blockEntity.saveWithFullMetadata();
data = NBTProcessors.process(blockEntity, data, true);
} else */if (blockEntity instanceof IPartialSafeNBT) {
data = new CompoundTag();
((IPartialSafeNBT) blockEntity).writeSafe(data);
data = NBTProcessors.process(blockEntity, data, true);
}
return data;
}
public static void placeSchematicBlock(Level world, BlockState state, BlockPos target, ItemStack stack,
@Nullable CompoundTag data) { @Nullable CompoundTag data) {
BlockEntity existingBlockEntity = world.getBlockEntity(target); BlockEntity existingTile = world.getBlockEntity(target);
// Piston // Piston
if (state.hasProperty(BlockStateProperties.EXTENDED)) if (state.hasProperty(BlockStateProperties.EXTENDED))
@@ -278,42 +257,40 @@ public class BlockHelper {
0.0D, 0.0D, 0.0D); 0.0D, 0.0D, 0.0D);
} }
Block.dropResources(state, world, target); Block.dropResources(state, world, target);
return; return true;
} }
if (state.getBlock() instanceof BaseRailBlock) { if (state.getBlock() instanceof BaseRailBlock) {
placeRailWithoutUpdate(world, state, target); placeRailWithoutUpdate(world, state, target);
} /*else if (AllBlocks.BELT.has(state)) { } else {
world.setBlock(target, state, 2); world.setBlock(target, state, 2); //Changed flag from 18 to 3
} */else {
world.setBlock(target, state, 2); //Changed flag from 18 to 2
} }
if (data != null) { if (data != null) {
// if (existingBlockEntity instanceof IMergeableBE mergeable) { // if (existingTile instanceof IMergeableTE mergeable) {
// BlockEntity loaded = BlockEntity.loadStatic(target, state, data); // BlockEntity loaded = BlockEntity.loadStatic(target, state, data);
// if (existingBlockEntity.getType() // if (existingTile.getType()
// .equals(loaded.getType())) { // .equals(loaded.getType())) {
// mergeable.accept(loaded); // mergeable.accept(loaded);
// return; // return;
// } // }
// } // }
BlockEntity blockEntity = world.getBlockEntity(target); BlockEntity tile = world.getBlockEntity(target);
if (blockEntity != null) { if (tile != null) {
data.putInt("x", target.getX()); data.putInt("x", target.getX());
data.putInt("y", target.getY()); data.putInt("y", target.getY());
data.putInt("z", target.getZ()); data.putInt("z", target.getZ());
// if (blockEntity instanceof KineticBlockEntity) // if (tile instanceof KineticTileEntity)
// ((KineticBlockEntity) blockEntity).warnOfMovement(); // ((KineticTileEntity) tile).warnOfMovement();
blockEntity.load(data); tile.load(data);
} }
} }
try { try {
state.getBlock() state.getBlock().setPlacedBy(world, target, state, null, stack);
.setPlacedBy(world, target, state, null, stack); } catch (Exception ignored) {
} catch (Exception e) {
} }
return true;
} }
public static double getBounceMultiplier(Block block) { public static double getBounceMultiplier(Block block) {

View File

@@ -1,7 +1,6 @@
package nl.requios.effortlessbuilding.create.foundation.utility; package nl.requios.effortlessbuilding.create.foundation.utility;
import nl.requios.effortlessbuilding.create.foundation.utility.animation.LerpedFloat; import nl.requios.effortlessbuilding.create.foundation.utility.animation.LerpedFloat;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;

View File

@@ -1,15 +1,12 @@
package nl.requios.effortlessbuilding.create.foundation.utility; package nl.requios.effortlessbuilding.create.foundation.utility;
import java.util.function.UnaryOperator;
import javax.annotation.Nonnull;
import org.joml.Vector3f;
import com.google.common.hash.Hashing; import com.google.common.hash.Hashing;
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 java.util.function.UnaryOperator;
public class Color { public class Color {
public final static Color TRANSPARENT_BLACK = new Color(0, 0, 0, 0).setImmutable(); public final static Color TRANSPARENT_BLACK = new Color(0, 0, 0, 0).setImmutable();

View File

@@ -1,39 +0,0 @@
package nl.requios.effortlessbuilding.create.foundation.utility;
import java.util.Vector;
import com.mojang.blaze3d.platform.InputConstants;
import nl.requios.effortlessbuilding.create.AllKeys;
import net.minecraft.client.KeyMapping;
import net.minecraft.client.Minecraft;
import net.minecraft.client.Options;
public class ControlsUtil {
private static Vector<KeyMapping> standardControls;
public static Vector<KeyMapping> getControls() {
if (standardControls == null) {
Options gameSettings = Minecraft.getInstance().options;
standardControls = new Vector<>(6);
standardControls.add(gameSettings.keyUp);
standardControls.add(gameSettings.keyDown);
standardControls.add(gameSettings.keyLeft);
standardControls.add(gameSettings.keyRight);
standardControls.add(gameSettings.keyJump);
standardControls.add(gameSettings.keyShift);
}
return standardControls;
}
public static boolean isActuallyPressed(KeyMapping kb) {
InputConstants.Key key = kb.getKey();
if (key.getType() == InputConstants.Type.MOUSE) {
return AllKeys.isMouseButtonDown(key.getValue());
} else {
return AllKeys.isKeyDown(key.getValue());
}
}
}

View File

@@ -1,20 +1,14 @@
package nl.requios.effortlessbuilding.create.foundation.utility; package nl.requios.effortlessbuilding.create.foundation.utility;
import com.google.common.collect.ImmutableList;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.function.BiConsumer; import java.util.function.*;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Stream; import java.util.stream.Stream;
import com.google.common.collect.ImmutableList;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
public class Couple<T> extends Pair<T, T> implements Iterable<T> { public class Couple<T> extends Pair<T, T> implements Iterable<T> {
private static final Couple<Boolean> TRUE_AND_FALSE = Couple.create(true, false); private static final Couple<Boolean> TRUE_AND_FALSE = Couple.create(true, false);

View File

@@ -0,0 +1,101 @@
package nl.requios.effortlessbuilding.create.foundation.utility;
import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.registries.IForgeRegistry;
import nl.requios.effortlessbuilding.create.Create;
import org.jetbrains.annotations.Nullable;
import java.util.*;
public class CreateRegistry<K, V> {
private static final List<CreateRegistry<?, ?>> ALL = new ArrayList<>();
protected final IForgeRegistry<K> objectRegistry;
protected final Map<ResourceLocation, V> locationMap = new HashMap<>();
protected final Map<K, V> objectMap = new IdentityHashMap<>();
protected boolean unwrapped = false;
public CreateRegistry(IForgeRegistry<K> objectRegistry) {
this.objectRegistry = objectRegistry;
ALL.add(this);
}
public void register(ResourceLocation location, V value) {
if (!unwrapped) {
locationMap.put(location, value);
} else {
K object = objectRegistry.getValue(location);
if (object != null) {
objectMap.put(object, value);
} else {
Create.LOGGER.warn("Could not get object for location '" + location + "' in CreateRegistry after unwrapping!");
}
}
}
public void register(K object, V value) {
if (unwrapped) {
objectMap.put(object, value);
} else {
ResourceLocation location = objectRegistry.getKey(object);
if (location != null) {
locationMap.put(location, value);
} else {
Create.LOGGER.warn("Could not get location of object '" + object + "' in CreateRegistry before unwrapping!");
}
}
}
@Nullable
public V get(ResourceLocation location) {
if (!unwrapped) {
return locationMap.get(location);
} else {
K object = objectRegistry.getValue(location);
if (object != null) {
return objectMap.get(object);
} else {
Create.LOGGER.warn("Could not get object for location '" + location + "' in CreateRegistry after unwrapping!");
return null;
}
}
}
@Nullable
public V get(K object) {
if (unwrapped) {
return objectMap.get(object);
} else {
ResourceLocation location = objectRegistry.getKey(object);
if (location != null) {
return locationMap.get(location);
} else {
Create.LOGGER.warn("Could not get location of object '" + object + "' in CreateRegistry before unwrapping!");
return null;
}
}
}
public boolean isUnwrapped() {
return unwrapped;
}
protected void unwrap() {
for (Map.Entry<ResourceLocation, V> entry : locationMap.entrySet()) {
ResourceLocation location = entry.getKey();
K object = objectRegistry.getValue(location);
if (object != null) {
objectMap.put(object, entry.getValue());
} else {
Create.LOGGER.warn("Could not get object for location '" + location + "' in CreateRegistry during unwrapping!");
}
}
unwrapped = true;
}
public static void unwrapAll() {
for (CreateRegistry<?, ?> registry : ALL) {
registry.unwrap();
}
}
}

View File

@@ -1,7 +1,6 @@
package nl.requios.effortlessbuilding.create.foundation.utility; package nl.requios.effortlessbuilding.create.foundation.utility;
import nl.requios.effortlessbuilding.create.Create; import nl.requios.effortlessbuilding.create.Create;
import net.minecraft.ChatFormatting; import net.minecraft.ChatFormatting;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;

View File

@@ -1,13 +1,12 @@
package nl.requios.effortlessbuilding.create.foundation.utility; package nl.requios.effortlessbuilding.create.foundation.utility;
import java.util.Map;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.DyeColor;
import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.ItemLike;
import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Blocks;
import java.util.Map;
public class DyeHelper { public class DyeHelper {
public static ItemLike getWoolOfDye(DyeColor color) { public static ItemLike getWoolOfDye(DyeColor color) {

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