diff --git a/build.gradle b/build.gradle index 67ed01f..f436c92 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ plugins { jarJar.enable() -boolean flywheelInWorkspace = findProject(':Flywheel') != null +boolean ponderInWorkspace = findProject(':Ponder') != null ext.buildNumber = System.getenv('BUILD_NUMBER') @@ -19,7 +19,7 @@ base { archivesName = "effortlessbuilding-${artifact_minecraft_version}" } -java.toolchain.languageVersion = JavaLanguageVersion.of(17) +java.toolchain.languageVersion = JavaLanguageVersion.of(21) println('Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getProperty('java.vm.version') + ' (' + System.getProperty('java.vendor') + ') Arch: ' + System.getProperty('os.arch')) @@ -47,9 +47,9 @@ runs { // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. systemProperty 'neoforge.enabledGameTestNamespaces', "effortlessbuilding" - if (flywheelInWorkspace) { + if (ponderInWorkspace) { dependencies { - runtime project(':Flywheel') + runtime project(':Ponder') } } } @@ -74,6 +74,11 @@ repositories { name = 'tterrag maven' url = 'https://maven.tterrag.com' } + maven { + // Ponder, Flywheel + url = "https://maven.createmod.net" + } + maven { url = "https://raw.githubusercontent.com/Fuzss/modresources/main/maven" } // NeoForge config api port, needed by ponder exclusiveContent { forRepository { maven { @@ -101,15 +106,24 @@ repositories { dependencies { implementation "net.neoforged:neoforge:${neo_version}" - jarJar("com.jozufozu.flywheel:flywheel-forge-${flywheel_minecraft_version}:${flywheel_version}") { - version { prefer "0.6.10" } + jarJar("dev.engine-room.flywheel:flywheel-neoforge-${flywheel_minecraft_version}:${flywheel_version}") { + version { + strictly "[1.0.0-9,2.0)" + } } - if (flywheelInWorkspace) { - implementation project(':Flywheel') + compileOnly("dev.engine-room.flywheel:flywheel-neoforge-api-${flywheel_minecraft_version}:${flywheel_version}") + runtimeOnly("dev.engine-room.flywheel:flywheel-neoforge-${flywheel_minecraft_version}:${flywheel_version}") + runtimeOnly("dev.engine-room.vanillin:vanillin-neoforge-${flywheel_minecraft_version}:${vanillin_version}") + + if (ponderInWorkspace) { + implementation(project(":ponder:Common")) + implementation(project(":ponder:NeoForge")) } else { - implementation "com.jozufozu.flywheel:flywheel-forge-${flywheel_minecraft_version}:${flywheel_version}" + implementation("net.createmod.ponder:Ponder-NeoForge-${minecraft_version}:${ponder_version}") } + + jarJar("net.createmod.ponder:Ponder-NeoForge-${minecraft_version}:${ponder_version}") } sourceSets.main.resources { @@ -120,6 +134,14 @@ tasks.withType(JavaCompile).configureEach { options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation } +// IDEA no longer automatically downloads sources/javadoc jars for dependencies, so we need to explicitly enable the behavior. +idea { + module { + downloadSources = true + downloadJavadoc = true + } +} + compileJava { options.compilerArgs = ['-Xdiags:verbose'] } diff --git a/gradle.properties b/gradle.properties index 9781bc5..fe817f2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,15 +4,18 @@ org.gradle.jvmargs=-Xmx3G org.gradle.daemon=false mod_version = 3.5 -artifact_minecraft_version = 1.20.4 +artifact_minecraft_version = 1.21.1 -minecraft_version = 1.20.4 -neo_version = 20.4.232 -neogradle.subsystems.parchment.minecraftVersion = 1.20.4 -neogradle.subsystems.parchment.mappingsVersion = 2024.02.25 +minecraft_version = 1.21.1 +neo_version = 21.1.127 +neogradle.subsystems.parchment.minecraftVersion = 1.21.1 +neogradle.subsystems.parchment.mappingsVersion = 2024.11.17 +neogradle.subsystems.conventions.runs.create-default-run-per-type = false -neogradle_version = 7.0.107 +neogradle_version = 7.0.181 cursegradle_version = 1.4.0 -flywheel_minecraft_version = 1.20.4 -flywheel_version = 0.6.10 \ No newline at end of file +flywheel_minecraft_version = 1.21.1 +flywheel_version = 1.0.0-9 +vanillin_version = 1.0.0-beta-9 +ponder_version = 1.0.39 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index c1962a7..a4b76b9 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 509c4a2..e2847c8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index aeb74cb..f5feea6 100644 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -83,7 +85,9 @@ done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -130,10 +134,13 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. @@ -141,7 +148,7 @@ 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 + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac @@ -149,7 +156,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -198,11 +205,11 @@ fi # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ diff --git a/gradlew.bat b/gradlew.bat index 93e3f59..9d21a21 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -43,11 +45,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +59,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail diff --git a/src/main/java/nl/requios/effortlessbuilding/AllGuiTextures.java b/src/main/java/nl/requios/effortlessbuilding/AllGuiTextures.java index 62240df..83a50ca 100644 --- a/src/main/java/nl/requios/effortlessbuilding/AllGuiTextures.java +++ b/src/main/java/nl/requios/effortlessbuilding/AllGuiTextures.java @@ -1,13 +1,13 @@ package nl.requios.effortlessbuilding; import com.mojang.blaze3d.systems.RenderSystem; +import net.createmod.catnip.gui.UIRenderHelper; +import net.createmod.catnip.gui.element.ScreenElement; +import net.createmod.catnip.theme.Color; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.resources.ResourceLocation; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; -import nl.requios.effortlessbuilding.create.foundation.gui.UIRenderHelper; -import nl.requios.effortlessbuilding.create.foundation.gui.element.ScreenElement; -import nl.requios.effortlessbuilding.create.foundation.utility.Color; public enum AllGuiTextures implements ScreenElement { ARRAY_ENTRY("modifiers", 226, 64), @@ -35,7 +35,7 @@ public enum AllGuiTextures implements ScreenElement { } private AllGuiTextures(String namespace, String location, int startX, int startY, int width, int height) { - this.location = new ResourceLocation(namespace, "textures/gui/" + location + ".png"); + this.location = ResourceLocation.fromNamespaceAndPath(namespace, "textures/gui/" + location + ".png"); this.width = width; this.height = height; this.startX = startX; diff --git a/src/main/java/nl/requios/effortlessbuilding/AllIcons.java b/src/main/java/nl/requios/effortlessbuilding/AllIcons.java index e5b9548..55aa9d1 100644 --- a/src/main/java/nl/requios/effortlessbuilding/AllIcons.java +++ b/src/main/java/nl/requios/effortlessbuilding/AllIcons.java @@ -2,6 +2,9 @@ package nl.requios.effortlessbuilding; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; +import net.createmod.catnip.gui.element.DelegatedStencilElement; +import net.createmod.catnip.gui.element.ScreenElement; +import net.createmod.catnip.theme.Color; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; @@ -10,15 +13,11 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.phys.Vec3; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; -import nl.requios.effortlessbuilding.create.Create; -import nl.requios.effortlessbuilding.create.foundation.gui.element.DelegatedStencilElement; -import nl.requios.effortlessbuilding.create.foundation.gui.element.ScreenElement; -import nl.requios.effortlessbuilding.create.foundation.utility.Color; import org.joml.Matrix4f; public class AllIcons implements ScreenElement { - public static final ResourceLocation ICON_ATLAS = Create.asResource("textures/gui/icons.png"); + public static final ResourceLocation ICON_ATLAS = EffortlessBuilding.asResource("textures/gui/icons.png"); public static final int ICON_ATLAS_SIZE = 256; private static int x = 0, y = -1; private int iconX; @@ -101,7 +100,6 @@ public class AllIcons implements ScreenElement { } @OnlyIn(Dist.CLIENT) - @Override public void render(GuiGraphics guiGraphics, int x, int y) { guiGraphics.blit(ICON_ATLAS, x, y, 0, iconX, iconY, 16, 16, 256, 256); } @@ -131,11 +129,10 @@ public class AllIcons implements ScreenElement { @OnlyIn(Dist.CLIENT) private void vertex(VertexConsumer builder, Matrix4f matrix, Vec3 vec, Color rgb, float u, float v, int light) { - builder.vertex(matrix, (float) vec.x, (float) vec.y, (float) vec.z) - .color(rgb.getRed(), rgb.getGreen(), rgb.getBlue(), 255) - .uv(u, v) - .uv2(light) - .endVertex(); + builder.addVertex(matrix, (float) vec.x, (float) vec.y, (float) vec.z) + .setColor(rgb.getRed(), rgb.getGreen(), rgb.getBlue(), 255) + .setUv(u, v) + .setLight(light); } @OnlyIn(Dist.CLIENT) diff --git a/src/main/java/nl/requios/effortlessbuilding/ClientConfig.java b/src/main/java/nl/requios/effortlessbuilding/ClientConfig.java index a33efcc..5d06071 100644 --- a/src/main/java/nl/requios/effortlessbuilding/ClientConfig.java +++ b/src/main/java/nl/requios/effortlessbuilding/ClientConfig.java @@ -2,7 +2,9 @@ package nl.requios.effortlessbuilding; import net.neoforged.neoforge.common.ModConfigSpec; -import static net.neoforged.neoforge.common.ModConfigSpec.*; +import static net.neoforged.neoforge.common.ModConfigSpec.BooleanValue; +import static net.neoforged.neoforge.common.ModConfigSpec.Builder; +import static net.neoforged.neoforge.common.ModConfigSpec.IntValue; public class ClientConfig { diff --git a/src/main/java/nl/requios/effortlessbuilding/ClientEvents.java b/src/main/java/nl/requios/effortlessbuilding/ClientEvents.java index 32121a0..6ae8aa5 100644 --- a/src/main/java/nl/requios/effortlessbuilding/ClientEvents.java +++ b/src/main/java/nl/requios/effortlessbuilding/ClientEvents.java @@ -7,17 +7,17 @@ import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.player.LocalPlayer; import net.minecraft.world.entity.player.Player; import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.client.event.ClientTickEvent; import net.neoforged.neoforge.client.event.InputEvent; import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent; import net.neoforged.neoforge.client.event.ScreenEvent; import net.neoforged.neoforge.client.settings.KeyConflictContext; import net.neoforged.neoforge.client.settings.KeyModifier; -import net.neoforged.neoforge.event.TickEvent; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod.EventBusSubscriber; +import nl.requios.effortlessbuilding.attachment.AttachmentHandler; import nl.requios.effortlessbuilding.buildmode.BuildModeEnum; import nl.requios.effortlessbuilding.buildmode.ModeOptions; -import nl.requios.effortlessbuilding.attachment.AttachmentHandler; import nl.requios.effortlessbuilding.gui.buildmode.PlayerSettingsGui; import nl.requios.effortlessbuilding.gui.buildmode.RadialMenu; import nl.requios.effortlessbuilding.gui.buildmodifier.ModifiersScreen; @@ -55,31 +55,31 @@ public class ClientEvents { // @SubscribeEvent // public static void registerShaders(RegisterShadersEvent event) throws IOException { // event.registerShader(new ShaderInstance(event.getResourceManager(), -// new ResourceLocation(EffortlessBuilding.MODID, "dissolve"), +// EffortlessBuilding.modLoc("dissolve"), // DefaultVertexFormat.BLOCK), // shaderInstance -> BuildRenderTypes.dissolveShaderInstance = shaderInstance); // } } @SubscribeEvent - public static void onClientTick(TickEvent.ClientTickEvent event) { + public static void onClientTickPre(ClientTickEvent.Pre event) { if (!isGameActive()) return; - if (event.phase == TickEvent.Phase.START) { + EffortlessBuildingClient.BUILDER_CHAIN.onTick(); - EffortlessBuildingClient.BUILDER_CHAIN.onTick(); + onMouseInput(); - onMouseInput(); + EffortlessBuildingClient.BLOCK_PREVIEWS.onTick(); + } - EffortlessBuildingClient.BLOCK_PREVIEWS.onTick(); + @SubscribeEvent + public static void onClientTickPost(ClientTickEvent.Post event) { + if (!isGameActive()) return; - } else if (event.phase == TickEvent.Phase.END) { - Screen gui = Minecraft.getInstance().screen; - if (gui == null || !gui.isPauseScreen()) { - ticksInGame++; - } + Screen gui = Minecraft.getInstance().screen; + if (gui == null || !gui.isPauseScreen()) { + ticksInGame++; } - } private static void onMouseInput() { diff --git a/src/main/java/nl/requios/effortlessbuilding/CommonConfig.java b/src/main/java/nl/requios/effortlessbuilding/CommonConfig.java index 9bdef2f..dc9224f 100644 --- a/src/main/java/nl/requios/effortlessbuilding/CommonConfig.java +++ b/src/main/java/nl/requios/effortlessbuilding/CommonConfig.java @@ -2,7 +2,8 @@ package nl.requios.effortlessbuilding; import net.neoforged.neoforge.common.ModConfigSpec; -import static net.neoforged.neoforge.common.ModConfigSpec.*; +import static net.neoforged.neoforge.common.ModConfigSpec.Builder; +import static net.neoforged.neoforge.common.ModConfigSpec.IntValue; public class CommonConfig { diff --git a/src/main/java/nl/requios/effortlessbuilding/CommonEvents.java b/src/main/java/nl/requios/effortlessbuilding/CommonEvents.java index dc590f4..9b7a7a9 100644 --- a/src/main/java/nl/requios/effortlessbuilding/CommonEvents.java +++ b/src/main/java/nl/requios/effortlessbuilding/CommonEvents.java @@ -7,13 +7,12 @@ import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.LogicalSide; -import net.neoforged.fml.common.Mod.EventBusSubscriber; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.common.util.FakePlayer; import net.neoforged.neoforge.event.RegisterCommandsEvent; -import net.neoforged.neoforge.event.TickEvent; import net.neoforged.neoforge.event.entity.player.PlayerEvent; import net.neoforged.neoforge.event.level.BlockEvent; +import net.neoforged.neoforge.event.tick.LevelTickEvent; import nl.requios.effortlessbuilding.attachment.PowerLevel; import nl.requios.effortlessbuilding.compatibility.CompatHelper; import nl.requios.effortlessbuilding.network.message.ModifierSettingsPacket; @@ -37,10 +36,10 @@ public class CommonEvents { } @SubscribeEvent - public static void onTick(TickEvent.LevelTickEvent event) { - if (event.phase != TickEvent.Phase.START) return; - if (event.side == LogicalSide.CLIENT) return; - if (event.level.dimension() != Level.OVERWORLD) return; + public static void onTick(LevelTickEvent.Pre event) { + Level level = event.getLevel(); + if (level.isClientSide) return; + if (!level.dimension().equals(Level.OVERWORLD)) return; EffortlessBuilding.SERVER_BLOCK_PLACER.tick(); } diff --git a/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java b/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java index 9febc22..3b39601 100644 --- a/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java +++ b/src/main/java/nl/requios/effortlessbuilding/EffortlessBuilding.java @@ -1,22 +1,25 @@ package nl.requios.effortlessbuilding; -import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; 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.ItemStack; +import net.neoforged.api.distmarker.Dist; import net.neoforged.bus.api.IEventBus; -import net.neoforged.fml.DistExecutor; -import net.neoforged.fml.ModLoadingContext; +import net.neoforged.fml.ModContainer; import net.neoforged.fml.common.Mod; import net.neoforged.fml.config.ModConfig; import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; import net.neoforged.fml.loading.FMLEnvironment; import net.neoforged.neoforge.attachment.AttachmentType; +import net.neoforged.neoforge.client.gui.ConfigurationScreen; +import net.neoforged.neoforge.client.gui.IConfigScreenFactory; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.common.loot.IGlobalLootModifier; import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; @@ -39,7 +42,6 @@ import nl.requios.effortlessbuilding.item.ReachUpgrade3Item; import nl.requios.effortlessbuilding.item.SingleItemLootModifier; import nl.requios.effortlessbuilding.network.PacketHandler; import nl.requios.effortlessbuilding.proxy.ClientProxy; -import nl.requios.effortlessbuilding.proxy.IProxy; import nl.requios.effortlessbuilding.proxy.ServerProxy; import nl.requios.effortlessbuilding.systems.ItemUsageTracker; import nl.requios.effortlessbuilding.systems.ServerBlockPlacer; @@ -57,7 +59,6 @@ public class EffortlessBuilding { public static final Logger logger = LogManager.getLogger(); public static EffortlessBuilding instance; - public static IProxy proxy = DistExecutor.unsafeRunForDist(() -> ClientProxy::new, () -> ServerProxy::new); public static final ServerBlockPlacer SERVER_BLOCK_PLACER = new ServerBlockPlacer(); public static final UndoRedo UNDO_REDO = new UndoRedo(); @@ -66,7 +67,7 @@ public class EffortlessBuilding { //Registration private static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(MODID); private static final DeferredRegister> CONTAINERS = DeferredRegister.create(BuiltInRegistries.MENU, EffortlessBuilding.MODID); - private static final DeferredRegister> LOOT_MODIFIERS = DeferredRegister.create(NeoForgeRegistries.Keys.GLOBAL_LOOT_MODIFIER_SERIALIZERS, EffortlessBuilding.MODID); + private static final DeferredRegister> LOOT_MODIFIERS = DeferredRegister.create(NeoForgeRegistries.Keys.GLOBAL_LOOT_MODIFIER_SERIALIZERS, EffortlessBuilding.MODID); private static final DeferredRegister> ATTACHMENT_TYPES = DeferredRegister.create(NeoForgeRegistries.Keys.ATTACHMENT_TYPES, EffortlessBuilding.MODID); public static final DeferredItem RANDOMIZER_BAG_ITEM = ITEMS.register("randomizer_bag", RandomizerBagItem::new); @@ -83,24 +84,19 @@ public class EffortlessBuilding { public static final Supplier> GOLDEN_RANDOMIZER_BAG_CONTAINER = CONTAINERS.register("golden_randomizer_bag", () -> registerContainer(GoldenRandomizerBagContainer::new)); public static final Supplier> DIAMOND_RANDOMIZER_BAG_CONTAINER = CONTAINERS.register("diamond_randomizer_bag", () -> registerContainer(DiamondRandomizerBagContainer::new)); - public static final Supplier> SINGLE_ITEM_LOOT_MODIFIER = EffortlessBuilding.LOOT_MODIFIERS.register("single_item_loot_modifier", SingleItemLootModifier.CODEC); + public static final Supplier> SINGLE_ITEM_LOOT_MODIFIER = EffortlessBuilding.LOOT_MODIFIERS.register("single_item_loot_modifier", SingleItemLootModifier.CODEC); public static final Supplier> POWER_LEVEL = ATTACHMENT_TYPES.register("power_level", () -> AttachmentType.serializable(PowerLevel::new).build()); - public EffortlessBuilding(IEventBus modEventBus) { + public EffortlessBuilding(IEventBus modEventBus, ModContainer container, Dist dist) { instance = this; - ModLoadingContext modLoadingContext = ModLoadingContext.get(); IEventBus forgeEventBus = NeoForge.EVENT_BUS; modEventBus.addListener(EffortlessBuilding::setup); modEventBus.addListener(EffortlessBuilding::addTabContents); modEventBus.addListener(PacketHandler::setupPackets); - if (FMLEnvironment.dist.isClient()) { - EffortlessBuildingClient.onConstructorClient(modEventBus, forgeEventBus); - } - ITEMS.register(modEventBus); CONTAINERS.register(modEventBus); @@ -108,9 +104,13 @@ public class EffortlessBuilding { ATTACHMENT_TYPES.register(modEventBus); //Register config - modLoadingContext.registerConfig(ModConfig.Type.COMMON, CommonConfig.spec); - modLoadingContext.registerConfig(ModConfig.Type.CLIENT, ClientConfig.spec); - modLoadingContext.registerConfig(ModConfig.Type.SERVER, ServerConfig.spec); + container.registerConfig(ModConfig.Type.COMMON, CommonConfig.spec); + container.registerConfig(ModConfig.Type.SERVER, ServerConfig.spec); + if (dist.isClient()) { + container.registerConfig(ModConfig.Type.CLIENT, ClientConfig.spec); + container.registerExtensionPoint(IConfigScreenFactory.class, ConfigurationScreen::new); + EffortlessBuildingClient.onConstructorClient(modEventBus, forgeEventBus); + } } public static void setup(final FMLCommonSetupEvent event) { @@ -143,11 +143,18 @@ public class EffortlessBuilding { //Log with translation supported, call either on client or server (which then sends a message) public static void logTranslate(Player player, String prefix, String translationKey, String suffix, boolean actionBar) { - proxy.logTranslate(player, prefix, translationKey, suffix, actionBar); + if (FMLEnvironment.dist.isClient()) { + ClientProxy.logTranslate(player, prefix, translationKey, suffix, actionBar); + } else { + ServerProxy.logTranslate(player, prefix, translationKey, suffix, actionBar); + } } public static void logError(String msg) { logger.error(msg); } + public static ResourceLocation asResource(String path) { + return ResourceLocation.fromNamespaceAndPath(MODID, path); + } } diff --git a/src/main/java/nl/requios/effortlessbuilding/EffortlessBuildingClient.java b/src/main/java/nl/requios/effortlessbuilding/EffortlessBuildingClient.java index 4c96f6b..f0cb8f8 100644 --- a/src/main/java/nl/requios/effortlessbuilding/EffortlessBuildingClient.java +++ b/src/main/java/nl/requios/effortlessbuilding/EffortlessBuildingClient.java @@ -1,15 +1,17 @@ package nl.requios.effortlessbuilding; -import net.minecraft.client.gui.screens.MenuScreens; import net.neoforged.bus.api.IEventBus; -import net.neoforged.fml.event.lifecycle.FMLClientSetupEvent; +import net.neoforged.neoforge.client.event.RegisterMenuScreensEvent; import nl.requios.effortlessbuilding.buildmode.BuildModes; import nl.requios.effortlessbuilding.buildmodifier.BuildModifiers; import nl.requios.effortlessbuilding.gui.DiamondRandomizerBagScreen; import nl.requios.effortlessbuilding.gui.GoldenRandomizerBagScreen; import nl.requios.effortlessbuilding.gui.RandomizerBagScreen; import nl.requios.effortlessbuilding.render.BlockPreviews; -import nl.requios.effortlessbuilding.systems.*; +import nl.requios.effortlessbuilding.systems.BuildSettings; +import nl.requios.effortlessbuilding.systems.BuilderChain; +import nl.requios.effortlessbuilding.systems.BuilderFilter; +import nl.requios.effortlessbuilding.systems.ItemUsageTracker; public class EffortlessBuildingClient { @@ -22,12 +24,12 @@ public class EffortlessBuildingClient { public static final ItemUsageTracker ITEM_USAGE_TRACKER = new ItemUsageTracker(); public static void onConstructorClient(IEventBus modEventBus, IEventBus forgeEventBus) { - modEventBus.addListener(EffortlessBuildingClient::clientSetup); + modEventBus.addListener(EffortlessBuildingClient::registerMenuScreens); } - public static void clientSetup(final FMLClientSetupEvent event) { - MenuScreens.register(EffortlessBuilding.RANDOMIZER_BAG_CONTAINER.get(), RandomizerBagScreen::new); - MenuScreens.register(EffortlessBuilding.GOLDEN_RANDOMIZER_BAG_CONTAINER.get(), GoldenRandomizerBagScreen::new); - MenuScreens.register(EffortlessBuilding.DIAMOND_RANDOMIZER_BAG_CONTAINER.get(), DiamondRandomizerBagScreen::new); + public static void registerMenuScreens(final RegisterMenuScreensEvent event) { + event.register(EffortlessBuilding.RANDOMIZER_BAG_CONTAINER.get(), RandomizerBagScreen::new); + event.register(EffortlessBuilding.GOLDEN_RANDOMIZER_BAG_CONTAINER.get(), GoldenRandomizerBagScreen::new); + event.register(EffortlessBuilding.DIAMOND_RANDOMIZER_BAG_CONTAINER.get(), DiamondRandomizerBagScreen::new); } } diff --git a/src/main/java/nl/requios/effortlessbuilding/ServerConfig.java b/src/main/java/nl/requios/effortlessbuilding/ServerConfig.java index 60e2f5b..dcc3d1d 100644 --- a/src/main/java/nl/requios/effortlessbuilding/ServerConfig.java +++ b/src/main/java/nl/requios/effortlessbuilding/ServerConfig.java @@ -5,7 +5,10 @@ import net.neoforged.neoforge.common.ModConfigSpec; import java.util.Arrays; import java.util.List; -import static net.neoforged.neoforge.common.ModConfigSpec.*; +import static net.neoforged.neoforge.common.ModConfigSpec.BooleanValue; +import static net.neoforged.neoforge.common.ModConfigSpec.Builder; +import static net.neoforged.neoforge.common.ModConfigSpec.ConfigValue; +import static net.neoforged.neoforge.common.ModConfigSpec.IntValue; public class ServerConfig { private static final Builder builder = new Builder(); diff --git a/src/main/java/nl/requios/effortlessbuilding/attachment/AttachmentHandler.java b/src/main/java/nl/requios/effortlessbuilding/attachment/AttachmentHandler.java index 0149db5..214c001 100644 --- a/src/main/java/nl/requios/effortlessbuilding/attachment/AttachmentHandler.java +++ b/src/main/java/nl/requios/effortlessbuilding/attachment/AttachmentHandler.java @@ -8,7 +8,7 @@ import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.network.message.PowerLevelPacket; public class AttachmentHandler { - public static final ResourceLocation POWER_LEVEL_CAP = new ResourceLocation(EffortlessBuilding.MODID, "power_level"); + public static final ResourceLocation POWER_LEVEL_CAP = EffortlessBuilding.asResource("power_level"); public static void syncToClient(Player player) { PowerLevel powerLevel = player.getData(EffortlessBuilding.POWER_LEVEL); diff --git a/src/main/java/nl/requios/effortlessbuilding/attachment/PowerLevel.java b/src/main/java/nl/requios/effortlessbuilding/attachment/PowerLevel.java index 43ce881..e3ea422 100644 --- a/src/main/java/nl/requios/effortlessbuilding/attachment/PowerLevel.java +++ b/src/main/java/nl/requios/effortlessbuilding/attachment/PowerLevel.java @@ -1,5 +1,6 @@ package nl.requios.effortlessbuilding.attachment; +import net.minecraft.core.HolderLookup.Provider; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.player.Player; import net.neoforged.neoforge.common.util.INBTSerializable; @@ -93,13 +94,13 @@ public class PowerLevel implements INBTSerializable { return player.getAbilities().instabuild; } - public CompoundTag serializeNBT() { + public CompoundTag serializeNBT(Provider provider) { CompoundTag tag = new CompoundTag(); tag.putInt("powerLevel", getPowerLevel()); return tag; } - - public void deserializeNBT(CompoundTag nbt) { + + public void deserializeNBT(Provider provider, CompoundTag nbt) { setPowerLevel(nbt.getInt("powerLevel")); } } diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModeCategoryEnum.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModeCategoryEnum.java index 5215938..11ee02a 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModeCategoryEnum.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModeCategoryEnum.java @@ -1,6 +1,6 @@ package nl.requios.effortlessbuilding.buildmode; -import nl.requios.effortlessbuilding.create.foundation.utility.Color; +import net.createmod.catnip.theme.Color; public enum BuildModeCategoryEnum { BASIC(new Color(0f, .5f, 1f, .8f)), diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModeEnum.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModeEnum.java index 0dabaf5..67425d5 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModeEnum.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModeEnum.java @@ -1,7 +1,18 @@ package nl.requios.effortlessbuilding.buildmode; import nl.requios.effortlessbuilding.AllIcons; -import nl.requios.effortlessbuilding.buildmode.buildmodes.*; +import nl.requios.effortlessbuilding.buildmode.buildmodes.Circle; +import nl.requios.effortlessbuilding.buildmode.buildmodes.Cube; +import nl.requios.effortlessbuilding.buildmode.buildmodes.Cylinder; +import nl.requios.effortlessbuilding.buildmode.buildmodes.DiagonalLine; +import nl.requios.effortlessbuilding.buildmode.buildmodes.DiagonalWall; +import nl.requios.effortlessbuilding.buildmode.buildmodes.Disabled; +import nl.requios.effortlessbuilding.buildmode.buildmodes.Floor; +import nl.requios.effortlessbuilding.buildmode.buildmodes.Line; +import nl.requios.effortlessbuilding.buildmode.buildmodes.Single; +import nl.requios.effortlessbuilding.buildmode.buildmodes.SlopeFloor; +import nl.requios.effortlessbuilding.buildmode.buildmodes.Sphere; +import nl.requios.effortlessbuilding.buildmode.buildmodes.Wall; public enum BuildModeEnum { DISABLED("normal", new Disabled(), BuildModeCategoryEnum.BASIC, AllIcons.I_DISABLE), diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java index b729302..f7f6994 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/BuildModes.java @@ -30,7 +30,7 @@ public class BuildModes { public void setBuildMode(BuildModeEnum buildMode) { this.buildMode = buildMode; - PacketDistributor.SERVER.noArg().send(new IsUsingBuildModePacket(this.buildMode != BuildModeEnum.DISABLED)); + PacketDistributor.sendToServer(new IsUsingBuildModePacket(this.buildMode != BuildModeEnum.DISABLED)); EffortlessBuilding.log(Minecraft.getInstance().player, I18n.get(buildMode.getNameKey()), true); } diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/ModeOptions.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/ModeOptions.java index 6461c59..63f20b2 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/ModeOptions.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/ModeOptions.java @@ -69,8 +69,8 @@ public class ModeOptions { if (action == null) return; switch (action) { - case UNDO -> PacketDistributor.SERVER.noArg().send(new PerformUndoPacket()); - case REDO -> PacketDistributor.SERVER.noArg().send(new PerformRedoPacket()); + case UNDO -> PacketDistributor.sendToServer(new PerformUndoPacket()); + case REDO -> PacketDistributor.sendToServer(new PerformRedoPacket()); case OPEN_MODIFIER_SETTINGS -> ClientEvents.openModifierSettings(); case OPEN_PLAYER_SETTINGS -> ClientEvents.openPlayerSettings(); case PREVIOUS_BUILD_MODE -> EffortlessBuildingClient.BUILD_MODES.activatePreviousBuildMode(); diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Circle.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Circle.java index 9f72642..d04086e 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Circle.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Circle.java @@ -1,8 +1,8 @@ package nl.requios.effortlessbuilding.buildmode.buildmodes; -import net.minecraft.world.entity.player.Player; import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; import nl.requios.effortlessbuilding.buildmode.ModeOptions; import nl.requios.effortlessbuilding.buildmode.TwoClicksBuildMode; diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Cube.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Cube.java index 3a2fb1c..82cb9b1 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Cube.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Cube.java @@ -1,7 +1,7 @@ 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 nl.requios.effortlessbuilding.buildmode.ModeOptions; import nl.requios.effortlessbuilding.buildmode.ThreeClicksBuildMode; diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Cylinder.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Cylinder.java index 1c303bf..8547777 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Cylinder.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Cylinder.java @@ -1,7 +1,7 @@ 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 nl.requios.effortlessbuilding.buildmode.ThreeClicksBuildMode; import java.util.ArrayList; 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 8951b4a..c35b523 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/DiagonalLine.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/DiagonalLine.java @@ -1,7 +1,7 @@ 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.buildmode.ThreeClicksBuildMode; diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/DiagonalWall.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/DiagonalWall.java index c2d039a..146ca3d 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/DiagonalWall.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/DiagonalWall.java @@ -1,7 +1,7 @@ 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 nl.requios.effortlessbuilding.buildmode.ThreeClicksBuildMode; import java.util.ArrayList; 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 4bac2b9..096b318 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Floor.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Floor.java @@ -1,12 +1,12 @@ 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.attachment.AttachmentHandler; import nl.requios.effortlessbuilding.buildmode.BuildModes; import nl.requios.effortlessbuilding.buildmode.ModeOptions; import nl.requios.effortlessbuilding.buildmode.TwoClicksBuildMode; -import nl.requios.effortlessbuilding.attachment.AttachmentHandler; import java.util.ArrayList; import java.util.List; 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 0dd4772..150634d 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Line.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Line.java @@ -3,9 +3,9 @@ package nl.requios.effortlessbuilding.buildmode.buildmodes; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.Vec3; +import nl.requios.effortlessbuilding.attachment.AttachmentHandler; import nl.requios.effortlessbuilding.buildmode.BuildModes; import nl.requios.effortlessbuilding.buildmode.TwoClicksBuildMode; -import nl.requios.effortlessbuilding.attachment.AttachmentHandler; import java.util.ArrayList; import java.util.List; 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 867fbde..8fb92e2 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/SlopeFloor.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/SlopeFloor.java @@ -1,10 +1,10 @@ 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 nl.requios.effortlessbuilding.attachment.AttachmentHandler; import nl.requios.effortlessbuilding.buildmode.ModeOptions; import nl.requios.effortlessbuilding.buildmode.ThreeClicksBuildMode; -import nl.requios.effortlessbuilding.attachment.AttachmentHandler; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Sphere.java b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Sphere.java index 0625b18..1150c94 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Sphere.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Sphere.java @@ -1,8 +1,8 @@ package nl.requios.effortlessbuilding.buildmode.buildmodes; -import net.minecraft.world.entity.player.Player; import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; import nl.requios.effortlessbuilding.buildmode.ModeOptions; import nl.requios.effortlessbuilding.buildmode.ThreeClicksBuildMode; 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 f41c2a4..d820e8f 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Wall.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmode/buildmodes/Wall.java @@ -1,12 +1,12 @@ 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.attachment.AttachmentHandler; import nl.requios.effortlessbuilding.buildmode.BuildModes; import nl.requios.effortlessbuilding.buildmode.ModeOptions; import nl.requios.effortlessbuilding.buildmode.TwoClicksBuildMode; -import nl.requios.effortlessbuilding.attachment.AttachmentHandler; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/Array.java b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/Array.java index 5d77b18..a7d27f7 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/Array.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/Array.java @@ -1,9 +1,9 @@ package nl.requios.effortlessbuilding.buildmodifier; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.entity.player.Player; import net.minecraft.core.BlockPos; import net.minecraft.core.Vec3i; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.entity.player.Player; import nl.requios.effortlessbuilding.utilities.BlockEntry; import nl.requios.effortlessbuilding.utilities.BlockSet; diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/BuildModifiers.java b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/BuildModifiers.java index 2119be2..c0e1601 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/BuildModifiers.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/BuildModifiers.java @@ -1,12 +1,12 @@ package nl.requios.effortlessbuilding.buildmodifier; +import net.createmod.catnip.nbt.NBTHelper; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.world.entity.player.Player; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.neoforge.network.PacketDistributor; -import nl.requios.effortlessbuilding.create.foundation.utility.NBTHelper; import nl.requios.effortlessbuilding.network.message.ModifierSettingsPacket; import nl.requios.effortlessbuilding.utilities.BlockSet; @@ -96,7 +96,7 @@ public class BuildModifiers { } public void save() { - PacketDistributor.SERVER.noArg().send(new ModifierSettingsPacket(serializeNBT())); + PacketDistributor.sendToServer(new ModifierSettingsPacket(serializeNBT())); //Save locally as well? // var listTag = NBTHelper.writeCompoundList(modifierSettingsList, BaseModifier::serializeNBT); diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/Mirror.java b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/Mirror.java index 64f92bf..72b5aea 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/Mirror.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/Mirror.java @@ -1,11 +1,10 @@ package nl.requios.effortlessbuilding.buildmodifier; import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.entity.player.Player; -import net.minecraft.core.BlockPos; import net.minecraft.world.phys.Vec3; - import nl.requios.effortlessbuilding.attachment.AttachmentHandler; import nl.requios.effortlessbuilding.utilities.BlockEntry; import nl.requios.effortlessbuilding.utilities.BlockSet; diff --git a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/RadialMirror.java b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/RadialMirror.java index 48eff2c..098ee5b 100644 --- a/src/main/java/nl/requios/effortlessbuilding/buildmodifier/RadialMirror.java +++ b/src/main/java/nl/requios/effortlessbuilding/buildmodifier/RadialMirror.java @@ -1,13 +1,13 @@ package nl.requios.effortlessbuilding.buildmodifier; import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.util.Mth; import net.minecraft.world.entity.player.Player; 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.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; import nl.requios.effortlessbuilding.attachment.AttachmentHandler; import nl.requios.effortlessbuilding.utilities.BlockEntry; diff --git a/src/main/java/nl/requios/effortlessbuilding/compatibility/CompatHelper.java b/src/main/java/nl/requios/effortlessbuilding/compatibility/CompatHelper.java index 52ea80f..704e93b 100644 --- a/src/main/java/nl/requios/effortlessbuilding/compatibility/CompatHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/compatibility/CompatHelper.java @@ -1,11 +1,11 @@ package nl.requios.effortlessbuilding.compatibility; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; import net.neoforged.neoforge.items.IItemHandler; import nl.requios.effortlessbuilding.create.foundation.item.ItemHelper; import nl.requios.effortlessbuilding.item.AbstractRandomizerBagItem; diff --git a/src/main/java/nl/requios/effortlessbuilding/create/AllSpecialTextures.java b/src/main/java/nl/requios/effortlessbuilding/create/AllSpecialTextures.java index 0808f30..7db4cd4 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/AllSpecialTextures.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/AllSpecialTextures.java @@ -1,9 +1,10 @@ package nl.requios.effortlessbuilding.create; import com.mojang.blaze3d.systems.RenderSystem; +import net.createmod.catnip.render.BindableTexture; import net.minecraft.resources.ResourceLocation; -public enum AllSpecialTextures { +public enum AllSpecialTextures implements BindableTexture { BLANK("blank.png"), CHECKERED("checkerboard.png"), @@ -18,7 +19,7 @@ public enum AllSpecialTextures { public static final String ASSET_PATH = "textures/special/"; private ResourceLocation location; - private AllSpecialTextures(String filename) { + AllSpecialTextures(String filename) { location = Create.asResource(ASSET_PATH + filename); } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/Create.java b/src/main/java/nl/requios/effortlessbuilding/create/Create.java index 70d417c..66e92bd 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/Create.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/Create.java @@ -11,6 +11,6 @@ public class Create { public static final Logger LOGGER = LogUtils.getLogger(); public static ResourceLocation asResource(String path) { - return new ResourceLocation(EffortlessBuilding.MODID, path); + return ResourceLocation.fromNamespaceAndPath(EffortlessBuilding.MODID, path); } } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/CreateClient.java b/src/main/java/nl/requios/effortlessbuilding/create/CreateClient.java index a983c25..7093c24 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/CreateClient.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/CreateClient.java @@ -1,12 +1,10 @@ package nl.requios.effortlessbuilding.create; -import nl.requios.effortlessbuilding.create.foundation.render.SuperByteBufferCache; +import net.createmod.catnip.render.SuperByteBufferCache; import nl.requios.effortlessbuilding.create.foundation.utility.ghost.GhostBlocks; -import nl.requios.effortlessbuilding.create.foundation.utility.outliner.Outliner; public class CreateClient { public static final SuperByteBufferCache BUFFER_CACHE = new SuperByteBufferCache(); - public static final Outliner OUTLINER = new Outliner(); public static final GhostBlocks GHOST_BLOCKS = new GhostBlocks(); public static void invalidateRenderers() { diff --git a/src/main/java/nl/requios/effortlessbuilding/create/CreateClientTest.java b/src/main/java/nl/requios/effortlessbuilding/create/CreateClientTest.java deleted file mode 100644 index 7ed4b71..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/CreateClientTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package nl.requios.effortlessbuilding.create; - -//@Mod.EventBusSubscriber(Dist.CLIENT) -public class CreateClientTest { - -// @SubscribeEvent -// public static void onTick(TickEvent.ClientTickEvent event) { -// CreateClient.GHOST_BLOCKS.showGhostState(1, Blocks.SPRUCE_LOG.defaultBlockState()) -// .at(0, 120, 0) -// .breathingAlpha(); -// CreateClient.GHOST_BLOCKS.showGhostState(2, Blocks.SPRUCE_LOG.defaultBlockState()) -// .at(1, 120, 0) -// .breathingAlpha(); -// -// CreateClient.OUTLINER.showAABB(1, new AABB(0, 0, 0, 10, 2, 6) -// .move(10, 120, 0)) -// .withFaceTexture(AllSpecialTextures.CHECKERED) -// .colored(new Color(0.11f, 0.49f, 0.7f, 1f)) -//// .colored(0xbfbfbf) -// .disableNormals() -// .lineWidth(1 / 32f); -// } -} 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 d39b8a3..84e3aac 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/events/ClientEvents.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/events/ClientEvents.java @@ -2,46 +2,46 @@ package nl.requios.effortlessbuilding.create.events; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.levelWrappers.WrappedClientLevel; +import net.createmod.catnip.render.DefaultSuperRenderTypeBuffer; +import net.createmod.catnip.render.SuperRenderTypeBuffer; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.phys.Vec3; import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.client.event.ClientTickEvent; import net.neoforged.neoforge.client.event.RenderLevelStageEvent; import net.neoforged.neoforge.client.event.ViewportEvent; -import net.neoforged.neoforge.event.TickEvent; -import net.neoforged.neoforge.event.TickEvent.ClientTickEvent; import net.neoforged.neoforge.event.level.LevelEvent; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod; import nl.requios.effortlessbuilding.create.Create; import nl.requios.effortlessbuilding.create.CreateClient; -import nl.requios.effortlessbuilding.create.foundation.render.SuperRenderTypeBuffer; -import nl.requios.effortlessbuilding.create.foundation.utility.AnimationTickHolder; import nl.requios.effortlessbuilding.create.foundation.utility.CameraAngleAnimationService; -import nl.requios.effortlessbuilding.create.foundation.utility.worldWrappers.WrappedClientWorld; -@Mod.EventBusSubscriber(Dist.CLIENT) +@EventBusSubscriber(Dist.CLIENT) public class ClientEvents { private static final String ITEM_PREFIX = "item." + Create.ID; private static final String BLOCK_PREFIX = "block." + Create.ID; @SubscribeEvent - public static void onTick(ClientTickEvent event) { - if (!isGameActive() || event.phase != TickEvent.Phase.END) return; + public static void onTick(ClientTickEvent.Post event) { + if (!isGameActive()) return; AnimationTickHolder.tick(); CreateClient.GHOST_BLOCKS.tickGhosts(); - CreateClient.OUTLINER.tickOutlines(); +// CreateClient.OUTLINER.tickOutlines(); CameraAngleAnimationService.tick(); } @SubscribeEvent public static void onLoadWorld(LevelEvent.Load event) { LevelAccessor world = event.getLevel(); - if (world.isClientSide() && world instanceof ClientLevel && !(world instanceof WrappedClientWorld)) { + if (world.isClientSide() && world instanceof ClientLevel && !(world instanceof WrappedClientLevel)) { CreateClient.invalidateRenderers(); AnimationTickHolder.reset(); } @@ -67,11 +67,11 @@ public class ClientEvents { PoseStack ms = event.getPoseStack(); ms.pushPose(); ms.translate(-cameraPos.x(), -cameraPos.y(), -cameraPos.z()); - SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance(); + SuperRenderTypeBuffer buffer = DefaultSuperRenderTypeBuffer.getInstance(); CreateClient.GHOST_BLOCKS.renderAll(ms, buffer); - CreateClient.OUTLINER.renderOutlines(ms, buffer, pt); +// CreateClient.OUTLINER.renderOutlines(ms, buffer, pt); buffer.draw(); RenderSystem.enableCull(); diff --git a/src/main/java/nl/requios/effortlessbuilding/create/events/CommonEvents.java b/src/main/java/nl/requios/effortlessbuilding/create/events/CommonEvents.java index 92a4b5c..ab8caab 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/events/CommonEvents.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/events/CommonEvents.java @@ -1,12 +1,12 @@ package nl.requios.effortlessbuilding.create.events; +import net.createmod.catnip.data.WorldAttached; import net.minecraft.world.level.LevelAccessor; -import net.neoforged.neoforge.event.level.LevelEvent; import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod; -import nl.requios.effortlessbuilding.create.foundation.utility.WorldAttached; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.level.LevelEvent; -@Mod.EventBusSubscriber +@EventBusSubscriber public class CommonEvents { @SubscribeEvent diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/ClientResourceReloadListener.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/ClientResourceReloadListener.java index f3ec8d0..3d54695 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/ClientResourceReloadListener.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/ClientResourceReloadListener.java @@ -1,6 +1,6 @@ package nl.requios.effortlessbuilding.create.foundation; -import nl.requios.effortlessbuilding.create.foundation.utility.LangNumberFormat; +import net.createmod.catnip.lang.LangNumberFormat; import net.minecraft.server.packs.resources.ResourceManager; import net.minecraft.server.packs.resources.ResourceManagerReloadListener; diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/ModFilePackResources.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/ModFilePackResources.java deleted file mode 100644 index 30dc183..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/ModFilePackResources.java +++ /dev/null @@ -1,25 +0,0 @@ -//package nl.requios.effortlessbuilding.create.foundation; -// -//import net.neoforged.neoforgespi.locating.IModFile; -//import net.neoforged.neoforge.resource.PathPackResources; -// -//import java.nio.file.Path; -// -//public class ModFilePackResources extends PathPackResources { -// protected final IModFile modFile; -// protected final String sourcePath; -// -// public ModFilePackResources(String name, IModFile modFile, String sourcePath) { -// super(name, true, modFile.findResource(sourcePath)); -// this.modFile = modFile; -// this.sourcePath = sourcePath; -// } -// -// @Override -// protected Path resolve(String... paths) { -// String[] allPaths = new String[paths.length + 1]; -// allPaths[0] = sourcePath; -// System.arraycopy(paths, 0, allPaths, 1, paths.length); -// return modFile.findResource(allPaths); -// } -//} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/block/render/CTSpriteShiftEntry.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/block/render/CTSpriteShiftEntry.java new file mode 100644 index 0000000..5453cea --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/block/render/CTSpriteShiftEntry.java @@ -0,0 +1,29 @@ +package nl.requios.effortlessbuilding.create.foundation.block.render; + +import net.createmod.catnip.render.SpriteShiftEntry; + +public class CTSpriteShiftEntry extends SpriteShiftEntry { + + protected final CTType type; + + public CTSpriteShiftEntry(CTType type) { + this.type = type; + } + + public CTType getType() { + return type; + } + + public float getTargetU(float localU, int index) { + float uOffset = (index % type.getSheetSize()); + return getTarget().getU( + (getUnInterpolatedU(getOriginal(), localU) + uOffset) / ((float) type.getSheetSize())); + } + + public float getTargetV(float localV, int index) { + float vOffset = (index / type.getSheetSize()); + return getTarget().getV( + (getUnInterpolatedV(getOriginal(), localV) + vOffset) / ((float) type.getSheetSize())); + } + +} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/block/render/CTType.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/block/render/CTType.java new file mode 100644 index 0000000..23be7dd --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/block/render/CTType.java @@ -0,0 +1,15 @@ +package nl.requios.effortlessbuilding.create.foundation.block.render; + +import net.minecraft.resources.ResourceLocation; +import nl.requios.effortlessbuilding.create.foundation.block.render.ConnectedTextureBehaviour.CTContext; +import nl.requios.effortlessbuilding.create.foundation.block.render.ConnectedTextureBehaviour.ContextRequirement; + +public interface CTType { + ResourceLocation getId(); + + int getSheetSize(); + + ContextRequirement getContextRequirement(); + + int getTextureIndex(CTContext context); +} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/block/render/ConnectedTextureBehaviour.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/block/render/ConnectedTextureBehaviour.java new file mode 100644 index 0000000..ac6f712 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/block/render/ConnectedTextureBehaviour.java @@ -0,0 +1,283 @@ +package nl.requios.effortlessbuilding.create.foundation.block.render; + +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Direction.Axis; +import net.minecraft.core.Direction.AxisDirection; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public abstract class ConnectedTextureBehaviour { + + @Nullable + public CTSpriteShiftEntry getShift(BlockState state, RandomSource rand, Direction direction, + @NotNull TextureAtlasSprite sprite) { + return getShift(state, direction, sprite); + } + + @Nullable + public abstract CTSpriteShiftEntry getShift(BlockState state, Direction direction, + @NotNull TextureAtlasSprite sprite); + + // TODO: allow more than one data type per state/face? + @Nullable + public abstract CTType getDataType(BlockAndTintGetter world, BlockPos pos, BlockState state, Direction direction); + + public boolean buildContextForOccludedDirections() { + return false; + } + + protected boolean isBeingBlocked(BlockState state, BlockAndTintGetter reader, BlockPos pos, BlockPos otherPos, + Direction face) { + BlockPos blockingPos = otherPos.relative(face); + BlockState blockState = reader.getBlockState(pos); + BlockState blockingState = reader.getBlockState(blockingPos); + + if (!Block.isFaceFull(blockingState.getShape(reader, blockingPos), face.getOpposite())) + return false; + if (face.getAxis() + .choose(pos.getX(), pos.getY(), pos.getZ()) != face.getAxis() + .choose(otherPos.getX(), otherPos.getY(), otherPos.getZ())) + return false; + + return connectsTo(state, + getCTBlockState(reader, blockState, face.getOpposite(), pos.relative(face), blockingPos), reader, pos, + blockingPos, face); + } + + public boolean connectsTo(BlockState state, BlockState other, BlockAndTintGetter reader, BlockPos pos, + BlockPos otherPos, Direction face, Direction primaryOffset, Direction secondaryOffset) { + return connectsTo(state, other, reader, pos, otherPos, face); + } + + public boolean connectsTo(BlockState state, BlockState other, BlockAndTintGetter reader, BlockPos pos, + BlockPos otherPos, Direction face) { + return !isBeingBlocked(state, reader, pos, otherPos, face) && state.getBlock() == other.getBlock(); + } + + private boolean testConnection(BlockAndTintGetter reader, BlockPos currentPos, BlockState connectiveCurrentState, + Direction textureSide, final Direction horizontal, final Direction vertical, int sh, int sv) { + BlockState trueCurrentState = reader.getBlockState(currentPos); + BlockPos targetPos = currentPos.relative(horizontal, sh) + .relative(vertical, sv); + BlockState connectiveTargetState = + getCTBlockState(reader, trueCurrentState, textureSide, currentPos, targetPos); + return connectsTo(connectiveCurrentState, connectiveTargetState, reader, currentPos, targetPos, textureSide, + sh == 0 ? null : sh == -1 ? horizontal.getOpposite() : horizontal, + sv == 0 ? null : sv == -1 ? vertical.getOpposite() : vertical); + } + + public BlockState getCTBlockState(BlockAndTintGetter reader, BlockState reference, Direction face, BlockPos fromPos, + BlockPos toPos) { + BlockState blockState = reader.getBlockState(toPos); + return blockState.getAppearance(reader, toPos, face, reference, fromPos); + } + + protected boolean reverseUVs(BlockState state, Direction face) { + return false; + } + + protected boolean reverseUVsHorizontally(BlockState state, Direction face) { + return reverseUVs(state, face); + } + + protected boolean reverseUVsVertically(BlockState state, Direction face) { + return reverseUVs(state, face); + } + + protected Direction getUpDirection(BlockAndTintGetter reader, BlockPos pos, BlockState state, Direction face) { + Axis axis = face.getAxis(); + return axis.isHorizontal() ? Direction.UP : Direction.NORTH; + } + + protected Direction getRightDirection(BlockAndTintGetter reader, BlockPos pos, BlockState state, Direction face) { + Axis axis = face.getAxis(); + return axis == Axis.X ? Direction.SOUTH : Direction.WEST; + } + + public CTContext buildContext(BlockAndTintGetter reader, BlockPos pos, BlockState state, Direction face, + ContextRequirement requirement) { + boolean positive = face.getAxisDirection() == AxisDirection.POSITIVE; + Direction h = getRightDirection(reader, pos, state, face); + Direction v = getUpDirection(reader, pos, state, face); + h = positive ? h.getOpposite() : h; + if (face == Direction.DOWN) { + v = v.getOpposite(); + h = h.getOpposite(); + } + + final Direction horizontal = h; + final Direction vertical = v; + + boolean flipH = reverseUVsHorizontally(state, face); + boolean flipV = reverseUVsVertically(state, face); + int sh = flipH ? -1 : 1; + int sv = flipV ? -1 : 1; + + CTContext context = new CTContext(); + + if (requirement.up) { + context.up = testConnection(reader, pos, state, face, horizontal, vertical, 0, sv); + } + if (requirement.down) { + context.down = testConnection(reader, pos, state, face, horizontal, vertical, 0, -sv); + } + if (requirement.left) { + context.left = testConnection(reader, pos, state, face, horizontal, vertical, -sh, 0); + } + if (requirement.right) { + context.right = testConnection(reader, pos, state, face, horizontal, vertical, sh, 0); + } + + if (requirement.topLeft) { + context.topLeft = + context.up && context.left && testConnection(reader, pos, state, face, horizontal, vertical, -sh, sv); + } + if (requirement.topRight) { + context.topRight = + context.up && context.right && testConnection(reader, pos, state, face, horizontal, vertical, sh, sv); + } + if (requirement.bottomLeft) { + context.bottomLeft = context.down && context.left + && testConnection(reader, pos, state, face, horizontal, vertical, -sh, -sv); + } + if (requirement.bottomRight) { + context.bottomRight = context.down && context.right + && testConnection(reader, pos, state, face, horizontal, vertical, sh, -sv); + } + + return context; + } + + public static class CTContext { + public static final CTContext EMPTY = new CTContext(); + + public boolean up, down, left, right; + public boolean topLeft, topRight, bottomLeft, bottomRight; + } + + public static class ContextRequirement { + public final boolean up, down, left, right; + public final boolean topLeft, topRight, bottomLeft, bottomRight; + + public ContextRequirement(boolean up, boolean down, boolean left, boolean right, boolean topLeft, + boolean topRight, boolean bottomLeft, boolean bottomRight) { + this.up = up; + this.down = down; + this.left = left; + this.right = right; + this.topLeft = topLeft; + this.topRight = topRight; + this.bottomLeft = bottomLeft; + this.bottomRight = bottomRight; + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private boolean up, down, left, right; + private boolean topLeft, topRight, bottomLeft, bottomRight; + + public Builder up() { + up = true; + return this; + } + + public Builder down() { + down = true; + return this; + } + + public Builder left() { + left = true; + return this; + } + + public Builder right() { + right = true; + return this; + } + + public Builder topLeft() { + topLeft = true; + return this; + } + + public Builder topRight() { + topRight = true; + return this; + } + + public Builder bottomLeft() { + bottomLeft = true; + return this; + } + + public Builder bottomRight() { + bottomRight = true; + return this; + } + + public Builder horizontal() { + left(); + right(); + return this; + } + + public Builder vertical() { + up(); + down(); + return this; + } + + public Builder axisAligned() { + horizontal(); + vertical(); + return this; + } + + public Builder corners() { + topLeft(); + topRight(); + bottomLeft(); + bottomRight(); + return this; + } + + public Builder all() { + axisAligned(); + corners(); + return this; + } + + public ContextRequirement build() { + return new ContextRequirement(up, down, left, right, topLeft, topRight, bottomLeft, bottomRight); + } + } + } + + public static abstract class Base extends ConnectedTextureBehaviour { + @Override + @Nullable + public abstract CTSpriteShiftEntry getShift(BlockState state, Direction direction, + @Nullable TextureAtlasSprite sprite); + + @Override + @Nullable + public CTType getDataType(BlockAndTintGetter world, BlockPos pos, BlockState state, Direction direction) { + CTSpriteShiftEntry shift = getShift(state, direction, null); + if (shift == null) { + return null; + } + return shift.getType(); + } + } + +} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/block/render/SpriteShiftEntry.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/block/render/SpriteShiftEntry.java deleted file mode 100644 index 334dafe..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/block/render/SpriteShiftEntry.java +++ /dev/null @@ -1,49 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.block.render; - -import com.jozufozu.flywheel.core.StitchedSprite; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.resources.ResourceLocation; - -public class SpriteShiftEntry { - protected StitchedSprite original; - protected StitchedSprite target; - - public void set(ResourceLocation originalTextureLocation, ResourceLocation targetTextureLocation) { - original = new StitchedSprite(originalTextureLocation); - target = new StitchedSprite(targetTextureLocation); - } - - public ResourceLocation getOriginalResourceLocation() { - return original.getLocation(); - } - - public ResourceLocation getTargetResourceLocation() { - return target.getLocation(); - } - - public TextureAtlasSprite getOriginal() { - return original.get(); - } - - public TextureAtlasSprite getTarget() { - return target.get(); - } - - public float getTargetU(float localU) { - return getTarget().getU(getUnInterpolatedU(getOriginal(), localU)); - } - - public float getTargetV(float localV) { - return getTarget().getV(getUnInterpolatedV(getOriginal(), localV)); - } - - public static float getUnInterpolatedU(TextureAtlasSprite sprite, float u) { - float f = sprite.getU1() - sprite.getU0(); - return (u - sprite.getU0()) / f * 16.0F; - } - - public static float getUnInterpolatedV(TextureAtlasSprite sprite, float v) { - float f = sprite.getV1() - sprite.getV0(); - return (v - sprite.getV0()) / f * 16.0F; - } -} 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 aba40fa..bc22ee9 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,6 +2,8 @@ package nl.requios.effortlessbuilding.create.foundation.gui; import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.vertex.PoseStack; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.gui.TickableGuiEventListener; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.EditBox; @@ -106,7 +108,7 @@ public abstract class AbstractSimiScreen extends Screen { @Override public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - partialTicks = minecraft.getFrameTime(); + partialTicks = AnimationTickHolder.getPartialTicksUI(); PoseStack ms = graphics.pose(); ms.pushPose(); 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 76b7180..4032cf4 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,13 +1,14 @@ package nl.requios.effortlessbuilding.create.foundation.gui; import com.mojang.blaze3d.systems.RenderSystem; +import net.createmod.catnip.gui.UIRenderHelper; +import net.createmod.catnip.gui.element.ScreenElement; +import net.createmod.catnip.theme.Color; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.resources.ResourceLocation; import net.neoforged.api.distmarker.Dist; import net.neoforged.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 { @@ -60,7 +61,7 @@ public enum AllGuiTextures implements ScreenElement { } private AllGuiTextures(String namespace, String location, int startX, int startY, int width, int height) { - this.location = new ResourceLocation(namespace, "textures/gui/" + location + ".png"); + this.location = ResourceLocation.fromNamespaceAndPath(namespace, "textures/gui/" + location + ".png"); this.width = width; this.height = height; this.startX = startX; 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 7977644..384615a 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,6 +3,9 @@ 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 net.createmod.catnip.gui.element.DelegatedStencilElement; +import net.createmod.catnip.gui.element.ScreenElement; +import net.createmod.catnip.theme.Color; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.MultiBufferSource; @@ -12,9 +15,6 @@ import net.minecraft.world.phys.Vec3; import net.neoforged.api.distmarker.Dist; import net.neoforged.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 { @@ -202,11 +202,10 @@ public class AllIcons implements ScreenElement { @OnlyIn(Dist.CLIENT) private void vertex(VertexConsumer builder, Matrix4f matrix, Vec3 vec, Color rgb, float u, float v, int light) { - builder.vertex(matrix, (float) vec.x, (float) vec.y, (float) vec.z) - .color(rgb.getRed(), rgb.getGreen(), rgb.getBlue(), 255) - .uv(u, v) - .uv2(light) - .endVertex(); + builder.addVertex(matrix, (float) vec.x, (float) vec.y, (float) vec.z) + .setColor(rgb.getRed(), rgb.getGreen(), rgb.getBlue(), 255) + .setUv(u, v) + .setLight(light); } @OnlyIn(Dist.CLIENT) 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 deleted file mode 100644 index bc48353..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/ConfirmationScreen.java +++ /dev/null @@ -1,229 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.gui; - -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -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; -import java.util.ArrayList; -import java.util.List; -import java.util.function.Consumer; - -public class ConfirmationScreen extends AbstractSimiScreen { - - private Screen source; - private Consumer action = _success -> { - }; - private List text = new ArrayList<>(); - private boolean centered = false; - private int x; - private int y; - private int textWidth; - private int textHeight; - private boolean tristate; - - private BoxWidget confirm; - private BoxWidget confirmDontSave; - private BoxWidget cancel; - private BoxElement textBackground; - - public enum Response { - Confirm, ConfirmDontSave, Cancel - } - - /* - * Removes text lines from the back of the list - * */ - public ConfirmationScreen removeTextLines(int amount) { - if (amount > text.size()) - return clearText(); - - text.subList(text.size() - amount, text.size()).clear(); - return this; - } - - public ConfirmationScreen clearText() { - this.text.clear(); - return this; - } - - public ConfirmationScreen addText(FormattedText text) { - this.text.add(text); - return this; - } - - public ConfirmationScreen withText(FormattedText text) { - return clearText().addText(text); - } - - public ConfirmationScreen at(int x, int y) { - this.x = Math.max(x, 0); - this.y = Math.max(y, 0); - this.centered = false; - return this; - } - - public ConfirmationScreen centered() { - this.centered = true; - return this; - } - - public ConfirmationScreen withAction(Consumer action) { - this.action = r -> action.accept(r == Response.Confirm); - return this; - } - - public ConfirmationScreen withThreeActions(Consumer action) { - this.action = action; - this.tristate = true; - return this; - } - - public void open(@Nonnull Screen source) { - this.source = source; - Minecraft client = source.getMinecraft(); - this.init(client, client.getWindow().getGuiScaledWidth(), client.getWindow().getGuiScaledHeight()); - this.minecraft.screen = this; - } - - @Override - public void tick() { - super.tick(); - source.tick(); - } - - @Override - protected void init() { - super.init(); - - ArrayList copy = new ArrayList<>(text); - text.clear(); - copy.forEach(t -> text.addAll(font.getSplitter().splitLines(t, 300, Style.EMPTY))); - - textHeight = text.size() * (font.lineHeight + 1) + 4; - textWidth = 300; - - if (centered) { - x = width/2 - textWidth/2 - 2; - y = height/2 - textHeight/2 - 16; - } else { - x = Math.max(0, x - textWidth / 2); - y = Math.max(0, y -= textHeight); - } - - if (x + textWidth > width) { - x = width - textWidth; - } - - if (y + textHeight + 30 > height) { - y = height - textHeight - 30; - } - - int buttonX = x + textWidth / 2 - 6 - (int) (70 * (tristate ? 1.5f : 1)); - - TextStencilElement confirmText = - new TextStencilElement(font, tristate ? "Save" : "Confirm").centered(true, true); - confirm = new BoxWidget(buttonX, y + textHeight + 6, 70, 16).withCallback(() -> accept(Response.Confirm)); - confirm.showingElement(confirmText.withElementRenderer(BoxWidget.gradientFactory.apply(confirm))); - addRenderableWidget(confirm); - - buttonX += 12 + 70; - - if (tristate) { - TextStencilElement confirmDontSaveText = - new TextStencilElement(font, "Don't Save").centered(true, true); - confirmDontSave = - new BoxWidget(buttonX, y + textHeight + 6, 70, 16).withCallback(() -> accept(Response.ConfirmDontSave)); - confirmDontSave.showingElement( - confirmDontSaveText.withElementRenderer(BoxWidget.gradientFactory.apply(confirmDontSave))); - addRenderableWidget(confirmDontSave); - buttonX += 12 + 70; - } - - TextStencilElement cancelText = new TextStencilElement(font, "Cancel").centered(true, true); - cancel = new BoxWidget(buttonX, y + textHeight + 6, 70, 16) - .withCallback(() -> accept(Response.Cancel)); - cancel.showingElement(cancelText.withElementRenderer(BoxWidget.gradientFactory.apply(cancel))); - addRenderableWidget(cancel); - - textBackground = new BoxElement() - .gradientBorder(Theme.p(Theme.Key.BUTTON_DISABLE)) - .withBounds(width + 10, textHeight + 35) - .at(-5, y - 5); - - if (text.size() == 1) - x = (width - font.width(text.get(0))) / 2; - } - - @Override - public void onClose() { - accept(Response.Cancel); - } - - private void accept(Response success) { - minecraft.screen = source; - action.accept(success); - } - - @Override - 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); - - for (FormattedText line : text) { - lineY += offset; - if (line == null) - continue; - graphics.drawString(font, line.getString(), x, lineY, 0xeaeaea, false); - } - - ms.popPose(); - } - - @Override - protected void renderWindowBackground(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - endFrame(); - - source.render(graphics, 0, 0, 10); // zero mouse coords to prevent further tooltips - - prepareFrame(); - - graphics.fillGradient(0, 0, this.width, this.height, 0x70101010, 0x80101010); - } - - - @Override - protected void prepareFrame() { - UIRenderHelper.swapAndBlitColor(minecraft.getMainRenderTarget(), UIRenderHelper.framebuffer); - RenderSystem.clear(GL30.GL_STENCIL_BUFFER_BIT | GL30.GL_DEPTH_BUFFER_BIT, Minecraft.ON_OSX); - } - - @Override - protected void endFrame() { - UIRenderHelper.swapAndBlitColor(UIRenderHelper.framebuffer, minecraft.getMainRenderTarget()); - } - - @Override - public void resize(@Nonnull Minecraft client, int width, int height) { - super.resize(client, width, height); - source.resize(client, width, height); - } - - @Override - public boolean isPauseScreen() { - return true; - } -} 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 5e1bfad..70fb8b9 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,10 +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.Axis; +import net.createmod.catnip.gui.ILightingSettings; +import org.joml.Matrix4f; +import org.joml.Vector3f; public class CustomLightingSettings implements ILightingSettings { @@ -39,7 +39,7 @@ public class CustomLightingSettings implements ILightingSettings { @Override public void applyLighting() { - RenderSystem.setupLevelDiffuseLighting(light1, light2, lightMatrix); + RenderSystem.setShaderLights(light1, light2); } public static Builder builder() { diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/ILightingSettings.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/ILightingSettings.java deleted file mode 100644 index a349850..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/ILightingSettings.java +++ /dev/null @@ -1,12 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.gui; - -import com.mojang.blaze3d.platform.Lighting; - -public interface ILightingSettings { - - void applyLighting(); - - static final ILightingSettings DEFAULT_3D = () -> Lighting.setupFor3DItems(); - static final ILightingSettings DEFAULT_FLAT = () -> Lighting.setupForFlatItems(); - -} 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 ab268f8..0cead2f 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,18 +1,7 @@ package nl.requios.effortlessbuilding.create.foundation.gui; -import java.util.ArrayList; -import java.util.List; - -import javax.annotation.Nonnull; - -import net.neoforged.neoforge.client.event.RenderTooltipEvent; -import net.neoforged.neoforge.common.NeoForge; -import org.joml.Matrix4f; - import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.Tesselator; - import net.minecraft.client.gui.Font; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; @@ -21,7 +10,14 @@ import net.minecraft.network.chat.FormattedText; import net.minecraft.network.chat.Style; import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.client.ClientHooks; +import net.neoforged.neoforge.client.event.RenderTooltipEvent; import net.neoforged.neoforge.client.extensions.IGuiGraphicsExtension; +import net.neoforged.neoforge.common.NeoForge; +import org.joml.Matrix4f; + +import javax.annotation.Nonnull; +import java.util.ArrayList; +import java.util.List; public class RemovedGuiUtils { @Nonnull @@ -179,8 +175,7 @@ public class RemovedGuiUtils { graphics.fillGradient(tooltipX - 3, tooltipY + tooltipHeight + 2, tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3, zLevel, borderColorEnd, borderColorEnd); - MultiBufferSource.BufferSource renderType = MultiBufferSource.immediate(Tesselator.getInstance() - .getBuilder()); + MultiBufferSource.BufferSource renderType = graphics.bufferSource(); pStack.translate(0.0D, 0.0D, zLevel); for (int lineNumber = 0; lineNumber < list.size(); ++lineNumber) { diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/Theme.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/Theme.java index 38d1ae6..163450c 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/Theme.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/Theme.java @@ -1,11 +1,16 @@ package nl.requios.effortlessbuilding.create.foundation.gui; -import nl.requios.effortlessbuilding.create.foundation.utility.Color; -import nl.requios.effortlessbuilding.create.foundation.utility.Couple; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.theme.Color; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.*; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; public class Theme { diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/TickableGuiEventListener.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/TickableGuiEventListener.java deleted file mode 100644 index e4bed7d..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/TickableGuiEventListener.java +++ /dev/null @@ -1,7 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.gui; - -import net.minecraft.client.gui.components.events.GuiEventListener; - -public interface TickableGuiEventListener extends GuiEventListener { - void tick(); -} 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 deleted file mode 100644 index 091d5c4..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/UIRenderHelper.java +++ /dev/null @@ -1,327 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.gui; - -import com.mojang.blaze3d.pipeline.RenderTarget; -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.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 org.joml.Matrix4f; -import org.lwjgl.opengl.GL20; -import org.lwjgl.opengl.GL30; - -public class UIRenderHelper { - - /** - * An FBO that has a stencil buffer for use wherever stencil are necessary. Forcing the main FBO to have a stencil - * buffer will cause GL error spam when using fabulous graphics. - */ - public static CustomRenderTarget framebuffer; - - public static void init() { - RenderSystem.recordRenderCall(() -> { - Window mainWindow = Minecraft.getInstance().getWindow(); - framebuffer = CustomRenderTarget.create(mainWindow); - }); - } - - public static void updateWindowSize(Window mainWindow) { - if (framebuffer != null) - framebuffer.resize(mainWindow.getWidth(), mainWindow.getHeight(), Minecraft.ON_OSX); - } - - public static void drawFramebuffer(float alpha) { - framebuffer.renderWithAlpha(alpha); - } - - /** - * Switch from src to dst, after copying the contents of src to dst. - */ - public static void swapAndBlitColor(RenderTarget src, RenderTarget dst) { - GlStateManager._glBindFramebuffer(GL30.GL_READ_FRAMEBUFFER, src.frameBufferId); - GlStateManager._glBindFramebuffer(GL30.GL_DRAW_FRAMEBUFFER, dst.frameBufferId); - GlStateManager._glBlitFrameBuffer(0, 0, src.viewWidth, src.viewHeight, 0, 0, dst.viewWidth, dst.viewHeight, GL30.GL_COLOR_BUFFER_BIT, GL20.GL_LINEAR); - - GlStateManager._glBindFramebuffer(GlConst.GL_FRAMEBUFFER, dst.frameBufferId); - } - - 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(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; - int a4 = 0x00 << 24; - - color &= 0x00FFFFFF; - int c1 = a1 | color; - int c2 = a2 | color; - int c3 = a3 | color; - int c4 = a4 | color; - - PoseStack ms = graphics.pose(); - ms.pushPose(); - ms.translate(x, y, 0); - ms.mulPose(Axis.ZP.rotationDegrees(angle - 90)); - - streak(graphics, breadth / 2, length, c1, c2, c3, c4); - - ms.popPose(); - } - - 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(Axis.ZP.rotationDegrees(angle - 90)); - - streak(graphics, breadth / 2, length, c1, c2, c3, c4); - - ms.popPose(); - } - - private static void streak(GuiGraphics graphics, int width, int height, int c1, int c2, int c3, int c4) { - double split1 = .5; - double split2 = .75; - 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(GuiGraphics, float, int, int, int, int, int, Color, Color) - */ - public static void angledGradient(GuiGraphics graphics, float angle, int x, int y, int breadth, int length, Couple c) { - angledGradient(graphics, angle, x, y, 0, breadth, length, c); - } - - /** - * @see #angledGradient(GuiGraphics, float, int, int, int, int, int, Color, Color) - */ - public static void angledGradient(GuiGraphics graphics, float angle, int x, int y, int z, int breadth, int length, Couple c) { - angledGradient(graphics, angle, x, y, z, breadth, length, c.getFirst(), c.getSecond()); - } - - /** - * @see #angledGradient(GuiGraphics, float, int, int, int, int, int, Color, Color) - */ - public static void angledGradient(GuiGraphics graphics, float angle, int x, int y, int breadth, int length, Color color1, Color color2) { - angledGradient(graphics, angle, x, y, 0, breadth, length, color1, color2); - } - - /** - * x and y specify the middle point of the starting edge - * - * @param angle the angle of the gradient in degrees; 0° means from left to right - * @param color1 the color at the starting edge - * @param color2 the color at the ending edge - * @param breadth the total width of the gradient - */ - public static void angledGradient(GuiGraphics graphics, float angle, int x, int y, int z, int breadth, int length, Color color1, Color color2) { - PoseStack ms = graphics.pose(); - ms.pushPose(); - ms.translate(x, y, z); - ms.mulPose(Axis.ZP.rotationDegrees(angle - 90)); - - int w = breadth / 2; - graphics.fillGradient(-w, 0, w, length, 0, color1.getRGB(), color2.getRGB()); - - ms.popPose(); - } - - 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(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(graphics, width, height, indent, startColor, endColor); - - matrixStack.popPose(); - } - - private static void breadcrumbArrow(GuiGraphics graphics, int width, int height, int indent, Color c1, Color c2) { - - /* - * 0,0 x1,y1 ********************* x4,y4 ***** x7,y7 - * **** **** - * **** **** - * x0,y0 x2,y2 x5,y5 - * **** **** - * **** **** - * x3,y3 ********************* x6,y6 ***** x8,y8 - * - */ - - float x0 = 0, y0 = height / 2f; - float x1 = indent, y1 = 0; - float x2 = indent, y2 = height / 2f; - float x3 = indent, y3 = height; - float x4 = width, y4 = 0; - float x5 = width, y5 = height / 2f; - float x6 = width, y6 = height; - float x7 = indent + width, y7 = 0; - float x8 = indent + width, y8 = height; - - indent = Math.abs(indent); - width = Math.abs(width); - Color fc1 = Color.mixColors(c1, c2, 0); - Color fc2 = Color.mixColors(c1, c2, (indent) / (width + 2f * indent)); - Color fc3 = Color.mixColors(c1, c2, (indent + width) / (width + 2f * indent)); - Color fc4 = Color.mixColors(c1, c2, 1); - -// RenderSystem.disableTexture(); - RenderSystem.enableBlend(); - RenderSystem.disableCull(); - RenderSystem.defaultBlendFunc(); - RenderSystem.setShader(GameRenderer::getPositionColorShader); - - Tesselator tessellator = Tesselator.getInstance(); - BufferBuilder bufferbuilder = tessellator.getBuilder(); - 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(); - bufferbuilder.vertex(model, x1, y1, 0).color(fc2.getRed(), fc2.getGreen(), fc2.getBlue(), fc2.getAlpha()).endVertex(); - bufferbuilder.vertex(model, x2, y2, 0).color(fc2.getRed(), fc2.getGreen(), fc2.getBlue(), fc2.getAlpha()).endVertex(); - - bufferbuilder.vertex(model, x0, y0, 0).color(fc1.getRed(), fc1.getGreen(), fc1.getBlue(), fc1.getAlpha()).endVertex(); - bufferbuilder.vertex(model, x2, y2, 0).color(fc2.getRed(), fc2.getGreen(), fc2.getBlue(), fc2.getAlpha()).endVertex(); - bufferbuilder.vertex(model, x3, y3, 0).color(fc2.getRed(), fc2.getGreen(), fc2.getBlue(), fc2.getAlpha()).endVertex(); - - bufferbuilder.vertex(model, x3, y3, 0).color(fc2.getRed(), fc2.getGreen(), fc2.getBlue(), fc2.getAlpha()).endVertex(); - bufferbuilder.vertex(model, x1, y1, 0).color(fc2.getRed(), fc2.getGreen(), fc2.getBlue(), fc2.getAlpha()).endVertex(); - bufferbuilder.vertex(model, x4, y4, 0).color(fc3.getRed(), fc3.getGreen(), fc3.getBlue(), fc3.getAlpha()).endVertex(); - - bufferbuilder.vertex(model, x3, y3, 0).color(fc2.getRed(), fc2.getGreen(), fc2.getBlue(), fc2.getAlpha()).endVertex(); - bufferbuilder.vertex(model, x4, y4, 0).color(fc3.getRed(), fc3.getGreen(), fc3.getBlue(), fc3.getAlpha()).endVertex(); - bufferbuilder.vertex(model, x6, y6, 0).color(fc3.getRed(), fc3.getGreen(), fc3.getBlue(), fc3.getAlpha()).endVertex(); - - bufferbuilder.vertex(model, x5, y5, 0).color(fc3.getRed(), fc3.getGreen(), fc3.getBlue(), fc3.getAlpha()).endVertex(); - bufferbuilder.vertex(model, x4, y4, 0).color(fc3.getRed(), fc3.getGreen(), fc3.getBlue(), fc3.getAlpha()).endVertex(); - bufferbuilder.vertex(model, x7, y7, 0).color(fc4.getRed(), fc4.getGreen(), fc4.getBlue(), fc4.getAlpha()).endVertex(); - - bufferbuilder.vertex(model, x6, y6, 0).color(fc3.getRed(), fc3.getGreen(), fc3.getBlue(), fc3.getAlpha()).endVertex(); - bufferbuilder.vertex(model, x5, y5, 0).color(fc3.getRed(), fc3.getGreen(), fc3.getBlue(), fc3.getAlpha()).endVertex(); - bufferbuilder.vertex(model, x8, y8, 0).color(fc4.getRed(), fc4.getGreen(), fc4.getBlue(), fc4.getAlpha()).endVertex(); - - tessellator.end(); - RenderSystem.enableCull(); - RenderSystem.disableBlend(); -// RenderSystem.enableTexture(); - } - - //just like AbstractGui#drawTexture, but with a color at every vertex - public static void drawColoredTexture(GuiGraphics graphics, Color c, int x, int y, int tex_left, int tex_top, int width, int height) { - drawColoredTexture(graphics, c, x, y, 0, (float) tex_left, (float) tex_top, width, height, 256, 256); - } - - public static void drawColoredTexture(GuiGraphics graphics, Color c, int x, int y, int z, float tex_left, float tex_top, int width, int height, int sheet_width, int sheet_height) { - drawColoredTexture(graphics, c, x, x + width, y, y + height, z, width, height, tex_left, tex_top, sheet_width, sheet_height); - } - - public static void drawStretched(GuiGraphics graphics, int left, int top, int w, int h, int z, AllGuiTextures tex) { - tex.bind(); - 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); - } - - 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) { - Tesselator tesselator = Tesselator.getInstance(); - BufferBuilder bufferbuilder = tesselator.getBuilder(); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - RenderSystem.setShader(GameRenderer::getPositionColorTexShader); - bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR_TEX); - bufferbuilder.vertex(m, (float) left , (float) bot, (float) z).color(c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()).uv(u1, v2).endVertex(); - bufferbuilder.vertex(m, (float) right, (float) bot, (float) z).color(c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()).uv(u2, v2).endVertex(); - bufferbuilder.vertex(m, (float) right, (float) top, (float) z).color(c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()).uv(u2, v1).endVertex(); - bufferbuilder.vertex(m, (float) left , (float) top, (float) z).color(c.getRed(), c.getGreen(), c.getBlue(), c.getAlpha()).uv(u1, v1).endVertex(); - tesselator.end(); - RenderSystem.disableBlend(); - } - - public static void flipForGuiRender(PoseStack poseStack) { - poseStack.mulPoseMatrix(new Matrix4f().scaling(1, -1, 1)); - } - - public static class CustomRenderTarget extends RenderTarget { - - public CustomRenderTarget(boolean useDepth) { - super(useDepth); - } - - public static CustomRenderTarget create(Window mainWindow) { - CustomRenderTarget framebuffer = new CustomRenderTarget(true); - framebuffer.resize(mainWindow.getWidth(), mainWindow.getHeight(), Minecraft.ON_OSX); - framebuffer.setClearColor(0, 0, 0, 0); - framebuffer.enableStencil(); - return framebuffer; - } - - public void renderWithAlpha(float alpha) { - Window window = Minecraft.getInstance().getWindow(); - - float vx = (float) window.getGuiScaledWidth(); - float vy = (float) window.getGuiScaledHeight(); - float tx = (float) viewWidth / (float) width; - float ty = (float) viewHeight / (float) height; - -// RenderSystem.enableTexture(); - RenderSystem.enableDepthTest(); - RenderSystem.setShader(() -> Minecraft.getInstance().gameRenderer.blitShader); - RenderSystem.getShader().setSampler("DiffuseSampler", colorTextureId); - - bindRead(); - - Tesselator tessellator = Tesselator.getInstance(); - BufferBuilder bufferbuilder = tessellator.getBuilder(); - bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR_TEX); - - bufferbuilder.vertex(0, vy, 0).color(1, 1, 1, alpha).uv(0, 0).endVertex(); - bufferbuilder.vertex(vx, vy, 0).color(1, 1, 1, alpha).uv(tx, 0).endVertex(); - bufferbuilder.vertex(vx, 0, 0).color(1, 1, 1, alpha).uv(tx, ty).endVertex(); - bufferbuilder.vertex(0, 0, 0).color(1, 1, 1, alpha).uv(0, ty).endVertex(); - - tessellator.end(); - unbindRead(); - } - - } - -} 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 166679e..85789b4 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,6 +1,8 @@ package nl.requios.effortlessbuilding.create.foundation.gui.container; import com.mojang.blaze3d.platform.InputConstants; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.gui.TickableGuiEventListener; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.components.EditBox; @@ -15,7 +17,6 @@ import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.AbstractContainerMenu; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; -import nl.requios.effortlessbuilding.create.foundation.gui.TickableGuiEventListener; import nl.requios.effortlessbuilding.create.foundation.gui.widget.AbstractSimiWidget; import javax.annotation.ParametersAreNonnullByDefault; @@ -92,7 +93,7 @@ public abstract class AbstractSimiContainerScreen { -// 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/GhostItemMenu.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/GhostItemMenu.java index 03c3063..d69711c 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/GhostItemMenu.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/GhostItemMenu.java @@ -7,7 +7,6 @@ import net.minecraft.world.inventory.ClickType; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.items.ItemHandlerHelper; import net.neoforged.neoforge.items.ItemStackHandler; public abstract class GhostItemMenu extends MenuBase implements IClearableMenu { @@ -88,7 +87,7 @@ public abstract class GhostItemMenu extends MenuBase implements IClearable ItemStack stackToInsert = playerInventory.getItem(index); for (int i = 0; i < ghostInventory.getSlots(); i++) { ItemStack stack = ghostInventory.getStackInSlot(i); - if (!allowRepeats() && ItemHandlerHelper.canItemStacksStack(stack, stackToInsert)) + if (!allowRepeats() && ItemStack.isSameItemSameComponents(stack, stackToInsert)) break; if (stack.isEmpty()) { ItemStack copy = stackToInsert.copy(); 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 deleted file mode 100644 index bde9ee2..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/container/GhostItemSubmitPacket.java +++ /dev/null @@ -1,45 +0,0 @@ -//package nl.requios.effortlessbuilding.create.foundation.gui.container; -// -//import net.minecraft.network.FriendlyByteBuf; -//import net.minecraft.server.level.ServerPlayer; -//import net.minecraft.world.item.ItemStack; -//import net.neoforged.neoforge.network.NetworkEvent.Context; -//import nl.requios.effortlessbuilding.create.foundation.networking.SimplePacketBase; -// -//public class GhostItemSubmitPacket extends SimplePacketBase { -// -// private final ItemStack item; -// private final int slot; -// -// public GhostItemSubmitPacket(ItemStack item, int slot) { -// this.item = item; -// this.slot = slot; -// } -// -// public GhostItemSubmitPacket(FriendlyByteBuf buffer) { -// item = buffer.readItem(); -// slot = buffer.readInt(); -// } -// -// @Override -// public void write(FriendlyByteBuf buffer) { -// buffer.writeItem(item); -// buffer.writeInt(slot); -// } -// -// @Override -// public boolean handle(Context context) { -// context.enqueueWork(() -> { -// ServerPlayer player = context.getSender(); -// if (player == null) -// return; -// -// 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/element/BoxElement.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/BoxElement.java deleted file mode 100644 index 93aac3d..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/BoxElement.java +++ /dev/null @@ -1,158 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.gui.element; - -import com.mojang.blaze3d.systems.RenderSystem; -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 org.joml.Matrix4f; - -public class BoxElement extends RenderElement { - - protected Color background = new Color(0xff000000, true); - protected Color borderTop = new Color(0x40ffeedd, true); - protected Color borderBot = new Color(0x20ffeedd, true); - protected int borderOffset = 2; - - public T withBackground(Color color) { - this.background = color; - //noinspection unchecked - return (T) this; - } - - public T withBackground(int color) { - return withBackground(new Color(color, true)); - } - - public T flatBorder(Color color) { - this.borderTop = color; - this.borderBot = color; - //noinspection unchecked - return (T) this; - } - - public T flatBorder(int color) { - return flatBorder(new Color(color, true)); - } - - public T gradientBorder(Couple colors) { - this.borderTop = colors.getFirst(); - this.borderBot = colors.getSecond(); - //noinspection unchecked - return (T) this; - } - - public T gradientBorder(Color top, Color bot) { - this.borderTop = top; - this.borderBot = bot; - //noinspection unchecked - return (T) this; - } - - public T gradientBorder(int top, int bot) { - return gradientBorder(new Color(top, true), new Color(bot, true)); - } - - public T withBorderOffset(int offset) { - this.borderOffset = offset; - //noinspection unchecked - return (T) this; - } - - @Override - public void render(GuiGraphics graphics) { - renderBox(graphics.pose()); - } - - //total box width = 1 * 2 (outer border) + 1 * 2 (inner color border) + 2 * borderOffset + width - //defaults to 2 + 2 + 4 + 16 = 24px - //batch everything together to save a bunch of gl calls over ScreenUtils - protected void renderBox(PoseStack ms) { - /* - * _____________ - * _|_____________|_ - * | | ___________ | | - * | | | | | | | - * | | | | | | | - * | | |--* | | | | - * | | | h | | | - * | | | --w-+ | | | - * | | | | | | - * | | |_________| | | - * |_|_____________|_| - * |_____________| - * - * */ -// RenderSystem.disableTexture(); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - RenderSystem.setShader(GameRenderer::getPositionColorShader); - - Matrix4f model = ms.last().pose(); - int f = borderOffset; - Color c1 = background.copy().scaleAlpha(alpha); - Color c2 = borderTop.copy().scaleAlpha(alpha); - Color c3 = borderBot.copy().scaleAlpha(alpha); - Tesselator tessellator = Tesselator.getInstance(); - BufferBuilder b = tessellator.getBuilder(); - - b.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); - //outer top - b.vertex(model, x - f - 1 , y - f - 2 , z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x - f - 1 , y - f - 1 , z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x + f + 1 + width, y - f - 1 , z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x + f + 1 + width, y - f - 2 , z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - //outer left - b.vertex(model, x - f - 2 , y - f - 1 , z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x - f - 2 , y + f + 1 + height, z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x - f - 1 , y + f + 1 + height, z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x - f - 1 , y - f - 1 , z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - //outer bottom - b.vertex(model, x - f - 1 , y + f + 1 + height, z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x - f - 1 , y + f + 2 + height, z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x + f + 1 + width, y + f + 2 + height, z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x + f + 1 + width, y + f + 1 + height, z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - //outer right - b.vertex(model, x + f + 1 + width, y - f - 1 , z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x + f + 1 + width, y + f + 1 + height, z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x + f + 2 + width, y + f + 1 + height, z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x + f + 2 + width, y - f - 1 , z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - //inner background - also render behind the inner edges - b.vertex(model, x - f - 1 , y - f - 1 , z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x - f - 1 , y + f + 1 + height, z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x + f + 1 + width, y + f + 1 + height, z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - b.vertex(model, x + f + 1 + width, y - f - 1 , z).color(c1.getRed(), c1.getGreen(), c1.getBlue(), c1.getAlpha()).endVertex(); - tessellator.end(); - b.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); - //inner top - includes corners - b.vertex(model, x - f - 1 , y - f - 1 , z).color(c2.getRed(), c2.getGreen(), c2.getBlue(), c2.getAlpha()).endVertex(); - b.vertex(model, x - f - 1 , y - f , z).color(c2.getRed(), c2.getGreen(), c2.getBlue(), c2.getAlpha()).endVertex(); - b.vertex(model, x + f + 1 + width, y - f , z).color(c2.getRed(), c2.getGreen(), c2.getBlue(), c2.getAlpha()).endVertex(); - b.vertex(model, x + f + 1 + width, y - f - 1 , z).color(c2.getRed(), c2.getGreen(), c2.getBlue(), c2.getAlpha()).endVertex(); - //inner left - excludes corners - b.vertex(model, x - f - 1 , y - f , z).color(c2.getRed(), c2.getGreen(), c2.getBlue(), c2.getAlpha()).endVertex(); - b.vertex(model, x - f - 1 , y + f + height, z).color(c3.getRed(), c3.getGreen(), c3.getBlue(), c3.getAlpha()).endVertex(); - b.vertex(model, x - f , y + f + height, z).color(c3.getRed(), c3.getGreen(), c3.getBlue(), c3.getAlpha()).endVertex(); - b.vertex(model, x - f , y - f , z).color(c2.getRed(), c2.getGreen(), c2.getBlue(), c2.getAlpha()).endVertex(); - //inner bottom - includes corners - b.vertex(model, x - f - 1 , y + f + height, z).color(c3.getRed(), c3.getGreen(), c3.getBlue(), c3.getAlpha()).endVertex(); - b.vertex(model, x - f - 1 , y + f + 1 + height, z).color(c3.getRed(), c3.getGreen(), c3.getBlue(), c3.getAlpha()).endVertex(); - b.vertex(model, x + f + 1 + width, y + f + 1 + height, z).color(c3.getRed(), c3.getGreen(), c3.getBlue(), c3.getAlpha()).endVertex(); - b.vertex(model, x + f + 1 + width, y + f + height, z).color(c3.getRed(), c3.getGreen(), c3.getBlue(), c3.getAlpha()).endVertex(); - //inner right - excludes corners - b.vertex(model, x + f + width, y - f , z).color(c2.getRed(), c2.getGreen(), c2.getBlue(), c2.getAlpha()).endVertex(); - b.vertex(model, x + f + width, y + f + height, z).color(c3.getRed(), c3.getGreen(), c3.getBlue(), c3.getAlpha()).endVertex(); - b.vertex(model, x + f + 1 + width, y + f + height, z).color(c3.getRed(), c3.getGreen(), c3.getBlue(), c3.getAlpha()).endVertex(); - b.vertex(model, x + f + 1 + width, y - f , z).color(c2.getRed(), c2.getGreen(), c2.getBlue(), c2.getAlpha()).endVertex(); - - tessellator.end(); - - RenderSystem.disableBlend(); -// 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 deleted file mode 100644 index 57315ce..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/CombinedStencilElement.java +++ /dev/null @@ -1,82 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.gui.element; - -import javax.annotation.Nonnull; - -import com.mojang.blaze3d.vertex.PoseStack; - -import net.minecraft.client.gui.GuiGraphics; - -public class CombinedStencilElement extends StencilElement { - - private StencilElement element1; - private StencilElement element2; - private ElementMode mode; - - private CombinedStencilElement() {} - - public static CombinedStencilElement of(@Nonnull StencilElement element1, @Nonnull StencilElement element2) { - return of(element1, element2, ElementMode.FIRST); - } - - public static CombinedStencilElement of(@Nonnull StencilElement element1, @Nonnull StencilElement element2, ElementMode mode) { - CombinedStencilElement e = new CombinedStencilElement(); - e.element1 = element1; - e.element2 = element2; - e.mode = mode; - return e; - } - - public T withFirst(StencilElement element) { - this.element1 = element; - //noinspection unchecked - return (T) this; - } - - public T withSecond(StencilElement element) { - this.element2 = element; - //noinspection unchecked - return (T) this; - } - - public T withMode(ElementMode mode) { - this.mode = mode; - //noinspection unchecked - return (T) this; - } - - @Override - protected void renderStencil(GuiGraphics graphics) { - PoseStack ms = graphics.pose(); - ms.pushPose(); - element1.transform(ms); - element1.withBounds(width, height); - element1.renderStencil(graphics); - ms.popPose(); - ms.pushPose(); - element2.transform(ms); - element2.withBounds(width, height); - element2.renderStencil(graphics); - ms.popPose(); - } - - @Override - protected void renderElement(GuiGraphics graphics) { - if (mode.rendersFirst()) - element1.withBounds(width, height).renderElement(graphics); - - if (mode.rendersSecond()) - element2.withBounds(width, height).renderElement(graphics); - } - - public enum ElementMode { - FIRST, SECOND, BOTH; - - boolean rendersFirst() { - return this == FIRST || this == BOTH; - } - - boolean rendersSecond() { - return this == SECOND || this == BOTH; - } - } -} 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 deleted file mode 100644 index 2fecfa3..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/DelegatedStencilElement.java +++ /dev/null @@ -1,52 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.gui.element; - -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 = (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; - - public DelegatedStencilElement() { - stencil = EMPTY_RENDERER; - element = DEFAULT_ELEMENT; - } - - public DelegatedStencilElement(ElementRenderer stencil, ElementRenderer element) { - this.stencil = stencil; - this.element = element; - } - - public T withStencilRenderer(ElementRenderer renderer) { - stencil = renderer; - //noinspection unchecked - return (T) this; - } - - public T withElementRenderer(ElementRenderer renderer) { - element = renderer; - //noinspection unchecked - return (T) this; - } - - @Override - protected void renderStencil(GuiGraphics graphics) { - stencil.render(graphics, width, height, 1); - } - - @Override - protected void renderElement(GuiGraphics graphics) { - element.render(graphics, width, height, alpha); - } - - @FunctionalInterface - public interface ElementRenderer { - 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 deleted file mode 100644 index 75f48af..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/GuiGameElement.java +++ /dev/null @@ -1,301 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.gui.element; - -import com.jozufozu.flywheel.core.PartialModel; -import com.jozufozu.flywheel.core.model.ModelUtil; -import com.mojang.blaze3d.platform.GlStateManager.DestFactor; -import com.mojang.blaze3d.platform.GlStateManager.SourceFactor; -import com.mojang.blaze3d.platform.Lighting; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -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.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; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.LiquidBlock; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Fluid; -import net.minecraft.world.phys.Vec3; -import net.neoforged.neoforge.client.RenderTypeHelper; -import nl.requios.effortlessbuilding.create.foundation.gui.ILightingSettings; -import nl.requios.effortlessbuilding.create.foundation.gui.UIRenderHelper; -import nl.requios.effortlessbuilding.create.foundation.utility.Color; -import nl.requios.effortlessbuilding.create.foundation.utility.VecHelper; - -import javax.annotation.Nullable; - -public class GuiGameElement { - - public static GuiRenderBuilder of(ItemStack stack) { - return new GuiItemRenderBuilder(stack); - } - - public static GuiRenderBuilder of(ItemLike itemProvider) { - return new GuiItemRenderBuilder(itemProvider); - } - - public static GuiRenderBuilder of(BlockState state) { - return new GuiBlockStateRenderBuilder(state); - } - - public static GuiRenderBuilder of(PartialModel partial) { - return new GuiBlockPartialRenderBuilder(partial); - } - - public static GuiRenderBuilder of(Fluid fluid) { - return new GuiBlockStateRenderBuilder(fluid.defaultFluidState() - .createLegacyBlock() - .setValue(LiquidBlock.LEVEL, 0)); - } - - public static abstract class GuiRenderBuilder extends RenderElement { - protected double xLocal, yLocal, zLocal; - protected double xRot, yRot, zRot; - protected double scale = 1; - protected int color = 0xFFFFFF; - protected Vec3 rotationOffset = Vec3.ZERO; - protected ILightingSettings customLighting = null; - - public GuiRenderBuilder atLocal(double x, double y, double z) { - this.xLocal = x; - this.yLocal = y; - this.zLocal = z; - return this; - } - - public GuiRenderBuilder rotate(double xRot, double yRot, double zRot) { - this.xRot = xRot; - this.yRot = yRot; - this.zRot = zRot; - return this; - } - - public GuiRenderBuilder rotateBlock(double xRot, double yRot, double zRot) { - return this.rotate(xRot, yRot, zRot) - .withRotationOffset(VecHelper.getCenterOf(BlockPos.ZERO)); - } - - public GuiRenderBuilder scale(double scale) { - this.scale = scale; - return this; - } - - public GuiRenderBuilder color(int color) { - this.color = color; - return this; - } - - public GuiRenderBuilder withRotationOffset(Vec3 offset) { - this.rotationOffset = offset; - return this; - } - - public GuiRenderBuilder lighting(ILightingSettings lighting) { - customLighting = lighting; - return this; - } - - protected void prepareMatrix(PoseStack matrixStack) { - matrixStack.pushPose(); - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - RenderSystem.enableDepthTest(); - RenderSystem.enableBlend(); - RenderSystem.blendFunc(SourceFactor.SRC_ALPHA, DestFactor.ONE_MINUS_SRC_ALPHA); - prepareLighting(matrixStack); - } - - protected void transformMatrix(PoseStack matrixStack) { - matrixStack.translate(x, y, z); - matrixStack.scale((float) scale, (float) scale, (float) scale); - matrixStack.translate(xLocal, yLocal, zLocal); - UIRenderHelper.flipForGuiRender(matrixStack); - matrixStack.translate(rotationOffset.x, rotationOffset.y, rotationOffset.z); - 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); - } - - protected void cleanUpMatrix(PoseStack matrixStack) { - matrixStack.popPose(); - cleanUpLighting(matrixStack); - } - - protected void prepareLighting(PoseStack matrixStack) { - if (customLighting != null) { - customLighting.applyLighting(); - } else { - Lighting.setupFor3DItems(); - } - } - - protected void cleanUpLighting(PoseStack matrixStack) { - if (customLighting != null) { - Lighting.setupFor3DItems(); - } - } - } - - private static class GuiBlockModelRenderBuilder extends GuiRenderBuilder { - - protected BakedModel blockModel; - protected BlockState blockState; - - public GuiBlockModelRenderBuilder(BakedModel blockmodel, @Nullable BlockState blockState) { - this.blockState = blockState == null ? Blocks.AIR.defaultBlockState() : blockState; - this.blockModel = blockmodel; - } - - @Override - public void render(GuiGraphics graphics) { - PoseStack matrixStack = graphics.pose(); - prepareMatrix(matrixStack); - - Minecraft mc = Minecraft.getInstance(); - BlockRenderDispatcher blockRenderer = mc.getBlockRenderer(); - MultiBufferSource.BufferSource buffer = mc.renderBuffers() - .bufferSource(); - - transformMatrix(matrixStack); - - RenderSystem.setShaderTexture(0, InventoryMenu.BLOCK_ATLAS); - renderModel(blockRenderer, buffer, matrixStack); - - cleanUpMatrix(matrixStack); - } - - protected void renderModel(BlockRenderDispatcher blockRenderer, MultiBufferSource.BufferSource buffer, - PoseStack ms) { - if (blockState.getBlock() == Blocks.AIR) { - RenderType renderType = Sheets.translucentCullBlockSheet(); - blockRenderer.getModelRenderer() - .renderModel(ms.last(), buffer.getBuffer(renderType), blockState, blockModel, 1, 1, 1, - LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, ModelUtil.VIRTUAL_DATA, null); - } else { - int color = Minecraft.getInstance() - .getBlockColors() - .getColor(blockState, null, null, 0); - Color rgb = new Color(color == -1 ? this.color : color); - - for (RenderType chunkType : blockModel.getRenderTypes(blockState, RandomSource.create(42L), ModelUtil.VIRTUAL_DATA)) { - RenderType renderType = RenderTypeHelper.getEntityRenderType(chunkType, true); - blockRenderer.getModelRenderer() - .renderModel(ms.last(), buffer.getBuffer(renderType), blockState, blockModel, - rgb.getRedAsFloat(), rgb.getGreenAsFloat(), rgb.getBlueAsFloat(), - LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, ModelUtil.VIRTUAL_DATA, chunkType); - } - } - - buffer.endBatch(); - } - - } - - public static class GuiBlockStateRenderBuilder extends GuiBlockModelRenderBuilder { - - public GuiBlockStateRenderBuilder(BlockState blockstate) { - super(Minecraft.getInstance() - .getBlockRenderer() - .getBlockModel(blockstate), blockstate); - } - - @Override - protected void renderModel(BlockRenderDispatcher blockRenderer, MultiBufferSource.BufferSource buffer, - PoseStack ms) { - if (blockState.getBlock() instanceof BaseFireBlock) { - Lighting.setupForFlatItems(); - super.renderModel(blockRenderer, buffer, ms); - Lighting.setupFor3DItems(); - return; - } - - super.renderModel(blockRenderer, buffer, ms); - - if (blockState.getFluidState() - .isEmpty()) - return; - -// FluidRenderer.renderFluidBox(new FluidStack(blockState.getFluidState() -// .getType(), 1000), 0, 0, 0, 1, 1, 1, buffer, ms, LightTexture.FULL_BRIGHT, false); -// buffer.endBatch(); - } - } - - public static class GuiBlockPartialRenderBuilder extends GuiBlockModelRenderBuilder { - - public GuiBlockPartialRenderBuilder(PartialModel partial) { - super(partial.get(), null); - } - - } - - public static class GuiItemRenderBuilder extends GuiRenderBuilder { - - private final ItemStack stack; - - public GuiItemRenderBuilder(ItemStack stack) { - this.stack = stack; - } - - public GuiItemRenderBuilder(ItemLike provider) { - this(new ItemStack(provider)); - } - - @Override - public void render(GuiGraphics graphics) { - PoseStack matrixStack = graphics.pose(); - prepareMatrix(matrixStack); - transformMatrix(matrixStack); - renderItemIntoGUI(matrixStack, stack, customLighting == null); - cleanUpMatrix(matrixStack); - } - - public static void renderItemIntoGUI(PoseStack matrixStack, ItemStack stack, boolean useDefaultLighting) { - ItemRenderer renderer = Minecraft.getInstance().getItemRenderer(); - BakedModel bakedModel = renderer.getModel(stack, null, null, 0); - - Minecraft.getInstance().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); - matrixStack.translate(8.0F, -8.0F, 0.0F); - matrixStack.scale(16.0F, 16.0F, 16.0F); - MultiBufferSource.BufferSource buffer = Minecraft.getInstance().renderBuffers().bufferSource(); - boolean flatLighting = !bakedModel.usesBlockLight(); - if (useDefaultLighting && flatLighting) { - Lighting.setupForFlatItems(); - } - - 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(); - } - - matrixStack.popPose(); - } - - } - -} 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 deleted file mode 100644 index 16a7519..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/RenderElement.java +++ /dev/null @@ -1,89 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.gui.element; - -import net.minecraft.client.gui.GuiGraphics; - -public abstract class RenderElement implements ScreenElement { - - public static final RenderElement EMPTY = new RenderElement() { - @Override - public void render(GuiGraphics graphics) { - } - }; - - public static RenderElement of(ScreenElement renderable) { - return new SimpleRenderElement(renderable); - } - - protected int width = 16, height = 16; - protected float x = 0, y = 0, z = 0; - protected float alpha = 1f; - - public T at(float x, float y) { - this.x = x; - this.y = y; - //noinspection unchecked - return (T) this; - } - - public T at(float x, float y, float z) { - this.x = x; - this.y = y; - this.z = z; - //noinspection unchecked - return (T) this; - } - - public T withBounds(int width, int height) { - this.width = width; - this.height = height; - //noinspection unchecked - return (T) this; - } - - public T withAlpha(float alpha) { - this.alpha = alpha; - //noinspection unchecked - return (T) this; - } - - public int getWidth() { - return width; - } - - public int getHeight() { - return height; - } - - public float getX() { - return x; - } - - public float getY() { - return y; - } - - public float getZ() { - return z; - } - - public abstract void render(GuiGraphics graphics); - - @Override - public void render(GuiGraphics graphics, int x, int y) { - this.at(x, y).render(graphics); - } - - public static class SimpleRenderElement extends RenderElement { - - private ScreenElement renderable; - - public SimpleRenderElement(ScreenElement renderable) { - this.renderable = renderable; - } - - @Override - 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 deleted file mode 100644 index 6a6f9ba..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/ScreenElement.java +++ /dev/null @@ -1,12 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.gui.element; - -import net.minecraft.client.gui.GuiGraphics; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; - -public interface ScreenElement { - - @OnlyIn(Dist.CLIENT) - 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 deleted file mode 100644 index 968ab5d..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/StencilElement.java +++ /dev/null @@ -1,54 +0,0 @@ -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 net.minecraft.client.gui.GuiGraphics; - -public abstract class StencilElement extends RenderElement { - - @Override - public void render(GuiGraphics graphics) { - PoseStack ms = graphics.pose(); - ms.pushPose(); - transform(ms); - prepareStencil(ms); - renderStencil(graphics); - prepareElement(ms); - renderElement(graphics); - cleanUp(ms); - ms.popPose(); - } - - protected abstract void renderStencil(GuiGraphics graphics); - - protected abstract void renderElement(GuiGraphics graphics); - - protected void transform(PoseStack ms) { - ms.translate(x, y, z); - } - - protected void prepareStencil(PoseStack ms) { - GL11.glDisable(GL11.GL_STENCIL_TEST); - RenderSystem.stencilMask(~0); - RenderSystem.clear(GL11.GL_STENCIL_BUFFER_BIT, Minecraft.ON_OSX); - GL11.glEnable(GL11.GL_STENCIL_TEST); - RenderSystem.stencilOp(GL11.GL_REPLACE, GL11.GL_KEEP, GL11.GL_KEEP); - RenderSystem.stencilMask(0xFF); - RenderSystem.stencilFunc(GL11.GL_NEVER, 1, 0xFF); - } - - protected void prepareElement(PoseStack ms) { - GL11.glEnable(GL11.GL_STENCIL_TEST); - RenderSystem.stencilOp(GL11.GL_KEEP, GL11.GL_KEEP, GL11.GL_KEEP); - RenderSystem.stencilFunc(GL11.GL_EQUAL, 1, 0xFF); - } - - protected void cleanUp(PoseStack ms) { - GL11.glDisable(GL11.GL_STENCIL_TEST); - - } -} 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 deleted file mode 100644 index 82c554e..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/element/TextStencilElement.java +++ /dev/null @@ -1,79 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.gui.element; - -import com.mojang.blaze3d.vertex.PoseStack; -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 { - - protected Font font; - protected MutableComponent component; - protected boolean centerVertically = false; - protected boolean centerHorizontally = false; - - public TextStencilElement(Font font) { - super(); - this.font = font; - height = 10; - } - - public TextStencilElement(Font font, String text) { - this(font); - component = Components.literal(text); - } - - public TextStencilElement(Font font, MutableComponent component) { - this(font); - this.component = component; - } - - public TextStencilElement withText(String text) { - component = Components.literal(text); - return this; - } - - public TextStencilElement withText(MutableComponent component) { - this.component = component; - return this; - } - - public TextStencilElement centered(boolean vertical, boolean horizontal) { - this.centerVertically = vertical; - this.centerHorizontally = horizontal; - return this; - } - - @Override - protected void renderStencil(GuiGraphics graphics) { - float x = 0, y = 0; - if (centerHorizontally) - x = width / 2f - font.width(component) / 2f; - - if (centerVertically) - y = height / 2f - (font.lineHeight - 1) / 2f; - - graphics.drawString(font, component, Math.round(x), Math.round(y), 0xff_000000, false); - } - - @Override - protected void renderElement(GuiGraphics graphics) { - float x = 0, y = 0; - if (centerHorizontally) - x = width / 2f - font.width(component) / 2f; - - if (centerVertically) - y = height / 2f - (font.lineHeight - 1) / 2f; - - PoseStack ms = graphics.pose(); - ms.pushPose(); - ms.translate(x, y, 0); - element.render(graphics, font.width(component), font.lineHeight + 2, alpha); - ms.popPose(); - } - - public MutableComponent getComponent() { - return component; - } -} 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 3c4cab6..525753a 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,10 +1,10 @@ package nl.requios.effortlessbuilding.create.foundation.gui.widget; +import net.createmod.catnip.gui.TickableGuiEventListener; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.AbstractWidget; import net.minecraft.client.gui.narration.NarrationElementOutput; 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; 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 deleted file mode 100644 index 5818c7c..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/BoxWidget.java +++ /dev/null @@ -1,226 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.gui.widget; - -import net.minecraft.client.gui.GuiGraphics; -import nl.requios.effortlessbuilding.create.foundation.gui.Theme; -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; -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 java.util.function.Function; - -public class BoxWidget extends ElementWidget { - - public static final Function gradientFactory = (box) -> (ms, w, h, alpha) -> UIRenderHelper.angledGradient(ms, 90, w/2, -2, w + 4, h + 4, box.gradientColor1, box.gradientColor2); - - protected BoxElement box; - - protected Color customBorderTop; - protected Color customBorderBot; - protected Color customBackground; - protected boolean animateColors = true; - protected LerpedFloat colorAnimation = LerpedFloat.linear(); - - protected Color gradientColor1, gradientColor2; - private Color previousColor1, previousColor2; - private Color colorTarget1 = Theme.c(getIdleTheme(), true).copy(); - private Color colorTarget2 = Theme.c(getIdleTheme(), false).copy(); - - public BoxWidget() { - this(0, 0); - } - - public BoxWidget(int x, int y) { - this(x, y, 16, 16); - } - - public BoxWidget(int x, int y, int width, int height) { - super(x, y, width, height); - box = new BoxElement() - .at(x, y) - .withBounds(width, height); - gradientColor1 = colorTarget1; - gradientColor2 = colorTarget2; - } - - public T withBounds(int width, int height) { - this.width = width; - this.height = height; - //noinspection unchecked - return (T) this; - } - - public T withBorderColors(Couple colors) { - this.customBorderTop = colors.getFirst(); - this.customBorderBot = colors.getSecond(); - updateColorsFromState(); - //noinspection unchecked - return (T) this; - } - - public T withBorderColors(Color top, Color bot) { - this.customBorderTop = top; - this.customBorderBot = bot; - updateColorsFromState(); - //noinspection unchecked - return (T) this; - } - - public T withCustomBackground(Color color) { - this.customBackground = color; - //noinspection unchecked - return (T) this; - } - - public T animateColors(boolean b) { - this.animateColors = b; - //noinspection unchecked - return (T) this; - } - - @Override - public void tick() { - super.tick(); - colorAnimation.tickChaser(); - } - - @Override - public void onClick(double x, double y) { - super.onClick(x, y); - - gradientColor1 = Theme.c(getClickTheme(), true); - gradientColor2 = Theme.c(getClickTheme(), false); - startGradientAnimation(getColorForState(true), getColorForState(false), true, 0.15); - } - - @Override - protected void beforeRender(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - super.beforeRender(graphics, mouseX, mouseY, partialTicks); - - if (isHovered != wasHovered) { - startGradientAnimation( - getColorForState(true), - getColorForState(false), - isHovered - ); - } - - if (colorAnimation.settled()) { - gradientColor1 = colorTarget1; - gradientColor2 = colorTarget2; - } else { - float animationValue = 1 - Math.abs(colorAnimation.getValue(partialTicks)); - gradientColor1 = Color.mixColors(previousColor1, colorTarget1, animationValue); - gradientColor2 = Color.mixColors(previousColor2, colorTarget2, animationValue); - } - - } - - @Override - public void doRender(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - float fadeValue = fade.getValue(partialTicks); - if (fadeValue < .1f) - return; - - box.withAlpha(fadeValue); - box.withBackground(customBackground != null ? customBackground : Theme.c(Theme.Key.PONDER_BACKGROUND_TRANSPARENT)) - .gradientBorder(gradientColor1, gradientColor2) - .at(getX(), getY(), z) - .withBounds(width, height) - .render(graphics); - - super.doRender(graphics, mouseX, mouseY, partialTicks); - - wasHovered = isHovered; - } - - @Override - public boolean isMouseOver(double mX, double mY) { - if (!active || !visible) - return false; - - float padX = 2 + paddingX; - float padY = 2 + paddingY; - - 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) - return false; - return isMouseOver(pMouseX, pMouseY); - } - - public BoxElement getBox() { - return box; - } - - public void updateColorsFromState() { - colorTarget1 = getColorForState(true); - colorTarget2 = getColorForState(false); - } - - public void animateGradientFromState() { - startGradientAnimation( - getColorForState(true), - getColorForState(false), - true - ); - } - - private void startGradientAnimation(Color c1, Color c2, boolean positive, double expSpeed) { - if (!animateColors) - return; - - colorAnimation.startWithValue(positive ? 1 : -1); - colorAnimation.chase(0, expSpeed, LerpedFloat.Chaser.EXP); - colorAnimation.tickChaser(); - - previousColor1 = gradientColor1; - previousColor2 = gradientColor2; - - colorTarget1 = c1; - colorTarget2 = c2; - } - - private void startGradientAnimation(Color c1, Color c2, boolean positive) { - startGradientAnimation(c1, c2, positive, 0.6); - } - - private Color getColorForState(boolean first) { - if (!active) - return Theme.p(getDisabledTheme()).get(first); - - if (isHovered) { - if (first) - return customBorderTop != null ? customBorderTop.darker() : Theme.c(getHoverTheme(), true); - else - return customBorderBot != null ? customBorderBot.darker() : Theme.c(getHoverTheme(), false); - } - - if (first) - return customBorderTop != null ? customBorderTop : Theme.c(getIdleTheme(), true); - else - return customBorderBot != null ? customBorderBot : Theme.c(getIdleTheme(), false); - } - - public Theme.Key getDisabledTheme() { - return Theme.Key.BUTTON_DISABLE; - } - - public Theme.Key getIdleTheme() { - return Theme.Key.BUTTON_IDLE; - } - - public Theme.Key getHoverTheme() { - return Theme.Key.BUTTON_HOVER; - } - - 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 deleted file mode 100644 index 9cffb11..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/gui/widget/ElementWidget.java +++ /dev/null @@ -1,157 +0,0 @@ -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 java.util.function.Consumer; -import java.util.function.UnaryOperator; - -public class ElementWidget extends AbstractSimiWidget { - - protected RenderElement element = RenderElement.EMPTY; - - protected boolean usesFade = false; - protected int fadeModX; - protected int fadeModY; - protected LerpedFloat fade = LerpedFloat.linear().startWithValue(1); - - protected boolean rescaleElement = false; - protected float rescaleSizeX; - protected float rescaleSizeY; - - protected float paddingX = 0; - protected float paddingY = 0; - - public ElementWidget(int x, int y) { - super(x, y); - } - - public ElementWidget(int x, int y, int width, int height) { - super(x, y, width, height); - } - - public T showingElement(RenderElement element) { - this.element = element; - //noinspection unchecked - return (T) this; - } - - public T showing(ScreenElement renderable) { - return this.showingElement(RenderElement.of(renderable)); - } - - public T modifyElement(Consumer consumer) { - if (element != null) - consumer.accept(element); - //noinspection unchecked - return (T) this; - } - - public T mapElement(UnaryOperator function) { - if (element != null) - element = function.apply(element); - //noinspection unchecked - return (T) this; - } - - public T withPadding(float paddingX, float paddingY) { - this.paddingX = paddingX; - this.paddingY = paddingY; - //noinspection unchecked - return (T) this; - } - - public T enableFade(int fadeModifierX, int fadeModifierY) { - this.fade.startWithValue(0); - this.usesFade = true; - this.fadeModX = fadeModifierX; - this.fadeModY = fadeModifierY; - //noinspection unchecked - return (T) this; - } - - public T disableFade() { - this.fade.startWithValue(1); - this.usesFade = false; - //noinspection unchecked - return (T) this; - } - - public LerpedFloat fade() { - return fade; - } - - public T fade(float target) { - fade.chase(target, 0.1, LerpedFloat.Chaser.EXP); - //noinspection unchecked - return (T) this; - } - - /** - * Rescaling and its effects aren't properly tested with most elements. - * Thought it should work fine when using a TextStencilElement. - * Check BaseConfigScreen's title for such an example. - */ - @Deprecated - public T rescaleElement(float rescaleSizeX, float rescaleSizeY) { - this.rescaleElement = true; - this.rescaleSizeX = rescaleSizeX; - this.rescaleSizeY = rescaleSizeY; - //noinspection unchecked - return (T) this; - } - - public T disableRescale() { - this.rescaleElement = false; - //noinspection unchecked - return (T) this; - } - - @Override - public void tick() { - super.tick(); - fade.tickChaser(); - } - - @Override - 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) { - graphics.pose().translate((1 - fadeValue) * fadeModX, (1 - fadeValue) * fadeModY, 0); - } - } - - @Override - public void doRender(GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { - PoseStack ms = graphics.pose(); - ms.pushPose(); - ms.translate(getX() + paddingX, getY() + paddingY, z); - float innerWidth = width - 2 * paddingX; - float innerHeight = height - 2 * paddingY; - float eX = element.getX(), eY = element.getY(); - if (rescaleElement) { - float xScale = innerWidth / rescaleSizeX; - float yScale = innerHeight / rescaleSizeY; - ms.scale(xScale, yScale, 1); - element.at(eX / xScale, eY / yScale); - innerWidth /= xScale; - innerHeight /= yScale; - } - element.withBounds((int) innerWidth, (int) innerHeight).render(graphics); - ms.popPose(); - if (rescaleElement) { - element.at(eX, eY); - } - } - - public RenderElement getRenderElement() { - return element; - } -} 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 6554942..6226352 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,10 +1,10 @@ package nl.requios.effortlessbuilding.create.foundation.gui.widget; import com.mojang.blaze3d.systems.RenderSystem; +import net.createmod.catnip.gui.element.ScreenElement; 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; public class IconButton extends AbstractSimiWidget { 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 e3dcd78..e457cb3 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 java.util.List; - import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; +import java.util.List; + public class TooltipArea extends AbstractSimiWidget { public TooltipArea(int x, int y, int width, int height) { diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/ItemDescription.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/ItemDescription.java index f3be447..233c1b0 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/ItemDescription.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/item/ItemDescription.java @@ -11,7 +11,20 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import static net.minecraft.ChatFormatting.*; +import static net.minecraft.ChatFormatting.AQUA; +import static net.minecraft.ChatFormatting.BLUE; +import static net.minecraft.ChatFormatting.DARK_GRAY; +import static net.minecraft.ChatFormatting.DARK_GREEN; +import static net.minecraft.ChatFormatting.DARK_PURPLE; +import static net.minecraft.ChatFormatting.DARK_RED; +import static net.minecraft.ChatFormatting.GOLD; +import static net.minecraft.ChatFormatting.GRAY; +import static net.minecraft.ChatFormatting.GREEN; +import static net.minecraft.ChatFormatting.LIGHT_PURPLE; +import static net.minecraft.ChatFormatting.RED; +import static net.minecraft.ChatFormatting.STRIKETHROUGH; +import static net.minecraft.ChatFormatting.WHITE; +import static net.minecraft.ChatFormatting.YELLOW; import static nl.requios.effortlessbuilding.create.foundation.item.TooltipHelper.cutStringTextComponent; import static nl.requios.effortlessbuilding.create.foundation.item.TooltipHelper.cutTextComponent; 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 2dd46b2..b1d39ef 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 @@ -1,9 +1,9 @@ package nl.requios.effortlessbuilding.create.foundation.item; -import net.neoforged.neoforge.items.ItemHandlerHelper; -import nl.requios.effortlessbuilding.create.foundation.utility.Pair; +import net.createmod.catnip.data.Pair; import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; +import net.minecraft.core.component.DataComponents; import net.minecraft.util.Mth; import net.minecraft.world.Containers; import net.minecraft.world.item.ItemStack; @@ -40,9 +40,9 @@ public class ItemHelper { public static void addToList(ItemStack stack, List stacks) { for (ItemStack s : stacks) { - if (!ItemHandlerHelper.canItemStacksStack(stack, s)) + if (!ItemStack.isSameItemSameComponents(stack, s)) continue; - int transferred = Math.min(s.getMaxStackSize() - s.getCount(), stack.getCount()); + int transferred = Math.min(s.getOrDefault(DataComponents.MAX_STACK_SIZE, 64) - s.getCount(), stack.getCount()); s.grow(transferred); stack.shrink(transferred); } @@ -199,7 +199,7 @@ public class ItemHelper { if (!extracting.isEmpty() && !hasEnoughItems && potentialOtherMatch) { ItemStack blackListed = extracting.copy(); - test = test.and(i -> !ItemHandlerHelper.canItemStacksStack(i, blackListed)); + test = test.and(i -> !ItemStack.isSameItemSameComponents(i, blackListed)); continue; } @@ -254,7 +254,7 @@ public class ItemHelper { } public static boolean canItemStackAmountsStack(ItemStack a, ItemStack b) { - return ItemHandlerHelper.canItemStacksStack(a, b) && a.getCount() + b.getCount() <= a.getMaxStackSize(); + return ItemStack.isSameItemSameComponents(a, b) && a.getCount() + b.getCount() <= a.getOrDefault(DataComponents.MAX_STACK_SIZE, 64); } public static ItemStack findFirstMatch(IItemHandler inv, Predicate test) { 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 67f723c..1933b42 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,6 +1,8 @@ package nl.requios.effortlessbuilding.create.foundation.item; import com.google.common.base.Strings; +import net.createmod.catnip.data.Couple; +import net.createmod.catnip.lang.ClientFontHelper; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; @@ -12,8 +14,6 @@ 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; @@ -81,7 +81,7 @@ public class TooltipHelper { } Font font = Minecraft.getInstance().font; - List lines = FontHelper.cutString(font, markedUp, maxWidthPerLine); + List lines = ClientFontHelper.cutString(font, markedUp, maxWidthPerLine); // Format String lineStart = Strings.repeat(" ", indent); 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 dd90019..540a882 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,6 +2,7 @@ package nl.requios.effortlessbuilding.create.foundation.item.render; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; +import net.createmod.catnip.data.Iterate; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -14,7 +15,6 @@ import net.minecraft.world.item.ItemStack; import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions; import net.neoforged.neoforge.client.model.data.ModelData; import nl.requios.effortlessbuilding.create.foundation.render.RenderTypes; -import nl.requios.effortlessbuilding.create.foundation.utility.Iterate; public class PartialItemModelRenderer { 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 deleted file mode 100644 index e311e1a..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/networking/ISyncPersistentData.java +++ /dev/null @@ -1,53 +0,0 @@ -//package nl.requios.effortlessbuilding.create.foundation.networking; -// -//import net.minecraft.client.Minecraft; -//import net.minecraft.nbt.CompoundTag; -//import net.minecraft.network.FriendlyByteBuf; -//import net.minecraft.world.entity.Entity; -//import net.neoforged.neoforge.network.NetworkEvent.Context; -// -//import java.util.HashSet; -// -//public interface ISyncPersistentData { -// -// void onPersistentDataUpdated(); -// -// public static class PersistentDataPacket extends SimplePacketBase { -// -// private int entityId; -// private Entity entity; -// private CompoundTag readData; -// -// public PersistentDataPacket(Entity entity) { -// this.entity = entity; -// this.entityId = entity.getId(); -// } -// -// public PersistentDataPacket(FriendlyByteBuf buffer) { -// entityId = buffer.readInt(); -// readData = buffer.readNbt(); -// } -// -// @Override -// public void write(FriendlyByteBuf buffer) { -// buffer.writeInt(entityId); -// buffer.writeNbt(entity.getPersistentData()); -// } -// -// @Override -// 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 deleted file mode 100644 index 641fb9e..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/networking/SimplePacketBase.java +++ /dev/null @@ -1,12 +0,0 @@ -//package nl.requios.effortlessbuilding.create.foundation.networking; -// -//import net.minecraft.network.FriendlyByteBuf; -//import net.neoforged.neoforge.network.NetworkEvent.Context; -// -//public abstract class SimplePacketBase { -// -// public abstract void write(FriendlyByteBuf buffer); -// -// 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 deleted file mode 100644 index 6b68393..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/BakedModelRenderHelper.java +++ /dev/null @@ -1,30 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.render; - -import com.jozufozu.flywheel.core.model.ModelUtil; -import com.jozufozu.flywheel.core.model.ShadeSeparatedBufferedData; -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.block.BlockRenderDispatcher; -import net.minecraft.client.resources.model.BakedModel; -import net.minecraft.world.level.block.state.BlockState; - -public class BakedModelRenderHelper { - - public static SuperByteBuffer standardBlockRender(BlockState renderedState) { - BlockRenderDispatcher dispatcher = Minecraft.getInstance() - .getBlockRenderer(); - return standardModelRender(dispatcher.getBlockModel(renderedState), renderedState); - } - - public static SuperByteBuffer standardModelRender(BakedModel model, BlockState referenceState) { - return standardModelRender(model, referenceState, new PoseStack()); - } - - public static SuperByteBuffer standardModelRender(BakedModel model, BlockState referenceState, PoseStack ms) { - ShadeSeparatedBufferedData data = ModelUtil.getBufferedData(model, referenceState, ms); - SuperByteBuffer sbb = new SuperByteBuffer(data); - data.release(); - return sbb; - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/BlockEntityRenderHelper.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/BlockEntityRenderHelper.java new file mode 100644 index 0000000..3d30435 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/BlockEntityRenderHelper.java @@ -0,0 +1,113 @@ +package nl.requios.effortlessbuilding.create.foundation.render; + +import com.mojang.blaze3d.vertex.PoseStack; +import dev.engine_room.flywheel.api.visualization.VisualizationManager; +import dev.engine_room.flywheel.lib.transform.TransformStack; +import dev.engine_room.flywheel.lib.visualization.VisualizationHelper; +import net.createmod.catnip.animation.AnimationTickHolder; +import net.createmod.catnip.registry.RegisteredObjectsHelper; +import net.createmod.catnip.render.SuperByteBuffer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import nl.requios.effortlessbuilding.create.Create; +import nl.requios.effortlessbuilding.create.foundation.virtualWorld.VirtualRenderWorld; +import org.joml.Matrix4f; +import org.joml.Vector4f; + +import javax.annotation.Nullable; +import java.util.Iterator; + +public class BlockEntityRenderHelper { + + public static void renderBlockEntities(Level world, Iterable customRenderBEs, PoseStack ms, + MultiBufferSource buffer) { + renderBlockEntities(world, null, customRenderBEs, ms, null, buffer); + } + + public static void renderBlockEntities(Level world, Iterable customRenderBEs, PoseStack ms, + MultiBufferSource buffer, float pt) { + renderBlockEntities(world, null, customRenderBEs, ms, null, buffer, pt); + } + + public static void renderBlockEntities(Level world, @Nullable VirtualRenderWorld renderWorld, + Iterable customRenderBEs, PoseStack ms, @Nullable Matrix4f lightTransform, MultiBufferSource buffer) { + renderBlockEntities(world, renderWorld, customRenderBEs, ms, lightTransform, buffer, + AnimationTickHolder.getPartialTicks()); + } + + public static void renderBlockEntities(Level world, @Nullable VirtualRenderWorld renderWorld, + Iterable customRenderBEs, PoseStack ms, @Nullable Matrix4f lightTransform, MultiBufferSource buffer, + float pt) { + Iterator iterator = customRenderBEs.iterator(); + while (iterator.hasNext()) { + BlockEntity blockEntity = iterator.next(); + if (VisualizationManager.supportsVisualization(world) && VisualizationHelper.skipVanillaRender(blockEntity)) + continue; + + BlockEntityRenderer renderer = Minecraft.getInstance().getBlockEntityRenderDispatcher().getRenderer(blockEntity); + if (renderer == null) { + iterator.remove(); + continue; + } + + BlockPos pos = blockEntity.getBlockPos(); + ms.pushPose(); + TransformStack.of(ms) + .translate(pos); + + try { + int worldLight = getCombinedLight(world, getLightPos(lightTransform, pos), renderWorld, pos); + + if (renderWorld != null) { + // Swap the real world for the render world so that the renderer gets contraption-local information + blockEntity.setLevel(renderWorld); + renderer.render(blockEntity, pt, ms, buffer, worldLight, OverlayTexture.NO_OVERLAY); + blockEntity.setLevel(world); + } else { + renderer.render(blockEntity, pt, ms, buffer, worldLight, OverlayTexture.NO_OVERLAY); + } + + } catch (Exception e) { + iterator.remove(); + + String message = "BlockEntity " + RegisteredObjectsHelper.getKeyOrThrow(blockEntity.getType()) + .toString() + " could not be rendered virtually."; +// if (AllConfigs.CLIENT.explainRenderErrors.get()) + Create.LOGGER.error(message, e); +// else +// Create.LOGGER.error(message); + } + + ms.popPose(); + } + } + + private static BlockPos getLightPos(@Nullable Matrix4f lightTransform, BlockPos contraptionPos) { + if (lightTransform != null) { + Vector4f lightVec = new Vector4f(contraptionPos.getX() + .5f, contraptionPos.getY() + .5f, contraptionPos.getZ() + .5f, 1); + lightVec.mul(lightTransform); + return BlockPos.containing(lightVec.x(), lightVec.y(), lightVec.z()); + } else { + return contraptionPos; + } + } + + public static int getCombinedLight(Level world, BlockPos worldPos, @Nullable VirtualRenderWorld renderWorld, + BlockPos renderWorldPos) { + int worldLight = LevelRenderer.getLightColor(world, worldPos); + + if (renderWorld != null) { + int renderWorldLight = LevelRenderer.getLightColor(renderWorld, renderWorldPos); + return SuperByteBuffer.maxLight(worldLight, renderWorldLight); + } + + return worldLight; + } + +} \ No newline at end of file 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 deleted file mode 100644 index 3da0b88..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/CachedBufferer.java +++ /dev/null @@ -1,87 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.render; - -import com.jozufozu.flywheel.core.PartialModel; -import com.jozufozu.flywheel.util.transform.TransformStack; -import com.mojang.blaze3d.vertex.PoseStack; -import nl.requios.effortlessbuilding.create.CreateClient; -import nl.requios.effortlessbuilding.create.foundation.render.SuperByteBufferCache.Compartment; -import nl.requios.effortlessbuilding.create.foundation.utility.AngleHelper; -import net.minecraft.core.Direction; -import net.minecraft.world.level.block.state.BlockState; -import org.apache.commons.lang3.tuple.Pair; - -import java.util.function.Supplier; - -import static net.minecraft.world.level.block.state.properties.BlockStateProperties.FACING; - -public class CachedBufferer { - - public static final Compartment GENERIC_TILE = new Compartment<>(); - public static final Compartment PARTIAL = new Compartment<>(); - public static final Compartment> DIRECTIONAL_PARTIAL = new Compartment<>(); - - public static SuperByteBuffer block(BlockState toRender) { - return block(GENERIC_TILE, toRender); - } - - public static SuperByteBuffer block(Compartment compartment, BlockState toRender) { - return CreateClient.BUFFER_CACHE.get(compartment, toRender, () -> BakedModelRenderHelper.standardBlockRender(toRender)); - } - - public static SuperByteBuffer partial(PartialModel partial, BlockState referenceState) { - return CreateClient.BUFFER_CACHE.get(PARTIAL, partial, - () -> BakedModelRenderHelper.standardModelRender(partial.get(), referenceState)); - } - - public static SuperByteBuffer partial(PartialModel partial, BlockState referenceState, - Supplier modelTransform) { - return CreateClient.BUFFER_CACHE.get(PARTIAL, partial, - () -> BakedModelRenderHelper.standardModelRender(partial.get(), referenceState, modelTransform.get())); - } - - public static SuperByteBuffer partialFacing(PartialModel partial, BlockState referenceState) { - Direction facing = referenceState.getValue(FACING); - return partialFacing(partial, referenceState, facing); - } - - public static SuperByteBuffer partialFacing(PartialModel partial, BlockState referenceState, Direction facing) { - return partialDirectional(partial, referenceState, facing, - rotateToFace(facing)); - } - - public static SuperByteBuffer partialFacingVertical(PartialModel partial, BlockState referenceState, Direction facing) { - return partialDirectional(partial, referenceState, facing, - rotateToFaceVertical(facing)); - } - - public static SuperByteBuffer partialDirectional(PartialModel partial, BlockState referenceState, Direction dir, - Supplier modelTransform) { - return CreateClient.BUFFER_CACHE.get(DIRECTIONAL_PARTIAL, Pair.of(dir, partial), - () -> BakedModelRenderHelper.standardModelRender(partial.get(), referenceState, modelTransform.get())); - } - - public static Supplier rotateToFace(Direction facing) { - return () -> { - PoseStack stack = new PoseStack(); - TransformStack.cast(stack) - .centre() - .rotateY(AngleHelper.horizontalAngle(facing)) - .rotateX(AngleHelper.verticalAngle(facing)) - .unCentre(); - return stack; - }; - } - - public static Supplier rotateToFaceVertical(Direction facing) { - return () -> { - PoseStack stack = new PoseStack(); - TransformStack.cast(stack) - .centre() - .rotateY(AngleHelper.horizontalAngle(facing)) - .rotateX(AngleHelper.verticalAngle(facing) + 90) - .unCentre(); - return stack; - }; - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/ForcedDiffuseState.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/ForcedDiffuseState.java deleted file mode 100644 index 8e1b34c..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/ForcedDiffuseState.java +++ /dev/null @@ -1,30 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.render; - -import com.jozufozu.flywheel.util.DiffuseLightCalculator; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; - -import javax.annotation.Nullable; - -public final class ForcedDiffuseState { - private static final ThreadLocal> FORCED_DIFFUSE = ThreadLocal.withInitial(ObjectArrayList::new); - - private ForcedDiffuseState() { - } - - public static void pushCalculator(DiffuseLightCalculator calculator) { - FORCED_DIFFUSE.get().push(calculator); - } - - public static void popCalculator() { - FORCED_DIFFUSE.get().pop(); - } - - @Nullable - public static DiffuseLightCalculator getForcedCalculator() { - ObjectArrayList stack = FORCED_DIFFUSE.get(); - if (stack.isEmpty()) { - return null; - } - return stack.top(); - } -} 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 fb46e7c..1754c66 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 @@ -2,12 +2,12 @@ package nl.requios.effortlessbuilding.create.foundation.render; import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.VertexFormat; -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.resources.ResourceLocation; import net.minecraft.world.inventory.InventoryMenu; +import nl.requios.effortlessbuilding.create.AllSpecialTextures; +import nl.requios.effortlessbuilding.create.Create; // TODO 1.17: use custom shaders instead of vanilla ones public class RenderTypes extends RenderStateShard { 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 deleted file mode 100644 index 211c789..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/ShadowRenderHelper.java +++ /dev/null @@ -1,113 +0,0 @@ -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; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.core.BlockPos; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.Mth; -import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.block.RenderShape; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.AABB; -import net.minecraft.world.phys.Vec3; -import net.minecraft.world.phys.shapes.VoxelShape; - -/** - * Taken from EntityRendererManager - */ -public class ShadowRenderHelper { - - private static final RenderType SHADOW_LAYER = - RenderType.entityNoOutline(new ResourceLocation("textures/misc/shadow.png")); - - public static void renderShadow(PoseStack matrixStack, MultiBufferSource buffer, float opacity, float radius) { - PoseStack.Pose entry = matrixStack.last(); - VertexConsumer builder = buffer.getBuffer(SHADOW_LAYER); - - opacity /= 2; - shadowVertex(entry, builder, opacity, -1 * radius, 0, -1 * radius, 0, 0); - shadowVertex(entry, builder, opacity, -1 * radius, 0, 1 * radius, 0, 1); - shadowVertex(entry, builder, opacity, 1 * radius, 0, 1 * radius, 1, 1); - shadowVertex(entry, builder, opacity, 1 * radius, 0, -1 * radius, 1, 0); - } - - public static void renderShadow(PoseStack matrixStack, MultiBufferSource buffer, LevelReader world, - Vec3 pos, float opacity, float radius) { - float f = radius; - - double d2 = pos.x(); - double d0 = pos.y(); - double d1 = pos.z(); - int i = Mth.floor(d2 - (double) f); - int j = Mth.floor(d2 + (double) f); - int k = Mth.floor(d0 - (double) f); - int l = Mth.floor(d0); - int i1 = Mth.floor(d1 - (double) f); - int j1 = Mth.floor(d1 + (double) f); - PoseStack.Pose entry = matrixStack.last(); - VertexConsumer builder = buffer.getBuffer(SHADOW_LAYER); - - for (BlockPos blockpos : BlockPos.betweenClosed(new BlockPos(i, k, i1), new BlockPos(j, l, j1))) { - renderBlockShadow(entry, builder, world, blockpos, d2, d0, d1, f, - opacity); - } - } - - private static void renderBlockShadow(PoseStack.Pose entry, VertexConsumer builder, - LevelReader world, BlockPos pos, double x, double y, double z, - float radius, float opacity) { - BlockPos blockpos = pos.below(); - BlockState blockstate = world.getBlockState(blockpos); - if (blockstate.getRenderShape() != RenderShape.INVISIBLE && world.getMaxLocalRawBrightness(pos) > 3) { - if (blockstate.isCollisionShapeFullBlock(world, blockpos)) { - VoxelShape voxelshape = blockstate.getShape(world, pos.below()); - if (!voxelshape.isEmpty()) { - float brightness = LightTexture.getBrightness(world.dimensionType(), world.getMaxLocalRawBrightness(pos)); - float f = (float) ((opacity - (y - pos.getY()) / 2.0D) * 0.5D * brightness); - if (f >= 0.0F) { - if (f > 1.0F) { - f = 1.0F; - } - - AABB AABB = voxelshape.bounds(); - double d0 = (double) pos.getX() + AABB.minX; - double d1 = (double) pos.getX() + AABB.maxX; - double d2 = (double) pos.getY() + AABB.minY; - double d3 = (double) pos.getZ() + AABB.minZ; - double d4 = (double) pos.getZ() + AABB.maxZ; - float f1 = (float) (d0 - x); - float f2 = (float) (d1 - x); - float f3 = (float) (d2 - y + 0.015625D); - float f4 = (float) (d3 - z); - float f5 = (float) (d4 - z); - float f6 = -f1 / 2.0F / radius + 0.5F; - float f7 = -f2 / 2.0F / radius + 0.5F; - float f8 = -f4 / 2.0F / radius + 0.5F; - float f9 = -f5 / 2.0F / radius + 0.5F; - shadowVertex(entry, builder, f, f1, f3, f4, f6, f8); - shadowVertex(entry, builder, f, f1, f3, f5, f6, f9); - shadowVertex(entry, builder, f, f2, f3, f5, f7, f9); - shadowVertex(entry, builder, f, f2, f3, f4, f7, f8); - } - } - } - } - } - - private static void shadowVertex(PoseStack.Pose entry, VertexConsumer builder, float alpha, - float x, float y, float z, float u, float v) { - builder.vertex(entry.pose(), x, y, z) - .color(1.0F, 1.0F, 1.0F, alpha) - .uv(u, v) - .overlayCoords(OverlayTexture.NO_OVERLAY) - .uv2(LightTexture.FULL_BRIGHT) - .normal(entry.normal(), 0.0F, 1.0F, 0.0F) - .endVertex(); - } - -} 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 deleted file mode 100644 index ece25d2..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/SuperByteBuffer.java +++ /dev/null @@ -1,492 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.render; - - -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 it.unimi.dsi.fastutil.longs.Long2IntMap; -import it.unimi.dsi.fastutil.longs.Long2IntOpenHashMap; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.util.Mth; -import net.minecraft.world.level.Level; -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 { - - private final VertexList template; - private final IntPredicate shadedPredicate; - - // Vertex Position - private final PoseStack transforms = new PoseStack(); - - // Vertex Coloring - private boolean shouldColor; - private int r, g, b, a; - private boolean disableDiffuseMult; - private DiffuseLightCalculator diffuseCalculator; - - // Vertex Texture Coords - private SpriteShiftFunc spriteShiftFunc; - - // Vertex Overlay Color - private boolean hasOverlay; - private int overlay = OverlayTexture.NO_OVERLAY; - - // Vertex Lighting - private boolean useWorldLight; - private Matrix4f lightTransform; - private boolean hasCustomLight; - private int packedLightCoords; - private boolean hybridLight; - - // Vertex Normals - private boolean fullNormalTransform; - - // Temporary - private static final Long2IntMap WORLD_LIGHT_CACHE = new Long2IntOpenHashMap(); - - public SuperByteBuffer(ByteBuffer vertexBuffer, BufferBuilder.DrawState drawState, int unshadedStartVertex) { - int vertexCount = drawState.vertexCount(); - int stride = drawState.format().getVertexSize(); - - ShadedVertexList template = new BlockVertexList.Shaded(vertexBuffer, vertexCount, stride, unshadedStartVertex); - shadedPredicate = template::isShaded; - this.template = template; - - transforms.pushPose(); - } - - public SuperByteBuffer(ShadeSeparatedBufferedData data) { - this(data.vertexBuffer(), data.drawState(), data.unshadedStartVertex()); - } - - public SuperByteBuffer(ByteBuffer vertexBuffer, BufferBuilder.DrawState drawState) { - int vertexCount = drawState.vertexCount(); - int stride = drawState.format().getVertexSize(); - - template = new BlockVertexList(vertexBuffer, vertexCount, stride); - shadedPredicate = index -> true; - - transforms.pushPose(); - } - - public void renderInto(PoseStack input, VertexConsumer builder) { - if (isEmpty()) - return; - - Matrix4f modelMat = new Matrix4f(input.last() - .pose()); - Matrix4f localTransforms = transforms.last() - .pose(); - modelMat.mul(localTransforms); - - Matrix3f normalMat; - if (fullNormalTransform) { - normalMat = new Matrix3f(input.last() - .normal()); - Matrix3f localNormalTransforms = transforms.last() - .normal(); - normalMat.mul(localNormalTransforms); - } else { - normalMat = new Matrix3f(transforms.last() - .normal()); - } - - if (useWorldLight) { - WORLD_LIGHT_CACHE.clear(); - } - - final Vector4f pos = new Vector4f(); - final Vector3f normal = new Vector3f(); - final Vector4f lightPos = new Vector4f(); - - DiffuseLightCalculator diffuseCalculator = ForcedDiffuseState.getForcedCalculator(); - final boolean disableDiffuseMult = - this.disableDiffuseMult || (ShadersModHandler.isShaderPackInUse() && diffuseCalculator == null); - if (diffuseCalculator == null) { - diffuseCalculator = this.diffuseCalculator; - if (diffuseCalculator == null) { - diffuseCalculator = DiffuseLightCalculator.forCurrentLevel(); - } - } - - final int vertexCount = template.getVertexCount(); - for (int i = 0; i < vertexCount; i++) { - float x = template.getX(i); - float y = template.getY(i); - float z = template.getZ(i); - - pos.set(x, y, z, 1F); - pos.mul(modelMat); - builder.vertex(pos.x(), pos.y(), pos.z()); - - float normalX = template.getNX(i); - float normalY = template.getNY(i); - float normalZ = template.getNZ(i); - - normal.set(normalX, normalY, normalZ); - normal.mul(normalMat); - float nx = normal.x(); - float ny = normal.y(); - float nz = normal.z(); - - byte r, g, b, a; - if (shouldColor) { - r = (byte) this.r; - g = (byte) this.g; - b = (byte) this.b; - a = (byte) this.a; - } else { - r = template.getR(i); - g = template.getG(i); - b = template.getB(i); - a = template.getA(i); - } - if (disableDiffuseMult) { - builder.color(r, g, b, a); - } else { - float instanceDiffuse = diffuseCalculator.getDiffuse(nx, ny, nz, shadedPredicate.test(i)); - int colorR = transformColor(r, instanceDiffuse); - int colorG = transformColor(g, instanceDiffuse); - int colorB = transformColor(b, instanceDiffuse); - builder.color(colorR, colorG, colorB, a); - } - - float u = template.getU(i); - float v = template.getV(i); - if (spriteShiftFunc != null) { - spriteShiftFunc.shift(builder, u, v); - } else { - builder.uv(u, v); - } - - if (hasOverlay) { - builder.overlayCoords(overlay); - } - - int light; - if (useWorldLight) { - lightPos.set(((x - .5f) * 15 / 16f) + .5f, (y - .5f) * 15 / 16f + .5f, (z - .5f) * 15 / 16f + .5f, 1f); - lightPos.mul(localTransforms); - if (lightTransform != null) { - lightPos.mul(lightTransform); - } - - light = getLight(Minecraft.getInstance().level, lightPos); - if (hasCustomLight) { - light = maxLight(light, packedLightCoords); - } - } else if (hasCustomLight) { - light = packedLightCoords; - } else { - light = template.getLight(i); - } - - if (hybridLight) { - builder.uv2(maxLight(light, template.getLight(i))); - } else { - builder.uv2(light); - } - - builder.normal(nx, ny, nz); - - builder.endVertex(); - } - - reset(); - } - - public SuperByteBuffer reset() { - while (!transforms.clear()) - transforms.popPose(); - transforms.pushPose(); - - shouldColor = false; - r = 0; - g = 0; - b = 0; - a = 0; - disableDiffuseMult = false; - diffuseCalculator = null; - spriteShiftFunc = null; - hasOverlay = false; - overlay = OverlayTexture.NO_OVERLAY; - useWorldLight = false; - lightTransform = null; - hasCustomLight = false; - packedLightCoords = 0; - hybridLight = false; - fullNormalTransform = false; - return this; - } - - public boolean isEmpty() { - return template.isEmpty(); - } - - public void delete() { - template.delete(); - } - - public PoseStack getTransforms() { - return transforms; - } - - @Override - public SuperByteBuffer translate(double x, double y, double z) { - transforms.translate(x, y, z); - return this; - } - - @Override - public SuperByteBuffer multiply(Quaternionf quaternion) { - transforms.mulPose(quaternion); - return this; - } - - @Override - public SuperByteBuffer scale(float factorX, float factorY, float factorZ) { - transforms.scale(factorX, factorY, factorZ); - return this; - } - - @Override - public SuperByteBuffer pushPose() { - transforms.pushPose(); - return this; - } - - @Override - public SuperByteBuffer popPose() { - transforms.popPose(); - return this; - } - - @Override - public SuperByteBuffer mulPose(Matrix4f pose) { - transforms.last() - .pose() - .mul(pose); - return this; - } - - @Override - public SuperByteBuffer mulNormal(Matrix3f normal) { - transforms.last() - .normal() - .mul(normal); - return this; - } - - public SuperByteBuffer transform(PoseStack stack) { - transforms.last() - .pose() - .mul(stack.last() - .pose()); - transforms.last() - .normal() - .mul(stack.last() - .normal()); - return this; - } - - public SuperByteBuffer rotateCentered(Direction axis, float radians) { - translate(.5f, .5f, .5f).rotate(axis, radians) - .translate(-.5f, -.5f, -.5f); - return this; - } - - public SuperByteBuffer rotateCentered(Quaternionf q) { - translate(.5f, .5f, .5f).multiply(q) - .translate(-.5f, -.5f, -.5f); - return this; - } - - public SuperByteBuffer color(int r, int g, int b, int a) { - shouldColor = true; - this.r = r; - this.g = g; - this.b = b; - this.a = a; - return this; - } - - public SuperByteBuffer color(int color) { - shouldColor = true; - r = ((color >> 16) & 0xFF); - g = ((color >> 8) & 0xFF); - b = (color & 0xFF); - a = 255; - return this; - } - - public SuperByteBuffer color(Color c) { - return color(c.getRGB()); - } - - /** - * Prevents vertex colors from being multiplied by the diffuse value calculated - * from the final transformed normal vector. Useful for entity rendering, when - * diffuse is applied automatically later. - */ - public SuperByteBuffer disableDiffuse() { - disableDiffuseMult = true; - return this; - } - - public SuperByteBuffer diffuseCalculator(DiffuseLightCalculator diffuseCalculator) { - this.diffuseCalculator = diffuseCalculator; - return this; - } - - public SuperByteBuffer shiftUV(SpriteShiftEntry entry) { - this.spriteShiftFunc = (builder, u, v) -> { - builder.uv(entry.getTargetU(u), entry.getTargetV(v)); - }; - return this; - } - - public SuperByteBuffer shiftUVScrolling(SpriteShiftEntry entry, float scrollV) { - return this.shiftUVScrolling(entry, 0, scrollV); - } - - public SuperByteBuffer shiftUVScrolling(SpriteShiftEntry entry, float scrollU, float scrollV) { - this.spriteShiftFunc = (builder, u, v) -> { - float targetU = u - entry.getOriginal() - .getU0() + entry.getTarget() - .getU0() - + scrollU; - float targetV = v - entry.getOriginal() - .getV0() + entry.getTarget() - .getV0() - + scrollV; - builder.uv(targetU, targetV); - }; - return this; - } - - public SuperByteBuffer shiftUVtoSheet(SpriteShiftEntry entry, float uTarget, float vTarget, int sheetSize) { - this.spriteShiftFunc = (builder, u, v) -> { - float targetU = entry.getTarget() - .getU((SpriteShiftEntry.getUnInterpolatedU(entry.getOriginal(), u) / sheetSize) + uTarget * 16); - float targetV = entry.getTarget() - .getV((SpriteShiftEntry.getUnInterpolatedV(entry.getOriginal(), v) / sheetSize) + vTarget * 16); - builder.uv(targetU, targetV); - }; - return this; - } - - public SuperByteBuffer overlay() { - hasOverlay = true; - return this; - } - - public SuperByteBuffer overlay(int overlay) { - hasOverlay = true; - this.overlay = overlay; - return this; - } - - public SuperByteBuffer light() { - useWorldLight = true; - return this; - } - - public SuperByteBuffer light(Matrix4f lightTransform) { - useWorldLight = true; - this.lightTransform = lightTransform; - return this; - } - - public SuperByteBuffer light(int packedLightCoords) { - hasCustomLight = true; - this.packedLightCoords = packedLightCoords; - return this; - } - - public SuperByteBuffer light(Matrix4f lightTransform, int packedLightCoords) { - light(lightTransform); - light(packedLightCoords); - return this; - } - - /** - * Uses max light from calculated light (world light or custom light) and vertex - * light for the final light value. Ineffective if any other light method was - * not called. - */ - public SuperByteBuffer hybridLight() { - hybridLight = true; - return this; - } - - /** - * Transforms normals not only by the local matrix stack, but also by the passed - * matrix stack. - */ - public SuperByteBuffer fullNormalTransform() { - fullNormalTransform = true; - return this; - } - - public SuperByteBuffer forEntityRender() { - disableDiffuse(); - overlay(); - fullNormalTransform(); - return this; - } - - public static int transformColor(byte component, float scale) { - return Mth.clamp((int) (Byte.toUnsignedInt(component) * scale), 0, 255); - } - - public static int transformColor(int component, float scale) { - return Mth.clamp((int) (component * scale), 0, 255); - } - - public static int maxLight(int packedLight1, int packedLight2) { - int blockLight1 = LightTexture.block(packedLight1); - int skyLight1 = LightTexture.sky(packedLight1); - int blockLight2 = LightTexture.block(packedLight2); - int skyLight2 = LightTexture.sky(packedLight2); - return LightTexture.pack(Math.max(blockLight1, blockLight2), Math.max(skyLight1, skyLight2)); - } - - private static int getLight(Level world, Vector4f lightPos) { - BlockPos pos = BlockPos.containing(lightPos.x(), lightPos.y(), lightPos.z()); - return WORLD_LIGHT_CACHE.computeIfAbsent(pos.asLong(), $ -> LevelRenderer.getLightColor(world, pos)); - } - - @FunctionalInterface - public interface SpriteShiftFunc { - void shift(VertexConsumer builder, float u, float v); - } - - @FunctionalInterface - public interface VertexLighter { - int getPackedLight(float x, float y, float z); - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/SuperByteBufferCache.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/SuperByteBufferCache.java deleted file mode 100644 index 980e76d..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/SuperByteBufferCache.java +++ /dev/null @@ -1,56 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.render; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; - -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; - -public class SuperByteBufferCache { - - protected final Map, 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()); - } - - public SuperByteBuffer get(Compartment compartment, T key, Callable callable) { - Cache cache = caches.get(compartment); - if (cache != null) { - try { - return cache.get(key, callable); - } catch (ExecutionException e) { - e.printStackTrace(); - } - } - return null; - } - - public void invalidate(Compartment compartment, T key) { - caches.get(compartment).invalidate(key); - } - - public void invalidate(Compartment compartment) { - caches.get(compartment).invalidateAll(); - } - - public void invalidate() { - caches.forEach((compartment, cache) -> cache.invalidateAll()); - } - - public static class Compartment { - } - -} 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 deleted file mode 100644 index 13c8f2b..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/SuperRenderTypeBuffer.java +++ /dev/null @@ -1,92 +0,0 @@ -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.SectionBufferBuilderPack; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.Sheets; -import net.minecraft.client.resources.model.ModelBakery; - -public class SuperRenderTypeBuffer implements MultiBufferSource { - - private static final SuperRenderTypeBuffer INSTANCE = new SuperRenderTypeBuffer(); - - public static SuperRenderTypeBuffer getInstance() { - return INSTANCE; - } - - private SuperRenderTypeBufferPhase earlyBuffer; - private SuperRenderTypeBufferPhase defaultBuffer; - private SuperRenderTypeBufferPhase lateBuffer; - - public SuperRenderTypeBuffer() { - earlyBuffer = new SuperRenderTypeBufferPhase(); - defaultBuffer = new SuperRenderTypeBufferPhase(); - lateBuffer = new SuperRenderTypeBufferPhase(); - } - - public VertexConsumer getEarlyBuffer(RenderType type) { - return earlyBuffer.bufferSource.getBuffer(type); - } - - @Override - public VertexConsumer getBuffer(RenderType type) { - return defaultBuffer.bufferSource.getBuffer(type); - } - - public VertexConsumer getLateBuffer(RenderType type) { - return lateBuffer.bufferSource.getBuffer(type); - } - - public void draw() { - earlyBuffer.bufferSource.endBatch(); - defaultBuffer.bufferSource.endBatch(); - lateBuffer.bufferSource.endBatch(); - } - - public void draw(RenderType type) { - earlyBuffer.bufferSource.endBatch(type); - defaultBuffer.bufferSource.endBatch(type); - lateBuffer.bufferSource.endBatch(type); - } - - private static class SuperRenderTypeBufferPhase { - - // Visible clones from RenderBuffers - private final SectionBufferBuilderPack fixedBufferPack = new SectionBufferBuilderPack(); - private final SortedMap fixedBuffers = Util.make(new Object2ObjectLinkedOpenHashMap<>(), map -> { - map.put(Sheets.solidBlockSheet(), this.fixedBufferPack.builder(RenderType.solid())); - map.put(Sheets.cutoutBlockSheet(), this.fixedBufferPack.builder(RenderType.cutout())); - map.put(Sheets.bannerSheet(), this.fixedBufferPack.builder(RenderType.cutoutMipped())); - map.put(Sheets.translucentCullBlockSheet(), this.fixedBufferPack.builder(RenderType.translucent())); - put(map, Sheets.shieldSheet()); - put(map, Sheets.bedSheet()); - put(map, Sheets.shulkerBoxSheet()); - put(map, Sheets.signSheet()); - put(map, Sheets.hangingSignSheet()); - map.put(Sheets.chestSheet(), new BufferBuilder(786432)); - put(map, RenderType.armorGlint()); - put(map, RenderType.armorEntityGlint()); - put(map, RenderType.glint()); - put(map, RenderType.glintDirect()); - put(map, RenderType.glintTranslucent()); - put(map, RenderType.entityGlint()); - put(map, RenderType.entityGlintDirect()); - put(map, RenderType.waterMask()); - ModelBakery.DESTROY_TYPES.forEach(p_173062_ -> put(map, p_173062_)); - }); - private final BufferSource bufferSource = MultiBufferSource.immediateWithBuffers(fixedBuffers, new BufferBuilder(256)); - - private static void put(Object2ObjectLinkedOpenHashMap map, RenderType type) { - map.put(type, new BufferBuilder(type.bufferSize())); - } - - } - -} 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 deleted file mode 100644 index 5e17cbf..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/render/TileEntityRenderHelper.java +++ /dev/null @@ -1,113 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.render; - -import com.jozufozu.flywheel.backend.Backend; -import com.jozufozu.flywheel.backend.instancing.InstancedRenderRegistry; -import com.jozufozu.flywheel.config.BackendType; -import com.jozufozu.flywheel.core.virtual.VirtualRenderWorld; -import com.jozufozu.flywheel.util.transform.TransformStack; -import com.mojang.blaze3d.vertex.PoseStack; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; -import net.minecraft.client.renderer.texture.OverlayTexture; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.entity.BlockEntity; -import 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; - -public class TileEntityRenderHelper { - - public static void renderTileEntities(Level world, Iterable customRenderTEs, PoseStack ms, - MultiBufferSource buffer) { - renderTileEntities(world, null, customRenderTEs, ms, null, buffer); - } - - public static void renderTileEntities(Level world, Iterable customRenderTEs, PoseStack ms, - MultiBufferSource buffer, float pt) { - renderTileEntities(world, null, customRenderTEs, ms, null, buffer, pt); - } - - public static void renderTileEntities(Level world, @Nullable VirtualRenderWorld renderWorld, - Iterable customRenderTEs, PoseStack ms, @Nullable Matrix4f lightTransform, MultiBufferSource buffer) { - renderTileEntities(world, renderWorld, customRenderTEs, ms, lightTransform, buffer, - AnimationTickHolder.getPartialTicks()); - } - - public static void renderTileEntities(Level world, @Nullable VirtualRenderWorld renderWorld, - Iterable customRenderTEs, PoseStack ms, @Nullable Matrix4f lightTransform, MultiBufferSource buffer, - float pt) { - Iterator iterator = customRenderTEs.iterator(); - while (iterator.hasNext()) { - BlockEntity tileEntity = iterator.next(); - if (Backend.getBackendType() == BackendType.INSTANCING && Backend.isFlywheelWorld(renderWorld) && InstancedRenderRegistry.shouldSkipRender(tileEntity)) - continue; - - BlockEntityRenderer renderer = Minecraft.getInstance().getBlockEntityRenderDispatcher().getRenderer(tileEntity); - if (renderer == null) { - iterator.remove(); - continue; - } - - BlockPos pos = tileEntity.getBlockPos(); - ms.pushPose(); - TransformStack.cast(ms) - .translate(pos); - - try { - int worldLight = getCombinedLight(world, getLightPos(lightTransform, pos), renderWorld, pos); - - if (renderWorld != null) { - // Swap the real world for the render world so that the renderer gets contraption-local information - tileEntity.setLevel(renderWorld); - renderer.render(tileEntity, pt, ms, buffer, worldLight, OverlayTexture.NO_OVERLAY); - tileEntity.setLevel(world); - } else { - renderer.render(tileEntity, pt, ms, buffer, worldLight, OverlayTexture.NO_OVERLAY); - } - - } catch (Exception e) { - iterator.remove(); - - String message = "BlockEntity " + RegisteredObjects.getKeyOrThrow(tileEntity.getType()) - .toString() + " could not be rendered virtually."; -// if (AllConfigs.CLIENT.explainRenderErrors.get()) - Create.LOGGER.error(message, e); -// else -// Create.LOGGER.error(message); - } - - ms.popPose(); - } - } - - private static BlockPos getLightPos(@Nullable Matrix4f lightTransform, BlockPos contraptionPos) { - if (lightTransform != null) { - Vector4f lightVec = new Vector4f(contraptionPos.getX() + .5f, contraptionPos.getY() + .5f, contraptionPos.getZ() + .5f, 1); - lightVec.mul(lightTransform); - return BlockPos.containing(lightVec.x(), lightVec.y(), lightVec.z()); - } else { - return contraptionPos; - } - } - - public static int getCombinedLight(Level world, BlockPos worldPos, @Nullable VirtualRenderWorld renderWorld, - BlockPos renderWorldPos) { - int worldLight = LevelRenderer.getLightColor(world, worldPos); - - if (renderWorld != null) { - int renderWorldLight = LevelRenderer.getLightColor(renderWorld, renderWorldPos); - return SuperByteBuffer.maxLight(worldLight, renderWorldLight); - } - - return worldLight; - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/AngleHelper.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/AngleHelper.java deleted file mode 100644 index 3855074..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/AngleHelper.java +++ /dev/null @@ -1,52 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility; - -import net.minecraft.core.Direction; -import net.minecraft.core.Direction.Axis; -import net.minecraft.util.Mth; - -public class AngleHelper { - - public static float horizontalAngle(Direction facing) { - if (facing.getAxis().isVertical()) - return 0; - float angle = facing.toYRot(); - if (facing.getAxis() == Axis.X) - angle = -angle; - return angle; - } - - public static float verticalAngle(Direction facing) { - return facing == Direction.UP ? -90 : facing == Direction.DOWN ? 90 : 0; - } - - public static float rad(double angle) { - if (angle == 0) - return 0; - return (float) (angle / 180 * Math.PI); - } - - public static float deg(double angle) { - if (angle == 0) - return 0; - return (float) (angle * 180 / Math.PI); - } - - public static float angleLerp(double pct, double current, double target) { - return (float) (current + getShortestAngleDiff(current, target) * pct); - } - - public static float getShortestAngleDiff(double current, double target) { - current = current % 360; - target = target % 360; - return (float) (((((target - current) % 360) + 540) % 360) - 180); - } - - public static float getShortestAngleDiff(double current, double target, float hint) { - float diff = getShortestAngleDiff(current, target); - if (Mth.equal(Math.abs(diff), 180) && Math.signum(diff) != Math.signum(hint)) { - return diff + 360*Math.signum(hint); - } - return diff; - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/AnimationTickHolder.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/AnimationTickHolder.java deleted file mode 100644 index 6269bad..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/AnimationTickHolder.java +++ /dev/null @@ -1,56 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility; - -import nl.requios.effortlessbuilding.create.foundation.utility.worldWrappers.WrappedClientWorld; -import net.minecraft.client.Minecraft; -import net.minecraft.world.level.LevelAccessor; - -public class AnimationTickHolder { - - private static int ticks; - private static int pausedTicks; - - public static void reset() { - ticks = 0; - pausedTicks = 0; - } - - public static void tick() { - if (!Minecraft.getInstance() - .isPaused()) { - ticks = (ticks + 1) % 1_728_000; // wrap around every 24 hours so we maintain enough floating point precision - } else { - pausedTicks = (pausedTicks + 1) % 1_728_000; - } - } - - public static int getTicks() { - return getTicks(false); - } - - public static int getTicks(boolean includePaused) { - return includePaused ? ticks + pausedTicks : ticks; - } - - public static float getRenderTime() { - return getTicks() + getPartialTicks(); - } - - public static float getPartialTicks() { - Minecraft mc = Minecraft.getInstance(); - return (mc.isPaused() ? mc.pausePartialTick : mc.getFrameTime()); - } - - public static int getTicks(LevelAccessor world) { - if (world instanceof WrappedClientWorld) - return getTicks(((WrappedClientWorld) world).getWrappedWorld()); - return getTicks(); - } - - public static float getRenderTime(LevelAccessor world) { - return getTicks(world) + getPartialTicks(world); - } - - public static float getPartialTicks(LevelAccessor world) { - return getPartialTicks(); - } -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/BBHelper.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/BBHelper.java deleted file mode 100644 index 7b9ee4a..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/BBHelper.java +++ /dev/null @@ -1,20 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility; - -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.levelgen.structure.BoundingBox; - -public class BBHelper { - - public static BoundingBox encapsulate(BoundingBox bb, BlockPos pos) { - return new BoundingBox(Math.min(bb.minX(), pos.getX()), Math.min(bb.minY(), pos.getY()), - Math.min(bb.minZ(), pos.getZ()), Math.max(bb.maxX(), pos.getX()), Math.max(bb.maxY(), pos.getY()), - Math.max(bb.maxZ(), pos.getZ())); - } - - public static BoundingBox encapsulate(BoundingBox bb, BoundingBox bb2) { - return new BoundingBox(Math.min(bb.minX(), bb2.minX()), Math.min(bb.minY(), bb2.minY()), - Math.min(bb.minZ(), bb2.minZ()), Math.max(bb.maxX(), bb2.maxX()), Math.max(bb.maxY(), bb2.maxY()), - Math.max(bb.maxZ(), bb2.maxZ())); - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/BlockFace.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/BlockFace.java deleted file mode 100644 index 925af11..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/BlockFace.java +++ /dev/null @@ -1,52 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.NbtUtils; - -public class BlockFace extends Pair { - - public BlockFace(BlockPos first, Direction second) { - super(first, second); - } - - public boolean isEquivalent(BlockFace other) { - if (equals(other)) - return true; - return getConnectedPos().equals(other.getPos()) && getPos().equals(other.getConnectedPos()); - } - - public BlockPos getPos() { - return getFirst(); - } - - public Direction getFace() { - return getSecond(); - } - - public Direction getOppositeFace() { - return getSecond().getOpposite(); - } - - public BlockFace getOpposite() { - return new BlockFace(getConnectedPos(), getOppositeFace()); - } - - public BlockPos getConnectedPos() { - return getPos().relative(getFace()); - } - - public CompoundTag serializeNBT() { - CompoundTag compoundNBT = new CompoundTag(); - compoundNBT.put("Pos", NbtUtils.writeBlockPos(getPos())); - NBTHelper.writeEnum(compoundNBT, "Face", getFace()); - return compoundNBT; - } - - public static BlockFace fromNBT(CompoundTag compound) { - return new BlockFace(NbtUtils.readBlockPos(compound.getCompound("Pos")), - NBTHelper.readEnum(compound, "Face", Direction.class)); - } - -} 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 9e6a3ab..1d1f817 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 @@ -1,7 +1,10 @@ package nl.requios.effortlessbuilding.create.foundation.utility; +import net.createmod.catnip.nbt.NBTProcessors; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.core.Registry; +import net.minecraft.core.RegistryAccess; import net.minecraft.core.SectionPos; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.core.registries.Registries; @@ -16,6 +19,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import net.minecraft.world.item.enchantment.Enchantment; import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.GameRules; @@ -29,19 +33,41 @@ 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; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.IntegerProperty; import net.minecraft.world.level.block.state.properties.Property; 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.neoforged.neoforge.common.IPlantable; import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.common.SpecialPlantable; +import net.neoforged.neoforge.event.level.BlockDropsEvent; import net.neoforged.neoforge.event.level.BlockEvent; import javax.annotation.Nullable; +import java.util.List; import java.util.function.Consumer; public class BlockHelper { + private static final List COUNT_STATES = List.of( + BlockStateProperties.EGGS, + BlockStateProperties.PICKLES, + BlockStateProperties.CANDLES + ); + + private static final List VINELIKE_BLOCKS = List.of( + Blocks.VINE, Blocks.GLOW_LICHEN + ); + + private static final List VINELIKE_STATES = List.of( + BlockStateProperties.UP, + BlockStateProperties.NORTH, + BlockStateProperties.EAST, + BlockStateProperties.SOUTH, + BlockStateProperties.WEST, + BlockStateProperties.DOWN + ); public static BlockState setZeroAge(BlockState blockState) { if (blockState.hasProperty(BlockStateProperties.AGE_1)) @@ -78,44 +104,54 @@ public class BlockHelper { Item required = getRequiredItem(block).getItem(); boolean needsTwo = block.hasProperty(BlockStateProperties.SLAB_TYPE) - && block.getValue(BlockStateProperties.SLAB_TYPE) == SlabType.DOUBLE; + && block.getValue(BlockStateProperties.SLAB_TYPE) == SlabType.DOUBLE; if (needsTwo) amount *= 2; - if (block.hasProperty(BlockStateProperties.EGGS)) - amount *= block.getValue(BlockStateProperties.EGGS); + for (IntegerProperty property : COUNT_STATES) + if (block.hasProperty(property)) + amount *= block.getValue(property); - if (block.hasProperty(BlockStateProperties.PICKLES)) - amount *= block.getValue(BlockStateProperties.PICKLES); + if (VINELIKE_BLOCKS.contains(block.getBlock())) { + int vineCount = 0; + + for (BooleanProperty vineState : VINELIKE_STATES) { + if (block.hasProperty(vineState) && block.getValue(vineState)) { + vineCount++; + } + } + + amount += vineCount - 1; + } { // Try held Item first int preferredSlot = player.getInventory().selected; ItemStack itemstack = player.getInventory() - .getItem(preferredSlot); + .getItem(preferredSlot); int count = itemstack.getCount(); if (itemstack.getItem() == required && count > 0) { int taken = Math.min(count, amount - amountFound); player.getInventory() - .setItem(preferredSlot, new ItemStack(itemstack.getItem(), count - taken)); + .setItem(preferredSlot, new ItemStack(itemstack.getItem(), count - taken)); amountFound += taken; } } // Search inventory for (int i = 0; i < player.getInventory() - .getContainerSize(); ++i) { + .getContainerSize(); ++i) { if (amountFound == amount) break; ItemStack itemstack = player.getInventory() - .getItem(i); + .getItem(i); int count = itemstack.getCount(); if (itemstack.getItem() == required && count > 0) { int taken = Math.min(count, amount - amountFound); player.getInventory() - .setItem(i, new ItemStack(itemstack.getItem(), count - taken)); + .setItem(i, new ItemStack(itemstack.getItem(), count - taken)); amountFound += taken; } } @@ -124,7 +160,7 @@ public class BlockHelper { // Give back 1 if uneven amount was removed if (amountFound % 2 != 0) player.getInventory() - .add(new ItemStack(required)); + .add(new ItemStack(required)); amountFound /= 2; } @@ -144,68 +180,74 @@ public class BlockHelper { } public static void destroyBlock(Level world, BlockPos pos, float effectChance, - Consumer droppedItemCallback) { + Consumer droppedItemCallback) { destroyBlockAs(world, pos, null, ItemStack.EMPTY, effectChance, droppedItemCallback); } public static boolean destroyBlockAs(Level world, BlockPos pos, @Nullable Player player, ItemStack usedTool, - float effectChance, Consumer droppedItemCallback) { + float effectChance, Consumer droppedItemCallback) { FluidState fluidState = world.getFluidState(pos); BlockState state = world.getBlockState(pos); - + if (world.random.nextFloat() < effectChance) world.levelEvent(2001, pos, Block.getId(state)); - BlockEntity tileentity = state.hasBlockEntity() ? world.getBlockEntity(pos) : null; - + BlockEntity blockEntity = state.hasBlockEntity() ? world.getBlockEntity(pos) : null; + if (player != null) { BlockEvent.BreakEvent event = new BlockEvent.BreakEvent(world, pos, state, player); NeoForge.EVENT_BUS.post(event); if (event.isCanceled()) return false; - if (event.getExpToDrop() > 0 && world instanceof ServerLevel) - state.getBlock() - .popExperience((ServerLevel) world, pos, event.getExpToDrop()); - usedTool.mineBlock(world, state, pos, player); player.awardStat(Stats.BLOCK_MINED.get(state.getBlock())); } - if (world instanceof ServerLevel && world.getGameRules() - .getBoolean(GameRules.RULE_DOBLOCKDROPS) && !world.restoringBlockSnapshots - && (player == null || !player.isCreative())) { - for (ItemStack itemStack : Block.getDrops(state, (ServerLevel) world, pos, tileentity, player, usedTool)) + if (world instanceof ServerLevel serverLevel && world.getGameRules() + .getBoolean(GameRules.RULE_DOBLOCKDROPS) && !world.restoringBlockSnapshots + && (player == null || !player.isCreative())) { + List drops = Block.getDrops(state, serverLevel, pos, blockEntity, player, usedTool); + if (player != null) { + BlockDropsEvent event = new BlockDropsEvent(serverLevel, pos, state, blockEntity, List.of(), player, usedTool); + NeoForge.EVENT_BUS.post(event); + if (!event.isCanceled()) { + if ( event.getDroppedExperience() > 0) + state.getBlock().popExperience(serverLevel, pos, event.getDroppedExperience()); + } + } + for (ItemStack itemStack : drops) droppedItemCallback.accept(itemStack); // Simulating IceBlock#playerDestroy. Not calling method directly as it would drop item // entities as a side-effect - if (state.getBlock() instanceof IceBlock && usedTool.getEnchantmentLevel(Enchantments.SILK_TOUCH) == 0) { + Registry enchantmentRegistry = world.registryAccess().registryOrThrow(Registries.ENCHANTMENT); + if (state.getBlock() instanceof IceBlock && usedTool.getEnchantmentLevel(enchantmentRegistry.getHolderOrThrow(Enchantments.SILK_TOUCH)) == 0) { if (world.dimensionType() - .ultraWarm()) + .ultraWarm()) return false; - BlockState belowState = world.getBlockState(pos.below()); - if (belowState.blocksMotion() || belowState.liquid()) + BlockState blockstate = world.getBlockState(pos.below()); + if (blockstate.blocksMotion() || blockstate.liquid()) world.setBlockAndUpdate(pos, Blocks.WATER.defaultBlockState()); - return true; + return false; } state.spawnAfterBreak((ServerLevel) world, pos, ItemStack.EMPTY, true); } - + world.setBlockAndUpdate(pos, fluidState.createLegacyBlock()); return true; } public static boolean isSolidWall(BlockGetter reader, BlockPos fromPos, Direction toDirection) { return hasBlockSolidSide(reader.getBlockState(fromPos.relative(toDirection)), reader, - fromPos.relative(toDirection), toDirection.getOpposite()); + fromPos.relative(toDirection), toDirection.getOpposite()); } public static boolean noCollisionInSpace(BlockGetter reader, BlockPos pos) { return reader.getBlockState(pos) - .getCollisionShape(reader, pos) - .isEmpty(); + .getCollisionShape(reader, pos) + .isEmpty(); } private static void placeRailWithoutUpdate(Level world, BlockState state, BlockPos target) { @@ -218,18 +260,33 @@ public class BlockHelper { chunk.getSections()[idx] = chunksection; } BlockState old = chunksection.setBlockState(SectionPos.sectionRelative(target.getX()), - SectionPos.sectionRelative(target.getY()), SectionPos.sectionRelative(target.getZ()), state); + SectionPos.sectionRelative(target.getY()), SectionPos.sectionRelative(target.getZ()), state); chunk.setUnsaved(true); world.markAndNotifyBlock(target, chunk, old, state, 82, 512); world.setBlock(target, state, 82); world.neighborChanged(target, world.getBlockState(target.below()) - .getBlock(), target.below()); + .getBlock(), target.below()); } - public static boolean placeSchematicBlock(Level world, Player player, BlockState state, BlockPos target, ItemStack stack, - @Nullable CompoundTag data) { - BlockEntity existingTile = world.getBlockEntity(target); + public static CompoundTag prepareBlockEntityData(BlockState blockState, BlockEntity blockEntity) { + CompoundTag data = null; + if (blockEntity == null) + return null; + RegistryAccess access = blockEntity.getLevel().registryAccess(); + if (blockEntity instanceof IPartialSafeNBT safeNbtBE) { + data = new CompoundTag(); + safeNbtBE.writeSafe(data, access); + data = NBTProcessors.process(blockState, blockEntity, data, true); + } + + return data; + } + + public static void placeSchematicBlock(Level world, BlockState state, BlockPos target, ItemStack stack, + @Nullable CompoundTag data) { + BlockEntity existingBlockEntity = world.getBlockEntity(target); + boolean alreadyPlaced = false; // Piston if (state.hasProperty(BlockStateProperties.EXTENDED)) @@ -239,58 +296,69 @@ public class BlockHelper { if (state.getBlock() == Blocks.COMPOSTER) state = Blocks.COMPOSTER.defaultBlockState(); - else if (state.getBlock() != Blocks.SEA_PICKLE && state.getBlock() instanceof IPlantable) - state = ((IPlantable) state.getBlock()).getPlant(world, target); + else if (state.getBlock() != Blocks.SEA_PICKLE && state.getBlock() instanceof SpecialPlantable specialPlantable) { + alreadyPlaced = true; + if (specialPlantable.canPlacePlantAtPosition(stack, world, target, null)) + specialPlantable.spawnPlantAtPosition(stack, world, target, null); + } else if (state.is(BlockTags.CAULDRONS)) state = Blocks.CAULDRON.defaultBlockState(); if (world.dimensionType() - .ultraWarm() && state.getFluidState().is(FluidTags.WATER)) { + .ultraWarm() && state.getFluidState().is(FluidTags.WATER)) { int i = target.getX(); int j = target.getY(); int k = target.getZ(); world.playSound(null, target, SoundEvents.FIRE_EXTINGUISH, SoundSource.BLOCKS, 0.5F, - 2.6F + (world.random.nextFloat() - world.random.nextFloat()) * 0.8F); + 2.6F + (world.random.nextFloat() - world.random.nextFloat()) * 0.8F); for (int l = 0; l < 8; ++l) { world.addParticle(ParticleTypes.LARGE_SMOKE, i + Math.random(), j + Math.random(), k + Math.random(), - 0.0D, 0.0D, 0.0D); + 0.0D, 0.0D, 0.0D); } Block.dropResources(state, world, target); - return true; + return; } - if (state.getBlock() instanceof BaseRailBlock) { + //noinspection StatementWithEmptyBody + if (alreadyPlaced) { + // pass + } else if (state.getBlock() instanceof BaseRailBlock) { placeRailWithoutUpdate(world, state, target); } else { - world.setBlock(target, state, 2); //Changed flag from 18 to 3 + world.setBlock(target, state, 18); } if (data != null) { -// if (existingTile instanceof IMergeableTE mergeable) { -// BlockEntity loaded = BlockEntity.loadStatic(target, state, data); -// if (existingTile.getType() -// .equals(loaded.getType())) { -// mergeable.accept(loaded); -// return; +// if (existingBlockEntity instanceof IMergeableBE mergeable) { +// BlockEntity loaded = BlockEntity.loadStatic(target, state, data, world.registryAccess()); +// if (loaded != null) { +// if (existingBlockEntity.getType() +// .equals(loaded.getType())) { +// mergeable.accept(loaded); +// return; +// } // } // } - BlockEntity tile = world.getBlockEntity(target); - if (tile != null) { + BlockEntity blockEntity = world.getBlockEntity(target); + if (blockEntity != null) { data.putInt("x", target.getX()); data.putInt("y", target.getY()); data.putInt("z", target.getZ()); -// if (tile instanceof KineticTileEntity) -// ((KineticTileEntity) tile).warnOfMovement(); - tile.load(data); +// if (blockEntity instanceof KineticBlockEntity kbe) +// kbe.warnOfMovement(); +// if (blockEntity instanceof IMultiBlockEntityContainer imbe) +// if (!imbe.isController()) +// data.put("Controller", NbtUtils.writeBlockPos(imbe.getController())); + blockEntity.loadWithComponents(data, world.registryAccess()); } } try { - state.getBlock().setPlacedBy(world, target, state, null, stack); - } catch (Exception ignored) { + state.getBlock() + .setPlacedBy(world, target, state, null, stack); + } catch (Exception e) { } - return true; } public static double getBounceMultiplier(Block block) { @@ -302,22 +370,9 @@ public class BlockHelper { } public static boolean hasBlockSolidSide(BlockState p_220056_0_, BlockGetter p_220056_1_, BlockPos p_220056_2_, - Direction p_220056_3_) { + Direction p_220056_3_) { return !p_220056_0_.is(BlockTags.LEAVES) - && Block.isFaceFull(p_220056_0_.getCollisionShape(p_220056_1_, p_220056_2_), p_220056_3_); - } - - public static boolean extinguishFire(Level world, @Nullable Player p_175719_1_, BlockPos p_175719_2_, - Direction p_175719_3_) { - p_175719_2_ = p_175719_2_.relative(p_175719_3_); - if (world.getBlockState(p_175719_2_) - .getBlock() == Blocks.FIRE) { - world.levelEvent(p_175719_1_, 1009, p_175719_2_, 0); - world.removeBlock(p_175719_2_, false); - return true; - } else { - return false; - } + && Block.isFaceFull(p_220056_0_.getCollisionShape(p_220056_1_, p_220056_2_), p_220056_3_); } public static BlockState copyProperties(BlockState fromState, BlockState toState) { @@ -328,7 +383,7 @@ public class BlockHelper { } public static > BlockState copyProperty(Property property, BlockState fromState, - BlockState toState) { + BlockState toState) { if (fromState.hasProperty(property) && toState.hasProperty(property)) { return toState.setValue(property, fromState.getValue(property)); } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/CameraAngleAnimationService.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/CameraAngleAnimationService.java index 5148b13..bae9b3f 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/CameraAngleAnimationService.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/CameraAngleAnimationService.java @@ -1,6 +1,7 @@ package nl.requios.effortlessbuilding.create.foundation.utility; -import nl.requios.effortlessbuilding.create.foundation.utility.animation.LerpedFloat; +import net.createmod.catnip.animation.LerpedFloat; +import net.createmod.catnip.math.AngleHelper; import net.minecraft.client.Minecraft; import net.minecraft.util.Mth; 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 deleted file mode 100644 index 8fba9e5..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/Color.java +++ /dev/null @@ -1,310 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility; - -import com.google.common.hash.Hashing; -import net.minecraft.util.Mth; -import net.minecraft.world.phys.Vec3; -import org.joml.Vector3f; - -import javax.annotation.Nonnull; -import java.util.function.UnaryOperator; - -public class Color { - public final static Color TRANSPARENT_BLACK = new Color(0, 0, 0, 0).setImmutable(); - public final static Color BLACK = new Color(0, 0, 0).setImmutable(); - public final static Color WHITE = new Color(255, 255, 255).setImmutable(); - public final static Color RED = new Color(255, 0, 0).setImmutable(); - public final static Color GREEN = new Color(0, 255, 0).setImmutable(); - public final static Color SPRING_GREEN = new Color(0, 255, 187).setImmutable(); - - protected boolean mutable = true; - protected int value; - - public Color(int r, int g, int b) { - this(r, g, b, 0xff); - } - - public Color(int r, int g, int b, int a) { - value = ((a & 0xff) << 24) | - ((r & 0xff) << 16) | - ((g & 0xff) << 8) | - ((b & 0xff) << 0); - } - - public Color(float r, float g, float b, float a) { - this( - (int) (0.5 + 0xff * Mth.clamp(r, 0, 1)), - (int) (0.5 + 0xff * Mth.clamp(g, 0, 1)), - (int) (0.5 + 0xff * Mth.clamp(b, 0, 1)), - (int) (0.5 + 0xff * Mth.clamp(a, 0, 1)) - ); - } - - public Color(int rgba) { - value = rgba; - } - - public Color(int rgb, boolean hasAlpha) { - if (hasAlpha) { - value = rgb; - } else { - value = rgb | 0xff_000000; - } - } - - public Color copy() { - return copy(true); - } - - public Color copy(boolean mutable) { - if (mutable) - return new Color(value); - else - return new Color(value).setImmutable(); - } - - /** - * Mark this color as immutable. Attempting to mutate this color in the future - * will instead cause a copy to be created that can me modified. - */ - public Color setImmutable() { - this.mutable = false; - return this; - } - - /** - * @return the red component in the range 0-255. - * @see #getRGB - */ - public int getRed() { - return (getRGB() >> 16) & 0xff; - } - - /** - * @return the green component in the range 0-255. - * @see #getRGB - */ - public int getGreen() { - return (getRGB() >> 8) & 0xff; - } - - /** - * @return the blue component in the range 0-255. - * @see #getRGB - */ - public int getBlue() { - return (getRGB() >> 0) & 0xff; - } - - /** - * @return the alpha component in the range 0-255. - * @see #getRGB - */ - public int getAlpha() { - return (getRGB() >> 24) & 0xff; - } - - /** - * @return the red component in the range 0-1f. - */ - public float getRedAsFloat() { - return getRed() / 255f; - } - - /** - * @return the green component in the range 0-1f. - */ - public float getGreenAsFloat() { - return getGreen() / 255f; - } - - /** - * @return the blue component in the range 0-1f. - */ - public float getBlueAsFloat() { - return getBlue() / 255f; - } - - /** - * @return the alpha component in the range 0-1f. - */ - public float getAlphaAsFloat() { - return getAlpha() / 255f; - } - - /** - * Returns the RGB value representing this color - * (Bits 24-31 are alpha, 16-23 are red, 8-15 are green, 0-7 are blue). - * @return the RGB value of the color - */ - public int getRGB() { - return value; - } - - public Vec3 asVector() { - return new Vec3(getRedAsFloat(), getGreenAsFloat(), getBlueAsFloat()); - } - - public Vector3f asVectorF() { - return new Vector3f(getRedAsFloat(), getGreenAsFloat(), getBlueAsFloat()); - } - - public Color setRed(int r) { - return ensureMutable().setRedUnchecked(r); - } - - public Color setGreen(int g) { - return ensureMutable().setGreenUnchecked(g); - } - - public Color setBlue(int b) { - return ensureMutable().setBlueUnchecked(b); - } - - public Color setAlpha(int a) { - return ensureMutable().setAlphaUnchecked(a); - } - - public Color setRed(float r) { - return ensureMutable().setRedUnchecked((int) (0xff * Mth.clamp(r, 0, 1))); - } - - public Color setGreen(float g) { - return ensureMutable().setGreenUnchecked((int) (0xff * Mth.clamp(g, 0, 1))); - } - - public Color setBlue(float b) { - return ensureMutable().setBlueUnchecked((int) (0xff * Mth.clamp(b, 0, 1))); - } - - public Color setAlpha(float a) { - return ensureMutable().setAlphaUnchecked((int) (0xff * Mth.clamp(a, 0, 1))); - } - - public Color scaleAlpha(float factor) { - return ensureMutable().setAlphaUnchecked((int) (getAlpha() * Mth.clamp(factor, 0, 1))); - } - - public Color mixWith(Color other, float weight) { - return ensureMutable() - .setRedUnchecked((int) (getRed() + (other.getRed() - getRed()) * weight)) - .setGreenUnchecked((int) (getGreen() + (other.getGreen() - getGreen()) * weight)) - .setBlueUnchecked((int) (getBlue() + (other.getBlue() - getBlue()) * weight)) - .setAlphaUnchecked((int) (getAlpha() + (other.getAlpha() - getAlpha()) * weight)); - } - - public Color darker() { - int a = getAlpha(); - return ensureMutable().mixWith(BLACK, .25f).setAlphaUnchecked(a); - } - - public Color brighter() { - int a = getAlpha(); - return ensureMutable().mixWith(WHITE, .25f).setAlphaUnchecked(a); - } - - public Color setValue(int value) { - return ensureMutable().setValueUnchecked(value); - } - - public Color modifyValue(UnaryOperator function) { - int newValue = function.apply(value); - if (newValue == value) - return this; - - return ensureMutable().setValueUnchecked(newValue); - } - - // ********* // - - protected Color ensureMutable() { - if (this.mutable) - return this; - - return new Color(this.value); - } - - protected Color setRedUnchecked(int r) { - this.value = (this.value & 0xff_00ffff) | ((r & 0xff) << 16); - return this; - } - - protected Color setGreenUnchecked(int g) { - this.value = (this.value & 0xff_ff00ff) | ((g & 0xff) << 8); - return this; - } - - protected Color setBlueUnchecked(int b) { - this.value = (this.value & 0xff_ffff00) | ((b & 0xff) << 0); - return this; - } - - protected Color setAlphaUnchecked(int a) { - this.value = (this.value & 0x00_ffffff) | ((a & 0xff) << 24); - return this; - } - - protected Color setValueUnchecked(int value) { - this.value = value; - return this; - } - - // ********* // - - public static Color mixColors(@Nonnull Color c1, @Nonnull Color c2, float w) { - return new Color( - (int) (c1.getRed() + (c2.getRed() - c1.getRed()) * w), - (int) (c1.getGreen() + (c2.getGreen() - c1.getGreen()) * w), - (int) (c1.getBlue() + (c2.getBlue() - c1.getBlue()) * w), - (int) (c1.getAlpha() + (c2.getAlpha() - c1.getAlpha()) * w) - ); - } - - public static Color mixColors(@Nonnull Couple colors, float w) { - return mixColors(colors.getFirst(), colors.getSecond(), w); - } - - public static int mixColors(int color1, int color2, float w) { - int a1 = (color1 >> 24); - int r1 = (color1 >> 16) & 0xFF; - int g1 = (color1 >> 8) & 0xFF; - int b1 = color1 & 0xFF; - int a2 = (color2 >> 24); - int r2 = (color2 >> 16) & 0xFF; - int g2 = (color2 >> 8) & 0xFF; - int b2 = color2 & 0xFF; - - return - ((int) (a1 + (a2 - a1) * w) << 24) + - ((int) (r1 + (r2 - r1) * w) << 16) + - ((int) (g1 + (g2 - g1) * w) << 8) + - ((int) (b1 + (b2 - b1) * w) << 0); - } - - public static Color rainbowColor(int timeStep) { - int localTimeStep = Math.abs(timeStep) % 1536; - int timeStepInPhase = localTimeStep % 256; - int phaseBlue = localTimeStep / 256; - int red = colorInPhase(phaseBlue + 4, timeStepInPhase); - int green = colorInPhase(phaseBlue + 2, timeStepInPhase); - int blue = colorInPhase(phaseBlue, timeStepInPhase); - return new Color(red, green, blue); - } - - private static int colorInPhase(int phase, int progress) { - phase = phase % 6; - if (phase <= 1) - return 0; - if (phase == 2) - return progress; - if (phase <= 4) - return 255; - else - return 255 - progress; - } - - public static Color generateFromLong(long l) { - return rainbowColor(Hashing.crc32().hashLong(l).asInt()) - .mixWith(WHITE, 0.5f); - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/ColorHandlers.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/ColorHandlers.java deleted file mode 100644 index cec8e18..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/ColorHandlers.java +++ /dev/null @@ -1,26 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility; - -import net.minecraft.client.color.block.BlockColor; -import net.minecraft.client.color.item.ItemColor; -import net.minecraft.client.renderer.BiomeColors; -import net.minecraft.world.level.GrassColor; -import net.minecraft.world.level.block.RedStoneWireBlock; -import net.minecraft.world.level.block.state.properties.BlockStateProperties; - -public class ColorHandlers { - - public static BlockColor getGrassyBlock() { - return (state, world, pos, layer) -> pos != null && world != null ? BiomeColors.getAverageGrassColor(world, pos) - : GrassColor.get(0.5D, 1.0D); - } - - public static ItemColor getGrassyItem() { - return (stack, layer) -> GrassColor.get(0.5D, 1.0D); - } - - public static BlockColor getRedstonePower() { - return (state, world, pos, layer) -> RedStoneWireBlock - .getColorForPower(pos != null && world != null ? state.getValue(BlockStateProperties.POWER) : 0); - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/Couple.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/Couple.java deleted file mode 100644 index d04238b..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/Couple.java +++ /dev/null @@ -1,151 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility; - -import com.google.common.collect.ImmutableList; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; - -import java.util.Iterator; -import java.util.List; -import java.util.function.*; -import java.util.stream.Stream; - -public class Couple extends Pair implements Iterable { - - private static final Couple TRUE_AND_FALSE = Couple.create(true, false); - - protected Couple(T first, T second) { - super(first, second); - } - - public static Couple create(T first, T second) { - return new Couple<>(first, second); - } - - public static Couple create(Supplier factory) { - return new Couple<>(factory.get(), factory.get()); - } - - public static Couple createWithContext(Function factory) { - return new Couple<>(factory.apply(true), factory.apply(false)); - } - - public T get(boolean first) { - return first ? getFirst() : getSecond(); - } - - public void set(boolean first, T value) { - if (first) - setFirst(value); - else - setSecond(value); - } - - @Override - public Couple copy() { - return create(first, second); - } - - public Couple map(Function function) { - return Couple.create(function.apply(first), function.apply(second)); - } - - public Couple mapWithContext(BiFunction function) { - return Couple.create(function.apply(first, true), function.apply(second, false)); - } - - public Couple mapWithParams(BiFunction function, Couple values) { - return Couple.create(function.apply(first, values.first), function.apply(second, values.second)); - } - - public Couple mapNotNullWithParam(BiFunction function, R value) { - return Couple.create(first != null ? function.apply(first, value) : null, - second != null ? function.apply(second, value) : null); - } - - public boolean both(Predicate test) { - return test.test(getFirst()) && test.test(getSecond()); - } - - public boolean either(Predicate test) { - return test.test(getFirst()) || test.test(getSecond()); - } - - public void replace(Function function) { - setFirst(function.apply(getFirst())); - setSecond(function.apply(getSecond())); - } - - public void replaceWithContext(BiFunction function) { - replaceWithParams(function, TRUE_AND_FALSE); - } - - public void replaceWithParams(BiFunction function, Couple values) { - setFirst(function.apply(getFirst(), values.getFirst())); - setSecond(function.apply(getSecond(), values.getSecond())); - } - - @Override - public void forEach(Consumer consumer) { - consumer.accept(getFirst()); - consumer.accept(getSecond()); - } - - public void forEachWithContext(BiConsumer consumer) { - forEachWithParams(consumer, TRUE_AND_FALSE); - } - - public void forEachWithParams(BiConsumer function, Couple values) { - function.accept(getFirst(), values.getFirst()); - function.accept(getSecond(), values.getSecond()); - } - - public Couple swap() { - return Couple.create(second, first); - } - - public ListTag serializeEach(Function serializer) { - return NBTHelper.writeCompoundList(ImmutableList.of(first, second), serializer); - } - - public static Couple deserializeEach(ListTag list, Function deserializer) { - List readCompoundList = NBTHelper.readCompoundList(list, deserializer); - return new Couple<>(readCompoundList.get(0), readCompoundList.get(1)); - } - - @Override - public Iterator iterator() { - return new Couplerator<>(this); - } - - public Stream stream() { - return Stream.of(first, second); - } - - private static class Couplerator implements Iterator { - - int state; - private final Couple couple; - - public Couplerator(Couple couple) { - this.couple = couple; - state = 0; - } - - @Override - public boolean hasNext() { - return state != 2; - } - - @Override - public T next() { - state++; - if (state == 1) - return couple.first; - if (state == 2) - return couple.second; - return null; - } - - } - -} 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 deleted file mode 100644 index 8b5aefc..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/CreateRegistry.java +++ /dev/null @@ -1,101 +0,0 @@ -//package nl.requios.effortlessbuilding.create.foundation.utility; -// -//import net.minecraft.resources.ResourceLocation; -//import net.neoforged.neoforge.registries.IForgeRegistry; -//import nl.requios.effortlessbuilding.create.Create; -//import org.jetbrains.annotations.Nullable; -// -//import java.util.*; -// -//public class CreateRegistry { -// private static final List> ALL = new ArrayList<>(); -// -// protected final IForgeRegistry objectRegistry; -// protected final Map locationMap = new HashMap<>(); -// protected final Map objectMap = new IdentityHashMap<>(); -// protected boolean unwrapped = false; -// -// public CreateRegistry(IForgeRegistry objectRegistry) { -// this.objectRegistry = objectRegistry; -// ALL.add(this); -// } -// -// public void register(ResourceLocation location, V value) { -// if (!unwrapped) { -// locationMap.put(location, value); -// } else { -// K object = objectRegistry.getValue(location); -// if (object != null) { -// objectMap.put(object, value); -// } else { -// Create.LOGGER.warn("Could not get object for location '" + location + "' in CreateRegistry after unwrapping!"); -// } -// } -// } -// -// public void register(K object, V value) { -// if (unwrapped) { -// objectMap.put(object, value); -// } else { -// ResourceLocation location = objectRegistry.getKey(object); -// if (location != null) { -// locationMap.put(location, value); -// } else { -// Create.LOGGER.warn("Could not get location of object '" + object + "' in CreateRegistry before unwrapping!"); -// } -// } -// } -// -// @Nullable -// public V get(ResourceLocation location) { -// if (!unwrapped) { -// return locationMap.get(location); -// } else { -// K object = objectRegistry.getValue(location); -// if (object != null) { -// return objectMap.get(object); -// } else { -// Create.LOGGER.warn("Could not get object for location '" + location + "' in CreateRegistry after unwrapping!"); -// return null; -// } -// } -// } -// -// @Nullable -// public V get(K object) { -// if (unwrapped) { -// return objectMap.get(object); -// } else { -// ResourceLocation location = objectRegistry.getKey(object); -// if (location != null) { -// return locationMap.get(location); -// } else { -// Create.LOGGER.warn("Could not get location of object '" + object + "' in CreateRegistry before unwrapping!"); -// return null; -// } -// } -// } -// -// public boolean isUnwrapped() { -// return unwrapped; -// } -// -// protected void unwrap() { -// for (Map.Entry entry : locationMap.entrySet()) { -// ResourceLocation location = entry.getKey(); -// K object = objectRegistry.getValue(location); -// if (object != null) { -// objectMap.put(object, entry.getValue()); -// } else { -// Create.LOGGER.warn("Could not get object for location '" + location + "' in CreateRegistry during unwrapping!"); -// } -// } -// unwrapped = true; -// } -// -// public static void unwrapAll() { -// for (CreateRegistry registry : ALL) { -// registry.unwrap(); -// } -// } -//} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/Debug.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/Debug.java index 49a1a33..998b131 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/Debug.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/Debug.java @@ -1,13 +1,13 @@ package nl.requios.effortlessbuilding.create.foundation.utility; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.fml.util.thread.EffectiveSide; -import nl.requios.effortlessbuilding.create.Create; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; +import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.fml.util.thread.EffectiveSide; +import nl.requios.effortlessbuilding.create.Create; /** Deprecated so simi doensn't forget to remove debug calls **/ @OnlyIn(value = Dist.CLIENT) diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/DyeHelper.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/DyeHelper.java deleted file mode 100644 index b53b435..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/DyeHelper.java +++ /dev/null @@ -1,75 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility; - -import com.google.common.collect.ImmutableMap; -import net.minecraft.world.item.DyeColor; -import net.minecraft.world.level.ItemLike; -import net.minecraft.world.level.block.Blocks; - -import java.util.Map; - -public class DyeHelper { - - public static ItemLike getWoolOfDye(DyeColor color) { - switch (color) { - case BLACK: - return Blocks.BLACK_WOOL; - case BLUE: - return Blocks.BLUE_WOOL; - case BROWN: - return Blocks.BROWN_WOOL; - case CYAN: - return Blocks.CYAN_WOOL; - case GRAY: - return Blocks.GRAY_WOOL; - case GREEN: - return Blocks.GREEN_WOOL; - case LIGHT_BLUE: - return Blocks.LIGHT_BLUE_WOOL; - case LIGHT_GRAY: - return Blocks.LIGHT_GRAY_WOOL; - case LIME: - return Blocks.LIME_WOOL; - case MAGENTA: - return Blocks.MAGENTA_WOOL; - case ORANGE: - return Blocks.ORANGE_WOOL; - case PINK: - return Blocks.PINK_WOOL; - case PURPLE: - return Blocks.PURPLE_WOOL; - case RED: - return Blocks.RED_WOOL; - case YELLOW: - return Blocks.YELLOW_WOOL; - case WHITE: - default: - return Blocks.WHITE_WOOL; - } - } - - public static final Map> DYE_TABLE = new ImmutableMap.Builder>() - - // DyeColor, ( Front RGB, Back RGB ) - .put(DyeColor.BLACK, Couple.create(0x45403B, 0x21201F)) - .put(DyeColor.RED, Couple.create(0xB13937, 0x632737)) - .put(DyeColor.GREEN, Couple.create(0x208A46, 0x1D6045)) - .put(DyeColor.BROWN, Couple.create(0xAC855C, 0x68533E)) - - .put(DyeColor.BLUE, Couple.create(0x5391E1, 0x504B90)) - .put(DyeColor.GRAY, Couple.create(0x5D666F, 0x313538)) - .put(DyeColor.LIGHT_GRAY, Couple.create(0x95969B, 0x707070)) - .put(DyeColor.PURPLE, Couple.create(0x9F54AE, 0x63366C)) - - .put(DyeColor.CYAN, Couple.create(0x3EABB4, 0x3C7872)) - .put(DyeColor.PINK, Couple.create(0xD5A8CB, 0xB86B95)) - .put(DyeColor.LIME, Couple.create(0xA3DF55, 0x4FB16F)) - .put(DyeColor.YELLOW, Couple.create(0xE6D756, 0xE9AC29)) - - .put(DyeColor.LIGHT_BLUE, Couple.create(0x69CED2, 0x508AA5)) - .put(DyeColor.ORANGE, Couple.create(0xEE9246, 0xD94927)) - .put(DyeColor.MAGENTA, Couple.create(0xF062B0, 0xC04488)) - .put(DyeColor.WHITE, Couple.create(0xEDEAE5, 0xBBB6B0)) - - .build(); - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/DynamicComponent.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/DynamicComponent.java deleted file mode 100644 index 6fc46da..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/DynamicComponent.java +++ /dev/null @@ -1,94 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility; - -import com.google.gson.JsonElement; -import com.google.gson.JsonParseException; -import com.google.gson.JsonParser; -import com.mojang.brigadier.exceptions.CommandSyntaxException; -import nl.requios.effortlessbuilding.create.Create; -import net.minecraft.commands.CommandSource; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.ComponentUtils; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.Level; -import net.minecraft.world.phys.Vec2; -import net.minecraft.world.phys.Vec3; - -public class DynamicComponent { - - private JsonElement rawCustomText; - private Component parsedCustomText; - - public DynamicComponent() {} - - public void displayCustomText(Level level, BlockPos pos, String tagElement) { - if (tagElement == null) - return; - - rawCustomText = getJsonFromString(tagElement); - parsedCustomText = parseCustomText(level, pos, rawCustomText); - } - - public boolean sameAs(String tagElement) { - return isValid() && rawCustomText.equals(getJsonFromString(tagElement)); - } - - public boolean isValid() { - return parsedCustomText != null && rawCustomText != null; - } - - public String resolve() { - return parsedCustomText.getString(); - } - - public MutableComponent get() { - return parsedCustomText == null ? Components.empty() : parsedCustomText.copy(); - } - - public void read(Level level, BlockPos pos, CompoundTag nbt) { - rawCustomText = getJsonFromString(nbt.getString("RawCustomText")); - try { - parsedCustomText = Component.Serializer.fromJson(nbt.getString("CustomText")); - } catch (JsonParseException e) { - parsedCustomText = null; - } - } - - public void write(CompoundTag nbt) { - if (!isValid()) - return; - - nbt.putString("RawCustomText", rawCustomText.toString()); - nbt.putString("CustomText", Component.Serializer.toJson(parsedCustomText)); - } - - public static JsonElement getJsonFromString(String string) { - try { - return JsonParser.parseString(string); - } catch (JsonParseException e) { - return null; - } - } - - public static Component parseCustomText(Level level, BlockPos pos, JsonElement customText) { - if (!(level instanceof ServerLevel serverLevel)) - return null; - try { - return ComponentUtils.updateForEntity(getCommandSource(serverLevel, pos), - Component.Serializer.fromJson(customText), null, 0); - } catch (JsonParseException e) { - return null; - } catch (CommandSyntaxException e) { - return null; - } - } - - public static CommandSourceStack getCommandSource(ServerLevel level, BlockPos pos) { - return new CommandSourceStack(CommandSource.NULL, Vec3.atCenterOf(pos), Vec2.ZERO, level, 2, Create.ID, - Components.literal(Create.ID), level.getServer(), null); - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/FilesHelper.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/FilesHelper.java deleted file mode 100644 index 8fba34d..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/FilesHelper.java +++ /dev/null @@ -1,101 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility; - -import com.google.gson.JsonElement; -import com.google.gson.JsonParser; -import com.google.gson.internal.Streams; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonWriter; -import nl.requios.effortlessbuilding.create.Create; -import net.minecraft.nbt.CompoundTag; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.nio.file.StandardOpenOption; - -public class FilesHelper { - - public static void createFolderIfMissing(String name) { - try { - Files.createDirectories(Paths.get(name)); - } catch (IOException e) { - Create.LOGGER.warn("Could not create Folder: {}", name); - } - } - - public static String findFirstValidFilename(String name, String folderPath, String extension) { - int index = 0; - String filename; - String filepath; - do { - filename = slug(name) + ((index == 0) ? "" : "_" + index) + "." + extension; - index++; - filepath = folderPath + "/" + filename; - } while (Files.exists(Paths.get(filepath))); - return filename; - } - - public static String slug(String name) { - return Lang.asId(name) - .replaceAll("\\W+", "_"); - } - - public static boolean saveTagCompoundAsJson(CompoundTag compound, String path) { - try { - Files.deleteIfExists(Paths.get(path)); - JsonWriter writer = new JsonWriter(Files.newBufferedWriter(Paths.get(path), StandardOpenOption.CREATE)); - writer.setIndent(" "); - Streams.write(JsonParser.parseString(compound.toString()), writer); - writer.close(); - return true; - } catch (IOException e) { - e.printStackTrace(); - } - return false; - } - - public static boolean saveTagCompoundAsJsonCompact(CompoundTag compound, String path) { - try { - Files.deleteIfExists(Paths.get(path)); - JsonWriter writer = new JsonWriter(Files.newBufferedWriter(Paths.get(path), StandardOpenOption.CREATE)); - Streams.write(JsonParser.parseString(compound.toString()), writer); - writer.close(); - return true; - } catch (IOException e) { - e.printStackTrace(); - } - return false; - - } - - private static JsonElement loadJson(InputStream inputStream) { - try { - JsonReader reader = new JsonReader(new BufferedReader(new InputStreamReader(inputStream))); - reader.setLenient(true); - JsonElement element = Streams.parse(reader); - reader.close(); - inputStream.close(); - return element; - } catch (IOException e) { - e.printStackTrace(); - } - return null; - } - - public static JsonElement loadJsonResource(String filepath) { - return loadJson(ClassLoader.getSystemResourceAsStream(filepath)); - } - - public static JsonElement loadJson(String filepath) { - try { - return loadJson(Files.newInputStream(Paths.get(filepath), StandardOpenOption.READ)); - } catch (IOException e) { - e.printStackTrace(); - } - return null; - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/FluidFormatter.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/FluidFormatter.java index ec19ea9..d43492e 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/FluidFormatter.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/FluidFormatter.java @@ -1,5 +1,6 @@ package nl.requios.effortlessbuilding.create.foundation.utility; +import net.createmod.catnip.data.Couple; import net.minecraft.network.chat.MutableComponent; public class FluidFormatter { 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 deleted file mode 100644 index 4f18057..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/FontHelper.java +++ /dev/null @@ -1,87 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.Tesselator; -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; -import java.util.List; - -public final class FontHelper { - - private FontHelper() {} - - public static List cutString(Font font, String text, int maxWidthPerLine) { - // Split words - List words = new LinkedList<>(); - BreakIterator iterator = BreakIterator.getLineInstance(Minecraft.getInstance().getLocale()); - iterator.setText(text); - int start = iterator.first(); - for (int end = iterator.next(); end != BreakIterator.DONE; start = end, end = iterator.next()) { - String word = text.substring(start, end); - words.add(word); - } - // Apply hard wrap - List lines = new LinkedList<>(); - StringBuilder currentLine = new StringBuilder(); - int width = 0; - for (String word : words) { - int newWidth = font.width(word); - if (width + newWidth > maxWidthPerLine) { - if (width > 0) { - String line = currentLine.toString(); - lines.add(line); - currentLine = new StringBuilder(); - width = 0; - } else { - lines.add(word); - continue; - } - } - currentLine.append(word); - width += newWidth; - } - if (width > 0) { - lines.add(currentLine.toString()); - } - return lines; - } - - public static void drawSplitString(PoseStack ms, Font font, String text, int x, int y, int width, - int color) { - List list = cutString(font, text, width); - Matrix4f matrix4f = ms.last() - .pose(); - - for (String s : list) { - float f = (float) x; - if (font.isBidirectional()) { - int i = font.width(font.bidirectionalShaping(s)); - f += (float) (width - i); - } - - draw(font, s, f, (float) y, color, matrix4f, false); - y += 9; - } - } - - 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_) { - 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, Font.DisplayMode.NORMAL, 0, LightTexture.FULL_BRIGHT); - irendertypebuffer$impl.endBatch(); - return i; - } - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/IPartialSafeNBT.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/IPartialSafeNBT.java index dfe8a01..89f3c57 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/IPartialSafeNBT.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/IPartialSafeNBT.java @@ -1,8 +1,11 @@ package nl.requios.effortlessbuilding.create.foundation.utility; +import net.minecraft.core.HolderLookup; import net.minecraft.nbt.CompoundTag; public interface IPartialSafeNBT { - /** This method always runs on the logical server. */ - public void writeSafe(CompoundTag compound); + /** + * This will always be called from the logical server + */ + void writeSafe(CompoundTag compound, HolderLookup.Provider registries); } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/IntAttached.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/IntAttached.java deleted file mode 100644 index 3d9e28e..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/IntAttached.java +++ /dev/null @@ -1,61 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility; - -import net.minecraft.nbt.CompoundTag; - -import java.util.Comparator; -import java.util.function.Function; - -public class IntAttached extends Pair { - - protected IntAttached(Integer first, V second) { - super(first, second); - } - - public static IntAttached with(int number, V value) { - return new IntAttached<>(number, value); - } - - public static IntAttached withZero(V value) { - return new IntAttached<>(0, value); - } - - public boolean isZero() { - return first.intValue() == 0; - } - - public boolean exceeds(int value) { - return first.intValue() > value; - } - - public boolean isOrBelowZero() { - return first.intValue() <= 0; - } - - public void increment() { - first++; - } - - public void decrement() { - first--; - } - - public V getValue() { - return getSecond(); - } - - public CompoundTag serializeNBT(Function serializer) { - CompoundTag nbt = new CompoundTag(); - nbt.put("Item", serializer.apply(getValue())); - nbt.putInt("Location", getFirst()); - return nbt; - } - - public static Comparator> comparator() { - return (i1, i2) -> Integer.compare(i2.getFirst(), i1.getFirst()); - } - - public static IntAttached read(CompoundTag nbt, Function deserializer) { - return IntAttached.with(nbt.getInt("Location"), deserializer.apply(nbt.getCompound("Item"))); - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/Iterate.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/Iterate.java deleted file mode 100644 index 6382596..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/Iterate.java +++ /dev/null @@ -1,48 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Direction.Axis; - -import java.util.Arrays; -import java.util.EnumSet; -import java.util.List; - -public class Iterate { - - public static final boolean[] trueAndFalse = { true, false }; - public static final boolean[] falseAndTrue = { false, true }; - public static final int[] zeroAndOne = { 0, 1 }; - public static final int[] positiveAndNegative = { 1, -1 }; - public static final Direction[] directions = Direction.values(); - public static final Direction[] horizontalDirections = getHorizontals(); - public static final Axis[] axes = Axis.values(); - public static final EnumSet axisSet = EnumSet.allOf(Axis.class); - - private static Direction[] getHorizontals() { - Direction[] directions = new Direction[4]; - for (int i = 0; i < 4; i++) - directions[i] = Direction.from2DDataValue(i); - return directions; - } - - public static Direction[] directionsInAxis(Axis axis) { - switch (axis) { - case X: - return new Direction[] { Direction.EAST, Direction.WEST }; - case Y: - return new Direction[] { Direction.UP, Direction.DOWN }; - default: - case Z: - return new Direction[] { Direction.SOUTH, Direction.NORTH }; - } - } - - public static List hereAndBelow(BlockPos pos) { - return Arrays.asList(pos, pos.below()); - } - - public static List hereBelowAndAbove(BlockPos pos) { - return Arrays.asList(pos, pos.below(), pos.above()); - } -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/Lang.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/Lang.java index 1d4aef6..08976b1 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/Lang.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/Lang.java @@ -1,11 +1,13 @@ package nl.requios.effortlessbuilding.create.foundation.utility; -import nl.requios.effortlessbuilding.create.Create; +import net.createmod.catnip.lang.LangBuilder; +import net.createmod.catnip.lang.LangNumberFormat; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; import net.neoforged.neoforge.fluids.FluidStack; +import nl.requios.effortlessbuilding.create.Create; import java.util.ArrayList; import java.util.List; @@ -63,7 +65,7 @@ public class Lang { } public static LangBuilder fluidName(FluidStack stack) { - return builder().add(stack.getDisplayName() + return builder().add(stack.getHoverName() .copy()); } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/LangBuilder.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/LangBuilder.java deleted file mode 100644 index b143a0b..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/LangBuilder.java +++ /dev/null @@ -1,165 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility; - -import joptsimple.internal.Strings; -import net.minecraft.ChatFormatting; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.world.entity.player.Player; - -import java.util.List; - -public class LangBuilder { - - String namespace; - MutableComponent component; - - public LangBuilder(String namespace) { - this.namespace = namespace; - } - - public LangBuilder space() { - return text(" "); - } - - public LangBuilder newLine() { - return text("\n"); - } - - /** - * Appends a localised component
- * To add an independently formatted localised component, use add() and a nested - * builder - * - * @param langKey - * @param args - * @return - */ - public LangBuilder translate(String langKey, Object... args) { - return add(Components.translatable(namespace + "." + langKey, Lang.resolveBuilders(args))); - } - - /** - * Appends a text component - * - * @param literalText - * @return - */ - public LangBuilder text(String literalText) { - return add(Components.literal(literalText)); - } - - /** - * Appends a colored text component - * - * @param format - * @param literalText - * @return - */ - public LangBuilder text(ChatFormatting format, String literalText) { - return add(Components.literal(literalText).withStyle(format)); - } - - /** - * Appends a colored text component - * - * @param color - * @param literalText - * @return - */ - public LangBuilder text(int color, String literalText) { - return add(Components.literal(literalText).withStyle(s -> s.withColor(color))); - } - - /** - * Appends the contents of another builder - * - * @param otherBuilder - * @return - */ - public LangBuilder add(LangBuilder otherBuilder) { - return add(otherBuilder.component()); - } - - /** - * Appends a component - * - * @param customComponent - * @return - */ - public LangBuilder add(MutableComponent customComponent) { - component = component == null ? customComponent : component.append(customComponent); - return this; - } - - // - - /** - * Applies the format to all added components - * - * @param format - * @return - */ - public LangBuilder style(ChatFormatting format) { - assertComponent(); - component = component.withStyle(format); - return this; - } - - /** - * Applies the color to all added components - * - * @param color - * @return - */ - public LangBuilder color(int color) { - assertComponent(); - component = component.withStyle(s -> s.withColor(color)); - return this; - } - - // - - public MutableComponent component() { - assertComponent(); - return component; - } - - public String string() { - return component().getString(); - } - - public String json() { - return Component.Serializer.toJson(component()); - } - - public void sendStatus(Player player) { - player.displayClientMessage(component(), true); - } - - public void sendChat(Player player) { - player.displayClientMessage(component(), false); - } - - public void addTo(List tooltip) { - tooltip.add(component()); - } - - public void forGoggles(List tooltip) { - forGoggles(tooltip, 0); - } - - public void forGoggles(List tooltip, int indents) { - tooltip.add(Lang.builder() - .text(Strings.repeat(' ', 4 + indents)) - .add(this) - .component()); - } - - // - - private void assertComponent() { - if (component == null) - throw new IllegalStateException("No components were added to builder"); - } - -} \ No newline at end of file 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 deleted file mode 100644 index 77ae9e5..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/LangNumberFormat.java +++ /dev/null @@ -1,32 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility; - -import net.minecraft.client.Minecraft; - -import java.text.NumberFormat; -import java.util.Locale; - -public class LangNumberFormat { - - private NumberFormat format = NumberFormat.getNumberInstance(Locale.ROOT); - public static LangNumberFormat numberFormat = new LangNumberFormat(); - - public NumberFormat get() { - return format; - } - - public void update() { - format = NumberFormat.getInstance(Minecraft.getInstance() - .getLanguageManager() - .getJavaLocale()); - format.setMaximumFractionDigits(2); - format.setMinimumFractionDigits(0); - format.setGroupingUsed(true); - } - - public static String format(double d) { - return numberFormat.get() - .format(d) - .replace("\u00A0", " "); - } - -} \ No newline at end of file diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/NBTHelper.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/NBTHelper.java deleted file mode 100644 index bff79f7..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/NBTHelper.java +++ /dev/null @@ -1,106 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility; - -import net.minecraft.core.Vec3i; -import net.minecraft.nbt.*; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.phys.AABB; - -import javax.annotation.Nonnull; -import java.util.ArrayList; -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Function; - -public class NBTHelper { - - public static void putMarker(CompoundTag nbt, String marker) { - nbt.putBoolean(marker, true); - } - - public static > T readEnum(CompoundTag nbt, String key, Class enumClass) { - T[] enumConstants = enumClass.getEnumConstants(); - if (enumConstants == null) - throw new IllegalArgumentException("Non-Enum class passed to readEnum: " + enumClass.getName()); - if (nbt.contains(key, Tag.TAG_STRING)) { - String name = nbt.getString(key); - for (T t : enumConstants) { - if (t.name() - .equals(name)) - return t; - } - } - return enumConstants[0]; - } - - public static > void writeEnum(CompoundTag nbt, String key, T enumConstant) { - nbt.putString(key, enumConstant.name()); - } - - public static ListTag writeCompoundList(Iterable list, Function serializer) { - ListTag listNBT = new ListTag(); - list.forEach(t -> { - CompoundTag apply = serializer.apply(t); - if (apply == null) - return; - listNBT.add(apply); - }); - return listNBT; - } - - public static List readCompoundList(ListTag listNBT, Function deserializer) { - List list = new ArrayList<>(listNBT.size()); - listNBT.forEach(inbt -> list.add(deserializer.apply((CompoundTag) inbt))); - return list; - } - - public static void iterateCompoundList(ListTag listNBT, Consumer consumer) { - listNBT.forEach(inbt -> consumer.accept((CompoundTag) inbt)); - } - -// public static ListTag writeItemList(Iterable stacks) { -// return writeCompoundList(stacks, ItemStack::serializeNBT); -// } - - public static List readItemList(ListTag stacks) { - return readCompoundList(stacks, ItemStack::of); - } - - public static ListTag writeAABB(AABB bb) { - ListTag bbtag = new ListTag(); - bbtag.add(FloatTag.valueOf((float) bb.minX)); - bbtag.add(FloatTag.valueOf((float) bb.minY)); - bbtag.add(FloatTag.valueOf((float) bb.minZ)); - bbtag.add(FloatTag.valueOf((float) bb.maxX)); - bbtag.add(FloatTag.valueOf((float) bb.maxY)); - bbtag.add(FloatTag.valueOf((float) bb.maxZ)); - return bbtag; - } - - public static AABB readAABB(ListTag bbtag) { - if (bbtag == null || bbtag.isEmpty()) - return null; - return new AABB(bbtag.getFloat(0), bbtag.getFloat(1), bbtag.getFloat(2), bbtag.getFloat(3), - bbtag.getFloat(4), bbtag.getFloat(5)); - } - - public static ListTag writeVec3i(Vec3i vec) { - ListTag tag = new ListTag(); - tag.add(IntTag.valueOf(vec.getX())); - tag.add(IntTag.valueOf(vec.getY())); - tag.add(IntTag.valueOf(vec.getZ())); - return tag; - } - - public static Vec3i readVec3i(ListTag tag) { - return new Vec3i(tag.getInt(0), tag.getInt(1), tag.getInt(2)); - } - - @Nonnull - public static Tag getINBT(CompoundTag nbt, String id) { - Tag inbt = nbt.get(id); - if (inbt != null) - return inbt; - return new CompoundTag(); - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/NBTProcessors.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/NBTProcessors.java deleted file mode 100644 index 218024e..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/NBTProcessors.java +++ /dev/null @@ -1,84 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; -import net.minecraft.network.chat.Component; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.level.block.entity.SpawnerBlockEntity; - -import javax.annotation.Nullable; -import java.util.HashMap; -import java.util.Map; -import java.util.function.UnaryOperator; - -public final class NBTProcessors { - - private static final Map, UnaryOperator> processors = new HashMap<>(); - private static final Map, UnaryOperator> survivalProcessors = new HashMap<>(); - - public static synchronized void addProcessor(BlockEntityType type, UnaryOperator processor) { - processors.put(type, processor); - } - - public static synchronized void addSurvivalProcessor(BlockEntityType type, UnaryOperator processor) { - survivalProcessors.put(type, processor); - } - - static { - addProcessor(BlockEntityType.SIGN, data -> { - for (int i = 0; i < 4; ++i) { - if (textComponentHasClickEvent(data.getString("Text" + (i + 1)))) - return null; - } - return data; - }); - addProcessor(BlockEntityType.LECTERN, data -> { - if (!data.contains("Book", Tag.TAG_COMPOUND)) - return data; - CompoundTag book = data.getCompound("Book"); - - if (!book.contains("tag", Tag.TAG_COMPOUND)) - return data; - CompoundTag tag = book.getCompound("tag"); - - if (!tag.contains("pages", Tag.TAG_LIST)) - return data; - ListTag pages = tag.getList("pages", Tag.TAG_STRING); - - for (Tag inbt : pages) { - if (textComponentHasClickEvent(inbt.getAsString())) - return null; - } - return data; - }); - } - - public static boolean textComponentHasClickEvent(String json) { - Component component = Component.Serializer.fromJson(json.isEmpty() ? "\"\"" : json); - return component != null && component.getStyle() != null && component.getStyle().getClickEvent() != null; - } - - private NBTProcessors() { - } - - @Nullable - public static CompoundTag process(BlockEntity tileEntity, CompoundTag compound, boolean survival) { - if (compound == null) - return null; - BlockEntityType type = tileEntity.getType(); - if (survival && survivalProcessors.containsKey(type)) - compound = survivalProcessors.get(type) - .apply(compound); - if (compound != null && processors.containsKey(type)) - return processors.get(type) - .apply(compound); - if (tileEntity instanceof SpawnerBlockEntity) - return compound; - if (tileEntity.onlyOpCanSetNbt()) - return null; - return compound; - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/Pair.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/Pair.java deleted file mode 100644 index 569b1e4..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/Pair.java +++ /dev/null @@ -1,68 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility; - -import java.util.Objects; - -public class Pair { - - F first; - S second; - - protected Pair(F first, S second) { - this.first = first; - this.second = second; - } - - public static Pair of(F first, S second) { - return new Pair<>(first, second); - } - - public F getFirst() { - return first; - } - - public S getSecond() { - return second; - } - - public void setFirst(F first) { - this.first = first; - } - - public void setSecond(S second) { - this.second = second; - } - - public Pair copy() { - return Pair.of(first, second); - } - - @Override - public boolean equals(final Object obj) { - if (obj == this) - return true; - if (obj instanceof Pair) { - final Pair other = (Pair) obj; - return Objects.equals(first, other.first) && Objects.equals(second, other.second); - } - return false; - } - - @Override - public int hashCode() { - return (nullHash(first) * 31) ^ nullHash(second); - } - - int nullHash(Object o) { - return o == null ? 0 : o.hashCode(); - } - - @Override - public String toString() { - return "(" + first + ", " + second + ")"; - } - - public Pair swap() { - return Pair.of(second, first); - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/Pointing.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/Pointing.java deleted file mode 100644 index 18a1716..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/Pointing.java +++ /dev/null @@ -1,35 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility; - -import net.minecraft.core.Direction; -import net.minecraft.core.Direction.Axis; -import net.minecraft.core.Direction.AxisDirection; -import net.minecraft.util.StringRepresentable; - -public enum Pointing implements StringRepresentable { - UP(0), LEFT(270), DOWN(180), RIGHT(90); - - private int xRotation; - - private Pointing(int xRotation) { - this.xRotation = xRotation; - } - - @Override - public String getSerializedName() { - return Lang.asId(name()); - } - - public int getXRotation() { - return xRotation; - } - - public Direction getCombinedDirection(Direction direction) { - Axis axis = direction.getAxis(); - Direction top = axis == Axis.Y ? Direction.SOUTH : Direction.UP; - int rotations = direction.getAxisDirection() == AxisDirection.NEGATIVE ? 4 - ordinal() : ordinal(); - for (int i = 0; i < rotations; i++) - top = top.getClockWise(axis); - return top; - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/RegisteredObjects.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/RegisteredObjects.java deleted file mode 100644 index 9e31149..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/RegisteredObjects.java +++ /dev/null @@ -1,66 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility; - -import net.minecraft.core.Registry; -import net.minecraft.core.particles.ParticleType; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.EntityType; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.alchemy.Potion; -import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.level.material.Fluid; -import org.jetbrains.annotations.NotNull; - -public final class RegisteredObjects { - // registry argument for easier porting to 1.19 - @NotNull - public static ResourceLocation getKeyOrThrow(Registry registry, V value) { - ResourceLocation key = registry.getKey(value); - if (key == null) { - throw new IllegalArgumentException("Could not get key for value " + value + "!"); - } - return key; - } - - @NotNull - public static ResourceLocation getKeyOrThrow(Block value) { - return getKeyOrThrow(BuiltInRegistries.BLOCK, value); - } - - @NotNull - public static ResourceLocation getKeyOrThrow(Item value) { - return getKeyOrThrow(BuiltInRegistries.ITEM, value); - } - - @NotNull - public static ResourceLocation getKeyOrThrow(Fluid value) { - return getKeyOrThrow(BuiltInRegistries.FLUID, value); - } - - @NotNull - public static ResourceLocation getKeyOrThrow(EntityType value) { - return getKeyOrThrow(BuiltInRegistries.ENTITY_TYPE, value); - } - - @NotNull - public static ResourceLocation getKeyOrThrow(BlockEntityType value) { - return getKeyOrThrow(BuiltInRegistries.BLOCK_ENTITY_TYPE, value); - } - - @NotNull - public static ResourceLocation getKeyOrThrow(Potion value) { - return getKeyOrThrow(BuiltInRegistries.POTION, value); - } - - @NotNull - public static ResourceLocation getKeyOrThrow(ParticleType value) { - return getKeyOrThrow(BuiltInRegistries.PARTICLE_TYPE, value); - } - - @NotNull - public static ResourceLocation getKeyOrThrow(RecipeSerializer value) { - return getKeyOrThrow(BuiltInRegistries.RECIPE_SERIALIZER, value); - } -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/ResetableLazy.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/ResetableLazy.java index a344a32..4969463 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/ResetableLazy.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/ResetableLazy.java @@ -1,15 +1,15 @@ package nl.requios.effortlessbuilding.create.foundation.utility; -import net.neoforged.neoforge.common.util.NonNullSupplier; +import org.jetbrains.annotations.NotNull; import java.util.function.Supplier; public class ResetableLazy implements Supplier { - private final NonNullSupplier supplier; + private final Supplier<@NotNull T> supplier; private T value; - public ResetableLazy(NonNullSupplier supplier) { + public ResetableLazy(Supplier<@NotNull T> supplier) { this.supplier = supplier; } @@ -25,7 +25,7 @@ public class ResetableLazy implements Supplier { value = null; } - public static ResetableLazy of(NonNullSupplier supplier) { + public static ResetableLazy of(Supplier<@NotNull T> supplier) { return new ResetableLazy<>(supplier); } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/UniqueLinkedList.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/UniqueLinkedList.java deleted file mode 100644 index d5d148c..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/UniqueLinkedList.java +++ /dev/null @@ -1,102 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility; - -import java.util.Collection; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.stream.Collectors; - -public class UniqueLinkedList extends LinkedList { - /** - * - */ - private static final long serialVersionUID = 1L; - private final HashSet contained = new HashSet<>(); - - @Override - public boolean contains(Object o) { - return contained.contains(o); - } - - @Override - public E poll() { - E e = super.poll(); - contained.remove(e); - return e; - } - - @Override - public boolean add(E e) { - if (contained.add(e)) - return super.add(e); - else - return false; - } - - @Override - public void add(int index, E element) { - if (contained.add(element)) - super.add(index, element); - } - - @Override - public void addFirst(E e) { - if (contained.add(e)) - super.addFirst(e); - } - - @Override - public void addLast(E e) { - if (contained.add(e)) - super.addLast(e); - } - - @Override - public boolean addAll(Collection c) { - List filtered = c.stream() - .filter(it -> !contained.contains(it)) - .collect(Collectors.toList()); - return super.addAll(filtered); - } - - @Override - public boolean addAll(int index, Collection c) { - List filtered = c.stream() - .filter(it -> !contained.contains(it)) - .collect(Collectors.toList()); - return super.addAll(index, filtered); - } - - @Override - public boolean remove(Object o) { - contained.remove(o); - return super.remove(o); - } - - @Override - public E remove(int index) { - E e = super.remove(index); - contained.remove(e); - return e; - } - - @Override - public E removeFirst() { - E e = super.removeFirst(); - contained.remove(e); - return e; - } - - @Override - public E removeLast() { - E e = super.removeLast(); - contained.remove(e); - return e; - } - - @Override - public void clear() { - super.clear(); - contained.clear(); - } -} 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 deleted file mode 100644 index e701f22..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/VecHelper.java +++ /dev/null @@ -1,342 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility; - -import net.minecraft.client.Camera; -import net.minecraft.client.Minecraft; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Direction.Axis; -import net.minecraft.core.Vec3i; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.DoubleTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.util.Mth; -import net.minecraft.util.RandomSource; -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; - -public class VecHelper { - - public static final Vec3 CENTER_OF_ORIGIN = new Vec3(.5, .5, .5); - - public static Vec3 rotate(Vec3 vec, Vec3 rotationVec) { - return rotate(vec, rotationVec.x, rotationVec.y, rotationVec.z); - } - - public static Vec3 rotate(Vec3 vec, double xRot, double yRot, double zRot) { - return rotate(rotate(rotate(vec, xRot, Axis.X), yRot, Axis.Y), zRot, Axis.Z); - } - - public static Vec3 rotateCentered(Vec3 vec, double deg, Axis axis) { - Vec3 shift = getCenterOf(BlockPos.ZERO); - return VecHelper.rotate(vec.subtract(shift), deg, axis) - .add(shift); - } - - public static Vec3 rotate(Vec3 vec, double deg, Axis axis) { - if (deg == 0) - return vec; - if (vec == Vec3.ZERO) - return vec; - - float angle = (float) (deg / 180f * Math.PI); - double sin = Mth.sin(angle); - double cos = Mth.cos(angle); - double x = vec.x; - double y = vec.y; - double z = vec.z; - - if (axis == Axis.X) - return new Vec3(x, y * cos - z * sin, z * cos + y * sin); - if (axis == Axis.Y) - return new Vec3(x * cos + z * sin, y, z * cos - x * sin); - if (axis == Axis.Z) - return new Vec3(x * cos - y * sin, y * cos + x * sin, z); - return vec; - } - - public static Vec3 mirrorCentered(Vec3 vec, Mirror mirror) { - Vec3 shift = getCenterOf(BlockPos.ZERO); - return VecHelper.mirror(vec.subtract(shift), mirror) - .add(shift); - } - - public static Vec3 mirror(Vec3 vec, Mirror mirror) { - if (mirror == null || mirror == Mirror.NONE) - return vec; - if (vec == Vec3.ZERO) - return vec; - - double x = vec.x; - double y = vec.y; - double z = vec.z; - - if (mirror == Mirror.LEFT_RIGHT) - return new Vec3(x, y, -z); - if (mirror == Mirror.FRONT_BACK) - return new Vec3(-x, y, z); - return vec; - } - - public static Vec3 lookAt(Vec3 vec, Vec3 fwd) { - fwd = fwd.normalize(); - Vec3 up = new Vec3(0, 1, 0); - double dot = fwd.dot(up); - if (Math.abs(dot) > 1 - 1.0E-3) - up = new Vec3(0, 0, dot > 0 ? 1 : -1); - Vec3 right = fwd.cross(up) - .normalize(); - up = right.cross(fwd) - .normalize(); - double x = vec.x * right.x + vec.y * up.x + vec.z * fwd.x; - double y = vec.x * right.y + vec.y * up.y + vec.z * fwd.y; - double z = vec.x * right.z + vec.y * up.z + vec.z * fwd.z; - return new Vec3(x, y, z); - } - - public static boolean isVecPointingTowards(Vec3 vec, Direction direction) { - return Vec3.atLowerCornerOf(direction.getNormal()) - .dot(vec.normalize()) > 0.125; // slight tolerance to activate perpendicular movement actors - } - - public static Vec3 getCenterOf(Vec3i pos) { - if (pos.equals(Vec3i.ZERO)) - return CENTER_OF_ORIGIN; - return Vec3.atLowerCornerOf(pos) - .add(.5f, .5f, .5f); - } - - public static Vec3 offsetRandomly(Vec3 vec, RandomSource r, float radius) { - return new Vec3(vec.x + (r.nextFloat() - .5f) * 2 * radius, vec.y + (r.nextFloat() - .5f) * 2 * radius, - vec.z + (r.nextFloat() - .5f) * 2 * radius); - } - - public static Vec3 axisAlingedPlaneOf(Vec3 vec) { - vec = vec.normalize(); - return new Vec3(1, 1, 1).subtract(Math.abs(vec.x), Math.abs(vec.y), Math.abs(vec.z)); - } - - public static Vec3 axisAlingedPlaneOf(Direction face) { - return axisAlingedPlaneOf(Vec3.atLowerCornerOf(face.getNormal())); - } - - public static ListTag writeNBT(Vec3 vec) { - ListTag listnbt = new ListTag(); - listnbt.add(DoubleTag.valueOf(vec.x)); - listnbt.add(DoubleTag.valueOf(vec.y)); - listnbt.add(DoubleTag.valueOf(vec.z)); - return listnbt; - } - - public static CompoundTag writeNBTCompound(Vec3 vec) { - CompoundTag compoundTag = new CompoundTag(); - compoundTag.put("V", writeNBT(vec)); - return compoundTag; - } - - public static Vec3 readNBT(ListTag list) { - if (list.isEmpty()) - return Vec3.ZERO; - return new Vec3(list.getDouble(0), list.getDouble(1), list.getDouble(2)); - } - - public static Vec3 readNBTCompound(CompoundTag nbt) { - return readNBT(nbt.getList("V", Tag.TAG_DOUBLE)); - } - - public static void write(Vec3 vec, FriendlyByteBuf buffer) { - buffer.writeDouble(vec.x); - buffer.writeDouble(vec.y); - buffer.writeDouble(vec.z); - } - - public static Vec3 read(FriendlyByteBuf buffer) { - return new Vec3(buffer.readDouble(), buffer.readDouble(), buffer.readDouble()); - } - - public static Vec3 voxelSpace(double x, double y, double z) { - return new Vec3(x, y, z).scale(1 / 16f); - } - - public static int getCoordinate(Vec3i pos, Axis axis) { - return axis.choose(pos.getX(), pos.getY(), pos.getZ()); - } - - public static float getCoordinate(Vec3 vec, Axis axis) { - return (float) axis.choose(vec.x, vec.y, vec.z); - } - - public static boolean onSameAxis(BlockPos pos1, BlockPos pos2, Axis axis) { - if (pos1.equals(pos2)) - return true; - for (Axis otherAxis : Axis.values()) - if (axis != otherAxis) - if (getCoordinate(pos1, otherAxis) != getCoordinate(pos2, otherAxis)) - return false; - return true; - } - - public static Vec3 clamp(Vec3 vec, float maxLength) { - return vec.length() > maxLength ? vec.normalize() - .scale(maxLength) : vec; - } - - public static Vec3 lerp(float p, Vec3 from, Vec3 to) { - return from.add(to.subtract(from) - .scale(p)); - } - - public static Vec3 slerp(float p, Vec3 from, Vec3 to) { - double theta = Math.acos(from.dot(to)); - return from.scale(Mth.sin(1 - p) * theta) - .add(to.scale(Mth.sin((float) (theta * p)))) - .scale(1 / Mth.sin((float) theta)); - } - - public static Vec3 clampComponentWise(Vec3 vec, float maxLength) { - return new Vec3(Mth.clamp(vec.x, -maxLength, maxLength), Mth.clamp(vec.y, -maxLength, maxLength), - Mth.clamp(vec.z, -maxLength, maxLength)); - } - - public static Vec3 project(Vec3 vec, Vec3 ontoVec) { - if (ontoVec.equals(Vec3.ZERO)) - return Vec3.ZERO; - return ontoVec.scale(vec.dot(ontoVec) / ontoVec.lengthSqr()); - } - - @Nullable - public static Vec3 intersectSphere(Vec3 origin, Vec3 lineDirection, Vec3 sphereCenter, double radius) { - if (lineDirection.equals(Vec3.ZERO)) - return null; - if (lineDirection.length() != 1) - lineDirection = lineDirection.normalize(); - - Vec3 diff = origin.subtract(sphereCenter); - double lineDotDiff = lineDirection.dot(diff); - double delta = lineDotDiff * lineDotDiff - (diff.lengthSqr() - radius * radius); - if (delta < 0) - return null; - double t = -lineDotDiff + Math.sqrt(delta); - return origin.add(lineDirection.scale(t)); - } - - // https://forums.minecraftforge.net/topic/88562-116solved-3d-to-2d-conversion/?do=findComment&comment=413573 - // slightly modified - public static Vec3 projectToPlayerView(Vec3 target, float partialTicks) { - /* - * The (centered) location on the screen of the given 3d point in the world. - * Result is (dist right of center screen, dist up from center screen, if < 0, - * then in front of view plane) - */ - Camera ari = Minecraft.getInstance().gameRenderer.getMainCamera(); - Vec3 camera_pos = ari.getPosition(); - 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.rotate(camera_rotation_conj); - - // ----- compensate for view bobbing (if active) ----- - // the following code adapted from GameRenderer::applyBobbing (to invert it) - Minecraft mc = Minecraft.getInstance(); - if (mc.options.bobView().get()) { - Entity renderViewEntity = mc.getCameraEntity(); - if (renderViewEntity instanceof Player) { - Player playerentity = (Player) renderViewEntity; - float distwalked_modified = playerentity.walkDist; - - float f = distwalked_modified - playerentity.walkDistO; - float f1 = -(distwalked_modified + f * partialTicks); - float f2 = Mth.lerp(partialTicks, playerentity.oBob, playerentity.bob); - 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); - - 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.y = -bob_translation.y(); // this is weird but hey, if it works - result3f.add(bob_translation); - } - } - - // ----- adjust for fov ----- - float fov = 70;//(float) ((GameRendererAccessor) mc.gameRenderer).create$callGetFov(ari, partialTicks, true); - - float half_height = (float) mc.getWindow() - .getGuiScaledHeight() / 2; - float scale_factor = half_height / (result3f.z() * (float) Math.tan(Math.toRadians(fov / 2))); - return new Vec3(-result3f.x() * scale_factor, result3f.y() * scale_factor, result3f.z()); - } - - public static Vec3 bezier(Vec3 p1, Vec3 p2, Vec3 q1, Vec3 q2, float t) { - Vec3 v1 = lerp(t, p1, q1); - Vec3 v2 = lerp(t, q1, q2); - Vec3 v3 = lerp(t, q2, p2); - Vec3 inner1 = lerp(t, v1, v2); - Vec3 inner2 = lerp(t, v2, v3); - Vec3 result = lerp(t, inner1, inner2); - return result; - } - - public static Vec3 bezierDerivative(Vec3 p1, Vec3 p2, Vec3 q1, Vec3 q2, float t) { - return p1.scale(-3 * t * t + 6 * t - 3) - .add(q1.scale(9 * t * t - 12 * t + 3)) - .add(q2.scale(-9 * t * t + 6 * t)) - .add(p2.scale(3 * t * t)); - } - - @Nullable - public static double[] intersectRanged(Vec3 p1, Vec3 q1, Vec3 p2, Vec3 q2, Axis plane) { - Vec3 pDiff = p2.subtract(p1); - Vec3 qDiff = q2.subtract(q1); - double[] intersect = intersect(p1, q1, pDiff.normalize(), qDiff.normalize(), plane); - if (intersect == null) - return null; - if (intersect[0] < 0 || intersect[1] < 0) - return null; - if (intersect[0] > pDiff.length() || intersect[1] > qDiff.length()) - return null; - return intersect; - } - - @Nullable - public static double[] intersect(Vec3 p1, Vec3 p2, Vec3 r, Vec3 s, Axis plane) { - if (plane == Axis.X) { - p1 = new Vec3(p1.y, 0, p1.z); - p2 = new Vec3(p2.y, 0, p2.z); - r = new Vec3(r.y, 0, r.z); - s = new Vec3(s.y, 0, s.z); - } - - if (plane == Axis.Z) { - p1 = new Vec3(p1.x, 0, p1.y); - p2 = new Vec3(p2.x, 0, p2.y); - r = new Vec3(r.x, 0, r.y); - s = new Vec3(s.x, 0, s.y); - } - - Vec3 qminusp = p2.subtract(p1); - double rcs = r.x * s.z - r.z * s.x; - if (Mth.equal(rcs, 0)) - return null; - Vec3 rdivrcs = r.scale(1 / rcs); - Vec3 sdivrcs = s.scale(1 / rcs); - double t = qminusp.x * sdivrcs.z - qminusp.z * sdivrcs.x; - double u = qminusp.x * rdivrcs.z - qminusp.z * rdivrcs.x; - return new double[] { t, u }; - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/VoxelShaper.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/VoxelShaper.java index c18807b..6b45732 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/VoxelShaper.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/VoxelShaper.java @@ -1,5 +1,7 @@ package nl.requios.effortlessbuilding.create.foundation.utility; +import net.createmod.catnip.data.Iterate; +import net.createmod.catnip.math.VecHelper; import net.minecraft.core.Direction; import net.minecraft.core.Direction.Axis; import net.minecraft.core.Direction.AxisDirection; diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/WorldAttached.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/WorldAttached.java deleted file mode 100644 index 9c9c081..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/WorldAttached.java +++ /dev/null @@ -1,101 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility; - -import net.minecraft.world.level.LevelAccessor; - -import javax.annotation.Nonnull; -import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.WeakHashMap; -import java.util.function.BiConsumer; -import java.util.function.Consumer; -import java.util.function.Function; - -public class WorldAttached { - - // weak references to prevent leaking hashmaps when a WorldAttached is GC'd during runtime - static List>> allMaps = new ArrayList<>(); - private final Map attached; - private final Function factory; - - public WorldAttached(Function factory) { - this.factory = factory; - // Weak key hashmaps prevent worlds not existing anywhere else from leaking memory. - // This is only a fallback in the event that unload events fail to fire for any reason. - attached = new WeakHashMap<>(); - allMaps.add(new WeakReference<>(attached)); - } - - public static void invalidateWorld(LevelAccessor world) { - var i = allMaps.iterator(); - while (i.hasNext()) { - Map map = i.next() - .get(); - if (map == null) { - // If the map has been GC'd, remove the weak reference - i.remove(); - } else { - // Prevent leaks - map.remove(world); - } - } - } - - @Nonnull - public T get(LevelAccessor world) { - T t = attached.get(world); - if (t != null) return t; - T entry = factory.apply(world); - put(world, entry); - return entry; - } - - public void put(LevelAccessor world, T entry) { - attached.put(world, entry); - } - - /** - * Replaces the entry with a new one from the factory and returns the new entry. - */ - @Nonnull - public T replace(LevelAccessor world) { - attached.remove(world); - - return get(world); - } - - /** - * Replaces the entry with a new one from the factory and returns the new entry. - */ - @Nonnull - public T replace(LevelAccessor world, Consumer finalizer) { - T remove = attached.remove(world); - - if (remove != null) - finalizer.accept(remove); - - return get(world); - } - - /** - * Deletes all entries after calling a function on them. - * - * @param finalizer Do something with all of the world-value pairs - */ - public void empty(BiConsumer finalizer) { - attached.forEach(finalizer); - attached.clear(); - } - - /** - * Deletes all entries after calling a function on them. - * - * @param finalizer Do something with all of the values - */ - public void empty(Consumer finalizer) { - attached.values() - .forEach(finalizer); - attached.clear(); - } -} 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 deleted file mode 100644 index 03489d4..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/WorldHelper.java +++ /dev/null @@ -1,13 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility; - -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(Registries.DIMENSION_TYPE) - .getKey(world.dimensionType()); - } -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/animation/Force.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/animation/Force.java deleted file mode 100644 index 493a4cf..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/animation/Force.java +++ /dev/null @@ -1,102 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility.animation; - -public interface Force { - - float get(float mass, float value, float speed); - - boolean finished(); - - class Drag implements Force { - final float dragFactor; - - public Drag(float dragFactor) { - this.dragFactor = dragFactor; - } - - @Override - public float get(float mass, float value, float speed) { - return -speed * dragFactor; - } - - @Override - public boolean finished() { - return false; - } - } - - class Zeroing implements Force { - final float g; - - public Zeroing(float g) { - this.g = g / 20; - } - - @Override - public float get(float mass, float value, float speed) { - return -Math.signum(value) * g * mass; - } - - @Override - public boolean finished() { - return false; - } - } - - class Impulse implements Force { - - float force; - - public Impulse(float force) { - this.force = force; - } - - @Override - public float get(float mass, float value, float speed) { - return force; - } - - @Override - public boolean finished() { - return true; - } - } - - class OverTime implements Force { - int timeRemaining; - float f; - - public OverTime(int time, float totalAcceleration) { - this.timeRemaining = time; - this.f = totalAcceleration / (float) time; - } - - @Override - public float get(float mass, float value, float speed) { - timeRemaining--; - return f; - } - - @Override - public boolean finished() { - return timeRemaining <= 0; - } - } - - class Static implements Force { - float force; - - public Static(float force) { - this.force = force; - } - - @Override - public float get(float mass, float value, float speed) { - return force; - } - - @Override - public boolean finished() { - return false; - } - } -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/animation/LerpedFloat.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/animation/LerpedFloat.java deleted file mode 100644 index 1043202..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/animation/LerpedFloat.java +++ /dev/null @@ -1,149 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility.animation; - -import nl.requios.effortlessbuilding.create.foundation.utility.AngleHelper; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.util.Mth; - -public class LerpedFloat { - - protected Interpolator interpolator; - protected float previousValue; - protected float value; - - protected Chaser chaseFunction; - protected float chaseTarget; - protected float chaseSpeed; - protected boolean angularChase; - - protected boolean forcedSync; - - public LerpedFloat(Interpolator interpolator) { - this.interpolator = interpolator; - startWithValue(0); - forcedSync = true; - } - - public static LerpedFloat linear() { - return new LerpedFloat((p, c, t) -> (float) Mth.lerp(p, c, t)); - } - - public static LerpedFloat angular() { - LerpedFloat lerpedFloat = new LerpedFloat(AngleHelper::angleLerp); - lerpedFloat.angularChase = true; - return lerpedFloat; - } - - public LerpedFloat startWithValue(double value) { - float f = (float) value; - this.previousValue = f; - this.chaseTarget = f; - this.value = f; - return this; - } - - public LerpedFloat chase(double value, double speed, Chaser chaseFunction) { - updateChaseTarget((float) value); - this.chaseSpeed = (float) speed; - this.chaseFunction = chaseFunction; - return this; - } - - public LerpedFloat disableSmartAngleChasing() { - angularChase = false; - return this; - } - - public void updateChaseTarget(float target) { - if (angularChase) - target = value + AngleHelper.getShortestAngleDiff(value, target); - this.chaseTarget = target; - } - - public boolean updateChaseSpeed(double speed) { - float prevSpeed = this.chaseSpeed; - this.chaseSpeed = (float) speed; - return !Mth.equal(prevSpeed, speed); - } - - public void tickChaser() { - previousValue = value; - if (chaseFunction == null) - return; - if (Mth.equal((double) value, chaseTarget)) { - value = chaseTarget; - return; - } - value = chaseFunction.chase(value, chaseSpeed, chaseTarget); - } - - public void setValueNoUpdate(double value) { - this.value = (float) value; - } - - public void setValue(double value) { - this.previousValue = this.value; - this.value = (float) value; - } - - public float getValue() { - return getValue(1); - } - - public float getValue(float partialTicks) { - return interpolator.interpolate(partialTicks, previousValue, value); - } - - public boolean settled() { - return Mth.equal((double) previousValue, value); - } - - public float getChaseTarget() { - return chaseTarget; - } - - public void forceNextSync() { - forcedSync = true; - } - - public CompoundTag writeNBT() { - CompoundTag compoundNBT = new CompoundTag(); - compoundNBT.putFloat("Speed", chaseSpeed); - compoundNBT.putFloat("Target", chaseTarget); - compoundNBT.putFloat("Value", value); - if (forcedSync) - compoundNBT.putBoolean("Force", true); - forcedSync = false; - return compoundNBT; - } - - public void readNBT(CompoundTag compoundNBT, boolean clientPacket) { - if (!clientPacket || compoundNBT.contains("Force")) - startWithValue(compoundNBT.getFloat("Value")); - readChaser(compoundNBT); - } - - protected void readChaser(CompoundTag compoundNBT) { - chaseSpeed = compoundNBT.getFloat("Speed"); - chaseTarget = compoundNBT.getFloat("Target"); - } - - @FunctionalInterface - public interface Interpolator { - float interpolate(double progress, double current, double target); - } - - @FunctionalInterface - public interface Chaser { - - Chaser IDLE = (c, s, t) -> (float) c; - Chaser EXP = exp(Double.MAX_VALUE); - Chaser LINEAR = (c, s, t) -> (float) (c + Mth.clamp(t - c, -s, s)); - - static Chaser exp(double maxEffectiveSpeed) { - return (c, s, t) -> (float) (c + Mth.clamp((t - c) * s, -maxEffectiveSpeed, maxEffectiveSpeed)); - } - - float chase(double current, double speed, double target); - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/animation/PhysicalFloat.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/animation/PhysicalFloat.java deleted file mode 100644 index c4eb9d4..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/animation/PhysicalFloat.java +++ /dev/null @@ -1,90 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility.animation; - -import net.minecraft.util.Mth; - -import java.util.ArrayList; - -public class PhysicalFloat { - - float previousValue; - float value; - - float previousSpeed; - float speed; - float limit = Float.NaN; - - float mass; - - private final ArrayList forces = new ArrayList<>(); - - public static PhysicalFloat create() { - return new PhysicalFloat(1); - } - - public static PhysicalFloat create(float mass) { - return new PhysicalFloat(mass); - } - - public PhysicalFloat(float mass) { - this.mass = mass; - } - - public PhysicalFloat startAt(double value) { - previousValue = this.value = (float) value; - return this; - } - - public PhysicalFloat withDrag(double drag) { - return addForce(new Force.Drag((float) drag)); - } - - public PhysicalFloat zeroing(double g) { - return addForce(new Force.Zeroing((float) g)); - } - - public PhysicalFloat withLimit(float limit) { - this.limit = limit; - return this; - } - - public void tick() { - previousSpeed = speed; - previousValue = value; - - float totalImpulse = 0; - for (Force force : forces) - totalImpulse += force.get(mass, value, speed) / mass; - - speed += totalImpulse; - - forces.removeIf(Force::finished); - - if (Float.isFinite(limit)) { - speed = Mth.clamp(speed, -limit, limit); - } - - value += speed; - } - - public PhysicalFloat addForce(Force f) { - forces.add(f); - return this; - } - - public PhysicalFloat bump(double force) { - return addForce(new Force.Impulse((float) force)); - } - - public PhysicalFloat bump(int time, double force) { - return addForce(new Force.OverTime(time, (float) force)); - } - - public float getValue() { - return getValue(1); - } - - public float getValue(float partialTicks) { - return Mth.lerp(partialTicks, previousValue, value); - } - -} 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 e05c7e8..f213b6d 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 @@ -1,9 +1,9 @@ package nl.requios.effortlessbuilding.create.foundation.utility.ghost; +import net.createmod.catnip.theme.Color; 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 java.util.function.Supplier; diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/ghost/GhostBlockRenderer.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/ghost/GhostBlockRenderer.java index 6a80740..ed6c5ac 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/ghost/GhostBlockRenderer.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/ghost/GhostBlockRenderer.java @@ -1,9 +1,10 @@ package nl.requios.effortlessbuilding.create.foundation.utility.ghost; -import com.jozufozu.flywheel.core.model.ModelUtil; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -import nl.requios.effortlessbuilding.create.foundation.render.SuperRenderTypeBuffer; +import net.createmod.catnip.render.SuperRenderTypeBuffer; +import net.createmod.catnip.theme.Color; +import net.createmod.ponder.render.VirtualRenderHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.LightTexture; @@ -19,7 +20,6 @@ import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; import net.minecraft.world.level.block.state.BlockState; import net.neoforged.neoforge.client.model.data.ModelData; -import nl.requios.effortlessbuilding.create.foundation.utility.Color; import javax.annotation.Nullable; import java.util.List; @@ -56,10 +56,10 @@ public abstract class GhostBlockRenderer { ms.pushPose(); ms.translate(pos.getX(), pos.getY(), pos.getZ()); - for (RenderType layer : model.getRenderTypes(state, RandomSource.create(42L), ModelUtil.VIRTUAL_DATA)) { + for (RenderType layer : model.getRenderTypes(state, RandomSource.create(42L), VirtualRenderHelper.VIRTUAL_DATA)) { VertexConsumer vb = buffer.getEarlyBuffer(layer); renderer.renderModel(ms.last(), vb, state, model, 1f, 1f, 1f, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, - ModelUtil.VIRTUAL_DATA, layer); + VirtualRenderHelper.VIRTUAL_DATA, layer); } ms.popPose(); @@ -93,7 +93,7 @@ public abstract class GhostBlockRenderer { renderModel(ms.last(), vb, state, model, color.getRedAsFloat(), color.getGreenAsFloat(), color.getBlueAsFloat(), alpha, LevelRenderer.getLightColor(mc.level, pos), OverlayTexture.NO_OVERLAY, - ModelUtil.VIRTUAL_DATA, layer); + VirtualRenderHelper.VIRTUAL_DATA, layer); ms.popPose(); } 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 96c2893..a966aaa 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,7 @@ package nl.requios.effortlessbuilding.create.foundation.utility.ghost; import com.mojang.blaze3d.vertex.PoseStack; -import nl.requios.effortlessbuilding.create.foundation.render.SuperRenderTypeBuffer; +import net.createmod.catnip.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/AABBOutline.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/outliner/AABBOutline.java deleted file mode 100644 index 5c85797..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/outliner/AABBOutline.java +++ /dev/null @@ -1,100 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility.outliner; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import nl.requios.effortlessbuilding.create.foundation.render.RenderTypes; -import nl.requios.effortlessbuilding.create.foundation.render.SuperRenderTypeBuffer; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.core.Direction; -import net.minecraft.core.Direction.Axis; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.phys.AABB; -import net.minecraft.world.phys.Vec3; - -public class AABBOutline extends Outline { - - protected AABB bb; - - public AABBOutline(AABB bb) { - this.setBounds(bb); - } - - @Override - public void render(PoseStack ms, SuperRenderTypeBuffer buffer, float pt) { - renderBB(ms, buffer, bb); - } - - public void renderBB(PoseStack ms, SuperRenderTypeBuffer buffer, AABB bb) { - Vec3 projectedView = Minecraft.getInstance().gameRenderer.getMainCamera() - .getPosition(); - boolean noCull = bb.contains(projectedView); - bb = bb.inflate(noCull ? -1 / 128d : 1 / 128d); - noCull |= params.disableCull; - - Vec3 xyz = new Vec3(bb.minX, bb.minY, bb.minZ); - Vec3 Xyz = new Vec3(bb.maxX, bb.minY, bb.minZ); - Vec3 xYz = new Vec3(bb.minX, bb.maxY, bb.minZ); - Vec3 XYz = new Vec3(bb.maxX, bb.maxY, bb.minZ); - Vec3 xyZ = new Vec3(bb.minX, bb.minY, bb.maxZ); - Vec3 XyZ = new Vec3(bb.maxX, bb.minY, bb.maxZ); - Vec3 xYZ = new Vec3(bb.minX, bb.maxY, bb.maxZ); - Vec3 XYZ = new Vec3(bb.maxX, bb.maxY, bb.maxZ); - - Vec3 start = xyz; - renderAACuboidLine(ms, buffer, start, Xyz); - renderAACuboidLine(ms, buffer, start, xYz); - renderAACuboidLine(ms, buffer, start, xyZ); - - start = XyZ; - renderAACuboidLine(ms, buffer, start, xyZ); - renderAACuboidLine(ms, buffer, start, XYZ); - renderAACuboidLine(ms, buffer, start, Xyz); - - start = XYz; - renderAACuboidLine(ms, buffer, start, xYz); - renderAACuboidLine(ms, buffer, start, Xyz); - renderAACuboidLine(ms, buffer, start, XYZ); - - start = xYZ; - renderAACuboidLine(ms, buffer, start, XYZ); - renderAACuboidLine(ms, buffer, start, xyZ); - renderAACuboidLine(ms, buffer, start, xYz); - - renderFace(ms, buffer, Direction.NORTH, xYz, XYz, Xyz, xyz, noCull); - renderFace(ms, buffer, Direction.SOUTH, XYZ, xYZ, xyZ, XyZ, noCull); - renderFace(ms, buffer, Direction.EAST, XYz, XYZ, XyZ, Xyz, noCull); - renderFace(ms, buffer, Direction.WEST, xYZ, xYz, xyz, xyZ, noCull); - renderFace(ms, buffer, Direction.UP, xYZ, XYZ, XYz, xYz, noCull); - renderFace(ms, buffer, Direction.DOWN, xyz, Xyz, XyZ, xyZ, noCull); - - } - - protected void renderFace(PoseStack ms, SuperRenderTypeBuffer buffer, Direction direction, Vec3 p1, Vec3 p2, - Vec3 p3, Vec3 p4, boolean noCull) { - if (!params.faceTexture.isPresent()) - return; - - ResourceLocation faceTexture = params.faceTexture.get() - .getLocation(); - float alphaBefore = params.alpha; - params.alpha = - (direction == params.getHighlightedFace() && params.hightlightedFaceTexture.isPresent()) ? 1 : 0.5f; - - RenderType translucentType = RenderTypes.getOutlineTranslucent(faceTexture, !noCull); - VertexConsumer builder = buffer.getLateBuffer(translucentType); - - Axis axis = direction.getAxis(); - Vec3 uDiff = p2.subtract(p1); - Vec3 vDiff = p4.subtract(p1); - float maxU = (float) Math.abs(axis == Axis.X ? uDiff.z : uDiff.x); - float maxV = (float) Math.abs(axis == Axis.Y ? vDiff.z : vDiff.y); - putQuadUV(ms, builder, p1, p2, p3, p4, 0, 0, maxU, maxV, Direction.UP); - params.alpha = alphaBefore; - } - - public void setBounds(AABB bb) { - this.bb = bb; - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/outliner/BlockClusterOutline.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/outliner/BlockClusterOutline.java deleted file mode 100644 index 3ef0a55..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/outliner/BlockClusterOutline.java +++ /dev/null @@ -1,178 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility.outliner; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import nl.requios.effortlessbuilding.create.AllSpecialTextures; -import nl.requios.effortlessbuilding.create.foundation.render.RenderTypes; -import nl.requios.effortlessbuilding.create.foundation.render.SuperRenderTypeBuffer; -import nl.requios.effortlessbuilding.create.foundation.utility.Iterate; -import nl.requios.effortlessbuilding.create.foundation.utility.VecHelper; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Direction.Axis; -import net.minecraft.core.Direction.AxisDirection; -import net.minecraft.world.phys.Vec3; - -import java.util.*; - -public class BlockClusterOutline extends Outline { - - private Cluster cluster; - - public BlockClusterOutline(Iterable selection) { - cluster = new Cluster(); - selection.forEach(cluster::include); - } - - @Override - public void render(PoseStack ms, SuperRenderTypeBuffer buffer, float pt) { - cluster.visibleEdges.forEach(edge -> { - Vec3 start = Vec3.atLowerCornerOf(edge.pos); - Direction direction = Direction.get(AxisDirection.POSITIVE, edge.axis); - renderAACuboidLine(ms, buffer, start, Vec3.atLowerCornerOf(edge.pos.relative(direction))); - }); - - Optional faceTexture = params.faceTexture; - if (!faceTexture.isPresent()) - return; - - RenderType translucentType = RenderTypes.getOutlineTranslucent(faceTexture.get() - .getLocation(), true); - VertexConsumer builder = buffer.getLateBuffer(translucentType); - - cluster.visibleFaces.forEach((face, axisDirection) -> { - Direction direction = Direction.get(axisDirection, face.axis); - BlockPos pos = face.pos; - if (axisDirection == AxisDirection.POSITIVE) - pos = pos.relative(direction.getOpposite()); - renderBlockFace(ms, builder, pos, direction); - }); - } - - static Vec3 xyz = new Vec3(-.5, -.5, -.5); - static Vec3 Xyz = new Vec3(.5, -.5, -.5); - static Vec3 xYz = new Vec3(-.5, .5, -.5); - static Vec3 XYz = new Vec3(.5, .5, -.5); - static Vec3 xyZ = new Vec3(-.5, -.5, .5); - static Vec3 XyZ = new Vec3(.5, -.5, .5); - static Vec3 xYZ = new Vec3(-.5, .5, .5); - static Vec3 XYZ = new Vec3(.5, .5, .5); - - protected void renderBlockFace(PoseStack ms, VertexConsumer builder, BlockPos pos, Direction face) { - Vec3 center = VecHelper.getCenterOf(pos); - Vec3 offset = Vec3.atLowerCornerOf(face.getNormal()); - offset = offset.scale(1 / 128d); - center = center.add(offset); - - ms.pushPose(); - ms.translate(center.x, center.y, center.z); - - switch (face) { - case DOWN: - putQuad(ms, builder, xyz, Xyz, XyZ, xyZ, face); - break; - case EAST: - putQuad(ms, builder, XYz, XYZ, XyZ, Xyz, face); - break; - case NORTH: - putQuad(ms, builder, xYz, XYz, Xyz, xyz, face); - break; - case SOUTH: - putQuad(ms, builder, XYZ, xYZ, xyZ, XyZ, face); - break; - case UP: - putQuad(ms, builder, xYZ, XYZ, XYz, xYz, face); - break; - case WEST: - putQuad(ms, builder, xYZ, xYz, xyz, xyZ, face); - default: - break; - } - - ms.popPose(); - } - - private static class Cluster { - - private Map visibleFaces; - private Set visibleEdges; - - public Cluster() { - visibleEdges = new HashSet<>(); - visibleFaces = new HashMap<>(); - } - - public void include(BlockPos pos) { - - // 6 FACES - for (Axis axis : Iterate.axes) { - Direction direction = Direction.get(AxisDirection.POSITIVE, axis); - for (int offset : Iterate.zeroAndOne) { - MergeEntry entry = new MergeEntry(axis, pos.relative(direction, offset)); - if (visibleFaces.remove(entry) == null) - visibleFaces.put(entry, offset == 0 ? AxisDirection.NEGATIVE : AxisDirection.POSITIVE); - } - } - - // 12 EDGES - for (Axis axis : Iterate.axes) { - for (Axis axis2 : Iterate.axes) { - if (axis == axis2) - continue; - for (Axis axis3 : Iterate.axes) { - if (axis == axis3) - continue; - if (axis2 == axis3) - continue; - - Direction direction = Direction.get(AxisDirection.POSITIVE, axis2); - Direction direction2 = Direction.get(AxisDirection.POSITIVE, axis3); - - for (int offset : Iterate.zeroAndOne) { - BlockPos entryPos = pos.relative(direction, offset); - for (int offset2 : Iterate.zeroAndOne) { - entryPos = entryPos.relative(direction2, offset2); - MergeEntry entry = new MergeEntry(axis, entryPos); - if (!visibleEdges.remove(entry)) - visibleEdges.add(entry); - } - } - } - - break; - } - } - - } - - } - - private static class MergeEntry { - - private Axis axis; - private BlockPos pos; - - public MergeEntry(Axis axis, BlockPos pos) { - this.axis = axis; - this.pos = pos; - } - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (!(o instanceof MergeEntry)) - return false; - - MergeEntry other = (MergeEntry) o; - return this.axis == other.axis && this.pos.equals(other.pos); - } - - @Override - public int hashCode() { - return this.pos.hashCode() * 31 + axis.ordinal(); - } - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/outliner/ChasingAABBOutline.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/outliner/ChasingAABBOutline.java deleted file mode 100644 index d5639ea..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/outliner/ChasingAABBOutline.java +++ /dev/null @@ -1,41 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility.outliner; - -import com.mojang.blaze3d.vertex.PoseStack; -import nl.requios.effortlessbuilding.create.foundation.render.SuperRenderTypeBuffer; -import net.minecraft.util.Mth; -import net.minecraft.world.phys.AABB; - -public class ChasingAABBOutline extends AABBOutline { - - AABB targetBB; - AABB prevBB; - - public ChasingAABBOutline(AABB bb) { - super(bb); - prevBB = bb.inflate(0); - targetBB = bb.inflate(0); - } - - public void target(AABB target) { - targetBB = target; - } - - @Override - public void tick() { - prevBB = bb; - setBounds(interpolateBBs(bb, targetBB, .5f)); - } - - @Override - public void render(PoseStack ms, SuperRenderTypeBuffer buffer, float pt) { - renderBB(ms, buffer, interpolateBBs(prevBB, bb, pt)); - } - - private static AABB interpolateBBs(AABB current, AABB target, float pt) { - return new AABB(Mth.lerp(pt, current.minX, target.minX), - Mth.lerp(pt, current.minY, target.minY), Mth.lerp(pt, current.minZ, target.minZ), - Mth.lerp(pt, current.maxX, target.maxX), Mth.lerp(pt, current.maxY, target.maxY), - Mth.lerp(pt, current.maxZ, target.maxZ)); - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/outliner/LineOutline.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/outliner/LineOutline.java deleted file mode 100644 index 2829a8d..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/outliner/LineOutline.java +++ /dev/null @@ -1,65 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility.outliner; - -import com.mojang.blaze3d.vertex.PoseStack; -import nl.requios.effortlessbuilding.create.foundation.render.SuperRenderTypeBuffer; -import net.minecraft.util.Mth; -import net.minecraft.world.phys.Vec3; - -public class LineOutline extends Outline { - - protected Vec3 start = Vec3.ZERO; - protected Vec3 end = Vec3.ZERO; - - public LineOutline set(Vec3 start, Vec3 end) { - this.start = start; - this.end = end; - return this; - } - - @Override - public void render(PoseStack ms, SuperRenderTypeBuffer buffer, float pt) { - renderCuboidLine(ms, buffer, start, end); - } - - public static class EndChasingLineOutline extends LineOutline { - - float prevProgress = 0; - float progress = 0; - private boolean lockStart; - - public EndChasingLineOutline(boolean lockStart) { - this.lockStart = lockStart; - } - - @Override - public void tick() {} - - public EndChasingLineOutline setProgress(float progress) { - prevProgress = this.progress; - this.progress = progress; - return this; - } - - @Override - public LineOutline set(Vec3 start, Vec3 end) { - if (!end.equals(this.end)) - super.set(start, end); - return this; - } - - @Override - public void render(PoseStack ms, SuperRenderTypeBuffer buffer, float pt) { - float distanceToTarget = Mth.lerp(pt, prevProgress, progress); - if (!lockStart) - distanceToTarget = 1 - distanceToTarget; - Vec3 start = lockStart ? this.end : this.start; - Vec3 end = lockStart ? this.start : this.end; - - start = end.add(this.start.subtract(end) - .scale(distanceToTarget)); - renderCuboidLine(ms, buffer, start, end); - } - - } - -} 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 deleted file mode 100644 index 898699f..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/outliner/Outline.java +++ /dev/null @@ -1,246 +0,0 @@ -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 nl.requios.effortlessbuilding.create.AllSpecialTextures; -import nl.requios.effortlessbuilding.create.foundation.render.RenderTypes; -import nl.requios.effortlessbuilding.create.foundation.render.SuperRenderTypeBuffer; -import nl.requios.effortlessbuilding.create.foundation.utility.AngleHelper; -import nl.requios.effortlessbuilding.create.foundation.utility.Color; -import nl.requios.effortlessbuilding.create.foundation.utility.VecHelper; -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.texture.OverlayTexture; -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; - -public abstract class Outline { - - protected OutlineParams params; - protected Matrix3f transformNormals; // TODO: not used? - - public Outline() { - params = new OutlineParams(); - } - - public abstract void render(PoseStack ms, SuperRenderTypeBuffer buffer, float pt); - - public void tick() {} - - public OutlineParams getParams() { - return params; - } - - public void renderCuboidLine(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 start, Vec3 end) { - Vec3 diff = end.subtract(start); - float hAngle = AngleHelper.deg(Mth.atan2(diff.x, diff.z)); - float hDistance = (float) diff.multiply(1, 0, 1) - .length(); - float vAngle = AngleHelper.deg(Mth.atan2(hDistance, diff.y)) - 90; - ms.pushPose(); - TransformStack.cast(ms) - .translate(start) - .rotateY(hAngle).rotateX(vAngle); - renderAACuboidLine(ms, buffer, Vec3.ZERO, new Vec3(0, 0, diff.length())); - ms.popPose(); - } - - public void renderAACuboidLine(PoseStack ms, SuperRenderTypeBuffer buffer, Vec3 start, Vec3 end) { - float lineWidth = params.getLineWidth(); - if (lineWidth == 0) - return; - - VertexConsumer builder = buffer.getBuffer(RenderTypes.getOutlineSolid()); - - Vec3 diff = end.subtract(start); - if (diff.x + diff.y + diff.z < 0) { - Vec3 temp = start; - start = end; - end = temp; - diff = diff.scale(-1); - } - - Vec3 extension = diff.normalize() - .scale(lineWidth / 2); - Vec3 plane = VecHelper.axisAlingedPlaneOf(diff); - Direction face = Direction.getNearest(diff.x, diff.y, diff.z); - Axis axis = face.getAxis(); - - start = start.subtract(extension); - end = end.add(extension); - plane = plane.scale(lineWidth / 2); - - Vec3 a1 = plane.add(start); - Vec3 b1 = plane.add(end); - plane = VecHelper.rotate(plane, -90, axis); - Vec3 a2 = plane.add(start); - Vec3 b2 = plane.add(end); - plane = VecHelper.rotate(plane, -90, axis); - Vec3 a3 = plane.add(start); - Vec3 b3 = plane.add(end); - plane = VecHelper.rotate(plane, -90, axis); - Vec3 a4 = plane.add(start); - Vec3 b4 = plane.add(end); - - if (params.disableNormals) { - face = Direction.UP; - putQuad(ms, builder, b4, b3, b2, b1, face); - putQuad(ms, builder, a1, a2, a3, a4, face); - putQuad(ms, builder, a1, b1, b2, a2, face); - putQuad(ms, builder, a2, b2, b3, a3, face); - putQuad(ms, builder, a3, b3, b4, a4, face); - putQuad(ms, builder, a4, b4, b1, a1, face); - return; - } - - putQuad(ms, builder, b4, b3, b2, b1, face); - putQuad(ms, builder, a1, a2, a3, a4, face.getOpposite()); - Vec3 vec = a1.subtract(a4); - face = Direction.getNearest(vec.x, vec.y, vec.z); - putQuad(ms, builder, a1, b1, b2, a2, face); - vec = VecHelper.rotate(vec, -90, axis); - face = Direction.getNearest(vec.x, vec.y, vec.z); - putQuad(ms, builder, a2, b2, b3, a3, face); - vec = VecHelper.rotate(vec, -90, axis); - face = Direction.getNearest(vec.x, vec.y, vec.z); - putQuad(ms, builder, a3, b3, b4, a4, face); - vec = VecHelper.rotate(vec, -90, axis); - face = Direction.getNearest(vec.x, vec.y, vec.z); - putQuad(ms, builder, a4, b4, b1, a1, face); - } - - public void putQuad(PoseStack ms, VertexConsumer builder, Vec3 v1, Vec3 v2, Vec3 v3, Vec3 v4, - Direction normal) { - putQuadUV(ms, builder, v1, v2, v3, v4, 0, 0, 1, 1, normal); - } - - public void putQuadUV(PoseStack ms, VertexConsumer builder, Vec3 v1, Vec3 v2, Vec3 v3, Vec3 v4, float minU, - float minV, float maxU, float maxV, Direction normal) { - putVertex(ms, builder, v1, minU, minV, normal); - putVertex(ms, builder, v2, maxU, minV, normal); - putVertex(ms, builder, v3, maxU, maxV, normal); - putVertex(ms, builder, v4, minU, maxV, normal); - } - - protected void putVertex(PoseStack ms, VertexConsumer builder, Vec3 pos, float u, float v, Direction normal) { - putVertex(ms.last(), builder, (float) pos.x, (float) pos.y, (float) pos.z, u, v, normal); - } - - protected void putVertex(PoseStack.Pose pose, VertexConsumer builder, float x, float y, float z, float u, float v, Direction normal) { - Color rgb = params.rgb; - if (transformNormals == null) - transformNormals = pose.normal(); - - int xOffset = 0; - int yOffset = 0; - int zOffset = 0; - - if (normal != null) { - xOffset = normal.getStepX(); - yOffset = normal.getStepY(); - zOffset = normal.getStepZ(); - } - - builder.vertex(pose.pose(), x, y, z) - .color(rgb.getRedAsFloat(), rgb.getGreenAsFloat(), rgb.getBlueAsFloat(), rgb.getAlphaAsFloat() * params.alpha) - .uv(u, v) - .overlayCoords(OverlayTexture.NO_OVERLAY) - .uv2(params.lightMap) - .normal(pose.normal(), xOffset, yOffset, zOffset) - .endVertex(); - - transformNormals = null; - } - - public static class OutlineParams { - protected Optional faceTexture; - protected Optional hightlightedFaceTexture; - protected Direction highlightedFace; - protected boolean fadeLineWidth; - protected boolean disableCull; - protected boolean disableNormals; - protected float alpha; - protected int lightMap; - protected Color rgb; - private float lineWidth; - - public OutlineParams() { - faceTexture = hightlightedFaceTexture = Optional.empty(); - alpha = 1; - lineWidth = 1 / 32f; - fadeLineWidth = true; - rgb = Color.WHITE; - lightMap = LightTexture.FULL_BRIGHT; - } - - // builder - - public OutlineParams colored(int color) { - rgb = new Color(color, false); - return this; - } - - public OutlineParams colored(Color c) { - rgb = c.copy(); - return this; - } - - public OutlineParams lightMap(int light) { - lightMap = light; - return this; - } - - public OutlineParams lineWidth(float width) { - this.lineWidth = width; - return this; - } - - public OutlineParams withFaceTexture(AllSpecialTextures texture) { - this.faceTexture = Optional.ofNullable(texture); - return this; - } - - public OutlineParams clearTextures() { - return this.withFaceTextures(null, null); - } - - public OutlineParams withFaceTextures(AllSpecialTextures texture, AllSpecialTextures highlightTexture) { - this.faceTexture = Optional.ofNullable(texture); - this.hightlightedFaceTexture = Optional.ofNullable(highlightTexture); - return this; - } - - public OutlineParams highlightFace(@Nullable Direction face) { - highlightedFace = face; - return this; - } - - public OutlineParams disableNormals() { - disableNormals = true; - return this; - } - - public OutlineParams disableCull() { - disableCull = true; - return this; - } - - // getter - - public float getLineWidth() { - return fadeLineWidth ? alpha * lineWidth : lineWidth; - } - - public Direction getHighlightedFace() { - return highlightedFace; - } - - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/outliner/Outliner.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/outliner/Outliner.java deleted file mode 100644 index 5588623..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/outliner/Outliner.java +++ /dev/null @@ -1,185 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility.outliner; - -import com.mojang.blaze3d.vertex.PoseStack; -import nl.requios.effortlessbuilding.create.foundation.render.SuperRenderTypeBuffer; -import nl.requios.effortlessbuilding.create.foundation.utility.outliner.LineOutline.EndChasingLineOutline; -import nl.requios.effortlessbuilding.create.foundation.utility.outliner.Outline.OutlineParams; -import net.minecraft.core.BlockPos; -import net.minecraft.util.Mth; -import net.minecraft.world.phys.AABB; -import net.minecraft.world.phys.Vec3; - -import java.util.*; - -public class Outliner { - - private final Map outlines = Collections.synchronizedMap(new HashMap<>()); - private final Map outlinesView = Collections.unmodifiableMap(outlines); - - // Facade - - public OutlineParams showLine(Object slot, Vec3 start, Vec3 end) { - if (!outlines.containsKey(slot)) { - LineOutline outline = new LineOutline(); - outlines.put(slot, new OutlineEntry(outline)); - } - OutlineEntry entry = outlines.get(slot); - entry.ticksTillRemoval = 1; - ((LineOutline) entry.outline).set(start, end); - return entry.outline.getParams(); - } - - public OutlineParams endChasingLine(Object slot, Vec3 start, Vec3 end, float chasingProgress, boolean lockStart) { - if (!outlines.containsKey(slot)) { - EndChasingLineOutline outline = new EndChasingLineOutline(lockStart); - outlines.put(slot, new OutlineEntry(outline)); - } - OutlineEntry entry = outlines.get(slot); - entry.ticksTillRemoval = 1; - ((EndChasingLineOutline) entry.outline).setProgress(chasingProgress) - .set(start, end); - return entry.outline.getParams(); - } - - public OutlineParams showAABB(Object slot, AABB bb, int ttl) { - createAABBOutlineIfMissing(slot, bb); - ChasingAABBOutline outline = getAndRefreshAABB(slot, ttl); - outline.prevBB = outline.targetBB = outline.bb = bb; - return outline.getParams(); - } - - public OutlineParams showAABB(Object slot, AABB bb) { - createAABBOutlineIfMissing(slot, bb); - ChasingAABBOutline outline = getAndRefreshAABB(slot); - outline.prevBB = outline.targetBB = outline.bb = bb; - return outline.getParams(); - } - - public OutlineParams chaseAABB(Object slot, AABB bb) { - createAABBOutlineIfMissing(slot, bb); - ChasingAABBOutline outline = getAndRefreshAABB(slot); - outline.targetBB = bb; - return outline.getParams(); - } - - public OutlineParams showCluster(Object slot, Iterable selection) { - BlockClusterOutline outline = new BlockClusterOutline(selection); - OutlineEntry entry = new OutlineEntry(outline); - outlines.put(slot, entry); - return entry.getOutline() - .getParams(); - } - - public void keep(Object slot) { - if (outlines.containsKey(slot)) - outlines.get(slot).ticksTillRemoval = 1; - } - - //ADDED - public void keep(Object slot, int ticks) { - if (outlines.containsKey(slot)) - outlines.get(slot).ticksTillRemoval = ticks; - } - - public void remove(Object slot) { - outlines.remove(slot); - } - - public Optional edit(Object slot) { - keep(slot); - if (outlines.containsKey(slot)) - return Optional.of(outlines.get(slot) - .getOutline() - .getParams()); - return Optional.empty(); - } - - public Map getOutlines() { - return outlinesView; - } - - // Utility - - private void createAABBOutlineIfMissing(Object slot, AABB bb) { - if (!outlines.containsKey(slot) || !(outlines.get(slot).outline instanceof AABBOutline)) { - ChasingAABBOutline outline = new ChasingAABBOutline(bb); - outlines.put(slot, new OutlineEntry(outline)); - } - } - - private ChasingAABBOutline getAndRefreshAABB(Object slot) { - OutlineEntry entry = outlines.get(slot); - entry.ticksTillRemoval = 1; - return (ChasingAABBOutline) entry.getOutline(); - } - - private ChasingAABBOutline getAndRefreshAABB(Object slot, int ttl) { - OutlineEntry entry = outlines.get(slot); - entry.ticksTillRemoval = ttl; - return (ChasingAABBOutline) entry.getOutline(); - } - - // Maintenance - - public void tickOutlines() { - Iterator iterator = outlines.values() - .iterator(); - while (iterator.hasNext()) { - OutlineEntry entry = iterator.next(); - entry.tick(); - if (!entry.isAlive()) - iterator.remove(); - } - } - - public void renderOutlines(PoseStack ms, SuperRenderTypeBuffer buffer, float pt) { - outlines.forEach((key, entry) -> { - Outline outline = entry.getOutline(); - OutlineParams params = outline.getParams(); - params.alpha = 1; - if (entry.isFading()) { - int prevTicks = entry.ticksTillRemoval + 1; - float fadeticks = OutlineEntry.fadeTicks; - float lastAlpha = prevTicks >= 0 ? 1 : 1 + (prevTicks / fadeticks); - float currentAlpha = 1 + (entry.ticksTillRemoval / fadeticks); - float alpha = Mth.lerp(pt, lastAlpha, currentAlpha); - - params.alpha = alpha * alpha * alpha; - if (params.alpha < 1 / 8f) - return; - } - outline.render(ms, buffer, pt); - }); - } - - public static class OutlineEntry { - - static final int fadeTicks = 4; - private Outline outline; - private int ticksTillRemoval; - - public OutlineEntry(Outline outline) { - this.outline = outline; - ticksTillRemoval = 1; - } - - public void tick() { - ticksTillRemoval--; - outline.tick(); - } - - public boolean isAlive() { - return ticksTillRemoval >= -fadeTicks; - } - - public boolean isFading() { - return ticksTillRemoval < 0; - } - - public Outline getOutline() { - return outline; - } - - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/DummyStatusListener.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/DummyStatusListener.java deleted file mode 100644 index ad9856e..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/DummyStatusListener.java +++ /dev/null @@ -1,23 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility.worldWrappers; - -import net.minecraft.server.level.progress.ChunkProgressListener; -import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.chunk.ChunkStatus; - -import javax.annotation.Nullable; - -public class DummyStatusListener implements ChunkProgressListener { - - @Override - public void updateSpawnPos(ChunkPos pCenter) {} - - @Override - public void onStatusChange(ChunkPos pChunkPosition, @Nullable ChunkStatus pNewStatus) {} - - @Override - public void start() {} - - @Override - public void stop() {} - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/PlacementSimulationServerWorld.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/PlacementSimulationServerWorld.java deleted file mode 100644 index e596b9d..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/PlacementSimulationServerWorld.java +++ /dev/null @@ -1,62 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility.worldWrappers; - -import net.minecraft.core.BlockPos; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.FluidState; - -import java.util.HashMap; -import java.util.function.Predicate; - -public class PlacementSimulationServerWorld extends WrappedServerWorld { - public HashMap blocksAdded; - - public PlacementSimulationServerWorld(ServerLevel wrapped) { - super(wrapped); - blocksAdded = new HashMap<>(); - } - - public void clear() { - blocksAdded.clear(); - } - - @Override - public boolean setBlock(BlockPos pos, BlockState newState, int flags) { - blocksAdded.put(pos.immutable(), newState); - return true; - } - - @Override - public boolean setBlockAndUpdate(BlockPos pos, BlockState state) { - return setBlock(pos, state, 0); - } - - @Override - public boolean isStateAtPosition(BlockPos pos, Predicate condition) { - return condition.test(getBlockState(pos)); - } - - @Override - public boolean isLoaded(BlockPos pos) { - return true; - } - - @Override - public boolean isAreaLoaded(BlockPos center, int range) { - return true; - } - - @Override - public BlockState getBlockState(BlockPos pos) { - if (blocksAdded.containsKey(pos)) - return blocksAdded.get(pos); - return Blocks.AIR.defaultBlockState(); - } - - @Override - public FluidState getFluidState(BlockPos pos) { - return getBlockState(pos).getFluidState(); - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/RayTraceWorld.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/RayTraceWorld.java deleted file mode 100644 index 74b907b..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/RayTraceWorld.java +++ /dev/null @@ -1,47 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility.worldWrappers; - -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.FluidState; - -import java.util.function.BiFunction; - -public class RayTraceWorld implements BlockGetter { - - private final LevelAccessor template; - private final BiFunction stateGetter; - - public RayTraceWorld(LevelAccessor template, BiFunction stateGetter) { - this.template = template; - this.stateGetter = stateGetter; - } - - @Override - public BlockEntity getBlockEntity(BlockPos pos) { - return template.getBlockEntity(pos); - } - - @Override - public BlockState getBlockState(BlockPos pos) { - return stateGetter.apply(pos, template.getBlockState(pos)); - } - - @Override - public FluidState getFluidState(BlockPos pos) { - return template.getFluidState(pos); - } - - @Override - public int getHeight() { - return template.getHeight(); - } - - @Override - public int getMinBuildHeight() { - return template.getMinBuildHeight(); - } - -} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/WrappedClientWorld.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/WrappedClientWorld.java deleted file mode 100644 index 0f65faa..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/WrappedClientWorld.java +++ /dev/null @@ -1,140 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility.worldWrappers; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.core.BlockPos; -import net.minecraft.core.particles.ParticleOptions; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.sounds.SoundSource; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.ai.targeting.TargetingConditions; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.ColorResolver; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LightLayer; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.FluidState; -import net.neoforged.api.distmarker.Dist; -import net.neoforged.api.distmarker.OnlyIn; - -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.List; - -@OnlyIn(Dist.CLIENT) -@SuppressWarnings("deprecation") -@ParametersAreNonnullByDefault -public class WrappedClientWorld extends ClientLevel { - private static final Minecraft mc = Minecraft.getInstance(); - protected Level world; - - private WrappedClientWorld(Level world) { - super(mc.getConnection(), mc.level.getLevelData(), world.dimension(), world.dimensionTypeRegistration(), - mc.getConnection().serverChunkRadius, mc.level.getServerSimulationDistance(), world.getProfilerSupplier(), - mc.levelRenderer, world.isDebug(), world.getBiomeManager().biomeZoomSeed); - this.world = world; - } - - public static WrappedClientWorld of(Level world) { - return new WrappedClientWorld(world); - } - - @Override - public boolean hasChunkAt(BlockPos pos) { - return world.hasChunkAt(pos); - } - - @Override - public boolean isLoaded(BlockPos pos) { - return world.isLoaded(pos); - } - - @Override - public BlockState getBlockState(BlockPos pos) { - return world.getBlockState(pos); - } - - // FIXME: blockstate#getCollisionShape with WrappedClientWorld gives unreliable - // data (maybe) - - @Override - public int getBrightness(LightLayer type, BlockPos pos) { - return world.getBrightness(type, pos); - } - - @Override - public int getLightEmission(BlockPos pos) { - return world.getLightEmission(pos); - } - - @Override - public FluidState getFluidState(BlockPos pos) { - return world.getFluidState(pos); - } - - @Nullable - @Override - public T getNearestEntity(List p_217361_1_, TargetingConditions p_217361_2_, - @Nullable LivingEntity p_217361_3_, double p_217361_4_, double p_217361_6_, double p_217361_8_) { - return world.getNearestEntity(p_217361_1_, p_217361_2_, p_217361_3_, p_217361_4_, p_217361_6_, p_217361_8_); - } - - @Override - public int getBlockTint(BlockPos p_225525_1_, ColorResolver p_225525_2_) { - return world.getBlockTint(p_225525_1_, p_225525_2_); - } - - // FIXME: Emissive Lighting might not light stuff properly - - @Override - public void addParticle(ParticleOptions p_195594_1_, double p_195594_2_, double p_195594_4_, double p_195594_6_, - double p_195594_8_, double p_195594_10_, double p_195594_12_) { - world.addParticle(p_195594_1_, p_195594_2_, p_195594_4_, p_195594_6_, p_195594_8_, p_195594_10_, p_195594_12_); - } - - @Override - public void addParticle(ParticleOptions p_195590_1_, boolean p_195590_2_, double p_195590_3_, double p_195590_5_, - double p_195590_7_, double p_195590_9_, double p_195590_11_, double p_195590_13_) { - world.addParticle(p_195590_1_, p_195590_2_, p_195590_3_, p_195590_5_, p_195590_7_, p_195590_9_, p_195590_11_, - p_195590_13_); - } - - @Override - public void addAlwaysVisibleParticle(ParticleOptions p_195589_1_, double p_195589_2_, double p_195589_4_, - double p_195589_6_, double p_195589_8_, double p_195589_10_, double p_195589_12_) { - world.addAlwaysVisibleParticle(p_195589_1_, p_195589_2_, p_195589_4_, p_195589_6_, p_195589_8_, p_195589_10_, - p_195589_12_); - } - - @Override - public void addAlwaysVisibleParticle(ParticleOptions p_217404_1_, boolean p_217404_2_, double p_217404_3_, - double p_217404_5_, double p_217404_7_, double p_217404_9_, double p_217404_11_, double p_217404_13_) { - world.addAlwaysVisibleParticle(p_217404_1_, p_217404_2_, p_217404_3_, p_217404_5_, p_217404_7_, p_217404_9_, - p_217404_11_, p_217404_13_); - } - - @Override - public void playLocalSound(double p_184134_1_, double p_184134_3_, double p_184134_5_, SoundEvent p_184134_7_, - SoundSource p_184134_8_, float p_184134_9_, float p_184134_10_, boolean p_184134_11_) { - world.playLocalSound(p_184134_1_, p_184134_3_, p_184134_5_, p_184134_7_, p_184134_8_, p_184134_9_, p_184134_10_, - p_184134_11_); - } - - @Override - public void playSound(@Nullable Player p_184148_1_, double p_184148_2_, double p_184148_4_, double p_184148_6_, - SoundEvent p_184148_8_, SoundSource p_184148_9_, float p_184148_10_, float p_184148_11_) { - world.playSound(p_184148_1_, p_184148_2_, p_184148_4_, p_184148_6_, p_184148_8_, p_184148_9_, p_184148_10_, - p_184148_11_); - } - - @Nullable - @Override - public BlockEntity getBlockEntity(BlockPos p_175625_1_) { - return world.getBlockEntity(p_175625_1_); - } - - public Level getWrappedWorld() { - return world; - } -} 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 deleted file mode 100644 index f1675b8..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/WrappedServerWorld.java +++ /dev/null @@ -1,120 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility.worldWrappers; - -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.Util; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Holder; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; -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.item.crafting.RecipeManager; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.dimension.LevelStem; -import net.minecraft.world.level.material.Fluid; -import net.minecraft.world.level.saveddata.maps.MapItemSavedData; -import net.minecraft.world.level.storage.ServerLevelData; -import net.minecraft.world.ticks.LevelTicks; - -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.Collections; -import java.util.List; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -public class WrappedServerWorld extends ServerLevel { - - protected ServerLevel world; - - 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, world.getRandomSequences()); - this.world = world; - } - - @Override - public float getSunAngle(float p_72826_1_) { - return 0; - } - - @Override - public int getMaxLocalRawBrightness(BlockPos pos) { - return 15; - } - - @Override - public void sendBlockUpdated(BlockPos pos, BlockState oldState, BlockState newState, int flags) { - world.sendBlockUpdated(pos, oldState, newState, flags); - } - - @Override - public LevelTicks getBlockTicks() { - return super.getBlockTicks(); - } - - @Override - public LevelTicks getFluidTicks() { - return super.getFluidTicks(); - } - - @Override - public void levelEvent(Player player, int type, BlockPos pos, int data) {} - - @Override - public List players() { - return Collections.emptyList(); - } - - @Override - public void playSound(Player player, double x, double y, double z, SoundEvent soundIn, SoundSource category, - float volume, float pitch) {} - - @Override - public void playSound(Player p_217384_1_, Entity p_217384_2_, SoundEvent p_217384_3_, SoundSource p_217384_4_, - float p_217384_5_, float p_217384_6_) {} - - @Override - public Entity getEntity(int id) { - return null; - } - - @Override - public MapItemSavedData getMapData(String mapName) { - return null; - } - - @Override - public boolean addFreshEntity(Entity entityIn) { - entityIn.level = world; - return world.addFreshEntity(entityIn); - } - - @Override - public void setMapData(String mapId, MapItemSavedData mapDataIn) {} - - @Override - public int getFreeMapId() { - return 0; - } - - @Override - public void destroyBlockProgress(int breakerId, BlockPos pos, int progress) {} - - @Override - public RecipeManager getRecipeManager() { - return world.getRecipeManager(); - } - - @Override - public Holder getUncachedNoiseBiome(int p_225604_1_, int p_225604_2_, int p_225604_3_) { - return world.getUncachedNoiseBiome(p_225604_1_, p_225604_2_, p_225604_3_); - } - -} 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 deleted file mode 100644 index 18a1840..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/WrappedWorld.java +++ /dev/null @@ -1,267 +0,0 @@ -package nl.requios.effortlessbuilding.create.foundation.utility.worldWrappers; - -import net.minecraft.core.*; -import net.minecraft.sounds.SoundEvent; -import net.minecraft.sounds.SoundSource; -import net.minecraft.world.TickRateManager; -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; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.chunk.ChunkSource; -import net.minecraft.world.level.entity.LevelEntityGetter; -import net.minecraft.world.level.gameevent.GameEvent; -import net.minecraft.world.level.gameevent.GameEvent.Context; -import net.minecraft.world.level.lighting.LevelLightEngine; -import net.minecraft.world.level.material.Fluid; -import net.minecraft.world.level.saveddata.maps.MapItemSavedData; -import net.minecraft.world.level.storage.WritableLevelData; -import net.minecraft.world.phys.Vec3; -import net.minecraft.world.scores.Scoreboard; -import net.minecraft.world.ticks.LevelTickAccess; - -import javax.annotation.Nullable; -import java.util.Collections; -import java.util.List; -import java.util.function.Predicate; - -public class WrappedWorld extends Level { - - protected Level world; - protected ChunkSource chunkSource; - - protected LevelEntityGetter entityGetter = new DummyLevelEntityGetter<>(); - - public WrappedWorld(Level world) { - super((WritableLevelData) world.getLevelData(), world.dimension(), world.registryAccess(), world.dimensionTypeRegistration(), - world::getProfiler, world.isClientSide, world.isDebug(), 0, 0); - this.world = world; - } - - public void setChunkSource(ChunkSource source) { - this.chunkSource = source; - } - - public Level getLevel() { - return world; - } - - @Override - public LevelLightEngine getLightEngine() { - return world.getLightEngine(); - } - - @Override - public BlockState getBlockState(@Nullable BlockPos pos) { - return world.getBlockState(pos); - } - - @Override - public boolean isStateAtPosition(BlockPos p_217375_1_, Predicate p_217375_2_) { - return world.isStateAtPosition(p_217375_1_, p_217375_2_); - } - - @Override - @Nullable - public BlockEntity getBlockEntity(BlockPos pos) { - return world.getBlockEntity(pos); - } - - @Override - public boolean setBlock(BlockPos pos, BlockState newState, int flags) { - return world.setBlock(pos, newState, flags); - } - - @Override - public int getMaxLocalRawBrightness(BlockPos pos) { - return 15; - } - - @Override - public void sendBlockUpdated(BlockPos pos, BlockState oldState, BlockState newState, int flags) { - world.sendBlockUpdated(pos, oldState, newState, flags); - } - - @Override - public LevelTickAccess getBlockTicks() { - return world.getBlockTicks(); - } - - @Override - public LevelTickAccess getFluidTicks() { - return world.getFluidTicks(); - } - - @Override - public ChunkSource getChunkSource() { - return chunkSource != null ? chunkSource : world.getChunkSource(); - } - - @Override - public void levelEvent(@Nullable Player player, int type, BlockPos pos, int data) {} - - @Override - public List players() { - return Collections.emptyList(); - } - - @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_) {} - - @Override - 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) {} - - @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_) {} - - @Override - public Entity getEntity(int id) { - return null; - } - - @Override - public TickRateManager tickRateManager() { - return null; - } - - @Override - public MapItemSavedData getMapData(String mapName) { - return null; - } - - @Override - public boolean addFreshEntity(Entity entityIn) { - entityIn.level = world; - return world.addFreshEntity(entityIn); - } - - @Override - public void setMapData(String pMapId, MapItemSavedData pData) {} - - @Override - public int getFreeMapId() { - return world.getFreeMapId(); - } - - @Override - public void destroyBlockProgress(int breakerId, BlockPos pos, int progress) {} - - @Override - public Scoreboard getScoreboard() { - return world.getScoreboard(); - } - - @Override - public RecipeManager getRecipeManager() { - return world.getRecipeManager(); - } - - @Override - public Holder getUncachedNoiseBiome(int p_225604_1_, int p_225604_2_, int p_225604_3_) { - return world.getUncachedNoiseBiome(p_225604_1_, p_225604_2_, p_225604_3_); - } - - @Override - public RegistryAccess registryAccess() { - return world.registryAccess(); - } - - @Override - public float getShade(Direction p_230487_1_, boolean p_230487_2_) { - return world.getShade(p_230487_1_, p_230487_2_); - } - - @Override - public void updateNeighbourForOutputSignal(BlockPos p_175666_1_, Block p_175666_2_) {} - - @Override - public void gameEvent(Entity pEntity, GameEvent pEvent, BlockPos pPos) {} - - @Override - public void gameEvent(GameEvent p_220404_, Vec3 p_220405_, Context p_220406_) {} - - @Override - public String gatherChunkSourceStats() { - return world.gatherChunkSourceStats(); - } - - @Override - protected LevelEntityGetter getEntities() { - return entityGetter; - } - - // Intentionally copied from LevelHeightAccessor. Workaround for issues caused - // when other mods (such as Lithium) - // override the vanilla implementations in ways which cause WrappedWorlds to - // return incorrect, default height info. - // WrappedWorld subclasses should implement their own getMinBuildHeight and - // getHeight overrides where they deviate - // from the defaults for their dimension. - - @Override - public int getMaxBuildHeight() { - return this.getMinBuildHeight() + this.getHeight(); - } - - @Override - public int getSectionsCount() { - return this.getMaxSection() - this.getMinSection(); - } - - @Override - public int getMinSection() { - return SectionPos.blockToSectionCoord(this.getMinBuildHeight()); - } - - @Override - public int getMaxSection() { - return SectionPos.blockToSectionCoord(this.getMaxBuildHeight() - 1) + 1; - } - - @Override - public boolean isOutsideBuildHeight(BlockPos pos) { - return this.isOutsideBuildHeight(pos.getY()); - } - - @Override - public boolean isOutsideBuildHeight(int y) { - return y < this.getMinBuildHeight() || y >= this.getMaxBuildHeight(); - } - - @Override - public int getSectionIndex(int y) { - return this.getSectionIndexFromSectionY(SectionPos.blockToSectionCoord(y)); - } - - @Override - public int getSectionIndexFromSectionY(int sectionY) { - return sectionY - this.getMinSection(); - } - - @Override - 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/create/foundation/utility/worldWrappers/package-info.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/package-info.java deleted file mode 100644 index bb6a251..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -@ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -package nl.requios.effortlessbuilding.create.foundation.utility.worldWrappers; - -import net.minecraft.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/virtualWorld/VirtualChunk.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/virtualWorld/VirtualChunk.java new file mode 100644 index 0000000..02fcf08 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/virtualWorld/VirtualChunk.java @@ -0,0 +1,241 @@ +package nl.requios.effortlessbuilding.create.foundation.virtualWorld; + +import it.unimi.dsi.fastutil.longs.LongSet; +import it.unimi.dsi.fastutil.longs.LongSets; +import it.unimi.dsi.fastutil.shorts.ShortList; +import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.SectionPos; +import net.minecraft.core.registries.Registries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.LevelChunkSection; +import net.minecraft.world.level.chunk.UpgradeData; +import net.minecraft.world.level.chunk.status.ChunkStatus; +import net.minecraft.world.level.levelgen.Heightmap; +import net.minecraft.world.level.levelgen.structure.Structure; +import net.minecraft.world.level.levelgen.structure.StructureStart; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.ticks.BlackholeTickAccess; +import net.minecraft.world.ticks.TickContainerAccess; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.BiPredicate; +import java.util.function.Predicate; + +public class VirtualChunk extends ChunkAccess { + public final VirtualRenderWorld world; + + private final VirtualChunkSection[] sections; + + private boolean needsLight; + + public VirtualChunk(VirtualRenderWorld world, int x, int z) { + super(new ChunkPos(x, z), UpgradeData.EMPTY, world, world.registryAccess() + .registryOrThrow(Registries.BIOME), 0L, null, null); + + this.world = world; + + int sectionCount = world.getSectionsCount(); + this.sections = new VirtualChunkSection[sectionCount]; + + for (int i = 0; i < sectionCount; i++) { + sections[i] = new VirtualChunkSection(this, i << 4); + } + + this.needsLight = true; + +// Mods.STARLIGHT.executeIfInstalled(() -> () -> { +// ((ExtendedChunk) this).setBlockNibbles(StarLightEngine.getFilledEmptyLight(this)); +// ((ExtendedChunk) this).setSkyNibbles(StarLightEngine.getFilledEmptyLight(this)); +// }); + } + + @Override + @Nullable + public BlockState setBlockState(BlockPos pos, BlockState state, boolean isMoving) { + return null; + } + + @Override + public void setBlockEntity(BlockEntity blockEntity) { + } + + @Override + public void addEntity(Entity entity) { + } + + @Override + public Set getBlockEntitiesPos() { + return Collections.emptySet(); + } + + @Override + public LevelChunkSection[] getSections() { + return sections; + } + + @Override + public Collection> getHeightmaps() { + return Collections.emptySet(); + } + + @Override + public void setHeightmap(Heightmap.Types type, long[] data) { + } + + @Override + public Heightmap getOrCreateHeightmapUnprimed(Heightmap.Types type) { + return null; + } + + @Override + public int getHeight(Heightmap.Types type, int x, int z) { + return 0; + } + + @Override + @Nullable + public StructureStart getStartForStructure(Structure structure) { + return null; + } + + @Override + public void setStartForStructure(Structure structure, StructureStart structureStart) { + } + + @Override + public Map getAllStarts() { + return Collections.emptyMap(); + } + + @Override + public void setAllStarts(Map structureStarts) { + } + + @Override + public LongSet getReferencesForStructure(Structure pStructure) { + return LongSets.emptySet(); + } + + @Override + public void addReferenceForStructure(Structure structure, long reference) { + } + + @Override + public Map getAllReferences() { + return Collections.emptyMap(); + } + + @Override + public void setAllReferences(Map structureReferencesMap) { + } + + @Override + public void setUnsaved(boolean unsaved) { + } + + @Override + public boolean isUnsaved() { + return false; + } + + @Override + public ChunkStatus getPersistedStatus() { + return ChunkStatus.LIGHT; + } + + @Override + public void removeBlockEntity(BlockPos pos) { + } + + @Override + public ShortList[] getPostProcessing() { + return new ShortList[0]; + } + + @Override + @Nullable + public CompoundTag getBlockEntityNbt(BlockPos pos) { + return null; + } + + @Override + @Nullable + public CompoundTag getBlockEntityNbtForSaving(BlockPos pos, HolderLookup.Provider registries) { + return null; + } + + @Override + public void findBlocks(@NotNull Predicate roughFilter, @NotNull BiPredicate fineFilter, @NotNull BiConsumer output) { + world.blockStates.forEach((pos, state) -> { + if (SectionPos.blockToSectionCoord(pos.getX()) == chunkPos.x && SectionPos.blockToSectionCoord(pos.getZ()) == chunkPos.z) { + if (roughFilter.test(state) && fineFilter.test(state, pos)) { + output.accept(pos, state); + } + } + }); + } + + @Override + public TickContainerAccess getBlockTicks() { + return BlackholeTickAccess.emptyContainer(); + } + + @Override + public TickContainerAccess getFluidTicks() { + return BlackholeTickAccess.emptyContainer(); + } + + @Override + public TicksToSave getTicksForSerialization() { + throw new UnsupportedOperationException(); + } + + @Override + public long getInhabitedTime() { + return 0; + } + + @Override + public void setInhabitedTime(long amount) { + } + + @Override + public boolean isLightCorrect() { + return needsLight; + } + + @Override + public void setLightCorrect(boolean lightCorrect) { + this.needsLight = lightCorrect; + } + + @Override + @Nullable + public BlockEntity getBlockEntity(BlockPos pos) { + return world.getBlockEntity(pos); + } + + @Override + public BlockState getBlockState(BlockPos pos) { + return world.getBlockState(pos); + } + + @Override + public FluidState getFluidState(BlockPos pos) { + return world.getFluidState(pos); + } +} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/virtualWorld/VirtualChunkSection.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/virtualWorld/VirtualChunkSection.java new file mode 100644 index 0000000..b611094 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/virtualWorld/VirtualChunkSection.java @@ -0,0 +1,42 @@ +package nl.requios.effortlessbuilding.create.foundation.virtualWorld; + +import net.minecraft.core.registries.Registries; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.LevelChunkSection; +import net.minecraft.world.level.material.FluidState; + +public class VirtualChunkSection extends LevelChunkSection { + public final VirtualChunk owner; + + public final int xStart; + public final int yStart; + public final int zStart; + + public VirtualChunkSection(VirtualChunk owner, int yBase) { + super(owner.world.registryAccess() + .registryOrThrow(Registries.BIOME)); + this.owner = owner; + this.xStart = owner.getPos() + .getMinBlockX(); + this.yStart = yBase; + this.zStart = owner.getPos() + .getMinBlockZ(); + } + + @Override + public BlockState getBlockState(int x, int y, int z) { + // ChunkSection#getBlockState expects local chunk coordinates, so we add to get + // back into world coords. + return owner.world.getBlockState(x + xStart, y + yStart, z + zStart); + } + + @Override + public FluidState getFluidState(int x, int y, int z) { + return getBlockState(x, y, z).getFluidState(); + } + + @Override + public BlockState setBlockState(int x, int y, int z, BlockState state, boolean useLocks) { + throw new UnsupportedOperationException("Chunk sections cannot be mutated in a fake world."); + } +} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/virtualWorld/VirtualChunkSource.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/virtualWorld/VirtualChunkSource.java new file mode 100644 index 0000000..e201954 --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/virtualWorld/VirtualChunkSource.java @@ -0,0 +1,64 @@ +package nl.requios.effortlessbuilding.create.foundation.virtualWorld; + +import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.ChunkSource; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.chunk.status.ChunkStatus; +import net.minecraft.world.level.lighting.LevelLightEngine; +import org.jetbrains.annotations.Nullable; + +import java.util.function.BooleanSupplier; + +public class VirtualChunkSource extends ChunkSource { + private final VirtualRenderWorld world; + private final Long2ObjectMap chunks = new Long2ObjectOpenHashMap<>(); + + public VirtualChunkSource(VirtualRenderWorld world) { + this.world = world; + } + + @Override + public Level getLevel() { + return world; + } + + public ChunkAccess getChunk(int x, int z) { + long pos = ChunkPos.asLong(x, z); + return chunks.computeIfAbsent(pos, $ -> new VirtualChunk(world, x, z)); + } + + @Override + @Nullable + public LevelChunk getChunk(int x, int z, boolean load) { + return null; + } + + @Override + @Nullable + public ChunkAccess getChunk(int x, int z, ChunkStatus status, boolean load) { + return getChunk(x, z); + } + + @Override + public void tick(BooleanSupplier hasTimeLeft, boolean tickChunks) { + } + + @Override + public String gatherStats() { + return "VirtualChunkSource"; + } + + @Override + public int getLoadedChunksCount() { + return 0; + } + + @Override + public LevelLightEngine getLightEngine() { + return world.getLightEngine(); + } +} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/DummyLevelEntityGetter.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/virtualWorld/VirtualLevelEntityGetter.java similarity index 50% rename from src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/DummyLevelEntityGetter.java rename to src/main/java/nl/requios/effortlessbuilding/create/foundation/virtualWorld/VirtualLevelEntityGetter.java index 1b53bc6..3443344 100644 --- a/src/main/java/nl/requios/effortlessbuilding/create/foundation/utility/worldWrappers/DummyLevelEntityGetter.java +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/virtualWorld/VirtualLevelEntityGetter.java @@ -1,4 +1,4 @@ -package nl.requios.effortlessbuilding.create.foundation.utility.worldWrappers; +package nl.requios.effortlessbuilding.create.foundation.virtualWorld; import net.minecraft.util.AbortableIterationConsumer; import net.minecraft.world.level.entity.EntityAccess; @@ -10,15 +10,14 @@ import java.util.Collections; import java.util.UUID; import java.util.function.Consumer; -public class DummyLevelEntityGetter implements LevelEntityGetter { - +public class VirtualLevelEntityGetter implements LevelEntityGetter { @Override - public T get(int p_156931_) { + public T get(int id) { return null; } @Override - public T get(UUID pUuid) { + public T get(UUID uuid) { return null; } @@ -28,15 +27,14 @@ public class DummyLevelEntityGetter implements LevelEnti } @Override - public void get(EntityTypeTest p_156935_, AbortableIterationConsumer p_156936_) { + public void get(EntityTypeTest test, AbortableIterationConsumer consumer) { } @Override - public void get(AABB p_156937_, Consumer p_156938_) { + public void get(AABB boundingBox, Consumer consumer) { } @Override - public void get(EntityTypeTest p_156932_, AABB p_156933_, AbortableIterationConsumer p_156934_) { + public void get(EntityTypeTest test, AABB bounds, AbortableIterationConsumer consumer) { } - } diff --git a/src/main/java/nl/requios/effortlessbuilding/create/foundation/virtualWorld/VirtualRenderWorld.java b/src/main/java/nl/requios/effortlessbuilding/create/foundation/virtualWorld/VirtualRenderWorld.java new file mode 100644 index 0000000..229b1ab --- /dev/null +++ b/src/main/java/nl/requios/effortlessbuilding/create/foundation/virtualWorld/VirtualRenderWorld.java @@ -0,0 +1,492 @@ +package nl.requios.effortlessbuilding.create.foundation.virtualWorld; + +import dev.engine_room.flywheel.api.visualization.VisualizationLevel; +import it.unimi.dsi.fastutil.objects.Object2ShortMap; +import it.unimi.dsi.fastutil.objects.Object2ShortOpenHashMap; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Holder; +import net.minecraft.core.SectionPos; +import net.minecraft.core.Vec3i; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.TickRateManager; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.flag.FeatureFlagSet; +import net.minecraft.world.item.alchemy.PotionBrewing; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.BiomeManager; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraft.world.level.chunk.ChunkSource; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraft.world.level.chunk.status.ChunkStatus; +import net.minecraft.world.level.entity.LevelEntityGetter; +import net.minecraft.world.level.gameevent.GameEvent; +import net.minecraft.world.level.gameevent.GameEvent.Context; +import net.minecraft.world.level.lighting.LevelLightEngine; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.saveddata.maps.MapId; +import net.minecraft.world.level.saveddata.maps.MapItemSavedData; +import net.minecraft.world.level.storage.WritableLevelData; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.scores.Scoreboard; +import net.minecraft.world.ticks.LevelTickAccess; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class VirtualRenderWorld extends Level implements VisualizationLevel { + protected final Level level; + protected final int minBuildHeight; + protected final int height; + protected final Vec3i biomeOffset; + + protected final VirtualChunkSource chunkSource; + protected final LevelLightEngine lightEngine; + + protected final Map blockStates = new HashMap<>(); + protected final Map blockEntities = new HashMap<>(); + protected final Object2ShortMap nonEmptyBlockCounts = new Object2ShortOpenHashMap<>(); + + protected final LevelEntityGetter entityGetter = new VirtualLevelEntityGetter<>(); + + protected final BlockPos.MutableBlockPos scratchPos = new BlockPos.MutableBlockPos(); + + public VirtualRenderWorld(Level level) { + this(level, Vec3i.ZERO); + } + + public VirtualRenderWorld(Level level, Vec3i biomeOffset) { + this(level, level.getMinBuildHeight(), level.getHeight(), biomeOffset); + } + + public VirtualRenderWorld(Level level, int minBuildHeight, int height, Vec3i biomeOffset) { + super((WritableLevelData) level.getLevelData(), level.dimension(), level.registryAccess(), level.dimensionTypeRegistration(), level.getProfilerSupplier(), + true, false, 0, 0); + this.level = level; + this.minBuildHeight = nextMultipleOf16(minBuildHeight); + this.height = nextMultipleOf16(height); + this.biomeOffset = biomeOffset; + + this.chunkSource = new VirtualChunkSource(this); + this.lightEngine = new LevelLightEngine(chunkSource, true, false); + } + + /** + * We need to ensure that height and minBuildHeight are multiples of 16. + * Adapted from: https://math.stackexchange.com/questions/291468 + */ + public static int nextMultipleOf16(int a) { + if (a < 0) { + return -(((Math.abs(a) - 1) | 15) + 1); + } else { + return ((a - 1) | 15) + 1; + } + } + + public void clear() { + blockStates.clear(); + blockEntities.clear(); + + nonEmptyBlockCounts.forEach((sectionPos, nonEmptyBlockCount) -> { + if (nonEmptyBlockCount > 0) { + lightEngine.updateSectionStatus(sectionPos, true); + } + }); + + nonEmptyBlockCounts.clear(); + + runLightEngine(); + } + + public void setBlockEntities(Collection blockEntities) { + this.blockEntities.clear(); + blockEntities.forEach(this::setBlockEntity); + } + + /** + * Run this after you're done using setBlock(). + */ + public void runLightEngine() { + Set chunkPosSet = new ObjectOpenHashSet<>(); + nonEmptyBlockCounts.object2ShortEntrySet().forEach(entry -> { + if (entry.getShortValue() > 0) { + chunkPosSet.add(entry.getKey().chunk()); + } + }); + for (ChunkPos chunkPos : chunkPosSet) { + lightEngine.propagateLightSources(chunkPos); + } + + lightEngine.runLightUpdates(); + } + + // MEANINGFUL OVERRIDES + + @Override + public LevelChunk getChunk(int x, int z) { + throw new UnsupportedOperationException(); + } + + public ChunkAccess actuallyGetChunk(int x, int z) { + return getChunk(x, z, ChunkStatus.FULL); + } + + @Override + public ChunkAccess getChunk(BlockPos pos) { + return actuallyGetChunk(SectionPos.blockToSectionCoord(pos.getX()), SectionPos.blockToSectionCoord(pos.getZ())); + } + + @Override + public boolean setBlock(BlockPos pos, BlockState newState, int flags, int recursionLeft) { + if (isOutsideBuildHeight(pos)) { + return false; + } + + pos = pos.immutable(); + + BlockState oldState = getBlockState(pos); + if (oldState == newState) { + return false; + } + + blockStates.put(pos, newState); + + SectionPos sectionPos = SectionPos.of(pos); + short nonEmptyBlockCount = nonEmptyBlockCounts.getShort(sectionPos); + boolean prevEmpty = nonEmptyBlockCount == 0; + if (!oldState.isAir()) { + --nonEmptyBlockCount; + } + if (!newState.isAir()) { + ++nonEmptyBlockCount; + } + nonEmptyBlockCounts.put(sectionPos, nonEmptyBlockCount); + boolean nowEmpty = nonEmptyBlockCount == 0; + + if (prevEmpty != nowEmpty) { + lightEngine.updateSectionStatus(sectionPos, nowEmpty); + } + + lightEngine.checkBlock(pos); + + return true; + } + + @Override + public LevelLightEngine getLightEngine() { + return lightEngine; + } + + @Override + public BlockState getBlockState(BlockPos pos) { + if (isOutsideBuildHeight(pos)) { + return Blocks.VOID_AIR.defaultBlockState(); + } + BlockState state = blockStates.get(pos); + if (state != null) { + return state; + } + return Blocks.AIR.defaultBlockState(); + } + + public BlockState getBlockState(int x, int y, int z) { + return getBlockState(scratchPos.set(x, y, z)); + } + + @Override + public FluidState getFluidState(BlockPos pos) { + if (isOutsideBuildHeight(pos)) { + return Fluids.EMPTY.defaultFluidState(); + } + return getBlockState(pos).getFluidState(); + } + + @Override + @Nullable + public BlockEntity getBlockEntity(BlockPos pos) { + if (!isOutsideBuildHeight(pos)) { + return blockEntities.get(pos); + } + return null; + } + + @Override + public void setBlockEntity(BlockEntity blockEntity) { + BlockPos pos = blockEntity.getBlockPos(); + if (!isOutsideBuildHeight(pos)) { + blockEntities.put(pos, blockEntity); + } + } + + @Override + public void removeBlockEntity(BlockPos pos) { + if (!isOutsideBuildHeight(pos)) { + blockEntities.remove(pos); + } + } + + @Override + protected LevelEntityGetter getEntities() { + return entityGetter; + } + + @Override + public ChunkSource getChunkSource() { + return chunkSource; + } + + @Override + public int getMinBuildHeight() { + return minBuildHeight; + } + + @Override + public int getHeight() { + return height; + } + + // BIOME OFFSET + + @Override + public Holder getBiome(BlockPos pos) { + return super.getBiome(pos.offset(biomeOffset)); + } + + @Override + public Holder getNoiseBiome(int x, int y, int z) { + // Control flow should never reach this method, + // so we add biomeOffset in case some other mod calls this directly. + return level.getNoiseBiome(x + biomeOffset.getX(), y + biomeOffset.getY(), z + biomeOffset.getZ()); + } + + @Override + public Holder getUncachedNoiseBiome(int x, int y, int z) { + // Control flow should never reach this method, + // so we add biomeOffset in case some other mod calls this directly. + return level.getUncachedNoiseBiome(x + biomeOffset.getX(), y + biomeOffset.getY(), z + biomeOffset.getZ()); + } + + // RENDERING CONSTANTS + + @Override + public int getMaxLocalRawBrightness(BlockPos pos) { + return 15; + } + + @Override + public float getShade(Direction direction, boolean shade) { + return 1f; + } + + // THIN WRAPPERS + + @Override + public Scoreboard getScoreboard() { + return level.getScoreboard(); + } + + @Override + public RecipeManager getRecipeManager() { + return level.getRecipeManager(); + } + + @Override + public BiomeManager getBiomeManager() { + return level.getBiomeManager(); + } + + @Override + public LevelTickAccess getBlockTicks() { + return level.getBlockTicks(); + } + + @Override + public LevelTickAccess getFluidTicks() { + return level.getFluidTicks(); + } + + @Override + public FeatureFlagSet enabledFeatures() { + return level.enabledFeatures(); + } + + @Override + public PotionBrewing potionBrewing() { + return level.potionBrewing(); + } + + @Override + public void setDayTimeFraction(float v) { + level.setDayTimeFraction(v); + } + + @Override + public void setDayTimePerTick(float v) { + level.setDayTimePerTick(v); + } + + @Override + public float getDayTimeFraction() { + return level.getDayTimeFraction(); + } + + @Override + public float getDayTimePerTick() { + return level.getDayTimePerTick(); + } + + // ADDITIONAL OVERRRIDES + + @Override + public void updateNeighbourForOutputSignal(BlockPos pos, Block block) { + } + + @Override + public boolean isLoaded(BlockPos pos) { + return true; + } + + @Override + public boolean isAreaLoaded(BlockPos center, int range) { + return true; + } + + // UNIMPORTANT IMPLEMENTATIONS + + @Override + public void sendBlockUpdated(BlockPos pos, BlockState oldState, BlockState newState, int flags) { + } + + @Override + public void playSeededSound(Player player, double x, double y, double z, Holder soundEvent, + SoundSource soundSource, float volume, float pitch, long seed) { + } + + @Override + public void playSeededSound(Player player, Entity entity, Holder soundEvent, SoundSource soundSource, + float volume, float pitch, long seed) { + } + + @Override + public String gatherChunkSourceStats() { + return ""; + } + + @Override + @Nullable + public Entity getEntity(int id) { + return null; + } + + @Override + public TickRateManager tickRateManager() { + return level.tickRateManager(); + } + + @Override + @Nullable + public MapItemSavedData getMapData(MapId mapId) { + return null; + } + + @Override + public void setMapData(MapId mapId, MapItemSavedData mapItemSavedData) {} + + @NotNull + @Override + public MapId getFreeMapId() { + return new MapId(0); + } + + @Override + public void destroyBlockProgress(int breakerId, BlockPos pos, int progress) { + } + + @Override + public void levelEvent(@Nullable Player player, int type, BlockPos pos, int data) { + } + + @Override + public void gameEvent(Holder gameEvent, Vec3 pos, Context context) { + } + + @Override + public List players() { + return Collections.emptyList(); + } + + // Override Starlight's ExtendedWorld interface methods: + + public LevelChunk getChunkAtImmediately(final int chunkX, final int chunkZ) { + return chunkSource.getChunk(chunkX, chunkZ, false); + } + + public ChunkAccess getAnyChunkImmediately(final int chunkX, final int chunkZ) { + return chunkSource.getChunk(chunkX, chunkZ); + } + + // Intentionally copied from LevelHeightAccessor. Lithium overrides these methods so we need to, too. + + @Override + public int getMaxBuildHeight() { + return this.getMinBuildHeight() + this.getHeight(); + } + + @Override + public int getSectionsCount() { + return this.getMaxSection() - this.getMinSection(); + } + + @Override + public int getMinSection() { + return SectionPos.blockToSectionCoord(this.getMinBuildHeight()); + } + + @Override + public int getMaxSection() { + return SectionPos.blockToSectionCoord(this.getMaxBuildHeight() - 1) + 1; + } + + @Override + public boolean isOutsideBuildHeight(BlockPos pos) { + return this.isOutsideBuildHeight(pos.getY()); + } + + @Override + public boolean isOutsideBuildHeight(int y) { + return y < this.getMinBuildHeight() || y >= this.getMaxBuildHeight(); + } + + @Override + public int getSectionIndex(int y) { + return this.getSectionIndexFromSectionY(SectionPos.blockToSectionCoord(y)); + } + + @Override + public int getSectionIndexFromSectionY(int sectionY) { + return sectionY - this.getMinSection(); + } + + @Override + public int getSectionYFromSectionIndex(int sectionIndex) { + return sectionIndex + this.getMinSection(); + } +} diff --git a/src/main/java/nl/requios/effortlessbuilding/create/license.txt b/src/main/java/nl/requios/effortlessbuilding/create/license.txt deleted file mode 100644 index 86204cf..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/create/license.txt +++ /dev/null @@ -1,12 +0,0 @@ -All files within this folder fall under the MIT license. - -The MIT License Copyright (c) Permission is hereby granted, free of charge, to any person -obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without -restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the -following conditions: The above copyright notice and this permission notice shall be included in all copies or -substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/DiamondRandomizerBagScreen.java b/src/main/java/nl/requios/effortlessbuilding/gui/DiamondRandomizerBagScreen.java index d253544..536f1b0 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/DiamondRandomizerBagScreen.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/DiamondRandomizerBagScreen.java @@ -16,7 +16,7 @@ import javax.annotation.ParametersAreNonnullByDefault; public class DiamondRandomizerBagScreen extends AbstractContainerScreen { private Inventory inventory; - private static final ResourceLocation guiTextures = new ResourceLocation(EffortlessBuilding.MODID, "textures/gui/container/diamondrandomizerbag.png"); + private static final ResourceLocation guiTextures = EffortlessBuilding.asResource("textures/gui/container/diamondrandomizerbag.png"); public DiamondRandomizerBagScreen(DiamondRandomizerBagContainer randomizerBagContainer, Inventory playerInventory, Component title) { super(randomizerBagContainer, playerInventory, title); diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/GoldenRandomizerBagScreen.java b/src/main/java/nl/requios/effortlessbuilding/gui/GoldenRandomizerBagScreen.java index 1f11372..cf8e9ec 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/GoldenRandomizerBagScreen.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/GoldenRandomizerBagScreen.java @@ -16,7 +16,7 @@ import javax.annotation.ParametersAreNonnullByDefault; public class GoldenRandomizerBagScreen extends AbstractContainerScreen { private Inventory inventory; - private static final ResourceLocation guiTextures = new ResourceLocation(EffortlessBuilding.MODID, "textures/gui/container/goldenrandomizerbag.png"); + private static final ResourceLocation guiTextures = EffortlessBuilding.asResource("textures/gui/container/goldenrandomizerbag.png"); public GoldenRandomizerBagScreen(GoldenRandomizerBagContainer randomizerBagContainer, Inventory playerInventory, Component title) { super(randomizerBagContainer, playerInventory, title); diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/RandomizerBagScreen.java b/src/main/java/nl/requios/effortlessbuilding/gui/RandomizerBagScreen.java index 9362c51..d413df7 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/RandomizerBagScreen.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/RandomizerBagScreen.java @@ -16,7 +16,7 @@ import javax.annotation.ParametersAreNonnullByDefault; public class RandomizerBagScreen extends AbstractContainerScreen { private Inventory inventory; - private static final ResourceLocation guiTextures = new ResourceLocation(EffortlessBuilding.MODID, "textures/gui/container/randomizerbag.png"); + private static final ResourceLocation guiTextures = EffortlessBuilding.asResource("textures/gui/container/randomizerbag.png"); public RandomizerBagScreen(RandomizerBagContainer randomizerBagContainer, Inventory playerInventory, Component title) { super(randomizerBagContainer, playerInventory, title); diff --git a/src/main/java/nl/requios/effortlessbuilding/gui/buildmode/PlayerSettingsGui.java b/src/main/java/nl/requios/effortlessbuilding/gui/buildmode/PlayerSettingsGui.java index 1d3f6f1..2932994 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/buildmode/PlayerSettingsGui.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/buildmode/PlayerSettingsGui.java @@ -3,12 +3,12 @@ package nl.requios.effortlessbuilding.gui.buildmode; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.resources.sounds.SimpleSoundInstance; -import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.ObjectSelectionList; -import net.minecraft.sounds.SoundEvents; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundEvents; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.neoforge.client.gui.widget.ExtendedButton; @@ -196,10 +196,10 @@ public class PlayerSettingsGui extends Screen { // RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); // float f = 32.0F; // bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); -// bufferbuilder.vertex(this.x0, this.y1, 0.0D).color(20, 20, 20, 180).endVertex(); -// bufferbuilder.vertex(this.x1, this.y1, 0.0D).color(20, 20, 20, 180).endVertex(); -// bufferbuilder.vertex(this.x1, this.y0, 0.0D).color(20, 20, 20, 180).endVertex(); -// bufferbuilder.vertex(this.x0, this.y0, 0.0D).color(20, 20, 20, 180).endVertex(); +// bufferbuilder.addVertex(this.x0, this.y1, 0.0D).setColor(20, 20, 20, 180); +// bufferbuilder.addVertex(this.x1, this.y1, 0.0D).setColor(20, 20, 20, 180); +// bufferbuilder.addVertex(this.x1, this.y0, 0.0D).setColor(20, 20, 20, 180); +// bufferbuilder.addVertex(this.x0, this.y0, 0.0D).setColor(20, 20, 20, 180); // tessellator.end(); // int k = this.getRowLeft(); // int l = this.y0 + 4 - (int) this.getScrollAmount(); @@ -217,16 +217,16 @@ public class PlayerSettingsGui extends Screen { // RenderSystem.setShader(GameRenderer::getPositionColorShader); //// int i1 = 4; //// bufferbuilder.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR); -//// bufferbuilder.pos((double)this.x0, (double)(this.y0 + 4), 0.0D).tex(0.0F, 1.0F).color(0, 0, 0, 0).endVertex(); -//// bufferbuilder.pos((double)this.x1, (double)(this.y0 + 4), 0.0D).tex(1.0F, 1.0F).color(0, 0, 0, 0).endVertex(); -//// bufferbuilder.pos((double)this.x1, (double)this.y0, 0.0D).tex(1.0F, 0.0F).color(0, 0, 0, 255).endVertex(); -//// bufferbuilder.pos((double)this.x0, (double)this.y0, 0.0D).tex(0.0F, 0.0F).color(0, 0, 0, 255).endVertex(); +//// bufferbuilder.pos((double)this.x0, (double)(this.y0 + 4), 0.0D).tex(0.0F, 1.0F).setColor(0, 0, 0, 0); +//// bufferbuilder.pos((double)this.x1, (double)(this.y0 + 4), 0.0D).tex(1.0F, 1.0F).setColor(0, 0, 0, 0); +//// bufferbuilder.pos((double)this.x1, (double)this.y0, 0.0D).tex(1.0F, 0.0F).setColor(0, 0, 0, 255); +//// bufferbuilder.pos((double)this.x0, (double)this.y0, 0.0D).tex(0.0F, 0.0F).setColor(0, 0, 0, 255); //// tessellator.draw(); //// bufferbuilder.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR); -//// bufferbuilder.pos((double)this.x0, (double)this.y1, 0.0D).tex(0.0F, 1.0F).color(0, 0, 0, 255).endVertex(); -//// bufferbuilder.pos((double)this.x1, (double)this.y1, 0.0D).tex(1.0F, 1.0F).color(0, 0, 0, 255).endVertex(); -//// bufferbuilder.pos((double)this.x1, (double)(this.y1 - 4), 0.0D).tex(1.0F, 0.0F).color(0, 0, 0, 0).endVertex(); -//// bufferbuilder.pos((double)this.x0, (double)(this.y1 - 4), 0.0D).tex(0.0F, 0.0F).color(0, 0, 0, 0).endVertex(); +//// bufferbuilder.pos((double)this.x0, (double)this.y1, 0.0D).tex(0.0F, 1.0F).setColor(0, 0, 0, 255); +//// bufferbuilder.pos((double)this.x1, (double)this.y1, 0.0D).tex(1.0F, 1.0F).setColor(0, 0, 0, 255); +//// bufferbuilder.pos((double)this.x1, (double)(this.y1 - 4), 0.0D).tex(1.0F, 0.0F).setColor(0, 0, 0, 0); +//// bufferbuilder.pos((double)this.x0, (double)(this.y1 - 4), 0.0D).tex(0.0F, 0.0F).setColor(0, 0, 0, 0); //// tessellator.draw(); // // //SCROLLBAR @@ -240,22 +240,22 @@ public class PlayerSettingsGui extends Screen { // } // // bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); -// bufferbuilder.vertex(i, this.y1, 0.0D).uv(0.0F, 1.0F).color(0, 0, 0, 255).endVertex(); -// bufferbuilder.vertex(j, this.y1, 0.0D).uv(1.0F, 1.0F).color(0, 0, 0, 255).endVertex(); -// bufferbuilder.vertex(j, this.y0, 0.0D).uv(1.0F, 0.0F).color(0, 0, 0, 255).endVertex(); -// bufferbuilder.vertex(i, this.y0, 0.0D).uv(0.0F, 0.0F).color(0, 0, 0, 255).endVertex(); +// bufferbuilder.addVertex(i, this.y1, 0.0D).uv(0.0F, 1.0F).setColor(0, 0, 0, 255); +// bufferbuilder.addVertex(j, this.y1, 0.0D).uv(1.0F, 1.0F).setColor(0, 0, 0, 255); +// bufferbuilder.addVertex(j, this.y0, 0.0D).uv(1.0F, 0.0F).setColor(0, 0, 0, 255); +// bufferbuilder.addVertex(i, this.y0, 0.0D).uv(0.0F, 0.0F).setColor(0, 0, 0, 255); // tessellator.end(); // bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); -// bufferbuilder.vertex(i, l1 + k1, 0.0D).uv(0.0F, 1.0F).color(128, 128, 128, 255).endVertex(); -// bufferbuilder.vertex(j, l1 + k1, 0.0D).uv(1.0F, 1.0F).color(128, 128, 128, 255).endVertex(); -// bufferbuilder.vertex(j, l1, 0.0D).uv(1.0F, 0.0F).color(128, 128, 128, 255).endVertex(); -// bufferbuilder.vertex(i, l1, 0.0D).uv(0.0F, 0.0F).color(128, 128, 128, 255).endVertex(); +// bufferbuilder.addVertex(i, l1 + k1, 0.0D).uv(0.0F, 1.0F).setColor(128, 128, 128, 255); +// bufferbuilder.addVertex(j, l1 + k1, 0.0D).uv(1.0F, 1.0F).setColor(128, 128, 128, 255); +// bufferbuilder.addVertex(j, l1, 0.0D).uv(1.0F, 0.0F).setColor(128, 128, 128, 255); +// bufferbuilder.addVertex(i, l1, 0.0D).uv(0.0F, 0.0F).setColor(128, 128, 128, 255); // tessellator.end(); // bufferbuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX_COLOR); -// bufferbuilder.vertex(i, l1 + k1 - 1, 0.0D).uv(0.0F, 1.0F).color(192, 192, 192, 255).endVertex(); -// bufferbuilder.vertex(j - 1, l1 + k1 - 1, 0.0D).uv(1.0F, 1.0F).color(192, 192, 192, 255).endVertex(); -// bufferbuilder.vertex(j - 1, l1, 0.0D).uv(1.0F, 0.0F).color(192, 192, 192, 255).endVertex(); -// bufferbuilder.vertex(i, l1, 0.0D).uv(0.0F, 0.0F).color(192, 192, 192, 255).endVertex(); +// bufferbuilder.addVertex(i, l1 + k1 - 1, 0.0D).uv(0.0F, 1.0F).setColor(192, 192, 192, 255); +// bufferbuilder.addVertex(j - 1, l1 + k1 - 1, 0.0D).uv(1.0F, 1.0F).setColor(192, 192, 192, 255); +// bufferbuilder.addVertex(j - 1, l1, 0.0D).uv(1.0F, 0.0F).setColor(192, 192, 192, 255); +// bufferbuilder.addVertex(i, l1, 0.0D).uv(0.0F, 0.0F).setColor(192, 192, 192, 255); // tessellator.end(); // } // 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 3050038..a284354 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/buildmode/RadialMenu.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/buildmode/RadialMenu.java @@ -2,10 +2,12 @@ package nl.requios.effortlessbuilding.gui.buildmode; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferUploader; 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.createmod.catnip.theme.Color; import net.minecraft.ChatFormatting; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; @@ -22,14 +24,13 @@ import net.minecraft.sounds.SoundSource; import net.minecraft.util.RandomSource; import nl.requios.effortlessbuilding.ClientEvents; import nl.requios.effortlessbuilding.EffortlessBuildingClient; +import nl.requios.effortlessbuilding.attachment.AttachmentHandler; 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.attachment.AttachmentHandler; 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; @@ -108,7 +109,6 @@ public class RadialMenu extends Screen { PoseStack ms = guiGraphics.pose(); ms.pushPose(); - ms.translate(0, 0, 200); visibility += fadeSpeed * partialTicks; if (visibility > 1f) visibility = 1f; @@ -121,10 +121,8 @@ public class RadialMenu extends Screen { 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(); - - buffer.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + final Tesselator tesselator = Tesselator.getInstance(); + final BufferBuilder buffer = tesselator.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); final double middleX = width / 2.0; final double middleY = height / 2.0; @@ -191,9 +189,11 @@ public class RadialMenu extends Screen { //Draw action backgrounds drawSideButtonBackgrounds(buffer, middleX, middleY, mouseXCenter, mouseYCenter, buttons); - tessellator.end(); + BufferUploader.drawWithShader(buffer.buildOrThrow()); RenderSystem.disableBlend(); + ms.translate(0, 0, 200); + drawIcons(guiGraphics, middleX, middleY, modes, buttons); drawTexts(guiGraphics, currentBuildMode, middleX, middleY, modes, buttons, options, mouseXX, mouseYY); @@ -244,10 +244,11 @@ public class RadialMenu extends Screen { switchTo = menuRegion.mode; } - 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(); + + buffer.addVertex((float)(middleX + x1m1), (float)(middleY + y1m1), 20f).setColor(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()); + buffer.addVertex((float)(middleX + x2m1), (float)(middleY + y2m1), 20f).setColor(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()); + buffer.addVertex((float)(middleX + x2m2), (float)(middleY + y2m2), 20f).setColor(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()); + buffer.addVertex((float)(middleX + x1m2), (float)(middleY + y1m2), 20f).setColor(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()); //Category line color = menuRegion.mode.category.color; @@ -258,10 +259,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, 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(); + buffer.addVertex((float)(middleX + x1m1), (float)(middleY + y1m1), 200).setColor(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()); + buffer.addVertex((float)(middleX + x2m1), (float)(middleY + y2m1), 200).setColor(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()); + buffer.addVertex((float)(middleX + x2m3), (float)(middleY + y2m3), 200).setColor(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()); + buffer.addVertex((float)(middleX + x1m3), (float)(middleY + y1m3), 200).setColor(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()); } } } @@ -291,10 +292,10 @@ public class RadialMenu extends Screen { doAction = btn.action; } - 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(); + buffer.addVertex((float)(middleX + btn.x1), (float)(middleY + btn.y1), 200).setColor(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()); + buffer.addVertex((float)(middleX + btn.x1), (float)(middleY + btn.y2), 200).setColor(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()); + buffer.addVertex((float)(middleX + btn.x2), (float)(middleY + btn.y2), 200).setColor(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()); + buffer.addVertex((float)(middleX + btn.x2), (float)(middleY + btn.y1), 200).setColor(color.getRed(), color.getGreen(), color.getBlue(), color.getAlpha()); } } 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 484e3b3..ea94cd3 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/ArrayEntry.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/ArrayEntry.java @@ -7,9 +7,9 @@ import net.minecraft.network.chat.Component; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import nl.requios.effortlessbuilding.AllGuiTextures; +import nl.requios.effortlessbuilding.attachment.AttachmentHandler; import nl.requios.effortlessbuilding.buildmodifier.Array; import nl.requios.effortlessbuilding.buildmodifier.BaseModifier; -import nl.requios.effortlessbuilding.attachment.AttachmentHandler; import nl.requios.effortlessbuilding.create.foundation.gui.widget.ScrollInput; import nl.requios.effortlessbuilding.gui.elements.LabeledScrollInput; import nl.requios.effortlessbuilding.utilities.MathHelper; 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 b7dd1a8..00d1aa2 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/MirrorEntry.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/MirrorEntry.java @@ -8,9 +8,9 @@ import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import nl.requios.effortlessbuilding.AllGuiTextures; import nl.requios.effortlessbuilding.AllIcons; +import nl.requios.effortlessbuilding.attachment.AttachmentHandler; import nl.requios.effortlessbuilding.buildmodifier.BaseModifier; import nl.requios.effortlessbuilding.buildmodifier.Mirror; -import nl.requios.effortlessbuilding.attachment.AttachmentHandler; import nl.requios.effortlessbuilding.create.foundation.gui.widget.IconButton; import nl.requios.effortlessbuilding.create.foundation.gui.widget.ScrollInput; import nl.requios.effortlessbuilding.create.foundation.utility.Components; 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 1d9e3cd..c4dc045 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/ModifiersScreen.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/ModifiersScreen.java @@ -1,5 +1,6 @@ package nl.requios.effortlessbuilding.gui.buildmodifier; +import net.createmod.catnip.gui.widget.BoxWidget; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; @@ -13,7 +14,6 @@ import nl.requios.effortlessbuilding.buildmodifier.Mirror; import nl.requios.effortlessbuilding.buildmodifier.RadialMirror; 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 javax.annotation.Nonnull; 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 daebae0..968928a 100644 --- a/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/ModifiersScreenList.java +++ b/src/main/java/nl/requios/effortlessbuilding/gui/buildmodifier/ModifiersScreenList.java @@ -1,17 +1,15 @@ package nl.requios.effortlessbuilding.gui.buildmodifier; -import com.mojang.blaze3d.platform.Window; -import com.mojang.blaze3d.systems.RenderSystem; +import net.createmod.catnip.gui.TickableGuiEventListener; +import net.createmod.catnip.gui.UIRenderHelper; +import net.createmod.catnip.theme.Color; 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; -import nl.requios.effortlessbuilding.create.foundation.gui.TickableGuiEventListener; -import nl.requios.effortlessbuilding.create.foundation.gui.UIRenderHelper; import nl.requios.effortlessbuilding.create.foundation.gui.widget.AbstractSimiWidget; -import nl.requios.effortlessbuilding.create.foundation.utility.Color; import nl.requios.effortlessbuilding.create.foundation.utility.Components; import java.util.ArrayList; @@ -23,7 +21,7 @@ public class ModifiersScreenList extends ObjectSelectionList tooltip, TooltipFlag flag) { + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip, TooltipFlag tooltipFlag) { tooltip.add(Component.literal(ChatFormatting.YELLOW + "*Experimental* Only works in singleplayer")); tooltip.add(Component.literal(ChatFormatting.BLUE + "Rightclick" + ChatFormatting.GRAY + " to place a random block")); tooltip.add(Component.literal(ChatFormatting.BLUE + "Sneak + rightclick" + ChatFormatting.GRAY + " to open inventory")); diff --git a/src/main/java/nl/requios/effortlessbuilding/item/PowerLevelItem.java b/src/main/java/nl/requios/effortlessbuilding/item/PowerLevelItem.java index 1f984ac..a3b6dff 100644 --- a/src/main/java/nl/requios/effortlessbuilding/item/PowerLevelItem.java +++ b/src/main/java/nl/requios/effortlessbuilding/item/PowerLevelItem.java @@ -17,7 +17,6 @@ import nl.requios.effortlessbuilding.attachment.AttachmentHandler; import nl.requios.effortlessbuilding.attachment.PowerLevel; import nl.requios.effortlessbuilding.create.foundation.item.TooltipHelper; -import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; import java.util.List; @@ -51,7 +50,7 @@ public class PowerLevelItem extends Item { if (!world.isClientSide) { EffortlessBuilding.log(player, "Already reached maximum power level!"); - world.playSound((Player) null, player.blockPosition(), SoundEvents.ARMOR_EQUIP_LEATHER, SoundSource.PLAYERS, 1f, 1f); + world.playSound((Player) null, player.blockPosition(), SoundEvents.ARMOR_EQUIP_LEATHER.value(), SoundSource.PLAYERS, 1f, 1f); } return InteractionResultHolder.fail(player.getItemInHand(hand)); @@ -62,7 +61,7 @@ public class PowerLevelItem extends Item { } @Override - public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag isAdvanced) { + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip, TooltipFlag tooltipFlag) { tooltip.addAll(TooltipHelper.cutTextComponent(Component.translatable(getDescriptionId() + ".desc"), ChatFormatting.GRAY, ChatFormatting.GRAY)); tooltip.addAll(TooltipHelper.cutTextComponent(Component.translatable("key.effortlessbuilding.upgrade_power_level"), ChatFormatting.BLUE, ChatFormatting.BLUE)); } diff --git a/src/main/java/nl/requios/effortlessbuilding/item/ReachUpgrade1Item.java b/src/main/java/nl/requios/effortlessbuilding/item/ReachUpgrade1Item.java index e8afcca..7008bf7 100644 --- a/src/main/java/nl/requios/effortlessbuilding/item/ReachUpgrade1Item.java +++ b/src/main/java/nl/requios/effortlessbuilding/item/ReachUpgrade1Item.java @@ -17,7 +17,6 @@ import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.attachment.AttachmentHandler; import nl.requios.effortlessbuilding.attachment.PowerLevel; -import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; import java.util.List; @@ -52,7 +51,7 @@ public class ReachUpgrade1Item extends Item { if (!world.isClientSide && hand == InteractionHand.MAIN_HAND) { EffortlessBuilding.log(player, "Already used this upgrade! Current power level is " + powerLevel.getPowerLevel() + "."); - world.playSound((Player) null, player.blockPosition(), SoundEvents.ARMOR_EQUIP_LEATHER, SoundSource.PLAYERS, 1f, 1f); + world.playSound((Player) null, player.blockPosition(), SoundEvents.ARMOR_EQUIP_LEATHER.value(), SoundSource.PLAYERS, 1f, 1f); } } } @@ -61,7 +60,7 @@ public class ReachUpgrade1Item extends Item { } @Override - public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag flag) { + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip, TooltipFlag tooltipFlag) { tooltip.add(Component.literal(ChatFormatting.GRAY + "Consume to increase reach to " + ChatFormatting.BLUE + CommonConfig.reach.level1.get())); } diff --git a/src/main/java/nl/requios/effortlessbuilding/item/ReachUpgrade2Item.java b/src/main/java/nl/requios/effortlessbuilding/item/ReachUpgrade2Item.java index 219852a..bd3fa96 100644 --- a/src/main/java/nl/requios/effortlessbuilding/item/ReachUpgrade2Item.java +++ b/src/main/java/nl/requios/effortlessbuilding/item/ReachUpgrade2Item.java @@ -17,7 +17,6 @@ import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.attachment.AttachmentHandler; import nl.requios.effortlessbuilding.attachment.PowerLevel; -import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; import java.util.List; @@ -52,13 +51,13 @@ public class ReachUpgrade2Item extends Item { if (!world.isClientSide) { EffortlessBuilding.log(player, "Use Reach Upgrade 1 first."); - world.playSound((Player) null, player.blockPosition(), SoundEvents.ARMOR_EQUIP_LEATHER, SoundSource.PLAYERS, 1f, 1f); + world.playSound((Player) null, player.blockPosition(), SoundEvents.ARMOR_EQUIP_LEATHER.value(), SoundSource.PLAYERS, 1f, 1f); } } else if (currentLevel > 1) { if (!world.isClientSide) { EffortlessBuilding.log(player, "Already used this upgrade! Current power level is " + powerLevel.getPowerLevel() + "."); - world.playSound((Player) null, player.blockPosition(), SoundEvents.ARMOR_EQUIP_LEATHER, SoundSource.PLAYERS, 1f, 1f); + world.playSound((Player) null, player.blockPosition(), SoundEvents.ARMOR_EQUIP_LEATHER.value(), SoundSource.PLAYERS, 1f, 1f); } } } @@ -67,7 +66,7 @@ public class ReachUpgrade2Item extends Item { } @Override - public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag flag) { + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip, TooltipFlag tooltipFlag) { tooltip.add(Component.literal(ChatFormatting.GRAY + "Consume to increase reach to " + ChatFormatting.BLUE + CommonConfig.reach.level2.get())); tooltip.add(Component.literal(ChatFormatting.GRAY + "Previous upgrades need to be consumed first")); } diff --git a/src/main/java/nl/requios/effortlessbuilding/item/ReachUpgrade3Item.java b/src/main/java/nl/requios/effortlessbuilding/item/ReachUpgrade3Item.java index f43a076..8d9466e 100644 --- a/src/main/java/nl/requios/effortlessbuilding/item/ReachUpgrade3Item.java +++ b/src/main/java/nl/requios/effortlessbuilding/item/ReachUpgrade3Item.java @@ -17,7 +17,6 @@ import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.attachment.AttachmentHandler; import nl.requios.effortlessbuilding.attachment.PowerLevel; -import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; import java.util.List; @@ -53,13 +52,13 @@ 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."); - world.playSound((Player) null, player.blockPosition(), SoundEvents.ARMOR_EQUIP_LEATHER, SoundSource.PLAYERS, 1f, 1f); + world.playSound((Player) null, player.blockPosition(), SoundEvents.ARMOR_EQUIP_LEATHER.value(), SoundSource.PLAYERS, 1f, 1f); } } else if (currentLevel > 2) { if (!world.isClientSide) { EffortlessBuilding.log(player, "Already used this upgrade! Current power level is " + powerLevel.getPowerLevel() + "."); - world.playSound((Player) null, player.blockPosition(), SoundEvents.ARMOR_EQUIP_LEATHER, SoundSource.PLAYERS, 1f, 1f); + world.playSound((Player) null, player.blockPosition(), SoundEvents.ARMOR_EQUIP_LEATHER.value(), SoundSource.PLAYERS, 1f, 1f); } } } @@ -68,7 +67,7 @@ public class ReachUpgrade3Item extends Item { } @Override - public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag flag) { + public void appendHoverText(ItemStack stack, TooltipContext context, List tooltip, TooltipFlag tooltipFlag) { tooltip.add(Component.literal(ChatFormatting.GRAY + "Consume to increase reach to " + ChatFormatting.BLUE + CommonConfig.reach.level3.get())); tooltip.add(Component.literal(ChatFormatting.GRAY + "Previous upgrades need to be consumed first")); } diff --git a/src/main/java/nl/requios/effortlessbuilding/item/SingleItemLootModifier.java b/src/main/java/nl/requios/effortlessbuilding/item/SingleItemLootModifier.java index ee20b6d..41ef017 100644 --- a/src/main/java/nl/requios/effortlessbuilding/item/SingleItemLootModifier.java +++ b/src/main/java/nl/requios/effortlessbuilding/item/SingleItemLootModifier.java @@ -2,6 +2,7 @@ package nl.requios.effortlessbuilding.item; import com.google.common.base.Suppliers; import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.world.item.ItemStack; @@ -20,8 +21,8 @@ import java.util.function.Supplier; //https://mcreator.net/wiki/minecraft-vanilla-loot-tables-list#toc-index-1 public class SingleItemLootModifier extends LootModifier { - public static final Supplier> CODEC = Suppliers.memoize(() -> - RecordCodecBuilder.create(instance -> codecStart(instance).and( + public static final Supplier> CODEC = Suppliers.memoize(() -> + RecordCodecBuilder.mapCodec(instance -> codecStart(instance).and( instance.group( Codec.FLOAT.fieldOf("chance").forGetter(m -> m.chance), ItemStack.SINGLE_ITEM_CODEC.fieldOf("item").forGetter(m -> m.stack) @@ -52,7 +53,7 @@ public class SingleItemLootModifier extends LootModifier { } @Override - public Codec codec() { + public MapCodec codec() { return CODEC.get(); } } diff --git a/src/main/java/nl/requios/effortlessbuilding/network/PacketHandler.java b/src/main/java/nl/requios/effortlessbuilding/network/PacketHandler.java index 389dc61..0df2249 100644 --- a/src/main/java/nl/requios/effortlessbuilding/network/PacketHandler.java +++ b/src/main/java/nl/requios/effortlessbuilding/network/PacketHandler.java @@ -1,7 +1,8 @@ package nl.requios.effortlessbuilding.network; -import net.neoforged.neoforge.network.event.RegisterPayloadHandlerEvent; -import net.neoforged.neoforge.network.registration.IPayloadRegistrar; +import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; +import net.neoforged.neoforge.network.handling.DirectionalPayloadHandler; +import net.neoforged.neoforge.network.registration.PayloadRegistrar; import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.network.message.IsQuickReplacingPacket; import nl.requios.effortlessbuilding.network.message.IsUsingBuildModePacket; @@ -15,29 +16,24 @@ import nl.requios.effortlessbuilding.network.message.TranslatedLogPacket; public class PacketHandler { - public static void setupPackets(final RegisterPayloadHandlerEvent event) { - final IPayloadRegistrar registrar = event.registrar(EffortlessBuilding.MODID); + public static void setupPackets(final RegisterPayloadHandlersEvent event) { + final PayloadRegistrar registrar = event.registrar(EffortlessBuilding.MODID); - registrar.play(IsUsingBuildModePacket.ID, IsUsingBuildModePacket::new, handler -> handler - .server(IsUsingBuildModePacket.Handler::handle)); - registrar.play(IsQuickReplacingPacket.ID, IsQuickReplacingPacket::new, handler -> handler - .server(IsQuickReplacingPacket.Handler::handle)); - registrar.play(ServerPlaceBlocksPacket.ID, ServerPlaceBlocksPacket::new, handler -> handler - .server(ServerPlaceBlocksPacket.Handler::handle)); - registrar.play(ServerBreakBlocksPacket.ID, ServerBreakBlocksPacket::new, handler -> handler - .server(ServerBreakBlocksPacket.Handler::handle)); - registrar.play(PerformUndoPacket.ID, PerformUndoPacket::new, handler -> handler - .server(PerformUndoPacket.Handler::handle)); - registrar.play(PerformRedoPacket.ID, PerformRedoPacket::new, handler -> handler - .server(PerformRedoPacket.Handler::handle)); + registrar.playToServer(IsUsingBuildModePacket.ID, IsUsingBuildModePacket.CODEC, IsUsingBuildModePacket.Handler::handle); + registrar.playToServer(IsQuickReplacingPacket.ID, IsQuickReplacingPacket.CODEC, IsQuickReplacingPacket.Handler::handle); + registrar.playToServer(ServerPlaceBlocksPacket.ID, ServerPlaceBlocksPacket.CODEC, ServerPlaceBlocksPacket.Handler::handle); + registrar.playToServer(ServerBreakBlocksPacket.ID, ServerBreakBlocksPacket.CODEC, ServerBreakBlocksPacket.Handler::handle); + registrar.playToServer(PerformUndoPacket.ID, PerformUndoPacket.CODEC, PerformUndoPacket.Handler::handle); + registrar.playToServer(PerformRedoPacket.ID, PerformRedoPacket.CODEC, PerformRedoPacket.Handler::handle); - registrar.play(ModifierSettingsPacket.ID, ModifierSettingsPacket::new, handler -> handler - .server(ModifierSettingsPacket.ServerHandler::handleServer) - .server(ModifierSettingsPacket.ClientHandler::handleClient)); + registrar.playBidirectional(ModifierSettingsPacket.ID, ModifierSettingsPacket.CODEC, + new DirectionalPayloadHandler<>( + ModifierSettingsPacket.ClientHandler::handleClient, + ModifierSettingsPacket.ServerHandler::handleServer + ) + ); - registrar.play(PowerLevelPacket.ID, PowerLevelPacket::new, handler -> handler - .client(PowerLevelPacket.Handler::handle)); - registrar.play(TranslatedLogPacket.ID, TranslatedLogPacket::new, handler -> handler - .client(TranslatedLogPacket.Handler::handle)); + registrar.playToClient(PowerLevelPacket.ID, PowerLevelPacket.CODEC, PowerLevelPacket.Handler::handle); + registrar.playToClient(TranslatedLogPacket.ID, TranslatedLogPacket.CODEC, TranslatedLogPacket.Handler::handle); } } diff --git a/src/main/java/nl/requios/effortlessbuilding/network/message/IsQuickReplacingPacket.java b/src/main/java/nl/requios/effortlessbuilding/network/message/IsQuickReplacingPacket.java index 9d10324..e970154 100644 --- a/src/main/java/nl/requios/effortlessbuilding/network/message/IsQuickReplacingPacket.java +++ b/src/main/java/nl/requios/effortlessbuilding/network/message/IsQuickReplacingPacket.java @@ -2,39 +2,35 @@ package nl.requios.effortlessbuilding.network.message; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.neoforged.neoforge.network.handling.PlayPayloadContext; +import net.minecraft.server.level.ServerPlayer; +import net.neoforged.neoforge.network.handling.IPayloadContext; import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.systems.ServerBuildState; public record IsQuickReplacingPacket(boolean isQuickReplacing) implements CustomPacketPayload { - public static final ResourceLocation ID = new ResourceLocation(EffortlessBuilding.MODID, "is_quick_replacing"); - - public IsQuickReplacingPacket(FriendlyByteBuf buf) { - this(buf.readBoolean()); - } - - public void write(FriendlyByteBuf buf) { - buf.writeBoolean(isQuickReplacing); - } + public static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.BOOL, + IsQuickReplacingPacket::isQuickReplacing, + IsQuickReplacingPacket::new); + public static final Type ID = new Type<>(EffortlessBuilding.asResource("is_quick_replacing")); @Override - public ResourceLocation id() { + public Type type() { return ID; } public static class Handler { - public static void handle(final IsQuickReplacingPacket packet, final PlayPayloadContext context) { - context.workHandler().submitAsync(() -> { - if (context.player().isPresent()) { - Player player = context.player().get(); + public static void handle(final IsQuickReplacingPacket packet, final IPayloadContext context) { + context.enqueueWork(() -> { + if (context.player() instanceof ServerPlayer player) { ServerBuildState.setIsQuickReplacing(player, packet.isQuickReplacing()); } }).exceptionally(e -> { // Handle exception - context.packetHandler().disconnect(Component.translatable("effortlessbuilding.networking.is_quick_replacing.failed", e.getMessage())); + context.disconnect(Component.translatable("effortlessbuilding.networking.is_quick_replacing.failed", e.getMessage())); return null; }); } diff --git a/src/main/java/nl/requios/effortlessbuilding/network/message/IsUsingBuildModePacket.java b/src/main/java/nl/requios/effortlessbuilding/network/message/IsUsingBuildModePacket.java index 21602e3..ea07288 100644 --- a/src/main/java/nl/requios/effortlessbuilding/network/message/IsUsingBuildModePacket.java +++ b/src/main/java/nl/requios/effortlessbuilding/network/message/IsUsingBuildModePacket.java @@ -2,39 +2,35 @@ package nl.requios.effortlessbuilding.network.message; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.neoforged.neoforge.network.handling.PlayPayloadContext; +import net.minecraft.server.level.ServerPlayer; +import net.neoforged.neoforge.network.handling.IPayloadContext; import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.systems.ServerBuildState; public record IsUsingBuildModePacket(boolean isUsingBuildMode) implements CustomPacketPayload { - public static final ResourceLocation ID = new ResourceLocation(EffortlessBuilding.MODID, "is_using_build_mode"); - - public IsUsingBuildModePacket(FriendlyByteBuf buf) { - this(buf.readBoolean()); - } - - public void write(FriendlyByteBuf buf) { - buf.writeBoolean(isUsingBuildMode); - } + public static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.BOOL, + IsUsingBuildModePacket::isUsingBuildMode, + IsUsingBuildModePacket::new); + public static final Type ID = new Type<>(EffortlessBuilding.asResource("is_using_build_mode")); @Override - public ResourceLocation id() { + public Type type() { return ID; } public static class Handler { - public static void handle(final IsUsingBuildModePacket packet, final PlayPayloadContext context) { - context.workHandler().submitAsync(() -> { - if (context.player().isPresent()) { - Player player = context.player().get(); + public static void handle(final IsUsingBuildModePacket packet, final IPayloadContext context) { + context.enqueueWork(() -> { + if (context.player() instanceof ServerPlayer player) { ServerBuildState.setIsUsingBuildMode(player, packet.isUsingBuildMode()); } }).exceptionally(e -> { // Handle exception - context.packetHandler().disconnect(Component.translatable("effortlessbuilding.networking.is_using_build_mode.failed", e.getMessage())); + context.disconnect(Component.translatable("effortlessbuilding.networking.is_using_build_mode.failed", e.getMessage())); return null; }); } diff --git a/src/main/java/nl/requios/effortlessbuilding/network/message/ModifierSettingsPacket.java b/src/main/java/nl/requios/effortlessbuilding/network/message/ModifierSettingsPacket.java index 7e68cc8..4dcd0d6 100644 --- a/src/main/java/nl/requios/effortlessbuilding/network/message/ModifierSettingsPacket.java +++ b/src/main/java/nl/requios/effortlessbuilding/network/message/ModifierSettingsPacket.java @@ -3,10 +3,12 @@ package nl.requios.effortlessbuilding.network.message; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; -import net.neoforged.neoforge.network.handling.PlayPayloadContext; +import net.neoforged.neoforge.network.handling.IPayloadContext; import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.EffortlessBuildingClient; @@ -14,54 +16,49 @@ import nl.requios.effortlessbuilding.EffortlessBuildingClient; * Sync build modifiers between server and client, for saving and loading. */ public record ModifierSettingsPacket(CompoundTag modifiersTag) implements CustomPacketPayload { - public static final ResourceLocation ID = new ResourceLocation(EffortlessBuilding.MODID, "modifier_settings"); + public static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.COMPOUND_TAG, + ModifierSettingsPacket::modifiersTag, + ModifierSettingsPacket::new); + public static final Type ID = new Type<>(EffortlessBuilding.asResource("modifier_settings")); private static final String DATA_KEY = EffortlessBuilding.MODID + ":buildModifiers"; - public ModifierSettingsPacket(FriendlyByteBuf buf) { - this(buf.readNbt()); - } - public ModifierSettingsPacket(Player player) { this(player.getPersistentData().getCompound(DATA_KEY)); } - public void write(FriendlyByteBuf buf) { - buf.writeNbt(modifiersTag); - } - @Override - public ResourceLocation id() { + public Type type() { return ID; } public static class ServerHandler { - public static void handleServer(final ModifierSettingsPacket packet, final PlayPayloadContext context) { - context.workHandler().submitAsync(() -> { - if (context.player().isPresent()) { - Player player = context.player().get(); + public static void handleServer(final ModifierSettingsPacket packet, final IPayloadContext context) { + context.enqueueWork(() -> { + if (context.flow().isServerbound() && context.player() instanceof ServerPlayer player) { //To server, save to persistent player data player.getPersistentData().put(DATA_KEY, packet.modifiersTag()); } }).exceptionally(e -> { // Handle exception - context.packetHandler().disconnect(Component.translatable("effortlessbuilding.networking.modifier_settings.failed", e.getMessage())); + context.disconnect(Component.translatable("effortlessbuilding.networking.modifier_settings.failed", e.getMessage())); return null; }); } } public static class ClientHandler { - public static void handleClient(final ModifierSettingsPacket packet, final PlayPayloadContext context) { - context.workHandler().submitAsync(() -> { - if (context.player().isPresent()) { - Player player = context.player().get(); + public static void handleClient(final ModifierSettingsPacket packet, final IPayloadContext context) { + context.enqueueWork(() -> { + if (context.flow().isClientbound()) { + Player player = context.player(); //To client, load into system EffortlessBuildingClient.BUILD_MODIFIERS.deserializeNBT(packet.modifiersTag()); } }).exceptionally(e -> { // Handle exception - context.packetHandler().disconnect(Component.translatable("effortlessbuilding.networking.modifier_settings.failed", e.getMessage())); + context.disconnect(Component.translatable("effortlessbuilding.networking.modifier_settings.failed", e.getMessage())); return null; }); } diff --git a/src/main/java/nl/requios/effortlessbuilding/network/message/PerformRedoPacket.java b/src/main/java/nl/requios/effortlessbuilding/network/message/PerformRedoPacket.java index 730fd0a..0c6b3f6 100644 --- a/src/main/java/nl/requios/effortlessbuilding/network/message/PerformRedoPacket.java +++ b/src/main/java/nl/requios/effortlessbuilding/network/message/PerformRedoPacket.java @@ -2,14 +2,18 @@ package nl.requios.effortlessbuilding.network.message; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.neoforged.neoforge.network.handling.PlayPayloadContext; +import net.minecraft.server.level.ServerPlayer; +import net.neoforged.neoforge.network.handling.IPayloadContext; import nl.requios.effortlessbuilding.EffortlessBuilding; public record PerformRedoPacket() implements CustomPacketPayload { - public static final ResourceLocation ID = new ResourceLocation(EffortlessBuilding.MODID, "perform_redo"); + + public static final StreamCodec CODEC = CustomPacketPayload.codec( + PerformRedoPacket::write, + PerformRedoPacket::new); + public static final Type ID = new Type<>(EffortlessBuilding.asResource("perform_redo")); public PerformRedoPacket(FriendlyByteBuf buf) { this(); @@ -19,20 +23,19 @@ public record PerformRedoPacket() implements CustomPacketPayload { } @Override - public ResourceLocation id() { + public Type type() { return ID; } public static class Handler { - public static void handle(final PerformRedoPacket packet, final PlayPayloadContext context) { - context.workHandler().submitAsync(() -> { - if (context.player().isPresent()) { - Player player = context.player().get(); + public static void handle(final PerformRedoPacket packet, final IPayloadContext context) { + context.enqueueWork(() -> { + if (context.player() instanceof ServerPlayer player) { EffortlessBuilding.UNDO_REDO.redo(player); } }).exceptionally(e -> { // Handle exception - context.packetHandler().disconnect(Component.translatable("effortlessbuilding.networking.perform_undo.failed", e.getMessage())); + context.disconnect(Component.translatable("effortlessbuilding.networking.perform_undo.failed", e.getMessage())); return null; }); } diff --git a/src/main/java/nl/requios/effortlessbuilding/network/message/PerformUndoPacket.java b/src/main/java/nl/requios/effortlessbuilding/network/message/PerformUndoPacket.java index ab5d0f1..7dd24fa 100644 --- a/src/main/java/nl/requios/effortlessbuilding/network/message/PerformUndoPacket.java +++ b/src/main/java/nl/requios/effortlessbuilding/network/message/PerformUndoPacket.java @@ -2,14 +2,18 @@ package nl.requios.effortlessbuilding.network.message; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.neoforged.neoforge.network.handling.PlayPayloadContext; +import net.minecraft.server.level.ServerPlayer; +import net.neoforged.neoforge.network.handling.IPayloadContext; import nl.requios.effortlessbuilding.EffortlessBuilding; public record PerformUndoPacket() implements CustomPacketPayload { - public static final ResourceLocation ID = new ResourceLocation(EffortlessBuilding.MODID, "perform_undo"); + + public static final StreamCodec CODEC = CustomPacketPayload.codec( + PerformUndoPacket::write, + PerformUndoPacket::new); + public static final Type ID = new Type<>(EffortlessBuilding.asResource("perform_undo")); public PerformUndoPacket(FriendlyByteBuf buf) { this(); @@ -18,20 +22,19 @@ public record PerformUndoPacket() implements CustomPacketPayload { public void write(FriendlyByteBuf buf) {} @Override - public ResourceLocation id() { + public Type type() { return ID; } public static class Handler { - public static void handle(final PerformUndoPacket packet, final PlayPayloadContext context) { - context.workHandler().submitAsync(() -> { - if (context.player().isPresent()) { - Player player = context.player().get(); + public static void handle(final PerformUndoPacket packet, final IPayloadContext context) { + context.enqueueWork(() -> { + if (context.player() instanceof ServerPlayer player) { EffortlessBuilding.UNDO_REDO.undo(player); } }).exceptionally(e -> { // Handle exception - context.packetHandler().disconnect(Component.translatable("effortlessbuilding.networking.perform_undo.failed", e.getMessage())); + context.disconnect(Component.translatable("effortlessbuilding.networking.perform_undo.failed", e.getMessage())); return null; }); } diff --git a/src/main/java/nl/requios/effortlessbuilding/network/message/PowerLevelPacket.java b/src/main/java/nl/requios/effortlessbuilding/network/message/PowerLevelPacket.java index efe51e1..8b8f939 100644 --- a/src/main/java/nl/requios/effortlessbuilding/network/message/PowerLevelPacket.java +++ b/src/main/java/nl/requios/effortlessbuilding/network/message/PowerLevelPacket.java @@ -2,10 +2,11 @@ package nl.requios.effortlessbuilding.network.message; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; -import net.neoforged.neoforge.network.handling.PlayPayloadContext; +import net.neoforged.neoforge.network.handling.IPayloadContext; import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.attachment.PowerLevel; @@ -13,33 +14,29 @@ import nl.requios.effortlessbuilding.attachment.PowerLevel; * Sync power level from server to client */ public record PowerLevelPacket(int powerLevel) implements CustomPacketPayload { - public static final ResourceLocation ID = new ResourceLocation(EffortlessBuilding.MODID, "power_level"); - - public PowerLevelPacket(FriendlyByteBuf buf) { - this(buf.readInt()); - } - - public void write(FriendlyByteBuf buf) { - buf.writeInt(powerLevel); - } + public static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.INT, + PowerLevelPacket::powerLevel, + PowerLevelPacket::new); + public static final Type ID = new Type<>(EffortlessBuilding.asResource("power_level")); @Override - public ResourceLocation id() { + public Type type() { return ID; } public static class Handler { - public static void handle(final PowerLevelPacket packet, final PlayPayloadContext context) { - context.workHandler().submitAsync(() -> { - if (context.player().isPresent()) { - Player player = context.player().get(); + public static void handle(final PowerLevelPacket packet, final IPayloadContext context) { + context.enqueueWork(() -> { + if (context.player() != null) { + Player player = context.player(); PowerLevel currentLevel = player.getData(EffortlessBuilding.POWER_LEVEL.get()); currentLevel.setPowerLevel(packet.powerLevel); player.setData(EffortlessBuilding.POWER_LEVEL.get(), currentLevel); } }).exceptionally(e -> { // Handle exception - context.packetHandler().disconnect(Component.translatable("effortlessbuilding.networking.power_level.failed", e.getMessage())); + context.disconnect(Component.translatable("effortlessbuilding.networking.power_level.failed", e.getMessage())); return null; }); } diff --git a/src/main/java/nl/requios/effortlessbuilding/network/message/ServerBreakBlocksPacket.java b/src/main/java/nl/requios/effortlessbuilding/network/message/ServerBreakBlocksPacket.java index 23a03ce..6356c0d 100644 --- a/src/main/java/nl/requios/effortlessbuilding/network/message/ServerBreakBlocksPacket.java +++ b/src/main/java/nl/requios/effortlessbuilding/network/message/ServerBreakBlocksPacket.java @@ -2,10 +2,10 @@ package nl.requios.effortlessbuilding.network.message; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.neoforged.neoforge.network.handling.PlayPayloadContext; +import net.minecraft.server.level.ServerPlayer; +import net.neoforged.neoforge.network.handling.IPayloadContext; import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.utilities.BlockSet; @@ -13,7 +13,11 @@ import nl.requios.effortlessbuilding.utilities.BlockSet; * Sends a message to the server to break multiple blocks */ public record ServerBreakBlocksPacket(BlockSet blocks) implements CustomPacketPayload { - public static final ResourceLocation ID = new ResourceLocation(EffortlessBuilding.MODID, "server_break_blocks"); + + public static final StreamCodec CODEC = CustomPacketPayload.codec( + ServerBreakBlocksPacket::write, + ServerBreakBlocksPacket::new); + public static final Type ID = new Type<>(EffortlessBuilding.asResource("server_break_blocks")); public ServerBreakBlocksPacket(FriendlyByteBuf buf) { this(BlockSet.decode(buf)); @@ -24,20 +28,19 @@ public record ServerBreakBlocksPacket(BlockSet blocks) implements CustomPacketPa } @Override - public ResourceLocation id() { + public Type type() { return ID; } public static class Handler { - public static void handle(final ServerBreakBlocksPacket packet, final PlayPayloadContext context) { - context.workHandler().submitAsync(() -> { - if (context.player().isPresent()) { - Player player = context.player().get(); + public static void handle(final ServerBreakBlocksPacket packet, final IPayloadContext context) { + context.enqueueWork(() -> { + if (context.player() instanceof ServerPlayer player) { EffortlessBuilding.SERVER_BLOCK_PLACER.breakBlocks(player, packet.blocks()); } }).exceptionally(e -> { // Handle exception - context.packetHandler().disconnect(Component.translatable("effortlessbuilding.networking.server_break_blocks.failed", e.getMessage())); + context.disconnect(Component.translatable("effortlessbuilding.networking.server_break_blocks.failed", e.getMessage())); return null; }); } diff --git a/src/main/java/nl/requios/effortlessbuilding/network/message/ServerPlaceBlocksPacket.java b/src/main/java/nl/requios/effortlessbuilding/network/message/ServerPlaceBlocksPacket.java index 63c01bb..6f3d773 100644 --- a/src/main/java/nl/requios/effortlessbuilding/network/message/ServerPlaceBlocksPacket.java +++ b/src/main/java/nl/requios/effortlessbuilding/network/message/ServerPlaceBlocksPacket.java @@ -2,10 +2,10 @@ package nl.requios.effortlessbuilding.network.message; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.entity.player.Player; -import net.neoforged.neoforge.network.handling.PlayPayloadContext; +import net.minecraft.server.level.ServerPlayer; +import net.neoforged.neoforge.network.handling.IPayloadContext; import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.utilities.BlockSet; @@ -13,7 +13,11 @@ import nl.requios.effortlessbuilding.utilities.BlockSet; * Sends a message to the server to place multiple blocks */ public record ServerPlaceBlocksPacket(BlockSet blocks, long placeTime) implements CustomPacketPayload { - public static final ResourceLocation ID = new ResourceLocation(EffortlessBuilding.MODID, "server_place_blocks"); + + public static final StreamCodec CODEC = CustomPacketPayload.codec( + ServerPlaceBlocksPacket::write, + ServerPlaceBlocksPacket::new); + public static final Type ID = new Type<>(EffortlessBuilding.asResource("server_place_blocks")); public ServerPlaceBlocksPacket(FriendlyByteBuf buf) { this(BlockSet.decode(buf), buf.readLong()); @@ -25,21 +29,20 @@ public record ServerPlaceBlocksPacket(BlockSet blocks, long placeTime) implement } @Override - public ResourceLocation id() { + public Type type() { return ID; } public static class Handler { - public static void handle(final ServerPlaceBlocksPacket packet, final PlayPayloadContext context) { - context.workHandler().submitAsync(() -> { - if (context.player().isPresent()) { - Player player = context.player().get(); + public static void handle(final ServerPlaceBlocksPacket packet, final IPayloadContext context) { + context.enqueueWork(() -> { + if (context.player() instanceof ServerPlayer player) { EffortlessBuilding.logger.info("Place block packet received from client. Placing blocks..."); EffortlessBuilding.SERVER_BLOCK_PLACER.placeBlocksDelayed(player, packet.blocks(), packet.placeTime()); } }).exceptionally(e -> { // Handle exception - context.packetHandler().disconnect(Component.translatable("effortlessbuilding.networking.server_place_blocks.failed", e.getMessage())); + context.disconnect(Component.translatable("effortlessbuilding.networking.server_place_blocks.failed", e.getMessage())); return null; }); } diff --git a/src/main/java/nl/requios/effortlessbuilding/network/message/TranslatedLogPacket.java b/src/main/java/nl/requios/effortlessbuilding/network/message/TranslatedLogPacket.java index fee5e0e..47d7723 100644 --- a/src/main/java/nl/requios/effortlessbuilding/network/message/TranslatedLogPacket.java +++ b/src/main/java/nl/requios/effortlessbuilding/network/message/TranslatedLogPacket.java @@ -2,67 +2,46 @@ package nl.requios.effortlessbuilding.network.message; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.ByteBufCodecs; +import net.minecraft.network.codec.StreamCodec; import net.minecraft.network.protocol.common.custom.CustomPacketPayload; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; -import net.neoforged.neoforge.network.handling.PlayPayloadContext; +import net.neoforged.neoforge.network.handling.IPayloadContext; import nl.requios.effortlessbuilding.EffortlessBuilding; /** * Send packet to client to translate and log the containing message */ -public record TranslatedLogPacket(String prefix, String translationKey, String suffix, boolean actionBar) implements CustomPacketPayload { - public static final ResourceLocation ID = new ResourceLocation(EffortlessBuilding.MODID, "translated_log"); +public record TranslatedLogPacket(String prefix, String translationKey, String suffix, + boolean actionBar) implements CustomPacketPayload { + public static final StreamCodec CODEC = StreamCodec.composite( + ByteBufCodecs.STRING_UTF8, + TranslatedLogPacket::prefix, + ByteBufCodecs.STRING_UTF8, + TranslatedLogPacket::translationKey, + ByteBufCodecs.STRING_UTF8, + TranslatedLogPacket::suffix, + ByteBufCodecs.BOOL, + TranslatedLogPacket::actionBar, + TranslatedLogPacket::new); - public TranslatedLogPacket(FriendlyByteBuf buf) { - this(buf.readUtf(), buf.readUtf(), buf.readUtf(), buf.readBoolean()); - } - - public TranslatedLogPacket(String prefix, String translationKey, String suffix, boolean actionBar) { - this.prefix = prefix; - this.translationKey = translationKey; - this.suffix = suffix; - this.actionBar = actionBar; - } - - public void write(FriendlyByteBuf buf) { - buf.writeUtf(prefix); - buf.writeUtf(translationKey); - buf.writeUtf(suffix); - buf.writeBoolean(actionBar); - } + public static final Type ID = new Type<>(EffortlessBuilding.asResource("translated_log")); @Override - public ResourceLocation id() { + public Type type() { return ID; } - public String getPrefix() { - return prefix; - } - - public String getTranslationKey() { - return translationKey; - } - - public String getSuffix() { - return suffix; - } - - public boolean isActionBar() { - return actionBar; - } - public static class Handler { - public static void handle(final TranslatedLogPacket packet, final PlayPayloadContext context) { - context.workHandler().submitAsync(() -> { - if (context.player().isPresent()) { - Player player = context.player().get(); + public static void handle(final TranslatedLogPacket packet, final IPayloadContext context) { + context.enqueueWork(() -> { + if (context.player() != null) { + Player player = context.player(); EffortlessBuilding.logTranslate(player, packet.prefix(), packet.translationKey(), packet.suffix(), packet.actionBar()); } }).exceptionally(e -> { // Handle exception - context.packetHandler().disconnect(Component.translatable("effortlessbuilding.networking.translated_log.failed", e.getMessage())); + context.disconnect(Component.translatable("effortlessbuilding.networking.translated_log.failed", e.getMessage())); return null; }); } diff --git a/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java b/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java index c1c3a06..dbd45c2 100644 --- a/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java +++ b/src/main/java/nl/requios/effortlessbuilding/proxy/ClientProxy.java @@ -1,6 +1,5 @@ package nl.requios.effortlessbuilding.proxy; -import net.minecraft.client.Minecraft; import net.minecraft.client.resources.language.I18n; import net.minecraft.world.entity.player.Player; import net.neoforged.api.distmarker.Dist; @@ -8,9 +7,9 @@ import net.neoforged.api.distmarker.OnlyIn; import nl.requios.effortlessbuilding.EffortlessBuilding; @OnlyIn(Dist.CLIENT) -public class ClientProxy implements IProxy { +public class ClientProxy { - public void logTranslate(Player player, String prefix, String translationKey, String suffix, boolean actionBar) { - EffortlessBuilding.log(Minecraft.getInstance().player, prefix + I18n.get(translationKey) + suffix, actionBar); + public static void logTranslate(Player player, String prefix, String translationKey, String suffix, boolean actionBar) { + EffortlessBuilding.log(player, prefix + I18n.get(translationKey) + suffix, actionBar); } } diff --git a/src/main/java/nl/requios/effortlessbuilding/proxy/IProxy.java b/src/main/java/nl/requios/effortlessbuilding/proxy/IProxy.java deleted file mode 100644 index a2e8650..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/proxy/IProxy.java +++ /dev/null @@ -1,7 +0,0 @@ -package nl.requios.effortlessbuilding.proxy; - -import net.minecraft.world.entity.player.Player; - -public interface IProxy { - void logTranslate(Player player, String prefix, String translationKey, String suffix, boolean actionBar); -} diff --git a/src/main/java/nl/requios/effortlessbuilding/proxy/ServerProxy.java b/src/main/java/nl/requios/effortlessbuilding/proxy/ServerProxy.java index 6948c41..8bdbb9e 100644 --- a/src/main/java/nl/requios/effortlessbuilding/proxy/ServerProxy.java +++ b/src/main/java/nl/requios/effortlessbuilding/proxy/ServerProxy.java @@ -4,10 +4,10 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.player.Player; import nl.requios.effortlessbuilding.network.message.TranslatedLogPacket; -public class ServerProxy implements IProxy { +public class ServerProxy { //Only physical server! Singleplayer server is seen as clientproxy - public void logTranslate(Player player, String prefix, String translationKey, String suffix, boolean actionBar) { + public static void logTranslate(Player player, String prefix, String translationKey, String suffix, boolean actionBar) { ((ServerPlayer)player).connection.send(new TranslatedLogPacket(prefix, translationKey, suffix, actionBar)); } } diff --git a/src/main/java/nl/requios/effortlessbuilding/render/BlockPreviews.java b/src/main/java/nl/requios/effortlessbuilding/render/BlockPreviews.java index b094649..5601fdc 100644 --- a/src/main/java/nl/requios/effortlessbuilding/render/BlockPreviews.java +++ b/src/main/java/nl/requios/effortlessbuilding/render/BlockPreviews.java @@ -1,18 +1,23 @@ package nl.requios.effortlessbuilding.render; +import net.createmod.catnip.data.Pair; +import net.createmod.catnip.outliner.Outliner; +import net.createmod.catnip.theme.Color; import net.minecraft.client.Minecraft; -import net.minecraft.world.entity.player.Player; import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; -import nl.requios.effortlessbuilding.*; +import nl.requios.effortlessbuilding.ClientConfig; +import nl.requios.effortlessbuilding.ClientEvents; +import nl.requios.effortlessbuilding.EffortlessBuilding; +import nl.requios.effortlessbuilding.EffortlessBuildingClient; import nl.requios.effortlessbuilding.buildmode.BuildModeEnum; import nl.requios.effortlessbuilding.create.AllSpecialTextures; import nl.requios.effortlessbuilding.create.CreateClient; -import nl.requios.effortlessbuilding.create.foundation.utility.Color; import nl.requios.effortlessbuilding.systems.BuilderChain; import nl.requios.effortlessbuilding.utilities.BlockEntry; import nl.requios.effortlessbuilding.utilities.BlockSet; @@ -76,25 +81,25 @@ public class BlockPreviews { if (ClientConfig.visuals.showBlockPreviews.get() && blocks.size() < ClientConfig.visuals.maxBlockPreviews.get()) { renderBlockPreviews(blocks, false, 0f); - CreateClient.OUTLINER.showCluster(outlineID, coordinates) + Outliner.getInstance().showCluster(outlineID, coordinates) .withFaceTexture(AllSpecialTextures.CHECKERED) - .disableNormals() + .disableLineNormals() .lineWidth(1 / 32f) .colored(new Color(1f, 1f, 1f, 1f)); } else { //Thicker outline without block previews - CreateClient.OUTLINER.showCluster(outlineID, coordinates) + Outliner.getInstance().showCluster(outlineID, coordinates) .withFaceTexture(AllSpecialTextures.HIGHLIGHT_CHECKERED) - .disableNormals() + .disableLineNormals() .lineWidth(1 / 16f) .colored(new Color(1f, 1f, 1f, 1f)); } } else { //Breaking - CreateClient.OUTLINER.showCluster(outlineID, coordinates) + Outliner.getInstance().showCluster(outlineID, coordinates) .withFaceTexture(AllSpecialTextures.THIN_CHECKERED) - .disableNormals() + .disableLineNormals() .lineWidth(1 / 16f) .colored(new Color(0.8f, 0.1f, 0.1f, 1f)); } @@ -153,8 +158,8 @@ public class BlockPreviews { } } - CreateClient.OUTLINER.showAABB("break", aabb) - .disableNormals() + Outliner.getInstance().showAABB("break", aabb) + .disableLineNormals() .lineWidth(1 / 64f) .colored(0x222222); } @@ -227,7 +232,7 @@ public class BlockPreviews { placedBlocksList.add(new PlacedBlocksEntry(ClientEvents.ticksInGame, false, new BlockSet(blocks))); - CreateClient.OUTLINER.keep(blocks.firstPos, ClientConfig.visuals.appearAnimationLength.get()); + Outliner.getInstance().keep(Pair.of(blocks.firstPos, ClientConfig.visuals.appearAnimationLength.get())); } public void onBlocksBroken(BlockSet blocks) { @@ -236,7 +241,7 @@ public class BlockPreviews { placedBlocksList.add(new PlacedBlocksEntry(ClientEvents.ticksInGame, true, new BlockSet(blocks))); - CreateClient.OUTLINER.keep(blocks.firstPos, ClientConfig.visuals.breakAnimationLength.get()); + Outliner.getInstance().keep(Pair.of(blocks.firstPos, ClientConfig.visuals.breakAnimationLength.get())); } private void sortOnDistanceToPlayer(List coordinates, Player player) { diff --git a/src/main/java/nl/requios/effortlessbuilding/render/ModifierRenderer.java b/src/main/java/nl/requios/effortlessbuilding/render/ModifierRenderer.java index 7a7f9e2..4380f4a 100644 --- a/src/main/java/nl/requios/effortlessbuilding/render/ModifierRenderer.java +++ b/src/main/java/nl/requios/effortlessbuilding/render/ModifierRenderer.java @@ -103,13 +103,13 @@ public class ModifierRenderer { if (drawPlanes) { VertexConsumer buffer = RenderHandler.beginPlanes(renderTypeBuffer); - buffer.vertex(matrixPos, (float) posA.x, (float) posA.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); - buffer.vertex(matrixPos, (float) posA.x, (float) posB.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); - buffer.vertex(matrixPos, (float) posB.x, (float) posA.y, (float) posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); - buffer.vertex(matrixPos, (float) posB.x, (float) posB.y, (float) posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); + buffer.addVertex(matrixPos, (float) posA.x, (float) posA.y, (float) posA.z).setColor(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha); + buffer.addVertex(matrixPos, (float) posA.x, (float) posB.y, (float) posA.z).setColor(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha); + buffer.addVertex(matrixPos, (float) posB.x, (float) posA.y, (float) posB.z).setColor(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha); + buffer.addVertex(matrixPos, (float) posB.x, (float) posB.y, (float) posB.z).setColor(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha); //backface (using triangle strip) - buffer.vertex(matrixPos, (float) posA.x, (float) posA.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); - buffer.vertex(matrixPos, (float) posA.x, (float) posB.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); + buffer.addVertex(matrixPos, (float) posA.x, (float) posA.y, (float) posA.z).setColor(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha); + buffer.addVertex(matrixPos, (float) posA.x, (float) posB.y, (float) posA.z).setColor(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha); RenderHandler.endPlanes(renderTypeBuffer); } @@ -118,11 +118,11 @@ public class ModifierRenderer { VertexConsumer buffer = RenderHandler.beginLines(renderTypeBuffer); Vec3 middle = posA.add(posB).scale(0.5); - buffer.vertex(matrixPos, (float) posA.x, (float) middle.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); - buffer.vertex(matrixPos, (float) posB.x, (float) middle.y, (float) posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); + buffer.addVertex(matrixPos, (float) posA.x, (float) middle.y, (float) posA.z).setColor(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha); + buffer.addVertex(matrixPos, (float) posB.x, (float) middle.y, (float) posB.z).setColor(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha); if (drawVerticalLines) { - buffer.vertex(matrixPos, (float) middle.x, (float) posA.y, (float) middle.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); - buffer.vertex(matrixPos, (float) middle.x, (float) posB.y, (float) middle.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); + buffer.addVertex(matrixPos, (float) middle.x, (float) posA.y, (float) middle.z).setColor(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha); + buffer.addVertex(matrixPos, (float) middle.x, (float) posB.y, (float) middle.z).setColor(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha); } RenderHandler.endLines(renderTypeBuffer); @@ -137,13 +137,13 @@ public class ModifierRenderer { if (drawPlanes) { VertexConsumer buffer = RenderHandler.beginPlanes(renderTypeBuffer); - buffer.vertex(matrixPos, (float) posA.x, (float) posA.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); - buffer.vertex(matrixPos, (float) posA.x, (float) posA.y, (float) posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); - buffer.vertex(matrixPos, (float) posB.x, (float) posA.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); - buffer.vertex(matrixPos, (float) posB.x, (float) posA.y, (float) posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); + buffer.addVertex(matrixPos, (float) posA.x, (float) posA.y, (float) posA.z).setColor(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha); + buffer.addVertex(matrixPos, (float) posA.x, (float) posA.y, (float) posB.z).setColor(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha); + buffer.addVertex(matrixPos, (float) posB.x, (float) posA.y, (float) posA.z).setColor(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha); + buffer.addVertex(matrixPos, (float) posB.x, (float) posA.y, (float) posB.z).setColor(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha); //backface (using triangle strip) - buffer.vertex(matrixPos, (float) posA.x, (float) posA.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); - buffer.vertex(matrixPos, (float) posA.x, (float) posA.y, (float) posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha).endVertex(); + buffer.addVertex(matrixPos, (float) posA.x, (float) posA.y, (float) posA.z).setColor(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha); + buffer.addVertex(matrixPos, (float) posA.x, (float) posA.y, (float) posB.z).setColor(c.getRed(), c.getGreen(), c.getBlue(), planeAlpha); RenderHandler.endPlanes(renderTypeBuffer); } @@ -152,10 +152,10 @@ public class ModifierRenderer { VertexConsumer buffer = RenderHandler.beginLines(renderTypeBuffer); Vec3 middle = posA.add(posB).scale(0.5); - buffer.vertex(matrixPos, (float) middle.x, (float) middle.y, (float) posA.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); - buffer.vertex(matrixPos, (float) middle.x, (float) middle.y, (float) posB.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); - buffer.vertex(matrixPos, (float) posA.x, (float) middle.y, (float) middle.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); - buffer.vertex(matrixPos, (float) posB.x, (float) middle.y, (float) middle.z).color(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha).endVertex(); + buffer.addVertex(matrixPos, (float) middle.x, (float) middle.y, (float) posA.z).setColor(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha); + buffer.addVertex(matrixPos, (float) middle.x, (float) middle.y, (float) posB.z).setColor(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha); + buffer.addVertex(matrixPos, (float) posA.x, (float) middle.y, (float) middle.z).setColor(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha); + buffer.addVertex(matrixPos, (float) posB.x, (float) middle.y, (float) middle.z).setColor(c.getRed(), c.getGreen(), c.getBlue(), lineAlpha); RenderHandler.endLines(renderTypeBuffer); } @@ -169,12 +169,12 @@ public class ModifierRenderer { Vec3 pos = m.position.add(epsilon); - buffer.vertex(matrixPos, (float) pos.x - m.radius, (float) pos.y, (float) pos.z).color(colorX.getRed(), colorX.getGreen(), colorX.getBlue(), lineAlpha).endVertex(); - buffer.vertex(matrixPos, (float) pos.x + m.radius, (float) pos.y, (float) pos.z).color(colorX.getRed(), colorX.getGreen(), colorX.getBlue(), lineAlpha).endVertex(); - buffer.vertex(matrixPos, (float) pos.x, (float) pos.y - m.radius, (float) pos.z).color(colorY.getRed(), colorY.getGreen(), colorY.getBlue(), lineAlpha).endVertex(); - buffer.vertex(matrixPos, (float) pos.x, (float) pos.y + m.radius, (float) pos.z).color(colorY.getRed(), colorY.getGreen(), colorY.getBlue(), lineAlpha).endVertex(); - buffer.vertex(matrixPos, (float) pos.x, (float) pos.y, (float) pos.z - m.radius).color(colorZ.getRed(), colorZ.getGreen(), colorZ.getBlue(), lineAlpha).endVertex(); - buffer.vertex(matrixPos, (float) pos.x, (float) pos.y, (float) pos.z + m.radius).color(colorZ.getRed(), colorZ.getGreen(), colorZ.getBlue(), lineAlpha).endVertex(); + buffer.addVertex(matrixPos, (float) pos.x - m.radius, (float) pos.y, (float) pos.z).setColor(colorX.getRed(), colorX.getGreen(), colorX.getBlue(), lineAlpha); + buffer.addVertex(matrixPos, (float) pos.x + m.radius, (float) pos.y, (float) pos.z).setColor(colorX.getRed(), colorX.getGreen(), colorX.getBlue(), lineAlpha); + buffer.addVertex(matrixPos, (float) pos.x, (float) pos.y - m.radius, (float) pos.z).setColor(colorY.getRed(), colorY.getGreen(), colorY.getBlue(), lineAlpha); + buffer.addVertex(matrixPos, (float) pos.x, (float) pos.y + m.radius, (float) pos.z).setColor(colorY.getRed(), colorY.getGreen(), colorY.getBlue(), lineAlpha); + buffer.addVertex(matrixPos, (float) pos.x, (float) pos.y, (float) pos.z - m.radius).setColor(colorZ.getRed(), colorZ.getGreen(), colorZ.getBlue(), lineAlpha); + buffer.addVertex(matrixPos, (float) pos.x, (float) pos.y, (float) pos.z + m.radius).setColor(colorZ.getRed(), colorZ.getGreen(), colorZ.getBlue(), lineAlpha); RenderHandler.endLines(renderTypeBuffer); } diff --git a/src/main/java/nl/requios/effortlessbuilding/render/RenderHandler.java b/src/main/java/nl/requios/effortlessbuilding/render/RenderHandler.java index 36ddd6a..9b18ccb 100644 --- a/src/main/java/nl/requios/effortlessbuilding/render/RenderHandler.java +++ b/src/main/java/nl/requios/effortlessbuilding/render/RenderHandler.java @@ -1,9 +1,8 @@ package nl.requios.effortlessbuilding.render; import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.ByteBufferBuilder; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.Tesselator; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; @@ -14,17 +13,17 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; import net.minecraft.world.phys.Vec3; import net.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.neoforge.client.event.RenderGuiEvent; import net.neoforged.neoforge.client.event.RenderLevelStageEvent; -import net.neoforged.bus.api.SubscribeEvent; -import net.neoforged.fml.common.Mod; import nl.requios.effortlessbuilding.EffortlessBuildingClient; import nl.requios.effortlessbuilding.systems.BuilderChain; /*** * Main render class for Effortless Building */ -@Mod.EventBusSubscriber(Dist.CLIENT) +@EventBusSubscriber(Dist.CLIENT) public class RenderHandler { @SubscribeEvent @@ -33,8 +32,9 @@ public class RenderHandler { Vec3 cameraPos = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition(); PoseStack ms = event.getPoseStack(); - BufferBuilder bufferBuilder = Tesselator.getInstance().getBuilder(); - MultiBufferSource.BufferSource buffer = MultiBufferSource.immediate(bufferBuilder); +// BufferBuilder bufferBuilder = Tesselator.getInstance().getBuilder(); +// MultiBufferSource.BufferSource buffer = MultiBufferSource.immediate(bufferBuilder); + MultiBufferSource.BufferSource buffer = MultiBufferSource.immediate(new ByteBufferBuilder(1536)); ms.pushPose(); ms.translate(-cameraPos.x(), -cameraPos.y(), -cameraPos.z()); @@ -130,7 +130,8 @@ public class RenderHandler { Font font = Minecraft.getInstance().font; String text = String.valueOf(stack.getCount()); ms.translate(0.0D, 0.0D, 200.0F); - MultiBufferSource.BufferSource multibuffersource$buffersource = MultiBufferSource.immediate(Tesselator.getInstance().getBuilder()); +// MultiBufferSource.BufferSource multibuffersource$buffersource = MultiBufferSource.immediate(Tesselator.getInstance().getBuilder()); + MultiBufferSource.BufferSource multibuffersource$buffersource = MultiBufferSource.immediate(new ByteBufferBuilder(1536)); 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/BuildSettings.java b/src/main/java/nl/requios/effortlessbuilding/systems/BuildSettings.java index ebbb462..4043c48 100644 --- a/src/main/java/nl/requios/effortlessbuilding/systems/BuildSettings.java +++ b/src/main/java/nl/requios/effortlessbuilding/systems/BuildSettings.java @@ -4,8 +4,8 @@ import net.minecraft.client.Minecraft; import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.neoforge.network.PacketDistributor; -import nl.requios.effortlessbuilding.buildmode.ModeOptions; import nl.requios.effortlessbuilding.attachment.AttachmentHandler; +import nl.requios.effortlessbuilding.buildmode.ModeOptions; import nl.requios.effortlessbuilding.network.message.IsQuickReplacingPacket; @OnlyIn(Dist.CLIENT) @@ -26,7 +26,7 @@ public class BuildSettings { public void setReplaceMode(ReplaceMode replaceMode) { this.replaceMode = replaceMode; - PacketDistributor.SERVER.noArg().send(new IsQuickReplacingPacket(isQuickReplacing())); + PacketDistributor.sendToServer(new IsQuickReplacingPacket(isQuickReplacing())); } public ReplaceMode getReplaceMode() { diff --git a/src/main/java/nl/requios/effortlessbuilding/systems/BuilderChain.java b/src/main/java/nl/requios/effortlessbuilding/systems/BuilderChain.java index 7fef9ba..f81d1ee 100644 --- a/src/main/java/nl/requios/effortlessbuilding/systems/BuilderChain.java +++ b/src/main/java/nl/requios/effortlessbuilding/systems/BuilderChain.java @@ -94,7 +94,7 @@ public class BuilderChain { blocks.skipFirst = buildMode == BuildModeEnum.DISABLED; long placeTime = player.level().getGameTime(); if (blocks.size() > 1) placeTime += ClientConfig.visuals.appearAnimationLength.get(); - PacketDistributor.SERVER.noArg().send(new ServerPlaceBlocksPacket(blocks, placeTime)); + PacketDistributor.sendToServer(new ServerPlaceBlocksPacket(blocks, placeTime)); } } } @@ -132,7 +132,7 @@ public class BuilderChain { ClientBlockUtilities.playSoundIfFurtherThanNormal(player, blocks.getLastBlockEntry(), true); player.swing(InteractionHand.MAIN_HAND); blocks.skipFirst = buildMode == BuildModeEnum.DISABLED; - PacketDistributor.SERVER.noArg().send(new ServerBreakBlocksPacket(blocks)); + PacketDistributor.sendToServer(new ServerBreakBlocksPacket(blocks)); } } } diff --git a/src/main/java/nl/requios/effortlessbuilding/systems/ServerBlockPlacer.java b/src/main/java/nl/requios/effortlessbuilding/systems/ServerBlockPlacer.java index 9e12779..279fec5 100644 --- a/src/main/java/nl/requios/effortlessbuilding/systems/ServerBlockPlacer.java +++ b/src/main/java/nl/requios/effortlessbuilding/systems/ServerBlockPlacer.java @@ -4,9 +4,15 @@ import net.minecraft.ChatFormatting; import net.minecraft.world.entity.player.Player; import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.ServerConfig; -import nl.requios.effortlessbuilding.utilities.*; +import nl.requios.effortlessbuilding.utilities.BlockEntry; +import nl.requios.effortlessbuilding.utilities.BlockPlacerHelper; +import nl.requios.effortlessbuilding.utilities.BlockSet; +import nl.requios.effortlessbuilding.utilities.BlockUtilities; +import nl.requios.effortlessbuilding.utilities.InventoryHelper; -import java.util.*; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; // Receives block placement requests from the client and places them public class ServerBlockPlacer { diff --git a/src/main/java/nl/requios/effortlessbuilding/systems/UndoRedo.java b/src/main/java/nl/requios/effortlessbuilding/systems/UndoRedo.java index db1f71a..8dac2ad 100644 --- a/src/main/java/nl/requios/effortlessbuilding/systems/UndoRedo.java +++ b/src/main/java/nl/requios/effortlessbuilding/systems/UndoRedo.java @@ -1,24 +1,30 @@ 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.core.BlockPos; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.ItemStack; -import net.minecraft.core.BlockPos; -import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; import net.neoforged.neoforge.common.util.BlockSnapshot; import nl.requios.effortlessbuilding.EffortlessBuilding; import nl.requios.effortlessbuilding.ServerConfig; -import nl.requios.effortlessbuilding.utilities.*; +import nl.requios.effortlessbuilding.utilities.BlockSet; +import nl.requios.effortlessbuilding.utilities.FixedStack; +import nl.requios.effortlessbuilding.utilities.InventoryHelper; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; //Server only public class UndoRedo { - public class UndoSet { + public static class UndoSet { public final List blockSnapshots; public UndoSet(List blockSnapshots) { diff --git a/src/main/java/nl/requios/effortlessbuilding/utilities/BlockPlacerHelper.java b/src/main/java/nl/requios/effortlessbuilding/utilities/BlockPlacerHelper.java index 4ee18dd..dacd923 100644 --- a/src/main/java/nl/requios/effortlessbuilding/utilities/BlockPlacerHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/utilities/BlockPlacerHelper.java @@ -6,6 +6,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.DiggerItem; 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.state.BlockState; import net.neoforged.neoforge.common.util.BlockSnapshot; import net.neoforged.neoforge.event.EventHooks; @@ -42,7 +43,7 @@ public class BlockPlacerHelper { var itemStack = new ItemStack(blockEntry.item); level.captureBlockSnapshots = true; - BlockHelper.placeSchematicBlock(level, player, blockEntry.newBlockState, blockEntry.blockPos, itemStack, null); + BlockHelper.placeSchematicBlock(level, blockEntry.newBlockState, blockEntry.blockPos, itemStack, null); level.captureBlockSnapshots = false; //Find out if we get to keep the placed block by sending a forge event @@ -67,7 +68,7 @@ public class BlockPlacerHelper { for (BlockSnapshot blocksnapshot : Lists.reverse(blockSnapshots)) { level.restoringBlockSnapshots = true; - blocksnapshot.restore(true, false); + blocksnapshot.restore(Block.UPDATE_NONE); level.restoringBlockSnapshots = false; } } @@ -75,8 +76,8 @@ public class BlockPlacerHelper { { for (BlockSnapshot snap : blockSnapshots) { - int updateFlag = snap.getFlag(); - BlockState oldBlock = snap.getReplacedBlock(); + int updateFlag = snap.getFlags(); + BlockState oldBlock = snap.getState(); BlockState newBlock = level.getBlockState(snap.getPos()); newBlock.onPlace(level, snap.getPos(), oldBlock, false); diff --git a/src/main/java/nl/requios/effortlessbuilding/utilities/BlockUtilities.java b/src/main/java/nl/requios/effortlessbuilding/utilities/BlockUtilities.java index 778a04e..418dd52 100644 --- a/src/main/java/nl/requios/effortlessbuilding/utilities/BlockUtilities.java +++ b/src/main/java/nl/requios/effortlessbuilding/utilities/BlockUtilities.java @@ -5,7 +5,11 @@ import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.block.*; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.DirectionalBlock; +import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.block.SlabBlock; +import net.minecraft.world.level.block.StairBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.Half; import net.minecraft.world.level.block.state.properties.SlabType; diff --git a/src/main/java/nl/requios/effortlessbuilding/utilities/InventoryHelper.java b/src/main/java/nl/requios/effortlessbuilding/utilities/InventoryHelper.java index debf471..4e3e7f7 100644 --- a/src/main/java/nl/requios/effortlessbuilding/utilities/InventoryHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/utilities/InventoryHelper.java @@ -1,10 +1,10 @@ package nl.requios.effortlessbuilding.utilities; -import net.minecraft.world.item.Item; -import net.minecraft.world.level.block.Block; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; import nl.requios.effortlessbuilding.EffortlessBuilding; import java.util.Map; diff --git a/src/main/java/nl/requios/effortlessbuilding/utilities/SurvivalHelper.java b/src/main/java/nl/requios/effortlessbuilding/utilities/SurvivalHelper.java index 172d47d..f0ef351 100644 --- a/src/main/java/nl/requios/effortlessbuilding/utilities/SurvivalHelper.java +++ b/src/main/java/nl/requios/effortlessbuilding/utilities/SurvivalHelper.java @@ -21,7 +21,7 @@ public class SurvivalHelper { if (player.isCreative()) return true; - return EventHooks.doPlayerHarvestCheck(player, blockState, true); + return EventHooks.doPlayerHarvestCheck(player, blockState, world, pos); } public static boolean doesBecomeDoubleSlab(Player player, BlockPos pos) { diff --git a/src/main/java/nl/requios/effortlessbuilding/utilities/UndoRedoBlockSet.java b/src/main/java/nl/requios/effortlessbuilding/utilities/UndoRedoBlockSet.java deleted file mode 100644 index 7706faf..0000000 --- a/src/main/java/nl/requios/effortlessbuilding/utilities/UndoRedoBlockSet.java +++ /dev/null @@ -1,45 +0,0 @@ -package nl.requios.effortlessbuilding.utilities; - -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.core.BlockPos; - -import java.util.List; - -//Server only -@Deprecated -public class UndoRedoBlockSet { - private final List coordinates; - private final List previousBlockStates; - private final List newBlockStates; - private final BlockPos firstPos; - private final BlockPos secondPos; - - public UndoRedoBlockSet(List coordinates, List previousBlockStates, List newBlockStates, - BlockPos firstPos, BlockPos secondPos) { - this.coordinates = coordinates; - this.previousBlockStates = previousBlockStates; - this.newBlockStates = newBlockStates; - this.firstPos = firstPos; - this.secondPos = secondPos; - } - - public List getCoordinates() { - return coordinates; - } - - public List getPreviousBlockStates() { - return previousBlockStates; - } - - public List getNewBlockStates() { - return newBlockStates; - } - - public BlockPos getFirstPos() { - return firstPos; - } - - public BlockPos getSecondPos() { - return secondPos; - } -} diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/neoforge.mods.toml similarity index 79% rename from src/main/resources/META-INF/mods.toml rename to src/main/resources/META-INF/neoforge.mods.toml index 9cd6234..44df873 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/neoforge.mods.toml @@ -1,5 +1,5 @@ modLoader="javafml" -loaderVersion="[2,)" +loaderVersion="[4,)" 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,23 +19,23 @@ Makes building easier by providing tools like mirrors, arrays, build modes and a [[dependencies.effortlessbuilding]] modId="neoforge" type="required" - versionRange="[20.4.167,)" + versionRange="[21.1.1,)" ordering="NONE" side="BOTH" [[dependencies.effortlessbuilding]] modId="minecraft" type="required" - versionRange="[1.20.4,1.21)" + versionRange="[1.21.1,1.21.2)" ordering="NONE" side="BOTH" -[[dependencies.effortlessbuilding]] - modId="flywheel" - type="required" - versionRange="[0.6.10,0.7)" - ordering="AFTER" - side="CLIENT" +#[[dependencies.effortlessbuilding]] +# modId="flywheel" +# type="required" +# versionRange="[0.6.10,0.7)" +# ordering="AFTER" +# side="CLIENT" #[[accessTransformers]] # file="META-INF/accesstransformer.cfg" \ No newline at end of file diff --git a/src/main/resources/data/effortlessbuilding/recipes/diamond_randomizer_bag.json b/src/main/resources/data/effortlessbuilding/recipe/diamond_randomizer_bag.json similarity index 81% rename from src/main/resources/data/effortlessbuilding/recipes/diamond_randomizer_bag.json rename to src/main/resources/data/effortlessbuilding/recipe/diamond_randomizer_bag.json index 3caf55b..e1e419c 100644 --- a/src/main/resources/data/effortlessbuilding/recipes/diamond_randomizer_bag.json +++ b/src/main/resources/data/effortlessbuilding/recipe/diamond_randomizer_bag.json @@ -17,6 +17,7 @@ } }, "result": { - "item": "effortlessbuilding:diamond_randomizer_bag" + "count": 1, + "id": "effortlessbuilding:diamond_randomizer_bag" } } \ No newline at end of file diff --git a/src/main/resources/data/effortlessbuilding/recipes/golden_randomizer_bag.json b/src/main/resources/data/effortlessbuilding/recipe/golden_randomizer_bag.json similarity index 81% rename from src/main/resources/data/effortlessbuilding/recipes/golden_randomizer_bag.json rename to src/main/resources/data/effortlessbuilding/recipe/golden_randomizer_bag.json index d5f9676..5aa9fb5 100644 --- a/src/main/resources/data/effortlessbuilding/recipes/golden_randomizer_bag.json +++ b/src/main/resources/data/effortlessbuilding/recipe/golden_randomizer_bag.json @@ -17,6 +17,7 @@ } }, "result": { - "item": "effortlessbuilding:golden_randomizer_bag" + "count": 1, + "id": "effortlessbuilding:golden_randomizer_bag" } } \ No newline at end of file diff --git a/src/main/resources/data/effortlessbuilding/recipes/randomizer_bag.json b/src/main/resources/data/effortlessbuilding/recipe/randomizer_bag.json similarity index 79% rename from src/main/resources/data/effortlessbuilding/recipes/randomizer_bag.json rename to src/main/resources/data/effortlessbuilding/recipe/randomizer_bag.json index b43fc1d..bc242c5 100644 --- a/src/main/resources/data/effortlessbuilding/recipes/randomizer_bag.json +++ b/src/main/resources/data/effortlessbuilding/recipe/randomizer_bag.json @@ -14,6 +14,7 @@ } }, "result": { - "item": "effortlessbuilding:randomizer_bag" + "count": 1, + "id": "effortlessbuilding:randomizer_bag" } } \ No newline at end of file diff --git a/src/main/resources/data/effortlessbuilding/recipes/reach_upgrade1.json b/src/main/resources/data/effortlessbuilding/recipe/reach_upgrade1.json similarity index 80% rename from src/main/resources/data/effortlessbuilding/recipes/reach_upgrade1.json rename to src/main/resources/data/effortlessbuilding/recipe/reach_upgrade1.json index 42b39f5..c48cea3 100644 --- a/src/main/resources/data/effortlessbuilding/recipes/reach_upgrade1.json +++ b/src/main/resources/data/effortlessbuilding/recipe/reach_upgrade1.json @@ -14,6 +14,7 @@ } }, "result": { - "item": "effortlessbuilding:reach_upgrade1" + "count": 1, + "id": "effortlessbuilding:reach_upgrade1" } } \ No newline at end of file diff --git a/src/main/resources/data/effortlessbuilding/recipes/reach_upgrade2.json b/src/main/resources/data/effortlessbuilding/recipe/reach_upgrade2.json similarity index 80% rename from src/main/resources/data/effortlessbuilding/recipes/reach_upgrade2.json rename to src/main/resources/data/effortlessbuilding/recipe/reach_upgrade2.json index 201a030..e03ac6a 100644 --- a/src/main/resources/data/effortlessbuilding/recipes/reach_upgrade2.json +++ b/src/main/resources/data/effortlessbuilding/recipe/reach_upgrade2.json @@ -14,6 +14,7 @@ } }, "result": { - "item": "effortlessbuilding:reach_upgrade2" + "count": 1, + "id": "effortlessbuilding:reach_upgrade2" } } \ No newline at end of file diff --git a/src/main/resources/data/effortlessbuilding/recipes/reach_upgrade3.json b/src/main/resources/data/effortlessbuilding/recipe/reach_upgrade3.json similarity index 83% rename from src/main/resources/data/effortlessbuilding/recipes/reach_upgrade3.json rename to src/main/resources/data/effortlessbuilding/recipe/reach_upgrade3.json index 916fbe1..0dc91e0 100644 --- a/src/main/resources/data/effortlessbuilding/recipes/reach_upgrade3.json +++ b/src/main/resources/data/effortlessbuilding/recipe/reach_upgrade3.json @@ -17,6 +17,7 @@ } }, "result": { - "item": "effortlessbuilding:reach_upgrade3" + "count": 1, + "id": "effortlessbuilding:reach_upgrade3" } } \ No newline at end of file diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta index 53e3a7e..2602108 100644 --- a/src/main/resources/pack.mcmeta +++ b/src/main/resources/pack.mcmeta @@ -1,6 +1,6 @@ { "pack": { "description": "Effortless Building resources", - "pack_format": 15 + "pack_format": 34 } }