From ca44da71e755dfefda4b8ad8fe44df5516075985 Mon Sep 17 00:00:00 2001 From: Mrbysco Date: Sat, 18 Nov 2023 00:38:56 +0100 Subject: [PATCH] Fresh port to 1.20 Note: I changed `BuildModeCategoryEnum` to actually use the Color class instead of using Vector4f. Same counts for `RadialMenu` --- build.gradle | 11 +- gradle.properties | 14 +- gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 61574 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 28 ++-- gradlew.bat | 15 +- settings.gradle | 4 + .../effortlessbuilding/AllGuiTextures.java | 16 +-- .../requios/effortlessbuilding/AllIcons.java | 25 +--- .../effortlessbuilding/ClientEvents.java | 1 - .../EffortlessBuilding.java | 22 ++- .../buildmode/BuildModeCategoryEnum.java | 14 +- .../buildmode/BuildModes.java | 2 +- .../buildmode/ModeOptions.java | 2 +- .../buildmode/ThreeClicksBuildMode.java | 4 +- .../buildmode/TwoClicksBuildMode.java | 1 - .../buildmode/buildmodes/DiagonalLine.java | 2 +- .../buildmode/buildmodes/Floor.java | 3 +- .../buildmode/buildmodes/Line.java | 9 +- .../buildmode/buildmodes/SlopeFloor.java | 1 - .../buildmode/buildmodes/Wall.java | 3 +- .../buildmodifier/Array.java | 12 -- .../buildmodifier/BaseModifier.java | 1 - .../buildmodifier/Mirror.java | 8 +- .../buildmodifier/RadialMirror.java | 22 +-- .../compatibility/CompatHelper.java | 1 - .../effortlessbuilding/create/AllKeys.java | 5 - .../create/CreateClientTest.java | 5 - .../create/events/ClientEvents.java | 7 +- .../foundation/ModFilePackResources.java | 2 +- .../foundation/gui/AbstractSimiScreen.java | 63 +++++---- .../create/foundation/gui/AllGuiTextures.java | 27 ++-- .../create/foundation/gui/AllIcons.java | 27 ++-- .../foundation/gui/ConfirmationScreen.java | 20 +-- .../gui/CustomLightingSettings.java | 22 +-- .../foundation/gui/RemovedGuiUtils.java | 78 ++++++----- .../create/foundation/gui/UIRenderHelper.java | 113 ++++++++------- .../AbstractSimiContainerScreen.java | 62 +++++---- .../gui/container/ClearContainerPacket.java | 35 ----- .../gui/container/ClearMenuPacket.java | 30 ++++ ...tItemContainer.java => GhostItemMenu.java} | 6 +- .../gui/container/GhostItemSubmitPacket.java | 31 ++--- .../gui/container/IClearableContainer.java | 14 -- .../gui/container/IClearableMenu.java | 11 ++ .../{ContainerBase.java => MenuBase.java} | 8 +- .../foundation/gui/element/BoxElement.java | 19 ++- .../gui/element/CombinedStencilElement.java | 17 ++- .../gui/element/DelegatedStencilElement.java | 16 +-- .../gui/element/GuiGameElement.java | 34 +++-- .../foundation/gui/element/RenderElement.java | 14 +- .../foundation/gui/element/ScreenElement.java | 4 +- .../gui/element/StencilElement.java | 16 ++- .../gui/element/TextStencilElement.java | 13 +- .../gui/widget/AbstractSimiWidget.java | 44 +++--- .../foundation/gui/widget/BoxWidget.java | 28 ++-- .../foundation/gui/widget/ElementWidget.java | 15 +- .../foundation/gui/widget/IconButton.java | 23 ++-- .../foundation/gui/widget/Indicator.java | 12 +- .../create/foundation/gui/widget/Label.java | 17 +-- .../foundation/gui/widget/ScrollInput.java | 39 ++++-- .../gui/widget/SelectionScrollInput.java | 13 +- .../foundation/gui/widget/TooltipArea.java | 10 +- .../create/foundation/item/ItemHelper.java | 2 +- .../item/TagDependentIngredientItem.java | 9 -- .../create/foundation/item/TooltipHelper.java | 49 ++----- .../render/CreateCustomRenderedItemModel.java | 12 -- .../item/render/CustomRenderedItemModel.java | 60 ++------ .../item/render/PartialItemModelRenderer.java | 10 +- .../networking/ISyncPersistentData.java | 26 ++-- .../networking/SimplePacketBase.java | 4 +- .../render/BakedModelRenderHelper.java | 2 - .../foundation/render/CachedBufferer.java | 1 - .../create/foundation/render/RenderTypes.java | 10 +- .../foundation/render/ShadowRenderHelper.java | 1 + .../foundation/render/SuperByteBuffer.java | 99 +++++++------ .../render/SuperByteBufferCache.java | 8 +- .../render/SuperRenderTypeBuffer.java | 5 +- .../render/TileEntityRenderHelper.java | 16 +-- .../foundation/utility/BlockHelper.java | 20 +-- .../create/foundation/utility/Color.java | 2 +- .../foundation/utility/CreateRegistry.java | 1 - .../create/foundation/utility/FontHelper.java | 6 +- .../foundation/utility/LangNumberFormat.java | 1 - .../create/foundation/utility/VecHelper.java | 27 ++-- .../foundation/utility/WorldHelper.java | 4 +- .../utility/ghost/GhostBlockParams.java | 1 - .../foundation/utility/ghost/GhostBlocks.java | 1 - .../foundation/utility/outliner/Outline.java | 2 +- .../worldWrappers/DummyLevelEntityGetter.java | 5 +- .../worldWrappers/WrappedServerWorld.java | 8 +- .../utility/worldWrappers/WrappedWorld.java | 25 +++- .../gui/DiamondRandomizerBagContainer.java | 2 +- .../gui/DiamondRandomizerBagScreen.java | 23 ++-- .../gui/GoldenRandomizerBagContainer.java | 2 +- .../gui/GoldenRandomizerBagScreen.java | 23 ++-- .../gui/RandomizerBagContainer.java | 10 +- .../gui/RandomizerBagScreen.java | 27 ++-- .../gui/buildmode/PlayerSettingsGui.java | 33 +++-- .../gui/buildmode/RadialMenu.java | 130 +++++++++--------- .../gui/buildmodifier/ArrayEntry.java | 25 ++-- .../gui/buildmodifier/BaseModifierEntry.java | 47 +++---- .../gui/buildmodifier/MirrorEntry.java | 49 ++++--- .../gui/buildmodifier/ModifiersScreen.java | 11 +- .../buildmodifier/ModifiersScreenList.java | 44 +++--- .../gui/buildmodifier/RadialMirrorEntry.java | 55 ++++---- .../gui/elements/GuiCheckBoxFixed.java | 41 +++--- .../elements/GuiCollapsibleScrollEntry.java | 9 +- .../gui/elements/GuiIconButton.java | 34 ++--- .../gui/elements/GuiNumberField.java | 51 ++++--- .../gui/elements/GuiScrollPane.java | 32 ++--- .../gui/elements/LabeledScrollInput.java | 17 +-- .../gui/elements/SlotGui.java | 25 ++-- .../item/AbstractRandomizerBagItem.java | 53 ++++--- .../item/ItemHandlerCapabilityProvider.java | 4 +- .../item/PowerLevelItem.java | 7 +- .../item/ReachUpgrade1Item.java | 22 ++- .../item/ReachUpgrade2Item.java | 25 ++-- .../item/ReachUpgrade3Item.java | 25 ++-- .../network/IsQuickReplacingPacket.java | 1 - .../network/ModifierSettingsPacket.java | 7 - .../network/PerformRedoPacket.java | 1 - .../network/PerformUndoPacket.java | 1 - .../network/ServerBreakBlocksPacket.java | 2 - .../render/BlockPreviews.java | 8 +- .../render/ModifierRenderer.java | 2 +- .../render/RenderHandler.java | 26 ++-- .../systems/BuilderChain.java | 12 +- .../systems/BuilderFilter.java | 8 +- .../systems/ItemUsageTracker.java | 3 - .../systems/ServerBlockPlacer.java | 13 +- .../systems/ServerBuildState.java | 1 - .../effortlessbuilding/systems/UndoRedo.java | 5 +- .../utilities/BlockEntry.java | 3 +- .../utilities/BlockPlacerHelper.java | 12 +- .../utilities/BlockSet.java | 1 - .../utilities/ClientBlockUtilities.java | 6 +- .../utilities/PowerLevelCommand.java | 5 +- .../utilities/SurvivalHelper.java | 19 +-- .../resources/META-INF/accesstransformer.cfg | 2 +- src/main/resources/META-INF/mods.toml | 8 +- src/main/resources/pack.mcmeta | 6 +- 141 files changed, 1170 insertions(+), 1349 deletions(-) delete mode 100644 src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/ClearContainerPacket.java create mode 100644 src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/ClearMenuPacket.java rename src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/{GhostItemContainer.java => GhostItemMenu.java} (90%) delete mode 100644 src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/IClearableContainer.java create mode 100644 src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/IClearableMenu.java rename src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/{ContainerBase.java => MenuBase.java} (88%) delete mode 100644 src/main/java/nl/requios/effortlessbuilding/create/foundation/item/render/CreateCustomRenderedItemModel.java diff --git a/build.gradle b/build.gradle index aa2a888..68fb06f 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,6 @@ buildscript { repositories { maven { url = 'https://maven.minecraftforge.net' } mavenCentral() - jcenter() maven { url = 'https://repo.spongepowered.org/repository/maven-public' } maven { url = 'https://maven.parchmentmc.org' } } @@ -30,7 +29,9 @@ ext.buildNumber = System.getenv('BUILD_NUMBER') version = mod_version group = 'nl.requios.effortlessbuilding' -archivesBaseName = "effortlessbuilding-${artifact_minecraft_version}" +base { + archivesName = "effortlessbuilding-${artifact_minecraft_version}" +} java.toolchain.languageVersion = JavaLanguageVersion.of(17) @@ -121,7 +122,7 @@ dependencies { minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" jarJar("com.jozufozu.flywheel:flywheel-forge-${flywheel_minecraft_version}:${flywheel_version}") { - jarJar.ranged(it, '[0.6.9,0.7)') + jarJar.ranged(it, '[0.6.10,0.7)') } if (flywheelInWorkspace) { @@ -155,7 +156,7 @@ jar { "Specification-Title": "effortlessbuilding", "Specification-Vendor": "requios", "Specification-Version": "1", - "Implementation-Title": project.jar.baseName, + "Implementation-Title": project.name, "Implementation-Version": project.jar.archiveVersion, "Implementation-Vendor" :"requios", "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") @@ -184,7 +185,7 @@ tasks.jarJar.finalizedBy('reobfJarJar') publishing { publications { mavenJava(MavenPublication) { - artifactId = archivesBaseName + artifactId = base.archivesName.get() from components.java fg.component(it) diff --git a/gradle.properties b/gradle.properties index cb9093b..5c965dc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,17 +4,17 @@ org.gradle.jvmargs=-Xmx3G org.gradle.daemon=false mod_version = 3.5 -artifact_minecraft_version = 1.19.2 +artifact_minecraft_version = 1.20.1 -minecraft_version = 1.19.2 -forge_version = 43.1.47 +minecraft_version = 1.20.1 +forge_version = 47.1.3 -forgegradle_version = 5.1.53 +forgegradle_version = 6.0.7 mixingradle_version = 0.7-SNAPSHOT mixin_version = 0.8.5 librarian_version = 1.+ cursegradle_version = 1.4.0 -parchment_version = 2022.11.27 +parchment_version = 2023.09.03 -flywheel_minecraft_version = 1.19.2 -flywheel_version = 0.6.10-20 \ No newline at end of file +flywheel_minecraft_version = 1.20.1 +flywheel_version = 0.6.10-7 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..943f0cbfa754578e88a3dae77fce6e3dea56edbf 100644 GIT binary patch delta 36900 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

yHlr~Qj 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 GTKgBj+ffbx diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e750102..37aef8d 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index c53aefa..65dcd68 100644 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -32,10 +32,10 @@ # Busybox and similar reduced shells will NOT work, because this script # requires all of these POSIX shell features: # * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». # # Important for patching: # @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,10 +80,10 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 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. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' @@ -143,12 +143,16 @@ fi if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( 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 ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | 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" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -205,6 +209,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/gradlew.bat b/gradlew.bat index 107acd3..93e3f59 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. 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 @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/settings.gradle b/settings.gradle index 3703f36..5ebcbb5 100644 --- a/settings.gradle +++ b/settings.gradle @@ -3,4 +3,8 @@ pluginManagement { gradlePluginPortal() maven { url = 'https://maven.minecraftforge.net/' } } +} + +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.5.0' } \ No newline at end of file diff --git a/src/main/java/nl/requios/effortlessbuilding/AllGuiTextures.java b/src/main/java/nl/requios/effortlessbuilding/AllGuiTextures.java index 4430fce..2134d4d 100644 --- a/src/main/java/nl/requios/effortlessbuilding/AllGuiTextures.java +++ b/src/main/java/nl/requios/effortlessbuilding/AllGuiTextures.java @@ -1,8 +1,7 @@ package nl.requios.effortlessbuilding; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.gui.GuiComponent; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -50,19 +49,12 @@ public enum AllGuiTextures implements ScreenElement { @OnlyIn(Dist.CLIENT) @Override - public void render(PoseStack ms, int x, int y) { - bind(); - GuiComponent.blit(ms, x, y, 0, startX, startY, width, height, 256, 256); + public void render(GuiGraphics ms, int x, int y) { + ms.blit(location, x, y, 0, startX, startY, width, height, 256, 256); } @OnlyIn(Dist.CLIENT) - public void render(PoseStack ms, int x, int y, GuiComponent component) { - bind(); - component.blit(ms, x, y, startX, startY, width, height); - } - - @OnlyIn(Dist.CLIENT) - public void render(PoseStack ms, int x, int y, Color c) { + public void render(GuiGraphics ms, int x, int y, Color c) { bind(); UIRenderHelper.drawColoredTexture(ms, c, x, y, startX, startY, width, height); } diff --git a/src/main/java/nl/requios/effortlessbuilding/AllIcons.java b/src/main/java/nl/requios/effortlessbuilding/AllIcons.java index fffc87e..e6b6ac6 100644 --- a/src/main/java/nl/requios/effortlessbuilding/AllIcons.java +++ b/src/main/java/nl/requios/effortlessbuilding/AllIcons.java @@ -1,10 +1,8 @@ package nl.requios.effortlessbuilding; -import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.math.Matrix4f; -import net.minecraft.client.gui.GuiComponent; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -16,6 +14,7 @@ import nl.requios.effortlessbuilding.create.Create; import nl.requios.effortlessbuilding.create.foundation.gui.element.DelegatedStencilElement; import nl.requios.effortlessbuilding.create.foundation.gui.element.ScreenElement; import nl.requios.effortlessbuilding.create.foundation.utility.Color; +import org.joml.Matrix4f; public class AllIcons implements ScreenElement { @@ -100,25 +99,13 @@ public class AllIcons implements ScreenElement { private static AllIcons newRow() { return new AllIcons(x = 0, ++y); } - - @OnlyIn(Dist.CLIENT) - public void bind() { - RenderSystem.setShaderTexture(0, ICON_ATLAS); - } - + @OnlyIn(Dist.CLIENT) @Override - public void render(PoseStack matrixStack, int x, int y) { - bind(); - GuiComponent.blit(matrixStack, x, y, 0, iconX, iconY, 16, 16, 256, 256); + public void render(GuiGraphics guiGraphics, int x, int y) { + guiGraphics.blit(ICON_ATLAS, x, y, 0, iconX, iconY, 16, 16, 256, 256); } - - @OnlyIn(Dist.CLIENT) - public void render(PoseStack matrixStack, int x, int y, GuiComponent component) { - bind(); - component.blit(matrixStack, x, y, iconX, iconY, 16, 16); - } - + @OnlyIn(Dist.CLIENT) public void render(PoseStack ms, MultiBufferSource buffer, int color) { VertexConsumer builder = buffer.getBuffer(RenderType.textSeeThrough(ICON_ATLAS)); diff --git a/src/main/java/nl/requios/effortlessbuilding/ClientEvents.java b/src/main/java/nl/requios/effortlessbuilding/ClientEvents.java index 4da00d4..89a9ee5 100644 --- a/src/main/java/nl/requios/effortlessbuilding/ClientEvents.java +++ b/src/main/java/nl/requios/effortlessbuilding/ClientEvents.java @@ -20,7 +20,6 @@ import nl.requios.effortlessbuilding.buildmode.ModeOptions; import nl.requios.effortlessbuilding.gui.buildmode.PlayerSettingsGui; import nl.requios.effortlessbuilding.gui.buildmode.RadialMenu; import nl.requios.effortlessbuilding.gui.buildmodifier.ModifiersScreen; -import nl.requios.effortlessbuilding.systems.PowerLevel; import org.lwjgl.glfw.GLFW; @EventBusSubscriber(Dist.CLIENT) diff --git a/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java b/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java index e5d4992..1ecdd9e 100644 --- a/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java +++ b/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java @@ -3,12 +3,16 @@ package nl.requios.effortlessbuilding; import com.mojang.serialization.Codec; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.flag.FeatureFlags; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.MenuType; +import net.minecraft.world.item.CreativeModeTabs; import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.loot.IGlobalLootModifier; +import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.ModLoadingContext; @@ -36,6 +40,8 @@ import nl.requios.effortlessbuilding.systems.UndoRedo; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.util.List; + @Mod(EffortlessBuilding.MODID) public class EffortlessBuilding { @@ -78,6 +84,7 @@ public class EffortlessBuilding { IEventBus forgeEventBus = MinecraftForge.EVENT_BUS; modEventBus.addListener(EffortlessBuilding::setup); + modEventBus.addListener(EffortlessBuilding::addTabContents); DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> EffortlessBuildingClient.onConstructorClient(modEventBus, forgeEventBus)); @@ -88,9 +95,9 @@ public class EffortlessBuilding { LOOT_MODIFIERS.register(FMLJavaModLoadingContext.get().getModEventBus()); //Register config - ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, CommonConfig.spec); - ModLoadingContext.get().registerConfig(ModConfig.Type.CLIENT, ClientConfig.spec); - ModLoadingContext.get().registerConfig(ModConfig.Type.SERVER, ServerConfig.spec); + modLoadingContext.registerConfig(ModConfig.Type.COMMON, CommonConfig.spec); + modLoadingContext.registerConfig(ModConfig.Type.CLIENT, ClientConfig.spec); + modLoadingContext.registerConfig(ModConfig.Type.SERVER, ServerConfig.spec); } public static void setup(final FMLCommonSetupEvent event) { @@ -99,8 +106,15 @@ public class EffortlessBuilding { CompatHelper.setup(); } + public static void addTabContents(final BuildCreativeModeTabContentsEvent event) { + if (event.getTabKey() == CreativeModeTabs.TOOLS_AND_UTILITIES) { + List stacks = ITEMS.getEntries().stream().map(reg -> new ItemStack(reg.get())).toList(); + event.acceptAll(stacks); + } + } + public static MenuType registerContainer(IContainerFactory fact){ - MenuType type = new MenuType(fact); + MenuType type = new MenuType(fact, FeatureFlags.REGISTRY.allFlags()); return type; } diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModeCategoryEnum.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModeCategoryEnum.java index f94a55f..5215938 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModeCategoryEnum.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModeCategoryEnum.java @@ -1,16 +1,16 @@ package nl.requios.effortlessbuilding.buildmode; -import com.mojang.math.Vector4f; +import nl.requios.effortlessbuilding.create.foundation.utility.Color; public enum BuildModeCategoryEnum { - BASIC(new Vector4f(0f, .5f, 1f, .8f)), - DIAGONAL(new Vector4f(0.56f, 0.28f, 0.87f, .8f)), - CIRCULAR(new Vector4f(0.29f, 0.76f, 0.3f, 1f)), - ROOF(new Vector4f(0.83f, 0.87f, 0.23f, .8f)); + BASIC(new Color(0f, .5f, 1f, .8f)), + DIAGONAL(new Color(0.56f, 0.28f, 0.87f, .8f)), + CIRCULAR(new Color(0.29f, 0.76f, 0.3f, 1f)), + 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; } } diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java index ba4a60f..e232392 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java @@ -109,7 +109,7 @@ public class BuildModes { if (!skipRaytrace) { //collision within a 1 block radius to selected is fine 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 && planeBound.subtract(rayTraceResult.getLocation()).lengthSqr() > 4; } diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/ModeOptions.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/ModeOptions.java index 3f4849c..c322bd5 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/ModeOptions.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/ModeOptions.java @@ -103,7 +103,7 @@ public class ModeOptions { 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_PLAYER_SETTINGS && action != ActionEnum.PREVIOUS_BUILD_MODE && diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/ThreeClicksBuildMode.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/ThreeClicksBuildMode.java index 72c30d4..26ba194 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/ThreeClicksBuildMode.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/ThreeClicksBuildMode.java @@ -164,7 +164,7 @@ public abstract class ThreeClicksBuildMode extends BaseBuildMode { } } } - return new BlockPos(selected.lineBound); + return BlockPos.containing(selected.lineBound); } // protected abstract BlockEntry findSecondPos(List blocks); @@ -197,7 +197,7 @@ public abstract class ThreeClicksBuildMode extends BaseBuildMode { //Make it from a plane into a line, on y axis only private Vec3 toLongestLine(Vec3 boundVec, BlockPos secondPos) { - BlockPos bound = new BlockPos(boundVec); + BlockPos bound = BlockPos.containing(boundVec); return new Vec3(secondPos.getX(), bound.getY(), secondPos.getZ()); } diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/TwoClicksBuildMode.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/TwoClicksBuildMode.java index fca58d1..c30a0c4 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/TwoClicksBuildMode.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/TwoClicksBuildMode.java @@ -6,7 +6,6 @@ import net.minecraft.world.entity.player.Player; import nl.requios.effortlessbuilding.EffortlessBuildingClient; import nl.requios.effortlessbuilding.utilities.BlockEntry; import nl.requios.effortlessbuilding.utilities.BlockSet; -import nl.requios.effortlessbuilding.systems.PowerLevel; import java.util.List; diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/DiagonalLine.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/DiagonalLine.java index 25365f4..8951b4a 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/DiagonalLine.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/DiagonalLine.java @@ -20,7 +20,7 @@ public class DiagonalLine extends ThreeClicksBuildMode { int iterations = (int) Math.ceil(first.distanceTo(second) * sampleMultiplier); for (double t = 0; t <= 1.0; t += 1.0 / iterations) { Vec3 lerp = first.add(second.subtract(first).scale(t)); - BlockPos candidate = new BlockPos(lerp); + BlockPos candidate = BlockPos.containing(lerp); //Only add if not equal to the last in the list if (list.isEmpty() || !list.get(list.size() - 1).equals(candidate)) list.add(candidate); diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Floor.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Floor.java index fe60e46..fef0063 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Floor.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Floor.java @@ -7,7 +7,6 @@ import nl.requios.effortlessbuilding.EffortlessBuildingClient; import nl.requios.effortlessbuilding.buildmode.BuildModes; import nl.requios.effortlessbuilding.buildmode.ModeOptions; import nl.requios.effortlessbuilding.buildmode.TwoClicksBuildMode; -import nl.requios.effortlessbuilding.systems.PowerLevel; import java.util.ArrayList; import java.util.List; @@ -34,7 +33,7 @@ public class Floor extends TwoClicksBuildMode { //Then only 1 can be valid, return that one Criteria selected = criteriaList.get(0); - return new BlockPos(selected.planeBound); + return BlockPos.containing(selected.planeBound); } public static List getFloorBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) { diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Line.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Line.java index 1703bab..b36dd68 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Line.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Line.java @@ -1,12 +1,11 @@ package nl.requios.effortlessbuilding.buildmode.buildmodes; -import net.minecraft.world.entity.player.Player; import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; import nl.requios.effortlessbuilding.EffortlessBuildingClient; import nl.requios.effortlessbuilding.buildmode.BuildModes; import nl.requios.effortlessbuilding.buildmode.TwoClicksBuildMode; -import nl.requios.effortlessbuilding.systems.PowerLevel; import java.util.ArrayList; import java.util.List; @@ -59,7 +58,7 @@ public class Line extends TwoClicksBuildMode { } - return new BlockPos(selected.lineBound); + return BlockPos.containing(selected.lineBound); } public static List getLineBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) { @@ -90,7 +89,7 @@ public class Line extends TwoClicksBuildMode { public static void addZLineBlocks(List list, int z1, int z2, int x, int y) { for (int z = z1; z1 < z2 ? z <= z2 : z >= z2; z += z1 < z2 ? 1 : -1) { - list.add(new BlockPos(x, y, z)); + list.add(BlockPos.containing(x, y, z)); } } @@ -120,7 +119,7 @@ public class Line extends TwoClicksBuildMode { //Make it from a plane into a line //Select the axis that is longest private Vec3 toLongestLine(Vec3 boundVec, BlockPos firstPos) { - BlockPos bound = new BlockPos(boundVec); + BlockPos bound = BlockPos.containing(boundVec); BlockPos firstToSecond = bound.subtract(firstPos); firstToSecond = new BlockPos(Math.abs(firstToSecond.getX()), Math.abs(firstToSecond.getY()), Math.abs(firstToSecond.getZ())); diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/SlopeFloor.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/SlopeFloor.java index 52738c3..5d0a317 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/SlopeFloor.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/SlopeFloor.java @@ -5,7 +5,6 @@ import net.minecraft.core.BlockPos; import nl.requios.effortlessbuilding.EffortlessBuildingClient; import nl.requios.effortlessbuilding.buildmode.ModeOptions; import nl.requios.effortlessbuilding.buildmode.ThreeClicksBuildMode; -import nl.requios.effortlessbuilding.systems.PowerLevel; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Wall.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Wall.java index 075ef67..8152bbe 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Wall.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Wall.java @@ -7,7 +7,6 @@ import nl.requios.effortlessbuilding.EffortlessBuildingClient; import nl.requios.effortlessbuilding.buildmode.BuildModes; import nl.requios.effortlessbuilding.buildmode.ModeOptions; import nl.requios.effortlessbuilding.buildmode.TwoClicksBuildMode; -import nl.requios.effortlessbuilding.systems.PowerLevel; import java.util.ArrayList; import java.util.List; @@ -49,7 +48,7 @@ public class Wall extends TwoClicksBuildMode { } } - return new BlockPos(selected.planeBound); + return BlockPos.containing(selected.planeBound); } public static List getWallBlocks(Player player, int x1, int y1, int z1, int x2, int y2, int z2) { diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/Array.java b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/Array.java index 4048beb..5d77b18 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/Array.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/Array.java @@ -1,24 +1,12 @@ package nl.requios.effortlessbuilding.buildmodifier; 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.item.ItemStack; -import net.minecraft.core.Direction; -import net.minecraft.world.InteractionHand; import net.minecraft.core.BlockPos; -import net.minecraft.world.phys.Vec3; 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.BlockSet; -import java.util.ArrayList; -import java.util.List; - public class Array extends BaseModifier { public Vec3i offset = BlockPos.ZERO; diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/BaseModifier.java b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/BaseModifier.java index a321e38..927c20a 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/BaseModifier.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/BaseModifier.java @@ -1,7 +1,6 @@ package nl.requios.effortlessbuilding.buildmodifier; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.Tag; import net.minecraft.world.entity.player.Player; import nl.requios.effortlessbuilding.utilities.BlockSet; diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/Mirror.java b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/Mirror.java index 305d376..330a8ca 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/Mirror.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/Mirror.java @@ -2,8 +2,6 @@ package nl.requios.effortlessbuilding.buildmodifier; import net.minecraft.client.Minecraft; 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.core.BlockPos; import net.minecraft.world.phys.Vec3; @@ -50,7 +48,7 @@ public class Mirror extends BaseModifier { private void performMirrorX(BlockSet blocks, BlockEntry blockEntry) { //find mirror position double x = position.x + (position.x - blockEntry.blockPos.getX() - 0.5); - BlockPos newBlockPos = new BlockPos(x, blockEntry.blockPos.getY(), blockEntry.blockPos.getZ()); + BlockPos newBlockPos = BlockPos.containing(x, blockEntry.blockPos.getY(), blockEntry.blockPos.getZ()); if (blocks.containsKey(newBlockPos)) return; @@ -66,7 +64,7 @@ public class Mirror extends BaseModifier { private void performMirrorY(BlockSet blocks, BlockEntry blockEntry) { //find mirror position double y = position.y + (position.y - blockEntry.blockPos.getY() - 0.5); - BlockPos newBlockPos = new BlockPos(blockEntry.blockPos.getX(), y, blockEntry.blockPos.getZ()); + BlockPos newBlockPos = BlockPos.containing(blockEntry.blockPos.getX(), y, blockEntry.blockPos.getZ()); if (blocks.containsKey(newBlockPos)) return; @@ -81,7 +79,7 @@ public class Mirror extends BaseModifier { private void performMirrorZ(BlockSet blocks, BlockEntry blockEntry) { //find mirror position double z = position.z + (position.z - blockEntry.blockPos.getZ() - 0.5); - BlockPos newBlockPos = new BlockPos(blockEntry.blockPos.getX(), blockEntry.blockPos.getY(), z); + BlockPos newBlockPos = BlockPos.containing(blockEntry.blockPos.getX(), blockEntry.blockPos.getY(), z); if (blocks.containsKey(newBlockPos)) return; diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/RadialMirror.java b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/RadialMirror.java index e2d4687..11afa09 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/RadialMirror.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/RadialMirror.java @@ -4,23 +4,15 @@ import net.minecraft.client.Minecraft; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.block.state.BlockState; 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.Rotation; import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.items.IItemHandler; import nl.requios.effortlessbuilding.EffortlessBuildingClient; -import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem; import nl.requios.effortlessbuilding.utilities.BlockEntry; import nl.requios.effortlessbuilding.utilities.BlockSet; -import java.util.ArrayList; -import java.util.List; - public class RadialMirror extends BaseModifier { public Vec3 position = new Vec3(0.5, 64.5, 0.5); @@ -77,7 +69,7 @@ public class RadialMirror extends BaseModifier { } Vec3 relNewVec = relStartVec.yRot((float) curAngle); - BlockPos newBlockPos = new BlockPos(position.add(relNewVec)); + BlockPos newBlockPos = BlockPos.containing(position.add(relNewVec)); if (blocks.containsKey(newBlockPos)) continue; @@ -120,11 +112,11 @@ public class RadialMirror extends BaseModifier { BlockState newBlockState = blockState; 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) { - 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) { - newBlockState = blockState.rotate(player.level, startPos, Rotation.CLOCKWISE_90); + newBlockState = blockState.rotate(player.level(), startPos, Rotation.CLOCKWISE_90); } return newBlockState; @@ -135,17 +127,17 @@ public class RadialMirror extends BaseModifier { double angleToCenter = Mth.atan2(relVec.x, relVec.z); //between -PI and 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) { newBlockState = newBlockState.mirror(Mirror.FRONT_BACK); } } 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) { newBlockState = newBlockState.mirror(Mirror.LEFT_RIGHT); } } 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) { newBlockState = newBlockState.mirror(Mirror.LEFT_RIGHT); } diff --git a/src/main/java/nl/requios/effortlessbuilding/compatibility/CompatHelper.java b/src/main/java/nl/requios/effortlessbuilding/compatibility/CompatHelper.java index 8e032d6..fc7c5af 100644 --- a/src/main/java/nl/requios/effortlessbuilding/compatibility/CompatHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/compatibility/CompatHelper.java @@ -7,7 +7,6 @@ import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.IItemHandler; -import net.minecraftforge.items.ItemHandlerHelper; import nl.requios.effortlessbuilding.create.foundation.item.ItemHelper; import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem; diff --git a/src/main/java/nl/requios/effortlessbuilding/create/AllKeys.java b/src/main/java/nl/requios/effortlessbuilding/create/AllKeys.java index 80c6b91..e27b7a5 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/AllKeys.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/AllKeys.java @@ -1,13 +1,8 @@ package nl.requios.effortlessbuilding.create; import com.mojang.blaze3d.platform.InputConstants; -import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.RegisterKeyMappingsEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import org.lwjgl.glfw.GLFW; public class AllKeys { diff --git a/src/main/java/nl/requios/effortlessbuilding/create/CreateClientTest.java b/src/main/java/nl/requios/effortlessbuilding/create/CreateClientTest.java index c19bd0b..aa1d47b 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/CreateClientTest.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/CreateClientTest.java @@ -1,12 +1,7 @@ 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.event.TickEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; -import nl.requios.effortlessbuilding.create.foundation.utility.Color; @Mod.EventBusSubscriber(Dist.CLIENT) public class CreateClientTest { diff --git a/src/main/java/nl/requios/effortlessbuilding/create/events/ClientEvents.java b/src/main/java/nl/requios/effortlessbuilding/create/events/ClientEvents.java index 3b19e20..5ccc8bf 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/events/ClientEvents.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/events/ClientEvents.java @@ -4,11 +4,10 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.RenderLevelLastEvent; +import net.minecraftforge.client.event.RenderLevelStageEvent; import net.minecraftforge.client.event.ViewportEvent; import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.TickEvent.ClientTickEvent; @@ -58,7 +57,9 @@ public class ClientEvents { } @SubscribeEvent - public static void onRenderWorld(RenderLevelLastEvent event) { + public static void onRenderWorld(RenderLevelStageEvent event) { + if(event.getStage() != RenderLevelStageEvent.Stage.AFTER_CUTOUT_BLOCKS) return; + Vec3 cameraPos = Minecraft.getInstance().gameRenderer.getMainCamera() .getPosition(); float pt = AnimationTickHolder.getPartialTicks(); diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/ModFilePackResources.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/ModFilePackResources.java index e3715db..4f0aa47 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/ModFilePackResources.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/ModFilePackResources.java @@ -10,7 +10,7 @@ public class ModFilePackResources extends PathPackResources { protected final String sourcePath; public ModFilePackResources(String name, IModFile modFile, String sourcePath) { - super(name, modFile.findResource(sourcePath)); + super(name, true, modFile.findResource(sourcePath)); this.modFile = modFile; this.sourcePath = sourcePath; } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/AbstractSimiScreen.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/AbstractSimiScreen.java index 26d1b8f..21f870e 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/AbstractSimiScreen.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/AbstractSimiScreen.java @@ -2,17 +2,18 @@ package nl.requios.effortlessbuilding.create.foundation.gui; import com.mojang.blaze3d.platform.InputConstants; 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.Widget; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.components.Renderable; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.narration.NarratableEntry; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import nl.requios.effortlessbuilding.gui.buildmodifier.ModifiersScreenList; +import nl.requios.effortlessbuilding.create.foundation.gui.widget.AbstractSimiWidget; +import nl.requios.effortlessbuilding.create.foundation.utility.Components; import java.util.Collection; import java.util.List; @@ -65,19 +66,26 @@ public abstract class AbstractSimiScreen extends Screen { } } + @Override + public boolean mouseClicked(double pMouseX, double pMouseY, int pButton) { + if (getFocused() != null && !getFocused().isMouseOver(pMouseX, pMouseY)) + setFocused(null); + return super.mouseClicked(pMouseX, pMouseY, pButton); + } + @Override public boolean isPauseScreen() { return false; } @SuppressWarnings("unchecked") - protected void addRenderableWidgets(W... widgets) { + protected void addRenderableWidgets(W... widgets) { for (W widget : widgets) { addRenderableWidget(widget); } } - protected void addRenderableWidgets(Collection widgets) { + protected void addRenderableWidgets(Collection widgets) { for (W widget : widgets) { addRenderableWidget(widget); } @@ -96,17 +104,18 @@ public abstract class AbstractSimiScreen extends Screen { } @Override - public void render(PoseStack ms, int mouseX, int mouseY, float partialTicks) { + public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { partialTicks = minecraft.getFrameTime(); - + PoseStack ms = graphics.pose(); + ms.pushPose(); prepareFrame(); - renderWindowBackground(ms, mouseX, mouseY, partialTicks); - renderWindow(ms, mouseX, mouseY, partialTicks); - super.render(ms, mouseX, mouseY, partialTicks); - renderWindowForeground(ms, mouseX, mouseY, partialTicks); + renderWindowBackground(graphics, mouseX, mouseY, partialTicks); + renderWindow(graphics, mouseX, mouseY, partialTicks); + super.render(graphics, mouseX, mouseY, partialTicks); + renderWindowForeground(graphics, mouseX, mouseY, partialTicks); endFrame(); @@ -116,7 +125,7 @@ public abstract class AbstractSimiScreen extends Screen { @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { boolean keyPressed = super.keyPressed(keyCode, scanCode, modifiers); - if (keyPressed || getFocused() != null) + if (keyPressed || getFocused() instanceof EditBox) return keyPressed; InputConstants.Key mouseKey = InputConstants.getKey(keyCode, scanCode); @@ -130,37 +139,31 @@ public abstract class AbstractSimiScreen extends Screen { protected void prepareFrame() {} - protected void renderWindowBackground(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - renderBackground(ms); + protected void renderWindowBackground(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + renderBackground(graphics); } - protected abstract void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks); + protected abstract void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks); - protected void renderWindowForeground(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - for (Widget widget : renderables) { - if (widget instanceof AbstractSimiWidget simiWidget && simiWidget.isHoveredOrFocused() + protected void renderWindowForeground(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + for (Renderable widget : renderables) { + if (widget instanceof AbstractSimiWidget simiWidget && simiWidget.isMouseOver(mouseX, mouseY) && simiWidget.visible) { List tooltip = simiWidget.getToolTip(); if (tooltip.isEmpty()) continue; - int ttx = simiWidget.lockedTooltipX == -1 ? mouseX : simiWidget.lockedTooltipX + simiWidget.x; - int tty = simiWidget.lockedTooltipY == -1 ? mouseY : simiWidget.lockedTooltipY + simiWidget.y; - renderComponentTooltip(ms, tooltip, ttx, tty); - } - - //Added - if (widget instanceof ModifiersScreenList list) { - list.renderWindowForeground(ms, mouseX, mouseY, partialTicks); + int ttx = simiWidget.lockedTooltipX == -1 ? mouseX : simiWidget.lockedTooltipX + simiWidget.getX(); + int tty = simiWidget.lockedTooltipY == -1 ? mouseY : simiWidget.lockedTooltipY + simiWidget.getY(); + graphics.renderComponentTooltip(font, tooltip, ttx, tty); } } - } protected void endFrame() {} @Deprecated - protected void debugWindowArea(PoseStack matrixStack) { - fill(matrixStack, guiLeft + windowWidth, guiTop + windowHeight, guiLeft, guiTop, 0xD3D3D3D3); + protected void debugWindowArea(GuiGraphics graphics) { + graphics.fill(guiLeft + windowWidth, guiTop + windowHeight, guiLeft, guiTop, 0xD3D3D3D3); } @Override diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/AllGuiTextures.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/AllGuiTextures.java index 85d6b01..4fb5be8 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/AllGuiTextures.java @@ -1,14 +1,13 @@ package nl.requios.effortlessbuilding.create.foundation.gui; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import nl.requios.effortlessbuilding.create.Create; -import nl.requios.effortlessbuilding.create.foundation.gui.element.ScreenElement; -import nl.requios.effortlessbuilding.create.foundation.utility.Color; -import net.minecraft.client.gui.GuiComponent; +import net.minecraft.client.gui.GuiGraphics; 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.foundation.gui.element.ScreenElement; +import nl.requios.effortlessbuilding.create.foundation.utility.Color; public enum AllGuiTextures implements ScreenElement { @@ -29,7 +28,7 @@ public enum AllGuiTextures implements ScreenElement { SPEECH_TOOLTIP_BACKGROUND("widgets", 0, 24, 8, 8), SPEECH_TOOLTIP_COLOR("widgets", 8, 24, 8, 8), - + TRAIN_HUD_SPEED_BG("widgets", 0, 190, 182, 5), TRAIN_HUD_SPEED("widgets", 0, 185, 182, 5), TRAIN_HUD_THROTTLE("widgets", 0, 195, 182, 5), @@ -74,22 +73,14 @@ public enum AllGuiTextures implements ScreenElement { } @OnlyIn(Dist.CLIENT) - @Override - public void render(PoseStack ms, int x, int y) { - bind(); - GuiComponent.blit(ms, x, y, 0, startX, startY, width, height, 256, 256); + public void render(GuiGraphics graphics, int x, int y) { + graphics.blit(location, x, y, startX, startY, width, height); } @OnlyIn(Dist.CLIENT) - public void render(PoseStack ms, int x, int y, GuiComponent component) { + public void render(GuiGraphics graphics, int x, int y, Color c) { bind(); - 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); + UIRenderHelper.drawColoredTexture(graphics, c, x, y, startX, startY, width, height); } } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/AllIcons.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/AllIcons.java index 3b14501..23d80ac 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/AllIcons.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/AllIcons.java @@ -3,12 +3,7 @@ package nl.requios.effortlessbuilding.create.foundation.gui; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.math.Matrix4f; -import nl.requios.effortlessbuilding.create.Create; -import nl.requios.effortlessbuilding.create.foundation.gui.element.DelegatedStencilElement; -import nl.requios.effortlessbuilding.create.foundation.gui.element.ScreenElement; -import nl.requios.effortlessbuilding.create.foundation.utility.Color; -import net.minecraft.client.gui.GuiComponent; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -16,6 +11,11 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; 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 { @@ -81,7 +81,7 @@ public class AllIcons implements ScreenElement { public static final AllIcons I_TOOL_DEPLOY = newRow(), I_SKIP_MISSING = next(), - I_SKIP_TILES = next(), + I_SKIP_BLOCK_ENTITIES = next(), I_DICE = next(), I_TUNNEL_SPLIT = next(), I_TUNNEL_FORCED_SPLIT = next(), @@ -173,20 +173,13 @@ public class AllIcons implements ScreenElement { @OnlyIn(Dist.CLIENT) @Override - public void render(PoseStack matrixStack, int x, int y) { - bind(); - GuiComponent.blit(matrixStack, x, y, 0, iconX, iconY, 16, 16, 256, 256); - } - - @OnlyIn(Dist.CLIENT) - public void render(PoseStack matrixStack, int x, int y, GuiComponent component) { - bind(); - component.blit(matrixStack, x, y, iconX, iconY, 16, 16); + public void render(GuiGraphics graphics, int x, int y) { + graphics.blit(ICON_ATLAS, x, y, 0, iconX, iconY, 16, 16, 256, 256); } @OnlyIn(Dist.CLIENT) public void render(PoseStack ms, MultiBufferSource buffer, int color) { - VertexConsumer builder = buffer.getBuffer(RenderType.textSeeThrough(ICON_ATLAS)); + VertexConsumer builder = buffer.getBuffer(RenderType.text(ICON_ATLAS)); Matrix4f matrix = ms.last().pose(); Color rgb = new Color(color); int light = LightTexture.FULL_BRIGHT; diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/ConfirmationScreen.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/ConfirmationScreen.java index 0175434..bc48353 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/ConfirmationScreen.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/ConfirmationScreen.java @@ -2,13 +2,14 @@ package nl.requios.effortlessbuilding.create.foundation.gui; import com.mojang.blaze3d.systems.RenderSystem; 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.gui.GuiGraphics; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.FormattedText; 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; @@ -173,11 +174,12 @@ public class ConfirmationScreen extends AbstractSimiScreen { } @Override - protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - textBackground.render(ms); + protected void renderWindow(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + textBackground.render(graphics); int offset = font.lineHeight + 1; int lineY = y - offset; + PoseStack ms = graphics.pose(); ms.pushPose(); ms.translate(0, 0, 200); @@ -185,21 +187,21 @@ public class ConfirmationScreen extends AbstractSimiScreen { lineY += offset; if (line == null) continue; - font.draw(ms, line.getString(), x, lineY, 0xeaeaea); + graphics.drawString(font, line.getString(), x, lineY, 0xeaeaea, false); } ms.popPose(); } @Override - protected void renderWindowBackground(PoseStack ms, int mouseX, int mouseY, float partialTicks) { + protected void renderWindowBackground(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { endFrame(); - source.render(ms, 0, 0, 10); // zero mouse coords to prevent further tooltips + source.render(graphics, 0, 0, 10); // zero mouse coords to prevent further tooltips prepareFrame(); - this.fillGradient(ms, 0, 0, this.width, this.height, 0x70101010, 0x80101010); + graphics.fillGradient(0, 0, this.width, this.height, 0x70101010, 0x80101010); } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/CustomLightingSettings.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/CustomLightingSettings.java index 7bd3e7d..5e1bfad 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/CustomLightingSettings.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/CustomLightingSettings.java @@ -1,8 +1,10 @@ package nl.requios.effortlessbuilding.create.foundation.gui; +import org.joml.Matrix4f; +import org.joml.Vector3f; + import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.math.Matrix4f; -import com.mojang.math.Vector3f; +import com.mojang.math.Axis; public class CustomLightingSettings implements ILightingSettings { @@ -19,20 +21,20 @@ public class CustomLightingSettings implements ILightingSettings { } protected void init(float yRot1, float xRot1, float yRot2, float xRot2, boolean doubleLight) { - light1 = Vector3f.ZP.copy(); - light1.transform(Vector3f.YP.rotationDegrees(yRot1)); - light1.transform(Vector3f.XN.rotationDegrees(xRot1)); + light1 = new Vector3f(0, 0, 1); + light1.rotate(Axis.YP.rotationDegrees(yRot1)); + light1.rotate(Axis.XN.rotationDegrees(xRot1)); if (doubleLight) { - light2 = Vector3f.ZP.copy(); - light2.transform(Vector3f.YP.rotationDegrees(yRot2)); - light2.transform(Vector3f.XN.rotationDegrees(xRot2)); + light2 = new Vector3f(0, 0, 1); + light2.rotate(Axis.YP.rotationDegrees(yRot2)); + light2.rotate(Axis.XN.rotationDegrees(xRot2)); } else { - light2 = Vector3f.ZERO; + light2 = new Vector3f(); } lightMatrix = new Matrix4f(); - lightMatrix.setIdentity(); + lightMatrix.identity(); } @Override diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/RemovedGuiUtils.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/RemovedGuiUtils.java index 63da8af..deba030 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/RemovedGuiUtils.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/RemovedGuiUtils.java @@ -1,10 +1,18 @@ package nl.requios.effortlessbuilding.create.foundation.gui; +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Nonnull; + +import org.joml.Matrix4f; + import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.Tesselator; -import com.mojang.math.Matrix4f; + import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.network.chat.FormattedText; @@ -12,13 +20,9 @@ import net.minecraft.network.chat.Style; import net.minecraft.world.item.ItemStack; import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.event.RenderTooltipEvent; -import net.minecraftforge.client.gui.ScreenUtils; +import net.minecraftforge.client.extensions.IForgeGuiGraphics; import net.minecraftforge.common.MinecraftForge; -import javax.annotation.Nonnull; -import java.util.ArrayList; -import java.util.List; - public class RemovedGuiUtils { @Nonnull private static ItemStack cachedTooltipStack = ItemStack.EMPTY; @@ -31,41 +35,43 @@ public class RemovedGuiUtils { cachedTooltipStack = ItemStack.EMPTY; } - public static void drawHoveringText(PoseStack mStack, List textLines, int mouseX, + public static void drawHoveringText(GuiGraphics graphics, List textLines, int mouseX, int mouseY, int screenWidth, int screenHeight, int maxTextWidth, Font font) { - drawHoveringText(mStack, textLines, mouseX, mouseY, screenWidth, screenHeight, maxTextWidth, - ScreenUtils.DEFAULT_BACKGROUND_COLOR, ScreenUtils.DEFAULT_BORDER_COLOR_START, ScreenUtils.DEFAULT_BORDER_COLOR_END, + drawHoveringText(graphics, textLines, mouseX, mouseY, screenWidth, screenHeight, maxTextWidth, + IForgeGuiGraphics.DEFAULT_BACKGROUND_COLOR, IForgeGuiGraphics.DEFAULT_BORDER_COLOR_START, IForgeGuiGraphics.DEFAULT_BORDER_COLOR_END, font); } - public static void drawHoveringText(PoseStack mStack, List textLines, int mouseX, + public static void drawHoveringText(GuiGraphics graphics, List textLines, int mouseX, int mouseY, int screenWidth, int screenHeight, int maxTextWidth, int backgroundColor, int borderColorStart, int borderColorEnd, Font font) { - drawHoveringText(cachedTooltipStack, mStack, textLines, mouseX, mouseY, screenWidth, screenHeight, maxTextWidth, + drawHoveringText(cachedTooltipStack, graphics, textLines, mouseX, mouseY, screenWidth, screenHeight, maxTextWidth, backgroundColor, borderColorStart, borderColorEnd, font); } - public static void drawHoveringText(@Nonnull final ItemStack stack, PoseStack mStack, + public static void drawHoveringText(@Nonnull final ItemStack stack, GuiGraphics graphics, List textLines, int mouseX, int mouseY, int screenWidth, int screenHeight, int maxTextWidth, Font font) { - drawHoveringText(stack, mStack, textLines, mouseX, mouseY, screenWidth, screenHeight, maxTextWidth, - ScreenUtils.DEFAULT_BACKGROUND_COLOR, ScreenUtils.DEFAULT_BORDER_COLOR_START, ScreenUtils.DEFAULT_BORDER_COLOR_END, + drawHoveringText(stack, graphics, textLines, mouseX, mouseY, screenWidth, screenHeight, maxTextWidth, + IForgeGuiGraphics.DEFAULT_BACKGROUND_COLOR, IForgeGuiGraphics.DEFAULT_BORDER_COLOR_START, IForgeGuiGraphics.DEFAULT_BORDER_COLOR_END, font); } - public static void drawHoveringText(@Nonnull final ItemStack stack, PoseStack pStack, + public static void drawHoveringText(@Nonnull final ItemStack stack, GuiGraphics graphics, List textLines, int mouseX, int mouseY, int screenWidth, int screenHeight, int maxTextWidth, int backgroundColor, int borderColorStart, int borderColorEnd, Font font) { if (textLines.isEmpty()) return; List list = ForgeHooksClient.gatherTooltipComponents(stack, textLines, - stack.getTooltipImage(), mouseX, screenWidth, screenHeight, font, font); + stack.getTooltipImage(), mouseX, screenWidth, screenHeight, font); RenderTooltipEvent.Pre event = - new RenderTooltipEvent.Pre(stack, pStack, mouseX, mouseY, screenWidth, screenHeight, font, list); + new RenderTooltipEvent.Pre(stack, graphics, mouseX, mouseY, screenWidth, screenHeight, font, list, null); if (MinecraftForge.EVENT_BUS.post(event)) return; + PoseStack pStack = graphics.pose(); + mouseX = event.getX(); mouseY = event.getY(); screenWidth = event.getScreenWidth(); @@ -144,7 +150,7 @@ public class RemovedGuiUtils { tooltipY = screenHeight - tooltipHeight - 4; 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); MinecraftForge.EVENT_BUS.post(colorEvent); backgroundColor = colorEvent.getBackgroundStart(); @@ -154,24 +160,24 @@ public class RemovedGuiUtils { pStack.pushPose(); Matrix4f mat = pStack.last() .pose(); - ScreenUtils.drawGradientRect(mat, zLevel, tooltipX - 3, tooltipY - 4, tooltipX + tooltipTextWidth + 3, - tooltipY - 3, backgroundColor, backgroundColor); - ScreenUtils.drawGradientRect(mat, zLevel, tooltipX - 3, tooltipY + tooltipHeight + 3, - tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 4, backgroundColor, backgroundColor); - ScreenUtils.drawGradientRect(mat, zLevel, tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3, - tooltipY + tooltipHeight + 3, backgroundColor, backgroundColor); - ScreenUtils.drawGradientRect(mat, zLevel, tooltipX - 4, tooltipY - 3, tooltipX - 3, tooltipY + tooltipHeight + 3, - backgroundColor, backgroundColor); - ScreenUtils.drawGradientRect(mat, zLevel, tooltipX + tooltipTextWidth + 3, tooltipY - 3, - tooltipX + tooltipTextWidth + 4, tooltipY + tooltipHeight + 3, backgroundColor, backgroundColor); - ScreenUtils.drawGradientRect(mat, zLevel, tooltipX - 3, tooltipY - 3 + 1, tooltipX - 3 + 1, - tooltipY + tooltipHeight + 3 - 1, borderColorStart, borderColorEnd); - ScreenUtils.drawGradientRect(mat, zLevel, tooltipX + tooltipTextWidth + 2, tooltipY - 3 + 1, - tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3 - 1, borderColorStart, borderColorEnd); - ScreenUtils.drawGradientRect(mat, zLevel, tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3, - tooltipY - 3 + 1, borderColorStart, borderColorStart); - ScreenUtils.drawGradientRect(mat, zLevel, tooltipX - 3, tooltipY + tooltipHeight + 2, - tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3, borderColorEnd, borderColorEnd); + graphics.fillGradient(tooltipX - 3, tooltipY - 4, tooltipX + tooltipTextWidth + 3, + tooltipY - 3, zLevel, backgroundColor, backgroundColor); + graphics.fillGradient(tooltipX - 3, tooltipY + tooltipHeight + 3, + tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 4, zLevel, backgroundColor, backgroundColor); + graphics.fillGradient(tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3, + tooltipY + tooltipHeight + 3, zLevel, backgroundColor, backgroundColor); + graphics.fillGradient(tooltipX - 4, tooltipY - 3, tooltipX - 3, tooltipY + tooltipHeight + 3, + zLevel, backgroundColor, backgroundColor); + graphics.fillGradient(tooltipX + tooltipTextWidth + 3, tooltipY - 3, + tooltipX + tooltipTextWidth + 4, tooltipY + tooltipHeight + 3, zLevel, backgroundColor, backgroundColor); + graphics.fillGradient(tooltipX - 3, tooltipY - 3 + 1, tooltipX - 3 + 1, + tooltipY + tooltipHeight + 3 - 1, zLevel, borderColorStart, borderColorEnd); + graphics.fillGradient(tooltipX + tooltipTextWidth + 2, tooltipY - 3 + 1, + tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3 - 1, zLevel, borderColorStart, borderColorEnd); + graphics.fillGradient(tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3, + tooltipY - 3 + 1, zLevel, borderColorStart, borderColorStart); + graphics.fillGradient(tooltipX - 3, tooltipY + tooltipHeight + 2, + tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3, zLevel, borderColorEnd, borderColorEnd); MultiBufferSource.BufferSource renderType = MultiBufferSource.immediate(Tesselator.getInstance() .getBuilder()); diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/UIRenderHelper.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/UIRenderHelper.java index 773b680..091d5c4 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/UIRenderHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/UIRenderHelper.java @@ -5,19 +5,21 @@ import com.mojang.blaze3d.platform.GlConst; import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.*; -import com.mojang.math.Matrix4f; -import com.mojang.math.Vector3f; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; +import com.mojang.math.Axis; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.GameRenderer; import nl.requios.effortlessbuilding.create.foundation.utility.Color; import nl.requios.effortlessbuilding.create.foundation.utility.Couple; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.GameRenderer; -import net.minecraftforge.client.gui.ScreenUtils; +import org.joml.Matrix4f; import org.lwjgl.opengl.GL20; import org.lwjgl.opengl.GL30; -import javax.annotation.Nonnull; - public class UIRenderHelper { /** @@ -53,14 +55,14 @@ public class UIRenderHelper { GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, dst.frameBufferId); } - public static void streak(PoseStack ms, float angle, int x, int y, int breadth, int length) { - streak(ms, angle, x, y, breadth, length, Theme.i(Theme.Key.STREAK)); + public static void streak(GuiGraphics graphics, float angle, int x, int y, int breadth, int length) { + streak(graphics, angle, x, y, breadth, length, Theme.i(Theme.Key.STREAK)); } // angle in degrees; 0° -> fading to the right // x and y specify the middle point of the starting edge // breadth is the total width of the streak - public static void streak(PoseStack ms, float angle, int x, int y, int breadth, int length, int color) { + public static void streak(GuiGraphics graphics, float angle, int x, int y, int breadth, int length, int color) { int a1 = 0xa0 << 24; int a2 = 0x80 << 24; int a3 = 0x10 << 24; @@ -72,59 +74,60 @@ public class UIRenderHelper { int c3 = a3 | color; int c4 = a4 | color; + PoseStack ms = graphics.pose(); ms.pushPose(); ms.translate(x, y, 0); - ms.mulPose(Vector3f.ZP.rotationDegrees(angle - 90)); + ms.mulPose(Axis.ZP.rotationDegrees(angle - 90)); - streak(ms, breadth / 2, length, c1, c2, c3, c4); + streak(graphics, breadth / 2, length, c1, c2, c3, c4); ms.popPose(); } - public static void streak(PoseStack ms, float angle, int x, int y, int breadth, int length, Color c) { + public static void streak(GuiGraphics graphics, float angle, int x, int y, int breadth, int length, Color c) { Color color = c.copy().setImmutable(); int c1 = color.scaleAlpha(0.625f).getRGB(); int c2 = color.scaleAlpha(0.5f).getRGB(); int c3 = color.scaleAlpha(0.0625f).getRGB(); int c4 = color.scaleAlpha(0f).getRGB(); + PoseStack ms = graphics.pose(); ms.pushPose(); ms.translate(x, y, 0); - ms.mulPose(Vector3f.ZP.rotationDegrees(angle - 90)); + ms.mulPose(Axis.ZP.rotationDegrees(angle - 90)); - streak(ms, breadth / 2, length, c1, c2, c3, c4); + streak(graphics, breadth / 2, length, c1, c2, c3, c4); ms.popPose(); } - private static void streak(PoseStack ms, int width, int height, int c1, int c2, int c3, int c4) { + private static void streak(GuiGraphics graphics, int width, int height, int c1, int c2, int c3, int c4) { double split1 = .5; double split2 = .75; - Matrix4f model = ms.last().pose(); - ScreenUtils.drawGradientRect(model, 0, -width, 0, width, (int) (split1 * height), c1, c2); - ScreenUtils.drawGradientRect(model, 0, -width, (int) (split1 * height), width, (int) (split2 * height), c2, c3); - ScreenUtils.drawGradientRect(model, 0, -width, (int) (split2 * height), width, height, c3, c4); + graphics.fillGradient(-width, 0, width, (int) (split1 * height), 0, c1, c2); + graphics.fillGradient(-width, (int) (split1 * height), width, (int) (split2 * height), 0, c2, c3); + graphics.fillGradient(-width, (int) (split2 * height), width, height, 0, c3, c4); } /** - * @see #angledGradient(MatrixStack, float, int, int, int, int, int, Color, Color) + * @see #angledGradient(GuiGraphics, float, int, int, int, int, int, Color, Color) */ - public static void angledGradient(@Nonnull PoseStack ms, float angle, int x, int y, int breadth, int length, Couple c) { - angledGradient(ms, angle, x, y, 0, breadth, length, c); + public static void angledGradient(GuiGraphics graphics, float angle, int x, int y, int breadth, int length, Couple c) { + angledGradient(graphics, angle, x, y, 0, breadth, length, c); } /** - * @see #angledGradient(MatrixStack, float, int, int, int, int, int, Color, Color) + * @see #angledGradient(GuiGraphics, float, int, int, int, int, int, Color, Color) */ - public static void angledGradient(@Nonnull PoseStack ms, float angle, int x, int y, int z, int breadth, int length, Couple c) { - angledGradient(ms, angle, x, y, z, breadth, length, c.getFirst(), c.getSecond()); + public static void angledGradient(GuiGraphics graphics, float angle, int x, int y, int z, int breadth, int length, Couple c) { + angledGradient(graphics, angle, x, y, z, breadth, length, c.getFirst(), c.getSecond()); } /** - * @see #angledGradient(MatrixStack, float, int, int, int, int, int, Color, Color) + * @see #angledGradient(GuiGraphics, float, int, int, int, int, int, Color, Color) */ - public static void angledGradient(@Nonnull PoseStack ms, float angle, int x, int y, int breadth, int length, Color color1, Color color2) { - angledGradient(ms, angle, x, y, 0, breadth, length, color1, color2); + public static void angledGradient(GuiGraphics graphics, float angle, int x, int y, int breadth, int length, Color color1, Color color2) { + angledGradient(graphics, angle, x, y, 0, breadth, length, color1, color2); } /** @@ -135,31 +138,32 @@ public class UIRenderHelper { * @param color2 the color at the ending edge * @param breadth the total width of the gradient */ - public static void angledGradient(@Nonnull PoseStack ms, float angle, int x, int y, int z, int breadth, int length, Color color1, Color color2) { + public static void angledGradient(GuiGraphics graphics, float angle, int x, int y, int z, int breadth, int length, Color color1, Color color2) { + PoseStack ms = graphics.pose(); ms.pushPose(); ms.translate(x, y, z); - ms.mulPose(Vector3f.ZP.rotationDegrees(angle - 90)); + ms.mulPose(Axis.ZP.rotationDegrees(angle - 90)); - Matrix4f model = ms.last().pose(); int w = breadth / 2; - ScreenUtils.drawGradientRect(model, 0, -w, 0, w, length, color1.getRGB(), color2.getRGB()); + graphics.fillGradient(-w, 0, w, length, 0, color1.getRGB(), color2.getRGB()); ms.popPose(); } - public static void breadcrumbArrow(PoseStack matrixStack, int x, int y, int z, int width, int height, int indent, Couple colors) {breadcrumbArrow(matrixStack, x, y, z, width, height, indent, colors.getFirst(), colors.getSecond());} + public static void breadcrumbArrow(GuiGraphics graphics, int x, int y, int z, int width, int height, int indent, Couple colors) {breadcrumbArrow(graphics, x, y, z, width, height, indent, colors.getFirst(), colors.getSecond());} // draws a wide chevron-style breadcrumb arrow pointing left - public static void breadcrumbArrow(PoseStack matrixStack, int x, int y, int z, int width, int height, int indent, Color startColor, Color endColor) { + public static void breadcrumbArrow(GuiGraphics graphics, int x, int y, int z, int width, int height, int indent, Color startColor, Color endColor) { + PoseStack matrixStack = graphics.pose(); matrixStack.pushPose(); matrixStack.translate(x - indent, y, z); - breadcrumbArrow(matrixStack, width, height, indent, startColor, endColor); + breadcrumbArrow(graphics, width, height, indent, startColor, endColor); matrixStack.popPose(); } - private static void breadcrumbArrow(PoseStack ms, int width, int height, int indent, Color c1, Color c2) { + private static void breadcrumbArrow(GuiGraphics graphics, int width, int height, int indent, Color c1, Color c2) { /* * 0,0 x1,y1 ********************* x4,y4 ***** x7,y7 @@ -189,7 +193,7 @@ public class UIRenderHelper { Color fc3 = Color.mixColors(c1, c2, (indent + width) / (width + 2f * indent)); Color fc4 = Color.mixColors(c1, c2, 1); - RenderSystem.disableTexture(); +// RenderSystem.disableTexture(); RenderSystem.enableBlend(); RenderSystem.disableCull(); RenderSystem.defaultBlendFunc(); @@ -197,7 +201,7 @@ public class UIRenderHelper { Tesselator tessellator = Tesselator.getInstance(); BufferBuilder bufferbuilder = tessellator.getBuilder(); - Matrix4f model = ms.last().pose(); + Matrix4f model = graphics.pose().last().pose(); bufferbuilder.begin(VertexFormat.Mode.TRIANGLES, DefaultVertexFormat.POSITION_COLOR); bufferbuilder.vertex(model, x0, y0, 0).color(fc1.getRed(), fc1.getGreen(), fc1.getBlue(), fc1.getAlpha()).endVertex(); @@ -227,27 +231,34 @@ public class UIRenderHelper { tessellator.end(); RenderSystem.enableCull(); RenderSystem.disableBlend(); - RenderSystem.enableTexture(); +// RenderSystem.enableTexture(); } //just like AbstractGui#drawTexture, but with a color at every vertex - public static void drawColoredTexture(PoseStack ms, Color c, int x, int y, int tex_left, int tex_top, int width, int height) { - 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 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); } - 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(ms, c, x, x + width, y, y + height, z, width, height, tex_left, tex_top, sheet_width, sheet_height); + public static void drawColoredTexture(GuiGraphics graphics, Color c, int x, int y, int z, float tex_left, float tex_top, int width, int height, int sheet_width, int sheet_height) { + drawColoredTexture(graphics, c, x, x + width, y, y + height, z, width, height, tex_left, tex_top, sheet_width, sheet_height); } - public static void drawStretched(PoseStack ms, int left, int top, int w, int h, int z, AllGuiTextures tex) { + public static void drawStretched(GuiGraphics graphics, int left, int top, int w, int h, int z, AllGuiTextures tex) { tex.bind(); - drawTexturedQuad(ms.last() + drawTexturedQuad(graphics.pose().last() .pose(), Color.WHITE, left, left + w, top, top + h, z, tex.startX / 256f, (tex.startX + tex.width) / 256f, tex.startY / 256f, (tex.startY + tex.height) / 256f); } - private static void drawColoredTexture(PoseStack ms, Color c, int left, int right, int top, int bot, int z, int tex_width, int tex_height, float tex_left, float tex_top, int sheet_width, int sheet_height) { - 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); + public static void drawCropped(GuiGraphics graphics, int left, int top, int w, int h, int z, AllGuiTextures tex) { + tex.bind(); + drawTexturedQuad(graphics.pose().last() + .pose(), Color.WHITE, left, left + w, top, top + h, z, tex.startX / 256f, (tex.startX + w) / 256f, + tex.startY / 256f, (tex.startY + h) / 256f); + } + + private static void drawColoredTexture(GuiGraphics graphics, Color c, int left, int right, int top, int bot, int z, int tex_width, int tex_height, float tex_left, float tex_top, int sheet_width, int sheet_height) { + drawTexturedQuad(graphics.pose().last().pose(), c, left, right, top, bot, z, (tex_left + 0.0F) / (float) sheet_width, (tex_left + (float) tex_width) / (float) sheet_width, (tex_top + 0.0F) / (float) sheet_height, (tex_top + (float) tex_height) / (float) sheet_height); } private static void drawTexturedQuad(Matrix4f m, Color c, int left, int right, int top, int bot, int z, float u1, float u2, float v1, float v2) { @@ -266,7 +277,7 @@ public class UIRenderHelper { } public static void flipForGuiRender(PoseStack poseStack) { - poseStack.mulPoseMatrix(Matrix4f.createScaleMatrix(1, -1, 1)); + poseStack.mulPoseMatrix(new Matrix4f().scaling(1, -1, 1)); } public static class CustomRenderTarget extends RenderTarget { @@ -291,7 +302,7 @@ public class UIRenderHelper { float tx = (float) viewWidth / (float) width; float ty = (float) viewHeight / (float) height; - RenderSystem.enableTexture(); +// RenderSystem.enableTexture(); RenderSystem.enableDepthTest(); RenderSystem.setShader(() -> Minecraft.getInstance().gameRenderer.blitShader); RenderSystem.getShader().setSampler("DiffuseSampler", colorTextureId); diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/AbstractSimiContainerScreen.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/AbstractSimiContainerScreen.java index da48a96..69eaebe 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/AbstractSimiContainerScreen.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/AbstractSimiContainerScreen.java @@ -1,12 +1,10 @@ package nl.requios.effortlessbuilding.create.foundation.gui.container; import com.mojang.blaze3d.platform.InputConstants; -import com.mojang.blaze3d.vertex.PoseStack; -import nl.requios.effortlessbuilding.create.foundation.gui.AllGuiTextures; -import nl.requios.effortlessbuilding.create.foundation.gui.TickableGuiEventListener; -import nl.requios.effortlessbuilding.create.foundation.gui.widget.AbstractSimiWidget; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.AbstractWidget; -import net.minecraft.client.gui.components.Widget; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.components.Renderable; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.narration.NarratableEntry; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; @@ -17,6 +15,9 @@ import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import nl.requios.effortlessbuilding.create.foundation.gui.AllGuiTextures; +import nl.requios.effortlessbuilding.create.foundation.gui.TickableGuiEventListener; +import nl.requios.effortlessbuilding.create.foundation.gui.widget.AbstractSimiWidget; import javax.annotation.ParametersAreNonnullByDefault; import java.util.Collection; @@ -66,13 +67,13 @@ public abstract class AbstractSimiContainerScreen void addRenderableWidgets(W... widgets) { + protected void addRenderableWidgets(W... widgets) { for (W widget : widgets) { addRenderableWidget(widget); } } - protected void addRenderableWidgets(Collection widgets) { + protected void addRenderableWidgets(Collection widgets) { for (W widget : widgets) { addRenderableWidget(widget); } @@ -91,34 +92,34 @@ public abstract class AbstractSimiContainerScreen tooltip = simiWidget.getToolTip(); if (tooltip.isEmpty()) continue; - int ttx = simiWidget.lockedTooltipX == -1 ? mouseX : simiWidget.lockedTooltipX + simiWidget.x; - int tty = simiWidget.lockedTooltipY == -1 ? mouseY : simiWidget.lockedTooltipY + simiWidget.y; - renderComponentTooltip(ms, tooltip, ttx, tty); + int ttx = simiWidget.lockedTooltipX == -1 ? mouseX : simiWidget.lockedTooltipX + simiWidget.getX(); + int tty = simiWidget.lockedTooltipY == -1 ? mouseY : simiWidget.lockedTooltipY + simiWidget.getY(); + graphics.renderComponentTooltip(font, tooltip, ttx, tty); } } } @@ -127,19 +128,26 @@ public abstract class AbstractSimiContainerScreen context) { - context.get() - .enqueueWork(() -> { - ServerPlayer player = context.get() - .getSender(); - if (player == null) - return; - if (!(player.containerMenu instanceof IClearableContainer)) - return; - ((IClearableContainer) player.containerMenu).clearContents(); - }); - context.get() - .setPacketHandled(true); - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/ClearMenuPacket.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/ClearMenuPacket.java new file mode 100644 index 0000000..87585d9 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/ClearMenuPacket.java @@ -0,0 +1,30 @@ +package nl.requios.effortlessbuilding.create.foundation.gui.container; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.level.ServerPlayer; +import net.minecraftforge.network.NetworkEvent.Context; +import nl.requios.effortlessbuilding.create.foundation.networking.SimplePacketBase; + +public class ClearMenuPacket extends SimplePacketBase { + + public ClearMenuPacket() {} + + public ClearMenuPacket(FriendlyByteBuf buffer) {} + + @Override + public void write(FriendlyByteBuf buffer) {} + + @Override + public boolean handle(Context context) { + context.enqueueWork(() -> { + ServerPlayer player = context.getSender(); + if (player == null) + return; + if (!(player.containerMenu instanceof IClearableMenu)) + return; + ((IClearableMenu) player.containerMenu).clearContents(); + }); + return true; + } + +} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/GhostItemContainer.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/GhostItemMenu.java similarity index 90% rename from src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/GhostItemContainer.java rename to src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/GhostItemMenu.java index 8e55be9..b2a06b8 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/GhostItemContainer.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/GhostItemMenu.java @@ -10,15 +10,15 @@ import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.ItemStackHandler; -public abstract class GhostItemContainer extends ContainerBase implements IClearableContainer { +public abstract class GhostItemMenu extends MenuBase implements IClearableMenu { public ItemStackHandler ghostInventory; - protected GhostItemContainer(MenuType type, int id, Inventory inv, FriendlyByteBuf extraData) { + protected GhostItemMenu(MenuType type, int id, Inventory inv, FriendlyByteBuf extraData) { super(type, id, inv, extraData); } - protected GhostItemContainer(MenuType type, int id, Inventory inv, T contentHolder) { + protected GhostItemMenu(MenuType type, int id, Inventory inv, T contentHolder) { super(type, id, inv, contentHolder); } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/GhostItemSubmitPacket.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/GhostItemSubmitPacket.java index 001cab0..b212f55 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/GhostItemSubmitPacket.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/GhostItemSubmitPacket.java @@ -1,12 +1,10 @@ package nl.requios.effortlessbuilding.create.foundation.gui.container; -import nl.requios.effortlessbuilding.create.foundation.networking.SimplePacketBase; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; import net.minecraftforge.network.NetworkEvent.Context; - -import java.util.function.Supplier; +import nl.requios.effortlessbuilding.create.foundation.networking.SimplePacketBase; public class GhostItemSubmitPacket extends SimplePacketBase { @@ -30,23 +28,18 @@ public class GhostItemSubmitPacket extends SimplePacketBase { } @Override - public void handle(Supplier context) { - context.get() - .enqueueWork(() -> { - ServerPlayer player = context.get() - .getSender(); - if (player == null) - return; + public boolean handle(Context context) { + context.enqueueWork(() -> { + ServerPlayer player = context.getSender(); + if (player == null) + return; - if (player.containerMenu instanceof GhostItemContainer) { - GhostItemContainer c = (GhostItemContainer) player.containerMenu; - c.ghostInventory.setStackInSlot(slot, item); - c.getSlot(36 + slot).setChanged(); - } - - }); - context.get() - .setPacketHandled(true); + if (player.containerMenu instanceof GhostItemMenu menu) { + menu.ghostInventory.setStackInSlot(slot, item); + menu.getSlot(36 + slot).setChanged(); + } + }); + return true; } } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/IClearableContainer.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/IClearableContainer.java deleted file mode 100644 index 101d505..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/IClearableContainer.java +++ /dev/null @@ -1,14 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.gui.container; - -//import nl.requios.effortlessbuilding.create.foundation.networking.AllPackets; - -public interface IClearableContainer { - - default void sendClearPacket() { -// AllPackets.channel.sendToServer(new ClearContainerPacket()); - } - - @Deprecated //warning: does not work - public void clearContents(); - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/IClearableMenu.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/IClearableMenu.java new file mode 100644 index 0000000..7ac69bc --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/IClearableMenu.java @@ -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(); + +} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/ContainerBase.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/MenuBase.java similarity index 88% rename from src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/ContainerBase.java rename to src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/MenuBase.java index 7ebd776..ef91980 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/ContainerBase.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/MenuBase.java @@ -1,6 +1,5 @@ package nl.requios.effortlessbuilding.create.foundation.gui.container; -import nl.requios.effortlessbuilding.create.foundation.utility.IInteractionChecker; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; @@ -9,19 +8,20 @@ import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.Slot; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import nl.requios.effortlessbuilding.create.foundation.utility.IInteractionChecker; -public abstract class ContainerBase extends AbstractContainerMenu { +public abstract class MenuBase extends AbstractContainerMenu { public Player player; public Inventory playerInventory; public T contentHolder; - protected ContainerBase(MenuType type, int id, Inventory inv, FriendlyByteBuf extraData) { + protected MenuBase(MenuType type, int id, Inventory inv, FriendlyByteBuf extraData) { super(type, id); init(inv, createOnClient(extraData)); } - protected ContainerBase(MenuType type, int id, Inventory inv, T contentHolder) { + protected MenuBase(MenuType type, int id, Inventory inv, T contentHolder) { super(type, id); init(inv, contentHolder); } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/BoxElement.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/BoxElement.java index e8af30a..93aac3d 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/BoxElement.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/BoxElement.java @@ -1,11 +1,16 @@ package nl.requios.effortlessbuilding.create.foundation.gui.element; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.*; -import com.mojang.math.Matrix4f; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.GameRenderer; import nl.requios.effortlessbuilding.create.foundation.utility.Color; import nl.requios.effortlessbuilding.create.foundation.utility.Couple; -import net.minecraft.client.renderer.GameRenderer; +import org.joml.Matrix4f; public class BoxElement extends RenderElement { @@ -60,8 +65,8 @@ public class BoxElement extends RenderElement { } @Override - public void render(PoseStack ms) { - renderBox(ms); + public void render(GuiGraphics graphics) { + renderBox(graphics.pose()); } //total box width = 1 * 2 (outer border) + 1 * 2 (inner color border) + 2 * borderOffset + width @@ -83,7 +88,7 @@ public class BoxElement extends RenderElement { * |_____________| * * */ - RenderSystem.disableTexture(); +// RenderSystem.disableTexture(); RenderSystem.enableBlend(); RenderSystem.defaultBlendFunc(); RenderSystem.setShader(GameRenderer::getPositionColorShader); @@ -148,6 +153,6 @@ public class BoxElement extends RenderElement { tessellator.end(); RenderSystem.disableBlend(); - RenderSystem.enableTexture(); +// RenderSystem.enableTexture(); } } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/CombinedStencilElement.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/CombinedStencilElement.java index 3f5183c..57315ce 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/CombinedStencilElement.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/CombinedStencilElement.java @@ -1,8 +1,10 @@ package nl.requios.effortlessbuilding.create.foundation.gui.element; +import javax.annotation.Nonnull; + import com.mojang.blaze3d.vertex.PoseStack; -import javax.annotation.Nonnull; +import net.minecraft.client.gui.GuiGraphics; public class CombinedStencilElement extends StencilElement { @@ -43,26 +45,27 @@ public class CombinedStencilElement extends StencilElement { } @Override - protected void renderStencil(PoseStack ms) { + protected void renderStencil(GuiGraphics graphics) { + PoseStack ms = graphics.pose(); ms.pushPose(); element1.transform(ms); element1.withBounds(width, height); - element1.renderStencil(ms); + element1.renderStencil(graphics); ms.popPose(); ms.pushPose(); element2.transform(ms); element2.withBounds(width, height); - element2.renderStencil(ms); + element2.renderStencil(graphics); ms.popPose(); } @Override - protected void renderElement(PoseStack ms) { + protected void renderElement(GuiGraphics graphics) { if (mode.rendersFirst()) - element1.withBounds(width, height).renderElement(ms); + element1.withBounds(width, height).renderElement(graphics); if (mode.rendersSecond()) - element2.withBounds(width, height).renderElement(ms); + element2.withBounds(width, height).renderElement(graphics); } public enum ElementMode { diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/DelegatedStencilElement.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/DelegatedStencilElement.java index ba17d24..2fecfa3 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/DelegatedStencilElement.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/DelegatedStencilElement.java @@ -1,13 +1,13 @@ package nl.requios.effortlessbuilding.create.foundation.gui.element; -import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.GuiGraphics; import nl.requios.effortlessbuilding.create.foundation.gui.UIRenderHelper; import nl.requios.effortlessbuilding.create.foundation.utility.Color; public class DelegatedStencilElement extends StencilElement { - protected static final ElementRenderer EMPTY_RENDERER = (ms, width, height, alpha) -> {}; - protected static final ElementRenderer DEFAULT_ELEMENT = (ms, width, height, alpha) -> UIRenderHelper.angledGradient(ms, 0, -3, 5, height+4, width+6, new Color(0xff_10dd10).scaleAlpha(alpha), new Color(0xff_1010dd).scaleAlpha(alpha)); + protected static final ElementRenderer EMPTY_RENDERER = (graphics, width, height, alpha) -> {}; + protected static final ElementRenderer DEFAULT_ELEMENT = (graphics, width, height, alpha) -> UIRenderHelper.angledGradient(graphics, 0, -3, 5, height+4, width+6, new Color(0xff_10dd10).scaleAlpha(alpha), new Color(0xff_1010dd).scaleAlpha(alpha)); protected ElementRenderer stencil; protected ElementRenderer element; @@ -35,18 +35,18 @@ public class DelegatedStencilElement extends StencilElement { } @Override - protected void renderStencil(PoseStack ms) { - stencil.render(ms, width, height, 1); + protected void renderStencil(GuiGraphics graphics) { + stencil.render(graphics, width, height, 1); } @Override - protected void renderElement(PoseStack ms) { - element.render(ms, width, height, alpha); + protected void renderElement(GuiGraphics graphics) { + element.render(graphics, width, height, alpha); } @FunctionalInterface public interface ElementRenderer { - void render(PoseStack ms, int width, int height, float alpha); + void render(GuiGraphics graphics, int width, int height, float alpha); } } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/GuiGameElement.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/GuiGameElement.java index d7d0fdb..60aa3c3 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/GuiGameElement.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/GuiGameElement.java @@ -7,25 +7,21 @@ import com.mojang.blaze3d.platform.GlStateManager.SourceFactor; import com.mojang.blaze3d.platform.Lighting; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.math.Vector3f; -//import nl.requios.effortlessbuilding.create.foundation.fluid.FluidRenderer; -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 com.mojang.math.Axis; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.Sheets; import net.minecraft.client.renderer.block.BlockRenderDispatcher; -import net.minecraft.client.renderer.block.model.ItemTransforms; import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.BlockPos; import net.minecraft.util.RandomSource; import net.minecraft.world.inventory.InventoryMenu; +import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.BaseFireBlock; @@ -35,7 +31,10 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Fluid; import net.minecraft.world.phys.Vec3; 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; @@ -125,9 +124,9 @@ public class GuiGameElement { matrixStack.translate(xLocal, yLocal, zLocal); UIRenderHelper.flipForGuiRender(matrixStack); matrixStack.translate(rotationOffset.x, rotationOffset.y, rotationOffset.z); - matrixStack.mulPose(Vector3f.ZP.rotationDegrees((float) zRot)); - matrixStack.mulPose(Vector3f.XP.rotationDegrees((float) xRot)); - matrixStack.mulPose(Vector3f.YP.rotationDegrees((float) yRot)); + matrixStack.mulPose(Axis.ZP.rotationDegrees((float) zRot)); + matrixStack.mulPose(Axis.XP.rotationDegrees((float) xRot)); + matrixStack.mulPose(Axis.YP.rotationDegrees((float) yRot)); matrixStack.translate(-rotationOffset.x, -rotationOffset.y, -rotationOffset.z); } @@ -162,7 +161,8 @@ public class GuiGameElement { } @Override - public void render(PoseStack matrixStack) { + public void render(GuiGraphics graphics) { + PoseStack matrixStack = graphics.pose(); prepareMatrix(matrixStack); Minecraft mc = Minecraft.getInstance(); @@ -256,7 +256,8 @@ public class GuiGameElement { } @Override - public void render(PoseStack matrixStack) { + public void render(GuiGraphics graphics) { + PoseStack matrixStack = graphics.pose(); prepareMatrix(matrixStack); transformMatrix(matrixStack); renderItemIntoGUI(matrixStack, stack, customLighting == null); @@ -270,10 +271,11 @@ public class GuiGameElement { renderer.textureManager.getTexture(InventoryMenu.BLOCK_ATLAS).setFilter(false, false); RenderSystem.setShaderTexture(0, InventoryMenu.BLOCK_ATLAS); RenderSystem.enableBlend(); + RenderSystem.enableCull(); RenderSystem.blendFunc(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA); RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); matrixStack.pushPose(); - matrixStack.translate(0, 0, 100.0F + renderer.blitOffset); + matrixStack.translate(0, 0, 100.0F); matrixStack.translate(8.0F, -8.0F, 0.0F); matrixStack.scale(16.0F, 16.0F, 16.0F); MultiBufferSource.BufferSource buffer = Minecraft.getInstance().renderBuffers().bufferSource(); @@ -282,8 +284,10 @@ public class GuiGameElement { Lighting.setupForFlatItems(); } - renderer.render(stack, ItemTransforms.TransformType.GUI, false, matrixStack, buffer, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, bakedModel); + renderer.render(stack, ItemDisplayContext.GUI, false, matrixStack, buffer, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, bakedModel); + RenderSystem.disableDepthTest(); buffer.endBatch(); + RenderSystem.enableDepthTest(); if (useDefaultLighting && flatLighting) { Lighting.setupFor3DItems(); diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/RenderElement.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/RenderElement.java index f5e1e86..16a7519 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/RenderElement.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/RenderElement.java @@ -1,12 +1,12 @@ package nl.requios.effortlessbuilding.create.foundation.gui.element; -import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.GuiGraphics; public abstract class RenderElement implements ScreenElement { public static final RenderElement EMPTY = new RenderElement() { @Override - public void render(PoseStack ms) { + public void render(GuiGraphics graphics) { } }; @@ -66,11 +66,11 @@ public abstract class RenderElement implements ScreenElement { return z; } - public abstract void render(PoseStack ms); + public abstract void render(GuiGraphics graphics); @Override - public void render(PoseStack ms, int x, int y) { - this.at(x, y).render(ms); + public void render(GuiGraphics graphics, int x, int y) { + this.at(x, y).render(graphics); } public static class SimpleRenderElement extends RenderElement { @@ -82,8 +82,8 @@ public abstract class RenderElement implements ScreenElement { } @Override - public void render(PoseStack ms) { - renderable.render(ms, (int) x, (int) y); + public void render(GuiGraphics graphics) { + renderable.render(graphics, (int) x, (int) y); } } } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/ScreenElement.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/ScreenElement.java index 453e38b..86c2700 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/ScreenElement.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/ScreenElement.java @@ -1,12 +1,12 @@ package nl.requios.effortlessbuilding.create.foundation.gui.element; -import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.GuiGraphics; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; public interface ScreenElement { @OnlyIn(Dist.CLIENT) - void render(PoseStack ms, int x, int y); + void render(GuiGraphics graphics, int x, int y); } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/StencilElement.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/StencilElement.java index ce71a8e..968ab5d 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/StencilElement.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/StencilElement.java @@ -1,27 +1,31 @@ package nl.requios.effortlessbuilding.create.foundation.gui.element; +import org.lwjgl.opengl.GL11; + import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; + import net.minecraft.client.Minecraft; -import org.lwjgl.opengl.GL11; +import net.minecraft.client.gui.GuiGraphics; public abstract class StencilElement extends RenderElement { @Override - public void render(PoseStack ms) { + public void render(GuiGraphics graphics) { + PoseStack ms = graphics.pose(); ms.pushPose(); transform(ms); prepareStencil(ms); - renderStencil(ms); + renderStencil(graphics); prepareElement(ms); - renderElement(ms); + renderElement(graphics); cleanUp(ms); ms.popPose(); } - protected abstract void renderStencil(PoseStack ms); + protected abstract void renderStencil(GuiGraphics graphics); - protected abstract void renderElement(PoseStack ms); + protected abstract void renderElement(GuiGraphics graphics); protected void transform(PoseStack ms) { ms.translate(x, y, z); diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/TextStencilElement.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/TextStencilElement.java index 5ffd067..82c554e 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/TextStencilElement.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/TextStencilElement.java @@ -1,9 +1,10 @@ package nl.requios.effortlessbuilding.create.foundation.gui.element; 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.GuiGraphics; import net.minecraft.network.chat.MutableComponent; +import nl.requios.effortlessbuilding.create.foundation.utility.Components; public class TextStencilElement extends DelegatedStencilElement { @@ -45,8 +46,7 @@ public class TextStencilElement extends DelegatedStencilElement { } @Override - protected void renderStencil(PoseStack ms) { - + protected void renderStencil(GuiGraphics graphics) { float x = 0, y = 0; if (centerHorizontally) x = width / 2f - font.width(component) / 2f; @@ -54,11 +54,11 @@ public class TextStencilElement extends DelegatedStencilElement { if (centerVertically) y = height / 2f - (font.lineHeight - 1) / 2f; - font.draw(ms, component, x, y, 0xff_000000); + graphics.drawString(font, component, Math.round(x), Math.round(y), 0xff_000000, false); } @Override - protected void renderElement(PoseStack ms) { + protected void renderElement(GuiGraphics graphics) { float x = 0, y = 0; if (centerHorizontally) x = width / 2f - font.width(component) / 2f; @@ -66,9 +66,10 @@ public class TextStencilElement extends DelegatedStencilElement { if (centerVertically) y = height / 2f - (font.lineHeight - 1) / 2f; + PoseStack ms = graphics.pose(); ms.pushPose(); ms.translate(x, y, 0); - element.render(ms, font.width(component), font.lineHeight + 2, alpha); + element.render(graphics, font.width(component), font.lineHeight + 2, alpha); ms.popPose(); } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/AbstractSimiWidget.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/AbstractSimiWidget.java index 237559b..2851206 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/AbstractSimiWidget.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/AbstractSimiWidget.java @@ -1,11 +1,13 @@ package nl.requios.effortlessbuilding.create.foundation.gui.widget; -import com.mojang.blaze3d.vertex.PoseStack; -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.narration.NarrationElementOutput; +import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipPositioner; +import net.minecraft.client.gui.screens.inventory.tooltip.DefaultTooltipPositioner; import net.minecraft.network.chat.Component; +import nl.requios.effortlessbuilding.create.foundation.gui.TickableGuiEventListener; +import nl.requios.effortlessbuilding.create.foundation.utility.Components; import javax.annotation.Nonnull; import java.util.LinkedList; @@ -15,12 +17,13 @@ import java.util.function.BiConsumer; public abstract class AbstractSimiWidget extends AbstractWidget implements TickableGuiEventListener { public static final int HEADER_RGB = 0x5391E1; - + public static final int HINT_RGB = 0x96B7E0; + protected float z; protected boolean wasHovered = false; protected List toolTip = new LinkedList<>(); protected BiConsumer onClick = (_$, _$$) -> {}; - + public int lockedTooltipX = -1; public int lockedTooltipY = -1; @@ -36,6 +39,11 @@ public abstract class AbstractSimiWidget extends AbstractWidget implements Ticka super(x, y, width, height, message); } + @Override + protected ClientTooltipPositioner createTooltipPositioner() { + return DefaultTooltipPositioner.INSTANCE; + } + public T withCallback(BiConsumer cb) { this.onClick = cb; //noinspection unchecked @@ -60,26 +68,22 @@ public abstract class AbstractSimiWidget extends AbstractWidget implements Ticka public void tick() {} @Override - public void render(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { - if (visible) { - isHovered = mouseX >= x && mouseY >= y && mouseX < x + width && mouseY < y + height; - beforeRender(ms, mouseX, mouseY, partialTicks); - renderButton(ms, mouseX, mouseY, partialTicks); - afterRender(ms, mouseX, mouseY, partialTicks); - wasHovered = isHoveredOrFocused(); - } + public void renderWidget(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + beforeRender(graphics, mouseX, mouseY, partialTicks); + doRender(graphics, mouseX, mouseY, partialTicks); + afterRender(graphics, mouseX, mouseY, partialTicks); + wasHovered = isHoveredOrFocused(); } - protected void beforeRender(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { - ms.pushPose(); + protected void beforeRender(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + graphics.pose().pushPose(); } - @Override - public void renderButton(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { + protected void doRender(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { } - protected void afterRender(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { - ms.popPose(); + protected void afterRender(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + graphics.pose().popPose(); } public void runCallback(double mouseX, double mouseY) { @@ -92,7 +96,7 @@ public abstract class AbstractSimiWidget extends AbstractWidget implements Ticka } @Override - public void updateNarration(NarrationElementOutput pNarrationElementOutput) { + public void updateWidgetNarration(NarrationElementOutput pNarrationElementOutput) { defaultButtonNarrationText(pNarrationElementOutput); } } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/BoxWidget.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/BoxWidget.java index 1456d10..5818c7c 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/BoxWidget.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/BoxWidget.java @@ -1,8 +1,7 @@ package nl.requios.effortlessbuilding.create.foundation.gui.widget; -import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.GuiGraphics; import nl.requios.effortlessbuilding.create.foundation.gui.Theme; -import nl.requios.effortlessbuilding.create.foundation.gui.Theme.Key; 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.DelegatedStencilElement; @@ -10,7 +9,6 @@ import nl.requios.effortlessbuilding.create.foundation.utility.Color; import nl.requios.effortlessbuilding.create.foundation.utility.Couple; import nl.requios.effortlessbuilding.create.foundation.utility.animation.LerpedFloat; -import javax.annotation.Nonnull; import java.util.function.Function; public class BoxWidget extends ElementWidget { @@ -98,8 +96,8 @@ public class BoxWidget extends ElementWidget { } @Override - protected void beforeRender(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { - super.beforeRender(ms, mouseX, mouseY, partialTicks); + protected void beforeRender(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.beforeRender(graphics, mouseX, mouseY, partialTicks); if (isHovered != wasHovered) { startGradientAnimation( @@ -121,7 +119,7 @@ public class BoxWidget extends ElementWidget { } @Override - public void renderButton(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { + public void doRender(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { float fadeValue = fade.getValue(partialTicks); if (fadeValue < .1f) return; @@ -129,11 +127,11 @@ public class BoxWidget extends ElementWidget { box.withAlpha(fadeValue); box.withBackground(customBackground != null ? customBackground : Theme.c(Theme.Key.PONDER_BACKGROUND_TRANSPARENT)) .gradientBorder(gradientColor1, gradientColor2) - .at(x, y, z) + .at(getX(), getY(), z) .withBounds(width, height) - .render(ms); + .render(graphics); - super.renderButton(ms, mouseX, mouseY, partialTicks); + super.doRender(graphics, mouseX, mouseY, partialTicks); wasHovered = isHovered; } @@ -146,9 +144,9 @@ public class BoxWidget extends ElementWidget { float padX = 2 + paddingX; float padY = 2 + paddingY; - return x - padX <= mX && y - padY <= mY && mX < x + padX + width && mY < y + padY + height; + return getX() - padX <= mX && getY() - padY <= mY && mX < getX() + padX + width && mY < getY() + padY + height; } - + @Override protected boolean clicked(double pMouseX, double pMouseY) { if (!active || !visible) @@ -209,19 +207,19 @@ public class BoxWidget extends ElementWidget { return customBorderBot != null ? customBorderBot : Theme.c(getIdleTheme(), false); } - public Key getDisabledTheme() { + public Theme.Key getDisabledTheme() { return Theme.Key.BUTTON_DISABLE; } - public Key getIdleTheme() { + public Theme.Key getIdleTheme() { return Theme.Key.BUTTON_IDLE; } - public Key getHoverTheme() { + public Theme.Key getHoverTheme() { return Theme.Key.BUTTON_HOVER; } - public Key getClickTheme() { + public Theme.Key getClickTheme() { return Theme.Key.BUTTON_CLICK; } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/ElementWidget.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/ElementWidget.java index 597f5da..9cffb11 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/ElementWidget.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/ElementWidget.java @@ -1,11 +1,11 @@ package nl.requios.effortlessbuilding.create.foundation.gui.widget; import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.GuiGraphics; import nl.requios.effortlessbuilding.create.foundation.gui.element.RenderElement; import nl.requios.effortlessbuilding.create.foundation.gui.element.ScreenElement; import nl.requios.effortlessbuilding.create.foundation.utility.animation.LerpedFloat; -import javax.annotation.Nonnull; import java.util.function.Consumer; import java.util.function.UnaryOperator; @@ -117,21 +117,22 @@ public class ElementWidget extends AbstractSimiWidget { } @Override - protected void beforeRender(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { - super.beforeRender(ms, mouseX, mouseY, partialTicks); + protected void beforeRender(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.beforeRender(graphics, mouseX, mouseY, partialTicks); isHovered = isMouseOver(mouseX, mouseY); float fadeValue = fade.getValue(partialTicks); element.withAlpha(fadeValue); if (fadeValue < 1) { - ms.translate((1 - fadeValue) * fadeModX, (1 - fadeValue) * fadeModY, 0); + graphics.pose().translate((1 - fadeValue) * fadeModX, (1 - fadeValue) * fadeModY, 0); } } @Override - public void renderButton(@Nonnull PoseStack ms, int mouseX, int mouseY, float partialTicks) { + public void doRender(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + PoseStack ms = graphics.pose(); ms.pushPose(); - ms.translate(x + paddingX, y + paddingY, z); + ms.translate(getX() + paddingX, getY() + paddingY, z); float innerWidth = width - 2 * paddingX; float innerHeight = height - 2 * paddingY; float eX = element.getX(), eY = element.getY(); @@ -143,7 +144,7 @@ public class ElementWidget extends AbstractSimiWidget { innerWidth /= xScale; innerHeight /= yScale; } - element.withBounds((int) innerWidth, (int) innerHeight).render(ms); + element.withBounds((int) innerWidth, (int) innerHeight).render(graphics); ms.popPose(); if (rescaleElement) { element.at(eX, eY); diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/IconButton.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/IconButton.java index 86e3d98..6554942 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/IconButton.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/IconButton.java @@ -1,12 +1,10 @@ package nl.requios.effortlessbuilding.create.foundation.gui.widget; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; import nl.requios.effortlessbuilding.create.foundation.gui.AllGuiTextures; import nl.requios.effortlessbuilding.create.foundation.gui.element.ScreenElement; -import net.minecraft.network.chat.Component; - -import javax.annotation.Nonnull; public class IconButton extends AbstractSimiWidget { @@ -15,29 +13,28 @@ public class IconButton extends AbstractSimiWidget { public IconButton(int x, int y, ScreenElement icon) { this(x, y, 18, 18, icon); } - + public IconButton(int x, int y, int w, int h, ScreenElement icon) { super(x, y, w, h); this.icon = icon; } @Override - public void renderButton(@Nonnull PoseStack matrixStack, int mouseX, int mouseY, float partialTicks) { + public void doRender(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { if (visible) { - isHovered = mouseX >= x && mouseY >= y && mouseX < x + width && mouseY < y + height; + isHovered = mouseX >= getX() && mouseY >= getY() && mouseX < getX() + width && mouseY < getY() + height; AllGuiTextures button = !active ? AllGuiTextures.BUTTON_DOWN - : isHoveredOrFocused() ? AllGuiTextures.BUTTON_HOVER : AllGuiTextures.BUTTON; + : isMouseOver(mouseX, mouseY) ? AllGuiTextures.BUTTON_HOVER : AllGuiTextures.BUTTON; RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - drawBg(matrixStack, button); - icon.render(matrixStack, x + 1, y + 1); + drawBg(graphics, button); + icon.render(graphics, getX() + 1, getY() + 1); } } - protected void drawBg(PoseStack matrixStack, AllGuiTextures button) { - AllGuiTextures.BUTTON.bind(); - blit(matrixStack, x, y, button.startX, button.startY, button.width, button.height); + protected void drawBg(GuiGraphics graphics, AllGuiTextures button) { + graphics.blit(button.location, getX(), getY(), button.startX, button.startY, button.width, button.height); } public void setToolTip(Component text) { diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/Indicator.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/Indicator.java index c564910..314457b 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/Indicator.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/Indicator.java @@ -1,11 +1,9 @@ package nl.requios.effortlessbuilding.create.foundation.gui.widget; import com.google.common.collect.ImmutableList; -import com.mojang.blaze3d.vertex.PoseStack; -import nl.requios.effortlessbuilding.create.foundation.gui.AllGuiTextures; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; - -import javax.annotation.Nonnull; +import nl.requios.effortlessbuilding.create.foundation.gui.AllGuiTextures; public class Indicator extends AbstractSimiWidget { @@ -13,12 +11,12 @@ public class Indicator extends AbstractSimiWidget { public Indicator(int x, int y, Component tooltip) { super(x, y, AllGuiTextures.INDICATOR.width, AllGuiTextures.INDICATOR.height); - this.toolTip = ImmutableList.of(tooltip); + this.toolTip = toolTip.isEmpty() ? ImmutableList.of() : ImmutableList.of(tooltip); this.state = State.OFF; } @Override - public void render(@Nonnull PoseStack matrixStack, int mouseX, int mouseY, float partialTicks ) { + public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks ) { if (!visible) return; AllGuiTextures toDraw; @@ -30,7 +28,7 @@ public class Indicator extends AbstractSimiWidget { case GREEN: toDraw = AllGuiTextures.INDICATOR_GREEN; break; default: toDraw = AllGuiTextures.INDICATOR; break; } - toDraw.render(matrixStack, x, y, this); + toDraw.render(graphics, getX(), getY()); } public enum State { diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/Label.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/Label.java index f220dfd..8b72474 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/Label.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/Label.java @@ -1,12 +1,12 @@ package nl.requios.effortlessbuilding.create.foundation.gui.widget; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import nl.requios.effortlessbuilding.create.foundation.utility.Components; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; +import nl.requios.effortlessbuilding.create.foundation.utility.Components; import javax.annotation.Nonnull; @@ -44,12 +44,12 @@ public class Label extends AbstractSimiWidget { public void setTextAndTrim(Component newText, boolean trimFront, int maxWidthPx) { Font fontRenderer = Minecraft.getInstance().font; - + if (fontRenderer.width(newText) <= maxWidthPx) { text = newText; return; } - + String trim = "..."; int trimWidth = fontRenderer.width(trim); @@ -70,7 +70,7 @@ public class Label extends AbstractSimiWidget { } @Override - public void renderButton(@Nonnull PoseStack matrixStack, int mouseX, int mouseY, float partialTicks) { + protected void doRender(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { if (text == null || text.getString().isEmpty()) return; @@ -78,11 +78,8 @@ public class Label extends AbstractSimiWidget { MutableComponent copy = text.plainCopy(); if (suffix != null && !suffix.isEmpty()) copy.append(suffix); - - if (hasShadow) - font.drawShadow(matrixStack, copy, x, y, color); - else - font.draw(matrixStack, copy, x, y, color); + + graphics.drawString(font, copy, getX(), getY(), color, hasShadow); } } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/ScrollInput.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/ScrollInput.java index bb7e674..8c198f3 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/ScrollInput.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/ScrollInput.java @@ -1,14 +1,11 @@ package nl.requios.effortlessbuilding.create.foundation.gui.widget; -import nl.requios.effortlessbuilding.create.AllKeys; -//import nl.requios.effortlessbuilding.create.AllSoundEvents; -import nl.requios.effortlessbuilding.create.foundation.utility.Components; -import nl.requios.effortlessbuilding.create.foundation.utility.Lang; import net.minecraft.ChatFormatting; -import net.minecraft.client.Minecraft; -//import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; +import nl.requios.effortlessbuilding.create.AllKeys; +import nl.requios.effortlessbuilding.create.foundation.utility.Components; +import nl.requios.effortlessbuilding.create.foundation.utility.Lang; import java.util.function.Consumer; import java.util.function.Function; @@ -20,8 +17,10 @@ public class ScrollInput extends AbstractSimiWidget { protected Component title = Lang.translateDirect("gui.scrollInput.defaultTitle"); protected final Component scrollToModify = Lang.translateDirect("gui.scrollInput.scrollToModify"); protected final Component shiftScrollsFaster = Lang.translateDirect("gui.scrollInput.shiftScrollsFaster"); + protected Component hint = null; protected Label displayLabel; protected boolean inverted; + protected boolean soundPlayed; protected Function formatter; protected int min, max; @@ -36,6 +35,7 @@ public class ScrollInput extends AbstractSimiWidget { shiftStep = 5; step = standardStep(); formatter = i -> Components.literal(String.valueOf(i)); + soundPlayed = false; } public Function standardStep() { @@ -74,6 +74,12 @@ public class ScrollInput extends AbstractSimiWidget { return this; } + public ScrollInput addHint(MutableComponent hint) { + this.hint = hint; + updateTooltip(); + return this; + } + public ScrollInput withStepFunction(Function step) { this.step = step; return this; @@ -85,6 +91,12 @@ public class ScrollInput extends AbstractSimiWidget { writeToLabel(); return this; } + + @Override + public void tick() { + super.tick(); + soundPlayed = false; + } public int getState() { return state; @@ -106,8 +118,6 @@ public class ScrollInput extends AbstractSimiWidget { @Override public boolean mouseScrolled(double mouseX, double mouseY, double delta) { - if (!this.visible || !this.isHovered) return false; //Added - if (inverted) delta *= -1; @@ -128,12 +138,16 @@ public class ScrollInput extends AbstractSimiWidget { clampState(); if (priorState != state) { -// Minecraft.getInstance().getSoundManager().play(SimpleSoundInstance.forUI(AllSoundEvents.SCROLL_VALUE.getMainEvent(), 1.5f + 0.1f * (state-min)/(max-min))); +// if (!soundPlayed) +// Minecraft.getInstance() +// .getSoundManager() +// .play(SimpleSoundInstance.forUI(AllSoundEvents.SCROLL_VALUE.getMainEvent(), +// 1.5f + 0.1f * (state - min) / (max - min))); +// soundPlayed = true; onChanged(); } -// return priorState != state; - return true; //Changed + return priorState != state; } protected void clampState() { @@ -161,6 +175,9 @@ public class ScrollInput extends AbstractSimiWidget { return; toolTip.add(title.plainCopy() .withStyle(s -> s.withColor(HEADER_RGB))); + if (hint != null) + toolTip.add(hint.plainCopy() + .withStyle(s -> s.withColor(HINT_RGB))); toolTip.add(scrollToModify.plainCopy() .withStyle(ChatFormatting.ITALIC, ChatFormatting.DARK_GRAY)); toolTip.add(shiftScrollsFaster.plainCopy() diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/SelectionScrollInput.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/SelectionScrollInput.java index b495563..f4d58fa 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/SelectionScrollInput.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/SelectionScrollInput.java @@ -1,10 +1,10 @@ package nl.requios.effortlessbuilding.create.foundation.gui.widget; -import nl.requios.effortlessbuilding.create.foundation.utility.Components; -import nl.requios.effortlessbuilding.create.foundation.utility.Lang; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; 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; @@ -42,7 +42,8 @@ public class SelectionScrollInput extends ScrollInput { if (this.min + 1 == min) min--; if (min > this.min) - toolTip.add(Components.literal("> ...").withStyle(ChatFormatting.GRAY)); + toolTip.add(Components.literal("> ...") + .withStyle(ChatFormatting.GRAY)); if (this.max - 1 == max) max++; for (int i = min; i < max; i++) { @@ -58,8 +59,12 @@ public class SelectionScrollInput extends ScrollInput { .withStyle(ChatFormatting.GRAY)); } if (max < this.max) - toolTip.add(Components.literal("> ...").withStyle(ChatFormatting.GRAY)); + toolTip.add(Components.literal("> ...") + .withStyle(ChatFormatting.GRAY)); + if (hint != null) + toolTip.add(hint.plainCopy() + .withStyle(s -> s.withColor(HINT_RGB))); toolTip.add(scrollToSelect.plainCopy() .withStyle(ChatFormatting.DARK_GRAY, ChatFormatting.ITALIC)); } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/TooltipArea.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/TooltipArea.java index 7bcdf26..e3dcd78 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/TooltipArea.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/TooltipArea.java @@ -1,10 +1,10 @@ package nl.requios.effortlessbuilding.create.foundation.gui.widget; -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.network.chat.Component; - import java.util.List; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; + public class TooltipArea extends AbstractSimiWidget { public TooltipArea(int x, int y, int width, int height) { @@ -12,9 +12,9 @@ public class TooltipArea extends AbstractSimiWidget { } @Override - public void renderButton(PoseStack ms, int mouseX, int mouseY, float partialTicks) { + public void renderWidget(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { if (visible) - isHovered = mouseX >= x && mouseY >= y && mouseX < x + width && mouseY < y + height; + isHovered = mouseX >= getX() && mouseY >= getY() && mouseX < getX() + width && mouseY < getY() + height; } public TooltipArea withTooltip(List tooltip) { diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/ItemHelper.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/ItemHelper.java index 74f3d58..4153a84 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/ItemHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/ItemHelper.java @@ -122,7 +122,7 @@ public class ItemHelper { return true; if (stacks1.length == stacks2.length) { for (int i = 0; i < stacks1.length; i++) - if (!ItemStack.isSame(stacks1[i], stacks2[i])) + if (!ItemStack.isSameItem(stacks1[i], stacks2[i])) return false; return true; } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/TagDependentIngredientItem.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/TagDependentIngredientItem.java index 0e92452..c6e7327 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/TagDependentIngredientItem.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/TagDependentIngredientItem.java @@ -1,10 +1,7 @@ package nl.requios.effortlessbuilding.create.foundation.item; -import net.minecraft.core.NonNullList; import net.minecraft.tags.TagKey; -import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.tags.ITagManager; @@ -17,12 +14,6 @@ public class TagDependentIngredientItem extends Item { this.tag = tag; } - @Override - public void fillItemCategory(CreativeModeTab tab, NonNullList list) { - if (!shouldHide()) - super.fillItemCategory(tab, list); - } - public boolean shouldHide() { ITagManager tagManager = ForgeRegistries.ITEMS.tags(); return !tagManager.isKnownTagName(tag) || tagManager.getTag(tag).isEmpty(); diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/TooltipHelper.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/TooltipHelper.java index b05958a..67f723c 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/TooltipHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/TooltipHelper.java @@ -1,32 +1,33 @@ package nl.requios.effortlessbuilding.create.foundation.item; import com.google.common.base.Strings; -import com.mojang.bridge.game.Language; -import nl.requios.effortlessbuilding.create.foundation.item.ItemDescription.Palette; -import nl.requios.effortlessbuilding.create.foundation.utility.Components; -import nl.requios.effortlessbuilding.create.foundation.utility.Couple; -import nl.requios.effortlessbuilding.create.foundation.utility.FontHelper; -import nl.requios.effortlessbuilding.create.foundation.utility.Lang; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.resources.language.I18n; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; -import net.minecraft.world.entity.player.Player; 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.*; +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 static final int maxWidthPerLine = 200; public static final Map cachedTooltips = new HashMap<>(); - public static Language cachedLanguage; private static boolean gogglesMode; private static final Map> tooltipReferrals = new HashMap<>(); @@ -212,36 +213,6 @@ public class TooltipHelper { // return lines; // } - private static void checkLocale() { - Language currentLanguage = Minecraft.getInstance() - .getLanguageManager() - .getSelected(); - if (cachedLanguage != currentLanguage) { - cachedTooltips.clear(); - cachedLanguage = currentLanguage; - } - } - - public static boolean hasTooltip(ItemStack stack, Player player) { - checkLocale(); - - String key = getTooltipTranslationKey(stack); - if (cachedTooltips.containsKey(key)) - return cachedTooltips.get(key) != ItemDescription.MISSING; - return findTooltip(stack); - } - - public static ItemDescription getTooltip(ItemStack stack) { - checkLocale(); - String key = getTooltipTranslationKey(stack); - if (cachedTooltips.containsKey(key)) { - ItemDescription itemDescription = cachedTooltips.get(key); - if (itemDescription != ItemDescription.MISSING) - return itemDescription; - } - return null; - } - private static boolean findTooltip(ItemStack stack) { String key = getTooltipTranslationKey(stack); if (I18n.exists(key)) { diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/render/CreateCustomRenderedItemModel.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/render/CreateCustomRenderedItemModel.java deleted file mode 100644 index 72748e5..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/render/CreateCustomRenderedItemModel.java +++ /dev/null @@ -1,12 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.item.render; - -import nl.requios.effortlessbuilding.create.Create; -import net.minecraft.client.resources.model.BakedModel; - -public abstract class CreateCustomRenderedItemModel extends CustomRenderedItemModel { - - public CreateCustomRenderedItemModel(BakedModel template, String basePath) { - super(template, Create.ID, basePath); - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/render/CustomRenderedItemModel.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/render/CustomRenderedItemModel.java index 25191be..207a5d8 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/render/CustomRenderedItemModel.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/render/CustomRenderedItemModel.java @@ -1,29 +1,14 @@ package nl.requios.effortlessbuilding.create.foundation.item.render; import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.renderer.block.model.ItemTransforms; import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.client.resources.model.BlockModelRotation; -import net.minecraft.client.resources.model.ModelBakery; -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.client.event.ModelEvent; +import net.minecraft.world.item.ItemDisplayContext; import net.minecraftforge.client.model.BakedModelWrapper; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; +public class CustomRenderedItemModel extends BakedModelWrapper { -public abstract class CustomRenderedItemModel extends BakedModelWrapper { - - protected String namespace; - protected String basePath; - protected Map partials = new HashMap<>(); - - public CustomRenderedItemModel(BakedModel template, String namespace, String basePath) { - super(template); - this.namespace = namespace; - this.basePath = basePath; + public CustomRenderedItemModel(BakedModel originalModel) { + super(originalModel); } @Override @@ -32,43 +17,16 @@ public abstract class CustomRenderedItemModel extends BakedModelWrapper getModelLocations() { - return partials.keySet().stream().map(this::getPartialModelLocation).collect(Collectors.toList()); - } - - protected void addPartials(String... partials) { - for (String name : partials) - this.partials.put(name, null); - } - - public void loadPartials(ModelEvent.BakingCompleted event) { - ModelBakery modelLoader = event.getModelBakery(); - for (String name : partials.keySet()) - partials.put(name, loadPartial(modelLoader, name)); - } - - @SuppressWarnings("deprecation") - protected BakedModel loadPartial(ModelBakery modelLoader, String name) { - return modelLoader.bake(getPartialModelLocation(name), BlockModelRotation.X0_Y0); - } - - protected ResourceLocation getPartialModelLocation(String name) { - return new ResourceLocation(namespace, "item/" + basePath + "/" + name); - } - } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/render/PartialItemModelRenderer.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/render/PartialItemModelRenderer.java index e123fbf..88b9b51 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/render/PartialItemModelRenderer.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/render/PartialItemModelRenderer.java @@ -2,19 +2,19 @@ package nl.requios.effortlessbuilding.create.foundation.item.render; 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.utility.Iterate; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.block.model.ItemTransforms; import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.client.resources.model.BakedModel; import net.minecraft.core.Direction; import net.minecraft.util.RandomSource; +import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; import net.minecraftforge.client.extensions.common.IClientItemExtensions; 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 { @@ -23,12 +23,12 @@ public class PartialItemModelRenderer { private final RandomSource random = RandomSource.create(); private ItemStack stack; - private ItemTransforms.TransformType transformType; + private ItemDisplayContext transformType; private PoseStack ms; private MultiBufferSource buffer; private int overlay; - public static PartialItemModelRenderer of(ItemStack stack, ItemTransforms.TransformType transformType, + public static PartialItemModelRenderer of(ItemStack stack, ItemDisplayContext transformType, PoseStack ms, MultiBufferSource buffer, int overlay) { PartialItemModelRenderer instance = INSTANCE; instance.stack = stack; diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/networking/ISyncPersistentData.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/networking/ISyncPersistentData.java index 17b0310..b35bd98 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/networking/ISyncPersistentData.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/networking/ISyncPersistentData.java @@ -5,10 +5,8 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.entity.Entity; import net.minecraftforge.network.NetworkEvent.Context; -import net.minecraftforge.network.PacketDistributor; import java.util.HashSet; -import java.util.function.Supplier; public interface ISyncPersistentData { @@ -37,19 +35,17 @@ public interface ISyncPersistentData { } @Override - public void handle(Supplier context) { - context.get() - .enqueueWork(() -> { - Entity entityByID = Minecraft.getInstance().level.getEntity(entityId); - CompoundTag data = entityByID.getPersistentData(); - new HashSet<>(data.getAllKeys()).forEach(data::remove); - data.merge(readData); - if (!(entityByID instanceof ISyncPersistentData)) - return; - ((ISyncPersistentData) entityByID).onPersistentDataUpdated(); - }); - context.get() - .setPacketHandled(true); + public boolean handle(Context context) { + context.enqueueWork(() -> { + Entity entityByID = Minecraft.getInstance().level.getEntity(entityId); + CompoundTag data = entityByID.getPersistentData(); + new HashSet<>(data.getAllKeys()).forEach(data::remove); + data.merge(readData); + if (!(entityByID instanceof ISyncPersistentData)) + return; + ((ISyncPersistentData) entityByID).onPersistentDataUpdated(); + }); + return true; } } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/networking/SimplePacketBase.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/networking/SimplePacketBase.java index 3217e84..4adb134 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/networking/SimplePacketBase.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/networking/SimplePacketBase.java @@ -3,12 +3,10 @@ package nl.requios.effortlessbuilding.create.foundation.networking; import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.network.NetworkEvent.Context; -import java.util.function.Supplier; - public abstract class SimplePacketBase { public abstract void write(FriendlyByteBuf buffer); - public abstract void handle(Supplier context); + public abstract boolean handle(Context context); } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/BakedModelRenderHelper.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/BakedModelRenderHelper.java index a3a4d9b..6b68393 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/BakedModelRenderHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/BakedModelRenderHelper.java @@ -2,8 +2,6 @@ package nl.requios.effortlessbuilding.create.foundation.render; import com.jozufozu.flywheel.core.model.ModelUtil; import com.jozufozu.flywheel.core.model.ShadeSeparatedBufferedData; -import com.jozufozu.flywheel.util.Pair; -import com.mojang.blaze3d.vertex.BufferBuilder.RenderedBuffer; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.BlockRenderDispatcher; diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/CachedBufferer.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/CachedBufferer.java index aca56b4..3da0b88 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/CachedBufferer.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/CachedBufferer.java @@ -3,7 +3,6 @@ package nl.requios.effortlessbuilding.create.foundation.render; import com.jozufozu.flywheel.core.PartialModel; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; -import nl.requios.effortlessbuilding.EffortlessBuildingClient; import nl.requios.effortlessbuilding.create.CreateClient; import nl.requios.effortlessbuilding.create.foundation.render.SuperByteBufferCache.Compartment; import nl.requios.effortlessbuilding.create.foundation.utility.AngleHelper; diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/RenderTypes.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/RenderTypes.java index 825968b..fb46e7c 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/RenderTypes.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/RenderTypes.java @@ -6,16 +6,8 @@ import nl.requios.effortlessbuilding.create.AllSpecialTextures; import nl.requios.effortlessbuilding.create.Create; import net.minecraft.client.renderer.RenderStateShard; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.ShaderInstance; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.world.inventory.InventoryMenu; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.client.event.RegisterShadersEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod.EventBusSubscriber; - -import java.io.IOException; // TODO 1.17: use custom shaders instead of vanilla ones public class RenderTypes extends RenderStateShard { @@ -79,7 +71,7 @@ public class RenderTypes extends RenderStateShard { private static final RenderType ADDITIVE = RenderType.create(createLayerName("additive"), DefaultVertexFormat.BLOCK, VertexFormat.Mode.QUADS, 256, true, true, RenderType.CompositeState.builder() - .setShaderState(BLOCK_SHADER) + .setShaderState(RENDERTYPE_SOLID_SHADER) .setTextureState(new TextureStateShard(InventoryMenu.BLOCK_ATLAS, false, false)) .setTransparencyState(ADDITIVE_TRANSPARENCY) .setCullState(NO_CULL) diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/ShadowRenderHelper.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/ShadowRenderHelper.java index d81b292..211c789 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/ShadowRenderHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/ShadowRenderHelper.java @@ -2,6 +2,7 @@ package nl.requios.effortlessbuilding.create.foundation.render; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; + import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/SuperByteBuffer.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/SuperByteBuffer.java index 188a749..ece25d2 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/SuperByteBuffer.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/SuperByteBuffer.java @@ -1,27 +1,18 @@ package nl.requios.effortlessbuilding.create.foundation.render; -import java.nio.ByteBuffer; -import java.util.function.IntPredicate; import com.jozufozu.flywheel.api.vertex.ShadedVertexList; import com.jozufozu.flywheel.api.vertex.VertexList; import com.jozufozu.flywheel.backend.ShadersModHandler; import com.jozufozu.flywheel.core.model.ShadeSeparatedBufferedData; import com.jozufozu.flywheel.core.vertex.BlockVertexList; +import com.jozufozu.flywheel.util.Color; import com.jozufozu.flywheel.util.DiffuseLightCalculator; import com.jozufozu.flywheel.util.transform.TStack; import com.jozufozu.flywheel.util.transform.Transform; import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.math.Matrix3f; -import com.mojang.math.Matrix4f; -import com.mojang.math.Quaternion; -import com.mojang.math.Vector3f; -import com.mojang.math.Vector4f; -import nl.requios.effortlessbuilding.create.foundation.block.render.SpriteShiftEntry; -import nl.requios.effortlessbuilding.create.foundation.utility.Color; - import it.unimi.dsi.fastutil.longs.Long2IntMap; import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap; import net.minecraft.client.Minecraft; @@ -32,6 +23,15 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.Mth; import net.minecraft.world.level.Level; +import nl.requios.effortlessbuilding.create.foundation.block.render.SpriteShiftEntry; +import org.joml.Matrix3f; +import org.joml.Matrix4f; +import org.joml.Quaternionf; +import org.joml.Vector3f; +import org.joml.Vector4f; + +import java.nio.ByteBuffer; +import java.util.function.IntPredicate; public class SuperByteBuffer implements Transform, TStack { @@ -96,25 +96,22 @@ public class SuperByteBuffer implements Transform, TStack, TStack, TStack, TStack, TStack, TStack, TStack, TStack { float targetU = u - entry.getOriginal() - .getU0() + entry.getTarget() - .getU0() - + scrollU; + .getU0() + entry.getTarget() + .getU0() + + scrollU; float targetV = v - entry.getOriginal() - .getV0() + entry.getTarget() - .getV0() - + scrollV; + .getV0() + entry.getTarget() + .getV0() + + scrollV; builder.uv(targetU, targetV); }; return this; @@ -393,9 +390,9 @@ public class SuperByteBuffer implements Transform, TStack { 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() - .getV((SpriteShiftEntry.getUnInterpolatedV(entry.getOriginal(), v) / sheetSize) + vTarget * 16); + .getV((SpriteShiftEntry.getUnInterpolatedV(entry.getOriginal(), v) / sheetSize) + vTarget * 16); builder.uv(targetU, targetV); }; return this; @@ -478,7 +475,7 @@ public class SuperByteBuffer implements Transform, TStack LevelRenderer.getLightColor(world, pos)); } @@ -492,4 +489,4 @@ public class SuperByteBuffer implements Transform, TStack, Cache> caches = new HashMap<>(); public synchronized void registerCompartment(Compartment compartment) { caches.put(compartment, CacheBuilder.newBuilder() + .removalListener(n -> n.getValue().delete()) .build()); } public synchronized void registerCompartment(Compartment compartment, long ticksUntilExpired) { caches.put(compartment, CacheBuilder.newBuilder() .expireAfterAccess(ticksUntilExpired * 50, TimeUnit.MILLISECONDS) + .removalListener(n -> n.getValue().delete()) .build()); } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/SuperRenderTypeBuffer.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/SuperRenderTypeBuffer.java index b586c4a..008ad8d 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/SuperRenderTypeBuffer.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/SuperRenderTypeBuffer.java @@ -1,7 +1,10 @@ package nl.requios.effortlessbuilding.create.foundation.render; +import java.util.SortedMap; + import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.VertexConsumer; + import it.unimi.dsi.fastutil.objects.Object2ObjectLinkedOpenHashMap; import net.minecraft.Util; import net.minecraft.client.renderer.ChunkBufferBuilderPack; @@ -10,8 +13,6 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.Sheets; import net.minecraft.client.resources.model.ModelBakery; -import java.util.SortedMap; - public class SuperRenderTypeBuffer implements MultiBufferSource { private static final SuperRenderTypeBuffer INSTANCE = new SuperRenderTypeBuffer(); diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/TileEntityRenderHelper.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/TileEntityRenderHelper.java index a3a9bcb..5e17cbf 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/TileEntityRenderHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/TileEntityRenderHelper.java @@ -6,11 +6,6 @@ import com.jozufozu.flywheel.config.BackendType; import com.jozufozu.flywheel.core.virtual.VirtualRenderWorld; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.math.Matrix4f; -import com.mojang.math.Vector4f; -import nl.requios.effortlessbuilding.create.Create; -import nl.requios.effortlessbuilding.create.foundation.utility.AnimationTickHolder; -import nl.requios.effortlessbuilding.create.foundation.utility.RegisteredObjects; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.MultiBufferSource; @@ -19,6 +14,11 @@ import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; +import 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; import javax.annotation.Nullable; import java.util.Iterator; @@ -36,7 +36,7 @@ public class TileEntityRenderHelper { } public static void renderTileEntities(Level world, @Nullable VirtualRenderWorld renderWorld, - Iterable customRenderTEs, PoseStack ms, @Nullable Matrix4f lightTransform, MultiBufferSource buffer) { + Iterable customRenderTEs, PoseStack ms, @Nullable Matrix4f lightTransform, MultiBufferSource buffer) { renderTileEntities(world, renderWorld, customRenderTEs, ms, lightTransform, buffer, AnimationTickHolder.getPartialTicks()); } @@ -91,8 +91,8 @@ public class TileEntityRenderHelper { private static BlockPos getLightPos(@Nullable Matrix4f lightTransform, BlockPos contraptionPos) { if (lightTransform != null) { Vector4f lightVec = new Vector4f(contraptionPos.getX() + .5f, contraptionPos.getY() + .5f, contraptionPos.getZ() + .5f, 1); - lightVec.transform(lightTransform); - return new BlockPos(lightVec.x(), lightVec.y(), lightVec.z()); + lightVec.mul(lightTransform); + return BlockPos.containing(lightVec.x(), lightVec.y(), lightVec.z()); } else { return contraptionPos; } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/BlockHelper.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/BlockHelper.java index 44df777..6a37500 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/BlockHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/BlockHelper.java @@ -2,9 +2,9 @@ package nl.requios.effortlessbuilding.create.foundation.utility; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.core.Registry; import net.minecraft.core.SectionPos; import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.core.registries.Registries; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerLevel; import net.minecraft.sounds.SoundEvents; @@ -20,7 +20,12 @@ import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.GameRules; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.BaseRailBlock; +import net.minecraft.world.level.block.BedBlock; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.IceBlock; +import net.minecraft.world.level.block.SlimeBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.BlockStateProperties; @@ -29,10 +34,8 @@ import net.minecraft.world.level.block.state.properties.SlabType; import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.chunk.LevelChunkSection; import net.minecraft.world.level.material.FluidState; -import net.minecraft.world.level.material.Material; import net.minecraftforge.common.IPlantable; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.util.BlockSnapshot; import net.minecraftforge.event.level.BlockEvent; import javax.annotation.Nullable; @@ -181,9 +184,8 @@ public class BlockHelper { .ultraWarm()) return false; - Material material = world.getBlockState(pos.below()) - .getMaterial(); - if (material.blocksMotion() || material.isLiquid()) + BlockState belowState = world.getBlockState(pos.below()); + if (belowState.blocksMotion() || belowState.liquid()) world.setBlockAndUpdate(pos, Blocks.WATER.defaultBlockState()); return true; } @@ -211,8 +213,8 @@ public class BlockHelper { int idx = chunk.getSectionIndex(target.getY()); LevelChunkSection chunksection = chunk.getSection(idx); if (chunksection == null) { - chunksection = new LevelChunkSection(chunk.getSectionYFromSectionIndex(idx), world.registryAccess() - .registryOrThrow(Registry.BIOME_REGISTRY)); + chunksection = new LevelChunkSection(world.registryAccess() + .registryOrThrow(Registries.BIOME)); chunk.getSections()[idx] = chunksection; } BlockState old = chunksection.setBlockState(SectionPos.sectionRelative(target.getX()), diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/Color.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/Color.java index ed4a220..8fba9e5 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/Color.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/Color.java @@ -1,9 +1,9 @@ package nl.requios.effortlessbuilding.create.foundation.utility; import com.google.common.hash.Hashing; -import com.mojang.math.Vector3f; import net.minecraft.util.Mth; import net.minecraft.world.phys.Vec3; +import org.joml.Vector3f; import javax.annotation.Nonnull; import java.util.function.UnaryOperator; diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/CreateRegistry.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/CreateRegistry.java index d9545fb..28646cb 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/CreateRegistry.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/CreateRegistry.java @@ -2,7 +2,6 @@ package nl.requios.effortlessbuilding.create.foundation.utility; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.registries.IForgeRegistry; -import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.create.Create; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/FontHelper.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/FontHelper.java index 092c995..4f18057 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/FontHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/FontHelper.java @@ -2,11 +2,11 @@ package nl.requios.effortlessbuilding.create.foundation.utility; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.Tesselator; -import com.mojang.math.Matrix4f; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; +import org.joml.Matrix4f; import java.text.BreakIterator; import java.util.LinkedList; @@ -71,14 +71,14 @@ public final class FontHelper { } private static int draw(Font font, String p_228078_1_, float p_228078_2_, float p_228078_3_, - int p_228078_4_, Matrix4f p_228078_5_, boolean p_228078_6_) { + int p_228078_4_, Matrix4f p_228078_5_, boolean p_228078_6_) { if (p_228078_1_ == null) { return 0; } else { MultiBufferSource.BufferSource irendertypebuffer$impl = MultiBufferSource.immediate(Tesselator.getInstance() .getBuilder()); int i = font.drawInBatch(p_228078_1_, p_228078_2_, p_228078_3_, p_228078_4_, p_228078_6_, p_228078_5_, - irendertypebuffer$impl, false, 0, LightTexture.FULL_BRIGHT); + irendertypebuffer$impl, Font.DisplayMode.NORMAL, 0, LightTexture.FULL_BRIGHT); irendertypebuffer$impl.endBatch(); return i; } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/LangNumberFormat.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/LangNumberFormat.java index bcf9d41..77ae9e5 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/LangNumberFormat.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/LangNumberFormat.java @@ -17,7 +17,6 @@ public class LangNumberFormat { public void update() { format = NumberFormat.getInstance(Minecraft.getInstance() .getLanguageManager() - .getSelected() .getJavaLocale()); format.setMaximumFractionDigits(2); format.setMinimumFractionDigits(0); diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/VecHelper.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/VecHelper.java index e9ea1d0..e701f22 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/VecHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/VecHelper.java @@ -1,7 +1,5 @@ package nl.requios.effortlessbuilding.create.foundation.utility; -import com.mojang.math.Quaternion; -import com.mojang.math.Vector3f; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; @@ -19,6 +17,8 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.Mirror; import net.minecraft.world.phys.Vec3; +import org.joml.Quaternionf; +import org.joml.Vector3f; import javax.annotation.Nullable; @@ -237,13 +237,12 @@ public class VecHelper { */ Camera ari = Minecraft.getInstance().gameRenderer.getMainCamera(); Vec3 camera_pos = ari.getPosition(); - Quaternion camera_rotation_conj = ari.rotation() - .copy(); - camera_rotation_conj.conj(); + Quaternionf camera_rotation_conj = new Quaternionf(ari.rotation()); + camera_rotation_conj.conjugate(); Vector3f result3f = new Vector3f((float) (camera_pos.x - target.x), (float) (camera_pos.y - target.y), (float) (camera_pos.z - target.z)); - result3f.transform(camera_rotation_conj); + result3f.rotate(camera_rotation_conj); // ----- compensate for view bobbing (if active) ----- // the following code adapted from GameRenderer::applyBobbing (to invert it) @@ -257,18 +256,18 @@ public class VecHelper { float f = distwalked_modified - playerentity.walkDistO; float f1 = -(distwalked_modified + f * partialTicks); float f2 = Mth.lerp(partialTicks, playerentity.oBob, playerentity.bob); - Quaternion q2 = - new Quaternion(Vector3f.XP, Math.abs(Mth.cos(f1 * (float) Math.PI - 0.2F) * f2) * 5.0F, true); - q2.conj(); - result3f.transform(q2); + Quaternionf q2 = + com.mojang.math.Axis.XP.rotationDegrees(Math.abs(Mth.cos(f1 * (float) Math.PI - 0.2F) * f2) * 5.0F); + q2.conjugate(); + result3f.rotate(q2); - Quaternion q1 = new Quaternion(Vector3f.ZP, Mth.sin(f1 * (float) Math.PI) * f2 * 3.0F, true); - q1.conj(); - result3f.transform(q1); + Quaternionf q1 = com.mojang.math.Axis.ZP.rotationDegrees(Mth.sin(f1 * (float) Math.PI) * f2 * 3.0F); + q1.conjugate(); + result3f.rotate(q1); Vector3f bob_translation = new Vector3f((Mth.sin(f1 * (float) Math.PI) * f2 * 0.5F), (-Math.abs(Mth.cos(f1 * (float) Math.PI) * f2)), 0.0f); - bob_translation.setY(-bob_translation.y()); // this is weird but hey, if it works + bob_translation.y = -bob_translation.y(); // this is weird but hey, if it works result3f.add(bob_translation); } } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/WorldHelper.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/WorldHelper.java index fa26d0e..03489d4 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/WorldHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/WorldHelper.java @@ -1,13 +1,13 @@ package nl.requios.effortlessbuilding.create.foundation.utility; -import net.minecraft.core.Registry; +import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.LevelAccessor; public class WorldHelper { public static ResourceLocation getDimensionID(LevelAccessor world) { return world.registryAccess() - .registryOrThrow(Registry.DIMENSION_TYPE_REGISTRY) + .registryOrThrow(Registries.DIMENSION_TYPE) .getKey(world.dimensionType()); } } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/ghost/GhostBlockParams.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/ghost/GhostBlockParams.java index 7202e91..e05c7e8 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/ghost/GhostBlockParams.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/ghost/GhostBlockParams.java @@ -4,7 +4,6 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import nl.requios.effortlessbuilding.create.foundation.utility.Color; -import nl.requios.effortlessbuilding.create.foundation.utility.outliner.Outline; import java.util.function.Supplier; diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/ghost/GhostBlocks.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/ghost/GhostBlocks.java index 6334c95..96c2893 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/ghost/GhostBlocks.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/ghost/GhostBlocks.java @@ -1,7 +1,6 @@ package nl.requios.effortlessbuilding.create.foundation.utility.ghost; import com.mojang.blaze3d.vertex.PoseStack; -import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.create.foundation.render.SuperRenderTypeBuffer; import net.minecraft.util.Mth; import net.minecraft.world.level.block.state.BlockState; diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/outliner/Outline.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/outliner/Outline.java index a5d3e8e..898699f 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/outliner/Outline.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/outliner/Outline.java @@ -3,7 +3,6 @@ package nl.requios.effortlessbuilding.create.foundation.utility.outliner; import com.jozufozu.flywheel.util.transform.TransformStack; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.math.Matrix3f; import nl.requios.effortlessbuilding.create.AllSpecialTextures; import nl.requios.effortlessbuilding.create.foundation.render.RenderTypes; import nl.requios.effortlessbuilding.create.foundation.render.SuperRenderTypeBuffer; @@ -16,6 +15,7 @@ import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.util.Mth; import net.minecraft.world.phys.Vec3; +import org.joml.Matrix3f; import javax.annotation.Nullable; import java.util.Optional; diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/DummyLevelEntityGetter.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/DummyLevelEntityGetter.java index 294fbed..1b53bc6 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/DummyLevelEntityGetter.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/DummyLevelEntityGetter.java @@ -1,5 +1,6 @@ package nl.requios.effortlessbuilding.create.foundation.utility.worldWrappers; +import net.minecraft.util.AbortableIterationConsumer; import net.minecraft.world.level.entity.EntityAccess; import net.minecraft.world.level.entity.EntityTypeTest; import net.minecraft.world.level.entity.LevelEntityGetter; @@ -27,7 +28,7 @@ public class DummyLevelEntityGetter implements LevelEnti } @Override - public void get(EntityTypeTest p_156935_, Consumer p_156936_) { + public void get(EntityTypeTest p_156935_, AbortableIterationConsumer p_156936_) { } @Override @@ -35,7 +36,7 @@ public class DummyLevelEntityGetter implements LevelEnti } @Override - public void get(EntityTypeTest p_156932_, AABB p_156933_, Consumer p_156934_) { + public void get(EntityTypeTest p_156932_, AABB p_156933_, AbortableIterationConsumer p_156934_) { } } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/WrappedServerWorld.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/WrappedServerWorld.java index 9c92219..f1675b8 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/WrappedServerWorld.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/WrappedServerWorld.java @@ -32,10 +32,10 @@ public class WrappedServerWorld extends ServerLevel { public WrappedServerWorld(ServerLevel world) { super(world.getServer(), Util.backgroundExecutor(), world.getServer().storageSource, - (ServerLevelData) world.getLevelData(), world.dimension(), - new LevelStem(world.dimensionTypeRegistration(), world.getChunkSource().getGenerator()), - new DummyStatusListener(), world.isDebug(), world.getBiomeManager().biomeZoomSeed, - Collections.emptyList(), false); + (ServerLevelData) world.getLevelData(), world.dimension(), + new LevelStem(world.dimensionTypeRegistration(), world.getChunkSource().getGenerator()), + new DummyStatusListener(), world.isDebug(), world.getBiomeManager().biomeZoomSeed, + Collections.emptyList(), false, world.getRandomSequences()); this.world = world; } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/WrappedWorld.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/WrappedWorld.java index 4040b5e..ae8e400 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/WrappedWorld.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/WrappedWorld.java @@ -5,6 +5,7 @@ import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.flag.FeatureFlagSet; import net.minecraft.world.item.crafting.RecipeManager; import net.minecraft.world.level.Level; import net.minecraft.world.level.biome.Biome; @@ -36,8 +37,8 @@ public class WrappedWorld extends Level { protected LevelEntityGetter entityGetter = new DummyLevelEntityGetter<>(); public WrappedWorld(Level world) { - super((WritableLevelData) world.getLevelData(), world.dimension(), world.dimensionTypeRegistration(), - world::getProfiler, world.isClientSide, world.isDebug(), 0, 0); + super((WritableLevelData) world.getLevelData(), world.dimension(), world.registryAccess(), world.dimensionTypeRegistration(), + world::getProfiler, world.isClientSide, world.isDebug(), 0, 0); this.world = world; } @@ -110,19 +111,23 @@ public class WrappedWorld extends Level { @Override public void playSeededSound(Player p_220363_, double p_220364_, double p_220365_, double p_220366_, - SoundEvent p_220367_, SoundSource p_220368_, float p_220369_, float p_220370_, long p_220371_) {} + SoundEvent p_220367_, SoundSource p_220368_, float p_220369_, float p_220370_, long p_220371_) {} @Override - public void playSeededSound(Player p_220372_, Entity p_220373_, SoundEvent p_220374_, SoundSource p_220375_, - float p_220376_, float p_220377_, long p_220378_) {} + public void playSeededSound(Player pPlayer, double pX, double pY, double pZ, Holder pSound, + SoundSource pSource, float pVolume, float pPitch, long pSeed) {} + + @Override + public void playSeededSound(Player pPlayer, Entity pEntity, Holder pSound, SoundSource pCategory, + float pVolume, float pPitch, long pSeed) {} @Override public void playSound(@Nullable Player player, double x, double y, double z, SoundEvent soundIn, - SoundSource category, float volume, float pitch) {} + SoundSource category, float volume, float pitch) {} @Override public void playSound(@Nullable Player p_217384_1_, Entity p_217384_2_, SoundEvent p_217384_3_, - SoundSource p_217384_4_, float p_217384_5_, float p_217384_6_) {} + SoundSource p_217384_4_, float p_217384_5_, float p_217384_6_) {} @Override public Entity getEntity(int id) { @@ -247,4 +252,10 @@ public class WrappedWorld extends Level { public int getSectionYFromSectionIndex(int sectionIndex) { return sectionIndex + this.getMinSection(); } + + @Override + public FeatureFlagSet enabledFeatures() { + return world.enabledFeatures(); + } + } diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/DiamondRandomizerBagContainer.java b/src/main/java/nl/requios/effortlessbuilding/gui/DiamondRandomizerBagContainer.java index 8e4c50c..709d60b 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/DiamondRandomizerBagContainer.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/DiamondRandomizerBagContainer.java @@ -141,7 +141,7 @@ public class DiamondRandomizerBagContainer extends AbstractContainerMenu { @Override public void removed(Player player) { super.removed(player); - if (!player.level.isClientSide) { + if (!player.level().isClientSide) { broadcastChanges(); } } diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/DiamondRandomizerBagScreen.java b/src/main/java/nl/requios/effortlessbuilding/gui/DiamondRandomizerBagScreen.java index 520623f..ba3b9c2 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/DiamondRandomizerBagScreen.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/DiamondRandomizerBagScreen.java @@ -1,7 +1,6 @@ package nl.requios.effortlessbuilding.gui; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -26,24 +25,22 @@ public class DiamondRandomizerBagScreen extends AbstractContainerScreen ShaderTypeList.this.y0 && rowTop + rowHeight - 5 < ShaderTypeList.this.y1) - drawString(ms, font, shaderType.name, ShaderTypeList.this.x0 + 8, rowTop + 4, 0xFFFFFF); + guiGraphics.drawString(font, shaderType.name, ShaderTypeList.this.x0 + 8, rowTop + 4, 0xFFFFFF, false); } @Override diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/buildmode/RadialMenu.java b/src/main/java/nl/requios/effortlessbuilding/gui/buildmode/RadialMenu.java index 71c5423..bcf17a1 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/buildmode/RadialMenu.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/buildmode/RadialMenu.java @@ -1,39 +1,46 @@ package nl.requios.effortlessbuilding.gui.buildmode; -import com.mojang.blaze3d.vertex.*; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.math.Vector4f; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; +import net.minecraft.ChatFormatting; +import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.resources.language.I18n; -import net.minecraft.client.KeyMapping; import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.core.Direction; -import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.util.RandomSource; -import net.minecraftforge.server.command.TextComponentHelper; import nl.requios.effortlessbuilding.ClientEvents; import nl.requios.effortlessbuilding.EffortlessBuildingClient; +import nl.requios.effortlessbuilding.buildmode.BuildModeEnum; import nl.requios.effortlessbuilding.buildmode.ModeOptions; +import nl.requios.effortlessbuilding.buildmode.ModeOptions.ActionEnum; +import nl.requios.effortlessbuilding.buildmode.ModeOptions.OptionEnum; import nl.requios.effortlessbuilding.create.foundation.item.ItemDescription; import nl.requios.effortlessbuilding.create.foundation.item.TooltipHelper; +import nl.requios.effortlessbuilding.create.foundation.utility.Color; import nl.requios.effortlessbuilding.create.foundation.utility.Components; import nl.requios.effortlessbuilding.create.foundation.utility.Lang; import org.lwjgl.opengl.GL11; import java.util.ArrayList; -import java.util.List; -import static nl.requios.effortlessbuilding.buildmode.ModeOptions.*; - -import nl.requios.effortlessbuilding.buildmode.BuildModeEnum; -import nl.requios.effortlessbuilding.buildmode.ModeOptions.ActionEnum; -import nl.requios.effortlessbuilding.buildmode.ModeOptions.OptionEnum; +import static nl.requios.effortlessbuilding.buildmode.ModeOptions.getBuildSpeed; +import static nl.requios.effortlessbuilding.buildmode.ModeOptions.getCircleStart; +import static nl.requios.effortlessbuilding.buildmode.ModeOptions.getCubeFill; +import static nl.requios.effortlessbuilding.buildmode.ModeOptions.getFill; +import static nl.requios.effortlessbuilding.buildmode.ModeOptions.getLineThickness; +import static nl.requios.effortlessbuilding.buildmode.ModeOptions.getRaisedEdge; /** * Initially from Chisels and Bits by AlgorithmX2 @@ -44,11 +51,11 @@ public class RadialMenu extends Screen { public static final RadialMenu instance = new RadialMenu(); - private final Vector4f radialButtonColor = new Vector4f(0f, 0f, 0f, .5f); - private final Vector4f sideButtonColor = new Vector4f(.5f, .5f, .5f, .5f); - private final Vector4f highlightColor = new Vector4f(.6f, .8f, 1f, .6f); - private final Vector4f selectedColor = new Vector4f(0f, .5f, 1f, .5f); - private final Vector4f highlightSelectedColor = new Vector4f(0.2f, .7f, 1f, .7f); + private final Color radialButtonColor = new Color(0f, 0f, 0f, .5f); + private final Color sideButtonColor = new Color(.5f, .5f, .5f, .5f); + private final Color highlightColor = new Color(.6f, .8f, 1f, .6f); + private final Color selectedColor = new Color(0f, .5f, 1f, .5f); + private final Color highlightSelectedColor = new Color(0.2f, .7f, 1f, .7f); private final int whiteTextColor = 0xffffffff; private final int watermarkTextColor = 0x88888888; @@ -95,9 +102,10 @@ public class RadialMenu extends Screen { } @Override - public void render(PoseStack ms, final int mouseX, final int mouseY, final float partialTicks) { + public void render(GuiGraphics guiGraphics, final int mouseX, final int mouseY, final float partialTicks) { BuildModeEnum currentBuildMode = EffortlessBuildingClient.BUILD_MODES.getBuildMode(); + PoseStack ms = guiGraphics.pose(); ms.pushPose(); ms.translate(0, 0, 200); @@ -107,11 +115,11 @@ public class RadialMenu extends Screen { final int startColor = (int) (visibility * 98) << 24; final int endColor = (int) (visibility * 128) << 24; - fillGradient(ms, 0, 0, width, height, startColor, endColor); + guiGraphics.fillGradient(0, 0, width, height, startColor, endColor); - RenderSystem.disableTexture(); RenderSystem.enableBlend(); RenderSystem.blendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, 1, 0); + RenderSystem.setShader(GameRenderer::getPositionColorShader); final Tesselator tessellator = Tesselator.getInstance(); final BufferBuilder buffer = tessellator.getBuilder(); @@ -182,11 +190,10 @@ public class RadialMenu extends Screen { tessellator.end(); RenderSystem.disableBlend(); - RenderSystem.enableTexture(); - drawIcons(ms, middleX, middleY, modes, buttons); + drawIcons(guiGraphics, middleX, middleY, modes, buttons); - drawTexts(ms, currentBuildMode, middleX, middleY, modes, buttons, options, mouseXX, mouseYY); + drawTexts(guiGraphics, currentBuildMode, middleX, middleY, modes, buttons, options, mouseXX, mouseYY); ms.popPose(); } @@ -221,10 +228,10 @@ public class RadialMenu extends Screen { final boolean isSelected = currentBuildMode.ordinal() == i; final boolean isMouseInQuad = inTriangle(x1m1, y1m1, x2m2, y2m2, x2m1, y2m1, mouseXCenter, mouseYCenter) - || inTriangle(x1m1, y1m1, x1m2, y1m2, x2m2, y2m2, mouseXCenter, mouseYCenter); + || inTriangle(x1m1, y1m1, x1m2, y1m2, x2m2, y2m2, mouseXCenter, mouseYCenter); final boolean isHighlighted = beginRadians <= mouseRadians && mouseRadians <= endRadians && isMouseInQuad; - Vector4f color = radialButtonColor; + Color color = radialButtonColor; if (isSelected) color = selectedColor; if (isHighlighted) color = highlightColor; if (isSelected && isHighlighted) color = highlightSelectedColor; @@ -234,10 +241,10 @@ public class RadialMenu extends Screen { switchTo = menuRegion.mode; } - buffer.vertex(middleX + x1m1, middleY + y1m1, getBlitOffset()).color(color.x(), color.y(), color.z(), color.w()).endVertex(); - buffer.vertex(middleX + x2m1, middleY + y2m1, getBlitOffset()).color(color.x(), color.y(), color.z(), color.w()).endVertex(); - buffer.vertex(middleX + x2m2, middleY + y2m2, getBlitOffset()).color(color.x(), color.y(), color.z(), color.w()).endVertex(); - buffer.vertex(middleX + x1m2, middleY + y1m2, getBlitOffset()).color(color.x(), color.y(), color.z(), color.w()).endVertex(); + buffer.vertex(middleX + x1m1, middleY + y1m1, 200).color(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()).endVertex(); + buffer.vertex(middleX + x2m1, middleY + y2m1, 200).color(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()).endVertex(); + buffer.vertex(middleX + x2m2, middleY + y2m2, 200).color(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()).endVertex(); + buffer.vertex(middleX + x1m2, middleY + y1m2, 200).color(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()).endVertex(); //Category line color = menuRegion.mode.category.color; @@ -248,10 +255,10 @@ public class RadialMenu extends Screen { final double y1m3 = Math.sin(beginRadians + fragment) * categoryLineOuterEdge; final double y2m3 = Math.sin(endRadians - fragment) * categoryLineOuterEdge; - buffer.vertex(middleX + x1m1, middleY + y1m1, getBlitOffset()).color(color.x(), color.y(), color.z(), color.w()).endVertex(); - buffer.vertex(middleX + x2m1, middleY + y2m1, getBlitOffset()).color(color.x(), color.y(), color.z(), color.w()).endVertex(); - buffer.vertex(middleX + x2m3, middleY + y2m3, getBlitOffset()).color(color.x(), color.y(), color.z(), color.w()).endVertex(); - buffer.vertex(middleX + x1m3, middleY + y1m3, getBlitOffset()).color(color.x(), color.y(), color.z(), color.w()).endVertex(); + buffer.vertex(middleX + x1m1, middleY + y1m1, 200).color(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()).endVertex(); + buffer.vertex(middleX + x2m1, middleY + y2m1, 200).color(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()).endVertex(); + buffer.vertex(middleX + x2m3, middleY + y2m3, 200).color(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()).endVertex(); + buffer.vertex(middleX + x1m3, middleY + y1m3, 200).color(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()).endVertex(); } } } @@ -263,15 +270,15 @@ public class RadialMenu extends Screen { boolean isSelected = btn.action == getBuildSpeed() || - btn.action == getFill() || - btn.action == getCubeFill() || - btn.action == getRaisedEdge() || - btn.action == getLineThickness() || - btn.action == getCircleStart() || - btn.action == EffortlessBuildingClient.BUILD_SETTINGS.getReplaceModeActionEnum() || - btn.action == ActionEnum.TOGGLE_PROTECT_TILE_ENTITIES && EffortlessBuildingClient.BUILD_SETTINGS.shouldProtectTileEntities(); + btn.action == getFill() || + btn.action == getCubeFill() || + btn.action == getRaisedEdge() || + btn.action == getLineThickness() || + btn.action == getCircleStart() || + btn.action == EffortlessBuildingClient.BUILD_SETTINGS.getReplaceModeActionEnum() || + btn.action == ActionEnum.TOGGLE_PROTECT_TILE_ENTITIES && EffortlessBuildingClient.BUILD_SETTINGS.shouldProtectTileEntities(); - Vector4f color = sideButtonColor; + Color color = sideButtonColor; if (isSelected) color = selectedColor; if (isHighlighted) color = highlightColor; if (isSelected && isHighlighted) color = highlightSelectedColor; @@ -281,27 +288,25 @@ public class RadialMenu extends Screen { doAction = btn.action; } - buffer.vertex(middleX + btn.x1, middleY + btn.y1, getBlitOffset()).color(color.x(), color.y(), color.z(), color.w()).endVertex(); - buffer.vertex(middleX + btn.x1, middleY + btn.y2, getBlitOffset()).color(color.x(), color.y(), color.z(), color.w()).endVertex(); - buffer.vertex(middleX + btn.x2, middleY + btn.y2, getBlitOffset()).color(color.x(), color.y(), color.z(), color.w()).endVertex(); - buffer.vertex(middleX + btn.x2, middleY + btn.y1, getBlitOffset()).color(color.x(), color.y(), color.z(), color.w()).endVertex(); + buffer.vertex(middleX + btn.x1, middleY + btn.y1, 200).color(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()).endVertex(); + buffer.vertex(middleX + btn.x1, middleY + btn.y2, 200).color(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()).endVertex(); + buffer.vertex(middleX + btn.x2, middleY + btn.y2, 200).color(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()).endVertex(); + buffer.vertex(middleX + btn.x2, middleY + btn.y1, 200).color(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()).endVertex(); } } - private void drawIcons(PoseStack ms, double middleX, double middleY, + private void drawIcons(GuiGraphics guiGraphics, double middleX, double middleY, ArrayList modes, ArrayList buttons) { + PoseStack ms = guiGraphics.pose(); ms.pushPose(); - RenderSystem.enableTexture(); - RenderSystem.setShader(GameRenderer::getPositionColorTexShader); - RenderSystem.setShaderColor(1f, 1f, 1f, 1f); //Draw buildmode icons for (final MenuRegion menuRegion : modes) { final double x = (menuRegion.x1 + menuRegion.x2) * 0.5 * (ringOuterEdge * 0.55 + 0.45 * ringInnerEdge); final double y = (menuRegion.y1 + menuRegion.y2) * 0.5 * (ringOuterEdge * 0.55 + 0.45 * ringInnerEdge); - - menuRegion.mode.icon.render(ms, (int) (middleX + x - 8), (int) (middleY + y - 8)); + + menuRegion.mode.icon.render(guiGraphics, (int) (middleX + x - 8), (int) (middleY + y - 8)); } //Draw action icons @@ -310,28 +315,28 @@ public class RadialMenu extends Screen { final double x = (button.x1 + button.x2) / 2 + 0.01; final double y = (button.y1 + button.y2) / 2 + 0.01; - button.action.icon.render(ms, (int) (middleX + x - 8), (int) (middleY + y - 8)); + button.action.icon.render(guiGraphics, (int) (middleX + x - 8), (int) (middleY + y - 8)); } ms.popPose(); } - private void drawTexts(PoseStack ms, BuildModeEnum currentBuildMode, double middleX, double middleY, ArrayList modes, ArrayList buttons, OptionEnum[] options, int mouseX, int mouseY) { + private void drawTexts(GuiGraphics guiGraphics, BuildModeEnum currentBuildMode, double middleX, double middleY, ArrayList modes, ArrayList buttons, OptionEnum[] options, int mouseX, int mouseY) { //font.drawStringWithShadow("Actions", (int) (middleX - buttonDistance - 13) - font.getStringWidth("Actions") * 0.5f, (int) middleY - 38, 0xffffffff); //Draw option strings for (int i = 0; i < currentBuildMode.options.length; i++) { OptionEnum option = options[i]; - font.drawShadow(ms, I18n.get(option.name), (int) (middleX + buttonDistance - 9), (int) middleY - 37 + i * 39, optionTextColor); + guiGraphics.drawString(font, I18n.get(option.name), (int) (middleX + buttonDistance - 9), (int) middleY - 37 + i * 39, optionTextColor); } String credits = "Effortless Building"; - font.drawShadow(ms, credits, width - font.width(credits) - 4, height - 10, watermarkTextColor); + guiGraphics.drawString(font, credits, width - font.width(credits) - 4, height - 10, watermarkTextColor); //Draw power level info String powerLevelValue = minecraft.player.isCreative() ? "Creative" : String.valueOf(EffortlessBuildingClient.POWER_LEVEL.getPowerLevel()); String powerLevelText = I18n.get("key.effortlessbuilding.power_level") + ": " + powerLevelValue; - font.drawShadow(ms, powerLevelText, width - font.width(powerLevelText) - 4, height - 22, minecraft.player.isCreative() ? watermarkTextColor : ChatFormatting.DARK_PURPLE.getColor()); + guiGraphics.drawString(font, powerLevelText, width - font.width(powerLevelText) - 4, height - 22, minecraft.player.isCreative() ? watermarkTextColor : ChatFormatting.DARK_PURPLE.getColor()); //if hover over power level info, show tooltip if (mouseX >= width - font.width(powerLevelText) - 14 && mouseX <= width && mouseY >= height - 24 && mouseY <= height) { @@ -354,7 +359,7 @@ public class RadialMenu extends Screen { tooltip.addAll(TooltipHelper.cutTextComponent(Components.translatable("key.effortlessbuilding.next_power_level_how"), ChatFormatting.GRAY, ChatFormatting.WHITE)); } - renderComponentTooltip(ms, tooltip, mouseX, mouseY); + guiGraphics.renderComponentTooltip(font, tooltip, mouseX, mouseY); } @@ -375,11 +380,11 @@ public class RadialMenu extends Screen { fixed_x -= font.width(text) / 2; } - font.drawShadow(ms, text, (int) middleX + fixed_x, (int) middleY + fixed_y, whiteTextColor); + guiGraphics.drawString(font, text, (int) middleX + fixed_x, (int) middleY + fixed_y, whiteTextColor); //Draw description text = I18n.get(menuRegion.mode.getDescriptionKey()); - font.drawShadow(ms, text, (int) middleX - font.width(text) / 2f, (int) middleY + buildModeDescriptionHeight, descriptionTextColor); + guiGraphics.drawString(font, text, (int) ((int) middleX - font.width(text) / 2f), (int) middleY + buildModeDescriptionHeight, descriptionTextColor); } } @@ -400,13 +405,14 @@ public class RadialMenu extends Screen { //Add keybind in brackets var keybind = findKeybind(button); - if (keybind != null) tooltip.add(Lang.translateDirect("tooltip.keybind", keybind.withStyle(ChatFormatting.GRAY)).withStyle(ChatFormatting.DARK_GRAY)); - renderComponentTooltip(ms, tooltip, mouseX, mouseY); + if (keybind != null) + tooltip.add(Lang.translateDirect("tooltip.keybind", keybind.withStyle(ChatFormatting.GRAY)).withStyle(ChatFormatting.DARK_GRAY)); + guiGraphics.renderComponentTooltip(font, tooltip, mouseX, mouseY); } } } - private MutableComponent findKeybind(MenuButton button){ + private MutableComponent findKeybind(MenuButton button) { int keybindingIndex = -1; if (button.action == ActionEnum.OPEN_MODIFIER_SETTINGS) keybindingIndex = 1; @@ -476,7 +482,7 @@ public class RadialMenu extends Screen { public static void playRadialMenuSound() { final float volume = 0.1f; if (volume >= 0.0001f) { - SimpleSoundInstance sound = new SimpleSoundInstance(SoundEvents.UI_BUTTON_CLICK, SoundSource.MASTER, volume, + SimpleSoundInstance sound = new SimpleSoundInstance(SoundEvents.UI_BUTTON_CLICK.get(), SoundSource.MASTER, volume, 1.0f, RandomSource.create(), Minecraft.getInstance().player.blockPosition()); Minecraft.getInstance().getSoundManager().play(sound); } diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/ArrayEntry.java b/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/ArrayEntry.java index d442b93..131eb28 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/ArrayEntry.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/ArrayEntry.java @@ -1,8 +1,8 @@ package nl.requios.effortlessbuilding.gui.buildmodifier; -import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -13,7 +13,6 @@ import nl.requios.effortlessbuilding.buildmodifier.BaseModifier; import nl.requios.effortlessbuilding.create.foundation.gui.widget.ScrollInput; import nl.requios.effortlessbuilding.gui.elements.LabeledScrollInput; import nl.requios.effortlessbuilding.utilities.MathHelper; -import nl.requios.effortlessbuilding.systems.PowerLevel; import java.util.Vector; @@ -60,25 +59,25 @@ public class ArrayEntry extends BaseModifierEntry { } @Override - public void render(PoseStack ms, int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean p_230432_9_, float partialTicks) { - super.render(ms, index, y, x, width, height, mouseX, mouseY, p_230432_9_, partialTicks); + public void render(GuiGraphics guiGraphics, int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean p_230432_9_, float partialTicks) { + super.render(guiGraphics, index, y, x, width, height, mouseX, mouseY, p_230432_9_, partialTicks); //draw offset inputs for (int i = 0; i < 3; i++) { - offsetInputs.get(i).x = left + 49 + 20 * i; - offsetInputs.get(i).y = top + 19; - offsetInputs.get(i).render(ms, mouseX, mouseY, partialTicks); + offsetInputs.get(i).setX(left + 49 + 20 * i); + offsetInputs.get(i).setY(top + 19); + offsetInputs.get(i).render(guiGraphics, mouseX, mouseY, partialTicks); } //draw count input - countInput.x = left + 49; - countInput.y = top + 41; - countInput.render(ms, mouseX, mouseY, partialTicks); + countInput.setX(left + 49); + countInput.setY(top + 41); + countInput.render(guiGraphics, mouseX, mouseY, partialTicks); //draw reach label - reachLabel.x = right - 8 - getFont().width(reachLabel.text); - reachLabel.y = top + 24; - reachLabel.render(ms, mouseX, mouseY, partialTicks); + reachLabel.setX(right - 8 - getFont().width(reachLabel.text)); + reachLabel.setY(top + 24); + reachLabel.render(guiGraphics, mouseX, mouseY, partialTicks); } @Override diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/BaseModifierEntry.java b/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/BaseModifierEntry.java index b662b3f..1adce87 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/BaseModifierEntry.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/BaseModifierEntry.java @@ -1,18 +1,11 @@ package nl.requios.effortlessbuilding.gui.buildmodifier; -import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; import nl.requios.effortlessbuilding.AllGuiTextures; -import nl.requios.effortlessbuilding.AllIcons; import nl.requios.effortlessbuilding.buildmodifier.BaseModifier; -import nl.requios.effortlessbuilding.create.foundation.gui.AbstractSimiScreen; -import nl.requios.effortlessbuilding.create.foundation.gui.widget.BoxWidget; -import nl.requios.effortlessbuilding.create.foundation.gui.widget.ElementWidget; -import nl.requios.effortlessbuilding.create.foundation.gui.widget.IconButton; import nl.requios.effortlessbuilding.create.foundation.gui.widget.Label; import nl.requios.effortlessbuilding.create.foundation.utility.Components; -import nl.requios.effortlessbuilding.gui.elements.GuiCollapsibleScrollEntry; -import nl.requios.effortlessbuilding.gui.elements.GuiScrollPane; import nl.requios.effortlessbuilding.gui.elements.MiniButton; public abstract class BaseModifierEntry extends ModifiersScreenList.Entry { @@ -87,41 +80,39 @@ public abstract class BaseModifierEntry extends Modifier } @Override - public void render(PoseStack ms, int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean p_230432_9_, float partialTicks) { + public void render(GuiGraphics guiGraphics, int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean p_230432_9_, float partialTicks) { left = x + width / 2 - BACKGROUND_WIDTH / 2; right = x + width / 2 + BACKGROUND_WIDTH / 2; top = y; bottom = y + BACKGROUND_HEIGHT; - background.render(ms, left, top, screen); + background.render(guiGraphics, left, top); - enableButton.x = left + 4; - enableButton.y = top + 3; - enableButton.render(ms, mouseX, mouseY, partialTicks); + enableButton.setX(left + 4); + enableButton.setY(top + 3); + enableButton.render(guiGraphics, mouseX, mouseY, partialTicks); if (modifier.enabled) - AllGuiTextures.CHECKMARK.render(ms, left + 5, top + 3, screen); + AllGuiTextures.CHECKMARK.render(guiGraphics, left + 5, top + 3); - nameLabel.x = left + 18; - nameLabel.y = top + 4; - nameLabel.render(ms, mouseX, mouseY, partialTicks); + nameLabel.setX(left + 18); + nameLabel.setY(top + 4); + nameLabel.render(guiGraphics, mouseX, mouseY, partialTicks); moveUpButton.visible = screen.canMoveUp(this); moveDownButton.visible = screen.canMoveDown(this); - moveUpButton.x = right - 31; - moveUpButton.y = top + 3; - moveUpButton.render(ms, mouseX, mouseY, partialTicks); + moveUpButton.setX(right - 31); + moveUpButton.setY(top + 3); + moveUpButton.render(guiGraphics, mouseX, mouseY, partialTicks); - moveDownButton.x = right - 22; - moveDownButton.y = top + 3; - moveDownButton.render(ms, mouseX, mouseY, partialTicks); + moveDownButton.setX(right - 22); + moveDownButton.setY(top + 3); + moveDownButton.render(guiGraphics, mouseX, mouseY, partialTicks); - removeButton.x = right - 13; - removeButton.y = top + 3; - removeButton.render(ms, mouseX, mouseY, partialTicks); - - super.render(ms, index, y, x, width, height, mouseX, mouseY, p_230432_9_, partialTicks); + removeButton.setX(right - 13); + removeButton.setY(top + 3); + removeButton.render(guiGraphics, mouseX, mouseY, partialTicks); } public void onValueChanged() { diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/MirrorEntry.java b/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/MirrorEntry.java index b109b48..3af092c 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/MirrorEntry.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/MirrorEntry.java @@ -1,7 +1,7 @@ package nl.requios.effortlessbuilding.gui.buildmodifier; -import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; @@ -16,7 +16,6 @@ import nl.requios.effortlessbuilding.create.foundation.gui.widget.ScrollInput; import nl.requios.effortlessbuilding.create.foundation.utility.Components; import nl.requios.effortlessbuilding.gui.elements.LabeledScrollInput; import nl.requios.effortlessbuilding.utilities.MathHelper; -import nl.requios.effortlessbuilding.systems.PowerLevel; import java.text.DecimalFormat; import java.util.Vector; @@ -136,49 +135,49 @@ public class MirrorEntry extends BaseModifierEntry { } @Override - public void render(PoseStack ms, int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean p_230432_9_, float partialTicks) { - super.render(ms, index, y, x, width, height, mouseX, mouseY, p_230432_9_, partialTicks); + public void render(GuiGraphics guiGraphics, int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean p_230432_9_, float partialTicks) { + super.render(guiGraphics, index, y, x, width, height, mouseX, mouseY, p_230432_9_, partialTicks); //draw position inputs for (int i = 0; i < 3; i++) { ScrollInput input = positionInputs.get(i); - input.x = left + 49 + 38 * i; - input.y = top + 19; - input.render(ms, mouseX, mouseY, partialTicks); + input.setX(left + 49 + 38 * i); + input.setY(top + 19); + input.render(guiGraphics, mouseX, mouseY, partialTicks); } //draw player position button - playerPositionButton.x = left + 163; - playerPositionButton.y = top + 19; - playerPositionButton.render(ms, mouseX, mouseY, partialTicks); + playerPositionButton.setX(left + 163); + playerPositionButton.setY(top + 19); + playerPositionButton.render(guiGraphics, mouseX, mouseY, partialTicks); //draw toggle offset button - toggleOffsetButton.x = left + 183; - toggleOffsetButton.y = top + 19; - toggleOffsetButton.render(ms, mouseX, mouseY, partialTicks); + toggleOffsetButton.setX(left + 183); + toggleOffsetButton.setY(top + 19); + toggleOffsetButton.render(guiGraphics, mouseX, mouseY, partialTicks); //draw axis buttons for (int i = 0; i < 3; i++) { IconButton button = axisButtons.get(i); - button.x = left + 49 + 18 * i; - button.y = top + 41; - button.render(ms, mouseX, mouseY, partialTicks); + button.setX(left + 49 + 18 * i); + button.setY(top + 41); + button.render(guiGraphics, mouseX, mouseY, partialTicks); } //draw radius input - radiusInput.x = left + 134; - radiusInput.y = top + 41; - radiusInput.render(ms, mouseX, mouseY, partialTicks); + radiusInput.setX(left + 134); + radiusInput.setY(top + 41); + radiusInput.render(guiGraphics, mouseX, mouseY, partialTicks); //draw show lines button - showLinesButton.x = left + 163; - showLinesButton.y = top + 41; - showLinesButton.render(ms, mouseX, mouseY, partialTicks); + showLinesButton.setX(left + 163); + showLinesButton.setY(top + 41); + showLinesButton.render(guiGraphics, mouseX, mouseY, partialTicks); //draw show areas button - showAreasButton.x = left + 183; - showAreasButton.y = top + 41; - showAreasButton.render(ms, mouseX, mouseY, partialTicks); + showAreasButton.setX(left + 183); + showAreasButton.setY(top + 41); + showAreasButton.render(guiGraphics, mouseX, mouseY, partialTicks); } @Override diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/ModifiersScreen.java b/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/ModifiersScreen.java index c322712..4c7dc20 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/ModifiersScreen.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/ModifiersScreen.java @@ -1,13 +1,11 @@ package nl.requios.effortlessbuilding.gui.buildmodifier; -import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import nl.requios.effortlessbuilding.ClientEvents; -import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuildingClient; import nl.requios.effortlessbuilding.buildmodifier.Array; import nl.requios.effortlessbuilding.buildmodifier.BaseModifier; @@ -17,14 +15,9 @@ import nl.requios.effortlessbuilding.create.foundation.gui.AbstractSimiScreen; import nl.requios.effortlessbuilding.create.foundation.gui.AllIcons; import nl.requios.effortlessbuilding.create.foundation.gui.widget.BoxWidget; import nl.requios.effortlessbuilding.create.foundation.utility.Components; -import nl.requios.effortlessbuilding.gui.elements.GuiScrollPane; -import nl.requios.effortlessbuilding.network.PacketHandler; import javax.annotation.Nonnull; import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; @OnlyIn(Dist.CLIENT) public class ModifiersScreen extends AbstractSimiScreen { @@ -152,7 +145,7 @@ public class ModifiersScreen extends AbstractSimiScreen { } @Override - protected void renderWindow(PoseStack ms, int mouseX, int mouseY, float partialTicks) { + protected void renderWindow(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTicks) { } diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/ModifiersScreenList.java b/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/ModifiersScreenList.java index dffb2cc..e91efae 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/ModifiersScreenList.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/ModifiersScreenList.java @@ -2,9 +2,9 @@ package nl.requios.effortlessbuilding.gui.buildmodifier; import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.ObjectSelectionList; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.network.chat.Component; @@ -30,30 +30,30 @@ public class ModifiersScreenList extends ObjectSelectionList= this.y0 && j1 <= this.y1) { - renderItemForeground(pPoseStack, pMouseX, pMouseY, pPartialTick, i1, i, j1, j, k); + renderItemForeground(guiGraphics, pMouseX, pMouseY, pPartialTick, i1, i, j1, j, k); } } } - protected void renderItemForeground(PoseStack pPoseStack, int pMouseX, int pMouseY, float pPartialTick, int pIndex, int pLeft, int pTop, int pWidth, int pHeight) { + protected void renderItemForeground(GuiGraphics guiGraphics, int pMouseX, int pMouseY, float pPartialTick, int pIndex, int pLeft, int pTop, int pWidth, int pHeight) { Entry e = this.getEntry(pIndex); - e.renderForeground(pPoseStack, pIndex, pTop, pLeft, pWidth, pHeight, pMouseX, pMouseY, Objects.equals(this.getHovered(), e), pPartialTick); + e.renderForeground(guiGraphics, pIndex, pTop, pLeft, pWidth, pHeight, pMouseX, pMouseY, Objects.equals(this.getHovered(), e), pPartialTick); } @Override @@ -146,14 +146,14 @@ public class ModifiersScreenList extends ObjectSelectionList tooltip = simiWidget.getToolTip(); if (tooltip.isEmpty()) continue; - int ttx = simiWidget.lockedTooltipX == -1 ? mouseX : simiWidget.lockedTooltipX + simiWidget.x; - int tty = simiWidget.lockedTooltipY == -1 ? mouseY : simiWidget.lockedTooltipY + simiWidget.y; - screen.renderComponentTooltip(ms, tooltip, ttx, tty); + int ttx = simiWidget.lockedTooltipX == -1 ? mouseX : simiWidget.lockedTooltipX + simiWidget.getX(); + int tty = simiWidget.lockedTooltipY == -1 ? mouseY : simiWidget.lockedTooltipY + simiWidget.getY(); + guiGraphics.renderComponentTooltip(getFont(), tooltip, ttx, tty); } } } diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/RadialMirrorEntry.java b/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/RadialMirrorEntry.java index 2e04841..31a7748 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/RadialMirrorEntry.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/RadialMirrorEntry.java @@ -1,7 +1,7 @@ package nl.requios.effortlessbuilding.gui.buildmodifier; -import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; @@ -16,7 +16,6 @@ import nl.requios.effortlessbuilding.create.foundation.gui.widget.ScrollInput; import nl.requios.effortlessbuilding.create.foundation.utility.Components; import nl.requios.effortlessbuilding.gui.elements.LabeledScrollInput; import nl.requios.effortlessbuilding.utilities.MathHelper; -import nl.requios.effortlessbuilding.systems.PowerLevel; import java.text.DecimalFormat; import java.util.Vector; @@ -142,51 +141,51 @@ public class RadialMirrorEntry extends BaseModifierEntry { } @Override - public void render(PoseStack ms, int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean p_230432_9_, float partialTicks) { - super.render(ms, index, y, x, width, height, mouseX, mouseY, p_230432_9_, partialTicks); + public void render(GuiGraphics guiGraphics, int index, int y, int x, int width, int height, int mouseX, int mouseY, boolean p_230432_9_, float partialTicks) { + super.render(guiGraphics, index, y, x, width, height, mouseX, mouseY, p_230432_9_, partialTicks); //draw position inputs for (int i = 0; i < 3; i++) { ScrollInput input = positionInputs.get(i); - input.x = left + 49 + 38 * i; - input.y = top + 19; - input.render(ms, mouseX, mouseY, partialTicks); + input.setX(left + 49 + 38 * i); + input.setY(top + 19); + input.render(guiGraphics, mouseX, mouseY, partialTicks); } //draw player position button - playerPositionButton.x = left + 163; - playerPositionButton.y = top + 19; - playerPositionButton.render(ms, mouseX, mouseY, partialTicks); + playerPositionButton.setX(left + 163); + playerPositionButton.setY(top + 19); + playerPositionButton.render(guiGraphics, mouseX, mouseY, partialTicks); //draw toggle offset button - toggleOffsetButton.x = left + 183; - toggleOffsetButton.y = top + 19; - toggleOffsetButton.render(ms, mouseX, mouseY, partialTicks); + toggleOffsetButton.setX(left + 183); + toggleOffsetButton.setY(top + 19); + toggleOffsetButton.render(guiGraphics, mouseX, mouseY, partialTicks); //draw slices input - slicesInput.x = left + 49; - slicesInput.y = top + 41; - slicesInput.render(ms, mouseX, mouseY, partialTicks); + slicesInput.setX(left + 49); + slicesInput.setY(top + 41); + slicesInput.render(guiGraphics, mouseX, mouseY, partialTicks); //draw alternate button - alternateButton.x = left + 78; - alternateButton.y = top + 41; - alternateButton.render(ms, mouseX, mouseY, partialTicks); + alternateButton.setX(left + 78); + alternateButton.setY(top + 41); + alternateButton.render(guiGraphics, mouseX, mouseY, partialTicks); //draw radius input - radiusInput.x = left + 134; - radiusInput.y = top + 41; - radiusInput.render(ms, mouseX, mouseY, partialTicks); + radiusInput.setX(left + 134); + radiusInput.setY(top + 41); + radiusInput.render(guiGraphics, mouseX, mouseY, partialTicks); //draw show lines button - showLinesButton.x = left + 163; - showLinesButton.y = top + 41; - showLinesButton.render(ms, mouseX, mouseY, partialTicks); + showLinesButton.setX(left + 163); + showLinesButton.setY(top + 41); + showLinesButton.render(guiGraphics, mouseX, mouseY, partialTicks); //draw show areas button - showAreasButton.x = left + 183; - showAreasButton.y = top + 41; - showAreasButton.render(ms, mouseX, mouseY, partialTicks); + showAreasButton.setX(left + 183); + showAreasButton.setY(top + 41); + showAreasButton.render(guiGraphics, mouseX, mouseY, partialTicks); } @Override diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/elements/GuiCheckBoxFixed.java b/src/main/java/nl/requios/effortlessbuilding/gui/elements/GuiCheckBoxFixed.java index 917b58d..3ed6b88 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/elements/GuiCheckBoxFixed.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/elements/GuiCheckBoxFixed.java @@ -1,8 +1,11 @@ package nl.requios.effortlessbuilding.gui.elements; -import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.Button; +import net.minecraft.client.renderer.GameRenderer; import net.minecraft.network.chat.Component; import net.minecraftforge.client.gui.ScreenUtils; @@ -18,7 +21,7 @@ public class GuiCheckBoxFixed extends Button { public GuiCheckBoxFixed(int xPos, int yPos, String displayString, boolean isChecked) { super(xPos, yPos, Minecraft.getInstance().font.width(displayString) + 2 + 11, 11, Component.literal(displayString), b -> { - }); + }, DEFAULT_NARRATION); this.isChecked = isChecked; this.boxWidth = 11; this.height = 11; @@ -26,25 +29,25 @@ public class GuiCheckBoxFixed extends Button { } @Override - public void renderButton(PoseStack ms, int mouseX, int mouseY, float partial) { - if (this.visible) { - Minecraft mc = Minecraft.getInstance(); - this.isHovered = mouseX >= this.x && mouseY >= this.y && mouseX < this.x + this.boxWidth && mouseY < this.y + this.height; - ScreenUtils.blitWithBorder(ms, WIDGETS_LOCATION, this.x, this.y, 0, 46, this.boxWidth, this.height, 200, 20, 2, 3, 2, 2, this.getBlitOffset()); - this.renderBg(ms, mc, mouseX, mouseY); - int color = 14737632; + public void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float partial) { + RenderSystem.setShader(GameRenderer::getPositionTexShader); + RenderSystem.setShaderTexture(0, WIDGETS_LOCATION); + //Is deprecated but still works + ScreenUtils.blitWithBorder(guiGraphics, this.getX(), this.getY(), 0, 46, this.boxWidth, this.height, 200, 20, 2, 3, 2, 2, 0); + int color = 14737632; - if (packedFGColor != 0) { - color = packedFGColor; - } else if (!this.active) { - color = 10526880; - } - - if (this.isChecked) - drawCenteredString(ms, mc.font, "x", this.x + this.boxWidth / 2 + 1, this.y + 1, 14737632); - - drawString(ms, mc.font, getMessage(), this.x + this.boxWidth + 2, this.y + 2, color); + if (packedFGColor != 0) { + color = packedFGColor; + } else if (!this.active) { + color = 10526880; } + + Font font = Minecraft.getInstance().font; + + if (this.isChecked) + guiGraphics.drawCenteredString(font, "x", this.getX() + this.boxWidth / 2 + 1, this.getY() + 1, 14737632); + + guiGraphics.drawString(font, getMessage(), this.getX() + this.boxWidth + 2, this.getY() + 2, color, false); } @Override diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/elements/GuiCollapsibleScrollEntry.java b/src/main/java/nl/requios/effortlessbuilding/gui/elements/GuiCollapsibleScrollEntry.java index 6340471..7a63add 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/elements/GuiCollapsibleScrollEntry.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/elements/GuiCollapsibleScrollEntry.java @@ -1,11 +1,10 @@ package nl.requios.effortlessbuilding.gui.elements; -import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; -import net.minecraft.client.gui.components.Widget; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Renderable; import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.gui.components.AbstractWidget; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -28,7 +27,7 @@ public abstract class GuiCollapsibleScrollEntry implements GuiScrollPane.IScroll } @Override - public void init(List renderables) { + public void init(List renderables) { left = scrollPane.getWidth() / 2 - 140; right = scrollPane.getWidth() / 2 + 140; top = scrollPane.getHeight() / 2 - 100; @@ -40,7 +39,7 @@ public abstract class GuiCollapsibleScrollEntry implements GuiScrollPane.IScroll } @Override - public void drawTooltip(PoseStack ms, Screen guiScreen, int mouseX, int mouseY) { + public void drawTooltip(GuiGraphics guiGraphics, Screen guiScreen, int mouseX, int mouseY) { } @Override diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/elements/GuiIconButton.java b/src/main/java/nl/requios/effortlessbuilding/gui/elements/GuiIconButton.java index 1a47a6b..9cf44ed 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/elements/GuiIconButton.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/elements/GuiIconButton.java @@ -1,7 +1,6 @@ package nl.requios.effortlessbuilding.gui.elements; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.components.Button; import net.minecraft.resources.ResourceLocation; @@ -28,7 +27,7 @@ public class GuiIconButton extends Button { } public GuiIconButton(int x, int y, int width, int height, int iconX, int iconY, int iconWidth, int iconHeight, int iconAltX, int iconAltY, ResourceLocation resourceLocation, Button.OnPress onPress) { - super(x, y, width, height, Component.empty(), onPress); + super(x, y, width, height, Component.empty(), onPress, DEFAULT_NARRATION); this.iconX = iconX; this.iconY = iconY; this.iconWidth = iconWidth; @@ -51,29 +50,24 @@ public class GuiIconButton extends Button { } @Override - public void render(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - super.render(ms, mouseX, mouseY, partialTicks); - if (this.visible) { - this.isHovered = mouseX >= this.x && mouseY >= this.y && mouseX < this.x + this.width && mouseY < this.y + this.height; - RenderSystem.setShaderTexture(0, this.resourceLocation); - int currentIconX = this.iconX; - int currentIconY = this.iconY; + public void renderWidget(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTicks) { + int currentIconX = this.iconX; + int currentIconY = this.iconY; - if (useAltIcon) { - currentIconX += iconAltX; - currentIconY += iconAltY; - } - - //Draws a textured rectangle at the current z-value. Used to be drawTexturedModalRect in Gui. - this.blit(ms, this.x, this.y, currentIconX, currentIconY, this.iconWidth, this.iconHeight); + if (useAltIcon) { + currentIconX += iconAltX; + currentIconY += iconAltY; } + + //Draws a textured rectangle at the current z-value. Used to be drawTexturedModalRect in Gui. + guiGraphics.blit(resourceLocation, this.getX(), this.getY(), currentIconX, currentIconY, this.iconWidth, this.iconHeight); } - public void drawTooltip(PoseStack ms, Screen screen, int mouseX, int mouseY) { - boolean flag = mouseX >= x && mouseX < x + width && mouseY >= y && mouseY < y + height; + public void drawTooltip(GuiGraphics guiGraphics, Screen screen, int mouseX, int mouseY) { + boolean flag = mouseX >= getX() && mouseX < getX() + width && mouseY >= getY() && mouseY < getY() + height; if (flag) { - screen.renderComponentTooltip(ms, tooltip, mouseX - 10, mouseY + 25); + guiGraphics.renderComponentTooltip(screen.getMinecraft().font, tooltip, mouseX - 10, mouseY + 25); } } } diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/elements/GuiNumberField.java b/src/main/java/nl/requios/effortlessbuilding/gui/elements/GuiNumberField.java index df500ae..986d2a6 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/elements/GuiNumberField.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/elements/GuiNumberField.java @@ -1,20 +1,18 @@ package nl.requios.effortlessbuilding.gui.elements; -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.client.gui.GuiComponent; -import net.minecraft.client.gui.Font; -import net.minecraft.client.gui.components.Widget; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.gui.components.EditBox; -import net.minecraft.client.gui.components.Button; -import net.minecraft.network.chat.Component; import net.minecraft.ChatFormatting; +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.components.Renderable; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import javax.annotation.ParametersAreNonnullByDefault; -import java.awt.*; import java.text.DecimalFormat; import java.text.ParseException; import java.util.ArrayList; @@ -24,7 +22,7 @@ import java.util.List; @OnlyIn(Dist.CLIENT) @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class GuiNumberField extends GuiComponent { +public class GuiNumberField { public int x, y, width, height; public int buttonWidth = 10; @@ -34,27 +32,27 @@ public class GuiNumberField extends GuiComponent { List tooltip = new ArrayList<>(); - public GuiNumberField(Font font, List renderables, int x, int y, int width, int height) { + public GuiNumberField(Font font, List renderables, int x, int y, int width, int height) { this.x = x; this.y = y; this.width = width; this.height = height; textField = new EditBox(font, x + buttonWidth + 1, y + 1, width - 2 * buttonWidth - 2, height - 2, Component.empty()); - minusButton = new Button(x, y - 1, buttonWidth, height + 2, Component.literal("-"), button -> { + minusButton = Button.builder(Component.literal("-"), button -> { float valueChanged = 1f; if (Screen.hasControlDown()) valueChanged = 5f; if (Screen.hasShiftDown()) valueChanged = 10f; setNumber(getNumber() - valueChanged); - }); - plusButton = new Button(x + width - buttonWidth, y - 1, buttonWidth, height + 2, Component.literal("+"), button -> { + }).bounds(x, y - 1, buttonWidth, height + 2).build(); + plusButton = Button.builder(Component.literal("+"), button -> { float valueChanged = 1f; if (Screen.hasControlDown()) valueChanged = 5f; if (Screen.hasShiftDown()) valueChanged = 10f; setNumber(getNumber() + valueChanged); - }); + }).bounds(x + width - buttonWidth, y - 1, buttonWidth, height + 2).build(); renderables.add(minusButton); renderables.add(plusButton); @@ -90,24 +88,24 @@ public class GuiNumberField extends GuiComponent { //Rightclicked inside textfield if (flag && mouseButton == 1) { textField.setValue(""); - textField.setFocus(true); + textField.setFocused(true); result = true; } return result; } - public void drawNumberField(PoseStack ms, int mouseX, int mouseY, float partialTicks) { - textField.y = y + 1; - minusButton.y = y - 1; - plusButton.y = y - 1; + public void drawNumberField(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + textField.setY(y + 1); + minusButton.setY(y - 1); + plusButton.setY(y - 1); - textField.render(ms, mouseX, mouseY, partialTicks); - minusButton.render(ms, mouseX, mouseY, partialTicks); - plusButton.render(ms, mouseX, mouseY, partialTicks); + textField.render(graphics, mouseX, mouseY, partialTicks); + minusButton.render(graphics, mouseX, mouseY, partialTicks); + plusButton.render(graphics, mouseX, mouseY, partialTicks); } - public void drawTooltip(PoseStack ms, Screen screen, int mouseX, int mouseY) { + public void drawTooltip(GuiGraphics graphics, Screen screen, int mouseX, int mouseY) { boolean insideTextField = mouseX >= x + buttonWidth && mouseX < x + width - buttonWidth && mouseY >= y && mouseY < y + height; boolean insideMinusButton = mouseX >= x && mouseX < x + buttonWidth && mouseY >= y && mouseY < y + height; boolean insidePlusButton = mouseX >= x + width - buttonWidth && mouseX < x + width && mouseY >= y && mouseY < y + height; @@ -135,8 +133,7 @@ public class GuiNumberField extends GuiComponent { textLines.add(Component.literal("Hold ").append(Component.literal("ctrl ").withStyle(ChatFormatting.DARK_GREEN)).append("for ") .append(Component.literal("5").withStyle(ChatFormatting.RED))); } - - screen.renderComponentTooltip(ms, textLines, mouseX - 10, mouseY + 25); + graphics.renderComponentTooltip(screen.getMinecraft().font, textLines, mouseX - 10, mouseY + 25); } diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/elements/GuiScrollPane.java b/src/main/java/nl/requios/effortlessbuilding/gui/elements/GuiScrollPane.java index 465360f..30e5921 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/elements/GuiScrollPane.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/elements/GuiScrollPane.java @@ -6,10 +6,10 @@ import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; -import net.minecraft.client.gui.components.Widget; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Renderable; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.util.Mth; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -72,7 +72,7 @@ public class GuiScrollPane extends SlotGui { //Removed background @Override - public void render(PoseStack ms, int mouseXIn, int mouseYIn, float partialTicks) { + public void render(GuiGraphics guiGraphics, int mouseXIn, int mouseYIn, float partialTicks) { if (this.visible) { this.mouseX = mouseXIn; this.mouseY = mouseYIn; @@ -91,7 +91,7 @@ public class GuiScrollPane extends SlotGui { } //All entries - this.renderList(ms, insideLeft, insideTop, mouseXIn, mouseYIn, partialTicks); + this.renderList(guiGraphics, insideLeft, insideTop, mouseXIn, mouseYIn, partialTicks); RenderSystem.disableDepthTest(); //Dirt overlays on top and bottom @@ -100,7 +100,6 @@ public class GuiScrollPane extends SlotGui { RenderSystem.enableBlend(); RenderSystem.blendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ZERO, GlStateManager.DestFactor.ONE); - RenderSystem.disableTexture(); //top // bufferbuilder.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR); @@ -149,7 +148,6 @@ public class GuiScrollPane extends SlotGui { } //this.renderDecorations(mouseXIn, mouseYIn); - RenderSystem.enableTexture(); RenderSystem.disableBlend(); } } @@ -172,8 +170,8 @@ public class GuiScrollPane extends SlotGui { } @Override - protected void renderItem(PoseStack ms, int slotIndex, int xPos, int yPos, int heightIn, int mouseXIn, int mouseYIn, float partialTicks) { - this.getListEntry(slotIndex).drawEntry(ms, slotIndex, xPos, yPos, this.getRowWidth(), heightIn, mouseXIn, mouseYIn, + protected void renderItem(GuiGraphics guiGraphics, int slotIndex, int xPos, int yPos, int heightIn, int mouseXIn, int mouseYIn, float partialTicks) { + this.getListEntry(slotIndex).drawEntry(guiGraphics, slotIndex, xPos, yPos, this.getRowWidth(), heightIn, mouseXIn, mouseYIn, this.getSlotIndexFromScreenCoords(mouseXIn, mouseYIn) == slotIndex, partialTicks); } @@ -326,7 +324,7 @@ public class GuiScrollPane extends SlotGui { //Draw in center if it fits @Override - protected void renderList(PoseStack ms, int insideLeft, int insideTop, int mouseXIn, int mouseYIn, float partialTicks) { + protected void renderList(GuiGraphics guiGraphics, int insideLeft, int insideTop, int mouseXIn, int mouseYIn, float partialTicks) { int itemCount = this.getItemCount(); Tesselator tessellator = Tesselator.getInstance(); BufferBuilder bufferbuilder = tessellator.getBuilder(); @@ -353,7 +351,6 @@ public class GuiScrollPane extends SlotGui { if (this.renderSelection && this.isSelectedItem(i)) { int i1 = this.x0 + this.width / 2 - this.getRowWidth() / 2; int j1 = this.x0 + this.width / 2 + this.getRowWidth() / 2; - RenderSystem.disableTexture(); float f = this.isFocused() ? 1.0F : 0.5F; RenderSystem.setShaderColor(f, f, f, 1.0F); bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION); @@ -369,10 +366,9 @@ public class GuiScrollPane extends SlotGui { bufferbuilder.vertex(j1 - 1, y - 1, 0.0D).endVertex(); bufferbuilder.vertex(i1 + 1, y - 1, 0.0D).endVertex(); tessellator.end(); - RenderSystem.enableTexture(); } - this.renderItem(ms, i, insideLeft, y, entryHeight2, mouseXIn, mouseYIn, partialTicks); + this.renderItem(guiGraphics, i, insideLeft, y, entryHeight2, mouseXIn, mouseYIn, partialTicks); y += entryHeight; } } @@ -398,7 +394,7 @@ public class GuiScrollPane extends SlotGui { } //PASSTHROUGHS - public void init(List renderables) { + public void init(List renderables) { for (IScrollEntry entry : this.listEntries) { entry.init(renderables); } @@ -409,9 +405,9 @@ public class GuiScrollPane extends SlotGui { entry.updateScreen(); } - public void drawTooltip(PoseStack ms, Screen guiScreen, int mouseX, int mouseY) { + public void drawTooltip(GuiGraphics guiGraphics, Screen guiScreen, int mouseX, int mouseY) { for (IScrollEntry entry : this.listEntries) - entry.drawTooltip(ms, guiScreen, mouseX, mouseY); + entry.drawTooltip(guiGraphics, guiScreen, mouseX, mouseY); } @Override @@ -436,11 +432,11 @@ public class GuiScrollPane extends SlotGui { } public interface IScrollEntry { - void init(List renderables); + void init(List renderables); void updateScreen(); - void drawTooltip(PoseStack ms, Screen guiScreen, int mouseX, int mouseY); + void drawTooltip(GuiGraphics guiGraphics, Screen guiScreen, int mouseX, int mouseY); boolean charTyped(char eventChar, int eventKey); @@ -450,7 +446,7 @@ public class GuiScrollPane extends SlotGui { void updatePosition(int slotIndex, int x, int y, float partialTicks); - void drawEntry(PoseStack ms, int slotIndex, int x, int y, int listWidth, int slotHeight, int mouseX, int mouseY, boolean isSelected, float partialTicks); + void drawEntry(GuiGraphics guiGraphics, int slotIndex, int x, int y, int listWidth, int slotHeight, int mouseX, int mouseY, boolean isSelected, float partialTicks); /** * Called when the mouse is clicked within this entry. Returning true means that something within this entry was diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/elements/LabeledScrollInput.java b/src/main/java/nl/requios/effortlessbuilding/gui/elements/LabeledScrollInput.java index 3fbaf2d..e1ef346 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/elements/LabeledScrollInput.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/elements/LabeledScrollInput.java @@ -1,8 +1,8 @@ package nl.requios.effortlessbuilding.gui.elements; -import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; import nl.requios.effortlessbuilding.create.foundation.gui.widget.Label; import nl.requios.effortlessbuilding.create.foundation.gui.widget.ScrollInput; @@ -28,14 +28,15 @@ public class LabeledScrollInput extends ScrollInput { controlScrollsSlower = true; return this; } - + + //TODO: Check if this works @Override - public void renderButton(@NotNull PoseStack ms, int mouseX, int mouseY, float partialTicks) { - super.renderButton(ms, mouseX, mouseY, partialTicks); - - label.x = x + width / 2 - Minecraft.getInstance().font.width(label.text) / 2; - label.y = y + height / 2 - Minecraft.getInstance().font.lineHeight / 2; - label.renderButton(ms, mouseX, mouseY, partialTicks); + public void render(@NotNull GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTicks) { + super.render(guiGraphics, mouseX, mouseY, partialTicks); + + label.setX(getX() + width / 2 - Minecraft.getInstance().font.width(label.text) / 2); + label.setY(getY() + height / 2 - Minecraft.getInstance().font.lineHeight / 2); + label.render(guiGraphics, mouseX, mouseY, partialTicks); } @Override diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/elements/SlotGui.java b/src/main/java/nl/requios/effortlessbuilding/gui/elements/SlotGui.java index 21fdc32..ec7b0f2 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/elements/SlotGui.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/elements/SlotGui.java @@ -1,12 +1,17 @@ package nl.requios.effortlessbuilding.gui.elements; -import com.mojang.blaze3d.vertex.*; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.components.Renderable; import net.minecraft.client.gui.components.events.AbstractContainerEventHandler; import net.minecraft.client.gui.components.events.GuiEventListener; -import net.minecraft.client.gui.components.Widget; +import net.minecraft.client.renderer.GameRenderer; import net.minecraft.util.Mth; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -18,7 +23,7 @@ import java.util.List; @OnlyIn(Dist.CLIENT) @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public abstract class SlotGui extends AbstractContainerEventHandler implements Widget { +public abstract class SlotGui extends AbstractContainerEventHandler implements Renderable { protected final Minecraft minecraft; protected final int itemHeight; protected int width; @@ -71,7 +76,7 @@ public abstract class SlotGui extends AbstractContainerEventHandler implements W protected void updateItemPosition(int p_updateItemPosition_1_, int p_updateItemPosition_2_, int p_updateItemPosition_3_, float p_updateItemPosition_4_) { } - protected abstract void renderItem(PoseStack ms, int p_renderItem_1_, int p_renderItem_2_, int p_renderItem_3_, int p_renderItem_4_, int p_renderItem_5_, int p_renderItem_6_, float p_renderItem_7_); + protected abstract void renderItem(GuiGraphics guiGraphics, int p_renderItem_1_, int p_renderItem_2_, int p_renderItem_3_, int p_renderItem_4_, int p_renderItem_5_, int p_renderItem_6_, float p_renderItem_7_); protected void renderHeader(int p_renderHeader_1_, int p_renderHeader_2_, Tesselator p_renderHeader_3_) { } @@ -103,7 +108,7 @@ public abstract class SlotGui extends AbstractContainerEventHandler implements W return p_isMouseInList_3_ >= (double) this.y0 && p_isMouseInList_3_ <= (double) this.y1 && p_isMouseInList_1_ >= (double) this.x0 && p_isMouseInList_1_ <= (double) this.x1; } - public abstract void render(PoseStack ms, int p_render_1_, int p_render_2_, float p_render_3_); + public abstract void render(GuiGraphics guiGraphics, int p_render_1_, int p_render_2_, float p_render_3_); protected void updateScrollingState(double p_updateScrollingState_1_, double p_updateScrollingState_3_, int p_updateScrollingState_5_) { this.scrolling = p_updateScrollingState_5_ == 0 && p_updateScrollingState_1_ >= (double) this.getScrollbarPosition() && p_updateScrollingState_1_ < (double) (this.getScrollbarPosition() + 6); @@ -210,7 +215,7 @@ public abstract class SlotGui extends AbstractContainerEventHandler implements W return 220; } - protected void renderList(PoseStack ms, int p_renderList_1_, int p_renderList_2_, int p_renderList_3_, int p_renderList_4_, float p_renderList_5_) { + protected void renderList(GuiGraphics guiGraphics, int p_renderList_1_, int p_renderList_2_, int p_renderList_3_, int p_renderList_4_, float p_renderList_5_) { int i = this.getItemCount(); Tesselator tessellator = Tesselator.getInstance(); BufferBuilder bufferbuilder = tessellator.getBuilder(); @@ -225,7 +230,7 @@ public abstract class SlotGui extends AbstractContainerEventHandler implements W if (this.renderSelection && this.isSelectedItem(j)) { int i1 = this.x0 + this.width / 2 - this.getRowWidth() / 2; int j1 = this.x0 + this.width / 2 + this.getRowWidth() / 2; - RenderSystem.disableTexture(); + RenderSystem.setShader(GameRenderer::getPositionShader); float f = this.isFocused() ? 1.0F : 0.5F; RenderSystem.setShaderColor(f, f, f, 1.0F); bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION); @@ -241,15 +246,15 @@ public abstract class SlotGui extends AbstractContainerEventHandler implements W bufferbuilder.vertex(j1 - 1, k - 1, 0.0D).endVertex(); bufferbuilder.vertex(i1 + 1, k - 1, 0.0D).endVertex(); tessellator.end(); - RenderSystem.enableTexture(); + RenderSystem.setShader(GameRenderer::getPositionTexShader); } - this.renderItem(ms, j, p_renderList_1_, k, l, p_renderList_3_, p_renderList_4_, p_renderList_5_); + this.renderItem(guiGraphics, j, p_renderList_1_, k, l, p_renderList_3_, p_renderList_4_, p_renderList_5_); } } - protected boolean isFocused() { + public boolean isFocused() { return false; } diff --git a/src/main/java/nl/requios/effortlessbuilding/item/AbstractRandomizerBagItem.java b/src/main/java/nl/requios/effortlessbuilding/item/AbstractRandomizerBagItem.java index c647cde..59937de 100644 --- a/src/main/java/nl/requios/effortlessbuilding/item/AbstractRandomizerBagItem.java +++ b/src/main/java/nl/requios/effortlessbuilding/item/AbstractRandomizerBagItem.java @@ -1,46 +1,43 @@ package nl.requios.effortlessbuilding.item; +import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.MenuProvider; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.entity.player.Player; -import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.MenuProvider; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.InteractionResultHolder; -import net.minecraft.world.InteractionResult; -import net.minecraft.core.Direction; -import net.minecraft.world.InteractionHand; -import net.minecraft.core.BlockPos; import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; -import net.minecraft.network.chat.Component; -import net.minecraft.ChatFormatting; -import net.minecraft.world.level.Level; -import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.common.capabilities.ICapabilityProvider; -import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.network.NetworkHooks; -import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.network.NetworkHooks; import nl.requios.effortlessbuilding.EffortlessBuilding; -import nl.requios.effortlessbuilding.network.PacketHandler; import nl.requios.effortlessbuilding.systems.ServerBuildState; import nl.requios.effortlessbuilding.utilities.BlockEntry; import nl.requios.effortlessbuilding.utilities.BlockSet; -import nl.requios.effortlessbuilding.utilities.SurvivalHelper; import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; -import java.util.*; - -import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.item.context.UseOnContext; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; +import java.util.Random; @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault @@ -50,7 +47,7 @@ public abstract class AbstractRandomizerBagItem extends Item { private static final Random rand = new Random(currentSeed); public AbstractRandomizerBagItem() { - super(new Item.Properties().tab(CreativeModeTab.TAB_TOOLS).stacksTo(1)); + super(new Item.Properties().stacksTo(1)); } public abstract int getInventorySize(); @@ -61,7 +58,7 @@ public abstract class AbstractRandomizerBagItem extends Item { * Get the inventory of a randomizer bag by checking the capability. */ public IItemHandler getBagInventory(ItemStack bag) { - return bag.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null).orElse(null); + return bag.getCapability(ForgeCapabilities.ITEM_HANDLER, null).orElse(null); } /** diff --git a/src/main/java/nl/requios/effortlessbuilding/item/ItemHandlerCapabilityProvider.java b/src/main/java/nl/requios/effortlessbuilding/item/ItemHandlerCapabilityProvider.java index 6d99aa9..c967780 100644 --- a/src/main/java/nl/requios/effortlessbuilding/item/ItemHandlerCapabilityProvider.java +++ b/src/main/java/nl/requios/effortlessbuilding/item/ItemHandlerCapabilityProvider.java @@ -3,9 +3,9 @@ package nl.requios.effortlessbuilding.item; import net.minecraft.nbt.CompoundTag; import net.minecraft.core.Direction; import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.common.capabilities.ICapabilitySerializable; import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemStackHandler; @@ -22,7 +22,7 @@ public class ItemHandlerCapabilityProvider implements ICapabilitySerializable LazyOptional getCapability(@Nonnull Capability cap, @Nullable Direction side) { - return CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.orEmpty(cap, LazyOptional.of(() -> itemHandler)); + return ForgeCapabilities.ITEM_HANDLER.orEmpty(cap, LazyOptional.of(() -> itemHandler)); } @Override diff --git a/src/main/java/nl/requios/effortlessbuilding/item/PowerLevelItem.java b/src/main/java/nl/requios/effortlessbuilding/item/PowerLevelItem.java index b1fe242..d507c3c 100644 --- a/src/main/java/nl/requios/effortlessbuilding/item/PowerLevelItem.java +++ b/src/main/java/nl/requios/effortlessbuilding/item/PowerLevelItem.java @@ -8,7 +8,6 @@ import net.minecraft.sounds.SoundEvent; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; @@ -25,7 +24,7 @@ import java.util.List; @MethodsReturnNonnullByDefault public class PowerLevelItem extends Item { public PowerLevelItem() { - super(new Item.Properties().tab(CreativeModeTab.TAB_TOOLS)); + super(new Item.Properties()); } @Override @@ -39,7 +38,7 @@ public class PowerLevelItem extends Item { EffortlessBuilding.log(player, "Upgraded power level to " + EffortlessBuildingClient.POWER_LEVEL.getPowerLevel()); player.setItemInHand(hand, ItemStack.EMPTY); - SoundEvent soundEvent = new SoundEvent(new ResourceLocation("entity.player.levelup")); + SoundEvent soundEvent = SoundEvent.createVariableRangeEvent(new ResourceLocation("entity.player.levelup")); player.playSound(soundEvent, 1f, 1f); return InteractionResultHolder.consume(player.getItemInHand(hand)); @@ -48,7 +47,7 @@ public class PowerLevelItem extends Item { EffortlessBuilding.log(player, "Already reached maximum power level!"); - SoundEvent soundEvent = new SoundEvent(new ResourceLocation("item.armor.equip_leather")); + SoundEvent soundEvent = SoundEvent.createVariableRangeEvent(new ResourceLocation("item.armor.equip_leather")); player.playSound(soundEvent, 1f, 1f); return InteractionResultHolder.fail(player.getItemInHand(hand)); diff --git a/src/main/java/nl/requios/effortlessbuilding/item/ReachUpgrade1Item.java b/src/main/java/nl/requios/effortlessbuilding/item/ReachUpgrade1Item.java index d19ec9e..dfbdd9d 100644 --- a/src/main/java/nl/requios/effortlessbuilding/item/ReachUpgrade1Item.java +++ b/src/main/java/nl/requios/effortlessbuilding/item/ReachUpgrade1Item.java @@ -1,13 +1,16 @@ package nl.requios.effortlessbuilding.item; +import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.world.item.TooltipFlag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; -import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.ItemStack; -import net.minecraft.network.chat.Component; -import net.minecraft.ChatFormatting; +import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import nl.requios.effortlessbuilding.CommonConfig; import nl.requios.effortlessbuilding.EffortlessBuilding; @@ -17,17 +20,12 @@ import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; import java.util.List; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResultHolder; - @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class ReachUpgrade1Item extends Item { public ReachUpgrade1Item() { - super(new Item.Properties().tab(CreativeModeTab.TAB_TOOLS).stacksTo(1)); + super(new Item.Properties().stacksTo(1)); } @Override @@ -42,7 +40,7 @@ public class ReachUpgrade1Item extends Item { EffortlessBuilding.log(player, "Upgraded power level to " + EffortlessBuildingClient.POWER_LEVEL.getPowerLevel()); player.setItemInHand(hand, ItemStack.EMPTY); - SoundEvent soundEvent = new SoundEvent(new ResourceLocation("entity.player.levelup")); + SoundEvent soundEvent = SoundEvent.createVariableRangeEvent(new ResourceLocation("entity.player.levelup")); player.playSound(soundEvent, 1f, 1f); return InteractionResultHolder.consume(player.getItemInHand(hand)); @@ -51,7 +49,7 @@ public class ReachUpgrade1Item extends Item { EffortlessBuilding.log(player, "Already used this upgrade! Current power level is " + EffortlessBuildingClient.POWER_LEVEL.getPowerLevel() + "."); - SoundEvent soundEvent = new SoundEvent(new ResourceLocation("item.armor.equip_leather")); + SoundEvent soundEvent = SoundEvent.createVariableRangeEvent(new ResourceLocation("item.armor.equip_leather")); player.playSound(soundEvent, 1f, 1f); } diff --git a/src/main/java/nl/requios/effortlessbuilding/item/ReachUpgrade2Item.java b/src/main/java/nl/requios/effortlessbuilding/item/ReachUpgrade2Item.java index 7f4352a..1233733 100644 --- a/src/main/java/nl/requios/effortlessbuilding/item/ReachUpgrade2Item.java +++ b/src/main/java/nl/requios/effortlessbuilding/item/ReachUpgrade2Item.java @@ -1,13 +1,16 @@ package nl.requios.effortlessbuilding.item; +import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.world.item.TooltipFlag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; -import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.ItemStack; -import net.minecraft.network.chat.Component; -import net.minecraft.ChatFormatting; +import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import nl.requios.effortlessbuilding.CommonConfig; import nl.requios.effortlessbuilding.EffortlessBuilding; @@ -17,18 +20,12 @@ import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; import java.util.List; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.InteractionResultHolder; - @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class ReachUpgrade2Item extends Item { public ReachUpgrade2Item() { - super(new Item.Properties().tab(CreativeModeTab.TAB_TOOLS).stacksTo(1)); + super(new Item.Properties().stacksTo(1)); } @Override @@ -43,7 +40,7 @@ public class ReachUpgrade2Item extends Item { EffortlessBuilding.log(player, "Upgraded power level to " + EffortlessBuildingClient.POWER_LEVEL.getPowerLevel()); player.setItemInHand(hand, ItemStack.EMPTY); - SoundEvent soundEvent = new SoundEvent(new ResourceLocation("entity.player.levelup")); + SoundEvent soundEvent = SoundEvent.createVariableRangeEvent(new ResourceLocation("entity.player.levelup")); player.playSound(soundEvent, 1f, 1f); return InteractionResultHolder.consume(player.getItemInHand(hand)); @@ -52,7 +49,7 @@ public class ReachUpgrade2Item extends Item { EffortlessBuilding.log(player, "Use Reach Upgrade 1 first."); - SoundEvent soundEvent = new SoundEvent(new ResourceLocation("item.armor.equip_leather")); + SoundEvent soundEvent = SoundEvent.createVariableRangeEvent(new ResourceLocation("item.armor.equip_leather")); player.playSound(soundEvent, 1f, 1f); @@ -60,7 +57,7 @@ public class ReachUpgrade2Item extends Item { EffortlessBuilding.log(player, "Already used this upgrade! Current power level is " + EffortlessBuildingClient.POWER_LEVEL.getPowerLevel() + "."); - SoundEvent soundEvent = new SoundEvent(new ResourceLocation("item.armor.equip_leather")); + SoundEvent soundEvent = SoundEvent.createVariableRangeEvent(new ResourceLocation("item.armor.equip_leather")); player.playSound(soundEvent, 1f, 1f); } diff --git a/src/main/java/nl/requios/effortlessbuilding/item/ReachUpgrade3Item.java b/src/main/java/nl/requios/effortlessbuilding/item/ReachUpgrade3Item.java index c55ed69..96da044 100644 --- a/src/main/java/nl/requios/effortlessbuilding/item/ReachUpgrade3Item.java +++ b/src/main/java/nl/requios/effortlessbuilding/item/ReachUpgrade3Item.java @@ -1,13 +1,16 @@ package nl.requios.effortlessbuilding.item; +import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.world.item.TooltipFlag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; -import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.ItemStack; -import net.minecraft.network.chat.Component; -import net.minecraft.ChatFormatting; +import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import nl.requios.effortlessbuilding.CommonConfig; import nl.requios.effortlessbuilding.EffortlessBuilding; @@ -17,18 +20,12 @@ import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; import java.util.List; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.InteractionResultHolder; - @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class ReachUpgrade3Item extends Item { public ReachUpgrade3Item() { - super(new Item.Properties().tab(CreativeModeTab.TAB_TOOLS).stacksTo(1)); + super(new Item.Properties().stacksTo(1)); } @Override @@ -43,7 +40,7 @@ public class ReachUpgrade3Item extends Item { EffortlessBuilding.log(player, "Upgraded power level to " + EffortlessBuildingClient.POWER_LEVEL.getPowerLevel()); player.setItemInHand(hand, ItemStack.EMPTY); - SoundEvent soundEvent = new SoundEvent(new ResourceLocation("entity.player.levelup")); + SoundEvent soundEvent = SoundEvent.createVariableRangeEvent(new ResourceLocation("entity.player.levelup")); player.playSound(soundEvent, 1f, 1f); return InteractionResultHolder.consume(player.getItemInHand(hand)); @@ -53,7 +50,7 @@ public class ReachUpgrade3Item extends Item { if (currentLevel == 0) EffortlessBuilding.log(player, "Use Reach Upgrade 1 and 2 first."); if (currentLevel == 1) EffortlessBuilding.log(player, "Use Reach Upgrade 2 first."); - SoundEvent soundEvent = new SoundEvent(new ResourceLocation("item.armor.equip_leather")); + SoundEvent soundEvent = SoundEvent.createVariableRangeEvent(new ResourceLocation("item.armor.equip_leather")); player.playSound(soundEvent, 1f, 1f); @@ -61,7 +58,7 @@ public class ReachUpgrade3Item extends Item { EffortlessBuilding.log(player, "Already used this upgrade! Current power level is " + EffortlessBuildingClient.POWER_LEVEL.getPowerLevel() + "."); - SoundEvent soundEvent = new SoundEvent(new ResourceLocation("item.armor.equip_leather")); + SoundEvent soundEvent = SoundEvent.createVariableRangeEvent(new ResourceLocation("item.armor.equip_leather")); player.playSound(soundEvent, 1f, 1f); } diff --git a/src/main/java/nl/requios/effortlessbuilding/network/IsQuickReplacingPacket.java b/src/main/java/nl/requios/effortlessbuilding/network/IsQuickReplacingPacket.java index aa1dc0e..fcd65f1 100644 --- a/src/main/java/nl/requios/effortlessbuilding/network/IsQuickReplacingPacket.java +++ b/src/main/java/nl/requios/effortlessbuilding/network/IsQuickReplacingPacket.java @@ -2,7 +2,6 @@ package nl.requios.effortlessbuilding.network; import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.network.NetworkEvent; -import nl.requios.effortlessbuilding.create.foundation.networking.SimplePacketBase; import nl.requios.effortlessbuilding.systems.ServerBuildState; import java.util.function.Supplier; diff --git a/src/main/java/nl/requios/effortlessbuilding/network/ModifierSettingsPacket.java b/src/main/java/nl/requios/effortlessbuilding/network/ModifierSettingsPacket.java index f461db0..4548ca7 100644 --- a/src/main/java/nl/requios/effortlessbuilding/network/ModifierSettingsPacket.java +++ b/src/main/java/nl/requios/effortlessbuilding/network/ModifierSettingsPacket.java @@ -1,19 +1,12 @@ package nl.requios.effortlessbuilding.network; import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.Tag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.entity.player.Player; import net.minecraftforge.network.NetworkEvent; import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuildingClient; -import nl.requios.effortlessbuilding.buildmodifier.Array; -import nl.requios.effortlessbuilding.buildmodifier.BaseModifier; -import nl.requios.effortlessbuilding.buildmodifier.Mirror; -import nl.requios.effortlessbuilding.buildmodifier.RadialMirror; -import nl.requios.effortlessbuilding.create.foundation.utility.NBTHelper; -import java.util.List; import java.util.function.Supplier; /** diff --git a/src/main/java/nl/requios/effortlessbuilding/network/PerformRedoPacket.java b/src/main/java/nl/requios/effortlessbuilding/network/PerformRedoPacket.java index f0a4b91..f7f64bb 100644 --- a/src/main/java/nl/requios/effortlessbuilding/network/PerformRedoPacket.java +++ b/src/main/java/nl/requios/effortlessbuilding/network/PerformRedoPacket.java @@ -3,7 +3,6 @@ package nl.requios.effortlessbuilding.network; import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.network.NetworkEvent; import nl.requios.effortlessbuilding.EffortlessBuilding; -import nl.requios.effortlessbuilding.systems.UndoRedo; import java.util.function.Supplier; diff --git a/src/main/java/nl/requios/effortlessbuilding/network/PerformUndoPacket.java b/src/main/java/nl/requios/effortlessbuilding/network/PerformUndoPacket.java index 9d62f51..cec6892 100644 --- a/src/main/java/nl/requios/effortlessbuilding/network/PerformUndoPacket.java +++ b/src/main/java/nl/requios/effortlessbuilding/network/PerformUndoPacket.java @@ -3,7 +3,6 @@ package nl.requios.effortlessbuilding.network; import net.minecraft.network.FriendlyByteBuf; import net.minecraftforge.network.NetworkEvent; import nl.requios.effortlessbuilding.EffortlessBuilding; -import nl.requios.effortlessbuilding.systems.UndoRedo; import java.util.function.Supplier; diff --git a/src/main/java/nl/requios/effortlessbuilding/network/ServerBreakBlocksPacket.java b/src/main/java/nl/requios/effortlessbuilding/network/ServerBreakBlocksPacket.java index 4a30530..148d86b 100644 --- a/src/main/java/nl/requios/effortlessbuilding/network/ServerBreakBlocksPacket.java +++ b/src/main/java/nl/requios/effortlessbuilding/network/ServerBreakBlocksPacket.java @@ -4,10 +4,8 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.entity.player.Player; import net.minecraftforge.network.NetworkEvent; import nl.requios.effortlessbuilding.EffortlessBuilding; -import nl.requios.effortlessbuilding.utilities.BlockEntry; import nl.requios.effortlessbuilding.utilities.BlockSet; -import java.util.List; import java.util.function.Supplier; /** diff --git a/src/main/java/nl/requios/effortlessbuilding/render/BlockPreviews.java b/src/main/java/nl/requios/effortlessbuilding/render/BlockPreviews.java index 947be04..d285500 100644 --- a/src/main/java/nl/requios/effortlessbuilding/render/BlockPreviews.java +++ b/src/main/java/nl/requios/effortlessbuilding/render/BlockPreviews.java @@ -5,7 +5,6 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; import net.minecraft.world.phys.AABB; -import net.minecraft.world.phys.HitResult; import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -21,7 +20,6 @@ import nl.requios.effortlessbuilding.utilities.BlockSet; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; @OnlyIn(Dist.CLIENT) public class BlockPreviews { @@ -148,10 +146,10 @@ public class BlockPreviews { if (EffortlessBuildingClient.BUILDER_CHAIN.getLookingAtNear() != null) return; AABB aabb = new AABB(pos); - if (player.level.isLoaded(pos)) { - var blockState = player.level.getBlockState(pos); + if (player.level().isLoaded(pos)) { + var blockState = player.level().getBlockState(pos); if (!blockState.isAir()) { - aabb = blockState.getShape(player.level, pos).bounds().move(pos); + aabb = blockState.getShape(player.level(), pos).bounds().move(pos); } } diff --git a/src/main/java/nl/requios/effortlessbuilding/render/ModifierRenderer.java b/src/main/java/nl/requios/effortlessbuilding/render/ModifierRenderer.java index 684d1d4..aba1a09 100644 --- a/src/main/java/nl/requios/effortlessbuilding/render/ModifierRenderer.java +++ b/src/main/java/nl/requios/effortlessbuilding/render/ModifierRenderer.java @@ -3,7 +3,6 @@ package nl.requios.effortlessbuilding.render; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.renderer.MultiBufferSource.BufferSource; -import com.mojang.math.Matrix4f; import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -11,6 +10,7 @@ import nl.requios.effortlessbuilding.EffortlessBuildingClient; import nl.requios.effortlessbuilding.buildmodifier.BaseModifier; import nl.requios.effortlessbuilding.buildmodifier.Mirror; import nl.requios.effortlessbuilding.buildmodifier.RadialMirror; +import org.joml.Matrix4f; import java.awt.*; import java.util.List; diff --git a/src/main/java/nl/requios/effortlessbuilding/render/RenderHandler.java b/src/main/java/nl/requios/effortlessbuilding/render/RenderHandler.java index c26b2c8..f9944b1 100644 --- a/src/main/java/nl/requios/effortlessbuilding/render/RenderHandler.java +++ b/src/main/java/nl/requios/effortlessbuilding/render/RenderHandler.java @@ -8,6 +8,7 @@ import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; @@ -18,7 +19,6 @@ import net.minecraftforge.client.event.RenderLevelStageEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; import nl.requios.effortlessbuilding.EffortlessBuildingClient; -import nl.requios.effortlessbuilding.create.foundation.utility.Color; import nl.requios.effortlessbuilding.systems.BuilderChain; /*** @@ -49,9 +49,9 @@ public class RenderHandler { @SubscribeEvent public static void onRenderGuiEvent(RenderGuiEvent event) { - renderSubText(event.getPoseStack()); + renderSubText(event.getGuiGraphics()); - drawStacks(event.getPoseStack()); + drawStacks(event.getGuiGraphics()); } private static final ChatFormatting highlightColor = ChatFormatting.DARK_AQUA; @@ -64,7 +64,7 @@ public class RenderHandler { normalColor + "Left-click to " + highlightColor + "break, " + normalColor + "Right-click to " + highlightColor + "cancel"); - private static void renderSubText(PoseStack ms) { + private static void renderSubText(GuiGraphics guiGraphics) { var state = EffortlessBuildingClient.BUILDER_CHAIN.getBuildingState(); if (state == BuilderChain.BuildingState.IDLE) return; @@ -74,18 +74,19 @@ public class RenderHandler { int screenHeight = Minecraft.getInstance().getWindow().getGuiScaledHeight(); var font = Minecraft.getInstance().font; + PoseStack ms = guiGraphics.pose(); ms.pushPose(); ms.translate(screenWidth / 2.0, screenHeight - 54, 0.0D); RenderSystem.enableBlend(); RenderSystem.defaultBlendFunc(); int l = font.width(text); - font.drawShadow(ms, text, (float)(-l / 2), -4.0F, 0xffffffff); + guiGraphics.drawString(font, text, (int)((float)(-l / 2)), -4, 0xffffffff, true); RenderSystem.disableBlend(); ms.popPose(); } //Draw item stacks at cursor, showing what will be used and what is missing - private static void drawStacks(PoseStack ms) { + private static void drawStacks(GuiGraphics guiGraphics) { var state = EffortlessBuildingClient.BUILDER_CHAIN.getBuildingState(); if (state != BuilderChain.BuildingState.PLACING) return; @@ -108,28 +109,29 @@ public class RenderHandler { int missing = EffortlessBuildingClient.ITEM_USAGE_TRACKER.getMissingCount(stack.getKey()); if (total - missing > 0) { - drawItemStack(ms, new ItemStack(stack.getKey(), total - missing), x + i * 20, y, false); + drawItemStack(guiGraphics, new ItemStack(stack.getKey(), total - missing), x + i * 20, y, false); i++; } if (missing > 0) { - drawItemStack(ms, new ItemStack(stack.getKey(), missing), x + i * 20, y, true); + drawItemStack(guiGraphics, new ItemStack(stack.getKey(), missing), x + i * 20, y, true); i++; } } } - private static void drawItemStack(PoseStack ms, ItemStack stack, int x, int y, boolean missing) { - Minecraft.getInstance().getItemRenderer().renderGuiItem(stack, x, y); + private static void drawItemStack(GuiGraphics guiGraphics, ItemStack stack, int x, int y, boolean missing) { + guiGraphics.renderItem(stack, x, y); //draw count text, red if missing //from ItemRenderer#renderGuiItemDecorations + PoseStack ms = guiGraphics.pose(); ms.pushPose(); Font font = Minecraft.getInstance().font; String text = String.valueOf(stack.getCount()); - ms.translate(0.0D, 0.0D, (double)(Minecraft.getInstance().getItemRenderer().blitOffset + 200.0F)); + ms.translate(0.0D, 0.0D, 200.0F); MultiBufferSource.BufferSource multibuffersource$buffersource = MultiBufferSource.immediate(Tesselator.getInstance().getBuilder()); - font.drawInBatch(text, (float)(x + 19 - 2 - font.width(text)), (float)(y + 6 + 3), missing ? ChatFormatting.RED.getColor() : ChatFormatting.WHITE.getColor(), true, ms.last().pose(), multibuffersource$buffersource, false, 0, 15728880); + font.drawInBatch(text, (float)(x + 19 - 2 - font.width(text)), (float)(y + 6 + 3), missing ? ChatFormatting.RED.getColor() : ChatFormatting.WHITE.getColor(), true, ms.last().pose(), multibuffersource$buffersource, Font.DisplayMode.NORMAL, 0, 15728880); multibuffersource$buffersource.endBatch(); ms.popPose(); } diff --git a/src/main/java/nl/requios/effortlessbuilding/systems/BuilderChain.java b/src/main/java/nl/requios/effortlessbuilding/systems/BuilderChain.java index cb3fbc7..d89e04d 100644 --- a/src/main/java/nl/requios/effortlessbuilding/systems/BuilderChain.java +++ b/src/main/java/nl/requios/effortlessbuilding/systems/BuilderChain.java @@ -88,7 +88,7 @@ public class BuilderChain { player.swing(InteractionHand.MAIN_HAND); blocks.skipFirst = buildMode == BuildModeEnum.DISABLED; - long placeTime = player.level.getGameTime(); + long placeTime = player.level().getGameTime(); if (blocks.size() > 1) placeTime += ClientConfig.visuals.appearAnimationLength.get(); PacketHandler.INSTANCE.sendToServer(new ServerPlaceBlocksPacket(blocks, placeTime)); } @@ -112,7 +112,7 @@ public class BuilderChain { blocks.setStartPos(new BlockEntry(startPosForBreaking)); EffortlessBuildingClient.BUILD_MODIFIERS.findCoordinates(blocks, player); EffortlessBuildingClient.BUILDER_FILTER.filterOnCoordinates(blocks, player); - findExistingBlockStates(player.level); + findExistingBlockStates(player.level()); EffortlessBuildingClient.BUILDER_FILTER.filterOnExistingBlockStates(blocks, player); } @@ -231,7 +231,7 @@ public class BuilderChain { //Offset in direction of sidehit if not quickreplace and not replaceable boolean shouldOffsetStartPosition = EffortlessBuildingClient.BUILD_SETTINGS.shouldOffsetStartPosition(); - boolean replaceable = player.level.getBlockState(startPos).getMaterial().isReplaceable(); + boolean replaceable = player.level().getBlockState(startPos).canBeReplaced(); boolean becomesDoubleSlab = SurvivalHelper.doesBecomeDoubleSlab(player, startPos); if (!shouldOffsetStartPosition && !replaceable && !becomesDoubleSlab) { startPos = startPos.relative(lookingAt.getDirection()); @@ -281,7 +281,7 @@ public class BuilderChain { } //Find new blockstate - blockEntry.setItemAndFindNewBlockState(itemStack, player.level, originalDirection, clickedFace, relativeHitVec); + blockEntry.setItemAndFindNewBlockState(itemStack, player.level(), originalDirection, clickedFace, relativeHitVec); //Filter on new blockstate if (EffortlessBuildingClient.BUILDER_FILTER.filterOnNewBlockState(blockEntry, player)) { @@ -320,9 +320,9 @@ public class BuilderChain { if (blocks.getLastBlockEntry() != null && blocks.getLastBlockEntry().newBlockState != null) { var lastBlockState = blocks.getLastBlockEntry().newBlockState; - SoundType soundType = lastBlockState.getBlock().getSoundType(lastBlockState, player.level, blocks.lastPos, player); + SoundType soundType = lastBlockState.getBlock().getSoundType(lastBlockState, player.level(), blocks.lastPos, player); SoundEvent soundEvent = buildingState == BuildingState.BREAKING ? soundType.getBreakSound() : soundType.getPlaceSound(); - player.level.playSound(player, player.blockPosition(), soundEvent, SoundSource.BLOCKS, 0.3f, 0.8f); + player.level().playSound(player, player.blockPosition(), soundEvent, SoundSource.BLOCKS, 0.3f, 0.8f); } } } diff --git a/src/main/java/nl/requios/effortlessbuilding/systems/BuilderFilter.java b/src/main/java/nl/requios/effortlessbuilding/systems/BuilderFilter.java index 424ed0c..3fa06d5 100644 --- a/src/main/java/nl/requios/effortlessbuilding/systems/BuilderFilter.java +++ b/src/main/java/nl/requios/effortlessbuilding/systems/BuilderFilter.java @@ -1,6 +1,5 @@ package nl.requios.effortlessbuilding.systems; -import net.minecraft.core.BlockPos; import net.minecraft.world.entity.player.Player; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -9,12 +8,11 @@ import nl.requios.effortlessbuilding.compatibility.CompatHelper; import nl.requios.effortlessbuilding.utilities.BlockEntry; import nl.requios.effortlessbuilding.utilities.BlockSet; import nl.requios.effortlessbuilding.utilities.PlaceChecker; -import nl.requios.effortlessbuilding.utilities.SurvivalHelper; @OnlyIn(Dist.CLIENT) public class BuilderFilter { public void filterOnCoordinates(BlockSet blocks, Player player) { - var world = player.level; + var world = player.level(); var iter = blocks.entrySet().iterator(); while (iter.hasNext()) { var pos = iter.next().getValue().blockPos; @@ -42,7 +40,7 @@ public class BuilderFilter { if (placing && !buildSettings.shouldReplaceFiltered()) { if (!buildSettings.shouldReplaceAir() && blockState.isAir()) remove = true; - boolean isReplaceable = blockState.getMaterial().isReplaceable(); + boolean isReplaceable = blockState.canBeReplaced(); // boolean isSolid = blockState.isRedstoneConductor(player.level, blockEntry.blockPos); if (!buildSettings.shouldReplaceBlocks() && !isReplaceable) remove = true; } @@ -78,7 +76,7 @@ public class BuilderFilter { boolean remove = false; - if (placing && !PlaceChecker.shouldPlaceBlock(player.level, blockEntry)) remove = true; + if (placing && !PlaceChecker.shouldPlaceBlock(player.level(), blockEntry)) remove = true; return remove; } diff --git a/src/main/java/nl/requios/effortlessbuilding/systems/ItemUsageTracker.java b/src/main/java/nl/requios/effortlessbuilding/systems/ItemUsageTracker.java index b7f84a8..d7dbb09 100644 --- a/src/main/java/nl/requios/effortlessbuilding/systems/ItemUsageTracker.java +++ b/src/main/java/nl/requios/effortlessbuilding/systems/ItemUsageTracker.java @@ -2,9 +2,6 @@ package nl.requios.effortlessbuilding.systems; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import nl.requios.effortlessbuilding.compatibility.CompatHelper; -import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem; import nl.requios.effortlessbuilding.utilities.InventoryHelper; import java.util.HashMap; diff --git a/src/main/java/nl/requios/effortlessbuilding/systems/ServerBlockPlacer.java b/src/main/java/nl/requios/effortlessbuilding/systems/ServerBlockPlacer.java index c4190cc..9e12779 100644 --- a/src/main/java/nl/requios/effortlessbuilding/systems/ServerBlockPlacer.java +++ b/src/main/java/nl/requios/effortlessbuilding/systems/ServerBlockPlacer.java @@ -1,14 +1,9 @@ package nl.requios.effortlessbuilding.systems; import net.minecraft.ChatFormatting; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.Level; -import net.minecraftforge.items.ItemHandlerHelper; import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.ServerConfig; -import nl.requios.effortlessbuilding.create.foundation.utility.BlockHelper; import nl.requios.effortlessbuilding.utilities.*; import java.util.*; @@ -34,7 +29,7 @@ public class ServerBlockPlacer { //Iterator to prevent concurrent modification exception for (var iterator = delayedEntries.iterator(); iterator.hasNext(); ) { DelayedEntry entry = iterator.next(); - long gameTime = entry.player.level.getGameTime(); + long gameTime = entry.player.level().getGameTime(); if (gameTime >= entry.placeTime) { applyBlockSet(entry.player, entry.blocks); iterator.remove(); @@ -104,7 +99,7 @@ public class ServerBlockPlacer { private boolean applyBlockEntry(Player player, BlockEntry block) { - block.existingBlockState = player.level.getBlockState(block.blockPos); + block.existingBlockState = player.level().getBlockState(block.blockPos); boolean breaking = BlockUtilities.isNullOrAir(block.newBlockState); if (!validateBlockEntry(player, block, breaking)) return false; @@ -139,7 +134,7 @@ public class ServerBlockPlacer { if (!validateBlockEntry(player, tempBlockEntry, breaking)) return false; //Update newBlockState for future redo's - block.newBlockState = player.level.getBlockState(block.blockPos); + block.newBlockState = player.level().getBlockState(block.blockPos); boolean success; isPlacingOrBreakingBlocks = true; @@ -236,7 +231,7 @@ public class ServerBlockPlacer { private boolean validateBlockEntry(Player player, BlockEntry block, boolean breaking) { - if (!player.level.isLoaded(block.blockPos)) return false; + if (!player.level().isLoaded(block.blockPos)) return false; if (breaking && BlockUtilities.isNullOrAir(block.existingBlockState)) return false; diff --git a/src/main/java/nl/requios/effortlessbuilding/systems/ServerBuildState.java b/src/main/java/nl/requios/effortlessbuilding/systems/ServerBuildState.java index 6206dfb..c87e35d 100644 --- a/src/main/java/nl/requios/effortlessbuilding/systems/ServerBuildState.java +++ b/src/main/java/nl/requios/effortlessbuilding/systems/ServerBuildState.java @@ -2,7 +2,6 @@ package nl.requios.effortlessbuilding.systems; import net.minecraft.world.entity.player.Player; import nl.requios.effortlessbuilding.EffortlessBuilding; -import nl.requios.effortlessbuilding.EffortlessBuildingClient; public class ServerBuildState { private static final String IS_USING_BUILD_MODE_KEY = EffortlessBuilding.MODID + ":isUsingBuildMode"; diff --git a/src/main/java/nl/requios/effortlessbuilding/systems/UndoRedo.java b/src/main/java/nl/requios/effortlessbuilding/systems/UndoRedo.java index 604e38b..24eac41 100644 --- a/src/main/java/nl/requios/effortlessbuilding/systems/UndoRedo.java +++ b/src/main/java/nl/requios/effortlessbuilding/systems/UndoRedo.java @@ -3,7 +3,6 @@ package nl.requios.effortlessbuilding.systems; import net.minecraft.ChatFormatting; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.Blocks; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; @@ -286,8 +285,8 @@ public class UndoRedo { //then anything it drops if (itemStack.isEmpty()) { //Cannot check drops on clientside because loot tables are server only - if (!player.level.isClientSide) { - List itemsDropped = Block.getDrops(blockState, (ServerLevel) player.level, BlockPos.ZERO, null); + if (!player.level().isClientSide) { + List itemsDropped = Block.getDrops(blockState, (ServerLevel) player.level(), BlockPos.ZERO, null); for (ItemStack itemStackDropped : itemsDropped) { if (itemStackDropped.getItem() instanceof BlockItem) { Block block = ((BlockItem) itemStackDropped.getItem()).getBlock(); diff --git a/src/main/java/nl/requios/effortlessbuilding/utilities/BlockEntry.java b/src/main/java/nl/requios/effortlessbuilding/utilities/BlockEntry.java index 1cb70d5..d136a89 100644 --- a/src/main/java/nl/requios/effortlessbuilding/utilities/BlockEntry.java +++ b/src/main/java/nl/requios/effortlessbuilding/utilities/BlockEntry.java @@ -2,6 +2,7 @@ package nl.requios.effortlessbuilding.utilities; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.nbt.NbtUtils; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.world.item.Item; @@ -80,7 +81,7 @@ public class BlockEntry { block.newBlockState = buf.readNullable(buffer -> { var nbt = buf.readNbt(); if (nbt == null) return null; - return NbtUtils.readBlockState(nbt); + return NbtUtils.readBlockState(BuiltInRegistries.BLOCK.asLookup(), nbt); }); block.item = Item.byId(buf.readInt()); return block; diff --git a/src/main/java/nl/requios/effortlessbuilding/utilities/BlockPlacerHelper.java b/src/main/java/nl/requios/effortlessbuilding/utilities/BlockPlacerHelper.java index aff742f..8b108b8 100644 --- a/src/main/java/nl/requios/effortlessbuilding/utilities/BlockPlacerHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/utilities/BlockPlacerHelper.java @@ -2,19 +2,11 @@ package nl.requios.effortlessbuilding.utilities; import com.google.common.collect.Lists; import net.minecraft.core.Direction; -import net.minecraft.core.Registry; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.stats.Stats; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.BucketItem; import net.minecraft.world.item.DiggerItem; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.pattern.BlockInWorld; import net.minecraftforge.common.util.BlockSnapshot; import net.minecraftforge.event.ForgeEventFactory; import net.minecraftforge.items.ItemHandlerHelper; @@ -35,7 +27,7 @@ public class BlockPlacerHelper { } } - boolean brokeBlock = BlockHelper.destroyBlockAs(player.level, blockEntry.blockPos, player, usedTool, 0f, stack -> { + boolean brokeBlock = BlockHelper.destroyBlockAs(player.level(), blockEntry.blockPos, player, usedTool, 0f, stack -> { if (!player.isCreative()) { ItemHandlerHelper.giveItemToPlayer(player, stack); } @@ -46,7 +38,7 @@ public class BlockPlacerHelper { //ForgeHooks::onPlaceItemIntoWorld, removed itemstack usage public static boolean placeBlock(Player player, BlockEntry blockEntry) { - Level level = player.level; + Level level = player.level(); var itemStack = new ItemStack(blockEntry.item); level.captureBlockSnapshots = true; diff --git a/src/main/java/nl/requios/effortlessbuilding/utilities/BlockSet.java b/src/main/java/nl/requios/effortlessbuilding/utilities/BlockSet.java index f730af7..a05955c 100644 --- a/src/main/java/nl/requios/effortlessbuilding/utilities/BlockSet.java +++ b/src/main/java/nl/requios/effortlessbuilding/utilities/BlockSet.java @@ -7,7 +7,6 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuildingClient; -import nl.requios.effortlessbuilding.systems.PowerLevel; import org.jetbrains.annotations.NotNull; import java.util.HashMap; diff --git a/src/main/java/nl/requios/effortlessbuilding/utilities/ClientBlockUtilities.java b/src/main/java/nl/requios/effortlessbuilding/utilities/ClientBlockUtilities.java index cd26011..820bd91 100644 --- a/src/main/java/nl/requios/effortlessbuilding/utilities/ClientBlockUtilities.java +++ b/src/main/java/nl/requios/effortlessbuilding/utilities/ClientBlockUtilities.java @@ -43,13 +43,13 @@ public class ClientBlockUtilities { if (blockEntry == null || blockEntry.newBlockState == null) return; - SoundType soundType = blockEntry.newBlockState.getBlock().getSoundType(blockEntry.newBlockState, player.level, blockEntry.blockPos, player); + SoundType soundType = blockEntry.newBlockState.getBlock().getSoundType(blockEntry.newBlockState, player.level(), blockEntry.blockPos, player); SoundEvent soundEvent = breaking ? soundType.getBreakSound() : soundType.getPlaceSound(); - player.level.playSound(player, player.blockPosition(), soundEvent, SoundSource.BLOCKS, 0.6f, soundType.getPitch()); + player.level().playSound(player, player.blockPosition(), soundEvent, SoundSource.BLOCKS, 0.6f, soundType.getPitch()); } public static BlockHitResult getLookingAtFar(Player player) { - Level world = player.level; + Level world = player.level(); //base distance off of player ability (config) float raytraceRange = EffortlessBuildingClient.POWER_LEVEL.getPlacementReach(player); diff --git a/src/main/java/nl/requios/effortlessbuilding/utilities/PowerLevelCommand.java b/src/main/java/nl/requios/effortlessbuilding/utilities/PowerLevelCommand.java index 9a40669..e47e814 100644 --- a/src/main/java/nl/requios/effortlessbuilding/utilities/PowerLevelCommand.java +++ b/src/main/java/nl/requios/effortlessbuilding/utilities/PowerLevelCommand.java @@ -2,7 +2,6 @@ package nl.requios.effortlessbuilding.utilities; import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.arguments.IntegerArgumentType; -import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; @@ -44,12 +43,12 @@ public class PowerLevelCommand { private static void logPowerLevel(CommandSourceStack source, Player player) { int powerLevel = EffortlessBuilding.SERVER_POWER_LEVEL.getPowerLevel(player); - source.sendSuccess(Component.translatable("effortlessbuilding.commands.powerlevel", player.getDisplayName(), powerLevel), false); + source.sendSuccess(() -> Component.translatable("effortlessbuilding.commands.powerlevel", player.getDisplayName(), powerLevel), false); } private static void setPowerLevel(CommandSourceStack source, Player player, int powerLevel) throws CommandSyntaxException { EffortlessBuilding.SERVER_POWER_LEVEL.setPowerLevel(player, powerLevel); EffortlessBuilding.SERVER_POWER_LEVEL.sendToClient(player); - source.sendSuccess(Component.translatable("effortlessbuilding.commands.powerlevel.success", player.getDisplayName(), powerLevel), true); + source.sendSuccess(() -> Component.translatable("effortlessbuilding.commands.powerlevel.success", player.getDisplayName(), powerLevel), true); } } diff --git a/src/main/java/nl/requios/effortlessbuilding/utilities/SurvivalHelper.java b/src/main/java/nl/requios/effortlessbuilding/utilities/SurvivalHelper.java index ce9332e..6bfb9bc 100644 --- a/src/main/java/nl/requios/effortlessbuilding/utilities/SurvivalHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/utilities/SurvivalHelper.java @@ -1,32 +1,15 @@ package nl.requios.effortlessbuilding.utilities; -import net.minecraft.advancements.CriteriaTriggers; import net.minecraft.core.BlockPos; -import net.minecraft.core.Registry; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.sounds.SoundSource; -import net.minecraft.tags.BlockTags; import net.minecraft.world.InteractionHand; -import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.SlabBlock; -import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.pattern.BlockInWorld; -import net.minecraft.world.level.material.Material; -import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.event.ForgeEventFactory; -import nl.requios.effortlessbuilding.CommonConfig; -import nl.requios.effortlessbuilding.EffortlessBuildingClient; import nl.requios.effortlessbuilding.compatibility.CompatHelper; -import nl.requios.effortlessbuilding.systems.ServerBuildState; - -import javax.annotation.Nullable; public class SurvivalHelper { @@ -43,7 +26,7 @@ public class SurvivalHelper { public static boolean doesBecomeDoubleSlab(Player player, BlockPos pos) { - BlockState placedBlockState = player.level.getBlockState(pos); + BlockState placedBlockState = player.level().getBlockState(pos); ItemStack itemstack = player.getItemInHand(InteractionHand.MAIN_HAND); if (CompatHelper.isItemBlockProxy(itemstack)) diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 2752a32..3b3cd51 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -11,7 +11,7 @@ protected net.minecraft.client.particle.Particle f_107205_ # stoppedByCollision public net.minecraft.client.renderer.ItemInHandRenderer f_109300_ # mainHandItem public net.minecraft.client.renderer.ItemInHandRenderer f_109301_ # offHandItem public net.minecraft.client.renderer.entity.ItemRenderer f_115096_ # textureManager - +public net.minecraft.world.entity.Entity f_19853_ # level public-f net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket f_132663_ # flyingSpeed public net.minecraft.server.MinecraftServer f_129744_ # storageSource diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index b08a175..4afac51 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -1,5 +1,5 @@ modLoader="javafml" -loaderVersion="[40,)" +loaderVersion="[47,)" license="GNU LESSER GENERAL PUBLIC LICENSE" issueTrackerURL="https://bitbucket.org/Requios/effortless-building/issues?status=new&status=open&status=submitted&is_spam=%21spam" showAsResourcePack=false @@ -19,20 +19,20 @@ Makes building easier by providing tools like mirrors, arrays, build modes and a [[dependencies.effortlessbuilding]] modId="forge" mandatory=true - versionRange="[40.2.4,)" + versionRange="[47.1.3,)" ordering="NONE" side="BOTH" [[dependencies.effortlessbuilding]] modId="minecraft" mandatory=true - versionRange="[1.19,1.20)" + versionRange="[1.20,1.21)" ordering="NONE" side="BOTH" [[dependencies.effortlessbuilding]] modId="flywheel" mandatory=true - versionRange="[0.6.9,0.7)" + versionRange="[0.6.10,0.7)" ordering="AFTER" side="CLIENT" \ No newline at end of file diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta index 4a33ce3..53e3a7e 100644 --- a/src/main/resources/pack.mcmeta +++ b/src/main/resources/pack.mcmeta @@ -1,8 +1,6 @@ { "pack": { - "description": "examplemod resources", - "pack_format": 10, - "forge:resource_pack_format": 9, - "forge:data_pack_format": 10 + "description": "Effortless Building resources", + "pack_format": 15 } }