From 4de5f20a2455fac30e3aa0a5d158228324cb94c9 Mon Sep 17 00:00:00 2001 From: Corosauce Date: Sat, 30 Sep 2023 02:38:15 +0100 Subject: [PATCH] the updatening, very WIP --- build.gradle | 293 +++++++----------- gradle.properties | 65 +++- gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 61574 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 28 +- gradlew.bat | 15 +- libs/coroutil-1.20.1-1.2.45.jar | Bin 0 -> 55311 bytes settings.gradle | 13 + .../ParticleManagerExtended.java | 13 +- .../particle/ParticleRegistry.java | 2 +- .../behavior/ParticleBehaviorSandstorm.java | 5 +- .../particle/behavior/ParticleBehaviors.java | 7 +- .../particle/entity/EntityRotFX.java | 11 +- .../particle/entity/ParticleCrossSection.java | 8 +- .../particle/entity/ParticleCube.java | 8 +- .../entity/ParticleTexExtraRender.java | 13 +- .../particle/entity/ParticleTexLeafColor.java | 8 +- .../java/weather2/ClientWeatherProxy.java | 6 +- src/main/java/weather2/EventHandlerForge.java | 3 +- src/main/java/weather2/ServerTickHandler.java | 2 +- src/main/java/weather2/SoundRegistry.java | 1 + .../java/weather2/block/ForecastBlock.java | 5 +- .../java/weather2/client/SceneEnhancer.java | 74 ++--- .../client/entity/particle/ParticleHail.java | 3 +- .../LightningBoltWeatherNewRenderer.java | 2 +- .../shaders/ShaderInstanceExtended.java | 7 +- .../java/weather2/command/WeatherCommand.java | 59 ++-- .../weather2/data/WeatherRecipeProvider.java | 5 +- .../mixin/client/RenderParticlesOverride.java | 2 +- src/main/java/weather2/util/WeatherUtil.java | 8 +- .../java/weather2/util/WeatherUtilBlock.java | 19 +- .../java/weather2/util/WeatherUtilEntity.java | 12 +- .../weathersystem/WeatherManagerServer.java | 24 +- .../weathersystem/fog/FogAdjuster.java | 8 +- .../weathersystem/fog/FogProfile.java | 3 +- .../storm/LightningBoltWeather.java | 37 +-- .../storm/LightningBoltWeatherNew.java | 45 +-- .../weathersystem/storm/StormObject.java | 26 +- .../weathersystem/storm/TornadoHelper.java | 9 +- .../storm/WeatherObjectParticleStorm.java | 7 +- .../storm/WeatherObjectSandstormOld.java | 7 +- .../tornado/CubicBezierCurve.java | 2 +- .../weathersystem/tornado/TornadoFunnel.java | 27 +- .../tornado/TornadoManagerTodoRenameMe.java | 15 +- .../tornado/simple/TornadoFunnelSimple.java | 4 +- .../weathersystem/wind/WindManager.java | 3 +- .../resources/META-INF/accesstransformer.cfg | 4 +- src/main/resources/META-INF/mods.toml | 2 +- .../shaders/core/rendertype_clouds.fsh | 1 + 49 files changed, 479 insertions(+), 445 deletions(-) create mode 100644 libs/coroutil-1.20.1-1.2.45.jar create mode 100644 settings.gradle diff --git a/build.gradle b/build.gradle index 26621569..34b99ad8 100644 --- a/build.gradle +++ b/build.gradle @@ -1,104 +1,66 @@ -buildscript { - repositories { - maven { - url "https://cursemaven.com" - content { - includeGroup "curse.maven" - } - } - mavenCentral() - maven { - name = 'sponge' - url = 'https://repo.spongepowered.org/repository/maven-public/' - } - maven { - name = "sonatype" - url = "https://oss.sonatype.org/content/repositories/snapshots/" - } - maven { - name = 'parchment' - url = 'https://maven.parchmentmc.org' - } - maven { - name = 'forge' - url = 'https://files.minecraftforge.net/maven' - } - } - dependencies { - classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true - classpath "org.spongepowered:mixingradle:0.7-SNAPSHOT" - } -} - -repositories { - //JEI - maven { url 'https://dvs1.progwml6.com/files/maven' } - /*maven { - url = "https://maven.speiger.com/repository/main" - }*/ - //GT. - maven { url 'https://jitpack.io' } - - //Needed for intellij - maven { - name = 'sponge' - url = 'https://repo.spongepowered.org/repository/maven-public/' - } - maven { - url "https://www.cursemaven.com" - content { - includeGroup "curse.maven" - } - } +plugins { + id 'eclipse' + id 'idea' + id 'maven-publish' + id 'net.minecraftforge.gradle' version '[6.0,6.2)' } -apply plugin: 'net.minecraftforge.gradle' -// Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. -apply plugin: 'eclipse' -apply plugin: 'maven-publish' -apply plugin: 'org.spongepowered.mixin' - -ext.buildnumber = 0 -ext.projversion = 0 - -project.projversion = '1.18.2-2.7.5' -group = 'com.corosus.weather2' // http://maven.apache.org/guides/mini/guide-naming-conventions.html -archivesBaseName = 'weather2' +version = mod_version +group = mod_group_id -if (System.getenv('GITHUB_RUN_NUMBER')) { - project.buildnumber = System.getenv('GITHUB_RUN_NUMBER') - version = "${projversion}+${buildnumber}-gha" -} else { - version = "${projversion}" +base { + archivesName = mod_id } // Mojang ships Java 17 to end users in 1.18+, so your mod should target Java 17. java.toolchain.languageVersion = JavaLanguageVersion.of(17) -println('Java: ' + System.getProperty('java.version') + ' JVM: ' + System.getProperty('java.vm.version') + '(' + System.getProperty('java.vendor') + ') Arch: ' + System.getProperty('os.arch')) +println "Java: ${System.getProperty 'java.version'}, JVM: ${System.getProperty 'java.vm.version'} (${System.getProperty 'java.vendor'}), Arch: ${System.getProperty 'os.arch'}" minecraft { // The mappings can be changed at any time and must be in the following format. // Channel: Version: - // snapshot YYYYMMDD Snapshot are built nightly. - // stable # Stables are built at the discretion of the MCP team. - // official MCVersion Official field/method names from Mojang mapping files + // official MCVersion Official field/method names from Mojang mapping files + // parchment YYYY.MM.DD-MCVersion Open community-sourced parameter names and javadocs layered on top of official // - // You must be aware of the Mojang license when using the 'official' mappings. + // You must be aware of the Mojang license when using the 'official' or 'parchment' mappings. // See more information here: https://github.com/MinecraftForge/MCPConfig/blob/master/Mojang.md // + // Parchment is an unofficial project maintained by ParchmentMC, separate from MinecraftForge + // Additional setup is needed to use their mappings: https://parchmentmc.org/docs/getting-started + // // Use non-default mappings at your own risk. They may not always work. // Simply re-run your setup task after changing the mappings to update your workspace. - mappings channel: 'official', version: '1.18.1' - - // accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') // Currently, this location cannot be changed from the default. + mappings channel: mapping_channel, version: mapping_version + + // When true, this property will have all Eclipse/IntelliJ IDEA run configurations run the "prepareX" task for the given run configuration before launching the game. + // In most cases, it is not necessary to enable. + // enableEclipsePrepareRuns = true + // enableIdeaPrepareRuns = true + + // This property allows configuring Gradle's ProcessResources task(s) to run on IDE output locations before launching the game. + // It is REQUIRED to be set to true for this template to function. + // See https://docs.gradle.org/current/dsl/org.gradle.language.jvm.tasks.ProcessResources.html + copyIdeResources = true + + // When true, this property will add the folder name of all declared run configurations to generated IDE run configurations. + // The folder name can be set on a run configuration using the "folderName" property. + // By default, the folder name of a run configuration is the name of the Gradle project containing it. + // generateRunFolders = true + + // This property enables access transformers for use in development. + // They will be applied to the Minecraft artifact. + // The access transformer file can be anywhere in the project. + // However, it must be at "META-INF/accesstransformer.cfg" in the final mod jar to be loaded by Forge. + // This default location is a best practice to automatically put the file in the right place in the final jar. + // See https://docs.minecraftforge.net/en/latest/advanced/accesstransformers/ for more information. accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') // Default run configurations. // These can be tweaked, removed, or duplicated as needed. runs { - client { + // applies to all the run configs below + configureEach { workingDirectory project.file('run') - arg "-mixin.config=weather2.mixins.json" // Recommended logging data for a userdev environment // The markers can be added/remove as needed separated by commas. @@ -111,63 +73,37 @@ minecraft { // You can set various levels here. // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels property 'forge.logging.console.level', 'debug' - property 'mixin.env.remapRefMap', 'true' - property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" mods { - weather2 { + "${mod_id}" { source sourceSets.main } } } - server { - workingDirectory project.file('run') - arg "-mixin.config=weather2.mixins.json" - - // Recommended logging data for a userdev environment - // The markers can be added/remove as needed separated by commas. - // "SCAN": For mods scan. - // "REGISTRIES": For firing of registry events. - // "REGISTRYDUMP": For getting the contents of all registries. - property 'forge.logging.markers', 'REGISTRIES' + client { + // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. + property 'forge.enabledGameTestNamespaces', mod_id + } - // Recommended logging level for the console - // You can set various levels here. - // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels - property 'forge.logging.console.level', 'debug' - property 'mixin.env.remapRefMap', 'true' + server { + property 'forge.enabledGameTestNamespaces', mod_id + args '--nogui' + } - mods { - weather2 { - source sourceSets.main - } - } + // This run config launches GameTestServer and runs all registered gametests, then exits. + // By default, the server will crash when no gametests are provided. + // The gametest system is also enabled by default for other run configs under the /test command. + gameTestServer { + property 'forge.enabledGameTestNamespaces', mod_id } data { - workingDirectory project.file('run') - - // Recommended logging data for a userdev environment - // The markers can be added/remove as needed separated by commas. - // "SCAN": For mods scan. - // "REGISTRIES": For firing of registry events. - // "REGISTRYDUMP": For getting the contents of all registries. - property 'forge.logging.markers', 'REGISTRIES' - - // Recommended logging level for the console - // You can set various levels here. - // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels - property 'forge.logging.console.level', 'debug' + // example of overriding the workingDirectory set in configureEach above + workingDirectory project.file('run-data') // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. - args '--mod', 'weather2', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') - - mods { - weather2 { - source sourceSets.main - } - } + args '--mod', mod_id, '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') } } } @@ -175,85 +111,88 @@ minecraft { // Include resources generated by data generators. sourceSets.main.resources { srcDir 'src/generated/resources' } -apply plugin: 'org.spongepowered.mixin' - -mixin { - add sourceSets.main, 'weather2.refmap.json' - config 'weather2.mixins.json' -} - repositories { // Put repositories for dependencies here // ForgeGradle automatically adds the Forge maven and Maven Central for you - // If you have mod jar dependencies in ./libs, you can declare them as a repository like so: + // If you have mod jar dependencies in ./libs, you can declare them as a repository like so. + // See https://docs.gradle.org/current/userguide/declaring_repositories.html#sub:flat_dir_resolver flatDir { dir 'libs' } } dependencies { - // Specify the version of Minecraft to use. If this is any group other than 'net.minecraft', it is assumed - // that the dep is a ForgeGradle 'patcher' dependency, and its patches will be applied. - // The userdev artifact is a special name and will get all sorts of transformations applied to it. - //lt testing libs - //implementation fg.deobf('net.tropicraft:Tropicraft:9.3.0-beta+custom') - //implementation fg.deobf('com.tterrag.registrate:Registrate:MC1.18.2-1.1.3') - //def registrate = "com.tterrag.registrate:Registrate:MC${minecraft_version}-${registrate_version}" - //implementation fg.deobf(registrate) - //def ltlib = "com.lovetropics.lib:LTLib:1.2.0:release+9" - //implementation fg.deobf(ltlib) - - - implementation fg.deobf('com.corosus.coroutil:coroutil:1.18.2-1.2.45') - //implementation fg.deobf("com.lovetropics.minigames:LTWeather:0.0.1-alpha+custom") - //implementation fg.deobf("com.lovetropics.minigames:LTMinigames:0.1.0-alpha+custom") - //implementation fg.deobf("com.lovetropics.minigames:LTMinigames:0.1.0-alpha+639-gha") - //lazydfu-1.0-1.18+ - implementation fg.deobf("curse.maven:lazydfu-460819:3544496") - //minecraft 'net.minecraftforge:forge:1.18.1-39.0.5' - minecraft 'net.minecraftforge:forge:1.18.2-40.1.0' - //minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" - annotationProcessor 'org.spongepowered:mixin:0.8.5-SNAPSHOT:processor' - - // Real mod deobf dependency examples - these get remapped to your current mappings - // compileOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}:api") // Adds JEI API as a compile dependency - // runtimeOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}") // Adds the full JEI mod as a runtime dependency - // implementation fg.deobf("com.tterrag.registrate:Registrate:MC${mc_version}-${registrate_version}") // Adds registrate as a dependency - - // Examples using mod jars from ./libs + // Specify the version of Minecraft to use. + // Any artifact can be supplied so long as it has a "userdev" classifier artifact and is a compatible patcher artifact. + // The "userdev" classifier will be requested and setup by ForgeGradle. + // If the group id is "net.minecraft" and the artifact id is one of ["client", "server", "joined"], + // then special handling is done to allow a setup of a vanilla dependency without the use of an external repository. + minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}" + + implementation fg.deobf('com.corosus.coroutil:coroutil:1.20.1-1.2.45') + // Example mod dependency with JEI - using fg.deobf() ensures the dependency is remapped to your development mappings + // The JEI API is declared for compile time use, while the full JEI artifact is used at runtime + // compileOnly fg.deobf("mezz.jei:jei-${mc_version}-common-api:${jei_version}") + // compileOnly fg.deobf("mezz.jei:jei-${mc_version}-forge-api:${jei_version}") + // runtimeOnly fg.deobf("mezz.jei:jei-${mc_version}-forge:${jei_version}") + + // Example mod dependency using a mod jar from ./libs with a flat dir repository + // This maps to ./libs/coolmod-${mc_version}-${coolmod_version}.jar + // The group id is ignored when searching -- in this case, it is "blank" // implementation fg.deobf("blank:coolmod-${mc_version}:${coolmod_version}") - // For more info... + // For more info: // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html // http://www.gradle.org/docs/current/userguide/dependency_management.html } +// This block of code expands all declared replace properties in the specified resource targets. +// A missing property will result in an error. Properties are expanded using ${} Groovy notation. +// When "copyIdeResources" is enabled, this will also run before the game launches in IDE environments. +// See https://docs.gradle.org/current/dsl/org.gradle.language.jvm.tasks.ProcessResources.html +tasks.named('processResources', ProcessResources).configure { + var replaceProperties = [ + minecraft_version: minecraft_version, minecraft_version_range: minecraft_version_range, + forge_version: forge_version, forge_version_range: forge_version_range, + loader_version_range: loader_version_range, + mod_id: mod_id, mod_name: mod_name, mod_license: mod_license, mod_version: mod_version, + mod_authors: mod_authors, mod_description: mod_description, + ] + inputs.properties replaceProperties + + filesMatching(['META-INF/mods.toml', 'pack.mcmeta']) { + expand replaceProperties + [project: project] + } +} + // Example for how to get properties into the manifest for reading at runtime. -jar { +tasks.named('jar', Jar).configure { manifest { attributes([ - "Specification-Title" : "weather2", - "Specification-Vendor" : "corosus", - "Specification-Version" : "1", // We are version 1 of ourselves - "Implementation-Title" : project.name, - "Implementation-Version" : project.jar.archiveVersion, - "Implementation-Vendor" : "examplemodsareus", - "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"), - 'MixinConfigs': 'weather2.mixins.json' + 'Specification-Title' : mod_id, + 'Specification-Vendor' : mod_authors, + 'Specification-Version' : '1', // We are version 1 of ourselves + 'Implementation-Title' : project.name, + 'Implementation-Version' : project.jar.archiveVersion, + 'Implementation-Vendor' : mod_authors, + 'Implementation-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") ]) } + + // This is the preferred method to reobfuscate your jar file + finalizedBy 'reobfJar' } -// Example configuration to allow publishing using the maven-publish plugin -// This is the preferred method to reobfuscate your jar file -jar.finalizedBy('reobfJar') -// However if you are in a multi-project build, dev time needs unobfed jar files, so you can delay the obfuscation until publishing by doing -// publish.dependsOn('reobfJar') +// However if you are in a multi-project build, dev time needs unobfed jar files, so you can delay the obfuscation until publishing by doing: +// tasks.named('publish').configure { +// dependsOn 'reobfJar' +// } +// Example configuration to allow publishing using the maven-publish plugin publishing { publications { - mavenJava(MavenPublication) { + register('mavenJava', MavenPublication) { artifact jar } } @@ -263,3 +202,7 @@ publishing { } } } + +tasks.withType(JavaCompile).configureEach { + options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation +} diff --git a/gradle.properties b/gradle.properties index f52f709b..8d97ba52 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,12 +1,59 @@ -mod_version=0.1.0 -#release_type=alpha -minecraft_version=1.18.2 -forge_version=40.1.0 - -registrate_version=1.1.3 -ltlib_version=1.2.0-release+2 - # Sets default memory used for gradle commands. Can be overridden by user or command line properties. # This is required to provide enough memory for the Minecraft decompilation process. org.gradle.jvmargs=-Xmx3G -org.gradle.daemon=false \ No newline at end of file +org.gradle.daemon=false + + +## Environment Properties + +# The Minecraft version must agree with the Forge version to get a valid artifact +minecraft_version=1.20.1 +# The Minecraft version range can use any release version of Minecraft as bounds. +# Snapshots, pre-releases, and release candidates are not guaranteed to sort properly +# as they do not follow standard versioning conventions. +minecraft_version_range=[1.20.1,1.21) +# The Forge version must agree with the Minecraft version to get a valid artifact +forge_version=47.1.0 +# The Forge version range can use any version of Forge as bounds or match the loader version range +forge_version_range=[47,) +# The loader version range can only use the major version of Forge/FML as bounds +loader_version_range=[47,) +# The mapping channel to use for mappings. +# The default set of supported mapping channels are ["official", "snapshot", "snapshot_nodoc", "stable", "stable_nodoc"]. +# Additional mapping channels can be registered through the "channelProviders" extension in a Gradle plugin. +# +# | Channel | Version | | +# |-----------|----------------------|--------------------------------------------------------------------------------| +# | official | MCVersion | Official field/method names from Mojang mapping files | +# | parchment | YYYY.MM.DD-MCVersion | Open community-sourced parameter names and javadocs layered on top of official | +# +# You must be aware of the Mojang license when using the 'official' or 'parchment' mappings. +# See more information here: https://github.com/MinecraftForge/MCPConfig/blob/master/Mojang.md +# +# Parchment is an unofficial project maintained by ParchmentMC, separate from Minecraft Forge. +# Additional setup is needed to use their mappings, see https://parchmentmc.org/docs/getting-started +mapping_channel=official +# The mapping version to query from the mapping channel. +# This must match the format required by the mapping channel. +mapping_version=1.20.1 + + +## Mod Properties + +# The unique mod identifier for the mod. Must be lowercase in English locale. Must fit the regex [a-z][a-z0-9_]{1,63} +# Must match the String constant located in the main mod class annotated with @Mod. +mod_id=examplemod +# The human-readable display name for the mod. +mod_name=Example Mod +# The license of the mod. Review your options at https://choosealicense.com/. All Rights Reserved is the default. +mod_license=All Rights Reserved +# The mod version. See https://semver.org/ +mod_version=1.0.0 +# The group ID for the mod. It is only important when publishing as an artifact to a Maven repository. +# This should match the base package used for the mod sources. +# See https://maven.apache.org/guides/mini/guide-naming-conventions.html +mod_group_id=com.example.examplemod +# The authors of the mod. This is a simple text string that is used for display purposes in the mod list. +mod_authors=YourNameHere, OtherNameHere +# The description of the mod. This is a simple multiline text string that is used for display purposes in the mod list. +mod_description=Example mod description.\nNewline characters can be used and will be replaced properly. \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..943f0cbfa754578e88a3dae77fce6e3dea56edbf 100644 GIT binary patch delta 36900 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

yHlr~Qj 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 GTKgBj+ffbx diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e750102e..37aef8d3 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index c53aefaa..65dcd68d 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -32,10 +32,10 @@ # Busybox and similar reduced shells will NOT work, because this script # requires all of these POSIX shell features: # * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». # # Important for patching: # @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,10 +80,10 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' @@ -143,12 +143,16 @@ fi if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -205,6 +209,12 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/gradlew.bat b/gradlew.bat index 107acd32..93e3f59f 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/libs/coroutil-1.20.1-1.2.45.jar b/libs/coroutil-1.20.1-1.2.45.jar new file mode 100644 index 0000000000000000000000000000000000000000..fa85fcb7b8fb87eb77eafec2880db87fdce46d0c GIT binary patch literal 55311 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 void register(ParticleType p_107382_, ParticleProvider p_107383_) { - this.providers.put(Registry.PARTICLE_TYPE.getKey(p_107382_), p_107383_); + this.providers.put(BuiltInRegistries.PARTICLE_TYPE.getKey(p_107382_), p_107383_); } public void register(ParticleType p_107379_, ParticleManagerExtended.SpriteParticleRegistration p_107380_) { ParticleManagerExtended.MutableSpriteSet particleengine$mutablespriteset = new ParticleManagerExtended.MutableSpriteSet(); - this.spriteSets.put(Registry.PARTICLE_TYPE.getKey(p_107379_), particleengine$mutablespriteset); - this.providers.put(Registry.PARTICLE_TYPE.getKey(p_107379_), p_107380_.create(particleengine$mutablespriteset)); + this.spriteSets.put(BuiltInRegistries.PARTICLE_TYPE.getKey(p_107379_), particleengine$mutablespriteset); + this.providers.put(BuiltInRegistries.PARTICLE_TYPE.getKey(p_107379_), p_107380_.create(particleengine$mutablespriteset)); } public CompletableFuture reload(PreparationBarrier p_107305_, ResourceManager p_107306_, ProfilerFiller p_107307_, ProfilerFiller p_107308_, Executor p_107309_, Executor p_107310_) { Map> map = Maps.newConcurrentMap(); - CompletableFuture[] completablefuture = Registry.PARTICLE_TYPE.keySet().stream().map((p_107315_) -> { + CompletableFuture[] completablefuture = BuiltInRegistries.PARTICLE_TYPE.keySet().stream().map((p_107315_) -> { return CompletableFuture.runAsync(() -> { this.loadParticleDescription(p_107306_, p_107315_, map); }, p_107309_); @@ -199,7 +200,7 @@ public Particle createParticle(ParticleOptions p_107371_, double p_107372_, doub @Nullable private Particle makeParticle(T p_107396_, double p_107397_, double p_107398_, double p_107399_, double p_107400_, double p_107401_, double p_107402_) { - ParticleProvider particleprovider = (ParticleProvider)this.providers.get(Registry.PARTICLE_TYPE.getKey(p_107396_.getType())); + ParticleProvider particleprovider = (ParticleProvider)this.providers.get(BuiltInRegistries.PARTICLE_TYPE.getKey(p_107396_.getType())); return particleprovider == null ? null : particleprovider.createParticle(p_107396_, this.level, p_107397_, p_107398_, p_107399_, p_107400_, p_107401_, p_107402_); } diff --git a/src/main/java/extendedrenderer/particle/ParticleRegistry.java b/src/main/java/extendedrenderer/particle/ParticleRegistry.java index cbcd5952..1d41d537 100644 --- a/src/main/java/extendedrenderer/particle/ParticleRegistry.java +++ b/src/main/java/extendedrenderer/particle/ParticleRegistry.java @@ -61,7 +61,7 @@ public class ParticleRegistry { @SubscribeEvent @OnlyIn(Dist.CLIENT) - public static void registerParticles(TextureStitchEvent.Pre event) { + public static void registerParticles(TextureStitchEvent. event) { /** * avoid stitching to all maps diff --git a/src/main/java/extendedrenderer/particle/behavior/ParticleBehaviorSandstorm.java b/src/main/java/extendedrenderer/particle/behavior/ParticleBehaviorSandstorm.java index 548cc7c0..9398ccc4 100644 --- a/src/main/java/extendedrenderer/particle/behavior/ParticleBehaviorSandstorm.java +++ b/src/main/java/extendedrenderer/particle/behavior/ParticleBehaviorSandstorm.java @@ -1,5 +1,6 @@ package extendedrenderer.particle.behavior; +import com.corosus.coroutil.util.CoroUtilBlock; import extendedrenderer.particle.entity.EntityRotFX; import net.minecraft.client.Minecraft; import net.minecraft.util.Mth; @@ -125,7 +126,7 @@ public void tickUpdateAct(EntityRotFX particle) { }*/ //get pos a bit under particle - BlockPos pos = new BlockPos(particle.getPosX(), particle.getPosY() - particle.aboveGroundHeight, particle.getPosZ()); + BlockPos pos = CoroUtilBlock.blockPos(particle.getPosX(), particle.getPosY() - particle.aboveGroundHeight, particle.getPosZ()); BlockState state = particle.getWorld().getBlockState(pos); //if particle is near ground, push it up to keep from landing if (!state.isAir()) { @@ -135,7 +136,7 @@ public void tickUpdateAct(EntityRotFX particle) { //check ahead for better flowing over large cliffs } else { double aheadMultiplier = 20D; - BlockPos posAhead = new BlockPos(particle.getPosX() + (particle.getMotionX() * aheadMultiplier), particle.getPosY() - particle.aboveGroundHeight, particle.getPosZ() + (particle.getMotionZ() * aheadMultiplier)); + BlockPos posAhead = CoroUtilBlock.blockPos((particle.getPosX() + (particle.getMotionX() * aheadMultiplier)), particle.getPosY() - particle.aboveGroundHeight, particle.getPosZ() + (particle.getMotionZ() * aheadMultiplier)); BlockState stateAhead = particle.getWorld().getBlockState(posAhead); if (!stateAhead.isAir()) { if (particle.getMotionY() < particle.bounceSpeedMaxAhead) { diff --git a/src/main/java/extendedrenderer/particle/behavior/ParticleBehaviors.java b/src/main/java/extendedrenderer/particle/behavior/ParticleBehaviors.java index 8633cc96..6e1d9a94 100644 --- a/src/main/java/extendedrenderer/particle/behavior/ParticleBehaviors.java +++ b/src/main/java/extendedrenderer/particle/behavior/ParticleBehaviors.java @@ -4,6 +4,7 @@ import java.util.List; import java.util.Random; +import com.corosus.coroutil.util.CoroUtilBlock; import extendedrenderer.particle.entity.EntityRotFX; import extendedrenderer.particle.entity.ParticleTexExtraRender; import extendedrenderer.particle.entity.ParticleTexFX; @@ -226,7 +227,7 @@ public void initParticleRain(EntityRotFX particle, int extraRenderCount) { particle.setMotionY(-0.5D); ClientTickHandler.getClientWeather().getWindManager().applyWindForceNew(particle, 10F, 0.5F); Player entP = Minecraft.getInstance().player; - Biome biome = entP.level.m_204166_(new BlockPos(Mth.floor(entP.getX()), entP.getY(), Mth.floor(entP.getZ()))).m_203334_(); + Biome biome = entP.level().getBiome(new BlockPos(Mth.floor(entP.getX()), (int)Math.floor(entP.getY()), Mth.floor(entP.getZ()))).value(); if (ClientWeatherProxy.get().getPrecipitationType(biome) == PrecipitationType.ACID) { particle.rCol = acidRainRed; particle.gCol = acidRainGreen; @@ -262,7 +263,7 @@ public void initParticleGroundSplash(EntityRotFX particle) { particle.setMotionZ((rand.nextFloat() - 0.5F) * 0.01F); //ClientTickHandler.getClientWeather().getWindManager().applyWindForceNew(particle, 1F / 5F, 0.5F); Player entP = Minecraft.getInstance().player; - Biome biome = entP.level.m_204166_(new BlockPos(Mth.floor(entP.getX()), entP.getY(), Mth.floor(entP.getZ()))).m_203334_(); + Biome biome = entP.level().getBiome(new BlockPos(Mth.floor(entP.getX()), Mth.floor(entP.getY()), Mth.floor(entP.getZ()))).value(); if (ClientWeatherProxy.get().getPrecipitationType(biome) == PrecipitationType.ACID) { particle.rCol = acidRainRed; particle.gCol = acidRainGreen; @@ -298,7 +299,7 @@ public void initParticleRainDownfall(EntityRotFX particle) { particle.setMotionX((rand.nextFloat() - 0.5F) * 0.01F); particle.setMotionZ((rand.nextFloat() - 0.5F) * 0.01F); Player entP = Minecraft.getInstance().player; - Biome biome = entP.level.m_204166_(new BlockPos(Mth.floor(entP.getX()), entP.getY(), Mth.floor(entP.getZ()))).m_203334_(); + Biome biome = entP.level().getBiome(CoroUtilBlock.blockPos(entP.getX(), entP.getY(), entP.getZ())).get(); if (ClientWeatherProxy.get().getPrecipitationType(biome) == PrecipitationType.ACID) { particle.rCol = acidRainRed; particle.gCol = acidRainGreen; diff --git a/src/main/java/extendedrenderer/particle/entity/EntityRotFX.java b/src/main/java/extendedrenderer/particle/entity/EntityRotFX.java index 52b048df..d091a935 100644 --- a/src/main/java/extendedrenderer/particle/entity/EntityRotFX.java +++ b/src/main/java/extendedrenderer/particle/entity/EntityRotFX.java @@ -1,5 +1,6 @@ package extendedrenderer.particle.entity; +import com.corosus.coroutil.util.CoroUtilBlock; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; import extendedrenderer.particle.behavior.ParticleBehaviors; @@ -15,14 +16,14 @@ import net.minecraft.world.entity.Entity; import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; -import com.mojang.math.Quaternion; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; -import com.mojang.math.Vector3f; import net.minecraft.world.level.Level; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import org.joml.Quaternionf; +import org.joml.Vector3f; import weather2.ClientTickHandler; import weather2.IWindHandler; import weather2.weathersystem.WeatherManagerClient; @@ -305,7 +306,7 @@ public void tick() { } - BlockPos pos = new BlockPos(new BlockPos(this.x, this.y, this.z)); + BlockPos pos = CoroUtilBlock.blockPos(this.x, this.y, this.z); if (killWhenUnderTopmostBlock) { @@ -624,12 +625,12 @@ public void render(VertexConsumer buffer, Camera renderInfo, float partialTicks) float f = (float)(Mth.lerp(partialTicks, this.xo, this.x) + pivotedPosition.x - Vector3d.x()); float f1 = (float)(Mth.lerp(partialTicks, this.yo, this.y) + pivotedPosition.y - Vector3d.y()); float f2 = (float)(Mth.lerp(partialTicks, this.zo, this.z) + pivotedPosition.z - Vector3d.z()); - Quaternion quaternion; + Quaternionf quaternion; if (this.facePlayer || (this.rotationPitch == 0 && this.rotationYaw == 0)) { quaternion = renderInfo.rotation(); } else { // override rotations - quaternion = new Quaternion(0, 0, 0, 1); + quaternion = new Quaternionf(0, 0, 0, 1); if (facePlayerYaw) { quaternion.mul(Vector3f.YP.rotationDegrees(-renderInfo.getYRot())); } else { diff --git a/src/main/java/extendedrenderer/particle/entity/ParticleCrossSection.java b/src/main/java/extendedrenderer/particle/entity/ParticleCrossSection.java index 7eaba3b1..6bf7d33f 100644 --- a/src/main/java/extendedrenderer/particle/entity/ParticleCrossSection.java +++ b/src/main/java/extendedrenderer/particle/entity/ParticleCrossSection.java @@ -5,10 +5,10 @@ import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.util.Mth; -import com.mojang.math.Quaternion; import net.minecraft.world.phys.Vec3; -import com.mojang.math.Vector3f; import net.minecraft.world.level.Level; +import org.joml.Quaternionf; +import org.joml.Vector3f; public class ParticleCrossSection extends ParticleTexFX { @@ -25,12 +25,12 @@ public void render(VertexConsumer buffer, Camera renderInfo, float partialTicks) float f = (float)(Mth.lerp(partialTicks, this.xo, this.x) - Vector3d.x()); float f1 = (float)(Mth.lerp(partialTicks, this.yo, this.y) - Vector3d.y()); float f2 = (float)(Mth.lerp(partialTicks, this.zo, this.z) - Vector3d.z()); - Quaternion quaternion; + Quaternionf quaternion; if (this.facePlayer || (this.rotationPitch == 0 && this.rotationYaw == 0)) { quaternion = renderInfo.rotation(); } else { // override rotations - quaternion = new Quaternion(0, 0, 0, 1); + quaternion = new Quaternionf(0, 0, 0, 1); if (facePlayerYaw) { quaternion.mul(Vector3f.YP.rotationDegrees(-renderInfo.getYRot())); } else { diff --git a/src/main/java/extendedrenderer/particle/entity/ParticleCube.java b/src/main/java/extendedrenderer/particle/entity/ParticleCube.java index 557462e3..6651c222 100644 --- a/src/main/java/extendedrenderer/particle/entity/ParticleCube.java +++ b/src/main/java/extendedrenderer/particle/entity/ParticleCube.java @@ -2,8 +2,6 @@ import com.corosus.coroutil.util.CULog; import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.math.Quaternion; -import com.mojang.math.Vector3f; import extendedrenderer.particle.ParticleRegistry; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; @@ -20,6 +18,8 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; +import org.joml.Quaternionf; +import org.joml.Vector3f; import java.util.ArrayList; import java.util.List; @@ -72,12 +72,12 @@ public void render(VertexConsumer buffer, Camera renderInfo, float partialTicks) float f = (float)(Mth.lerp(partialTicks, this.xo, this.x) - Vector3d.x()); float f1 = (float)(Mth.lerp(partialTicks, this.yo, this.y) - Vector3d.y()); float f2 = (float)(Mth.lerp(partialTicks, this.zo, this.z) - Vector3d.z()); - Quaternion quaternion; + Quaternionf quaternion; if (this.facePlayer || (this.rotationPitch == 0 && this.rotationYaw == 0)) { quaternion = renderInfo.rotation(); } else { // override rotations - quaternion = new Quaternion(0, 0, 0, 1); + quaternion = new Quaternionf(0, 0, 0, 1); if (facePlayerYaw) { quaternion.mul(Vector3f.YP.rotationDegrees(-renderInfo.getYRot())); } else { diff --git a/src/main/java/extendedrenderer/particle/entity/ParticleTexExtraRender.java b/src/main/java/extendedrenderer/particle/entity/ParticleTexExtraRender.java index 358ad184..6b3aa99f 100644 --- a/src/main/java/extendedrenderer/particle/entity/ParticleTexExtraRender.java +++ b/src/main/java/extendedrenderer/particle/entity/ParticleTexExtraRender.java @@ -1,5 +1,6 @@ package extendedrenderer.particle.entity; +import com.corosus.coroutil.util.CoroUtilBlock; import com.corosus.coroutil.util.CoroUtilParticle; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.Camera; @@ -7,10 +8,10 @@ import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; -import com.mojang.math.Quaternion; import net.minecraft.world.phys.Vec3; -import com.mojang.math.Vector3f; import net.minecraft.world.level.levelgen.Heightmap; +import org.joml.Quaternionf; +import org.joml.Vector3f; import weather2.ClientTickHandler; import weather2.weathersystem.WeatherManagerClient; import weather2.weathersystem.wind.WindManager; @@ -80,12 +81,12 @@ public void tickExtraRotations() { public void render(VertexConsumer buffer, Camera renderInfo, float partialTicks) { //override rotations Vec3 Vector3d = renderInfo.getPosition(); - Quaternion quaternion; + Quaternionf quaternion; if (this.facePlayer || (this.rotationPitch == 0 && this.rotationYaw == 0)) { quaternion = renderInfo.rotation(); } else { // override rotations - quaternion = new Quaternion(0, 0, 0, 1); + quaternion = new Quaternionf(0, 0, 0, 1); quaternion.mul(Vector3f.YP.rotationDegrees(this.rotationYaw)); quaternion.mul(Vector3f.XP.rotationDegrees(this.rotationPitch)); if (extraRandomSecondaryYawRotation > 0) { @@ -109,7 +110,7 @@ public void render(VertexConsumer buffer, Camera renderInfo, float partialTicks) float offset = 0; float posBottom = (float)(this.y - 10D); - float height = level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, new BlockPos(this.x, this.y, this.z)).getY(); + float height = level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, CoroUtilBlock.blockPos(this.x, this.y, this.z)).getY(); if (posBottom < height) { float diff = height - posBottom; @@ -141,7 +142,7 @@ public void render(VertexConsumer buffer, Camera renderInfo, float partialTicks) //prevent precip under overhangs/inside for extra render if (this.isDontRenderUnderTopmostBlock()) { - int height2 = level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, new BlockPos(this.x + xx, this.y, this.z + zz)).getY(); + int height2 = level.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, CoroUtilBlock.blockPos(this.x + xx, this.y, this.z + zz)).getY(); if (this.y + yy < height2) continue; } diff --git a/src/main/java/extendedrenderer/particle/entity/ParticleTexLeafColor.java b/src/main/java/extendedrenderer/particle/entity/ParticleTexLeafColor.java index a1b392ee..5c8ccb48 100644 --- a/src/main/java/extendedrenderer/particle/entity/ParticleTexLeafColor.java +++ b/src/main/java/extendedrenderer/particle/entity/ParticleTexLeafColor.java @@ -1,20 +1,14 @@ package extendedrenderer.particle.entity; import com.corosus.coroutil.util.CoroUtilColor; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.color.block.BlockColors; -import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; -import net.minecraftforge.fml.util.ObfuscationReflectionHelper; -import net.minecraftforge.registries.IRegistryDelegate; import org.apache.commons.lang3.ArrayUtils; -import java.lang.reflect.Field; -import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public class ParticleTexLeafColor extends ParticleTexFX { @@ -50,7 +44,7 @@ public ParticleTexLeafColor(ClientLevel worldIn, double posXIn, double posYIn, }*/ } - BlockPos pos = new BlockPos(posXIn, posYIn, posZIn); + BlockPos pos = new BlockPos((int)Math.floor(posXIn), (int)Math.floor(posYIn), (int)Math.floor(posZIn)); BlockState state = worldIn.getBlockState(pos); // top of double plants doesn't have variant property diff --git a/src/main/java/weather2/ClientWeatherProxy.java b/src/main/java/weather2/ClientWeatherProxy.java index c27e1c6b..537bc102 100644 --- a/src/main/java/weather2/ClientWeatherProxy.java +++ b/src/main/java/weather2/ClientWeatherProxy.java @@ -80,7 +80,7 @@ public boolean isSandstorm() { Minecraft client = Minecraft.getInstance(); Player player = client.player; if (player == null) return false; - if (player.level.getGameTime() % cacheRate == 0) { + if (player.level().getGameTime() % cacheRate == 0) { Vec3 posPlayer = new Vec3(client.player.getX(), 0, client.player.getZ()); WeatherObjectParticleStorm storm = ClientTickHandler.weatherManager.getClosestParticleStormByIntensity(posPlayer, WeatherObjectParticleStorm.StormType.SANDSTORM); cacheIsSandstorm = storm != null && posPlayer.distanceTo(storm.pos) < storm.getSize(); @@ -97,7 +97,7 @@ public boolean isSnowstorm() { Minecraft client = Minecraft.getInstance(); Player player = client.player; if (player == null) return false; - if (player.level.getGameTime() % cacheRate == 0) { + if (player.level().getGameTime() % cacheRate == 0) { Vec3 posPlayer = new Vec3(client.player.getX(), 0, client.player.getZ()); WeatherObjectParticleStorm storm = ClientTickHandler.weatherManager.getClosestParticleStormByIntensity(posPlayer, WeatherObjectParticleStorm.StormType.SNOWSTORM); cacheIsSnowstorm = storm != null && posPlayer.distanceTo(storm.pos) < storm.getSize(); @@ -110,7 +110,7 @@ public boolean isHail() { Minecraft client = Minecraft.getInstance(); Player player = client.player; if (player == null) return false; - if (player.level.getGameTime() % cacheRate == 0) { + if (player.level().getGameTime() % cacheRate == 0) { Vec3 posPlayer = new Vec3(client.player.getX(), 0, client.player.getZ()); double maxStormDist = 512 / 4 * 3; StormObject storm = ClientTickHandler.weatherManager.getClosestStorm(posPlayer, maxStormDist, StormObject.STATE_HAIL, StormObject.STATE_HAIL, false); diff --git a/src/main/java/weather2/EventHandlerForge.java b/src/main/java/weather2/EventHandlerForge.java index db96ae1d..f2af238d 100644 --- a/src/main/java/weather2/EventHandlerForge.java +++ b/src/main/java/weather2/EventHandlerForge.java @@ -13,6 +13,7 @@ import net.minecraftforge.client.event.EntityViewRenderEvent.FogColors; import net.minecraftforge.client.event.EntityViewRenderEvent.RenderFogEvent; import net.minecraftforge.client.event.RenderLevelLastEvent; +import net.minecraftforge.client.event.ViewportEvent; import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.entity.living.LivingEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -35,7 +36,7 @@ public void worldRender(RenderLevelLastEvent event) @SubscribeEvent @OnlyIn(Dist.CLIENT) - public void onFogColors(FogColors event) { + public void onFogColors(ViewportEvent.ComputeFogColor event) { SceneEnhancer.getFogAdjuster().onFogColors(event); } diff --git a/src/main/java/weather2/ServerTickHandler.java b/src/main/java/weather2/ServerTickHandler.java index 3309f47a..c97146e6 100644 --- a/src/main/java/weather2/ServerTickHandler.java +++ b/src/main/java/weather2/ServerTickHandler.java @@ -133,7 +133,7 @@ public static WeatherManagerServer getWeatherManagerFor(ResourceKey dimen } public static void playerClientRequestsFullSync(ServerPlayer entP) { - WeatherManagerServer wm = MANAGERS.get(entP.level.dimension()); + WeatherManagerServer wm = MANAGERS.get(entP.level().dimension()); if (wm != null) { wm.playerJoinedWorldSyncFull(entP); } diff --git a/src/main/java/weather2/SoundRegistry.java b/src/main/java/weather2/SoundRegistry.java index 51be92f2..f8ed54e1 100644 --- a/src/main/java/weather2/SoundRegistry.java +++ b/src/main/java/weather2/SoundRegistry.java @@ -61,6 +61,7 @@ public static void init() { public static void register(String soundPath) { ResourceLocation resLoc = new ResourceLocation(Weather.MODID, soundPath); SoundEvent event = new SoundEvent(resLoc).setRegistryName(resLoc); + //TODO: WIP SoundEvent event = SoundEvent.createVariableRangeEvent(resLoc).setRegistryName(resLoc); ForgeRegistries.SOUND_EVENTS.register(event); if (lookupStringToEvent.containsKey(soundPath)) { System.out.println("WEATHER SOUNDS WARNING: duplicate sound registration for " + soundPath); diff --git a/src/main/java/weather2/block/ForecastBlock.java b/src/main/java/weather2/block/ForecastBlock.java index e5b06046..544a1fb0 100644 --- a/src/main/java/weather2/block/ForecastBlock.java +++ b/src/main/java/weather2/block/ForecastBlock.java @@ -1,6 +1,7 @@ package weather2.block; import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; @@ -35,10 +36,10 @@ public RenderShape getRenderShape(BlockState p_49232_) { public InteractionResult use(BlockState p_60503_, Level p_60504_, BlockPos p_60505_, Player p_60506_, InteractionHand p_60507_, BlockHitResult p_60508_) { if (!p_60504_.isClientSide) { - WeatherManagerServer wm = ServerTickHandler.getWeatherManagerFor(p_60506_.getLevel().dimension()); + WeatherManagerServer wm = ServerTickHandler.getWeatherManagerFor(p_60506_.level().dimension()); float chance = wm.getBiomeBasedStormSpawnChanceInArea(new BlockPos(p_60506_.blockPosition())); - p_60506_.sendMessage(new TextComponent(String.format("Likelyhood of storms to spawn here within 1024 blocks: %.2f", (chance * 100F)) + "%"), p_60506_.getUUID()); + p_60506_.sendMessage(Component.literal(String.format("Likelyhood of storms to spawn here within 1024 blocks: %.2f", (chance * 100F)) + "%"), p_60506_.getUUID()); } return InteractionResult.CONSUME; diff --git a/src/main/java/weather2/client/SceneEnhancer.java b/src/main/java/weather2/client/SceneEnhancer.java index 4e2c113f..db829d0e 100644 --- a/src/main/java/weather2/client/SceneEnhancer.java +++ b/src/main/java/weather2/client/SceneEnhancer.java @@ -304,8 +304,8 @@ public void tickRainSound() { Player player = Minecraft.getInstance().player; float precipitationStrength = ClientWeatherHelper.get().getPrecipitationStrength(player); - if (!(precipitationStrength <= 0.0F) && !shouldSnowHere(player.level, player.level.m_204166_(player.blockPosition()).m_203334_(), player.blockPosition())) { - Random random = new Random(player.getLevel().getGameTime() * 312987231L); + if (!(precipitationStrength <= 0.0F) && !shouldSnowHere(player.level(), player.level().getBiome(player.blockPosition()).get(), player.blockPosition())) { + Random random = new Random(player.level().getGameTime() * 312987231L); LevelReader levelreader = minecraft.level; BlockPos blockpos = player.blockPosition(); BlockPos blockpos1 = null; @@ -315,8 +315,8 @@ public void tickRainSound() { int k = random.nextInt(21) - 10; int l = random.nextInt(21) - 10; BlockPos blockpos2 = levelreader.getHeightmapPos(Heightmap.Types.MOTION_BLOCKING, blockpos.offset(k, 0, l)); - Biome biome = levelreader.m_204166_(blockpos2).m_203334_(); - if (blockpos2.getY() > levelreader.getMinBuildHeight() && blockpos2.getY() <= blockpos.getY() + 10 && blockpos2.getY() >= blockpos.getY() - 10 && biome.getPrecipitation() == Biome.Precipitation.RAIN && biome.warmEnoughToRain(blockpos2)) { + Biome biome = levelreader.getBiome(blockpos2).get(); + if (blockpos2.getY() > levelreader.getMinBuildHeight() && blockpos2.getY() <= blockpos.getY() + 10 && blockpos2.getY() >= blockpos.getY() - 10 && biome.getPrecipitationAt(blockpos2) == Biome.Precipitation.RAIN && biome.warmEnoughToRain(blockpos2)) { blockpos1 = blockpos2.below(); if (minecraft.options.particles == ParticleStatus.MINIMAL) { break; @@ -330,7 +330,7 @@ public void tickRainSound() { double d2 = voxelshape.max(Direction.Axis.Y, d0, d1); double d3 = (double)fluidstate.getHeight(levelreader, blockpos1); double d4 = Math.max(d2, d3); - ParticleOptions particleoptions = !fluidstate.m_205070_(FluidTags.LAVA) && !blockstate.is(Blocks.MAGMA_BLOCK) && !CampfireBlock.isLitCampfire(blockstate) ? ParticleTypes.RAIN : ParticleTypes.SMOKE; + ParticleOptions particleoptions = !fluidstate.is(FluidTags.LAVA) && !blockstate.is(Blocks.MAGMA_BLOCK) && !CampfireBlock.isLitCampfire(blockstate) ? ParticleTypes.RAIN : ParticleTypes.SMOKE; minecraft.level.addParticle(particleoptions, (double)blockpos1.getX() + d0, (double)blockpos1.getY() + d4, (double)blockpos1.getZ() + d1, 0.0D, 0.0D, 0.0D); } } @@ -492,12 +492,12 @@ public void tickEnvironmentalParticleSpawning() { float maxPrecip = 1F; - BlockPos posPlayer = new BlockPos(Mth.floor(entP.getX()), entP.getY(), Mth.floor(entP.getZ())); - Biome biome = entP.level.m_204166_(posPlayer).m_203334_(); + BlockPos posPlayer = CoroUtilBlock.blockPos(entP.getX(), entP.getY(), entP.getZ()); + Biome biome = entP.level().getBiome(posPlayer).get(); lastBiomeIn = biome; - Level world = entP.level; - Random rand = entP.level.random; + Level world = entP.level(); + Random rand = CoroUtilMisc.random(); //funnel.tickGame(); @@ -599,7 +599,7 @@ public void tickEnvironmentalParticleSpawning() { //isRain_DownfallSheet = false; - if (entP.getLevel().getGameTime() % 40 == 0) { + if (entP.level().getGameTime() % 40 == 0) { if (ConfigCoroUtil.useLoggingDebug) { System.out.printf("curPrecipVal: %.2f", curPrecipVal); System.out.println(""); @@ -611,27 +611,27 @@ public void tickEnvironmentalParticleSpawning() { } //check rules same way vanilla texture precip does - if (biome != null && (biome.getPrecipitation() != Biome.Precipitation.NONE)) { + if (biome != null && (biome.getPrecipitationAt(posPlayer) != Biome.Precipitation.NONE)) { if (curPrecipVal > 0) { if (isRain) { spawnCount = 0; int spawnAreaSize = 30; int spawnNeed = (int) (spawnNeedBase * 300); - if (entP.getLevel().getGameTime() % 40 == 0) { + if (entP.level().getGameTime() % 40 == 0) { CULog.dbg("rain spawnNeed: " + spawnNeed); } if (isRain_WaterParticle && spawnNeed > 0) { for (int i = 0; i < safetyCutout; i++) { - BlockPos pos = new BlockPos( + BlockPos pos = CoroUtilBlock.blockPos( entP.getX() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2), entP.getY() - 5 + rand.nextInt(25), entP.getZ() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2)); if (canPrecipitateAt(world, pos)) { - ParticleTexExtraRender rain = new ParticleTexExtraRender((ClientLevel) entP.level, + ParticleTexExtraRender rain = new ParticleTexExtraRender((ClientLevel) entP.level(), pos.getX(), pos.getY(), pos.getZ(), @@ -651,7 +651,7 @@ public void tickEnvironmentalParticleSpawning() { spawnAreaSize = 40; if (isRain_GroundSplash && curPrecipVal > 0.15) { for (int i = 0; i < 30F * curPrecipVal * PRECIPITATION_PARTICLE_EFFECT_RATE * 8F * particleSettingsAmplifier; i++) { - BlockPos pos = new BlockPos( + BlockPos pos = CoroUtilBlock.blockPos( entP.getX() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2), entP.getY() - 5 + rand.nextInt(15), entP.getZ() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2)); @@ -680,7 +680,7 @@ public void tickEnvironmentalParticleSpawning() { pos = pos.offset(0,1,0); } - ParticleTexFX rain = new ParticleTexFX((ClientLevel) entP.level, + ParticleTexFX rain = new ParticleTexFX((ClientLevel) entP.level(), pos.getX() + rand.nextFloat(), pos.getY() + 0.01D + maxY, pos.getZ() + rand.nextFloat(), @@ -709,7 +709,7 @@ public void tickEnvironmentalParticleSpawning() { double closeDistCutoff = 10D; for (int i = 0; i < 2F * curPrecipVal * PRECIPITATION_PARTICLE_EFFECT_RATE * particleSettingsAmplifier * 0.5F; i++) { - BlockPos pos = new BlockPos( + BlockPos pos = CoroUtilBlock.blockPos( entP.getX() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2), entP.getY() + 5 + rand.nextInt(15), entP.getZ() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2)); @@ -717,7 +717,7 @@ public void tickEnvironmentalParticleSpawning() { if (WeatherUtilEntity.getDistanceSqEntToPos(entP, pos) < closeDistCutoff * closeDistCutoff) continue; if (canPrecipitateAt(world, pos.above(-scanAheadRange))/*world.isRainingAt(pos)*/) { - ParticleTexFX rain = new ParticleTexFX((ClientLevel) entP.level, + ParticleTexFX rain = new ParticleTexFX((ClientLevel) entP.level(), pos.getX() + rand.nextFloat(), pos.getY() - 1 + 0.01D, pos.getZ() + rand.nextFloat(), @@ -733,19 +733,19 @@ public void tickEnvironmentalParticleSpawning() { spawnCount = 0; int spawnAreaSize = 50; int spawnNeed = (int) (spawnNeedBase * 80); - if (entP.getLevel().getGameTime() % 40 == 0) { + if (entP.level().getGameTime() % 40 == 0) { CULog.dbg("rain spawnNeed: " + spawnNeed); } if (spawnNeed > 0) { for (int i = 0; i < safetyCutout; i++) { - BlockPos pos = new BlockPos( + BlockPos pos = CoroUtilBlock.blockPos( entP.getX() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2), entP.getY() - 5 + rand.nextInt(25), entP.getZ() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2)); if (canPrecipitateAt(world, pos)) { - ParticleTexExtraRender snow = new ParticleTexExtraRender((ClientLevel) entP.level, pos.getX(), pos.getY(), pos.getZ(), + ParticleTexExtraRender snow = new ParticleTexExtraRender((ClientLevel) entP.level(), pos.getX(), pos.getY(), pos.getZ(), 0D, 0D, 0D, ParticleRegistry.snow); particleBehavior.initParticleSnow(snow, extraRenderCount); @@ -768,13 +768,13 @@ public void tickEnvironmentalParticleSpawning() { if ((getWeatherState() == WeatherEventType.HAIL || isHail) && spawnNeed > 0) { for (int i = 0; i < safetyCutout / 4; i++) { - BlockPos pos = new BlockPos( + BlockPos pos = CoroUtilBlock.blockPos( entP.getX() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2), entP.getY() - 5 + rand.nextInt(25), entP.getZ() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2)); if (canPrecipitateAt(world, pos)) { - ParticleHail hail = new ParticleHail((ClientLevel) entP.level, + ParticleHail hail = new ParticleHail((ClientLevel) entP.level(), pos.getX(), pos.getY(), pos.getZ(), @@ -805,7 +805,7 @@ public void tickEnvironmentalParticleSpawning() { if (groundFire) { for (int i = 0; i < 10F * PRECIPITATION_PARTICLE_EFFECT_RATE * 1F * particleSettingsAmplifier; i++) { - BlockPos pos = new BlockPos( + BlockPos pos = CoroUtilBlock.blockPos( entP.getX() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2), entP.getY() - 5 + rand.nextInt(15), entP.getZ() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2)); @@ -845,13 +845,13 @@ public void tickEnvironmentalParticleSpawning() { for (int i = 0; i < safetyCutout; i++) { if (windMan.getWindSpeed() >= 0.1F/* && rand.nextInt(1) == 0*/) { - BlockPos pos = new BlockPos( + BlockPos pos = CoroUtilBlock.blockPos( entP.getX() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2), entP.getY() - 5 + rand.nextInt(25), entP.getZ() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2)); if (canPrecipitateAt(world, pos)) { - ParticleTexExtraRender dust = new ParticleTexExtraRender((ClientLevel) entP.level, + ParticleTexExtraRender dust = new ParticleTexExtraRender((ClientLevel) entP.level(), pos.getX(), pos.getY(), pos.getZ(), @@ -898,7 +898,7 @@ public void tickEnvironmentalParticleSpawning() { //snow for (int i = 0; i < Math.max(1, safetyCutout * particleSettingsAmplifierExtra)/*curPrecipVal * 20F * PRECIPITATION_PARTICLE_EFFECT_RATE*/; i++) { - BlockPos pos = new BlockPos( + BlockPos pos = CoroUtilBlock.blockPos( entP.getX() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2), entP.getY() - 5 + rand.nextInt(20), entP.getZ() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2)); @@ -912,7 +912,7 @@ public void tickEnvironmentalParticleSpawning() { continue; if (canPrecipitateAt(world, pos)) { - ParticleTexExtraRender snow = new ParticleTexExtraRender((ClientLevel) entP.level, pos.getX(), pos.getY(), pos.getZ(), + ParticleTexExtraRender snow = new ParticleTexExtraRender((ClientLevel) entP.level(), pos.getX(), pos.getY(), pos.getZ(), 0D, 0D, 0D, ParticleRegistry.snow); particleBehavior.initParticleSnow(snow, (int)(10 * particleStormIntensity)); @@ -930,7 +930,7 @@ public void tickEnvironmentalParticleSpawning() { //extra snow cloud dust for (int i = 0; i < (particleSettingsAmplifier * yetAnotherRateNumber * adjustAmountSmooth75 * sandstormParticleRateDust)/*adjustAmountSmooth * 20F * ConfigMisc.Particle_Precipitation_effect_rate*/; i++) { - BlockPos pos = new BlockPos( + BlockPos pos = CoroUtilBlock.blockPos( player.getX() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2), player.getY() - 2 + rand.nextInt(10), player.getZ() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2)); @@ -968,7 +968,7 @@ public void tickEnvironmentalParticleSpawning() { //enhance the scene further with particles around player, check for sandstorm to account for pocket sand modifying adjustAmountTarget if (particleStormIntensity >= 0.1F) { - rand = client.level.random; + rand = CoroUtilMisc.random(); int spawnAreaSize = 60; double sandstormParticleRateDebris = ConfigSand.Sandstorm_Particle_Debris_effect_rate; @@ -994,7 +994,7 @@ public void tickEnvironmentalParticleSpawning() { //extra dust for (int i = 0; i < ((float) 60 * adjustAmountSmooth75 * sandstormParticleRateDust)/*adjustAmountSmooth * 20F * ConfigMisc.Particle_Precipitation_effect_rate*/; i++) { - BlockPos pos = new BlockPos( + BlockPos pos = CoroUtilBlock.blockPos( player.getX() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2), player.getY() - 2 + rand.nextInt(10), player.getZ() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2)); @@ -1016,7 +1016,7 @@ public void tickEnvironmentalParticleSpawning() { //tumbleweed for (int i = 0; i < ((float) 1 * adjustAmountSmooth75 * sandstormParticleRateDebris)/*adjustAmountSmooth * 20F * ConfigMisc.Particle_Precipitation_effect_rate*/; i++) { - BlockPos pos = new BlockPos( + BlockPos pos = CoroUtilBlock.blockPos( player.getX() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2), player.getY() - 2 + rand.nextInt(10), player.getZ() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2)); @@ -1037,7 +1037,7 @@ public void tickEnvironmentalParticleSpawning() { //debris for (int i = 0; i < ((float) 8 * adjustAmountSmooth75 * sandstormParticleRateDebris)/*adjustAmountSmooth * 20F * ConfigMisc.Particle_Precipitation_effect_rate*/; i++) { - BlockPos pos = new BlockPos( + BlockPos pos = CoroUtilBlock.blockPos( player.getX() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2), player.getY() - 2 + rand.nextInt(10), player.getZ() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2)); @@ -1472,7 +1472,7 @@ public static void tickSandstorm() { Vec3 windForce = windMan.getWindForce(); - Random rand = client.level.random; + Random rand = CoroUtilMisc.random(); int spawnAreaSize = 80; double sandstormParticleRateDebris = ConfigSand.Sandstorm_Particle_Debris_effect_rate; @@ -1495,7 +1495,7 @@ public static void tickSandstorm() { //extra dust for (int i = 0; i < ((float)60 * adjustAmountSmooth75 * sandstormParticleRateDust)/*adjustAmountSmooth * 20F * ConfigMisc.Particle_Precipitation_effect_rate*/; i++) { - BlockPos pos = new BlockPos( + BlockPos pos = CoroUtilBlock.blockPos( player.getX() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2), player.getY() - 2 + rand.nextInt(10), player.getZ() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2)); @@ -1521,7 +1521,7 @@ public static void tickSandstorm() { //tumbleweed for (int i = 0; i < ((float)1 * adjustAmountSmooth75 * sandstormParticleRateDebris)/*adjustAmountSmooth * 20F * ConfigMisc.Particle_Precipitation_effect_rate*/; i++) { - BlockPos pos = new BlockPos( + BlockPos pos = CoroUtilBlock.blockPos( player.getX() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2), player.getY() - 2 + rand.nextInt(10), player.getZ() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2)); @@ -1542,7 +1542,7 @@ public static void tickSandstorm() { //debris for (int i = 0; i < ((float)8 * adjustAmountSmooth75 * sandstormParticleRateDebris)/*adjustAmountSmooth * 20F * ConfigMisc.Particle_Precipitation_effect_rate*/; i++) { - BlockPos pos = new BlockPos( + BlockPos pos = CoroUtilBlock.blockPos( player.getX() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2), player.getY() - 2 + rand.nextInt(10), player.getZ() + rand.nextInt(spawnAreaSize) - (spawnAreaSize / 2)); diff --git a/src/main/java/weather2/client/entity/particle/ParticleHail.java b/src/main/java/weather2/client/entity/particle/ParticleHail.java index e22cc8e8..ef84ef0e 100644 --- a/src/main/java/weather2/client/entity/particle/ParticleHail.java +++ b/src/main/java/weather2/client/entity/particle/ParticleHail.java @@ -1,5 +1,6 @@ package weather2.client.entity.particle; +import com.corosus.coroutil.util.CoroUtilBlock; import extendedrenderer.particle.entity.ParticleCrossSection; import extendedrenderer.particle.entity.ParticleTexExtraRender; import net.minecraft.client.renderer.texture.TextureAtlasSprite; @@ -23,7 +24,7 @@ public void tick() { public void onHit() { super.onHit(); if (level.random.nextInt(30) == 0) { - level.playLocalSound(new BlockPos(x, y, z), SoundEvents.WOOD_BREAK, SoundSource.WEATHER, 0.2F, 2F, false); + level.playLocalSound(CoroUtilBlock.blockPos(x, y, z), SoundEvents.WOOD_BREAK, SoundSource.WEATHER, 0.2F, 2F, false); } } } diff --git a/src/main/java/weather2/client/entity/render/LightningBoltWeatherNewRenderer.java b/src/main/java/weather2/client/entity/render/LightningBoltWeatherNewRenderer.java index a8b0b04c..3fb23865 100644 --- a/src/main/java/weather2/client/entity/render/LightningBoltWeatherNewRenderer.java +++ b/src/main/java/weather2/client/entity/render/LightningBoltWeatherNewRenderer.java @@ -2,7 +2,6 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.math.Matrix4f; import java.util.Random; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; @@ -12,6 +11,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import org.joml.Matrix4f; import weather2.weathersystem.storm.LightningBoltWeatherNew; @OnlyIn(Dist.CLIENT) diff --git a/src/main/java/weather2/client/shaders/ShaderInstanceExtended.java b/src/main/java/weather2/client/shaders/ShaderInstanceExtended.java index d59f36c4..453fc830 100644 --- a/src/main/java/weather2/client/shaders/ShaderInstanceExtended.java +++ b/src/main/java/weather2/client/shaders/ShaderInstanceExtended.java @@ -238,7 +238,12 @@ private static Program getOrCreate(final ResourceProvider p_173341_, Program.Typ private final Set importedPaths = Sets.newHashSet(); public String applyImport(boolean p_173374_, String p_173375_) { - p_173375_ = FileUtil.normalizeResourcePath((p_173374_ ? s1 : "shaders/include/") + p_173375_); + String str = "shaders/include/"; + if (p_173375_.contains("weather2:")) { + str = "weather2:" + str; + p_173375_ = p_173375_.replace("weather2:", ""); + } + p_173375_ = FileUtil.normalizeResourcePath((p_173374_ ? s1 : str) + p_173375_); if (!this.importedPaths.add(p_173375_)) { return null; } else { diff --git a/src/main/java/weather2/command/WeatherCommand.java b/src/main/java/weather2/command/WeatherCommand.java index c199275e..44e46d45 100644 --- a/src/main/java/weather2/command/WeatherCommand.java +++ b/src/main/java/weather2/command/WeatherCommand.java @@ -9,6 +9,7 @@ import net.minecraft.commands.arguments.RangeArgument; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; import net.minecraft.world.phys.Vec3; import net.minecraftforge.fml.InterModComms; @@ -29,20 +30,20 @@ public static void register(final CommandDispatcher dispatch .then(literal("kill_all_storms").requires(s -> s.hasPermission(2)).executes(c -> { WeatherManagerServer wm = ServerTickHandler.getWeatherManagerFor(c.getSource().getLevel().dimension()); wm.clearAllStorms(); - c.getSource().sendSuccess(new TextComponent("Killed all storms"), true); + c.getSource().sendSuccess(() -> Component.literal("Killed all storms"), true); return Command.SINGLE_SUCCESS; })) .then(literal("debug").requires(s -> s.hasPermission(2)) .then(literal("print_grab_list").executes(c -> { WeatherUtil.testAllBlocks(); - c.getSource().sendSuccess(new TextComponent("Tornado grab list printed to debug.log"), true); + c.getSource().sendSuccess(() -> Component.literal("Tornado grab list printed to debug.log"), true); return Command.SINGLE_SUCCESS; })) .then(literal("storm_chance").executes(c -> { WeatherManagerServer wm = ServerTickHandler.getWeatherManagerFor(c.getSource().getLevel().dimension()); float chance = wm.getBiomeBasedStormSpawnChanceInArea(new BlockPos(c.getSource().getPosition().x, c.getSource().getPosition().y, c.getSource().getPosition().z)); - c.getSource().sendSuccess(new TextComponent("Likelyhood of storms to spawn here within 1024 blocks: " + (chance * 100)), true); + c.getSource().sendSuccess(() -> Component.literal("Likelyhood of storms to spawn here within 1024 blocks: " + (chance * 100)), true); return Command.SINGLE_SUCCESS; })) ) @@ -51,14 +52,14 @@ public static void register(final CommandDispatcher dispatch WeatherManagerServer wm = ServerTickHandler.getWeatherManagerFor(c.getSource().getLevel().dimension()); wm.getWindManager().stopLowWindEvent(); wm.getWindManager().stopHighWindEvent(); - c.getSource().sendSuccess(new TextComponent("Stopped any active high or low wind events"), true); + c.getSource().sendSuccess(() -> Component.literal("Stopped any active high or low wind events"), true); return Command.SINGLE_SUCCESS; })) .then(literal("high").executes(c -> { WeatherManagerServer wm = ServerTickHandler.getWeatherManagerFor(c.getSource().getLevel().dimension()); wm.getWindManager().stopLowWindEvent(); wm.getWindManager().startHighWindEvent(); - c.getSource().sendSuccess(new TextComponent("Started high wind event"), true); + c.getSource().sendSuccess(() -> Component.literal("Started high wind event"), true); return Command.SINGLE_SUCCESS; })) .then(literal("low").executes(c -> { @@ -66,7 +67,7 @@ public static void register(final CommandDispatcher dispatch wm.getWindManager().stopHighWindEvent(); wm.getWindManager().startLowWindEvent(); wm.getWindManager().windSpeedGlobal = (float) (ConfigWind.windSpeedMin + 0.2F); - c.getSource().sendSuccess(new TextComponent("Started low wind event"), true); + c.getSource().sendSuccess(() -> Component.literal("Started low wind event"), true); return Command.SINGLE_SUCCESS; })) ) @@ -75,7 +76,7 @@ public static void register(final CommandDispatcher dispatch int angle = IntegerArgumentType.getInteger(c, "angle"); WeatherManagerServer wm = ServerTickHandler.getWeatherManagerFor(c.getSource().getLevel().dimension()); wm.getWindManager().windAngleGlobal = angle; - c.getSource().sendSuccess(new TextComponent("Set wind angle for clouds to " + angle), true); + c.getSource().sendSuccess(() -> Component.literal("Set wind angle for clouds to " + angle), true); return Command.SINGLE_SUCCESS; })) ) @@ -84,7 +85,7 @@ public static void register(final CommandDispatcher dispatch float speed = FloatArgumentType.getFloat(c, "speed"); WeatherManagerServer wm = ServerTickHandler.getWeatherManagerFor(c.getSource().getLevel().dimension()); wm.getWindManager().windSpeedGlobal = speed; - c.getSource().sendSuccess(new TextComponent("Set wind speed for clouds to " + speed), true); + c.getSource().sendSuccess(() -> Component.literal("Set wind speed for clouds to " + speed), true); return Command.SINGLE_SUCCESS; })) ) @@ -92,7 +93,7 @@ public static void register(final CommandDispatcher dispatch .then(literal("storm_rain").executes(c -> { StormObject stormObject = summonStorm(c, StormObject.STATE_NORMAL); - c.getSource().sendSuccess(new TextComponent("Summoned rain storm"), true); + c.getSource().sendSuccess(() -> Component.literal("Summoned rain storm"), true); return Command.SINGLE_SUCCESS; })) .then(literal("storm_lightning").executes(c -> { @@ -102,7 +103,7 @@ public static void register(final CommandDispatcher dispatch stormObject.levelCurIntensityStage = StormObject.STATE_THUNDER; stormObject.levelStormIntensityMax = StormObject.STATE_THUNDER; - c.getSource().sendSuccess(new TextComponent("Summoned lightning storm"), true); + c.getSource().sendSuccess(() -> Component.literal("Summoned lightning storm"), true); return Command.SINGLE_SUCCESS; })) .then(literal("storm_highwind").executes(c -> { @@ -112,7 +113,7 @@ public static void register(final CommandDispatcher dispatch stormObject.levelCurIntensityStage = StormObject.STATE_HIGHWIND; stormObject.levelStormIntensityMax = StormObject.STATE_HIGHWIND; - c.getSource().sendSuccess(new TextComponent("Summoned highwind storm"), true); + c.getSource().sendSuccess(() -> Component.literal("Summoned highwind storm"), true); return Command.SINGLE_SUCCESS; })) .then(literal("storm_hail").executes(c -> { @@ -122,38 +123,38 @@ public static void register(final CommandDispatcher dispatch stormObject.levelCurIntensityStage = StormObject.STATE_HAIL; stormObject.levelStormIntensityMax = StormObject.STATE_HAIL; - c.getSource().sendSuccess(new TextComponent("Summoned hail storm"), true); + c.getSource().sendSuccess(() -> Component.literal("Summoned hail storm"), true); return Command.SINGLE_SUCCESS; })) .then(literal("tornado_f0").executes(c -> { StormObject stormObject = summonStorm(c, StormObject.STATE_FORMING); stormObject.levelStormIntensityMax = StormObject.STATE_STAGE1; - c.getSource().sendSuccess(new TextComponent("Summoned forming tornado"), true); + c.getSource().sendSuccess(() -> Component.literal("Summoned forming tornado"), true); return Command.SINGLE_SUCCESS; })) .then(literal("tornado_f1").executes(c -> { StormObject stormObject = summonStorm(c, StormObject.STATE_STAGE1); - c.getSource().sendSuccess(new TextComponent("Summoned f1 tornado"), true); + c.getSource().sendSuccess(() -> Component.literal("Summoned f1 tornado"), true); return Command.SINGLE_SUCCESS; })) .then(literal("tornado_f2").executes(c -> { StormObject stormObject = summonStorm(c, StormObject.STATE_STAGE2); - c.getSource().sendSuccess(new TextComponent("Summoned f2 tornado"), true); + c.getSource().sendSuccess(() -> Component.literal("Summoned f2 tornado"), true); return Command.SINGLE_SUCCESS; })) .then(literal("tornado_f3").executes(c -> { StormObject stormObject = summonStorm(c, StormObject.STATE_STAGE3); - c.getSource().sendSuccess(new TextComponent("Summoned f3 tornado"), true); + c.getSource().sendSuccess(() -> Component.literal("Summoned f3 tornado"), true); return Command.SINGLE_SUCCESS; })) .then(literal("tornado_f4").executes(c -> { StormObject stormObject = summonStorm(c, StormObject.STATE_STAGE4); - c.getSource().sendSuccess(new TextComponent("Summoned f4 tornado"), true); + c.getSource().sendSuccess(() -> Component.literal("Summoned f4 tornado"), true); return Command.SINGLE_SUCCESS; })) .then(literal("sharknado").executes(c -> { @@ -162,7 +163,7 @@ public static void register(final CommandDispatcher dispatch stormObject.setSharknado(true); - c.getSource().sendSuccess(new TextComponent("Summoned sharknado"), true); + c.getSource().sendSuccess(() -> Component.literal("Summoned sharknado"), true); return Command.SINGLE_SUCCESS; })) /*.then(literal("tornado_player_baby").executes(c -> { @@ -172,7 +173,7 @@ public static void register(final CommandDispatcher dispatch stormObject.setPlayerControlledTimeLeft(800); stormObject.setBaby(true); - c.getSource().sendSuccess(new TextComponent("Summoned baby player tornado"), true); + c.getSource().sendSuccess(() -> Component.literal("Summoned baby player tornado"), true); return Command.SINGLE_SUCCESS; })) .then(literal("tornado_baby").executes(c -> { @@ -180,7 +181,7 @@ public static void register(final CommandDispatcher dispatch stormObject.setBaby(true); - c.getSource().sendSuccess(new TextComponent("Summoned baby tornado"), true); + c.getSource().sendSuccess(() -> Component.literal("Summoned baby tornado"), true); return Command.SINGLE_SUCCESS; }))*/ .then(literal("tornado_player").executes(c -> { @@ -189,7 +190,7 @@ public static void register(final CommandDispatcher dispatch stormObject.setupPlayerControlledTornado(c.getSource().getEntity()); stormObject.setPlayerControlledTimeLeft(800); - c.getSource().sendSuccess(new TextComponent("Summoned player tornado"), true); + c.getSource().sendSuccess(() -> Component.literal("Summoned player tornado"), true); return Command.SINGLE_SUCCESS; }))/* .then(literal("tornado_pet").executes(c -> { @@ -200,7 +201,7 @@ public static void register(final CommandDispatcher dispatch stormObject.setPet(true); stormObject.setPetGrabsItems(true); - c.getSource().sendSuccess(new TextComponent("Summoned pet tornado"), true); + c.getSource().sendSuccess(() -> Component.literal("Summoned pet tornado"), true); return Command.SINGLE_SUCCESS; })) .then(literal("tornado_pet_no_item_grab").executes(c -> { @@ -211,7 +212,7 @@ public static void register(final CommandDispatcher dispatch stormObject.setPet(true); stormObject.setPetGrabsItems(false); - c.getSource().sendSuccess(new TextComponent("Summoned pet tornado with no item grabbing"), true); + c.getSource().sendSuccess(() -> Component.literal("Summoned pet tornado with no item grabbing"), true); return Command.SINGLE_SUCCESS; })) .then(literal("tornadotestimc").executes(c -> { @@ -226,7 +227,7 @@ public static void register(final CommandDispatcher dispatch return tag; }); - c.getSource().sendSuccess(new TextComponent("Summoned tornado test"), true); + c.getSource().sendSuccess(() -> Component.literal("Summoned tornado test"), true); return Command.SINGLE_SUCCESS; }))*/ .then(literal("tornado_f0_max").executes(c -> { @@ -234,7 +235,7 @@ public static void register(final CommandDispatcher dispatch stormObject.levelStormIntensityMax = StormObject.STATE_FORMING; stormObject.alwaysProgresses = false; - c.getSource().sendSuccess(new TextComponent("Summoned tornado"), true); + c.getSource().sendSuccess(() -> Component.literal("Summoned tornado"), true); return Command.SINGLE_SUCCESS; })) .then(literal("sandstorm_try").executes(c -> { @@ -242,11 +243,11 @@ public static void register(final CommandDispatcher dispatch WeatherManagerServer wm = ServerTickHandler.getWeatherManagerFor(c.getSource().getLevel().dimension()); boolean sandstormMade = wm.trySpawnParticleStormNearPos(c.getSource().getLevel(), c.getSource().getPosition(), WeatherObjectParticleStorm.StormType.SANDSTORM); if (sandstormMade) { - c.getSource().sendSuccess(new TextComponent("Summoned sandstorm"), true); + c.getSource().sendSuccess(() -> Component.literal("Summoned sandstorm"), true); wm.getWindManager().stopLowWindEvent(); wm.getWindManager().startHighWindEvent(); } else { - c.getSource().sendSuccess(new TextComponent("Couldn't spawn, try being in a large desert"), true); + c.getSource().sendSuccess(() -> Component.literal("Couldn't spawn, try being in a large desert"), true); } @@ -257,11 +258,11 @@ public static void register(final CommandDispatcher dispatch WeatherManagerServer wm = ServerTickHandler.getWeatherManagerFor(c.getSource().getLevel().dimension()); boolean sandstormMade = wm.trySpawnParticleStormNearPos(c.getSource().getLevel(), c.getSource().getPosition(), WeatherObjectParticleStorm.StormType.SNOWSTORM); if (sandstormMade) { - c.getSource().sendSuccess(new TextComponent("Summoned snowstorm"), true); + c.getSource().sendSuccess(() -> Component.literal("Summoned snowstorm"), true); wm.getWindManager().stopLowWindEvent(); wm.getWindManager().startHighWindEvent(); } else { - c.getSource().sendSuccess(new TextComponent("Couldn't spawn, try being in a large snowy area"), true); + c.getSource().sendSuccess(() -> Component.literal("Couldn't spawn, try being in a large snowy area"), true); } diff --git a/src/main/java/weather2/data/WeatherRecipeProvider.java b/src/main/java/weather2/data/WeatherRecipeProvider.java index c4e8c700..33579697 100644 --- a/src/main/java/weather2/data/WeatherRecipeProvider.java +++ b/src/main/java/weather2/data/WeatherRecipeProvider.java @@ -1,6 +1,7 @@ package weather2.data; import net.minecraft.data.DataGenerator; +import net.minecraft.data.PackOutput; import net.minecraft.data.recipes.FinishedRecipe; import net.minecraft.data.recipes.RecipeProvider; import net.minecraft.data.recipes.ShapedRecipeBuilder; @@ -13,12 +14,12 @@ public class WeatherRecipeProvider extends RecipeProvider { - public WeatherRecipeProvider(DataGenerator p_125973_) { + public WeatherRecipeProvider(PackOutput p_125973_) { super(p_125973_); } @Override - protected void buildCraftingRecipes(Consumer consumer) { + protected void buildRecipes(Consumer consumer) { ShapedRecipeBuilder.shaped(WeatherItems.WEATHER_ITEM.get(), 1) .pattern("X X").pattern("DID").pattern("X X") diff --git a/src/main/java/weather2/mixin/client/RenderParticlesOverride.java b/src/main/java/weather2/mixin/client/RenderParticlesOverride.java index 2af97d33..fe3aa478 100644 --- a/src/main/java/weather2/mixin/client/RenderParticlesOverride.java +++ b/src/main/java/weather2/mixin/client/RenderParticlesOverride.java @@ -44,7 +44,7 @@ public void renderSnowAndRain(LevelRenderer worldRenderer, LightTexture lightmap public void renderClouds(LevelRenderer instance, PoseStack poseStack, Matrix4f l, float i1, double f1, double f2, double d0) { //CULog.dbg("renderClouds hook"); //workaround for missing projection matrix info - ICloudRenderHandler cloudRenderHandler = Minecraft.getInstance().level.effects().getCloudRenderHandler(); + ICloudRenderHandler cloudRenderHandler = Minecraft.getInstance().level().effects().getCloudRenderHandler(); if (cloudRenderHandler instanceof CloudRenderHandler) { ((CloudRenderHandler)cloudRenderHandler).render(poseStack, l, i1, f1, f2, d0); } else { diff --git a/src/main/java/weather2/util/WeatherUtil.java b/src/main/java/weather2/util/WeatherUtil.java index 2fce819c..56068788 100644 --- a/src/main/java/weather2/util/WeatherUtil.java +++ b/src/main/java/weather2/util/WeatherUtil.java @@ -1,8 +1,6 @@ package weather2.util; import com.corosus.coroutil.util.CULog; -import com.mojang.math.Vector3d; -import com.mojang.math.Vector3f; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; import net.minecraft.core.Registry; @@ -18,6 +16,8 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Material; import net.minecraftforge.server.ServerLifecycleHooks; +import org.joml.Vector3d; +import org.joml.Vector3f; import weather2.config.ConfigTornado; import java.util.*; @@ -80,7 +80,7 @@ public static boolean isStateInListOfTags(BlockState state) { for (String str : listGrabBlockTags) { TagKey key = getTagKeyFor(str); if (key != null) { - if (state.m_204336_(key)) { + if (state.is(key)) { return true; } } @@ -89,7 +89,7 @@ public static boolean isStateInListOfTags(BlockState state) { } public static TagKey getTagKeyFor(String str) { - return TagKey.m_203882_(Registry.BLOCK_REGISTRY, new ResourceLocation(str)); + return TagKey.create(Registry.BLOCK_REGISTRY, new ResourceLocation(str)); } public static boolean canGrabViaLists(BlockState state) { diff --git a/src/main/java/weather2/util/WeatherUtilBlock.java b/src/main/java/weather2/util/WeatherUtilBlock.java index dc7b983c..8d1170ed 100644 --- a/src/main/java/weather2/util/WeatherUtilBlock.java +++ b/src/main/java/weather2/util/WeatherUtilBlock.java @@ -1,5 +1,6 @@ package weather2.util; +import com.corosus.coroutil.util.CoroUtilBlock; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.util.Mth; @@ -62,7 +63,7 @@ public static void fillAgainstWallSmoothly(Level world, Vec3 posSource, float di */ //fix for starting on a layerable block - BlockState stateTest = world.getBlockState(new BlockPos(posSource)); + BlockState stateTest = world.getBlockState(CoroUtilBlock.blockPos(posSource)); if (stateTest.getBlock() == blockLayerable) { int heightTest = getHeightForAnyBlock(stateTest); if (heightTest < 8) { @@ -70,7 +71,7 @@ public static void fillAgainstWallSmoothly(Level world, Vec3 posSource, float di } } - BlockPos posSourcei = new BlockPos(posSource); + BlockPos posSourcei = CoroUtilBlock.blockPos(posSource); //int ySource = world.getHeight(posSourcei).getY(); int y = posSourcei.getY(); float tickStep = 0.75F; @@ -171,11 +172,11 @@ public static void fillAgainstWallSmoothly(Level world, Vec3 posSource, float di int amountWeHave = 1; int amountToAddPerXZ = 1; - BlockState state = world.getBlockState(new BlockPos(posWall)); - BlockState state1 = world.getBlockState(new BlockPos(posLastNonWall).offset(1, 0, 0)); - BlockState state22 = world.getBlockState(new BlockPos(posLastNonWall).offset(-1, 0, 0)); - BlockState state3 = world.getBlockState(new BlockPos(posLastNonWall).offset(0, 0, 1)); - BlockState state4 = world.getBlockState(new BlockPos(posLastNonWall).offset(0, 0, -1)); + BlockState state = world.getBlockState(CoroUtilBlock.blockPos(posWall)); + BlockState state1 = world.getBlockState(CoroUtilBlock.blockPos(posLastNonWall).offset(1, 0, 0)); + BlockState state22 = world.getBlockState(CoroUtilBlock.blockPos(posLastNonWall).offset(-1, 0, 0)); + BlockState state3 = world.getBlockState(CoroUtilBlock.blockPos(posLastNonWall).offset(0, 0, 1)); + BlockState state4 = world.getBlockState(CoroUtilBlock.blockPos(posLastNonWall).offset(0, 0, -1)); //check all around place spot for cactus and cancel if true, to prevent cactus pop off when we place next to it if (state.getBlock() == Blocks.CACTUS || state1.getBlock() == Blocks.CACTUS || @@ -183,13 +184,13 @@ public static void fillAgainstWallSmoothly(Level world, Vec3 posSource, float di return; } - BlockPos pos2 = new BlockPos(posLastNonWall.x, posLastNonWall.y, posLastNonWall.z); + BlockPos pos2 = CoroUtilBlock.blockPos(posLastNonWall.x, posLastNonWall.y, posLastNonWall.z); BlockState state2 = world.getBlockState(pos2); if (state2.getMaterial() == Material.WATER || state2.getMaterial() == Material.LAVA) { return; } - amountWeHave = trySpreadOnPos2(world, new BlockPos(posLastNonWall.x, posLastNonWall.y, posLastNonWall.z), amountWeHave, amountToAddPerXZ, 10, blockLayerable, maxBlockStackingAllowed); + amountWeHave = trySpreadOnPos2(world, CoroUtilBlock.blockPos(posLastNonWall.x, posLastNonWall.y, posLastNonWall.z), amountWeHave, amountToAddPerXZ, 10, blockLayerable, maxBlockStackingAllowed); } else { //System.out.println("no wall found"); } diff --git a/src/main/java/weather2/util/WeatherUtilEntity.java b/src/main/java/weather2/util/WeatherUtilEntity.java index d8c69362..2300ad6d 100644 --- a/src/main/java/weather2/util/WeatherUtilEntity.java +++ b/src/main/java/weather2/util/WeatherUtilEntity.java @@ -51,7 +51,7 @@ public static float getWeight(Object entity1, boolean forTornado) { LivingEntity livingEnt = (LivingEntity) entity1; int airTime = livingEnt.getPersistentData().getInt("timeInAir"); - if (livingEnt.isOnGround() || livingEnt.isInWater()) + if (livingEnt.onGround() || livingEnt.isInWater()) { airTime = 0; } @@ -65,7 +65,7 @@ public static float getWeight(Object entity1, boolean forTornado) if (((Player) entity1).abilities.instabuild) return 99999999F; return 5.0F + airTime / 400.0F; } else { - return 500.0F + (livingEnt.isOnGround() ? 2.0F : 0.0F) + (airTime / 400.0F); + return 500.0F + (livingEnt.onGround() ? 2.0F : 0.0F) + (airTime / 400.0F); } } @@ -111,7 +111,7 @@ public static float getWeight(Object entity1) { LivingEntity livingEnt = (LivingEntity) entity1; int airTime = livingEnt.getPersistentData().getInt("timeInAir"); - if (livingEnt.isOnGround() || livingEnt.isInWater()) + if (livingEnt.onGround() || livingEnt.isInWater()) { airTime = 0; } @@ -125,7 +125,7 @@ public static float getWeight(Object entity1) if (((Player) entity1).abilities.instabuild) return 99999999F; return 5.0F + airTime / 400.0F; } else { - return 500.0F + (livingEnt.isOnGround() ? 2.0F : 0.0F) + (airTime / 400.0F); + return 500.0F + (livingEnt.onGround() ? 2.0F : 0.0F) + (airTime / 400.0F); } } @@ -163,7 +163,7 @@ public static boolean isEntityOutside(Entity parEnt) { } public static boolean isEntityOutside(Entity parEnt, boolean cheapCheck) { - return isPosOutside(parEnt.level, parEnt.position(), cheapCheck); + return isPosOutside(parEnt.level(), parEnt.position(), cheapCheck); } public static boolean isPosOutside(Level parWorld, Vec3 parPos) { @@ -213,6 +213,6 @@ public static boolean isPlayerSheltered(Entity player) { int x = Mth.floor(player.getX()); int y = Mth.floor(player.getY() + player.getEyeHeight()); int z = Mth.floor(player.getZ()); - return player.level.getHeight(Heightmap.Types.MOTION_BLOCKING, x, z) > y; + return player.level().getHeight(Heightmap.Types.MOTION_BLOCKING, x, z) > y; } } diff --git a/src/main/java/weather2/weathersystem/WeatherManagerServer.java b/src/main/java/weather2/weathersystem/WeatherManagerServer.java index d2914f41..43ea0396 100644 --- a/src/main/java/weather2/weathersystem/WeatherManagerServer.java +++ b/src/main/java/weather2/weathersystem/WeatherManagerServer.java @@ -1,8 +1,6 @@ package weather2.weathersystem; -import com.corosus.coroutil.util.CULog; -import com.corosus.coroutil.util.CoroUtilCompatibility; -import com.corosus.coroutil.util.CoroUtilEntity; +import com.corosus.coroutil.util.*; import com.google.common.collect.Lists; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; @@ -265,7 +263,7 @@ public Optional findWeatherDeflector(ServerLevel level, BlockPos p_143 public void tickStormBlockBuildup(StormState stormState, Block block) { Level world = getWorld(); WindManager windMan = getWindManager(); - Random rand = world.random; + Random rand = CoroUtilMisc.random(); float angle = windMan.getWindAngle(null); @@ -371,10 +369,10 @@ public void tickWeatherCoverage() { public boolean tryParticleStormForPlayer(Player player, long lastSandstormTime) { boolean sandstormMade = false; - if (lastSandstormTime == 0 || lastSandstormTime + ConfigSand.Sandstorm_TimeBetweenInTicks < player.level.getGameTime()) { - sandstormMade = trySpawnParticleStormNearPos(player.level, player.position(), WeatherObjectParticleStorm.StormType.SANDSTORM); - } else if (lastSandstormTime == 0 || lastSandstormTime + ConfigSand.Sandstorm_TimeBetweenInTicks < player.level.getGameTime()) { - sandstormMade = trySpawnParticleStormNearPos(player.level, player.position(), WeatherObjectParticleStorm.StormType.SNOWSTORM); + if (lastSandstormTime == 0 || lastSandstormTime + ConfigSand.Sandstorm_TimeBetweenInTicks < player.level().getGameTime()) { + sandstormMade = trySpawnParticleStormNearPos(player.level(), player.position(), WeatherObjectParticleStorm.StormType.SANDSTORM); + } else if (lastSandstormTime == 0 || lastSandstormTime + ConfigSand.Sandstorm_TimeBetweenInTicks < player.level().getGameTime()) { + sandstormMade = trySpawnParticleStormNearPos(player.level(), player.position(), WeatherObjectParticleStorm.StormType.SNOWSTORM); } return sandstormMade; } @@ -409,7 +407,7 @@ public boolean trySpawnParticleStormNearPos(Level world, Vec3 posIn, WeatherObje if (!world.isLoaded(pos)) continue; //Biome biomeIn = world.m_204166_ForCoordsBody(pos); - Biome biomeIn = world.m_204166_(pos).m_203334_(); + Biome biomeIn = world.getBiome(pos).get(); if (WeatherObjectParticleStorm.canSpawnHere(world, pos, type, true)) { //found @@ -423,13 +421,13 @@ public boolean trySpawnParticleStormNearPos(Level world, Vec3 posIn, WeatherObje double dirZRight = Math.cos(Math.toRadians(angle+90)); double distLeftRight = 20; - BlockPos posLeft = WeatherUtilBlock.getPrecipitationHeightSafe(world, new BlockPos(foundPos.getX() + (dirXLeft * distLeftRight), 0, foundPos.getZ() + (dirZLeft * distLeftRight))); + BlockPos posLeft = WeatherUtilBlock.getPrecipitationHeightSafe(world, CoroUtilBlock.blockPos(foundPos.getX() + (dirXLeft * distLeftRight), 0, foundPos.getZ() + (dirZLeft * distLeftRight))); if (!world.isLoaded(posLeft)) continue; //if (!WeatherObjectSandstorm.isDesert(world.m_204166_ForCoordsBody(posLeft))) continue; if (!WeatherObjectParticleStorm.canSpawnHere(world, posLeft, type, false)) continue; //if (!WeatherObjectSandstorm.isDesert(world.m_204166_(posLeft).m_203334_())) continue; - BlockPos posRight = WeatherUtilBlock.getPrecipitationHeightSafe(world, new BlockPos(foundPos.getX() + (dirXRight * distLeftRight), 0, foundPos.getZ() + (dirZRight * distLeftRight))); + BlockPos posRight = WeatherUtilBlock.getPrecipitationHeightSafe(world, CoroUtilBlock.blockPos(foundPos.getX() + (dirXRight * distLeftRight), 0, foundPos.getZ() + (dirZRight * distLeftRight))); if (!world.isLoaded(posRight)) continue; //if (!WeatherObjectSandstorm.isDesert(world.m_204166_ForCoordsBody(posRight))) continue; if (!WeatherObjectParticleStorm.canSpawnHere(world, posRight, type, false)) continue; @@ -527,7 +525,7 @@ public void trySpawnStormCloudNearPlayerForLayer(Player entP, int layer) { spawnZ = (int) (entP.getZ() - vecZ + rand.nextInt(ConfigMisc.Misc_simBoxRadiusSpawn) - rand.nextInt(ConfigMisc.Misc_simBoxRadiusSpawn)); tryPos = new Vec3(spawnX, StormObject.layers.get(layer), spawnZ); soClose = getClosestStormAny(tryPos, ConfigMisc.Cloud_Formation_MinDistBetweenSpawned); - playerClose = entP.level.getNearestPlayer(spawnX, 50, spawnZ, closestToPlayer, false); + playerClose = entP.level().getNearestPlayer(spawnX, 50, spawnZ, closestToPlayer, false); } if (soClose == null) { @@ -727,7 +725,7 @@ public float getBiomeBasedStormSpawnChanceInArea(BlockPos posCenter) { BlockPos pos = new BlockPos(posCenter.getX() + x, posCenter.getY(), posCenter.getZ() + z); if (getWorld().isLoaded(pos)) { pos = WeatherUtilBlock.getPrecipitationHeightSafe(getWorld(), pos); - Biome bgb = getWorld().m_204166_(pos).m_203334_(); + Biome bgb = getWorld().getBiome(pos).get(); allTemperaturesAdded += StormObject.getTemperatureMCToWeatherSys(CoroUtilCompatibility.getAdjustedTemperature(getWorld(), bgb, pos)); samples++; } diff --git a/src/main/java/weather2/weathersystem/fog/FogAdjuster.java b/src/main/java/weather2/weathersystem/fog/FogAdjuster.java index 5c6a7e9c..47df3333 100644 --- a/src/main/java/weather2/weathersystem/fog/FogAdjuster.java +++ b/src/main/java/weather2/weathersystem/fog/FogAdjuster.java @@ -2,12 +2,12 @@ import com.corosus.coroutil.util.CULog; import net.minecraft.util.Mth; +import net.minecraftforge.client.event.ViewportEvent; +import org.joml.Vector3f; import weather2.datatypes.WeatherEventType; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.FogRenderer; import net.minecraft.world.entity.player.Player; -import com.mojang.math.Vector3f; -import net.minecraftforge.client.event.EntityViewRenderEvent; import weather2.ClientTickHandler; import weather2.ClientWeatherProxy; import weather2.client.SceneEnhancer; @@ -137,7 +137,7 @@ public void tickGame(ClientWeatherProxy weather) { } } - public void onFogColors(EntityViewRenderEvent.FogColors event) { + public void onFogColors(ViewportEvent.ComputeFogColor event) { updateWeatherState(); //get vanilla settings @@ -151,7 +151,7 @@ public void onFogColors(EntityViewRenderEvent.FogColors event) { } } - public void onFogRender(EntityViewRenderEvent.RenderFogEvent event) { + public void onFogRender(ViewportEvent.RenderFog event) { updateWeatherState(); //get vanilla settings diff --git a/src/main/java/weather2/weathersystem/fog/FogProfile.java b/src/main/java/weather2/weathersystem/fog/FogProfile.java index 5fd2e640..1f967bc0 100644 --- a/src/main/java/weather2/weathersystem/fog/FogProfile.java +++ b/src/main/java/weather2/weathersystem/fog/FogProfile.java @@ -1,7 +1,6 @@ package weather2.weathersystem.fog; -import com.mojang.blaze3d.platform.GlStateManager; -import com.mojang.math.Vector3f; +import org.joml.Vector3f; public class FogProfile { diff --git a/src/main/java/weather2/weathersystem/storm/LightningBoltWeather.java b/src/main/java/weather2/weathersystem/storm/LightningBoltWeather.java index e689d1f5..62dfdfb5 100644 --- a/src/main/java/weather2/weathersystem/storm/LightningBoltWeather.java +++ b/src/main/java/weather2/weathersystem/storm/LightningBoltWeather.java @@ -1,5 +1,6 @@ package weather2.weathersystem.storm; +import com.corosus.coroutil.util.CoroUtilBlock; import com.google.common.collect.Sets; import java.util.List; import java.util.Optional; @@ -75,9 +76,9 @@ public void setCause(@Nullable ServerPlayer p_20880_) { private void powerLightningRod() { BlockPos blockpos = this.getStrikePosition(); - BlockState blockstate = this.level.getBlockState(blockpos); + BlockState blockstate = this.level().getBlockState(blockpos); if (blockstate.is(Blocks.LIGHTNING_ROD)) { - ((LightningRodBlock)blockstate.getBlock()).onLightningStrike(blockstate, this.level, blockpos); + ((LightningRodBlock)blockstate.getBlock()).onLightningStrike(blockstate, this.level(), blockpos); } } @@ -93,17 +94,17 @@ public float getDamage() { public void tick() { super.tick(); if (this.life == 2) { - if (this.level.isClientSide()) { - this.level.playLocalSound(this.getX(), this.getY(), this.getZ(), SoundEvents.LIGHTNING_BOLT_THUNDER, SoundSource.WEATHER, 10000.0F, 0.8F + this.random.nextFloat() * 0.2F, false); - this.level.playLocalSound(this.getX(), this.getY(), this.getZ(), SoundEvents.LIGHTNING_BOLT_IMPACT, SoundSource.WEATHER, 2.0F, 0.5F + this.random.nextFloat() * 0.2F, false); + if (this.level().isClientSide()) { + this.level().playLocalSound(this.getX(), this.getY(), this.getZ(), SoundEvents.LIGHTNING_BOLT_THUNDER, SoundSource.WEATHER, 10000.0F, 0.8F + this.random.nextFloat() * 0.2F, false); + this.level().playLocalSound(this.getX(), this.getY(), this.getZ(), SoundEvents.LIGHTNING_BOLT_IMPACT, SoundSource.WEATHER, 2.0F, 0.5F + this.random.nextFloat() * 0.2F, false); } else { - Difficulty difficulty = this.level.getDifficulty(); + Difficulty difficulty = this.level().getDifficulty(); if (difficulty == Difficulty.NORMAL || difficulty == Difficulty.HARD) { this.spawnFire(4); } this.powerLightningRod(); - clearCopperOnLightningStrike(this.level, this.getStrikePosition()); + clearCopperOnLightningStrike(this.level(), this.getStrikePosition()); this.gameEvent(GameEvent.LIGHTNING_STRIKE); } } @@ -122,10 +123,10 @@ public void tick() { } if (this.life >= 0) { - if (!(this.level instanceof ServerLevel)) { - this.level.setSkyFlashTime(2); + if (!(this.level() instanceof ServerLevel)) { + this.level().setSkyFlashTime(2); } else if (!this.visualOnly) { - List list1 = this.level.getEntities(this, new AABB(this.getX() - 3.0D, this.getY() - 3.0D, this.getZ() - 3.0D, this.getX() + 3.0D, this.getY() + 6.0D + 3.0D, this.getZ() + 3.0D), Entity::isAlive); + List list1 = this.level().getEntities(this, new AABB(this.getX() - 3.0D, this.getY() - 3.0D, this.getZ() - 3.0D, this.getX() + 3.0D, this.getY() + 6.0D + 3.0D, this.getZ() + 3.0D), Entity::isAlive); /*for(Entity entity : list1) { if (!net.minecraftforge.event.ForgeEventFactory.onEntityStruckByLightning(entity, this)) @@ -143,23 +144,23 @@ public void tick() { private BlockPos getStrikePosition() { Vec3 vec3 = this.position(); - return new BlockPos(vec3.x, vec3.y - 1.0E-6D, vec3.z); + return CoroUtilBlock.blockPos(vec3.x, vec3.y - 1.0E-6D, vec3.z); } private void spawnFire(int p_20871_) { - if (!this.visualOnly && !this.level.isClientSide && this.level.getGameRules().getBoolean(GameRules.RULE_DOFIRETICK)) { + if (!this.visualOnly && !this.level().isClientSide && this.level().getGameRules().getBoolean(GameRules.RULE_DOFIRETICK)) { BlockPos blockpos = this.blockPosition(); - BlockState blockstate = BaseFireBlock.getState(this.level, blockpos); - if (this.level.getBlockState(blockpos).isAir() && blockstate.canSurvive(this.level, blockpos)) { - this.level.setBlockAndUpdate(blockpos, blockstate); + BlockState blockstate = BaseFireBlock.getState(this.level(), blockpos); + if (this.level().getBlockState(blockpos).isAir() && blockstate.canSurvive(this.level(), blockpos)) { + this.level().setBlockAndUpdate(blockpos, blockstate); ++this.blocksSetOnFire; } for(int i = 0; i < p_20871_; ++i) { BlockPos blockpos1 = blockpos.offset(this.random.nextInt(3) - 1, this.random.nextInt(3) - 1, this.random.nextInt(3) - 1); - blockstate = BaseFireBlock.getState(this.level, blockpos1); - if (this.level.getBlockState(blockpos1).isAir() && blockstate.canSurvive(this.level, blockpos1)) { - this.level.setBlockAndUpdate(blockpos1, blockstate); + blockstate = BaseFireBlock.getState(this.level(), blockpos1); + if (this.level().getBlockState(blockpos1).isAir() && blockstate.canSurvive(this.level(), blockpos1)) { + this.level().setBlockAndUpdate(blockpos1, blockstate); ++this.blocksSetOnFire; } } diff --git a/src/main/java/weather2/weathersystem/storm/LightningBoltWeatherNew.java b/src/main/java/weather2/weathersystem/storm/LightningBoltWeatherNew.java index f10e21c6..f8d68c10 100644 --- a/src/main/java/weather2/weathersystem/storm/LightningBoltWeatherNew.java +++ b/src/main/java/weather2/weathersystem/storm/LightningBoltWeatherNew.java @@ -1,5 +1,6 @@ package weather2.weathersystem.storm; +import com.corosus.coroutil.util.CoroUtilBlock; import com.google.common.collect.Sets; import java.util.List; import java.util.Optional; @@ -70,9 +71,9 @@ public void setCause(@Nullable ServerPlayer p_20880_) { private void powerLightningRod() { BlockPos blockpos = this.getStrikePosition(); - BlockState blockstate = this.level.getBlockState(blockpos); + BlockState blockstate = this.level().getBlockState(blockpos); if (blockstate.is(Blocks.LIGHTNING_ROD)) { - ((LightningRodBlock)blockstate.getBlock()).onLightningStrike(blockstate, this.level, blockpos); + ((LightningRodBlock)blockstate.getBlock()).onLightningStrike(blockstate, this.level(), blockpos); } } @@ -88,17 +89,17 @@ public float getDamage() { public void tick() { super.tick(); if (this.life == 2) { - if (this.level.isClientSide()) { - this.level.playLocalSound(this.getX(), this.getY(), this.getZ(), SoundEvents.LIGHTNING_BOLT_THUNDER, SoundSource.WEATHER, 10000.0F, 0.8F + this.random.nextFloat() * 0.2F, false); - this.level.playLocalSound(this.getX(), this.getY(), this.getZ(), SoundEvents.LIGHTNING_BOLT_IMPACT, SoundSource.WEATHER, 2.0F, 0.5F + this.random.nextFloat() * 0.2F, false); + if (this.level().isClientSide()) { + this.level().playLocalSound(this.getX(), this.getY(), this.getZ(), SoundEvents.LIGHTNING_BOLT_THUNDER, SoundSource.WEATHER, 10000.0F, 0.8F + this.random.nextFloat() * 0.2F, false); + this.level().playLocalSound(this.getX(), this.getY(), this.getZ(), SoundEvents.LIGHTNING_BOLT_IMPACT, SoundSource.WEATHER, 2.0F, 0.5F + this.random.nextFloat() * 0.2F, false); } else { - /*Difficulty difficulty = this.level.getDifficulty(); + /*Difficulty difficulty = this.level().getDifficulty(); if (difficulty == Difficulty.NORMAL || difficulty == Difficulty.HARD) { this.spawnFire(4); }*/ this.powerLightningRod(); - clearCopperOnLightningStrike(this.level, this.getStrikePosition()); + clearCopperOnLightningStrike(this.level(), this.getStrikePosition()); this.gameEvent(GameEvent.LIGHTNING_STRIKE); } } @@ -106,12 +107,12 @@ public void tick() { --this.life; if (this.life < 0) { if (this.flashes == 0) { - if (this.level instanceof ServerLevel) { - /*List list = this.level.getEntities(this, new AABB(this.getX() - 15.0D, this.getY() - 15.0D, this.getZ() - 15.0D, this.getX() + 15.0D, this.getY() + 6.0D + 15.0D, this.getZ() + 15.0D), (p_147140_) -> { + if (this.level() instanceof ServerLevel) { + /*List list = this.level().getEntities(this, new AABB(this.getX() - 15.0D, this.getY() - 15.0D, this.getZ() - 15.0D, this.getX() + 15.0D, this.getY() + 6.0D + 15.0D, this.getZ() + 15.0D), (p_147140_) -> { return p_147140_.isAlive() && !this.hitEntities.contains(p_147140_); }); - for(ServerPlayer serverplayer : ((ServerLevel)this.level).getPlayers((p_147157_) -> { + for(ServerPlayer serverplayer : ((ServerLevel)this.level()).getPlayers((p_147157_) -> { return p_147157_.distanceTo(this) < 256.0F; })) { CriteriaTriggers.LIGHTNING_STRIKE.trigger(serverplayer, this, list); @@ -128,14 +129,14 @@ public void tick() { } if (this.life >= 0) { - if (!(this.level instanceof ServerLevel)) { - this.level.setSkyFlashTime(2); + if (!(this.level() instanceof ServerLevel)) { + this.level().setSkyFlashTime(2); } else if (!this.visualOnly) { - List list1 = this.level.getEntities(this, new AABB(this.getX() - 3.0D, this.getY() - 3.0D, this.getZ() - 3.0D, this.getX() + 3.0D, this.getY() + 6.0D + 3.0D, this.getZ() + 3.0D), Entity::isAlive); + List list1 = this.level().getEntities(this, new AABB(this.getX() - 3.0D, this.getY() - 3.0D, this.getZ() - 3.0D, this.getX() + 3.0D, this.getY() + 6.0D + 3.0D, this.getZ() + 3.0D), Entity::isAlive); /*for(Entity entity : list1) { if (!net.minecraftforge.event.ForgeEventFactory.onEntityStruckByLightning(entity, this)) - entity.thunderHit((ServerLevel)this.level, this); + entity.thunderHit((ServerLevel)this.level(), this); }*/ this.hitEntities.addAll(list1); @@ -149,23 +150,23 @@ public void tick() { private BlockPos getStrikePosition() { Vec3 vec3 = this.position(); - return new BlockPos(vec3.x, vec3.y - 1.0E-6D, vec3.z); + return CoroUtilBlock.blockPos(vec3.x, vec3.y - 1.0E-6D, vec3.z); } private void spawnFire(int p_20871_) { - if (!this.visualOnly && !this.level.isClientSide && this.level.getGameRules().getBoolean(GameRules.RULE_DOFIRETICK)) { + if (!this.visualOnly && !this.level().isClientSide && this.level().getGameRules().getBoolean(GameRules.RULE_DOFIRETICK)) { BlockPos blockpos = this.blockPosition(); - BlockState blockstate = BaseFireBlock.getState(this.level, blockpos); - if (this.level.getBlockState(blockpos).isAir() && blockstate.canSurvive(this.level, blockpos)) { - this.level.setBlockAndUpdate(blockpos, blockstate); + BlockState blockstate = BaseFireBlock.getState(this.level(), blockpos); + if (this.level().getBlockState(blockpos).isAir() && blockstate.canSurvive(this.level(), blockpos)) { + this.level().setBlockAndUpdate(blockpos, blockstate); ++this.blocksSetOnFire; } for(int i = 0; i < p_20871_; ++i) { BlockPos blockpos1 = blockpos.offset(this.random.nextInt(3) - 1, this.random.nextInt(3) - 1, this.random.nextInt(3) - 1); - blockstate = BaseFireBlock.getState(this.level, blockpos1); - if (this.level.getBlockState(blockpos1).isAir() && blockstate.canSurvive(this.level, blockpos1)) { - this.level.setBlockAndUpdate(blockpos1, blockstate); + blockstate = BaseFireBlock.getState(this.level(), blockpos1); + if (this.level().getBlockState(blockpos1).isAir() && blockstate.canSurvive(this.level(), blockpos1)) { + this.level().setBlockAndUpdate(blockpos1, blockstate); ++this.blocksSetOnFire; } } diff --git a/src/main/java/weather2/weathersystem/storm/StormObject.java b/src/main/java/weather2/weathersystem/storm/StormObject.java index 01a2f7ff..e0a5e919 100644 --- a/src/main/java/weather2/weathersystem/storm/StormObject.java +++ b/src/main/java/weather2/weathersystem/storm/StormObject.java @@ -246,7 +246,7 @@ public StormObject(WeatherManager parManager) { public void initFirstTime() { super.initFirstTime(); - Biome bgb = manager.getWorld().m_204166_(WeatherUtilBlock.getPrecipitationHeightSafe(manager.getWorld(), new BlockPos(Mth.floor(pos.x), 0, Mth.floor(pos.z)))).m_203334_(); + Biome bgb = manager.getWorld().getBiome(WeatherUtilBlock.getPrecipitationHeightSafe(manager.getWorld(), new BlockPos(Mth.floor(pos.x), 0, Mth.floor(pos.z)))).get(); float temp = 1; @@ -881,7 +881,7 @@ public void tickMovement() { double scanX = this.pos.x + (-Math.sin(Math.toRadians(angle)) * scanDist); double scanZ = this.pos.z + (Math.cos(Math.toRadians(angle)) * scanDist); - int height = WeatherUtilBlock.getPrecipitationHeightSafe(this.manager.getWorld(), new BlockPos(scanX, 0, scanZ)).getY(); + int height = WeatherUtilBlock.getPrecipitationHeightSafe(this.manager.getWorld(), CoroUtilBlock.blockPos(scanX, 0, scanZ)).getY(); if (this.pos.y < height) { float angleAdj = 45; @@ -990,7 +990,7 @@ public void tickMovement() { } if (levelCurIntensityStage >= STATE_FORMING) { - Optional optional = ((WeatherManagerServer) manager).findWeatherDeflector((ServerLevel) manager.getWorld(), new BlockPos(posGround), 128); + Optional optional = ((WeatherManagerServer) manager).findWeatherDeflector((ServerLevel) manager.getWorld(), CoroUtilBlock.blockPos(posGround), 128); if (optional.isPresent()) { isBeingDeflectedCached = true; //CULog.dbg("optional.get(): " + optional.get()); @@ -1077,10 +1077,10 @@ public void trackAndExtinguishEntities() { //efficient caching if ((manager.getWorld().getGameTime() + (ID * 20)) % ConfigStorm.Storm_Rain_TrackAndExtinguishEntitiesRate == 0) { listEntitiesUnderClouds.clear(); - BlockPos posBP = new BlockPos(posGround.x, posGround.y, posGround.z); + BlockPos posBP = CoroUtilBlock.blockPos(posGround.x, posGround.y, posGround.z); List listEnts = manager.getWorld().getEntitiesOfClass(LivingEntity.class, new AABB(posBP).inflate(size)); for (LivingEntity ent : listEnts) { - if (ent.level.canSeeSky(ent.blockPosition())) { + if (ent.level().canSeeSky(ent.blockPosition())) { listEntitiesUnderClouds.add(ent); } } @@ -1139,7 +1139,7 @@ public void tickProgression() { //long lastStormRainTime = playerNBT.getLong("lastStormRainTime"); //Biome bgb = null; - Biome bgb = world.m_204166_(WeatherUtilBlock.getPrecipitationHeightSafe(world, new BlockPos(Mth.floor(pos.x), 0, Mth.floor(pos.z)))).m_203334_(); + Biome bgb = world.getBiome(WeatherUtilBlock.getPrecipitationHeightSafe(world, new BlockPos(Mth.floor(pos.x), 0, Mth.floor(pos.z)))).get(); //temperature scan if (bgb != null) { @@ -3014,14 +3014,14 @@ public int calculateTopYBlock() { //TODO: only recalc if pos x z changes boolean filterOutLogs = true; - if (filterOutLogs && world.hasChunkAt(new BlockPos(pos))) { + if (filterOutLogs && world.hasChunkAt(CoroUtilBlock.blockPos(pos))) { int y = calculatedYPos-1; - BlockState state = world.getBlockState(new BlockPos(pos.x, y, pos.z)); + BlockState state = world.getBlockState(CoroUtilBlock.blockPos(pos.x, y, pos.z)); //System.out.println("state: " + state); int iter = 0; - while ((state.m_204336_(BlockTags.LOGS) || state.m_204336_(BlockTags.LEAVES) || state.m_204336_(BlockTags.CAVE_VINES) || state.m_204336_(BlockTags.REPLACEABLE_PLANTS) || state.is(Blocks.COCOA) || state.is(Blocks.BAMBOO) || state.isAir()) && y > world.getMinBuildHeight()) { + while ((state.is(BlockTags.LOGS) || state.is(BlockTags.LEAVES) || state.is(BlockTags.CAVE_VINES) || state.is(BlockTags.REPLACEABLE_PLANTS) || state.is(Blocks.COCOA) || state.is(Blocks.BAMBOO) || state.isAir()) && y > world.getMinBuildHeight()) { y--; - state = world.getBlockState(new BlockPos(pos.x, y, pos.z)); + state = world.getBlockState(CoroUtilBlock.blockPos(pos.x, y, pos.z)); //CULog.dbg("filter logs, found: " + state); iter++; } @@ -3031,7 +3031,7 @@ public int calculateTopYBlock() { //for survive the tide rising mechanic that doesnt update heightmap if (Weather.isLoveTropicsInstalled()) { - while (world.getBlockState(new BlockPos(pos.x, calculatedYPos, pos.z)).getBlock() instanceof LiquidBlock && calculatedYPos < world.getMaxBuildHeight()) { + while (world.getBlockState(CoroUtilBlock.blockPos(pos.x, calculatedYPos, pos.z)).getBlock() instanceof LiquidBlock && calculatedYPos < world.getMaxBuildHeight()) { calculatedYPos++; } } @@ -3051,8 +3051,8 @@ public int calculateTopYBlock() { if (calculatedYPos + 4 > entP.position().y) { int y = (int) (entP.position().y + 2); while (y > entP.position().y - 3) { - BlockPos blockPos = new BlockPos(pos.x, y, pos.z); - BlockPos blockPosUp = new BlockPos(pos.x, y+1, pos.z); + BlockPos blockPos = CoroUtilBlock.blockPos(pos.x, y, pos.z); + BlockPos blockPosUp = CoroUtilBlock.blockPos(pos.x, y+1, pos.z); BlockState state = world.getBlockState(blockPos); BlockState stateUp = world.getBlockState(blockPosUp); if ((!state.isAir() && state.getCollisionShape(world, blockPosUp) != Shapes.empty()) && (stateUp.isAir() || stateUp.getCollisionShape(world, blockPosUp) == Shapes.empty())) { diff --git a/src/main/java/weather2/weathersystem/storm/TornadoHelper.java b/src/main/java/weather2/weathersystem/storm/TornadoHelper.java index b1a132b1..98f70c61 100644 --- a/src/main/java/weather2/weathersystem/storm/TornadoHelper.java +++ b/src/main/java/weather2/weathersystem/storm/TornadoHelper.java @@ -33,6 +33,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.util.FakePlayerFactory; +import net.minecraftforge.event.level.BlockEvent; import net.minecraftforge.event.world.BlockEvent; import weather2.ClientTickHandler; import weather2.Weather; @@ -228,7 +229,7 @@ public void tick(Level parWorld) { int yStart = 0; int yEnd = (int)storm.pos.y/* + 72*/; int yInc = 1; - Biome bgb = parWorld.m_204166_(new BlockPos(WeatherUtilBlock.getPrecipitationHeightSafe(parWorld, new BlockPos(Mth.floor(storm.pos.x), 0, Mth.floor(storm.pos.z))))).m_203334_(); + Biome bgb = parWorld.getBiome(new BlockPos(WeatherUtilBlock.getPrecipitationHeightSafe(parWorld, new BlockPos(Mth.floor(storm.pos.x), 0, Mth.floor(storm.pos.z))))).get(); //prevent grabbing in high areas (hills) //TODO: 1.10 make sure minHeight/maxHeight converted to baseHeight/scale is correct, guessing we can just not factor in variation @@ -405,7 +406,7 @@ public void tick(Level parWorld) { if (!parWorld.isClientSide() && storm.isFirenado) { if (storm.levelCurIntensityStage >= storm.STATE_STAGE1) for (int i = 0; i < firesPerTickMax; i++) { - BlockPos posUp = new BlockPos(storm.posGround.x, storm.posGround.y + rand.nextInt(30), storm.posGround.z); + BlockPos posUp = CoroUtilBlock.blockPos(storm.posGround.x, storm.posGround.y + rand.nextInt(30), storm.posGround.z); BlockState state = parWorld.getBlockState(posUp); if (CoroUtilBlock.isAir(state.getBlock())) { //parWorld.setBlockState(posUp, Blocks.FIRE.getDefaultState()); @@ -489,7 +490,7 @@ public boolean tryRip(Level parWorld, int tryX, int tryY, int tryZ/*, boolean no int blockCount = 0; //old per storm blockCount seems glitched... lets use a global we cache count of - if (parWorld.isLoaded(new BlockPos(storm.pos.x, 128, storm.pos.z)) && + if (parWorld.isLoaded(CoroUtilBlock.blockPos(storm.pos.x, 128, storm.pos.z)) && lastGrabTime < System.currentTimeMillis() && tickGrabCount < ConfigTornado.Storm_Tornado_maxBlocksGrabbedPerTick) { @@ -554,7 +555,7 @@ public boolean canGrabEventCheck(Level world, BlockState state, BlockPos pos) { } public boolean canGrabEntity(Entity ent) { - if (ent.level.isClientSide()) { + if (ent.level().isClientSide()) { return canGrabEntityClient(ent); } else { if (ent instanceof Player) { diff --git a/src/main/java/weather2/weathersystem/storm/WeatherObjectParticleStorm.java b/src/main/java/weather2/weathersystem/storm/WeatherObjectParticleStorm.java index 397f6a7b..b97647cd 100644 --- a/src/main/java/weather2/weathersystem/storm/WeatherObjectParticleStorm.java +++ b/src/main/java/weather2/weathersystem/storm/WeatherObjectParticleStorm.java @@ -1,5 +1,6 @@ package weather2.weathersystem.storm; +import com.corosus.coroutil.util.CoroUtilBlock; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.biome.Biome; @@ -59,7 +60,7 @@ public void initStormSpawn(Vec3 pos) { } public static boolean canSpawnHere(Level world, BlockPos pos, StormType type, boolean forSpawn) { - Biome biomeIn = world.m_204166_(pos).m_203334_(); + Biome biomeIn = world.getBiome(pos).get(); if (type == StormType.SANDSTORM) { return isDesert(biomeIn, forSpawn); } else if (type == StormType.SNOWSTORM) { @@ -71,7 +72,7 @@ public static boolean canSpawnHere(Level world, BlockPos pos, StormType type, bo public static boolean isColdForStorm(Level world, Biome biome, boolean forSpawn, BlockPos pos) { //return biome.getPrecipitation() == Biome.Precipitation.SNOW; //adjusted to this way to make it work with serene seasons - boolean canPrecip = biome.getPrecipitation() == Biome.Precipitation.RAIN || biome.getPrecipitation() == Biome.Precipitation.SNOW; + boolean canPrecip = biome.getPrecipitationAt(pos) == Biome.Precipitation.RAIN || biome.getPrecipitationAt(pos) == Biome.Precipitation.SNOW; return canPrecip && SceneEnhancer.shouldSnowHere(world, biome, pos); } @@ -164,7 +165,7 @@ public void tickBlockSandBuildup() { Vec3 vecPos = getRandomPosInStorm(); - BlockPos blockPos = WeatherUtilBlock.getPrecipitationHeightSafe(world, new BlockPos(vecPos.x, 0, vecPos.z)); + BlockPos blockPos = WeatherUtilBlock.getPrecipitationHeightSafe(world, CoroUtilBlock.blockPos(vecPos.x, 0, vecPos.z)); //avoid unloaded areas if (!world.hasChunkAt(blockPos)) continue; diff --git a/src/main/java/weather2/weathersystem/storm/WeatherObjectSandstormOld.java b/src/main/java/weather2/weathersystem/storm/WeatherObjectSandstormOld.java index ffc8c87e..8b4f718e 100644 --- a/src/main/java/weather2/weathersystem/storm/WeatherObjectSandstormOld.java +++ b/src/main/java/weather2/weathersystem/storm/WeatherObjectSandstormOld.java @@ -2,6 +2,7 @@ import java.util.Random; +import com.corosus.coroutil.util.CoroUtilBlock; import net.minecraft.core.BlockPos; import net.minecraft.world.phys.Vec3; import net.minecraft.world.level.Level; @@ -107,14 +108,14 @@ public void tickBlockSandBuildup() { Vec3 vecPos = getRandomPosInSandstorm(); - int y = WeatherUtilBlock.getPrecipitationHeightSafe(world, new BlockPos(vecPos.x, 0, vecPos.z)).getY(); + int y = WeatherUtilBlock.getPrecipitationHeightSafe(world, CoroUtilBlock.blockPos(vecPos.x, 0, vecPos.z)).getY(); - BlockPos blockPos = new BlockPos(vecPos.x, y, vecPos.z); + BlockPos blockPos = CoroUtilBlock.blockPos(vecPos.x, y, vecPos.z); //avoid unloaded areas if (!world.hasChunkAt(blockPos)) continue; - Biome biomeIn = world.m_204166_(blockPos).m_203334_(); + Biome biomeIn = world.getBiome(blockPos).get(); if (ConfigSand.Sandstorm_Sand_Buildup_AllowOutsideDesert || isDesert(biomeIn)) { WeatherUtilBlock.fillAgainstWallSmoothly(world, new Vec3(blockPos.getX(), blockPos.getY(), blockPos.getZ()), angle, 15, 2, WeatherBlocks.BLOCK_SAND_LAYER.get(), 3); diff --git a/src/main/java/weather2/weathersystem/tornado/CubicBezierCurve.java b/src/main/java/weather2/weathersystem/tornado/CubicBezierCurve.java index 84f464a0..04cc9b3c 100644 --- a/src/main/java/weather2/weathersystem/tornado/CubicBezierCurve.java +++ b/src/main/java/weather2/weathersystem/tornado/CubicBezierCurve.java @@ -1,7 +1,7 @@ package weather2.weathersystem.tornado; -import com.mojang.math.Vector3f; +import org.joml.Vector3f; /** * source: http://www.java2s.com/Code/Java/2D-Graphics-GUI/AclassthatmodelsaCubicBeziercurve.htm diff --git a/src/main/java/weather2/weathersystem/tornado/TornadoFunnel.java b/src/main/java/weather2/weathersystem/tornado/TornadoFunnel.java index 3f631f3f..503b4b01 100644 --- a/src/main/java/weather2/weathersystem/tornado/TornadoFunnel.java +++ b/src/main/java/weather2/weathersystem/tornado/TornadoFunnel.java @@ -1,9 +1,6 @@ package weather2.weathersystem.tornado; -import com.mojang.math.Matrix3f; -import com.mojang.math.Quaternion; -import com.mojang.math.Vector3d; -import com.mojang.math.Vector3f; +import com.corosus.coroutil.util.CoroUtilBlock; import extendedrenderer.particle.ParticleRegistry; import extendedrenderer.particle.entity.ParticleTexFX; import net.minecraft.client.Minecraft; @@ -13,6 +10,10 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; +import org.joml.Matrix3f; +import org.joml.Quaternionf; +import org.joml.Vector3d; +import org.joml.Vector3f; import java.util.*; @@ -129,30 +130,30 @@ private void tickGameTestCreate() { piece.listParticles.remove(piece.listParticles.size() - 1); }*/ - if (piece.bezierCurve == null || entP.level.getGameTime() % 40 == 0) { + if (piece.bezierCurve == null || entP.level().getGameTime() % 40 == 0) { Vector3f[] vecs = new Vector3f[4]; for (int ii = 0; ii < vecs.length; ii++) { - vecs[ii] = new Vector3f(entP.level.random.nextFloat(), entP.level.random.nextFloat(), entP.level.random.nextFloat()); + vecs[ii] = new Vector3f(entP.level().random.nextFloat(), entP.level().random.nextFloat(), entP.level().random.nextFloat()); } piece.bezierCurve = new CubicBezierCurve(vecs); } - if (bezierCurve == null || entP.level.getGameTime() % 40 == 0) { + if (bezierCurve == null || entP.level().getGameTime() % 40 == 0) { Vector3f[] vecs = new Vector3f[4]; for (int ii = 0; ii < vecs.length; ii++) { - vecs[ii] = new Vector3f(entP.level.random.nextFloat(), entP.level.random.nextFloat(), entP.level.random.nextFloat()); + vecs[ii] = new Vector3f(entP.level().random.nextFloat(), entP.level().random.nextFloat(), entP.level().random.nextFloat()); } bezierCurve = new CubicBezierCurve(vecs); } while (piece.listParticles.size() < particleCount) { - BlockPos pos = new BlockPos(piece.posEnd.x, piece.posEnd.y, piece.posEnd.z); + BlockPos pos = CoroUtilBlock.blockPos(piece.posEnd.x, piece.posEnd.y, piece.posEnd.z); //if (entP.getDistanceSq(pos) < 10D * 10D) continue; //pos = world.getPrecipitationHeight(pos).add(0, 1, 0); - ClientLevel world = (ClientLevel)entP.level; + ClientLevel world = (ClientLevel)entP.level(); ParticleTexFX particleTest = new ParticleTexFX(world, pos.getX() + rand.nextFloat(), pos.getY(), @@ -330,10 +331,10 @@ private void tickUpdateFunnel() { float yDiffDist = 2F; float curveAmp = 1F; - Quaternion quaternionY = new Quaternion(new Vector3f(0.0F, 1.0F, 0.0F), -y, true); - Quaternion quaternionYCircle = new Quaternion(new Vector3f(0.0F, 1.0F, 0.0F), -y2, true); + Quaternionf quaternionY = new Quaternionf(new Vector3f(0.0F, 1.0F, 0.0F), -y, true); + Quaternionf quaternionYCircle = new Quaternionf(new Vector3f(0.0F, 1.0F, 0.0F), -y2, true); - Quaternion quatPitch = new Quaternion(new Vector3f(1.0F, 0.0F, 0.0F), -pitchAngle, true); + Quaternionf quatPitch = new Quaternionf(new Vector3f(1.0F, 0.0F, 0.0F), -pitchAngle, true); Vector3f vecCurve = piece.bezierCurve.getValue((float)curvePoint); //Vector3f vecNew = new Vector3f((float)vecCurve.x * curveAmp, 1 + ((float)yDiff) * yDiffDist, (float)vecCurve.z * curveAmp); Vector3f vecNew = new Vector3f((float)vecCurve.x() * curveAmp, 1 + ((float)yDiff) * yDiffDist, (float)vecCurve.z() * curveAmp); diff --git a/src/main/java/weather2/weathersystem/tornado/TornadoManagerTodoRenameMe.java b/src/main/java/weather2/weathersystem/tornado/TornadoManagerTodoRenameMe.java index c4f460d4..500bd453 100644 --- a/src/main/java/weather2/weathersystem/tornado/TornadoManagerTodoRenameMe.java +++ b/src/main/java/weather2/weathersystem/tornado/TornadoManagerTodoRenameMe.java @@ -1,9 +1,5 @@ package weather2.weathersystem.tornado; -import com.mojang.math.Matrix3f; -import com.mojang.math.Quaternion; -import com.mojang.math.Vector3d; -import com.mojang.math.Vector3f; import extendedrenderer.particle.ParticleRegistry; import extendedrenderer.particle.entity.ParticleTexFX; import net.minecraft.client.Minecraft; @@ -12,6 +8,9 @@ import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec2; import net.minecraft.world.phys.Vec3; +import org.joml.Quaternionf; +import org.joml.Vector3d; +import org.joml.Vector3f; import weather2.weathersystem.tornado.simple.TornadoFunnelSimple; import java.util.ArrayList; @@ -269,12 +268,12 @@ public void tick(Level world) { //System.out.println(curvePointYawPitch.x + " - " + curvePointYawPitch.y); } - //Quaternion quaternionY = new Quaternion(new Vector3f(0.0F, 1.0F, 0.0F), -y, true); - Quaternion quaternionY = new Quaternion(new Vector3f(0.0F, 1.0F, 0.0F), -curvePointYawPitch.x - 90, true); + //Quaternionf quaternionY = new Quaternionf(new Vector3f(0.0F, 1.0F, 0.0F), -y, true); + Quaternionf quaternionY = new Quaternionf(new Vector3f(0.0F, 1.0F, 0.0F), -curvePointYawPitch.x - 90, true); //adding quaternionY here cancels out the unwanted rotations from the bezier curve adjustments - Quaternion quaternionYCircle = new Quaternion(new Vector3f(0.0F, 1.0F, 0.0F), -y2 + (curvePointYawPitch.x - 90), true); + Quaternionf quaternionYCircle = new Quaternionf(new Vector3f(0.0F, 1.0F, 0.0F), -y2 + (curvePointYawPitch.x - 90), true); - Quaternion quatPitch = new Quaternion(new Vector3f(1.0F, 0.0F, 0.0F), curvePointYawPitch.y, true); + Quaternionf quatPitch = new Quaternionf(new Vector3f(1.0F, 0.0F, 0.0F), curvePointYawPitch.y, true); //Vector3f vecNew = new Vector3f(1F, 1 + ((float)yDiff) * yDiffDist, 0); //Vector3d vecCurve = bezierCurve.getValue(curvePoint); Vector3f vecCurve = getCurveValue(curvePoint); diff --git a/src/main/java/weather2/weathersystem/tornado/simple/TornadoFunnelSimple.java b/src/main/java/weather2/weathersystem/tornado/simple/TornadoFunnelSimple.java index 35fe1bff..8ba86ea6 100644 --- a/src/main/java/weather2/weathersystem/tornado/simple/TornadoFunnelSimple.java +++ b/src/main/java/weather2/weathersystem/tornado/simple/TornadoFunnelSimple.java @@ -167,9 +167,9 @@ public void tickClient() { float adjustedRate = 1F; if (!isPet) { - if (Minecraft.getInstance().options.particles == ParticleStatus.DECREASED) { + if (Minecraft.getInstance().options.particles.get() == ParticleStatus.DECREASED) { adjustedRate = 0.6F; - } else if (Minecraft.getInstance().options.particles == ParticleStatus.MINIMAL) { + } else if (Minecraft.getInstance().options.particles.get() == ParticleStatus.MINIMAL) { adjustedRate = 0.3F; } } diff --git a/src/main/java/weather2/weathersystem/wind/WindManager.java b/src/main/java/weather2/weathersystem/wind/WindManager.java index dab5fcad..949cfe9a 100644 --- a/src/main/java/weather2/weathersystem/wind/WindManager.java +++ b/src/main/java/weather2/weathersystem/wind/WindManager.java @@ -1,5 +1,6 @@ package weather2.weathersystem.wind; +import com.corosus.coroutil.util.CoroUtilBlock; import com.corosus.coroutil.util.CoroUtilEntOrParticle; import net.minecraft.client.Minecraft; import net.minecraft.core.BlockPos; @@ -360,7 +361,7 @@ public void tickClient() { if (so != null) { - windOriginEvent = new BlockPos(so.posGround.x, so.posGround.y, so.posGround.z); + windOriginEvent = CoroUtilBlock.blockPos(so.posGround.x, so.posGround.y, so.posGround.z); setWindTimeEvent(80); diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 5e314e6d..29d1f4c1 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -99,4 +99,6 @@ public net.minecraft.world.level.biome.Biome m_47505_(Lnet/minecraft/core/BlockP public net.minecraft.server.level.ServerLevel f_8549_ # serverLevelData -public net.minecraft.server.level.ServerLevel m_143248_(Lnet/minecraft/core/BlockPos;)Ljava/util/Optional; # findLightningRod \ No newline at end of file +public net.minecraft.server.level.ServerLevel m_143248_(Lnet/minecraft/core/BlockPos;)Ljava/util/Optional; # findLightningRod + +public net.minecraft.client.Options f_92073_ # particles \ No newline at end of file diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 37fd44f9..e95c8ddb 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -16,6 +16,6 @@ description=''' [[dependencies.weather2]] modId="coroutil" mandatory=true -versionRange="[1.18.1-1.2.37,)" +versionRange="[1.18.2-1.2.45,)" ordering="NONE" side="BOTH" \ No newline at end of file diff --git a/src/main/resources/assets/weather2/shaders/core/rendertype_clouds.fsh b/src/main/resources/assets/weather2/shaders/core/rendertype_clouds.fsh index 373dbb04..742aa257 100644 --- a/src/main/resources/assets/weather2/shaders/core/rendertype_clouds.fsh +++ b/src/main/resources/assets/weather2/shaders/core/rendertype_clouds.fsh @@ -1,6 +1,7 @@ #version 150 #moj_import +#moj_import uniform sampler2D Sampler0;